mirror of https://github.com/zulip/zulip.git
scheduled_messages: Extract options logic from popover.
This commit extracts date-based logic from the popover menu file and puts it in with the scheduled-messages logic. The aim is for greater testability, with some initial tests now presented on the date-based logic.
This commit is contained in:
parent
ac0bd7bb7d
commit
715fa3aff6
|
@ -3,7 +3,6 @@
|
|||
popovers system in popovers.js. */
|
||||
|
||||
import ClipboardJS from "clipboard";
|
||||
import {format} from "date-fns";
|
||||
import $ from "jquery";
|
||||
import tippy, {delegate} from "tippy.js";
|
||||
|
||||
|
@ -43,6 +42,7 @@ import * as popover_menus_data from "./popover_menus_data";
|
|||
import * as popovers from "./popovers";
|
||||
import * as read_receipts from "./read_receipts";
|
||||
import * as rows from "./rows";
|
||||
import * as scheduled_messages from "./scheduled_messages";
|
||||
import * as settings_data from "./settings_data";
|
||||
import * as starred_messages from "./starred_messages";
|
||||
import * as starred_messages_ui from "./starred_messages_ui";
|
||||
|
@ -789,70 +789,16 @@ export function initialize() {
|
|||
},
|
||||
});
|
||||
|
||||
const send_later_today = {
|
||||
today_nine_am: {
|
||||
text: $t({defaultMessage: "Today at 9:00 AM"}),
|
||||
time: "9:00 am",
|
||||
},
|
||||
today_four_pm: {
|
||||
text: $t({defaultMessage: "Today at 4:00 PM "}),
|
||||
time: "4:00 pm",
|
||||
},
|
||||
};
|
||||
|
||||
const send_later_tomorrow = {
|
||||
tomorrow_nine_am: {
|
||||
text: $t({defaultMessage: "Tomorrow at 9:00 AM"}),
|
||||
time: "9:00 am",
|
||||
},
|
||||
tomorrow_four_pm: {
|
||||
text: $t({defaultMessage: "Tomorrow at 4:00 PM "}),
|
||||
time: "4:00 pm",
|
||||
},
|
||||
};
|
||||
|
||||
const send_later_monday = {
|
||||
monday_nine_am: {
|
||||
text: $t({defaultMessage: "Monday at 9:00 AM"}),
|
||||
time: "9:00 am",
|
||||
},
|
||||
};
|
||||
|
||||
const send_later_custom = {
|
||||
text: $t({defaultMessage: "Custom"}),
|
||||
};
|
||||
|
||||
function set_compose_box_schedule(element) {
|
||||
const send_later_in = element.id;
|
||||
const send_later_class = element.classList[0];
|
||||
switch (send_later_class) {
|
||||
case "send_later_tomorrow": {
|
||||
const send_time = send_later_tomorrow[send_later_in].time;
|
||||
const date = new Date();
|
||||
const scheduled_date = date.setDate(date.getDate() + 1);
|
||||
const send_at_time = format(scheduled_date, "MMM d yyyy ") + send_time;
|
||||
return send_at_time;
|
||||
}
|
||||
case "send_later_today": {
|
||||
const send_time = send_later_today[send_later_in].time;
|
||||
const date = new Date();
|
||||
const send_at_time =
|
||||
format(date.setDate(date.getDate()), "MMM d yyyy ") + send_time;
|
||||
return send_at_time;
|
||||
}
|
||||
case "send_later_monday": {
|
||||
const send_time = send_later_monday[send_later_in].time;
|
||||
const date = new Date();
|
||||
// Subtract from 8 to find the next Monday.
|
||||
const monday_offset = 8 - date.getDay();
|
||||
const scheduled_date = date.setDate(date.getDate() + monday_offset);
|
||||
const send_at_time = format(scheduled_date, "MMM d yyyy ") + send_time;
|
||||
return send_at_time;
|
||||
}
|
||||
// No default
|
||||
}
|
||||
blueslip.error("Not a valid time.");
|
||||
return false;
|
||||
const date = new Date();
|
||||
const selected_send_at_time = scheduled_messages.get_send_at_time_from_opts(
|
||||
send_later_in,
|
||||
send_later_class,
|
||||
date,
|
||||
);
|
||||
return selected_send_at_time;
|
||||
}
|
||||
|
||||
delegate("body", {
|
||||
|
@ -888,32 +834,9 @@ export function initialize() {
|
|||
|
||||
// Only show send later options that are possible today.
|
||||
const date = new Date();
|
||||
const day = date.getDay(); // Starts with 0 for Sunday.
|
||||
const hours = date.getHours();
|
||||
let possible_send_later_today = {};
|
||||
let possible_send_later_monday = {};
|
||||
if (hours <= 8) {
|
||||
possible_send_later_today = send_later_today;
|
||||
} else if (hours <= 15) {
|
||||
possible_send_later_today.today_four_pm = send_later_today.today_four_pm;
|
||||
} else {
|
||||
possible_send_later_today = false;
|
||||
}
|
||||
// Show send_later_monday options only on Fridays and Saturdays.
|
||||
if (day >= 5) {
|
||||
possible_send_later_monday = send_later_monday;
|
||||
} else {
|
||||
possible_send_later_monday = false;
|
||||
}
|
||||
const filtered_send_opts = scheduled_messages.get_filtered_send_opts(date);
|
||||
$("body").append(render_send_later_modal(filtered_send_opts));
|
||||
|
||||
$("body").append(
|
||||
render_send_later_modal({
|
||||
possible_send_later_today,
|
||||
send_later_tomorrow,
|
||||
possible_send_later_monday,
|
||||
send_later_custom,
|
||||
}),
|
||||
);
|
||||
overlays.open_modal("send_later_modal", {
|
||||
autoremove: true,
|
||||
on_show() {
|
||||
|
|
|
@ -1,13 +1,16 @@
|
|||
import {format} from "date-fns";
|
||||
import $ from "jquery";
|
||||
|
||||
import render_success_message_scheduled_banner from "../templates/compose_banner/success_message_scheduled_banner.hbs";
|
||||
|
||||
import * as blueslip from "./blueslip";
|
||||
import * as channel from "./channel";
|
||||
import * as compose from "./compose";
|
||||
import * as compose_actions from "./compose_actions";
|
||||
import * as compose_banner from "./compose_banner";
|
||||
import * as compose_ui from "./compose_ui";
|
||||
import * as drafts from "./drafts";
|
||||
import {$t} from "./i18n";
|
||||
import * as narrow from "./narrow";
|
||||
import * as people from "./people";
|
||||
import * as popover_menus from "./popover_menus";
|
||||
|
@ -15,6 +18,39 @@ import * as stream_data from "./stream_data";
|
|||
|
||||
export let scheduled_messages_data = [];
|
||||
|
||||
const send_later_today = {
|
||||
today_nine_am: {
|
||||
text: $t({defaultMessage: "Today at 9:00 AM"}),
|
||||
time: "9:00 am",
|
||||
},
|
||||
today_four_pm: {
|
||||
text: $t({defaultMessage: "Today at 4:00 PM"}),
|
||||
time: "4:00 pm",
|
||||
},
|
||||
};
|
||||
|
||||
const send_later_tomorrow = {
|
||||
tomorrow_nine_am: {
|
||||
text: $t({defaultMessage: "Tomorrow at 9:00 AM"}),
|
||||
time: "9:00 am",
|
||||
},
|
||||
tomorrow_four_pm: {
|
||||
text: $t({defaultMessage: "Tomorrow at 4:00 PM"}),
|
||||
time: "4:00 pm",
|
||||
},
|
||||
};
|
||||
|
||||
const send_later_monday = {
|
||||
monday_nine_am: {
|
||||
text: $t({defaultMessage: "Monday at 9:00 AM"}),
|
||||
time: "9:00 am",
|
||||
},
|
||||
};
|
||||
|
||||
const send_later_custom = {
|
||||
text: $t({defaultMessage: "Custom"}),
|
||||
};
|
||||
|
||||
function sort_scheduled_messages_data() {
|
||||
scheduled_messages_data.sort(
|
||||
(msg1, msg2) => msg1.scheduled_delivery_timestamp - msg2.scheduled_delivery_timestamp,
|
||||
|
@ -144,6 +180,60 @@ export function get_count() {
|
|||
return scheduled_messages_data.length;
|
||||
}
|
||||
|
||||
export function get_filtered_send_opts(date) {
|
||||
const day = date.getDay(); // Starts with 0 for Sunday.
|
||||
const hours = date.getHours();
|
||||
let possible_send_later_today = {};
|
||||
let possible_send_later_monday = {};
|
||||
if (hours <= 8) {
|
||||
possible_send_later_today = send_later_today;
|
||||
} else if (hours <= 15) {
|
||||
possible_send_later_today.today_four_pm = send_later_today.today_four_pm;
|
||||
} else {
|
||||
possible_send_later_today = false;
|
||||
}
|
||||
// Show send_later_monday options only on Fridays and Saturdays.
|
||||
if (day >= 5) {
|
||||
possible_send_later_monday = send_later_monday;
|
||||
} else {
|
||||
possible_send_later_monday = false;
|
||||
}
|
||||
|
||||
return {
|
||||
possible_send_later_today,
|
||||
send_later_tomorrow,
|
||||
possible_send_later_monday,
|
||||
send_later_custom,
|
||||
};
|
||||
}
|
||||
|
||||
export function get_send_at_time_from_opts(send_later_in, send_later_class, date) {
|
||||
switch (send_later_class) {
|
||||
case "send_later_tomorrow": {
|
||||
const send_time = send_later_tomorrow[send_later_in].time;
|
||||
const scheduled_date = date.setDate(date.getDate() + 1);
|
||||
const send_at_time = format(scheduled_date, "MMM d yyyy ") + send_time;
|
||||
return send_at_time;
|
||||
}
|
||||
case "send_later_today": {
|
||||
const send_time = send_later_today[send_later_in].time;
|
||||
const send_at_time = format(date.setDate(date.getDate()), "MMM d yyyy ") + send_time;
|
||||
return send_at_time;
|
||||
}
|
||||
case "send_later_monday": {
|
||||
const send_time = send_later_monday[send_later_in].time;
|
||||
// Subtract from 8 to find the next Monday.
|
||||
const monday_offset = 8 - date.getDay();
|
||||
const scheduled_date = date.setDate(date.getDate() + monday_offset);
|
||||
const send_at_time = format(scheduled_date, "MMM d yyyy ") + send_time;
|
||||
return send_at_time;
|
||||
}
|
||||
// No default
|
||||
}
|
||||
blueslip.error("Not a valid time.");
|
||||
return false;
|
||||
}
|
||||
|
||||
export function initialize(scheduled_messages_params) {
|
||||
scheduled_messages_data = scheduled_messages_params.scheduled_messages;
|
||||
|
||||
|
|
|
@ -0,0 +1,114 @@
|
|||
"use strict";
|
||||
|
||||
const {strict: assert} = require("assert");
|
||||
|
||||
const {zrequire} = require("./lib/namespace");
|
||||
const {run_test} = require("./lib/test");
|
||||
|
||||
const scheduled_messages = zrequire("scheduled_messages");
|
||||
|
||||
function get_expected_send_opts(expecteds) {
|
||||
const modal_opts = {
|
||||
send_later_tomorrow: {
|
||||
tomorrow_nine_am: {
|
||||
text: "translated: Tomorrow at 9:00 AM",
|
||||
time: "9:00 am",
|
||||
},
|
||||
tomorrow_four_pm: {
|
||||
text: "translated: Tomorrow at 4:00 PM",
|
||||
time: "4:00 pm",
|
||||
},
|
||||
},
|
||||
send_later_custom: {
|
||||
text: "translated: Custom",
|
||||
},
|
||||
possible_send_later_today: false,
|
||||
possible_send_later_monday: false,
|
||||
};
|
||||
const optional_modal_opts = {
|
||||
send_later_today: {
|
||||
today_nine_am: {
|
||||
text: "translated: Today at 9:00 AM",
|
||||
time: "9:00 am",
|
||||
},
|
||||
today_four_pm: {
|
||||
text: "translated: Today at 4:00 PM",
|
||||
time: "4:00 pm",
|
||||
},
|
||||
},
|
||||
send_later_monday: {
|
||||
monday_nine_am: {
|
||||
text: "translated: Monday at 9:00 AM",
|
||||
time: "9:00 am",
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
// 'today_nine_am'
|
||||
// 'today_four_pm'
|
||||
// 'monday_nine_am'
|
||||
for (const expect of expecteds) {
|
||||
const day = expect.split("_")[0]; // "today", "monday"
|
||||
if (!modal_opts[`possible_send_later_${day}`]) {
|
||||
modal_opts[`possible_send_later_${day}`] = {};
|
||||
}
|
||||
modal_opts[`possible_send_later_${day}`][expect] =
|
||||
optional_modal_opts[`send_later_${day}`][expect];
|
||||
}
|
||||
|
||||
return modal_opts;
|
||||
}
|
||||
|
||||
run_test("scheduled_modal_opts", () => {
|
||||
// Sunday thru Saturday
|
||||
const days = [
|
||||
"2023-04-30",
|
||||
"2023-05-01",
|
||||
"2023-05-02",
|
||||
"2023-05-03",
|
||||
"2023-05-04",
|
||||
"2023-05-05",
|
||||
"2023-05-06",
|
||||
];
|
||||
// Extra options change based on the hour of day
|
||||
const options_by_hour = [
|
||||
{hour: "T06:00:00", extras: ["today_nine_am", "today_four_pm"]},
|
||||
{hour: "T11:00:00", extras: ["today_four_pm"]},
|
||||
{hour: "T17:00:00", extras: []},
|
||||
];
|
||||
|
||||
// Now we can test those hourly options on each day of the week
|
||||
for (const day of days) {
|
||||
for (const opts of options_by_hour) {
|
||||
const date = new Date(day + opts.hour);
|
||||
// On Fridays (5) and Saturdays (6), add the Monday option
|
||||
if (date.getDay() > 4) {
|
||||
opts.extras.push("monday_nine_am");
|
||||
}
|
||||
const modal_opts = scheduled_messages.get_filtered_send_opts(date);
|
||||
const expected_opts = get_expected_send_opts(opts.extras);
|
||||
assert.deepEqual(modal_opts, expected_opts);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
run_test("scheduled_selected_times", () => {
|
||||
// When scheduling a message on a Monday at 6:00am
|
||||
// that will be sent tomorrow at 4pm
|
||||
let date = new Date("2023-05-01T06:00:00");
|
||||
let send_at_time = scheduled_messages.get_send_at_time_from_opts(
|
||||
"tomorrow_four_pm",
|
||||
"send_later_tomorrow",
|
||||
date,
|
||||
);
|
||||
assert.equal(send_at_time, "May 2 2023 4:00 pm");
|
||||
// When scheduling a message on a Friday at 5:00pm
|
||||
// that will be sent Monday at 9am
|
||||
date = new Date("2023-05-05T17:00:00");
|
||||
send_at_time = scheduled_messages.get_send_at_time_from_opts(
|
||||
"monday_nine_am",
|
||||
"send_later_monday",
|
||||
date,
|
||||
);
|
||||
assert.equal(send_at_time, "May 8 2023 9:00 am");
|
||||
});
|
Loading…
Reference in New Issue