view toolbox/static/js/project.js @ 0:b0942f44413f

import from git://github.com/mozilla/toolbox.git
author Jeff Hammel <k0scist@gmail.com>
date Sun, 11 May 2014 09:15:35 -0700
parents
children
line wrap: on
line source

$(document).ready(function(){
    $(".date").timeago();
    $(".field-edit").hide();
    
    $(".description").autolink();

    // modify project div
    $('div.project').each(function(){
        var project = $(this).attr('id');
        var url = escape(project).replace(/\//g, '%25%32%66'); // urlquote

        // add a delete link
        var deletelink = $('<a class="delete" title="permanantly remove">Delete</a>');
        $(deletelink).click(function() {
                if(confirm("Permanently remove: " + project + " ?")) {
                    var form = $('<form class="delete" action="delete" method="POST"></form>')
                    var input = $('<input type="hidden" name="project"/>');
                    input.val(project);
                    form.append(input);
                    $(this).after(form);
                    $(form).submit();
                }
            });
        $(this).append(deletelink);

        // make description editable with jeditable
        $(this).find('p.description').editable(url, {
          type: 'textarea',
          rows: 7,
          cols: 80,
          indicator: '<img src="img/indicator.gif"/>',
          onblur: 'submit',
          name: 'description',
          tooltip: 'click to edit description',
          beforeedit: function (settings, jedit, event) {
              if(event.target.nodeName == "A")
                  return false; 
          }
        });

        // make the name and url editable
        var UEB = '<img class="UEB" src="img/UEB16.png" alt="click to edit" title="click to edit"/>'; // universal edit button
        function nameHover(eventObject) {
           var header = this;
           var img = $(this).find('img.UEB');
           $(img).css('visibility', 'visible');
           $(img).click(function() {
               var link = $(header).children('a');
               var text = $(link).html();
               var size = text.length;
               var form = $('<form method="POST" action="' + url + '"><input type="text" name="name" value="' + text +'" size="' + size + '"/><button class="cancel">Cancel</button><input type="submit" value="Rename"/></form>');
               $(form).submit(function() {
                   var input = $(this).find('input[name="name"]')
                   var name = $(input).val()
                   name = name.trim();
                   if (name.length == 0) {
                       $(this).append('<div class="error">A project must have a name</span>');
                       return false;
                   }
                   return true;
               })
               $(form).css('display', 'block');
               $(header).replaceWith(form);
               $(form).find('button.cancel').click(function(){
                   $(header).find('img.UEB').css('visibility', 'hidden');
                   $(header).hover(nameHover,
                                   function(eventObject) { $(this).children('img.UEB').css('visibility', 'hidden'); });
                   $(form).replaceWith(header);
                   });
               $(form).find('input[type=text]').keypress(function(event) {
                       if (event.which == 13) {
                           $(form).submit();
                       }
                   });
               $(form).find('input[type=text]').focus();
               });
        }
        var header = $(this).find('h1');
        $(header).append(UEB);
        $(header).find('img.UEB').each(function() {$(this).css('visibility', 'hidden'); });
        $(header).hover(nameHover,
                        function(eventObject) { $(this).children('img.UEB').css('visibility', 'hidden'); });
        $(this).find('a.home').each(function() {
                var home = this;
                $(this).wrap('<span/>');
                var wrapper = $(this).parent();
                var img = $(UEB);
                $(wrapper).append(img);
                img.css('visibility', 'hidden');
                function urlHover(eventObject) {
                    var img = $(this).find('img.UEB');
                    $(img).css('visibility', 'visible');
                    $(img).click(function() {
                        var link = $(home).attr('href');
                        var size = link.length;
                        var input = $('<input type="text" value="' + link + '" size="' + size + '"/>');
                        $(wrapper).replaceWith(input);
                        
                        function urlEditBlur() {
                            var newlink = $(this).val();
                            var that = this;
                            newlink = newlink.trim();
                            if (newlink != link) {
                                var throbber = $('<img class="throbber" src="img/indicator.gif"/>');
                                $(this).after(throbber);
                                $(this).hide();
                                $.post(url, {"url": newlink}, function(data) {
                                    $(throbber).remove();
                                    var a = $(wrapper).children('a');
                                    a.attr('href', newlink);
                                    a.html(newlink);
                                    $(wrapper).children('img.UEB').css('visibility', 'hidden');
                                    wrapper.hover(urlHover, function(eventObject) { $(this).children('img.UEB').css('visibility', 'hidden'); });
                                    $(that).replaceWith(wrapper);
                                    });
                            }
                            else {
                                $(wrapper).children('img.UEB').css('visibility', 'hidden');
                                wrapper.hover(urlHover, function(eventObject) { $(this).children('img.UEB').css('visibility', 'hidden'); });
                                $(this).replaceWith(wrapper);
                            }
                        }
                        $(input).blur(urlEditBlur);
                        $(input).keypress(function(event) {
                                if (event.which == 13) {
                                    $(this).blur();
                                }
                            });
                        $(input).focus();
                        });
                }
                wrapper.hover(urlHover, function(eventObject) { $(this).children('img.UEB').css('visibility', 'hidden'); });
            });

        // autocomplete
        $(this).find(".edit-message").click(function() {
          var container = $(this).parents('.field-value-container');
          var edit = $(this).parents('.field').children('.field-edit');
          var valueList = container.children('.field-values');

          container.hide();
          edit.show();

          var items = valueList.children('.field-value-item');
          var values = [];
          for(var i = 0; i < items.length; i++) {
              values.push($(items.get(i)).text().trim());
          }

          var tokenData = values.map(function(value) {
                  return {id: value, name: escape(value)};
              });
        
          var input = edit.children('input');
          var field = $(this).parents(".field").attr('class').split(' ')[1];

          input.tokenInput("tags?format=json&field=" + field + "&omit=" + project, {
              theme: 'facebook',
              prePopulate: tokenData,
              autoFocus: true,
              submitOnBlur: true,
              canBlur: function(elem) {
                  return !container.find($(elem)).length;
                  },
              hintText: false,
              onSubmit: function(values) {
                  edit.hide();
                  container.show();
                  valueList.empty();

                  if(!values.length) {
                      container.children(".field-value").remove();
                      container.prepend($('<div class="field-none field-value">none</div>'));
                  }
                  else {
                      values.forEach(function(value) {
                         var li = $("<li></li>")
                             .addClass("field-value-item");
                         var a = $("<a></a>")
                             .attr("href", "?" + field + "=" + value)
                             .attr("title", "tools with " + field + " " + value)
                             .text(value)
                             .appendTo(li);
                
                         if(valueList.length == 0) {
                             container.children(".field-value").remove();
                             valueList = $("<ul class='field-values field-value'></ul>")
                                 .prependTo(container);
                         }
                         valueList.append(li);
                          });
                  }
            
                  
                  var data = {
                      action: 'replace'
                  };
                  data[field] = values.join(",");
                  
                  $.post(url, data, function() {
                      });
                  }
              });
            });
        });
    });