summaryrefslogtreecommitdiff
path: root/public/javascripts/admin_interface.js
diff options
context:
space:
mode:
Diffstat (limited to 'public/javascripts/admin_interface.js')
-rw-r--r--public/javascripts/admin_interface.js77
1 files changed, 71 insertions, 6 deletions
diff --git a/public/javascripts/admin_interface.js b/public/javascripts/admin_interface.js
index 9ce0b9e..e9f96c2 100644
--- a/public/javascripts/admin_interface.js
+++ b/public/javascripts/admin_interface.js
@@ -57,6 +57,10 @@ $(document).ready(function () {
57 move_to_search.initialize_search(); 57 move_to_search.initialize_search();
58 } 58 }
59 59
60 if ($("#restore_search_term").length != 0) {
61 restore_search.initialize_search();
62 }
63
60 if ($("#event_node_search_term").length != 0) { 64 if ($("#event_node_search_term").length != 0) {
61 event_search.initialize_search(); 65 event_search.initialize_search();
62 } 66 }
@@ -78,10 +82,29 @@ $(document).ready(function () {
78 }); 82 });
79 83
80 $(document).ajaxSend(function(event, request, settings) { 84 $(document).ajaxSend(function(event, request, settings) {
81 if (typeof(AUTH_TOKEN) == "undefined") return; 85 var meta = document.querySelector("meta[name='csrf-token']");
82 // settings.data is a serialized string like "foo=bar&baz=boink" (or null) 86 if (meta) request.setRequestHeader("X-CSRF-Token", meta.content);
83 settings.data = settings.data || ""; 87 });
84 settings.data += (settings.data ? "&" : "") + "authenticity_token=" + encodeURIComponent(AUTH_TOKEN); 88
89 document.addEventListener('click', function (event) {
90 var button = event.target.closest('.copy_button');
91 if (!button) return;
92
93 var text = button.dataset.copyUrl;
94 if (text === undefined && button.dataset.copyTarget) {
95 var target = document.querySelector(button.dataset.copyTarget);
96 text = target ? target.textContent : undefined;
97 }
98
99 if (!text || text === '—' || !navigator.clipboard) return;
100
101 navigator.clipboard.writeText(text).then(function () {
102 var label = button.querySelector('.copy_button_label');
103 if (!label) return;
104 var original = label.textContent;
105 label.textContent = 'Copied!';
106 setTimeout(function () { label.textContent = original; }, 1500);
107 });
85 }); 108 });
86 109
87}); 110});
@@ -415,8 +438,10 @@ rrule_builder = {
415 }); 438 });
416 $("#rrule_monthly_ordinal").bind("change", function() { 439 $("#rrule_monthly_ordinal").bind("change", function() {
417 $("#rrule_ordinal_fields").toggle($(this).is(":checked")); 440 $("#rrule_ordinal_fields").toggle($(this).is(":checked"));
441 rrule_builder.toggle_custom_ordinal_fields();
418 rrule_builder.sync(); 442 rrule_builder.sync();
419 }); 443 });
444 $("#rrule_ordinal").bind("change", rrule_builder.toggle_custom_ordinal_fields);
420 $("#rrule_exclude_month").bind("change", function() { 445 $("#rrule_exclude_month").bind("change", function() {
421 $("#rrule_excluded_month").toggle($(this).is(":checked")); 446 $("#rrule_excluded_month").toggle($(this).is(":checked"));
422 rrule_builder.sync(); 447 rrule_builder.sync();
@@ -433,6 +458,12 @@ rrule_builder = {
433 $("#rrule_monthly_options").show(); 458 $("#rrule_monthly_options").show();
434 }, 459 },
435 460
461 toggle_custom_ordinal_fields : function() {
462 $("#rrule_custom_ordinal_fields").toggle(
463 $("#rrule_monthly_ordinal").is(":checked") && $("#rrule_ordinal").val() === "custom"
464 );
465 },
466
436 sync : function() { 467 sync : function() {
437 var freq = $("input[name='rrule_freq']:checked").val(); 468 var freq = $("input[name='rrule_freq']:checked").val();
438 var parts = []; 469 var parts = [];
@@ -448,7 +479,16 @@ rrule_builder = {
448 } else { 479 } else {
449 parts.push("FREQ=MONTHLY"); 480 parts.push("FREQ=MONTHLY");
450 if ($("#rrule_monthly_ordinal").is(":checked")) { 481 if ($("#rrule_monthly_ordinal").is(":checked")) {
451 parts.push("BYDAY=" + $("#rrule_ordinal").val() + $("#rrule_ordinal_day").val()); 482 var ordinal = $("#rrule_ordinal").val();
483 if (ordinal === "custom") {
484 var customDays = [];
485 $("input[id^='rrule_custom_ordinal_']:checked").each(function() {
486 customDays.push($(this).attr("id").replace("rrule_custom_ordinal_", "") + $("#rrule_ordinal_day").val());
487 });
488 if (customDays.length > 0) parts.push("BYDAY=" + customDays.join(","));
489 } else {
490 parts.push("BYDAY=" + ordinal + $("#rrule_ordinal_day").val());
491 }
452 } 492 }
453 } 493 }
454 494
@@ -483,8 +523,33 @@ rrule_builder = {
483 } else if (parts.FREQ === "MONTHLY") { 523 } else if (parts.FREQ === "MONTHLY") {
484 $("input[name='rrule_freq'][value='monthly']").prop("checked", true); 524 $("input[name='rrule_freq'][value='monthly']").prop("checked", true);
485 rrule_builder.show_monthly_options(); 525 rrule_builder.show_monthly_options();
526 var ordinalDays = parts.BYDAY && parts.BYDAY.split(",");
527 var customOrdinalDay = null;
528 var customOrdinals = [];
529 var customOrdinalsValid = ordinalDays && ordinalDays.length > 0;
530 if (customOrdinalsValid) {
531 ordinalDays.forEach(function(value) {
532 var customMatch = value.match(/^([1-5])([A-Z]{2})$/);
533 if (!customMatch || (customOrdinalDay && customOrdinalDay !== customMatch[2])) {
534 customOrdinalsValid = false;
535 return;
536 }
537 customOrdinalDay = customMatch[2];
538 customOrdinals.push(customMatch[1]);
539 });
540 }
541
486 var match = parts.BYDAY && parts.BYDAY.match(/^(-?\d+)([A-Z]{2})$/); 542 var match = parts.BYDAY && parts.BYDAY.match(/^(-?\d+)([A-Z]{2})$/);
487 if (match) { 543 if (customOrdinalsValid && (customOrdinals.length > 1 || customOrdinals[0] === "5")) {
544 $("#rrule_monthly_ordinal").prop("checked", true);
545 $("#rrule_ordinal_fields").show();
546 $("#rrule_ordinal").val("custom");
547 $("#rrule_ordinal_day").val(customOrdinalDay);
548 customOrdinals.forEach(function(ordinal) {
549 $("#rrule_custom_ordinal_" + ordinal).prop("checked", true);
550 });
551 rrule_builder.toggle_custom_ordinal_fields();
552 } else if (match) {
488 $("#rrule_monthly_ordinal").prop("checked", true); 553 $("#rrule_monthly_ordinal").prop("checked", true);
489 $("#rrule_ordinal_fields").show(); 554 $("#rrule_ordinal_fields").show();
490 $("#rrule_ordinal").val(match[1]); 555 $("#rrule_ordinal").val(match[1]);