Skip to content

Commit

Permalink
Issue #2827: Copied frontend admin regex code from text to script.
Browse files Browse the repository at this point in the history
  • Loading branch information
stefanhaerter committed Jan 15, 2024
1 parent fea5c67 commit 4c05a03
Show file tree
Hide file tree
Showing 3 changed files with 202 additions and 0 deletions.
1 change: 1 addition & 0 deletions Kernel/Config/Files/XML/DynamicFields.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1712,6 +1712,7 @@
<Item Key="JavaScript">
<Array>
<Item>Core.Agent.Admin.DynamicField.js</Item>
<Item>Core.Agent.Admin.DynamicFieldText.js</Item>
<Item>Core.Agent.Admin.SysConfig.Entity.js</Item>
</Array>
</Item>
Expand Down
140 changes: 140 additions & 0 deletions Kernel/Modules/AdminDynamicFieldScript.pm
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,13 @@ sub _AddAction {
$GetParam{$ConfigParam} = [ $ParamObject->GetArray( Param => $ConfigParam ) ];
}

$GetParam{RegExCounter} = $ParamObject->GetParam( Param => 'RegExCounter' ) || 0;

my @RegExList = $Self->GetParamRegexList(
GetParam => \%GetParam,
Errors => \%Errors,
);

my $LayoutObject = $Kernel::OM->Get('Kernel::Output::HTML::Layout');

# uncorrectable errors
Expand Down Expand Up @@ -280,6 +287,8 @@ sub _AddAction {
map { $_ => $GetParam{$_} } qw(Tooltip Link LinkPreview Expression RequiredArgs AJAXTriggers UpdateEvents MultiValue),
);

$FieldConfig{RegExList} = \@RegExList;

# create a new field
my $FieldID = $DynamicFieldObject->DynamicFieldAdd(
Name => $GetParam{Name},
Expand Down Expand Up @@ -453,6 +462,13 @@ sub _ChangeAction {
$GetParam{$ConfigParam} = $ParamObject->GetParam( Param => $ConfigParam );
}

$GetParam{RegExCounter} = $ParamObject->GetParam( Param => 'RegExCounter' ) || 0;

my @RegExList = $Self->GetParamRegexList(
GetParam => \%GetParam,
Errors => \%Errors,
);

for my $FilterParam (qw(ObjectType Namespace)) {
$GetParam{ $FilterParam . 'Filter' } = $ParamObject->GetParam( Param => $FilterParam . 'Filter' );
}
Expand Down Expand Up @@ -584,6 +600,8 @@ sub _ChangeAction {
map { $_ => $GetParam{$_} } qw(Tooltip Link LinkPreview Interpreter Expression RequiredArgs AJAXTriggers UpdateEvents MultiValue),
);

$FieldConfig{RegExList} = \@RegExList;

# update dynamic field (FieldType and ObjectType cannot be changed; use old values)
my $UpdateSuccess = $DynamicFieldObject->DynamicFieldUpdate(
ID => $FieldID,
Expand Down Expand Up @@ -937,6 +955,59 @@ sub _ShowScreen {

my $DynamicFieldName = $DynamicField->{Name};

if ( !$Param{RegExCounter} ) {

my $RegExCounter = 0;
for my $RegEx ( @{ $FieldConfig->{RegExList} } ) {

$RegExCounter++;
$Param{ 'RegEx_' . $RegExCounter } = $RegEx->{Value};
$Param{ 'CustomerRegExErrorMessage_' . $RegExCounter } = $RegEx->{ErrorMessage};
}

$Param{RegExCounter} = $RegExCounter;
}

# NOTE check is necessary because previous block potentially alters $Param{RegExCounter}
if ( $Param{RegExCounter} ) {

REGEXENTRY:
for my $CurrentRegExEntryID ( 1 .. $Param{RegExCounter} ) {

# check existing regex
next REGEXENTRY if !$Param{ 'RegEx_' . $CurrentRegExEntryID };

$LayoutObject->Block(
Name => 'RegExRow',
Data => {
EntryCounter => $CurrentRegExEntryID,
RegEx => $Param{ 'RegEx_' . $CurrentRegExEntryID },
RegExServerError =>
$Param{ 'RegEx_' . $CurrentRegExEntryID . 'ServerError' }
|| '',
RegExServerErrorMessage =>
$Param{ 'RegEx_' . $CurrentRegExEntryID . 'ServerErrorMessage' } || '',
CustomerRegExErrorMessage =>
$Param{ 'CustomerRegExErrorMessage_' . $CurrentRegExEntryID },
CustomerRegExErrorMessageServerError =>
$Param{
'CustomerRegExErrorMessage_'
. $CurrentRegExEntryID
. 'ServerError'
}
|| '',
CustomerRegExErrorMessageServerErrorMessage =>
$Param{
'CustomerRegExErrorMessage_'
. $CurrentRegExEntryID
. 'ServerErrorMessage'
}
|| '',
}
);
}
}

# Add warning in case the DynamicField belongs a SysConfig setting.
my $SysConfigObject = $Kernel::OM->Get('Kernel::System::SysConfig');

Expand Down Expand Up @@ -1024,4 +1095,73 @@ sub _ShowScreen {
return $Output;
}

sub GetParamRegexList {
my ( $Self, %Param ) = @_;

my $GetParam = $Param{GetParam};
my $Errors = $Param{Errors};
my @RegExList;

# Check regex list
if ( $GetParam->{RegExCounter} && $GetParam->{RegExCounter} =~ m{\A\d+\z}xms ) {

my $ParamObject = $Kernel::OM->Get('Kernel::System::Web::Request');

REGEXENTRY:
for my $CurrentRegExEntryID ( 1 .. $GetParam->{RegExCounter} ) {

# check existing regex
$GetParam->{ 'RegEx_' . $CurrentRegExEntryID } = $ParamObject->GetParam( Param => 'RegEx_' . $CurrentRegExEntryID );

next REGEXENTRY if !$GetParam->{ 'RegEx_' . $CurrentRegExEntryID };

$GetParam->{ 'CustomerRegExErrorMessage_' . $CurrentRegExEntryID } = $ParamObject->GetParam( Param => 'CustomerRegExErrorMessage_' . $CurrentRegExEntryID );

my $RegEx = $GetParam->{ 'RegEx_' . $CurrentRegExEntryID };
my $CustomerRegExErrorMessage = $GetParam->{ 'CustomerRegExErrorMessage_' . $CurrentRegExEntryID };

# is the regex valid?
my $RegExCheck = eval {
qr{$RegEx}xms;
};

my $CurrentEntryErrors = 0;
if ($@) {
$Errors->{ 'RegEx_' . $CurrentRegExEntryID . 'ServerError' } = 'ServerError';

# cut last part of regex error
# 'Invalid regular expression (Unmatched [ in regex; marked by
# <-- HERE in m/aaa[ <-- HERE / at
# /opt/otobo/bin/cgi-bin/../../Kernel/Modules/AdminDynamicFieldText.pm line 452..
my $ServerErrorMessage = $@;
$ServerErrorMessage =~ s{ (in \s regex); .*$ }{ $1 }xms;
$Errors->{ 'RegEx_' . $CurrentRegExEntryID . 'ServerErrorMessage' } = $ServerErrorMessage;

$CurrentEntryErrors = 1;
}

# check required error message for regex
if ( !$CustomerRegExErrorMessage ) {
$Errors->{ 'CustomerRegExErrorMessage_' . $CurrentRegExEntryID . 'ServerError' } = 'ServerError';
$Errors->{
'CustomerRegExErrorMessage_'
. $CurrentRegExEntryID
. 'ServerErrorMessage'
} = Translatable('This field is required.');

$CurrentEntryErrors = 1;
}

next REGEXENTRY if $CurrentEntryErrors;

push @RegExList, {
'Value' => $RegEx,
'ErrorMessage' => $CustomerRegExErrorMessage,
};
}
}

return @RegExList;
}

1;
61 changes: 61 additions & 0 deletions Kernel/Output/HTML/Templates/Standard/AdminDynamicFieldScript.tt
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,67 @@
</div>
<div class="Clear"></div>
[% RenderBlockEnd("Link") %]
<label for="RegEx">[% Translate("Check RegEx") | html %]:</label>
<div class="Field RegExInsert">
<p class="FieldExplanation">
[% Translate("Here you can specify a regular expression to check the value. The regex will be executed with the modifiers xms.") | html %]
<br/>
[% Translate("Example") | html %]: ^[0-9]$
</p>
<input type="hidden" name="RegExCounter" value="[% Data.RegExCounter | html %]" id="RegExCounter" class="RegExCounter">
<div class="Spacing"></div>

[% RenderBlockStart("RegExRow") %]
<fieldset id="RegExRow_[% Data.EntryCounter | html %]" class="TableLike SpacingTop RegExRow W50pc">
<label class="Mandatory" for="RegEx_[% Data.EntryCounter | html %]"><span class="Marker">*</span>[% Translate("RegEx") | html %]:</label>
<div class="Field">
<input id="RegEx_[% Data.EntryCounter | html %]" class="W80pc [% Data.RegExServerError | html %] Validate_Required" type="text" maxlength="500" value="[% Data.RegEx | html %]" name="RegEx_[% Data.EntryCounter | html %]" />
<div id="RegEx_[% Data.EntryCounter | html %]Error" class="TooltipErrorMessage"><p>[% Translate("This field is required.") | html %]</p></div>
<div id="RegEx_[% Data.EntryCounter | html %]ServerError" class="TooltipErrorMessage"><p>[% Translate("Invalid RegEx") | html %]: [% Data.RegExServerErrorMessage | html %]</p></div>
</div>
<div class="Clear"></div>
<label class="Mandatory" for="CustomerRegExErrorMessage_[% Data.EntryCounter | html %]"><span class="Marker">*</span>[% Translate("Error Message") | html %]:</label>
<div class="Field">
<input id="CustomerRegExErrorMessage_[% Data.EntryCounter | html %]" class="W80pc [% Data.CustomerRegExErrorMessageServerError | html %] Validate_Required" type="text" maxlength="500" value="[% Data.CustomerRegExErrorMessage | html %]" name="CustomerRegExErrorMessage_[% Data.EntryCounter | html %]" />
<div id="CustomerRegExErrorMessage_[% Data.EntryCounter | html %]Error" class="TooltipErrorMessage"><p>[% Translate("This field is required.") | html %]</p></div>
<div id="CustomerRegExErrorMessage_[% Data.EntryCounter | html %]ServerError" class="TooltipErrorMessage"><p>[% Data.CustomerRegExErrorMessageServerErrorMessage | Translate | html %]</p></div>
<a id="RemoveRegEx_[% Data.EntryCounter | html %]" class="RemoveRegEx RemoveButton" href="#">
<i class="fa fa-minus-square-o"></i>
</a>
</div>
<div class="Clear"></div>
</fieldset>
[% RenderBlockEnd("RegExRow") %]
</div>

<fieldset class="RegExTemplate Hidden TableLike SpacingTop">
<label class="Mandatory W50pc" for="RegEx"><span class="Marker">*</span>[% Translate("RegEx") | html %]:</label>
<div class="Field">
<input id="RegEx" class="W80pc" type="text" maxlength="500" value="" name="RegEx" />
<div id="RegExError" class="TooltipErrorMessage"><p>[% Translate("This field is required.") | html %]</p></div>
<div id="RegExServerError" class="TooltipErrorMessage"><p>[% Data.RegExServerErrorMessage | Translate | html %]</p></div>
</div>
<div class="Clear"></div>
<label class="Mandatory" for="CustomerRegExErrorMessage"><span class="Marker">*</span>[% Translate("Error Message") | html %]:</label>
<div class="Field">
<input id="CustomerRegExErrorMessage" class="W80pc" type="text" maxlength="500" value="" name="CustomerRegExErrorMessage" />
<div id="CustomerRegExErrorMessageError" class="TooltipErrorMessage"><p>[% Translate("This field is required.") | html %]</p></div>
<div id="CustomerRegExErrorMessageServerError" class="TooltipErrorMessage"><p>[% Data.CustomerRegExErrorMessageServerErrorMessage | Translate | html %]</p></div>
<a id="RemoveRegEx" class="RemoveRegEx RemoveButton" href="#">
<i class="fa fa-minus-square-o"></i>
</a>
</div>
<div class="Clear"></div>
</fieldset>
<div class="Clear"></div>

<label for="AddRegEx">[% Translate("Add RegEx") | html %]:</label>
<div class="Field">
<a id="AddRegEx" href="#" class="AddButton">
<i class="fa fa-plus-square-o"></i>
</a>
</div>
<div class="Clear"></div>
<label for="MultiValue">[% Translate("Multiple Values") | html %]</label>
<div class="Field">
[% Data.MultiValueStrg %]
Expand Down

0 comments on commit 4c05a03

Please sign in to comment.