Owen Leonard
4c14c4998d
This patch makes changes to the form for adding and editing notices, and to the template for viewing a rendered preview of notices. - Preview now shows side-by-side comparisons - JavaScript has been movied out of template into separate file - Validation of the add/edit form improved through use of validation plugin To test, apply the patch on top of those for Bug 17981 - Add a new notice. - Confirm that the form can't be submitted without data in the "code" and "name" fields. - Confirm that the form can't be submitted without filling in at least one message template (subject and body). - Confirm that you cannot submit the form while using an existing notice code. - Follow Bug 17981's test plan for testing the preview function. Confirm that the preview loads correctly and looks correct. - Test both with old syntax messages which require conversion and messages in template-toolkit syntax. Signed-off-by: Katrin Fischer <katrin.fischer.83@web.de> Fixed conflicts caused by bug 20538. Signed-off-by: Josef Moravec <josef.moravec@gmail.com> Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
468 lines
23 KiB
Text
468 lines
23 KiB
Text
[% USE Asset %]
|
||
[% USE Koha %]
|
||
[% USE Branches %]
|
||
[% SET footerjs = 1 %]
|
||
[% INCLUDE 'doc-head-open.inc' %]
|
||
<title>Koha › Tools › Notices[% IF ( add_form or copy_form ) %][% IF ( modify ) %] › Modify notice[% ELSE %] › Add notice[% END %][% END %][% IF ( add_validate or copy_validate) %] › Notice added[% END %][% IF ( delete_confirm ) %] › Confirm deletion[% END %]</title>
|
||
[% INCLUDE 'doc-head-close.inc' %]
|
||
[% Asset.css("css/datatables.css") %]
|
||
<style type="text/css">#preview_template .modal-dialog { width : 80%; } .spinner { display: none; } @media (max-width: 767px) { #preview_template { margin: 0; width : auto; } }</style>
|
||
</head>
|
||
|
||
<body id="tools_letter" class="tools">
|
||
[% INCLUDE 'header.inc' %]
|
||
[% INCLUDE 'letters-search.inc' %]
|
||
|
||
<div id="breadcrumbs"><a href="/cgi-bin/koha/mainpage.pl">Home</a> › <a href="/cgi-bin/koha/tools/tools-home.pl">Tools</a> › [% IF ( add_form or copy_form) %][% IF ( modify ) %]<a href="/cgi-bin/koha/tools/letter.pl">Notices & Slips</a> › Modify notice[% ELSE %] <a href="/cgi-bin/koha/tools/letter.pl">Notices & Slips</a> › Add notice[% END %][% ELSE %][% IF ( add_validate or copy_validate) %] <a href="/cgi-bin/koha/tools/letter.pl">Notices & Slips</a> › Notice added[% ELSE %][% IF ( delete_confirm ) %] <a href="/cgi-bin/koha/tools/letter.pl">Notices & Slips</a> › Confirm deletion[% ELSE %]Notices & Slips[% END %][% END %][% END %]</div>
|
||
|
||
<div id="preview_template" class="modal in" tabindex="-1" role="dialog" aria-labelledby="preview_template_label" aria-hidden="true">
|
||
<div class="modal-dialog modal-lg">
|
||
<div class="modal-content">
|
||
<div class="modal-header">
|
||
<button type="button" class="closebtn" data-dismiss="modal" aria-hidden="true">×</button>
|
||
<h3 id="preview_template_label">Preview notice template</h3>
|
||
</div>
|
||
<div class="modal-body">
|
||
<div id="loading"> <img src="[% interface %]/[% theme %]/img/spinner-small.gif" alt="" /> Loading </div>
|
||
</div>
|
||
<div class="modal-footer">
|
||
<!-- TODO <a href="#" class="btn btn-default" id="preview_template_button" role="button" data-toggle="modal">Convert using the Template Toolkit syntax</a>-->
|
||
<button class="btn btn-default" data-dismiss="modal" aria-hidden="true">Close</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
[% IF add_form or copy_form %]
|
||
<div class="main container-fluid">
|
||
<div class="row">
|
||
<div class="col-md-8 col-md-offset-2">
|
||
[% ELSE %]
|
||
<div id="doc3" class="yui-t2">
|
||
<div id="bd">
|
||
<div id="yui-main">
|
||
<div class="yui-b">
|
||
[% END %]
|
||
|
||
[% IF ( no_op_set ) %]
|
||
<h1>Notices and Slips</h1>
|
||
<form method="get" action="/cgi-bin/koha/tools/letter.pl" id="selectlibrary">
|
||
<input type="hidden" name="searchfield" value="[% searchfield | html %]" />
|
||
[% UNLESS independant_branch %]
|
||
<p>
|
||
Select a library :
|
||
<select name="branchcode" id="branch" style="width:20em;">
|
||
<option value="*">All libraries</option>
|
||
[% PROCESS options_for_libraries libraries => Branches.all( selected => branchcode ) %]
|
||
</select>
|
||
</p>
|
||
[% END %]
|
||
<div id="toolbar" class="btn-toolbar">
|
||
<button type="submit" class="btn btn-default btn-sm" id="newnotice"><i class="fa fa-plus"></i> New notice</button>
|
||
<input type="hidden" id="op" name="op" />
|
||
</div>
|
||
</form>
|
||
|
||
[% IF ( search ) %]
|
||
<p>You searched for <b>[% searchfield | html %]</b></p>
|
||
[% END %]
|
||
[% IF ( letter && !independant_branch) %]
|
||
[% select_for_copy = BLOCK %]
|
||
<select name="branchcode">
|
||
[% FOREACH l IN Branches.all() %]
|
||
<option value="[% l.branchcode %]">Copy to [% l.branchname %]</option>
|
||
[% END %]
|
||
</select>
|
||
[% END %]
|
||
[% END %]
|
||
[% IF letter %]
|
||
<table id="lettert">
|
||
<thead>
|
||
<tr>
|
||
<th>Library</th>
|
||
<th>Module</th>
|
||
<th>Code</th>
|
||
<th>Name</th>
|
||
<th class="nosort">Copy notice</th>
|
||
<th class="nosort">Actions</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
[% FOREACH lette IN letter %]
|
||
[% can_edit = lette.branchcode || !independant_branch %]
|
||
<tr>
|
||
<td>[% IF lette.branchname %][% lette.branchname %][% ELSE %](All libraries)[% END %]</td>
|
||
<td>[% lette.module %]</td>
|
||
<td>[% lette.code %]</td>
|
||
<td>[% lette.name %]</td>
|
||
<td class="actions">
|
||
[% IF !independant_branch || !lette.branchcode %]
|
||
<form method="post" action="/cgi-bin/koha/tools/letter.pl">
|
||
<input type="hidden" name="op" value="copy_form" />
|
||
<input type="hidden" name="oldbranchcode" value="[% lette.branchcode %]" />
|
||
<input type="hidden" name="module" value="[% lette.module %]" />
|
||
<input type="hidden" name="code" value="[% lette.code %]" />
|
||
[% IF independant_branch %]
|
||
<input type="hidden" name="branchcode" value="[% independant_branch %]" />
|
||
[% ELSE %]
|
||
[% select_for_copy %]
|
||
[% END %]
|
||
<button class="btn btn-default btn-xs"><i class="fa fa-clone"></i> Copy</button>
|
||
</form>
|
||
[% END %]
|
||
</td>
|
||
<td class="actions">
|
||
[% IF can_edit %]
|
||
<a class="btn btn-default btn-xs" href="/cgi-bin/koha/tools/letter.pl?op=add_form&branchcode=[% lette.branchcode %]&module=[% lette.module %]&code=[% lette.code %]"><i class="fa fa-pencil"></i> Edit</a>
|
||
[% END %]
|
||
[% IF !lette.protected && can_edit %]
|
||
<a class="btn btn-default btn-xs" href="/cgi-bin/koha/tools/letter.pl?op=delete_confirm&branchcode=[%lette.branchcode %]&module=[% lette.module %]&code=[% lette.code %]"><i class="fa fa-trash"></i> Delete</a>
|
||
[% END %]
|
||
</td>
|
||
</tr>
|
||
[% END %]
|
||
</tbody>
|
||
</table>
|
||
[% ELSE %]
|
||
<div class="dialog message">
|
||
[% IF ( branchcode ) %]
|
||
<p>There are no notices for this library.</p>
|
||
[% ELSE %]
|
||
<p>There are no notices.</p>
|
||
[% END %]
|
||
</div>
|
||
[% END %]
|
||
[% END %]
|
||
|
||
|
||
[% IF add_form or copy_form %]
|
||
<h1>[% IF ( modify ) %]Modify notice[% ELSE %]Add notice[% END %]</h1>
|
||
|
||
<div id="toolbar" class="btn-toolbar">
|
||
<div class="btn-group">
|
||
<button class="btn btn-default btn-sm" id="submit_form"><i class="fa fa-save"></i> Save</button>
|
||
<button class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown">
|
||
<span class="caret"></span>
|
||
</button>
|
||
<ul class="dropdown-menu">
|
||
<li><a id="saveandcontinue" href="#">Save and continue editing</a></li>
|
||
</ul>
|
||
</div>
|
||
<a class="btn btn-default btn-sm cancel" href="/cgi-bin/koha/tools/letter.pl"><i class="fa fa-remove"></i> Cancel</a>
|
||
</div>
|
||
|
||
<form id="add_notice" name="Aform" method="post" enctype="multipart/form-data" class="validate">
|
||
[% IF add_form %]
|
||
<input type="hidden" name="op" id="op" value="add_validate" />
|
||
[% ELSE %]
|
||
<input type="hidden" name="op" id="op" value="copy_validate" />
|
||
[% END %]
|
||
|
||
<input type="hidden" name="checked" value="0" />
|
||
[% IF ( modify ) %]
|
||
<input type="hidden" name="add" value="0" />
|
||
[% ELSE %]
|
||
<input type="hidden" name="add" value="1" />
|
||
[% END %]
|
||
<fieldset class="rows">
|
||
<input type="hidden" name="oldbranchcode" value="[% oldbranchcode %]" />
|
||
<ol>
|
||
[% IF independant_branch %]
|
||
<input type="hidden" name="branchcode" value="[% independant_branch %]" />
|
||
[% ELSE %]
|
||
<li>
|
||
|
||
[% IF adding %]
|
||
<label for="branch">Library:</label>
|
||
<select name="branchcode" id="branch" style="width:20em;">
|
||
<option value="">All libraries</option>
|
||
[% PROCESS options_for_libraries libraries => Branches.all( selected => branchcode ) %]
|
||
</select>
|
||
[% ELSE %]
|
||
<span class="label">Library:</span>
|
||
<input type="hidden" id="branch" name="branchcode" value="[% branchcode %]" />
|
||
[% IF ( branchcode ) %]
|
||
[% Branches.GetName( branchcode ) %]
|
||
[% ELSE %]
|
||
All libraries
|
||
[% END %]
|
||
[% END %]
|
||
</li>
|
||
[% END %]
|
||
<li>
|
||
<label for="module">Koha module:</label>
|
||
<input type="hidden" name="oldmodule" value="[% module %]" />
|
||
[% IF adding %]
|
||
<select name="module" id="newmodule">
|
||
[% ELSE %]
|
||
<select name="module" id="module">
|
||
[% END %]
|
||
[% IF ( module == "acquisition" ) %]
|
||
<option value="acquisition" selected="selected">Acquisition</option>
|
||
[% ELSE %]
|
||
<option value="acquisition" >Acquisition</option>
|
||
[% END %]
|
||
[% IF ( module == "catalogue" ) %]
|
||
<option value="catalogue" selected="selected">Catalog</option>
|
||
[% ELSE %]
|
||
<option value="catalogue" >Catalog</option>
|
||
[% END %]
|
||
[% IF ( module == "circulation" ) %]
|
||
<option value="circulation" selected="selected">Circulation</option>
|
||
[% ELSE %]
|
||
<option value="circulation">Circulation</option>
|
||
[% END %]
|
||
[% IF ( module == "orderacquisition" ) %]
|
||
<option value="orderacquisition" selected="selected">Order acquisition</option>
|
||
[% ELSE %]
|
||
<option value="orderacquisition">Order acquisition</option>
|
||
[% END %]
|
||
[% IF ( module == "claimacquisition" ) %]
|
||
<option value="claimacquisition" selected="selected">Claim acquisition</option>
|
||
[% ELSE %]
|
||
<option value="claimacquisition">Claim acquisition</option>
|
||
[% END %]
|
||
[% IF ( module == "claimissues" ) %]
|
||
<option value="claimissues" selected="selected">Claim serial issue</option>
|
||
[% ELSE %]
|
||
<option value="claimissues">Claim serial issue</option>
|
||
[% END %]
|
||
[% IF ( module == "reserves" ) %]
|
||
<option value="reserves" selected="selected">Holds</option>
|
||
[% ELSE %]
|
||
<option value="reserves">Holds</option>
|
||
[% END %]
|
||
[% IF ( module == "members" ) %]
|
||
<option value="members" selected="selected">Members</option>
|
||
[% ELSE %]
|
||
<option value="members">Members</option>
|
||
[% END %]
|
||
[% IF ( module == "serial" ) %]
|
||
<option value="serial" selected="selected">Serials (routing list)</option>
|
||
[% ELSE %]
|
||
<option value="serial">Serials (routing list)</option>
|
||
[% END %]
|
||
[% IF ( module == "suggestions" ) %]
|
||
<option value="suggestions" selected="selected">Suggestions</option>
|
||
[% ELSE %]
|
||
<option value="suggestions">Suggestions</option>
|
||
[% END %]
|
||
</select>
|
||
</li>
|
||
<li>
|
||
[% IF adding %]
|
||
<label for="code" class="required">Code:</label>
|
||
<input type="text" id="code" name="code" size="20" maxlength="20" value="" required="required"/>
|
||
<span class="required">Required</span>
|
||
[% ELSE %]
|
||
<span class="label">Code:</span>
|
||
<input type="hidden" id="code" name="code" value="[% code %]" />
|
||
[% code %]
|
||
[% END %]
|
||
</li>
|
||
<li>
|
||
<label for="name" class="required">Name:</label>
|
||
<input type="text" id="name" name="name" size="60" value="[% letter_name %]" required="required" />
|
||
<span class="required">Required</span>
|
||
</li>
|
||
[% IF code and preview_is_available%]
|
||
<li>
|
||
<label for="name">Data for preview:</label>
|
||
[% SWITCH code %]
|
||
[% CASE 'CHECKIN' %]
|
||
<input type="text" id="data_preview" name="data_preview" value="" placeholder="barcode" />
|
||
[% CASE 'CHECKOUT' %]
|
||
<input type="text" id="data_preview" name="data_preview" value="" placeholder="barcode|borrowernumber" />
|
||
[% CASE 'HOLD_SLIP' %]
|
||
<input type="text" id="data_preview" name="data_preview" value="" placeholder="biblionumber|borrowernumber" />
|
||
[% CASE %]
|
||
Not supported yet.
|
||
[% END %]
|
||
</li>
|
||
[% END %]
|
||
</ol>
|
||
</fieldset>
|
||
[% IF Koha.Preference('TranslateNotices') %]
|
||
<div style="clear:both"></div>
|
||
<div id="tabs">
|
||
<ul>
|
||
<li><a href="#lang_default">Default</a></li>
|
||
[% FOR language IN languages %]
|
||
[% FOR sublanguage IN language.sublanguages_loop %]
|
||
[% IF language.plural %]
|
||
<li><a href="#lang_[% sublanguage.rfc4646_subtag %]">[% sublanguage.native_description %] [% sublanguage.region_description %] ([% sublanguage.rfc4646_subtag %])</a></li>
|
||
[% ELSE %]
|
||
<li><a href="#lang_[% sublanguage.rfc4646_subtag %]">[% sublanguage.native_description %] ([% sublanguage.rfc4646_subtag %])</a></li>
|
||
[% END %]
|
||
[% END %]
|
||
[% END %]
|
||
</ul>
|
||
[% END %]
|
||
|
||
[% FOREACH lang IN letters.keys %]
|
||
<div id="lang_[% lang %]">
|
||
<div class="transport-types" style="clear:both">
|
||
[% FOR mtt IN letters.$lang.templates.keys.sort %]
|
||
[% SET letter = letters.$lang.templates.$mtt %]
|
||
<h3>
|
||
[% SWITCH letter.message_transport_type %]
|
||
[% CASE 'email' %]
|
||
Email
|
||
[% CASE 'print' %]
|
||
Print
|
||
[% CASE 'sms' %]
|
||
SMS
|
||
[% CASE 'feed' %]
|
||
Feed
|
||
[% CASE 'phone' %]
|
||
Phone
|
||
[% CASE %]
|
||
[% letter.message_transport_type %]
|
||
[% END %]
|
||
</h3>
|
||
[% IF letter.message_transport_type == "sms" and not Koha.Preference("SMSSendDriver") %]
|
||
<fieldset class="rows mtt" id="[% letter.message_transport_type %]_[% lang %]" disabled="disabled">
|
||
<div class="dialog message">You should enable the SMSSendDriver preference to use the SMS templates.</div>
|
||
[% ELSIF letter.message_transport_type == "phone" and not Koha.Preference("TalkingTechItivaPhoneNotification") %]
|
||
<fieldset class="rows mtt" id="[% letter.message_transport_type %]_[% lang %]" disabled="disabled">
|
||
<div class="dialog message">You should enable the TalkingTechItivaPhoneNotification preference to use the phone templates.</div>
|
||
[% ELSE %]
|
||
<fieldset class="rows mtt" id="[% letter.message_transport_type %]_[% lang %]">
|
||
[% END %]
|
||
<ol>
|
||
<li>
|
||
<input type="hidden" name="message_transport_type" value="[% letter.message_transport_type %]" />
|
||
<input type="hidden" name="lang" value="[% lang %]" />
|
||
<label for="is_html_[% letter.message_transport_type %]_[% lang %]">HTML message:</label>
|
||
[% IF letter.is_html %]
|
||
<input type="checkbox" name="is_html_[% letter.message_transport_type %]" id="is_html_[% letter.message_transport_type %]_[% lang %]" value="1" checked="checked" />
|
||
[% ELSE %]
|
||
<input type="checkbox" name="is_html_[% letter.message_transport_type %]" id="is_html_[% letter.message_transport_type %]_[% lang %]" value="1" />
|
||
[% END %]
|
||
</li>
|
||
<li>
|
||
<label for="title_[% letter.message_transport_type %]_[% lang %]">Message subject:</label><input type="text" id="title_[% letter.message_transport_type %]_[% lang %]" name="title" size="60" value="[% letter.title %]" />
|
||
</li>
|
||
<li>
|
||
<label for="SQLfieldname_[% letter.message_transport_type %]_[% lang %]">Message body:</label>
|
||
[% IF letter.message_transport_type == 'sms' %]
|
||
<span class="sms_counter" id="sms_counter_[% lang %]">[% IF letter.content && letter.content.length > 0 %][% letter.content.length %][% ELSE %]0[% END %]/160 characters</span>
|
||
[% END %]
|
||
<table>
|
||
<tr>
|
||
<td>
|
||
<select name="SQLfieldname" id="SQLfieldname_[% letter.message_transport_type %]_[% lang %]" multiple="multiple" size="9">
|
||
[% FOREACH SQLfieldname IN SQLfieldnames %]
|
||
<option value="[% SQLfieldname.value %]">[% SQLfieldname.text %]</option>
|
||
[% END %]
|
||
</select>
|
||
</td>
|
||
<td class="actions">
|
||
<button type="button" data-containerid="[% letter.message_transport_type %]_[% lang %]" class="btn btn-default btn-sm insert">Insert <i class="fa fa-long-arrow-right"></i></button>
|
||
</td>
|
||
<td><textarea name="content" data-lang="[% lang %]" class="content_[% letter.message_transport_type %]" id="content_[% letter.message_transport_type %]_[% lang %]" cols="80" rows="15">[% letter.content %]</textarea></td>
|
||
</tr>
|
||
</table>
|
||
</li>
|
||
[% IF preview_is_available %]
|
||
<li>
|
||
<a href="/cgi-bin/koha/svc/letters/preview" class="preview_template btn btn-default btn-xs" title="Preview this notice template" data-mtt="[% letter.message_transport_type %]" data-lang="[% lang %]"><i class="fa fa-eye"></i> Preview</a>
|
||
</li>
|
||
[% END %]
|
||
</ol>
|
||
</fieldset>
|
||
[% END %]
|
||
</div>
|
||
</div> <!-- / #transport-types -->
|
||
[% END %]
|
||
[% IF Koha.Preference('TranslateNotices') %]
|
||
</div>
|
||
[% END %]
|
||
|
||
[% IF code.search('DGST') %] <span class="overdue">Warning, this is a template for a Digest, as such, any references to branch data ( e.g. branches.branchname ) will refer to the borrower's home branch.</span> [% END %]
|
||
|
||
<input type="hidden" id="redirect" name="redirect" value="" />
|
||
<input type="hidden" name="searchfield" value="[% searchfield %]" />
|
||
</form>
|
||
[% END %]
|
||
|
||
[% IF ( add_validate or copy_validate) %]
|
||
Data recorded
|
||
<form action="[% action %]" method="post">
|
||
<input type="submit" value="OK" />
|
||
</form>
|
||
[% END %]
|
||
|
||
[% IF ( delete_confirm ) %]
|
||
<div class="dialog alert">
|
||
<h3>Delete notice?</h3>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>Library</th>
|
||
<th>Module</th>
|
||
<th>Code</th>
|
||
<th>Name</th>
|
||
</tr>
|
||
</thead>
|
||
<tr>
|
||
<td>[% IF letter.branchcode %][% Branches.GetName( letter.branchcode ) %][% ELSE %](All libraries)[% END %]</td>
|
||
<td>[% letter.module %]</td>
|
||
<td>[% letter.code %]</td>
|
||
<td>[% letter.name %]</td>
|
||
</tr>
|
||
</table>
|
||
<form action="[% action %]" method="post">
|
||
<input type="hidden" name="op" value="delete_confirmed">
|
||
<input type="hidden" name="branchcode" value="[% letter.branchcode %]" />
|
||
<input type="hidden" name="code" value="[% letter.code %]" />
|
||
<input type="hidden" name="module" value="[% letter.module %]" />
|
||
<button type="submit" class="approve"><i class="fa fa-check"></i> Yes, delete</button>
|
||
</form>
|
||
|
||
<form action="[% action %]" method="get">
|
||
<button type="submit" class="deny"><i class="fa fa-times"></i> No, do not delete</button>
|
||
</form>
|
||
</div>
|
||
[% END %]
|
||
|
||
[% IF ( delete_confirmed ) %]
|
||
Data deleted
|
||
<form action="[% action %]" method="post">
|
||
<input type="submit" value="OK" />
|
||
</form>
|
||
[% END %]
|
||
|
||
</div>
|
||
</div>
|
||
[% UNLESS add_form or copy_form %]
|
||
<div class="yui-b noprint">
|
||
[% INCLUDE 'tools-menu.inc' %]
|
||
</div>
|
||
[% END %]
|
||
</div>
|
||
|
||
[% MACRO jsinclude BLOCK %]
|
||
[% Asset.js("js/tools-menu.js") %]
|
||
[% INCLUDE 'datatables.inc' %]
|
||
[% Asset.js("lib/jquery/plugins/jquery.fixFloat.js") %]
|
||
[% Asset.js("lib/jquery/plugins/jquery.insertatcaret.js") %]
|
||
<script>
|
||
var no_op_set = '[% no_op_set %]';
|
||
var interface = '[% interface %]';
|
||
var theme = '[% theme %]';
|
||
var add_form = '[% add_form %]';
|
||
var copy_form = '[% copy_form %]';
|
||
var code = '[% code %]';
|
||
var new_lettercode = '[% new_lettercode %]';
|
||
var new_branchcode = '[% new_branchcode %]';
|
||
var MSG_CODE_EXISTS = _("A default letter with the code '%s' already exists.");
|
||
var MSG_CODE_EXISTS_FOR_LIBRARY = _("A letter with the code '%s' already exists for '%s'.");
|
||
var MSG_EMPTY_TITLE_AND_CONTENT = _("Please specify title and content for %s");
|
||
var MSG_EMPTY_TEMPLATES = _("Please fill at least one template.");
|
||
var MSG_LOADING = _("Loading");
|
||
</script>
|
||
[% Asset.js("js/letter.js") %]
|
||
[% END %]
|
||
|
||
[% INCLUDE 'intranet-bottom.inc' %]
|