[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