|
Lines 169-615
function addConsentDeleteHandler() {
Link Here
|
| 169 |
}) |
169 |
}) |
| 170 |
} |
170 |
} |
| 171 |
|
171 |
|
| 172 |
$( document ).ready( function () { |
172 |
$("table.preferences").dataTable($.extend(true, {}, dataTablesDefaults, { |
| 173 |
|
173 |
"dom": 't', |
| 174 |
$("table.preferences").dataTable($.extend(true, {}, dataTablesDefaults, { |
174 |
"columnDefs": [ |
| 175 |
"dom": 't', |
175 |
{ "targets": [ -1 ], "orderable": false, "searchable": false } |
| 176 |
"columnDefs": [ |
176 |
], |
| 177 |
{ "targets": [ -1 ], "orderable": false, "searchable": false } |
177 |
"paging": false |
| 178 |
], |
178 |
})); |
| 179 |
"paging": false |
179 |
|
| 180 |
})); |
180 |
$( '.prefs-tab' ) |
| 181 |
|
181 |
.find( 'input.preference, textarea.preference' ).on('input', function () { |
| 182 |
$( '.prefs-tab' ) |
182 |
if ( this.defaultValue === undefined || this.value != this.defaultValue ) mark_modified.call( this ); |
| 183 |
.find( 'input.preference, textarea.preference' ).on('input', function () { |
183 |
} ).end() |
| 184 |
if ( this.defaultValue === undefined || this.value != this.defaultValue ) mark_modified.call( this ); |
184 |
.find( 'select.preference' ).change( mark_modified ); |
| 185 |
} ).end() |
185 |
$('.preference-checkbox').change( function () { |
| 186 |
.find( 'select.preference' ).change( mark_modified ); |
186 |
$('.preference-checkbox').addClass('modified'); |
| 187 |
$('.preference-checkbox').change( function () { |
187 |
mark_modified.call(this); |
| 188 |
$('.preference-checkbox').addClass('modified'); |
188 |
} ); |
| 189 |
mark_modified.call(this); |
|
|
| 190 |
} ); |
| 191 |
|
| 192 |
$(".set_syspref").click(function() { |
| 193 |
var s = $(this).attr('data-syspref'); |
| 194 |
var v = $(this).attr('data-value'); |
| 195 |
// populate the input with the value in data-value |
| 196 |
$("#pref_"+s).val(v); |
| 197 |
// pass the DOM element to trigger "modified" to enable submit button |
| 198 |
mark_modified.call($("#pref_"+s)[0]); |
| 199 |
return false; |
| 200 |
}); |
| 201 |
|
189 |
|
| 202 |
$(".sortable").each( (i, e) => { |
190 |
$(".set_syspref").click(function() { |
| 203 |
Sortable.create(e, { |
191 |
var s = $(this).attr('data-syspref'); |
| 204 |
animation: 150, |
192 |
var v = $(this).attr('data-value'); |
| 205 |
onUpdate: function( e ){ |
193 |
// populate the input with the value in data-value |
| 206 |
$(e.target).find('input:first').change(); |
194 |
$("#pref_"+s).val(v); |
| 207 |
} |
195 |
// pass the DOM element to trigger "modified" to enable submit button |
| 208 |
}); |
196 |
mark_modified.call($("#pref_"+s)[0]); |
|
|
197 |
return false; |
| 198 |
}); |
| 199 |
|
| 200 |
$(".sortable").each( (i, e) => { |
| 201 |
Sortable.create(e, { |
| 202 |
animation: 150, |
| 203 |
onUpdate: function( e ){ |
| 204 |
$(e.target).find('input:first').change(); |
| 205 |
} |
| 209 |
}); |
206 |
}); |
|
|
207 |
}); |
| 210 |
|
208 |
|
| 211 |
$( '.prefs-tab .action .cancel' ).click( function () { KOHA.Preferences.Modified = false } ); |
209 |
$( '.prefs-tab .action .cancel' ).click( function () { KOHA.Preferences.Modified = false } ); |
| 212 |
|
210 |
|
| 213 |
$( '.prefs-tab .save-all' ).prop('disabled', true).click( function () { |
211 |
$( '.prefs-tab .save-all' ).prop('disabled', true).click( function () { |
| 214 |
KOHA.Preferences.Save( this.form ); |
212 |
KOHA.Preferences.Save( this.form ); |
| 215 |
return false; |
213 |
return false; |
| 216 |
}); |
214 |
}); |
| 217 |
|
215 |
|
| 218 |
addExpandHandler(); |
216 |
addExpandHandler(); |
| 219 |
|
217 |
|
| 220 |
addCollapseHandler(); |
218 |
addCollapseHandler(); |
| 221 |
|
219 |
|
| 222 |
$("h3").attr("class", "expanded").attr("title", __("Collapse this section")); |
220 |
$("h3").attr("class", "expanded").attr("title", __("Collapse this section")); |
| 223 |
var collapsible = $(".collapsed,.expanded"); |
221 |
var collapsible = $(".collapsed,.expanded"); |
| 224 |
|
222 |
|
| 225 |
$(collapsible).on("click",function(){ |
223 |
$(collapsible).on("click",function(){ |
| 226 |
var h3Id = $(this).attr("id"); |
224 |
var h3Id = $(this).attr("id"); |
| 227 |
var panel = $("#collapse_" + h3Id); |
225 |
var panel = $("#collapse_" + h3Id); |
| 228 |
if(panel.is(":visible")){ |
226 |
if(panel.is(":visible")){ |
| 229 |
$(this).addClass("collapsed").removeClass("expanded").attr("title", __("Expand this section") ); |
227 |
$(this).addClass("collapsed").removeClass("expanded").attr("title", __("Expand this section") ); |
| 230 |
panel.hide(); |
228 |
panel.hide(); |
| 231 |
} else { |
229 |
} else { |
| 232 |
$(this).addClass("expanded").removeClass("collapsed").attr("title", __("Collapse this section") ); |
230 |
$(this).addClass("expanded").removeClass("collapsed").attr("title", __("Collapse this section") ); |
| 233 |
panel.show(); |
231 |
panel.show(); |
| 234 |
} |
232 |
} |
| 235 |
}); |
233 |
}); |
|
|
234 |
|
| 235 |
$(".pref_sublink").on("click", function(){ |
| 236 |
/* If the user clicks a sub-menu link in the sidebar, |
| 237 |
check to see if it is collapsed. If so, expand it */ |
| 238 |
var href = $(this).attr("href"); |
| 239 |
href = href.replace("#",""); |
| 240 |
var panel = $("#collapse_" + href ); |
| 241 |
if( panel.is(":hidden") ){ |
| 242 |
$("#" + href).addClass("expanded").removeClass("collapsed").attr("title", __("Collapse this section") ); |
| 243 |
panel.show(); |
| 244 |
} |
| 245 |
}); |
| 236 |
|
246 |
|
| 237 |
$(".pref_sublink").on("click", function(){ |
247 |
if ( to_highlight ) { |
| 238 |
/* If the user clicks a sub-menu link in the sidebar, |
248 |
var words = to_highlight.split( ' ' ); |
| 239 |
check to see if it is collapsed. If so, expand it */ |
249 |
$( '.prefs-tab table' ).find( 'td, th' ).not( '.name-cell' ).each( function ( i, td ) { |
| 240 |
var href = $(this).attr("href"); |
250 |
$.each( words, function ( i, word ) { $( td ).highlight( word ) } ); |
| 241 |
href = href.replace("#",""); |
251 |
} ).find( 'option, textarea' ).removeHighlight(); |
| 242 |
var panel = $("#collapse_" + href ); |
252 |
} |
| 243 |
if( panel.is(":hidden") ){ |
|
|
| 244 |
$("#" + href).addClass("expanded").removeClass("collapsed").attr("title", __("Collapse this section") ); |
| 245 |
panel.show(); |
| 246 |
} |
| 247 |
}); |
| 248 |
|
253 |
|
| 249 |
if ( to_highlight ) { |
254 |
if ( search_jumped ) { |
| 250 |
var words = to_highlight.split( ' ' ); |
255 |
document.location.hash = "jumped"; |
| 251 |
$( '.prefs-tab table' ).find( 'td, th' ).not( '.name-cell' ).each( function ( i, td ) { |
256 |
} |
| 252 |
$.each( words, function ( i, word ) { $( td ).highlight( word ) } ); |
|
|
| 253 |
} ).find( 'option, textarea' ).removeHighlight(); |
| 254 |
} |
| 255 |
|
257 |
|
| 256 |
if ( search_jumped ) { |
258 |
$("#pref_UpdateItemLocationOnCheckin, #pref_UpdateItemLocationOnCheckout").change(function(){ |
| 257 |
document.location.hash = "jumped"; |
259 |
var the_text = $(this).val(); |
|
|
260 |
var alert_text = ''; |
| 261 |
if (the_text.indexOf('_ALL_:') != -1) alert_text = __("Note: _ALL_ value will override all other values") + '\n'; |
| 262 |
var split_text =the_text.split("\n"); |
| 263 |
var alert_issues = ''; |
| 264 |
var issue_count = 0; |
| 265 |
var reg_check = /.*:\s.*/; |
| 266 |
for (var i=0; i < split_text.length; i++){ |
| 267 |
if ( !split_text[i].match(reg_check) && split_text[i].length ) { |
| 268 |
alert_issues+=split_text[i]+"\n"; |
| 269 |
issue_count++; |
| 270 |
} |
| 258 |
} |
271 |
} |
| 259 |
|
272 |
if (issue_count) alert_text += "\n" + __("The following values are not formatted correctly:") + "\n" + alert_issues; |
| 260 |
$("#pref_UpdateItemLocationOnCheckin, #pref_UpdateItemLocationOnCheckout").change(function(){ |
273 |
if ( alert_text.length ) alert(alert_text); |
| 261 |
var the_text = $(this).val(); |
274 |
}); |
| 262 |
var alert_text = ''; |
275 |
|
| 263 |
if (the_text.indexOf('_ALL_:') != -1) alert_text = __("Note: _ALL_ value will override all other values") + '\n'; |
276 |
$(".prefs-tab form").each(function () { |
| 264 |
var split_text =the_text.split("\n"); |
277 |
$(this).validate({ |
| 265 |
var alert_issues = ''; |
278 |
rules: { }, |
| 266 |
var issue_count = 0; |
279 |
errorPlacement: function(error, element) { |
| 267 |
var reg_check = /.*:\s.*/; |
280 |
var placement = $(element).parent(); |
| 268 |
for (var i=0; i < split_text.length; i++){ |
281 |
if (placement) { |
| 269 |
if ( !split_text[i].match(reg_check) && split_text[i].length ) { |
282 |
$(placement).append(error) |
| 270 |
alert_issues+=split_text[i]+"\n"; |
283 |
} else { |
| 271 |
issue_count++; |
284 |
error.insertAfter(element); |
| 272 |
} |
285 |
} |
| 273 |
} |
286 |
} |
| 274 |
if (issue_count) alert_text += "\n" + __("The following values are not formatted correctly:") + "\n" + alert_issues; |
|
|
| 275 |
if ( alert_text.length ) alert(alert_text); |
| 276 |
}); |
287 |
}); |
|
|
288 |
}); |
| 277 |
|
289 |
|
| 278 |
$(".prefs-tab form").each(function () { |
290 |
$(".preference-email").each(function() { |
| 279 |
$(this).validate({ |
291 |
$(this).rules("add", { |
| 280 |
rules: { }, |
292 |
email: true |
| 281 |
errorPlacement: function(error, element) { |
|
|
| 282 |
var placement = $(element).parent(); |
| 283 |
if (placement) { |
| 284 |
$(placement).append(error) |
| 285 |
} else { |
| 286 |
error.insertAfter(element); |
| 287 |
} |
| 288 |
} |
| 289 |
}); |
| 290 |
}); |
293 |
}); |
|
|
294 |
}); |
| 295 |
|
| 296 |
|
| 297 |
$(".modalselect").on("click", function(){ |
| 298 |
var datasource = $(this).data("source"); |
| 299 |
var exclusions = $(this).data("exclusions").split('|'); |
| 300 |
var inclusions = $(this).data("inclusions").split('|'); |
| 301 |
var required = $(this).data("required").split('|'); |
| 302 |
var pref_name = this.id.replace(/pref_/, ''); |
| 303 |
var pref_value = this.value; |
| 304 |
var prefs = pref_value.split("|"); |
| 305 |
|
| 306 |
let data = db_columns[datasource]; |
| 307 |
var items = []; |
| 308 |
var checked = ""; |
| 309 |
var readonly = ""; |
| 310 |
var disabled = ""; |
| 311 |
var style = ""; |
| 312 |
$.each( Object.keys(data).sort(), function( i, key ){ |
| 313 |
if( prefs.indexOf( key ) >= 0 ){ |
| 314 |
checked = ' checked="checked" '; |
| 315 |
} else { |
| 316 |
checked = ""; |
| 317 |
} |
| 318 |
if( required.indexOf( key ) >= 0 ){ |
| 319 |
style = "required"; |
| 320 |
checked = ' checked="checked" '; |
| 321 |
} else if( exclusions.indexOf( key ) >= 0 ){ |
| 322 |
style = "disabled"; |
| 323 |
disabled = ' disabled="disabled" '; |
| 324 |
checked = ""; |
| 325 |
} else if( inclusions.indexOf( key ) >= 0 ){ |
| 326 |
style = "disabled"; |
| 327 |
disabled = ' disabled="disabled" '; |
| 328 |
checked = ' checked="checked" '; |
| 329 |
} else { |
| 330 |
style = ""; |
| 331 |
disabled = ""; |
| 332 |
} |
| 291 |
|
333 |
|
| 292 |
$(".preference-email").each(function() { |
334 |
items.push('<label class="' + style +'"><input class="dbcolumn_selection" type="checkbox" id="' + key + '"' + checked + disabled + ' name="pref" value="' + key + '" /> ' + data[key]+ ' (' + key + ')</label>'); |
| 293 |
$(this).rules("add", { |
|
|
| 294 |
email: true |
| 295 |
}); |
| 296 |
}); |
335 |
}); |
| 297 |
|
336 |
$("<div/>", { |
| 298 |
|
337 |
"class": "columns-2", |
| 299 |
$(".modalselect").on("click", function(){ |
338 |
html: items.join("") |
| 300 |
var datasource = $(this).data("source"); |
339 |
}).appendTo("#prefModalBody"); |
| 301 |
var exclusions = $(this).data("exclusions").split('|'); |
340 |
|
| 302 |
var inclusions = $(this).data("inclusions").split('|'); |
341 |
$("#saveModalPrefs").data("target", this.id ); |
| 303 |
var required = $(this).data("required").split('|'); |
342 |
$("#saveModalPrefs").data("type", "modalselect" ); |
| 304 |
var pref_name = this.id.replace(/pref_/, ''); |
343 |
$("#prefModalLabel").text( pref_name ); |
| 305 |
var pref_value = this.value; |
344 |
$("#prefModal").modal("show"); |
| 306 |
var prefs = pref_value.split("|"); |
345 |
}); |
| 307 |
|
346 |
|
| 308 |
let data = db_columns[datasource]; |
347 |
// Initialise the content of our modal, using the function |
| 309 |
var items = []; |
348 |
// specified in the data-initiator attribute |
| 310 |
var checked = ""; |
349 |
$('.modaljs').on('click', function () { |
| 311 |
var readonly = ""; |
350 |
const init = $(this).data('initiator'); |
| 312 |
var disabled = ""; |
351 |
if (init) { |
| 313 |
var style = ""; |
352 |
window[init](this); |
| 314 |
$.each( Object.keys(data).sort(), function( i, key ){ |
|
|
| 315 |
if( prefs.indexOf( key ) >= 0 ){ |
| 316 |
checked = ' checked="checked" '; |
| 317 |
} else { |
| 318 |
checked = ""; |
| 319 |
} |
| 320 |
if( required.indexOf( key ) >= 0 ){ |
| 321 |
style = "required"; |
| 322 |
checked = ' checked="checked" '; |
| 323 |
} else if( exclusions.indexOf( key ) >= 0 ){ |
| 324 |
style = "disabled"; |
| 325 |
disabled = ' disabled="disabled" '; |
| 326 |
checked = ""; |
| 327 |
} else if( inclusions.indexOf( key ) >= 0 ){ |
| 328 |
style = "disabled"; |
| 329 |
disabled = ' disabled="disabled" '; |
| 330 |
checked = ' checked="checked" '; |
| 331 |
} else { |
| 332 |
style = ""; |
| 333 |
disabled = ""; |
| 334 |
} |
| 335 |
|
| 336 |
items.push('<label class="' + style +'"><input class="dbcolumn_selection" type="checkbox" id="' + key + '"' + checked + disabled + ' name="pref" value="' + key + '" /> ' + data[key]+ ' (' + key + ')</label>'); |
| 337 |
}); |
| 338 |
$("<div/>", { |
| 339 |
"class": "columns-2", |
| 340 |
html: items.join("") |
| 341 |
}).appendTo("#prefModalBody"); |
| 342 |
|
| 343 |
$("#saveModalPrefs").data("target", this.id ); |
| 344 |
$("#saveModalPrefs").data("type", "modalselect" ); |
| 345 |
$("#prefModalLabel").text( pref_name ); |
| 346 |
$("#prefModal").modal("show"); |
353 |
$("#prefModal").modal("show"); |
| 347 |
}); |
354 |
} |
| 348 |
|
355 |
}); |
| 349 |
// Initialise the content of our modal, using the function |
356 |
|
| 350 |
// specified in the data-initiator attribute |
357 |
// Initialise the content of our modal, if we are dealing |
| 351 |
$('.modaljs').on('click', function () { |
358 |
// with a modalselect modal |
| 352 |
const init = $(this).data('initiator'); |
359 |
function prepareModalSelect(formfieldid) { |
| 353 |
if (init) { |
360 |
var prefs = []; |
| 354 |
window[init](this); |
361 |
$("#prefModal input[type='checkbox']").each(function(){ |
| 355 |
$("#prefModal").modal("show"); |
362 |
if( $(this).prop("checked") ){ |
|
|
363 |
prefs.push( this.value ); |
| 356 |
} |
364 |
} |
| 357 |
}); |
365 |
}); |
|
|
366 |
return prefs.join("|"); |
| 367 |
} |
| 358 |
|
368 |
|
| 359 |
// Initialise the content of our modal, if we are dealing |
369 |
// Return a checkbox with an appropriate checked state |
| 360 |
// with a modalselect modal |
370 |
function checkBox(id, className, state) { |
| 361 |
function prepareModalSelect(formfieldid) { |
371 |
return state ? |
| 362 |
var prefs = []; |
372 |
'<input id="' + id + '" type="checkbox" class="' + className + '" checked>' : |
| 363 |
$("#prefModal input[type='checkbox']").each(function(){ |
373 |
'<input id="' + id + '" type="checkbox" class="' + className + '">'; |
| 364 |
if( $(this).prop("checked") ){ |
374 |
} |
| 365 |
prefs.push( this.value ); |
|
|
| 366 |
} |
| 367 |
}); |
| 368 |
return prefs.join("|"); |
| 369 |
} |
| 370 |
|
| 371 |
// Return a checkbox with an appropriate checked state |
| 372 |
function checkBox(id, className, state) { |
| 373 |
return state ? |
| 374 |
'<input id="' + id + '" type="checkbox" class="' + className + '" checked>' : |
| 375 |
'<input id="' + id + '" type="checkbox" class="' + className + '">'; |
| 376 |
} |
| 377 |
|
| 378 |
// Create a cookieConsentedJS item, correctly populated |
| 379 |
function createCookieConsentedJSItem(item, idx) { |
| 380 |
const id = 'CookieConsentedJS_' + idx; |
| 381 |
const code = item.code && item.code.length > 0 ? atob(item.code) : ''; |
| 382 |
const itemId = item.id && item.id.length > 0 ? item.id : ''; |
| 383 |
return '<div id="' + id + '" class="cookieConsentedJSItem" data-id="' + itemId + '">' + |
| 384 |
' <div class="consentRow">' + |
| 385 |
' <div class="consentItem">' + |
| 386 |
' <label class="required" for="name_' + id + '">' + __('Name') + ':</label>' + |
| 387 |
' <input id="name_' + id + '" class="metaName" type="text" value="' + item.name + '"><span class="required">' + __('Required') + '</span>' + |
| 388 |
' </div >' + |
| 389 |
' <div class="consentItem">' + |
| 390 |
' <label class="required" for="description_' + id + '">' + __('Description') + ':</label>' + |
| 391 |
' <input id="description_' + id + '" class="metaDescription" type="text" value="' + item.description + '"><span class="required">' + __('Required') + '</span>' + |
| 392 |
' </div>' + |
| 393 |
' <div class="consentItem">' + |
| 394 |
' <label for="opacConsent_' + id + '">' + __('Requires consent in OPAC') + ':</label>' + |
| 395 |
checkBox('opacConsent_' + id, 'opacConsent', item.opacConsent) + |
| 396 |
' </div>' + |
| 397 |
' <div class="consentItem">' + |
| 398 |
' <label for="staffConsent_' + id + '">' + __('Requires consent in staff interface') + ':</label>' + |
| 399 |
checkBox('staffConsent_' + id, 'staffConsent', item.staffConsent) + |
| 400 |
' </div >' + |
| 401 |
' <div class="consentItem">' + |
| 402 |
' <label for="matchPattern_' + id + '">' + __('String used to identify cookie name') + ':</label>' + |
| 403 |
' <input id="matchPattern_' + id + '" class="metaMatchPattern" type="text" value="' + item.matchPattern + '"><span class="required">' + __('Required') + '</span>' + |
| 404 |
' </div >' + |
| 405 |
' <div class="consentItem">' + |
| 406 |
' <label for="cookieDomain' + id + '">' + __('Cookie domain') + ':</label>' + |
| 407 |
' <input id="cookieDomain' + id + '" class="metaCookieDomain" type="text" value="' + item.cookieDomain + '"><span class="required">' + __('Required') + '</span>' + |
| 408 |
' </div >' + |
| 409 |
' <div class="consentItem">' + |
| 410 |
' <label for="cookiePath' + id + '">' + __('Cookie path') + ':</label>' + |
| 411 |
' <input id="cookiePath' + id + '" class="metaCookiePath" type="text" value="' + item.cookiePath + '"><span class="required">' + __('Required') + '</span>' + |
| 412 |
' </div >' + |
| 413 |
' </div >' + |
| 414 |
' <div class="consentRow codeRow">' + |
| 415 |
' <textarea style="display:none;" id="pref_' + id + '" class="preference preference-code codemirror" rows="10" cols="40">' + code + '</textarea>' + |
| 416 |
' <div>' + |
| 417 |
' <a id="expand_' + id + '" class="expand-textarea" data-target="' + id + '" data-syntax="javascript" href="#">' + __('Expand') + '</a>' + |
| 418 |
' <a id="collapse_' + id + '" class="collapse-textarea" data-target="' + id + '" data-syntax="javascript" href="#" style="display:none">' + __('Collapse') + '</a>' + |
| 419 |
' </div >' + |
| 420 |
' </div>' + |
| 421 |
' <a class="consentDelete" data-target="' + id + '" href="#">' + __('Delete') + '</a>' + |
| 422 |
'</div > '; |
| 423 |
} |
| 424 |
|
375 |
|
| 425 |
// Return the markup for all cookieConsentedJS items concatenated |
376 |
// Create a cookieConsentedJS item, correctly populated |
| 426 |
function populateConsentMarkup(items) { |
377 |
function createCookieConsentedJSItem(item, idx) { |
| 427 |
return items.reduce(function (acc, current, idx) { |
378 |
const id = 'CookieConsentedJS_' + idx; |
| 428 |
return acc + createCookieConsentedJSItem(current, idx); |
379 |
const code = item.code && item.code.length > 0 ? atob(item.code) : ''; |
| 429 |
}, ''); |
380 |
const itemId = item.id && item.id.length > 0 ? item.id : ''; |
| 430 |
} |
381 |
return '<div id="' + id + '" class="cookieConsentedJSItem" data-id="' + itemId + '">' + |
|
|
382 |
' <div class="consentRow">' + |
| 383 |
' <div class="consentItem">' + |
| 384 |
' <label class="required" for="name_' + id + '">' + __('Name') + ':</label>' + |
| 385 |
' <input id="name_' + id + '" class="metaName" type="text" value="' + item.name + '"><span class="required">' + __('Required') + '</span>' + |
| 386 |
' </div >' + |
| 387 |
' <div class="consentItem">' + |
| 388 |
' <label class="required" for="description_' + id + '">' + __('Description') + ':</label>' + |
| 389 |
' <input id="description_' + id + '" class="metaDescription" type="text" value="' + item.description + '"><span class="required">' + __('Required') + '</span>' + |
| 390 |
' </div>' + |
| 391 |
' <div class="consentItem">' + |
| 392 |
' <label for="opacConsent_' + id + '">' + __('Requires consent in OPAC') + ':</label>' + |
| 393 |
checkBox('opacConsent_' + id, 'opacConsent', item.opacConsent) + |
| 394 |
' </div>' + |
| 395 |
' <div class="consentItem">' + |
| 396 |
' <label for="staffConsent_' + id + '">' + __('Requires consent in staff interface') + ':</label>' + |
| 397 |
checkBox('staffConsent_' + id, 'staffConsent', item.staffConsent) + |
| 398 |
' </div >' + |
| 399 |
' <div class="consentItem">' + |
| 400 |
' <label for="matchPattern_' + id + '">' + __('String used to identify cookie name') + ':</label>' + |
| 401 |
' <input id="matchPattern_' + id + '" class="metaMatchPattern" type="text" value="' + item.matchPattern + '"><span class="required">' + __('Required') + '</span>' + |
| 402 |
' </div >' + |
| 403 |
' <div class="consentItem">' + |
| 404 |
' <label for="cookieDomain' + id + '">' + __('Cookie domain') + ':</label>' + |
| 405 |
' <input id="cookieDomain' + id + '" class="metaCookieDomain" type="text" value="' + item.cookieDomain + '"><span class="required">' + __('Required') + '</span>' + |
| 406 |
' </div >' + |
| 407 |
' <div class="consentItem">' + |
| 408 |
' <label for="cookiePath' + id + '">' + __('Cookie path') + ':</label>' + |
| 409 |
' <input id="cookiePath' + id + '" class="metaCookiePath" type="text" value="' + item.cookiePath + '"><span class="required">' + __('Required') + '</span>' + |
| 410 |
' </div >' + |
| 411 |
' </div >' + |
| 412 |
' <div class="consentRow codeRow">' + |
| 413 |
' <textarea style="display:none;" id="pref_' + id + '" class="preference preference-code codemirror" rows="10" cols="40">' + code + '</textarea>' + |
| 414 |
' <div>' + |
| 415 |
' <a id="expand_' + id + '" class="expand-textarea" data-target="' + id + '" data-syntax="javascript" href="#">' + __('Expand') + '</a>' + |
| 416 |
' <a id="collapse_' + id + '" class="collapse-textarea" data-target="' + id + '" data-syntax="javascript" href="#" style="display:none">' + __('Collapse') + '</a>' + |
| 417 |
' </div >' + |
| 418 |
' </div>' + |
| 419 |
' <a class="consentDelete" data-target="' + id + '" href="#">' + __('Delete') + '</a>' + |
| 420 |
'</div > '; |
| 421 |
} |
| 431 |
|
422 |
|
| 432 |
// Return the markup for a validation warning |
423 |
// Return the markup for all cookieConsentedJS items concatenated |
| 433 |
function populateValidationWarning() { |
424 |
function populateConsentMarkup(items) { |
| 434 |
return '<div id="cookieConsentedJSWarning" class="error" style="display:none;">' + __('You must complete all fields') + '</div>'; |
425 |
return items.reduce(function (acc, current, idx) { |
| 435 |
} |
426 |
return acc + createCookieConsentedJSItem(current, idx); |
|
|
427 |
}, ''); |
| 428 |
} |
| 436 |
|
429 |
|
| 437 |
// Return a new, empty consent item |
430 |
// Return the markup for a validation warning |
| 438 |
function emptyConsentItem() { |
431 |
function populateValidationWarning() { |
| 439 |
return { |
432 |
return '<div id="cookieConsentedJSWarning" class="error" style="display:none;">' + __('You must complete all fields') + '</div>'; |
| 440 |
name: '', |
433 |
} |
| 441 |
description: '', |
|
|
| 442 |
matchPattern: '', |
| 443 |
cookieDomain: '', |
| 444 |
cookiePath: '', |
| 445 |
code: '', |
| 446 |
opacConsent: false, |
| 447 |
staffConsent: false |
| 448 |
}; |
| 449 |
} |
| 450 |
|
434 |
|
| 451 |
// Add the handler for a new empty consent item |
435 |
// Return a new, empty consent item |
| 452 |
function addNewHandler() { |
436 |
function emptyConsentItem() { |
| 453 |
$("#cookieConsentedJSAddNew").on("click", function (e) { |
437 |
return { |
| 454 |
e.preventDefault(); |
438 |
name: '', |
| 455 |
const currentLen = $('.cookieConsentedJSItem').length; |
439 |
description: '', |
| 456 |
const newItem = emptyConsentItem(); |
440 |
matchPattern: '', |
| 457 |
const markup = createCookieConsentedJSItem(newItem, currentLen); |
441 |
cookieDomain: '', |
| 458 |
$('#prefModal .modal-body #cookieConsentedJSItems').append($(markup)); |
442 |
cookiePath: '', |
| 459 |
addExpandHandler(); |
443 |
code: '', |
| 460 |
addCollapseHandler(); |
444 |
opacConsent: false, |
| 461 |
addConsentDeleteHandler(); |
445 |
staffConsent: false |
| 462 |
}); |
446 |
}; |
| 463 |
} |
447 |
} |
| 464 |
|
448 |
|
| 465 |
// Populate the cookieConsentedJS modal, we also initialise any |
449 |
// Add the handler for a new empty consent item |
| 466 |
// event handlers that are required. This function is added |
450 |
function addNewHandler() { |
| 467 |
// to the window object so we can call it if we are passed it's name |
451 |
$("#cookieConsentedJSAddNew").on("click", function (e) { |
| 468 |
// as a data-initiator attribute |
452 |
e.preventDefault(); |
| 469 |
// (e.g.) |
453 |
const currentLen = $('.cookieConsentedJSItem').length; |
| 470 |
// const f = 'populateCookieConsentedJS'; |
454 |
const newItem = emptyConsentItem(); |
| 471 |
// window[f](); |
455 |
const markup = createCookieConsentedJSItem(newItem, currentLen); |
| 472 |
window.populateCookieConsentedJS = function(el) { |
456 |
$('#prefModal .modal-body #cookieConsentedJSItems').append($(markup)); |
| 473 |
let items = []; |
|
|
| 474 |
let decoded = ''; |
| 475 |
if (el.value && el.value.length > 0) { |
| 476 |
try { |
| 477 |
decoded = atob(el.value); |
| 478 |
} catch (err) { |
| 479 |
throw (__( |
| 480 |
'Unable to Base64 decode value stored in CookieConsentedJS syspref: ' + |
| 481 |
err.message |
| 482 |
)); |
| 483 |
} |
| 484 |
try { |
| 485 |
items = JSON.parse(decoded); |
| 486 |
} catch (err) { |
| 487 |
throw (__( |
| 488 |
'Unable to JSON parse decoded value stored in CookieConsentedJS syspref: ' + |
| 489 |
err.message |
| 490 |
)); |
| 491 |
} |
| 492 |
} |
| 493 |
const markup = populateConsentMarkup(items); |
| 494 |
const validationWarning = populateValidationWarning(); |
| 495 |
const pref_name = el.id.replace(/pref_/, ''); |
| 496 |
$('#saveModalPrefs').data('target', el.id); |
| 497 |
$('#prefModalLabel').text( pref_name ); |
| 498 |
$('#prefModal .modal-body').html($('<div id="cookieConsentedJSItems">' + validationWarning + markup + '</div><div><a href="#" id="cookieConsentedJSAddNew">' + __('Add new code') + '</a></div>')); |
| 499 |
addExpandHandler(); |
457 |
addExpandHandler(); |
| 500 |
addCollapseHandler(); |
458 |
addCollapseHandler(); |
| 501 |
addNewHandler(); |
|
|
| 502 |
addConsentDeleteHandler(); |
459 |
addConsentDeleteHandler(); |
| 503 |
} |
460 |
}); |
|
|
461 |
} |
| 504 |
|
462 |
|
| 505 |
// Prepare the data in the UI for sending back as a syspref. |
463 |
// Populate the cookieConsentedJS modal, we also initialise any |
| 506 |
// We validate that everything is what we expect. This function is added |
464 |
// event handlers that are required. This function is added |
| 507 |
// to the window object so we can call it if we are passed it's name |
465 |
// to the window object so we can call it if we are passed it's name |
| 508 |
// as a data-initiator attribute |
466 |
// as a data-initiator attribute |
| 509 |
// e.g. |
467 |
// (e.g.) |
| 510 |
// const f = 'prepareCookieConsentedJS'; |
468 |
// const f = 'populateCookieConsentedJS'; |
| 511 |
// window[f](); |
469 |
// window[f](); |
| 512 |
window.prepareCookieConsentedJS = function () { |
470 |
window.populateCookieConsentedJS = function(el) { |
| 513 |
const items = $('.cookieConsentedJSItem'); |
471 |
let items = []; |
| 514 |
const invalid = []; |
472 |
let decoded = ''; |
| 515 |
const valid = []; |
473 |
if (el.value && el.value.length > 0) { |
| 516 |
items.each(function () { |
474 |
try { |
| 517 |
const id = $(this).data('id').length > 0 ? |
475 |
decoded = atob(el.value); |
| 518 |
$(this).data('id') : |
476 |
} catch (err) { |
| 519 |
'_' + Math.random().toString(36).substr(2, 9); |
477 |
throw (__( |
| 520 |
const name = $(this).find('.metaName').val(); |
478 |
'Unable to Base64 decode value stored in CookieConsentedJS syspref: ' + |
| 521 |
const desc = $(this).find('.metaDescription').val(); |
479 |
err.message |
| 522 |
const matchPattern = $(this).find('.metaMatchPattern').val(); |
480 |
)); |
| 523 |
const cookieDomain = $(this).find('.metaCookieDomain').val(); |
|
|
| 524 |
const cookiePath = $(this).find('.metaCookiePath').val(); |
| 525 |
const opacConsent = $(this).find('.opacConsent').is(':checked') |
| 526 |
const staffConsent = $(this).find('.staffConsent').is(':checked'); |
| 527 |
const code = $(this).find('.preference-code').val(); |
| 528 |
// If the name, description, match pattern code are empty, then they've |
| 529 |
// added a new entry, but not filled it in, we can skip it |
| 530 |
if ( |
| 531 |
name.length === 0 && |
| 532 |
desc.length === 0 && |
| 533 |
matchPattern.length === 0 && |
| 534 |
cookieDomain.length === 0 && |
| 535 |
cookiePath.length === 0 && |
| 536 |
code.length === 0 |
| 537 |
) { |
| 538 |
return; |
| 539 |
} |
| 540 |
// They've filled in at least some info |
| 541 |
if ( |
| 542 |
(name.length === 0) || |
| 543 |
(desc.length === 0) || |
| 544 |
(matchPattern.length === 0) || |
| 545 |
(cookiePath.length === 0) || |
| 546 |
(code.length === 0) |
| 547 |
) { |
| 548 |
invalid.push(this); |
| 549 |
} else { |
| 550 |
const obj = { |
| 551 |
id: id, |
| 552 |
name: name, |
| 553 |
description: desc, |
| 554 |
matchPattern: matchPattern, |
| 555 |
cookieDomain: cookieDomain, |
| 556 |
cookiePath: cookiePath, |
| 557 |
opacConsent: opacConsent, |
| 558 |
staffConsent: staffConsent, |
| 559 |
code: btoa(code) |
| 560 |
} |
| 561 |
valid.push(obj); |
| 562 |
} |
| 563 |
}); |
| 564 |
// We failed validation |
| 565 |
if (invalid.length > 0) { |
| 566 |
$('#cookieConsentedJSWarning').show(); |
| 567 |
return false; |
| 568 |
} |
481 |
} |
| 569 |
$('#cookieConsentedJSWarning').hide(); |
482 |
try { |
| 570 |
if (valid.length === 0) { |
483 |
items = JSON.parse(decoded); |
| 571 |
return ''; |
484 |
} catch (err) { |
|
|
485 |
throw (__( |
| 486 |
'Unable to JSON parse decoded value stored in CookieConsentedJS syspref: ' + |
| 487 |
err.message |
| 488 |
)); |
| 572 |
} |
489 |
} |
| 573 |
const json = JSON.stringify(valid); |
|
|
| 574 |
const base64 = btoa(json); |
| 575 |
return base64; |
| 576 |
} |
490 |
} |
|
|
491 |
const markup = populateConsentMarkup(items); |
| 492 |
const validationWarning = populateValidationWarning(); |
| 493 |
const pref_name = el.id.replace(/pref_/, ''); |
| 494 |
$('#saveModalPrefs').data('target', el.id); |
| 495 |
$('#prefModalLabel').text( pref_name ); |
| 496 |
$('#prefModal .modal-body').html($('<div id="cookieConsentedJSItems">' + validationWarning + markup + '</div><div><a href="#" id="cookieConsentedJSAddNew">' + __('Add new code') + '</a></div>')); |
| 497 |
addExpandHandler(); |
| 498 |
addCollapseHandler(); |
| 499 |
addNewHandler(); |
| 500 |
addConsentDeleteHandler(); |
| 501 |
} |
| 577 |
|
502 |
|
| 578 |
$("#saveModalPrefs").on("click", function(){ |
503 |
// Prepare the data in the UI for sending back as a syspref. |
| 579 |
var formfieldid = $("#" + $(this).data("target")); |
504 |
// We validate that everything is what we expect. This function is added |
| 580 |
let finalString = ""; |
505 |
// to the window object so we can call it if we are passed it's name |
| 581 |
if ($(this).data("type") == "modalselect") { |
506 |
// as a data-initiator attribute |
| 582 |
finalString = prepareModalSelect(formfieldid); |
507 |
// e.g. |
| 583 |
} else { |
508 |
// const f = 'prepareCookieConsentedJS'; |
| 584 |
const processor = $(".modaljs").data("processor"); |
509 |
// window[f](); |
| 585 |
finalString = window[processor](); |
510 |
window.prepareCookieConsentedJS = function () { |
|
|
511 |
const items = $('.cookieConsentedJSItem'); |
| 512 |
const invalid = []; |
| 513 |
const valid = []; |
| 514 |
items.each(function () { |
| 515 |
const id = $(this).data('id').length > 0 ? |
| 516 |
$(this).data('id') : |
| 517 |
'_' + Math.random().toString(36).substr(2, 9); |
| 518 |
const name = $(this).find('.metaName').val(); |
| 519 |
const desc = $(this).find('.metaDescription').val(); |
| 520 |
const matchPattern = $(this).find('.metaMatchPattern').val(); |
| 521 |
const cookieDomain = $(this).find('.metaCookieDomain').val(); |
| 522 |
const cookiePath = $(this).find('.metaCookiePath').val(); |
| 523 |
const opacConsent = $(this).find('.opacConsent').is(':checked') |
| 524 |
const staffConsent = $(this).find('.staffConsent').is(':checked'); |
| 525 |
const code = $(this).find('.preference-code').val(); |
| 526 |
// If the name, description, match pattern code are empty, then they've |
| 527 |
// added a new entry, but not filled it in, we can skip it |
| 528 |
if ( |
| 529 |
name.length === 0 && |
| 530 |
desc.length === 0 && |
| 531 |
matchPattern.length === 0 && |
| 532 |
cookieDomain.length === 0 && |
| 533 |
cookiePath.length === 0 && |
| 534 |
code.length === 0 |
| 535 |
) { |
| 536 |
return; |
| 586 |
} |
537 |
} |
| 587 |
// A processor can return false if any of the submitted |
538 |
// They've filled in at least some info |
| 588 |
// data has failed validation |
539 |
if ( |
| 589 |
if (finalString !== false) { |
540 |
(name.length === 0) || |
| 590 |
formfieldid.val(finalString).addClass("modified"); |
541 |
(desc.length === 0) || |
| 591 |
mark_modified.call( formfieldid ); |
542 |
(matchPattern.length === 0) || |
| 592 |
KOHA.Preferences.Save( formfieldid.closest("form") ); |
543 |
(cookiePath.length === 0) || |
| 593 |
$("#prefModal").modal("hide"); |
544 |
(code.length === 0) |
|
|
545 |
) { |
| 546 |
invalid.push(this); |
| 547 |
} else { |
| 548 |
const obj = { |
| 549 |
id: id, |
| 550 |
name: name, |
| 551 |
description: desc, |
| 552 |
matchPattern: matchPattern, |
| 553 |
cookieDomain: cookieDomain, |
| 554 |
cookiePath: cookiePath, |
| 555 |
opacConsent: opacConsent, |
| 556 |
staffConsent: staffConsent, |
| 557 |
code: btoa(code) |
| 558 |
} |
| 559 |
valid.push(obj); |
| 594 |
} |
560 |
} |
| 595 |
}); |
561 |
}); |
|
|
562 |
// We failed validation |
| 563 |
if (invalid.length > 0) { |
| 564 |
$('#cookieConsentedJSWarning').show(); |
| 565 |
return false; |
| 566 |
} |
| 567 |
$('#cookieConsentedJSWarning').hide(); |
| 568 |
if (valid.length === 0) { |
| 569 |
return ''; |
| 570 |
} |
| 571 |
const json = JSON.stringify(valid); |
| 572 |
const base64 = btoa(json); |
| 573 |
return base64; |
| 574 |
} |
| 596 |
|
575 |
|
| 597 |
$("#prefModal").on("hide.bs.modal", function(){ |
576 |
$("#saveModalPrefs").on("click", function(){ |
| 598 |
$("#prefModalLabel,#prefModalBody").html(""); |
577 |
var formfieldid = $("#" + $(this).data("target")); |
| 599 |
$("#saveModalPrefs").data("target", "" ); |
578 |
let finalString = ""; |
| 600 |
}); |
579 |
if ($(this).data("type") == "modalselect") { |
| 601 |
|
580 |
finalString = prepareModalSelect(formfieldid); |
| 602 |
$("#select_all").on("click",function(e){ |
581 |
} else { |
| 603 |
e.preventDefault(); |
582 |
const processor = $(".modaljs").data("processor"); |
| 604 |
$("label:not(.required) .dbcolumn_selection:not(:disabled)").prop("checked", true); |
583 |
finalString = window[processor](); |
| 605 |
}); |
584 |
} |
| 606 |
$("#clear_all").on("click",function(e){ |
585 |
// A processor can return false if any of the submitted |
| 607 |
e.preventDefault(); |
586 |
// data has failed validation |
| 608 |
$("label:not(.required) .dbcolumn_selection").prop("checked", false); |
587 |
if (finalString !== false) { |
| 609 |
}); |
588 |
formfieldid.val(finalString).addClass("modified"); |
| 610 |
|
589 |
mark_modified.call( formfieldid ); |
| 611 |
$("body").on("click", "label.required input.dbcolumn_selection", function(e){ |
590 |
KOHA.Preferences.Save( formfieldid.closest("form") ); |
| 612 |
e.preventDefault(); |
591 |
$("#prefModal").modal("hide"); |
| 613 |
}); |
592 |
} |
| 614 |
|
593 |
}); |
| 615 |
} ); |
594 |
|
|
|
595 |
$("#prefModal").on("hide.bs.modal", function(){ |
| 596 |
$("#prefModalLabel,#prefModalBody").html(""); |
| 597 |
$("#saveModalPrefs").data("target", "" ); |
| 598 |
}); |
| 599 |
|
| 600 |
$("#select_all").on("click",function(e){ |
| 601 |
e.preventDefault(); |
| 602 |
$("label:not(.required) .dbcolumn_selection:not(:disabled)").prop("checked", true); |
| 603 |
}); |
| 604 |
$("#clear_all").on("click",function(e){ |
| 605 |
e.preventDefault(); |
| 606 |
$("label:not(.required) .dbcolumn_selection").prop("checked", false); |
| 607 |
}); |
| 608 |
|
| 609 |
$("body").on("click", "label.required input.dbcolumn_selection", function(e){ |
| 610 |
e.preventDefault(); |
| 611 |
}); |
| 616 |
- |
|
|