[Rt-commit] rt branch 5.0/select-owner-dropdown-delay created. rt-5.0.5-41-g7640deba0d

BPS Git Server git at git.bestpractical.com
Thu Nov 9 15:34:49 UTC 2023


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "rt".

The branch, 5.0/select-owner-dropdown-delay has been created
        at  7640deba0d07bbd101274737aaf4c5cebf5f978f (commit)

- Log -----------------------------------------------------------------
commit 7640deba0d07bbd101274737aaf4c5cebf5f978f
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Wed Nov 8 16:48:55 2023 -0500

    Load owner dropdown via AJAX for inline edit on list to speed up page load

diff --git a/share/html/Elements/RT__Ticket/ColumnMap b/share/html/Elements/RT__Ticket/ColumnMap
index 1c43d501fb..99a75454f9 100644
--- a/share/html/Elements/RT__Ticket/ColumnMap
+++ b/share/html/Elements/RT__Ticket/ColumnMap
@@ -114,7 +114,7 @@ $COLUMN_MAP = {
         title     => 'Owner', # loc
         attribute => 'Owner',
         value     => sub { return $_[0]->OwnerObj->Name },
-        edit      => sub { return \($m->scomp('/Elements/SelectOwner', TicketObj => $_[0], Name => 'Owner', Default => $_[0]->OwnerObj->Id, DefaultValue => 0)) },
+        edit      => sub { return \($m->scomp('/Elements/SelectOwner', TicketObj => $_[0], Name => 'Owner', Default => $_[0]->OwnerObj->Id, DefaultValue => 0, Delay => 1)) },
     },
     Status => {
         title     => 'Status', # loc
diff --git a/share/html/Elements/SelectOwner b/share/html/Elements/SelectOwner
index 6342257a89..7edd34b082 100644
--- a/share/html/Elements/SelectOwner
+++ b/share/html/Elements/SelectOwner
@@ -54,6 +54,7 @@ if ( !$QueueObj && !$TicketObj && RT->Config->Get('AutocompleteOwnersForSearch')
 $Widget ||= RT->Config->Get('AutocompleteOwners', $session{'CurrentUser'})
                 ? 'Autocomplete' : 'Dropdown';
 
+$Widget = 'DropdownDelay' if $Delay;
 my @objects;
 if ($TicketObj) {
     @objects = ($TicketObj);
@@ -82,4 +83,5 @@ $m->callback(
 $TicketObj  => undef
 $QueueObj   => undef
 %Queues     => ()
+$Delay      => 0
 </%ARGS>
diff --git a/share/html/Elements/SelectOwnerDropdown b/share/html/Elements/SelectOwnerDropdown
index 44dcee0f84..9e8fcf0f89 100644
--- a/share/html/Elements/SelectOwnerDropdown
+++ b/share/html/Elements/SelectOwnerDropdown
@@ -113,6 +113,7 @@ unshift @formatednames, $nobody;
 $m->callback( CallbackName => 'ModifyOwnerListSorted', ARGSRef => \%ARGS,
     NamesRef => \@formatednames, DefaultRef => \$Default, Objects => $Objects );
 
+$ValueAttribute = 'id' unless ( $ValueAttribute // '' ) =~ /^(?:id|Name)$/;
 </%INIT>
 
 <%ARGS>
diff --git a/share/html/Elements/SelectOwner b/share/html/Elements/SelectOwnerDropdownDelay
similarity index 68%
copy from share/html/Elements/SelectOwner
copy to share/html/Elements/SelectOwnerDropdownDelay
index 6342257a89..b917706eae 100644
--- a/share/html/Elements/SelectOwner
+++ b/share/html/Elements/SelectOwnerDropdownDelay
@@ -45,41 +45,18 @@
 %# those contributions and any derivatives thereof.
 %#
 %# END BPS TAGGED BLOCK }}}
-<& "SelectOwner$Widget", %ARGS, Objects => \@objects &>
-<%INIT>
-my $Widget;
-if ( !$QueueObj && !$TicketObj && RT->Config->Get('AutocompleteOwnersForSearch') ) {
-    $Widget = 'Autocomplete';
-}
-$Widget ||= RT->Config->Get('AutocompleteOwners', $session{'CurrentUser'})
-                ? 'Autocomplete' : 'Dropdown';
+<div class="select-owner-dropdown-delay" data-name="<% $Name // '' %>" data-default="<% $Default // '' %>" data-default-value="<% $DefaultValue // '' %>"
+data-default-label="<% $DefaultLabel // '' %>" data-value-attribute="<% $ValueAttribute // '' %>" data-size="<% $Size // '' %>"
+data-objects="<% JSON([ map { ref($_) . '-' . $_->id } @$Objects] ) %>"
+>
+</div>
 
-my @objects;
-if ($TicketObj) {
-    @objects = ($TicketObj);
-} elsif ($QueueObj) {
-    @objects = ($QueueObj);
-} elsif (%Queues) {
-    for my $name (keys %Queues) {
-        my $q = RT::Queue->new($session{'CurrentUser'});
-        $q->Load($name);
-        push @objects, $q;
-    }
-} else {
-    # Let's check rights on an empty queue object. that will do a search
-    # for any queue.
-    my $queue = RT::Queue->new( $session{'CurrentUser'} );
-    push( @objects, $queue );
-}
-
-$m->callback(
-    %ARGS,
-    objects      => \@objects,
-    CallbackName => 'UpdateObjectList'
-);
-</%INIT>
 <%ARGS>
-$TicketObj  => undef
-$QueueObj   => undef
-%Queues     => ()
+$Name => undef
+$Objects => []
+$Default => 0
+$DefaultValue => 1
+$DefaultLabel => "-"
+$ValueAttribute => ''
+$Size => 0
 </%ARGS>
diff --git a/share/html/Elements/SelectOwner b/share/html/Helpers/SelectOwnerDropdown
similarity index 69%
copy from share/html/Elements/SelectOwner
copy to share/html/Helpers/SelectOwnerDropdown
index 6342257a89..b925f05ae6 100644
--- a/share/html/Elements/SelectOwner
+++ b/share/html/Helpers/SelectOwnerDropdown
@@ -45,41 +45,35 @@
 %# those contributions and any derivatives thereof.
 %#
 %# END BPS TAGGED BLOCK }}}
-<& "SelectOwner$Widget", %ARGS, Objects => \@objects &>
+<& /Elements/SelectOwnerDropdown, %ARGS, Objects => \@objects &>
+% $m->abort;
 <%INIT>
-my $Widget;
-if ( !$QueueObj && !$TicketObj && RT->Config->Get('AutocompleteOwnersForSearch') ) {
-    $Widget = 'Autocomplete';
-}
-$Widget ||= RT->Config->Get('AutocompleteOwners', $session{'CurrentUser'})
-                ? 'Autocomplete' : 'Dropdown';
-
 my @objects;
-if ($TicketObj) {
-    @objects = ($TicketObj);
-} elsif ($QueueObj) {
-    @objects = ($QueueObj);
-} elsif (%Queues) {
-    for my $name (keys %Queues) {
-        my $q = RT::Queue->new($session{'CurrentUser'});
-        $q->Load($name);
-        push @objects, $q;
+for my $item ( @{ JSON::from_json($Objects) || [] } ) {
+    my ( $class, $id ) = split /-/, $item, 2;
+    if ( $class && $id && $class =~ /^RT::(?:Ticket|Queue)/ ) {
+        my $object = $class->new( $session{CurrentUser} );
+        $object->Load($id);
+        if ( $object->Id ) {
+            if ( $object->CurrentUserCanSee ) {
+                push @objects, $object;
+            }
+            else {
+                $m->abort;
+            }
+        }
+        else {
+            RT->Logger->info("Couldn't load $item");
+            $m->abort;
+        }
+    }
+    else {
+        RT->Logger->info("Invalid object: $item");
+        $m->abort;
     }
-} else {
-    # Let's check rights on an empty queue object. that will do a search
-    # for any queue.
-    my $queue = RT::Queue->new( $session{'CurrentUser'} );
-    push( @objects, $queue );
 }
-
-$m->callback(
-    %ARGS,
-    objects      => \@objects,
-    CallbackName => 'UpdateObjectList'
-);
 </%INIT>
+
 <%ARGS>
-$TicketObj  => undef
-$QueueObj   => undef
-%Queues     => ()
+$Objects => ''
 </%ARGS>
diff --git a/share/html/Elements/SelectOwner b/share/html/SelfService/Helpers/SelectOwnerDropdown
similarity index 67%
copy from share/html/Elements/SelectOwner
copy to share/html/SelfService/Helpers/SelectOwnerDropdown
index 6342257a89..2c7dbda6d0 100644
--- a/share/html/Elements/SelectOwner
+++ b/share/html/SelfService/Helpers/SelectOwnerDropdown
@@ -45,41 +45,4 @@
 %# those contributions and any derivatives thereof.
 %#
 %# END BPS TAGGED BLOCK }}}
-<& "SelectOwner$Widget", %ARGS, Objects => \@objects &>
-<%INIT>
-my $Widget;
-if ( !$QueueObj && !$TicketObj && RT->Config->Get('AutocompleteOwnersForSearch') ) {
-    $Widget = 'Autocomplete';
-}
-$Widget ||= RT->Config->Get('AutocompleteOwners', $session{'CurrentUser'})
-                ? 'Autocomplete' : 'Dropdown';
-
-my @objects;
-if ($TicketObj) {
-    @objects = ($TicketObj);
-} elsif ($QueueObj) {
-    @objects = ($QueueObj);
-} elsif (%Queues) {
-    for my $name (keys %Queues) {
-        my $q = RT::Queue->new($session{'CurrentUser'});
-        $q->Load($name);
-        push @objects, $q;
-    }
-} else {
-    # Let's check rights on an empty queue object. that will do a search
-    # for any queue.
-    my $queue = RT::Queue->new( $session{'CurrentUser'} );
-    push( @objects, $queue );
-}
-
-$m->callback(
-    %ARGS,
-    objects      => \@objects,
-    CallbackName => 'UpdateObjectList'
-);
-</%INIT>
-<%ARGS>
-$TicketObj  => undef
-$QueueObj   => undef
-%Queues     => ()
-</%ARGS>
+% $m->comp('/Helpers/SelectOwnerDropdown', %ARGS);
diff --git a/share/static/js/util.js b/share/static/js/util.js
index 6d8ddf76c3..d349bd6dcc 100644
--- a/share/static/js/util.js
+++ b/share/static/js/util.js
@@ -1323,6 +1323,26 @@ jQuery(function () {
         beginInlineEdit(cell);
     });
 
+
+    jQuery(document).on('mouseenter', 'table.inline-edit td.editable .edit-icon', function (e) {
+        const owner_dropdown_delay = jQuery(this).closest('.editable').find('div.select-owner-dropdown-delay:not(.loaded)');
+        if ( owner_dropdown_delay.length ) {
+            owner_dropdown_delay.load(RT.Config.WebHomePath + '/Helpers/SelectOwnerDropdown', {
+                Name: owner_dropdown_delay.attr('data-name'),
+                Default: owner_dropdown_delay.attr('data-default'),
+                DefaultValue: owner_dropdown_delay.attr('data-default-value'),
+                DefaultLabel: owner_dropdown_delay.attr('data-default-label'),
+                ValueAttribute: owner_dropdown_delay.attr('data-value-attribute'),
+                Size: owner_dropdown_delay.attr('data-size'),
+                Objects: owner_dropdown_delay.attr('data-objects')
+            }, function () {
+                owner_dropdown_delay.addClass('loaded');
+                refreshSelectpicker(owner_dropdown_delay.find('.selectpicker'));
+                RT.Autocomplete.bind(owner_dropdown_delay);
+            });
+        }
+    });
+
     jQuery(document).on('change', 'td.editable.editing form :input', function () {
         jQuery(this).closest('form').data('changed', true);
     });

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


hooks/post-receive
-- 
rt


More information about the rt-commit mailing list