[Rt-commit] rt branch master updated. rt-5.0.5-210-g9805dcc15a

BPS Git Server git at git.bestpractical.com
Fri Feb 23 15:12:54 UTC 2024


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, master has been updated
       via  9805dcc15ac2881ae532edae71ce40649c0a1110 (commit)
       via  cf34cad8acd3bb2185119b28b53aeee1240d83d5 (commit)
       via  77ddeab9e3b62bf43dc57324b4ac19ac6ee91859 (commit)
       via  2f3797b1d5b1b624a1038919ad8ec792588e0db2 (commit)
       via  2c3f9c0d2b95a387b280ddbb7ed6af22f798fc09 (commit)
       via  589138d25cbb115d66e0a0a63a76b9f53a4736b5 (commit)
       via  88f76835f8ea290a5ccc02d48078725ef0e8f5f2 (commit)
       via  5d9b7518c231d5b59a480c8371d0ee441702a504 (commit)
       via  9ed20c3425c0ececc51ccacaa34eee15ef444112 (commit)
       via  5afd22310c9a93630b8b0b5fb6cb869cdc368e7f (commit)
       via  a9eae999fac5bb9a91926987dd2c3ad56046c572 (commit)
       via  0d0e862f9460d871e02495b3416736104eb1b913 (commit)
       via  57099ecec8d9da1de756b6d7a15c6e619b1930ce (commit)
       via  a254b18fcecda173b3ad5d8cd31073a8b673165f (commit)
       via  018ae521a861fd5475edb223bea8fac679988db1 (commit)
       via  77539f7734215fdbe04324c535f7761973d21968 (commit)
       via  b1a2dfbbf964e80bce1b7d38532c134903146dab (commit)
       via  6f3cb67dab46a77d0cc9a8124195097f65e750da (commit)
       via  f9ddbad86fc3795ee65c9cf2a21c1ac7db7875ac (commit)
       via  c61ea88139926eb337c18e3e65518a640c1a5fdb (commit)
       via  bd89c37c720d128a09e0d873a0adef11b94aa317 (commit)
       via  53c3f339473b3a91a3482ea9cbefdb70b2e82a22 (commit)
       via  13d3b9221dff01b15bce51912728b10c11fca46b (commit)
       via  f1b761c90e76bfff7cf9f00aba07e57e350ea3f8 (commit)
       via  94196f7a79c3c097b9544497e1d9b4ce078fc6e2 (commit)
       via  35ca6c2870ef327f7c709eb127c837c6250f9991 (commit)
       via  095953d746c8609c22a6e0b2f6592fc845d8130b (commit)
       via  b4de1a9857bb82c505f2cacbf2504d4b0aaa4a87 (commit)
       via  599c2c77c6f00718059a1bd7cc00a289bda530bc (commit)
       via  6b84e21b05cf9bb3efaa5914c42b8fe87fc73871 (commit)
       via  3332d262eab27fcbcd080eeb2e81f7ea3b86849e (commit)
       via  bdad557565e7655bbca07bc3f17e105f41760946 (commit)
       via  1917492da00fba746f77bea9a9507370792c824c (commit)
       via  6ebed4f757bf13f00d3d0be26606dce4c087cf80 (commit)
       via  4e70c0639706c26bdcfafb4d8c6ffbef625ea642 (commit)
       via  68fa9b30f2863f6d628b063ff08ce2e75d4e64aa (commit)
       via  2765706a1baeafd2cf778a576acc037f79a18078 (commit)
       via  7dafceeeef2b5bbddd769c0409fce45533649fd0 (commit)
       via  7d4d396ca90577283e2ba3391076e6f2980796bc (commit)
       via  66fb05d0dd87f064b348b2848ae59362b2a4fd9e (commit)
       via  b9ebe762d4aca5e4d3bddcfda6e9fd7d64730f2d (commit)
       via  16a6007d2dd2bf764da209547f374b1724834df8 (commit)
       via  47d3549e5824b3a97a248273bd3ba5a354ff107c (commit)
       via  038b126597b11d590ff3d3c659b762dba73b68e1 (commit)
       via  5fcf7e6d588f915c5f29a7177ccb0aadcdfbf36a (commit)
       via  2d3b0c71432a3a7dc52912c250d042938a5417dc (commit)
       via  58eb260c3679c58949b0390cdb9f0689fb88f6fc (commit)
       via  8d598c59ddde1aeeb7a8e28fd7c1ddbd622618a1 (commit)
       via  0f98f66e21af171b16ba107f9f03c1c76f9075fd (commit)
       via  df3737d9e1344a216f3034585a489a7cbbc61dcb (commit)
       via  caeb1e9662ec1202909f1c4b9f74e6d006724193 (commit)
       via  3d1d2ab5f5d4d42c519c4e16456e52c1d24470bc (commit)
       via  6d480e04baac93d5ca06c28648849093a0ac0910 (commit)
       via  7d9c904ddbd9960b671b7916a4f0a3ee852d54a8 (commit)
       via  468f86bd3e82c3b5b5ef7087d416a7509d4b1abe (commit)
       via  ea07e767eaef5b202e8883051616d09806b8b48a (commit)
       via  3042d82a414b20767d2d7a04efefb59cdcd57c0d (commit)
       via  d7cddf59d6c07b86f86c9a1056434399bedff739 (commit)
       via  6ae9368c1c32c8f1d73fe1871ad9cb74679af26b (commit)
       via  fae6539af967584f3592cabd28707eb5f2a67de8 (commit)
       via  fe4a3ae80603d0e6460efcc38f1635e7b34d2b0e (commit)
       via  73b1fb96a09835dac2a36826f251566cef2eef18 (commit)
       via  c9193de32b336b5747d90815dd3415053c16a26e (commit)
       via  57976db4e0350e477627b55d27d6d44fc6e2b005 (commit)
       via  31d544f44900b0f090b3fba724412d4b024d293c (commit)
       via  c9be6f908ac8699b5f37b93b36a5ff876e4f5413 (commit)
      from  f7f1a294d151ba217d075c000c19baddb877ff6b (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 9805dcc15ac2881ae532edae71ce40649c0a1110
Merge: f7f1a294d1 cf34cad8ac
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Thu Feb 22 19:13:30 2024 -0500

    Merge branch '5.0-trunk'

diff --cc share/html/Admin/Tools/Shredder/Elements/PluginArguments
index 969c05dd18,0bfb2a374c..a2927a8c7b
--- a/share/html/Admin/Tools/Shredder/Elements/PluginArguments
+++ b/share/html/Admin/Tools/Shredder/Elements/PluginArguments
@@@ -53,9 -53,9 +53,9 @@@ $Plugin => '
  % for my $a ( $plugin_obj->SupportArgs ) {
  %  if( $plugin_obj->ArgIsBoolean( $a ) ) {
    <&| /Elements/LabeledValue, Label => "" &>
 -      <div class="custom-control custom-checkbox">
 -        <input type="checkbox" id="<% "$Plugin:$a" %>" name="<% "$Plugin:$a" %>" class="custom-control-input" value="1" <% $ARGS{ "$Plugin:$a" } ? 'checked="checked"' : '' |n %> />
 -        <label class="custom-control-label" for="<% "$Plugin:$a" %>"><% loc($a) %></label>
 +      <div class="form-check">
-         <input type="checkbox" id="<% "$Plugin:$a" %>" name="<% "$Plugin:$a" %>" class="form-check-input" value="<% $ARGS{ "$Plugin:$a" } || '' %>" />
++        <input type="checkbox" id="<% "$Plugin:$a" %>" name="<% "$Plugin:$a" %>" class="form-check-input" value="1" <% $ARGS{ "$Plugin:$a" } ? 'checked="checked"' : '' |n %> />
 +        <label class="form-check-label" for="<% "$Plugin:$a" %>"><% loc($a) %></label>
          <span class="hints d-block"><% $arguments_help{$a}->{help} |n%></span>
        </div>
     </&>
diff --cc share/html/Asset/Elements/EditPeopleInline
index eb5399c609,b0a3fbaf6f..8cdb51e1cd
--- a/share/html/Asset/Elements/EditPeopleInline
+++ b/share/html/Asset/Elements/EditPeopleInline
@@@ -45,44 -45,49 +45,49 @@@
  %# those contributions and any derivatives thereof.
  %#
  %# END BPS TAGGED BLOCK }}}
- <%args>
- $AssetObj
- </%args>
- <%init>
- my @sections = (
-     "Basics",   #loc
-     "People",   #loc
-     "Dates",    #loc
-     "Links",    #loc
- );
  
- my $can_edit = $session{CurrentUser}->Privileged
-     && $AssetObj->CurrentUserHasRight("ModifyAsset");
+ % for my $role ($AssetObj->Roles( ACLOnly => 0 )) {
+   <div class="role-<% CSSClass($role) %> role">
+     <h5 class="mt-2"><% $AssetObj->LabelForRole($role) %></h5>
+     <& EditRoleMembers, Object => $AssetObj, Role => $role &>
+   </div>
+ % }
  
- my %link;
- for my $section (@sections) {
-     my $page = $section eq 'Basics' ? "Modify.html" : "Modify$section.html";
-     $link{$section} =
-         RT->Config->Get("WebPath")
-         . "/Asset/$page?id="
-         . $AssetObj->id;
- }
- </%init>
- <div class="asset-metadata">
+ <div class="add-user">
+   <h5 class="mt-2"><&|/l&>Add a person</&></h5>
 -  <div class="form-row">
 +  <div class="row mt-2">
- % for my $section (@sections) {
-       <div class="col-4">
-         <&| /Widgets/TitleBox, title => loc($section), title_href => $can_edit ? $link{$section} : "", title_class => "inverse", class => "asset-\L$section" &>
-           <& "Show$section", AssetObj => $AssetObj &>
-         </&>
-       </div>
- % }
+     <div class="col-3">
+       <& SelectRoleType, Object => $AssetObj, Name => "AddUserRoleMember-Role" &>
+     </div>
+     <div class="col-9">
+       <input type="text" name="AddUserRoleMember"
+         data-autocomplete="Users"
+         data-autocomplete-return="Name"
+         placeholder="<% loc("Find a user...") %>"
+         class="form-control"
+       >
+     </div>
+   </div>
+ </div>
  
-     <& /Elements/ShowCustomFieldCustomGroupings,
-       Object => $AssetObj,
-       title_href => $can_edit ? RT->Config->Get("WebPath") . "/Asset/ModifyCFs.html" : "",
-       TitleBoxARGS => { title_class => "inverse" },
-       GroupingClass => 'col-4'
-     &>
+ <div class="add-group">
+   <h5 class="mt-2"><&|/l&>Add a group</&></h5>
 -  <div class="form-row">
++  <div class="row mt-2">
+     <div class="col-3">
+       <& SelectRoleType, Object => $AssetObj, Name => "AddGroupRoleMember-Role" &>
+     </div>
+     <div class="col-9">
+       <input type="text" name="AddGroupRoleMember"
+         data-autocomplete="Groups"
+         data-autocomplete-return="Name"
+         placeholder="<% loc("Find a group...") %>"
+         class="form-control"
+       >
+     </div>
    </div>
  </div>
+ 
+ <& /Elements/EditCustomFields, Object => $AssetObj, Grouping => 'People', InTable => 1 &>
+ <%ARGS>
+ $AssetObj => undef
+ </%ARGS>
diff --cc share/html/Asset/Elements/ShowSummary
index eb5399c609,b86e1ded2a..bfe54bee88
--- a/share/html/Asset/Elements/ShowSummary
+++ b/share/html/Asset/Elements/ShowSummary
@@@ -67,13 -65,64 +65,64 @@@ for my $section (@sections) 
          . "/Asset/$page?id="
          . $AssetObj->id;
  }
+ 
+ my $can_modify = $AssetObj->CurrentUserHasRight('ModifyAsset');
+ my $can_modify_cf = $AssetObj->CurrentUserHasRight('ModifyCustomField');
+ 
+ $m->callback( CallbackName => 'ModifyRights', %ARGS, AssetObj => $AssetObj, ARGSRef => \%ARGS,
+     CanModify => \$can_modify, CanModifyCF => \$can_modify_cf );
+ 
+ my $edit_label = $m->interp->apply_escapes( loc("Edit"), 'h' );
+ my $cancel_label = $m->interp->apply_escapes( loc("Cancel"), 'h' );
+ 
+ my %inline_edit_behavior;
+ if (RT->Config->Get('InlineEditPanelBehavior')) {
+     %inline_edit_behavior = %{ RT->Config->Get('InlineEditPanelBehavior')->{'RT::Asset'} || { Dates => 'hide' } };
+ }
+ 
+ my $modify_inline
+     = '<a class="inline-edit-toggle edit" href="%s">'
+     . qq{<span class="fas fa-pencil-alt icon-bordered fa-2x" alt="$edit_label" data-toggle="tooltip" data-placement="top" data-original-title="$edit_label"></span>}
+     . '</a>'
+     . '<a class="inline-edit-toggle cancel hidden" href="#">'
+     . qq{<span class="fas fa-times icon-bordered fa-2x" alt="$cancel_label" data-toggle="tooltip" data-placement="top" data-original-title="$cancel_label"></span>}
+     . '</a>';
  </%init>
  <div class="asset-metadata">
 -  <div class="form-row">
 +  <div class="row mt-2">
  % for my $section (@sections) {
+ % my $modify_url = sprintf( $modify_inline, $m->interp->apply_escapes( $link{$section}, 'h' ) );
+ % my $modify_behavior = $InlineEdit ? ($inline_edit_behavior{$section} || $inline_edit_behavior{_default} || 'link') : 'hide';
+ 
        <div class="col-4">
-         <&| /Widgets/TitleBox, title => loc($section), title_href => $can_edit ? $link{$section} : "", title_class => "inverse", class => "asset-\L$section" &>
-           <& "Show$section", AssetObj => $AssetObj &>
+         <&| /Widgets/TitleBox, title => loc($section), title_href => ($can_modify || $can_modify_cf) ? $link{$section} : "", title_class => "inverse",
+         (($can_modify || $can_modify_cf) && $modify_behavior =~ /^(link|click)$/ ? (titleright_raw => $modify_url) : ()),
+         class => (join " ", "asset-\L$section", ($modify_behavior eq 'always' ? 'editing' : ())),
+         data => { 'inline-edit-behavior' => $modify_behavior }
+         &>
+ %       unless ($modify_behavior eq 'always') {
+           <div class="inline-edit-display">
+             <& "Show$section", AssetObj => $AssetObj &>
+           </div>
+ %       }
+ %       if ($modify_behavior ne 'hide') {
+           <form class="inline-edit" action="<%RT->Config->Get('WebPath')%>/Asset/Display.html" method="post" enctype="multipart/form-data">
+             <input type="hidden" class="hidden" name="id" value="<% $AssetObj->id %>" />
+ %           if ( $section eq 'Links' ) {
+               <& /Elements/EditLinks, Object => $AssetObj, TwoColumn => 0 &>
+               <& /Elements/EditCustomFields, Object => $AssetObj, Grouping => $section, InTable => 1 &>
+ %           } elsif ( $section eq 'People' ) {
+               <& /Asset/Elements/EditPeopleInline, AssetObj => $AssetObj &>
+ %           } else {
+               <& "/Asset/Elements/Edit$section", AssetObj => $AssetObj &>
+ %           }
 -            <div class="form-row">
 -              <div class="col-12 text-right">
++            <div class="row mt-2">
++              <div class="col-12 text-end">
+                 <input type="submit" class="button btn btn-primary" value="<&|/l&>Save</&>" />
+               </div>
+             </div>
+           </form>
+ %       }
          </&>
        </div>
  % }
diff --cc share/html/Elements/CollectionAsTable/Header
index c9fa10e14a,ad0225975d..157554b2c4
--- a/share/html/Elements/CollectionAsTable/Header
+++ b/share/html/Elements/CollectionAsTable/Header
@@@ -240,9 -250,9 +250,9 @@@ foreach my $col ( @Format ) 
              my $icon = exists $filter_data{filter}{$field} ? 'funnel-fill' : 'funnel';
              $icon = RT::Interface::Web::MenuBuilder::GetSVGImage($icon);
              $m->out(
 -                qq{ <a href="javascript:void(0)" class="btn btn-primary button search-filter" data-toggle="tooltip" data-placement="bottom" data-original-title="$tooltip">$icon</a>}
 +                qq{ <a href="javascript:void(0)" class="btn btn-primary button search-filter" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="$tooltip">$icon</a>}
              );
-             $m->out( $m->scomp( '/Elements/SearchFilter', Attribute => $field, FilterData => \%filter_data, %ARGS ) );
+             $m->out( $m->scomp( $filter_comp, Attribute => $field, FilterData => \%filter_data, %ARGS ) );
          }
      }
      $m->out('</th>');
diff --cc share/html/Elements/CollectionAsTable/Row
index 50c8b7992c,5cd3e8ecbc..48db4cecd9
--- a/share/html/Elements/CollectionAsTable/Row
+++ b/share/html/Elements/CollectionAsTable/Row
@@@ -171,10 -177,11 +177,11 @@@ foreach my $column (@Format) 
      $m->out('>');
  
      if ( $attrs{edit} ) {
-         $m->out( '<form method="POST" action="' . RT->Config->Get('WebPath') . '/Helpers/TicketUpdate?id=' . $record->id . '" class="editor" autocomplete="off">' );
+         my $helper_name = $record->isa('RT::Ticket') ? 'TicketUpdate' : 'AssetUpdate';
+         $m->out( '<form method="POST" action="' . RT->Config->Get('WebPath') . "/Helpers/$helper_name?id=" . $record->id . '" class="editor" autocomplete="off">' );
          $m->out( $attrs{edit} );
 -        $m->out( '<span class="cancel text-danger far fa-times-circle" data-toggle="tooltip" data-placement="left" data-original-title="' . loc('Cancel') . '"></span>' );
 -        $m->out( '<span class="submit text-success far fa-check-circle" data-toggle="tooltip" data-placement="right" data-original-title="' . loc('Save') . '"></span>' );
 +        $m->out( '<span class="cancel text-danger far fa-times-circle" data-bs-toggle="tooltip" data-bs-placement="left" data-bs-title="' . loc('Cancel') . '"></span>' );
 +        $m->out( '<span class="submit text-success far fa-check-circle" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-title="' . loc('Save') . '"></span>' );
          $m->out('<div class="spinner-border spinner-border-sm loading" role="status"><span class="sr-only">Loading...</span></div>');
          $m->out('</form>');
          $m->out('<div class="value"><span>');
diff --cc share/html/Elements/DropdownMenu
index dbefa6d4b7,26c7257f13..9141df9f10
--- a/share/html/Elements/DropdownMenu
+++ b/share/html/Elements/DropdownMenu
@@@ -53,10 -53,10 +53,10 @@@
  % }
  
  % if ( @ShowOptions ) {
 -  <a id="metadata-dropdown" href="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
 -    <span class="fas fa-cog icon-bordered fa-2x" alt="$alt" data-toggle="tooltip" data-placement="top" data-original-title="<% loc('Options') %>"></span>
 +  <a id="metadata-dropdown" href="#" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
 +    <span class="fas fa-cog icon-bordered fa-2x" alt="$alt" data-bs-toggle="tooltip" data-bs-placement="top" data-bs-title="<% loc('Options') %>"></span>
    </a>
--  <ul class="dropdown-menu dropdown-menu-right">
++  <ul class="dropdown-menu dropdown-menu-end">
  % for my $item ( @ShowOptions ) {
  %   if ( $item eq 'HideUnsetFields' ) {
  %   my $show_label    = loc("Show unset fields");
diff --cc share/html/Elements/EditCustomFieldSelect
index b44cb6e95b,005c5c6819..03f2f46506
--- a/share/html/Elements/EditCustomFieldSelect
+++ b/share/html/Elements/EditCustomFieldSelect
@@@ -61,9 -61,9 +61,9 @@@
  >
  %   if ( $checktype eq 'radio' ) {
  % if ( $show_empty_option ) {
 -  <div class="none custom-control custom-radio">
 -    <input class="none custom-control-input" id="<% $name %>-none" type="<% $checktype %>" name="<% $name %>" value="" <% keys %default ? '' : ' checked="checked"' |n%> />
 -    <label class="custom-control-label" for="<% $name %>-none"><&|/l&>(no value)</&></label>
 +  <div class="none form-check">
-     <input class="none form-check-input" id="<% $name %>-none" type="<% $checktype %>" name="<% $name %>" id="<% $name %>-none" value="" <% keys %default ? '' : ' checked="checked"' |n%> />
++    <input class="none form-check-input" id="<% $name %>-none" type="<% $checktype %>" name="<% $name %>" value="" <% keys %default ? '' : ' checked="checked"' |n%> />
 +    <label class="form-check-label" for="<% $name %>-none"><&|/l&>(no value)</&></label>
    </div>
  % }
  %   }
@@@ -71,9 -71,9 +71,9 @@@
  %   while ( my $value = $CFVs->Next ) {
  %     my $content = $value->Name;
  %     my $labelid = "$name-". $value->id;
--<div data-name="<% $value->Category || '' %>" class="custom-control custom-<% $checktype %>">
 -  <input class="custom-control-input"  type="<% $checktype %>" name="<% $name %>" id="<% $labelid %>" value="<% $content %>" <% $default{ lc $content }? ' checked="checked"' : '' |n%> />
 -  <label class="custom-control-label" for="<% $labelid %>"><% $content %></label><br />
++<div data-name="<% $value->Category || '' %>" class="form-check">
 +  <input class="form-check-input"  type="<% $checktype %>" name="<% $name %>" id="<% $labelid %>" value="<% $content %>" <% $default{ lc $content }? ' checked="checked"' : '' |n%> />
 +  <label class="form-check-label" for="<% $labelid %>"><% $content %></label><br />
  </div>
  %   }
  </div>
@@@ -84,10 -84,14 +84,14 @@@
  %   my $FalseValue = ( $checkbox_value = $CFVs->First ) ? $checkbox_value->Name : 'False';
  %   my $TrueValue  = ( $checkbox_value = $CFVs->Next ) ? $checkbox_value->Name : 'True';
  %   my $isChecked = (scalar keys %default) && (not exists $default{lc $FalseValue});
 -  <div class="custom-control custom-checkbox">
 -    <input id="<% $name . '-Display' %>" type="checkbox" class="custom-control-input" data-checked-value="<% $TrueValue %>" data-unchecked-value="<% $FalseValue %>" value-target="#<% $name %>" <% $isChecked ? "checked" : "" %> />
 -    <label class="custom-control-label" for="<% $name . '-Display' %>"></label>
 -    <input type="hidden" id="<% $name %>" name="<% $name %>" class="custom-control"
 +  <div class="form-check">
 +    <input id="<% $name . '-Display' %>" type="checkbox" class="form-check-input" data-checked-value="<% $TrueValue %>" data-unchecked-value="<% $FalseValue %>" value-target="#<% $name %>" <% $isChecked ? "checked" : "" %> />
 +    <label class="form-check-label" for="<% $name . '-Display' %>"></label>
-     <input type="hidden" id="<% $name %>" name="<% $name %>" class="custom-control" value="<% $isChecked ? $TrueValue : $FalseValue %>" />
++    <input type="hidden" id="<% $name %>" name="<% $name %>" class="form-check"
+ %   if ( !$ARGS{ShowEmptyOption} ) {
+       value="<% $isChecked ? $TrueValue : $FalseValue %>"
+ %   }
+     />
    </div>
  <script type="text/javascript">
      var id = <% $name |n,j %>;
diff --cc share/html/Elements/Footer
index 0a59546d66,0a59546d66..9beee0c908
--- a/share/html/Elements/Footer
+++ b/share/html/Elements/Footer
@@@ -54,7 -54,7 +54,7 @@@
  % # display 1 column center aligned once logged in, without the "For support and sales..." section
  % my $cols = ( $Menu ? '12' : '4' );
    <div class="col-<% $cols %>">
--    <p id="version" class="text-center <% $Menu ? 'pb-1' : 'text-md-left' %>">
++    <p id="version" class="text-center <% $Menu ? 'pb-1' : 'text-md-start' %>">
  %     if ($m->{'rt_base_time'}) {
          <span id="time"><&|/l&>Time to display</&>: <%Time::HiRes::tv_interval( $m->{'rt_base_time'} )%> -</span>
  %     }
@@@ -66,7 -66,7 +66,7 @@@
    </div>
  % if (!$Menu) {
    <div class="col-4">
--    <p id="legal" class="text-md-right text-center"><&|/l_unsafe, '<a href="mailto:sales at bestpractical.com">sales at bestpractical.com</a>' &>For support and sales inquiries, please contact [_1].</&></p>
++    <p id="legal" class="text-md-end text-center"><&|/l_unsafe, '<a href="mailto:sales at bestpractical.com">sales at bestpractical.com</a>' &>For support and sales inquiries, please contact [_1].</&></p>
    </div>
  % }
  </div>
diff --cc share/html/Elements/ShowHistoryHeader
index 7a461a3acb,4d99cd3d90..fff3fb3c03
--- a/share/html/Elements/ShowHistoryHeader
+++ b/share/html/Elements/ShowHistoryHeader
@@@ -117,7 -117,7 +117,7 @@@ if ( $ShowDisplayModes or $ShowTitle o
      if ( @elements ) {
          # build the new link
          my $alt = loc('Options');
-         $titleright = qq{<div class="btn-group dropdown"><a id="history-dropdown" href="#" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span class="fas fa-cog icon-bordered fa-2x" alt="$alt" data-bs-toggle="tooltip" data-bs-placement="top" data-bs-title="$alt"></span></a><ul class="dropdown-menu dropdown-menu-right">};
 -        $titleright = qq{<div class="btn-group dropdown"><a id="history-dropdown" href="#" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span class="fas fa-cog icon-bordered fa-2x" alt="$alt" data-toggle="tooltip" data-placement="top" data-original-title="$alt"></span></a><ul class="dropdown-menu dropdown-menu-right">};
++        $titleright = qq{<div class="btn-group dropdown"><a id="history-dropdown" href="#" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span class="fas fa-cog icon-bordered fa-2x" alt="$alt" data-bs-toggle="tooltip" data-bs-placement="top" data-bs-title="$alt"></span></a><ul class="dropdown-menu dropdown-menu-end">};
  
          # foreach of the elements, build a new <li>$element</li> and append to the output.
          foreach my $element ( @elements ) {
diff --cc share/html/Search/Elements/FilterAssets
index fa8be256e6,bbaff8689c..297c122826
--- a/share/html/Search/Elements/FilterAssets
+++ b/share/html/Search/Elements/FilterAssets
@@@ -56,132 -56,63 +56,63 @@@
            </a>
          </div>
          <div class="modal-body">
- %       if ( $Attribute eq 'Subject' ) {
+ %       if ( $Attribute =~ /^(Name|Description)$/ ) {
 -          <div class="form-row">
 +          <div class="row mt-2">
              <div class="label col-3">
-                 <&|/l&>Subject</&>:
+                 <% loc($Attribute) %>:
              </div>
              <div class="value col-9">
-                 <input class="form-control" name="Subject" value="<% $filter->{Subject} // '' %>" />
+                 <input class="form-control" name="<% $Attribute %>" value="<% $filter->{$Attribute} // '' %>" />
              </div>
            </div>
- %       } elsif ( $Attribute eq 'Status' ) {
-           <div class="row mt-2">
-             <div class="label col-3">
-                 <&|/l&>Status</&>:
-             </div>
-             <div class="value col-9">
-               <ul class="list-group list-group-compact">
- %           for my $status ( sort { lc $a cmp lc $b } keys %$status  ) {
-                 <li class="list-group-item">
-                   <div class="form-check">
-                     <input type="checkbox" id="Status-<% $status %>" name="Status" class="form-check-input" value="<% $status %>" <% $filter->{Status}{$status} ? 'checked="checked"' : '' |n %> />
-                     <label class="form-check-label" for="Status-<% $status %>"><% $status %></label>
-                   </div>
-                 </li>
- %           }
-               </ul>
-             </div>
-           </div>
- %       } elsif ( $Attribute eq 'Queue' ) {
+ %       } elsif ( $Attribute eq 'Catalog' ) {
 -          <div class="form-row">
 +          <div class="row mt-2">
              <div class="label col-3">
-                 <&|/l&>Queue</&>:
+                 <&|/l&>Catalog</&>:
              </div>
              <div class="value col-9">
                <ul class="list-group list-group-compact">
- %             for my $queue ( sort { lc $a->Name cmp lc $b->Name } @$queues ) {
+ %             for my $catalog ( sort { lc $a->Name cmp lc $b->Name } @$catalogs ) {
                  <li class="list-group-item">
 -                  <div class="custom-control custom-checkbox">
 -                    <input type="checkbox" id="Catalog-<% $catalog->Id %>" name="Catalog" class="custom-control-input" value="<% $catalog->Id %>" <% $filter->{Catalog}{$catalog->Id} ? 'checked="checked"' : '' |n %> />
 -                    <label class="custom-control-label" for="Catalog-<% $catalog->Id %>"><% $catalog->Name %></label>
 +                  <div class="form-check">
-                     <input type="checkbox" id="Queue-<% $queue->Id %>" name="Queue" class="form-check-input" value="<% $queue->Id %>" <% $filter->{Queue}{$queue->Id} ? 'checked="checked"' : '' |n %> />
-                     <label class="form-check-label" for="Queue-<% $queue->Id %>"><% $queue->Name %></label>
++                    <input type="checkbox" id="Catalog-<% $catalog->Id %>" name="Catalog" class="form-check-input" value="<% $catalog->Id %>" <% $filter->{Catalog}{$catalog->Id} ? 'checked="checked"' : '' |n %> />
++                    <label class="form-check-label" for="Catalog-<% $catalog->Id %>"><% $catalog->Name %></label>
                    </div>
                  </li>
  %             }
                </ul>
              </div>
            </div>
- %       } elsif ( $Attribute eq 'Owner' ) {
-           <div class="row mt-2">
-             <div class="label col-3">
-               <&|/l&>Owner</&>:
-             </div>
-             <div class="value col-9">
-               <& /Elements/SelectOwner, Name => 'Owner', Default => $filter->{Owner}, Size => 6 &>
-             </div>
-           </div>
- %       } elsif ( $Attribute eq 'SLA' ) {
-           <div class="row mt-2">
-             <div class="label col-3">
-               <&|/l&>SLA</&>:
-             </div>
-             <div class="value col-9">
-               <ul class="list-group list-group-compact">
- %             for my $sla ( sort( keys %{RT->Config->Get('ServiceAgreements')->{'Levels'}} ), 'NULL'  ) {
-                 <li class="list-group-item">
-                   <div class="form-check">
-                     <input type="checkbox" class="form-check-input checkbox" id="SLA_<% $sla %>" name="SLA" value="<% $sla %>" <% $filter->{SLA}{$sla} ? 'checked="checked"' : '' |n %> />
-                       <label class="form-check-label" for="SLA_<% $sla %>"><% $sla eq 'NULL' ? loc('(no value)') : $sla %></label>
-                   </div>
-                 </li>
- %             }
-               </ul>
-             </div>
-           </div>
- %       } elsif ( $Attribute =~ /^(?:Creator|LastUpdatedBy)$/) {
+ %       } elsif ( $Attribute =~ /^(Contact|Owner|HeldBy)s?$/ ) {
+ %         my $name = $1;
 -          <div class="form-row">
 +          <div class="row mt-2">
-             <div class="label col-3">
-               <% loc(join ' ', split /(?=[A-Z])/, $Attribute) %>:
+             <div class="label col-4">
+               <% loc($name) %>:
              </div>
-             <div class="value col-9">
-               <input class="form-control" data-autocomplete="Users" name="<% $Attribute %>" value="<% $filter->{$Attribute} %>" data-autocomplete-return="Name" />
+             <div class="value col-8">
+               <input class="form-control" data-autocomplete="Users" name="<% $name %>" value="<% $filter->{$name} %>" />
              </div>
            </div>
- %       } elsif ( $Attribute eq 'Type' ) {
+ %       } elsif ( $Attribute eq 'Status' ) {
 -          <div class="form-row">
 +          <div class="row mt-2">
              <div class="label col-3">
-                 <&|/l&>Type</&>:
+                 <&|/l&>Status</&>:
              </div>
              <div class="value col-9">
                <ul class="list-group list-group-compact">
- %           for my $type ( qw/approval reminder ticket/ ) {
+ %           for my $status ( sort { lc $a cmp lc $b } keys %$status  ) {
                  <li class="list-group-item">
 -                  <div class="custom-control custom-checkbox">
 -                    <input type="checkbox" id="Status-<% $status %>" name="Status" class="custom-control-input" value="<% $status %>" <% $filter->{Status}{$status} ? 'checked="checked"' : '' |n %> />
 -                    <label class="custom-control-label" for="Status-<% $status %>"><% $status %></label>
 +                  <div class="form-check">
-                     <input type="checkbox" id="Type-<% $type %>" name="Type" class="form-check-input" value="<% $type %>" <% $filter->{Type}{$type} ? 'checked="checked"' : '' |n %> />
-                     <label class="form-check-label" for="Type-<% $type %>"><% $type %></label>
++                    <input type="checkbox" id="Status-<% $status %>" name="Status" class="form-check-input" value="<% $status %>" <% $filter->{Status}{$status} ? 'checked="checked"' : '' |n %> />
++                    <label class="form-check-label" for="Status-<% $status %>"><% $status %></label>
                    </div>
                  </li>
  %           }
                </ul>
              </div>
            </div>
- %       } elsif ( $Attribute =~ /(?:Initial|Final)?Priority/ ) {
-           <div class="row mt-2">
-             <div class="label col-6">
-               <% loc('[_1] equal to', join ' ', split /(?=[A-Z])/, $Attribute) %>:
-             </div>
-             <div class="value col-6">
-               <& /Elements/SelectPriority, Name => "${Attribute}EqualTo", Default => $filter->{$Attribute}{'='}, Queues => { map { $_->Id => 1 } @$queues }, ValueAsString => 1, ShowEmptyOption => 1 &>
-             </div>
-           </div>
-           <div class="row mt-2">
-             <div class="label col-6">
-               <% loc('[_1] greater than', join ' ', split /(?=[A-Z])/, $Attribute) %>:
-             </div>
-             <div class="value col-6">
-               <& /Elements/SelectPriority, Name => "${Attribute}GreaterThan", Default => $filter->{$Attribute}{'>'}, Queues => { map { $_->Id => 1 } @$queues }, ValueAsString => 1, ShowEmptyOption => 1 &>
-             </div>
-           </div>
-           <div class="row mt-2">
-             <div class="label col-6">
-               <% loc('[_1] less than', join ' ', split /(?=[A-Z])/, $Attribute) %>:
-             </div>
-             <div class="value col-6">
-               <& /Elements/SelectPriority, Name => "${Attribute}LessThan", Default => $filter->{$Attribute}{'<'}, Queues => { map { $_->Id => 1 } @$queues }, ValueAsString => 1, ShowEmptyOption => 1 &>
-             </div>
-           </div>
  %       } elsif ( $Attribute eq 'id' ) {
 -          <div class="form-row">
 +          <div class="row mt-2">
              <div class="label col-6">
                <% loc('[_1] equal to', $Attribute) %>:
              </div>
@@@ -205,55 -136,33 +136,33 @@@
                <input type="text" class="form-control" name="<% $Attribute %>LessThan" size="5" value="<% $filter->{$Attribute}{'<'} %>" />
              </div>
            </div>
- %       } elsif ( $Attribute =~ /^(?:Told|Starts|Started|Due|Resolved|Created|LastUpdated)/ ) {
-           <div class="row mt-2">
-             <div class="label col-6">
-               <% loc('[_1] equal to', join ' ', split /(?=[A-Z])/, $Attribute) %>:
-             </div>
-             <div class="value col-6">
-               <& /Elements/SelectDate, Name => "${Attribute}EqualTo", Default => $filter->{$Attribute}{'='} || '', ShowTime => 0 &>
-             </div>
-           </div>
-           <div class="row mt-2">
-             <div class="label col-6">
-               <% loc('[_1] greater than', join ' ', split /(?=[A-Z])/, $Attribute) %>:
-             </div>
-             <div class="value col-6">
-               <& /Elements/SelectDate, Name => "${Attribute}GreaterThan", Default => $filter->{$Attribute}{'>'} || '', ShowTime => 0 &>
-             </div>
-           </div>
+ %       } elsif ( $Attribute =~ /^(?:Creator|LastUpdatedBy)$/) {
 -          <div class="form-row">
 +          <div class="row mt-2">
-             <div class="label col-6">
-               <% loc('[_1] less than', join ' ', split /(?=[A-Z])/, $Attribute) %>:
+             <div class="label col-3">
+               <% loc(join ' ', split /(?=[A-Z])/, $Attribute) %>:
              </div>
-             <div class="value col-6">
-               <& /Elements/SelectDate, Name => "${Attribute}LessThan", Default => $filter->{$Attribute}{'<'} || '', ShowTime => 0 &>
+             <div class="value col-9">
+               <input class="form-control" data-autocomplete="Users" name="<% $Attribute %>" value="<% $filter->{$Attribute} %>" data-autocomplete-return="Name" />
              </div>
            </div>
- %       } elsif ( $Attribute =~ /^Time/ ) {
+ %       } elsif ( $Attribute =~ /^(?:Created|LastUpdated)/ ) {
 -          <div class="form-row">
 +          <div class="row mt-2">
              <div class="label col-6">
                <% loc('[_1] equal to', join ' ', split /(?=[A-Z])/, $Attribute) %>:
              </div>
              <div class="value col-6">
-               <div class="d-inline-block">
-                 <input type="text" class="form-control" name="<% $Attribute %>EqualTo" size="5" value="<% $filter->{$Attribute}{'='} %>" />
-               </div>
-               <&|/l&>Minutes</&>
+               <& /Elements/SelectDate, Name => "${Attribute}EqualTo", Default => $filter->{$Attribute}{'='} || '', ShowTime => 0 &>
              </div>
            </div>
 -          <div class="form-row">
 +          <div class="row mt-2">
              <div class="label col-6">
                <% loc('[_1] greater than', join ' ', split /(?=[A-Z])/, $Attribute) %>:
              </div>
              <div class="value col-6">
-               <div class="d-inline-block">
-                 <input type="text" class="form-control" name="<% $Attribute %>GreaterThan" size="5" value="<% $filter->{$Attribute}{'>'} %>" />
-               </div>
-               <&|/l&>Minutes</&>
+               <& /Elements/SelectDate, Name => "${Attribute}GreaterThan", Default => $filter->{$Attribute}{'>'} || '', ShowTime => 0 &>
              </div>
            </div>
 -          <div class="form-row">
 +          <div class="row mt-2">
              <div class="label col-6">
                <% loc('[_1] less than', join ' ', split /(?=[A-Z])/, $Attribute) %>:
              </div>
@@@ -314,12 -210,12 +210,12 @@@
  
          </div>
          <div class="modal-footer">
 -          <div class="form-row justify-content-end">
 +          <div class="row mt-2 justify-content-end">
              <div class="col-auto">
 -              <input type="button" class="button btn btn-primary" data-dismiss="modal" name="Apply" value="<% loc('Cancel') %>" />
 +              <input type="button" class="button btn btn-primary" data-bs-dismiss="modal" name="Apply" value="<% loc('Cancel') %>" />
              </div>
              <div class="col-auto">
-               <input type="button" class="button btn btn-primary" onclick="filterSearchResults()" name="Apply" value="<% loc('Apply') %>" />
+               <input type="button" class="button btn btn-primary" onclick="filterSearchResults('RT::Assets')" name="Apply" value="<% loc('Apply') %>" />
              </div>
            </div>
          </div>
diff --cc share/html/Search/Elements/FilterTickets
index fa8be256e6,3276aa2d94..7882dbd7ad
--- a/share/html/Search/Elements/FilterTickets
+++ b/share/html/Search/Elements/FilterTickets
@@@ -314,12 -314,12 +314,12 @@@
  
          </div>
          <div class="modal-footer">
 -          <div class="form-row justify-content-end">
 +          <div class="row mt-2 justify-content-end">
              <div class="col-auto">
 -              <input type="button" class="button btn btn-primary" data-dismiss="modal" name="Apply" value="<% loc('Cancel') %>" />
 +              <input type="button" class="button btn btn-primary" data-bs-dismiss="modal" name="Apply" value="<% loc('Cancel') %>" />
              </div>
              <div class="col-auto">
-               <input type="button" class="button btn btn-primary" onclick="filterSearchResults()" name="Apply" value="<% loc('Apply') %>" />
+               <input type="button" class="button btn btn-primary" onclick="filterSearchResults('RT::Tickets')" name="Apply" value="<% loc('Apply') %>" />
              </div>
            </div>
          </div>

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

Summary of changes:
 README                                             | 382 --------------
 README.md                                          | 366 +++++++++++++
 devel/tools/license_tag                            |  34 +-
 docs/UPGRADING-5.0                                 |  24 +
 docs/images/screenshot.png                         | Bin 0 -> 129980 bytes
 docs/web_deployment.pod                            |   6 +
 etc/RT_Config.pm.in                                |  38 ++
 lib/RT/Action/NotifyGroup.pm                       |  45 +-
 lib/RT/Action/SendEmail.pm                         |  11 +-
 lib/RT/Assets.pm                                   |   8 +-
 lib/RT/Config.pm                                   |   6 +
 lib/RT/CustomField.pm                              |   6 +-
 lib/RT/Interface/Web.pm                            |  61 ++-
 lib/RT/Interface/Web/MenuBuilder.pm                |   3 +-
 lib/RT/Interface/Web/ReportsRegistry.pm            |   2 +-
 lib/RT/REST2/Resource/Record/Hypermedia.pm         |   1 +
 lib/RT/REST2/Resource/Ticket.pm                    |  13 +-
 lib/RT/Report.pm                                   | 567 ++++++++++++++++++---
 lib/RT/Report/Assets.pm                            | 139 +++++
 lib/RT/Report/{Tickets => Assets}/Entry.pm         |   2 +-
 lib/RT/Report/Tickets.pm                           | 385 +-------------
 lib/RT/Report/Transactions.pm                      |   2 +-
 lib/RT/Test/Apache.pm                              |   1 +
 lib/RT/Ticket.pm                                   |  22 +
 lib/RT/User.pm                                     |  10 +-
 sbin/rt-email-dashboards.in                        |  31 +-
 share/html/Admin/Global/DashboardsInMenu.html      |   4 +-
 .../Admin/Tools/Shredder/Elements/PluginArguments  |   2 +-
 share/html/Admin/Users/DashboardsInMenu.html       |   4 +-
 .../Articles/Article/Elements/EditCustomFields     |   2 +-
 share/html/Asset/Display.html                      |  46 +-
 .../{AddCatalogPeople => EditPeopleInline}         |  24 +-
 share/html/Asset/Elements/EditRoleMembers          |   4 +-
 share/html/Asset/Elements/ShowSummary              |  65 ++-
 share/html/Asset/Search/Bulk.html                  |   1 +
 share/html/Dashboards/Subscription.html            |   2 +-
 share/html/Elements/CollectionAsTable/Header       | 299 +++++++----
 share/html/Elements/CollectionAsTable/Row          |  13 +-
 share/html/Elements/CollectionList                 |   7 +-
 share/html/Elements/CollectionListPaging           |   1 +
 share/html/Elements/ColumnMap                      |  26 +-
 share/html/Elements/DropdownMenu                   |   2 +-
 share/html/Elements/EditCustomFieldSelect          |  18 +-
 share/html/Elements/Footer                         |   4 +-
 share/html/Elements/Header                         |   3 +-
 .../index.html => Elements/HttpResponseHeaders}    |  89 ++--
 share/html/Elements/RT__Asset/ColumnMap            |   6 +-
 share/html/Elements/SearchFilter                   | 304 +----------
 share/html/Elements/ShowCustomFieldCustomGroupings |   2 +-
 share/html/Elements/ShowHistoryHeader              |   2 +-
 .../AssetUpdate}                                   |  43 +-
 share/html/Helpers/Autocomplete/autohandler        |   6 +-
 share/html/Helpers/CollectionListRow               |   2 +-
 share/html/Helpers/PreviewScrips                   |   1 +
 share/html/Helpers/RightsInspector/Search          |   2 +-
 share/html/Helpers/ShowSimplifiedRecipients        |   1 +
 share/html/Helpers/TicketUpdate                    |   6 +
 share/html/Helpers/autohandler                     |   5 +-
 share/html/Prefs/DashboardsInMenu.html             |   4 +-
 share/html/Search/Bulk.html                        |   8 +-
 share/html/Search/Chart.html                       |  22 +
 .../SearchFilter => Search/Elements/FilterAssets}  | 168 ++----
 .../SearchFilter => Search/Elements/FilterTickets} |   4 +-
 share/html/SelfService/Elements/MyGroupRequests    |   2 +-
 share/html/SelfService/Transaction/Display.html    |  10 +-
 share/html/Ticket/Display.html                     |   6 +
 share/html/Ticket/Elements/ShowAssets              |   1 +
 share/html/Ticket/Update.html                      |   3 +-
 share/html/m/_elements/header                      |   3 +-
 share/static/js/util.js                            | 158 ++++--
 t/assets/web.t                                     |  84 +++
 t/charts/asset.t                                   | 102 ++++
 t/data/configs/apache2.4+fcgid.conf.in             |   1 +
 t/data/configs/apache2.4+mod_perl.conf.in          |   1 +
 t/rest2/tickets.t                                  |  10 +-
 t/web/charting.t                                   |  12 +
 t/web/custom_frontpage.t                           |  31 ++
 t/web/helpers-http-cache-headers.t                 |  24 +-
 t/web/saved_search_chart.t                         |  30 ++
 t/web/search_shortener.t                           |  12 +-
 t/web/self_service.t                               |  27 +
 t/web/ticket_owner.t                               |  34 ++
 82 files changed, 2323 insertions(+), 1595 deletions(-)
 delete mode 100644 README
 create mode 100644 README.md
 create mode 100644 docs/images/screenshot.png
 create mode 100644 lib/RT/Report/Assets.pm
 copy lib/RT/Report/{Tickets => Assets}/Entry.pm (98%)
 copy share/html/Asset/Elements/{AddCatalogPeople => EditPeopleInline} (81%)
 copy share/html/{Admin/Articles/Classes/index.html => Elements/HttpResponseHeaders} (58%)
 copy share/html/{Elements/SelectOwnerAutocomplete => Helpers/AssetUpdate} (73%)
 copy share/html/{Elements/SearchFilter => Search/Elements/FilterAssets} (60%)
 copy share/html/{Elements/SearchFilter => Search/Elements/FilterTickets} (98%)
 create mode 100644 t/charts/asset.t


hooks/post-receive
-- 
rt


More information about the rt-commit mailing list