[Rt-commit] rt branch 5.0/update-labeled-value-layout created. rt-5.0.3-152-g619dfc03fb

BPS Git Server git at git.bestpractical.com
Tue Nov 1 19:26:33 UTC 2022


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

The branch, 5.0/update-labeled-value-layout has been created
        at  619dfc03fb7cb39bae408039637ea20eef8b0ebe (commit)

- Log -----------------------------------------------------------------
commit 619dfc03fb7cb39bae408039637ea20eef8b0ebe
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Fri Oct 7 10:30:34 2022 +0800

    Use a loose regex to get around space changes caused by LabeledValue refactor

diff --git a/t/web/cf_textarea.t b/t/web/cf_textarea.t
index a15aa5edc1..77297b037d 100644
--- a/t/web/cf_textarea.t
+++ b/t/web/cf_textarea.t
@@ -123,9 +123,9 @@ $m->follow_link_ok( { text => 'Display' } );
 $content =~ s!\n+!!g;
 $m->text_like(
     qr/TheTextarea\sadded.+\Q$content\E.+
-       TheTextarea\schanged.+From:\Q$content\ETo:\Q$new_content\E.+
-       TheTextarea\schanged.+From:\Q$new_content\ETo:\Q$newer_content\E.+
-       TheTextarea\sdeleted.+\Q$newer_content\E/xs,
+       TheTextarea\schanged.+From:\s*\Q$content\E\s*To:\s*\Q$new_content\E.+
+       TheTextarea\schanged.+From:\s*\Q$new_content\E\s*To:\s*\Q$newer_content\E.+
+       TheTextarea\sdeleted.+\s*\Q$newer_content\E/xs,
     'textarea change details'
 );
 

commit e4cfb042cd9f7d2555fbf3c502dc7d71b17969d6
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Fri Oct 7 06:21:36 2022 +0800

    Port more elements to LabeledValue

diff --git a/share/html/Admin/CustomFields/Modify.html b/share/html/Admin/CustomFields/Modify.html
index daef955a53..2240bb8ce8 100644
--- a/share/html/Admin/CustomFields/Modify.html
+++ b/share/html/Admin/CustomFields/Modify.html
@@ -180,42 +180,26 @@ jQuery( function() {
 
 <&| /Widgets/TitleBox, title => 'Integration', class => 'custom-field-info-integration', content_class => 'mx-auto width-lg' &>
 
-<div class="form-row">
-  <div class="label col-2">
-    <&|/l&>Link values to</&>
-  </div>
-  <div class="col-8">
+  <&| /Elements/LabeledValue, Label => loc('Link values to'), LabelCols => 2, ValueCols => 8 &>
     <input class="form-control" type="text" size="60" name="LinkValueTo"  value="<% $CustomFieldObj->LinkValueTo || $LinkValueTo || '' %>" />
-  </div>
-</div>
+  </&>
 
-<div class="form-row">
-  <div class="col-2"></div>
-  <div class="col-8">
+  <&| /Elements/LabeledValue, Label => '', LabelCols => 2, ValueCols => 8 &>
     <&|/l&>RT can make this custom field's values into hyperlinks to another service.</&>
     <&|/l&>Fill in this field with a URL.</&>
     <&|/l_unsafe, '<tt>__id__</tt>', '<tt>__CustomField__</tt>' &>RT will replace [_1] and [_2] with the record's id and the custom field's value, respectively.</&>
-  </div>
-</div>
+  </&>
 
-<div class="form-row">
-  <div class="label col-2">
-    <&|/l&>Include page</&>
-  </div>
-  <div class="value col-8">
+  <&| /Elements/LabeledValue, Label => loc('Include page'), LabelCols => 2, ValueCols => 8 &>
     <input class="form-control" type="text" size="60" name="IncludeContentForValue" value="<% $CustomFieldObj->IncludeContentForValue || $IncludeContentForValue || '' %>" />
-  </div>
-</div>
+  </&>
 
-<div class="form-row">
-  <div class="col-2"></div>
-  <div class="col-8">
+  <&| /Elements/LabeledValue, Label => '', LabelCols => 2, ValueCols => 8 &>
     <&|/l&>RT can include content from another web service when showing this custom field.</&>
     <&|/l&>Fill in this field with a URL.</&>
     <&|/l_unsafe, '<tt>__id__</tt>', '<tt>__CustomField__</tt>' &>RT will replace [_1] and [_2] with the record's id and the custom field's value, respectively.</&>
     <i><&|/l&>Some browsers may only load content from the same domain as your RT server.</&></i>
-  </div>
-</div>
+  </&>
 </&>
 
 % if ( $CustomFieldObj->Id && $CustomFieldObj->IsSelectionType && !$CustomFieldObj->IsExternalValues ) {
diff --git a/share/html/Admin/CustomFields/index.html b/share/html/Admin/CustomFields/index.html
index 589d611666..8e53bb507d 100644
--- a/share/html/Admin/CustomFields/index.html
+++ b/share/html/Admin/CustomFields/index.html
@@ -53,19 +53,14 @@
 
 <form action="<%RT->Config->Get('WebPath')%>/Admin/CustomFields/index.html" method="get">
 
-  <div class="form-row">
-    <div class="label col-auto">
-      <&|/l&>Only show custom fields for:</&>
-    </div>
-    <div class="value col-auto">
+  <&| /Elements/LabeledValue, Label => loc('Only show custom fields for'), LabelCols => 'auto', ValueCols => 'auto' &>
       <select name="Type" class="form-control selectpicker">
         <option value="" <% !$Type && 'selected="selected"'%> ><% loc('(any)') %></option>
 % for my $type ( $tmp->LookupTypes ) {
         <option value="<% $type %>" <% $type eq $Type && 'selected="selected"'%> ><% $tmp->FriendlyLookupType( $type ) %></option>
 % }
       </select>
-    </div>
-  </div>
+  </&>
 
   <div class="form-row">
     <div class="col-12">
diff --git a/share/html/Admin/CustomRoles/Visibility.html b/share/html/Admin/CustomRoles/Visibility.html
index 17e58515e9..85d85fdb0b 100644
--- a/share/html/Admin/CustomRoles/Visibility.html
+++ b/share/html/Admin/CustomRoles/Visibility.html
@@ -55,11 +55,7 @@
 <&| /Widgets/TitleBox, class => 'custom-role-info-visibility', content_class => 'mx-auto width-sm' &>
 % for (@pages) {
 %     my ($label, $url) = @$_;
-  <div class="form-row boolean">
-    <div class="label col-4">
-      <% $label %>:
-    </div>
-    <div class="value col-8">
+  <&| /Elements/LabeledValue, Class => 'boolean', Label => $label, LabelCols => 4, ValueCols => 8 &>
       <div class="form-row">
         <div class="col-auto">
           <div class="custom-control custom-radio">
@@ -74,8 +70,7 @@
           </div>
         </div>
       </div>
-    </div>
-  </div>
+  </&>
 % }
 </&>
 
diff --git a/share/html/Admin/Elements/ModifyTemplate b/share/html/Admin/Elements/ModifyTemplate
index a9ffd1199d..8515777b6a 100644
--- a/share/html/Admin/Elements/ModifyTemplate
+++ b/share/html/Admin/Elements/ModifyTemplate
@@ -46,29 +46,15 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <&| /Widgets/TitleBox, class => 'template-info-basics', content_class => 'mx-auto width-lg' &>
-<div class="form-row">
-  <div class="label col-2">
-    <&|/l&>Name</&>:
-  </div>
-  <div class="value col-6">
+  <&| /Elements/LabeledValue, Label => loc('Name'), LabelCols => 2, ValueCols => 6 &>
     <input type="text" class="form-control" name="Name" value="<%$Name||''%>" size="80" />
-  </div>
-</div>
+  </&>
 
-<div class="form-row">
-  <div class="label col-2">
-    <&|/l&>Description</&>:
-  </div>
-  <div class="value col-6">
+  <&| /Elements/LabeledValue, Label => loc('Description'), LabelCols => 2, ValueCols => 6 &>
     <input type="text" class="form-control" name="Description" value="<%$Description||''%>" size="80" />
-  </div>
-</div>
+  </&>
 
-<div class="form-row">
-  <div class="label col-2">
-    <&|/l&>Type</&>:
-  </div>
-  <div class="value col-6">
+  <&| /Elements/LabeledValue, Label => loc('Type'), LabelCols => 2, ValueCols => 6 &>
     <div class="custom-control custom-radio">
       <input type="radio" name="Type" class="custom-control-input" id="Type-Perl" value="Perl" <% $Type eq "Perl" ? 'checked="checked"' : "" |n %>></input>
       <label class="custom-control-label" for="Type-Perl"><&|/l&>Perl</&></label><br />
@@ -77,18 +63,12 @@
       <input type="radio" name="Type" class="custom-control-input" id="Type-Simple" value="Simple" <% $Type eq "Simple" ? 'checked="checked"' : "" |n %>>
       <label class="custom-control-label" for="Type-Simple"><&|/l&>Simple</&></label><br />
     </div>
-  </div>
-</div>
+  </&>
 
-<div class="form-row">
-  <div class="label col-2">
-    <&|/l&>Content</&>:
-  </div>
-  <div class="value col-8">
+  <&| /Elements/LabeledValue, Label => loc('Content'), LabelCols => 2, ValueCols => 8 &>
     <textarea name="Content" class="form-control" rows="25" cols="80" wrap="soft">
 <%$Content||''%></textarea>
-  </div>
-</div>
+  </&>
 </&>
 
 <%INIT>
diff --git a/share/html/Admin/Groups/index.html b/share/html/Admin/Groups/index.html
index 2d1ea985a6..eeb98c4300 100644
--- a/share/html/Admin/Groups/index.html
+++ b/share/html/Admin/Groups/index.html
@@ -54,12 +54,7 @@
   <input type="hidden" name="GroupOp" value="LIKE" />
   <div class="row">
     <div class="col-xl-6">
-
-      <div class="form-row">
-        <div class="label col-3 text-left">
-          <&|/l&>Go to group</&>
-        </div>
-        <div class="value col-3">
+      <&| /Elements/LabeledValue, Label => loc('Go to group'), LabelClass => 'label text-left', ValueCols => 3 &>
           <input type="text" class="form-control" name="GroupString" value="" data-autocomplete="Groups" id="autocomplete-GroupString" />
           <script type="text/javascript">
     jQuery(function(){
@@ -69,8 +64,7 @@
         });
     });
           </script>
-        </div>
-      </div>
+      </&>
     </div>
   </div>
 </form>
diff --git a/share/html/Admin/Queues/People.html b/share/html/Admin/Queues/People.html
index fb9a2a77fd..c112c4f20b 100644
--- a/share/html/Admin/Queues/People.html
+++ b/share/html/Admin/Queues/People.html
@@ -99,20 +99,17 @@
       <em><%$user_msg%></em>
 % } elsif ($Users) {
 % while (my $u = $Users->Next ) {
-      <div class="form-row">
-        <div class="col-3">
-          <& /Elements/SelectWatcherType,
-              Scope => 'queue',
-              Name  => "Queue-AddWatcher-Principal-". $u->PrincipalId,
-              Queue => $QueueObj,
-          &>
-        </div>
-        <div class="col-3">
-          <span class="form-control current-value">
+      <&| /Elements/LabeledValue,
+        RawLabel => $m->scomp( "/Elements/SelectWatcherType",
+            Scope => 'queue',
+            Name  => "Queue-AddWatcher-Principal-" . $u->PrincipalId,
+            Queue => $QueueObj, ),
+        LabelCols      => 3,
+        ValueCols      => 3,
+        ValueSpanClass => 'current-value',
+      &>
             <& /Elements/ShowUser, User => $u &>
-          </span>
-        </div>
-      </div>
+      </&>
 % }
 % }
 
@@ -123,20 +120,17 @@
       <em><%$group_msg%></em>
 % } elsif ($Groups) {
 % while (my $g = $Groups->Next ) {
-      <div class="form-row">
-        <div class="col-3">
-          <& /Elements/SelectWatcherType,
-              Scope => 'queue',
-              Name  => "Queue-AddWatcher-Principal-".$g->PrincipalId,
-              Queue => $QueueObj,
-          &>
-        </div>
-        <div class="col-3">
-          <span class="form-control current-value">
+      <&| /Elements/LabeledValue,
+        RawLabel => $m->scomp( "/Elements/SelectWatcherType",
+            Scope => 'queue',
+            Name  => "Queue-AddWatcher-Principal-" . $g->PrincipalId,
+            Queue => $QueueObj, ),
+        LabelCols      => 3,
+        ValueCols      => 3,
+        ValueSpanClass => 'current-value',
+      &>
             <%$g->Name%> (<%$g->Description%>)
-          </span>
-        </div>
-      </div>
+      </&>
 % }
 % }
     </div>
diff --git a/share/html/Admin/Tools/Shredder/Elements/SelectPlugin b/share/html/Admin/Tools/Shredder/Elements/SelectPlugin
index 1957b83902..b2065692e9 100644
--- a/share/html/Admin/Tools/Shredder/Elements/SelectPlugin
+++ b/share/html/Admin/Tools/Shredder/Elements/SelectPlugin
@@ -49,17 +49,14 @@
 $Plugin => ''
 </%ARGS>
 <& PluginHelp, %ARGS, Plugin => 'Base' &>
-<div class="shredder-form form-row">
-  <div class="label col-auto"><&|/l&>Select plugin</&>: </div>
-  <div class="col-auto">
+<&| /Elements/LabeledValue, Class => 'shredder-form', Label => loc('Select plugin'), LabelCols => 'auto', ValueCols => 'auto' &>
     <select name="Plugin" class="form-control selectpicker" onchange="showShredderPluginTab(this.value);">
       <option value=""><% loc('(no value)') %></option>
 % foreach my $p( keys %plugins ) {
       <option value="<% $p %>" <% ($p eq $Plugin)? 'selected="selected"': '' %>><% loc($p) %></option>
 % }
     </select>
-  </div>
-</div>
+</&>
 <div id="shredder-plugin-tabs">
 % foreach my $p( keys %plugins ) {
 <div id="shredder-plugin-<% $p %>-tab" class="<% ($p ne $Plugin)? 'hidden': '' %>">
diff --git a/share/html/Admin/Users/index.html b/share/html/Admin/Users/index.html
index bb76a12efe..c8d8d1b210 100644
--- a/share/html/Admin/Users/index.html
+++ b/share/html/Admin/Users/index.html
@@ -57,14 +57,9 @@
   <input type="hidden" name="UserField" value="Name" />
   <input type="hidden" name="UserOp" value="LIKE" />
 
-  <div class="form-row">
-    <div class="label col-4 text-left">
-      <&|/l&>Go to user</&>
-    </div>
-    <div class="col-8">
+  <&| /Elements/LabeledValue, Label => loc('Go to user'), LabelClass => 'label text-left', LabelCols => 4, ValueCols => 8 &>
       <input type="text" class="form-control" name="UserString" value="" data-autocomplete="Users" data-autocomplete-return="Name" id="autocomplete-UserString" />
-    </div>
-  </div>
+  </&>
 <script type="text/javascript">
 jQuery(function(){
     // Jump directly to the page if a user is chosen
@@ -83,11 +78,7 @@ jQuery(function(){
 <input type="hidden" name="<% $field %>" value="<% $ARGS{ $field } %>" />
 % }
 
-  <div class="form-row">
-    <div class="label col-3 text-left">
-      <&|/l&>Include</&>
-    </div>
-    <div class="col-3">
+  <&| /Elements/LabeledValue, Label => loc('Include'), LabelClass => 'label text-left', LabelCols => 3, ValueCols => 3 &>
       <select name="IncludeSystemGroups" class="selectpicker form-control">
 % my $group_selected;
 % for my $group_value ( qw(Privileged Unprivileged All) ) {
@@ -98,8 +89,7 @@ jQuery(function(){
           <option value="<% $group_value %>" <% $group_selected |n %>><% loc($group_value) %></option>
 % }
       </select>
-    </div>
-  </div>
+  </&>
   <div class="form-row">
     <div class="label col-3 text-left">
       <&|/l&>Find all users whose</&>
diff --git a/share/html/Articles/Elements/BeforeMessageBox b/share/html/Articles/Elements/BeforeMessageBox
index 9d5c3663bc..2e93704a17 100644
--- a/share/html/Articles/Elements/BeforeMessageBox
+++ b/share/html/Articles/Elements/BeforeMessageBox
@@ -51,10 +51,9 @@
 
 <div class="articles-select-article">
 % unless (RT->Config->Get('HideArticleSearchOnReplyCreate')) {
-  <div class="form-row">
-    <div class="form-group label col-2"><&|/l&>Include Article:</&></div>
-    <div class="value col-9"><& /Elements/SelectArticle, QueueObj => $QueueObj, AutoSubmit => 1 &></div>
-  </div>
+  <&| /Elements/LabeledValue, Label => loc('Include Article'), LabelClass => 'form-group label', LabelCols => 2, ValueCols => 9 &>
+    <& /Elements/SelectArticle, QueueObj => $QueueObj, AutoSubmit => 1 &>
+  </&>
 % }
 % if ( @$topics ) {
   <div class="form-row">
diff --git a/share/html/Asset/Elements/ShowPeople b/share/html/Asset/Elements/ShowPeople
index fb505decae..d692c9a6f1 100644
--- a/share/html/Asset/Elements/ShowPeople
+++ b/share/html/Asset/Elements/ShowPeople
@@ -52,11 +52,7 @@ $AssetObj
 my $CatalogObj = $AssetObj->CatalogObj;
 </%init>
 % for my $role ($AssetObj->Roles) {
-  <div class="form-row">
-    <div class="label col-3">
-      <% $AssetObj->LabelForRole($role) %>:
-    </div>
-    <div class="value col-9">
+<&| /Elements/LabeledValue, Label => $AssetObj->LabelForRole($role), &>
       <div class="user-accordion accordion">
 % if ($AssetObj->Role($role)->{Single}) {
 %      my $users = $AssetObj->RoleGroup($role)->UserMembersObj(Recursively => 0);
@@ -72,8 +68,7 @@ my $CatalogObj = $AssetObj->CatalogObj;
         <& ShowRoleMembers, Group => $CatalogObj->RoleGroup($role), Role => $role, Skip => $AssetObj->RoleGroup($role), Note => loc("(via this asset's catalog)") &>
 % }
       </div>
-    </div>
-  </div>
+</&>
 % }
 
 <& /Elements/ShowCustomFields, Object => $AssetObj, Grouping => 'People', Table => 0 &>
diff --git a/share/html/Elements/AuthToken/Create b/share/html/Elements/AuthToken/Create
index c6bdc29f39..7c3a03a659 100644
--- a/share/html/Elements/AuthToken/Create
+++ b/share/html/Elements/AuthToken/Create
@@ -58,24 +58,13 @@
         <form method="POST">
           <input type="hidden" name="Owner" value="<% $Owner %>">
 %         if ( $require_password ){
-          <div class="form-row">
-            <div class="label col-4">
-              <&|/l, $session{'CurrentUser'}->Name()&>[_1]'s current password</&>:
-            </div>
-            <div class="value col-8">
-              <input class="form-control" type="password" name="Password" size="16" autocomplete="off" /></td>
-            </div>
-          </div>
+          <&| /Elements/LabeledValue, Label => loc("[_1]'s current password",  $session{'CurrentUser'}->Name), LabelCols => 4, ValueCols => 8 &>
+              <input class="form-control" type="password" name="Password" size="16" autocomplete="off" />
+          </&>
 %         }
-          <div class="form-row">
-            <div class="label col-4">
-              <span class="prev-icon-helper"><&|/l&>Description</&>:</span>\
-<span class="far fa-question-circle icon-helper" data-toggle="tooltip" data-placement="top" data-original-title="<% loc("What's this token for?") %>"></span>
-            </div>
-            <div class="value col-8">
+          <&| /Elements/LabeledValue, Label => loc('Description'), LabelTooltip => loc("What's this token for?"), LabelCols => 4, ValueCols => 8 &>
               <input class="form-control" type="text" name="Description" value="<% $Description %>" size="16" />
-            </div>
-          </div>
+          </&>
 
           <div class="form-row">
             <div class="col-12">
diff --git a/share/html/Elements/LabeledValue b/share/html/Elements/LabeledValue
index 3603a76742..d191771fe8 100644
--- a/share/html/Elements/LabeledValue
+++ b/share/html/Elements/LabeledValue
@@ -58,6 +58,7 @@ $LabelClass => 'label'
 $ValueClass => 'value'
 $LabelCols  => 3
 $ValueCols  => 9
+$ValueId    => undef
 </%args>
 <%init>
 if ( !defined($Value) && !defined($RawValue) && $m->content) {
@@ -84,7 +85,8 @@ if ( !defined($Value) && !defined($RawValue) && $m->content) {
         $m->out('<span class="far fa-question-circle icon-helper" data-toggle="tooltip" data-placement="top" data-original-title="'. $m->interp->apply_escapes($LabelTooltip, "h").'"></span>');
     }
     $m->out('</div>');
-    $m->out(qq{<div class="$ValueClass col-$ValueCols">});
+    my $id_attr = $ValueId ? qq{ id="$ValueId"} : '';
+    $m->out(qq{<div class="$ValueClass col-$ValueCols"$id_attr>});
      if ($ValueSpanClass) {
         $m->out('<span class="'.$m->interp->apply_escapes($ValueSpanClass,"h").'">');
     }
diff --git a/share/html/Elements/ShowTransaction b/share/html/Elements/ShowTransaction
index 67ccc5882a..c41ecb56da 100644
--- a/share/html/Elements/ShowTransaction
+++ b/share/html/Elements/ShowTransaction
@@ -97,30 +97,25 @@ $m->comp(
 %        $new =~ s|\n|<br />|g;
 <div class="details hidden" id="txn-<% $Transaction->Id %>-details">
 % if ( $old eq loc('(no value)')  ) {
-  <div class="form-row">
-    <div class="label col-2"><% loc('Added') %>:</div>
-    <div class="value col-10"><% $new |n %></div>
-  </div>
+  <&| /Elements/LabeledValue, Label => loc('Added'), LabelCols => 2, ValueCols => 10 &>
+    <% $new |n %>
+  </&>
 % }
 % elsif ( $new eq loc('(no value)')  ) {
-  <div class="form-row">
-    <div class="label col-2"><% loc('Deleted') %>:</div>
-    <div class="value col-10"><% $old |n %></div>
-  </div>
+  <&| /Elements/LabeledValue, Label => loc('Deleted'), LabelCols => 2, ValueCols => 10 &>
+    <% $old |n %>
+  </&>
 % }
 % else {
-  <div class="form-row">
-    <div class="label col-2"><% loc('From') %>:</div>
-    <div class="value col-10"><% $old |n %></div>
-  </div>
-  <div class="form-row">
-    <div class="label col-2"><% loc('To') %>:</div>
-    <div class="value col-10"><% $new |n %></div>
-  </div>
-  <div class="form-row diff">
-    <div class="label col-2"><% loc('Changes') %>:</div>
-    <div class="value col-10"><% loc('Loading...') %></div>
-  </div>
+  <&| /Elements/LabeledValue, Label => loc('From'), LabelCols => 2, ValueCols => 10 &>
+    <% $old |n %>
+  </&>
+  <&| /Elements/LabeledValue, Label => loc('To'), LabelCols => 2, ValueCols => 10 &>
+    <% $new |n %>
+  </&>
+  <&| /Elements/LabeledValue, Class => 'diff', Label => loc('Changes'), LabelCols => 2, ValueCols => 10 &>
+    <% loc('Loading...') %>
+  </&>
 % }
 </div>
 %     }
diff --git a/share/html/Search/Elements/EditSearches b/share/html/Search/Elements/EditSearches
index 6871e702bb..4228f06f99 100644
--- a/share/html/Search/Elements/EditSearches
+++ b/share/html/Search/Elements/EditSearches
@@ -50,18 +50,14 @@
 %# Hide all the save functionality if the user shouldn't see it.
 % if ( $can_modify ) {
 
-<div class="form-row">
-  <div class="label col-4"><&|/l&>Privacy</&>:</div>
-  <div class="col-8">
+  <&| /Elements/LabeledValue, Label => loc('Privacy'), LabelCols => 4, ValueCols => 8 &>
 <& SelectSearchObject, Name => 'SavedSearchOwner', Objects => \@CreateObjects, Object => ( $Object && $Object->id ) ? $Object->Object : '' &>
-  </div>
-</div>
-  <div class="form-row">
-    <div class="label col-4"><&|/l&>Description</&>:</div>
-    <div class="col-8">
+  </&>
+
+  <&| /Elements/LabeledValue, Label => loc('Description'), LabelCols => 4, ValueCols => 8 &>
       <input type="text" size="25" name="SavedSearchDescription" value="<% $Description || '' %>" class="form-control" />
-    </div>
-  </div>
+  </&>
+
   <div class="form-row justify-content-end">
     <div class="col-auto">
 % if ($Id ne 'new') {
@@ -90,24 +86,16 @@
 % }
 
 % if ( $Object && $Object->Id && $Object->DependedOnBy->Count ) {
-  <div class="form-row">
-    <div class="label col-4"><&|/l&>Depended on by</&>:</div>
-    <div class="col-8">
-      <span class="form-control current-value">
-        <a href="#" data-toggle="modal" data-target="#saved-search-depended-on-by-list-modal"><% loc('View') %></a>
-      </span>
-    </div>
-  </div>
+  <&| /Elements/LabeledValue, Label => loc('Depended on by'), LabelCols => 4, ValueCols => 8, ValueSpanClass => 'current-value' &>
+    <a href="#" data-toggle="modal" data-target="#saved-search-depended-on-by-list-modal"><% loc('View') %></a>
+  </&>
 % }
 
   <hr />
-  <div class="form-row">
-    <div class="label col-4"><&|/l&>Load saved search</&>:</div>
-    <div class="col-8 input-group">
+  <&| /Elements/LabeledValue, Label => loc('Load saved search'), LabelCols => 4, ValueClass => 'input-group', ValueCols => 8, &>
 <& SelectSearchesForObjects, Name => 'SavedSearchLoad', Objects => \@LoadObjects, SearchType => $Type &>
 <input type="submit" class="button btn btn-primary" value="<% loc('Load') %>" id="SavedSearchLoadSubmit" name="SavedSearchLoadSubmit" />
-    </div>
-  </div>
+  </&>
 
 </&>
 </div>
diff --git a/share/html/Search/Elements/PickCriteria b/share/html/Search/Elements/PickCriteria
index 6f23bbaf2e..dc1fd6d54c 100644
--- a/share/html/Search/Elements/PickCriteria
+++ b/share/html/Search/Elements/PickCriteria
@@ -68,10 +68,9 @@
 %   $m->callback( %ARGS, CallbackName => "AfterCFs" );
 % }
 
-<div class="form-row">
-  <div class="label col-3"><&|/l&>Aggregator</&></div>
-  <div class="col-9 operator"><& SelectAndOr, Name => "AndOr" &></div>
-</div>
+<&| /Elements/LabeledValue, Label => loc('Aggregator'), ValueClass => 'value operator' &>
+  <& SelectAndOr, Name => "AndOr" &>
+</&>
 
 </&>
 
diff --git a/share/html/SelfService/Create.html b/share/html/SelfService/Create.html
index 63cff26179..83929bd739 100644
--- a/share/html/SelfService/Create.html
+++ b/share/html/SelfService/Create.html
@@ -58,39 +58,25 @@
 
 <&|/Widgets/TitleBox, title => $title, class => 'ticket-info-basics' &>
 <div>
-<div class="queue form-row">
-<div class="label col-2">
-<&|/l&>Queue</&>:
-</div>
-<div class="value col-8">
-    <span class="current-value form-control"><strong><%$queue_obj->Name || ''%></strong> <% $queue_obj->Description ? '('.$queue_obj->Description.')' : '' %></span>
-</div>
-</div>
+
+<&| /Elements/LabeledValue, Label => loc('Queue'), Class => 'queue', LabelCols => 2, ValueCols => 8 &>
+  <span class="current-value form-control"><strong><%$queue_obj->Name || ''%></strong> <% $queue_obj->Description ? '('.$queue_obj->Description.')' : '' %></span>
+</&>
+
 <% $m->callback( CallbackName => 'AfterQueue', %ARGS, QueueObj => $queue_obj ) %>
-<div class="form-row">
-<div class="form-group label col-2">
-<&|/l&>Requestors</&>:
-</div>
-<div class="value col-8">
-<& /Elements/EmailInput, Name => 'Requestors', Size => '20', Default => $ARGS{Requestors} || $session{CurrentUser}->EmailAddress, AutocompleteMultiple => RT->Config->Get('AllowUserAutocompleteForUnprivileged') ? 1 : 0, AutocompleteType => 'Principals' &>
-</div>
-</div>
-<div class="form-row">
-<div class="form-group label col-2">
-<&|/l&>Cc</&>:
-</div>
-<div class="value col-8">
-<& /Elements/EmailInput, Name => 'Cc', Size => '20', Default => $ARGS{Cc} || '', AutocompleteMultiple => RT->Config->Get('AllowUserAutocompleteForUnprivileged') ? 1 : 0, AutocompleteType => 'Principals' &>
-</div>
-</div>
-<div class="form-row">
-<div class="form-group label col-2">
-<&|/l&>Subject</&>:
-</div>
-<div class="form-group value col-8">
-<input class="form-control" type="text" name="Subject" size="60" maxsize="200" value="<%$ARGS{Subject} || ''%>" />
-</div>
-</div>
+
+<&| /Elements/LabeledValue, Label => loc('Requestors'), LabelClass => 'form-group label', LabelCols => 2, ValueCols => 8 &>
+  <& /Elements/EmailInput, Name => 'Requestors', Size => '20', Default => $ARGS{Requestors} || $session{CurrentUser}->EmailAddress, AutocompleteMultiple => RT->Config->Get('AllowUserAutocompleteForUnprivileged') ? 1 : 0, AutocompleteType => 'Principals' &>
+</&>
+
+<&| /Elements/LabeledValue, Label => loc('Cc'), LabelClass => 'form-group label', LabelCols => 2, ValueCols => 8 &>
+  <& /Elements/EmailInput, Name => 'Cc', Size => '20', Default => $ARGS{Cc} || '', AutocompleteMultiple => RT->Config->Get('AllowUserAutocompleteForUnprivileged') ? 1 : 0, AutocompleteType => 'Principals' &>
+</&>
+
+<&| /Elements/LabeledValue, Label => loc('Subject'), LabelClass => 'form-group label', ValueClass => 'form-group value', LabelCols => 2, ValueCols => 8 &>
+  <input class="form-control" type="text" name="Subject" size="60" maxsize="200" value="<%$ARGS{Subject} || ''%>" />
+</&>
+
 <div class="form-group">
 <& /Elements/EditCustomFields,
     %ARGS,
diff --git a/share/html/SelfService/Update.html b/share/html/SelfService/Update.html
index 0bbb46b4a9..8be16070a9 100644
--- a/share/html/SelfService/Update.html
+++ b/share/html/SelfService/Update.html
@@ -60,27 +60,16 @@
 <&|/Widgets/TitleBox, title => $title, class => 'ticket-info-basics' &>
 
 <div>
-    <div class="form-row">
-        <div class="label col-2">
-            <&|/l&>Status</&>
-        </div>
-        <div class="value col-8">
-            <& /Ticket/Elements/SelectStatus,
-               Name => "Status",
-               TicketObj => $Ticket,
-               Default => $DefaultStatus &>
-        </div>
-    </div>
-    <div class="form-row">
-        <div class="form-group label col-2">
-            <&|/l&>Subject</&>
-        </div>
-        <div class="form-group value col-8">
-            <input class="form-control" type="text" name="UpdateSubject" size="60" value="<% $ARGS{UpdateSubject} || $Ticket->Subject || '' %>" />
-        </div>
-
-    </div>
-    <& /Elements/EditCustomFields, Object => $Ticket &>
+  <&| /Elements/LabeledValue, Label => loc('Status'), LabelCols => 2, ValueCols => 8 &>
+    <& /Ticket/Elements/SelectStatus,
+       Name => "Status",
+       TicketObj => $Ticket,
+       Default => $DefaultStatus &>
+  </&>
+  <&| /Elements/LabeledValue, Label => loc('Subject'), LabelCols => 2, ValueCols => 8 &>
+    <input class="form-control" type="text" name="UpdateSubject" size="60" value="<% $ARGS{UpdateSubject} || $Ticket->Subject || '' %>" />
+  </&>
+  <& /Elements/EditCustomFields, Object => $Ticket &>
 </div>
 <div class="form-group">
 % if (exists $ARGS{UpdateContent}) {
diff --git a/share/html/Ticket/Create.html b/share/html/Ticket/Create.html
index 7999f544db..eaa40352e1 100644
--- a/share/html/Ticket/Create.html
+++ b/share/html/Ticket/Create.html
@@ -154,29 +154,18 @@
 <div>
 % $m->callback(CallbackName => 'BeforeRequestors', QueueObj => $QueueObj, ARGSRef => \%ARGS);
 
-<div class="form-row">
-<div class="label col-2"><&|/l&>Requestors</&>:</div>
-<div class="value col-9">
+<&| /Elements/LabeledValue, Label => loc('Requestors'), LabelCols => 2, ValueCols => 9 &>
 <& /Elements/EmailInput, Name => 'Requestors', Size => undef, Default => $ARGS{Requestors} // $session{CurrentUser}->EmailAddress, AutocompleteMultiple => 1, AutocompleteType => 'Principals' &>
 % $m->callback( CallbackName => 'AfterRequestors', QueueObj => $QueueObj, ARGSRef => \%ARGS );
-</div>
-</div>
+</&>
 
-<div class="form-row">
-<div class="label col-2">
-<span class="prev-icon-helper"><&|/l&>Cc</&>:</span>\
-<span class="far fa-question-circle icon-helper" data-toggle="tooltip" data-placement="top" data-original-title="<&|/l&>Sends a copy of this update to the provided users or groups. These people will receive future updates.</&>"></span>
-</div>
-<div class="value col-9"><& /Elements/EmailInput, Name => 'Cc', Size => undef, Default => $ARGS{Cc}, AutocompleteMultiple => 1, AutocompleteType => 'Principals' &></div>
-</div>
+<&| /Elements/LabeledValue, Label => loc('Cc'), LabelTooltip => loc('Sends a copy of this update to the provided users or groups. These people will receive future updates.'), LabelCols => 2, ValueCols => 9 &>
+  <& /Elements/EmailInput, Name => 'Cc', Size => undef, Default => $ARGS{Cc}, AutocompleteMultiple => 1, AutocompleteType => 'Principals' &>
+</&>
 
-<div class="form-row">
-<div class="label col-2">
-<span class="prev-icon-helper"><&|/l&>Admin Cc</&>:</span>\
-<span class="far fa-question-circle icon-helper" data-toggle="tooltip" data-placement="top" data-original-title="<&|/l&>Sends a copy of this update to the provided users or groups. These people will receive future updates.</&>"></span>
-</div>
-<div class="value col-9"><& /Elements/EmailInput, Name => 'AdminCc', Size => undef, Default => $ARGS{AdminCc}, AutocompleteMultiple => 1, AutocompleteType => 'Principals' &></div>
-</div>
+<&| /Elements/LabeledValue, Label => loc('Admin Cc'), LabelTooltip => loc('Sends a copy of this update to the provided users or groups. These people will receive future updates.'), LabelCols => 2, ValueCols => 9 &>
+  <& /Elements/EmailInput, Name => 'AdminCc', Size => undef, Default => $ARGS{AdminCc}, AutocompleteMultiple => 1, AutocompleteType => 'Principals' &>
+</&>
 
 % my $roles = $QueueObj->CustomRoles;
 % $roles->LimitToMultipleValue;
@@ -207,21 +196,15 @@
     ForCreation => 1,
 &>
 
-<div class="form-row">
-<div class="form-group label col-2">
-<&|/l&>Subject</&>:
-</div>
-<div class="form-group value col-9">
+<&| /Elements/LabeledValue, Label => loc('Subject'), LabelClass => 'form-group label', ValueClass => 'form-group value', LabelCols => 2, ValueCols => 9 &>
 <input class="form-control" type="text" name="Subject" maxsize="200" value="<%$ARGS{Subject} || ''%>" />
 % $m->callback( %ARGS, CallbackName => 'AfterSubject' );
-</div>
-</div>
+</&>
 
 % if ( $gnupg_widget ) {
-<div class="form-row">
-  <div class="label col-2 empty"></div>
-  <div class="value col-9"><& /Elements/Crypt/SignEncryptWidget, self => $gnupg_widget, QueueObj => $QueueObj &></div>
-</div>
+<&| /Elements/LabeledValue, Label => '', LabelClass => 'label empty', LabelCols => 2, ValueCols => 9 &>
+  <& /Elements/Crypt/SignEncryptWidget, self => $gnupg_widget, QueueObj => $QueueObj &>
+</&>
 % }
 % if ( RT->Config->Get('ArticleOnTicketCreate')) {
 <& /Articles/Elements/BeforeMessageBox, %ARGS, QueueObj => $QueueObj &>
diff --git a/share/html/Ticket/Elements/AddAttachments b/share/html/Ticket/Elements/AddAttachments
index 112b1bfb12..fd1f6b70b8 100644
--- a/share/html/Ticket/Elements/AddAttachments
+++ b/share/html/Ticket/Elements/AddAttachments
@@ -46,8 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 % if ( $attachments ) {
-<div class="form-row attachment"><div class="label col-3"><&|/l&>Attached file</&>:</div>
-<div class="value col-9">
+<&| /Elements/LabeledValue, Class => 'attachment', Label => loc('Attached file') &>
 % foreach my $attach_name ( sort keys %$attachments ) {
     <div>
         <label for="DeleteAttach-<%$attach_name%>"><% $attach_name %></label>
@@ -55,8 +54,7 @@
         (<a href="#" class="delete-attach" data-name="<%$attach_name%>"><&|/l&>Delete</&></a>)
     </div>
 % } # end of foreach
-</div>
-</div>
+</&>
 % } # end of if
 
 <div class="form-group">
@@ -178,9 +176,7 @@ jQuery( function() {
         </div>
 </div>
 % if ($HasExisting) {
-<div class="form-row">
-  <div class="label col-3"><&|/l&>Include attachments</&>:</div>
-  <div class="value col-9" id="reuse-attachments">
+<&| /Elements/LabeledValue, Label => loc('Include attachments'), ValueId => 'reuse-attachments' &>
     <& /Ticket/Elements/ShowAttachments,
       Ticket       => $TicketObj,
       Selectable   => 1,
@@ -188,8 +184,7 @@ jQuery( function() {
       Checked      => \@AttachExisting,
       Count        => RT->Config->Get('AttachmentListCount'),
     &>
-  </div>
-</div>
+</&>
 % }
 % $m->callback( %ARGS, CallbackName => 'End' );
 <%ARGS>
diff --git a/share/html/Ticket/Elements/ShowDates b/share/html/Ticket/Elements/ShowDates
index 6ae1683bb9..9a1ac20d24 100644
--- a/share/html/Ticket/Elements/ShowDates
+++ b/share/html/Ticket/Elements/ShowDates
@@ -70,32 +70,30 @@
   </div>
 % $m->callback( %ARGS, CallbackName => 'AfterTold', TicketObj => $Ticket );
 
-  <div class="date form-row due<% $Ticket->DueObj->Unix ? q{} : q{ unset-field}%>">
-    <div class="label col-3"><&|/l&>Due</&>:</div>\
+  <&| /Elements/LabeledValue, Class => 'date due' . ( $Ticket->DueObj->Unix ? q{} : q{ unset-field} ), Label => loc('Due'), ValueSpanClass => 'current-value' &>
+
 % my $due = $Ticket->DueObj;
 % if ( $due && $due->IsSet && $due->Diff < 0 && $Ticket->QueueObj->IsActiveStatus($Ticket->Status) ) {
-    <div class="value col-9"><span class="current-value"><span class="overdue"><% $due->AsString  %></span></div></span>
+    <span class="overdue"><% $due->AsString  %></span>
 % } else {
-    <div class="value col-9"><span class="current-value"><% $due->AsString  %></span></div>
+    <% $due->AsString  %>
 % }
-  </div>
+  </&>
 % $m->callback( %ARGS, CallbackName => 'AfterDue', TicketObj => $Ticket );
 
-  <div class="date form-row resolved<% $Ticket->ResolvedObj->Unix ? q{} : q{ unset-field}%>">
-    <div class="label col-3"><&|/l&>Closed</&>:</div>\
-    <div class="value col-9"><span class="current-value"><% $Ticket->ResolvedObj->AsString  %></span></div>
-  </div>
+  <&| /Elements/LabeledValue, Class => 'date resolved' . ( $Ticket->ResolvedObj->Unix ? q{} : q{ unset-field} ), Label => loc('Closed'), ValueSpanClass => 'current-value' &>
+    <% $Ticket->ResolvedObj->AsString  %>
+  </&>
 % $m->callback( %ARGS, CallbackName => 'AfterResolved', TicketObj => $Ticket );
 
-  <div class="date form-row updated">
-    <div class="label col-3"><&|/l&>Updated</&>:</div>\
+  <&| /Elements/LabeledValue, Class => 'date updated', Label => loc('Updated'), ValueSpanClass => 'current-value' &>
 % my $UpdatedString = $Ticket->LastUpdated ? loc("[_1] by [_2]", $Ticket->LastUpdatedAsString, $m->scomp('/Elements/ShowUser', User => $Ticket->LastUpdatedByObj)) : loc("Never");
 % if ($UpdatedLink) {
-    <div class="value col-9"><span class="current-value"><a href="<% $UpdatedLink %>"><% $UpdatedString | n %></a></span></div>
+    <a href="<% $UpdatedLink %>"><% $UpdatedString | n %></a>
 % } else {
-    <div class="value col-9"><span class="current-value"><% $UpdatedString | n %></span></div>
+    <% $UpdatedString | n %>
 % }
-  </div>
+  </&>
 % $m->callback( %ARGS, CallbackName => 'AfterUpdated', TicketObj => $Ticket );
   <& /Ticket/Elements/ShowCustomFields, Ticket => $Ticket, Grouping => 'Dates', Table => 0 &>
 % $m->callback( %ARGS, CallbackName => 'EndOfList', TicketObj => $Ticket );
diff --git a/share/html/Ticket/Elements/ShowPeople b/share/html/Ticket/Elements/ShowPeople
index 42e9740b7a..ac1e045246 100644
--- a/share/html/Ticket/Elements/ShowPeople
+++ b/share/html/Ticket/Elements/ShowPeople
@@ -46,14 +46,12 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <div>
-  <div class="form-row owner">
-    <div class="label col-3"><&|/l&>Owner</&>:</div>
+  <&| /Elements/LabeledValue, Class => 'owner', Label => loc('Owner'), ValueSpanClass => 'current-value' &>
 % my $owner = $Ticket->OwnerObj;
-    <div class="value col-9"><span class="current-value"><& /Elements/ShowUser, User => $owner, Ticket => $Ticket &>
+    <& /Elements/ShowUser, User => $owner, Ticket => $Ticket &>
     <& /Elements/ShowUserEmailFrequency, User => $owner, Ticket => $Ticket &>
 % $m->callback( User => $owner, Ticket => $Ticket, %ARGS, CallbackName => 'AboutThisUser' );
-    </span></div>
-  </div>
+  </&>
 
 % my $single_roles = $Ticket->QueueObj->CustomRoles;
 % $single_roles->LimitToSingleValue;
@@ -71,24 +69,20 @@
 %# so fall back to nobody
 
 %     my $user = $users->First || RT->Nobody;
-  <div class="form-row">
-    <div class="label col-3"><% $role->Name %>:</div>
-    <div class="value col-9"><span class="current-value"><& /Elements/ShowUser, User => $user, Ticket => $Ticket &></span></div>
-  </div>
+  <&| /Elements/LabeledValue, Label => $role->Name, ValueSpanClass => 'current-value' &>
+    <& /Elements/ShowUser, User => $user, Ticket => $Ticket &>
+  </&>
 % }
 
-  <div class="form-row requestors">
-    <div class="label col-3"><&|/l&>Requestors</&>:</div>
-    <div class="value col-9"><span class="current-value"><& ShowGroupMembers, Group => $Ticket->Requestors, Ticket => $Ticket &></span></div>
-  </div>
-  <div class="form-row cc<% $Ticket->Cc->MembersObj->Count ? q{} : q{ unset-field}%>">
-    <div class="label col-3"><&|/l&>Cc</&>:</div>
-    <div class="value col-9"><span class="current-value"><& ShowGroupMembers, Group => $Ticket->Cc, Ticket => $Ticket &></span></div>
-  </div>
-  <div class="form-row admincc<% $Ticket->AdminCc->MembersObj->Count ? q{} : q{ unset-field}%>">
-    <div class="label col-3"><&|/l&>AdminCc</&>:</div>
-    <div class="value col-9"><span class="current-value"><& ShowGroupMembers, Group => $Ticket->AdminCc, Ticket => $Ticket &></span></div>
-  </div>
+  <&| /Elements/LabeledValue, Class => 'requestors', Label => loc('Requestors'), ValueSpanClass => 'current-value' &>
+    <& ShowGroupMembers, Group => $Ticket->Requestors, Ticket => $Ticket &>
+  </&>
+  <&| /Elements/LabeledValue, Class => 'cc' . ( $Ticket->Cc->MembersObj->Count ? q{} : q{ unset-field} ), Label => loc('Cc'), ValueSpanClass => 'current-value' &>
+    <& ShowGroupMembers, Group => $Ticket->Cc, Ticket => $Ticket &>
+  </&>
+  <&| /Elements/LabeledValue, Class => 'admincc' . ( $Ticket->AdminCc->MembersObj->Count ? q{} : q{ unset-field} ), Label => loc('AdminCc'), ValueSpanClass => 'current-value' &>
+    <& ShowGroupMembers, Group => $Ticket->AdminCc, Ticket => $Ticket &>
+  </&>
 
 % my $multi_roles = $Ticket->QueueObj->CustomRoles;
 % $multi_roles->LimitToMultipleValue;
@@ -97,10 +91,9 @@
 
 % $m->callback( CustomRoles => $multi_roles, SingleRoles => 0, Ticket => $Ticket, %ARGS, CallbackName => 'ModifyCustomRoles' );
 % while (my $role = $multi_roles->Next) {
-  <div class="form-row">
-    <div class="label col-3"><% $role->Name %>:</div>
-    <div class="value col-9"><span class="current-value"><& ShowGroupMembers, Group => $Ticket->RoleGroup($role->GroupType), Ticket => $Ticket &></span></div>
-  </div>
+  <&| /Elements/LabeledValue, Label => $role->Name, ValueSpanClass => 'current-value' &>
+    <& ShowGroupMembers, Group => $Ticket->RoleGroup($role->GroupType), Ticket => $Ticket &>
+  </&>
 % }
 
   <& /Ticket/Elements/ShowCustomFields, Ticket => $Ticket, Grouping => 'People', Table => 0 &>
diff --git a/share/html/Ticket/Elements/UpdateCc b/share/html/Ticket/Elements/UpdateCc
index 83a73272a8..ae7faa3651 100644
--- a/share/html/Ticket/Elements/UpdateCc
+++ b/share/html/Ticket/Elements/UpdateCc
@@ -47,19 +47,12 @@
 %# END BPS TAGGED BLOCK }}}
 % $m->callback(CallbackName => 'BeforeCc', ARGSRef => \%ARGS, Ticket => $TicketObj, one_time_Ccs => \@one_time_Ccs, txn_addresses => \%txn_addresses);
 
-<div class="form-row">
-  <div class="label col-2">
-    <&|/l&>One-time Cc</&>:
-  </div>
-  <div class="value col-9">
+<&| /Elements/LabeledValue, Label => loc('One-time Cc'), LabelCols => 2, ValueCols => 9 &>
     <& /Elements/EmailInput, Name => 'UpdateCc', Size => undef, Default => $ARGS{UpdateCc}, AutocompleteMultiple => 1, Options => \@one_time_Ccs &>
     <input type="hidden" id="UpdateIgnoreAddressCheckboxes" name="UpdateIgnoreAddressCheckboxes" value="<% $ARGS{UpdateIgnoreAddressCheckboxes} || 0 %>">
-  </div>
-</div>
+</&>
 
-<div class="form-row mt-0">
-  <div class="label col-2"></div>
-  <div class="value col-9">
+<&| /Elements/LabeledValue, Class => 'mt-0', Label => '', LabelCols => 2, ValueCols => 9 &>
     <div class="form-row">
 %if (scalar @one_time_Ccs) {
 %   if ($hide_cc_suggestions) {
@@ -98,21 +91,13 @@
       </div>
 %}
     </div>
-  </div>
-</div>
+</&>
 
-<div class="form-row">
-  <div class="label col-2">
-    <&|/l&>One-time Bcc</&>:
-  </div>
-  <div class="value col-9">
+<&| /Elements/LabeledValue, Label => loc('One-time Bcc'), LabelCols => 2, ValueCols => 9 &>
     <& /Elements/EmailInput, Name => 'UpdateBcc', Size => undef, Default => $ARGS{UpdateBcc}, AutocompleteMultiple => 1, Options => \@one_time_Ccs &>
-  </div>
-</div>
+</&>
 
-<div class="form-row mt-0">
-  <div class="label col-2"></div>
-  <div class="value col-9">
+<&| /Elements/LabeledValue, Class => 'mt-0', Label => '', LabelCols => 2, ValueCols => 9 &>
     <div class="form-row">
 %if (scalar @one_time_Ccs) {
 %   if ($hide_cc_suggestions) {
@@ -163,8 +148,7 @@ jQuery(function() {
 </script>
 %}
     </div>
-  </div>
-</div>
+</&>
 <%args>
 $TicketObj
 </%args>
diff --git a/share/html/Ticket/Forward.html b/share/html/Ticket/Forward.html
index 24ca5efa13..d762037be1 100644
--- a/share/html/Ticket/Forward.html
+++ b/share/html/Ticket/Forward.html
@@ -60,41 +60,33 @@
 
 <&|/Widgets/TitleBox, title => loc('Message'), class => 'messagedetails' &>
 <div>
-  <div class="form-row">
-    <div class="label col-2"><&|/l&>From</&>:</div>
-    <div class="value col-9"><% $from %></div>
-  </div>
+  <&| /Elements/LabeledValue, Label => loc('From'), LabelCols => 2, ValueCols => 9, ValueSpanClass => 'current-value' &>
+    <% $from %>
+  </&>
 
-  <div class="form-row">
-    <div class="label col-2"><&|/l&>Subject</&>:</div>
-    <div class="value col-9"><input class="form-control"   type="text" name="Subject" value="<% $ARGS{'Subject'} || $subject %>" /></div>
-  </div>
+  <&| /Elements/LabeledValue, Label => loc('Subject'), LabelCols => 2, ValueCols => 9 &>
+    <input class="form-control"   type="text" name="Subject" value="<% $ARGS{'Subject'} || $subject %>" />
+  </&>
 
-  <div class="form-row">
-    <div class="label col-2"><&|/l&>To</&>:</div>
-    <div class="value col-9"><& /Elements/EmailInput, Name => "To", AutocompleteMultiple => 1, Default => $ARGS{'To'} &></div>
-  </div>
+  <&| /Elements/LabeledValue, Label => loc('To'), LabelCols => 2, ValueCols => 9 &>
+    <& /Elements/EmailInput, Name => "To", AutocompleteMultiple => 1, Default => $ARGS{'To'} &>
+  </&>
 
-  <div class="form-row">
-    <div class="label col-2"><&|/l&>Cc</&>:</div>
-    <div class="value col-9"><& /Elements/EmailInput, Name => "Cc", AutocompleteMultiple => 1, Default => $ARGS{'Cc'} &></div>
-  </div>
+  <&| /Elements/LabeledValue, Label => loc('Cc'), LabelCols => 2, ValueCols => 9 &>
+    <& /Elements/EmailInput, Name => "Cc", AutocompleteMultiple => 1, Default => $ARGS{'Cc'} &>
+  </&>
 
-  <div class="form-row">
-    <div class="label col-2"><&|/l&>Bcc</&>:</div>
-    <div class="value col-9"><& /Elements/EmailInput, Name => "Bcc", AutocompleteMultiple => 1, Default => $ARGS{'Bcc'} &></div>
-  </div>
+  <&| /Elements/LabeledValue, Label => loc('Bcc'), LabelCols => 2, ValueCols => 9 &>
+    <& /Elements/EmailInput, Name => "Bcc", AutocompleteMultiple => 1, Default => $ARGS{'Bcc'} &>
+  </&>
 
 % if ( $gnupg_widget ) {
-  <div class="form-row">
-    <span class="label col-2 empty"> </span>
-    <div class="value col-9">
+  <&| /Elements/LabeledValue, Label => '', LabelClass => 'label empty', LabelCols => 2, ValueCols => 9 &>
 <& /Elements/Crypt/SignEncryptWidget,
     self => $gnupg_widget,
     TicketObj => $TicketObj,
 &>
-    </div>
-  </div>
+  </&>
 % }
 
   <div class="form-group">
diff --git a/share/html/Ticket/ModifyAll.html b/share/html/Ticket/ModifyAll.html
index bd7ebb080e..cbf759051a 100644
--- a/share/html/Ticket/ModifyAll.html
+++ b/share/html/Ticket/ModifyAll.html
@@ -86,9 +86,7 @@
 
 <&| /Widgets/TitleBox, title => loc('Update ticket'), class => 'messagedetails' &>
 <div>
-  <div class="form-row input-row">
-    <div class="label col-2"><&|/l&>Update Type</&>:</div>
-    <div class="value col-9">
+  <&| /Elements/LabeledValue, Class => 'input-row', Label => loc('Update Type'), LabelCols => 2, ValueCols => 9 &>
       <select name="UpdateType" id="UpdateType" class="form-control selectpicker">
 % if ($CanComment) {
         <option value="private" ><&|/l&>Comments (Not sent to requestors)</&></option>
@@ -98,14 +96,11 @@
 % }
       </select> 
 % $m->callback( %ARGS, CallbackName => 'AfterUpdateType' );
-    </div>
-  </div>
-  <div class="form-row input-row">
-    <div class="label col-2"><&|/l&>Subject</&>:</div>
-    <div class="value col-9"><input class="form-control" type="text" name="UpdateSubject" value="<%$Ticket->Subject%>" />
+  </&>
+  <&| /Elements/LabeledValue, Class => 'input-row', Label => loc('Subject'), LabelCols => 2, ValueCols => 9 &>
+    <input class="form-control" type="text" name="UpdateSubject" value="<%$Ticket->Subject%>" />
 % $m->callback( %ARGS, CallbackName => 'AfterSubject' );
-    </div>
-  </div>
+  </&>
 
   <& /Ticket/Elements/EditTransactionCustomFields, %ARGS, TicketObj => $Ticket, LabelCols => 2 &>
 
diff --git a/share/html/Ticket/Update.html b/share/html/Ticket/Update.html
index 680aedcf24..5f35395be9 100644
--- a/share/html/Ticket/Update.html
+++ b/share/html/Ticket/Update.html
@@ -79,8 +79,8 @@
 </&>
 % }
 
-<div class="form-row"><div class="label col-3"><&|/l&>Update Type</&>:</div>
-<div class="value col-9"><select class="form-control selectpicker" name="UpdateType" id="UpdateType">
+<&| /Elements/LabeledValue, Label => loc('Update Type') &>
+<select class="form-control selectpicker" name="UpdateType" id="UpdateType">
 % if ($CanComment) {
 <option value="private" <% ($ARGS{'UpdateType'} &&  $ARGS{'UpdateType'} eq "private") ? qq[ selected="selected"] : !$ARGS{'UpdateType'}&&$CommentDefault |n %>><&|/l&>Comments (Not sent to requestors)</&></option>
 % }
@@ -90,7 +90,7 @@
 </select> 
 
 % $m->callback( %ARGS, CallbackName => 'AfterUpdateType' );
-</div></div>
+</&>
 
 <& /Ticket/Elements/EditBasics,
     TicketObj => $TicketObj,
@@ -152,27 +152,19 @@
 <& /Ticket/Elements/UpdateCc, %ARGS, TicketObj => $TicketObj &>
 
 % if ( $gnupg_widget ) {
-<div class="form-row">
-  <div class="label col-2 empty"></div>
-  <div class="value col-9">
+<&| /Elements/LabeledValue, Label => '', LabelClass => 'label empty', LabelCols => 2, ValueCols => 9 &>
     <& /Elements/Crypt/SignEncryptWidget,
         self => $gnupg_widget,
         TicketObj => $TicketObj,
     &>
-  </div>
-</div>
+</&>
 % }
 % $m->callback( %ARGS, CallbackName => 'AfterGnuPG' );
 
-<div class="form-row">
-  <div class="form-group label col-2">
-    <&|/l&>Subject</&>:
-  </div>
-  <div class="value col-9">
+<&| /Elements/LabeledValue, Label => loc('Subject'), LabelClass => 'form-group label', LabelCols => 2, ValueCols => 9 &>
     <input class="form-control" type="text" name="UpdateSubject" value="<% $ARGS{UpdateSubject} || $TicketObj->Subject || '' %>" />
 % $m->callback( %ARGS, CallbackName => 'AfterSubject' );
-  </div>
-</div>
+</&>
 <& /Articles/Elements/BeforeMessageBox, %ARGS &>
 <div class="form-group">
   <div class="messagebox-container action-<% $type %>">

commit e13280d42c8ece0ec69c80f16270998fed58fdf1
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Thu Oct 6 21:48:32 2022 +0800

    Re-add the missing Creator row for article display
    
    It was removed during LabeledValue refactor by accident.

diff --git a/share/html/Articles/Article/Display.html b/share/html/Articles/Article/Display.html
index 8b4a96d4a6..f15534ab47 100644
--- a/share/html/Articles/Article/Display.html
+++ b/share/html/Articles/Article/Display.html
@@ -53,7 +53,10 @@
 <& /Elements/LabeledValue, Label => loc('Summary'), ValueSpanClass => 'current-value', Value => $article->Summary &>
 <& /Elements/LabeledValue, Label => loc('Sort Order'), ValueSpanClass => 'current-value', Value => $article->SortOrder &>
 <& /Elements/LabeledValue, Label => loc('Class'), ValueSpanClass => 'current-value', Value => $article->ClassObj->Name &>
-<& /Elements/LabeledValue, Label => loc('Creator'), ValueSpanClass => 'current-value', Value => $article->CreatedObj->AsString &>
+<&| /Elements/LabeledValue, Label => loc('Creator'), ValueSpanClass => 'current-value' &>
+  <& /Elements/ShowUser, User => $article->CreatorObj &>
+</&>
+<& /Elements/LabeledValue, Label => loc('Created'), ValueSpanClass => 'current-value', Value => $article->CreatedObj->AsString &>
 <& /Elements/LabeledValue, Label => loc('Updated'), ValueSpanClass => 'current-value', Value => $article->LastUpdatedObj->AsString &>
 
 </&>

commit 3c5b4ff91bc9c602b6245843854d2a117b770a87
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Thu Oct 6 21:42:14 2022 +0800

    Make "Merge into" row take half width on ticket ModifyLinks page
    
    Initial LabeledValue refactor dropped cols customization, which caused
    the row to take fullwidth on ModifyLinks page, which was too wide. This
    commit reverts back to the previous layout.

diff --git a/share/html/Ticket/Elements/EditMerge b/share/html/Ticket/Elements/EditMerge
index 4a2348d62f..270da6ff20 100644
--- a/share/html/Ticket/Elements/EditMerge
+++ b/share/html/Ticket/Elements/EditMerge
@@ -48,7 +48,7 @@
 <div class='ticket-merge-text <% $MergeTextClass %>'>
 <&|/l&>Warning: merging is a non-reversible action! Enter a single ticket number to be merged into.</&>
 </div>
-<&| /Elements/LabeledValue, Label => loc('Merge into') &>
+<&| /Elements/LabeledValue, Label => loc('Merge into'), LabelCols => $LabelCols, ValueCols => $ValueCols &>
   <input type="text" class="form-control" name="<% $Name %>" value="<% $Default || '' %>" data-autocomplete="Tickets" data-autocomplete-exclude="<% join( ' ', @excludes) || '' %>" />
 </&>
 
@@ -73,4 +73,6 @@ $Tickets => undef
 $Name => ''
 $Default => ''
 $MergeTextClass => 'ticket-merge-position'
+$LabelCols => 2
+$ValueCols => 4
 </%ARGS>
diff --git a/share/html/Ticket/Elements/ShowSummary b/share/html/Ticket/Elements/ShowSummary
index 944cbf01ca..5685e19d15 100644
--- a/share/html/Ticket/Elements/ShowSummary
+++ b/share/html/Ticket/Elements/ShowSummary
@@ -210,7 +210,7 @@ push @extra, (titleright_raw => $links_titleright) if $links_titleright;
                 <& /Elements/EditLinks, Object => $Ticket, TwoColumn => 0 &>
 
                 <h3><&|/l&>Merge</&></h3>
-                <& /Ticket/Elements/EditMerge, Ticket => $Ticket, MergeTextClass => '', %ARGS &>
+                <& /Ticket/Elements/EditMerge, Ticket => $Ticket, LabelCols => 3, ValueCols => 9, MergeTextClass => '', %ARGS &>
 
                 <div class="form-row">
                   <div class="col-12 text-right">

commit d677ed9f8b4ec5524fa62a2c60d366c0aa74ea15
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Thu Oct 6 21:23:27 2022 +0800

    Add back the missing current-value span
    
    Otherwise, rows in asset widget on ticket create page would have
    alignment issues.

diff --git a/share/html/Elements/ShowRecord b/share/html/Elements/ShowRecord
index 594367226c..976ab525a3 100644
--- a/share/html/Elements/ShowRecord
+++ b/share/html/Elements/ShowRecord
@@ -81,6 +81,7 @@ for my $column (@columns) {
 </%perl>
 <&| /Elements/LabeledValue,
     RawLabel => loc($title),
+    ValueSpanClass => 'current-value',
     Class => 'record-field '.
         ( $Class ? CSSClass("$Class-field")." " : "" ) .
         CSSClass($fetch_columnmap->($attr,'attribute',[$attr],'no_escape'))

commit 6493f6a0fcf93d2f67557f483799f8dea42aed42
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Thu Oct 6 18:21:33 2022 +0800

    Use LabledValue to generate current-value spans

diff --git a/share/html/Articles/Article/Elements/EditBasics b/share/html/Articles/Article/Elements/EditBasics
index 4f5046a092..53624d62b2 100644
--- a/share/html/Articles/Article/Elements/EditBasics
+++ b/share/html/Articles/Article/Elements/EditBasics
@@ -65,14 +65,14 @@
 </&>
 
 % if ($ARGS{'id'} ne 'new') {
-  <&| /Elements/LabeledValue, Label => loc('Creator') &>
-    <span class="current-value form-control"><& /Elements/ShowUser, User => $ArticleObj->CreatorObj &></span>
+  <&| /Elements/LabeledValue, Label => loc('Creator'), ValueSpanClass => 'current-value from-control' &>
+    <& /Elements/ShowUser, User => $ArticleObj->CreatorObj &>
   </&>
-  <&| /Elements/LabeledValue, Label => loc('Created') &>
-    <span class="current-value form-control"><%$ArticleObj->CreatedObj->AsString%></span>
+  <&| /Elements/LabeledValue, Label => loc('Created'), ValueSpanClass => 'current-value from-control' &>
+    <%$ArticleObj->CreatedObj->AsString%>
   </&>
-  <&| /Elements/LabeledValue, Label => loc('Updated') &>
-    <span class="current-value form-control"><%$ArticleObj->LastUpdatedObj->AsString%></span>
+  <&| /Elements/LabeledValue, Label => loc('Updated'), ValueSpanClass => 'current-value from-control' &>
+    <%$ArticleObj->LastUpdatedObj->AsString%>
   </&>
 % }
 % if ($ARGS{'id'} eq 'new' || $ArticleObj->CurrentUserHasRight('DisableArticle')) {

commit 92f71ec68e1fa1e0170920a438ce9d0ed0c1e895
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Thu Oct 6 17:21:08 2022 +0800

    Remove unnecessary current-value span
    
    The current-value span is used in forms to align the label/value, so
    it's not needed when rows are not in forms.

diff --git a/share/html/Admin/Actions/Elements/ShowBasics b/share/html/Admin/Actions/Elements/ShowBasics
index 75bbf76607..75a30e7add 100644
--- a/share/html/Admin/Actions/Elements/ShowBasics
+++ b/share/html/Admin/Actions/Elements/ShowBasics
@@ -46,16 +46,16 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <&| /Elements/LabeledValue, Label => loc("Name") &>
-    <span class="current-value"><% $ARGS{"Name"} || $Action->Name || '' %></span>
+    <% $ARGS{"Name"} || $Action->Name || '' %>
 </&>
 <&| /Elements/LabeledValue, Label => loc("Description") &>
-    <span class="current-value"><% $ARGS{"Description"} || $Action->Description || '' %></span>
+    <% $ARGS{"Description"} || $Action->Description || '' %>
 </&>
 <&| /Elements/LabeledValue, Label => loc("Action Module") &>
-    <span class="current-value"><% $ARGS{"ExecModule"} || $Action->ExecModule || ''%></span>
+    <% $ARGS{"ExecModule"} || $Action->ExecModule || ''%>
 </&>
 <&| /Elements/LabeledValue, Label => loc("Parameters to Pass") &>
-    <span class="current-value"><% $ARGS{"Argument"} || $Action->Argument || '' %></span>
+    <% $ARGS{"Argument"} || $Action->Argument || '' %>
 </&>
 
 <%ARGS>

commit 3239597886e169ef4a91447c5f0eaeec90e53003
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Thu Oct 6 16:22:39 2022 +0800

    Fix layout of ticket graph page
    
    The LabeledValue refactor dropped a couple of div opening tags and a css
    class by accident, this commit adds them back.

diff --git a/share/html/Ticket/Graphs/Elements/EditGraphProperties b/share/html/Ticket/Graphs/Elements/EditGraphProperties
index f15b7dd787..794240a3e6 100644
--- a/share/html/Ticket/Graphs/Elements/EditGraphProperties
+++ b/share/html/Ticket/Graphs/Elements/EditGraphProperties
@@ -73,8 +73,8 @@
     </select>
   </&>
 
-    <&| /Elements/LabeledValue, Label => loc('Show as well') &>
-
+    <&| /Elements/LabeledValue, Label => loc('Show as well'), ValueSpanClass => 'current-value' &>
+      <div class="form-row">
 % foreach my $type ( @link_types ) {
 % my $checked = '';
 % $checked = 'checked="checked"' if grep $type eq $_, @ShowLinks;
@@ -172,13 +172,14 @@ my $id = "graph-properties-box-$Level";
 my $class = '';
 $class = 'class="hidden"' if $Level != 1 && !@Default;
 </%INIT>
-  <&| /Elements/LabeledValue, Label => loc('Show Tickets Properties on [_1] level', $Level) &>
+  <&| /Elements/LabeledValue, Label => loc('Show Tickets Properties on [_1] level', $Level), ValueSpanClass => 'current-value'  &>
   (<small><a href="#" onclick="hideshow(<% $id |n,j%>); return false;"><% loc('open/close') %></a></small>):
 </&>
 
 <div id="<% $id %>" <% $class |n %>>
 % while ( my ($group, $list) = (splice @Available, 0, 2) ) {
-    <&| /Elements/LabeledValue, Label => loc($group) &>
+    <&| /Elements/LabeledValue, Label => loc($group), ValueSpanClass => 'current-value' &>
+      <div class="form-row">
 % foreach my $prop ( @$list ) {
 % my $checked = '';
 % $checked = 'checked="checked"' if grep $_ eq $prop, @Default;

commit fe346aa411de5f0af1325fbf0af260ffc55e8c46
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Tue Oct 4 22:15:42 2022 +0800

    Drop an extra form-row wrapper as LabeledValue already has one

diff --git a/share/html/Asset/Search/Bulk.html b/share/html/Asset/Search/Bulk.html
index 43b716296d..ad3cd5520a 100644
--- a/share/html/Asset/Search/Bulk.html
+++ b/share/html/Asset/Search/Bulk.html
@@ -90,12 +90,10 @@
   <&| /Widgets/TitleBox, title => loc("Basics"), class => "asset-basics asset-bulk-basics", title_class => "inverse" &>
     <div class="form-row">
       <div class="col-6">
-        <div class="form-row">
-          <&| /Elements/LabeledValue, Label => loc('Catalog') &>
-            <& /Asset/Elements/SelectCatalog, Name => 'UpdateCatalog', UpdateSession => 0, ShowNullOption => 1 &>
-          </&>
-
-
+        <&| /Elements/LabeledValue, Label => loc('Catalog') &>
+          <& /Asset/Elements/SelectCatalog, Name => 'UpdateCatalog', UpdateSession => 0, ShowNullOption => 1 &>
+        </&>
+      </div>
       <div class="col-6">
         <&| /Elements/LabeledValue, Label => loc('Name') &>
           <input class="form-control" type="text" name="UpdateName" value="<% $ARGS{'Name'}||'' %>" size="40">

commit e79d0df920cda666a29fbce4e8fcc88e41d9eef3
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Sat Oct 1 05:30:29 2022 +0800

    Fix alignment and width of AddWatchers
    
    The LabeledValue refactor added extra css classes there and dropped cols
    customization, which caused the issue. This commit fixes both to make
    AddWatchers layout the same as before.

diff --git a/share/html/Asset/Elements/AddCatalogPeople b/share/html/Asset/Elements/AddCatalogPeople
index 476684017c..bb096863cb 100644
--- a/share/html/Asset/Elements/AddCatalogPeople
+++ b/share/html/Asset/Elements/AddCatalogPeople
@@ -50,7 +50,10 @@ $Object
 </%args>
 <div class="add-user">
   <h3><&|/l&>Add a person</&></h3>
-  <&| /Elements/LabeledValue, RawLabel =>  $m->scomp('SelectRoleType', Object => $Object, Name => "AddUserRoleMember-Role") &>
+  <&| /Elements/LabeledValue,
+    RawLabel => $m->scomp('SelectRoleType', Object => $Object, Name => "AddUserRoleMember-Role"),
+    LabelClass => '', ValueClass => ''
+  &>
       <input type="text" name="AddUserRoleMember"
         data-autocomplete="Users"
         data-autocomplete-return="Name"
@@ -62,7 +65,7 @@ $Object
 
 <div class="add-group">
   <h3><&|/l&>Add a group</&></h3>
-    <&| /Elements/LabeledValue, RawLabel =>  $m->scomp('SelectRoleType', Object => $Object, Name => "AddGroupRoleMember-Role") &>
+    <&| /Elements/LabeledValue, RawLabel =>  $m->scomp('SelectRoleType', Object => $Object, Name => "AddGroupRoleMember-Role"), LabelClass => '', ValueClass => '' &>
       <input type="text" name="AddGroupRoleMember"
         data-autocomplete="Groups"
         data-autocomplete-return="Name"
diff --git a/share/html/Elements/LabeledValue b/share/html/Elements/LabeledValue
index f711e6e6c6..3603a76742 100644
--- a/share/html/Elements/LabeledValue
+++ b/share/html/Elements/LabeledValue
@@ -54,6 +54,10 @@ $LabelSpanClass => undef
 $RawLabel => undef
 $RawValue => undef
 $LabelTooltip => undef
+$LabelClass => 'label'
+$ValueClass => 'value'
+$LabelCols  => 3
+$ValueCols  => 9
 </%args>
 <%init>
 if ( !defined($Value) && !defined($RawValue) && $m->content) {
@@ -62,7 +66,7 @@ if ( !defined($Value) && !defined($RawValue) && $m->content) {
 
 </%init>
 <div class="<% $Class %> form-row">
-    <div class="label col-3">\
+    <div class="<% $LabelClass %> col-<% $LabelCols %>">\
 <%perl>
     if ($LabelSpanClass) {
         $m->out('<span class="'.$m->interp->apply_escapes($LabelSpanClass,"h").'">');
@@ -80,7 +84,7 @@ if ( !defined($Value) && !defined($RawValue) && $m->content) {
         $m->out('<span class="far fa-question-circle icon-helper" data-toggle="tooltip" data-placement="top" data-original-title="'. $m->interp->apply_escapes($LabelTooltip, "h").'"></span>');
     }
     $m->out('</div>');
-    $m->out('<div class="value col-9">');
+    $m->out(qq{<div class="$ValueClass col-$ValueCols">});
      if ($ValueSpanClass) {
         $m->out('<span class="'.$m->interp->apply_escapes($ValueSpanClass,"h").'">');
     }
diff --git a/share/html/Ticket/Elements/AddWatchers b/share/html/Ticket/Elements/AddWatchers
index 8bc64a974f..a319d46bdd 100644
--- a/share/html/Ticket/Elements/AddWatchers
+++ b/share/html/Ticket/Elements/AddWatchers
@@ -59,7 +59,10 @@
     <&| /Elements/LabeledValue, RawLabel =>  $m->scomp("/Elements/SelectWatcherType",
         Name  => "Ticket-AddWatcher-Principal-". $u->PrincipalId,
         Queue => $Ticket->QueueObj),
-        ValueSpanClass => "current-value"
+        ValueSpanClass => "current-value",
+        LabelClass => '',
+        ValueClass => '',
+        ValueCols  => 6,
       &>
       <& '/Elements/ShowUser', User => $u, style=>'verbose' &>
   </&>
@@ -72,28 +75,32 @@
     <&| /Elements/LabeledValue, RawLabel =>  $m->scomp("/Elements/SelectWatcherType",
         Name  => "Ticket-AddWatcher-Principal-".$g->PrincipalId,
         Queue => $Ticket->QueueObj),
-        ValueSpanClass => "current-value"
+        ValueSpanClass => "current-value",
+        LabelClass => '',
+        ValueClass => '',
+        ValueCols  => 6,
       &>
         <%$g->Name%> (<%$g->Description%>)
     </&>
 % }
 % }
 
-  <& /Elements/LabeledValue, Label => loc("Type"), Value => loc("User or Group") &>
+  <& /Elements/LabeledValue, Label => loc("Type"), LabelClass => '', Value => loc("User or Group"), ValueClass => '', ValueCols => 6 &>
 
 % my $counter = 4;
 % for my $email (@extras) {
 % $counter++;
   <&| /Elements/LabeledValue,
     RawLabel => $m->scomp('/Elements/SelectWatcherType', Name => "WatcherTypeEmail".$counter, Queue => $Ticket->QueueObj),
-    ValueSpanClass => 'current-value' &>
+    ValueSpanClass => "current-value", LabelClass => '', ValueClass => '', ValueCols  => 6 &>
       <input type="hidden" name="WatcherAddressEmail<%$counter%>" value="<%$email->format%>">
       <%$email->format%>
   </&>
 % }
 % for my $i (1 .. 3) {
     <&| /Elements/LabeledValue,
-    RawLabel => $m->scomp('/Elements/SelectWatcherType', Name => "WatcherTypeEmail".$i, Queue => $Ticket->QueueObj) &>
+        RawLabel => $m->scomp('/Elements/SelectWatcherType', Name => "WatcherTypeEmail" . $i, Queue => $Ticket->QueueObj),
+        LabelClass => '', ValueClass => '', ValueCols  => 6 &>
       <& /Elements/EmailInput, Name => 'WatcherAddressEmail' . $i, Size => '20', AutocompleteType => 'Principals' &>
   </&>
 % }

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


hooks/post-receive
-- 
rt


More information about the rt-commit mailing list