[Rt-commit] rt branch, master, updated. rt-4.4.4-694-g60123beaf7

Jim Brandt jbrandt at bestpractical.com
Fri Jan 10 17:40:39 EST 2020


The branch, master has been updated
       via  60123beaf7c2d293eb806528cc7fe12740d8d27a (commit)
       via  a4c8d1dffc93fda8c941e080103824f2ef20e2a5 (commit)
       via  63aab0eb846c386c6759f19afc53b72bf38a9d85 (commit)
       via  047266794a40463ec3578c4f619e7852ae09a394 (commit)
       via  8fe84bd49c4992c39fce17a4373267585ec3d6a1 (commit)
       via  1760634ad1d732db31c671e570a0a58e7dc5bb17 (commit)
       via  0871372acf0067edcd2b2555287df262f05f132f (commit)
       via  91d64c4c6dffe7b2bed996cba5cd3cad0f577cb1 (commit)
       via  fed4faf2a8b60c6cc36bb4608c00df0514df0ad5 (commit)
       via  7cc30fd864635dd163074e0148e215bef406d8f1 (commit)
       via  5f53bc16ebe19f7fc29dea6604ce7805717a02da (commit)
       via  d2b21b9ec34edf34512cfe6c8861acb1f9ee1ef9 (commit)
       via  6eb02d06bb430216f4f52a33267a1ec0ca0237ae (commit)
      from  9e384d2378e11bf118a53d05bf67a3ca200efca1 (commit)

Summary of changes:
 devel/third-party/README                           |   5 +
 devel/third-party/fontawesome/index.js             |   6 +
 .../jquery-jgrowl-1.4.5/jquery.jgrowl.css          | 100 ++++++
 .../jquery-jgrowl-1.4.5/jquery.jgrowl.js           | 399 +++++++++++++++++++++
 etc/RT_Config.pm.in                                |  63 ++++
 lib/RT/Config.pm                                   |  42 +++
 lib/RT/Interface/Web.pm                            |   1 +
 share/html/Elements/CollectionAsTable/Row          |  37 +-
 share/html/Elements/CollectionList                 |  35 +-
 share/html/Elements/ColumnMap                      |  65 +++-
 share/html/Elements/EditLinks                      |   5 +-
 share/html/Elements/RT__Ticket/ColumnMap           |  63 ++--
 share/html/Elements/SelectDate                     |   5 +-
 share/html/Elements/ShowCustomFieldCustomGroupings |  60 +++-
 .../{RightsInspector/Revoke => CollectionListRow}  |  34 +-
 .../Helpers/{Autocomplete/Queues => TicketUpdate}  |  53 ++-
 share/html/Search/Bulk.html                        |   4 +-
 share/html/SelfService/Elements/MyRequests         |  23 +-
 share/html/Ticket/Display.html                     |   4 +-
 share/html/Ticket/Elements/AddWatchers             |   3 +
 share/html/Ticket/Elements/EditBasics              |   5 +
 .../{Crypt.html => Elements/EditPeopleInline}      | 106 +++---
 share/html/Ticket/Elements/ShowSummary             | 153 +++++++-
 share/html/Widgets/TitleBoxStart                   |   7 +-
 share/static/css/elevator-light/boxes.css          |   2 -
 share/static/css/elevator-light/inline-edit.css    | 103 ++++++
 .../css/elevator-light/jquery.jgrowl.min.css       |   1 +
 share/static/css/elevator-light/main.css           |   2 +
 share/static/js/fontawesome.min.js                 |   2 +-
 share/static/js/jquery.jgrowl.min.js               |   2 +
 share/static/js/util.js                            | 288 ++++++++++++++-
 t/customfields/sort_order.t                        |   4 +-
 t/web/queue_caching.t                              |   6 +-
 33 files changed, 1505 insertions(+), 183 deletions(-)
 create mode 100644 devel/third-party/jquery-jgrowl-1.4.5/jquery.jgrowl.css
 create mode 100644 devel/third-party/jquery-jgrowl-1.4.5/jquery.jgrowl.js
 copy share/html/Helpers/{RightsInspector/Revoke => CollectionListRow} (71%)
 copy share/html/Helpers/{Autocomplete/Queues => TicketUpdate} (67%)
 copy share/html/Ticket/{Crypt.html => Elements/EditPeopleInline} (54%)
 create mode 100644 share/static/css/elevator-light/inline-edit.css
 create mode 100644 share/static/css/elevator-light/jquery.jgrowl.min.css
 create mode 100644 share/static/js/jquery.jgrowl.min.js

- Log -----------------------------------------------------------------
commit 60123beaf7c2d293eb806528cc7fe12740d8d27a
Merge: 9e384d2378 a4c8d1dffc
Author: Jim Brandt <jbrandt at bestpractical.com>
Date:   Fri Jan 10 17:20:43 2020 -0500

    Merge branch '4.6/inline-edit-new-theme'

diff --cc lib/RT/Interface/Web.pm
index 89d4d01b7b,4f4d5cf31f..b334f22ae3
--- a/lib/RT/Interface/Web.pm
+++ b/lib/RT/Interface/Web.pm
@@@ -140,8 -141,7 +140,9 @@@ sub JSFiles 
          quoteselection.js
          fontawesome.min.js
          rights-inspector.js
 +        Chart.min.js
 +        chartjs-plugin-colorschemes.min.js
+         jquery.jgrowl.min.js
          }, RT->Config->Get('JSFiles');
  }
  
diff --cc share/static/css/elevator-light/main.css
index 645f75c83a,3641622cbb..8bf1f7a90a
--- a/share/static/css/elevator-light/main.css
+++ b/share/static/css/elevator-light/main.css
@@@ -41,4 -41,5 +41,6 @@@
  @import "ticket-lists.css";
  @import "ticket-search.css";
  @import "print.css";
 + at import "Chart.css";
+ @import "jquery.jgrowl.min.css";
+ @import "inline-edit.css";
diff --cc share/static/js/util.js
index 484ffe0139,a9eb7f45b3..2092d7200b
--- a/share/static/js/util.js
+++ b/share/static/js/util.js
@@@ -647,9 -687,244 +687,245 @@@ jQuery(function() 
      });
  
      loadCollapseStates();
 +    Chart.platform.disableCSSInjection = true;
  });
  
+ /* inline edit */
+ jQuery(function () {
+     var inlineEditEnabled = true;
+     var disableInlineEdit = function () {
+         inlineEditEnabled = false;
+         jQuery('.editable').removeClass('editing').removeClass('loading');
+         jQuery('table.inline-edit').removeClass('inline-edit');
+     };
+ 
+     var escapeKeyHandler = null;
+ 
+     var beginInlineEdit = function (cell) {
+         if (!inlineEditEnabled) {
+             return;
+         }
+ 
+         var editor = cell.find('.editor');
+ 
+         if (jQuery('td.editable.editing').length) {
+             return;
+         }
+ 
+         /* form has absolute position, we need to calculate the offsets so
+          * it could show in the cell */
+ 
+         var top = cell.offset().top;
+         var left = cell.offset().left;
+ 
+         var relativeParent = cell.parents().filter(function() {
+             return jQuery(this).css('position') === 'relative';
+         });
+ 
+         if ( relativeParent.length ) {
+             top -= relativeParent.offset().top;
+             left -= relativeParent.offset().left;
+         }
+ 
+         editor.css('top', top);
+         editor.css('left', left);
+ 
+         editor.css('width', cell.width() > 100 ? cell.width() : 100 );
+         cell.addClass('editing');
+         editor.css('margin-top', (cell.closest('tr').height() - editor.height()) / 2);
+ 
+         editor.find(':input:visible:enabled:first').focus();
+         setTimeout( function(){
+             editor.find('.selectpicker').selectpicker('toggle');
+         }, 100);
+ 
+         jQuery('body').addClass('inline-editing');
+ 
+         escapeKeyHandler = function (e) {
+             if (e.keyCode == 27) {
+                 e.preventDefault();
+                 cancelInlineEdit(editor);
+             }
+         };
+         jQuery(document).keyup(escapeKeyHandler);
+     };
+ 
+     var cancelInlineEdit = function (editor) {
+         var cell = editor.closest('td');
+         cell.find('[data-toggle=tooltip]').tooltip('hide');
+ 
+         cell.removeClass('editing');
+         editor.get(0).reset();
+ 
+         jQuery('body').removeClass('inline-editing');
+ 
+         if (escapeKeyHandler) {
+             jQuery(document).off('keyup', escapeKeyHandler);
+         }
+     };
+ 
+     var submitInlineEdit = function (editor) {
+         var cell = editor.closest('td');
+         cell.find('[data-toggle=tooltip]').tooltip('hide');
+ 
+         if (!inlineEditEnabled) {
+             return;
+         }
+ 
+         // Make sure input's state has been updated
+         editor.find('input:focus').blur();
+ 
+         if (!editor.data('changed')) {
+             cancelInlineEdit(editor);
+             return;
+         }
+ 
+         var tbody = cell.closest('tbody');
+         var table = tbody.closest('table');
+ 
+         if (!cell.hasClass('editing')) {
+             return;
+         }
+ 
+         var params = editor.serialize();
+ 
+         editor.find(':input').attr('disabled', 'disabled');
+         cell.removeClass('editing').addClass('loading');
+         jQuery('body').removeClass('inline-editing');
+         tbody.addClass('refreshing');
+ 
+         var renderError = function (error) {
+             jQuery.jGrowl(error, { sticky: true, themeState: 'none' });
+             cell.addClass('error text-danger').html(loc_key('error'));
+             jQuery(document).off('keyup', escapeKeyHandler);
+             disableInlineEdit();
+         };
+         jQuery.ajax({
+             url     : editor.attr('action'),
+             method  : 'POST',
+             data    : params,
+             dataType: "json",
+             success : function (results) {
+                 jQuery.each(results.actions, function (i, action) {
+                     jQuery.jGrowl(action, { themeState: 'none' });
+                 });
+ 
+                 refreshCollectionListRow(
+                     tbody,
+                     table,
+                     function () {
+                         jQuery(document).off('keyup', escapeKeyHandler);
+                     },
+                     function (xhr, error) {
+                         renderError(error);
+                     }
+                 );
+             },
+             error   : function (xhr, error) {
+                 renderError(error);
+             }
+         });
+     };
+ 
+     jQuery(document).on('click', 'table.inline-edit td.editable .edit-icon', function (e) {
+         var cell = jQuery(this).closest('td');
+         if ( jQuery('td.editable.editing form').length ) {
+             cancelInlineEdit(jQuery('td.editable.editing form'));
+         }
+         beginInlineEdit(cell);
+     });
+ 
+     jQuery(document).on('change', 'td.editable.editing form :input', function () {
+         jQuery(this).closest('form').data('changed', true);
+     });
+ 
+     jQuery(document).on('submit', 'td.editable.editing form', function (e) {
+         e.preventDefault();
+         submitInlineEdit(jQuery(this));
+     });
+ 
+     jQuery(document).on('click', 'td.editable .cancel', function (e) {
+         cancelInlineEdit(jQuery(this).closest('form'));
+     });
+ 
+     jQuery(document).on('click', 'td.editable .submit', function (e) {
+         submitInlineEdit(jQuery(this).closest('form'));
+     });
+ 
+     jQuery(document).on('change', 'td.editable.editing form select', function () {
+         submitInlineEdit(jQuery(this).closest('form'));
+     });
+ 
+     jQuery(document).on('datepicker:close', 'td.editable.editing form .datepicker', function () {
+         submitInlineEdit(jQuery(this).closest('form'));
+     });
+ 
+     /* inline edit on ticket display */
+     var toggle_inline_edit = function (link) {
+         link.siblings('.inline-edit-toggle').removeClass('hidden');
+         link.addClass('hidden');
+         link.closest('.titlebox').toggleClass('editing');
+     }
+ 
+     jQuery('.inline-edit-toggle').click(function (e) {
+         e.preventDefault();
+         toggle_inline_edit(jQuery(this));
+     });
+ 
+     jQuery('.titlebox[data-inline-edit-behavior="click"] > .titlebox-content').click(function (e) {
+         if (jQuery(e.target).is('a, input, select, textarea')) {
+             return;
+         }
+ 
+         e.preventDefault();
+         var container = jQuery(this).closest('.titlebox');
+         if (container.hasClass('editing')) {
+             return;
+         }
+         toggle_inline_edit(container.find('.inline-edit-toggle:visible'));
+     });
+ 
+     /* on submit, pull in all the other inline edit forms' fields into
+      * the currently-being-submitted form. that way we don't lose user
+      * input */
+     jQuery('form.inline-edit').submit(function (e) {
+         var currentForm = jQuery(this);
+ 
+         /* limit to currently-editing forms, since cancelling inline
+          * edit merely hides the form */
+         jQuery('.titlebox.editing form.inline-edit').each(function () {
+             var siblingForm = jQuery(this);
+ 
+             if (siblingForm.is(currentForm)) {
+                 return;
+             }
+ 
+             siblingForm.find(':input').each(function () {
+                 var field = jQuery(this);
+ 
+                 if (field.attr('name') == "") {
+                     return;
+                 }
+ 
+                 /* skip duplicates, such as ticket id */
+                 if (currentForm.find('[name="' + field.attr('name') + '"]').length > 0) {
+                     return;
+                 }
+ 
+                 var clone = field.clone().hide().appendTo(currentForm);
+ 
+                 /* "For performance reasons, the dynamic state of certain
+                  * form elements (e.g., user data typed into textarea
+                  * and user selections made to a select) is not copied
+                  * to the cloned elements", so manually copy them */
+                 if (clone.is('select, textarea')) {
+                     clone.val(field.val());
+                 }
+             });
+         });
+     });
+ });
+ 
  // focus jquery object in window, only moving the screen when necessary
  function scrollToJQueryObject(obj) {
      if (!obj.length) return;

-----------------------------------------------------------------------


More information about the rt-commit mailing list