Koha/koha-tmpl/intranet-tmpl/prog/en/modules/admin/matching-rules.tt
Jonathan Druart dcd1f5d48c Bug 13618: Add html filters to all the variables
Here we go, next step then.
As we did not fix the performance issue when autofiltering
the variables (see bug 20975), the only solution we have is to add the
filters explicitely.

This patch has been autogenerated (using add_html_filters.pl, see next
pathces) and add the html filter to all the variables displayed in the
template.
Exceptions are made (using the new 'raw' TT filter) to the variable we
already listed in the previous versions of this patch.

To test:
- Use t/db_dependent/Koha/Patrons.t to populate your DB with autogenerated
data which contain <script> tags

- Remove them from borrower_debarments.comments (there are allowed here)
update  borrower_debarments set comment="html tags possible here";

- From the interface hit page and try to catch alert box.
If you find one it means you find a possible XSS.
To know where it comes from:
* note the exact URL where you found it
* note the alert box content
* Dump your DB and search for the string in the dump to identify its
location (for instance table.field)

Next:
* Ideally we would like to use the raw filter when it is not necessary
to HTML escape the variables (in big loop for instance)
* Provide a QA script to catch missing filters (we want html, uri, url
or raw, certainly others that I am forgetting now)
* Replace the html filters with uri when needed (!)

Signed-off-by: Owen Leonard <oleonard@myacpl.org>

Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>

Signed-off-by: Nick Clemens <nick@bywatersolutions.com>
2018-08-17 15:55:05 +00:00

729 lines
34 KiB
Text

[% USE raw %]
[% USE Asset %]
[% SET footerjs = 1 %]
[% INCLUDE 'doc-head-open.inc' %]
<title>Koha &rsaquo; Administration &rsaquo; Record matching rules
[% IF ( matching_rule_form ) %]
[% IF ( edit_matching_rule ) %]
&rsaquo; Modify record matching rule
[% ELSE %]
&rsaquo; Add record matching rule
[% END %]
[% END %]
[% IF ( delete_matching_rule_form ) %]
&rsaquo; Confirm deletion of record matching rule &quot;[% code | html %]&quot;
[% END %]
</title>
[% INCLUDE 'doc-head-close.inc' %]
[% BLOCK norms_text %]
[% SWITCH norm %]
[% CASE 'none' %]None
[% CASE 'remove_spaces' %]Remove spaces
[% CASE 'upper_case' %]Uppercase
[% CASE 'lower_case' %]Lowercase
[% CASE 'legacy_default' %]Legacy default
[% CASE %][% norm | html %]
[% END %]
[% END %]
[% BLOCK norms_options %]
[%# PARAMS: selected_norm %]
[% FOREACH norm IN valid_norms %]
[% IF ( norm == selected_norm ) %]
<option value="[% norm | html %]" selected="selected">[% PROCESS norms_text norm=norm %]</option>
[% ELSE %]
<option value="[% norm | html %]">[% PROCESS norms_text norm=norm %]</option>
[% END %]
[% END %]
[% END %]
[% BLOCK norms_select %]
[%# PARAMS: selected_norm, id, name %]
[% UNLESS valid_norms.grep(selected_norm).size %]
[%# Fallback to 'none' %]
[% selected_norm = 'none' | html %]
[% END %]
<select id="[% id | html %]" name="[% name | html %]">
[% PROCESS norms_options selected_norm=selected_norm %]
</select>
[% END %]
<style type="text/css">
fieldset.rows fieldset.rows { border-width : 0; }
fieldset.rows fieldset.rows fieldset.rows { border-width : 1px; }
fieldset, fieldset.rows { width : 90%; padding: .3em .6em .3em .6em; }
fieldset.rows fieldset {font-size:100%;}
div.matchgroup { border:1px solid #DDD; border-left-width: 15px; padding:.4em; margin-bottom:.6em;}
</style>
</head>
<body id="admin_matching-rules" class="admin">
[% INCLUDE 'header.inc' %]
[% INCLUDE 'prefs-admin-search.inc' %]
<div id="breadcrumbs"><a href="/cgi-bin/koha/mainpage.pl">Home</a> &rsaquo; <a href="/cgi-bin/koha/admin/admin-home.pl">Administration</a> &rsaquo; [% IF ( display_list ) %]Record matching rules[% ELSE %]<a href="/cgi-bin/koha/admin/matching-rules.pl">Record matching rules</a>[% END %]
[% IF ( matching_rule_form ) %]
[% IF ( edit_matching_rule ) %]
&rsaquo; Modify record matching rule
[% ELSE %]
&rsaquo; Add record matching rule
[% END %]
[% END %]
[% IF ( delete_matching_rule_form ) %]
&rsaquo; Confirm deletion of record matching rule &quot;[% code | html %]&quot;
[% END %]
</div>
<div id="doc3" class="yui-t2">
<div id="bd">
<div id="yui-main">
<div class="yui-b">
[% IF ( matching_rule_form ) %]
[% IF ( edit_matching_rule ) %]
<h2>Modify record matching rule</h2>
[% ELSE %]
<h2>Add record matching rule</h2>
[% END %]
<form action="[% script_name | html %]" name="Aform" method="post">
<input type="hidden" name="op" value="[% confirm_op | html %]" />
<fieldset class="rows">
<ol>
<li>
[% IF ( edit_matching_rule ) %]
<span class="label">Matching rule code: </span>
<input type="hidden" name="matcher_id" value="[% matcher_id | html %]" />
<input type="hidden" name="code" value="[% code | html %]" />
[% code | html %]
[% ELSE %]
<label for="code" class="required">Matching rule code: </label>
<input type="text" id="code" name="code" size="10" maxlength="10" /> <span class="required">Required</span>
[% END %]
</li>
<li><label for="description" class="required">Description: </label>
<input type="text" id="description" name="description" size="50" maxlength="250"
value="[% description | html %]" /> <span class="required">Required</span>
</li>
<li><label for="threshold" class="required">Match threshold: </label>
<input type="text" id="threshold" name="threshold" size="5" maxlength="5"
value="[% threshold | html %]" /> <span class="required">Required</span>
</li>
<li><label for="record_type" class="required">Record type: </label>
<select id="record_type" name="record_type">
[% IF ( record_type == "authority" ) %]
<option value="biblio">Bibliographic record</option>
<option value="authority" selected="selected">Authority record</option>
[% ELSE %]
<option value="biblio" selected="selected">Bibliographic record</option>
<option value="authority">Authority record</option>
[% END %]
</select><span class="required">Required</span>
</li>
</ol>
</fieldset>
<fieldset class="rows" id="match_points">
<h4>Match points</h4>
[% IF ( edit_matching_rule ) %]
[% IF ( matchpoints ) %]<p id="addMatchPoint" style="display:none;">[% ELSE %]<p id="addMatchPoint">[% END %]<a href="#" class="button" onclick="InsertMatchpoint('mp_1', 'mp_template'); return false;">Add match point</a></p>
[% ELSE %]<p id="addMatchPoint" style="display:none;"><a href="#" class="button" onclick="InsertMatchpoint('mp_1', 'mp_template'); return false;">Add match point</a></p>[% END %]
[% IF ( edit_matching_rule ) %]
[% FOREACH matchpoint IN matchpoints %]
<div id="mp_[% matchpoint.mp_num | html %]" class="matchgroup">
<fieldset class="rows">
<legend>Match point [% matchpoint.mp_num | html %] | <a href="#" class="button" onclick="InsertMatchpoint('mp_[% matchpoint.mp_num | html %]', 'mp_template'); return false;">Add match point</a> | <a href="#" class="button" onclick="DeleteMatchpoint(this); return false;">Remove this match point</a></legend>
<ol>
<li>
<label for="mp_[% matchpoint.mp_num | html %]_search_index">Search index: </label>
<input type ="text" id="mp_[% matchpoint.mp_num | html %]_search_index"
name="mp_[% matchpoint.mp_num | html %]_search_index" size="20"
value="[% matchpoint.index | html %]"
maxlength="30" />
</li>
<li>
<label for="mp_[% matchpoint.mp_num | html %]_score">Score: </label>
<input type ="text" id="mp_[% matchpoint.mp_num | html %]_score"
name="mp_[% matchpoint.mp_num | html %]_score" size="5"
value="[% matchpoint.score | html %]"
maxlength="5" />
</li>
</ol>
[% FOREACH component IN matchpoint.components %]
<fieldset class="rows" id="mp_[% matchpoint.mp_num | html %]_c_[% component.comp_num | html %]">
<legend>Matchpoint components</legend>
<ol>
<li>
<label for="mp_[% matchpoint.mp_num | html %]_c_[% component.comp_num | html %]_tag">Tag: </label>
<input type="text" id="mp_[% matchpoint.mp_num | html %]_c_[% component.comp_num | html %]_tag"
name="mp_[% matchpoint.mp_num | html %]_c_[% component.comp_num | html %]_tag"
value="[% component.tag | html %]"
size="3" maxlength="3" />
</li>
<li>
<label for="mp_[% matchpoint.mp_num | html %]_c_[% component.comp_num | html %]_subfields">Subfields: </label>
<input type="text" id="mp_[% matchpoint.mp_num | html %]_c_[% component.comp_num | html %]_subfields"
name="mp_[% matchpoint.mp_num | html %]_c_[% component.comp_num | html %]_subfields"
value="[% component.subfields | html %]"
size="10" maxlength="40" />
</li>
<li>
<label for="mp_[% matchpoint.mp_num | html %]_c_[% component.comp_num | html %]_offset">Offset: </label>
<input type="text" id="mp_[% matchpoint.mp_num | html %]_c_[% component.comp_num | html %]_offset"
name="mp_[% matchpoint.mp_num | html %]_c_[% component.comp_num | html %]_offset"
value="[% component.offset | html %]"
size="5" maxlength="5" />
</li>
<li>
<label for="mp_[% matchpoint.mp_num | html %]_c_[% component.comp_num | html %]_length">Length: </label>
<input type="text" id="mp_[% matchpoint.mp_num | html %]_c_[% component.comp_num | html %]_length"
name="mp_[% matchpoint.mp_num | html %]_c_[% component.comp_num | html %]_length"
value="[% component.length | html %]"
size="5" maxlength="5" />
</li>
[% FOREACH norm IN component.norms %]
<li id="mp_[% matchpoint.mp_num | html %]_c_[% component.comp_num | html %]_n_[% norm.norm_num | html %]">
<label for="mp_[% matchpoint.mp_num | html %]_c_[% component.comp_num | html %]_n__[% norm.norm_num | html %]_norm">Normalization rule: </label>
[%# Note: Following directive in one line, otherwise we have translatabiltiy problems %]
[% PROCESS norms_select selected_norm=norm.norm id="mp_${norm.mp_num}_c_${component.comp_num}_n__${norm.norm_num}_norm" name="mp_${matchpoint.mp_num}_c_${component.comp_num}_n_${norm.norm_num}_norm" %]
</li>
[% END %]
</ol>
</fieldset>
[% END %]
</fieldset>
<br style="clear:both;" />
</div>
</fieldset>
[% END %]
[% ELSE %]
<div id="mp_1" class="matchgroup">
<fieldset class="rows">
<legend>Match point 1 | <a href="#" class="button" onclick="InsertMatchpoint('mp_1', 'mp_template'); return false;">Add match point</a> | <a href="#" class="button" onclick="DeleteMatchpoint(this); return false;">Remove this match point</a></legend>
<ol>
<li>
<label for="mp_1_search_index">Search index: </label>
<input type ="text" id="mp_1_search_index" name="mp_1_search_index" size="20"
maxlength="30" />
</li>
<li>
<label for="mp_1_score">Score: </label>
<input type ="text" id="mp_1_score" name="mp_1_score" size="5" maxlength="5" />
</li>
</ol>
<fieldset class="rows" id="mp_1_c_1">
<legend>Matchpoint components</legend>
<ol>
<li>
<label for="mp_1_c_1_tag">Tag: </label>
<input type="text" id="mp_1_c_1_tag" name="mp_1_c_1_tag" size="3" maxlength="3" />
</li>
<li>
<label for="mp_1_c_1_subfields">Subfields: </label>
<input type="text" id="mp_1_c_1_subfields" name="mp_1_c_1_subfields" size="10" maxlength="40" />
</li>
<li>
<label for="mp_1_c_1_offset">Offset: </label>
<input type="text" id="mp_1_c_1_offset" name="mp_1_c_1_offset" size="5" maxlength="5" />
</li>
<li>
<label for="mp_1_c_1_length">Length: </label>
<input type="text" id="mp_1_c_1_length" name="mp_1_c_1_length" size="5" maxlength="5" />
</li>
<li id="mp_1_c_1_n_1">
<label for="mp_1_c_1_n_1_norm">Normalization rule: </label>
[% PROCESS norms_select selected_norm="none" id="mp_1_c_1_n_1_norm" name="mp_1_c_1_n_1_norm" %]
</li>
</ol>
</fieldset>
</fieldset>
<br style="clear:both;" />
</div>
</fieldset>
[% END %]
<fieldset class="rows" id="match_checks">
<h4>Required match checks</h4>
[% IF ( edit_matching_rule ) %]
[% IF ( matchchecks ) %]<p id="addMatchCheck" style="display:none;">[% ELSE %]<p id="addMatchCheck">[% END %]<a href="#" class="button" onclick="InsertMatchcheck('mc_1', 'mc_template'); return false;">Add match check</a></p>
[% ELSE %]<p id="addMatchCheck" style="display:none;"><a href="#" class="button" onclick="InsertMatchcheck('mc_1', 'mc_template'); return false;">Add match check</a></p>[% END %]
[% IF ( edit_matching_rule ) %]
[% FOREACH matchcheck IN matchchecks %]
<div id="mc_[% matchcheck.mc_num | html %]" class="matchgroup">
<fieldset class="rows">
<legend>Match check [% matchcheck.mc_num | html %]<a href="#" class="button" onclick="InsertMatchcheck('mc_[% matchcheck.mc_num | html %]', 'mc_template'); return false;">Add match check</a> | <a href="#" class="button" onclick="DeleteMatchcheck(this); return false;">Remove this match check</a></legend>
<input type="hidden" id="mc_[% matchcheck.mc_num | html %]_id" name="mc_[% matchcheck.mc_num | html %]_id" value="1" />
[% FOREACH src_component IN matchcheck.src_components %]
<fieldset class="rows" id="mc_[% src_component.mc_num | html %]_src_c_[% src_component.comp_num | html %]">
<legend>Source (incoming) record check field</legend>
<ol>
<li>
<label for="mc_[% src_component.mc_num | html %]_src_c_[% src_component.comp_num | html %]_tag">Tag: </label>
<input type="text" id="mc_[% matchcheck.mc_num | html %]_src_c_[% src_component.comp_num | html %]_tag"
name="mc_[% matchcheck.mc_num | html %]_src_c_[% src_component.comp_num | html %]_tag"
value="[% src_component.tag | html %]"
size="3" maxlength="3" />
</li>
<li>
<label for="mc_[% matchcheck.mc_num | html %]_src_c_[% src_component.comp_num | html %]_subfields">Subfields: </label>
<input type="text" id="mc_[% matchcheck.mc_num | html %]_src_c_[% src_component.comp_num | html %]_subfields"
name="mc_[% matchcheck.mc_num | html %]_src_c_[% src_component.comp_num | html %]_subfields"
value="[% src_component.subfields | html %]"
size="10" maxlength="40" />
</li>
<li>
<label for="mc_[% matchcheck.mc_num | html %]_src_c_[% src_component.comp_num | html %]_offset">Offset: </label>
<input type="text" id="mc_[% matchcheck.mc_num | html %]_src_c_[% src_component.comp_num | html %]_offset"
name="mc_[% matchcheck.mc_num | html %]_src_c_[% src_component.comp_num | html %]_offset"
value="[% src_component.offset | html %]"
size="5" maxlength="5" />
</li>
<li>
<label for="mc_[% matchcheck.mc_num | html %]_src_c_[% src_component.comp_num | html %]_length">Length: </label>
<input type="text" id="mc_[% matchcheck.mc_num | html %]_src_c_[% src_component.comp_num | html %]_length"
name="mc_[% matchcheck.mc_num | html %]_src_c_[% src_component.comp_num | html %]_length"
value="[% src_component.length | html %]"
size="5" maxlength="5" />
</li>
[% FOREACH norm IN src_component.norms %]
<li id="mc_[% matchcheck.mc_num | html %]_src_c_[% src_component.comp_num | html %]_n_[% norm.norm_num | html %]">
<label for="mc_[% matchcheck.mc_num | html %]_src_c_[% src_component.comp_num | html %]_n_[% norm.norm_num | html %]_norm">Normalization rule: </label>
[%# Note: Following directive in one line, otherwise we have translatabiltiy problems %]
[% PROCESS norms_select selected_norm=norm.norm id="mc_${matchcheck.mc_num}_src_c_${src_component.comp_num}_n_${norm.norm_num}_norm" name="mc_${matchcheck.mc_num}_src_c_${src_component.comp_num}_n_${norm.norm_num}_norm" %]
</li>
[% END %]
</ol>
</fieldset>
[% END %]
[% FOREACH tgt_component IN matchcheck.tgt_components %]
<fieldset class="rows" id="mc_[% matchcheck.mc_num | html %]_tgt_c_[% tgt_component.comp_num | html %]">
<legend>Target (database) record check field</legend>
<ol>
<li>
<label for="mc_[% matchcheck.mc_num | html %]_tgt_c_[% tgt_component.comp_num | html %]_tag">Tag: </label>
<input type="text" id="mc_[% matchcheck.mc_num | html %]_tgt_c_[% tgt_component.comp_num | html %]_tag"
name="mc_[% matchcheck.mc_num | html %]_tgt_c_[% tgt_component.comp_num | html %]_tag"
value="[% tgt_component.tag | html %]"
size="3" maxlength="3" />
</li>
<li>
<label for="mc_[% matchcheck.mc_num | html %]_tgt_c_[% tgt_component.comp_num | html %]_subfields">Subfields: </label>
<input type="text" id="mc_[% matchcheck.mc_num | html %]_tgt_c_[% tgt_component.comp_num | html %]_subfields"
name="mc_[% matchcheck.mc_num | html %]_tgt_c_[% tgt_component.comp_num | html %]_subfields"
value="[% tgt_component.subfields | html %]"
size="10" maxlength="40" />
</li>
<li>
<label for="mc_[% matchcheck.mc_num | html %]_tgt_c_[% tgt_component.comp_num | html %]_offset">Offset: </label>
<input type="text" id="mc_[% matchcheck.mc_num | html %]_tgt_c_[% tgt_component.comp_num | html %]_offset"
name="mc_[% matchcheck.mc_num | html %]_tgt_c_[% tgt_component.comp_num | html %]_offset"
value="[% tgt_component.offset | html %]"
size="5" maxlength="5" />
</li>
<li>
<label for="mc_[% matchcheck.mc_num | html %]_tgt_c_[% tgt_component.comp_num | html %]_length">Length: </label>
<input type="text" id="mc_[% matchcheck.mc_num | html %]_tgt_c_[% tgt_component.comp_num | html %]_length"
name="mc_[% matchcheck.mc_num | html %]_tgt_c_[% tgt_component.comp_num | html %]_length"
value="[% tgt_component.length | html %]"
size="5" maxlength="5" />
</li>
[% FOREACH norm IN tgt_component.norms %]
<li id="mc_[% matchcheck.mc_num | html %]_tgt_c_[% tgt_component.comp_num | html %]_n_[% norm.norm_num | html %]">
<label for="mc_[% matchcheck.mc_num | html %]_tgt_c_[% tgt_component.comp_num | html %]_n_[% norm.norm_num | html %]_norm">Normalization rule: </label>
[%# Note: Following directive in one line, otherwise we have translatabiltiy problems %]
[% PROCESS norms_select selected_norm=norm.norm id="mc_${matchcheck.mc_num}_tgt_c_${tgt_component.comp_num}_n_${norm.norm_num}_norm" name="mc_${matchcheck.mc_num}_tgt_c_${tgt_component.comp_num}_n_${norm.norm_num}_norm" %]
</li>
[% END %]
</ol>
</fieldset>
[% END %]
</fieldset>
<br style="clear:both;" />
</div>
[% END %]
[% ELSE %]
<div id="mc_1" class="matchgroup">
<fieldset class="rows">
<legend>Match check 1 | <a href="#" class="button" onclick="InsertMatchcheck('mc_1', 'mc_template'); return false;">Add match check</a> | <a href="#" class="button" onclick="DeleteMatchcheck(this); return false;">Remove this match check</a></legend>
<input type="hidden" id="mc_1_id" name="mc_1_id" value="1" />
<fieldset class="rows" id="mc_1_src_c_1">
<legend>Source (incoming) record check field</legend>
<ol>
<li>
<label for="mc_1_src_c_1_tag">Tag: </label>
<input type="text" id="mc_1_src_c_1_tag" name="mc_1_src_c_1_tag" size="3" maxlength="3" />
</li>
<li>
<label for="mc_1_src_c_1_subfields">Subfields: </label>
<input type="text" id="mc_1_src_c_1_subfields" name="mc_1_src_c_1_subfields" size="10" maxlength="40" />
</li>
<li>
<label for="mc_1_src_c_1_offset">Offset: </label>
<input type="text" id="mc_1_src_c_1_offset" name="mc_1_src_c_1_offset" size="5" maxlength="5" />
</li>
<li>
<label for="mc_1_src_c_1_length">Length: </label>
<input type="text" id="mc_1_src_c_1_length" name="mc_1_src_c_1_length" size="5" maxlength="5" />
</li>
<li id="mc_1_src_c_1_n_1">
<label for="mc_1_src_c_1_n_1_norm">Normalization rule: </label>
[% PROCESS norms_select selected_norm="none" id="mc_1_src_c_1_n_1_norm" name="mc_1_src_c_1_n_1_norm" %]
</li>
</ol>
</fieldset>
<fieldset class="rows" id="mc_1_tgt_c_1">
<legend>Target (database) record check field</legend>
<ol>
<li>
<label for="mc_1_tgt_c_1_tag">Tag: </label>
<input type="text" id="mc_1_tgt_c_1_tag" name="mc_1_tgt_c_1_tag" size="3" maxlength="3" />
</li>
<li>
<label for="mc_1_tgt_c_1_subfields">Subfields: </label>
<input type="text" id="mc_1_tgt_c_1_subfields" name="mc_1_tgt_c_1_subfields" size="10" maxlength="40" />
</li>
<li>
<label for="mc_1_tgt_c_1_offset">Offset: </label>
<input type="text" id="mc_1_tgt_c_1_offset" name="mc_1_tgt_c_1_offset" size="5" maxlength="5" />
</li>
<li>
<label for="mc_1_tgt_c_1_length">Length: </label>
<input type="text" id="mc_1_tgt_c_1_length" name="mc_1_tgt_c_1_length" size="5" maxlength="5" />
</li>
<li id="mc_1_tgt_c_1_n_1">
<label for="mc_1_tgt_c_1_n_1_norm">Normalization rule: </label>
[% PROCESS norms_select selected_norm="none" id="mc_1_tgt_c_1_n_1_norm" name="mc_1_tgt_c_1_n_1_norm" %]
</li>
</ol>
</fieldset>
</fieldset>
<br style="clear:both;" />
</div>
[% END %]
</fieldset>
<fieldset class="action">
[% IF ( edit_matching_rule ) %]
<input type="button" value="Save"
onclick="CheckMatchingRuleForm(this.form)" />
[% ELSE %]
<input type="button" value="Save"
onclick="CheckMatchingRuleForm(this.form)" />
[% END %]
<a class="cancel" href="/cgi-bin/koha/admin/matching-rules.pl">Cancel</a>
</fieldset>
</form>
[% END %]
[% IF ( delete_matching_rule_form ) %]
<div class="dialog alert">
<h3>Confirm deletion of record matching rule <span class="ex">'[% code | html %]' ([% description | html %])</span>?</h3>
<form action="[% script_name | html %]" name="Aform" method="post">
<input type="hidden" name="op" value="[% confirm_op | html %]" />
<input type="hidden" name="matcher_id" value="[% matcher_id | html %]" />
<button type="submit" class="approve"><i class="fa fa-fw fa-check"></i> Yes, delete record matching rule</button>
</form>
<form action="[% script_name | html %]" method="get">
<button type="submit" class="deny"><i class="fa fa-fw fa-remove"></i> No, do not delete</button>
</form>
</div>
[% END %]
[% IF ( display_list ) %]
<div id="toolbar" class="btn-toolbar">
<a class="btn btn-default btn-sm" id="newrule" href="[% script_name | html %]?op=add_matching_rule"><i class="fa fa-plus"></i> New record matching rule</a>
</div>
<h2>Record matching rules</h2>
[% IF ( added_matching_rule ) %]
<div class="dialog message">Added record matching rule &quot;[% added_matching_rule | html %]&quot;</div>
[% END %]
[% IF ( edited_matching_rule ) %]
<div class="dialog message">Modified record matching rule &quot;[% edited_matching_rule | html %]&quot;</div>
[% END %]
[% IF ( deleted_matching_rule ) %]
<div class="dialog message">Deleted record matching rule &quot;[% deleted_matching_rule | html %]&quot;</div>
[% END %]
[% IF ( available_matching_rules ) %]<table>
<tr>
<th>#</th>
<th>Code</th>
<th>Description</th>
<th>Actions</th>
</tr>
[% FOREACH available_matching_rule IN available_matching_rules %]
<tr>
<td>[% available_matching_rule.matcher_id | html %]</td>
<td>[% available_matching_rule.code | html %]</td>
<td>[% available_matching_rule.description | html %]</td>
<td class="actions">
<a class="btn btn-default btn-xs" href="[% available_matching_rule.script_name | html %]?op=edit_matching_rule&amp;matcher_id=[% available_matching_rule.matcher_id | html %]"><i class="fa fa-pencil"></i> Edit</a>
<a class="btn btn-default btn-xs" href="[% available_matching_rule.script_name | html %]?op=delete_matching_rule&amp;matcher_id=[% available_matching_rule.matcher_id | html %]"><i class="fa fa-trash"></i> Delete</a>
</td>
</tr>
[% END %]
</table>[% ELSE %]<p>There are no saved matching rules.</p>[% END %]
<div class="pages">[% pagination_bar | $raw %]</div>
[% END %]
[% IF ( matching_rule_form ) %]
<div id="mp_template" class="matchgroup" style="display:none;">
<fieldset class="rows">
<legend>Match point <span class="counter"></span> | <a href="#" class="button" onclick="DeleteMatchpoint(this); return false;">Remove this match point</a></legend>
<ol>
<li>
<label for="mp_num_search_index">Search index: </label>
<input type ="text" id="mp_num_search_index" name="mp_num_search_index" size="20"
maxlength="30" />
</li>
<li>
<label for="mp_num_score">Score: </label>
<input type ="text" id="mp_num_score" name="mp_num_score" size="5" maxlength="5" />
</li>
</ol>
<fieldset id="mp_num_c_1" class="rows">
<legend>Matchpoint components</legend>
<ol>
<li>
<label for="mp_num_c_1_tag">Tag: </label>
<input type="text" id="mp_num_c_1_tag" name="mp_num_c_1_tag" size="3" maxlength="3" />
</li>
<li>
<label for="mp_num_c_1_subfields">Subfields: </label>
<input type="text" id="mp_num_c_1_subfields" name="mp_num_c_1_subfields" size="10" maxlength="40" />
</li>
<li>
<label for="mp_num_c_1_offset">Offset: </label>
<input type="text" id="mp_num_c_1_offset" name="mp_num_c_1_offset" size="5" maxlength="5" />
</li>
<li>
<label for="mp_num_c_1_length">Length: </label>
<input type="text" id="mp_num_c_1_length" name="mp_num_c_1_length" size="5" maxlength="5" />
</li>
<li id="mp_num_c_1_n_1">
<label for="mp_num_c_1_n_1_norm">Normalization rule: </label>
[% PROCESS norms_select selected_norm="none" id="mp_num_c_1_n_1_norm" name="mp_num_c_1_n_1_norm" %]
</li>
</ol>
</fieldset>
</fieldset>
<br style="clear:both;" />
</div>
<div id="mc_template" class="matchgroup" style="display:none">
<fieldset class="rows">
<legend>Match check <span class="counter"></span> | <a href="#" class="button" onclick="DeleteMatchcheck(this); return false;">Remove this match check</a></legend>
<input type="hidden" id="mc_num_id" name="mc_num_id" value="1" />
<fieldset class="rows" id="mc_num_src_c_1">
<legend>Source (incoming) record check field</legend>
<ol>
<li>
<label for="mc_num_src_c_1_tag">Tag: </label>
<input type="text" id="mc_num_src_c_1_tag" name="mc_num_src_c_1_tag" size="3" maxlength="3" />
</li>
<li>
<label for="mc_num_src_c_1_subfields">Subfields: </label>
<input type="text" id="mc_num_src_c_1_subfields" name="mc_num_src_c_1_subfields" size="10" maxlength="40" />
</li>
<li>
<label for="mc_num_src_c_1_offset">Offset: </label>
<input type="text" id="mc_num_src_c_1_offset" name="mc_num_src_c_1_offset" size="5" maxlength="5" />
</li>
<li>
<label for="mc_num_src_c_1_length">Length: </label>
<input type="text" id="mc_num_src_c_1_length" name="mc_num_src_c_1_length" size="5" maxlength="5" />
</li>
<li id="mc_num_src_c_1_n_1">
<label for="mc_num_src_c_1_n_1_norm">Normalization rule: </label>
[% PROCESS norms_select selected_norm="none" id="mc_num_src_c_1_n_1_norm" name="mc_num_src_c_1_n_1_norm" %]
</li>
</ol>
</fieldset>
<fieldset class="rows" id="mc_num_tgt_c_1">
<legend>Target (database) record check field</legend>
<ol>
<li>
<label for="mc_num_tgt_c_1_tag">Tag: </label>
<input type="text" id="mc_num_tgt_c_1_tag" name="mc_num_tgt_c_1_tag" size="3" maxlength="3" />
</li>
<li>
<label for="mc_num_tgt_c_1_subfields">Subfields: </label>
<input type="text" id="mc_num_tgt_c_1_subfields" name="mc_num_tgt_c_1_subfields" size="10" maxlength="40" />
</li>
<li>
<label for="mc_num_tgt_c_1_offset">Offset: </label>
<input type="text" id="mc_num_tgt_c_1_offset" name="mc_num_tgt_c_1_offset" size="5" maxlength="5" />
</li>
<li>
<label for="mc_num_tgt_c_1_length">Length: </label>
<input type="text" id="mc_num_tgt_c_1_length" name="mc_num_tgt_c_1_length" size="5" maxlength="5" />
</li>
<li id="mc_num_tgt_c_1_n_1">
<label for="mc_num_tgt_c_1_n_1_norm">Normalization rule: </label>
[% PROCESS norms_select selected_norm="none" id="mc_num_tgt_c_1_n_1_norm" name="mc_num_tgt_c_1_n_1_norm" %]
</li>
</ol>
</fieldset>
</fieldset>
<br style="clear:both;" />
</div>
[% END %]
</div>
</div>
<div class="yui-b">
[% INCLUDE 'admin-menu.inc' %]
</div>
</div>
[% MACRO jsinclude BLOCK %]
[% Asset.js("js/admin-menu.js") | $raw %]
<script type="text/javascript">
var maxMatchPoint = [% max_matchpoint | html %];
var maxMatchCheck = [% max_matchcheck | html %];
function InsertMatchpoint(loc, index) {
var original= $("#"+index);
var clone = original.clone();
clone.show();
// update IDs and form names
maxMatchPoint++;
clone.attr('id', 'mp_' + maxMatchPoint);
$("span.counter",clone).html(maxMatchPoint);
$("label",clone).each(function(){
var s = $(this).attr("for");
if (s.match(/mp_num/)) {
$(this).attr("for",s.replace(/mp_num/, 'mp_' + maxMatchPoint));
}
});
$("div",clone).each(function(){
var s = $(this).attr("id");
if (s.match(/mp_num/)) {
$(this).attr("id",s.replace(/mp_num/, 'mp_' + maxMatchPoint));
}
});
$("input",clone).each(function(){
var s = $(this).attr("id");
if(s.match(/mp_num/)){
$(this).attr("id",s.replace(/mp_num/, 'mp_' + maxMatchPoint));
}
var s = $(this).attr("name");
if(s.match(/mp_num/)){
$(this).attr("name",s.replace(/mp_num/, 'mp_' + maxMatchPoint));
}
});
$("#match_points").append(clone);
}
function InsertMatchcheck(loc, index) {
var original= $("#"+index);
var clone = original.clone();
clone.show();
// update IDs and form names
maxMatchCheck++;
clone.attr('id', 'mc_' + maxMatchCheck);
$("span.counter",clone).html(maxMatchCheck);
$("label",clone).each(function(){
var s = $(this).attr("for");
if (s.match(/mc_num/)) {
$(this).attr("for",s.replace(/mc_num/, 'mc_' + maxMatchCheck));
}
});
$("div",clone).each(function(){
var s = $(this).attr("id");
if (s.match(/mc_num/)) {
$(this).attr("id",s.replace(/mc_num/, 'mc_' + maxMatchCheck));
}
});
$("input",clone).each(function(){
var s = $(this).attr("id");
if(s.match(/mc_num/)){
$(this).attr("id",s.replace(/mc_num/, 'mc_' + maxMatchCheck));
}
var s = $(this).attr("name");
if(s.match(/mc_num/)){
$(this).attr("name",s.replace(/mc_num/, 'mc_' + maxMatchCheck));
}
});
$("#match_checks").append(clone);
}
function DeleteMatchpoint(loc) {
$(loc).parent().parent().parent().remove();
if($(".matchgroup",$("#match_points")).length == 0){
maxMatchPoint = 0;
$("#addMatchPoint").show();
}
}
function DeleteMatchcheck(loc) {
$(loc).parent().parent().parent().remove();
if($(".matchgroup",$("#match_checks")).length == 0){
maxMatchCheck = 0;
$("#addMatchCheck").show();
}
}
function DoCancel(f) {
f.op.value='';
document.Aform.submit();
}
function CheckMatchingRuleForm(f) {
var ok=1;
var _alertString="";
var alertString2;
if (f.code.value.length==0) {
_alertString += "\n- " + _("Matching rule code missing");
}
if (f.description.value.length==0) {
_alertString += "\n- " + _("Description missing");
}
if (f.threshold.value.length==0) {
_alertString += "\n- " + _("Threshold missing");
}
if (_alertString.length==0) {
document.Aform.submit();
} else {
alertString2 = _("Form not submitted because of the following problem(s)");
alertString2 += "\n------------------------------------------------------------------------------------\n";
alertString2 += _alertString;
alert(alertString2);
}
}
function CheckRuleForm(f) {
var ok=1;
var _alertString="";
var alertString2;
if (f.sort_rule.value.length==0) {
_alertString += "\n- " + _("Filing rule code missing");
}
if (f.description.value.length==0) {
_alertString += "\n- " + _("Description missing");
}
if (f.sort_routine.value.length==0) {
_alertString += "\n- " + _("Sort routine missing");
}
if (_alertString.length==0) {
document.Aform.submit();
} else {
alertString2 = _("Form not submitted because of the following problem(s)");
alertString2 += "\n------------------------------------------------------------------------------------\n";
alertString2 += _alertString;
alert(alertString2);
}
}
</script>
[% END %]
[% INCLUDE 'intranet-bottom.inc' %]