From fb6029edbe07a221c5de716f6b8ef2b7c6cf4bba Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Thu, 5 Apr 2018 11:14:37 +0000 Subject: [PATCH] Elastic: Save-as-event dialog using iframe --- plugins/calendar/calendar.php | 57 ++-- plugins/calendar/calendar_base.js | 74 ++--- plugins/calendar/calendar_ui.js | 278 ++++++++++-------- plugins/calendar/localization/en_US.inc | 1 + .../skins/elastic/templates/calendar.html | 16 +- .../skins/elastic/templates/eventedit.html | 4 +- plugins/calendar/skins/larry/calendar.css | 17 ++ .../skins/larry/templates/eventedit.html | 2 +- plugins/libcalendaring/skins/larry/libcal.css | 5 +- .../skins/elastic/include/calendar.less | 11 +- plugins/tasklist/localization/en_US.inc | 1 + plugins/tasklist/skins/larry/tasklist.css | 1 + .../skins/larry/templates/dialog.html | 14 - 13 files changed, 249 insertions(+), 232 deletions(-) diff --git a/plugins/calendar/calendar.php b/plugins/calendar/calendar.php index b6176ba6..72bd2d34 100644 --- a/plugins/calendar/calendar.php +++ b/plugins/calendar/calendar.php @@ -153,8 +153,7 @@ class calendar extends rcube_plugin $this->register_action('print', array($this,'print_view')); $this->register_action('mailimportitip', array($this, 'mail_import_itip')); $this->register_action('mailimportattach', array($this, 'mail_import_attachment')); - $this->register_action('mailtoevent', array($this, 'mail_message2event')); - $this->register_action('inlineui', array($this, 'get_inline_ui')); + $this->register_action('dialog-ui', array($this, 'mail_message2event')); $this->register_action('check-recent', array($this, 'check_recent')); $this->register_action('itip-status', array($this, 'event_itip_status')); $this->register_action('itip-remove', array($this, 'event_itip_remove')); @@ -875,7 +874,7 @@ class calendar extends rcube_plugin $this->rc->output->command('multi_thread_http_response', $results, rcube_utils::get_input_value('_reqid', rcube_utils::INPUT_GPC)); return; } - + if ($success) $this->rc->output->show_message('successfullysaved', 'confirmation'); else { @@ -1221,10 +1220,10 @@ class calendar extends rcube_plugin } // unlock client - $this->rc->output->command('plugin.unlock_saving'); + $this->rc->output->command('plugin.unlock_saving', $success); // update event object on the client or trigger a complete refresh if too complicated - if ($reload) { + if ($reload && empty($_REQUEST['_framed'])) { $args = array('source' => $event['calendar']); if ($reload > 1) $args['refetch'] = true; @@ -2421,30 +2420,6 @@ class calendar extends rcube_plugin $this->rc->output->send("calendar.print"); } - /** - * - */ - public function get_inline_ui() - { - foreach (array('save','cancel','savingdata') as $label) - $texts['calendar.'.$label] = $this->gettext($label); - - $texts['calendar.new_event'] = $this->gettext('createfrommail'); - - $this->ui->init_templates(); - $this->ui->calendar_list(); # set env['calendars'] - echo $this->api->output->parse('calendar.eventedit', false, false); - echo html::tag('script', array('type' => 'text/javascript'), - "rcmail.set_env('calendars', " . rcube_output::json_serialize($this->api->output->env['calendars']) . ");\n". - "rcmail.set_env('deleteicon', '" . $this->api->output->env['deleteicon'] . "');\n". - "rcmail.set_env('cancelicon', '" . $this->api->output->env['cancelicon'] . "');\n". - "rcmail.set_env('loadingicon', '" . $this->api->output->env['loadingicon'] . "');\n". - "rcmail.gui_object('attachmentlist', '" . $this->ui->attachmentlist_id . "');\n". - "rcmail.add_label(" . rcube_output::json_serialize($texts) . ");\n" - ); - exit; - } - /** * Compare two event objects and return differing properties * @@ -3375,17 +3350,21 @@ class calendar extends rcube_plugin */ public function mail_message2event() { - $uid = rcube_utils::get_input_value('_uid', rcube_utils::INPUT_POST); - $mbox = rcube_utils::get_input_value('_mbox', rcube_utils::INPUT_POST); + $this->ui->init(); + $this->ui->addJS(); + $this->ui->init_templates(); + $this->ui->calendar_list(); // set env['calendars'] + + $uid = rcube_utils::get_input_value('_uid', rcube_utils::INPUT_GET); + $mbox = rcube_utils::get_input_value('_mbox', rcube_utils::INPUT_GET); $event = array(); // establish imap connection - $imap = $this->rc->get_storage(); - $imap->set_folder($mbox); - $message = new rcube_message($uid); + $imap = $this->rc->get_storage(); + $message = new rcube_message($uid, $mbox); if ($message->headers) { - $event['title'] = trim($message->subject); + $event['title'] = trim($message->subject); $event['description'] = trim($message->first_text_part()); $this->load_driver(); @@ -3427,14 +3406,14 @@ class calendar extends rcube_plugin } } } - - $this->rc->output->command('plugin.mail2event_dialog', $event); + + $this->rc->output->set_env('event_prop', $event); } else { $this->rc->output->command('display_message', $this->gettext('messageopenerror'), 'error'); } - - $this->rc->output->send(); + + $this->rc->output->send('calendar.dialog'); } /** diff --git a/plugins/calendar/calendar_base.js b/plugins/calendar/calendar_base.js index 3f00925b..3bf7b8b4 100644 --- a/plugins/calendar/calendar_base.js +++ b/plugins/calendar/calendar_base.js @@ -33,53 +33,40 @@ function rcube_calendar(settings) // extend base class rcube_libcalendaring.call(this, settings); - // member vars - this.ui_loaded = false; - this.selected_attachment = null; - - // private vars - var me = this; - // create new event from current mail message this.create_from_mail = function(uid) { - if (uid || (uid = rcmail.get_single_uid())) { - // load calendar UI (scripts and edit dialog template) - if (!this.ui_loaded) { - $.when( - $.getScript(rcmail.assets_path('plugins/calendar/calendar_ui.js')), - $.getScript(rcmail.assets_path('plugins/calendar/lib/js/fullcalendar.js')), - $.get(rcmail.url('calendar/inlineui'), function(html) { $(document.body).append(html); }, 'html') - ).then(function() { - // disable attendees feature (autocompletion and stuff is not initialized) - for (var c in rcmail.env.calendars) - rcmail.env.calendars[c].attendees = rcmail.env.calendars[c].resources = false; - - me.ui_loaded = true; - me.ui = new rcube_calendar_ui(me.settings); - me.create_from_mail(uid); // start over - }); - - return; - } - - // get message contents for event dialog - var lock = rcmail.set_busy(true, 'loading'); - rcmail.http_post('calendar/mailtoevent', { - '_mbox': rcmail.env.mailbox, - '_uid': uid - }, lock); + if (!uid && !(uid = rcmail.get_single_uid())) { + return; } - }; - // callback function triggered from server with contents for the new event - this.mail2event_dialog = function(event) - { - if (event.title) { - this.ui.add_event(event); - if (rcmail.message_list) - rcmail.message_list.blur(); - } + var url = {_mbox: rcmail.env.mailbox, _uid: uid, _framed: 1}, + buttons = {}, + button_classes = ['mainaction save', 'cancel'], + title = rcmail.gettext('calendar.createfrommail'), + dialog = $('