From 4584670af446553b6b7f7870e7081620ebaf44ee Mon Sep 17 00:00:00 2001 From: rabuzarus <> Date: Sun, 15 Oct 2017 17:30:28 +0200 Subject: [PATCH] add event action: duplicate events --- include/event.php | 2 ++ mod/events.php | 17 +++++++++--- view/theme/frio/js/event_edit.js | 40 ++++++++++++++--------------- view/theme/frio/templates/event.tpl | 1 + 4 files changed, 37 insertions(+), 23 deletions(-) diff --git a/include/event.php b/include/event.php index 7840032c77..bb05027a96 100644 --- a/include/event.php +++ b/include/event.php @@ -591,6 +591,7 @@ function process_events($arr) { // is a real event (no bithdays) if (local_user() && local_user() == $rr['uid'] && $rr['type'] == 'event') { $edit = ((! $rr['cid']) ? array(System::baseUrl() . '/events/event/' . $rr['id'], t('Edit event'), '', '') : null); + $copy = ((! $rr['cid']) ? array(System::baseUrl() . '/events/copy/' . $rr['id'], t('Duplicate event'), '', '') : null); $drop = array(System::baseUrl() . '/events/drop/' . $rr['id'], t('Delete event'), '', ''); } @@ -614,6 +615,7 @@ function process_events($arr) { 'd' => $d, 'edit' => $edit, 'drop' => $drop, + 'copy' => $copy, 'is_first' => $is_first, 'item' => $rr, 'html' => $html, diff --git a/mod/events.php b/mod/events.php index 4e70c00569..4959212ec6 100644 --- a/mod/events.php +++ b/mod/events.php @@ -250,6 +250,10 @@ function events_content(App $a) { $mode = 'drop'; $event_id = intval($a->argv[2]); } + if ($a->argc > 2 && $a->argv[1] == 'copy') { + $mode = 'copy'; + $event_id = intval($a->argv[2]); + } if ($a->argv[1] === 'new') { $mode = 'new'; $event_id = 0; @@ -399,7 +403,7 @@ function events_content(App $a) { return $o; } - if ($mode === 'edit' && $event_id) { + if (($mode === 'edit' || $mode === 'copy') && $event_id) { $r = q("SELECT * FROM `event` WHERE `id` = %d AND `uid` = %d LIMIT 1", intval($event_id), intval(local_user()) @@ -410,7 +414,7 @@ function events_content(App $a) { } // Passed parameters overrides anything found in the DB - if ($mode === 'edit' || $mode === 'new') { + if ($mode === 'edit' || $mode === 'new' || $mode === 'copy') { if (!x($orig_event)) {$orig_event = array();} // In case of an error the browser is redirected back here, with these parameters filled in with the previous values if (x($_REQUEST, 'nofinish')) {$orig_event['nofinish'] = $_REQUEST['nofinish'];} @@ -470,10 +474,17 @@ function events_content(App $a) { require_once 'include/acl_selectors.php' ; - if ($mode === 'new') { + if ($mode === 'new' || $mode === 'copy') { $acl = (($cid) ? '' : populate_acl(((x($orig_event)) ? $orig_event : $a->user))); } + // If we copy an old event, we need to remove the ID and URI + // from the orgiginal event. + if ($mode === 'copy') { + $eid = 0; + $uri = ''; + } + $tpl = get_markup_template('event_form.tpl'); $o .= replace_macros($tpl,array( diff --git a/view/theme/frio/js/event_edit.js b/view/theme/frio/js/event_edit.js index 1cefed77f5..2eec51916a 100644 --- a/view/theme/frio/js/event_edit.js +++ b/view/theme/frio/js/event_edit.js @@ -1,6 +1,6 @@ -$(document).ready(function() { - // go to the permissions tab if the checkbox is checked - $('body').on("change", "#id_share", function() { +$(document).ready(function() { + // Go to the permissions tab if the checkbox is checked. + $('body').on("click", "#id_share", function() { if ($('#id_share').is(':checked') && !( $('#id_share').attr("disabled"))) { $('#acl-wrapper').show(); $("a#event-perms-lnk").parent("li").show(); @@ -13,12 +13,12 @@ $(document).ready(function() { } }).trigger('change'); - // disable the finish time input if the user disable it + // Disable the finish time input if the user disable it. $('body').on("change", "#id_nofinish", function() { enableDisableFinishDate() }).trigger('change'); - // js for the permission sextion + // JS for the permission section. $('#contact_allow, #contact_deny, #group_allow, #group_deny').change(function() { var selstr; $('#contact_allow option:selected, #contact_deny option:selected, #group_allow option:selected, #group_deny option:selected').each( function() { @@ -31,20 +31,20 @@ $(document).ready(function() { }).trigger('change'); - // Change the event nav menu.tabs on click + // Change the event nav menu.tabs on click. $("body").on("click", "#event-nav > li > a", function(e){ e.preventDefault(); toggleEventNav(this); }); - // this is experimental. We maybe can make use of it to inject - // some js code while the event modal opens + // This is experimental. We maybe can make use of it to inject + // some js code while the event modal opens. //$('body').on('show.bs.modal', function () { // enableDisableFinishDate(); //}); - // clear some elements (e.g. the event-preview container) when - // selecting a event nav link so it don't appear more than once + // Clear some elements (e.g. the event-preview container) when + // selecting a event nav link so it don't appear more than once. $('body').on("click", "#event-nav a", function(e) { $("#event-preview").empty(); e.preventDefault(); @@ -53,7 +53,7 @@ $(document).ready(function() { }); // Load the html of the actual event and incect the output to the -// event-edit section +// event-edit section. function doEventPreview() { $('#event-edit-preview').val(1); $.post('events',$('#event-edit-form').serialize(), function(data) { @@ -63,7 +63,7 @@ function doEventPreview() { } -// this function load the content of the edit url into a modal +// This function load the content of the edit url into a modal. function eventEdit(url) { var char = qOrAmp(url); url = url + char + 'mode=none'; @@ -76,8 +76,8 @@ function eventEdit(url) { }); } -// the following functions show/hide the specific event-edit content -// in dependence of the selected nav +// The following functions show/hide the specific event-edit content +// in dependence of the selected nav. function eventAclActive() { $("#event-edit-wrapper, #event-preview, #event-desc-wrapper").hide(); $("#event-acl-wrapper").show(); @@ -94,8 +94,8 @@ function eventEditActive() { $("#event-acl-wrapper, #event-preview, #event-desc-wrapper").hide(); $("#event-edit-wrapper").show(); - //make sure jot text does have really the active class (we do this because there are some - // other events which trigger jot text + // Make sure jot text does have really the active class (we do this because there are some + // other events which trigger jot text. toggleEventNav($("#event-edit-lnk")); } @@ -104,17 +104,17 @@ function eventDescActive() { $("#event-desc-wrapper").show(); } -// Give the active "event-nav" list element the class "active" +// Give the active "event-nav" list element the class "active". function toggleEventNav (elm) { - // select all li of #event-nav and remove the active class + // Select all li of #event-nav and remove the active class. $(elm).closest("#event-nav").children("li").removeClass("active"); - // add the active class to the parent of the link which was selected + // Add the active class to the parent of the link which was selected. $(elm).parent("li").addClass("active"); } -// disable the input for the finish date if it is not available +// Disable the input for the finish date if it is not available. function enableDisableFinishDate() { if( $('#id_nofinish').is(':checked')) $('#id_finish_text').prop("disabled", true); diff --git a/view/theme/frio/templates/event.tpl b/view/theme/frio/templates/event.tpl index e73d04eccf..ed3877665e 100644 --- a/view/theme/frio/templates/event.tpl +++ b/view/theme/frio/templates/event.tpl @@ -18,6 +18,7 @@
{{if $event.edit}}{{/if}} + {{if $event.copy}}{{/if}} {{if $event.drop}}{{/if}} {{if $event.item.plink}}{{/if}}