[Rt-commit] rt branch, 5.0/self-service-display-article, updated. rt-5.0.0-139-g42e1465638

Dianne Skoll dianne at bestpractical.com
Fri Dec 11 11:23:02 EST 2020


The branch, 5.0/self-service-display-article has been updated
       via  42e146563864aa3d4f38c33fbecea22b5cf36f80 (commit)
       via  f5729e78e8fe0b41eb8cd7e06fbceefdcf4ada67 (commit)
      from  2d3d55a665440e366305c7b6e471c49567d64fbf (commit)

Summary of changes:
 .../{ShowCustomFields => ShowArticleFields}        |  8 ++++-
 share/html/Elements/ShowCustomFieldText            | 12 +++++--
 share/html/SelfService/Article/Display.html        | 39 ++++++++++++++++++++--
 3 files changed, 53 insertions(+), 6 deletions(-)
 copy share/html/Elements/{ShowCustomFields => ShowArticleFields} (96%)

- Log -----------------------------------------------------------------
commit f5729e78e8fe0b41eb8cd7e06fbceefdcf4ada67
Author: Dianne Skoll <dianne at bestpractical.com>
Date:   Fri Dec 11 09:30:09 2020 -0500

    Respect the "Include custom field: Value" setting in the article class.
    
    We hide custom fields where the Value box is unchecked.

diff --git a/share/html/SelfService/Article/Display.html b/share/html/SelfService/Article/Display.html
index b35a311cf5..83209b4308 100644
--- a/share/html/SelfService/Article/Display.html
+++ b/share/html/SelfService/Article/Display.html
@@ -48,7 +48,7 @@
 <& /SelfService/Elements/Header, Title => $article->Name &>
 <div id="article-display-container" class="mx-auto max-width-md">
 <&| /Widgets/TitleBox, title => $article->Summary, class => 'article-display-simple', content_class => 'mx-auto width-md' &>
-<& /Elements/ShowCustomFields, Object => $article &>
+<& /Elements/ShowCustomFields, Object => $article, CustomFields => $custom_fields &>
 </&>
 </div>
 <%init>
@@ -66,6 +66,31 @@ unless ( $article->CurrentUserHasRight('ShowArticle') ) {
 }
 
 $id = $article->id;
+my $class = $article->ClassObj;
+
+# Build up the hash of things to include/exclude, as well
+# as the array of custom field IDs to limit by
+my %include = (Name => 1, Summary => 1, EscapeHTML => 1);
+my @exclude_cf_ids;
+
+my $cfs = $article->CustomFields;
+while ( my $cf = $cfs->Next ) {
+    $include{"CF-Title-" . $cf->Id} = 1;
+    $include{"CF-Value-" . $cf->Id} = 1;
+}
+foreach my $key ( keys %include ) {
+    $include{$key} = not $class->FirstAttribute("Skip-$key");
+    if ($key =~ /^CF-Value-(\d+)$/ && !$include{$key}) {
+        push(@exclude_cf_ids, $1);
+    }
+}
+
+my $custom_fields = $article->CustomFields;
+if (scalar(@exclude_cf_ids)) {
+    $custom_fields->Limit(FIELD    => 'id',
+                          OPERATOR => 'NOT IN',
+                          VALUE    => \@exclude_cf_ids);
+}
 
 </%init>
 <%args>

commit 42e146563864aa3d4f38c33fbecea22b5cf36f80
Author: Dianne Skoll <dianne at bestpractical.com>
Date:   Fri Dec 11 11:21:43 2020 -0500

    Update self-service article display to respect hiding/showing field names, summary, and HTML-escaping settings.
    
    These settings are configured in Admin > Articles > Classes > Select
    and editing the specific class.

diff --git a/share/html/Elements/ShowArticleFields b/share/html/Elements/ShowArticleFields
new file mode 100644
index 0000000000..afa7953769
--- /dev/null
+++ b/share/html/Elements/ShowArticleFields
@@ -0,0 +1,161 @@
+%# BEGIN BPS TAGGED BLOCK {{{
+%#
+%# COPYRIGHT:
+%#
+%# This software is Copyright (c) 1996-2020 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 }}}
+% $m->callback( CallbackName => 'BeforeCustomFields', Object => $Object,
+%               Grouping => $Grouping, ARGSRef => \%ARGS, CustomFields => $CustomFields, Table => $Table );
+% if ($Table) {
+<div>
+% }
+% while ( my $CustomField = $CustomFields->Next ) {
+% my $Values = $Object->CustomFieldValues( $CustomField->Id );
+% my $count = $Values->Count;
+% next if $HideEmpty and not $count;
+% my $CustomFieldName = $CustomField->Name;
+%#The following substitution replaces all non-ID_Continue characters with a dash character. The ID_Continue Unicode property was chosen because it (combined with ID_Start) is meant for variable names. ID_Continue includes characters suitable for use in CSS-class names (even non-Latin ones, to support non-English custom field names) and excludes syntactic characters that are not (such as whitespace characters).
+% $CustomFieldName =~ s/\P{ID_Continue}+/-/g;
+% my @classes = (
+%   'custom-field',
+%   'custom-field-'.$CustomField->id,
+%   'custom-field-'.$CustomFieldName,
+% );
+% push @classes, 'unset-field' if not $count;
+% $m->callback( CallbackName => 'ModifyFieldClasses', CustomField => $CustomField,
+%               Object => $Object, Classes => \@classes, Grouping => $Grouping );
+  <div class="form-row <% join(' ', @classes) %>" id="CF-<%$CustomField->id%>-ShowRow">
+% if ($HideFieldnames->{$CustomField->id}) {
+    <div class="value col-12 <% $count ? '' : ' no-value' %>">
+%} else {
+    <div class="label col-3"><% $CustomField->Name %>:</div>
+    <div class="value col-9 <% $count ? '' : ' no-value' %>">
+% }
+      <span class="current-value">
+% unless ( $count ) {
+<&|/l&>(no value)</&>
+% } elsif ( $count == 1 ) {
+%   $print_value->( $CustomField, $Values->First );
+% } else {
+<ul class="list-group list-group-compact">
+% while ( my $Value = $Values->Next ) {
+<li class="list-group-item">
+% $print_value->( $CustomField, $Value );
+</li>
+% }
+</ul>
+% }
+      </span>
+    </div>
+% $m->callback( CallbackName => 'AfterCustomFieldValue', CustomField => $CustomField,
+%               Object => $Object, Grouping => $Grouping, Table => $Table );
+  </div>
+% }
+% if ($Table) {
+</div>
+% }
+% $m->callback( CallbackName => 'AfterCustomFields', Object => $Object,
+%               Grouping => $Grouping, ARGSRef => \%ARGS, Table => $Table );
+<%INIT>
+$m->callback(
+    %ARGS,
+    CallbackName => 'MassageCustomFields',
+    Object       => $Object,
+    CustomFields => $CustomFields,
+    Table        => $Table,
+);
+
+$CustomFields->LimitToGrouping( $Object => $Grouping ) if defined $Grouping;
+
+# don't print anything if there is no custom fields
+return unless $CustomFields->First;
+$CustomFields->GotoFirstItem;
+
+my $print_value = sub {
+    my ($cf, $value) = @_;
+    my $linked = $value->LinkValueTo;
+    if ( defined $linked && length $linked ) {
+        my $linked = $m->interp->apply_escapes( $linked, 'h' );
+        $m->out('<a href="'. $linked .'" target="_blank">');
+    }
+    my $comp = "ShowCustomField". $cf->Type;
+    $m->callback(
+        CallbackName => 'ShowComponentName',
+        Name         => \$comp,
+        CustomField  => $cf,
+        Object       => $Object,
+        Table        => $Table,
+    );
+    if ( $m->comp_exists( $comp ) ) {
+        $m->comp( $comp, Object => $value, EscapeHTML => $EscapeHTML );
+    } else {
+        $m->out( $m->interp->apply_escapes( $value->Content, 'h' ) );
+    }
+    $m->out('</a>') if defined $linked && length $linked;
+
+    # This section automatically populates a div with the "IncludeContentForValue" for this custom
+    # field if it's been defined
+    if ( $cf->IncludeContentForValue ) {
+       my $vid = $value->id;
+       $m->out(   '<div class="object_cf_value_include" id="object_cf_value_'. $vid .'">' );
+       $m->out( loc("See also:") );
+       $m->out(   '<a href="'. $m->interp->apply_escapes($value->IncludeContentForValue, 'h') .'">' );
+       $m->out( $m->interp->apply_escapes($value->IncludeContentForValue, 'h') );
+       $m->out(   qq{</a></div>\n} );
+       $m->out(   qq{<script><!--\njQuery('#object_cf_value_$vid').load(} );
+       $m->out(   $m->interp->apply_escapes($value->IncludeContentForValue, 'j') );
+       $m->out(   qq{);\n--></script>\n} );
+    }
+};
+
+</%INIT>
+<%ARGS>
+$Object => undef
+$CustomFields => $Object->CustomFields
+$Grouping => undef
+$Table => 1
+$HideEmpty => 0
+$HideFieldnames => {}
+$EscapeHTML => 1
+</%ARGS>
diff --git a/share/html/Elements/ShowCustomFieldText b/share/html/Elements/ShowCustomFieldText
index 1bcd6febb9..ff597a8a57 100644
--- a/share/html/Elements/ShowCustomFieldText
+++ b/share/html/Elements/ShowCustomFieldText
@@ -46,11 +46,17 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <%init>
- my $content = $Object->LargeContent || $Object->Content;
- $content = $m->comp('/Elements/ScrubHTML', Content => $content);
- $content =~ s|\n|<br />|g;
+my $content = $Object->LargeContent || $Object->Content;
+if ($EscapeHTML) {
+    RT::Interface::Web::EscapeHTML(\$content);
+    $content =~ s|\n|<br />|g;
+} else {
+    $content = $m->comp('/Elements/ScrubHTML', Content => $content);
+    $content =~ s|\n|<br />|g;
+}
 </%init>
 <%$content|n%>
 <%ARGS>
 $Object
+$EscapeHTML => 0
 </%ARGS>
diff --git a/share/html/SelfService/Article/Display.html b/share/html/SelfService/Article/Display.html
index 83209b4308..079c93c092 100644
--- a/share/html/SelfService/Article/Display.html
+++ b/share/html/SelfService/Article/Display.html
@@ -47,8 +47,14 @@
 %# END BPS TAGGED BLOCK }}}
 <& /SelfService/Elements/Header, Title => $article->Name &>
 <div id="article-display-container" class="mx-auto max-width-md">
-<&| /Widgets/TitleBox, title => $article->Summary, class => 'article-display-simple', content_class => 'mx-auto width-md' &>
-<& /Elements/ShowCustomFields, Object => $article, CustomFields => $custom_fields &>
+<&| /Widgets/TitleBox, title => $article->Name, class => 'article-display-simple', content_class => 'mx-auto width-md' &>
+% if ($include{Summary}) {
+  <div class="form-row">
+  <div class="label col-3"><% loc("Summary") %>:</div>
+  <div class="value col-9"><% $article->Summary |h %></div>
+  </div>
+% }
+<& /Elements/ShowArticleFields, Object => $article, CustomFields => $custom_fields, HideFieldnames => \%hide_field_names, EscapeHTML => $include{EscapeHTML} &>
 </&>
 </div>
 <%init>
@@ -72,6 +78,7 @@ my $class = $article->ClassObj;
 # as the array of custom field IDs to limit by
 my %include = (Name => 1, Summary => 1, EscapeHTML => 1);
 my @exclude_cf_ids;
+my %hide_field_names;
 
 my $cfs = $article->CustomFields;
 while ( my $cf = $cfs->Next ) {
@@ -83,6 +90,9 @@ foreach my $key ( keys %include ) {
     if ($key =~ /^CF-Value-(\d+)$/ && !$include{$key}) {
         push(@exclude_cf_ids, $1);
     }
+    if ($key =~ /^CF-Title-(\d+)$/ && !$include{$key}) {
+        $hide_field_names{$1} = 1;
+    }
 }
 
 my $custom_fields = $article->CustomFields;

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


More information about the rt-commit mailing list