4 [% INCLUDE 'doc-head-open.inc' %]
5 <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>
6 [% INCLUDE 'doc-head-close.inc' %]
7 <link rel="stylesheet" type="text/css" href="[% interface %]/[% theme %]/css/datatables_[% KOHA_VERSION %].css" />
10 <body id="tools_letter" class="tools">
11 [% INCLUDE 'header.inc' %]
12 [% INCLUDE 'letters-search.inc' %]
14 <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>
16 <div id="preview_template" class="modal in" tabindex="-1" role="dialog" aria-labelledby="preview_template_label" aria-hidden="true">
17 <div class="modal-dialog modal-lg">
18 <div class="modal-content">
19 <div class="modal-header">
20 <button type="button" class="closebtn" data-dismiss="modal" aria-hidden="true">×</button>
21 <h3 id="preview_template_label">Preview notice template</h3>
23 <div class="modal-body">
24 <div id="loading"> <img src="[% interface %]/[% theme %]/img/spinner-small.gif" alt="" /> Loading </div>
26 <div class="modal-footer">
27 <!-- TODO <a href="#" class="btn btn-default" id="preview_template_button" role="button" data-toggle="modal">Convert using the Template Toolkit syntax</a>-->
28 <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">Close</button>
34 [% IF add_form or copy_form %]
35 <div class="main container-fluid">
37 <div class="col-md-8 col-md-offset-2">
39 <div id="doc3" class="yui-t2">
45 [% IF ( no_op_set ) %]
46 <h1>Notices and Slips</h1>
47 <form method="get" action="/cgi-bin/koha/tools/letter.pl" id="selectlibrary">
48 <input type="hidden" name="searchfield" value="[% searchfield | html %]" />
49 [% UNLESS independant_branch %]
52 <select name="branchcode" id="branch" style="width:20em;">
53 <option value="*">All libraries</option>
54 [% PROCESS options_for_libraries libraries => Branches.all( selected => branchcode ) %]
58 <div id="toolbar" class="btn-toolbar">
59 <button type="submit" class="btn btn-default btn-sm" id="newnotice"><i class="fa fa-plus"></i> New notice</button>
60 <input type="hidden" id="op" name="op" />
65 <p>You searched for <b>[% searchfield | html %]</b></p>
67 [% IF ( letter && !independant_branch) %]
68 [% select_for_copy = BLOCK %]
69 <select name="branchcode">
70 [% FOREACH l IN Branches.all() %]
71 <option value="[% l.branchcode %]">Copy to [% l.branchname %]</option>
84 <th class="nosort">Copy notice</th>
85 <th class="nosort">Actions</th>
89 [% FOREACH lette IN letter %]
90 [% can_edit = lette.branchcode || !independant_branch %]
92 <td>[% IF lette.branchname %][% lette.branchname %][% ELSE %](All libraries)[% END %]</td>
93 <td>[% lette.module %]</td>
94 <td>[% lette.code %]</td>
95 <td>[% lette.name %]</td>
97 [% IF !independant_branch || !lette.branchcode %]
98 <form method="post" action="/cgi-bin/koha/tools/letter.pl">
99 <input type="hidden" name="op" value="copy_form" />
100 <input type="hidden" name="oldbranchcode" value="[% lette.branchcode %]" />
101 <input type="hidden" name="module" value="[% lette.module %]" />
102 <input type="hidden" name="code" value="[% lette.code %]" />
103 [% IF independant_branch %]
104 <input type="hidden" name="branchcode" value="[% independant_branch %]" />
106 [% select_for_copy %]
108 <button class="btn btn-default btn-xs"><i class="fa fa-clone"></i> Copy</button>
114 <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>
116 [% IF !lette.protected && can_edit %]
117 <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>
125 <div class="dialog message">
126 [% IF ( branchcode ) %]
127 <p>There are no notices for this library.</p>
129 <p>There are no notices.</p>
136 [% IF add_form or copy_form %]
137 <h1>[% IF ( modify ) %]Modify notice[% ELSE %]Add notice[% END %]</h1>
139 <div id="toolbar" class="btn-toolbar">
140 <div class="btn-group">
141 <button class="btn btn-default btn-sm" id="submit_form"><i class="fa fa-save"></i> Save</button>
142 <button class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown">
143 <span class="caret"></span>
145 <ul class="dropdown-menu">
146 <li><a id="saveandcontinue" href="#">Save and continue editing</a></li>
149 <a class="btn btn-default btn-sm cancel" href="/cgi-bin/koha/tools/letter.pl"><i class="fa fa-remove"></i> Cancel</a>
152 <form id="add_notice" name="Aform" method="post" enctype="multipart/form-data" class="validate">
154 <input type="hidden" name="op" id="op" value="add_validate" />
156 <input type="hidden" name="op" id="op" value="copy_validate" />
159 <input type="hidden" name="checked" value="0" />
161 <input type="hidden" name="add" value="0" />
163 <input type="hidden" name="add" value="1" />
165 <fieldset class="rows">
166 <input type="hidden" name="oldbranchcode" value="[% oldbranchcode %]" />
168 [% IF independant_branch %]
169 <input type="hidden" name="branchcode" value="[% independant_branch %]" />
174 <label for="branch">Library:</label>
175 <select name="branchcode" id="branch" style="width:20em;">
176 <option value="">All libraries</option>
177 [% PROCESS options_for_libraries libraries => Branches.all( selected => branchcode ) %]
180 <span class="label">Library:</span>
181 <input type="hidden" id="branch" name="branchcode" value="[% branchcode %]" />
182 [% IF ( branchcode ) %]
183 [% Branches.GetName( branchcode ) %]
191 <label for="module">Koha module:</label>
192 <input type="hidden" name="oldmodule" value="[% module %]" />
194 <select name="module" id="newmodule">
196 <select name="module" id="module">
198 [% IF ( module == "acquisition" ) %]
199 <option value="acquisition" selected="selected">Acquisition</option>
201 <option value="acquisition" >Acquisition</option>
203 [% IF ( module == "catalogue" ) %]
204 <option value="catalogue" selected="selected">Catalog</option>
206 <option value="catalogue" >Catalog</option>
208 [% IF ( module == "circulation" ) %]
209 <option value="circulation" selected="selected">Circulation</option>
211 <option value="circulation">Circulation</option>
213 [% IF ( module == "orderacquisition" ) %]
214 <option value="orderacquisition" selected="selected">Order acquisition</option>
216 <option value="orderacquisition">Order acquisition</option>
218 [% IF ( module == "claimacquisition" ) %]
219 <option value="claimacquisition" selected="selected">Claim acquisition</option>
221 <option value="claimacquisition">Claim acquisition</option>
223 [% IF ( module == "claimissues" ) %]
224 <option value="claimissues" selected="selected">Claim serial issue</option>
226 <option value="claimissues">Claim serial issue</option>
228 [% IF ( module == "reserves" ) %]
229 <option value="reserves" selected="selected">Holds</option>
231 <option value="reserves">Holds</option>
233 [% IF ( module == "members" ) %]
234 <option value="members" selected="selected">Members</option>
236 <option value="members">Members</option>
238 [% IF ( module == "serial" ) %]
239 <option value="serial" selected="selected">Serials (routing list)</option>
241 <option value="serial">Serials (routing list)</option>
243 [% IF ( module == "suggestions" ) %]
244 <option value="suggestions" selected="selected">Suggestions</option>
246 <option value="suggestions">Suggestions</option>
252 <label for="code" class="required">Code:</label>
253 <input type="text" id="code" name="code" size="20" maxlength="20" value="" required="required"/>
254 <span class="required">Required</span>
256 <span class="label">Code:</span>
257 <input type="hidden" id="code" name="code" value="[% code %]" />
262 <label for="name" class="required">Name:</label>
263 <input type="text" id="name" name="name" size="60" value="[% letter_name %]" required="required" />
264 <span class="required">Required</span>
266 [% IF code and preview_is_available%]
268 <label for="name">Data for preview:</label>
271 <input type="text" id="data_preview" name="data_preview" value="" placeholder="barcode" />
272 [% CASE 'CHECKOUT' %]
273 <input type="text" id="data_preview" name="data_preview" value="" placeholder="barcode|borrowernumber" />
274 [% CASE 'HOLD_SLIP' %]
275 <input type="text" id="data_preview" name="data_preview" value="" placeholder="biblionumber|borrowernumber" />
283 [% IF Koha.Preference('TranslateNotices') %]
284 <div style="clear:both"></div>
287 <li><a href="#lang_default">Default</a></li>
288 [% FOR language IN languages %]
289 [% FOR sublanguage IN language.sublanguages_loop %]
290 [% IF language.plural %]
291 <li><a href="#lang_[% sublanguage.rfc4646_subtag %]">[% sublanguage.native_description %] [% sublanguage.region_description %] ([% sublanguage.rfc4646_subtag %])</a></li>
293 <li><a href="#lang_[% sublanguage.rfc4646_subtag %]">[% sublanguage.native_description %] ([% sublanguage.rfc4646_subtag %])</a></li>
300 [% FOREACH lang IN letters.keys %]
301 <div id="lang_[% lang %]">
302 <div class="transport-types" style="clear:both">
303 [% FOR mtt IN letters.$lang.templates.keys.sort %]
304 [% SET letter = letters.$lang.templates.$mtt %]
306 [% SWITCH letter.message_transport_type %]
318 [% letter.message_transport_type %]
321 [% IF letter.message_transport_type == "sms" and not Koha.Preference("SMSSendDriver") %]
322 <fieldset class="rows mtt" id="[% letter.message_transport_type %]_[% lang %]" disabled="disabled">
323 <div class="dialog message">You should enable the SMSSendDriver preference to use the SMS templates.</div>
324 [% ELSIF letter.message_transport_type == "phone" and not Koha.Preference("TalkingTechItivaPhoneNotification") %]
325 <fieldset class="rows mtt" id="[% letter.message_transport_type %]_[% lang %]" disabled="disabled">
326 <div class="dialog message">You should enable the TalkingTechItivaPhoneNotification preference to use the phone templates.</div>
328 <fieldset class="rows mtt" id="[% letter.message_transport_type %]_[% lang %]">
332 <input type="hidden" name="message_transport_type" value="[% letter.message_transport_type %]" />
333 <input type="hidden" name="lang" value="[% lang %]" />
334 <label for="is_html_[% letter.message_transport_type %]_[% lang %]">HTML message:</label>
335 [% IF letter.is_html %]
336 <input type="checkbox" name="is_html_[% letter.message_transport_type %]" id="is_html_[% letter.message_transport_type %]_[% lang %]" value="1" checked="checked" />
338 <input type="checkbox" name="is_html_[% letter.message_transport_type %]" id="is_html_[% letter.message_transport_type %]_[% lang %]" value="1" />
342 <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 %]" />
345 <label for="SQLfieldname_[% letter.message_transport_type %]_[% lang %]">Message body:</label>
346 [% IF letter.message_transport_type == 'sms' %]
347 <span class="sms_counter" id="sms_counter_[% lang %]">[% IF letter.content && letter.content.length > 0 %][% letter.content.length %][% ELSE %]0[% END %]/160 characters</span>
352 <select name="SQLfieldname" id="SQLfieldname_[% letter.message_transport_type %]_[% lang %]" multiple="multiple" size="9">
353 [% FOREACH SQLfieldname IN SQLfieldnames %]
354 <option value="[% SQLfieldname.value %]">[% SQLfieldname.text %]</option>
359 <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>
361 <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>
365 [% IF preview_is_available %]
367 <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>
374 </div> <!-- / #transport-types -->
376 [% IF Koha.Preference('TranslateNotices') %]
380 [% 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 %]
382 <input type="hidden" id="redirect" name="redirect" value="" />
383 <input type="hidden" name="searchfield" value="[% searchfield %]" />
387 [% IF ( add_validate or copy_validate) %]
389 <form action="[% action %]" method="post">
390 <input type="submit" value="OK" />
394 [% IF ( delete_confirm ) %]
395 <div class="dialog alert">
396 <h3>Delete notice?</h3>
407 <td>[% IF letter.branchcode %][% Branches.GetName( letter.branchcode ) %][% ELSE %](All libraries)[% END %]</td>
408 <td>[% letter.module %]</td>
409 <td>[% letter.code %]</td>
410 <td>[% letter.name %]</td>
413 <form action="[% action %]" method="post">
414 <input type="hidden" name="op" value="delete_confirmed">
415 <input type="hidden" name="branchcode" value="[% letter.branchcode %]" />
416 <input type="hidden" name="code" value="[% letter.code %]" />
417 <input type="hidden" name="module" value="[% letter.module %]" />
418 <button type="submit" class="approve"><i class="fa fa-check"></i> Yes, delete</button>
421 <form action="[% action %]" method="get">
422 <button type="submit" class="deny"><i class="fa fa-times"></i> No, do not delete</button>
427 [% IF ( delete_confirmed ) %]
429 <form action="[% action %]" method="post">
430 <input type="submit" value="OK" />
436 [% UNLESS add_form or copy_form %]
437 <div class="yui-b noprint">
438 [% INCLUDE 'tools-menu.inc' %]
443 [% MACRO jsinclude BLOCK %]
444 <script type="text/javascript" src="[% interface %]/[% theme %]/js/tools-menu_[% KOHA_VERSION %].js"></script>
445 [% INCLUDE 'datatables.inc' %]
446 <script type="text/javascript" src="[% interface %]/lib/jquery/plugins/jquery.fixFloat_[% KOHA_VERSION %].js"></script>
447 <script type="text/javascript" src="[% interface %]/lib/jquery/plugins/jquery.insertatcaret_[% KOHA_VERSION %].js"></script>
448 <script type="text/javascript">
449 $(document).ready(function() {
450 [% IF add_form or copy_form %]
451 $('#toolbar').fixFloat();
453 $("#lettert:has(tbody tr)").dataTable($.extend(true, {}, dataTablesDefaults, {
456 { "bSortable": false, "bSearchable": false, 'aTargets': [ 'nosort' ] }
461 $('#branch').change(function() {
463 $('#selectlibrary').submit();
465 $('#newnotice').click(function() {
466 $('#op').val("add_form");
471 $("#newmodule").on("change",function(){
472 if( $("#branch").val() == ""){
473 var branchcode = "*";
475 var branchcode = $("#branch").val();
477 window.location.href = "/cgi-bin/koha/tools/letter.pl?op=add_form&module=" + $(this).val() + "&branchcode=" + branchcode;
480 $("#submit_form").click( function(event) {
481 event.preventDefault();
482 var at_least_one_exists = 0;
484 $("fieldset.mtt").each( function(){
485 var title = $(this).find('input[name="title"]').val();
486 var content = $(this).find('textarea[name="content"]').val();
488 ( title.length == 0 && content.length > 0 )
489 || ( title.length > 0 && content.length == 0 )
491 var mtt = $(this).find('input[name="message_transport_type"]').val();
492 var msg = _("Please specify title and content for %s");
493 msg = msg.replace( "%s", mtt );
494 at_least_one_exists = 1;
496 return are_valid = false;
497 } else if ( title.length > 0 && content.length > 0 ) {
498 at_least_one_exists = 1;
501 if ( ! at_least_one_exists ) {
502 alert( _("Please fill at least one template.") );
509 // Test if code already exists in DB
510 var new_lettercode = $("#code").val();
511 var new_branchcode = $("#branch").val();
512 [% IF ( add_form and code ) # IF edit %]
513 if ( new_lettercode != '[% code %]' ) {
516 data: { code: new_lettercode, branchcode: new_branchcode },
518 url: '/cgi-bin/koha/svc/letters/get/',
519 success: function (data) {
520 if ( data.letters.length > 0 ) {
521 if( new_branchcode == '' ) {
522 alert( _("A default letter with the code '%s' already exists.").format(new_lettercode) );
524 alert( _("A letter with the code '%s' already exists for '%s'.").format(new_lettercode, new_branchcode) );
528 $("#add_notice").submit();
532 [% IF ( add_form and code ) %]
534 $("#add_notice").submit();
540 $(".content_sms").on("keyup", function(){
541 var length = $(this).val().length;
542 var sms_counter = ("#sms_counter_" + $(this).data('lang'));
543 $(sms_counter).html(length + "/" + sms_limit + _(" characters"));
544 if ( length > sms_limit ) {
545 $(sms_counter).css("color", "red");
547 $(sms_counter).css("color", "black");
550 $( ".transport-types" ).accordion({ collapsible: true, active:false, animate: 200 });
551 $(".insert").on("click",function(){
552 var containerid = $(this).data("containerid");
553 insertValueQuery( containerid );
558 $("#saveandcontinue").on("click",function(e){
560 $("#redirect").val("just_save");
561 $("#submit_form").click();
564 $("body").on("click", ".preview_template", function(e){
566 var mtt = $(this).data("mtt");
567 var lang = $(this).data("lang");
569 var code = $("#code").val();
570 var content = $("#content_"+mtt+"_"+lang).val();
571 var title = $("#title_"+mtt+"_"+lang).val();
573 var is_html = $("#is_html_"+mtt+"_"+lang).val();
574 var page = $(this).attr("href");
575 var data_preview = $("#data_preview").val();
576 page += '?code='+encodeURIComponent(code);
577 page += '&title='+encodeURIComponent(title);
578 page += '&content='+encodeURIComponent(content);
579 page += '&data_preview='+encodeURIComponent(data_preview);
580 page += '&is_html='+encodeURIComponent(is_html);
581 $("#preview_template .modal-body").load(page);
582 $('#preview_template').modal('show');
583 $("#preview_template_button").attr("href", "/cgi-bin/koha/svc/letters/convert?code="+code+"&mtt="+mtt+"&lang="+lang);
585 $("#preview_template").on("hidden", function(){
586 $("#preview_template_label").html("");
587 $("#preview_template .modal-body").html("<div id=\"loading\"><img src=\"[% interface %]/[% theme %]/img/spinner-small.gif\" alt=\"\" /> "+_("Loading")+"</div>");
589 $("body").on("click", "#convert_template", function(e){
591 var mtt = $(this).data("mtt");
592 var lang = $(this).data("lang");
594 var code = $("#code").val();
595 var content = $("#content_"+mtt+"_"+lang).val();
596 var title = $("#title_"+mtt+"_"+lang).val();
598 var is_html = $("#is_html_"+mtt+"_"+lang).val();
599 var page = $(this).attr("href");
600 var data_preview = $("#data_preview").val();
601 page += '?code='+encodeURIComponent(code);
602 page += '&title='+encodeURIComponent(title);
603 page += '&content='+encodeURIComponent(content);
604 page += '&data_preview='+encodeURIComponent(data_preview);
605 page += '&is_html='+encodeURIComponent(is_html);
606 $("#preview_template .modal-body").load(page + " div");
607 $('#preview_template').modal('show');
608 $("#preview_template_button").attr("href", "/cgi-bin/koha/svc/letters/convert?code="+code+"&branchcode="+branchcode+"&mtt="+mtt+"&lang="+lang);
610 $("#convert_template").on("hidden", function(){
611 $("#convert_template_label").html("");
612 $("#convert_template .modal-body").html("<div id=\"loading\"><img src=\"[% interface %]/[% theme %]/img/spinner-small.gif\" alt=\"\" /> "+_("Loading")+"</div>");
616 [% IF add_form or copy_form %]
623 function isNotNull(f,noalert) {
624 if (f.value.length ==0) {
630 function isNum(v,maybenull) {
631 var n = new Number(v.value);
635 if (maybenull==0 && v.value==''){
640 function insertValueQuery(containerid) {
641 var fieldset = $("#" + containerid);
642 var myQuery = $(fieldset).find('textarea[name="content"]');
643 var myListBox = $(fieldset).find('select[name="SQLfieldname"]');
645 if($(myListBox).find('option').length > 0) {
646 $(myListBox).find('option').each( function (){
647 if ( $(this).attr('selected') && $(this).val().length > 0 ) {
648 $(myQuery).insertAtCaret("<<" + $(this).val() + ">>");
657 [% INCLUDE 'intranet-bottom.inc' %]