UX: simplify setting reminders

This commit is contained in:
jjaffeux 2020-08-12 13:16:54 +02:00
parent 165bf22988
commit ab9e2bbd7f
6 changed files with 39 additions and 6 deletions

View File

@ -31,7 +31,8 @@ module DiscoursePostEvent
def reminders def reminders
(object.reminders || '').split(',').map do |reminder| (object.reminders || '').split(',').map do |reminder|
value, unit = reminder.split('.') value, unit = reminder.split('.')
{ value: value.to_i, unit: unit } value = value.to_i
{ value: value.to_i.abs, unit: unit, period: value > 0 ? 'before' : 'after' }
end end
end end

View File

@ -9,7 +9,7 @@ import { Promise } from "rsvp";
import { buildParams, replaceRaw } from "../../lib/raw-event-helper"; import { buildParams, replaceRaw } from "../../lib/raw-event-helper";
const DEFAULT_REMINDER = { value: 15, unit: "minutes" }; const DEFAULT_REMINDER = { value: 15, unit: "minutes", period: "before" };
export default Controller.extend(ModalFunctionality, { export default Controller.extend(ModalFunctionality, {
reminders: null, reminders: null,
@ -19,6 +19,7 @@ export default Controller.extend(ModalFunctionality, {
this._super(...arguments); this._super(...arguments);
this.set("reminderUnits", ["minutes", "hours", "days", "weeks"]); this.set("reminderUnits", ["minutes", "hours", "days", "weeks"]);
this.set("reminderPeriods", ["before", "after"]);
}, },
modalTitle: computed("model.eventModel.isNew", { modalTitle: computed("model.eventModel.isNew", {

View File

@ -66,12 +66,12 @@
{{/event-field}} {{/event-field}}
{{#event-field class="reminders" label="discourse_post_event.builder_modal.reminders.label"}} {{#event-field class="reminders" label="discourse_post_event.builder_modal.reminders.label"}}
<p class="event-field-description">{{i18n "discourse_post_event.builder_modal.reminders.description"}}</p>
<div class="reminders-list"> <div class="reminders-list">
{{#each model.eventModel.reminders as |reminder|}} {{#each model.eventModel.reminders as |reminder|}}
<div class="reminder-item"> <div class="reminder-item">
{{input {{input
class="reminder-value" class="reminder-value"
min=0
value=(readonly reminder.value) value=(readonly reminder.value)
placeholderKey="discourse_post_event.builder_modal.name.placeholder" placeholderKey="discourse_post_event.builder_modal.name.placeholder"
input=(action (mut reminder.value) value="target.value") input=(action (mut reminder.value) value="target.value")
@ -86,6 +86,15 @@
onChange=(action (mut reminder.unit)) onChange=(action (mut reminder.unit))
}} }}
{{combo-box
class="reminder-period"
value=reminder.period
nameProperty=null
valueProperty=null
content=reminderPeriods
onChange=(action (mut reminder.period))
}}
{{d-button {{d-button
class="remove-reminder" class="remove-reminder"
icon="times" icon="times"

View File

@ -39,7 +39,20 @@ export function buildParams(startsAt, endsAt, eventModel) {
if (eventModel.reminders && eventModel.reminders.length) { if (eventModel.reminders && eventModel.reminders.length) {
params.reminders = eventModel.reminders params.reminders = eventModel.reminders
.map(r => `${r.value}.${r.unit}`) .map(r => {
// we create a new intermediate object to avoid changes in the UI while
// we prepare the values for request
const reminder = Object.assign({}, r);
if (reminder.period === "after") {
reminder.value = `-${Math.abs(parseInt(reminder.value, 10))}`;
}
if (reminder.period === "before") {
reminder.value = Math.abs(parseInt(`${reminder.value}`, 10));
}
return `${reminder.value}.${reminder.unit}`;
})
.join(","); .join(",");
} }

View File

@ -165,7 +165,17 @@
padding: 0.25em 0; padding: 0.25em 0;
.reminder-value { .reminder-value {
width: 80px; width: 60px;
margin-right: 0.5em;
}
.reminder-unit {
width: 140;
margin-right: 0.5em;
}
.reminder-period {
width: 100%;
margin-right: 0.5em; margin-right: 0.5em;
} }

View File

@ -343,7 +343,6 @@ en:
add_reminder: Add reminder add_reminder: Add reminder
reminders: reminders:
label: Reminders label: Reminders
description: A negative value will be sent after event started to `going` users who didn't visit the event since it started.
url: url:
label: URL label: URL
placeholder: Optional placeholder: Optional