diff --git a/frontend_tests/node_tests/templates.js b/frontend_tests/node_tests/templates.js index 6ccad44571..6996e23dd5 100644 --- a/frontend_tests/node_tests/templates.js +++ b/frontend_tests/node_tests/templates.js @@ -975,6 +975,28 @@ function render(template_name, args) { assert.equal(button_area.find(".no_propagate_notifications").text().trim(), 'translated: No'); }()); +(function reminder_popover_content() { + var args = { + message: { + is_stream: true, + id: "420", + stream: "devel", + subject: "testing", + sender_full_name: "Iago", + }, + can_edit_message: true, + can_mute_topic: true, + narrowed: true, + }; + + var html = '
'; + html += render('remind_me_popover_content', args); + html += "
"; + var link = $(html).find("a.remind.custom"); + assert.equal(link.text().trim(), 'translated: Select date and time'); + global.write_handlebars_output("remind_me_popover_content", html); +}()); + (function settings_tab() { var page_param_checkbox_options = { enable_stream_desktop_notifications: true, diff --git a/static/js/popovers.js b/static/js/popovers.js index 8360d6dac7..4732e20b5f 100644 --- a/static/js/popovers.js +++ b/static/js/popovers.js @@ -3,6 +3,7 @@ var popovers = (function () { var exports = {}; var current_actions_popover_elem; +var current_flatpickr_instance; var current_message_info_popover_elem; var userlist_placement = "right"; @@ -206,6 +207,58 @@ exports.toggle_actions_popover = function (element, id) { } }; +function do_set_reminder(msgid, timestamp) { + var message = current_msg_list.get(msgid); + var link_to_msg = narrow.by_conversation_and_time_uri(message, true); + var command = compose.deferred_message_types.reminders.slash_command; + var reminder_timestamp = timestamp; + var custom_msg = '[this message](' + link_to_msg + ') at ' + reminder_timestamp; + var reminder_msg_content = command + ' ' + reminder_timestamp + '\n' + custom_msg; + var reminder_message = { + type: "private", + content: reminder_msg_content, + sender_id: page_params.user_id, + stream: '', + subject: '', + }; + var recipient = page_params.email; + var emails = util.extract_pm_recipients(recipient); + reminder_message.to = emails; + reminder_message.reply_to = recipient; + reminder_message.private_message_recipient = recipient; + reminder_message.to_user_ids = people.email_list_to_user_ids_string(emails); + compose.schedule_message(reminder_message); +} + +exports.render_actions_remind_popover = function (element, id) { + popovers.hide_all(); + $(element).closest('.message_row').toggleClass('has_popover has_actions_popover'); + current_msg_list.select_id(id); + var elt = $(element); + if (elt.data('popover') === undefined) { + var message = current_msg_list.get(id); + var args = { + message: message, + }; + var ypos = elt.offset().top; + elt.popover({ + // Popover height with 7 items in it is ~190 px + placement: ((message_viewport.height() - ypos) < 220) ? 'top' : 'bottom', + title: "", + content: templates.render('remind_me_popover_content', args), + trigger: "manual", + }); + elt.popover("show"); + current_flatpickr_instance = $('.remind.custom[data-message-id="'+message.id+'"]').flatpickr({ + enableTime: true, + clickOpens: false, + minDate: 'today', + plugins: [new confirmDatePlugin({})], // eslint-disable-line new-cap, no-undef + }); + current_actions_popover_elem = elt; + } +}; + function get_action_menu_menu_items() { if (!current_actions_popover_elem) { blueslip.error('Trying to get menu items when action popover is closed.'); @@ -279,6 +332,10 @@ exports.hide_actions_popover = function () { current_actions_popover_elem.popover("destroy"); current_actions_popover_elem = undefined; } + if (current_flatpickr_instance !== undefined) { + current_flatpickr_instance.destroy(); + current_flatpickr_instance = undefined; + } }; function message_info_popped() { @@ -522,6 +579,34 @@ exports.register_click_handlers = function () { e.stopPropagation(); e.preventDefault(); }); + + $('body').on('click', '.reminder_button', function (e) { + var msgid = $(e.currentTarget).data('message-id'); + popovers.render_actions_remind_popover($(".selected_message .actions_hover")[0], msgid); + e.stopPropagation(); + e.preventDefault(); + }); + + $('body').on('click', '.remind.custom', function (e) { + $(e.currentTarget)[0]._flatpickr.toggle(); + e.stopPropagation(); + e.preventDefault(); + }); + + $('body').on('click', '.flatpickr-calendar', function (e) { + e.stopPropagation(); + e.preventDefault(); + }); + + $('body').on('click', '.flatpickr-confirm', function (e) { + var id = $(".remind.custom").data('message-id'); + var datestr = $(".remind.custom")[0].value; + do_set_reminder(id, datestr); + popovers.hide_all(); + e.stopPropagation(); + e.preventDefault(); + }); + $('body').on('click', '.respond_personal_button', function (e) { var user_id = $(e.target).parents('ul').attr('data-user-id'); var email = people.get_person_from_user_id(user_id).email; diff --git a/static/styles/popovers.css b/static/styles/popovers.css index 1101bd83c3..1b01d18622 100644 --- a/static/styles/popovers.css +++ b/static/styles/popovers.css @@ -80,6 +80,10 @@ ul.actions_popover i { margin-right: 3px; } +ul.remind_me_popover .remind_icon { + text-align: center; +} + .user_popover { width: 240px; top: 100px!important; diff --git a/static/templates/actions_popover_content.handlebars b/static/templates/actions_popover_content.handlebars index 2501bd7f54..4174523758 100644 --- a/static/templates/actions_popover_content.handlebars +++ b/static/templates/actions_popover_content.handlebars @@ -13,6 +13,11 @@ +
  • + + {{t "Remind me about this" }} + +
  • {{#if should_display_collapse}}
  • diff --git a/static/templates/remind_me_popover_content.handlebars b/static/templates/remind_me_popover_content.handlebars new file mode 100644 index 0000000000..7fe2cff99c --- /dev/null +++ b/static/templates/remind_me_popover_content.handlebars @@ -0,0 +1,44 @@ +{{! Contents of the "remind me about this actions" popup }} +