[Rt-commit] rt branch, 4.6-theme/search-pages, repushed

Craig Kaiser craig at bestpractical.com
Thu May 30 10:10:30 EDT 2019


The branch 4.6-theme/search-pages was deleted and repushed:
       was c17c4cc96bdeee51990fde19116b85efb0e030a2
       now 710d5b8ed18d62482eeae10f8ee6dd6f3f5b1abc

  1: 7f13f0055 =   1: 7f13f0055 Allow for multiple base themes by avoiding showing any to the user
  2: 0ce97154b =   2: 0ce97154b Add unaltered copies of base and rudder themes to make responsive
  3: 565e91062 =   3: 565e91062 rudder-responsive imports base-responsive rather than base
  4: c151cf258 =   4: c151cf258 Make boxcontainer padding rules less demanding
  5: 45e22b27c =   5: 45e22b27c Make RT at a glance two-column layout responsive
  6: 66a41a296 =   6: 66a41a296 Improve whitespace around content for rudder-responsive
  7: f0df65c03 =   7: f0df65c03 Generalize the two-column layout markup
  8: 4a2814fdb =   8: 4a2814fdb Add a grid system
  9: b7008bcd8 =   9: b7008bcd8 Make ticket display ShowSummary responsive
 10: 2a14260d4 =  10: 2a14260d4 Make search field really narrow on narrow screens
 11: 050d2b466 =  11: 050d2b466 Make the "new ticket in" and queue selector responsive
 12: 7293efce0 =  12: 7293efce0 Narrow gap between new ticket and search fields on narrow screens
 13: 26d3640d3 =  13: 26d3640d3 Display more of the title when the page is narrow
 14: 743fca5fe =  14: 743fca5fe On narrow screens pop up a modal for selecting ticket queue
 15: fc435d351 =  15: fc435d351 Hide "RT for example.com" on narrow screens
 16: c12f7a2fd =  16: c12f7a2fd Eliminate history display's margin-left on narrow screens
 17: 031767c67 =  17: 031767c67 On very narrow screens, zero out body padding
 18: a70a12eb8 =  18: a70a12eb8 Get rid of horizontal padding on ticket history on narrow screens
 19: ed77add0f =  19: ed77add0f Collapse padding at a wider (700px) viewport
 20: bf6072713 =  20: bf6072713 Prevent reminders from breaking layout with its long text field
 21: 3bf0b2783 =  21: 3bf0b2783 Convert Links table to have .fields/.field using table CSS
 22: ef390831d =  22: ef390831d Improve styling of links for small screens
 23: 9e0e238dc =  23: 9e0e238dc Don't wrap labels
 24: abde98f8c =  24: abde98f8c Limit the breakdown of fields tables to just "wide" ones
 25: a036b7218 =  25: a036b7218 Convert basics, dates, and people groupings away from tables
 26: 18410558f =  26: 18410558f Add margin-left to <li>s within a wide fields table that breaks
 27: abe679392 =  27: abe679392 Make padding on field names more consistent
 28: 4535278a7 =  28: 4535278a7 Convert new reminder form from table to fields
 29: 902013336 =  29: 902013336 Improve rendering of ticket update page
 30: b83145a17 =  30: b83145a17 Add messagedetails to jumbo page titlebox
 31: b30e4e3be =  31: b30e4e3be Improve display of reminders table and form
 32: a3debdb88 =  32: a3debdb88 Avoid breaking layout with new reminder subject
 33: a4ec31340 =  33: a4ec31340 Remove minimum height from titleboxes
 34: 9e2e9f847 =  34: 9e2e9f847 Restore original titlebox padding rule but only for fields
 35: f048c2714 =  35: f048c2714 Remove spurious <br> tag
 36: 14bd5afdb =  36: 14bd5afdb Switch ticket update from tables to fields
 37: b6076f108 =  37: b6076f108 Linearize ticket update form on narrow widths
 38: 9847f9464 =  38: 9847f9464 Make update form take up 100% of the titlebox
 39: 3f12ac4ab =  39: 3f12ac4ab Fix reply cc/bcc/subject fields to be 100% width
 40: 7d903afc9 =  40: 7d903afc9 Rename .crypto to .empty to better explain what it's for
 41: 0b1e7df31 =  41: 0b1e7df31 Make ticket create responsive
 42: 21b722a26 =  42: 21b722a26 First pass at responsive for SelfService/Create
 43: a5c7652c3 =  43: a5c7652c3 First pass at responsive for SelfService/Update
 44: 8b58c4a15 =  44: 8b58c4a15 Remove AsTable from Edit CFs
 45: 921d72c94 =  45: 921d72c94 Remove these pre-responsive CF edit styles
 46: f5bcb7577 =  46: f5bcb7577 Wrap selfservice update form in a titlebox
 47: 94e44ea62 =  47: 94e44ea62 Wrap selfservice create form in a titlebox
 48: efe3f52d3 =  48: efe3f52d3 Convert selfservice display to responsive
 49: fc80f17b7 =  49: fc80f17b7 Switch ShowCustomFields from table to fields
 50: d26da2aa1 =  50: d26da2aa1 Fix transaction actions overlapping description
 51: 726ff3ed2 =  51: 726ff3ed2 Switch QuickCreate from table to fields
 52: 1dac409ae =  52: 1dac409ae Improve whitespace around fields
 53: f99594d6b =  53: f99594d6b Improve padding and spacing on forms
 54: 9b94580d3 =  54: 9b94580d3 Have searches use the full width of the viewport
 55: df8c440d3 =  55: df8c440d3 Make login box more responsive
 56: 6c19bf649 =  56: 6c19bf649 Add missing type="text" for login username input
 57: ff38918b6 =  57: ff38918b6 Improve form rendering for Mobile Safari
 58: bc548a5bb =  58: bc548a5bb Separate existing reminders from create form with hr only if there are reminders
 59: 3d16535fd =  59: 3d16535fd Remove unnecessary margin-top on collection tables
 60: a6e560500 =  60: a6e560500 Fix save button on ticket reminders to not use inline style
 61: 33e559e98 =  61: 33e559e98 Fix error result background color for rudder
 62: 6366d835d =  62: 6366d835d Make QueueList take up the full width
 63: 753b2e278 =  63: 753b2e278 Give rudder the responsive viewport meta tag
 64: 96258f3a2 =  64: 96258f3a2 Turn off autocapitalize on usernames
 65: b738946b7 =  65: b738946b7 Don't let users select the "drop files here" dropzone text
 66: ed9896623 =  66: ed9896623 Improve error transaction colors
 67: fc2c7dd24 =  67: fc2c7dd24 Replace ShowAttachments's <font size="-2"> with CSS
 68: 0ed134c2a =  68: 0ed134c2a Word-break very (perhaps maliciously) long attachment names
 69: 329257c04 =  69: 329257c04 Limit the width of quickcreate since it looks silly when very very wide
 70: 7e8fc73fa =  70: 7e8fc73fa Use full width for MyReminders table
 71: 5acf57a6e =  71: 5acf57a6e Fix Modify Basics to be div.fields rather than table
 72: 13b9aa7be =  72: 13b9aa7be Add missing type="text" to more input fields
 73: 37a3c8190 =  73: 37a3c8190 Avoid menulist-button styling for multi-row select boxes
 74: 76ebbf037 =  74: 76ebbf037 Middle valign fields
 75: abd46fe43 =  75: abd46fe43 Convert EditPeople from nested tables to responsive
 76: 6b1ed3291 =  76: 6b1ed3291 Load the correct version of msie.css
 77: 55f62d910 =  77: 55f62d910 Add a BeforeNav stylesheet plugin
 78: 713ae954b =  78: 713ae954b Make menus overflow into a "More" item on narrow viewports
 79: 0817597f0 =  79: 0817597f0 Remove hyperlink behavior from top-level More menu items
 80: 51ff61b95 =  80: 51ff61b95 Add type attribute to many input fields that were missing it
 81: 9920a2bae =  81: 9920a2bae Fix css rule for one-time cc etc becoming email fields
 82: 639ec0a0a =  82: 639ec0a0a Switch new ticket create popup to a list of links rather than a select
 83: 263260d84 =  83: 263260d84 Fix a regression on legacy themes with CF edit panels
 84: e7a24762e =  84: e7a24762e Override 400px width of jquery modals
 85: d05db9319 =  85: d05db9319 Fix quick create on narrow screens
 86: 1ce3e7535 =  86: 1ce3e7535 Fix width regression with quickcreate requestor field
 87: 0bdd6b928 =  87: 0bdd6b928 Switch AddLinks from tables to fields
 88: de71b019f =  88: de71b019f Improve rendering of date editing form
 89: 7e88d621b =  89: 7e88d621b Improve padding to be more consistent
 90: 15dd4d5e1 =  90: 15dd4d5e1 Make modify links use fluid two-column layout
 91: 4bb74ee24 =  91: 4bb74ee24 Improve edit links to use fields instead of a table
 92: 71adf4d59 =  92: 71adf4d59 Convert merge from table to fields
 93: 8bed2a517 =  93: 8bed2a517 Use the same nomenclature "Message" not "Content" for jumbo
 94: 821af7169 =  94: 821af7169 Switch Jumbo reply panel from table to fields
 95: 451b94ebf =  95: 451b94ebf Jumbo: Wrap both basic fields and custom fields in a single fields table
 96: 8e0edb097 =  96: 8e0edb097 Make message form on Jumbo more consistent
 97: 3410d1f86 =  97: 3410d1f86 Make simple search form more responsive
 98: ac878afd0 =  98: ac878afd0 Fix rudder-responsive getting bottom border radius
 99: ee6fd153c =  99: ee6fd153c Remove margin-right from titleboxes in rudder-responsive
100: 19e92fb58 = 100: 19e92fb58 Improve design of more about requestors panel
101: 0795549da = 101: 0795549da Make user prefs page responsive to small screens
102: 3142b6f1e = 102: 3142b6f1e Remove 20em width from ticket subject on basics
103: d2c34c901 = 103: d2c34c901 Wrap forward message in a titlebox
104: e93736f6e = 104: e93736f6e Switch forward from table to fields
105: 865306bb5 = 105: 865306bb5 Fix "more about requestors" overlap
106: a91ad6b41 = 106: a91ad6b41 Update tests for the responsive HTML change
107: 309321394 = 107: 309321394 Fix Nav tweaking for installer mode
108: 5d80cac56 = 108: 5d80cac56 Initial elevator theme, copied from rudder-responsive
109: 9e2710667 = 109: 9e2710667 Add popper.js 1.14.6 dependency
110: d5361e4f8 = 110: d5361e4f8 Add bootstrap 4.2.1 dependency
111: ce6db31de = 111: ce6db31de Add missing "field" css class for Started field
112: 18b4c17ed = 112: 18b4c17ed Get rid of strikethrough in menu
113: 2c1913cea = 113: 2c1913cea Fix h1 position to make it vertically centered
114: 16a290165 = 114: 16a290165 Fix results position to make it vertically centered
115: fa1eddb07 = 115: fa1eddb07 Drop the incomplete rudder-responsive theme
116: 30c74df65 = 116: 30c74df65 Update copyright to 2019 for new added theme related files
117: 8202a7ed6 = 117: 8202a7ed6 Initial elevator-dark theme
118: 6e8c418d2 = 118: 6e8c418d2 Add bootstrap-select 1.13.7 dependency
119: 65a2b8e72 = 119: 65a2b8e72 Switch to bootstrap styled table
120: d3c438a8c = 120: d3c438a8c Switch to bootstrap card for titleboxes
121: 19983ce0c = 121: 19983ce0c Add %ThemeJSFiles config to serve different js for different themes
122: c20ba1ee1 = 122: c20ba1ee1 Migrate search builder for elevator themes
123: c381b52d6 = 123: c381b52d6 Migrate homepage to elevator themes
124: 2b95d7c55 = 124: 2b95d7c55 Add bootstrap-combobox 1.2.0 dependency
125: 16785047a = 125: 16785047a Migrate cf edit components to elevator themes
126: 3434d9955 = 126: 3434d9955 Migrate ticket modify pages to elevator themes
127: 3287cf808 = 127: 3287cf808 Migrate Reports pages to elevator themes
128: 5cca4857d = 128: 5cca4857d Migrate Admin/Scrips/index to elevator themes
129: d38e146cd = 129: d38e146cd Migrate Admin/Scrips/Create to elevator themes
130: ef2c1e2f4 = 130: ef2c1e2f4 Migrate Admin/Scrips/Modify to elevator themes
131: 71c8971a2 = 131: 71c8971a2 Migrate Admin/Scrips/Objects to elevator themes
132: b487bd5e5 = 132: b487bd5e5 Migrate Admin/Actions/Display to elevator themes
133: f1112cfd9 = 133: f1112cfd9 Update asset CSS and JS files for elevator theme
134: 96287645d = 134: 96287645d Update asset display components for elevator theme
135: 9317af1b2 = 135: 9317af1b2 Update asset create/modify components for elevator theme
136: edb9d71e1 = 136: edb9d71e1 Update asset search components for elevator theme
137: 1983b0460 = 137: 1983b0460 Migrate Admin/Actions/Create to elevator themes
138: 93ba4a292 = 138: 93ba4a292 Migrate Admin/Actions/Modify to elevator themes
139: be2c9fbaa = 139: be2c9fbaa Migrate Admin/Conditions/Create to elevator themes
140: 440891534 = 140: 440891534 Migrate Admin/Conditions/Modify to elevator themes
141: c9d4607cb = 141: c9d4607cb Migrate Admin/Conditions/Display to elevator themes
---:  ------- > 142: ee901eaee Set root font size to 13px for elevator themes
---:  ------- > 143: 91a00487d Smaller padding of table cells
142: c5926edf0 = 144: c5926edf0 Update README for third-party libraries we use for elevator themes
143: 040a1753c = 145: 040a1753c Migrate Admin/Queues/index to elevator themes
144: c38a865b0 = 146: c38a865b0 Migrate Admin/Queues/DefaultValues to elevator themes
145: 38f6769b3 = 147: 38f6769b3 Migrate Admin/Queues/GroupRights to elevator themes
146: e3bea7a0e = 148: e3bea7a0e Migrate Admin/Queues/People to elevator themes
147: 718b40ecd = 149: 718b40ecd Migrate Admin/Queues/Templates to elevator themes
148: 36cc62403 = 150: 36cc62403 Migrate Admin/Queues/Template to elevator themes
149: 4e1a6f49c = 151: 4e1a6f49c  Migrate Admin/Queues/UserRights to elevator themes
150: feda57066 = 152: feda57066 Migrate Admin/Queues/Modify to elevator themes
151: 9a8faf24d = 153: 9a8faf24d Migrate Admin/Queues/Scrips to elevator themes
152: 3633771fd = 154: 3633771fd Migrate dashboards pages to elevator theme
153: 1af8daf08 = 155: 1af8daf08 Migrate login page to elevator theme
154: b07894c25 = 156: b07894c25 Fix a typo for css class list-group-borderless
155: bc2f1ee62 = 157: bc2f1ee62 Migrate admin custom roles pages to elevator theme
156: c336fd3bc = 158: c336fd3bc Migrate admin global rights pages to elevator themes
157: f2e1065f3 = 159: f2e1065f3 Migrate admin article topics to elevator themes
158: f2790eaa9 = 160: f2790eaa9 Migrate admin custom field modify pages to elevators
159: cbc683348 = 161: cbc683348 Migrate Admin/Users/index to elevator themes
160: 88e88305d = 162: 88e88305d Migrate Admin/Users/CustomFields to elevator themes
161: 59e133d18 = 163: 59e133d18 Migrate Admin/Users/DashboardsInMenu to elevator themes
162: 96dc2f3ef = 164: 96dc2f3ef Migrate Admin/Users/Keys to elevator themes
163: 0f5854a8f = 165: 0f5854a8f Migrate Admin/Users/Modify to elevator themes
164: aa193b3ec = 166: aa193b3ec Migrate Admin/Users/MyRT to elevator themes
165: e3a963616 = 167: e3a963616 Fix failing test
---:  ------- > 168: 034714f5f Add Inter font(web hinted) 3.5
---:  ------- > 169: 9a3818b06 Use Inter font for elevator themes
---:  ------- > 170: ba38c0810 Migrate Admin/CustomFields/index to elevator themes
---:  ------- > 171: a268ff604 Migrate Admin/CustomFields/GroupRights to elevator themes
---:  ------- > 172: 1c1b38104 Migrate Admin/CustomFields/UserRights to elevator themes
---:  ------- > 173: a45fb96a2 Migrate Admin/Articles/Classes/index to elevator themes
---:  ------- > 174: c97747714 Migrate Admin/Articles/Classes/Modify to elevator themes
---:  ------- > 175: ffa5da05f Migrate Admin/Articles/Classes/GroupRights to elevator themes
---:  ------- > 176: 9067f8fbf Migrate Admin/Articles/Classes/Objects to elevator themes
---:  ------- > 177: 1e7580438 Migrate Admin/Articles/Classes/UserRights to elevator themes
---:  ------- > 178: 603a37fc0 Migrate tools pages for elevator theme
---:  ------- > 179: adf04b399 Migrate Admin/Assets/Catalogs/Modify to elevator themes
---:  ------- > 180: 747db72ec Migrate Admin/Assets/Catalogs/CustomFields to elevator themes
---:  ------- > 181: 32f5757cd Migrate Admin/Assets/Catalogs/DefaultValues to elevator themes
---:  ------- > 182: b5d9dc0fc Migrate Admin/Assets/Catalogs/GroupRights to elevator themes
---:  ------- > 183: ffb3caddc Migrate Admin/Assets/Catalogs/Roles to elevator themes
---:  ------- > 184: bc6c541ef Migrate Admin/Assets/Catalogs/UserRights to elevator themes
---:  ------- > 185: 4759d3c48 Migrate Admin/Assets/Catalogs/index to elevator themes
---:  ------- > 186: 118631f5a Fix inter font URL on production mode
---:  ------- > 187: 39b73c679 Migrate SelfService pages to elevator theme
---:  ------- > 188: 92fda6951 Migrate approvlas page to elevator theme
---:  ------- > 189: b85bc73d9 Migrate /Admin/Tools/Shredder to elevator themes
166: c17c4cc96 ! 190: 710d5b8ed Migrate search pages to elevator theme
    @@ -112,6 +112,7 @@
     +    <div class="col-md-4 value">
     +      <em><&|/l&>(Unsupported custom field type)</&></em>
     +    </div>
    ++  </div>
      %   $RT::Logger->info("Unknown CustomField type: " . $cf->Type);
      %   next
      % }
    @@ -148,114 +149,103 @@
     -    <td class="labeltop"><&|/l&>Depends on</&>:</td>
     -    <td class="value">
     +<div class="form-row">
    -+
     +  <div class="col-md-6">
    ++<h3><&|/l&>Current Links</&></h3>
    ++<div class="form-row">
    ++  <div class="col-md-3 label">
    ++    <&|/l&>Depends on</&>:
    ++  </div>
    ++  <div class="col-md-9 value">
     +    <div class="form-row">
    -+      <div class="col-md-3 label">
    -+        <h3><&|/l&>Current Links</&></h3>
    -+      </div>
    -+      <div class="col-md-9 value"></div>
    -+    </div>
    -+
    -+    <div class="form-row">
    -+      <div class="col-md-3 label">
    -+        <&|/l&>Depends on</&>:
    -+      </div>
    -+      <div class="col-md-9 value">
      % if ( $hash{DependsOn} ) {
      % for my $link ( values %{$hash{DependsOn}} ) {
    --      <& EditLink, Link => $link, Mode => 'Target' &>
    -+        <& EditLink, Link => $link, Mode => 'Target' &>
    +       <& EditLink, Link => $link, Mode => 'Target' &>
      % } }
     -    </td>
     -  </tr>
     -  <tr>
     -    <td class="labeltop"><&|/l&>Depended on by</&>:</td>
     -    <td class="value">
    -+      </div>
    -+    </div>
    -+
    -+    <div class="form-row">
    -+      <div class="col-md-3 label">
    -+        <&|/l&>Depended on by</&>:
    -+      </div>
    -+      <div class="col-md-9 value">
    ++    </div>
    ++  </div>
    ++</div>
    ++
    ++<div class="form-row">
    ++  <div class="col-md-3 label">
    ++    <&|/l&>Depended on by</&>:
    ++  </div>
    ++  <div class="col-md-9 value">
      % if ( $hash{DependedOnBy} ) {
      % for my $link ( values %{$hash{DependedOnBy}} ) {
    --      <& EditLink, Link => $link, Mode => 'Base' &>
    -+        <& EditLink, Link => $link, Mode => 'Base' &>
    +       <& EditLink, Link => $link, Mode => 'Base' &>
      % } }
     -    </td>
     -  </tr>
     -  <tr>
     -    <td class="labeltop"><&|/l&>Parents</&>:</td>
     -    <td class="value">
    -+      </div>
    -+    </div>
    -+
    -+    <div class="form-row">
    -+      <div class="col-md-3 label">
    -+        <&|/l&>Parents</&>:
    -+      </div>
    -+      <div class="col-md-9 value">
    ++  </div>
    ++</div>
    ++
    ++<div class="form-row">
    ++  <div class="col-md-3 label">
    ++    <&|/l&>Parents</&>:
    ++  </div>
    ++  <div class="col-md-9 value">
      % if ( $hash{MemberOf} ) {
      % for my $link ( values %{$hash{MemberOf}} ) {
    --      <& EditLink, Link => $link, Mode => 'Target' &>
    -+        <& EditLink, Link => $link, Mode => 'Target' &>
    +       <& EditLink, Link => $link, Mode => 'Target' &>
      % } }
     -    </td>
     -  </tr>
     -  <tr>
     -    <td class="labeltop"><&|/l&>Children</&>:</td>
     -    <td class="value">
    -+      </div>
    -+    </div>
    -+
    -+    <div class="form-row">
    -+      <div class="col-md-3 label">
    -+        <&|/l&>Children</&>:
    -+      </div>
    -+      <div class="col-md-9 value">
    ++  </div>
    ++</div>
    ++
    ++<div class="form-row">
    ++  <div class="col-md-3 label">
    ++    <&|/l&>Children</&>:
    ++  </div>
    ++  <div class="col-md-9 value">
      % if ( $hash{Members} ) {
      % for my $link ( values %{$hash{Members}} ) {
    --      <& EditLink, Link => $link, Mode => 'Base' &>
    -+        <& EditLink, Link => $link, Mode => 'Base' &>
    +       <& EditLink, Link => $link, Mode => 'Base' &>
      % } }
     -    </td>
     -  </tr>
     -  <tr>
     -    <td class="labeltop"><&|/l&>Refers to</&>:</td>
     -    <td class="value">
    -+      </div>
    -+    </div>
    -+
    -+    <div class="form-row">
    -+      <div class="col-md-3 label">
    -+        <&|/l&>Refers to</&>:
    -+      </div>
    -+    <div class="col-md-9 value">
    ++  </div>
    ++</div>
    ++
    ++<div class="form-row">
    ++  <div class="col-md-3 label">
    ++    <&|/l&>Refers to</&>:
    ++  </div>
    ++  <div class="col-md-9 value">
      % if ( $hash{RefersTo} ) {
      % for my $link ( values %{$hash{RefersTo}} ) {
    --      <& EditLink, Link => $link, Mode => 'Target' &>
    -+        <& EditLink, Link => $link, Mode => 'Target' &>
    +       <& EditLink, Link => $link, Mode => 'Target' &>
      % } }
     -    </td>
     -  </tr>
     -  <tr>
     -    <td class="labeltop"><&|/l&>Referred to by</&>:</td>
     -    <td class="value">
    -+      </div>
    -+    </div>
    -+
    -+    <div class="form-row">
    -+      <div class="col-md-3 label">
    -+        <&|/l&>Referred to by</&>:
    -+      </div>
    -+      <div class="col-md-9 value">
    ++  </div>
    ++</div>
    ++
    ++<div class="form-row">
    ++  <div class="col-md-3 label">
    ++    <&|/l&>Referred to by</&>:
    ++  </div>
    ++  <div class="col-md-9 value">
      % if ( $hash{ReferredToBy} ) {
      % for my $link ( values %{$hash{ReferredToBy}} ) {
    --      <& EditLink, Link => $link, Mode => 'Base' &>
    -+        <& EditLink, Link => $link, Mode => 'Base' &>
    +       <& EditLink, Link => $link, Mode => 'Base' &>
      % } }
     -    </td>
     -  </tr>
    @@ -266,7 +256,19 @@
     -</table>
     -</td>
     -<td valign="top">
    --<h3><&|/l&>New Links</&></h3>
    ++  </div>
    ++</div>
    ++
    ++<div class="form-row">
    ++  <div class="col-md-3"></div>
    ++  <div class="col-md-9">
    ++    <i><&|/l&>(Check box to delete)</&></i>
    ++  </div>
    ++</div>
    ++</div>
    ++
    ++<div class="col-md-6">
    + <h3><&|/l&>New Links</&></h3>
     -<em><&|/l&>Enter tickets or URIs to link to. Separate multiple entries with spaces.</&>
     -</em><br />
     -<table>
    @@ -298,96 +300,83 @@
     -</td>
     -</tr>
     -</table>
    -+      </div>
    -+    </div>
    -+
    -+    <div class="form-row">
    -+      <div class="col-md-3 label">
    -+        <i><&|/l&>(Check box to delete)</&></i>
    -+      </div>
    -+      <div class="col-md-9 value"></div>
    -+    </div>
    -+
    -+  </div>
    -+
    -+  <div class="col-md-6">
    -+    <div class="form-row">
    -+      <div class="col-md-3 label">
    -+        <h3><&|/l&>New Links</&></h3>
    -+      </div>
    -+    </div>
    -+
    -+    <div class="form-row">
    -+      <div class="col-md-3 label">
    -+        <em><&|/l&>Enter tickets or URIs to link to. Separate multiple entries with spaces.</&></em>
    -+      </div>
    -+    </div>
    -+
    -+    <div class="form-row">
    -+      <div class="col-md-3 label">
    -+        <&|/l&>Depends on</&>:
    -+      </div>
    -+      <div class="col-md-9 value">
    -+        <input type="text" class="form-control" name="<% $record_type %>-DependsOn" data-autocomplete="Tickets" data-autocomplete-multiple="1" value="<% $ARGS{ $record_type .'-DependsOn' } || '' %>" />
    -+      </div>
    -+    </div>
    -+
    -+    <div class="form-row">
    -+      <div class="col-md-3 label">
    -+        <&|/l&>Depended on by</&>:
    -+      </div>
    -+      <div class="col-md-9 value">
    -+        <input type="text" class="form-control" name="DependsOn-<% $record_type %>" data-autocomplete="Tickets" data-autocomplete-multiple="1" value="<% $ARGS{ 'DependsOn-'. $record_type } || '' %>" />
    -+      </div>
    -+    </div>
    -+
    -+    <div class="form-row">
    -+      <div class="col-md-3 label">
    -+        <&|/l&>Parents</&>:
    -+      </div>
    -+      <div class="col-md-9 value">
    -+        <input type="text" class="form-control" name="<% $record_type %>-MemberOf" data-autocomplete="Tickets" data-autocomplete-multiple="1" value="<% $ARGS{ $record_type .'-MemberOf'} || '' %>" />
    -+      </div>
    -+    </div>
    -+
    -+    <div class="form-row">
    -+      <div class="col-md-3 label">
    -+        <&|/l&>Children</&>:
    -+      </div>
    -+      <div class="col-md-9 value">
    -+        <input type="text" class="form-control" name="MemberOf-<% $record_type %>" data-autocomplete="Tickets" data-autocomplete-multiple="1" value="<% $ARGS{ 'MemberOf-'. $record_type } || '' %>" />
    -+      </div>
    -+    </div>
    -+
    -+    <div class="form-row">
    -+      <div class="col-md-3 label">
    -+        <&|/l&>Refers to</&>:
    -+      </div>
    -+      <div class="col-md-9 value">
    -+        <input type="text" class="form-control" name="<% $record_type %>-RefersTo" data-autocomplete="Tickets" data-autocomplete-multiple="1" value="<% $ARGS{ $record_type .'-RefersTo'} || '' %>" />
    -+      </div>
    -+    </div>
    - 
    -+    <div class="form-row">
    -+      <div class="col-md-3 label">
    -+        <&|/l&>Referred to by</&>:
    -+      </div>
    -+      <div class="col-md-9 value">
    -+        <input class="form-control" type="text" name="RefersTo-<% $record_type %>" data-autocomplete="Tickets" data-autocomplete-multiple="1" value="<% $ARGS{ 'RefersTo-'. $record_type } || '' %>" />
    -+      </div>
    -+    </div>
    -+  </div>
    -+</div>
    ++<em><&|/l&>Enter tickets or URIs to link to. Separate multiple entries with spaces.</&></em>
    ++
    ++<div class="form-row">
    ++  <div class="col-md-3 label">
    ++    <&|/l&>Depends on</&>:
    ++  </div>
    ++  <div class="col-md-9 value">
    ++    <input class="form-control" type="text" name="<% $record_type %>-DependsOn" data-autocomplete="Tickets" data-autocomplete-multiple="1" value="<% $ARGS{ $record_type .'-DependsOn' } || '' %>" />
    ++  </div>
    ++</div>
    ++
    ++<div class="form-row">
    ++  <div class="col-md-3 label">
    ++    <&|/l&>Depended on by</&>:
    ++  </div>
    ++  <div class="col-md-9 value">
    ++    <input class="form-control" type="text" name="DependsOn-<% $record_type %>" data-autocomplete="Tickets" data-autocomplete-multiple="1" value="<% $ARGS{ 'DependsOn-'. $record_type } || '' %>" />
    ++  </div>
    ++</div>
    ++
    ++<div class="form-row">
    ++  <div class="col-md-3 label">
    ++    <&|/l&>Parents</&>:
    ++  </div>
    ++  <div class="col-md-9 value">
    ++    <input class="form-control" type="text" name="<% $record_type %>-MemberOf" data-autocomplete="Tickets" data-autocomplete-multiple="1" value="<% $ARGS{ $record_type .'-MemberOf'} || '' %>" />
    ++  </div>
    ++</div>
    ++
    ++<div class="form-row">
    ++  <div class="col-md-3 label">
    ++    <&|/l&>Children</&>:
    ++  </div>
    ++  <div class="col-md-9 value">
    ++    <input class="form-control" type="text" name="MemberOf-<% $record_type %>" data-autocomplete="Tickets" data-autocomplete-multiple="1" value="<% $ARGS{ 'MemberOf-'. $record_type } || '' %>" />
    ++  </div>
    ++</div>
    ++
    ++<div class="form-row">
    ++  <div class="col-md-3 label">
    ++    <&|/l&>Refers to</&>:
    ++  </div>
    ++  <div class="col-md-9 value">
    ++    <input class="form-control" type="text" name="<% $record_type %>-RefersTo" data-autocomplete="Tickets" data-autocomplete-multiple="1" value="<% $ARGS{ $record_type .'-RefersTo'} || '' %>" />
    ++  </div>
    ++</div>
    ++
    ++<div class="form-row">
    ++  <div class="col-md-3 label">
    ++    <&|/l&>Referred to by</&>:
    ++  </div>
    ++  <div class="col-md-9 value">
    ++    <input class="form-control" type="text" name="RefersTo-<% $record_type %>" data-autocomplete="Tickets" data-autocomplete-multiple="1" value="<% $ARGS{ 'RefersTo-'. $record_type } || '' %>" />
    ++  </div>
    ++</div>
    ++</div>
    ++
    ++</div>
    + 
      <%ARGS>
      $Collection
    - </%ARGS>
     
     diff --git a/share/html/Search/Bulk.html b/share/html/Search/Bulk.html
     --- a/share/html/Search/Bulk.html
     +++ b/share/html/Search/Bulk.html
     @@
    - <& /Elements/Submit, Label => loc('Update'), CheckboxNameRegex => '/^UpdateTicket(All)?$/', CheckAll => 1, ClearAll => 1 &>
    - <br />
    + 
    + <hr />
    + 
    +-<& /Elements/Submit, Label => loc('Update'), CheckboxNameRegex => '/^UpdateTicket(All)?$/', CheckAll => 1, ClearAll => 1 &>
    +-<br />
    ++<div class="form-row">
    ++  <div class="col-md-12">
    ++    <& /Elements/Submit, Label => loc('Update'), CheckboxNameRegex => '/^UpdateTicket(All)?$/', CheckAll => 1, ClearAll => 1 &>
    ++  </div>
    ++</div>
    ++
      <&|/Widgets/TitleBox, title => $title &>
     -<table>
     -<tr>
    @@ -409,59 +398,78 @@
     -<td class="value"> <& /Elements/EmailInput, Name => "AddAdminCc", Size=> 20, Default => $ARGS{AddAdminCc} &> </td></tr>
     -<tr><td class="label"> <&|/l&>Remove AdminCc</&>: </td>
     -<td class="value"> <& /Elements/EmailInput, Name => "DeleteAdminCc", Size=> 20, Default => $ARGS{DeleteAdminCc} &> </td></tr>
    -+
    -+<div class="form-row">
    -+  <div class="col-md-3 label"> <&|/l&>Make Owner</&>: </div>
    -+  <div class="col-md-9 value">
    -+    <& /Elements/SelectOwner, Name => "Owner", Default => $ARGS{Owner} || '' &>
    -+    <div class="custom-control custom-checkbox">
    -+        <input type="checkbox" class="custom-control-input" id="ForceOwnerChange" name="ForceOwnerChange" <% $ARGS{ForceOwnerChange} ? 'checked="checked"' : '' %> />
    -+        <label class="custom-control-label" for="ForceOwnerChange">( <&|/l&>Force change</&>)</label>
    -+      </div>
    -+  </div>
    -+</div>
    -+
    -+<div class="form-row">
    -+  <div class="col-md-3 label"> <&|/l&>Add Requestor</&>: </div>
    -+  <div class="col-md-9 value">
    -+    <& /Elements/EmailInput, Name => "AddRequestor", Size=> 20, Default => $ARGS{AddRequestor} &>
    -+  </div>
    -+</div>
    -+
    -+<div class="form-row">
    -+  <div class="col-md-3 label"> <&|/l&>Remove Requestor</&>: </div>
    -+  <div class="col-md-9 value">
    -+    <& /Elements/EmailInput, Name => "DeleteRequestor", Size=> 20, Default => $ARGS{DeleteRequestor} &>
    -+  </div>
    -+</div>
    -+
    -+<div class="form-row">
    -+  <div class="col-md-3 label"> <&|/l&>Add Cc</&>: </div>
    -+  <div class="col-md-9 value">
    -+    <& /Elements/EmailInput, Name => "AddCc", Size=> 20, Default => $ARGS{AddCc} &>
    -+  </div>
    -+</div>
    -+
    -+<div class="form-row">
    -+  <div class="col-md-3 label"> <&|/l&>Remove Cc</&>: </div>
    -+  <div class="col-md-9 value">
    -+    <& /Elements/EmailInput, Name => "DeleteCc", Size=> 20, Default => $ARGS{DeleteCc} &>
    -+  </div>
    -+</div>
    -+
    -+<div class="form-row">
    -+  <div class="col-md-3 label"> <&|/l&>Add AdminCc</&>: </div>
    -+  <div class="col-md-9 value">
    -+    <& /Elements/EmailInput, Name => "AddAdminCc", Size=> 20, Default => $ARGS{AddAdminCc} &>
    -+  </div>
    -+</div>
    -+
    -+<div class="form-row">
    -+  <div class="col-md-3 label"> <&|/l&>Remove AdminCc</&>: </div>
    -+  <div class="col-md-9 value">
    -+    <& /Elements/EmailInput, Name => "DeleteAdminCc", Size=> 20, Default => $ARGS{DeleteAdminCc} &>
    -+  </div>
    -+</div>
    ++  <div class="form-row">
    ++    <div class="col-md-3 label">
    ++      <&|/l&>Make Owner</&>:
    ++    </div>
    ++    <div class="col-md-9 value">
    ++      <& /Elements/SelectOwner, Name => "Owner", Default => $ARGS{Owner} || '' &>
    ++    </div>
    ++  </div>
    ++
    ++  <div class="form-row">
    ++    <div class="col-md-3 label"></div>
    ++    <div class="custom-control custom-checkbox col-md-9 value">
    ++      <input type="checkbox" id="ForceOwnerChange" class="checkbox custom-control-input" name="ForceOwnerChange"
    ++        <% $ARGS{ForceOwnerChange} ? 'checked="checked"' : '' %>
    ++      />
    ++      <label for="ForceOwnerChange" class="custom-control-label">(<&|/l&>Force change</&>)</label>
    ++    </div>
    ++  </div>
    ++
    ++  <div class="form-row">
    ++    <div class="col-md-3 label">
    ++      <&|/l&>Add Requestor</&>:
    ++    </div>
    ++    <div class="col-md-9 value">
    ++      <& /Elements/EmailInput, Name => "AddRequestor", Size=> 20, Default => $ARGS{AddRequestor} &>
    ++    </div>
    ++  </div>
    ++
    ++  <div class="form-row">
    ++    <div class="col-md-3 label">
    ++      <&|/l&>Remove Requestor</&>:
    ++    </div>
    ++    <div class="col-md-9 value">
    ++      <& /Elements/EmailInput, Name => "DeleteRequestor", Size=> 20, Default => $ARGS{DeleteRequestor} &>
    ++    </div>
    ++  </div>
    ++
    ++  <div class="form-row">
    ++    <div class="col-md-3 label">
    ++      <&|/l&>Add Cc</&>:
    ++    </div>
    ++    <div class="col-md-9 value">
    ++      <& /Elements/EmailInput, Name => "AddCc", Size=> 20, Default => $ARGS{AddCc} &>
    ++    </div>
    ++  </div>
    ++
    ++  <div class="form-row">
    ++    <div class="col-md-3 label">
    ++      <&|/l&>Remove Cc</&>:
    ++    </div>
    ++    <div class="col-md-9 value">
    ++      <& /Elements/EmailInput, Name => "DeleteCc", Size=> 20, Default => $ARGS{DeleteCc} &>
    ++    </div>
    ++  </div>
    ++
    ++  <div class="form-row">
    ++    <div class="col-md-3 label">
    ++      <&|/l&>Add AdminCc</&>:
    ++    </div>
    ++    <div class="col-md-9 value">
    ++      <& /Elements/EmailInput, Name => "AddAdminCc", Size=> 20, Default => $ARGS{AddAdminCc} &>
    ++    </div>
    ++  </div>
    ++
    ++  <div class="form-row">
    ++    <div class="col-md-3 label">
    ++      <&|/l&>Remove AdminCc</&>:
    ++    </div>
    ++    <div class="col-md-9 value">
    ++      <& /Elements/EmailInput, Name => "AddAdminCc", Size=> 20, Default => $ARGS{AddAdminCc} &>
    ++    </div>
    ++  </div>
      
      % my $single_roles = RT::CustomRoles->new($session{CurrentUser});
      % $single_roles->LimitToSingleValue;
    @@ -471,14 +479,14 @@
     -<td class="label"> <&|/l, $role->Name &>Make [_1]</&>: </td>
     -<td class="value"><& /Elements/SingleUserRoleInput, role => $role, ShowPlaceholder => 0, ShowEntryHint => 0, Size => 20, Default => $ARGS{"RT::CustomRole-" . $role->Id} &></td>
     -</tr>
    -+<div class="form-row">
    -+  <div class="col-md-3 label">
    -+    <&|/l, $role->Name &>Make [_1]</&>:
    -+  </div>
    -+  <div class="col-md-9 value">
    -+    <& /Elements/SingleUserRoleInput, role => $role, ShowPlaceholder => 0, ShowEntryHint => 0, Size => 20, Default => $ARGS{"RT::CustomRole-" . $role->Id} &>
    -+  </div>
    -+</div>
    ++  <div class="form-row">
    ++    <div class="col-md-3 label">
    ++      <&|/l, $role->Name &>Make [_1]</&>:
    ++    </div>
    ++    <div class="col-md-9 value">
    ++      <& /Elements/SingleUserRoleInput, role => $role, ShowPlaceholder => 0, ShowEntryHint => 0, Size => 20, Default => $ARGS{"RT::CustomRole-" . $role->Id} &>
    ++    </div>
    ++  </div>
      % }
      
      % my $multi_roles = RT::CustomRoles->new($session{CurrentUser});
    @@ -493,23 +501,23 @@
     -<td class="label"> <&|/l, $role->Name &>Remove [_1]</&>: </td>
     -<td class="value"> <& /Elements/EmailInput, Name => "DeleteRT::CustomRole-" . $role->Id, Size=> 20, Default => $ARGS{"DeleteRT::CustomRole-" . $role->Id} &> </td>
     -</tr>
    -+<div class="form-row">
    -+  <div class="col-md-3 label">
    -+    <&|/l, $role->Name &>Add [_1]</&>:
    -+  </div>
    -+  <div class="col-md-9 value">
    -+    <& /Elements/EmailInput, Name => "AddRT::CustomRole-" . $role->Id, Size=> 20, Default => $ARGS{"AddRT::CustomRole-" . $role->Id} &>
    -+  </div>
    -+</div>
    -+
    -+<div class="form-row">
    -+  <div class="col-md-3 label">
    -+    <&|/l, $role->Name &>Remove [_1]</&>:
    -+  </div>
    -+  <div class="col-md-9 value">
    -+    <& /Elements/EmailInput, Name => "DeleteRT::CustomRole-" . $role->Id, Size=> 20, Default => $ARGS{"DeleteRT::CustomRole-" . $role->Id} &>
    -+  </div>
    -+</div>
    ++  <div class="form-row">
    ++    <div class="col-md-3 label">
    ++      <&|/l, $role->Name &>Add [_1]</&>:
    ++    </div>
    ++    <div class="col-md-9 value">
    ++      <& /Elements/EmailInput, Name => "AddRT::CustomRole-" . $role->Id, Size=> 20, Default => $ARGS{"AddRT::CustomRole-" . $role->Id} &>
    ++    </div>
    ++  </div>
    ++
    ++  <div class="form-row">
    ++    <div class="col-md-3 label">
    ++      <&|/l, $role->Name &>Remove [_1]</&>:
    ++    </div>
    ++    <div class="col-md-9 value">
    ++      <& /Elements/EmailInput, Name => "DeleteRT::CustomRole-" . $role->Id, Size=> 20, Default => $ARGS{"DeleteRT::CustomRole-" . $role->Id} &>
    ++    </div>
    ++  </div>
      % }
      
     -</table>
    @@ -524,53 +532,54 @@
     -<td class="value"> <& /Elements/SelectQueue, Name => "Queue", Default => $ARGS{Queue} &> </td></tr>
     -<tr><td class="label"> <&|/l&>Make Status</&>: </td>
     -<td class="value"> <& /Ticket/Elements/SelectStatus, Name => "Status", Default => $ARGS{Status}, Queues => $seen_queues &> </td></tr>
    -+<div class="form-row">
    -+  <div class="col-md-3 label">
    -+    <&|/l&>Make subject</&>:
    -+  </div>
    -+  <div class="col-md-9 value">
    -+    <input class="form-control" type="text" name="Subject" size="20" value="<% $ARGS{Subject} || '' %>"/>
    -+  </div>
    -+</div>
    -+
    -+<div class="form-row">
    -+  <div class="col-md-3 label">
    -+    <&|/l&>Make priority</&>:
    -+  </div>
    -+  <div class="col-md-9 value">
    -+    <& /Elements/SelectPriority, Name => "Priority", Default => $ARGS{Priority} &>
    -+  </div>
    -+</div>
    -+
    -+<div class="form-row">
    -+  <div class="col-md-3 label">
    -+    <&|/l&>Make queue</&>:
    -+  </div>
    -+  <div class="col-md-9 value">
    -+    <& /Elements/SelectQueue, Name => "Queue", Default => $ARGS{Queue} &>
    -+  </div>
    -+</div>
    -+
    -+<div class="form-row">
    -+  <div class="col-md-3 label">
    -+    <&|/l&>Make Status</&>:
    -+  </div>
    -+  <div class="col-md-9 value">
    -+    <& /Ticket/Elements/SelectStatus, Name => "Status", Default => $ARGS{Status}, Queues => $seen_queues &>
    -+  </div>
    -+</div>
    ++
    ++  <div class="form-row">
    ++    <div class="col-md-3 label">
    ++      <&|/l&>Make subject</&>:
    ++    </div>
    ++    <div class="col-md-9 value">
    ++      <input class="form-control" type="text" name="Subject" size="20" value="<% $ARGS{Subject} || '' %>"/>
    ++    </div>
    ++  </div>
    ++
    ++  <div class="form-row">
    ++    <div class="col-md-3 label">
    ++      <&|/l&>Make priority</&>:
    ++    </div>
    ++    <div class="col-md-9 value">
    ++      <& /Elements/SelectPriority, Name => "Priority", Default => $ARGS{Priority} &>
    ++    </div>
    ++  </div>
    ++
    ++  <div class="form-row">
    ++    <div class="col-md-3 label">
    ++      <&|/l&>Make queue</&>:
    ++    </div>
    ++    <div class="col-md-9 value">
    ++      <& /Elements/SelectQueue, Name => "Queue", Default => $ARGS{Queue} &>
    ++    </div>
    ++  </div>
    ++
    ++  <div class="form-row">
    ++    <div class="col-md-3 label">
    ++      <&|/l&>Make Status</&>:
    ++    </div>
    ++    <div class="col-md-9 value">
    ++      <& /Ticket/Elements/SelectStatus, Name => "Status", Default => $ARGS{Status}, Queues => $seen_queues &>
    ++    </div>
    ++  </div>
     +
      % if ($hasSLA) {
     -<tr><td class="label"> <&|/l&>Make SLA</&>: </td>
     -<td class="value"> <& /Elements/SelectSLA, Name => "SLA", Default => $ARGS{SLA} &> </td></tr>
    -+<div class="form-row">
    -+  <div class="col-md-3 label">
    -+    <&|/l&>Make SLA</&>:
    -+  </div>
    -+  <div class="col-md-9 value">
    -+    <& /Elements/SelectSLA, Name => "SLA", Default => $ARGS{SLA} &>
    -+  </div>
    -+</div>
    ++  <div class="form-row">
    ++    <div class="col-md-3 label">
    ++      <&|/l&>Make SLA</&>:
    ++    </div>
    ++    <div class="col-md-9 value">
    ++      <& /Elements/SelectSLA, Name => "SLA", Default => $ARGS{SLA} &>
    ++    </div>
    ++  </div>
      % }
     -<tr><td class="label"> <&|/l&>Make date Starts</&>: </td>
     -<td class="value"> <& /Elements/SelectDate, Name => "Starts_Date", Default => $ARGS{Starts_Date} || '' &> </td></tr>
    @@ -586,33 +595,41 @@
     -</tr>
     -</table>
     +
    -+<div class="form-row">
    -+  <div class="col-md-3 label">
    -+    <&|/l&>Make date Starts</&>:
    -+  </div>
    -+  <div class="col-md-9 value">
    -+    <& /Elements/SelectDate, Name => "Starts_Date", Default => $ARGS{Starts_Date} || '' &>
    -+  </div>
    -+</div>
    -+
    -+<div class="form-row">
    -+  <div class="col-md-3 label">
    -+    <&|/l&>Make date Told</&>:
    -+  </div>
    -+  <div class="col-md-9 value">
    -+    <& /Elements/SelectDate, Name => "Told_Date", Default => $ARGS{Told_Date} || '' &>
    -+  </div>
    -+</div>
    -+
    -+<div class="form-row">
    -+  <div class="col-md-3 label">
    -+    <&|/l&>Make date Due</&>:
    -+  </div>
    -+  <div class="col-md-9 value">
    -+    <& /Elements/SelectDate, Name => "Due_Date", Default => $ARGS{Due_Date} || '' &>
    -+  </div>
    -+</div>
    -+
    ++  <div class="form-row">
    ++    <div class="col-md-3 label">
    ++      <&|/l&>Make date Starts</&>:
    ++    </div>
    ++    <div class="col-md-9 value">
    ++      <& /Elements/SelectDate, Name => "Starts_Date", Default => $ARGS{Starts_Date} || '' &>
    ++    </div>
    ++  </div>
    ++
    ++  <div class="form-row">
    ++    <div class="col-md-3 label">
    ++      <&|/l&>Make date Started</&>:
    ++    </div>
    ++    <div class="col-md-9 value">
    ++      <& /Elements/SelectDate, Name => "Started_Date", Default => $ARGS{Started_Date} || '' &>
    ++    </div>
    ++  </div>
    ++
    ++  <div class="form-row">
    ++    <div class="col-md-3 label">
    ++      <&|/l&>Make date Told</&>:
    ++    </div>
    ++    <div class="col-md-9 value">
    ++      <& /Elements/SelectDate, Name => "Told_Date", Default => $ARGS{Told_Date} || '' &>
    ++    </div>
    ++  </div>
    ++
    ++  <div class="form-row">
    ++    <div class="col-md-3 label">
    ++      <&|/l&>Make date Due</&>:
    ++    </div>
    ++    <div class="col-md-9 value">
    ++      <& /Elements/SelectDate, Name => "Due_Date", Default => $ARGS{Due_Date} || '' &>
    ++    </div>
    ++  </div>
      </&>
      <&| /Widgets/TitleBox, title => loc('Add comments or replies to selected tickets') &>
     -<table>
    @@ -626,29 +643,29 @@
     -    <td align="right"><&|/l&>Subject</&>:</td>
     -    <td>
     -        <input type="text" name="UpdateSubject" size="60" value="<% $ARGS{UpdateSubject} || "" %>" />
    -+<div class="form-row">
    -+  <div class="col-md-3 label">
    -+    <&|/l&>Update Type</&>:
    -+  </div>
    -+  <div class="col-md-9 value">
    -+    <select name="UpdateType" id="UpdateType" class="form-control selectpicker">
    -+      <option value="private" <% $ARGS{UpdateType} && $ARGS{UpdateType} eq 'private' ? 'selected="selected"' : '' %> ><&|/l&>Comments (Not sent to requestors)</&></option>
    -+      <option value="response" <% $ARGS{UpdateType} && $ARGS{UpdateType} eq 'response' ? 'selected="selected"' : '' %>><&|/l&>Reply to requestors</&></option>
    -+    </select>
    -+  </div>
    -+</div>
    -+
    -+<div class="form-row">
    -+  <div class="col-md-3 label">
    -+    <&|/l&>Subject</&>:
    -+  </div>
    -+  <div class="col-md-9 value">
    -+      <input type="text" class="form-control" name="UpdateSubject" size="60" value="<% $ARGS{UpdateSubject} || "" %>" />
    ++  <div class="form-row">
    ++    <div class="col-md-3 label">
    ++      <&|/l&>Update Type</&>:
    ++    </div>
    ++    <div class="col-md-9 value">
    ++      <select class="form-control selectpicker" name="UpdateType" id="UpdateType">
    ++          <option value="private" <% $ARGS{UpdateType} && $ARGS{UpdateType} eq 'private' ? 'selected="selected"' : '' %> ><&|/l&>Comments (Not sent to requestors)</&></option>
    ++        <option value="response" <% $ARGS{UpdateType} && $ARGS{UpdateType} eq 'response' ? 'selected="selected"' : '' %>><&|/l&>Reply to requestors</&></option>
    ++      </select> 
    ++    </div>
    ++  </div>
    ++
    ++  <div class="form-row">
    ++    <div class="col-md-3 label">
    ++      <&|/l&>Subject</&>:
    ++    </div>
    ++    <div class="col-md-9 value">
    ++      <input class="form-control" type="text" name="UpdateSubject" size="60" value="<% $ARGS{UpdateSubject} || "" %>" />
    ++    </div>
    ++  </div>
      % $m->callback( %ARGS, CallbackName => 'AfterUpdateSubject' );
     -    </td>
     -</tr>
    -+  </div>
    -+</div>
     +
      % $m->callback( CallbackName => 'BeforeTransactionCustomFields', CustomFields => $TxnCFs );
      % while (my $CF = $TxnCFs->Next()) {
    @@ -659,28 +676,27 @@
     -    Object => RT::Transaction->new( $session{'CurrentUser'} ),
     -    &><em><% $CF->EntryHint // '' %></em></td>
     -</td></tr>
    -+<div class="form-row">
    -+  <div class="col-md-3 label">
    -+    <% $CF->Name %>:
    -+  </div>
    -+  <div class="col-md-9 value">
    -+    <& /Elements/EditCustomField,
    -+      CustomField => $CF,
    -+      Object => RT::Transaction->new( $session{'CurrentUser'} ),
    -+    &>
    -+    <em><% $CF->EntryHint // '' %></em>
    -+  </div>
    -+</div>
    ++  <div class="form-row">
    ++    <div class="col-md-3 label">
    ++      <% $CF->Name %>:
    ++    </div>
    ++    <div class="col-md-9 value">
    ++      <& /Elements/EditCustomField,
    ++        CustomField => $CF,
    ++        Object => RT::Transaction->new( $session{'CurrentUser'} ),
    ++      &><em><% $CF->EntryHint // '' %></em>
    ++    </div>
    ++  </div>
      % } # end if while
      
     - <tr><td class="labeltop"><&|/l&>Message</&>:</td>
     - <td class="messagebox-container action-<% $ARGS{UpdateType} || 'private' %>">
    -+<div class="form-row">
    -+  <div class="col-md-3 label labeltop">
    -+    <&|/l&>Message</&>:
    -+  </div>
    -+  <div class="col-md-9 value messagebox-container action-<% $ARGS{UpdateType} || 'private' %>">
    - % $m->callback( %ARGS, CallbackName => 'BeforeMessageBox' );
    +-% $m->callback( %ARGS, CallbackName => 'BeforeMessageBox' );
    ++  <div class="form-row">
    ++    <div class="col-md-3 label">
    ++      <&|/l&>Message</&>:
    ++    </div>
    ++    <div class="col-md-9 value messagebox-container action-<% $ARGS{UpdateType} || 'private' %>">
      %# Currently, bulk update always starts with Comment not Reply selected, so we check this unconditionally
      % my $IncludeSignature = RT->Config->Get('MessageBoxIncludeSignatureOnComment');
     -<& /Elements/MessageBox, Name => "UpdateContent", 
    @@ -690,21 +706,30 @@
     - </td></tr>
     -
     -<& /Ticket/Elements/AddAttachments, %ARGS &>
    -+    <& /Elements/MessageBox, Name => "UpdateContent", 
    -+        $ARGS{UpdateContent} ? ( Default => $ARGS{UpdateContent}, IncludeSignature => 0 ) :
    -+                            ( IncludeSignature => $IncludeSignature ),
    -+    &>
    -+  </div>
    -+</div>
    ++      <& /Elements/MessageBox, Name => "UpdateContent", 
    ++          $ARGS{UpdateContent} ? ( Default => $ARGS{UpdateContent}, IncludeSignature => 0 ) :
    ++            ( IncludeSignature => $IncludeSignature ),
    ++      &>
    ++    </div>
    ++  </div>
    ++% $m->callback( %ARGS, CallbackName => 'BeforeMessageBox' );
      
     - </table>
    -+<div class="form-row">
    -+  <div class="col-md-3 label"></div>
    -+  <div class="col-md-9 value">
    -+    <& /Ticket/Elements/AddAttachments, %ARGS &>
    -+  </div>
    -+</div>
    - 
    ++  <div class="form-row">
    ++    <div class="col-md-3 label"></div>
    ++    <div class="col-md-9">
    ++      <& /Ticket/Elements/AddAttachments, %ARGS &>
    ++    </div>
    ++  </div>
    + 
    + </&>
    + 
    +@@
    + % }
    + 
    + <&|/Widgets/TitleBox, title => loc('Edit Links'), color => "#336633"&>
    +-<em><&|/l&>Enter tickets or URIs to link tickets to. Separate multiple entries with spaces.</&></em><br />
    + <& /Elements/BulkLinks, Collection => $Tickets, $ARGS{'AddMoreAttach'} ? %ARGS : () &>
      </&>
      
     @@
    @@ -712,15 +737,14 @@
      </&>
      
     -<& /Elements/Submit, Label => loc('Update') &>
    --
     +<div class="form-row">
     +  <div class="col-md-12">
     +    <& /Elements/Submit, Label => loc('Update') &>
     +  </div>
     +</div>
      
    + 
      </form>
    - 
     
     diff --git a/share/html/Search/Chart.html b/share/html/Search/Chart.html
     --- a/share/html/Search/Chart.html
    @@ -899,105 +923,156 @@
      </div>
      </div>
     
    -diff --git a/share/html/Search/Edit.html b/share/html/Search/Edit.html
    ---- a/share/html/Search/Edit.html
    -+++ b/share/html/Search/Edit.html
    -@@
    - <input type="hidden" class="hidden" name="SavedSearchId" value="<% $SavedSearchId %>" />
    - <input type="hidden" class="hidden" name="SavedChartSearchId" value="<% $SavedChartSearchId %>" />
    - <&|/Widgets/TitleBox, title => loc('Query'), &>
    --<textarea name="Query" rows="8" cols="72"><% $Query %></textarea>
    -+<textarea class="form-control" name="Query" rows="8" cols="72"><% $Query %></textarea>
    - </&>
    - <&|/Widgets/TitleBox, title => loc('Format'), &>
    --<textarea name="Format" rows="8" cols="72"><% $Format %></textarea>
    -+<textarea class="form-control" name="Format" rows="8" cols="72"><% $Format %></textarea>
    - </&>
    --<& /Elements/Submit, Label => loc("Apply"), Reset => 1, Caption => loc("Apply your changes")&>
    -+<div class="form-row">
    -+  <div class="col-md-12">
    -+    <& /Elements/Submit, Label => loc("Apply"), Reset => 1, Caption => loc("Apply your changes")&>
    -+  </div>
    -+</div>
    - </form>
    - 
    - <%INIT>
    +diff --git a/share/html/Search/Elements/> b/share/html/Search/Elements/>
    +new file mode 100644
    +--- /dev/null
    ++++ b/share/html/Search/Elements/>
    +@@
    ++%# BEGIN BPS TAGGED BLOCK {{{
    ++%#
    ++%# COPYRIGHT:
    ++%#
    ++%# This software is Copyright (c) 1996-2019 Best Practical Solutions, LLC
    ++%#                                          <sales at bestpractical.com>
    ++%#
    ++%# (Except where explicitly superseded by other copyright notices)
    ++%#
    ++%#
    ++%# LICENSE:
    ++%#
    ++%# This work is made available to you under the terms of Version 2 of
    ++%# the GNU General Public License. A copy of that license should have
    ++%# been provided with this software, but in any event can be snarfed
    ++%# from www.gnu.org.
    ++%#
    ++%# This work is distributed in the hope that it will be useful, but
    ++%# WITHOUT ANY WARRANTY; without even the implied warranty of
    ++%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    ++%# General Public License for more details.
    ++%#
    ++%# You should have received a copy of the GNU General Public License
    ++%# along with this program; if not, write to the Free Software
    ++%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
    ++%# 02110-1301 or visit their web page on the internet at
    ++%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
    ++%#
    ++%#
    ++%# CONTRIBUTION SUBMISSION POLICY:
    ++%#
    ++%# (The following paragraph is not intended to limit the rights granted
    ++%# to you to modify and distribute this software under the terms of
    ++%# the GNU General Public License and is only of importance to you if
    ++%# you choose to contribute your changes and enhancements to the
    ++%# community by submitting them to Best Practical Solutions, LLC.)
    ++%#
    ++%# By intentionally submitting any modifications, corrections or
    ++%# derivatives to this work, or any other work intended for use with
    ++%# Request Tracker, to Best Practical Solutions, LLC, you confirm that
    ++%# you are the copyright holder for those contributions and you grant
    ++%# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
    ++%# royalty-free, perpetual, license to use, copy, create derivative
    ++%# works based on those contributions, and sublicense and distribute
    ++%# those contributions and any derivatives thereof.
    ++%#
    ++%# END BPS TAGGED BLOCK }}}
    ++<%args>
    ++$Query => "id > 0"
    ++ at GroupBy => ()
    ++$ChartStyle => 'bar+table+sql'
    ++ at ChartFunction => 'COUNT'
    ++</%args>
    ++<%init>
    ++use RT::Report::Tickets;
    ++
    ++my $report = RT::Report::Tickets->new( $session{'CurrentUser'} );
    ++
    ++my %columns = $report->SetupGroupings(
    ++    Query => $Query,
    ++    GroupBy => \@GroupBy,
    ++    Function => \@ChartFunction,
    ++);
    ++
    ++$report->SortEntries;
    ++
    ++my $query_string = $m->comp('/Elements/QueryString', %ARGS, GroupBy => \@GroupBy );
    ++</%init>
    ++<div class="chart-wrapper form-row">
    ++<div class="col-md-auto">
    ++% if ( ($ChartStyle || '') =~ /\b(pie|bar)\b/ ) {
    ++<span class="chart image <% $1 %>">
    ++% if (RT->Config->Get('DisableGD')) {
    ++<% loc('Graphical charts are not available.') %><br />
    ++% } else {
    ++% my $key = Digest::MD5::md5_hex( rand(1024) );
    ++% $session{'charts_cache'}{$key} = { columns => \%columns, report => $report->Serialize };
    ++% $session{'i'}++;
    ++<img src="<% RT->Config->Get('WebPath') %>/Search/Chart?Cache=<% $key |un %>&<% $query_string |n %>" />
    ++% }
    ++</span>
    ++% }
    ++</div>
    ++<div class="col-md-auto">
    ++% if ( ($ChartStyle || '') =~ /\btable\b/ ) {
    ++<& ChartTable, %ARGS, Table => { $report->FormatTable( %columns ) } &>
    ++% }
    ++
    ++% $m->callback( CallbackName => 'AfterChartTable', ARGSRef => \%ARGS );
    ++</div>
    ++<div class="form-row"?
    ++% if ( ($ChartStyle || '') =~ /\bsql\b/ ) {
    ++<div class="query"><span class="label"><% loc('Query') %>:</span><span class="value"><% $Query %></span></div>
    ++% }
    ++</div>
    ++</div>
    +
    +diff --git a/share/html/Search/Elements/Chart b/share/html/Search/Elements/Chart
    +--- a/share/html/Search/Elements/Chart
    ++++ b/share/html/Search/Elements/Chart
    +@@
    + 
    + my $query_string = $m->comp('/Elements/QueryString', %ARGS, GroupBy => \@GroupBy );
    + </%init>
    +-<div class="chart-wrapper">
    ++<div class="chart-wrapper form-row">
    ++<div class="col-md-auto">
    + % if ( ($ChartStyle || '') =~ /\b(pie|bar)\b/ ) {
    + <span class="chart image <% $1 %>">
    + % if (RT->Config->Get('DisableGD')) {
    +@@
    + % }
    + </span>
    + % }
    +-
    ++</div>
    ++<div class="col-md-auto">
    + % if ( ($ChartStyle || '') =~ /\btable\b/ ) {
    + <& ChartTable, %ARGS, Table => { $report->FormatTable( %columns ) } &>
    + % }
    + 
    + % $m->callback( CallbackName => 'AfterChartTable', ARGSRef => \%ARGS );
    +-
    ++</div>
    ++</div>
    ++<div class="form-row justify-content-center">
    ++<div class="col-md-auto">
    + % if ( ($ChartStyle || '') =~ /\bsql\b/ ) {
    + <div class="query"><span class="label"><% loc('Query') %>:</span><span class="value"><% $Query %></span></div>
    + % }
    + </div>
    ++</div>
     
     diff --git a/share/html/Search/Elements/ChartTable b/share/html/Search/Elements/ChartTable
     --- a/share/html/Search/Elements/ChartTable
     +++ b/share/html/Search/Elements/ChartTable
     @@
    - 
    -     $m->out("<$section>\n");
    -     foreach my $row ( @{ $Table{ $section } } ) {
    --        $m->out('  <tr');
    --        $m->out(' class="'. ($row->{'even'}? 'evenline' : 'oddline') .'"')
    -+        $m->out('<div');
    -+        $m->out(' class="form-row '. ($row->{'even'}? 'evenline' : 'oddline') .'"')
    -             if defined $row->{'even'};
    -         $m->out(">");
    - 
    -
    -diff --git a/share/html/Search/Elements/PickObjectCFs b/share/html/Search/Elements/PickObjectCFs
    ---- a/share/html/Search/Elements/PickObjectCFs
    -+++ b/share/html/Search/Elements/PickObjectCFs
    -@@
    - $CustomFields->GotoFirstItem;
    - </%init>
    - % if ($has_cf) {
    --<tr class="separator">
    --  <td colspan="3">
    -+<div class="form-row seperator">
    -+  <div class="col-md-3 label">
    -     <hr><em><% loc("[_1] CFs", loc($Class)) %></em>
    --  </td>
    --</tr>
    -+  </div>
    -+</div>
    - % }
    - <& PickCFs, %ARGS, TicketSQLField => "${Class}CF", CustomFields => $CustomFields &>
    -
    -diff --git a/share/html/Search/Elements/SelectAndOr b/share/html/Search/Elements/SelectAndOr
    ---- a/share/html/Search/Elements/SelectAndOr
    -+++ b/share/html/Search/Elements/SelectAndOr
    -@@
    - %# those contributions and any derivatives thereof.
    - %#
    - %# END BPS TAGGED BLOCK }}}
    --<div class="form-check form-check-inline">
    --  <input class="form-check-input" type="radio" name="<% $Name %>" checked="checked" id="<% $Name %>-and" value="AND">
    --  <label class="form-check-label" for="<% $Name %>-and"><&|/l&>AND</&></label>
    -+<div class="form-row">
    -+  <div class="custom-control custom-radio">
    -+    <input class="custom-control-input" type="radio" name="<% $Name %>" checked="checked" id="<% $Name %>-and" value="AND">
    -+    <label class="custom-control-label" for="<% $Name %>-and"><&|/l&>AND</&> </label>
    -+  </div>
    -+  <div class="custom-control custom-radio">
    -+    <input class="custom-control-input" type="radio" name="<% $Name %>" id="<% $Name %>-or" value="AND">
    -+    <label class="custom-control-label" for="<% $Name %>-or"><&|/l&>OR</&></label>
    -+  </div>
    - </div>
    --<div class="form-check form-check-inline">
    --  <input class="form-check-input" type="radio" name="<% $Name %>" id="<% $Name %>-or" value="AND">
    --  <label class="form-check-label" for="<% $Name %>-or"><&|/l&>OR</&></label>
    --</div>
    --
    - <%ARGS>
    - $Name => "Operator"
    - </%ARGS>
    -
    -diff --git a/share/html/Search/Elements/SelectChartFunction b/share/html/Search/Elements/SelectChartFunction
    ---- a/share/html/Search/Elements/SelectChartFunction
    -+++ b/share/html/Search/Elements/SelectChartFunction
    -@@
    - %# those contributions and any derivatives thereof.
    - %#
    - %# END BPS TAGGED BLOCK }}}
    --<select name="<% $Name %>" class="cascade-by-optgroup">
    -+<select name="<% $Name %>" class="cascade-by-optgroup form-control selectpicker">
    - % if ( $ShowEmpty ) {
    - <option value=""> </option>
    - % }
    + my $eh  = sub { $interp->apply_escapes( @_, 'h' ) };
    + my $eu  = sub { $interp->apply_escapes( @_, 'u' ) };
    + 
    +-$m->out('<table class="collection-as-table chart">'. "\n");
    ++$m->out('<table class="table table-bordered collection-as-table chart">'. "\n");
    + foreach my $section (qw(thead tbody tfoot)) {
    +     next unless $Table{ $section } && @{ $Table{ $section } };
    + 
     
     diff --git a/share/html/Search/Elements/SelectChartType b/share/html/Search/Elements/SelectChartType
     --- a/share/html/Search/Elements/SelectChartType
    @@ -1025,51 +1100,41 @@
      <option value="">-</option>
      % }
     
    -diff --git a/share/html/Search/Elements/SelectGroupBy b/share/html/Search/Elements/SelectGroupBy
    ---- a/share/html/Search/Elements/SelectGroupBy
    -+++ b/share/html/Search/Elements/SelectGroupBy
    -@@
    - $Query   => ''
    - $ShowEmpty => 0
    - </%args>
    --<select name="<% $Name %>" class="cascade-by-optgroup">
    -+<select name="<% $Name %>" class="cascade-by-optgroup form-control selectpicker">
    - % if ( $ShowEmpty ) {
    - <option value=""> </option>
    - % }
    -
    -diff --git a/share/html/Search/Results.html b/share/html/Search/Results.html
    ---- a/share/html/Search/Results.html
    -+++ b/share/html/Search/Results.html
    -@@
    - <input type="hidden" class="hidden" name="<%$key%>" value="<% defined($hiddens{$key})?$hiddens{$key}:'' %>" />
    - % }
    - <& /Elements/Refresh, Name => 'TicketsRefreshInterval', Default => $session{'tickets_refresh_interval'}||RT->Config->Get('SearchResultsRefreshInterval', $session{'CurrentUser'}) &>
    --<input type="submit" class="button" value="<&|/l&>Change</&>" />
    -+<div class="form-row">
    -+  <div class="col-md-12">
    -+    <input type="submit" class="button btn btn-primary" value="<&|/l&>Change</&>" />
    -+  </div>
    -+</div>
    - </form>
    - </div>
    - 
    -
     diff --git a/share/html/Search/Simple.html b/share/html/Search/Simple.html
     --- a/share/html/Search/Simple.html
     +++ b/share/html/Search/Simple.html
     @@
    + <div id="SimpleSearchForm">
      <form action="Simple.html" method="get">
      
    - <div align="center">
    +-<div align="center">
     -<input type="text" name="q" />
     -<input type="submit" class="button" value="<&|/l&>Search</&>" />
    -+  <div class="form-row">
    -+    <input type="text" class="form-control" name="q" />
    -+  </div>
    -+  <div class="form-row justify-content-center">
    ++<div class="form-row justify-content-center">
    ++  <div class="col-md-4">
    ++    <input class="form-control" type="text" name="q" />
    ++  </div>
    ++  <div class="col-md-auto">
     +    <input type="submit" class="button btn btn-primary" value="<&|/l&>Search</&>" />
     +  </div>
      </div>
      
      % my @strong = qw(<strong> </strong>);
    +
    +diff --git a/share/html/Ticket/Elements/AddAttachments b/share/html/Ticket/Elements/AddAttachments
    +--- a/share/html/Ticket/Elements/AddAttachments
    ++++ b/share/html/Ticket/Elements/AddAttachments
    +@@
    + });
    + </script>
    +         <div class="hidden old-attach">
    +-            <input name="Attach" type="file" /><input type="submit" class="button" name="AddMoreAttach" value="<&|/l&>Add More Files</&>" />
    +-            <input type="hidden" class="hidden" name="UpdateAttach" value="1" />
    ++            <div class="custom-file">
    ++                <input type="file" id="Attach" name="Attach" class="custom-file-input" />
    ++                <label class="custom-file-label" for="Attach"><&|/l&>Add More Files</&></label>
    ++                <input type="hidden" class="hidden" name="UpdateAttach" value="1" />
    ++            </div>
    +         </div>
    +     </span>
    + </div>



More information about the rt-commit mailing list