[Rt-commit] rt branch 5.0/select-owner-dropdown-delay created. rt-5.0.5-41-g427cfeccf1
BPS Git Server
git at git.bestpractical.com
Thu Nov 9 15:45:03 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 427cfeccf17b302001582b3390cd3e50f121a6f3 (commit)
- Log -----------------------------------------------------------------
commit 427cfeccf17b302001582b3390cd3e50f121a6f3
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..41847f7b85 100644
--- a/share/html/Elements/SelectOwner
+++ b/share/html/Elements/SelectOwnerDropdownDelay
@@ -45,41 +45,19 @@
%# 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 class="spinner-border spinner-border-sm loading" role="status"><span class="sr-only">Loading...</span></div>
+</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