diff --git a/app/assets/javascripts/discourse/app/components/modal/edit-slow-mode.hbs b/app/assets/javascripts/discourse/app/components/modal/edit-slow-mode.hbs new file mode 100644 index 00000000000..4a550bc5c5d --- /dev/null +++ b/app/assets/javascripts/discourse/app/components/modal/edit-slow-mode.hbs @@ -0,0 +1,70 @@ + + <:body> +
+ +
+
+ + +
+ {{#if this.showCustomSelect}} +
+ + + + + + +
+ {{/if}} + +
+ +
+ + <:footer> + + {{#if @model.topic.slow_mode_seconds}} + + {{/if}} + +
\ No newline at end of file diff --git a/app/assets/javascripts/discourse/app/components/modal/edit-slow-mode.js b/app/assets/javascripts/discourse/app/components/modal/edit-slow-mode.js new file mode 100644 index 00000000000..edc5ae8c4c8 --- /dev/null +++ b/app/assets/javascripts/discourse/app/components/modal/edit-slow-mode.js @@ -0,0 +1,183 @@ +import Component from "@glimmer/component"; +import { tracked } from "@glimmer/tracking"; +import { action } from "@ember/object"; +import { fromSeconds, toSeconds } from "discourse/helpers/slow-mode"; +import I18n from "I18n"; +import { timeShortcuts } from "discourse/lib/time-shortcut"; +import Topic from "discourse/models/topic"; +import { inject as service } from "@ember/service"; + +const SLOW_MODE_OPTIONS = [ + { + id: "600", + name: I18n.t("topic.slow_mode_update.durations.10_minutes"), + }, + { + id: "900", + name: I18n.t("topic.slow_mode_update.durations.15_minutes"), + }, + { + id: "1800", + name: I18n.t("topic.slow_mode_update.durations.30_minutes"), + }, + { + id: "2700", + name: I18n.t("topic.slow_mode_update.durations.45_minutes"), + }, + { + id: "3600", + name: I18n.t("topic.slow_mode_update.durations.1_hour"), + }, + { + id: "7200", + name: I18n.t("topic.slow_mode_update.durations.2_hours"), + }, + { + id: "14400", + name: I18n.t("topic.slow_mode_update.durations.4_hours"), + }, + { + id: "28800", + name: I18n.t("topic.slow_mode_update.durations.8_hours"), + }, + { + id: "43200", + name: I18n.t("topic.slow_mode_update.durations.12_hours"), + }, + { + id: "86400", + name: I18n.t("topic.slow_mode_update.durations.24_hours"), + }, + { + id: "custom", + name: I18n.t("topic.slow_mode_update.durations.custom"), + }, +]; + +export default class EditSlowMode extends Component { + @service currentUser; + + @tracked selectedSlowMode; + @tracked hours; + @tracked minutes; + @tracked seconds; + @tracked saveDisabled = false; + @tracked flash; + + constructor() { + super(...arguments); + const currentDuration = parseInt( + this.args.model.topic.slow_mode_seconds, + 10 + ); + if (currentDuration) { + const selectedDuration = this.slowModes.find( + (mode) => mode.id === currentDuration.toString() + ); + + if (selectedDuration) { + this.selectedSlowMode = currentDuration.toString(); + } else { + this.selectedSlowMode = "custom"; + } + + this._setFromSeconds(currentDuration); + } + } + + get slowModes() { + return SLOW_MODE_OPTIONS; + } + + get saveButtonLabel() { + return this.args.model.topic.slow_mode_seconds && + this.args.model.topic.slow_mode_seconds !== 0 + ? "topic.slow_mode_update.update" + : "topic.slow_mode_update.enable"; + } + + get timeShortcuts() { + const timezone = this.currentUser.user_option.timezone; + const shortcuts = timeShortcuts(timezone); + + const nextWeek = shortcuts.monday(); + nextWeek.label = "time_shortcut.next_week"; + + return [ + shortcuts.laterToday(), + shortcuts.tomorrow(), + shortcuts.twoDays(), + nextWeek, + shortcuts.twoWeeks(), + shortcuts.nextMonth(), + shortcuts.twoMonths(), + ]; + } + + get showCustomSelect() { + return this.selectedSlowMode === "custom"; + } + + get durationIsSet() { + return this.hours || this.minutes || this.seconds; + } + + @action + async enableSlowMode() { + this.saveDisabled = true; + const seconds = toSeconds( + this._parseValue(this.hours), + this._parseValue(this.minutes), + this._parseValue(this.seconds) + ); + + try { + await Topic.setSlowMode( + this.args.model.topic.id, + seconds, + this.args.model.topic.slow_mode_enabled_until + ); + this.args.model.topic.set("slow_mode_seconds", seconds); + this.args.closeModal(); + } catch { + this.flash = I18n.t("generic_error"); + } finally { + this.saveDisabled = false; + } + } + + @action + async disableSlowMode() { + this.saveDisabled = true; + try { + await Topic.setSlowMode(this.args.model.topic.id, 0); + this.args.model.topic.set("slow_mode_seconds", 0); + this.args.closeModal(); + } catch (e) { + this.flash = e; + } finally { + this.saveDisabled = false; + } + } + + @action + setSlowModeDuration(duration) { + if (duration !== "custom") { + let seconds = parseInt(duration, 10); + this._setFromSeconds(seconds); + } + + this.selectedSlowMode = duration; + } + + _setFromSeconds(seconds) { + const { hours, minutes, seconds: componentSeconds } = fromSeconds(seconds); + this.hours = hours; + this.minutes = minutes; + this.seconds = componentSeconds; + } + + _parseValue(value) { + return parseInt(value, 10) || 0; + } +} diff --git a/app/assets/javascripts/discourse/app/controllers/edit-slow-mode.js b/app/assets/javascripts/discourse/app/controllers/edit-slow-mode.js deleted file mode 100644 index b3da2b873ab..00000000000 --- a/app/assets/javascripts/discourse/app/controllers/edit-slow-mode.js +++ /dev/null @@ -1,183 +0,0 @@ -import { fromSeconds, toSeconds } from "discourse/helpers/slow-mode"; -import Controller from "@ember/controller"; -import I18n from "I18n"; -import ModalFunctionality from "discourse/mixins/modal-functionality"; -import Topic from "discourse/models/topic"; -import { action } from "@ember/object"; -import discourseComputed from "discourse-common/utils/decorators"; -import { equal, or } from "@ember/object/computed"; -import { popupAjaxError } from "discourse/lib/ajax-error"; -import { timeShortcuts } from "discourse/lib/time-shortcut"; - -export default Controller.extend(ModalFunctionality, { - selectedSlowMode: null, - hours: null, - minutes: null, - seconds: null, - saveDisabled: false, - showCustomSelect: equal("selectedSlowMode", "custom"), - durationIsSet: or("hours", "minutes", "seconds"), - - init() { - this._super(...arguments); - - this.set("slowModes", [ - { - id: "600", - name: I18n.t("topic.slow_mode_update.durations.10_minutes"), - }, - { - id: "900", - name: I18n.t("topic.slow_mode_update.durations.15_minutes"), - }, - { - id: "1800", - name: I18n.t("topic.slow_mode_update.durations.30_minutes"), - }, - { - id: "2700", - name: I18n.t("topic.slow_mode_update.durations.45_minutes"), - }, - { - id: "3600", - name: I18n.t("topic.slow_mode_update.durations.1_hour"), - }, - { - id: "7200", - name: I18n.t("topic.slow_mode_update.durations.2_hours"), - }, - { - id: "14400", - name: I18n.t("topic.slow_mode_update.durations.4_hours"), - }, - { - id: "28800", - name: I18n.t("topic.slow_mode_update.durations.8_hours"), - }, - { - id: "43200", - name: I18n.t("topic.slow_mode_update.durations.12_hours"), - }, - { - id: "86400", - name: I18n.t("topic.slow_mode_update.durations.24_hours"), - }, - { - id: "custom", - name: I18n.t("topic.slow_mode_update.durations.custom"), - }, - ]); - }, - - onShow() { - const currentDuration = parseInt(this.model.slow_mode_seconds, 10); - - if (currentDuration) { - const selectedDuration = this.slowModes.find((mode) => { - return mode.id === currentDuration.toString(); - }); - - if (selectedDuration) { - this.set("selectedSlowMode", currentDuration.toString()); - } else { - this.set("selectedSlowMode", "custom"); - } - - this._setFromSeconds(currentDuration); - } - }, - - @discourseComputed( - "saveDisabled", - "durationIsSet", - "model.slow_mode_enabled_until" - ) - submitDisabled(saveDisabled, durationIsSet, enabledUntil) { - return saveDisabled || !durationIsSet || !enabledUntil; - }, - - @discourseComputed("model.slow_mode_seconds") - slowModeEnabled(slowModeSeconds) { - return slowModeSeconds && slowModeSeconds !== 0; - }, - - @discourseComputed("slowModeEnabled") - saveButtonLabel(slowModeEnabled) { - return slowModeEnabled - ? "topic.slow_mode_update.update" - : "topic.slow_mode_update.enable"; - }, - - @discourseComputed - timeShortcuts() { - const timezone = this.currentUser.user_option.timezone; - const shortcuts = timeShortcuts(timezone); - - const nextWeek = shortcuts.monday(); - nextWeek.label = "time_shortcut.next_week"; - - return [ - shortcuts.laterToday(), - shortcuts.tomorrow(), - shortcuts.twoDays(), - nextWeek, - shortcuts.twoWeeks(), - shortcuts.nextMonth(), - shortcuts.twoMonths(), - ]; - }, - - _setFromSeconds(seconds) { - this.setProperties(fromSeconds(seconds)); - }, - - _parseValue(value) { - return parseInt(value, 10) || 0; - }, - - @action - setSlowModeDuration(duration) { - if (duration !== "custom") { - let seconds = parseInt(duration, 10); - - this._setFromSeconds(seconds); - } - - this.set("selectedSlowMode", duration); - }, - - @action - enableSlowMode() { - this.set("saveDisabled", true); - - const seconds = toSeconds( - this._parseValue(this.hours), - this._parseValue(this.minutes), - this._parseValue(this.seconds) - ); - - Topic.setSlowMode( - this.model.id, - seconds, - this.model.slow_mode_enabled_until - ) - .catch(popupAjaxError) - .then(() => { - this.set("model.slow_mode_seconds", seconds); - this.send("closeModal"); - }) - .finally(() => this.set("saveDisabled", false)); - }, - - @action - disableSlowMode() { - this.set("saveDisabled", true); - Topic.setSlowMode(this.model.id, 0) - .catch(popupAjaxError) - .then(() => { - this.set("model.slow_mode_seconds", 0); - this.send("closeModal"); - }) - .finally(() => this.set("saveDisabled", false)); - }, -}); diff --git a/app/assets/javascripts/discourse/app/routes/topic.js b/app/assets/javascripts/discourse/app/routes/topic.js index 8743d764655..5800fb02f05 100644 --- a/app/assets/javascripts/discourse/app/routes/topic.js +++ b/app/assets/javascripts/discourse/app/routes/topic.js @@ -12,6 +12,7 @@ import TopicFlag from "discourse/lib/flag-targets/topic-flag"; import PostFlag from "discourse/lib/flag-targets/post-flag"; import HistoryModal from "discourse/components/modal/history"; import PublishPageModal from "discourse/components/modal/publish-page"; +import EditSlowModeModal from "discourse/components/modal/edit-slow-mode"; const SCROLL_DELAY = 500; @@ -131,9 +132,9 @@ const TopicRoute = DiscourseRoute.extend({ @action showTopicSlowModeUpdate() { - const model = this.modelFor("topic"); - - showModal("edit-slow-mode", { model }); + this.modal.show(EditSlowModeModal, { + model: { topic: this.modelFor("topic") }, + }); }, @action diff --git a/app/assets/javascripts/discourse/app/services/modal.js b/app/assets/javascripts/discourse/app/services/modal.js index d84030ad5d4..3426436f154 100644 --- a/app/assets/javascripts/discourse/app/services/modal.js +++ b/app/assets/javascripts/discourse/app/services/modal.js @@ -25,7 +25,6 @@ const KNOWN_LEGACY_MODALS = [ "create-invite-bulk", "create-invite", "download-calendar", - "edit-slow-mode", "edit-topic-timer", "edit-user-directory-columns", "explain-reviewable", diff --git a/app/assets/javascripts/discourse/app/templates/modal/edit-slow-mode.hbs b/app/assets/javascripts/discourse/app/templates/modal/edit-slow-mode.hbs deleted file mode 100644 index b1e5fe87b07..00000000000 --- a/app/assets/javascripts/discourse/app/templates/modal/edit-slow-mode.hbs +++ /dev/null @@ -1,71 +0,0 @@ - -
- -
- -
- - -
- - {{#if this.showCustomSelect}} -
- - - - - - - - -
- {{/if}} - -
- -
-
- - \ No newline at end of file