diff --git a/app/assets/javascripts/admin/components/ace-editor.js.es6 b/app/assets/javascripts/admin/components/ace-editor.js.es6 index 60498a0bdb0..4fc881dae4f 100644 --- a/app/assets/javascripts/admin/components/ace-editor.js.es6 +++ b/app/assets/javascripts/admin/components/ace-editor.js.es6 @@ -1,6 +1,6 @@ import Component from "@ember/component"; import loadScript from "discourse/lib/load-script"; -import { observes } from "ember-addons/ember-computed-decorators"; +import { observes } from "discourse-common/utils/decorators"; import { on } from "@ember/object/evented"; export default Component.extend({ diff --git a/app/assets/javascripts/admin/components/admin-backups-logs.js.es6 b/app/assets/javascripts/admin/components/admin-backups-logs.js.es6 index ccacb2e705d..72706af79fa 100644 --- a/app/assets/javascripts/admin/components/admin-backups-logs.js.es6 +++ b/app/assets/javascripts/admin/components/admin-backups-logs.js.es6 @@ -4,7 +4,7 @@ import debounce from "discourse/lib/debounce"; import { renderSpinner } from "discourse/helpers/loading-spinner"; import { escapeExpression } from "discourse/lib/utilities"; import { bufferedRender } from "discourse-common/lib/buffered-render"; -import { observes, on } from "ember-addons/ember-computed-decorators"; +import { observes, on } from "discourse-common/utils/decorators"; export default Component.extend( bufferedRender({ diff --git a/app/assets/javascripts/admin/components/admin-report-storage-stats.js.es6 b/app/assets/javascripts/admin/components/admin-report-storage-stats.js.es6 index 948ecf1e87c..61629c626e1 100644 --- a/app/assets/javascripts/admin/components/admin-report-storage-stats.js.es6 +++ b/app/assets/javascripts/admin/components/admin-report-storage-stats.js.es6 @@ -1,7 +1,7 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { alias } from "@ember/object/computed"; import Component from "@ember/component"; import { setting } from "discourse/lib/computed"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ classNames: ["admin-report-storage-stats"], @@ -10,32 +10,32 @@ export default Component.extend({ backupStats: alias("model.data.backups"), uploadStats: alias("model.data.uploads"), - @computed("backupStats") + @discourseComputed("backupStats") showBackupStats(stats) { return stats && this.currentUser.admin; }, - @computed("backupLocation") + @discourseComputed("backupLocation") backupLocationName(backupLocation) { return I18n.t(`admin.backups.location.${backupLocation}`); }, - @computed("backupStats.used_bytes") + @discourseComputed("backupStats.used_bytes") usedBackupSpace(bytes) { return I18n.toHumanSize(bytes); }, - @computed("backupStats.free_bytes") + @discourseComputed("backupStats.free_bytes") freeBackupSpace(bytes) { return I18n.toHumanSize(bytes); }, - @computed("uploadStats.used_bytes") + @discourseComputed("uploadStats.used_bytes") usedUploadSpace(bytes) { return I18n.toHumanSize(bytes); }, - @computed("uploadStats.free_bytes") + @discourseComputed("uploadStats.free_bytes") freeUploadSpace(bytes) { return I18n.toHumanSize(bytes); } diff --git a/app/assets/javascripts/admin/components/admin-report-table-cell.js.es6 b/app/assets/javascripts/admin/components/admin-report-table-cell.js.es6 index f83a33dbfb7..e7bf688f2f4 100644 --- a/app/assets/javascripts/admin/components/admin-report-table-cell.js.es6 +++ b/app/assets/javascripts/admin/components/admin-report-table-cell.js.es6 @@ -1,6 +1,6 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { alias } from "@ember/object/computed"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ tagName: "td", @@ -8,7 +8,7 @@ export default Component.extend({ classNameBindings: ["type", "property"], options: null, - @computed("label", "data", "options") + @discourseComputed("label", "data", "options") computedLabel(label, data, options) { return label.compute(data, options || {}); }, diff --git a/app/assets/javascripts/admin/components/admin-report-table-header.js.es6 b/app/assets/javascripts/admin/components/admin-report-table-header.js.es6 index 9317ef1f662..bc5633b21d5 100644 --- a/app/assets/javascripts/admin/components/admin-report-table-header.js.es6 +++ b/app/assets/javascripts/admin/components/admin-report-table-header.js.es6 @@ -1,5 +1,5 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ tagName: "th", @@ -7,12 +7,12 @@ export default Component.extend({ classNameBindings: ["label.mainProperty", "label.type", "isCurrentSort"], attributeBindings: ["label.title:title"], - @computed("currentSortLabel.sortProperty", "label.sortProperty") + @discourseComputed("currentSortLabel.sortProperty", "label.sortProperty") isCurrentSort(currentSortField, labelSortField) { return currentSortField === labelSortField; }, - @computed("currentSortDirection") + @discourseComputed("currentSortDirection") sortIcon(currentSortDirection) { return currentSortDirection === 1 ? "caret-up" : "caret-down"; } diff --git a/app/assets/javascripts/admin/components/admin-report-table.js.es6 b/app/assets/javascripts/admin/components/admin-report-table.js.es6 index 38e00c8ab80..aa636224d46 100644 --- a/app/assets/javascripts/admin/components/admin-report-table.js.es6 +++ b/app/assets/javascripts/admin/components/admin-report-table.js.es6 @@ -1,7 +1,7 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { makeArray } from "discourse-common/lib/helpers"; import { alias } from "@ember/object/computed"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; const PAGES_LIMIT = 8; @@ -13,12 +13,16 @@ export default Component.extend({ perPage: alias("options.perPage"), page: 0, - @computed("model.computedLabels.length") + @discourseComputed("model.computedLabels.length") twoColumns(labelsLength) { return labelsLength === 2; }, - @computed("totalsForSample", "options.total", "model.dates_filtering") + @discourseComputed( + "totalsForSample", + "options.total", + "model.dates_filtering" + ) showTotalForSample(totalsForSample, total, datesFiltering) { // check if we have at least one cell which contains a value const sum = totalsForSample @@ -29,12 +33,16 @@ export default Component.extend({ return sum >= 1 && total && datesFiltering; }, - @computed("model.total", "options.total", "twoColumns") + @discourseComputed("model.total", "options.total", "twoColumns") showTotal(reportTotal, total, twoColumns) { return reportTotal && total && twoColumns; }, - @computed("model.{average,data}", "totalsForSample.1.value", "twoColumns") + @discourseComputed( + "model.{average,data}", + "totalsForSample.1.value", + "twoColumns" + ) showAverage(model, sampleTotalValue, hasTwoColumns) { return ( model.average && @@ -44,17 +52,17 @@ export default Component.extend({ ); }, - @computed("totalsForSample.1.value", "model.data.length") + @discourseComputed("totalsForSample.1.value", "model.data.length") averageForSample(totals, count) { return (totals / count).toFixed(0); }, - @computed("model.data.length") + @discourseComputed("model.data.length") showSortingUI(dataLength) { return dataLength >= 5; }, - @computed("totalsForSampleRow", "model.computedLabels") + @discourseComputed("totalsForSampleRow", "model.computedLabels") totalsForSample(row, labels) { return labels.map(label => { const computedLabel = label.compute(row); @@ -64,7 +72,7 @@ export default Component.extend({ }); }, - @computed("model.data", "model.computedLabels") + @discourseComputed("model.data", "model.computedLabels") totalsForSampleRow(rows, labels) { if (!rows || !rows.length) return {}; @@ -90,7 +98,7 @@ export default Component.extend({ return totalsRow; }, - @computed("sortLabel", "sortDirection", "model.data.[]") + @discourseComputed("sortLabel", "sortDirection", "model.data.[]") sortedData(sortLabel, sortDirection, data) { data = makeArray(data); @@ -110,7 +118,7 @@ export default Component.extend({ return data; }, - @computed("sortedData.[]", "perPage", "page") + @discourseComputed("sortedData.[]", "perPage", "page") paginatedData(data, perPage, page) { if (perPage < data.length) { const start = perPage * page; @@ -120,7 +128,7 @@ export default Component.extend({ return data; }, - @computed("model.data", "perPage", "page") + @discourseComputed("model.data", "perPage", "page") pages(data, perPage, page) { if (!data || data.length <= perPage) return []; diff --git a/app/assets/javascripts/admin/components/admin-report.js.es6 b/app/assets/javascripts/admin/components/admin-report.js.es6 index 59aaf29c3be..cb70fc07ffb 100644 --- a/app/assets/javascripts/admin/components/admin-report.js.es6 +++ b/app/assets/javascripts/admin/components/admin-report.js.es6 @@ -1,3 +1,4 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { makeArray } from "discourse-common/lib/helpers"; import { alias, or, and, reads, equal, notEmpty } from "@ember/object/computed"; import EmberObject from "@ember/object"; @@ -8,7 +9,6 @@ import { exportEntity } from "discourse/lib/export-csv"; import { outputExportResult } from "discourse/lib/export-result"; import { isNumeric } from "discourse/lib/utilities"; import { SCHEMA_VERSION, default as Report } from "admin/models/report"; -import computed from "ember-addons/ember-computed-decorators"; import ENV from "discourse-common/config/environment"; const TABLE_OPTIONS = { @@ -90,23 +90,23 @@ export default Component.extend({ hasData: notEmpty("model.data"), - @computed("dataSourceName", "model.type") + @discourseComputed("dataSourceName", "model.type") dasherizedDataSourceName(dataSourceName, type) { return (dataSourceName || type || "undefined").replace(/_/g, "-"); }, - @computed("dataSourceName", "model.type") + @discourseComputed("dataSourceName", "model.type") dataSource(dataSourceName, type) { dataSourceName = dataSourceName || type; return `/admin/reports/${dataSourceName}`; }, - @computed("displayedModes.length") + @discourseComputed("displayedModes.length") showModes(displayedModesLength) { return displayedModesLength > 1; }, - @computed("currentMode", "model.modes", "forcedModes") + @discourseComputed("currentMode", "model.modes", "forcedModes") displayedModes(currentMode, reportModes, forcedModes) { const modes = forcedModes ? forcedModes.split(",") : reportModes; @@ -122,12 +122,12 @@ export default Component.extend({ }); }, - @computed("currentMode") + @discourseComputed("currentMode") modeComponent(currentMode) { return `admin-report-${currentMode}`; }, - @computed("startDate") + @discourseComputed("startDate") normalizedStartDate(startDate) { return startDate && typeof startDate.isValid === "function" ? moment @@ -139,7 +139,7 @@ export default Component.extend({ .format("YYYYMMDD"); }, - @computed("endDate") + @discourseComputed("endDate") normalizedEndDate(endDate) { return endDate && typeof endDate.isValid === "function" ? moment @@ -151,7 +151,7 @@ export default Component.extend({ .format("YYYYMMDD"); }, - @computed( + @discourseComputed( "dataSourceName", "normalizedStartDate", "normalizedEndDate", diff --git a/app/assets/javascripts/admin/components/admin-theme-editor.js.es6 b/app/assets/javascripts/admin/components/admin-theme-editor.js.es6 index 1dec9fce37b..381ac0ca47e 100644 --- a/app/assets/javascripts/admin/components/admin-theme-editor.js.es6 +++ b/app/assets/javascripts/admin/components/admin-theme-editor.js.es6 @@ -1,10 +1,10 @@ import { next } from "@ember/runloop"; import Component from "@ember/component"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import { fmt } from "discourse/lib/computed"; export default Component.extend({ - @computed("theme.targets", "onlyOverridden", "showAdvanced") + @discourseComputed("theme.targets", "onlyOverridden", "showAdvanced") visibleTargets(targets, onlyOverridden, showAdvanced) { return targets.filter(target => { if (target.advanced && !showAdvanced) { @@ -17,7 +17,7 @@ export default Component.extend({ }); }, - @computed("currentTargetName", "onlyOverridden", "theme.fields") + @discourseComputed("currentTargetName", "onlyOverridden", "theme.fields") visibleFields(targetName, onlyOverridden, fields) { fields = fields[targetName]; if (onlyOverridden) { @@ -26,14 +26,14 @@ export default Component.extend({ return fields; }, - @computed("currentTargetName", "fieldName") + @discourseComputed("currentTargetName", "fieldName") activeSectionMode(targetName, fieldName) { if (["settings", "translations"].includes(targetName)) return "yaml"; if (["extra_scss"].includes(targetName)) return "scss"; return fieldName && fieldName.indexOf("scss") > -1 ? "scss" : "html"; }, - @computed("fieldName", "currentTargetName", "theme") + @discourseComputed("fieldName", "currentTargetName", "theme") activeSection: { get(fieldName, target, model) { return model.getField(target, fieldName); @@ -46,17 +46,21 @@ export default Component.extend({ editorId: fmt("fieldName", "currentTargetName", "%@|%@"), - @computed("maximized") + @discourseComputed("maximized") maximizeIcon(maximized) { return maximized ? "discourse-compress" : "discourse-expand"; }, - @computed("currentTargetName", "theme.targets") + @discourseComputed("currentTargetName", "theme.targets") showAddField(currentTargetName, targets) { return targets.find(t => t.name === currentTargetName).customNames; }, - @computed("currentTargetName", "fieldName", "theme.theme_fields.@each.error") + @discourseComputed( + "currentTargetName", + "fieldName", + "theme.theme_fields.@each.error" + ) error(target, fieldName) { return this.theme.getError(target, fieldName); }, diff --git a/app/assets/javascripts/admin/components/admin-user-field-item.js.es6 b/app/assets/javascripts/admin/components/admin-user-field-item.js.es6 index 23bfac19b42..a392196f8a8 100644 --- a/app/assets/javascripts/admin/components/admin-user-field-item.js.es6 +++ b/app/assets/javascripts/admin/components/admin-user-field-item.js.es6 @@ -8,10 +8,10 @@ import { popupAjaxError } from "discourse/lib/ajax-error"; import { propertyEqual } from "discourse/lib/computed"; import { i18n } from "discourse/lib/computed"; import { - default as computed, + default as discourseComputed, observes, on -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; export default Component.extend(bufferedProperty("userField"), { editing: empty("userField.id"), @@ -22,7 +22,7 @@ export default Component.extend(bufferedProperty("userField"), { userFieldsDescription: i18n("admin.user_fields.description"), - @computed("buffered.field_type") + @discourseComputed("buffered.field_type") bufferedFieldType(fieldType) { return UserField.fieldTypeById(fieldType); }, @@ -39,12 +39,12 @@ export default Component.extend(bufferedProperty("userField"), { $(".user-field-name").select(); }, - @computed("userField.field_type") + @discourseComputed("userField.field_type") fieldName(fieldType) { return UserField.fieldTypeById(fieldType).get("name"); }, - @computed( + @discourseComputed( "userField.editable", "userField.required", "userField.show_on_profile", diff --git a/app/assets/javascripts/admin/components/admin-web-hook-event-chooser.js.es6 b/app/assets/javascripts/admin/components/admin-web-hook-event-chooser.js.es6 index 1c7f6f05a0f..a38695c7351 100644 --- a/app/assets/javascripts/admin/components/admin-web-hook-event-chooser.js.es6 +++ b/app/assets/javascripts/admin/components/admin-web-hook-event-chooser.js.es6 @@ -1,27 +1,27 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { alias } from "@ember/object/computed"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ classNames: ["hook-event"], typeName: alias("type.name"), - @computed("typeName") + @discourseComputed("typeName") name(typeName) { return I18n.t(`admin.web_hooks.${typeName}_event.name`); }, - @computed("typeName") + @discourseComputed("typeName") details(typeName) { return I18n.t(`admin.web_hooks.${typeName}_event.details`); }, - @computed("model.[]", "typeName") + @discourseComputed("model.[]", "typeName") eventTypeExists(eventTypes, typeName) { return eventTypes.any(event => event.name === typeName); }, - @computed("eventTypeExists") + @discourseComputed("eventTypeExists") enabled: { get(eventTypeExists) { return eventTypeExists; diff --git a/app/assets/javascripts/admin/components/admin-web-hook-event.js.es6 b/app/assets/javascripts/admin/components/admin-web-hook-event.js.es6 index 693e6502ff6..365e22aa678 100644 --- a/app/assets/javascripts/admin/components/admin-web-hook-event.js.es6 +++ b/app/assets/javascripts/admin/components/admin-web-hook-event.js.es6 @@ -1,5 +1,5 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; import { ajax } from "discourse/lib/ajax"; import { popupAjaxError } from "discourse/lib/ajax-error"; import { ensureJSON, plainJSON, prettyJSON } from "discourse/lib/formatter"; @@ -10,7 +10,7 @@ export default Component.extend({ expandDetailsRequestKey: "request", expandDetailsResponseKey: "response", - @computed("model.status") + @discourseComputed("model.status") statusColorClasses(status) { if (!status) return ""; @@ -21,25 +21,25 @@ export default Component.extend({ } }, - @computed("model.created_at") + @discourseComputed("model.created_at") createdAt(createdAt) { return moment(createdAt).format("YYYY-MM-DD HH:mm:ss"); }, - @computed("model.duration") + @discourseComputed("model.duration") completion(duration) { const seconds = Math.floor(duration / 10.0) / 100.0; return I18n.t("admin.web_hooks.events.completed_in", { count: seconds }); }, - @computed("expandDetails") + @discourseComputed("expandDetails") expandRequestIcon(expandDetails) { return expandDetails === this.expandDetailsRequestKey ? "ellipsis-h" : "ellipsis-v"; }, - @computed("expandDetails") + @discourseComputed("expandDetails") expandResponseIcon(expandDetails) { return expandDetails === this.expandDetailsResponseKey ? "ellipsis-h" diff --git a/app/assets/javascripts/admin/components/admin-web-hook-status.js.es6 b/app/assets/javascripts/admin/components/admin-web-hook-status.js.es6 index 0d8e80cc81c..b023a330c72 100644 --- a/app/assets/javascripts/admin/components/admin-web-hook-status.js.es6 +++ b/app/assets/javascripts/admin/components/admin-web-hook-status.js.es6 @@ -1,5 +1,5 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; import { iconHTML } from "discourse-common/lib/icon-library"; import { bufferedRender } from "discourse-common/lib/buffered-render"; @@ -8,17 +8,17 @@ export default Component.extend( classes: ["text-muted", "text-danger", "text-successful", "text-muted"], icons: ["far-circle", "times-circle", "circle", "circle"], - @computed("deliveryStatuses", "model.last_delivery_status") + @discourseComputed("deliveryStatuses", "model.last_delivery_status") status(deliveryStatuses, lastDeliveryStatus) { return deliveryStatuses.find(s => s.id === lastDeliveryStatus); }, - @computed("status.id", "icons") + @discourseComputed("status.id", "icons") icon(statusId, icons) { return icons[statusId - 1]; }, - @computed("status.id", "classes") + @discourseComputed("status.id", "classes") class(statusId, classes) { return classes[statusId - 1]; }, diff --git a/app/assets/javascripts/admin/components/email-styles-editor.js.es6 b/app/assets/javascripts/admin/components/email-styles-editor.js.es6 index e465c04cba3..ef5cdb077e5 100644 --- a/app/assets/javascripts/admin/components/email-styles-editor.js.es6 +++ b/app/assets/javascripts/admin/components/email-styles-editor.js.es6 @@ -1,16 +1,16 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { reads } from "@ember/object/computed"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ editorId: reads("fieldName"), - @computed("fieldName") + @discourseComputed("fieldName") currentEditorMode(fieldName) { return fieldName === "css" ? "scss" : fieldName; }, - @computed("fieldName", "styles.html", "styles.css") + @discourseComputed("fieldName", "styles.html", "styles.css") resetDisabled(fieldName) { return ( this.get(`styles.${fieldName}`) === @@ -18,7 +18,7 @@ export default Component.extend({ ); }, - @computed("styles", "fieldName") + @discourseComputed("styles", "fieldName") editorContents: { get(styles, fieldName) { return styles[fieldName]; diff --git a/app/assets/javascripts/admin/components/embeddable-host.js.es6 b/app/assets/javascripts/admin/components/embeddable-host.js.es6 index 57829b45fb9..054acc744cc 100644 --- a/app/assets/javascripts/admin/components/embeddable-host.js.es6 +++ b/app/assets/javascripts/admin/components/embeddable-host.js.es6 @@ -1,10 +1,10 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { isEmpty } from "@ember/utils"; import { or } from "@ember/object/computed"; import { schedule } from "@ember/runloop"; import Component from "@ember/component"; import { bufferedProperty } from "discourse/mixins/buffered-content"; -import computed from "ember-addons/ember-computed-decorators"; -import { on, observes } from "ember-addons/ember-computed-decorators"; +import { on, observes } from "discourse-common/utils/decorators"; import { popupAjaxError } from "discourse/lib/ajax-error"; export default Component.extend(bufferedProperty("host"), { @@ -22,7 +22,7 @@ export default Component.extend(bufferedProperty("host"), { }); }, - @computed("buffered.host", "host.isSaving") + @discourseComputed("buffered.host", "host.isSaving") cantSave(host, isSaving) { return isSaving || isEmpty(host); }, diff --git a/app/assets/javascripts/admin/components/embedding-setting.js.es6 b/app/assets/javascripts/admin/components/embedding-setting.js.es6 index da7f9abb7ff..517e37f4f98 100644 --- a/app/assets/javascripts/admin/components/embedding-setting.js.es6 +++ b/app/assets/javascripts/admin/components/embedding-setting.js.es6 @@ -1,25 +1,25 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ classNames: ["embed-setting"], - @computed("field") + @discourseComputed("field") inputId(field) { return field.dasherize(); }, - @computed("field") + @discourseComputed("field") translationKey(field) { return `admin.embedding.${field}`; }, - @computed("type") + @discourseComputed("type") isCheckbox(type) { return type === "checkbox"; }, - @computed("value") + @discourseComputed("value") checked: { get(value) { return !!value; diff --git a/app/assets/javascripts/admin/components/highlighted-code.js.es6 b/app/assets/javascripts/admin/components/highlighted-code.js.es6 index d182d7e2a1a..9159bb574ad 100644 --- a/app/assets/javascripts/admin/components/highlighted-code.js.es6 +++ b/app/assets/javascripts/admin/components/highlighted-code.js.es6 @@ -1,5 +1,5 @@ import Component from "@ember/component"; -import { on, observes } from "ember-addons/ember-computed-decorators"; +import { on, observes } from "discourse-common/utils/decorators"; import highlightSyntax from "discourse/lib/highlight-syntax"; export default Component.extend({ diff --git a/app/assets/javascripts/admin/components/inline-edit-checkbox.js.es6 b/app/assets/javascripts/admin/components/inline-edit-checkbox.js.es6 index e88c2bc3b71..ff3cb98ffcf 100644 --- a/app/assets/javascripts/admin/components/inline-edit-checkbox.js.es6 +++ b/app/assets/javascripts/admin/components/inline-edit-checkbox.js.es6 @@ -1,8 +1,8 @@ import Component from "@ember/component"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; export default Component.extend({ classNames: ["inline-edit"], @@ -21,12 +21,12 @@ export default Component.extend({ this.set("checkedInternal", this.checked); }, - @computed("labelKey") + @discourseComputed("labelKey") label(key) { return I18n.t(key); }, - @computed("checked", "checkedInternal") + @discourseComputed("checked", "checkedInternal") changed(checked, checkedInternal) { return !!checked !== !!checkedInternal; }, diff --git a/app/assets/javascripts/admin/components/ip-lookup.js.es6 b/app/assets/javascripts/admin/components/ip-lookup.js.es6 index 8438a4ee5c4..06421e2e908 100644 --- a/app/assets/javascripts/admin/components/ip-lookup.js.es6 +++ b/app/assets/javascripts/admin/components/ip-lookup.js.es6 @@ -1,7 +1,7 @@ import EmberObject from "@ember/object"; import { later } from "@ember/runloop"; import Component from "@ember/component"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import { ajax } from "discourse/lib/ajax"; import AdminUser from "admin/models/admin-user"; import copyText from "discourse/lib/copy-text"; @@ -9,7 +9,7 @@ import copyText from "discourse/lib/copy-text"; export default Component.extend({ classNames: ["ip-lookup"], - @computed("other_accounts.length", "totalOthersWithSameIP") + @discourseComputed("other_accounts.length", "totalOthersWithSameIP") otherAccountsToDelete(otherAccountsLength, totalOthersWithSameIP) { // can only delete up to 50 accounts at a time const total = Math.min(50, totalOthersWithSameIP || 0); diff --git a/app/assets/javascripts/admin/components/penalty-post-action.js.es6 b/app/assets/javascripts/admin/components/penalty-post-action.js.es6 index 8af1f83b160..6a703105fbf 100644 --- a/app/assets/javascripts/admin/components/penalty-post-action.js.es6 +++ b/app/assets/javascripts/admin/components/penalty-post-action.js.es6 @@ -1,7 +1,7 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { equal } from "@ember/object/computed"; import { scheduleOnce } from "@ember/runloop"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; const ACTIONS = ["delete", "delete_replies", "edit", "none"]; @@ -10,7 +10,7 @@ export default Component.extend({ postAction: null, postEdit: null, - @computed + @discourseComputed penaltyActions() { return ACTIONS.map(id => { return { id, name: I18n.t(`admin.user.penalty_post_${id}`) }; diff --git a/app/assets/javascripts/admin/components/permalink-form.js.es6 b/app/assets/javascripts/admin/components/permalink-form.js.es6 index b1f82ea2958..5a90dd9913d 100644 --- a/app/assets/javascripts/admin/components/permalink-form.js.es6 +++ b/app/assets/javascripts/admin/components/permalink-form.js.es6 @@ -1,6 +1,6 @@ import { schedule } from "@ember/runloop"; import Component from "@ember/component"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import { fmt } from "discourse/lib/computed"; import Permalink from "admin/models/permalink"; @@ -10,7 +10,7 @@ export default Component.extend({ permalinkType: "topic_id", permalinkTypePlaceholder: fmt("permalinkType", "admin.permalink.%@"), - @computed + @discourseComputed permalinkTypes() { return [ { id: "topic_id", name: I18n.t("admin.permalink.topic_id") }, diff --git a/app/assets/javascripts/admin/components/report-filters/category.js.es6 b/app/assets/javascripts/admin/components/report-filters/category.js.es6 index 7efdd4a465b..60fb61be9b1 100644 --- a/app/assets/javascripts/admin/components/report-filters/category.js.es6 +++ b/app/assets/javascripts/admin/components/report-filters/category.js.es6 @@ -1,5 +1,5 @@ import Category from "discourse/models/category"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import FilterComponent from "admin/components/report-filters/filter"; export default FilterComponent.extend({ @@ -7,7 +7,7 @@ export default FilterComponent.extend({ layoutName: "admin/templates/components/report-filters/category", - @computed("filter.default") + @discourseComputed("filter.default") category(categoryId) { return Category.findById(categoryId); }, diff --git a/app/assets/javascripts/admin/components/report-filters/group.js.es6 b/app/assets/javascripts/admin/components/report-filters/group.js.es6 index 54523f9446e..0821cb084e4 100644 --- a/app/assets/javascripts/admin/components/report-filters/group.js.es6 +++ b/app/assets/javascripts/admin/components/report-filters/group.js.es6 @@ -1,19 +1,19 @@ import FilterComponent from "admin/components/report-filters/filter"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; export default FilterComponent.extend({ classNames: ["group-filter"], layoutName: "admin/templates/components/report-filters/group", - @computed() + @discourseComputed() groupOptions() { return (this.site.groups || []).map(group => { return { name: group["name"], value: group["id"] }; }); }, - @computed("filter.default") + @discourseComputed("filter.default") groupId(filterDefault) { return filterDefault ? parseInt(filterDefault, 10) : null; } diff --git a/app/assets/javascripts/admin/components/resumable-upload.js.es6 b/app/assets/javascripts/admin/components/resumable-upload.js.es6 index d63a1a651de..925bdf0de9a 100644 --- a/app/assets/javascripts/admin/components/resumable-upload.js.es6 +++ b/app/assets/javascripts/admin/components/resumable-upload.js.es6 @@ -4,9 +4,9 @@ import Component from "@ember/component"; import { iconHTML } from "discourse-common/lib/icon-library"; import { bufferedRender } from "discourse-common/lib/buffered-render"; import { - default as computed, + default as discourseComputed, on -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; /*global Resumable:true */ @@ -91,12 +91,12 @@ export default Component.extend( } }, - @computed("title", "text") + @discourseComputed("title", "text") translatedTitle(title, text) { return title ? I18n.t(title) : text; }, - @computed("isUploading", "progress") + @discourseComputed("isUploading", "progress") text(isUploading, progress) { if (isUploading) { return progress + " %"; diff --git a/app/assets/javascripts/admin/components/save-controls.js.es6 b/app/assets/javascripts/admin/components/save-controls.js.es6 index b039b0158c2..9da4e49fe25 100644 --- a/app/assets/javascripts/admin/components/save-controls.js.es6 +++ b/app/assets/javascripts/admin/components/save-controls.js.es6 @@ -1,13 +1,13 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { or } from "@ember/object/computed"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ classNames: ["controls"], buttonDisabled: or("model.isSaving", "saveDisabled"), - @computed("model.isSaving") + @discourseComputed("model.isSaving") savingText(saving) { return saving ? "saving" : "save"; } diff --git a/app/assets/javascripts/admin/components/screened-ip-address-form.js.es6 b/app/assets/javascripts/admin/components/screened-ip-address-form.js.es6 index 8b6db577649..48b92641b43 100644 --- a/app/assets/javascripts/admin/components/screened-ip-address-form.js.es6 +++ b/app/assets/javascripts/admin/components/screened-ip-address-form.js.es6 @@ -1,3 +1,4 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { schedule } from "@ember/runloop"; import Component from "@ember/component"; /** @@ -12,20 +13,19 @@ import Component from "@ember/component"; **/ import ScreenedIpAddress from "admin/models/screened-ip-address"; -import computed from "ember-addons/ember-computed-decorators"; -import { on } from "ember-addons/ember-computed-decorators"; +import { on } from "discourse-common/utils/decorators"; export default Component.extend({ classNames: ["screened-ip-address-form"], formSubmitted: false, actionName: "block", - @computed + @discourseComputed adminWhitelistEnabled() { return Discourse.SiteSettings.use_admin_ip_whitelist; }, - @computed("adminWhitelistEnabled") + @discourseComputed("adminWhitelistEnabled") actionNames(adminWhitelistEnabled) { if (adminWhitelistEnabled) { return [ diff --git a/app/assets/javascripts/admin/components/secret-value-list.js.es6 b/app/assets/javascripts/admin/components/secret-value-list.js.es6 index 4327f62f805..ea4ecf792cc 100644 --- a/app/assets/javascripts/admin/components/secret-value-list.js.es6 +++ b/app/assets/javascripts/admin/components/secret-value-list.js.es6 @@ -1,6 +1,6 @@ import { isEmpty } from "@ember/utils"; import Component from "@ember/component"; -import { on } from "ember-addons/ember-computed-decorators"; +import { on } from "discourse-common/utils/decorators"; import { set } from "@ember/object"; export default Component.extend({ diff --git a/app/assets/javascripts/admin/components/site-settings/bool.js.es6 b/app/assets/javascripts/admin/components/site-settings/bool.js.es6 index 2b2fdaca8e3..88f4387601e 100644 --- a/app/assets/javascripts/admin/components/site-settings/bool.js.es6 +++ b/app/assets/javascripts/admin/components/site-settings/bool.js.es6 @@ -1,9 +1,9 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { isEmpty } from "@ember/utils"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ - @computed("value") + @discourseComputed("value") enabled: { get(value) { if (isEmpty(value)) { diff --git a/app/assets/javascripts/admin/components/site-settings/category-list.js.es6 b/app/assets/javascripts/admin/components/site-settings/category-list.js.es6 index d4476ddf130..5d4b68b19b2 100644 --- a/app/assets/javascripts/admin/components/site-settings/category-list.js.es6 +++ b/app/assets/javascripts/admin/components/site-settings/category-list.js.es6 @@ -1,8 +1,8 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ - @computed("value") + @discourseComputed("value") selectedCategories: { get(value) { return Discourse.Category.findByIds(value.split("|")); diff --git a/app/assets/javascripts/admin/components/site-settings/group-list.js.es6 b/app/assets/javascripts/admin/components/site-settings/group-list.js.es6 index 21af030269b..97736c36ca1 100644 --- a/app/assets/javascripts/admin/components/site-settings/group-list.js.es6 +++ b/app/assets/javascripts/admin/components/site-settings/group-list.js.es6 @@ -1,8 +1,8 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ - @computed() + @discourseComputed() groupChoices() { return this.site.get("groups").map(g => { return { name: g.name, id: g.id.toString() }; diff --git a/app/assets/javascripts/admin/components/site-settings/tag-list.js.es6 b/app/assets/javascripts/admin/components/site-settings/tag-list.js.es6 index 417ad622cb8..c8a8e0a06ff 100644 --- a/app/assets/javascripts/admin/components/site-settings/tag-list.js.es6 +++ b/app/assets/javascripts/admin/components/site-settings/tag-list.js.es6 @@ -1,8 +1,8 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ - @computed("value") + @discourseComputed("value") selectedTags: { get(value) { return value.split("|"); diff --git a/app/assets/javascripts/admin/components/site-text-summary.js.es6 b/app/assets/javascripts/admin/components/site-text-summary.js.es6 index 4467a092d13..11c6bc45ebb 100644 --- a/app/assets/javascripts/admin/components/site-text-summary.js.es6 +++ b/app/assets/javascripts/admin/components/site-text-summary.js.es6 @@ -1,5 +1,5 @@ import Component from "@ember/component"; -import { on } from "ember-addons/ember-computed-decorators"; +import { on } from "discourse-common/utils/decorators"; export default Component.extend({ classNames: ["site-text"], diff --git a/app/assets/javascripts/admin/components/themes-list-item.js.es6 b/app/assets/javascripts/admin/components/themes-list-item.js.es6 index 2c4a5265b8a..cfc1b63a368 100644 --- a/app/assets/javascripts/admin/components/themes-list-item.js.es6 +++ b/app/assets/javascripts/admin/components/themes-list-item.js.es6 @@ -2,9 +2,9 @@ import { gt, and } from "@ember/object/computed"; import { schedule } from "@ember/runloop"; import Component from "@ember/component"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import { iconHTML } from "discourse-common/lib/icon-library"; import { escape } from "pretty-text/sanitizer"; import ENV from "discourse-common/config/environment"; @@ -55,7 +55,7 @@ export default Component.extend({ } }, - @computed( + @discourseComputed( "theme.component", "theme.childThemes.@each.name", "theme.childThemes.length", @@ -76,12 +76,12 @@ export default Component.extend({ }); }, - @computed("children") + @discourseComputed("children") childrenString(children) { return children.join(", "); }, - @computed( + @discourseComputed( "theme.childThemes.length", "theme.component", "childrenExpanded", diff --git a/app/assets/javascripts/admin/components/themes-list.js.es6 b/app/assets/javascripts/admin/components/themes-list.js.es6 index 1a420eeba81..ae883a115dd 100644 --- a/app/assets/javascripts/admin/components/themes-list.js.es6 +++ b/app/assets/javascripts/admin/components/themes-list.js.es6 @@ -1,7 +1,7 @@ import { gt, equal } from "@ember/object/computed"; import Component from "@ember/component"; import { THEMES, COMPONENTS } from "admin/models/theme"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; import { getOwner } from "@ember/application"; export default Component.extend({ @@ -17,7 +17,7 @@ export default Component.extend({ themesTabActive: equal("currentTab", THEMES), componentsTabActive: equal("currentTab", COMPONENTS), - @computed("themes", "components", "currentTab") + @discourseComputed("themes", "components", "currentTab") themesList(themes, components) { if (this.themesTabActive) { return themes; @@ -26,7 +26,7 @@ export default Component.extend({ } }, - @computed( + @discourseComputed( "themesList", "currentTab", "themesList.@each.user_selectable", @@ -41,7 +41,7 @@ export default Component.extend({ ); }, - @computed( + @discourseComputed( "themesList", "currentTab", "themesList.@each.user_selectable", diff --git a/app/assets/javascripts/admin/components/value-list.js.es6 b/app/assets/javascripts/admin/components/value-list.js.es6 index 31ef93932ea..6582f20e7f3 100644 --- a/app/assets/javascripts/admin/components/value-list.js.es6 +++ b/app/assets/javascripts/admin/components/value-list.js.es6 @@ -1,8 +1,8 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { makeArray } from "discourse-common/lib/helpers"; import { empty, alias } from "@ember/object/computed"; import Component from "@ember/component"; -import { on } from "ember-addons/ember-computed-decorators"; -import computed from "ember-addons/ember-computed-decorators"; +import { on } from "discourse-common/utils/decorators"; export default Component.extend({ classNameBindings: [":value-list"], @@ -30,7 +30,7 @@ export default Component.extend({ ); }, - @computed("choices.[]", "collection.[]") + @discourseComputed("choices.[]", "collection.[]") filteredChoices(choices, collection) { return makeArray(choices).filter(i => collection.indexOf(i) < 0); }, diff --git a/app/assets/javascripts/admin/components/watched-word-form.js.es6 b/app/assets/javascripts/admin/components/watched-word-form.js.es6 index 629c5a2b6a7..2359320ad62 100644 --- a/app/assets/javascripts/admin/components/watched-word-form.js.es6 +++ b/app/assets/javascripts/admin/components/watched-word-form.js.es6 @@ -3,10 +3,10 @@ import { schedule } from "@ember/runloop"; import Component from "@ember/component"; import WatchedWord from "admin/models/watched-word"; import { - default as computed, + default as discourseComputed, on, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; export default Component.extend({ classNames: ["watched-word-form"], @@ -14,7 +14,7 @@ export default Component.extend({ actionKey: null, showMessage: false, - @computed("regularExpressions") + @discourseComputed("regularExpressions") placeholderKey(regularExpressions) { return ( "admin.watched_words.form.placeholder" + @@ -29,7 +29,7 @@ export default Component.extend({ } }, - @computed("word") + @discourseComputed("word") isUniqueWord(word) { const words = this.filteredContent || []; const filtered = words.filter(content => content.action === this.actionKey); diff --git a/app/assets/javascripts/admin/components/watched-word-uploader.js.es6 b/app/assets/javascripts/admin/components/watched-word-uploader.js.es6 index 417f3d5bbf5..05dc41c2074 100644 --- a/app/assets/javascripts/admin/components/watched-word-uploader.js.es6 +++ b/app/assets/javascripts/admin/components/watched-word-uploader.js.es6 @@ -1,6 +1,6 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { alias } from "@ember/object/computed"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; import UploadMixin from "discourse/mixins/upload"; export default Component.extend(UploadMixin, { @@ -13,7 +13,7 @@ export default Component.extend(UploadMixin, { return { skipValidation: true }; }, - @computed("actionKey") + @discourseComputed("actionKey") data(actionKey) { return { action_key: actionKey }; }, diff --git a/app/assets/javascripts/admin/controllers/admin-api-keys-new.js.es6 b/app/assets/javascripts/admin/controllers/admin-api-keys-new.js.es6 index f4d56c0a058..c04e6abec9b 100644 --- a/app/assets/javascripts/admin/controllers/admin-api-keys-new.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-api-keys-new.js.es6 @@ -1,4 +1,4 @@ -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import { popupAjaxError } from "discourse/lib/ajax-error"; export default Ember.Controller.extend({ @@ -7,12 +7,12 @@ export default Ember.Controller.extend({ { id: "single", name: I18n.t("admin.api.single_user") } ], - @computed("userMode") + @discourseComputed("userMode") showUserSelector(mode) { return mode === "single"; }, - @computed("model.description", "model.username", "userMode") + @discourseComputed("model.description", "model.username", "userMode") saveDisabled(description, username, userMode) { if (Ember.isBlank(description)) return true; if (userMode === "single" && Ember.isBlank(username)) return true; diff --git a/app/assets/javascripts/admin/controllers/admin-backups-index.js.es6 b/app/assets/javascripts/admin/controllers/admin-backups-index.js.es6 index 6b69eaea72f..e4e7c24d43e 100644 --- a/app/assets/javascripts/admin/controllers/admin-backups-index.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-backups-index.js.es6 @@ -2,7 +2,7 @@ import { alias, equal } from "@ember/object/computed"; import { inject } from "@ember/controller"; import Controller from "@ember/controller"; import { ajax } from "discourse/lib/ajax"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import { setting, i18n } from "discourse/lib/computed"; export default Controller.extend({ @@ -12,7 +12,7 @@ export default Controller.extend({ backupLocation: setting("backup_location"), localBackupStorage: equal("backupLocation", "local"), - @computed("status.allowRestore", "status.isOperationRunning") + @discourseComputed("status.allowRestore", "status.isOperationRunning") restoreTitle(allowRestore, isOperationRunning) { if (!allowRestore) { return "admin.backups.operations.restore.is_disabled"; diff --git a/app/assets/javascripts/admin/controllers/admin-badges-show.js.es6 b/app/assets/javascripts/admin/controllers/admin-badges-show.js.es6 index 733f4589fe3..2511dcead19 100644 --- a/app/assets/javascripts/admin/controllers/admin-badges-show.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-badges-show.js.es6 @@ -1,10 +1,10 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { alias } from "@ember/object/computed"; import { inject } from "@ember/controller"; import Controller from "@ember/controller"; import { popupAjaxError } from "discourse/lib/ajax-error"; import { bufferedProperty } from "discourse/mixins/buffered-content"; import { propertyNotEqual } from "discourse/lib/computed"; -import computed from "ember-addons/ember-computed-decorators"; export default Controller.extend(bufferedProperty("model"), { adminBadges: inject(), @@ -19,7 +19,7 @@ export default Controller.extend(bufferedProperty("model"), { readOnly: alias("buffered.system"), showDisplayName: propertyNotEqual("name", "displayName"), - @computed("model.query", "buffered.query") + @discourseComputed("model.query", "buffered.query") hasQuery(modelQuery, bufferedQuery) { if (bufferedQuery) { return bufferedQuery.trim().length > 0; diff --git a/app/assets/javascripts/admin/controllers/admin-customize-colors-show.js.es6 b/app/assets/javascripts/admin/controllers/admin-customize-colors-show.js.es6 index ce99c2cfea4..9cdca3f098d 100644 --- a/app/assets/javascripts/admin/controllers/admin-customize-colors-show.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-customize-colors-show.js.es6 @@ -1,9 +1,9 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { later } from "@ember/runloop"; import Controller from "@ember/controller"; -import computed from "ember-addons/ember-computed-decorators"; export default Controller.extend({ - @computed("model.colors", "onlyOverridden") + @discourseComputed("model.colors", "onlyOverridden") colors(allColors, onlyOverridden) { if (onlyOverridden) { return allColors.filter(color => color.get("overridden")); diff --git a/app/assets/javascripts/admin/controllers/admin-customize-colors.js.es6 b/app/assets/javascripts/admin/controllers/admin-customize-colors.js.es6 index 21c628be24c..4fc2cf34f0f 100644 --- a/app/assets/javascripts/admin/controllers/admin-customize-colors.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-customize-colors.js.es6 @@ -1,20 +1,20 @@ import EmberObject from "@ember/object"; import Controller from "@ember/controller"; import showModal from "discourse/lib/show-modal"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; export default Controller.extend({ - @computed("model.@each.id") + @discourseComputed("model.@each.id") baseColorScheme() { return this.model.findBy("is_base", true); }, - @computed("model.@each.id") + @discourseComputed("model.@each.id") baseColorSchemes() { return this.model.filterBy("is_base", true); }, - @computed("baseColorScheme") + @discourseComputed("baseColorScheme") baseColors(baseColorScheme) { const baseColorsHash = EmberObject.create({}); baseColorScheme.get("colors").forEach(color => { diff --git a/app/assets/javascripts/admin/controllers/admin-customize-email-style-edit.js.es6 b/app/assets/javascripts/admin/controllers/admin-customize-email-style-edit.js.es6 index f48f46eff06..d534792b002 100644 --- a/app/assets/javascripts/admin/controllers/admin-customize-email-style-edit.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-customize-email-style-edit.js.es6 @@ -1,13 +1,13 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; -import computed from "ember-addons/ember-computed-decorators"; export default Controller.extend({ - @computed("model.isSaving") + @discourseComputed("model.isSaving") saveButtonText(isSaving) { return isSaving ? I18n.t("saving") : I18n.t("admin.customize.save"); }, - @computed("model.changed", "model.isSaving") + @discourseComputed("model.changed", "model.isSaving") saveDisabled(changed, isSaving) { return !changed || isSaving; }, diff --git a/app/assets/javascripts/admin/controllers/admin-customize-email-templates-edit.js.es6 b/app/assets/javascripts/admin/controllers/admin-customize-email-templates-edit.js.es6 index 5ec405594a5..3617edca753 100644 --- a/app/assets/javascripts/admin/controllers/admin-customize-email-templates-edit.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-customize-email-templates-edit.js.es6 @@ -1,19 +1,19 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; import { popupAjaxError } from "discourse/lib/ajax-error"; import { bufferedProperty } from "discourse/mixins/buffered-content"; -import computed from "ember-addons/ember-computed-decorators"; export default Controller.extend(bufferedProperty("emailTemplate"), { saved: false, - @computed("buffered.body", "buffered.subject") + @discourseComputed("buffered.body", "buffered.subject") saveDisabled(body, subject) { return ( this.emailTemplate.body === body && this.emailTemplate.subject === subject ); }, - @computed("buffered") + @discourseComputed("buffered") hasMultipleSubjects(buffered) { if (buffered.getProperties("subject")["subject"]) { return false; diff --git a/app/assets/javascripts/admin/controllers/admin-customize-themes-edit.js.es6 b/app/assets/javascripts/admin/controllers/admin-customize-themes-edit.js.es6 index a5a286bf80f..75d7a486f20 100644 --- a/app/assets/javascripts/admin/controllers/admin-customize-themes-edit.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-customize-themes-edit.js.es6 @@ -1,6 +1,6 @@ import Controller from "@ember/controller"; import { url } from "discourse/lib/computed"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; export default Controller.extend({ section: null, @@ -16,7 +16,7 @@ export default Controller.extend({ this.set("currentTarget", target && target.id); }, - @computed("currentTarget") + @discourseComputed("currentTarget") currentTargetName(id) { const target = this.get("model.targets").find( t => t.id === parseInt(id, 10) @@ -24,12 +24,12 @@ export default Controller.extend({ return target && target.name; }, - @computed("model.isSaving") + @discourseComputed("model.isSaving") saveButtonText(isSaving) { return isSaving ? I18n.t("saving") : I18n.t("admin.customize.save"); }, - @computed("model.changed", "model.isSaving") + @discourseComputed("model.changed", "model.isSaving") saveDisabled(changed, isSaving) { return !changed || isSaving; }, diff --git a/app/assets/javascripts/admin/controllers/admin-customize-themes-show.js.es6 b/app/assets/javascripts/admin/controllers/admin-customize-themes-show.js.es6 index d4622e21d89..aa4c32ce33e 100644 --- a/app/assets/javascripts/admin/controllers/admin-customize-themes-show.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-customize-themes-show.js.es6 @@ -1,7 +1,7 @@ import { makeArray } from "discourse-common/lib/helpers"; import { empty, notEmpty, match } from "@ember/object/computed"; import Controller from "@ember/controller"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import { url } from "discourse/lib/computed"; import { popupAjaxError } from "discourse/lib/ajax-error"; import showModal from "discourse/lib/show-modal"; @@ -16,7 +16,7 @@ export default Controller.extend({ addButtonDisabled: empty("selectedChildThemeId"), editRouteName: "adminCustomizeThemes.edit", - @computed("model.editedFields") + @discourseComputed("model.editedFields") editedFieldsFormatted() { const descriptions = []; ["common", "desktop", "mobile"].forEach(target => { @@ -34,13 +34,13 @@ export default Controller.extend({ return descriptions; }, - @computed("colorSchemeId", "model.color_scheme_id") + @discourseComputed("colorSchemeId", "model.color_scheme_id") colorSchemeChanged(colorSchemeId, existingId) { colorSchemeId = colorSchemeId === null ? null : parseInt(colorSchemeId); return colorSchemeId !== existingId; }, - @computed("availableChildThemes", "model.childThemes.[]", "model") + @discourseComputed("availableChildThemes", "model.childThemes.[]", "model") selectableChildThemes(available, childThemes) { if (available) { const themes = !childThemes @@ -50,7 +50,7 @@ export default Controller.extend({ } }, - @computed("allThemes", "model.component", "model") + @discourseComputed("allThemes", "model.component", "model") availableChildThemes(allThemes) { if (!this.get("model.component")) { const themeId = this.get("model.id"); @@ -60,38 +60,38 @@ export default Controller.extend({ } }, - @computed("model.component") + @discourseComputed("model.component") convertKey(component) { const type = component ? "component" : "theme"; return `admin.customize.theme.convert_${type}`; }, - @computed("model.component") + @discourseComputed("model.component") convertIcon(component) { return component ? "cube" : ""; }, - @computed("model.component") + @discourseComputed("model.component") convertTooltip(component) { const type = component ? "component" : "theme"; return `admin.customize.theme.convert_${type}_tooltip`; }, - @computed("model.settings") + @discourseComputed("model.settings") settings(settings) { return settings.map(setting => ThemeSettings.create(setting)); }, hasSettings: notEmpty("settings"), - @computed("model.translations") + @discourseComputed("model.translations") translations(translations) { return translations.map(setting => ThemeSettings.create(setting)); }, hasTranslations: notEmpty("translations"), - @computed("model.remoteError", "updatingRemote") + @discourseComputed("model.remoteError", "updatingRemote") showRemoteError(errorMessage, updating) { return errorMessage && !updating; }, diff --git a/app/assets/javascripts/admin/controllers/admin-customize-themes.js.es6 b/app/assets/javascripts/admin/controllers/admin-customize-themes.js.es6 index 6727df97f38..f1d1f0d7159 100644 --- a/app/assets/javascripts/admin/controllers/admin-customize-themes.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-customize-themes.js.es6 @@ -1,21 +1,21 @@ import Controller from "@ember/controller"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import { THEMES } from "admin/models/theme"; export default Controller.extend({ currentTab: THEMES, - @computed("model", "model.@each.component") + @discourseComputed("model", "model.@each.component") fullThemes(themes) { return themes.filter(t => !t.get("component")); }, - @computed("model", "model.@each.component") + @discourseComputed("model", "model.@each.component") childThemes(themes) { return themes.filter(t => t.get("component")); }, - @computed("model", "model.@each.component") + @discourseComputed("model", "model.@each.component") installedThemes(themes) { return themes.map(t => t.name); } diff --git a/app/assets/javascripts/admin/controllers/admin-dashboard-general.js.es6 b/app/assets/javascripts/admin/controllers/admin-dashboard-general.js.es6 index 24884b0ba64..c91f09350d2 100644 --- a/app/assets/javascripts/admin/controllers/admin-dashboard-general.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-dashboard-general.js.es6 @@ -1,8 +1,8 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { makeArray } from "discourse-common/lib/helpers"; import { inject } from "@ember/controller"; import Controller from "@ember/controller"; import { setting } from "discourse/lib/computed"; -import computed from "ember-addons/ember-computed-decorators"; import AdminDashboard from "admin/models/admin-dashboard"; import Report from "admin/models/report"; import PeriodComputationMixin from "admin/mixins/period-computation"; @@ -20,12 +20,12 @@ export default Controller.extend(PeriodComputationMixin, { logSearchQueriesEnabled: setting("log_search_queries"), basePath: Discourse.BaseUri, - @computed("siteSettings.dashboard_general_tab_activity_metrics") + @discourseComputed("siteSettings.dashboard_general_tab_activity_metrics") activityMetrics(metrics) { return (metrics || "").split("|").filter(m => m); }, - @computed + @discourseComputed activityMetricsFilters() { return { startDate: this.lastMonth, @@ -33,14 +33,14 @@ export default Controller.extend(PeriodComputationMixin, { }; }, - @computed + @discourseComputed topReferredTopicsOptions() { return { table: { total: false, limit: 8 } }; }, - @computed + @discourseComputed topReferredTopicsFilters() { return { startDate: moment() @@ -50,7 +50,7 @@ export default Controller.extend(PeriodComputationMixin, { }; }, - @computed + @discourseComputed trendingSearchFilters() { return { startDate: moment() @@ -60,14 +60,14 @@ export default Controller.extend(PeriodComputationMixin, { }; }, - @computed + @discourseComputed trendingSearchOptions() { return { table: { total: false, limit: 8 } }; }, - @computed + @discourseComputed trendingSearchDisabledLabel() { return I18n.t("admin.dashboard.reports.trending_search.disabled", { basePath: Discourse.BaseUri @@ -107,7 +107,7 @@ export default Controller.extend(PeriodComputationMixin, { } }, - @computed("startDate", "endDate") + @discourseComputed("startDate", "endDate") filters(startDate, endDate) { return { startDate, endDate }; }, diff --git a/app/assets/javascripts/admin/controllers/admin-dashboard-moderation.js.es6 b/app/assets/javascripts/admin/controllers/admin-dashboard-moderation.js.es6 index e5d8dae25aa..8925825fbad 100644 --- a/app/assets/javascripts/admin/controllers/admin-dashboard-moderation.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-dashboard-moderation.js.es6 @@ -1,9 +1,9 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; -import computed from "ember-addons/ember-computed-decorators"; import PeriodComputationMixin from "admin/mixins/period-computation"; export default Controller.extend(PeriodComputationMixin, { - @computed + @discourseComputed flagsStatusOptions() { return { table: { @@ -13,7 +13,7 @@ export default Controller.extend(PeriodComputationMixin, { }; }, - @computed + @discourseComputed userFlaggingRatioOptions() { return { table: { @@ -23,12 +23,12 @@ export default Controller.extend(PeriodComputationMixin, { }; }, - @computed("startDate", "endDate") + @discourseComputed("startDate", "endDate") filters(startDate, endDate) { return { startDate, endDate }; }, - @computed("lastWeek", "endDate") + @discourseComputed("lastWeek", "endDate") lastWeekfilters(startDate, endDate) { return { startDate, endDate }; }, diff --git a/app/assets/javascripts/admin/controllers/admin-dashboard-reports.js.es6 b/app/assets/javascripts/admin/controllers/admin-dashboard-reports.js.es6 index b582f733aa3..9a57b9cf326 100644 --- a/app/assets/javascripts/admin/controllers/admin-dashboard-reports.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-dashboard-reports.js.es6 @@ -1,12 +1,13 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { debounce } from "@ember/runloop"; import Controller from "@ember/controller"; -import computed from "ember-addons/ember-computed-decorators"; + const { get } = Ember; export default Controller.extend({ filter: null, - @computed("model.[]", "filter") + @discourseComputed("model.[]", "filter") filterReports(reports, filter) { if (filter) { filter = filter.toLowerCase(); diff --git a/app/assets/javascripts/admin/controllers/admin-dashboard.js.es6 b/app/assets/javascripts/admin/controllers/admin-dashboard.js.es6 index 0f214d6f2d7..bd8561abc1d 100644 --- a/app/assets/javascripts/admin/controllers/admin-dashboard.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-dashboard.js.es6 @@ -1,7 +1,7 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { inject } from "@ember/controller"; import Controller from "@ember/controller"; import { setting } from "discourse/lib/computed"; -import computed from "ember-addons/ember-computed-decorators"; import AdminDashboard from "admin/models/admin-dashboard"; import VersionCheck from "admin/models/version-check"; @@ -13,7 +13,7 @@ export default Controller.extend({ exceptionController: inject("exception"), showVersionChecks: setting("version_checks"), - @computed("problems.length") + @discourseComputed("problems.length") foundProblems(problemsLength) { return this.currentUser.get("admin") && (problemsLength || 0) > 0; }, @@ -77,7 +77,7 @@ export default Controller.extend({ .finally(() => this.set("loadingProblems", false)); }, - @computed("problemsFetchedAt") + @discourseComputed("problemsFetchedAt") problemsTimestamp(problemsFetchedAt) { return moment(problemsFetchedAt) .locale("en") diff --git a/app/assets/javascripts/admin/controllers/admin-embedding.js.es6 b/app/assets/javascripts/admin/controllers/admin-embedding.js.es6 index 7e185e9d123..b71c173e360 100644 --- a/app/assets/javascripts/admin/controllers/admin-embedding.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-embedding.js.es6 @@ -1,5 +1,5 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; -import computed from "ember-addons/ember-computed-decorators"; import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend({ @@ -7,13 +7,13 @@ export default Controller.extend({ embedding: null, // show settings if we have at least one created host - @computed("embedding.embeddable_hosts.@each.isCreated") + @discourseComputed("embedding.embeddable_hosts.@each.isCreated") showSecondary() { const hosts = this.get("embedding.embeddable_hosts"); return hosts.length && hosts.findBy("isCreated"); }, - @computed("embedding.base_url") + @discourseComputed("embedding.base_url") embeddingCode(baseUrl) { const html = `
diff --git a/app/assets/javascripts/admin/controllers/admin-logs-staff-action-logs.js.es6 b/app/assets/javascripts/admin/controllers/admin-logs-staff-action-logs.js.es6 index a375379fc08..e559bc846f9 100644 --- a/app/assets/javascripts/admin/controllers/admin-logs-staff-action-logs.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-logs-staff-action-logs.js.es6 @@ -5,9 +5,9 @@ import Controller from "@ember/controller"; import { exportEntity } from "discourse/lib/export-csv"; import { outputExportResult } from "discourse/lib/export-result"; import { - default as computed, + default as discourseComputed, on -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; export default Controller.extend({ model: null, @@ -15,7 +15,7 @@ export default Controller.extend({ filtersExists: gt("filterCount", 0), userHistoryActions: null, - @computed("filters.action_name") + @discourseComputed("filters.action_name") actionFilter(name) { return name ? I18n.t("admin.logs.staff_actions.actions." + name) : null; }, diff --git a/app/assets/javascripts/admin/controllers/admin-plugins.js.es6 b/app/assets/javascripts/admin/controllers/admin-plugins.js.es6 index c0322317e59..f9b34e70a42 100644 --- a/app/assets/javascripts/admin/controllers/admin-plugins.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-plugins.js.es6 @@ -1,8 +1,8 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; -import computed from "ember-addons/ember-computed-decorators"; export default Controller.extend({ - @computed + @discourseComputed adminRoutes: function() { return this.model .map(p => { diff --git a/app/assets/javascripts/admin/controllers/admin-reports-show.js.es6 b/app/assets/javascripts/admin/controllers/admin-reports-show.js.es6 index 359be15f1de..6d302204ced 100644 --- a/app/assets/javascripts/admin/controllers/admin-reports-show.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-reports-show.js.es6 @@ -1,5 +1,5 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; -import computed from "ember-addons/ember-computed-decorators"; export default Controller.extend({ queryParams: ["start_date", "end_date", "filters"], @@ -7,7 +7,7 @@ export default Controller.extend({ end_date: null, filters: null, - @computed("model.type") + @discourseComputed("model.type") reportOptions(type) { let options = { table: { perPage: 50, limit: 50, formatNumbers: false } }; diff --git a/app/assets/javascripts/admin/controllers/admin-site-settings-category.js.es6 b/app/assets/javascripts/admin/controllers/admin-site-settings-category.js.es6 index 3fd10f15d13..bfd727e6ead 100644 --- a/app/assets/javascripts/admin/controllers/admin-site-settings-category.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-site-settings-category.js.es6 @@ -1,17 +1,17 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { inject } from "@ember/controller"; import Controller from "@ember/controller"; -import computed from "ember-addons/ember-computed-decorators"; export default Controller.extend({ categoryNameKey: null, adminSiteSettings: inject(), - @computed("adminSiteSettings.visibleSiteSettings", "categoryNameKey") + @discourseComputed("adminSiteSettings.visibleSiteSettings", "categoryNameKey") category(categories, nameKey) { return (categories || []).findBy("nameKey", nameKey); }, - @computed("category") + @discourseComputed("category") filteredContent(category) { return category ? category.siteSettings : []; } diff --git a/app/assets/javascripts/admin/controllers/admin-site-text-edit.js.es6 b/app/assets/javascripts/admin/controllers/admin-site-text-edit.js.es6 index cd815b9ae85..d24a1729105 100644 --- a/app/assets/javascripts/admin/controllers/admin-site-text-edit.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-site-text-edit.js.es6 @@ -1,12 +1,12 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; import { popupAjaxError } from "discourse/lib/ajax-error"; import { bufferedProperty } from "discourse/mixins/buffered-content"; -import computed from "ember-addons/ember-computed-decorators"; export default Controller.extend(bufferedProperty("siteText"), { saved: false, - @computed("buffered.value") + @discourseComputed("buffered.value") saveDisabled(value) { return this.siteText.value === value; }, diff --git a/app/assets/javascripts/admin/controllers/admin-user-badges.js.es6 b/app/assets/javascripts/admin/controllers/admin-user-badges.js.es6 index fac3436c6e2..3bedafb45ce 100644 --- a/app/assets/javascripts/admin/controllers/admin-user-badges.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-user-badges.js.es6 @@ -1,10 +1,10 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { alias, sort } from "@ember/object/computed"; import { next } from "@ember/runloop"; import { inject } from "@ember/controller"; import Controller from "@ember/controller"; import GrantBadgeController from "discourse/mixins/grant-badge-controller"; import { popupAjaxError } from "discourse/lib/ajax-error"; -import computed from "ember-addons/ember-computed-decorators"; export default Controller.extend(GrantBadgeController, { adminUser: inject(), @@ -19,7 +19,7 @@ export default Controller.extend(GrantBadgeController, { this.badgeSortOrder = ["granted_at:desc"]; }, - @computed("model", "model.[]", "model.expandedBadges.[]") + @discourseComputed("model", "model.[]", "model.expandedBadges.[]") groupedBadges() { const allBadges = this.model; diff --git a/app/assets/javascripts/admin/controllers/admin-user-index.js.es6 b/app/assets/javascripts/admin/controllers/admin-user-index.js.es6 index de2e37668fa..765e8d3686f 100644 --- a/app/assets/javascripts/admin/controllers/admin-user-index.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-user-index.js.es6 @@ -6,7 +6,7 @@ import CanCheckEmails from "discourse/mixins/can-check-emails"; import { propertyNotEqual, setting } from "discourse/lib/computed"; import { userPath } from "discourse/lib/url"; import { popupAjaxError } from "discourse/lib/ajax-error"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import { fmt } from "discourse/lib/computed"; import { htmlSafe } from "@ember/template"; @@ -30,12 +30,12 @@ export default Controller.extend(CanCheckEmails, { "model.can_disable_second_factor" ), - @computed("model.customGroups") + @discourseComputed("model.customGroups") customGroupIds(customGroups) { return customGroups.mapBy("id"); }, - @computed("customGroupIdsBuffer", "customGroupIds") + @discourseComputed("customGroupIdsBuffer", "customGroupIds") customGroupsDirty(buffer, original) { if (buffer === null) return false; @@ -44,7 +44,7 @@ export default Controller.extend(CanCheckEmails, { : true; }, - @computed("model.automaticGroups") + @discourseComputed("model.automaticGroups") automaticGroups(automaticGroups) { return automaticGroups .map(group => { @@ -54,26 +54,30 @@ export default Controller.extend(CanCheckEmails, { .join(", "); }, - @computed("model.associated_accounts") + @discourseComputed("model.associated_accounts") associatedAccountsLoaded(associatedAccounts) { return typeof associatedAccounts !== "undefined"; }, - @computed("model.associated_accounts") + @discourseComputed("model.associated_accounts") associatedAccounts(associatedAccounts) { return associatedAccounts .map(provider => `${provider.name} (${provider.description})`) .join(", "); }, - @computed("model.user_fields.[]") + @discourseComputed("model.user_fields.[]") userFields(userFields) { return this.site.collectUserFields(userFields); }, preferencesPath: fmt("model.username_lower", userPath("%@/preferences")), - @computed("model.can_delete_all_posts", "model.staff", "model.post_count") + @discourseComputed( + "model.can_delete_all_posts", + "model.staff", + "model.post_count" + ) deleteAllPostsExplanation(canDeleteAllPosts, staff, postCount) { if (canDeleteAllPosts) { return null; @@ -93,7 +97,7 @@ export default Controller.extend(CanCheckEmails, { } }, - @computed("model.canBeDeleted", "model.staff") + @discourseComputed("model.canBeDeleted", "model.staff") deleteExplanation(canBeDeleted, staff) { if (canBeDeleted) { return null; diff --git a/app/assets/javascripts/admin/controllers/admin-users-list-show.js.es6 b/app/assets/javascripts/admin/controllers/admin-users-list-show.js.es6 index 944b0d9485e..87380235e33 100644 --- a/app/assets/javascripts/admin/controllers/admin-users-list-show.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-users-list-show.js.es6 @@ -1,9 +1,9 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; import debounce from "discourse/lib/debounce"; import { i18n } from "discourse/lib/computed"; import AdminUser from "admin/models/admin-user"; import CanCheckEmails from "discourse/mixins/can-check-emails"; -import computed from "ember-addons/ember-computed-decorators"; export default Controller.extend(CanCheckEmails, { model: null, @@ -24,7 +24,7 @@ export default Controller.extend(CanCheckEmails, { this._canLoadMore = true; }, - @computed("query") + @discourseComputed("query") title(query) { return I18n.t("admin.users.titles." + query); }, diff --git a/app/assets/javascripts/admin/controllers/admin-watched-words-action.js.es6 b/app/assets/javascripts/admin/controllers/admin-watched-words-action.js.es6 index 1726446d8c5..d6f52c13fdc 100644 --- a/app/assets/javascripts/admin/controllers/admin-watched-words-action.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-watched-words-action.js.es6 @@ -1,8 +1,8 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { or } from "@ember/object/computed"; import { schedule } from "@ember/runloop"; import { inject } from "@ember/controller"; import Controller from "@ember/controller"; -import computed from "ember-addons/ember-computed-decorators"; import WatchedWord from "admin/models/watched-word"; import { ajax } from "discourse/lib/ajax"; import { fmt } from "discourse/lib/computed"; @@ -27,22 +27,22 @@ export default Controller.extend({ ); }, - @computed("actionNameKey", "adminWatchedWords.model") + @discourseComputed("actionNameKey", "adminWatchedWords.model") currentAction(actionName) { return this.findAction(actionName); }, - @computed("currentAction.words.[]", "adminWatchedWords.model") + @discourseComputed("currentAction.words.[]", "adminWatchedWords.model") filteredContent(words) { return words || []; }, - @computed("actionNameKey") + @discourseComputed("actionNameKey") actionDescription(actionNameKey) { return I18n.t("admin.watched_words.action_descriptions." + actionNameKey); }, - @computed("currentAction.count") + @discourseComputed("currentAction.count") wordCount(count) { return count || 0; }, diff --git a/app/assets/javascripts/admin/controllers/admin-web-hooks-show-events.js.es6 b/app/assets/javascripts/admin/controllers/admin-web-hooks-show-events.js.es6 index e550a79069b..6cd94efb681 100644 --- a/app/assets/javascripts/admin/controllers/admin-web-hooks-show-events.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-web-hooks-show-events.js.es6 @@ -1,8 +1,8 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { alias } from "@ember/object/computed"; import Controller from "@ember/controller"; import { ajax } from "discourse/lib/ajax"; import { popupAjaxError } from "discourse/lib/ajax-error"; -import computed from "ember-addons/ember-computed-decorators"; export default Controller.extend({ pingDisabled: false, @@ -14,7 +14,7 @@ export default Controller.extend({ this.incomingEventIds = []; }, - @computed("incomingCount") + @discourseComputed("incomingCount") hasIncoming(incomingCount) { return incomingCount > 0; }, diff --git a/app/assets/javascripts/admin/controllers/admin-web-hooks-show.js.es6 b/app/assets/javascripts/admin/controllers/admin-web-hooks-show.js.es6 index 83de79e1f01..b07806f6fa8 100644 --- a/app/assets/javascripts/admin/controllers/admin-web-hooks-show.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin-web-hooks-show.js.es6 @@ -1,10 +1,10 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { isEmpty } from "@ember/utils"; import { alias } from "@ember/object/computed"; import { inject } from "@ember/controller"; import Controller from "@ember/controller"; import { popupAjaxError } from "discourse/lib/ajax-error"; import { extractDomainFromUrl } from "discourse/lib/utilities"; -import computed from "ember-addons/ember-computed-decorators"; import InputValidation from "discourse/models/input-validation"; export default Controller.extend({ @@ -13,12 +13,12 @@ export default Controller.extend({ defaultEventTypes: alias("adminWebHooks.defaultEventTypes"), contentTypes: alias("adminWebHooks.contentTypes"), - @computed + @discourseComputed showTagsFilter() { return this.siteSettings.tagging_enabled; }, - @computed("model.isSaving", "saved", "saveButtonDisabled") + @discourseComputed("model.isSaving", "saved", "saveButtonDisabled") savingStatus(isSaving, saved, saveButtonDisabled) { if (isSaving) { return I18n.t("saving"); @@ -30,14 +30,14 @@ export default Controller.extend({ return ""; }, - @computed("model.isNew") + @discourseComputed("model.isNew") saveButtonText(isNew) { return isNew ? I18n.t("admin.web_hooks.create") : I18n.t("admin.web_hooks.save"); }, - @computed("model.secret") + @discourseComputed("model.secret") secretValidation(secret) { if (!isEmpty(secret)) { if (secret.indexOf(" ") !== -1) { @@ -56,7 +56,7 @@ export default Controller.extend({ } }, - @computed("model.wildcard_web_hook", "model.web_hook_event_types.[]") + @discourseComputed("model.wildcard_web_hook", "model.web_hook_event_types.[]") eventTypeValidation(isWildcard, eventTypes) { if (!isWildcard && isEmpty(eventTypes)) { return InputValidation.create({ @@ -66,7 +66,7 @@ export default Controller.extend({ } }, - @computed( + @discourseComputed( "model.isSaving", "secretValidation", "eventTypeValidation", diff --git a/app/assets/javascripts/admin/controllers/admin.js.es6 b/app/assets/javascripts/admin/controllers/admin.js.es6 index f01a898b0c0..641643d5732 100644 --- a/app/assets/javascripts/admin/controllers/admin.js.es6 +++ b/app/assets/javascripts/admin/controllers/admin.js.es6 @@ -1,22 +1,22 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { inject as service } from "@ember/service"; import Controller from "@ember/controller"; -import computed from "ember-addons/ember-computed-decorators"; import { dasherize } from "@ember/string"; export default Controller.extend({ router: service(), - @computed("siteSettings.enable_group_directory") + @discourseComputed("siteSettings.enable_group_directory") showGroups(enableGroupDirectory) { return !enableGroupDirectory; }, - @computed("siteSettings.enable_badges") + @discourseComputed("siteSettings.enable_badges") showBadges(enableBadges) { return this.currentUser.get("admin") && enableBadges; }, - @computed("router._router.currentPath") + @discourseComputed("router._router.currentPath") adminContentsClassName(currentPath) { let cssClasses = currentPath .split(".") diff --git a/app/assets/javascripts/admin/controllers/modals/admin-add-upload.js.es6 b/app/assets/javascripts/admin/controllers/modals/admin-add-upload.js.es6 index d53278c8564..bd246d93713 100644 --- a/app/assets/javascripts/admin/controllers/modals/admin-add-upload.js.es6 +++ b/app/assets/javascripts/admin/controllers/modals/admin-add-upload.js.es6 @@ -5,9 +5,9 @@ import Controller from "@ember/controller"; import ModalFunctionality from "discourse/mixins/modal-functionality"; import { ajax } from "discourse/lib/ajax"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import { popupAjaxError } from "discourse/lib/ajax-error"; const THEME_FIELD_VARIABLE_TYPE_IDS = [2, 3, 4]; @@ -69,7 +69,7 @@ export default Controller.extend(ModalFunctionality, { enabled: and("nameValid", "fileSelected"), disabled: not("enabled"), - @computed("name", "adminCustomizeThemesShow.model.theme_fields") + @discourseComputed("name", "adminCustomizeThemesShow.model.theme_fields") errorMessage(name, themeFields) { if (name) { if (!name.match(/^[a-z_][a-z0-9_-]*$/i)) { @@ -94,7 +94,7 @@ export default Controller.extend(ModalFunctionality, { return null; }, - @computed("errorMessage") + @discourseComputed("errorMessage") nameValid(errorMessage) { return null === errorMessage; }, diff --git a/app/assets/javascripts/admin/controllers/modals/admin-badge-preview.js.es6 b/app/assets/javascripts/admin/controllers/modals/admin-badge-preview.js.es6 index b6419c8e04d..67450978d79 100644 --- a/app/assets/javascripts/admin/controllers/modals/admin-badge-preview.js.es6 +++ b/app/assets/javascripts/admin/controllers/modals/admin-badge-preview.js.es6 @@ -1,6 +1,6 @@ import { alias, map } from "@ember/object/computed"; import Controller from "@ember/controller"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import { escapeExpression } from "discourse/lib/utilities"; export default Controller.extend({ @@ -8,7 +8,7 @@ export default Controller.extend({ errors: alias("model.errors"), count: alias("model.grant_count"), - @computed("count", "sample.length") + @discourseComputed("count", "sample.length") countWarning(count, sampleLength) { if (count <= 10) { return sampleLength !== count; @@ -17,12 +17,12 @@ export default Controller.extend({ } }, - @computed("model.query_plan") + @discourseComputed("model.query_plan") hasQueryPlan(queryPlan) { return !!queryPlan; }, - @computed("model.query_plan") + @discourseComputed("model.query_plan") queryPlanHtml(queryPlan) { let output = `
`;
 
diff --git a/app/assets/javascripts/admin/controllers/modals/admin-edit-badge-groupings.js.es6 b/app/assets/javascripts/admin/controllers/modals/admin-edit-badge-groupings.js.es6
index 4d0c66143c6..1629aab70bd 100644
--- a/app/assets/javascripts/admin/controllers/modals/admin-edit-badge-groupings.js.es6
+++ b/app/assets/javascripts/admin/controllers/modals/admin-edit-badge-groupings.js.es6
@@ -1,7 +1,7 @@
 import Controller from "@ember/controller";
 import { ajax } from "discourse/lib/ajax";
 import ModalFunctionality from "discourse/mixins/modal-functionality";
-import { observes } from "ember-addons/ember-computed-decorators";
+import { observes } from "discourse-common/utils/decorators";
 
 export default Controller.extend(ModalFunctionality, {
   @observes("model")
diff --git a/app/assets/javascripts/admin/controllers/modals/admin-incoming-email.js.es6 b/app/assets/javascripts/admin/controllers/modals/admin-incoming-email.js.es6
index 210d664cda8..cca2cc54bf1 100644
--- a/app/assets/javascripts/admin/controllers/modals/admin-incoming-email.js.es6
+++ b/app/assets/javascripts/admin/controllers/modals/admin-incoming-email.js.es6
@@ -1,12 +1,12 @@
+import discourseComputed from "discourse-common/utils/decorators";
 import Controller from "@ember/controller";
 import ModalFunctionality from "discourse/mixins/modal-functionality";
 import IncomingEmail from "admin/models/incoming-email";
-import computed from "ember-addons/ember-computed-decorators";
 import { longDate } from "discourse/lib/formatter";
 import { popupAjaxError } from "discourse/lib/ajax-error";
 
 export default Controller.extend(ModalFunctionality, {
-  @computed("model.date")
+  @discourseComputed("model.date")
   date(d) {
     return longDate(d);
   },
diff --git a/app/assets/javascripts/admin/controllers/modals/admin-install-theme.js.es6 b/app/assets/javascripts/admin/controllers/modals/admin-install-theme.js.es6
index 81055d733d4..9aee44f72e6 100644
--- a/app/assets/javascripts/admin/controllers/modals/admin-install-theme.js.es6
+++ b/app/assets/javascripts/admin/controllers/modals/admin-install-theme.js.es6
@@ -5,9 +5,9 @@ import ModalFunctionality from "discourse/mixins/modal-functionality";
 import { ajax } from "discourse/lib/ajax";
 import { popupAjaxError } from "discourse/lib/ajax-error";
 import {
-  default as computed,
+  default as discourseComputed,
   observes
-} from "ember-addons/ember-computed-decorators";
+} from "discourse-common/utils/decorators";
 import { THEMES, COMPONENTS } from "admin/models/theme";
 import { POPULAR_THEMES } from "discourse-common/helpers/popular-themes";
 import { set } from "@ember/object";
@@ -43,7 +43,7 @@ export default Controller.extend(ModalFunctionality, {
     ];
   },
 
-  @computed("themesController.installedThemes")
+  @discourseComputed("themesController.installedThemes")
   themes(installedThemes) {
     return POPULAR_THEMES.map(t => {
       if (installedThemes.includes(t.name)) {
@@ -53,7 +53,7 @@ export default Controller.extend(ModalFunctionality, {
     });
   },
 
-  @computed(
+  @discourseComputed(
     "loading",
     "remote",
     "uploadUrl",
@@ -102,12 +102,12 @@ export default Controller.extend(ModalFunctionality, {
     }
   },
 
-  @computed("name")
+  @discourseComputed("name")
   nameTooShort(name) {
     return !name || name.length < MIN_NAME_LENGTH;
   },
 
-  @computed("component")
+  @discourseComputed("component")
   placeholder(component) {
     if (component) {
       return I18n.t("admin.customize.theme.component_name");
@@ -116,14 +116,14 @@ export default Controller.extend(ModalFunctionality, {
     }
   },
 
-  @computed("selection")
+  @discourseComputed("selection")
   submitLabel(selection) {
     return `admin.customize.theme.${
       selection === "create" ? "create" : "install"
     }`;
   },
 
-  @computed("privateChecked", "checkPrivate", "publicKey")
+  @discourseComputed("privateChecked", "checkPrivate", "publicKey")
   showPublicKey(privateChecked, checkPrivate, publicKey) {
     return privateChecked && checkPrivate && publicKey;
   },
diff --git a/app/assets/javascripts/admin/controllers/modals/admin-silence-user.js.es6 b/app/assets/javascripts/admin/controllers/modals/admin-silence-user.js.es6
index 5c040669414..d15264f46b9 100644
--- a/app/assets/javascripts/admin/controllers/modals/admin-silence-user.js.es6
+++ b/app/assets/javascripts/admin/controllers/modals/admin-silence-user.js.es6
@@ -1,6 +1,6 @@
+import discourseComputed from "discourse-common/utils/decorators";
 import { isEmpty } from "@ember/utils";
 import Controller from "@ember/controller";
-import computed from "ember-addons/ember-computed-decorators";
 import PenaltyController from "admin/mixins/penalty-controller";
 
 export default Controller.extend(PenaltyController, {
@@ -12,7 +12,7 @@ export default Controller.extend(PenaltyController, {
     this.setProperties({ silenceUntil: null, silencing: false });
   },
 
-  @computed("silenceUntil", "reason", "silencing")
+  @discourseComputed("silenceUntil", "reason", "silencing")
   submitDisabled(silenceUntil, reason, silencing) {
     return silencing || isEmpty(silenceUntil) || !reason || reason.length < 1;
   },
diff --git a/app/assets/javascripts/admin/controllers/modals/admin-suspend-user.js.es6 b/app/assets/javascripts/admin/controllers/modals/admin-suspend-user.js.es6
index c5afea9d888..03fa9fbc838 100644
--- a/app/assets/javascripts/admin/controllers/modals/admin-suspend-user.js.es6
+++ b/app/assets/javascripts/admin/controllers/modals/admin-suspend-user.js.es6
@@ -1,6 +1,6 @@
+import discourseComputed from "discourse-common/utils/decorators";
 import { isEmpty } from "@ember/utils";
 import Controller from "@ember/controller";
-import computed from "ember-addons/ember-computed-decorators";
 import PenaltyController from "admin/mixins/penalty-controller";
 
 export default Controller.extend(PenaltyController, {
@@ -12,7 +12,7 @@ export default Controller.extend(PenaltyController, {
     this.setProperties({ suspendUntil: null, suspending: false });
   },
 
-  @computed("suspendUntil", "reason", "suspending")
+  @discourseComputed("suspendUntil", "reason", "suspending")
   submitDisabled(suspendUntil, reason, suspending) {
     return suspending || isEmpty(suspendUntil) || !reason || reason.length < 1;
   },
diff --git a/app/assets/javascripts/admin/controllers/modals/admin-uploaded-image-list.js.es6 b/app/assets/javascripts/admin/controllers/modals/admin-uploaded-image-list.js.es6
index a5ac891c216..08e1e178e47 100644
--- a/app/assets/javascripts/admin/controllers/modals/admin-uploaded-image-list.js.es6
+++ b/app/assets/javascripts/admin/controllers/modals/admin-uploaded-image-list.js.es6
@@ -1,5 +1,5 @@
 import Controller from "@ember/controller";
-import { on, observes } from "ember-addons/ember-computed-decorators";
+import { on, observes } from "discourse-common/utils/decorators";
 import ModalFunctionality from "discourse/mixins/modal-functionality";
 
 export default Controller.extend(ModalFunctionality, {
diff --git a/app/assets/javascripts/admin/controllers/modals/admin-watched-word-test.js.es6 b/app/assets/javascripts/admin/controllers/modals/admin-watched-word-test.js.es6
index 10f90ee6154..9d9b73072dc 100644
--- a/app/assets/javascripts/admin/controllers/modals/admin-watched-word-test.js.es6
+++ b/app/assets/javascripts/admin/controllers/modals/admin-watched-word-test.js.es6
@@ -1,9 +1,9 @@
 import Controller from "@ember/controller";
-import { default as computed } from "ember-addons/ember-computed-decorators";
+import { default as discourseComputed } from "discourse-common/utils/decorators";
 import ModalFunctionality from "discourse/mixins/modal-functionality";
 
 export default Controller.extend(ModalFunctionality, {
-  @computed("value", "model.compiledRegularExpression")
+  @discourseComputed("value", "model.compiledRegularExpression")
   matches(value, regexpString) {
     if (!value || !regexpString) return;
     let censorRegexp = new RegExp(regexpString, "ig");
diff --git a/app/assets/javascripts/admin/mixins/period-computation.js.es6 b/app/assets/javascripts/admin/mixins/period-computation.js.es6
index 354fd0ad85c..c7af0e4cb37 100644
--- a/app/assets/javascripts/admin/mixins/period-computation.js.es6
+++ b/app/assets/javascripts/admin/mixins/period-computation.js.es6
@@ -1,5 +1,5 @@
+import discourseComputed from "discourse-common/utils/decorators";
 import DiscourseURL from "discourse/lib/url";
-import computed from "ember-addons/ember-computed-decorators";
 import Mixin from "@ember/object/mixin";
 
 export default Mixin.create({
@@ -12,7 +12,7 @@ export default Mixin.create({
     this.availablePeriods = ["yearly", "quarterly", "monthly", "weekly"];
   },
 
-  @computed("period")
+  @discourseComputed("period")
   startDate(period) {
     let fullDay = moment()
       .locale("en")
@@ -37,7 +37,7 @@ export default Mixin.create({
     }
   },
 
-  @computed()
+  @discourseComputed()
   lastWeek() {
     return moment()
       .locale("en")
@@ -46,7 +46,7 @@ export default Mixin.create({
       .subtract(1, "week");
   },
 
-  @computed()
+  @discourseComputed()
   lastMonth() {
     return moment()
       .locale("en")
@@ -55,7 +55,7 @@ export default Mixin.create({
       .subtract(1, "month");
   },
 
-  @computed()
+  @discourseComputed()
   endDate() {
     return moment()
       .locale("en")
@@ -64,7 +64,7 @@ export default Mixin.create({
       .endOf("day");
   },
 
-  @computed()
+  @discourseComputed()
   today() {
     return moment()
       .locale("en")
diff --git a/app/assets/javascripts/admin/mixins/setting-component.js.es6 b/app/assets/javascripts/admin/mixins/setting-component.js.es6
index 762d5cfa2b3..eaf5b356b60 100644
--- a/app/assets/javascripts/admin/mixins/setting-component.js.es6
+++ b/app/assets/javascripts/admin/mixins/setting-component.js.es6
@@ -1,5 +1,5 @@
+import discourseComputed from "discourse-common/utils/decorators";
 import { alias, oneWay } from "@ember/object/computed";
-import computed from "ember-addons/ember-computed-decorators";
 import { categoryLinkHTML } from "discourse/helpers/category-link";
 import { on } from "@ember/object/evented";
 import Mixin from "@ember/object/mixin";
@@ -32,7 +32,7 @@ export default Mixin.create({
   validationMessage: null,
   isSecret: oneWay("setting.secret"),
 
-  @computed("buffered.value", "setting.value")
+  @discourseComputed("buffered.value", "setting.value")
   dirty(bufferVal, settingVal) {
     if (bufferVal === null || bufferVal === undefined) bufferVal = "";
     if (settingVal === null || settingVal === undefined) settingVal = "";
@@ -40,7 +40,7 @@ export default Mixin.create({
     return bufferVal.toString() !== settingVal.toString();
   },
 
-  @computed("setting", "buffered.value")
+  @discourseComputed("setting", "buffered.value")
   preview(setting, value) {
     // A bit hacky, but allows us to use helpers
     if (setting.get("setting") === "category_style") {
@@ -62,22 +62,22 @@ export default Mixin.create({
     }
   },
 
-  @computed("componentType")
+  @discourseComputed("componentType")
   typeClass(componentType) {
     return componentType.replace(/\_/g, "-");
   },
 
-  @computed("setting.setting")
+  @discourseComputed("setting.setting")
   settingName(setting) {
     return setting.replace(/\_/g, " ");
   },
 
-  @computed("type")
+  @discourseComputed("type")
   componentType(type) {
     return CUSTOM_TYPES.indexOf(type) !== -1 ? type : "string";
   },
 
-  @computed("setting")
+  @discourseComputed("setting")
   type(setting) {
     if (setting.type === "list" && setting.list_type) {
       return `${setting.list_type}_list`;
@@ -86,12 +86,12 @@ export default Mixin.create({
     return setting.type;
   },
 
-  @computed("typeClass")
+  @discourseComputed("typeClass")
   componentName(typeClass) {
     return "site-settings/" + typeClass;
   },
 
-  @computed("setting.default", "buffered.value")
+  @discourseComputed("setting.default", "buffered.value")
   overridden(settingDefault, bufferedValue) {
     return settingDefault !== bufferedValue;
   },
diff --git a/app/assets/javascripts/admin/mixins/setting-object.js.es6 b/app/assets/javascripts/admin/mixins/setting-object.js.es6
index c02004cea8e..f0296e6c553 100644
--- a/app/assets/javascripts/admin/mixins/setting-object.js.es6
+++ b/app/assets/javascripts/admin/mixins/setting-object.js.es6
@@ -1,8 +1,8 @@
-import computed from "ember-addons/ember-computed-decorators";
+import discourseComputed from "discourse-common/utils/decorators";
 import Mixin from "@ember/object/mixin";
 
 export default Mixin.create({
-  @computed("value", "default")
+  @discourseComputed("value", "default")
   overridden(val, defaultVal) {
     if (val === null) val = "";
     if (defaultVal === null) defaultVal = "";
@@ -10,7 +10,7 @@ export default Mixin.create({
     return val.toString() !== defaultVal.toString();
   },
 
-  @computed("valid_values")
+  @discourseComputed("valid_values")
   validValues(validValues) {
     const vals = [],
       translateNames = this.translate_names;
@@ -25,7 +25,7 @@ export default Mixin.create({
     return vals;
   },
 
-  @computed("valid_values")
+  @discourseComputed("valid_values")
   allowsNone(validValues) {
     if (validValues && validValues.indexOf("") >= 0) {
       return "admin.settings.none";
diff --git a/app/assets/javascripts/admin/models/admin-user.js.es6 b/app/assets/javascripts/admin/models/admin-user.js.es6
index 880cb44c39b..5447070185d 100644
--- a/app/assets/javascripts/admin/models/admin-user.js.es6
+++ b/app/assets/javascripts/admin/models/admin-user.js.es6
@@ -1,7 +1,7 @@
+import discourseComputed from "discourse-common/utils/decorators";
 import { filter, or, gt, lt, not } from "@ember/object/computed";
 import { iconHTML } from "discourse-common/lib/icon-library";
 import { ajax } from "discourse/lib/ajax";
-import computed from "ember-addons/ember-computed-decorators";
 import { propertyNotEqual } from "discourse/lib/computed";
 import { popupAjaxError } from "discourse/lib/ajax-error";
 import Group from "discourse/models/group";
@@ -17,7 +17,7 @@ const AdminUser = Discourse.User.extend({
 
   canViewProfile: or("active", "staged"),
 
-  @computed("bounce_score", "reset_bounce_score_after")
+  @discourseComputed("bounce_score", "reset_bounce_score_after")
   bounceScore(bounce_score, reset_bounce_score_after) {
     if (bounce_score > 0) {
       return `${bounce_score} - ${moment(reset_bounce_score_after).format(
@@ -28,7 +28,7 @@ const AdminUser = Discourse.User.extend({
     }
   },
 
-  @computed("bounce_score")
+  @discourseComputed("bounce_score")
   bounceScoreExplanation(bounce_score) {
     if (bounce_score === 0) {
       return I18n.t("admin.user.bounce_score_explanation.none");
@@ -39,7 +39,7 @@ const AdminUser = Discourse.User.extend({
     }
   },
 
-  @computed
+  @discourseComputed
   bounceLink() {
     return Discourse.getURL("/admin/email/bounced");
   },
@@ -278,7 +278,7 @@ const AdminUser = Discourse.User.extend({
 
   canSuspend: not("staff"),
 
-  @computed("suspended_till", "suspended_at")
+  @discourseComputed("suspended_till", "suspended_at")
   suspendDuration(suspendedTill, suspendedAt) {
     suspendedAt = moment(suspendedAt);
     suspendedTill = moment(suspendedTill);
@@ -513,20 +513,20 @@ const AdminUser = Discourse.User.extend({
     });
   },
 
-  @computed("tl3_requirements")
+  @discourseComputed("tl3_requirements")
   tl3Requirements(requirements) {
     if (requirements) {
       return this.store.createRecord("tl3Requirements", requirements);
     }
   },
 
-  @computed("suspended_by")
+  @discourseComputed("suspended_by")
   suspendedBy: wrapAdmin,
 
-  @computed("silenced_by")
+  @discourseComputed("silenced_by")
   silencedBy: wrapAdmin,
 
-  @computed("approved_by")
+  @discourseComputed("approved_by")
   approvedBy: wrapAdmin,
 
   _formatError(event) {
diff --git a/app/assets/javascripts/admin/models/api-key.js.es6 b/app/assets/javascripts/admin/models/api-key.js.es6
index 95d8e1914cf..4b77e23c4a2 100644
--- a/app/assets/javascripts/admin/models/api-key.js.es6
+++ b/app/assets/javascripts/admin/models/api-key.js.es6
@@ -1,7 +1,7 @@
+import discourseComputed from "discourse-common/utils/decorators";
 import AdminUser from "admin/models/admin-user";
 import RestModel from "discourse/models/rest";
 import { ajax } from "discourse/lib/ajax";
-import computed from "ember-addons/ember-computed-decorators";
 
 const ApiKey = RestModel.extend({
   user: Ember.computed("_user", {
@@ -18,12 +18,12 @@ const ApiKey = RestModel.extend({
     }
   }),
 
-  @computed("key")
+  @discourseComputed("key")
   shortKey(key) {
     return `${key.substring(0, 4)}...`;
   },
 
-  @computed("description")
+  @discourseComputed("description")
   shortDescription(description) {
     if (!description || description.length < 40) return description;
     return `${description.substring(0, 40)}...`;
@@ -45,7 +45,7 @@ const ApiKey = RestModel.extend({
     return this.getProperties("description", "username");
   },
 
-  @computed()
+  @discourseComputed()
   basePath() {
     return this.store
       .adapterFor("api-key")
diff --git a/app/assets/javascripts/admin/models/backup-status.js.es6 b/app/assets/javascripts/admin/models/backup-status.js.es6
index b7deec1c10b..b31d1cb176c 100644
--- a/app/assets/javascripts/admin/models/backup-status.js.es6
+++ b/app/assets/javascripts/admin/models/backup-status.js.es6
@@ -1,10 +1,10 @@
+import discourseComputed from "discourse-common/utils/decorators";
 import { not } from "@ember/object/computed";
-import computed from "ember-addons/ember-computed-decorators";
 
 export default Discourse.Model.extend({
   restoreDisabled: not("restoreEnabled"),
 
-  @computed("allowRestore", "isOperationRunning")
+  @discourseComputed("allowRestore", "isOperationRunning")
   restoreEnabled(allowRestore, isOperationRunning) {
     return allowRestore && !isOperationRunning;
   }
diff --git a/app/assets/javascripts/admin/models/color-scheme-color.js.es6 b/app/assets/javascripts/admin/models/color-scheme-color.js.es6
index a3b22d23bc6..d023295ce59 100644
--- a/app/assets/javascripts/admin/models/color-scheme-color.js.es6
+++ b/app/assets/javascripts/admin/models/color-scheme-color.js.es6
@@ -1,8 +1,8 @@
 import {
-  default as computed,
+  default as discourseComputed,
   observes,
   on
-} from "ember-addons/ember-computed-decorators";
+} from "discourse-common/utils/decorators";
 import { propertyNotEqual } from "discourse/lib/computed";
 
 const ColorSchemeColor = Discourse.Model.extend({
@@ -15,7 +15,7 @@ const ColorSchemeColor = Discourse.Model.extend({
   },
 
   // Whether value has changed since it was last saved.
-  @computed("hex")
+  @discourseComputed("hex")
   changed(hex) {
     if (!this.originals) return false;
     if (hex !== this.originals.hex) return true;
@@ -27,7 +27,7 @@ const ColorSchemeColor = Discourse.Model.extend({
   overridden: propertyNotEqual("hex", "default_hex"),
 
   // Whether the saved value is different than Discourse's default color scheme.
-  @computed("default_hex", "hex")
+  @discourseComputed("default_hex", "hex")
   savedIsOverriden(defaultHex) {
     return this.originals.hex !== defaultHex;
   },
@@ -42,7 +42,7 @@ const ColorSchemeColor = Discourse.Model.extend({
     }
   },
 
-  @computed("name")
+  @discourseComputed("name")
   translatedName(name) {
     if (!this.is_advanced) {
       return I18n.t(`admin.customize.colors.${name}.name`);
@@ -51,7 +51,7 @@ const ColorSchemeColor = Discourse.Model.extend({
     }
   },
 
-  @computed("name")
+  @discourseComputed("name")
   description(name) {
     if (!this.is_advanced) {
       return I18n.t(`admin.customize.colors.${name}.description`);
@@ -66,7 +66,7 @@ const ColorSchemeColor = Discourse.Model.extend({
 
     @property brightness
   **/
-  @computed("hex")
+  @discourseComputed("hex")
   brightness(hex) {
     if (hex.length === 6 || hex.length === 3) {
       if (hex.length === 3) {
@@ -94,7 +94,7 @@ const ColorSchemeColor = Discourse.Model.extend({
     }
   },
 
-  @computed("hex")
+  @discourseComputed("hex")
   valid(hex) {
     return hex.match(/^([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/) !== null;
   }
diff --git a/app/assets/javascripts/admin/models/color-scheme.js.es6 b/app/assets/javascripts/admin/models/color-scheme.js.es6
index 8875bf2e5e4..5d0550d2e01 100644
--- a/app/assets/javascripts/admin/models/color-scheme.js.es6
+++ b/app/assets/javascripts/admin/models/color-scheme.js.es6
@@ -1,7 +1,7 @@
+import discourseComputed from "discourse-common/utils/decorators";
 import { not } from "@ember/object/computed";
 import { ajax } from "discourse/lib/ajax";
 import ColorSchemeColor from "admin/models/color-scheme-color";
-import computed from "ember-addons/ember-computed-decorators";
 
 const ColorScheme = Discourse.Model.extend(Ember.Copyable, {
   init() {
@@ -10,7 +10,7 @@ const ColorScheme = Discourse.Model.extend(Ember.Copyable, {
     this.startTrackingChanges();
   },
 
-  @computed
+  @discourseComputed
   description() {
     return "" + this.name;
   },
@@ -42,7 +42,7 @@ const ColorScheme = Discourse.Model.extend(Ember.Copyable, {
     return newScheme;
   },
 
-  @computed("name", "colors.@each.changed", "saving")
+  @discourseComputed("name", "colors.@each.changed", "saving")
   changed(name) {
     if (!this.originals) return false;
     if (this.originals.name !== name) return true;
@@ -51,7 +51,7 @@ const ColorScheme = Discourse.Model.extend(Ember.Copyable, {
     return false;
   },
 
-  @computed("changed")
+  @discourseComputed("changed")
   disableSave(changed) {
     if (this.theme_id) {
       return false;
diff --git a/app/assets/javascripts/admin/models/flag-type.js.es6 b/app/assets/javascripts/admin/models/flag-type.js.es6
index b1bf1ca828b..93fb2eacc92 100644
--- a/app/assets/javascripts/admin/models/flag-type.js.es6
+++ b/app/assets/javascripts/admin/models/flag-type.js.es6
@@ -1,8 +1,8 @@
+import discourseComputed from "discourse-common/utils/decorators";
 import RestModel from "discourse/models/rest";
-import computed from "ember-addons/ember-computed-decorators";
 
 export default RestModel.extend({
-  @computed("id")
+  @discourseComputed("id")
   name(id) {
     return I18n.t(`admin.flags.summary.action_type_${id}`, { count: 1 });
   }
diff --git a/app/assets/javascripts/admin/models/report.js.es6 b/app/assets/javascripts/admin/models/report.js.es6
index 37c495e06f0..bb745b13024 100644
--- a/app/assets/javascripts/admin/models/report.js.es6
+++ b/app/assets/javascripts/admin/models/report.js.es6
@@ -1,3 +1,4 @@
+import discourseComputed from "discourse-common/utils/decorators";
 import { makeArray } from "discourse-common/lib/helpers";
 import { isEmpty } from "@ember/utils";
 import EmberObject from "@ember/object";
@@ -9,7 +10,6 @@ import {
   formatUsername,
   toNumber
 } from "discourse/lib/utilities";
-import computed from "ember-addons/ember-computed-decorators";
 import { number, durationTiny } from "discourse/lib/formatter";
 import { renderAvatar } from "discourse/helpers/user-avatar";
 
@@ -22,12 +22,12 @@ const Report = Discourse.Model.extend({
   percent: false,
   higher_is_better: true,
 
-  @computed("modes")
+  @discourseComputed("modes")
   isTable(modes) {
     return modes.some(mode => mode === "table");
   },
 
-  @computed("type", "start_date", "end_date")
+  @discourseComputed("type", "start_date", "end_date")
   reportUrl(type, start_date, end_date) {
     start_date = moment
       .utc(start_date)
@@ -83,32 +83,32 @@ const Report = Discourse.Model.extend({
     }
   },
 
-  @computed("data", "average")
+  @discourseComputed("data", "average")
   todayCount() {
     return this.valueAt(0);
   },
 
-  @computed("data", "average")
+  @discourseComputed("data", "average")
   yesterdayCount() {
     return this.valueAt(1);
   },
 
-  @computed("data", "average")
+  @discourseComputed("data", "average")
   sevenDaysAgoCount() {
     return this.valueAt(7);
   },
 
-  @computed("data", "average")
+  @discourseComputed("data", "average")
   thirtyDaysAgoCount() {
     return this.valueAt(30);
   },
 
-  @computed("data", "average")
+  @discourseComputed("data", "average")
   lastSevenDaysCount() {
     return this.averageCount(7, this.valueFor(1, 7));
   },
 
-  @computed("data", "average")
+  @discourseComputed("data", "average")
   lastThirtyDaysCount() {
     return this.averageCount(30, this.valueFor(1, 30));
   },
@@ -117,12 +117,12 @@ const Report = Discourse.Model.extend({
     return this.average ? value / count : value;
   },
 
-  @computed("yesterdayCount", "higher_is_better")
+  @discourseComputed("yesterdayCount", "higher_is_better")
   yesterdayTrend(yesterdayCount, higherIsBetter) {
     return this._computeTrend(this.valueAt(2), yesterdayCount, higherIsBetter);
   },
 
-  @computed("lastSevenDaysCount", "higher_is_better")
+  @discourseComputed("lastSevenDaysCount", "higher_is_better")
   sevenDaysTrend(lastSevenDaysCount, higherIsBetter) {
     return this._computeTrend(
       this.valueFor(8, 14),
@@ -131,50 +131,55 @@ const Report = Discourse.Model.extend({
     );
   },
 
-  @computed("data")
+  @discourseComputed("data")
   currentTotal(data) {
     return data.reduce((cur, pair) => cur + pair.y, 0);
   },
 
-  @computed("data", "currentTotal")
+  @discourseComputed("data", "currentTotal")
   currentAverage(data, total) {
     return makeArray(data).length === 0
       ? 0
       : parseFloat((total / parseFloat(data.length)).toFixed(1));
   },
 
-  @computed("trend", "higher_is_better")
+  @discourseComputed("trend", "higher_is_better")
   trendIcon(trend, higherIsBetter) {
     return this._iconForTrend(trend, higherIsBetter);
   },
 
-  @computed("sevenDaysTrend", "higher_is_better")
+  @discourseComputed("sevenDaysTrend", "higher_is_better")
   sevenDaysTrendIcon(sevenDaysTrend, higherIsBetter) {
     return this._iconForTrend(sevenDaysTrend, higherIsBetter);
   },
 
-  @computed("thirtyDaysTrend", "higher_is_better")
+  @discourseComputed("thirtyDaysTrend", "higher_is_better")
   thirtyDaysTrendIcon(thirtyDaysTrend, higherIsBetter) {
     return this._iconForTrend(thirtyDaysTrend, higherIsBetter);
   },
 
-  @computed("yesterdayTrend", "higher_is_better")
+  @discourseComputed("yesterdayTrend", "higher_is_better")
   yesterdayTrendIcon(yesterdayTrend, higherIsBetter) {
     return this._iconForTrend(yesterdayTrend, higherIsBetter);
   },
 
-  @computed("prev_period", "currentTotal", "currentAverage", "higher_is_better")
+  @discourseComputed(
+    "prev_period",
+    "currentTotal",
+    "currentAverage",
+    "higher_is_better"
+  )
   trend(prev, currentTotal, currentAverage, higherIsBetter) {
     const total = this.average ? currentAverage : currentTotal;
     return this._computeTrend(prev, total, higherIsBetter);
   },
 
-  @computed("prev30Days", "lastThirtyDaysCount", "higher_is_better")
+  @discourseComputed("prev30Days", "lastThirtyDaysCount", "higher_is_better")
   thirtyDaysTrend(prev30Days, lastThirtyDaysCount, higherIsBetter) {
     return this._computeTrend(prev30Days, lastThirtyDaysCount, higherIsBetter);
   },
 
-  @computed("type")
+  @discourseComputed("type")
   method(type) {
     if (type === "time_to_first_response") {
       return "average";
@@ -195,7 +200,7 @@ const Report = Discourse.Model.extend({
     }
   },
 
-  @computed("prev_period", "currentTotal", "currentAverage")
+  @discourseComputed("prev_period", "currentTotal", "currentAverage")
   trendTitle(prev, currentTotal, currentAverage) {
     let current = this.average ? currentAverage : currentTotal;
     let percent = this.percentChangeString(prev, current);
@@ -228,12 +233,12 @@ const Report = Discourse.Model.extend({
     return title;
   },
 
-  @computed("yesterdayCount")
+  @discourseComputed("yesterdayCount")
   yesterdayCountTitle(yesterdayCount) {
     return this.changeTitle(this.valueAt(2), yesterdayCount, "two days ago");
   },
 
-  @computed("lastSevenDaysCount")
+  @discourseComputed("lastSevenDaysCount")
   sevenDaysCountTitle(lastSevenDaysCount) {
     return this.changeTitle(
       this.valueFor(8, 14),
@@ -242,7 +247,7 @@ const Report = Discourse.Model.extend({
     );
   },
 
-  @computed("prev30Days", "lastThirtyDaysCount")
+  @discourseComputed("prev30Days", "lastThirtyDaysCount")
   thirtyDaysCountTitle(prev30Days, lastThirtyDaysCount) {
     return this.changeTitle(
       prev30Days,
@@ -251,18 +256,18 @@ const Report = Discourse.Model.extend({
     );
   },
 
-  @computed("data")
+  @discourseComputed("data")
   sortedData(data) {
     return this.xAxisIsDate ? data.toArray().reverse() : data.toArray();
   },
 
-  @computed("data")
+  @discourseComputed("data")
   xAxisIsDate() {
     if (!this.data[0]) return false;
     return this.data && this.data[0].x.match(/\d{4}-\d{1,2}-\d{1,2}/);
   },
 
-  @computed("labels")
+  @discourseComputed("labels")
   computedLabels(labels) {
     return labels.map(label => {
       const type = label.type || "string";
diff --git a/app/assets/javascripts/admin/models/screened-email.js.es6 b/app/assets/javascripts/admin/models/screened-email.js.es6
index 6eb014c4849..0d20f2c7d1e 100644
--- a/app/assets/javascripts/admin/models/screened-email.js.es6
+++ b/app/assets/javascripts/admin/models/screened-email.js.es6
@@ -1,8 +1,8 @@
+import discourseComputed from "discourse-common/utils/decorators";
 import { ajax } from "discourse/lib/ajax";
-import computed from "ember-addons/ember-computed-decorators";
 
 const ScreenedEmail = Discourse.Model.extend({
-  @computed("action")
+  @discourseComputed("action")
   actionName(action) {
     return I18n.t("admin.logs.screened_actions." + action);
   },
diff --git a/app/assets/javascripts/admin/models/screened-ip-address.js.es6 b/app/assets/javascripts/admin/models/screened-ip-address.js.es6
index 0449a666f37..e2b60a21088 100644
--- a/app/assets/javascripts/admin/models/screened-ip-address.js.es6
+++ b/app/assets/javascripts/admin/models/screened-ip-address.js.es6
@@ -1,16 +1,16 @@
+import discourseComputed from "discourse-common/utils/decorators";
 import { equal } from "@ember/object/computed";
 import { ajax } from "discourse/lib/ajax";
-import computed from "ember-addons/ember-computed-decorators";
 
 const ScreenedIpAddress = Discourse.Model.extend({
-  @computed("action_name")
+  @discourseComputed("action_name")
   actionName(actionName) {
     return I18n.t(`admin.logs.screened_ips.actions.${actionName}`);
   },
 
   isBlocked: equal("action_name", "block"),
 
-  @computed("ip_address")
+  @discourseComputed("ip_address")
   isRange(ipAddress) {
     return ipAddress.indexOf("/") > 0;
   },
diff --git a/app/assets/javascripts/admin/models/screened-url.js.es6 b/app/assets/javascripts/admin/models/screened-url.js.es6
index b899c619623..515ef6e82c1 100644
--- a/app/assets/javascripts/admin/models/screened-url.js.es6
+++ b/app/assets/javascripts/admin/models/screened-url.js.es6
@@ -1,8 +1,8 @@
+import discourseComputed from "discourse-common/utils/decorators";
 import { ajax } from "discourse/lib/ajax";
-import computed from "ember-addons/ember-computed-decorators";
 
 const ScreenedUrl = Discourse.Model.extend({
-  @computed("action")
+  @discourseComputed("action")
   actionName(action) {
     return I18n.t("admin.logs.screened_actions." + action);
   }
diff --git a/app/assets/javascripts/admin/models/staff-action-log.js.es6 b/app/assets/javascripts/admin/models/staff-action-log.js.es6
index 2d63019ddad..45330b13fcc 100644
--- a/app/assets/javascripts/admin/models/staff-action-log.js.es6
+++ b/app/assets/javascripts/admin/models/staff-action-log.js.es6
@@ -1,4 +1,4 @@
-import computed from "ember-addons/ember-computed-decorators";
+import discourseComputed from "discourse-common/utils/decorators";
 import { ajax } from "discourse/lib/ajax";
 import AdminUser from "admin/models/admin-user";
 import { escapeExpression } from "discourse/lib/utilities";
@@ -13,12 +13,12 @@ function format(label, value, escape = true) {
 const StaffActionLog = RestModel.extend({
   showFullDetails: false,
 
-  @computed("action_name")
+  @discourseComputed("action_name")
   actionName(actionName) {
     return I18n.t(`admin.logs.staff_actions.actions.${actionName}`);
   },
 
-  @computed(
+  @discourseComputed(
     "email",
     "ip_address",
     "topic_id",
@@ -69,12 +69,12 @@ const StaffActionLog = RestModel.extend({
     return formatted.length > 0 ? formatted + "
" : ""; }, - @computed("details") + @discourseComputed("details") useModalForDetails(details) { return details && details.length > 100; }, - @computed("action_name") + @discourseComputed("action_name") useCustomModalForDetails(actionName) { return ["change_theme", "delete_theme"].includes(actionName); } diff --git a/app/assets/javascripts/admin/models/theme.js.es6 b/app/assets/javascripts/admin/models/theme.js.es6 index 4ea3d3e2163..94ccf5f9b0e 100644 --- a/app/assets/javascripts/admin/models/theme.js.es6 +++ b/app/assets/javascripts/admin/models/theme.js.es6 @@ -2,7 +2,7 @@ import { get } from "@ember/object"; import { isEmpty } from "@ember/utils"; import { or, gt } from "@ember/object/computed"; import RestModel from "discourse/models/rest"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import { popupAjaxError } from "discourse/lib/ajax-error"; import { ajax } from "discourse/lib/ajax"; import { escapeExpression } from "discourse/lib/utilities"; @@ -20,7 +20,7 @@ const Theme = RestModel.extend({ isPendingUpdates: gt("remote_theme.commits_behind", 0), hasEditedFields: gt("editedFields.length", 0), - @computed("theme_fields.[]") + @discourseComputed("theme_fields.[]") targets() { return [ { id: 0, name: "common" }, @@ -48,7 +48,7 @@ const Theme = RestModel.extend({ }); }, - @computed("theme_fields.[]") + @discourseComputed("theme_fields.[]") fieldNames() { const common = [ "scss", @@ -82,7 +82,11 @@ const Theme = RestModel.extend({ }; }, - @computed("fieldNames", "theme_fields.[]", "theme_fields.@each.error") + @discourseComputed( + "fieldNames", + "theme_fields.[]", + "theme_fields.@each.error" + ) fields(fieldNames) { const hash = {}; Object.keys(fieldNames).forEach(target => { @@ -112,7 +116,7 @@ const Theme = RestModel.extend({ return hash; }, - @computed("theme_fields") + @discourseComputed("theme_fields") themeFields(fields) { if (!fields) { this.set("theme_fields", []); @@ -128,7 +132,7 @@ const Theme = RestModel.extend({ return hash; }, - @computed("theme_fields", "theme_fields.[]") + @discourseComputed("theme_fields", "theme_fields.[]") uploads(fields) { if (!fields) { return []; @@ -138,19 +142,19 @@ const Theme = RestModel.extend({ ); }, - @computed("theme_fields", "theme_fields.@each.error") + @discourseComputed("theme_fields", "theme_fields.@each.error") isBroken(fields) { return fields && fields.any(field => field.error && field.error.length > 0); }, - @computed("theme_fields.[]") + @discourseComputed("theme_fields.[]") editedFields(fields) { return fields.filter( field => !Ember.isBlank(field.value) && field.type_id !== SETTINGS_TYPE_ID ); }, - @computed("remote_theme.last_error_text") + @discourseComputed("remote_theme.last_error_text") remoteError(errorText) { if (errorText && errorText.length > 0) { return errorText; @@ -241,7 +245,7 @@ const Theme = RestModel.extend({ } }, - @computed("childThemes.[]") + @discourseComputed("childThemes.[]") child_theme_ids(childThemes) { if (childThemes) { return childThemes.map(theme => get(theme, "id")); @@ -265,7 +269,7 @@ const Theme = RestModel.extend({ return this.saveChanges("child_theme_ids"); }, - @computed("name", "default") + @discourseComputed("name", "default") description: function(name, isDefault) { if (isDefault) { return I18n.t("admin.customize.theme.default_name", { name: name }); diff --git a/app/assets/javascripts/admin/models/tl3-requirements.js.es6 b/app/assets/javascripts/admin/models/tl3-requirements.js.es6 index 222c8077d73..966410b41c1 100644 --- a/app/assets/javascripts/admin/models/tl3-requirements.js.es6 +++ b/app/assets/javascripts/admin/models/tl3-requirements.js.es6 @@ -1,17 +1,17 @@ -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; export default Discourse.Model.extend({ - @computed("days_visited", "time_period") + @discourseComputed("days_visited", "time_period") days_visited_percent(daysVisited, timePeriod) { return Math.round((daysVisited * 100) / timePeriod); }, - @computed("min_days_visited", "time_period") + @discourseComputed("min_days_visited", "time_period") min_days_visited_percent(minDaysVisited, timePeriod) { return Math.round((minDaysVisited * 100) / timePeriod); }, - @computed( + @discourseComputed( "days_visited", "min_days_visited", "num_topics_replied_to", diff --git a/app/assets/javascripts/admin/models/version-check.js.es6 b/app/assets/javascripts/admin/models/version-check.js.es6 index 2012d0ff081..54ef9844fe0 100644 --- a/app/assets/javascripts/admin/models/version-check.js.es6 +++ b/app/assets/javascripts/admin/models/version-check.js.es6 @@ -1,30 +1,30 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { ajax } from "discourse/lib/ajax"; -import computed from "ember-addons/ember-computed-decorators"; const VersionCheck = Discourse.Model.extend({ - @computed("updated_at") + @discourseComputed("updated_at") noCheckPerformed(updatedAt) { return updatedAt === null; }, - @computed("missing_versions_count") + @discourseComputed("missing_versions_count") upToDate(missingVersionsCount) { return missingVersionsCount === 0 || missingVersionsCount === null; }, - @computed("missing_versions_count") + @discourseComputed("missing_versions_count") behindByOneVersion(missingVersionsCount) { return missingVersionsCount === 1; }, - @computed("installed_sha") + @discourseComputed("installed_sha") gitLink(installedSHA) { if (installedSHA) { return `https://github.com/discourse/discourse/commits/${installedSHA}`; } }, - @computed("installed_sha") + @discourseComputed("installed_sha") shortSha(installedSHA) { if (installedSHA) { return installedSHA.substr(0, 10); diff --git a/app/assets/javascripts/admin/models/web-hook.js.es6 b/app/assets/javascripts/admin/models/web-hook.js.es6 index 84111591fa4..df3ac54918b 100644 --- a/app/assets/javascripts/admin/models/web-hook.js.es6 +++ b/app/assets/javascripts/admin/models/web-hook.js.es6 @@ -3,9 +3,9 @@ import RestModel from "discourse/models/rest"; import Category from "discourse/models/category"; import Group from "discourse/models/group"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; export default RestModel.extend({ content_type: 1, // json @@ -16,7 +16,7 @@ export default RestModel.extend({ web_hook_event_types: null, groupsFilterInName: null, - @computed("wildcard_web_hook") + @discourseComputed("wildcard_web_hook") webHookType: { get(wildcard) { return wildcard ? "wildcard" : "individual"; @@ -26,7 +26,7 @@ export default RestModel.extend({ } }, - @computed("category_ids") + @discourseComputed("category_ids") categories(categoryIds) { return Category.findByIds(categoryIds); }, @@ -49,7 +49,7 @@ export default RestModel.extend({ return Group.findAll({ term: term, ignore_automatic: false }); }, - @computed("wildcard_web_hook", "web_hook_event_types.[]") + @discourseComputed("wildcard_web_hook", "web_hook_event_types.[]") description(isWildcardWebHook, types) { let desc = ""; diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 46bf6825767..290f9207898 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -1,10 +1,9 @@ //= require_tree ./ember-addons/utils +//= require_tree ./discourse-common //= require ./ember-addons/decorator-alias //= require ./ember-addons/macro-alias -//= require ./ember-addons/ember-computed-decorators //= require ./ember-addons/fmt //= require ./polyfills -//= require_tree ./discourse-common //= require_tree ./select-kit //= require ./discourse //= require ./deprecated diff --git a/app/assets/javascripts/discourse-common/lib/raw-handlebars.js.es6 b/app/assets/javascripts/discourse-common/lib/raw-handlebars.js.es6 index eed8ec09a0c..ca08cfd476e 100644 --- a/app/assets/javascripts/discourse-common/lib/raw-handlebars.js.es6 +++ b/app/assets/javascripts/discourse-common/lib/raw-handlebars.js.es6 @@ -1,6 +1,6 @@ // This is a mechanism for quickly rendering templates which is Ember aware // templates are highly compatible with Ember so you don't need to worry about calling "get" -// and computed properties function, additionally it uses stringParams like Ember does +// and discourseComputed properties function, additionally it uses stringParams like Ember does const RawHandlebars = Handlebars.create(); diff --git a/app/assets/javascripts/ember-addons/ember-computed-decorators.js.es6 b/app/assets/javascripts/discourse-common/utils/decorators.js.es6 similarity index 82% rename from app/assets/javascripts/ember-addons/ember-computed-decorators.js.es6 rename to app/assets/javascripts/discourse-common/utils/decorators.js.es6 index eaa78d50636..053eefe341a 100644 --- a/app/assets/javascripts/ember-addons/ember-computed-decorators.js.es6 +++ b/app/assets/javascripts/discourse-common/utils/decorators.js.es6 @@ -1,9 +1,9 @@ -import handleDescriptor from "./utils/handle-descriptor"; -import isDescriptor from "./utils/is-descriptor"; -import extractValue from "./utils/extract-value"; +import handleDescriptor from "ember-addons/utils/handle-descriptor"; +import isDescriptor from "ember-addons/utils/is-descriptor"; +import extractValue from "ember-addons/utils/extract-value"; -export default function computedDecorator(...params) { - // determine if user called as @computed('blah', 'blah') or @computed +export default function discourseComputedDecorator(...params) { + // determine if user called as @discourseComputed('blah', 'blah') or @discourseComputed if (isDescriptor(params[params.length - 1])) { return handleDescriptor(...arguments); } else { @@ -25,7 +25,7 @@ export function readOnly(target, name, desc) { }; } -import decoratorAlias from "./decorator-alias"; +import decoratorAlias from "ember-addons/decorator-alias"; export var on = decoratorAlias(Ember.on, "Can not `on` without event names"); export var observes = decoratorAlias( @@ -33,7 +33,7 @@ export var observes = decoratorAlias( "Can not `observe` without property names" ); -import macroAlias from "./macro-alias"; +import macroAlias from "ember-addons/macro-alias"; export var alias = macroAlias(Ember.computed.alias); export var and = macroAlias(Ember.computed.and); diff --git a/app/assets/javascripts/discourse-loader.js b/app/assets/javascripts/discourse-loader.js index cb402832e86..fc3a0613f87 100644 --- a/app/assets/javascripts/discourse-loader.js +++ b/app/assets/javascripts/discourse-loader.js @@ -3,6 +3,10 @@ var define, requirejs; (function() { // In future versions of ember we don't need this var EMBER_MODULES = {}; + var ALIASES = { + "ember-addons/ember-computed-decorators": + "discourse-common/utils/decorators" + }; if (typeof Ember !== "undefined") { EMBER_MODULES = { jquery: { default: $ }, @@ -76,7 +80,7 @@ var define, requirejs; "@ember/utils": { isEmpty: Ember.isEmpty }, - "rsvp": { + rsvp: { Promise: Ember.RSVP.Promise, hash: Ember.RSVP.hash, all: Ember.RSVP.all @@ -213,6 +217,7 @@ var define, requirejs; } function requireFrom(name, origin) { + name = checkForAlias(name); var mod = EMBER_MODULES[name] || registry[name]; if (!mod) { throw new Error( @@ -226,6 +231,10 @@ var define, requirejs; throw new Error("Could not find module " + name); } + function checkForAlias(name) { + return ALIASES[name] ? ALIASES[name] : name; + } + requirejs = require = function(name) { if (EMBER_MODULES[name]) { return EMBER_MODULES[name]; diff --git a/app/assets/javascripts/discourse.js.es6 b/app/assets/javascripts/discourse.js.es6 index d993e3b9830..2f45653ed1d 100644 --- a/app/assets/javascripts/discourse.js.es6 +++ b/app/assets/javascripts/discourse.js.es6 @@ -1,9 +1,9 @@ /*global Mousetrap:true*/ import { buildResolver } from "discourse-common/resolver"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import FocusEvent from "discourse-common/mixins/focus-event"; const _pluginCallbacks = []; @@ -66,7 +66,7 @@ const Discourse = Ember.Application.extend(FocusEvent, { document.title = title; }, - @computed("contextCount", "notificationCount") + @discourseComputed("contextCount", "notificationCount") displayCount() { return Discourse.User.current() && Discourse.User.currentProp("title_count_mode") === "notifications" @@ -179,7 +179,7 @@ const Discourse = Ember.Application.extend(FocusEvent, { }); }, - @computed("currentAssetVersion", "desiredAssetVersion") + @discourseComputed("currentAssetVersion", "desiredAssetVersion") requiresRefresh(currentAssetVersion, desiredAssetVersion) { return desiredAssetVersion && currentAssetVersion !== desiredAssetVersion; }, diff --git a/app/assets/javascripts/discourse/components/add-category-tag-classes.js.es6 b/app/assets/javascripts/discourse/components/add-category-tag-classes.js.es6 index d4a75e6ebe3..50d93f3a95c 100644 --- a/app/assets/javascripts/discourse/components/add-category-tag-classes.js.es6 +++ b/app/assets/javascripts/discourse/components/add-category-tag-classes.js.es6 @@ -1,6 +1,6 @@ import { scheduleOnce } from "@ember/runloop"; import Component from "@ember/component"; -import { observes } from "ember-addons/ember-computed-decorators"; +import { observes } from "discourse-common/utils/decorators"; export default Component.extend({ _slug: null, diff --git a/app/assets/javascripts/discourse/components/avatar-flair.js.es6 b/app/assets/javascripts/discourse/components/avatar-flair.js.es6 index 4d0bd2e131e..f25d596ba7f 100644 --- a/app/assets/javascripts/discourse/components/avatar-flair.js.es6 +++ b/app/assets/javascripts/discourse/components/avatar-flair.js.es6 @@ -1,4 +1,4 @@ -import { observes } from "ember-addons/ember-computed-decorators"; +import { observes } from "discourse-common/utils/decorators"; import MountWidget from "discourse/components/mount-widget"; export default MountWidget.extend({ diff --git a/app/assets/javascripts/discourse/components/avatar-uploader.js.es6 b/app/assets/javascripts/discourse/components/avatar-uploader.js.es6 index 3350ddff312..f9144abe596 100644 --- a/app/assets/javascripts/discourse/components/avatar-uploader.js.es6 +++ b/app/assets/javascripts/discourse/components/avatar-uploader.js.es6 @@ -1,5 +1,5 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; import UploadMixin from "discourse/mixins/upload"; export default Component.extend(UploadMixin, { @@ -21,7 +21,7 @@ export default Component.extend(UploadMixin, { this.done(); }, - @computed("user_id") + @discourseComputed("user_id") data(user_id) { return { user_id }; } diff --git a/app/assets/javascripts/discourse/components/backup-codes.js.es6 b/app/assets/javascripts/discourse/components/backup-codes.js.es6 index 5e80cc3e3bb..1109c4cde68 100644 --- a/app/assets/javascripts/discourse/components/backup-codes.js.es6 +++ b/app/assets/javascripts/discourse/components/backup-codes.js.es6 @@ -1,5 +1,5 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; // https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding function b64EncodeUnicode(str) { @@ -32,10 +32,10 @@ export default Component.extend({ } }, - @computed("formattedBackupCodes") + @discourseComputed("formattedBackupCodes") base64BackupCode: b64EncodeUnicode, - @computed("backupCodes") + @discourseComputed("backupCodes") formattedBackupCodes(backupCodes) { if (!backupCodes) return null; diff --git a/app/assets/javascripts/discourse/components/backup-uploader.js.es6 b/app/assets/javascripts/discourse/components/backup-uploader.js.es6 index e75470439d3..331684ee255 100644 --- a/app/assets/javascripts/discourse/components/backup-uploader.js.es6 +++ b/app/assets/javascripts/discourse/components/backup-uploader.js.es6 @@ -1,14 +1,14 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; import { ajax } from "discourse/lib/ajax"; import { popupAjaxError } from "discourse/lib/ajax-error"; -import computed from "ember-addons/ember-computed-decorators"; import UploadMixin from "discourse/mixins/upload"; import { on } from "@ember/object/evented"; export default Component.extend(UploadMixin, { tagName: "span", - @computed("uploading", "uploadProgress") + @discourseComputed("uploading", "uploadProgress") uploadButtonText(uploading, progress) { return uploading ? I18n.t("admin.backups.upload.uploading_progress", { progress }) diff --git a/app/assets/javascripts/discourse/components/badge-button.js.es6 b/app/assets/javascripts/discourse/components/badge-button.js.es6 index dde5bfb804b..9204a1cf7b8 100644 --- a/app/assets/javascripts/discourse/components/badge-button.js.es6 +++ b/app/assets/javascripts/discourse/components/badge-button.js.es6 @@ -1,6 +1,6 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { alias } from "@ember/object/computed"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ tagName: "span", @@ -10,7 +10,7 @@ export default Component.extend({ "badge.enabled::disabled" ], - @computed("badge.description") + @discourseComputed("badge.description") title(badgeDescription) { return $("
" + badgeDescription + "
").text(); }, diff --git a/app/assets/javascripts/discourse/components/badge-card.js.es6 b/app/assets/javascripts/discourse/components/badge-card.js.es6 index f9380b11eb7..e0b192895bd 100644 --- a/app/assets/javascripts/discourse/components/badge-card.js.es6 +++ b/app/assets/javascripts/discourse/components/badge-card.js.es6 @@ -1,17 +1,17 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; import { sanitize, emojiUnescape } from "discourse/lib/text"; export default Component.extend({ size: "medium", classNameBindings: [":badge-card", "size", "badge.slug"], - @computed("badge.url", "filterUser", "username") + @discourseComputed("badge.url", "filterUser", "username") url(badgeUrl, filterUser, username) { return filterUser ? `${badgeUrl}?username=${username}` : badgeUrl; }, - @computed("count", "badge.grant_count") + @discourseComputed("count", "badge.grant_count") displayCount(count, grantCount) { if (count == null) { return grantCount; @@ -21,7 +21,7 @@ export default Component.extend({ } }, - @computed("size") + @discourseComputed("size") summary(size) { if (size === "large") { const longDescription = this.get("badge.long_description"); diff --git a/app/assets/javascripts/discourse/components/badge-selector.js.es6 b/app/assets/javascripts/discourse/components/badge-selector.js.es6 index 94c08c95cad..3e02b0740e6 100644 --- a/app/assets/javascripts/discourse/components/badge-selector.js.es6 +++ b/app/assets/javascripts/discourse/components/badge-selector.js.es6 @@ -2,13 +2,13 @@ import Component from "@ember/component"; import { on, observes, - default as computed -} from "ember-addons/ember-computed-decorators"; + default as discourseComputed +} from "discourse-common/utils/decorators"; import { findRawTemplate } from "discourse/lib/raw-templates"; const { makeArray } = Ember; export default Component.extend({ - @computed("placeholderKey") + @discourseComputed("placeholderKey") placeholder(placeholderKey) { return placeholderKey ? I18n.t(placeholderKey) : ""; }, diff --git a/app/assets/javascripts/discourse/components/badge-title.js.es6 b/app/assets/javascripts/discourse/components/badge-title.js.es6 index d7fd08c3188..7f1292e2e7c 100644 --- a/app/assets/javascripts/discourse/components/badge-title.js.es6 +++ b/app/assets/javascripts/discourse/components/badge-title.js.es6 @@ -1,6 +1,6 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; import { ajax } from "discourse/lib/ajax"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ classNames: ["badge-title"], @@ -8,7 +8,7 @@ export default Component.extend({ saved: false, saving: false, - @computed("selectableUserBadges", "selectedUserBadgeId") + @discourseComputed("selectableUserBadges", "selectedUserBadgeId") selectedUserBadge(selectableUserBadges, selectedUserBadgeId) { return selectableUserBadges.findBy("id", parseInt(selectedUserBadgeId)); }, diff --git a/app/assets/javascripts/discourse/components/basic-topic-list.js.es6 b/app/assets/javascripts/discourse/components/basic-topic-list.js.es6 index 64942198ed4..c9ce38c3393 100644 --- a/app/assets/javascripts/discourse/components/basic-topic-list.js.es6 +++ b/app/assets/javascripts/discourse/components/basic-topic-list.js.es6 @@ -1,12 +1,12 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { alias, not } from "@ember/object/computed"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ loadingMore: alias("topicList.loadingMore"), loading: not("loaded"), - @computed("topicList.loaded") + @discourseComputed("topicList.loaded") loaded() { var topicList = this.topicList; if (topicList) { @@ -73,7 +73,7 @@ export default Component.extend({ }); }, - @computed("topics") + @discourseComputed("topics") showUnreadIndicator(topics) { return topics.some( topic => typeof topic.unread_by_group_member !== "undefined" diff --git a/app/assets/javascripts/discourse/components/bread-crumbs.js.es6 b/app/assets/javascripts/discourse/components/bread-crumbs.js.es6 index e420fcce7cd..c1e013cac97 100644 --- a/app/assets/javascripts/discourse/components/bread-crumbs.js.es6 +++ b/app/assets/javascripts/discourse/components/bread-crumbs.js.es6 @@ -1,6 +1,6 @@ import { alias, filter, or } from "@ember/object/computed"; import Component from "@ember/component"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; // A breadcrumb including category drop downs export default Component.extend({ @@ -21,7 +21,7 @@ export default Component.extend({ return !c.get("parentCategory"); }), - @computed("parentCategories") + @discourseComputed("parentCategories") parentCategoriesSorted(parentCategories) { if (this.siteSettings.fixed_category_positions) { return parentCategories; @@ -30,20 +30,20 @@ export default Component.extend({ return parentCategories.sortBy("totalTopicCount").reverse(); }, - @computed("category") + @discourseComputed("category") hidden(category) { return this.site.mobileView && !category; }, firstCategory: or("{parentCategory,category}"), - @computed("category", "parentCategory") + @discourseComputed("category", "parentCategory") secondCategory(category, parentCategory) { if (parentCategory) return category; return null; }, - @computed("firstCategory", "hideSubcategories") + @discourseComputed("firstCategory", "hideSubcategories") childCategories(firstCategory, hideSubcategories) { if (hideSubcategories) { return []; diff --git a/app/assets/javascripts/discourse/components/categories-boxes-topic.js.es6 b/app/assets/javascripts/discourse/components/categories-boxes-topic.js.es6 index b5536923ecc..ed2af66cad0 100644 --- a/app/assets/javascripts/discourse/components/categories-boxes-topic.js.es6 +++ b/app/assets/javascripts/discourse/components/categories-boxes-topic.js.es6 @@ -1,10 +1,10 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ tagName: "li", - @computed("topic.pinned", "topic.closed", "topic.archived") + @discourseComputed("topic.pinned", "topic.closed", "topic.archived") topicStatusIcon(pinned, closed, archived) { if (pinned) { return "thumbtack"; diff --git a/app/assets/javascripts/discourse/components/categories-boxes-with-topics.js.es6 b/app/assets/javascripts/discourse/components/categories-boxes-with-topics.js.es6 index 40b16d03fae..ffd3a77ca87 100644 --- a/app/assets/javascripts/discourse/components/categories-boxes-with-topics.js.es6 +++ b/app/assets/javascripts/discourse/components/categories-boxes-with-topics.js.es6 @@ -1,6 +1,6 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { isEmpty } from "@ember/utils"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ tagName: "section", @@ -9,7 +9,7 @@ export default Component.extend({ "anyLogos:with-logos:no-logos" ], - @computed("categories.[].uploaded_logo.url") + @discourseComputed("categories.[].uploaded_logo.url") anyLogos() { return this.categories.any(c => { return !isEmpty(c.get("uploaded_logo.url")); diff --git a/app/assets/javascripts/discourse/components/categories-boxes.js.es6 b/app/assets/javascripts/discourse/components/categories-boxes.js.es6 index 11b76ed1d4d..b4dcfde7e89 100644 --- a/app/assets/javascripts/discourse/components/categories-boxes.js.es6 +++ b/app/assets/javascripts/discourse/components/categories-boxes.js.es6 @@ -1,6 +1,6 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { isEmpty } from "@ember/utils"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; import DiscourseURL from "discourse/lib/url"; export default Component.extend({ @@ -11,12 +11,12 @@ export default Component.extend({ "hasSubcategories:with-subcategories" ], - @computed("categories.[].uploaded_logo.url") + @discourseComputed("categories.[].uploaded_logo.url") anyLogos() { return this.categories.any(c => !isEmpty(c.get("uploaded_logo.url"))); }, - @computed("categories.[].subcategories") + @discourseComputed("categories.[].subcategories") hasSubcategories() { return this.categories.any(c => !isEmpty(c.get("subcategories"))); }, diff --git a/app/assets/javascripts/discourse/components/cdn-img.js.es6 b/app/assets/javascripts/discourse/components/cdn-img.js.es6 index 338c71a1ee9..a5c7a2642a0 100644 --- a/app/assets/javascripts/discourse/components/cdn-img.js.es6 +++ b/app/assets/javascripts/discourse/components/cdn-img.js.es6 @@ -1,16 +1,16 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; import { htmlSafe } from "@ember/template"; export default Component.extend({ tagName: "", - @computed("src") + @discourseComputed("src") cdnSrc(src) { return Discourse.getURLWithCDN(src); }, - @computed("width", "height") + @discourseComputed("width", "height") style(width, height) { if (width && height) { return htmlSafe(`--aspect-ratio: ${width / height};`); diff --git a/app/assets/javascripts/discourse/components/choose-message.js.es6 b/app/assets/javascripts/discourse/components/choose-message.js.es6 index cb6c251355e..e47618dbef9 100644 --- a/app/assets/javascripts/discourse/components/choose-message.js.es6 +++ b/app/assets/javascripts/discourse/components/choose-message.js.es6 @@ -4,7 +4,7 @@ import { next } from "@ember/runloop"; import Component from "@ember/component"; import debounce from "discourse/lib/debounce"; import { searchForTerm } from "discourse/lib/search"; -import { observes } from "ember-addons/ember-computed-decorators"; +import { observes } from "discourse-common/utils/decorators"; export default Component.extend({ loading: null, diff --git a/app/assets/javascripts/discourse/components/choose-topic.js.es6 b/app/assets/javascripts/discourse/components/choose-topic.js.es6 index f2d47924140..557b30d9a0a 100644 --- a/app/assets/javascripts/discourse/components/choose-topic.js.es6 +++ b/app/assets/javascripts/discourse/components/choose-topic.js.es6 @@ -3,7 +3,7 @@ import { next } from "@ember/runloop"; import Component from "@ember/component"; import debounce from "discourse/lib/debounce"; import { searchForTerm } from "discourse/lib/search"; -import { observes } from "ember-addons/ember-computed-decorators"; +import { observes } from "discourse-common/utils/decorators"; export default Component.extend({ loading: null, diff --git a/app/assets/javascripts/discourse/components/color-picker-choice.js.es6 b/app/assets/javascripts/discourse/components/color-picker-choice.js.es6 index a1933193d2f..a384ca1920a 100644 --- a/app/assets/javascripts/discourse/components/color-picker-choice.js.es6 +++ b/app/assets/javascripts/discourse/components/color-picker-choice.js.es6 @@ -1,22 +1,22 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ tagName: "button", attributeBindings: ["style", "title"], classNameBindings: [":colorpicker", "isUsed:used-color:unused-color"], - @computed("color", "usedColors") + @discourseComputed("color", "usedColors") isUsed(color, usedColors) { return (usedColors || []).indexOf(color.toUpperCase()) >= 0; }, - @computed("isUsed") + @discourseComputed("isUsed") title(isUsed) { return isUsed ? I18n.t("category.already_used") : null; }, - @computed("color") + @discourseComputed("color") style(color) { return `background-color: #${color};`.htmlSafe(); }, diff --git a/app/assets/javascripts/discourse/components/composer-action-title.js.es6 b/app/assets/javascripts/discourse/components/composer-action-title.js.es6 index 8e4fd6c9f72..996b409f6b8 100644 --- a/app/assets/javascripts/discourse/components/composer-action-title.js.es6 +++ b/app/assets/javascripts/discourse/components/composer-action-title.js.es6 @@ -1,6 +1,6 @@ import { alias, equal } from "@ember/object/computed"; import Component from "@ember/component"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import { PRIVATE_MESSAGE, CREATE_TOPIC, @@ -24,7 +24,7 @@ export default Component.extend({ action: alias("model.action"), isEditing: equal("action", EDIT), - @computed("options", "action") + @discourseComputed("options", "action") actionTitle(opts, action) { if (TITLES[action]) { return I18n.t(TITLES[action]); diff --git a/app/assets/javascripts/discourse/components/composer-body.js.es6 b/app/assets/javascripts/discourse/components/composer-body.js.es6 index f265917279b..f2a6ae3bc84 100644 --- a/app/assets/javascripts/discourse/components/composer-body.js.es6 +++ b/app/assets/javascripts/discourse/components/composer-body.js.es6 @@ -5,9 +5,9 @@ import { scheduleOnce } from "@ember/runloop"; import { later } from "@ember/runloop"; import Component from "@ember/component"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import Composer from "discourse/models/composer"; import afterTransition from "discourse/lib/after-transition"; import positioningWorkaround from "discourse/lib/safari-hacks"; @@ -42,12 +42,12 @@ export default Component.extend(KeyEnterEscape, { "currentUserPrimaryGroupClass" ], - @computed("currentUser.primary_group_name") + @discourseComputed("currentUser.primary_group_name") currentUserPrimaryGroupClass(primaryGroupName) { return primaryGroupName && `group-${primaryGroupName}`; }, - @computed("composer.composeState") + @discourseComputed("composer.composeState") composeState(composeState) { return composeState || Composer.CLOSED; }, diff --git a/app/assets/javascripts/discourse/components/composer-editor.js.es6 b/app/assets/javascripts/discourse/components/composer-editor.js.es6 index d1aa32d0463..75f8edd4f0e 100644 --- a/app/assets/javascripts/discourse/components/composer-editor.js.es6 +++ b/app/assets/javascripts/discourse/components/composer-editor.js.es6 @@ -6,10 +6,10 @@ import { later } from "@ember/runloop"; import Component from "@ember/component"; import userSearch from "discourse/lib/user-search"; import { - default as computed, + default as discourseComputed, observes, on -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import { linkSeenMentions, fetchUnseenMentions @@ -43,7 +43,6 @@ import { cacheShortUploadUrl, resolveAllShortUrls } from "pretty-text/upload-short-url"; - import { INLINE_ONEBOX_LOADING_CSS_CLASS, INLINE_ONEBOX_CSS_CLASS @@ -69,7 +68,7 @@ export default Component.extend({ scrollMap: null, uploadFilenamePlaceholder: null, - @computed("uploadFilenamePlaceholder") + @discourseComputed("uploadFilenamePlaceholder") uploadPlaceholder(uploadFilenamePlaceholder) { const clipboard = I18n.t("clipboard"); const filename = uploadFilenamePlaceholder @@ -78,7 +77,7 @@ export default Component.extend({ return `[${I18n.t("uploading_filename", { filename })}]() `; }, - @computed("composer.requiredCategoryMissing") + @discourseComputed("composer.requiredCategoryMissing") replyPlaceholder(requiredCategoryMissing) { if (requiredCategoryMissing) { return "composer.reply_placeholder_choose_category"; @@ -90,14 +89,14 @@ export default Component.extend({ } }, - @computed + @discourseComputed showLink() { return ( this.currentUser && this.currentUser.get("link_posting_access") !== "none" ); }, - @computed("composer.requiredCategoryMissing", "composer.replyLength") + @discourseComputed("composer.requiredCategoryMissing", "composer.replyLength") disableTextarea(requiredCategoryMissing, replyLength) { return requiredCategoryMissing && replyLength === 0; }, @@ -123,7 +122,7 @@ export default Component.extend({ } }, - @computed + @discourseComputed markdownOptions() { return { previewing: true, @@ -214,7 +213,7 @@ export default Component.extend({ this.appEvents.trigger("composer:will-open"); }, - @computed( + @discourseComputed( "composer.reply", "composer.replyLength", "composer.missingReplyCharacters", diff --git a/app/assets/javascripts/discourse/components/composer-message.js.es6 b/app/assets/javascripts/discourse/components/composer-message.js.es6 index 6cb98b80180..ce42d201c93 100644 --- a/app/assets/javascripts/discourse/components/composer-message.js.es6 +++ b/app/assets/javascripts/discourse/components/composer-message.js.es6 @@ -1,11 +1,11 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; import { getOwner } from "discourse-common/lib/get-owner"; export default Component.extend({ classNameBindings: [":composer-popup", ":hidden", "message.extraClass"], - @computed("message.templateName") + @discourseComputed("message.templateName") layout(templateName) { return getOwner(this).lookup(`template:composer/${templateName}`); }, diff --git a/app/assets/javascripts/discourse/components/composer-title.js.es6 b/app/assets/javascripts/discourse/components/composer-title.js.es6 index ecbe5216bc0..da012442f71 100644 --- a/app/assets/javascripts/discourse/components/composer-title.js.es6 +++ b/app/assets/javascripts/discourse/components/composer-title.js.es6 @@ -4,9 +4,9 @@ import { debounce } from "@ember/runloop"; import { schedule } from "@ember/runloop"; import Component from "@ember/component"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import InputValidation from "discourse/models/input-validation"; import { load } from "pretty-text/oneboxer"; import { lookupCache } from "pretty-text/oneboxer-cache"; @@ -34,7 +34,7 @@ export default Component.extend({ } }, - @computed( + @discourseComputed( "composer.titleLength", "composer.missingTitleCharacters", "composer.minimumTitleLength", @@ -68,7 +68,7 @@ export default Component.extend({ } }, - @computed("watchForLink") + @discourseComputed("watchForLink") titleMaxLength() { // maxLength gets in the way of pasting long links, so don't use it if featured links are allowed. // Validation will display a message if titles are too long. @@ -182,7 +182,7 @@ export default Component.extend({ } }, - @computed("composer.title", "composer.titleLength") + @discourseComputed("composer.title", "composer.titleLength") isAbsoluteUrl(title, titleLength) { return ( titleLength > 0 && diff --git a/app/assets/javascripts/discourse/components/composer-toggles.js.es6 b/app/assets/javascripts/discourse/components/composer-toggles.js.es6 index 9f0547d6415..e08e50fa3ff 100644 --- a/app/assets/javascripts/discourse/components/composer-toggles.js.es6 +++ b/app/assets/javascripts/discourse/components/composer-toggles.js.es6 @@ -1,17 +1,17 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ tagName: "", - @computed("composeState") + @discourseComputed("composeState") toggleTitle(composeState) { return composeState === "draft" || composeState === "saving" ? "composer.abandon" : "composer.collapse"; }, - @computed("composeState") + @discourseComputed("composeState") fullscreenTitle(composeState) { return composeState === "draft" ? "composer.open" @@ -20,14 +20,14 @@ export default Component.extend({ : "composer.enter_fullscreen"; }, - @computed("composeState") + @discourseComputed("composeState") toggleIcon(composeState) { return composeState === "draft" || composeState === "saving" ? "times" : "chevron-down"; }, - @computed("composeState") + @discourseComputed("composeState") fullscreenIcon(composeState) { return composeState === "draft" ? "chevron-up" diff --git a/app/assets/javascripts/discourse/components/composer-user-selector.js.es6 b/app/assets/javascripts/discourse/components/composer-user-selector.js.es6 index 3e9aa03784c..14ca7e35567 100644 --- a/app/assets/javascripts/discourse/components/composer-user-selector.js.es6 +++ b/app/assets/javascripts/discourse/components/composer-user-selector.js.es6 @@ -1,9 +1,9 @@ import { schedule } from "@ember/runloop"; import Component from "@ember/component"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; export default Component.extend({ showSelector: true, @@ -58,17 +58,17 @@ export default Component.extend({ } }, - @computed("usernames") + @discourseComputed("usernames") splitUsernames(usernames) { return usernames.split(","); }, - @computed("splitUsernames", "defaultUsernameCount") + @discourseComputed("splitUsernames", "defaultUsernameCount") limitedUsernames(splitUsernames, count) { return splitUsernames.slice(0, count).join(", "); }, - @computed("splitUsernames", "defaultUsernameCount") + @discourseComputed("splitUsernames", "defaultUsernameCount") hiddenUsersCount(splitUsernames, count) { return `${splitUsernames.length - count} ${I18n.t("more")}`; }, diff --git a/app/assets/javascripts/discourse/components/conditional-loading-spinner.js.es6 b/app/assets/javascripts/discourse/components/conditional-loading-spinner.js.es6 index 1c6e37ec030..c98075275fe 100644 --- a/app/assets/javascripts/discourse/components/conditional-loading-spinner.js.es6 +++ b/app/assets/javascripts/discourse/components/conditional-loading-spinner.js.es6 @@ -1,5 +1,5 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ classNameBindings: [ @@ -8,7 +8,7 @@ export default Component.extend({ "condition:visible" ], - @computed("size") + @discourseComputed("size") containerClass(size) { return size === "small" ? "inline-spinner" : undefined; } diff --git a/app/assets/javascripts/discourse/components/create-topics-notice.js.es6 b/app/assets/javascripts/discourse/components/create-topics-notice.js.es6 index 96c29f90815..5622cfab94d 100644 --- a/app/assets/javascripts/discourse/components/create-topics-notice.js.es6 +++ b/app/assets/javascripts/discourse/components/create-topics-notice.js.es6 @@ -1,7 +1,7 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { alias } from "@ember/object/computed"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; -import { observes } from "ember-addons/ember-computed-decorators"; +import { observes } from "discourse-common/utils/decorators"; import LivePostCounts from "discourse/models/live-post-counts"; export default Component.extend({ @@ -36,7 +36,7 @@ export default Component.extend({ } }, - @computed() + @discourseComputed() shouldSee() { const user = this.currentUser; return ( @@ -47,7 +47,12 @@ export default Component.extend({ ); }, - @computed("enabled", "shouldSee", "publicTopicCount", "publicPostCount") + @discourseComputed( + "enabled", + "shouldSee", + "publicTopicCount", + "publicPostCount" + ) hidden() { return ( !this.enabled || @@ -57,7 +62,7 @@ export default Component.extend({ ); }, - @computed( + @discourseComputed( "publicTopicCount", "publicPostCount", "topicTrackingState.incomingCount" diff --git a/app/assets/javascripts/discourse/components/csv-uploader.js.es6 b/app/assets/javascripts/discourse/components/csv-uploader.js.es6 index 6fa3792d36e..b3bb4e8d1f9 100644 --- a/app/assets/javascripts/discourse/components/csv-uploader.js.es6 +++ b/app/assets/javascripts/discourse/components/csv-uploader.js.es6 @@ -1,5 +1,5 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; import UploadMixin from "discourse/mixins/upload"; import { on } from "@ember/object/evented"; @@ -12,14 +12,14 @@ export default Component.extend(UploadMixin, { return { csvOnly: true }; }, - @computed("uploading") + @discourseComputed("uploading") uploadButtonText(uploading) { return uploading ? I18n.t("uploading") : I18n.t("user.invited.bulk_invite.text"); }, - @computed("uploading") + @discourseComputed("uploading") uploadButtonDisabled(uploading) { // https://github.com/emberjs/ember.js/issues/10976#issuecomment-132417731 return uploading ? true : null; diff --git a/app/assets/javascripts/discourse/components/d-button.js.es6 b/app/assets/javascripts/discourse/components/d-button.js.es6 index 130e4ae4588..1d0c9d04f80 100644 --- a/app/assets/javascripts/discourse/components/d-button.js.es6 +++ b/app/assets/javascripts/discourse/components/d-button.js.es6 @@ -1,6 +1,6 @@ import { notEmpty, empty, equal } from "@ember/object/computed"; import Component from "@ember/component"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import DiscourseURL from "discourse/lib/url"; export default Component.extend({ @@ -26,7 +26,7 @@ export default Component.extend({ btnLink: equal("display", "link"), - @computed("icon", "translatedLabel") + @discourseComputed("icon", "translatedLabel") btnType(icon, translatedLabel) { if (icon) { return translatedLabel ? "btn-icon-text" : "btn-icon"; @@ -37,7 +37,7 @@ export default Component.extend({ noText: empty("translatedLabel"), - @computed("title") + @discourseComputed("title") translatedTitle: { get() { if (this._translatedTitle) return this._translatedTitle; @@ -48,7 +48,7 @@ export default Component.extend({ } }, - @computed("label") + @discourseComputed("label") translatedLabel: { get() { if (this._translatedLabel) return this._translatedLabel; diff --git a/app/assets/javascripts/discourse/components/d-editor.js.es6 b/app/assets/javascripts/discourse/components/d-editor.js.es6 index b60fdf88a30..f102a478866 100644 --- a/app/assets/javascripts/discourse/components/d-editor.js.es6 +++ b/app/assets/javascripts/discourse/components/d-editor.js.es6 @@ -7,10 +7,10 @@ import { inject as service } from "@ember/service"; import Component from "@ember/component"; /*global Mousetrap:true */ import { - default as computed, + default as discourseComputed, on, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import { categoryHashtagTriggerRule } from "discourse/lib/category-hashtags"; import { search as searchCategoryTag } from "discourse/lib/category-tag-search"; import { cookAsync } from "discourse/lib/text"; @@ -229,7 +229,7 @@ export default Component.extend({ emojiPickerIsActive: false, emojiStore: service("emoji-store"), - @computed("placeholder") + @discourseComputed("placeholder") placeholderTranslated(placeholder) { if (placeholder) return I18n.t(placeholder); return null; @@ -327,7 +327,7 @@ export default Component.extend({ $(this.element.querySelector(".d-editor-preview")).off("click.preview"); }, - @computed + @discourseComputed toolbar() { const toolbar = new Toolbar( this.getProperties("site", "siteSettings", "showLink") diff --git a/app/assets/javascripts/discourse/components/d-modal.js.es6 b/app/assets/javascripts/discourse/components/d-modal.js.es6 index 19d4d2264c5..300a3e585cb 100644 --- a/app/assets/javascripts/discourse/components/d-modal.js.es6 +++ b/app/assets/javascripts/discourse/components/d-modal.js.es6 @@ -1,5 +1,5 @@ import { next } from "@ember/runloop"; -import { on } from "ember-addons/ember-computed-decorators"; +import { on } from "discourse-common/utils/decorators"; import Component from "@ember/component"; export default Component.extend({ diff --git a/app/assets/javascripts/discourse/components/d-navigation.js.es6 b/app/assets/javascripts/discourse/components/d-navigation.js.es6 index b44ad95efd9..0fe007a1ed8 100644 --- a/app/assets/javascripts/discourse/components/d-navigation.js.es6 +++ b/app/assets/javascripts/discourse/components/d-navigation.js.es6 @@ -1,6 +1,6 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { inject as service } from "@ember/service"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ router: service(), @@ -8,25 +8,25 @@ export default Component.extend({ tagName: "", - @computed("category") + @discourseComputed("category") showCategoryNotifications(category) { return category && this.currentUser; }, - @computed() + @discourseComputed() categories() { return this.site.get("categoriesList"); }, - @computed("hasDraft") + @discourseComputed("hasDraft") createTopicLabel(hasDraft) { return hasDraft ? "topic.open_draft" : "topic.create"; }, - @computed("category.can_edit") + @discourseComputed("category.can_edit") showCategoryEdit: canEdit => canEdit, - @computed("filterMode", "category", "noSubcategories") + @discourseComputed("filterMode", "category", "noSubcategories") navItems(filterMode, category, noSubcategories) { // we don't want to show the period in the navigation bar since it's in a dropdown if (filterMode.indexOf("top/") === 0) { diff --git a/app/assets/javascripts/discourse/components/date-input.js.es6 b/app/assets/javascripts/discourse/components/date-input.js.es6 index 927be37881a..b095781b82d 100644 --- a/app/assets/javascripts/discourse/components/date-input.js.es6 +++ b/app/assets/javascripts/discourse/components/date-input.js.es6 @@ -3,16 +3,16 @@ import Component from "@ember/component"; /* global Pikaday:true */ import loadScript from "discourse/lib/load-script"; import { - default as computed, + default as discourseComputed, on -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; export default Component.extend({ classNames: ["d-date-input"], date: null, _picker: null, - @computed("site.mobileView") + @discourseComputed("site.mobileView") inputType(mobileView) { return mobileView ? "date" : "text"; }, @@ -92,7 +92,7 @@ export default Component.extend({ this._picker = null; }, - @computed() + @discourseComputed() placeholder() { return I18n.t("dates.placeholder"); }, diff --git a/app/assets/javascripts/discourse/components/date-picker.js.es6 b/app/assets/javascripts/discourse/components/date-picker.js.es6 index e9403326bbd..8ca644e9520 100644 --- a/app/assets/javascripts/discourse/components/date-picker.js.es6 +++ b/app/assets/javascripts/discourse/components/date-picker.js.es6 @@ -3,9 +3,9 @@ import Component from "@ember/component"; /* global Pikaday:true */ import loadScript from "discourse/lib/load-script"; import { - default as computed, + default as discourseComputed, on -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; const DATE_FORMAT = "YYYY-MM-DD"; @@ -14,7 +14,7 @@ export default Component.extend({ _picker: null, value: null, - @computed("site.mobileView") + @discourseComputed("site.mobileView") inputType(mobileView) { return mobileView ? "date" : "text"; }, @@ -83,7 +83,7 @@ export default Component.extend({ } }, - @computed() + @discourseComputed() placeholder() { return I18n.t("dates.placeholder"); }, diff --git a/app/assets/javascripts/discourse/components/desktop-notification-config.js.es6 b/app/assets/javascripts/discourse/components/desktop-notification-config.js.es6 index 112723ba129..ecd11c2a6e9 100644 --- a/app/assets/javascripts/discourse/components/desktop-notification-config.js.es6 +++ b/app/assets/javascripts/discourse/components/desktop-notification-config.js.es6 @@ -1,6 +1,6 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { or } from "@ember/object/computed"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; import KeyValueStore from "discourse/lib/key-value-store"; import { context, @@ -19,12 +19,12 @@ const keyValueStore = new KeyValueStore(context); export default Component.extend({ classNames: ["controls"], - @computed("isNotSupported") + @discourseComputed("isNotSupported") notificationsPermission(isNotSupported) { return isNotSupported ? "" : Notification.permission; }, - @computed + @discourseComputed notificationsDisabled: { set(value) { keyValueStore.setItem("notifications-disabled", value); @@ -35,27 +35,27 @@ export default Component.extend({ } }, - @computed + @discourseComputed isNotSupported() { return typeof window.Notification === "undefined"; }, - @computed("isNotSupported", "notificationsPermission") + @discourseComputed("isNotSupported", "notificationsPermission") isDeniedPermission(isNotSupported, notificationsPermission) { return isNotSupported ? false : notificationsPermission === "denied"; }, - @computed("isNotSupported", "notificationsPermission") + @discourseComputed("isNotSupported", "notificationsPermission") isGrantedPermission(isNotSupported, notificationsPermission) { return isNotSupported ? false : notificationsPermission === "granted"; }, - @computed("isGrantedPermission", "notificationsDisabled") + @discourseComputed("isGrantedPermission", "notificationsDisabled") isEnabledDesktop(isGrantedPermission, notificationsDisabled) { return isGrantedPermission ? !notificationsDisabled : false; }, - @computed + @discourseComputed isEnabledPush: { set(value) { const user = this.currentUser; diff --git a/app/assets/javascripts/discourse/components/directory-toggle.js.es6 b/app/assets/javascripts/discourse/components/directory-toggle.js.es6 index d45e9ce9e7d..2b761c99b9b 100644 --- a/app/assets/javascripts/discourse/components/directory-toggle.js.es6 +++ b/app/assets/javascripts/discourse/components/directory-toggle.js.es6 @@ -1,7 +1,7 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; import { iconHTML } from "discourse-common/lib/icon-library"; import { bufferedRender } from "discourse-common/lib/buffered-render"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend( bufferedRender({ @@ -11,7 +11,7 @@ export default Component.extend( rerenderTriggers: ["order", "asc"], labelKey: null, - @computed("field", "labelKey") + @discourseComputed("field", "labelKey") title(field, labelKey) { if (!labelKey) { labelKey = `directory.${this.field}`; diff --git a/app/assets/javascripts/discourse/components/discourse-banner.js.es6 b/app/assets/javascripts/discourse/components/discourse-banner.js.es6 index 6c8b18ea1e1..9182998d76e 100644 --- a/app/assets/javascripts/discourse/components/discourse-banner.js.es6 +++ b/app/assets/javascripts/discourse/components/discourse-banner.js.es6 @@ -1,8 +1,8 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ - @computed("user.dismissed_banner_key", "banner.key", "hide") + @discourseComputed("user.dismissed_banner_key", "banner.key", "hide") visible(dismissedBannerKey, bannerKey, hide) { dismissedBannerKey = dismissedBannerKey || this.keyValueStore.get("dismissed_banner_key"); diff --git a/app/assets/javascripts/discourse/components/discourse-linked-text.js.es6 b/app/assets/javascripts/discourse/components/discourse-linked-text.js.es6 index fe4e7fd9c8b..85d6fd3cb94 100644 --- a/app/assets/javascripts/discourse/components/discourse-linked-text.js.es6 +++ b/app/assets/javascripts/discourse/components/discourse-linked-text.js.es6 @@ -1,10 +1,10 @@ import Component from "@ember/component"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; export default Component.extend({ tagName: "span", - @computed("text") + @discourseComputed("text") translatedText(text) { if (text) return I18n.t(text); }, diff --git a/app/assets/javascripts/discourse/components/discourse-tag-bound.js.es6 b/app/assets/javascripts/discourse/components/discourse-tag-bound.js.es6 index ea07e0d5fe8..57e5c1841a1 100644 --- a/app/assets/javascripts/discourse/components/discourse-tag-bound.js.es6 +++ b/app/assets/javascripts/discourse/components/discourse-tag-bound.js.es6 @@ -1,17 +1,17 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ tagName: "a", classNameBindings: [":discourse-tag", "style", "tagClass"], attributeBindings: ["href"], - @computed("tagRecord.id") + @discourseComputed("tagRecord.id") tagClass(tagRecordId) { return "tag-" + tagRecordId; }, - @computed("tagRecord.id") + @discourseComputed("tagRecord.id") href(tagRecordId) { return Discourse.getURL("/tags/" + tagRecordId); } diff --git a/app/assets/javascripts/discourse/components/discourse-topic.js.es6 b/app/assets/javascripts/discourse/components/discourse-topic.js.es6 index c9484f62645..83e7bf6fa1f 100644 --- a/app/assets/javascripts/discourse/components/discourse-topic.js.es6 +++ b/app/assets/javascripts/discourse/components/discourse-topic.js.es6 @@ -9,7 +9,7 @@ import AddArchetypeClass from "discourse/mixins/add-archetype-class"; import ClickTrack from "discourse/lib/click-track"; import Scrolling from "discourse/mixins/scrolling"; import MobileScrollDirection from "discourse/mixins/mobile-scroll-direction"; -import { observes } from "ember-addons/ember-computed-decorators"; +import { observes } from "discourse-common/utils/decorators"; const MOBILE_SCROLL_DIRECTION_CHECK_THROTTLE = 300; diff --git a/app/assets/javascripts/discourse/components/discovery-categories.js.es6 b/app/assets/javascripts/discourse/components/discovery-categories.js.es6 index d5c70bbf9af..bd4f34a2e74 100644 --- a/app/assets/javascripts/discourse/components/discovery-categories.js.es6 +++ b/app/assets/javascripts/discourse/components/discovery-categories.js.es6 @@ -1,6 +1,6 @@ import Component from "@ember/component"; import UrlRefresh from "discourse/mixins/url-refresh"; -import { on } from "ember-addons/ember-computed-decorators"; +import { on } from "discourse-common/utils/decorators"; const CATEGORIES_LIST_BODY_CLASS = "categories-list"; diff --git a/app/assets/javascripts/discourse/components/discovery-topics-list.js.es6 b/app/assets/javascripts/discourse/components/discovery-topics-list.js.es6 index 6706cacd4ad..f4329ba2f2c 100644 --- a/app/assets/javascripts/discourse/components/discovery-topics-list.js.es6 +++ b/app/assets/javascripts/discourse/components/discovery-topics-list.js.es6 @@ -1,7 +1,7 @@ import { schedule } from "@ember/runloop"; import { scheduleOnce } from "@ember/runloop"; import Component from "@ember/component"; -import { on, observes } from "ember-addons/ember-computed-decorators"; +import { on, observes } from "discourse-common/utils/decorators"; import LoadMore from "discourse/mixins/load-more"; import UrlRefresh from "discourse/mixins/url-refresh"; diff --git a/app/assets/javascripts/discourse/components/edit-category-general.js.es6 b/app/assets/javascripts/discourse/components/edit-category-general.js.es6 index e94e2a77d29..a1f95d117ac 100644 --- a/app/assets/javascripts/discourse/components/edit-category-general.js.es6 +++ b/app/assets/javascripts/discourse/components/edit-category-general.js.es6 @@ -1,9 +1,9 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { isEmpty } from "@ember/utils"; import { not } from "@ember/object/computed"; import { buildCategoryPanel } from "discourse/components/edit-category-panel"; import { categoryBadgeHTML } from "discourse/helpers/category-link"; import Category from "discourse/models/category"; -import computed from "ember-addons/ember-computed-decorators"; export default buildCategoryPanel("general", { init() { @@ -21,7 +21,7 @@ export default buildCategoryPanel("general", { ), // background colors are available as a pipe-separated string - @computed + @discourseComputed backgroundColors() { const categories = this.site.get("categoriesList"); return this.siteSettings.category_colors @@ -37,12 +37,12 @@ export default buildCategoryPanel("general", { .uniq(); }, - @computed + @discourseComputed noCategoryStyle() { return this.siteSettings.category_style === "none"; }, - @computed("category.id", "category.color") + @discourseComputed("category.id", "category.color") usedBackgroundColors(categoryId, categoryColor) { const categories = this.site.get("categoriesList"); @@ -57,14 +57,14 @@ export default buildCategoryPanel("general", { .compact(); }, - @computed + @discourseComputed parentCategories() { return this.site .get("categoriesList") .filter(c => !c.get("parentCategory")); }, - @computed( + @discourseComputed( "category.parent_category_id", "category.categoryName", "category.color", @@ -83,7 +83,7 @@ export default buildCategoryPanel("general", { }, // We can change the parent if there are no children - @computed("category.id") + @discourseComputed("category.id") subCategories(categoryId) { if (isEmpty(categoryId)) { return null; @@ -91,7 +91,7 @@ export default buildCategoryPanel("general", { return Category.list().filterBy("parent_category_id", categoryId); }, - @computed("category.isUncategorizedCategory", "category.id") + @discourseComputed("category.isUncategorizedCategory", "category.id") showDescription(isUncategorizedCategory, categoryId) { return !isUncategorizedCategory && categoryId; }, diff --git a/app/assets/javascripts/discourse/components/edit-category-images.js.es6 b/app/assets/javascripts/discourse/components/edit-category-images.js.es6 index 2e122688856..94956edf365 100644 --- a/app/assets/javascripts/discourse/components/edit-category-images.js.es6 +++ b/app/assets/javascripts/discourse/components/edit-category-images.js.es6 @@ -1,14 +1,14 @@ import EmberObject from "@ember/object"; import { buildCategoryPanel } from "discourse/components/edit-category-panel"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; export default buildCategoryPanel("images").extend({ - @computed("category.uploaded_background.url") + @discourseComputed("category.uploaded_background.url") backgroundImageUrl(uploadedBackgroundUrl) { return uploadedBackgroundUrl || ""; }, - @computed("category.uploaded_logo.url") + @discourseComputed("category.uploaded_logo.url") logoImageUrl(uploadedLogoUrl) { return uploadedLogoUrl || ""; }, diff --git a/app/assets/javascripts/discourse/components/edit-category-security.js.es6 b/app/assets/javascripts/discourse/components/edit-category-security.js.es6 index be41b0a09c3..013e6206710 100644 --- a/app/assets/javascripts/discourse/components/edit-category-security.js.es6 +++ b/app/assets/javascripts/discourse/components/edit-category-security.js.es6 @@ -1,6 +1,6 @@ import { buildCategoryPanel } from "discourse/components/edit-category-panel"; import PermissionType from "discourse/models/permission-type"; -import { on } from "ember-addons/ember-computed-decorators"; +import { on } from "discourse-common/utils/decorators"; export default buildCategoryPanel("security", { editingPermissions: false, diff --git a/app/assets/javascripts/discourse/components/edit-category-settings.js.es6 b/app/assets/javascripts/discourse/components/edit-category-settings.js.es6 index 5d692cc6ebf..29556d2c9a2 100644 --- a/app/assets/javascripts/discourse/components/edit-category-settings.js.es6 +++ b/app/assets/javascripts/discourse/components/edit-category-settings.js.es6 @@ -1,7 +1,7 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { empty, and } from "@ember/object/computed"; import { setting } from "discourse/lib/computed"; import { buildCategoryPanel } from "discourse/components/edit-category-panel"; -import computed from "ember-addons/ember-computed-decorators"; import { searchPriorities } from "discourse/components/concerns/category-search-priorities"; import Group from "discourse/models/group"; @@ -20,7 +20,7 @@ export default buildCategoryPanel("settings", { ), isDefaultSortOrder: empty("category.sort_order"), - @computed + @discourseComputed availableSubcategoryListStyles() { return [ { name: I18n.t("category.subcategory_list_styles.rows"), value: "rows" }, @@ -47,7 +47,7 @@ export default buildCategoryPanel("settings", { return Group.findAll({ term, ignore_automatic: true }); }, - @computed + @discourseComputed availableViews() { return [ { name: I18n.t("filters.latest.title"), value: "latest" }, @@ -55,7 +55,7 @@ export default buildCategoryPanel("settings", { ]; }, - @computed + @discourseComputed availableTopPeriods() { return ["all", "yearly", "quarterly", "monthly", "weekly", "daily"].map( p => { @@ -64,7 +64,7 @@ export default buildCategoryPanel("settings", { ); }, - @computed + @discourseComputed searchPrioritiesOptions() { const options = []; @@ -80,7 +80,7 @@ export default buildCategoryPanel("settings", { return options; }, - @computed + @discourseComputed availableSorts() { return [ "likes", @@ -97,7 +97,7 @@ export default buildCategoryPanel("settings", { .sort((a, b) => a.name.localeCompare(b.name)); }, - @computed + @discourseComputed sortAscendingOptions() { return [ { name: I18n.t("category.sort_ascending"), value: "true" }, diff --git a/app/assets/javascripts/discourse/components/edit-category-tab.js.es6 b/app/assets/javascripts/discourse/components/edit-category-tab.js.es6 index 42be7233afb..9fa79845338 100644 --- a/app/assets/javascripts/discourse/components/edit-category-tab.js.es6 +++ b/app/assets/javascripts/discourse/components/edit-category-tab.js.es6 @@ -1,20 +1,20 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { scheduleOnce } from "@ember/runloop"; import Component from "@ember/component"; import { propertyEqual } from "discourse/lib/computed"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ tagName: "li", classNameBindings: ["active", "tabClassName"], - @computed("tab") + @discourseComputed("tab") tabClassName(tab) { return "edit-category-" + tab; }, active: propertyEqual("selectedTab", "tab"), - @computed("tab") + @discourseComputed("tab") title(tab) { return I18n.t("category." + tab.replace("-", "_")); }, diff --git a/app/assets/javascripts/discourse/components/edit-topic-timer-form.js.es6 b/app/assets/javascripts/discourse/components/edit-topic-timer-form.js.es6 index 5b774ca6678..00fa6b2bad3 100644 --- a/app/assets/javascripts/discourse/components/edit-topic-timer-form.js.es6 +++ b/app/assets/javascripts/discourse/components/edit-topic-timer-form.js.es6 @@ -3,11 +3,10 @@ import { alias, equal, or } from "@ember/object/computed"; import { schedule } from "@ember/runloop"; import Component from "@ember/component"; import { - default as computed, + default as discourseComputed, observes, on -} from "ember-addons/ember-computed-decorators"; - +} from "discourse-common/utils/decorators"; import { PUBLISH_TO_CATEGORY_STATUS_TYPE, OPEN_STATUS_TYPE, @@ -27,7 +26,7 @@ export default Component.extend({ reminder: equal("selection", REMINDER_TYPE), showTimeOnly: or("autoOpen", "autoDelete", "reminder", "autoBump"), - @computed( + @discourseComputed( "topicTimer.updateTime", "loading", "publishToCategory", @@ -41,7 +40,7 @@ export default Component.extend({ ); }, - @computed("topic.visible") + @discourseComputed("topic.visible") excludeCategoryId(visible) { if (visible) return this.get("topic.category_id"); }, diff --git a/app/assets/javascripts/discourse/components/emoji-picker.js.es6 b/app/assets/javascripts/discourse/components/emoji-picker.js.es6 index 6ad97bebc8c..7d4d92e7ee4 100644 --- a/app/assets/javascripts/discourse/components/emoji-picker.js.es6 +++ b/app/assets/javascripts/discourse/components/emoji-picker.js.es6 @@ -1,9 +1,8 @@ import { inject as service } from "@ember/service"; import Component from "@ember/component"; -import { on, observes } from "ember-addons/ember-computed-decorators"; +import { on, observes } from "discourse-common/utils/decorators"; import { findRawTemplate } from "discourse/lib/raw-templates"; import { emojiUrlFor } from "discourse/lib/text"; - import { extendedEmojiList, isSkinTonableEmoji, diff --git a/app/assets/javascripts/discourse/components/emoji-uploader.js.es6 b/app/assets/javascripts/discourse/components/emoji-uploader.js.es6 index 37dfd5ea10e..fa7ee8fd105 100644 --- a/app/assets/javascripts/discourse/components/emoji-uploader.js.es6 +++ b/app/assets/javascripts/discourse/components/emoji-uploader.js.es6 @@ -1,6 +1,6 @@ import { notEmpty, not } from "@ember/object/computed"; import Component from "@ember/component"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import UploadMixin from "discourse/mixins/upload"; export default Component.extend(UploadMixin, { @@ -15,7 +15,7 @@ export default Component.extend(UploadMixin, { }; }, - @computed("hasName", "name") + @discourseComputed("hasName", "name") data(hasName, name) { return hasName ? { name } : {}; }, diff --git a/app/assets/javascripts/discourse/components/expanding-text-area.js.es6 b/app/assets/javascripts/discourse/components/expanding-text-area.js.es6 index d2b980a8f23..4c3432f2772 100644 --- a/app/assets/javascripts/discourse/components/expanding-text-area.js.es6 +++ b/app/assets/javascripts/discourse/components/expanding-text-area.js.es6 @@ -1,5 +1,5 @@ import { scheduleOnce } from "@ember/runloop"; -import { on, observes } from "ember-addons/ember-computed-decorators"; +import { on, observes } from "discourse-common/utils/decorators"; import autosize from "discourse/lib/autosize"; export default Ember.TextArea.extend({ diff --git a/app/assets/javascripts/discourse/components/flag-action-type.js.es6 b/app/assets/javascripts/discourse/components/flag-action-type.js.es6 index c42818914d4..a88356c9a90 100644 --- a/app/assets/javascripts/discourse/components/flag-action-type.js.es6 +++ b/app/assets/javascripts/discourse/components/flag-action-type.js.es6 @@ -1,17 +1,22 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { and, not, equal } from "@ember/object/computed"; import Component from "@ember/component"; import { MAX_MESSAGE_LENGTH } from "discourse/models/post-action-type"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ classNames: ["flag-action-type"], - @computed("flag.name_key") + @discourseComputed("flag.name_key") customPlaceholder(nameKey) { return I18n.t("flagging.custom_placeholder_" + nameKey); }, - @computed("flag.name", "flag.name_key", "flag.is_custom_flag", "username") + @discourseComputed( + "flag.name", + "flag.name_key", + "flag.is_custom_flag", + "username" + ) formattedName(name, nameKey, isCustomFlag, username) { if (isCustomFlag) { return name.replace("{{username}}", username); @@ -20,7 +25,7 @@ export default Component.extend({ } }, - @computed("flag", "selectedFlag") + @discourseComputed("flag", "selectedFlag") selected(flag, selectedFlag) { return flag === selectedFlag; }, @@ -29,12 +34,12 @@ export default Component.extend({ showDescription: not("showMessageInput"), isNotifyUser: equal("flag.name_key", "notify_user"), - @computed("flag.description", "flag.short_description") + @discourseComputed("flag.description", "flag.short_description") description(long_description, short_description) { return this.site.mobileView ? short_description : long_description; }, - @computed("message.length") + @discourseComputed("message.length") customMessageLengthClasses(messageLength) { return messageLength < Discourse.SiteSettings.min_personal_message_post_length @@ -42,7 +47,7 @@ export default Component.extend({ : "ok"; }, - @computed("message.length") + @discourseComputed("message.length") customMessageLength(messageLength) { const len = messageLength || 0; const minLen = Discourse.SiteSettings.min_personal_message_post_length; diff --git a/app/assets/javascripts/discourse/components/flag-selection.js.es6 b/app/assets/javascripts/discourse/components/flag-selection.js.es6 index b52f5449078..39548b045fe 100644 --- a/app/assets/javascripts/discourse/components/flag-selection.js.es6 +++ b/app/assets/javascripts/discourse/components/flag-selection.js.es6 @@ -1,6 +1,6 @@ import { next } from "@ember/runloop"; import Component from "@ember/component"; -import { observes } from "ember-addons/ember-computed-decorators"; +import { observes } from "discourse-common/utils/decorators"; // Mostly hacks because `flag.hbs` didn't use `radio-button` export default Component.extend({ diff --git a/app/assets/javascripts/discourse/components/flat-button.js.es6 b/app/assets/javascripts/discourse/components/flat-button.js.es6 index 1348836907a..af444220255 100644 --- a/app/assets/javascripts/discourse/components/flat-button.js.es6 +++ b/app/assets/javascripts/discourse/components/flat-button.js.es6 @@ -1,12 +1,12 @@ import Component from "@ember/component"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; export default Component.extend({ tagName: "button", classNames: ["btn-flat"], attributeBindings: ["disabled", "translatedTitle:title"], - @computed("title") + @discourseComputed("title") translatedTitle(title) { if (title) return I18n.t(title); }, diff --git a/app/assets/javascripts/discourse/components/footer-nav.js.es6 b/app/assets/javascripts/discourse/components/footer-nav.js.es6 index d94910364ec..c4d412346e6 100644 --- a/app/assets/javascripts/discourse/components/footer-nav.js.es6 +++ b/app/assets/javascripts/discourse/components/footer-nav.js.es6 @@ -2,7 +2,7 @@ import { throttle } from "@ember/runloop"; import MountWidget from "discourse/components/mount-widget"; import MobileScrollDirection from "discourse/mixins/mobile-scroll-direction"; import Scrolling from "discourse/mixins/scrolling"; -import { observes } from "ember-addons/ember-computed-decorators"; +import { observes } from "discourse-common/utils/decorators"; import { isAppWebview, postRNWebviewMessage } from "discourse/lib/utilities"; const MOBILE_SCROLL_DIRECTION_CHECK_THROTTLE = 150; diff --git a/app/assets/javascripts/discourse/components/future-date-input.js.es6 b/app/assets/javascripts/discourse/components/future-date-input.js.es6 index 8746cfb0efb..05313f8ea0a 100644 --- a/app/assets/javascripts/discourse/components/future-date-input.js.es6 +++ b/app/assets/javascripts/discourse/components/future-date-input.js.es6 @@ -2,9 +2,9 @@ import { isEmpty } from "@ember/utils"; import { equal, and, empty } from "@ember/object/computed"; import Component from "@ember/component"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import { FORMAT } from "select-kit/components/future-date-input-selector"; import { PUBLISH_TO_CATEGORY_STATUS_TYPE } from "discourse/controllers/edit-topic-timer"; @@ -59,7 +59,7 @@ export default Component.extend({ this.set("basedOnLastPost", this.isBasedOnLastPost); }, - @computed("input", "isBasedOnLastPost") + @discourseComputed("input", "isBasedOnLastPost") duration(input, isBasedOnLastPost) { const now = moment(); @@ -70,7 +70,7 @@ export default Component.extend({ } }, - @computed("input", "isBasedOnLastPost") + @discourseComputed("input", "isBasedOnLastPost") executeAt(input, isBasedOnLastPost) { if (isBasedOnLastPost) { return moment() @@ -87,7 +87,7 @@ export default Component.extend({ if (this.label) this.set("displayLabel", I18n.t(this.label)); }, - @computed( + @discourseComputed( "statusType", "input", "isCustom", @@ -118,7 +118,7 @@ export default Component.extend({ } }, - @computed("isBasedOnLastPost", "input", "lastPostedAt") + @discourseComputed("isBasedOnLastPost", "input", "lastPostedAt") willCloseImmediately(isBasedOnLastPost, input, lastPostedAt) { if (isBasedOnLastPost && input) { let closeDate = moment(lastPostedAt); @@ -127,7 +127,7 @@ export default Component.extend({ } }, - @computed("isBasedOnLastPost", "lastPostedAt") + @discourseComputed("isBasedOnLastPost", "lastPostedAt") willCloseI18n(isBasedOnLastPost, lastPostedAt) { if (isBasedOnLastPost) { const diff = Math.round( diff --git a/app/assets/javascripts/discourse/components/global-notice.js.es6 b/app/assets/javascripts/discourse/components/global-notice.js.es6 index e16243f2073..c7006016a68 100644 --- a/app/assets/javascripts/discourse/components/global-notice.js.es6 +++ b/app/assets/javascripts/discourse/components/global-notice.js.es6 @@ -1,6 +1,6 @@ import { bind } from "@ember/runloop"; import Component from "@ember/component"; -import { on } from "ember-addons/ember-computed-decorators"; +import { on } from "discourse-common/utils/decorators"; import { iconHTML } from "discourse-common/lib/icon-library"; import LogsNotice from "discourse/services/logs-notice"; import { bufferedRender } from "discourse-common/lib/buffered-render"; diff --git a/app/assets/javascripts/discourse/components/google-search.js.es6 b/app/assets/javascripts/discourse/components/google-search.js.es6 index 246e7ab2a31..43db648e81b 100644 --- a/app/assets/javascripts/discourse/components/google-search.js.es6 +++ b/app/assets/javascripts/discourse/components/google-search.js.es6 @@ -1,6 +1,6 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { alias } from "@ember/object/computed"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ classNames: ["google-search-form"], @@ -8,7 +8,7 @@ export default Component.extend({ hidden: alias("siteSettings.login_required"), - @computed + @discourseComputed siteUrl() { return `${location.protocol}//${location.host}${Discourse.getURL("/")}`; } diff --git a/app/assets/javascripts/discourse/components/group-card-contents.js.es6 b/app/assets/javascripts/discourse/components/group-card-contents.js.es6 index bd6d029e492..50ea8b9ab22 100644 --- a/app/assets/javascripts/discourse/components/group-card-contents.js.es6 +++ b/app/assets/javascripts/discourse/components/group-card-contents.js.es6 @@ -1,7 +1,7 @@ import { alias, match, gt, or } from "@ember/object/computed"; import Component from "@ember/component"; import { setting } from "discourse/lib/computed"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import CardContentsBase from "discourse/mixins/card-contents-base"; import CleansUp from "discourse/mixins/cleans-up"; import { groupPath } from "discourse/lib/url"; @@ -34,14 +34,14 @@ export default Component.extend(CardContentsBase, CleansUp, { group: null, - @computed("group.user_count", "group.members.length") + @discourseComputed("group.user_count", "group.members.length") moreMembersCount: (memberCount, maxMemberDisplay) => memberCount - maxMemberDisplay, - @computed("group.name") + @discourseComputed("group.name") groupClass: name => (name ? `group-card-${name}` : ""), - @computed("group") + @discourseComputed("group") groupPath(group) { return groupPath(group.name); }, diff --git a/app/assets/javascripts/discourse/components/group-flair-inputs.js.es6 b/app/assets/javascripts/discourse/components/group-flair-inputs.js.es6 index 7b2b7110a09..81b17bcb8df 100644 --- a/app/assets/javascripts/discourse/components/group-flair-inputs.js.es6 +++ b/app/assets/javascripts/discourse/components/group-flair-inputs.js.es6 @@ -1,7 +1,7 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { debounce } from "@ember/runloop"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; -import { observes } from "ember-addons/ember-computed-decorators"; +import { observes } from "discourse-common/utils/decorators"; import { escapeExpression } from "discourse/lib/utilities"; import { convertIconClass } from "discourse-common/lib/icon-library"; import { ajax } from "discourse/lib/ajax"; @@ -10,17 +10,17 @@ import { htmlSafe } from "@ember/template"; export default Component.extend({ classNames: ["group-flair-inputs"], - @computed + @discourseComputed demoAvatarUrl() { return Discourse.getURL("/images/avatar.png"); }, - @computed("model.flair_url") + @discourseComputed("model.flair_url") flairPreviewIcon(flairURL) { return flairURL && /fa(r|b?)-/.test(flairURL); }, - @computed("model.flair_url", "flairPreviewIcon") + @discourseComputed("model.flair_url", "flairPreviewIcon") flairPreviewIconUrl(flairURL, flairPreviewIcon) { return flairPreviewIcon ? convertIconClass(flairURL) : ""; }, @@ -49,12 +49,12 @@ export default Component.extend({ } }, - @computed("model.flair_url", "flairPreviewIcon") + @discourseComputed("model.flair_url", "flairPreviewIcon") flairPreviewImage(flairURL, flairPreviewIcon) { return flairURL && !flairPreviewIcon; }, - @computed( + @discourseComputed( "model.flair_url", "flairPreviewImage", "model.flairBackgroundHexColor", @@ -81,12 +81,12 @@ export default Component.extend({ return htmlSafe(style); }, - @computed("model.flairBackgroundHexColor") + @discourseComputed("model.flairBackgroundHexColor") flairPreviewClasses(flairBackgroundHexColor) { if (flairBackgroundHexColor) return "rounded"; }, - @computed("flairPreviewImage") + @discourseComputed("flairPreviewImage") flairPreviewLabel(flairPreviewImage) { const key = flairPreviewImage ? "image" : "icon"; return I18n.t(`groups.flair_preview_${key}`); diff --git a/app/assets/javascripts/discourse/components/group-manage-logs-filter.js.es6 b/app/assets/javascripts/discourse/components/group-manage-logs-filter.js.es6 index a6712bf4987..98e0c16cdd4 100644 --- a/app/assets/javascripts/discourse/components/group-manage-logs-filter.js.es6 +++ b/app/assets/javascripts/discourse/components/group-manage-logs-filter.js.es6 @@ -1,15 +1,15 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ tagName: "", - @computed("type") + @discourseComputed("type") label(type) { return I18n.t(`groups.manage.logs.${type}`); }, - @computed("value", "type") + @discourseComputed("value", "type") filterText(value, type) { return type === "action" ? I18n.t(`group_histories.actions.${value}`) diff --git a/app/assets/javascripts/discourse/components/group-manage-save-button.js.es6 b/app/assets/javascripts/discourse/components/group-manage-save-button.js.es6 index 726bfede36b..9adcf9ea82f 100644 --- a/app/assets/javascripts/discourse/components/group-manage-save-button.js.es6 +++ b/app/assets/javascripts/discourse/components/group-manage-save-button.js.es6 @@ -1,11 +1,11 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; import { popupAjaxError } from "discourse/lib/ajax-error"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ saving: null, - @computed("saving") + @discourseComputed("saving") savingText(saving) { if (saving) return I18n.t("saving"); return saving ? I18n.t("saving") : I18n.t("save"); diff --git a/app/assets/javascripts/discourse/components/group-member-dropdown.js.es6 b/app/assets/javascripts/discourse/components/group-member-dropdown.js.es6 index 5cb7099058a..7a860c29de3 100644 --- a/app/assets/javascripts/discourse/components/group-member-dropdown.js.es6 +++ b/app/assets/javascripts/discourse/components/group-member-dropdown.js.es6 @@ -1,4 +1,4 @@ -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; import DropdownSelectBoxComponent from "select-kit/components/dropdown-select-box"; export default DropdownSelectBoxComponent.extend({ @@ -16,7 +16,7 @@ export default DropdownSelectBoxComponent.extend({ autoHighlight() {}, - @computed("member.owner") + @discourseComputed("member.owner") content(isOwner) { const items = [ { diff --git a/app/assets/javascripts/discourse/components/group-members-input.js.es6 b/app/assets/javascripts/discourse/components/group-members-input.js.es6 index e1f701f96c0..aedb43f2a6b 100644 --- a/app/assets/javascripts/discourse/components/group-members-input.js.es6 +++ b/app/assets/javascripts/discourse/components/group-members-input.js.es6 @@ -1,7 +1,7 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { isEmpty } from "@ember/utils"; import { lte } from "@ember/object/computed"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; import { popupAjaxError } from "discourse/lib/ajax-error"; import { propertyEqual } from "discourse/lib/computed"; @@ -9,7 +9,7 @@ export default Component.extend({ classNames: ["group-members-input"], addButton: true, - @computed("model.limit", "model.offset", "model.user_count") + @discourseComputed("model.limit", "model.offset", "model.user_count") currentPage(limit, offset, userCount) { if (userCount === 0) { return 0; @@ -18,7 +18,7 @@ export default Component.extend({ return Math.floor(offset / limit) + 1; }, - @computed("model.limit", "model.user_count") + @discourseComputed("model.limit", "model.user_count") totalPages(limit, userCount) { if (userCount === 0) { return 0; @@ -26,7 +26,7 @@ export default Component.extend({ return Math.ceil(userCount / limit); }, - @computed("model.usernames") + @discourseComputed("model.usernames") disableAddButton(usernames) { return !usernames || !(usernames.length > 0); }, diff --git a/app/assets/javascripts/discourse/components/group-membership-button.js.es6 b/app/assets/javascripts/discourse/components/group-membership-button.js.es6 index 6b58c5370d2..7c4abeda18c 100644 --- a/app/assets/javascripts/discourse/components/group-membership-button.js.es6 +++ b/app/assets/javascripts/discourse/components/group-membership-button.js.es6 @@ -1,27 +1,27 @@ import Component from "@ember/component"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import { popupAjaxError } from "discourse/lib/ajax-error"; import showModal from "discourse/lib/show-modal"; export default Component.extend({ classNames: ["group-membership-button"], - @computed("model.public_admission", "userIsGroupUser") + @discourseComputed("model.public_admission", "userIsGroupUser") canJoinGroup(publicAdmission, userIsGroupUser) { return publicAdmission && !userIsGroupUser; }, - @computed("model.public_exit", "userIsGroupUser") + @discourseComputed("model.public_exit", "userIsGroupUser") canLeaveGroup(publicExit, userIsGroupUser) { return publicExit && userIsGroupUser; }, - @computed("model.allow_membership_requests", "userIsGroupUser") + @discourseComputed("model.allow_membership_requests", "userIsGroupUser") canRequestMembership(allowMembershipRequests, userIsGroupUser) { return allowMembershipRequests && !userIsGroupUser; }, - @computed("model.is_group_user") + @discourseComputed("model.is_group_user") userIsGroupUser(isGroupUser) { return !!isGroupUser; }, diff --git a/app/assets/javascripts/discourse/components/group-post.js.es6 b/app/assets/javascripts/discourse/components/group-post.js.es6 index 5a3a096f49d..34c83529ef1 100644 --- a/app/assets/javascripts/discourse/components/group-post.js.es6 +++ b/app/assets/javascripts/discourse/components/group-post.js.es6 @@ -1,7 +1,7 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ - @computed("post.url") + @discourseComputed("post.url") postUrl: Discourse.getURL }); diff --git a/app/assets/javascripts/discourse/components/group-selector.js.es6 b/app/assets/javascripts/discourse/components/group-selector.js.es6 index 4d4b431888e..54b789664b4 100644 --- a/app/assets/javascripts/discourse/components/group-selector.js.es6 +++ b/app/assets/javascripts/discourse/components/group-selector.js.es6 @@ -3,12 +3,12 @@ import Component from "@ember/component"; import { on, observes, - default as computed -} from "ember-addons/ember-computed-decorators"; + default as discourseComputed +} from "discourse-common/utils/decorators"; import { findRawTemplate } from "discourse/lib/raw-templates"; export default Component.extend({ - @computed("placeholderKey") + @discourseComputed("placeholderKey") placeholder(placeholderKey) { return placeholderKey ? I18n.t(placeholderKey) : ""; }, diff --git a/app/assets/javascripts/discourse/components/groups-form-interaction-fields.js.es6 b/app/assets/javascripts/discourse/components/groups-form-interaction-fields.js.es6 index e4d1e6bb79a..f3ba2d92a4c 100644 --- a/app/assets/javascripts/discourse/components/groups-form-interaction-fields.js.es6 +++ b/app/assets/javascripts/discourse/components/groups-form-interaction-fields.js.es6 @@ -1,5 +1,5 @@ import Component from "@ember/component"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; export default Component.extend({ init() { @@ -46,7 +46,11 @@ export default Component.extend({ ]; }, - @computed("siteSettings.email_in", "model.automatic", "currentUser.admin") + @discourseComputed( + "siteSettings.email_in", + "model.automatic", + "currentUser.admin" + ) showEmailSettings(emailIn, automatic, isAdmin) { return emailIn && isAdmin && !automatic; } diff --git a/app/assets/javascripts/discourse/components/groups-form-membership-fields.js.es6 b/app/assets/javascripts/discourse/components/groups-form-membership-fields.js.es6 index 1115786b08e..1b5be47e6a8 100644 --- a/app/assets/javascripts/discourse/components/groups-form-membership-fields.js.es6 +++ b/app/assets/javascripts/discourse/components/groups-form-membership-fields.js.es6 @@ -1,5 +1,5 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ init() { @@ -17,13 +17,16 @@ export default Component.extend({ ]; }, - @computed("model.visibility_level", "model.public_admission") + @discourseComputed("model.visibility_level", "model.public_admission") disableMembershipRequestSetting(visibility_level, publicAdmission) { visibility_level = parseInt(visibility_level); return publicAdmission || visibility_level > 1; }, - @computed("model.visibility_level", "model.allow_membership_requests") + @discourseComputed( + "model.visibility_level", + "model.allow_membership_requests" + ) disablePublicSetting(visibility_level, allowMembershipRequests) { visibility_level = parseInt(visibility_level); return allowMembershipRequests || visibility_level > 1; diff --git a/app/assets/javascripts/discourse/components/groups-form-profile-fields.js.es6 b/app/assets/javascripts/discourse/components/groups-form-profile-fields.js.es6 index 98eabcea3fc..082cfcc5841 100644 --- a/app/assets/javascripts/discourse/components/groups-form-profile-fields.js.es6 +++ b/app/assets/javascripts/discourse/components/groups-form-profile-fields.js.es6 @@ -2,9 +2,9 @@ import { isEmpty } from "@ember/utils"; import { not } from "@ember/object/computed"; import Component from "@ember/component"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import Group from "discourse/models/group"; import InputValidation from "discourse/models/input-validation"; import debounce from "discourse/lib/debounce"; @@ -26,7 +26,7 @@ export default Component.extend({ canEdit: not("model.automatic"), - @computed("basicNameValidation", "uniqueNameValidation") + @discourseComputed("basicNameValidation", "uniqueNameValidation") nameValidation(basicNameValidation, uniqueNameValidation) { return uniqueNameValidation ? uniqueNameValidation : basicNameValidation; }, diff --git a/app/assets/javascripts/discourse/components/groups-info.js.es6 b/app/assets/javascripts/discourse/components/groups-info.js.es6 index cf439ef7d0a..336e826b807 100644 --- a/app/assets/javascripts/discourse/components/groups-info.js.es6 +++ b/app/assets/javascripts/discourse/components/groups-info.js.es6 @@ -1,11 +1,11 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ tagName: "span", classNames: ["group-info-details"], - @computed("group.full_name", "group.title") + @discourseComputed("group.full_name", "group.title") showFullName(fullName, title) { return fullName && fullName.length && fullName !== title; } diff --git a/app/assets/javascripts/discourse/components/honeypot-input.js.es6 b/app/assets/javascripts/discourse/components/honeypot-input.js.es6 index 06895b0586d..8231303da54 100644 --- a/app/assets/javascripts/discourse/components/honeypot-input.js.es6 +++ b/app/assets/javascripts/discourse/components/honeypot-input.js.es6 @@ -1,4 +1,4 @@ -import { on } from "ember-addons/ember-computed-decorators"; +import { on } from "discourse-common/utils/decorators"; export default Ember.TextField.extend({ @on("init") diff --git a/app/assets/javascripts/discourse/components/image-uploader.js.es6 b/app/assets/javascripts/discourse/components/image-uploader.js.es6 index 514a9852230..6db47602adc 100644 --- a/app/assets/javascripts/discourse/components/image-uploader.js.es6 +++ b/app/assets/javascripts/discourse/components/image-uploader.js.es6 @@ -1,7 +1,7 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { isEmpty } from "@ember/utils"; import { next } from "@ember/runloop"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; import UploadMixin from "discourse/mixins/upload"; import lightbox from "discourse/lib/lightbox"; import { ajax } from "discourse/lib/ajax"; @@ -24,12 +24,12 @@ export default Component.extend(UploadMixin, { } }, - @computed("imageUrl", "placeholderUrl") + @discourseComputed("imageUrl", "placeholderUrl") showingPlaceholder(imageUrl, placeholderUrl) { return !imageUrl && placeholderUrl; }, - @computed("placeholderUrl") + @discourseComputed("placeholderUrl") placeholderStyle(url) { if (isEmpty(url)) { return "".htmlSafe(); @@ -37,7 +37,7 @@ export default Component.extend(UploadMixin, { return `background-image: url(${url})`.htmlSafe(); }, - @computed("imageUrl") + @discourseComputed("imageUrl") imageCDNURL(url) { if (isEmpty(url)) { return "".htmlSafe(); @@ -46,12 +46,12 @@ export default Component.extend(UploadMixin, { return Discourse.getURLWithCDN(url); }, - @computed("imageCDNURL") + @discourseComputed("imageCDNURL") backgroundStyle(url) { return `background-image: url(${url})`.htmlSafe(); }, - @computed("imageUrl") + @discourseComputed("imageUrl") imageBaseName(imageUrl) { if (isEmpty(imageUrl)) return; return imageUrl.split("/").slice(-1)[0]; diff --git a/app/assets/javascripts/discourse/components/images-uploader.js.es6 b/app/assets/javascripts/discourse/components/images-uploader.js.es6 index d3a9d6c3b70..4e68324b0cf 100644 --- a/app/assets/javascripts/discourse/components/images-uploader.js.es6 +++ b/app/assets/javascripts/discourse/components/images-uploader.js.es6 @@ -1,12 +1,12 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; import UploadMixin from "discourse/mixins/upload"; export default Component.extend(UploadMixin, { type: "avatar", tagName: "span", - @computed("uploading") + @discourseComputed("uploading") uploadButtonText(uploading) { return uploading ? I18n.t("uploading") : I18n.t("upload"); }, diff --git a/app/assets/javascripts/discourse/components/invite-panel.js.es6 b/app/assets/javascripts/discourse/components/invite-panel.js.es6 index b1743d4f99f..8056a92dcd0 100644 --- a/app/assets/javascripts/discourse/components/invite-panel.js.es6 +++ b/app/assets/javascripts/discourse/components/invite-panel.js.es6 @@ -1,9 +1,9 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { isEmpty } from "@ember/utils"; import { alias, and, equal } from "@ember/object/computed"; import EmberObject from "@ember/object"; import Component from "@ember/component"; import { emailValid } from "discourse/lib/utilities"; -import computed from "ember-addons/ember-computed-decorators"; import Group from "discourse/models/group"; import Invite from "discourse/models/invite"; import { i18n } from "discourse/lib/computed"; @@ -30,7 +30,7 @@ export default Component.extend({ this.reset(); }, - @computed( + @discourseComputed( "isAdmin", "emailOrUsername", "invitingToTopic", @@ -73,7 +73,7 @@ export default Component.extend({ return false; }, - @computed( + @discourseComputed( "isAdmin", "emailOrUsername", "inviteModel.saving", @@ -113,24 +113,24 @@ export default Component.extend({ return false; }, - @computed("inviteModel.saving") + @discourseComputed("inviteModel.saving") buttonTitle(saving) { return saving ? "topic.inviting" : "topic.invite_reply.action"; }, // We are inviting to a topic if the topic isn't the current user. // The current user would mean we are inviting to the forum in general. - @computed("inviteModel") + @discourseComputed("inviteModel") invitingToTopic(inviteModel) { return inviteModel !== this.currentUser; }, - @computed("inviteModel", "inviteModel.details.can_invite_via_email") + @discourseComputed("inviteModel", "inviteModel.details.can_invite_via_email") canInviteViaEmail(inviteModel, canInviteViaEmail) { return this.inviteModel === this.currentUser ? true : canInviteViaEmail; }, - @computed("isPM", "canInviteViaEmail") + @discourseComputed("isPM", "canInviteViaEmail") showCopyInviteButton(isPM, canInviteViaEmail) { return canInviteViaEmail && !isPM; }, @@ -148,7 +148,7 @@ export default Component.extend({ // scope to allowed usernames allowExistingMembers: alias("invitingToTopic"), - @computed("isAdmin", "inviteModel.group_users") + @discourseComputed("isAdmin", "inviteModel.group_users") isGroupOwnerOrAdmin(isAdmin, groupUsers) { return ( isAdmin || (groupUsers && groupUsers.some(groupUser => groupUser.owner)) @@ -156,7 +156,7 @@ export default Component.extend({ }, // Show Groups? (add invited user to private group) - @computed( + @discourseComputed( "isGroupOwnerOrAdmin", "emailOrUsername", "isPrivateTopic", @@ -180,13 +180,13 @@ export default Component.extend({ ); }, - @computed("emailOrUsername") + @discourseComputed("emailOrUsername") showCustomMessage(emailOrUsername) { return this.inviteModel === this.currentUser || emailValid(emailOrUsername); }, // Instructional text for the modal. - @computed( + @discourseComputed( "isPM", "invitingToTopic", "emailOrUsername", @@ -231,7 +231,7 @@ export default Component.extend({ } }, - @computed("isPrivateTopic") + @discourseComputed("isPrivateTopic") showGroupsClass(isPrivateTopic) { return isPrivateTopic ? "required" : "optional"; }, @@ -240,7 +240,7 @@ export default Component.extend({ return Group.findAll({ term, ignore_automatic: true }); }, - @computed("isPM", "emailOrUsername", "invitingExistingUserToTopic") + @discourseComputed("isPM", "emailOrUsername", "invitingExistingUserToTopic") successMessage(isPM, emailOrUsername, invitingExistingUserToTopic) { if (this.hasGroups) { return I18n.t("topic.invite_private.success_group"); @@ -257,14 +257,14 @@ export default Component.extend({ } }, - @computed("isPM") + @discourseComputed("isPM") errorMessage(isPM) { return isPM ? I18n.t("topic.invite_private.error") : I18n.t("topic.invite_reply.error"); }, - @computed("canInviteViaEmail") + @discourseComputed("canInviteViaEmail") placeholderKey(canInviteViaEmail) { return canInviteViaEmail ? "topic.invite_private.email_or_username_placeholder" diff --git a/app/assets/javascripts/discourse/components/login-buttons.js.es6 b/app/assets/javascripts/discourse/components/login-buttons.js.es6 index a5a09674117..1073dd3ec07 100644 --- a/app/assets/javascripts/discourse/components/login-buttons.js.es6 +++ b/app/assets/javascripts/discourse/components/login-buttons.js.es6 @@ -1,17 +1,17 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; import { findAll } from "discourse/models/login-method"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ elementId: "login-buttons", classNameBindings: ["hidden"], - @computed("buttons.length", "showLoginWithEmailLink") + @discourseComputed("buttons.length", "showLoginWithEmailLink") hidden(buttonsCount, showLoginWithEmailLink) { return buttonsCount === 0 && !showLoginWithEmailLink; }, - @computed + @discourseComputed buttons() { return findAll(); }, diff --git a/app/assets/javascripts/discourse/components/mobile-nav.js.es6 b/app/assets/javascripts/discourse/components/mobile-nav.js.es6 index a47c09c5c47..02d35f53d39 100644 --- a/app/assets/javascripts/discourse/components/mobile-nav.js.es6 +++ b/app/assets/javascripts/discourse/components/mobile-nav.js.es6 @@ -1,6 +1,6 @@ import { next } from "@ember/runloop"; import Component from "@ember/component"; -import { on, observes } from "ember-addons/ember-computed-decorators"; +import { on, observes } from "discourse-common/utils/decorators"; export default Component.extend({ @on("init") diff --git a/app/assets/javascripts/discourse/components/nav-item.js.es6 b/app/assets/javascripts/discourse/components/nav-item.js.es6 index d648e892d3a..7358e2ded63 100644 --- a/app/assets/javascripts/discourse/components/nav-item.js.es6 +++ b/app/assets/javascripts/discourse/components/nav-item.js.es6 @@ -1,15 +1,15 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { inject as service } from "@ember/service"; import Component from "@ember/component"; /* You might be looking for navigation-item. */ import { iconHTML } from "discourse-common/lib/icon-library"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ tagName: "li", classNameBindings: ["active"], router: service(), - @computed("label", "i18nLabel", "icon") + @discourseComputed("label", "i18nLabel", "icon") contents(label, i18nLabel, icon) { let text = i18nLabel || I18n.t(label); if (icon) { @@ -18,7 +18,7 @@ export default Component.extend({ return text; }, - @computed("route", "router.currentRoute") + @discourseComputed("route", "router.currentRoute") active(route, currentRoute) { if (!route) { return; diff --git a/app/assets/javascripts/discourse/components/navigation-bar.js.es6 b/app/assets/javascripts/discourse/components/navigation-bar.js.es6 index eb8cb454b3c..6f262ce05c4 100644 --- a/app/assets/javascripts/discourse/components/navigation-bar.js.es6 +++ b/app/assets/javascripts/discourse/components/navigation-bar.js.es6 @@ -1,9 +1,9 @@ import { next } from "@ember/runloop"; import Component from "@ember/component"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import DiscourseURL from "discourse/lib/url"; import { renderedConnectorsFor } from "discourse/lib/plugin-connectors"; @@ -17,7 +17,7 @@ export default Component.extend({ this.set("connectors", renderedConnectorsFor("extra-nav-item", null, this)); }, - @computed("filterMode", "navItems") + @discourseComputed("filterMode", "navItems") selectedNavItem(filterMode, navItems) { if (filterMode.indexOf("top/") === 0) { filterMode = "top"; diff --git a/app/assets/javascripts/discourse/components/navigation-item.js.es6 b/app/assets/javascripts/discourse/components/navigation-item.js.es6 index 6d55112a94c..98742db3d42 100644 --- a/app/assets/javascripts/discourse/components/navigation-item.js.es6 +++ b/app/assets/javascripts/discourse/components/navigation-item.js.es6 @@ -1,5 +1,5 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; import { bufferedRender } from "discourse-common/lib/buffered-render"; export default Component.extend( @@ -15,7 +15,7 @@ export default Component.extend( hidden: false, rerenderTriggers: ["content.count"], - @computed("content.filterMode", "filterMode", "content.active") + @discourseComputed("content.filterMode", "filterMode", "content.active") active(contentFilterMode, filterMode, active) { if (active !== undefined) { return active; diff --git a/app/assets/javascripts/discourse/components/notification-consent-banner.js.es6 b/app/assets/javascripts/discourse/components/notification-consent-banner.js.es6 index 8d20705f04c..1ffb99c0c27 100644 --- a/app/assets/javascripts/discourse/components/notification-consent-banner.js.es6 +++ b/app/assets/javascripts/discourse/components/notification-consent-banner.js.es6 @@ -1,13 +1,11 @@ -import { default as computed } from "ember-addons/ember-computed-decorators"; - +import { default as discourseComputed } from "discourse-common/utils/decorators"; import { keyValueStore as pushNotificationKeyValueStore } from "discourse/lib/push-notifications"; - import { default as DesktopNotificationConfig } from "discourse/components/desktop-notification-config"; const userDismissedPromptKey = "dismissed-prompt"; export default DesktopNotificationConfig.extend({ - @computed + @discourseComputed bannerDismissed: { set(value) { pushNotificationKeyValueStore.setItem(userDismissedPromptKey, value); @@ -18,7 +16,7 @@ export default DesktopNotificationConfig.extend({ } }, - @computed( + @discourseComputed( "isNotSupported", "isEnabled", "bannerDismissed", diff --git a/app/assets/javascripts/discourse/components/number-field.js.es6 b/app/assets/javascripts/discourse/components/number-field.js.es6 index 1399de713ee..9de92f0afed 100644 --- a/app/assets/javascripts/discourse/components/number-field.js.es6 +++ b/app/assets/javascripts/discourse/components/number-field.js.es6 @@ -1,9 +1,9 @@ -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; export default Ember.TextField.extend({ classNameBindings: ["invalid"], - @computed("number") + @discourseComputed("number") value: { get(number) { return parseInt(number); @@ -21,7 +21,7 @@ export default Ember.TextField.extend({ } }, - @computed("placeholderKey") + @discourseComputed("placeholderKey") placeholder(key) { return key ? I18n.t(key) : ""; } diff --git a/app/assets/javascripts/discourse/components/plugin-connector.js.es6 b/app/assets/javascripts/discourse/components/plugin-connector.js.es6 index 715cb629652..a844ebbf9d1 100644 --- a/app/assets/javascripts/discourse/components/plugin-connector.js.es6 +++ b/app/assets/javascripts/discourse/components/plugin-connector.js.es6 @@ -1,5 +1,5 @@ import Component from "@ember/component"; -import { observes } from "ember-addons/ember-computed-decorators"; +import { observes } from "discourse-common/utils/decorators"; export default Component.extend({ init() { diff --git a/app/assets/javascripts/discourse/components/popup-input-tip.js.es6 b/app/assets/javascripts/discourse/components/popup-input-tip.js.es6 index 38930d57e49..3f3c3d514be 100644 --- a/app/assets/javascripts/discourse/components/popup-input-tip.js.es6 +++ b/app/assets/javascripts/discourse/components/popup-input-tip.js.es6 @@ -2,9 +2,9 @@ import { alias, not } from "@ember/object/computed"; import Component from "@ember/component"; import { iconHTML } from "discourse-common/lib/icon-library"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import { bufferedRender } from "discourse-common/lib/buffered-render"; export default Component.extend( @@ -23,7 +23,7 @@ export default Component.extend( bad: alias("validation.failed"), good: not("bad"), - @computed("shownAt", "validation.lastShownAt") + @discourseComputed("shownAt", "validation.lastShownAt") lastShownAt(shownAt, lastShownAt) { return shownAt || lastShownAt; }, diff --git a/app/assets/javascripts/discourse/components/preference-checkbox.js.es6 b/app/assets/javascripts/discourse/components/preference-checkbox.js.es6 index 7ae299f5ded..83ad27853ff 100644 --- a/app/assets/javascripts/discourse/components/preference-checkbox.js.es6 +++ b/app/assets/javascripts/discourse/components/preference-checkbox.js.es6 @@ -1,10 +1,10 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ classNames: ["controls"], - @computed("labelKey") + @discourseComputed("labelKey") label(labelKey) { return I18n.t(labelKey); }, diff --git a/app/assets/javascripts/discourse/components/pwa-install-banner.js.es6 b/app/assets/javascripts/discourse/components/pwa-install-banner.js.es6 index e2e60f3d88c..cb11ef38b71 100644 --- a/app/assets/javascripts/discourse/components/pwa-install-banner.js.es6 +++ b/app/assets/javascripts/discourse/components/pwa-install-banner.js.es6 @@ -1,9 +1,9 @@ import { bind } from "@ember/runloop"; import Component from "@ember/component"; import { - default as computed, + default as discourseComputed, on -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; const USER_DISMISSED_PROMPT_KEY = "dismissed-pwa-install-banner"; @@ -28,7 +28,7 @@ export default Component.extend({ window.removeEventListener("beforeinstallprompt", this._promptEventHandler); }, - @computed + @discourseComputed bannerDismissed: { set(value) { this.keyValueStore.set({ key: USER_DISMISSED_PROMPT_KEY, value }); @@ -39,7 +39,7 @@ export default Component.extend({ } }, - @computed("deferredInstallPromptEvent", "bannerDismissed") + @discourseComputed("deferredInstallPromptEvent", "bannerDismissed") showPWAInstallBanner() { const launchedFromDiscourseHub = window.location.search.indexOf("discourse_app=1") !== -1; diff --git a/app/assets/javascripts/discourse/components/radio-button.js.es6 b/app/assets/javascripts/discourse/components/radio-button.js.es6 index b6d44b4a990..1094aca2c70 100644 --- a/app/assets/javascripts/discourse/components/radio-button.js.es6 +++ b/app/assets/javascripts/discourse/components/radio-button.js.es6 @@ -1,5 +1,5 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ tagName: "input", @@ -25,7 +25,7 @@ export default Component.extend({ } }, - @computed("value", "selection") + @discourseComputed("value", "selection") checked(value, selection) { return value === selection; } diff --git a/app/assets/javascripts/discourse/components/related-messages.js.es6 b/app/assets/javascripts/discourse/components/related-messages.js.es6 index bf95279941b..5fec6f28ba9 100644 --- a/app/assets/javascripts/discourse/components/related-messages.js.es6 +++ b/app/assets/javascripts/discourse/components/related-messages.js.es6 @@ -1,12 +1,12 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; import { iconHTML } from "discourse-common/lib/icon-library"; export default Component.extend({ elementId: "related-messages", classNames: ["suggested-topics"], - @computed("topic") + @discourseComputed("topic") targetUser(topic) { if (!topic || !topic.isPrivateMessage) { return; @@ -23,14 +23,14 @@ export default Component.extend({ } }, - @computed + @discourseComputed searchLink() { return Discourse.getURL( `/search?expanded=true&q=%40${this.targetUser.username}%20in%3Apersonal-direct` ); }, - @computed("topic") + @discourseComputed("topic") relatedTitle(topic) { const href = this.currentUser && this.currentUser.pmPath(topic); return href diff --git a/app/assets/javascripts/discourse/components/reviewable-claimed-topic.js.es6 b/app/assets/javascripts/discourse/components/reviewable-claimed-topic.js.es6 index 0583a4605fb..273b51afa7f 100644 --- a/app/assets/javascripts/discourse/components/reviewable-claimed-topic.js.es6 +++ b/app/assets/javascripts/discourse/components/reviewable-claimed-topic.js.es6 @@ -1,12 +1,12 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; import { popupAjaxError } from "discourse/lib/ajax-error"; import { ajax } from "discourse/lib/ajax"; export default Component.extend({ tagName: "", - @computed + @discourseComputed enabled() { return this.siteSettings.reviewable_claiming !== "disabled"; }, diff --git a/app/assets/javascripts/discourse/components/reviewable-flagged-post.js.es6 b/app/assets/javascripts/discourse/components/reviewable-flagged-post.js.es6 index 58c48d1bbf1..d432beece97 100644 --- a/app/assets/javascripts/discourse/components/reviewable-flagged-post.js.es6 +++ b/app/assets/javascripts/discourse/components/reviewable-flagged-post.js.es6 @@ -1,6 +1,6 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { gt } from "@ember/object/computed"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; import { longDate } from "discourse/lib/formatter"; import { historyHeat } from "discourse/widgets/post-edits-indicator"; import showModal from "discourse/lib/show-modal"; @@ -8,12 +8,12 @@ import showModal from "discourse/lib/show-modal"; export default Component.extend({ hasEdits: gt("reviewable.post_version", 1), - @computed("reviewable.post_updated_at") + @discourseComputed("reviewable.post_updated_at") historyClass(updatedAt) { return historyHeat(this.siteSettings, new Date(updatedAt)); }, - @computed("reviewable.post_updated_at") + @discourseComputed("reviewable.post_updated_at") editedDate(updatedAt) { return longDate(updatedAt); }, diff --git a/app/assets/javascripts/discourse/components/reviewable-item.js.es6 b/app/assets/javascripts/discourse/components/reviewable-item.js.es6 index c5aaba8b7b4..ef6626ebecb 100644 --- a/app/assets/javascripts/discourse/components/reviewable-item.js.es6 +++ b/app/assets/javascripts/discourse/components/reviewable-item.js.es6 @@ -1,7 +1,7 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; import { ajax } from "discourse/lib/ajax"; import { popupAjaxError } from "discourse/lib/ajax-error"; -import computed from "ember-addons/ember-computed-decorators"; import Category from "discourse/models/category"; import optionalService from "discourse/lib/optional-service"; import showModal from "discourse/lib/show-modal"; @@ -17,17 +17,17 @@ export default Component.extend({ editing: false, _updates: null, - @computed("reviewable.type") + @discourseComputed("reviewable.type") customClass(type) { return type.dasherize(); }, - @computed("siteSettings.reviewable_claiming", "reviewable.topic") + @discourseComputed("siteSettings.reviewable_claiming", "reviewable.topic") claimEnabled(claimMode, topic) { return claimMode !== "disabled" && !!topic; }, - @computed( + @discourseComputed( "claimEnabled", "siteSettings.reviewable_claiming", "reviewable.claimed_by" @@ -44,7 +44,10 @@ export default Component.extend({ return claimMode !== "required"; }, - @computed("siteSettings.reviewable_claiming", "reviewable.claimed_by") + @discourseComputed( + "siteSettings.reviewable_claiming", + "reviewable.claimed_by" + ) claimHelp(claimMode, claimedBy) { if (claimedBy) { return claimedBy.id === this.currentUser.id @@ -61,7 +64,7 @@ export default Component.extend({ // Find a component to render, if one exists. For example: // `ReviewableUser` will return `reviewable-user` - @computed("reviewable.type") + @discourseComputed("reviewable.type") reviewableComponent(type) { if (_components[type] !== undefined) { return _components[type]; diff --git a/app/assets/javascripts/discourse/components/reviewable-user.js.es6 b/app/assets/javascripts/discourse/components/reviewable-user.js.es6 index ec065a0bdef..3dd30433712 100644 --- a/app/assets/javascripts/discourse/components/reviewable-user.js.es6 +++ b/app/assets/javascripts/discourse/components/reviewable-user.js.es6 @@ -1,8 +1,8 @@ import Component from "@ember/component"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; export default Component.extend({ - @computed("reviewable.user_fields") + @discourseComputed("reviewable.user_fields") userFields(fields) { return this.site.collectUserFields(fields); } diff --git a/app/assets/javascripts/discourse/components/search-advanced-options.js.es6 b/app/assets/javascripts/discourse/components/search-advanced-options.js.es6 index 8f1779487d2..42e85897ea4 100644 --- a/app/assets/javascripts/discourse/components/search-advanced-options.js.es6 +++ b/app/assets/javascripts/discourse/components/search-advanced-options.js.es6 @@ -1,7 +1,7 @@ import { debounce } from "@ember/runloop"; import { scheduleOnce } from "@ember/runloop"; import Component from "@ember/component"; -import { observes } from "ember-addons/ember-computed-decorators"; +import { observes } from "discourse-common/utils/decorators"; import { escapeExpression } from "discourse/lib/utilities"; import Group from "discourse/models/group"; import Badge from "discourse/models/badge"; diff --git a/app/assets/javascripts/discourse/components/search-text-field.js.es6 b/app/assets/javascripts/discourse/components/search-text-field.js.es6 index 349918e22e0..fc6ca86c08d 100644 --- a/app/assets/javascripts/discourse/components/search-text-field.js.es6 +++ b/app/assets/javascripts/discourse/components/search-text-field.js.es6 @@ -1,12 +1,12 @@ -import computed from "ember-addons/ember-computed-decorators"; -import { on } from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; +import { on } from "discourse-common/utils/decorators"; import TextField from "discourse/components/text-field"; import { applySearchAutocomplete } from "discourse/lib/search"; export default TextField.extend({ autocomplete: "discourse", - @computed("searchService.searchContextEnabled") + @discourseComputed("searchService.searchContextEnabled") placeholder(searchContextEnabled) { return searchContextEnabled ? "" : I18n.t("search.full_page_title"); }, diff --git a/app/assets/javascripts/discourse/components/second-factor-form.js.es6 b/app/assets/javascripts/discourse/components/second-factor-form.js.es6 index ce332c23b12..47bd68a4876 100644 --- a/app/assets/javascripts/discourse/components/second-factor-form.js.es6 +++ b/app/assets/javascripts/discourse/components/second-factor-form.js.es6 @@ -1,9 +1,9 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; import { SECOND_FACTOR_METHODS } from "discourse/models/user"; export default Component.extend({ - @computed("secondFactorMethod") + @discourseComputed("secondFactorMethod") secondFactorTitle(secondFactorMethod) { switch (secondFactorMethod) { case SECOND_FACTOR_METHODS.TOTP: @@ -15,7 +15,7 @@ export default Component.extend({ } }, - @computed("secondFactorMethod") + @discourseComputed("secondFactorMethod") secondFactorDescription(secondFactorMethod) { switch (secondFactorMethod) { case SECOND_FACTOR_METHODS.TOTP: @@ -27,7 +27,7 @@ export default Component.extend({ } }, - @computed("secondFactorMethod", "isLogin") + @discourseComputed("secondFactorMethod", "isLogin") linkText(secondFactorMethod, isLogin) { if (isLogin) { return secondFactorMethod === SECOND_FACTOR_METHODS.TOTP @@ -40,7 +40,7 @@ export default Component.extend({ } }, - @computed("backupEnabled", "secondFactorMethod") + @discourseComputed("backupEnabled", "secondFactorMethod") showToggleMethodLink(backupEnabled, secondFactorMethod) { return ( backupEnabled && secondFactorMethod !== SECOND_FACTOR_METHODS.SECURITY_KEY diff --git a/app/assets/javascripts/discourse/components/second-factor-input.js.es6 b/app/assets/javascripts/discourse/components/second-factor-input.js.es6 index 97ce1a4fa7d..45ed1f4b9e5 100644 --- a/app/assets/javascripts/discourse/components/second-factor-input.js.es6 +++ b/app/assets/javascripts/discourse/components/second-factor-input.js.es6 @@ -1,22 +1,22 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; import { SECOND_FACTOR_METHODS } from "discourse/models/user"; export default Component.extend({ - @computed("secondFactorMethod") + @discourseComputed("secondFactorMethod") type(secondFactorMethod) { if (secondFactorMethod === SECOND_FACTOR_METHODS.TOTP) return "tel"; if (secondFactorMethod === SECOND_FACTOR_METHODS.BACKUP_CODE) return "text"; }, - @computed("secondFactorMethod") + @discourseComputed("secondFactorMethod") pattern(secondFactorMethod) { if (secondFactorMethod === SECOND_FACTOR_METHODS.TOTP) return "[0-9]{6}"; if (secondFactorMethod === SECOND_FACTOR_METHODS.BACKUP_CODE) return "[a-z0-9]{16}"; }, - @computed("secondFactorMethod") + @discourseComputed("secondFactorMethod") maxlength(secondFactorMethod) { if (secondFactorMethod === SECOND_FACTOR_METHODS.TOTP) return "6"; if (secondFactorMethod === SECOND_FACTOR_METHODS.BACKUP_CODE) return "16"; diff --git a/app/assets/javascripts/discourse/components/share-panel.js.es6 b/app/assets/javascripts/discourse/components/share-panel.js.es6 index 3a7b94b6454..97e09c225eb 100644 --- a/app/assets/javascripts/discourse/components/share-panel.js.es6 +++ b/app/assets/javascripts/discourse/components/share-panel.js.es6 @@ -3,7 +3,7 @@ import { alias } from "@ember/object/computed"; import { schedule } from "@ember/runloop"; import Component from "@ember/component"; import { escapeExpression } from "discourse/lib/utilities"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import Sharing from "discourse/lib/sharing"; export default Component.extend({ @@ -13,18 +13,18 @@ export default Component.extend({ topic: alias("panel.model.topic"), - @computed + @discourseComputed sources() { return Sharing.activeSources(this.siteSettings.share_links); }, - @computed("type", "topic.title") + @discourseComputed("type", "topic.title") shareTitle(type, topicTitle) { topicTitle = escapeExpression(topicTitle); return I18n.t("share.topic_html", { topicTitle }); }, - @computed("panel.model.shareUrl", "topic.shareUrl") + @discourseComputed("panel.model.shareUrl", "topic.shareUrl") shareUrl(forcedShareUrl, shareUrl) { shareUrl = forcedShareUrl || shareUrl; diff --git a/app/assets/javascripts/discourse/components/share-popup.js.es6 b/app/assets/javascripts/discourse/components/share-popup.js.es6 index 4f9d0b9792b..c2174068bdc 100644 --- a/app/assets/javascripts/discourse/components/share-popup.js.es6 +++ b/app/assets/javascripts/discourse/components/share-popup.js.es6 @@ -5,9 +5,9 @@ import Component from "@ember/component"; import { wantsNewWindow } from "discourse/lib/intercept-click"; import { longDateNoYear } from "discourse/lib/formatter"; import { - default as computed, + default as discourseComputed, on -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import Sharing from "discourse/lib/sharing"; import { nativeShare } from "discourse/lib/pwa-utils"; @@ -17,12 +17,12 @@ export default Component.extend({ link: null, visible: null, - @computed + @discourseComputed sources() { return Sharing.activeSources(this.siteSettings.share_links); }, - @computed("type", "postNumber") + @discourseComputed("type", "postNumber") shareTitle(type, postNumber) { if (type === "topic") { return I18n.t("share.topic"); @@ -33,7 +33,7 @@ export default Component.extend({ return I18n.t("share.topic"); }, - @computed("date") + @discourseComputed("date") displayDate(date) { return longDateNoYear(new Date(date)); }, diff --git a/app/assets/javascripts/discourse/components/shared-draft-controls.js.es6 b/app/assets/javascripts/discourse/components/shared-draft-controls.js.es6 index b408ee87a13..0b988e75cf3 100644 --- a/app/assets/javascripts/discourse/components/shared-draft-controls.js.es6 +++ b/app/assets/javascripts/discourse/components/shared-draft-controls.js.es6 @@ -1,11 +1,11 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ tagName: "", publishing: false, - @computed("topic.destination_category_id") + @discourseComputed("topic.destination_category_id") validCategory(destCatId) { return destCatId && destCatId !== this.site.shared_drafts_category_id; }, diff --git a/app/assets/javascripts/discourse/components/site-header.js.es6 b/app/assets/javascripts/discourse/components/site-header.js.es6 index b7b82071c1a..9bdd8f0d8b7 100644 --- a/app/assets/javascripts/discourse/components/site-header.js.es6 +++ b/app/assets/javascripts/discourse/components/site-header.js.es6 @@ -2,7 +2,7 @@ import { cancel } from "@ember/runloop"; import { schedule } from "@ember/runloop"; import { later } from "@ember/runloop"; import MountWidget from "discourse/components/mount-widget"; -import { observes } from "ember-addons/ember-computed-decorators"; +import { observes } from "discourse-common/utils/decorators"; import Docking from "discourse/mixins/docking"; import PanEvents, { SWIPE_VELOCITY, diff --git a/app/assets/javascripts/discourse/components/suggested-topics.js.es6 b/app/assets/javascripts/discourse/components/suggested-topics.js.es6 index 11b6cbf20d3..8351aa984ba 100644 --- a/app/assets/javascripts/discourse/components/suggested-topics.js.es6 +++ b/app/assets/javascripts/discourse/components/suggested-topics.js.es6 @@ -1,6 +1,6 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { get } from "@ember/object"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; import { categoryBadgeHTML } from "discourse/helpers/category-link"; import { iconHTML } from "discourse-common/lib/icon-library"; @@ -8,7 +8,7 @@ export default Component.extend({ elementId: "suggested-topics", classNames: ["suggested-topics"], - @computed("topic") + @discourseComputed("topic") suggestedTitle(topic) { const href = this.currentUser && this.currentUser.pmPath(topic); return topic.get("isPrivateMessage") && href @@ -20,7 +20,7 @@ export default Component.extend({ : I18n.t("suggested_topics.title"); }, - @computed("topic", "topicTrackingState.messageCount") + @discourseComputed("topic", "topicTrackingState.messageCount") browseMoreMessage(topic) { // TODO decide what to show for pms if (topic.get("isPrivateMessage")) { diff --git a/app/assets/javascripts/discourse/components/tag-drop-link.js.es6 b/app/assets/javascripts/discourse/components/tag-drop-link.js.es6 index 73d20d7922b..e8cfada41ac 100644 --- a/app/assets/javascripts/discourse/components/tag-drop-link.js.es6 +++ b/app/assets/javascripts/discourse/components/tag-drop-link.js.es6 @@ -1,6 +1,6 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; import DiscourseURL from "discourse/lib/url"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ tagName: "a", @@ -12,7 +12,7 @@ export default Component.extend({ ], attributeBindings: ["href"], - @computed("tagId", "category") + @discourseComputed("tagId", "category") href(tagId, category) { var url = "/tags"; if (category) { @@ -21,7 +21,7 @@ export default Component.extend({ return url + "/" + tagId; }, - @computed("tagId") + @discourseComputed("tagId") tagClass(tagId) { return "tag-" + tagId; }, diff --git a/app/assets/javascripts/discourse/components/tag-groups-form.js.es6 b/app/assets/javascripts/discourse/components/tag-groups-form.js.es6 index 2dddb086e84..b77220cd081 100644 --- a/app/assets/javascripts/discourse/components/tag-groups-form.js.es6 +++ b/app/assets/javascripts/discourse/components/tag-groups-form.js.es6 @@ -1,13 +1,13 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { isEmpty } from "@ember/utils"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; import { bufferedProperty } from "discourse/mixins/buffered-content"; import PermissionType from "discourse/models/permission-type"; export default Component.extend(bufferedProperty("model"), { tagName: "", - @computed("buffered.isSaving", "buffered.name", "buffered.tag_names") + @discourseComputed("buffered.isSaving", "buffered.name", "buffered.tag_names") savingDisabled(isSaving, name, tagNames) { return isSaving || isEmpty(name) || isEmpty(tagNames); }, diff --git a/app/assets/javascripts/discourse/components/tag-list.js.es6 b/app/assets/javascripts/discourse/components/tag-list.js.es6 index 551b70c93dd..ee6de7fa3a1 100644 --- a/app/assets/javascripts/discourse/components/tag-list.js.es6 +++ b/app/assets/javascripts/discourse/components/tag-list.js.es6 @@ -1,6 +1,6 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { sort } from "@ember/object/computed"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ classNameBindings: [":tag-list", "categoryClass", "tagGroupNameClass"], @@ -8,22 +8,22 @@ export default Component.extend({ isPrivateMessage: false, sortedTags: sort("tags", "sortProperties"), - @computed("titleKey") + @discourseComputed("titleKey") title(titleKey) { return titleKey && I18n.t(titleKey); }, - @computed("categoryId") + @discourseComputed("categoryId") category(categoryId) { return categoryId && Discourse.Category.findById(categoryId); }, - @computed("category.fullSlug") + @discourseComputed("category.fullSlug") categoryClass(slug) { return slug && `tag-list-${slug}`; }, - @computed("tagGroupName") + @discourseComputed("tagGroupName") tagGroupNameClass(groupName) { if (groupName) { groupName = groupName diff --git a/app/assets/javascripts/discourse/components/text-field.js.es6 b/app/assets/javascripts/discourse/components/text-field.js.es6 index eca66af1d36..1978cd0ab22 100644 --- a/app/assets/javascripts/discourse/components/text-field.js.es6 +++ b/app/assets/javascripts/discourse/components/text-field.js.es6 @@ -1,4 +1,4 @@ -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; import { siteDir, isRTL, isLTR } from "discourse/lib/text-direction"; export default Ember.TextField.extend({ @@ -10,7 +10,7 @@ export default Ember.TextField.extend({ "dir" ], - @computed + @discourseComputed dir() { if (this.siteSettings.support_mixed_text_direction) { let val = this.value; @@ -37,7 +37,7 @@ export default Ember.TextField.extend({ } }, - @computed("placeholderKey") + @discourseComputed("placeholderKey") placeholder: { get() { if (this._placeholder) return this._placeholder; diff --git a/app/assets/javascripts/discourse/components/top-period-buttons.js.es6 b/app/assets/javascripts/discourse/components/top-period-buttons.js.es6 index 9c01cf1a1da..0eaf69a992b 100644 --- a/app/assets/javascripts/discourse/components/top-period-buttons.js.es6 +++ b/app/assets/javascripts/discourse/components/top-period-buttons.js.es6 @@ -1,10 +1,10 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ classNames: ["top-title-buttons"], - @computed("period") + @discourseComputed("period") periods(period) { return this.site.get("periods").filter(p => p !== period); }, diff --git a/app/assets/javascripts/discourse/components/topic-entrance.js.es6 b/app/assets/javascripts/discourse/components/topic-entrance.js.es6 index ead6913e821..3cfa8feb6a6 100644 --- a/app/assets/javascripts/discourse/components/topic-entrance.js.es6 +++ b/app/assets/javascripts/discourse/components/topic-entrance.js.es6 @@ -1,8 +1,8 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { scheduleOnce } from "@ember/runloop"; import Component from "@ember/component"; import DiscourseURL from "discourse/lib/url"; import CleansUp from "discourse/mixins/cleans-up"; -import computed from "ember-addons/ember-computed-decorators"; function entranceDate(dt, showTime) { const today = new Date(); @@ -34,23 +34,23 @@ export default Component.extend(CleansUp, { topic: null, visible: null, - @computed("topic.created_at") + @discourseComputed("topic.created_at") createdDate: createdAt => new Date(createdAt), - @computed("topic.bumped_at") + @discourseComputed("topic.bumped_at") bumpedDate: bumpedAt => new Date(bumpedAt), - @computed("createdDate", "bumpedDate") + @discourseComputed("createdDate", "bumpedDate") showTime(createdDate, bumpedDate) { return ( bumpedDate.getTime() - createdDate.getTime() < 1000 * 60 * 60 * 24 * 2 ); }, - @computed("createdDate", "showTime") + @discourseComputed("createdDate", "showTime") topDate: (createdDate, showTime) => entranceDate(createdDate, showTime), - @computed("bumpedDate", "showTime") + @discourseComputed("bumpedDate", "showTime") bottomDate: (bumpedDate, showTime) => entranceDate(bumpedDate, showTime), didInsertElement() { diff --git a/app/assets/javascripts/discourse/components/topic-footer-buttons.js.es6 b/app/assets/javascripts/discourse/components/topic-footer-buttons.js.es6 index 7c13728bff2..5f4592aeed3 100644 --- a/app/assets/javascripts/discourse/components/topic-footer-buttons.js.es6 +++ b/app/assets/javascripts/discourse/components/topic-footer-buttons.js.es6 @@ -1,6 +1,6 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { alias, or, and } from "@ember/object/computed"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; import { getTopicFooterButtons } from "discourse/lib/register-topic-footer-button"; export default Component.extend({ @@ -9,25 +9,25 @@ export default Component.extend({ // Allow us to extend it layoutName: "components/topic-footer-buttons", - @computed("topic.isPrivateMessage") + @discourseComputed("topic.isPrivateMessage") canArchive(isPM) { return this.siteSettings.enable_personal_messages && isPM; }, buttons: getTopicFooterButtons(), - @computed("buttons.[]") + @discourseComputed("buttons.[]") inlineButtons(buttons) { return buttons.filter(button => !button.dropdown); }, // topic.assigned_to_user is for backward plugin support - @computed("buttons.[]", "topic.assigned_to_user") + @discourseComputed("buttons.[]", "topic.assigned_to_user") dropdownButtons(buttons) { return buttons.filter(button => button.dropdown); }, - @computed("topic.isPrivateMessage") + @discourseComputed("topic.isPrivateMessage") showNotificationsButton(isPM) { return !isPM || this.siteSettings.enable_personal_messages; }, @@ -38,7 +38,7 @@ export default Component.extend({ inviteDisabled: or("topic.archived", "topic.closed", "topic.deleted"), - @computed + @discourseComputed showAdminButton() { return ( !this.site.mobileView && @@ -49,14 +49,14 @@ export default Component.extend({ showEditOnFooter: and("topic.isPrivateMessage", "site.can_tag_pms"), - @computed("topic.message_archived") + @discourseComputed("topic.message_archived") archiveIcon: archived => (archived ? "envelope" : "folder"), - @computed("topic.message_archived") + @discourseComputed("topic.message_archived") archiveTitle: archived => archived ? "topic.move_to_inbox.help" : "topic.archive_message.help", - @computed("topic.message_archived") + @discourseComputed("topic.message_archived") archiveLabel: archived => archived ? "topic.move_to_inbox.title" : "topic.archive_message.title" }); diff --git a/app/assets/javascripts/discourse/components/topic-join-group-notice.js.es6 b/app/assets/javascripts/discourse/components/topic-join-group-notice.js.es6 index 114e02aa04f..4a55fb8886c 100644 --- a/app/assets/javascripts/discourse/components/topic-join-group-notice.js.es6 +++ b/app/assets/javascripts/discourse/components/topic-join-group-notice.js.es6 @@ -1,17 +1,17 @@ import Component from "@ember/component"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; export default Component.extend({ classNames: ["topic-notice"], - @computed("model.group.{full_name,name,allow_membership_requests}") + @discourseComputed("model.group.{full_name,name,allow_membership_requests}") accessViaGroupText(group) { const name = group.full_name || group.name; const suffix = group.allow_membership_requests ? "request" : "join"; return I18n.t(`topic.group_${suffix}`, { name }); }, - @computed("model.group.allow_membership_requests") + @discourseComputed("model.group.allow_membership_requests") accessViaGroupButtonText(allowRequest) { return `groups.${allowRequest ? "request" : "join"}`; } diff --git a/app/assets/javascripts/discourse/components/topic-list-item.js.es6 b/app/assets/javascripts/discourse/components/topic-list-item.js.es6 index 10161d7b517..670d45b64cf 100644 --- a/app/assets/javascripts/discourse/components/topic-list-item.js.es6 +++ b/app/assets/javascripts/discourse/components/topic-list-item.js.es6 @@ -1,7 +1,7 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { alias } from "@ember/object/computed"; import Component from "@ember/component"; import DiscourseURL from "discourse/lib/url"; -import computed from "ember-addons/ember-computed-decorators"; import { bufferedRender } from "discourse-common/lib/buffered-render"; import { findRawTemplate } from "discourse/lib/raw-templates"; import { wantsNewWindow } from "discourse/lib/intercept-click"; @@ -64,29 +64,29 @@ export const ListItemDefaults = { } }, - @computed("topic.id") + @discourseComputed("topic.id") unreadIndicatorChannel(topicId) { return `/private-messages/unread-indicator/${topicId}`; }, - @computed("topic.unread_by_group_member") + @discourseComputed("topic.unread_by_group_member") unreadClass(unreadByGroupMember) { return unreadByGroupMember ? "" : "read"; }, - @computed("topic.unread_by_group_member") + @discourseComputed("topic.unread_by_group_member") includeUnreadIndicator(unreadByGroupMember) { return typeof unreadByGroupMember !== "undefined"; }, - @computed + @discourseComputed newDotText() { return this.currentUser && this.currentUser.trust_level > 0 ? "" : I18n.t("filters.new.lower_title"); }, - @computed("topic", "lastVisitedTopic") + @discourseComputed("topic", "lastVisitedTopic") unboundClassNames(topic, lastVisitedTopic) { let classes = []; @@ -131,7 +131,7 @@ export const ListItemDefaults = { return this.get("topic.op_like_count") > 0; }, - @computed + @discourseComputed expandPinned: function() { const pinned = this.get("topic.pinned"); if (!pinned) { diff --git a/app/assets/javascripts/discourse/components/topic-list.js.es6 b/app/assets/javascripts/discourse/components/topic-list.js.es6 index 6d3ea337e2e..d744b28a706 100644 --- a/app/assets/javascripts/discourse/components/topic-list.js.es6 +++ b/app/assets/javascripts/discourse/components/topic-list.js.es6 @@ -2,9 +2,9 @@ import { alias, reads } from "@ember/object/computed"; import { schedule } from "@ember/runloop"; import Component from "@ember/component"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import LoadMore from "discourse/mixins/load-more"; import { on } from "@ember/object/evented"; @@ -24,24 +24,24 @@ export default Component.extend(LoadMore, { this.refreshLastVisited(); }), - @computed("bulkSelectEnabled") + @discourseComputed("bulkSelectEnabled") toggleInTitle(bulkSelectEnabled) { return !bulkSelectEnabled && this.canBulkSelect; }, - @computed + @discourseComputed sortable() { return !!this.changeSort; }, skipHeader: reads("site.mobileView"), - @computed("order") + @discourseComputed("order") showLikes(order) { return order === "likes"; }, - @computed("order") + @discourseComputed("order") showOpLikes(order) { return order === "op_likes"; }, diff --git a/app/assets/javascripts/discourse/components/topic-navigation.js.es6 b/app/assets/javascripts/discourse/components/topic-navigation.js.es6 index b2115e755d6..3324814bf66 100644 --- a/app/assets/javascripts/discourse/components/topic-navigation.js.es6 +++ b/app/assets/javascripts/discourse/components/topic-navigation.js.es6 @@ -2,7 +2,7 @@ import EmberObject from "@ember/object"; import { scheduleOnce } from "@ember/runloop"; import { later } from "@ember/runloop"; import Component from "@ember/component"; -import { observes } from "ember-addons/ember-computed-decorators"; +import { observes } from "discourse-common/utils/decorators"; import showModal from "discourse/lib/show-modal"; import PanEvents, { SWIPE_VELOCITY, diff --git a/app/assets/javascripts/discourse/components/topic-progress.js.es6 b/app/assets/javascripts/discourse/components/topic-progress.js.es6 index 9d5cb2103f0..3e055c96ed1 100644 --- a/app/assets/javascripts/discourse/components/topic-progress.js.es6 +++ b/app/assets/javascripts/discourse/components/topic-progress.js.es6 @@ -2,9 +2,9 @@ import { alias } from "@ember/object/computed"; import { scheduleOnce } from "@ember/runloop"; import Component from "@ember/component"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; export default Component.extend({ elementId: "topic-progress-wrapper", @@ -14,12 +14,12 @@ export default Component.extend({ postStream: alias("topic.postStream"), _streamPercentage: null, - @computed("progressPosition") + @discourseComputed("progressPosition") jumpTopDisabled(progressPosition) { return progressPosition <= 3; }, - @computed( + @discourseComputed( "postStream.filteredPostsCount", "topic.highest_post_number", "progressPosition" @@ -31,7 +31,7 @@ export default Component.extend({ ); }, - @computed( + @discourseComputed( "postStream.loaded", "topic.currentPost", "postStream.filteredPostsCount" @@ -44,14 +44,14 @@ export default Component.extend({ ); }, - @computed("postStream.filteredPostsCount") + @discourseComputed("postStream.filteredPostsCount") hugeNumberOfPosts(filteredPostsCount) { return ( filteredPostsCount >= this.siteSettings.short_progress_text_threshold ); }, - @computed("hugeNumberOfPosts", "topic.highest_post_number") + @discourseComputed("hugeNumberOfPosts", "topic.highest_post_number") jumpToBottomTitle(hugeNumberOfPosts, highestPostNumber) { if (hugeNumberOfPosts) { return I18n.t("topic.progress.jump_bottom_with_number", { @@ -62,7 +62,7 @@ export default Component.extend({ } }, - @computed("progressPosition", "topic.last_read_post_id") + @discourseComputed("progressPosition", "topic.last_read_post_id") showBackButton(position, lastReadId) { if (!lastReadId) { return; diff --git a/app/assets/javascripts/discourse/components/topic-status.js.es6 b/app/assets/javascripts/discourse/components/topic-status.js.es6 index dc3e0d14f69..dd1f6c50664 100644 --- a/app/assets/javascripts/discourse/components/topic-status.js.es6 +++ b/app/assets/javascripts/discourse/components/topic-status.js.es6 @@ -1,9 +1,9 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; import { iconHTML } from "discourse-common/lib/icon-library"; import { bufferedRender } from "discourse-common/lib/buffered-render"; import { escapeExpression } from "discourse/lib/utilities"; import TopicStatusIcons from "discourse/helpers/topic-status-icons"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend( bufferedRender({ @@ -28,7 +28,7 @@ export default Component.extend( return false; }, - @computed("disableActions") + @discourseComputed("disableActions") canAct(disableActions) { return this.currentUser && !disableActions; }, diff --git a/app/assets/javascripts/discourse/components/topic-timeline.js.es6 b/app/assets/javascripts/discourse/components/topic-timeline.js.es6 index 9aa65410652..b802d475863 100644 --- a/app/assets/javascripts/discourse/components/topic-timeline.js.es6 +++ b/app/assets/javascripts/discourse/components/topic-timeline.js.es6 @@ -1,7 +1,7 @@ import { next } from "@ember/runloop"; import MountWidget from "discourse/components/mount-widget"; import Docking from "discourse/mixins/docking"; -import { observes } from "ember-addons/ember-computed-decorators"; +import { observes } from "discourse-common/utils/decorators"; import optionalService from "discourse/lib/optional-service"; const headerPadding = () => { diff --git a/app/assets/javascripts/discourse/components/topic-timer-info.js.es6 b/app/assets/javascripts/discourse/components/topic-timer-info.js.es6 index 3f219f31432..487307f6248 100644 --- a/app/assets/javascripts/discourse/components/topic-timer-info.js.es6 +++ b/app/assets/javascripts/discourse/components/topic-timer-info.js.es6 @@ -1,10 +1,10 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { cancel } from "@ember/runloop"; import { later } from "@ember/runloop"; import Component from "@ember/component"; import { iconHTML } from "discourse-common/lib/icon-library"; import { bufferedRender } from "discourse-common/lib/buffered-render"; import Category from "discourse/models/category"; -import computed from "ember-addons/ember-computed-decorators"; import { REMINDER_TYPE } from "discourse/controllers/edit-topic-timer"; import ENV from "discourse-common/config/environment"; @@ -22,7 +22,7 @@ export default Component.extend( "categoryId" ], - @computed("statusType") + @discourseComputed("statusType") canRemoveTimer(type) { if (type === REMINDER_TYPE) return true; return this.currentUser && this.currentUser.get("canManageTopic"); diff --git a/app/assets/javascripts/discourse/components/user-badge.js.es6 b/app/assets/javascripts/discourse/components/user-badge.js.es6 index 85de291634d..6f9c4850b5a 100644 --- a/app/assets/javascripts/discourse/components/user-badge.js.es6 +++ b/app/assets/javascripts/discourse/components/user-badge.js.es6 @@ -1,15 +1,15 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ tagName: "span", - @computed("count") + @discourseComputed("count") showGrantCount(count) { return count && count > 1; }, - @computed("badge", "user") + @discourseComputed("badge", "user") badgeUrl() { // NOTE: I tried using a link-to helper here but the queryParams mean it fails var username = this.get("user.username_lower") || ""; diff --git a/app/assets/javascripts/discourse/components/user-card-contents.js.es6 b/app/assets/javascripts/discourse/components/user-card-contents.js.es6 index 9163d36d537..255e494f21c 100644 --- a/app/assets/javascripts/discourse/components/user-card-contents.js.es6 +++ b/app/assets/javascripts/discourse/components/user-card-contents.js.es6 @@ -3,9 +3,9 @@ import { alias, gte, and, gt, not, or } from "@ember/object/computed"; import EmberObject from "@ember/object"; import Component from "@ember/component"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import User from "discourse/models/user"; import { propertyNotEqual, setting } from "discourse/lib/computed"; import { durationTiny } from "discourse/lib/formatter"; @@ -50,26 +50,26 @@ export default Component.extend(CardContentsBase, CanCheckEmails, CleansUp, { // If inside a topic topicPostCount: null, - @computed("user.staff") + @discourseComputed("user.staff") staff: isStaff => (isStaff ? "staff" : ""), - @computed("user.trust_level") + @discourseComputed("user.trust_level") newUser: trustLevel => (trustLevel === 0 ? "new-user" : ""), - @computed("user.name") + @discourseComputed("user.name") nameFirst(name) { return prioritizeNameInUx(name, this.siteSettings); }, - @computed("username") + @discourseComputed("username") usernameClass: username => (username ? `user-card-${username}` : ""), - @computed("username", "topicPostCount") + @discourseComputed("username", "topicPostCount") togglePostsLabel(username, count) { return I18n.t("topic.filter_to", { username, count }); }, - @computed("user.user_fields.@each.value") + @discourseComputed("user.user_fields.@each.value") publicUserFields() { const siteUserFields = this.site.get("user_fields"); if (!isEmpty(siteUserFields)) { @@ -86,25 +86,25 @@ export default Component.extend(CardContentsBase, CanCheckEmails, CleansUp, { } }, - @computed("user.trust_level") + @discourseComputed("user.trust_level") removeNoFollow(trustLevel) { return trustLevel > 2 && !this.siteSettings.tl3_links_no_follow; }, - @computed("user.badge_count", "user.featured_user_badges.length") + @discourseComputed("user.badge_count", "user.featured_user_badges.length") moreBadgesCount: (badgeCount, badgeLength) => badgeCount - badgeLength, - @computed("user.time_read", "user.recent_time_read") + @discourseComputed("user.time_read", "user.recent_time_read") showRecentTimeRead(timeRead, recentTimeRead) { return timeRead !== recentTimeRead && recentTimeRead !== 0; }, - @computed("user.recent_time_read") + @discourseComputed("user.recent_time_read") recentTimeRead(recentTimeReadSeconds) { return durationTiny(recentTimeReadSeconds); }, - @computed("showRecentTimeRead", "user.time_read", "recentTimeRead") + @discourseComputed("showRecentTimeRead", "user.time_read", "recentTimeRead") timeReadTooltip(showRecent, timeRead, recentTimeRead) { if (showRecent) { return I18n.t("time_read_recently_tooltip", { diff --git a/app/assets/javascripts/discourse/components/user-field.js.es6 b/app/assets/javascripts/discourse/components/user-field.js.es6 index b54cbafd0ad..f8e2554ab02 100644 --- a/app/assets/javascripts/discourse/components/user-field.js.es6 +++ b/app/assets/javascripts/discourse/components/user-field.js.es6 @@ -1,17 +1,17 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; import { fmt } from "discourse/lib/computed"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ classNameBindings: [":user-field", "field.field_type", "customFieldClass"], layoutName: fmt("field.field_type", "components/user-fields/%@"), - @computed + @discourseComputed noneLabel() { return "user_fields.none"; }, - @computed("field.name") + @discourseComputed("field.name") customFieldClass(fieldName) { if (fieldName) { fieldName = fieldName diff --git a/app/assets/javascripts/discourse/components/user-flag-percentage.js.es6 b/app/assets/javascripts/discourse/components/user-flag-percentage.js.es6 index 5c24fb70afd..60e3c4ccef3 100644 --- a/app/assets/javascripts/discourse/components/user-flag-percentage.js.es6 +++ b/app/assets/javascripts/discourse/components/user-flag-percentage.js.es6 @@ -1,16 +1,16 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ tagName: "", - @computed("percentage") + @discourseComputed("percentage") showPercentage(percentage) { return percentage.total >= 3; }, // We do a little logic to choose which icon to display and which text - @computed("agreed", "disagreed", "ignored") + @discourseComputed("agreed", "disagreed", "ignored") percentage(agreed, disagreed, ignored) { let total = agreed + disagreed + ignored; let result = { total }; diff --git a/app/assets/javascripts/discourse/components/user-info.js.es6 b/app/assets/javascripts/discourse/components/user-info.js.es6 index 5873829a25a..2de553d13d4 100644 --- a/app/assets/javascripts/discourse/components/user-info.js.es6 +++ b/app/assets/javascripts/discourse/components/user-info.js.es6 @@ -1,6 +1,6 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { alias } from "@ember/object/computed"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; import { userPath } from "discourse/lib/url"; export function normalize(name) { @@ -12,7 +12,7 @@ export default Component.extend({ attributeBindings: ["data-username"], size: "small", - @computed("user.username") + @discourseComputed("user.username") userPath(username) { return userPath(username); }, @@ -22,7 +22,7 @@ export default Component.extend({ // TODO: In later ember releases `hasBlock` works without this hasBlock: alias("template"), - @computed("user.name", "user.username") + @discourseComputed("user.name", "user.username") name(name, username) { if (name && normalize(username) !== normalize(name)) { return name; diff --git a/app/assets/javascripts/discourse/components/user-notifications-large.js.es6 b/app/assets/javascripts/discourse/components/user-notifications-large.js.es6 index de804fb75e1..3d2a2112b55 100644 --- a/app/assets/javascripts/discourse/components/user-notifications-large.js.es6 +++ b/app/assets/javascripts/discourse/components/user-notifications-large.js.es6 @@ -1,5 +1,5 @@ import MountWidget from "discourse/components/mount-widget"; -import { observes } from "ember-addons/ember-computed-decorators"; +import { observes } from "discourse-common/utils/decorators"; export default MountWidget.extend({ widget: "user-notifications-large", diff --git a/app/assets/javascripts/discourse/components/user-selector.js.es6 b/app/assets/javascripts/discourse/components/user-selector.js.es6 index 772777543c8..e6170b81edd 100644 --- a/app/assets/javascripts/discourse/components/user-selector.js.es6 +++ b/app/assets/javascripts/discourse/components/user-selector.js.es6 @@ -1,5 +1,5 @@ import { isEmpty } from "@ember/utils"; -import { on, observes } from "ember-addons/ember-computed-decorators"; +import { on, observes } from "discourse-common/utils/decorators"; import TextField from "discourse/components/text-field"; import userSearch from "discourse/lib/user-search"; import { findRawTemplate } from "discourse/lib/raw-templates"; diff --git a/app/assets/javascripts/discourse/components/user-summary-category-search.js.es6 b/app/assets/javascripts/discourse/components/user-summary-category-search.js.es6 index 5206a83988c..202ee1eb58e 100644 --- a/app/assets/javascripts/discourse/components/user-summary-category-search.js.es6 +++ b/app/assets/javascripts/discourse/components/user-summary-category-search.js.es6 @@ -1,10 +1,10 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ tagName: "", - @computed("user", "category") + @discourseComputed("user", "category") searchParams() { return `@${this.get("user.username")} #${this.get("category.slug")}`; } diff --git a/app/assets/javascripts/discourse/components/user-summary-topics-list.js.es6 b/app/assets/javascripts/discourse/components/user-summary-topics-list.js.es6 index 39970994da6..5cee1e00e93 100644 --- a/app/assets/javascripts/discourse/components/user-summary-topics-list.js.es6 +++ b/app/assets/javascripts/discourse/components/user-summary-topics-list.js.es6 @@ -1,5 +1,5 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; // should be kept in sync with 'UserSummary::MAX_SUMMARY_RESULTS' const MAX_SUMMARY_RESULTS = 6; @@ -7,7 +7,7 @@ const MAX_SUMMARY_RESULTS = 6; export default Component.extend({ tagName: "", - @computed("items.length") + @discourseComputed("items.length") hasMore(length) { return length >= MAX_SUMMARY_RESULTS; } diff --git a/app/assets/javascripts/discourse/controllers/about.js.es6 b/app/assets/javascripts/discourse/controllers/about.js.es6 index 85f26757ae8..9225421995f 100644 --- a/app/assets/javascripts/discourse/controllers/about.js.es6 +++ b/app/assets/javascripts/discourse/controllers/about.js.es6 @@ -1,11 +1,11 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { gt } from "@ember/object/computed"; import Controller from "@ember/controller"; -import computed from "ember-addons/ember-computed-decorators"; export default Controller.extend({ faqOverriden: gt("siteSettings.faq_url.length", 0), - @computed + @discourseComputed contactInfo() { if (this.siteSettings.contact_url) { return I18n.t("about.contact_info", { diff --git a/app/assets/javascripts/discourse/controllers/account-created-edit-email.js.es6 b/app/assets/javascripts/discourse/controllers/account-created-edit-email.js.es6 index 1002a907529..dd3314110b1 100644 --- a/app/assets/javascripts/discourse/controllers/account-created-edit-email.js.es6 +++ b/app/assets/javascripts/discourse/controllers/account-created-edit-email.js.es6 @@ -1,13 +1,13 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; import { changeEmail } from "discourse/lib/user-activation"; -import computed from "ember-addons/ember-computed-decorators"; import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend({ accountCreated: null, newEmail: null, - @computed("newEmail", "accountCreated.email") + @discourseComputed("newEmail", "accountCreated.email") submitDisabled(newEmail, currentEmail) { return newEmail === currentEmail; }, diff --git a/app/assets/javascripts/discourse/controllers/activation-edit.js.es6 b/app/assets/javascripts/discourse/controllers/activation-edit.js.es6 index 8fc90f6cf00..010878f7200 100644 --- a/app/assets/javascripts/discourse/controllers/activation-edit.js.es6 +++ b/app/assets/javascripts/discourse/controllers/activation-edit.js.es6 @@ -1,6 +1,6 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { inject } from "@ember/controller"; import Controller from "@ember/controller"; -import computed from "ember-addons/ember-computed-decorators"; import ModalFunctionality from "discourse/mixins/modal-functionality"; import { extractError } from "discourse/lib/ajax-error"; import { changeEmail } from "discourse/lib/user-activation"; @@ -12,7 +12,7 @@ export default Controller.extend(ModalFunctionality, { newEmail: null, password: null, - @computed("newEmail", "currentEmail") + @discourseComputed("newEmail", "currentEmail") submitDisabled(newEmail, currentEmail) { return newEmail === currentEmail; }, diff --git a/app/assets/javascripts/discourse/controllers/add-post-notice.js.es6 b/app/assets/javascripts/discourse/controllers/add-post-notice.js.es6 index 83883ca5aae..b0c92b3a815 100644 --- a/app/assets/javascripts/discourse/controllers/add-post-notice.js.es6 +++ b/app/assets/javascripts/discourse/controllers/add-post-notice.js.es6 @@ -1,7 +1,7 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { isEmpty } from "@ember/utils"; import Controller from "@ember/controller"; import ModalFunctionality from "discourse/mixins/modal-functionality"; -import computed from "ember-addons/ember-computed-decorators"; import { cookAsync } from "discourse/lib/text"; export default Controller.extend(ModalFunctionality, { @@ -12,7 +12,7 @@ export default Controller.extend(ModalFunctionality, { notice: null, saving: false, - @computed("saving", "notice") + @discourseComputed("saving", "notice") disabled(saving, notice) { return saving || isEmpty(notice); }, diff --git a/app/assets/javascripts/discourse/controllers/application.js.es6 b/app/assets/javascripts/discourse/controllers/application.js.es6 index 610e745e64b..c96c10c6e02 100644 --- a/app/assets/javascripts/discourse/controllers/application.js.es6 +++ b/app/assets/javascripts/discourse/controllers/application.js.es6 @@ -1,6 +1,6 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { inject as service } from "@ember/service"; import Controller from "@ember/controller"; -import computed from "ember-addons/ember-computed-decorators"; import { isAppWebview, isiOSPWA } from "discourse/lib/utilities"; export default Controller.extend({ @@ -8,7 +8,7 @@ export default Controller.extend({ showFooter: false, router: service(), - @computed + @discourseComputed canSignUp() { return ( !Discourse.SiteSettings.invite_only && @@ -17,12 +17,12 @@ export default Controller.extend({ ); }, - @computed + @discourseComputed loginRequired() { return Discourse.SiteSettings.login_required && !this.currentUser; }, - @computed + @discourseComputed showFooterNav() { return isAppWebview() || isiOSPWA(); } diff --git a/app/assets/javascripts/discourse/controllers/avatar-selector.js.es6 b/app/assets/javascripts/discourse/controllers/avatar-selector.js.es6 index 1a230335802..59c28e6932a 100644 --- a/app/assets/javascripts/discourse/controllers/avatar-selector.js.es6 +++ b/app/assets/javascripts/discourse/controllers/avatar-selector.js.es6 @@ -1,12 +1,12 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; -import computed from "ember-addons/ember-computed-decorators"; import ModalFunctionality from "discourse/mixins/modal-functionality"; import { ajax } from "discourse/lib/ajax"; import { allowsImages } from "discourse/lib/utilities"; import { popupAjaxError } from "discourse/lib/ajax-error"; export default Controller.extend(ModalFunctionality, { - @computed( + @discourseComputed( "selected", "user.system_avatar_upload_id", "user.gravatar_avatar_upload_id", @@ -23,7 +23,7 @@ export default Controller.extend(ModalFunctionality, { } }, - @computed( + @discourseComputed( "selected", "user.system_avatar_template", "user.gravatar_avatar_template", @@ -40,7 +40,7 @@ export default Controller.extend(ModalFunctionality, { } }, - @computed() + @discourseComputed() allowAvatarUpload() { return this.siteSettings.allow_uploaded_avatars && allowsImages(); }, diff --git a/app/assets/javascripts/discourse/controllers/badges/index.js.es6 b/app/assets/javascripts/discourse/controllers/badges/index.js.es6 index c1c4d8db279..e0564017035 100644 --- a/app/assets/javascripts/discourse/controllers/badges/index.js.es6 +++ b/app/assets/javascripts/discourse/controllers/badges/index.js.es6 @@ -1,8 +1,8 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; -import computed from "ember-addons/ember-computed-decorators"; export default Controller.extend({ - @computed("model") + @discourseComputed("model") badgeGroups(model) { var sorted = _.sortBy(model, function(badge) { var pos = badge.get("badge_grouping.position"); diff --git a/app/assets/javascripts/discourse/controllers/badges/show.js.es6 b/app/assets/javascripts/discourse/controllers/badges/show.js.es6 index d1093c13bc2..807ea2b596b 100644 --- a/app/assets/javascripts/discourse/controllers/badges/show.js.es6 +++ b/app/assets/javascripts/discourse/controllers/badges/show.js.es6 @@ -4,9 +4,9 @@ import Controller from "@ember/controller"; import Badge from "discourse/models/badge"; import UserBadge from "discourse/models/user-badge"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; export default Controller.extend({ queryParams: ["username"], @@ -15,12 +15,12 @@ export default Controller.extend({ application: inject(), hiddenSetTitle: true, - @computed("userBadgesAll") + @discourseComputed("userBadgesAll") filteredList(userBadgesAll) { return userBadgesAll.filterBy("badge.allow_title", true); }, - @computed("filteredList") + @discourseComputed("filteredList") selectableUserBadges(filteredList) { return [ EmberObject.create({ @@ -30,24 +30,24 @@ export default Controller.extend({ ]; }, - @computed("username") + @discourseComputed("username") user(username) { if (username) { return this.userBadges[0].get("user"); } }, - @computed("username", "model.grant_count", "userBadges.grant_count") + @discourseComputed("username", "model.grant_count", "userBadges.grant_count") grantCount(username, modelCount, userCount) { return username ? userCount : modelCount; }, - @computed("model.grant_count", "userBadges.grant_count") + @discourseComputed("model.grant_count", "userBadges.grant_count") othersCount(modelCount, userCount) { return modelCount - userCount; }, - @computed("model.allow_title", "model.has_badge", "model") + @discourseComputed("model.allow_title", "model.has_badge", "model") canSelectTitle(hasTitleBadges, hasBadge) { return this.siteSettings.enable_badges && hasTitleBadges && hasBadge; }, @@ -81,7 +81,7 @@ export default Controller.extend({ } }, - @computed("noMoreBadges", "grantCount", "userBadges.length") + @discourseComputed("noMoreBadges", "grantCount", "userBadges.length") canLoadMore(noMoreBadges, grantCount, userBadgeLength) { if (noMoreBadges) { return false; @@ -89,7 +89,7 @@ export default Controller.extend({ return grantCount > (userBadgeLength || 0); }, - @computed("user", "model.grant_count") + @discourseComputed("user", "model.grant_count") canShowOthers(user, grantCount) { return !!user && grantCount > 1; }, diff --git a/app/assets/javascripts/discourse/controllers/bulk-notification-level.js.es6 b/app/assets/javascripts/discourse/controllers/bulk-notification-level.js.es6 index 0d8ac58ca21..d9627ee47fc 100644 --- a/app/assets/javascripts/discourse/controllers/bulk-notification-level.js.es6 +++ b/app/assets/javascripts/discourse/controllers/bulk-notification-level.js.es6 @@ -1,7 +1,7 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { empty } from "@ember/object/computed"; import { inject } from "@ember/controller"; import Controller from "@ember/controller"; -import computed from "ember-addons/ember-computed-decorators"; import { topicLevels } from "discourse/lib/notification-levels"; // Support for changing the notification level of various topics @@ -9,7 +9,7 @@ export default Controller.extend({ topicBulkActions: inject(), notificationLevelId: null, - @computed + @discourseComputed notificationLevels() { return topicLevels.map(level => { return { diff --git a/app/assets/javascripts/discourse/controllers/change-owner.js.es6 b/app/assets/javascripts/discourse/controllers/change-owner.js.es6 index 9a738881d57..0380faf86cd 100644 --- a/app/assets/javascripts/discourse/controllers/change-owner.js.es6 +++ b/app/assets/javascripts/discourse/controllers/change-owner.js.es6 @@ -1,3 +1,4 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { isEmpty } from "@ember/utils"; import { alias } from "@ember/object/computed"; import { next } from "@ember/runloop"; @@ -6,7 +7,6 @@ import Controller from "@ember/controller"; import ModalFunctionality from "discourse/mixins/modal-functionality"; import DiscourseURL from "discourse/lib/url"; import Topic from "discourse/models/topic"; -import computed from "ember-addons/ember-computed-decorators"; export default Controller.extend(ModalFunctionality, { topicController: inject("topic"), @@ -17,7 +17,7 @@ export default Controller.extend(ModalFunctionality, { selectedPostsCount: alias("topicController.selectedPostsCount"), selectedPostsUsername: alias("topicController.selectedPostsUsername"), - @computed("saving", "new_user") + @discourseComputed("saving", "new_user") buttonDisabled(saving, newUser) { return saving || isEmpty(newUser); }, diff --git a/app/assets/javascripts/discourse/controllers/change-timestamp.js.es6 b/app/assets/javascripts/discourse/controllers/change-timestamp.js.es6 index 9a29c747d74..5cb6bdba532 100644 --- a/app/assets/javascripts/discourse/controllers/change-timestamp.js.es6 +++ b/app/assets/javascripts/discourse/controllers/change-timestamp.js.es6 @@ -1,9 +1,9 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { isEmpty } from "@ember/utils"; import { next } from "@ember/runloop"; import { inject } from "@ember/controller"; import Controller from "@ember/controller"; import ModalFunctionality from "discourse/mixins/modal-functionality"; -import computed from "ember-addons/ember-computed-decorators"; import DiscourseURL from "discourse/lib/url"; import Topic from "discourse/models/topic"; @@ -14,22 +14,22 @@ export default Controller.extend(ModalFunctionality, { date: "", time: "", - @computed("saving") + @discourseComputed("saving") buttonTitle(saving) { return saving ? I18n.t("saving") : I18n.t("topic.change_timestamp.action"); }, - @computed("date", "time") + @discourseComputed("date", "time") createdAt(date, time) { return moment(`${date} ${time}`, "YYYY-MM-DD HH:mm:ss"); }, - @computed("createdAt") + @discourseComputed("createdAt") validTimestamp(createdAt) { return moment().diff(createdAt, "minutes") < 0; }, - @computed("saving", "date", "validTimestamp") + @discourseComputed("saving", "date", "validTimestamp") buttonDisabled(saving, date, validTimestamp) { if (saving || validTimestamp) return true; return isEmpty(date); diff --git a/app/assets/javascripts/discourse/controllers/composer.js.es6 b/app/assets/javascripts/discourse/controllers/composer.js.es6 index ce4b607addf..818f70c0892 100644 --- a/app/assets/javascripts/discourse/controllers/composer.js.es6 +++ b/app/assets/javascripts/discourse/controllers/composer.js.es6 @@ -9,10 +9,10 @@ import Quote from "discourse/lib/quote"; import Draft from "discourse/models/draft"; import Composer from "discourse/models/composer"; import { - default as computed, + default as discourseComputed, observes, on -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import InputValidation from "discourse/models/input-validation"; import { getOwner } from "discourse-common/lib/get-owner"; import { @@ -110,7 +110,7 @@ export default Controller.extend({ this.set("showPreview", val === "true"); }, - @computed("showPreview") + @discourseComputed("showPreview") toggleText(showPreview) { return showPreview ? I18n.t("composer.hide_preview") @@ -127,7 +127,7 @@ export default Controller.extend({ } }, - @computed( + @discourseComputed( "model.replyingToTopic", "model.creatingPrivateMessage", "model.targetUsernames", @@ -184,7 +184,7 @@ export default Controller.extend({ topicModel: alias("topicController.model"), - @computed("model.canEditTitle", "model.creatingPrivateMessage") + @discourseComputed("model.canEditTitle", "model.creatingPrivateMessage") canEditTags(canEditTitle, creatingPrivateMessage) { return ( this.site.can_tag_topics && @@ -194,12 +194,12 @@ export default Controller.extend({ ); }, - @computed("model.editingPost", "model.topic.details.can_edit") + @discourseComputed("model.editingPost", "model.topic.details.can_edit") disableCategoryChooser(editingPost, canEditTopic) { return editingPost && !canEditTopic; }, - @computed("model.editingPost", "model.topic.canEditTags") + @discourseComputed("model.editingPost", "model.topic.canEditTags") disableTagsChooser(editingPost, canEditTags) { return editingPost && !canEditTags; }, @@ -208,12 +208,12 @@ export default Controller.extend({ canUnlistTopic: and("model.creatingTopic", "isStaffUser"), - @computed("canWhisper", "replyingToWhisper") + @discourseComputed("canWhisper", "replyingToWhisper") showWhisperToggle(canWhisper, replyingToWhisper) { return canWhisper && !replyingToWhisper; }, - @computed("model.post") + @discourseComputed("model.post") replyingToWhisper(repliedToPost) { return ( repliedToPost && repliedToPost.post_type === this.site.post_types.whisper @@ -222,14 +222,14 @@ export default Controller.extend({ isWhispering: or("replyingToWhisper", "model.whisper"), - @computed("model.action", "isWhispering") + @discourseComputed("model.action", "isWhispering") saveIcon(action, isWhispering) { if (isWhispering) return "far-eye-slash"; return SAVE_ICONS[action]; }, - @computed("model.action", "isWhispering", "model.editConflict") + @discourseComputed("model.action", "isWhispering", "model.editConflict") saveLabel(action, isWhispering, editConflict) { if (editConflict) return "composer.overwrite_edit"; else if (isWhispering) return "composer.create_whisper"; @@ -237,7 +237,7 @@ export default Controller.extend({ return SAVE_LABELS[action]; }, - @computed("isStaffUser", "model.action") + @discourseComputed("isStaffUser", "model.action") canWhisper(isStaffUser, action) { return ( this.siteSettings.enable_whispers && @@ -260,7 +260,7 @@ export default Controller.extend({ return option; }, - @computed("model.composeState", "model.creatingTopic", "model.post") + @discourseComputed("model.composeState", "model.creatingTopic", "model.post") popupMenuOptions(composeState) { if (composeState === "open" || composeState === "fullscreen") { const options = []; @@ -295,7 +295,7 @@ export default Controller.extend({ } }, - @computed("model.creatingPrivateMessage", "model.targetUsernames") + @discourseComputed("model.creatingPrivateMessage", "model.targetUsernames") showWarning(creatingPrivateMessage, usernames) { if (!this.get("currentUser.staff")) { return false; @@ -315,17 +315,17 @@ export default Controller.extend({ return creatingPrivateMessage; }, - @computed("model.topic.title") + @discourseComputed("model.topic.title") draftTitle(topicTitle) { return emojiUnescape(escapeExpression(topicTitle)); }, - @computed + @discourseComputed allowUpload() { return authorizesOneOrMoreExtensions(); }, - @computed() + @discourseComputed() uploadIcon: () => uploadIcon(), actions: { @@ -1054,7 +1054,7 @@ export default Controller.extend({ debounce(this, this._saveDraft, 2000); }, - @computed("model.categoryId", "lastValidatedAt") + @discourseComputed("model.categoryId", "lastValidatedAt") categoryValidation(categoryId, lastValidatedAt) { if (!this.siteSettings.allow_uncategorized_topics && !categoryId) { return InputValidation.create({ @@ -1065,7 +1065,7 @@ export default Controller.extend({ } }, - @computed("model.category", "model.tags", "lastValidatedAt") + @discourseComputed("model.category", "model.tags", "lastValidatedAt") tagValidation(category, tags, lastValidatedAt) { const tagsArray = tags || []; if ( @@ -1112,12 +1112,12 @@ export default Controller.extend({ $(".d-editor-input").autocomplete({ cancel: true }); }, - @computed("model.action") + @discourseComputed("model.action") canEdit(action) { return action === "edit" && this.currentUser.can_edit; }, - @computed("model.composeState") + @discourseComputed("model.composeState") visible(state) { return state && state !== "closed"; } diff --git a/app/assets/javascripts/discourse/controllers/create-account.js.es6 b/app/assets/javascripts/discourse/controllers/create-account.js.es6 index beb87d2d3a5..96abb66d22e 100644 --- a/app/assets/javascripts/discourse/controllers/create-account.js.es6 +++ b/app/assets/javascripts/discourse/controllers/create-account.js.es6 @@ -6,9 +6,9 @@ import { ajax } from "discourse/lib/ajax"; import ModalFunctionality from "discourse/mixins/modal-functionality"; import { setting } from "discourse/lib/computed"; import { - default as computed, + default as discourseComputed, on -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import { emailValid } from "discourse/lib/utilities"; import InputValidation from "discourse/models/input-validation"; import PasswordValidation from "discourse/mixins/password-validation"; @@ -58,7 +58,7 @@ export default Controller.extend( this._createUserFields(); }, - @computed( + @discourseComputed( "passwordRequired", "nameValidation.failed", "emailValidation.failed", @@ -82,7 +82,7 @@ export default Controller.extend( usernameRequired: not("authOptions.omit_username"), - @computed + @discourseComputed fullnameRequired() { return ( this.get("siteSettings.full_name_required") || @@ -90,12 +90,12 @@ export default Controller.extend( ); }, - @computed("authOptions.auth_provider") + @discourseComputed("authOptions.auth_provider") passwordRequired(authProvider) { return isEmpty(authProvider); }, - @computed + @discourseComputed disclaimerHtml() { return I18n.t("create_account.disclaimer", { tos_link: this.get("siteSettings.tos_url") || Discourse.getURL("/tos"), @@ -106,7 +106,7 @@ export default Controller.extend( }, // Check the email address - @computed("accountEmail", "rejectedEmails.[]") + @discourseComputed("accountEmail", "rejectedEmails.[]") emailValidation(email, rejectedEmails) { // If blank, fail without a reason if (isEmpty(email)) { @@ -149,7 +149,11 @@ export default Controller.extend( }); }, - @computed("accountEmail", "authOptions.email", "authOptions.email_valid") + @discourseComputed( + "accountEmail", + "authOptions.email", + "authOptions.email_valid" + ) emailValidated() { return ( this.get("authOptions.email") === this.accountEmail && @@ -187,7 +191,7 @@ export default Controller.extend( }.observes("emailValidation", "accountEmail"), // Determines whether at least one login button is enabled - @computed + @discourseComputed hasAtLeastOneLoginButton() { return findAll().length > 0; }, diff --git a/app/assets/javascripts/discourse/controllers/discovery/categories.js.es6 b/app/assets/javascripts/discourse/controllers/discovery/categories.js.es6 index 81542214ef9..69e59db2a96 100644 --- a/app/assets/javascripts/discourse/controllers/discovery/categories.js.es6 +++ b/app/assets/javascripts/discourse/controllers/discovery/categories.js.es6 @@ -1,6 +1,6 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { reads } from "@ember/object/computed"; import { inject } from "@ember/controller"; -import computed from "ember-addons/ember-computed-decorators"; import DiscoveryController from "discourse/controllers/discovery"; import { dasherize } from "@ember/string"; @@ -19,7 +19,7 @@ export default DiscoveryController.extend({ canEdit: reads("currentUser.staff"), - @computed("model.categories.[].featuredTopics.length") + @discourseComputed("model.categories.[].featuredTopics.length") latestTopicOnly() { return ( this.get("model.categories").find( @@ -28,7 +28,7 @@ export default DiscoveryController.extend({ ); }, - @computed("model.parentCategory") + @discourseComputed("model.parentCategory") categoryPageStyle(parentCategory) { let style = this.site.mobileView ? "categories_with_featured_topics" diff --git a/app/assets/javascripts/discourse/controllers/discovery/topics.js.es6 b/app/assets/javascripts/discourse/controllers/discovery/topics.js.es6 index 3d1d4b93484..9e4d81ceddc 100644 --- a/app/assets/javascripts/discourse/controllers/discovery/topics.js.es6 +++ b/app/assets/javascripts/discourse/controllers/discovery/topics.js.es6 @@ -1,3 +1,4 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { alias, not, gt, empty, notEmpty, equal } from "@ember/object/computed"; import { inject } from "@ember/controller"; import DiscoveryController from "discourse/controllers/discovery"; @@ -7,7 +8,6 @@ import { endWith } from "discourse/lib/computed"; import showModal from "discourse/lib/show-modal"; import { userPath } from "discourse/lib/url"; import TopicList from "discourse/models/topic-list"; -import computed from "ember-addons/ember-computed-decorators"; import Topic from "discourse/models/topic"; const controllerOpts = { @@ -99,17 +99,17 @@ const controllerOpts = { return filter.match(new RegExp(filterType + "$", "gi")) ? true : false; }, - @computed("model.filter", "model.topics.length") + @discourseComputed("model.filter", "model.topics.length") showDismissRead(filter, topicsLength) { return this.isFilterPage(filter, "unread") && topicsLength > 0; }, - @computed("model.filter", "model.topics.length") + @discourseComputed("model.filter", "model.topics.length") showResetNew(filter, topicsLength) { return filter === "new" && topicsLength > 0; }, - @computed("model.filter", "model.topics.length") + @discourseComputed("model.filter", "model.topics.length") showDismissAtTop(filter, topicsLength) { return ( (this.isFilterPage(filter, "new") || @@ -129,7 +129,7 @@ const controllerOpts = { weekly: equal("period", "weekly"), daily: equal("period", "daily"), - @computed("allLoaded", "model.topics.length") + @discourseComputed("allLoaded", "model.topics.length") footerMessage(allLoaded, topicsLength) { if (!allLoaded) return; @@ -152,7 +152,7 @@ const controllerOpts = { } }, - @computed("allLoaded", "model.topics.length") + @discourseComputed("allLoaded", "model.topics.length") footerEducation(allLoaded, topicsLength) { if (!allLoaded || topicsLength > 0 || !this.currentUser) { return; diff --git a/app/assets/javascripts/discourse/controllers/edit-category.js.es6 b/app/assets/javascripts/discourse/controllers/edit-category.js.es6 index 87c1378ffee..21b1e5c5ac2 100644 --- a/app/assets/javascripts/discourse/controllers/edit-category.js.es6 +++ b/app/assets/javascripts/discourse/controllers/edit-category.js.es6 @@ -4,10 +4,10 @@ import ModalFunctionality from "discourse/mixins/modal-functionality"; import DiscourseURL from "discourse/lib/url"; import { extractError } from "discourse/lib/ajax-error"; import { - default as computed, + default as discourseComputed, on, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; export default Controller.extend(ModalFunctionality, { selectedTab: null, @@ -39,7 +39,7 @@ export default Controller.extend(ModalFunctionality, { } }, - @computed("model.{id,name}") + @discourseComputed("model.{id,name}") title(model) { if (model.id) { return I18n.t("category.edit_dialog_title", { @@ -54,7 +54,7 @@ export default Controller.extend(ModalFunctionality, { this.set("modal.title", this.title); }, - @computed("saving", "model.name", "model.color", "deleting") + @discourseComputed("saving", "model.name", "model.color", "deleting") disabled(saving, name, color, deleting) { if (saving || deleting) return true; if (!name) return true; @@ -62,18 +62,18 @@ export default Controller.extend(ModalFunctionality, { return false; }, - @computed("saving", "deleting") + @discourseComputed("saving", "deleting") deleteDisabled(saving, deleting) { return deleting || saving || false; }, - @computed("name") + @discourseComputed("name") categoryName(name) { name = name || ""; return name.trim().length > 0 ? name : I18n.t("preview"); }, - @computed("saving", "model.id") + @discourseComputed("saving", "model.id") saveLabel(saving, id) { if (saving) return "saving"; return id ? "category.save" : "category.create"; diff --git a/app/assets/javascripts/discourse/controllers/edit-topic-timer.js.es6 b/app/assets/javascripts/discourse/controllers/edit-topic-timer.js.es6 index 7dc26c632c4..c1473509f29 100644 --- a/app/assets/javascripts/discourse/controllers/edit-topic-timer.js.es6 +++ b/app/assets/javascripts/discourse/controllers/edit-topic-timer.js.es6 @@ -1,6 +1,6 @@ import EmberObject from "@ember/object"; import Controller from "@ember/controller"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import ModalFunctionality from "discourse/mixins/modal-functionality"; import TopicTimer from "discourse/models/topic-timer"; import { popupAjaxError } from "discourse/lib/ajax-error"; @@ -17,7 +17,7 @@ export default Controller.extend(ModalFunctionality, { loading: false, isPublic: "true", - @computed("model.closed") + @discourseComputed("model.closed") publicTimerTypes(closed) { let types = [ { @@ -50,17 +50,21 @@ export default Controller.extend(ModalFunctionality, { return types; }, - @computed() + @discourseComputed() privateTimerTypes() { return [{ id: REMINDER_TYPE, name: I18n.t("topic.reminder.title") }]; }, - @computed("isPublic", "publicTimerTypes", "privateTimerTypes") + @discourseComputed("isPublic", "publicTimerTypes", "privateTimerTypes") selections(isPublic, publicTimerTypes, privateTimerTypes) { return "true" === isPublic ? publicTimerTypes : privateTimerTypes; }, - @computed("isPublic", "model.topic_timer", "model.private_topic_timer") + @discourseComputed( + "isPublic", + "model.topic_timer", + "model.private_topic_timer" + ) topicTimer(isPublic, publicTopicTimer, privateTopicTimer) { return "true" === isPublic ? publicTopicTimer : privateTopicTimer; }, diff --git a/app/assets/javascripts/discourse/controllers/email-login.js.es6 b/app/assets/javascripts/discourse/controllers/email-login.js.es6 index 78ab74f2394..01612c766f7 100644 --- a/app/assets/javascripts/discourse/controllers/email-login.js.es6 +++ b/app/assets/javascripts/discourse/controllers/email-login.js.es6 @@ -1,5 +1,5 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; -import computed from "ember-addons/ember-computed-decorators"; import { SECOND_FACTOR_METHODS } from "discourse/models/user"; import { ajax } from "discourse/lib/ajax"; import DiscourseURL from "discourse/lib/url"; @@ -9,12 +9,12 @@ import { getWebauthnCredential } from "discourse/lib/webauthn"; export default Controller.extend({ lockImageUrl: Discourse.getURL("/images/lock.svg"), - @computed("model") + @discourseComputed("model") secondFactorRequired(model) { return model.security_key_required || model.second_factor_required; }, - @computed("model") + @discourseComputed("model") secondFactorMethod(model) { return model.security_key_required ? SECOND_FACTOR_METHODS.SECURITY_KEY diff --git a/app/assets/javascripts/discourse/controllers/exception.js.es6 b/app/assets/javascripts/discourse/controllers/exception.js.es6 index 7967f2d24ab..f53eff91fd7 100644 --- a/app/assets/javascripts/discourse/controllers/exception.js.es6 +++ b/app/assets/javascripts/discourse/controllers/exception.js.es6 @@ -3,8 +3,8 @@ import { schedule } from "@ember/runloop"; import Controller from "@ember/controller"; import { on, - default as computed -} from "ember-addons/ember-computed-decorators"; + default as discourseComputed +} from "discourse-common/utils/decorators"; const ButtonBackBright = { classes: "btn-primary", @@ -33,7 +33,7 @@ export default Controller.extend({ thrown: null, lastTransition: null, - @computed + @discourseComputed isNetwork() { // never made it on the wire if (this.get("thrown.readyState") === 0) return true; @@ -60,7 +60,7 @@ export default Controller.extend({ this.set("loading", false); }, - @computed("isNetwork", "isServer", "isUnknown") + @discourseComputed("isNetwork", "isServer", "isUnknown") reason() { if (this.isNetwork) { return I18n.t("errors.reasons.network"); @@ -78,7 +78,7 @@ export default Controller.extend({ requestUrl: alias("thrown.requestedUrl"), - @computed("networkFixed", "isNetwork", "isServer", "isUnknown") + @discourseComputed("networkFixed", "isNetwork", "isServer", "isUnknown") desc() { if (this.networkFixed) { return I18n.t("errors.desc.network_fixed"); @@ -96,7 +96,7 @@ export default Controller.extend({ } }, - @computed("networkFixed", "isNetwork", "isServer", "isUnknown") + @discourseComputed("networkFixed", "isNetwork", "isServer", "isUnknown") enabledButtons() { if (this.networkFixed) { return [ButtonLoadPage]; diff --git a/app/assets/javascripts/discourse/controllers/feature-topic.js.es6 b/app/assets/javascripts/discourse/controllers/feature-topic.js.es6 index 48ca4037227..3535e355cec 100644 --- a/app/assets/javascripts/discourse/controllers/feature-topic.js.es6 +++ b/app/assets/javascripts/discourse/controllers/feature-topic.js.es6 @@ -1,9 +1,9 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { inject } from "@ember/controller"; import Controller from "@ember/controller"; import { ajax } from "discourse/lib/ajax"; import ModalFunctionality from "discourse/mixins/modal-functionality"; import { categoryLinkHTML } from "discourse/helpers/category-link"; -import computed from "ember-addons/ember-computed-decorators"; import InputValidation from "discourse/models/input-validation"; export default Controller.extend(ModalFunctionality, { @@ -23,12 +23,16 @@ export default Controller.extend(ModalFunctionality, { }); }, - @computed("model.category") + @discourseComputed("model.category") categoryLink(category) { return categoryLinkHTML(category, { allowUncategorized: true }); }, - @computed("categoryLink", "model.pinned_globally", "model.pinned_until") + @discourseComputed( + "categoryLink", + "model.pinned_globally", + "model.pinned_until" + ) unPinMessage(categoryLink, pinnedGlobally, pinnedUntil) { let name = "topic.feature_topic.unpin"; if (pinnedGlobally) name += "_globally"; @@ -38,12 +42,12 @@ export default Controller.extend(ModalFunctionality, { return I18n.t(name, { categoryLink, until }); }, - @computed("categoryLink") + @discourseComputed("categoryLink") pinMessage(categoryLink) { return I18n.t("topic.feature_topic.pin", { categoryLink }); }, - @computed("categoryLink", "pinnedInCategoryCount") + @discourseComputed("categoryLink", "pinnedInCategoryCount") alreadyPinnedMessage(categoryLink, count) { const key = count === 0 @@ -52,27 +56,27 @@ export default Controller.extend(ModalFunctionality, { return I18n.t(key, { categoryLink, count }); }, - @computed("parsedPinnedInCategoryUntil") + @discourseComputed("parsedPinnedInCategoryUntil") pinDisabled(parsedPinnedInCategoryUntil) { return !this._isDateValid(parsedPinnedInCategoryUntil); }, - @computed("parsedPinnedGloballyUntil") + @discourseComputed("parsedPinnedGloballyUntil") pinGloballyDisabled(parsedPinnedGloballyUntil) { return !this._isDateValid(parsedPinnedGloballyUntil); }, - @computed("model.pinnedInCategoryUntil") + @discourseComputed("model.pinnedInCategoryUntil") parsedPinnedInCategoryUntil(pinnedInCategoryUntil) { return this._parseDate(pinnedInCategoryUntil); }, - @computed("model.pinnedGloballyUntil") + @discourseComputed("model.pinnedGloballyUntil") parsedPinnedGloballyUntil(pinnedGloballyUntil) { return this._parseDate(pinnedGloballyUntil); }, - @computed("pinDisabled") + @discourseComputed("pinDisabled") pinInCategoryValidation(pinDisabled) { if (pinDisabled) { return InputValidation.create({ @@ -82,7 +86,7 @@ export default Controller.extend(ModalFunctionality, { } }, - @computed("pinGloballyDisabled") + @discourseComputed("pinGloballyDisabled") pinGloballyValidation(pinGloballyDisabled) { if (pinGloballyDisabled) { return InputValidation.create({ diff --git a/app/assets/javascripts/discourse/controllers/flag.js.es6 b/app/assets/javascripts/discourse/controllers/flag.js.es6 index 8f3c49ebc51..9eb3ae711df 100644 --- a/app/assets/javascripts/discourse/controllers/flag.js.es6 +++ b/app/assets/javascripts/discourse/controllers/flag.js.es6 @@ -1,10 +1,10 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { not } from "@ember/object/computed"; import EmberObject from "@ember/object"; import Controller from "@ember/controller"; import ModalFunctionality from "discourse/mixins/modal-functionality"; import ActionSummary from "discourse/models/action-summary"; import { MAX_MESSAGE_LENGTH } from "discourse/models/post-action-type"; -import computed from "ember-addons/ember-computed-decorators"; import optionalService from "discourse/lib/optional-service"; import { popupAjaxError } from "discourse/lib/ajax-error"; @@ -32,17 +32,17 @@ export default Controller.extend(ModalFunctionality, { } }, - @computed("spammerDetails.canDelete", "selected.name_key") + @discourseComputed("spammerDetails.canDelete", "selected.name_key") showDeleteSpammer(canDeleteSpammer, nameKey) { return canDeleteSpammer && nameKey === "spam"; }, - @computed("flagTopic") + @discourseComputed("flagTopic") title(flagTopic) { return flagTopic ? "flagging_topic.title" : "flagging.title"; }, - @computed("post", "flagTopic", "model.actions_summary.@each.can_act") + @discourseComputed("post", "flagTopic", "model.actions_summary.@each.can_act") flagsAvailable() { if (!this.flagTopic) { // flagging post @@ -77,7 +77,7 @@ export default Controller.extend(ModalFunctionality, { } }, - @computed("post", "flagTopic", "model.actions_summary.@each.can_act") + @discourseComputed("post", "flagTopic", "model.actions_summary.@each.can_act") staffFlagsAvailable() { return ( this.get("model.flagsAvailable") && @@ -85,7 +85,7 @@ export default Controller.extend(ModalFunctionality, { ); }, - @computed("selected.is_custom_flag", "message.length") + @discourseComputed("selected.is_custom_flag", "message.length") submitEnabled() { const selected = this.selected; if (!selected) return false; @@ -103,17 +103,17 @@ export default Controller.extend(ModalFunctionality, { submitDisabled: not("submitEnabled"), // Staff accounts can "take action" - @computed("flagTopic", "selected.is_custom_flag") + @discourseComputed("flagTopic", "selected.is_custom_flag") canTakeAction(flagTopic, isCustomFlag) { return !flagTopic && !isCustomFlag && this.currentUser.get("staff"); }, - @computed("selected.is_custom_flag") + @discourseComputed("selected.is_custom_flag") submitIcon(isCustomFlag) { return isCustomFlag ? "envelope" : "flag"; }, - @computed("selected.is_custom_flag", "flagTopic") + @discourseComputed("selected.is_custom_flag", "flagTopic") submitLabel(isCustomFlag, flagTopic) { if (isCustomFlag) { return flagTopic @@ -193,7 +193,7 @@ export default Controller.extend(ModalFunctionality, { } }, - @computed("flagTopic", "selected.name_key") + @discourseComputed("flagTopic", "selected.name_key") canSendWarning(flagTopic, nameKey) { return ( !flagTopic && this.currentUser.get("staff") && nameKey === "notify_user" diff --git a/app/assets/javascripts/discourse/controllers/forgot-password.js.es6 b/app/assets/javascripts/discourse/controllers/forgot-password.js.es6 index ae5d53679d7..0f667683add 100644 --- a/app/assets/javascripts/discourse/controllers/forgot-password.js.es6 +++ b/app/assets/javascripts/discourse/controllers/forgot-password.js.es6 @@ -1,16 +1,16 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { isEmpty } from "@ember/utils"; import Controller from "@ember/controller"; import { ajax } from "discourse/lib/ajax"; import ModalFunctionality from "discourse/mixins/modal-functionality"; import { escapeExpression } from "discourse/lib/utilities"; import { extractError } from "discourse/lib/ajax-error"; -import computed from "ember-addons/ember-computed-decorators"; export default Controller.extend(ModalFunctionality, { offerHelp: null, helpSeen: false, - @computed("accountEmailOrUsername", "disabled") + @discourseComputed("accountEmailOrUsername", "disabled") submitDisabled(accountEmailOrUsername, disabled) { return isEmpty((accountEmailOrUsername || "").trim()) || disabled; }, diff --git a/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 b/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 index 0b37bead270..d62a2a8177f 100644 --- a/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 +++ b/app/assets/javascripts/discourse/controllers/full-page-search.js.es6 @@ -10,9 +10,9 @@ import { isValidSearchTerm } from "discourse/lib/search"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import Category from "discourse/models/category"; import { escapeExpression } from "discourse/lib/utilities"; import { setTransient } from "discourse/lib/page-tracker"; @@ -47,17 +47,17 @@ export default Controller.extend({ page: 1, resultCount: null, - @computed("resultCount") + @discourseComputed("resultCount") hasResults(resultCount) { return (resultCount || 0) > 0; }, - @computed("q") + @discourseComputed("q") hasAutofocus(q) { return isEmpty(q); }, - @computed("q") + @discourseComputed("q") highlightQuery(q) { if (!q) { return; @@ -66,7 +66,7 @@ export default Controller.extend({ return _.reject(q.split(/\s+/), t => t === "l").join(" "); }, - @computed("skip_context", "context") + @discourseComputed("skip_context", "context") searchContextEnabled: { get(skip, context) { return (!skip && context) || skip === "false"; @@ -76,7 +76,7 @@ export default Controller.extend({ } }, - @computed("context", "context_id") + @discourseComputed("context", "context_id") searchContextDescription(context, id) { var name = id; if (context === "category") { @@ -90,18 +90,18 @@ export default Controller.extend({ return searchContextDescription(context, name); }, - @computed("q") + @discourseComputed("q") searchActive(q) { return isValidSearchTerm(q); }, - @computed("q") + @discourseComputed("q") noSortQ(q) { q = this.cleanTerm(q); return escapeExpression(q); }, - @computed("canCreateTopic", "siteSettings.login_required") + @discourseComputed("canCreateTopic", "siteSettings.login_required") showSuggestion(canCreateTopic, loginRequired) { return canCreateTopic || !loginRequired; }, @@ -146,7 +146,7 @@ export default Controller.extend({ } }, - @computed("q") + @discourseComputed("q") showLikeCount(q) { return q && q.indexOf("order:likes") > -1; }, @@ -160,7 +160,7 @@ export default Controller.extend({ } }, - @computed("q") + @discourseComputed("q") isPrivateMessage(q) { return ( q && @@ -177,7 +177,7 @@ export default Controller.extend({ this.set("application.showFooter", !this.loading); }, - @computed("resultCount", "noSortQ") + @discourseComputed("resultCount", "noSortQ") resultCountLabel(count, term) { const plus = count % 50 === 0 ? "+" : ""; return I18n.t("search.result_count", { count, plus, term }); @@ -188,17 +188,17 @@ export default Controller.extend({ this.set("resultCount", this.get("model.posts.length")); }, - @computed("hasResults") + @discourseComputed("hasResults") canBulkSelect(hasResults) { return this.currentUser && this.currentUser.staff && hasResults; }, - @computed("model.grouped_search_result.can_create_topic") + @discourseComputed("model.grouped_search_result.can_create_topic") canCreateTopic(userCanCreateTopic) { return this.currentUser && userCanCreateTopic; }, - @computed("page") + @discourseComputed("page") isLastPage(page) { return page === PAGE_LIMIT; }, diff --git a/app/assets/javascripts/discourse/controllers/grant-badge.js.es6 b/app/assets/javascripts/discourse/controllers/grant-badge.js.es6 index 287b6a69942..a3cd4e11e8d 100644 --- a/app/assets/javascripts/discourse/controllers/grant-badge.js.es6 +++ b/app/assets/javascripts/discourse/controllers/grant-badge.js.es6 @@ -1,6 +1,6 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { inject } from "@ember/controller"; import Controller from "@ember/controller"; -import computed from "ember-addons/ember-computed-decorators"; import { extractError } from "discourse/lib/ajax-error"; import ModalFunctionality from "discourse/mixins/modal-functionality"; import GrantBadgeController from "discourse/mixins/grant-badge-controller"; @@ -21,12 +21,12 @@ export default Controller.extend(ModalFunctionality, GrantBadgeController, { this.userBadges = []; }, - @computed("topicController.selectedPosts") + @discourseComputed("topicController.selectedPosts") post() { return this.get("topicController.selectedPosts")[0]; }, - @computed("post") + @discourseComputed("post") badgeReason(post) { const url = post.get("url"); const protocolAndHost = @@ -35,7 +35,7 @@ export default Controller.extend(ModalFunctionality, GrantBadgeController, { return url.indexOf("/") === 0 ? protocolAndHost + url : url; }, - @computed("saving", "selectedBadgeGrantable") + @discourseComputed("saving", "selectedBadgeGrantable") buttonDisabled(saving, selectedBadgeGrantable) { return saving || !selectedBadgeGrantable; }, diff --git a/app/assets/javascripts/discourse/controllers/group-activity-posts.js.es6 b/app/assets/javascripts/discourse/controllers/group-activity-posts.js.es6 index ed648a3dec7..d73bf08d2fc 100644 --- a/app/assets/javascripts/discourse/controllers/group-activity-posts.js.es6 +++ b/app/assets/javascripts/discourse/controllers/group-activity-posts.js.es6 @@ -1,6 +1,6 @@ import { inject } from "@ember/controller"; import Controller from "@ember/controller"; -import { observes } from "ember-addons/ember-computed-decorators"; +import { observes } from "discourse-common/utils/decorators"; import { fmt } from "discourse/lib/computed"; export default Controller.extend({ diff --git a/app/assets/javascripts/discourse/controllers/group-add-members.js.es6 b/app/assets/javascripts/discourse/controllers/group-add-members.js.es6 index 53c1327c423..9b1f8881139 100644 --- a/app/assets/javascripts/discourse/controllers/group-add-members.js.es6 +++ b/app/assets/javascripts/discourse/controllers/group-add-members.js.es6 @@ -1,6 +1,6 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { isEmpty } from "@ember/utils"; import Controller from "@ember/controller"; -import computed from "ember-addons/ember-computed-decorators"; import { extractError } from "discourse/lib/ajax-error"; import ModalFunctionality from "discourse/mixins/modal-functionality"; @@ -8,7 +8,7 @@ export default Controller.extend(ModalFunctionality, { loading: false, setAsOwner: false, - @computed("model.usernames", "loading") + @discourseComputed("model.usernames", "loading") disableAddButton(usernames, loading) { return loading || !usernames || !(usernames.length > 0); }, diff --git a/app/assets/javascripts/discourse/controllers/group-bulk-add.js.es6 b/app/assets/javascripts/discourse/controllers/group-bulk-add.js.es6 index bef9d535f41..0310d4e3094 100644 --- a/app/assets/javascripts/discourse/controllers/group-bulk-add.js.es6 +++ b/app/assets/javascripts/discourse/controllers/group-bulk-add.js.es6 @@ -1,6 +1,6 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { isEmpty } from "@ember/utils"; import Controller from "@ember/controller"; -import computed from "ember-addons/ember-computed-decorators"; import { extractError } from "discourse/lib/ajax-error"; import ModalFunctionality from "discourse/mixins/modal-functionality"; import { ajax } from "discourse/lib/ajax"; @@ -8,7 +8,7 @@ import { ajax } from "discourse/lib/ajax"; export default Controller.extend(ModalFunctionality, { loading: false, - @computed("input", "loading", "result") + @discourseComputed("input", "loading", "result") disableAddButton(input, loading, result) { return loading || isEmpty(input) || input.length <= 0 || result; }, diff --git a/app/assets/javascripts/discourse/controllers/group-index.js.es6 b/app/assets/javascripts/discourse/controllers/group-index.js.es6 index 2cc94f9f4e2..05df6fa12ed 100644 --- a/app/assets/javascripts/discourse/controllers/group-index.js.es6 +++ b/app/assets/javascripts/discourse/controllers/group-index.js.es6 @@ -4,9 +4,9 @@ import Controller from "@ember/controller"; import { popupAjaxError } from "discourse/lib/ajax-error"; import Group from "discourse/models/group"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import debounce from "discourse/lib/debounce"; export default Controller.extend({ @@ -43,22 +43,22 @@ export default Controller.extend({ } }, - @computed("order", "desc", "filter") + @discourseComputed("order", "desc", "filter") memberParams(order, desc, filter) { return { order, desc, filter }; }, - @computed("model.members") + @discourseComputed("model.members") hasMembers(members) { return members && members.length > 0; }, - @computed("model") + @discourseComputed("model") canManageGroup(model) { return this.currentUser && this.currentUser.canManageGroup(model); }, - @computed + @discourseComputed filterPlaceholder() { if (this.currentUser && this.currentUser.admin) { return "groups.members.filter_placeholder_admin"; diff --git a/app/assets/javascripts/discourse/controllers/group-manage-logs.js.es6 b/app/assets/javascripts/discourse/controllers/group-manage-logs.js.es6 index f5c3ba48f35..3aaf3fdb878 100644 --- a/app/assets/javascripts/discourse/controllers/group-manage-logs.js.es6 +++ b/app/assets/javascripts/discourse/controllers/group-manage-logs.js.es6 @@ -2,9 +2,9 @@ import { inject } from "@ember/controller"; import EmberObject from "@ember/object"; import Controller from "@ember/controller"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; export default Controller.extend({ group: inject(), @@ -17,7 +17,7 @@ export default Controller.extend({ this.set("filters", EmberObject.create()); }, - @computed( + @discourseComputed( "filters.action", "filters.acting_user", "filters.target_user", diff --git a/app/assets/javascripts/discourse/controllers/group-manage.js.es6 b/app/assets/javascripts/discourse/controllers/group-manage.js.es6 index dab05b6dbc6..b99f8a70f98 100644 --- a/app/assets/javascripts/discourse/controllers/group-manage.js.es6 +++ b/app/assets/javascripts/discourse/controllers/group-manage.js.es6 @@ -1,11 +1,11 @@ import { inject as service } from "@ember/service"; import Controller from "@ember/controller"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; export default Controller.extend({ router: service(), - @computed("model.automatic") + @discourseComputed("model.automatic") tabs(automatic) { const defaultTabs = [ { route: "group.manage.profile", title: "groups.manage.profile.title" }, diff --git a/app/assets/javascripts/discourse/controllers/group-requests.js.es6 b/app/assets/javascripts/discourse/controllers/group-requests.js.es6 index 246fd0cf9a9..5be58b2d604 100644 --- a/app/assets/javascripts/discourse/controllers/group-requests.js.es6 +++ b/app/assets/javascripts/discourse/controllers/group-requests.js.es6 @@ -4,9 +4,9 @@ import { ajax } from "discourse/lib/ajax"; import { popupAjaxError } from "discourse/lib/ajax-error"; import Group from "discourse/models/group"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import debounce from "discourse/lib/debounce"; export default Controller.extend({ @@ -70,12 +70,12 @@ export default Controller.extend({ }); }, - @computed("model.requesters") + @discourseComputed("model.requesters") hasRequesters(requesters) { return requesters && requesters.length > 0; }, - @computed + @discourseComputed filterPlaceholder() { if (this.currentUser && this.currentUser.admin) { return "groups.members.filter_placeholder_admin"; diff --git a/app/assets/javascripts/discourse/controllers/group.js.es6 b/app/assets/javascripts/discourse/controllers/group.js.es6 index 322e7ab12c6..bd79392b857 100644 --- a/app/assets/javascripts/discourse/controllers/group.js.es6 +++ b/app/assets/javascripts/discourse/controllers/group.js.es6 @@ -1,7 +1,7 @@ import EmberObject from "@ember/object"; import { inject } from "@ember/controller"; import Controller from "@ember/controller"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; const Tab = EmberObject.extend({ init() { @@ -18,7 +18,7 @@ export default Controller.extend({ showing: "members", destroying: null, - @computed( + @discourseComputed( "showMessages", "model.user_count", "canManageGroup", @@ -68,7 +68,7 @@ export default Controller.extend({ return defaultTabs; }, - @computed("model.is_group_user") + @discourseComputed("model.is_group_user") showMessages(isGroupUser) { if (!this.siteSettings.enable_personal_messages) { return false; @@ -77,17 +77,17 @@ export default Controller.extend({ return isGroupUser || (this.currentUser && this.currentUser.admin); }, - @computed("model.is_group_owner", "model.automatic") + @discourseComputed("model.is_group_owner", "model.automatic") canEditGroup(isGroupOwner, automatic) { return !automatic && isGroupOwner; }, - @computed("model.displayName", "model.full_name") + @discourseComputed("model.displayName", "model.full_name") groupName(displayName, fullName) { return (fullName || displayName).capitalize(); }, - @computed( + @discourseComputed( "model.name", "model.flair_url", "model.flair_bg_color", @@ -102,12 +102,12 @@ export default Controller.extend({ }; }, - @computed("model.messageable") + @discourseComputed("model.messageable") displayGroupMessageButton(messageable) { return this.currentUser && messageable; }, - @computed("model", "model.automatic") + @discourseComputed("model", "model.automatic") canManageGroup(model, automatic) { return ( this.currentUser && diff --git a/app/assets/javascripts/discourse/controllers/groups-index.js.es6 b/app/assets/javascripts/discourse/controllers/groups-index.js.es6 index a466572b263..9758b30ad50 100644 --- a/app/assets/javascripts/discourse/controllers/groups-index.js.es6 +++ b/app/assets/javascripts/discourse/controllers/groups-index.js.es6 @@ -2,9 +2,9 @@ import { inject } from "@ember/controller"; import Controller from "@ember/controller"; import debounce from "discourse/lib/debounce"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; export default Controller.extend({ application: inject(), @@ -14,7 +14,7 @@ export default Controller.extend({ filter: "", type: null, - @computed("model.extras.type_filters") + @discourseComputed("model.extras.type_filters") types(typeFilters) { const types = []; diff --git a/app/assets/javascripts/discourse/controllers/history.js.es6 b/app/assets/javascripts/discourse/controllers/history.js.es6 index 69ea502d41b..79203ed563c 100644 --- a/app/assets/javascripts/discourse/controllers/history.js.es6 +++ b/app/assets/javascripts/discourse/controllers/history.js.es6 @@ -1,10 +1,10 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { alias, gt, not, or, equal } from "@ember/object/computed"; import Controller from "@ember/controller"; import ModalFunctionality from "discourse/mixins/modal-functionality"; import { categoryBadgeHTML } from "discourse/helpers/category-link"; -import computed from "ember-addons/ember-computed-decorators"; import { propertyGreaterThan, propertyLessThan } from "discourse/lib/computed"; -import { on, observes } from "ember-addons/ember-computed-decorators"; +import { on, observes } from "discourse-common/utils/decorators"; import { sanitizeAsync } from "discourse/lib/text"; import { iconHTML } from "discourse-common/lib/icon-library"; @@ -39,7 +39,11 @@ export default Controller.extend(ModalFunctionality, { previousTagChanges: customTagArray("model.tags_changes.previous"), currentTagChanges: customTagArray("model.tags_changes.current"), - @computed("previousVersion", "model.current_version", "model.version_count") + @discourseComputed( + "previousVersion", + "model.current_version", + "model.version_count" + ) revisionsText(previous, current, total) { return I18n.t( "post.revisions.controls.comparing_previous_to_current_out_of_total", @@ -101,17 +105,17 @@ export default Controller.extend(ModalFunctionality, { }); }, - @computed("model.created_at") + @discourseComputed("model.created_at") createdAtDate(createdAt) { return moment(createdAt).format("LLLL"); }, - @computed("model.current_version") + @discourseComputed("model.current_version") previousVersion(current) { return current - 1; }, - @computed("model.current_revision", "model.previous_revision") + @discourseComputed("model.current_revision", "model.previous_revision") displayGoToPrevious(current, prev) { return prev && current > prev; }, @@ -140,17 +144,17 @@ export default Controller.extend(ModalFunctionality, { loadNextDisabled: or("loading", "hideGoToNext"), loadLastDisabled: or("loading", "hideGoToLast"), - @computed("model.previous_hidden") + @discourseComputed("model.previous_hidden") displayShow(prevHidden) { return prevHidden && this.currentUser && this.currentUser.get("staff"); }, - @computed("model.previous_hidden") + @discourseComputed("model.previous_hidden") displayHide(prevHidden) { return !prevHidden && this.currentUser && this.currentUser.get("staff"); }, - @computed( + @discourseComputed( "model.last_revision", "model.current_revision", "model.can_edit", @@ -160,19 +164,23 @@ export default Controller.extend(ModalFunctionality, { return !!(canEdit && topicController && lastRevision === currentRevision); }, - @computed("model.wiki") + @discourseComputed("model.wiki") editButtonLabel(wiki) { return `post.revisions.controls.${wiki ? "edit_wiki" : "edit_post"}`; }, - @computed() + @discourseComputed() displayRevert() { return this.currentUser && this.currentUser.get("staff"); }, isEitherRevisionHidden: or("model.previous_hidden", "model.current_hidden"), - @computed("model.previous_hidden", "model.current_hidden", "displayingInline") + @discourseComputed( + "model.previous_hidden", + "model.current_hidden", + "displayingInline" + ) hiddenClasses(prevHidden, currentHidden, displayingInline) { if (displayingInline) { return this.isEitherRevisionHidden ? "hidden-revision-either" : null; @@ -192,22 +200,22 @@ export default Controller.extend(ModalFunctionality, { displayingSideBySide: equal("viewMode", "side_by_side"), displayingSideBySideMarkdown: equal("viewMode", "side_by_side_markdown"), - @computed("displayingInline") + @discourseComputed("displayingInline") inlineClass(displayingInline) { return displayingInline ? "btn-danger" : "btn-flat"; }, - @computed("displayingSideBySide") + @discourseComputed("displayingSideBySide") sideBySideClass(displayingSideBySide) { return displayingSideBySide ? "btn-danger" : "btn-flat"; }, - @computed("displayingSideBySideMarkdown") + @discourseComputed("displayingSideBySideMarkdown") sideBySideMarkdownClass(displayingSideBySideMarkdown) { return displayingSideBySideMarkdown ? "btn-danger" : "btn-flat"; }, - @computed("model.category_id_changes") + @discourseComputed("model.category_id_changes") previousCategory(changes) { if (changes) { var category = Discourse.Category.findById(changes["previous"]); @@ -215,7 +223,7 @@ export default Controller.extend(ModalFunctionality, { } }, - @computed("model.category_id_changes") + @discourseComputed("model.category_id_changes") currentCategory(changes) { if (changes) { var category = Discourse.Category.findById(changes["current"]); @@ -223,12 +231,12 @@ export default Controller.extend(ModalFunctionality, { } }, - @computed("model.wiki_changes") + @discourseComputed("model.wiki_changes") wikiDisabled(changes) { return changes && !changes["current"]; }, - @computed("model.post_type_changes") + @discourseComputed("model.post_type_changes") postTypeDisabled(changes) { return ( changes && @@ -236,7 +244,7 @@ export default Controller.extend(ModalFunctionality, { ); }, - @computed("viewMode", "model.title_changes") + @discourseComputed("viewMode", "model.title_changes") titleDiff(viewMode) { if (viewMode === "side_by_side_markdown") { viewMode = "side_by_side"; diff --git a/app/assets/javascripts/discourse/controllers/invites-show.js.es6 b/app/assets/javascripts/discourse/controllers/invites-show.js.es6 index 1b1c99de7de..f6e0ced4fd9 100644 --- a/app/assets/javascripts/discourse/controllers/invites-show.js.es6 +++ b/app/assets/javascripts/discourse/controllers/invites-show.js.es6 @@ -1,7 +1,7 @@ import { isEmpty } from "@ember/utils"; import { alias, notEmpty } from "@ember/object/computed"; import Controller from "@ember/controller"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import getUrl from "discourse-common/lib/get-url"; import DiscourseURL from "discourse/lib/url"; import { ajax } from "discourse/lib/ajax"; @@ -26,24 +26,24 @@ export default Controller.extend( userFields: null, inviteImageUrl: getUrl("/images/envelope.svg"), - @computed + @discourseComputed welcomeTitle() { return I18n.t("invites.welcome_to", { site_name: this.siteSettings.title }); }, - @computed("email") + @discourseComputed("email") yourEmailMessage(email) { return I18n.t("invites.your_email", { email: email }); }, - @computed + @discourseComputed externalAuthsEnabled() { return findLoginMethods().length > 0; }, - @computed( + @discourseComputed( "usernameValidation.failed", "passwordValidation.failed", "nameValidation.failed", @@ -58,7 +58,7 @@ export default Controller.extend( return usernameFailed || passwordFailed || nameFailed || userFieldsFailed; }, - @computed + @discourseComputed fullnameRequired() { return ( this.siteSettings.full_name_required || this.siteSettings.enable_names diff --git a/app/assets/javascripts/discourse/controllers/login.js.es6 b/app/assets/javascripts/discourse/controllers/login.js.es6 index 19fbc21fb73..701d4102568 100644 --- a/app/assets/javascripts/discourse/controllers/login.js.es6 +++ b/app/assets/javascripts/discourse/controllers/login.js.es6 @@ -1,3 +1,4 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { isEmpty } from "@ember/utils"; import { alias, or, readOnly } from "@ember/object/computed"; import EmberObject from "@ember/object"; @@ -13,7 +14,6 @@ import { findAll } from "discourse/models/login-method"; import { escape } from "pretty-text/sanitizer"; import { escapeExpression, areCookiesEnabled } from "discourse/lib/utilities"; import { extractError } from "discourse/lib/ajax-error"; -import computed from "ember-addons/ember-computed-decorators"; import { SECOND_FACTOR_METHODS } from "discourse/models/user"; import { getWebauthnCredential } from "discourse/lib/webauthn"; @@ -55,17 +55,17 @@ export default Controller.extend(ModalFunctionality, { }); }, - @computed("showSecondFactor", "showSecurityKey") + @discourseComputed("showSecondFactor", "showSecurityKey") credentialsClass(showSecondFactor, showSecurityKey) { return showSecondFactor || showSecurityKey ? "hidden" : ""; }, - @computed("showSecondFactor", "showSecurityKey") + @discourseComputed("showSecondFactor", "showSecurityKey") secondFactorClass(showSecondFactor, showSecurityKey) { return showSecondFactor || showSecurityKey ? "" : "hidden"; }, - @computed("awaitingApproval", "hasAtLeastOneLoginButton") + @discourseComputed("awaitingApproval", "hasAtLeastOneLoginButton") modalBodyClasses(awaitingApproval, hasAtLeastOneLoginButton) { const classes = ["login-modal"]; if (awaitingApproval) classes.push("awaiting-approval"); @@ -73,31 +73,31 @@ export default Controller.extend(ModalFunctionality, { return classes.join(" "); }, - @computed("showSecondFactor", "showSecurityKey") + @discourseComputed("showSecondFactor", "showSecurityKey") disableLoginFields(showSecondFactor, showSecurityKey) { return showSecondFactor || showSecurityKey; }, - @computed("canLoginLocalWithEmail") + @discourseComputed("canLoginLocalWithEmail") hasAtLeastOneLoginButton(canLoginLocalWithEmail) { return findAll().length > 0 || canLoginLocalWithEmail; }, - @computed("loggingIn") + @discourseComputed("loggingIn") loginButtonLabel(loggingIn) { return loggingIn ? "login.logging_in" : "login.title"; }, loginDisabled: or("loggingIn", "loggedIn"), - @computed("loggingIn", "application.canSignUp") + @discourseComputed("loggingIn", "application.canSignUp") showSignupLink(loggingIn, canSignUp) { return canSignUp && !loggingIn; }, showSpinner: readOnly("loggingIn"), - @computed("canLoginLocalWithEmail", "processingEmailLink") + @discourseComputed("canLoginLocalWithEmail", "processingEmailLink") showLoginWithEmailLink(canLoginLocalWithEmail, processingEmailLink) { return canLoginLocalWithEmail && !processingEmailLink; }, diff --git a/app/assets/javascripts/discourse/controllers/move-to-topic.js.es6 b/app/assets/javascripts/discourse/controllers/move-to-topic.js.es6 index c8934801cb0..609ae2cf2db 100644 --- a/app/assets/javascripts/discourse/controllers/move-to-topic.js.es6 +++ b/app/assets/javascripts/discourse/controllers/move-to-topic.js.es6 @@ -6,7 +6,7 @@ import Controller from "@ember/controller"; import ModalFunctionality from "discourse/mixins/modal-functionality"; import { movePosts, mergeTopic } from "discourse/models/topic"; import DiscourseURL from "discourse/lib/url"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import { extractError } from "discourse/lib/ajax-error"; export default Controller.extend(ModalFunctionality, { @@ -46,12 +46,12 @@ export default Controller.extend(ModalFunctionality, { selectedAllPosts: alias("topicController.selectedAllPosts"), selectedPosts: alias("topicController.selectedPosts"), - @computed("saving", "selectedTopicId", "topicName") + @discourseComputed("saving", "selectedTopicId", "topicName") buttonDisabled(saving, selectedTopicId, topicName) { return saving || (isEmpty(selectedTopicId) && isEmpty(topicName)); }, - @computed( + @discourseComputed( "saving", "newTopic", "existingTopic", @@ -95,7 +95,7 @@ export default Controller.extend(ModalFunctionality, { } }, - @computed("selectedAllPosts", "selectedPosts", "selectedPosts.[]") + @discourseComputed("selectedAllPosts", "selectedPosts", "selectedPosts.[]") canSplitTopic(selectedAllPosts, selectedPosts) { return ( !selectedAllPosts && @@ -105,7 +105,7 @@ export default Controller.extend(ModalFunctionality, { ); }, - @computed("canSplitTopic") + @discourseComputed("canSplitTopic") canSplitToPM(canSplitTopic) { return canSplitTopic && (this.currentUser && this.currentUser.admin); }, diff --git a/app/assets/javascripts/discourse/controllers/navigation/categories.js.es6 b/app/assets/javascripts/discourse/controllers/navigation/categories.js.es6 index 216ca0448f7..db7ac2bae97 100644 --- a/app/assets/javascripts/discourse/controllers/navigation/categories.js.es6 +++ b/app/assets/javascripts/discourse/controllers/navigation/categories.js.es6 @@ -1,11 +1,14 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { inject } from "@ember/controller"; import NavigationDefaultController from "discourse/controllers/navigation/default"; -import computed from "ember-addons/ember-computed-decorators"; export default NavigationDefaultController.extend({ discoveryCategories: inject("discovery/categories"), - @computed("discoveryCategories.model", "discoveryCategories.model.draft") + @discourseComputed( + "discoveryCategories.model", + "discoveryCategories.model.draft" + ) draft() { return this.get("discoveryCategories.model.draft"); } diff --git a/app/assets/javascripts/discourse/controllers/navigation/default.js.es6 b/app/assets/javascripts/discourse/controllers/navigation/default.js.es6 index 9d4d0519745..23220761c10 100644 --- a/app/assets/javascripts/discourse/controllers/navigation/default.js.es6 +++ b/app/assets/javascripts/discourse/controllers/navigation/default.js.es6 @@ -1,12 +1,12 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { inject } from "@ember/controller"; import Controller from "@ember/controller"; -import computed from "ember-addons/ember-computed-decorators"; export default Controller.extend({ discovery: inject(), discoveryTopics: inject("discovery/topics"), - @computed("discoveryTopics.model", "discoveryTopics.model.draft") + @discourseComputed("discoveryTopics.model", "discoveryTopics.model.draft") draft: function() { return this.get("discoveryTopics.model.draft"); } diff --git a/app/assets/javascripts/discourse/controllers/password-reset.js.es6 b/app/assets/javascripts/discourse/controllers/password-reset.js.es6 index b7a4545aed2..7f3718482e2 100644 --- a/app/assets/javascripts/discourse/controllers/password-reset.js.es6 +++ b/app/assets/javascripts/discourse/controllers/password-reset.js.es6 @@ -1,6 +1,6 @@ import { alias, or } from "@ember/object/computed"; import Controller from "@ember/controller"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import DiscourseURL from "discourse/lib/url"; import { ajax } from "discourse/lib/ajax"; import PasswordValidation from "discourse/mixins/password-validation"; @@ -18,7 +18,7 @@ export default Controller.extend(PasswordValidation, { "model.second_factor_required", "model.security_key_required" ), - @computed("model.security_key_required") + @discourseComputed("model.security_key_required") secondFactorMethod(security_key_required) { return security_key_required ? SECOND_FACTOR_METHODS.SECURITY_KEY @@ -30,14 +30,14 @@ export default Controller.extend(PasswordValidation, { requiresApproval: false, redirected: false, - @computed() + @discourseComputed() continueButtonText() { return I18n.t("password_reset.continue", { site_name: this.siteSettings.title }); }, - @computed("redirectTo") + @discourseComputed("redirectTo") redirectHref(redirectTo) { return Discourse.getURL(redirectTo || "/"); }, diff --git a/app/assets/javascripts/discourse/controllers/preferences/account.js.es6 b/app/assets/javascripts/discourse/controllers/preferences/account.js.es6 index e30386afdff..337cac9db18 100644 --- a/app/assets/javascripts/discourse/controllers/preferences/account.js.es6 +++ b/app/assets/javascripts/discourse/controllers/preferences/account.js.es6 @@ -3,7 +3,7 @@ import { not, or, gt } from "@ember/object/computed"; import Controller from "@ember/controller"; import { iconHTML } from "discourse-common/lib/icon-library"; import CanCheckEmails from "discourse/mixins/can-check-emails"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import PreferencesTabController from "discourse/mixins/preferences-tab-controller"; import { propertyNotEqual, setting } from "discourse/lib/computed"; import { popupAjaxError } from "discourse/lib/ajax-error"; @@ -43,7 +43,7 @@ export default Controller.extend(CanCheckEmails, PreferencesTabController, { this.set("passwordProgress", null); }, - @computed() + @discourseComputed() nameInstructions() { return I18n.t( this.siteSettings.full_name_required @@ -54,7 +54,7 @@ export default Controller.extend(CanCheckEmails, PreferencesTabController, { canSelectTitle: gt("model.availableTitles.length", 0), - @computed("model.filteredGroups") + @discourseComputed("model.filteredGroups") canSelectPrimaryGroup(primaryGroupOptions) { return ( primaryGroupOptions.length > 0 && @@ -62,7 +62,7 @@ export default Controller.extend(CanCheckEmails, PreferencesTabController, { ); }, - @computed("model.is_anonymous") + @discourseComputed("model.is_anonymous") canChangePassword(isAnonymous) { if (isAnonymous) { return false; @@ -73,12 +73,12 @@ export default Controller.extend(CanCheckEmails, PreferencesTabController, { } }, - @computed("model.associated_accounts") + @discourseComputed("model.associated_accounts") associatedAccountsLoaded(associatedAccounts) { return typeof associatedAccounts !== "undefined"; }, - @computed("model.associated_accounts.[]") + @discourseComputed("model.associated_accounts.[]") authProviders(accounts) { const allMethods = findAll(); @@ -94,7 +94,7 @@ export default Controller.extend(CanCheckEmails, PreferencesTabController, { disableConnectButtons: propertyNotEqual("model.id", "currentUser.id"), - @computed( + @discourseComputed( "model.second_factor_enabled", "canCheckEmails", "model.is_anonymous" @@ -110,7 +110,7 @@ export default Controller.extend(CanCheckEmails, PreferencesTabController, { return findAll().length > 0; }, - @computed("showAllAuthTokens", "model.user_auth_tokens") + @discourseComputed("showAllAuthTokens", "model.user_auth_tokens") authTokens(showAllAuthTokens, tokens) { tokens.sort((a, b) => { if (a.is_active) { diff --git a/app/assets/javascripts/discourse/controllers/preferences/categories.js.es6 b/app/assets/javascripts/discourse/controllers/preferences/categories.js.es6 index 8f86974e386..4628234524d 100644 --- a/app/assets/javascripts/discourse/controllers/preferences/categories.js.es6 +++ b/app/assets/javascripts/discourse/controllers/preferences/categories.js.es6 @@ -1,8 +1,8 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { or } from "@ember/object/computed"; import Controller from "@ember/controller"; import PreferencesTabController from "discourse/mixins/preferences-tab-controller"; import { popupAjaxError } from "discourse/lib/ajax-error"; -import computed from "ember-addons/ember-computed-decorators"; export default Controller.extend(PreferencesTabController, { init() { @@ -16,7 +16,7 @@ export default Controller.extend(PreferencesTabController, { ]; }, - @computed( + @discourseComputed( "model.watchedCategories", "model.watchedFirstPostCategories", "model.trackedCategories", @@ -26,12 +26,12 @@ export default Controller.extend(PreferencesTabController, { return [].concat(watched, watchedFirst, tracked, muted).filter(t => t); }, - @computed + @discourseComputed canSee() { return this.get("currentUser.id") === this.get("model.id"); }, - @computed("siteSettings.remove_muted_tags_from_latest") + @discourseComputed("siteSettings.remove_muted_tags_from_latest") hideMutedTags() { return this.siteSettings.remove_muted_tags_from_latest !== "never"; }, diff --git a/app/assets/javascripts/discourse/controllers/preferences/email.js.es6 b/app/assets/javascripts/discourse/controllers/preferences/email.js.es6 index c25db36a437..94a13ae5961 100644 --- a/app/assets/javascripts/discourse/controllers/preferences/email.js.es6 +++ b/app/assets/javascripts/discourse/controllers/preferences/email.js.es6 @@ -1,9 +1,9 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { empty, or } from "@ember/object/computed"; import Controller from "@ember/controller"; import { propertyEqual } from "discourse/lib/computed"; import InputValidation from "discourse/models/input-validation"; import { emailValid } from "discourse/lib/utilities"; -import computed from "ember-addons/ember-computed-decorators"; export default Controller.extend({ taken: false, @@ -24,23 +24,23 @@ export default Controller.extend({ unchanged: propertyEqual("newEmailLower", "currentUser.email"), - @computed("newEmail") + @discourseComputed("newEmail") newEmailLower(newEmail) { return newEmail.toLowerCase().trim(); }, - @computed("saving") + @discourseComputed("saving") saveButtonText(saving) { if (saving) return I18n.t("saving"); return I18n.t("user.change"); }, - @computed("newEmail") + @discourseComputed("newEmail") invalidEmail(newEmail) { return !emailValid(newEmail); }, - @computed("invalidEmail") + @discourseComputed("invalidEmail") emailValidation(invalidEmail) { if (invalidEmail) { return InputValidation.create({ diff --git a/app/assets/javascripts/discourse/controllers/preferences/emails.js.es6 b/app/assets/javascripts/discourse/controllers/preferences/emails.js.es6 index a2001457e52..008ed9c8cd0 100644 --- a/app/assets/javascripts/discourse/controllers/preferences/emails.js.es6 +++ b/app/assets/javascripts/discourse/controllers/preferences/emails.js.es6 @@ -1,7 +1,7 @@ import { equal } from "@ember/object/computed"; import Controller from "@ember/controller"; import PreferencesTabController from "discourse/mixins/preferences-tab-controller"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import { popupAjaxError } from "discourse/lib/ajax-error"; const EMAIL_LEVELS = { @@ -60,7 +60,7 @@ export default Controller.extend(PreferencesTabController, { ]; }, - @computed() + @discourseComputed() frequencyEstimate() { var estimate = this.get("model.mailing_list_posts_per_day"); if (!estimate || estimate < 2) { @@ -72,7 +72,7 @@ export default Controller.extend(PreferencesTabController, { } }, - @computed() + @discourseComputed() mailingListModeOptions() { return [ { name: this.frequencyEstimate, value: 1 }, @@ -80,7 +80,7 @@ export default Controller.extend(PreferencesTabController, { ]; }, - @computed() + @discourseComputed() emailFrequencyInstructions() { if (this.siteSettings.email_time_window_mins) { return I18n.t("user.email.frequency", { diff --git a/app/assets/javascripts/discourse/controllers/preferences/interface.js.es6 b/app/assets/javascripts/discourse/controllers/preferences/interface.js.es6 index 9ef7280fc28..370d5b9a4da 100644 --- a/app/assets/javascripts/discourse/controllers/preferences/interface.js.es6 +++ b/app/assets/javascripts/discourse/controllers/preferences/interface.js.es6 @@ -3,9 +3,9 @@ import Controller from "@ember/controller"; import PreferencesTabController from "discourse/mixins/preferences-tab-controller"; import { setDefaultHomepage } from "discourse/lib/utilities"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import { listThemes, previewTheme, @@ -30,7 +30,7 @@ const TEXT_SIZES = ["smaller", "normal", "larger", "largest"]; const TITLE_COUNT_MODES = ["notifications", "contextual"]; export default Controller.extend(PreferencesTabController, { - @computed("makeThemeDefault") + @discourseComputed("makeThemeDefault") saveAttrNames(makeDefault) { let attrs = [ "locale", @@ -55,43 +55,43 @@ export default Controller.extend(PreferencesTabController, { preferencesController: inject("preferences"), - @computed() + @discourseComputed() isiPad() { // TODO: remove this preference checkbox when iOS adoption > 90% // (currently only applies to iOS 12 and below) return isiPad() && !iOSWithVisualViewport(); }, - @computed() + @discourseComputed() disableSafariHacks() { return safariHacksDisabled(); }, - @computed() + @discourseComputed() availableLocales() { return JSON.parse(this.siteSettings.available_locales); }, - @computed + @discourseComputed textSizes() { return TEXT_SIZES.map(value => { return { name: I18n.t(`user.text_size.${value}`), value }; }); }, - @computed + @discourseComputed titleCountModes() { return TITLE_COUNT_MODES.map(value => { return { name: I18n.t(`user.title_count_mode.${value}`), value }; }); }, - @computed + @discourseComputed userSelectableThemes() { return listThemes(this.site); }, - @computed("userSelectableThemes") + @discourseComputed("userSelectableThemes") showThemeSelector(themes) { return themes && themes.length > 1; }, @@ -102,12 +102,12 @@ export default Controller.extend(PreferencesTabController, { previewTheme([id]); }, - @computed("model.user_option.theme_ids", "themeId") + @discourseComputed("model.user_option.theme_ids", "themeId") showThemeSetDefault(userOptionThemes, selectedTheme) { return !userOptionThemes || userOptionThemes[0] !== selectedTheme; }, - @computed("model.user_option.text_size", "textSize") + @discourseComputed("model.user_option.text_size", "textSize") showTextSetDefault(userOptionTextSize, selectedTextSize) { return userOptionTextSize !== selectedTextSize; }, @@ -119,7 +119,7 @@ export default Controller.extend(PreferencesTabController, { setDefaultHomepage(userHome || siteHome); }, - @computed() + @discourseComputed() userSelectableHome() { let homeValues = {}; Object.keys(USER_HOMES).forEach(newValue => { diff --git a/app/assets/javascripts/discourse/controllers/preferences/profile.js.es6 b/app/assets/javascripts/discourse/controllers/preferences/profile.js.es6 index b4e9a46facd..f726f87e17e 100644 --- a/app/assets/javascripts/discourse/controllers/preferences/profile.js.es6 +++ b/app/assets/javascripts/discourse/controllers/preferences/profile.js.es6 @@ -1,7 +1,7 @@ import { isEmpty } from "@ember/utils"; import EmberObject from "@ember/object"; import Controller from "@ember/controller"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import PreferencesTabController from "discourse/mixins/preferences-tab-controller"; import { popupAjaxError } from "discourse/lib/ajax-error"; import { cookAsync } from "discourse/lib/text"; @@ -22,7 +22,7 @@ export default Controller.extend(PreferencesTabController, { ]; }, - @computed("model.user_fields.@each.value") + @discourseComputed("model.user_fields.@each.value") userFields() { let siteUserFields = this.site.get("user_fields"); if (!isEmpty(siteUserFields)) { @@ -41,7 +41,7 @@ export default Controller.extend(PreferencesTabController, { } }, - @computed("model.can_change_bio") + @discourseComputed("model.can_change_bio") canChangeBio(canChangeBio) { return canChangeBio; }, diff --git a/app/assets/javascripts/discourse/controllers/preferences/second-factor.js.es6 b/app/assets/javascripts/discourse/controllers/preferences/second-factor.js.es6 index 233ed03390d..21e9a55f38c 100644 --- a/app/assets/javascripts/discourse/controllers/preferences/second-factor.js.es6 +++ b/app/assets/javascripts/discourse/controllers/preferences/second-factor.js.es6 @@ -1,6 +1,6 @@ import { alias, and } from "@ember/object/computed"; import Controller from "@ember/controller"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import CanCheckEmails from "discourse/mixins/can-check-emails"; import { default as DiscourseURL, userPath } from "discourse/lib/url"; import { popupAjaxError } from "discourse/lib/ajax-error"; @@ -27,12 +27,12 @@ export default Controller.extend(CanCheckEmails, { this.set("totps", []); }, - @computed + @discourseComputed displayOAuthWarning() { return findAll().length > 0; }, - @computed("currentUser") + @discourseComputed("currentUser") showEnforcedNotice(user) { return user && user.enforcedSecondFactor; }, diff --git a/app/assets/javascripts/discourse/controllers/preferences/tags.js.es6 b/app/assets/javascripts/discourse/controllers/preferences/tags.js.es6 index 85d1241ad3c..1aede6792d4 100644 --- a/app/assets/javascripts/discourse/controllers/preferences/tags.js.es6 +++ b/app/assets/javascripts/discourse/controllers/preferences/tags.js.es6 @@ -1,7 +1,7 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; import PreferencesTabController from "discourse/mixins/preferences-tab-controller"; import { popupAjaxError } from "discourse/lib/ajax-error"; -import computed from "ember-addons/ember-computed-decorators"; export default Controller.extend(PreferencesTabController, { init() { @@ -15,7 +15,7 @@ export default Controller.extend(PreferencesTabController, { ]; }, - @computed( + @discourseComputed( "model.watched_tags.[]", "model.watching_first_post_tags.[]", "model.tracked_tags.[]", diff --git a/app/assets/javascripts/discourse/controllers/preferences/username.js.es6 b/app/assets/javascripts/discourse/controllers/preferences/username.js.es6 index 954e8c739ee..6d3f8ea6cc0 100644 --- a/app/assets/javascripts/discourse/controllers/preferences/username.js.es6 +++ b/app/assets/javascripts/discourse/controllers/preferences/username.js.es6 @@ -2,9 +2,9 @@ import { isEmpty } from "@ember/utils"; import { empty, or } from "@ember/object/computed"; import Controller from "@ember/controller"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import { setting, propertyEqual } from "discourse/lib/computed"; import DiscourseURL from "discourse/lib/url"; import { userPath } from "discourse/lib/url"; @@ -55,7 +55,7 @@ export default Controller.extend({ } }, - @computed("saving") + @discourseComputed("saving") saveButtonText(saving) { if (saving) return I18n.t("saving"); return I18n.t("user.change"); diff --git a/app/assets/javascripts/discourse/controllers/rename-tag.js.es6 b/app/assets/javascripts/discourse/controllers/rename-tag.js.es6 index b08bc2d6464..4bb35a34ca1 100644 --- a/app/assets/javascripts/discourse/controllers/rename-tag.js.es6 +++ b/app/assets/javascripts/discourse/controllers/rename-tag.js.es6 @@ -1,11 +1,11 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; import ModalFunctionality from "discourse/mixins/modal-functionality"; -import computed from "ember-addons/ember-computed-decorators"; import BufferedContent from "discourse/mixins/buffered-content"; import { extractError } from "discourse/lib/ajax-error"; export default Controller.extend(ModalFunctionality, BufferedContent, { - @computed("buffered.id", "id") + @discourseComputed("buffered.id", "id") renameDisabled(inputTagName, currentTagName) { const filterRegexp = new RegExp(this.site.tags_filter_regexp, "g"); const newTagName = inputTagName diff --git a/app/assets/javascripts/discourse/controllers/reorder-categories.js.es6 b/app/assets/javascripts/discourse/controllers/reorder-categories.js.es6 index 06d5f30cca8..cf7c2ca7cbd 100644 --- a/app/assets/javascripts/discourse/controllers/reorder-categories.js.es6 +++ b/app/assets/javascripts/discourse/controllers/reorder-categories.js.es6 @@ -7,8 +7,8 @@ const BufferedProxy = window.BufferedProxy; // import BufferedProxy from 'ember- import { popupAjaxError } from "discourse/lib/ajax-error"; import { on, - default as computed -} from "ember-addons/ember-computed-decorators"; + default as discourseComputed +} from "discourse-common/utils/decorators"; import Ember from "ember"; export default Controller.extend(ModalFunctionality, Ember.Evented, { @@ -23,7 +23,7 @@ export default Controller.extend(ModalFunctionality, Ember.Evented, { this.fixIndices(); }, - @computed("site.categories") + @discourseComputed("site.categories") categoriesBuffered(categories) { const bufProxy = EmberObjectProxy.extend(BufferedProxy); return categories.map(c => bufProxy.create({ content: c })); @@ -31,7 +31,7 @@ export default Controller.extend(ModalFunctionality, Ember.Evented, { categoriesOrdered: sort("categoriesBuffered", "categoriesSorting"), - @computed("categoriesBuffered.@each.hasBufferedChanges") + @discourseComputed("categoriesBuffered.@each.hasBufferedChanges") showApplyAll() { let anyChanged = false; this.categoriesBuffered.forEach(bc => { diff --git a/app/assets/javascripts/discourse/controllers/request-group-membership-form.js.es6 b/app/assets/javascripts/discourse/controllers/request-group-membership-form.js.es6 index 0f316873ce8..bbb54d03dd9 100644 --- a/app/assets/javascripts/discourse/controllers/request-group-membership-form.js.es6 +++ b/app/assets/javascripts/discourse/controllers/request-group-membership-form.js.es6 @@ -1,7 +1,7 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { isEmpty } from "@ember/utils"; import { alias } from "@ember/object/computed"; import Controller from "@ember/controller"; -import computed from "ember-addons/ember-computed-decorators"; import { popupAjaxError } from "discourse/lib/ajax-error"; import DiscourseURL from "discourse/lib/url"; import ModalFunctionality from "discourse/mixins/modal-functionality"; @@ -10,12 +10,12 @@ export default Controller.extend(ModalFunctionality, { loading: false, reason: alias("model.membership_request_template"), - @computed("model.name") + @discourseComputed("model.name") title(groupName) { return I18n.t("groups.membership_request.title", { group_name: groupName }); }, - @computed("loading", "reason") + @discourseComputed("loading", "reason") disableSubmit(loading, reason) { return loading || isEmpty(reason); }, diff --git a/app/assets/javascripts/discourse/controllers/review-index.js.es6 b/app/assets/javascripts/discourse/controllers/review-index.js.es6 index 75ab25b4f14..df95f33cfbe 100644 --- a/app/assets/javascripts/discourse/controllers/review-index.js.es6 +++ b/app/assets/javascripts/discourse/controllers/review-index.js.es6 @@ -1,5 +1,5 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; -import computed from "ember-addons/ember-computed-decorators"; export default Controller.extend({ queryParams: [ @@ -27,7 +27,7 @@ export default Controller.extend({ this.set("filtersExpanded", !this.site.mobileView); }, - @computed("reviewableTypes") + @discourseComputed("reviewableTypes") allTypes() { return (this.reviewableTypes || []).map(type => { return { @@ -37,7 +37,7 @@ export default Controller.extend({ }); }, - @computed + @discourseComputed priorities() { return ["low", "medium", "high"].map(priority => { return { @@ -47,7 +47,7 @@ export default Controller.extend({ }); }, - @computed + @discourseComputed sortOrders() { return ["priority", "priority_asc", "created_at", "created_at_asc"].map( order => { @@ -59,7 +59,7 @@ export default Controller.extend({ ); }, - @computed + @discourseComputed statuses() { return [ "pending", @@ -74,7 +74,7 @@ export default Controller.extend({ }); }, - @computed("filtersExpanded") + @discourseComputed("filtersExpanded") toggleFiltersIcon(filtersExpanded) { return filtersExpanded ? "chevron-up" : "chevron-down"; }, diff --git a/app/assets/javascripts/discourse/controllers/search-help.js.es6 b/app/assets/javascripts/discourse/controllers/search-help.js.es6 index 654722d2c73..14753734803 100644 --- a/app/assets/javascripts/discourse/controllers/search-help.js.es6 +++ b/app/assets/javascripts/discourse/controllers/search-help.js.es6 @@ -1,9 +1,9 @@ +import discourseComputed from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; import ModalFunctionality from "discourse/mixins/modal-functionality"; -import computed from "ember-addons/ember-computed-decorators"; export default Controller.extend(ModalFunctionality, { - @computed + @discourseComputed showGoogleSearch() { return !Discourse.SiteSettings.login_required; } diff --git a/app/assets/javascripts/discourse/controllers/second-factor-backup-edit.js.es6 b/app/assets/javascripts/discourse/controllers/second-factor-backup-edit.js.es6 index 2801056c71f..35b24b07dfb 100644 --- a/app/assets/javascripts/discourse/controllers/second-factor-backup-edit.js.es6 +++ b/app/assets/javascripts/discourse/controllers/second-factor-backup-edit.js.es6 @@ -1,7 +1,7 @@ import { alias } from "@ember/object/computed"; import { later } from "@ember/runloop"; import Controller from "@ember/controller"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import { SECOND_FACTOR_METHODS } from "discourse/models/user"; import ModalFunctionality from "discourse/mixins/modal-functionality"; @@ -14,7 +14,7 @@ export default Controller.extend(ModalFunctionality, { backupCodes: null, secondFactorMethod: SECOND_FACTOR_METHODS.TOTP, - @computed("backupEnabled") + @discourseComputed("backupEnabled") generateBackupCodeBtnLabel(backupEnabled) { return backupEnabled ? "user.second_factor_backup.regenerate" diff --git a/app/assets/javascripts/discourse/controllers/static.js.es6 b/app/assets/javascripts/discourse/controllers/static.js.es6 index 587e14da81b..ad4f953105a 100644 --- a/app/assets/javascripts/discourse/controllers/static.js.es6 +++ b/app/assets/javascripts/discourse/controllers/static.js.es6 @@ -1,8 +1,8 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { equal } from "@ember/object/computed"; import { inject } from "@ember/controller"; import Controller from "@ember/controller"; import { ajax } from "discourse/lib/ajax"; -import computed from "ember-addons/ember-computed-decorators"; import { userPath } from "discourse/lib/url"; export default Controller.extend({ @@ -10,10 +10,10 @@ export default Controller.extend({ showLoginButton: equal("model.path", "login"), - @computed("model.path") + @discourseComputed("model.path") bodyClass: path => `static-${path}`, - @computed("model.path") + @discourseComputed("model.path") showSignupButton() { return ( this.get("model.path") === "login" && this.get("application.canSignUp") diff --git a/app/assets/javascripts/discourse/controllers/tags-index.js.es6 b/app/assets/javascripts/discourse/controllers/tags-index.js.es6 index c2ec12fda61..14473df9a52 100644 --- a/app/assets/javascripts/discourse/controllers/tags-index.js.es6 +++ b/app/assets/javascripts/discourse/controllers/tags-index.js.es6 @@ -1,6 +1,6 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { alias, notEmpty } from "@ember/object/computed"; import Controller from "@ember/controller"; -import computed from "ember-addons/ember-computed-decorators"; import showModal from "discourse/lib/show-modal"; import { ajax } from "discourse/lib/ajax"; import { popupAjaxError } from "discourse/lib/ajax-error"; @@ -19,7 +19,7 @@ export default Controller.extend({ this.sortProperties = ["totalCount:desc", "id"]; }, - @computed("groupedByCategory", "groupedByTagGroup") + @discourseComputed("groupedByCategory", "groupedByTagGroup") otherTagsTitleKey(groupedByCategory, groupedByTagGroup) { if (!groupedByCategory && !groupedByTagGroup) { return "tagging.all_tags"; @@ -28,7 +28,7 @@ export default Controller.extend({ } }, - @computed + @discourseComputed actionsMapping() { return { manageGroups: () => this.send("showTagGroups"), diff --git a/app/assets/javascripts/discourse/controllers/tags-show.js.es6 b/app/assets/javascripts/discourse/controllers/tags-show.js.es6 index 9d787fe8a4d..631f85d7df4 100644 --- a/app/assets/javascripts/discourse/controllers/tags-show.js.es6 +++ b/app/assets/javascripts/discourse/controllers/tags-show.js.es6 @@ -2,9 +2,9 @@ import { alias } from "@ember/object/computed"; import { inject } from "@ember/controller"; import Controller from "@ember/controller"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import BulkTopicSelection from "discourse/mixins/bulk-topic-selection"; import { default as NavItem, @@ -72,12 +72,12 @@ export default Controller.extend(BulkTopicSelection, { categories: alias("site.categoriesList"), - @computed("list", "list.draft") + @discourseComputed("list", "list.draft") createTopicLabel(list, listDraft) { return listDraft ? "topic.open_draft" : "topic.create"; }, - @computed( + @discourseComputed( "canCreateTopic", "category", "canCreateTopicOnCategory", @@ -108,7 +108,7 @@ export default Controller.extend(BulkTopicSelection, { "q" ], - @computed("category", "tag.id", "filterMode") + @discourseComputed("category", "tag.id", "filterMode") navItems(category, tagId, filterMode) { return NavItem.buildList(category, { tagId, @@ -116,12 +116,12 @@ export default Controller.extend(BulkTopicSelection, { }); }, - @computed("category") + @discourseComputed("category") showTagFilter() { return Discourse.SiteSettings.show_filter_by_tag; }, - @computed("additionalTags", "canAdminTag", "category") + @discourseComputed("additionalTags", "canAdminTag", "category") showAdminControls(additionalTags, canAdminTag, category) { return !additionalTags && canAdminTag && !category; }, @@ -135,7 +135,7 @@ export default Controller.extend(BulkTopicSelection, { this.set("application.showFooter", !this.get("list.canLoadMore")); }, - @computed("navMode", "list.topics.length", "loading") + @discourseComputed("navMode", "list.topics.length", "loading") footerMessage(navMode, listTopicsLength, loading) { if (loading || listTopicsLength !== 0) { return; diff --git a/app/assets/javascripts/discourse/controllers/topic.js.es6 b/app/assets/javascripts/discourse/controllers/topic.js.es6 index 730bd8fefec..7f2708a7899 100644 --- a/app/assets/javascripts/discourse/controllers/topic.js.es6 +++ b/app/assets/javascripts/discourse/controllers/topic.js.es6 @@ -16,9 +16,9 @@ import debounce from "discourse/lib/debounce"; import isElementInViewport from "discourse/lib/is-element-in-viewport"; import { ajax } from "discourse/lib/ajax"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import { extractLinkMeta } from "discourse/lib/render-topic-featured-link"; import { popupAjaxError } from "discourse/lib/ajax-error"; import { spinnerHTML } from "discourse/helpers/loading-spinner"; @@ -80,7 +80,7 @@ export default Controller.extend(bufferedProperty("model"), { } }, - @computed("model.details.can_create_post") + @discourseComputed("model.details.can_create_post") embedQuoteButton(canCreatePost) { return ( canCreatePost && @@ -89,28 +89,31 @@ export default Controller.extend(bufferedProperty("model"), { ); }, - @computed("model.postStream.loaded", "model.category_id") + @discourseComputed("model.postStream.loaded", "model.category_id") showSharedDraftControls(loaded, categoryId) { let draftCat = this.site.shared_drafts_category_id; return loaded && draftCat && categoryId && draftCat === categoryId; }, - @computed("site.mobileView", "model.posts_count") + @discourseComputed("site.mobileView", "model.posts_count") showSelectedPostsAtBottom(mobileView, postsCount) { return mobileView && postsCount > 3; }, - @computed("model.postStream.posts", "model.postStream.postsWithPlaceholders") + @discourseComputed( + "model.postStream.posts", + "model.postStream.postsWithPlaceholders" + ) postsToRender(posts, postsWithPlaceholders) { return this.capabilities.isAndroid ? posts : postsWithPlaceholders; }, - @computed("model.postStream.loadingFilter") + @discourseComputed("model.postStream.loadingFilter") androidLoading(loading) { return this.capabilities.isAndroid && loading; }, - @computed("model") + @discourseComputed("model") pmPath(topic) { return this.currentUser && this.currentUser.pmPath(topic); }, @@ -153,12 +156,12 @@ export default Controller.extend(bufferedProperty("model"), { DiscourseURL.routeTo(url); }, - @computed + @discourseComputed selectedQuery() { return post => this.postSelected(post); }, - @computed("model.isPrivateMessage", "model.category.id") + @discourseComputed("model.isPrivateMessage", "model.category.id") canEditTopicFeaturedLink(isPrivateMessage, categoryId) { if (!this.siteSettings.topic_featured_link_enabled || isPrivateMessage) { return false; @@ -174,12 +177,12 @@ export default Controller.extend(bufferedProperty("model"), { ); }, - @computed("model") + @discourseComputed("model") featuredLinkDomain(topic) { return extractLinkMeta(topic).domain; }, - @computed("model.isPrivateMessage") + @discourseComputed("model.isPrivateMessage") canEditTags(isPrivateMessage) { return ( this.site.get("can_tag_topics") && @@ -1157,7 +1160,7 @@ export default Controller.extend(bufferedProperty("model"), { selectedPostsCount: alias("selectedPostIds.length"), - @computed( + @discourseComputed( "selectedPostIds", "model.postStream.posts", "selectedPostIds.[]", @@ -1169,7 +1172,7 @@ export default Controller.extend(bufferedProperty("model"), { .filter(post => post !== undefined); }, - @computed("selectedPostsCount", "selectedPosts", "selectedPosts.[]") + @discourseComputed("selectedPostsCount", "selectedPosts", "selectedPosts.[]") selectedPostsUsername(selectedPostsCount, selectedPosts) { if (selectedPosts.length < 1 || selectedPostsCount > selectedPosts.length) { return undefined; @@ -1180,7 +1183,7 @@ export default Controller.extend(bufferedProperty("model"), { : undefined; }, - @computed( + @discourseComputed( "selectedPostsCount", "model.postStream.isMegaTopic", "model.postStream.stream.length", @@ -1199,14 +1202,14 @@ export default Controller.extend(bufferedProperty("model"), { } }, - @computed("selectedAllPosts", "model.postStream.isMegaTopic") + @discourseComputed("selectedAllPosts", "model.postStream.isMegaTopic") canSelectAll(selectedAllPosts, isMegaTopic) { return isMegaTopic ? false : !selectedAllPosts; }, canDeselectAll: alias("selectedAllPosts"), - @computed( + @discourseComputed( "currentUser.staff", "selectedPostsCount", "selectedAllPosts", @@ -1225,19 +1228,23 @@ export default Controller.extend(bufferedProperty("model"), { ); }, - @computed("model.details.can_move_posts", "selectedPostsCount") + @discourseComputed("model.details.can_move_posts", "selectedPostsCount") canMergeTopic(canMovePosts, selectedPostsCount) { return canMovePosts && selectedPostsCount > 0; }, - @computed("currentUser.admin", "selectedPostsCount", "selectedPostsUsername") + @discourseComputed( + "currentUser.admin", + "selectedPostsCount", + "selectedPostsUsername" + ) canChangeOwner(isAdmin, selectedPostsCount, selectedPostsUsername) { return ( isAdmin && selectedPostsCount > 0 && selectedPostsUsername !== undefined ); }, - @computed( + @discourseComputed( "selectedPostsCount", "selectedPostsUsername", "selectedPosts", @@ -1260,7 +1267,7 @@ export default Controller.extend(bufferedProperty("model"), { return this.selectedAllPost || this.selectedPostIds.includes(post.id); }, - @computed + @discourseComputed loadingHTML() { return spinnerHTML; }, diff --git a/app/assets/javascripts/discourse/controllers/upload-selector.js.es6 b/app/assets/javascripts/discourse/controllers/upload-selector.js.es6 index 87c73494a0d..554fe6db2f7 100644 --- a/app/assets/javascripts/discourse/controllers/upload-selector.js.es6 +++ b/app/assets/javascripts/discourse/controllers/upload-selector.js.es6 @@ -2,9 +2,9 @@ import { equal } from "@ember/object/computed"; import Controller from "@ember/controller"; import ModalFunctionality from "discourse/mixins/modal-functionality"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import { allowsAttachments, authorizesAllExtensions, @@ -27,13 +27,13 @@ export default Controller.extend(ModalFunctionality, { remote: equal("selection", "remote"), selection: "local", - @computed() + @discourseComputed() uploadIcon: () => uploadIcon(), - @computed() + @discourseComputed() title: () => uploadTranslate("title"), - @computed("selection") + @discourseComputed("selection") tip(selection) { const authorized_extensions = authorizesAllExtensions() ? "" diff --git a/app/assets/javascripts/discourse/controllers/user-invited-show.js.es6 b/app/assets/javascripts/discourse/controllers/user-invited-show.js.es6 index 8a8c102b0e2..59d197a8758 100644 --- a/app/assets/javascripts/discourse/controllers/user-invited-show.js.es6 +++ b/app/assets/javascripts/discourse/controllers/user-invited-show.js.es6 @@ -4,9 +4,9 @@ import Invite from "discourse/models/invite"; import debounce from "discourse/lib/debounce"; import { popupAjaxError } from "discourse/lib/ajax-error"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; export default Controller.extend({ user: null, @@ -35,7 +35,7 @@ export default Controller.extend({ inviteRedeemed: equal("filter", "redeemed"), - @computed("filter") + @discourseComputed("filter") showBulkActionButtons(filter) { return ( filter === "pending" && @@ -50,7 +50,7 @@ export default Controller.extend({ showSearch: gte("totalInvites", 10), - @computed("invitesCount.total", "invitesCount.pending") + @discourseComputed("invitesCount.total", "invitesCount.pending") pendingLabel(invitesCountTotal, invitesCountPending) { if (invitesCountTotal > 50) { return I18n.t("user.invited.pending_tab_with_count", { @@ -61,7 +61,7 @@ export default Controller.extend({ } }, - @computed("invitesCount.total", "invitesCount.redeemed") + @discourseComputed("invitesCount.total", "invitesCount.redeemed") redeemedLabel(invitesCountTotal, invitesCountRedeemed) { if (invitesCountTotal > 50) { return I18n.t("user.invited.redeemed_tab_with_count", { diff --git a/app/assets/javascripts/discourse/controllers/user-notifications.js.es6 b/app/assets/javascripts/discourse/controllers/user-notifications.js.es6 index ea5507cc5c8..24e61aa73ac 100644 --- a/app/assets/javascripts/discourse/controllers/user-notifications.js.es6 +++ b/app/assets/javascripts/discourse/controllers/user-notifications.js.es6 @@ -2,9 +2,9 @@ import { inject } from "@ember/controller"; import Controller from "@ember/controller"; import { ajax } from "discourse/lib/ajax"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; export default Controller.extend({ application: inject(), @@ -14,12 +14,12 @@ export default Controller.extend({ this.set("application.showFooter", !this.get("model.canLoadMore")); }, - @computed("model.content.length") + @discourseComputed("model.content.length") hasNotifications(length) { return length > 0; }, - @computed("model.content.@each.read") + @discourseComputed("model.content.@each.read") allNotificationsRead() { return !this.get("model.content").some( notification => !notification.get("read") diff --git a/app/assets/javascripts/discourse/controllers/user-private-messages.js.es6 b/app/assets/javascripts/discourse/controllers/user-private-messages.js.es6 index c6252978c98..724d8b9909f 100644 --- a/app/assets/javascripts/discourse/controllers/user-private-messages.js.es6 +++ b/app/assets/javascripts/discourse/controllers/user-private-messages.js.es6 @@ -1,8 +1,8 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { alias, equal, and } from "@ember/object/computed"; import { inject as service } from "@ember/service"; import { inject } from "@ember/controller"; import Controller from "@ember/controller"; -import computed from "ember-addons/ember-computed-decorators"; import Topic from "discourse/models/topic"; export default Controller.extend({ @@ -22,17 +22,17 @@ export default Controller.extend({ showNewPM: and("user.viewingSelf", "currentUser.can_send_private_messages"), - @computed("selected.[]", "bulkSelectEnabled") + @discourseComputed("selected.[]", "bulkSelectEnabled") hasSelection(selected, bulkSelectEnabled) { return bulkSelectEnabled && selected && selected.length > 0; }, - @computed("hasSelection", "pmView", "archive") + @discourseComputed("hasSelection", "pmView", "archive") canMoveToInbox(hasSelection, pmView, archive) { return hasSelection && (pmView === "archive" || archive); }, - @computed("hasSelection", "pmView", "archive") + @discourseComputed("hasSelection", "pmView", "archive") canArchive(hasSelection, pmView, archive) { return hasSelection && pmView !== "archive" && !archive; }, diff --git a/app/assets/javascripts/discourse/controllers/user-summary.js.es6 b/app/assets/javascripts/discourse/controllers/user-summary.js.es6 index 7383cfa336f..0a1a37572ea 100644 --- a/app/assets/javascripts/discourse/controllers/user-summary.js.es6 +++ b/app/assets/javascripts/discourse/controllers/user-summary.js.es6 @@ -1,7 +1,7 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { alias } from "@ember/object/computed"; import { inject } from "@ember/controller"; import Controller from "@ember/controller"; -import computed from "ember-addons/ember-computed-decorators"; import { durationTiny } from "discourse/lib/formatter"; // should be kept in sync with 'UserSummary::MAX_BADGES' @@ -11,22 +11,22 @@ export default Controller.extend({ userController: inject("user"), user: alias("userController.model"), - @computed("model.badges.length") + @discourseComputed("model.badges.length") moreBadges(badgesLength) { return badgesLength >= MAX_BADGES; }, - @computed("model.time_read") + @discourseComputed("model.time_read") timeRead(timeReadSeconds) { return durationTiny(timeReadSeconds); }, - @computed("model.time_read", "model.recent_time_read") + @discourseComputed("model.time_read", "model.recent_time_read") showRecentTimeRead(timeRead, recentTimeRead) { return timeRead !== recentTimeRead && recentTimeRead !== 0; }, - @computed("model.recent_time_read") + @discourseComputed("model.recent_time_read") recentTimeRead(recentTimeReadSeconds) { return recentTimeReadSeconds > 0 ? durationTiny(recentTimeReadSeconds) diff --git a/app/assets/javascripts/discourse/controllers/user-topics-list.js.es6 b/app/assets/javascripts/discourse/controllers/user-topics-list.js.es6 index 55395001658..6c09d2e36b8 100644 --- a/app/assets/javascripts/discourse/controllers/user-topics-list.js.es6 +++ b/app/assets/javascripts/discourse/controllers/user-topics-list.js.es6 @@ -1,6 +1,6 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { inject } from "@ember/controller"; import Controller from "@ember/controller"; -import computed from "ember-addons/ember-computed-decorators"; // Lists of topics on a user's page. export default Controller.extend({ @@ -26,7 +26,7 @@ export default Controller.extend({ this.set("application.showFooter", !this.get("model.canLoadMore")); }.observes("model.canLoadMore"), - @computed("incomingCount") + @discourseComputed("incomingCount") hasIncoming(incomingCount) { return incomingCount > 0; }, diff --git a/app/assets/javascripts/discourse/controllers/user.js.es6 b/app/assets/javascripts/discourse/controllers/user.js.es6 index e24bf67a684..507ca246904 100644 --- a/app/assets/javascripts/discourse/controllers/user.js.es6 +++ b/app/assets/javascripts/discourse/controllers/user.js.es6 @@ -1,3 +1,4 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { isEmpty } from "@ember/utils"; import { alias, or, gt, not, and } from "@ember/object/computed"; import EmberObject from "@ember/object"; @@ -5,7 +6,6 @@ import { inject as service } from "@ember/service"; import { inject } from "@ember/controller"; import Controller from "@ember/controller"; import CanCheckEmails from "discourse/mixins/can-check-emails"; -import computed from "ember-addons/ember-computed-decorators"; import User from "discourse/models/user"; import optionalService from "discourse/lib/optional-service"; import { prioritizeNameInUx } from "discourse/lib/settings"; @@ -18,23 +18,28 @@ export default Controller.extend(CanCheckEmails, { currentPath: alias("router._router.currentPath"), adminTools: optionalService(), - @computed("model.username") + @discourseComputed("model.username") viewingSelf(username) { let currentUser = this.currentUser; return currentUser && username === currentUser.get("username"); }, - @computed("viewingSelf", "model.profile_hidden") + @discourseComputed("viewingSelf", "model.profile_hidden") canExpandProfile(viewingSelf, profileHidden) { return !profileHidden && viewingSelf; }, - @computed("model.profileBackgroundUrl") + @discourseComputed("model.profileBackgroundUrl") hasProfileBackgroundUrl(background) { return !isEmpty(background.toString()); }, - @computed("model.profile_hidden", "indexStream", "viewingSelf", "forceExpand") + @discourseComputed( + "model.profile_hidden", + "indexStream", + "viewingSelf", + "forceExpand" + ) collapsedInfo(profileHidden, indexStream, viewingSelf, forceExpand) { if (profileHidden) { return true; @@ -56,58 +61,58 @@ export default Controller.extend(CanCheckEmails, { "hasReceivedWarnings" ), - @computed("model.suspended", "currentUser.staff") + @discourseComputed("model.suspended", "currentUser.staff") isNotSuspendedOrIsStaff(suspended, isStaff) { return !suspended || isStaff; }, linkWebsite: not("model.isBasic"), - @computed("model.trust_level") + @discourseComputed("model.trust_level") removeNoFollow(trustLevel) { return trustLevel > 2 && !this.siteSettings.tl3_links_no_follow; }, - @computed("viewingSelf", "currentUser.admin") + @discourseComputed("viewingSelf", "currentUser.admin") showBookmarks(viewingSelf, isAdmin) { return viewingSelf || isAdmin; }, - @computed("viewingSelf") + @discourseComputed("viewingSelf") showDrafts(viewingSelf) { return viewingSelf; }, - @computed("viewingSelf", "currentUser.admin") + @discourseComputed("viewingSelf", "currentUser.admin") showPrivateMessages(viewingSelf, isAdmin) { return ( this.siteSettings.enable_personal_messages && (viewingSelf || isAdmin) ); }, - @computed("viewingSelf", "currentUser.staff") + @discourseComputed("viewingSelf", "currentUser.staff") showNotificationsTab(viewingSelf, staff) { return viewingSelf || staff; }, - @computed("model.name") + @discourseComputed("model.name") nameFirst(name) { return prioritizeNameInUx(name, this.siteSettings); }, - @computed("model.badge_count") + @discourseComputed("model.badge_count") showBadges(badgeCount) { return Discourse.SiteSettings.enable_badges && badgeCount > 0; }, - @computed() + @discourseComputed() canInviteToForum() { return User.currentProp("can_invite_to_forum"); }, canDeleteUser: and("model.can_be_deleted", "model.can_delete_all_posts"), - @computed("model.user_fields.@each.value") + @discourseComputed("model.user_fields.@each.value") publicUserFields() { const siteUserFields = this.site.get("user_fields"); if (!isEmpty(siteUserFields)) { diff --git a/app/assets/javascripts/discourse/helpers/reviewable-status.js.es6 b/app/assets/javascripts/discourse/helpers/reviewable-status.js.es6 index 5807cb0e649..b024500a0c8 100644 --- a/app/assets/javascripts/discourse/helpers/reviewable-status.js.es6 +++ b/app/assets/javascripts/discourse/helpers/reviewable-status.js.es6 @@ -1,6 +1,5 @@ import { htmlHelper } from "discourse-common/lib/helpers"; import { iconHTML } from "discourse-common/lib/icon-library"; - import { PENDING, APPROVED, diff --git a/app/assets/javascripts/discourse/lib/computed.js.es6 b/app/assets/javascripts/discourse/lib/computed.js.es6 index e6a440eb832..992029d293a 100644 --- a/app/assets/javascripts/discourse/lib/computed.js.es6 +++ b/app/assets/javascripts/discourse/lib/computed.js.es6 @@ -6,7 +6,7 @@ import addonFmt from "ember-addons/fmt"; @method propertyEqual @params {String} p1 the first property @params {String} p2 the second property - @return {Function} computedProperty function + @return {Function} discourseComputedProperty function **/ export function propertyEqual(p1, p2) { @@ -21,7 +21,7 @@ export function propertyEqual(p1, p2) { @method propertyNotEqual @params {String} p1 the first property @params {String} p2 the second property - @return {Function} computedProperty function + @return {Function} discourseComputedProperty function **/ export function propertyNotEqual(p1, p2) { return Ember.computed(p1, p2, function() { @@ -47,7 +47,7 @@ export function propertyLessThan(p1, p2) { @method i18n @params {String} properties* to format @params {String} format the i18n format string - @return {Function} computedProperty function + @return {Function} discourseComputedProperty function **/ export function i18n(...args) { const format = args.pop(); @@ -63,7 +63,7 @@ export function i18n(...args) { @method fmt @params {String} properties* to format @params {String} format the format string - @return {Function} computedProperty function + @return {Function} discourseComputedProperty function **/ export function fmt(...args) { const format = args.pop(); @@ -79,7 +79,7 @@ export function fmt(...args) { @method url @params {String} properties* to format @params {String} format the format string for the URL - @return {Function} computedProperty function returning a URL + @return {Function} discourseComputedProperty function returning a URL **/ export function url(...args) { const format = args.pop(); @@ -94,7 +94,7 @@ export function url(...args) { @method endWith @params {String} properties* to check @params {String} substring the substring - @return {Function} computedProperty function + @return {Function} discourseComputedProperty function **/ export function endWith() { const args = Array.prototype.slice.call(arguments, 0); diff --git a/app/assets/javascripts/discourse/lib/posts-with-placeholders.js.es6 b/app/assets/javascripts/discourse/lib/posts-with-placeholders.js.es6 index d1b20924458..3bf8c2457c1 100644 --- a/app/assets/javascripts/discourse/lib/posts-with-placeholders.js.es6 +++ b/app/assets/javascripts/discourse/lib/posts-with-placeholders.js.es6 @@ -1,5 +1,5 @@ import EmberObject from "@ember/object"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; export function Placeholder(viewName) { this.viewName = viewName; @@ -13,7 +13,7 @@ export default EmberObject.extend(Ember.Array, { this._appendingIds = {}; }, - @computed + @discourseComputed length() { return ( this.get("posts.length") + Object.keys(this._appendingIds || {}).length diff --git a/app/assets/javascripts/discourse/lib/register-topic-footer-button.js.es6 b/app/assets/javascripts/discourse/lib/register-topic-footer-button.js.es6 index 65b687ac7cb..6b7bdf63b0e 100644 --- a/app/assets/javascripts/discourse/lib/register-topic-footer-button.js.es6 +++ b/app/assets/javascripts/discourse/lib/register-topic-footer-button.js.es6 @@ -33,7 +33,7 @@ export function registerTopicFooterButton(button) { // css class appended to the button classNames: [], - // computed properties which should force a button state refresh + // discourseComputed properties which should force a button state refresh // eg: ["topic.bookmarked", "topic.category_id"] dependentKeys: [], @@ -88,37 +88,37 @@ export function getTopicFooterButtons() { return Object.values(_topicFooterButtons) .filter(button => _compute(button, "displayed")) .map(button => { - const computedButon = {}; + const discourseComputedButon = {}; - computedButon.id = button.id; + discourseComputedButon.id = button.id; const label = _compute(button, "label"); - computedButon.label = label + discourseComputedButon.label = label ? I18n.t(label) : _compute(button, "translatedLabel"); const title = _compute(button, "title"); - computedButon.title = title + discourseComputedButon.title = title ? I18n.t(title) : _compute(button, "translatedTitle"); - computedButon.classNames = ( + discourseComputedButon.classNames = ( _compute(button, "classNames") || [] ).join(" "); - computedButon.icon = _compute(button, "icon"); - computedButon.disabled = _compute(button, "disabled"); - computedButon.dropdown = _compute(button, "dropdown"); - computedButon.priority = _compute(button, "priority"); + discourseComputedButon.icon = _compute(button, "icon"); + discourseComputedButon.disabled = _compute(button, "disabled"); + discourseComputedButon.dropdown = _compute(button, "dropdown"); + discourseComputedButon.priority = _compute(button, "priority"); if (_isFunction(button.action)) { - computedButon.action = () => button.action.apply(this); + discourseComputedButon.action = () => button.action.apply(this); } else { const actionName = button.action; - computedButon.action = () => this[actionName](); + discourseComputedButon.action = () => this[actionName](); } - return computedButon; + return discourseComputedButon; }) .sortBy("priority") .reverse(); diff --git a/app/assets/javascripts/discourse/mixins/add-archetype-class.js.es6 b/app/assets/javascripts/discourse/mixins/add-archetype-class.js.es6 index a8a2c3c5288..1436f0def61 100644 --- a/app/assets/javascripts/discourse/mixins/add-archetype-class.js.es6 +++ b/app/assets/javascripts/discourse/mixins/add-archetype-class.js.es6 @@ -1,4 +1,4 @@ -import { on, observes } from "ember-addons/ember-computed-decorators"; +import { on, observes } from "discourse-common/utils/decorators"; // Mix this in to a view that has a `archetype` property to automatically // add it to the body as the view is entered / left / model is changed. diff --git a/app/assets/javascripts/discourse/mixins/bulk-topic-selection.js.es6 b/app/assets/javascripts/discourse/mixins/bulk-topic-selection.js.es6 index a4772fb594a..cc2dfc1d55b 100644 --- a/app/assets/javascripts/discourse/mixins/bulk-topic-selection.js.es6 +++ b/app/assets/javascripts/discourse/mixins/bulk-topic-selection.js.es6 @@ -1,6 +1,6 @@ import { alias } from "@ember/object/computed"; import { NotificationLevels } from "discourse/lib/notification-levels"; -import { on } from "ember-addons/ember-computed-decorators"; +import { on } from "discourse-common/utils/decorators"; import Mixin from "@ember/object/mixin"; import Topic from "discourse/models/topic"; diff --git a/app/assets/javascripts/discourse/mixins/grant-badge-controller.js.es6 b/app/assets/javascripts/discourse/mixins/grant-badge-controller.js.es6 index 37502e37497..153ba29c012 100644 --- a/app/assets/javascripts/discourse/mixins/grant-badge-controller.js.es6 +++ b/app/assets/javascripts/discourse/mixins/grant-badge-controller.js.es6 @@ -1,11 +1,11 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { empty } from "@ember/object/computed"; -import computed from "ember-addons/ember-computed-decorators"; import UserBadge from "discourse/models/user-badge"; import { convertIconClass } from "discourse-common/lib/icon-library"; import Mixin from "@ember/object/mixin"; export default Mixin.create({ - @computed("allBadges.[]", "userBadges.[]") + @discourseComputed("allBadges.[]", "userBadges.[]") grantableBadges(allBadges, userBadges) { const granted = userBadges.reduce((map, badge) => { map[badge.get("badge_id")] = true; @@ -31,7 +31,7 @@ export default Mixin.create({ noGrantableBadges: empty("grantableBadges"), - @computed("selectedBadgeId", "grantableBadges") + @discourseComputed("selectedBadgeId", "grantableBadges") selectedBadgeGrantable(selectedBadgeId, grantableBadges) { return ( grantableBadges && diff --git a/app/assets/javascripts/discourse/mixins/load-more.js.es6 b/app/assets/javascripts/discourse/mixins/load-more.js.es6 index a7761e13995..f54b5630344 100644 --- a/app/assets/javascripts/discourse/mixins/load-more.js.es6 +++ b/app/assets/javascripts/discourse/mixins/load-more.js.es6 @@ -1,6 +1,6 @@ import Eyeline from "discourse/lib/eyeline"; import Scrolling from "discourse/mixins/scrolling"; -import { on } from "ember-addons/ember-computed-decorators"; +import { on } from "discourse-common/utils/decorators"; import Mixin from "@ember/object/mixin"; // Provides the ability to load more items for a view which is scrolled to the bottom. diff --git a/app/assets/javascripts/discourse/mixins/name-validation.js.es6 b/app/assets/javascripts/discourse/mixins/name-validation.js.es6 index 46f1b4dfae6..e447f9fcb69 100644 --- a/app/assets/javascripts/discourse/mixins/name-validation.js.es6 +++ b/app/assets/javascripts/discourse/mixins/name-validation.js.es6 @@ -1,10 +1,10 @@ import { isEmpty } from "@ember/utils"; import InputValidation from "discourse/models/input-validation"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import Mixin from "@ember/object/mixin"; export default Mixin.create({ - @computed() + @discourseComputed() nameInstructions() { return I18n.t( this.siteSettings.full_name_required @@ -14,7 +14,7 @@ export default Mixin.create({ }, // Validate the name. - @computed("accountName") + @discourseComputed("accountName") nameValidation() { if (this.siteSettings.full_name_required && isEmpty(this.accountName)) { return InputValidation.create({ failed: true }); diff --git a/app/assets/javascripts/discourse/mixins/password-validation.js.es6 b/app/assets/javascripts/discourse/mixins/password-validation.js.es6 index 3ddf9131f02..ec665cdbe6e 100644 --- a/app/assets/javascripts/discourse/mixins/password-validation.js.es6 +++ b/app/assets/javascripts/discourse/mixins/password-validation.js.es6 @@ -1,6 +1,6 @@ import { isEmpty } from "@ember/utils"; import InputValidation from "discourse/models/input-validation"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import Mixin from "@ember/object/mixin"; export default Mixin.create({ @@ -12,21 +12,21 @@ export default Mixin.create({ this.set("rejectedPasswordsMessages", new Map()); }, - @computed("passwordMinLength") + @discourseComputed("passwordMinLength") passwordInstructions() { return I18n.t("user.password.instructions", { count: this.passwordMinLength }); }, - @computed("isDeveloper", "admin") + @discourseComputed("isDeveloper", "admin") passwordMinLength(isDeveloper, admin) { return isDeveloper || admin ? this.siteSettings.min_admin_password_length : this.siteSettings.min_password_length; }, - @computed( + @discourseComputed( "accountPassword", "passwordRequired", "rejectedPasswords.[]", diff --git a/app/assets/javascripts/discourse/mixins/preferences-tab-controller.js.es6 b/app/assets/javascripts/discourse/mixins/preferences-tab-controller.js.es6 index 7e49326f419..2e8763097c3 100644 --- a/app/assets/javascripts/discourse/mixins/preferences-tab-controller.js.es6 +++ b/app/assets/javascripts/discourse/mixins/preferences-tab-controller.js.es6 @@ -1,10 +1,10 @@ -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import Mixin from "@ember/object/mixin"; export default Mixin.create({ saved: false, - @computed("model.isSaving") + @discourseComputed("model.isSaving") saveButtonText(isSaving) { return isSaving ? I18n.t("saving") : I18n.t("save"); } diff --git a/app/assets/javascripts/discourse/mixins/upload.js.es6 b/app/assets/javascripts/discourse/mixins/upload.js.es6 index a3b0d8626af..071f749b75f 100644 --- a/app/assets/javascripts/discourse/mixins/upload.js.es6 +++ b/app/assets/javascripts/discourse/mixins/upload.js.es6 @@ -2,7 +2,6 @@ import { displayErrorForUpload, validateUploadedFiles } from "discourse/lib/utilities"; - import getUrl from "discourse-common/lib/get-url"; import { on } from "@ember/object/evented"; import Mixin from "@ember/object/mixin"; diff --git a/app/assets/javascripts/discourse/mixins/user-fields-validation.js.es6 b/app/assets/javascripts/discourse/mixins/user-fields-validation.js.es6 index ec007c993d1..e535043a2d2 100644 --- a/app/assets/javascripts/discourse/mixins/user-fields-validation.js.es6 +++ b/app/assets/javascripts/discourse/mixins/user-fields-validation.js.es6 @@ -3,8 +3,8 @@ import EmberObject from "@ember/object"; import InputValidation from "discourse/models/input-validation"; import { on, - default as computed -} from "ember-addons/ember-computed-decorators"; + default as discourseComputed +} from "discourse-common/utils/decorators"; import Mixin from "@ember/object/mixin"; export default Mixin.create({ @@ -24,7 +24,7 @@ export default Mixin.create({ }, // Validate required fields - @computed("userFields.@each.value") + @discourseComputed("userFields.@each.value") userFieldsValidation() { let userFields = this.userFields; if (userFields) { diff --git a/app/assets/javascripts/discourse/mixins/username-validation.js.es6 b/app/assets/javascripts/discourse/mixins/username-validation.js.es6 index 66e86221a90..35ccf6c8cc3 100644 --- a/app/assets/javascripts/discourse/mixins/username-validation.js.es6 +++ b/app/assets/javascripts/discourse/mixins/username-validation.js.es6 @@ -2,7 +2,7 @@ import { isEmpty } from "@ember/utils"; import InputValidation from "discourse/models/input-validation"; import debounce from "discourse/lib/debounce"; import { setting } from "discourse/lib/computed"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import Mixin from "@ember/object/mixin"; export default Mixin.create({ @@ -27,7 +27,7 @@ export default Mixin.create({ }); }, 500), - @computed("accountUsername") + @discourseComputed("accountUsername") basicUsernameValidation(accountUsername) { this.set("uniqueUsernameValidation", null); @@ -118,7 +118,7 @@ export default Mixin.create({ }, 500), // Actually wait for the async name check before we're 100% sure we're good to go - @computed("uniqueUsernameValidation", "basicUsernameValidation") + @discourseComputed("uniqueUsernameValidation", "basicUsernameValidation") usernameValidation() { const basicValidation = this.basicUsernameValidation; const uniqueUsername = this.uniqueUsernameValidation; diff --git a/app/assets/javascripts/discourse/models/badge-grouping.js.es6 b/app/assets/javascripts/discourse/models/badge-grouping.js.es6 index 573dff223d7..6dbaa5c7c65 100644 --- a/app/assets/javascripts/discourse/models/badge-grouping.js.es6 +++ b/app/assets/javascripts/discourse/models/badge-grouping.js.es6 @@ -1,13 +1,13 @@ -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; import RestModel from "discourse/models/rest"; export default RestModel.extend({ - @computed("name") + @discourseComputed("name") i18nNameKey() { return this.name.toLowerCase().replace(/\s/g, "_"); }, - @computed("name") + @discourseComputed("name") displayName() { const i18nKey = `badges.badge_grouping.${this.i18nNameKey}.name`; return I18n.t(i18nKey, { defaultValue: this.name }); diff --git a/app/assets/javascripts/discourse/models/badge.js.es6 b/app/assets/javascripts/discourse/models/badge.js.es6 index 88203b5084f..5b9e46cef9c 100644 --- a/app/assets/javascripts/discourse/models/badge.js.es6 +++ b/app/assets/javascripts/discourse/models/badge.js.es6 @@ -1,15 +1,15 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { none } from "@ember/object/computed"; import EmberObject from "@ember/object"; import { ajax } from "discourse/lib/ajax"; import BadgeGrouping from "discourse/models/badge-grouping"; import RestModel from "discourse/models/rest"; -import computed from "ember-addons/ember-computed-decorators"; import { Promise } from "rsvp"; const Badge = RestModel.extend({ newBadge: none("id"), - @computed + @discourseComputed url() { return Discourse.getURL(`/badges/${this.id}/${this.slug}`); }, @@ -27,7 +27,7 @@ const Badge = RestModel.extend({ } }, - @computed("badge_type.name") + @discourseComputed("badge_type.name") badgeTypeClassName(type) { type = type || ""; return `badge-type-${type.toLowerCase()}`; diff --git a/app/assets/javascripts/discourse/models/category.js.es6 b/app/assets/javascripts/discourse/models/category.js.es6 index 4248f6a8f81..98336dac420 100644 --- a/app/assets/javascripts/discourse/models/category.js.es6 +++ b/app/assets/javascripts/discourse/models/category.js.es6 @@ -1,8 +1,8 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { get } from "@ember/object"; import { ajax } from "discourse/lib/ajax"; import RestModel from "discourse/models/rest"; -import computed from "ember-addons/ember-computed-decorators"; -import { on } from "ember-addons/ember-computed-decorators"; +import { on } from "discourse-common/utils/decorators"; import PermissionType from "discourse/models/permission-type"; import { NotificationLevels } from "discourse/lib/notification-levels"; @@ -39,7 +39,7 @@ const Category = RestModel.extend({ } }, - @computed + @discourseComputed availablePermissions() { return [ PermissionType.create({ id: PermissionType.FULL }), @@ -48,52 +48,52 @@ const Category = RestModel.extend({ ]; }, - @computed("id") + @discourseComputed("id") searchContext(id) { return { type: "category", id, category: this }; }, - @computed("notification_level") + @discourseComputed("notification_level") isMuted(notificationLevel) { return notificationLevel === NotificationLevels.MUTED; }, - @computed("name") + @discourseComputed("name") url() { return Discourse.getURL("/c/") + Category.slugFor(this); }, - @computed + @discourseComputed fullSlug() { return Category.slugFor(this).replace(/\//g, "-"); }, - @computed("name") + @discourseComputed("name") nameLower(name) { return name.toLowerCase(); }, - @computed("url") + @discourseComputed("url") unreadUrl(url) { return `${url}/l/unread`; }, - @computed("url") + @discourseComputed("url") newUrl(url) { return `${url}/l/new`; }, - @computed("color", "text_color") + @discourseComputed("color", "text_color") style(color, textColor) { return `background-color: #${color}; color: #${textColor}`; }, - @computed("topic_count") + @discourseComputed("topic_count") moreTopics(topicCount) { return topicCount > (this.num_featured_topics || 2); }, - @computed("topic_count", "subcategories") + @discourseComputed("topic_count", "subcategories") totalTopicCount(topicCount, subcats) { let count = topicCount; if (subcats) { @@ -181,26 +181,26 @@ const Category = RestModel.extend({ this.availableGroups.addObject(permission.group_name); }, - @computed("topics") + @discourseComputed("topics") latestTopic(topics) { if (topics && topics.length) { return topics[0]; } }, - @computed("topics") + @discourseComputed("topics") featuredTopics(topics) { if (topics && topics.length) { return topics.slice(0, this.num_featured_topics || 2); } }, - @computed("id", "topicTrackingState.messageCount") + @discourseComputed("id", "topicTrackingState.messageCount") unreadTopics(id) { return this.topicTrackingState.countUnread(id); }, - @computed("id", "topicTrackingState.messageCount") + @discourseComputed("id", "topicTrackingState.messageCount") newTopics(id) { return this.topicTrackingState.countNew(id); }, @@ -211,7 +211,7 @@ const Category = RestModel.extend({ return ajax(url, { data: { notification_level }, type: "POST" }); }, - @computed("id") + @discourseComputed("id") isUncategorizedCategory(id) { return id === Discourse.Site.currentProp("uncategorized_category_id"); } diff --git a/app/assets/javascripts/discourse/models/composer.js.es6 b/app/assets/javascripts/discourse/models/composer.js.es6 index 8e3a1af2591..60fb8272a6c 100644 --- a/app/assets/javascripts/discourse/models/composer.js.es6 +++ b/app/assets/javascripts/discourse/models/composer.js.es6 @@ -10,10 +10,10 @@ import { throwAjaxError } from "discourse/lib/ajax-error"; import Quote from "discourse/lib/quote"; import Draft from "discourse/models/draft"; import { - default as computed, + default as discourseComputed, observes, on -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import { escapeExpression, tinyAvatar } from "discourse/lib/utilities"; import { propertyNotEqual } from "discourse/lib/computed"; import throttle from "discourse/lib/throttle"; @@ -108,7 +108,7 @@ const Composer = RestModel.extend({ sharedDraft: equal("action", CREATE_SHARED_DRAFT), - @computed + @discourseComputed categoryId: { get() { return this._categoryId; @@ -132,12 +132,12 @@ const Composer = RestModel.extend({ } }, - @computed("categoryId") + @discourseComputed("categoryId") category(categoryId) { return categoryId ? this.site.categories.findBy("id", categoryId) : null; }, - @computed("category") + @discourseComputed("category") minimumRequiredTags(category) { return category && category.minimum_required_tags > 0 ? category.minimum_required_tags @@ -150,18 +150,18 @@ const Composer = RestModel.extend({ notCreatingPrivateMessage: not("creatingPrivateMessage"), notPrivateMessage: not("privateMessage"), - @computed("editingPost", "topic.details.can_edit") + @discourseComputed("editingPost", "topic.details.can_edit") disableTitleInput(editingPost, canEditTopic) { return editingPost && !canEditTopic; }, - @computed("privateMessage", "archetype.hasOptions") + @discourseComputed("privateMessage", "archetype.hasOptions") showCategoryChooser(isPrivateMessage, hasOptions) { const manyCategories = this.site.categories.length > 1; return !isPrivateMessage && (hasOptions || manyCategories); }, - @computed("creatingPrivateMessage", "topic") + @discourseComputed("creatingPrivateMessage", "topic") privateMessage(creatingPrivateMessage, topic) { return ( creatingPrivateMessage || (topic && topic.archetype === "private_message") @@ -170,7 +170,7 @@ const Composer = RestModel.extend({ topicFirstPost: or("creatingTopic", "editingFirstPost"), - @computed("action") + @discourseComputed("action") editingPost: isEdit, replyingToTopic: equal("action", REPLY), @@ -202,7 +202,7 @@ const Composer = RestModel.extend({ } }, - @computed + @discourseComputed composerTime: { get() { let total = this.composerTotalOpened || 0; @@ -216,7 +216,7 @@ const Composer = RestModel.extend({ } }, - @computed("archetypeId") + @discourseComputed("archetypeId") archetype(archetypeId) { return this.archetypes.findBy("id", archetypeId); }, @@ -251,7 +251,7 @@ const Composer = RestModel.extend({ "notPrivateMessage" ), - @computed("canEditTitle", "creatingPrivateMessage", "categoryId") + @discourseComputed("canEditTitle", "creatingPrivateMessage", "categoryId") canEditTopicFeaturedLink(canEditTitle, creatingPrivateMessage, categoryId) { if ( !this.siteSettings.topic_featured_link_enabled || @@ -277,14 +277,14 @@ const Composer = RestModel.extend({ ); }, - @computed("canEditTopicFeaturedLink") + @discourseComputed("canEditTopicFeaturedLink") titlePlaceholder(canEditTopicFeaturedLink) { return canEditTopicFeaturedLink ? "composer.title_or_link_placeholder" : "composer.title_placeholder"; }, - @computed("action", "post", "topic", "topic.title") + @discourseComputed("action", "post", "topic", "topic.title") replyOptions(action, post, topic, topicTitle) { const options = { userLink: null, @@ -334,7 +334,7 @@ const Composer = RestModel.extend({ return options; }, - @computed( + @discourseComputed( "loading", "canEditTitle", "titleLength", @@ -405,7 +405,7 @@ const Composer = RestModel.extend({ } }, - @computed("canCategorize", "categoryId") + @discourseComputed("canCategorize", "categoryId") requiredCategoryMissing(canCategorize, categoryId) { return ( canCategorize && @@ -414,14 +414,14 @@ const Composer = RestModel.extend({ ); }, - @computed("minimumTitleLength", "titleLength", "post.static_doc") + @discourseComputed("minimumTitleLength", "titleLength", "post.static_doc") titleLengthValid(minTitleLength, titleLength, staticDoc) { if (this.user.admin && staticDoc && titleLength > 0) return true; if (titleLength < minTitleLength) return false; return titleLength <= this.siteSettings.max_topic_title_length; }, - @computed("metaData") + @discourseComputed("metaData") hasMetaData(metaData) { return metaData ? isEmpty(Ember.keys(metaData)) : false; }, @@ -430,12 +430,12 @@ const Composer = RestModel.extend({ titleDirty: propertyNotEqual("title", "originalTitle"), - @computed("minimumTitleLength", "titleLength") + @discourseComputed("minimumTitleLength", "titleLength") missingTitleCharacters(minimumTitleLength, titleLength) { return minimumTitleLength - titleLength; }, - @computed("privateMessage") + @discourseComputed("privateMessage") minimumTitleLength(privateMessage) { if (privateMessage) { return this.siteSettings.min_personal_message_title_length; @@ -444,7 +444,11 @@ const Composer = RestModel.extend({ } }, - @computed("minimumPostLength", "replyLength", "canEditTopicFeaturedLink") + @discourseComputed( + "minimumPostLength", + "replyLength", + "canEditTopicFeaturedLink" + ) missingReplyCharacters( minimumPostLength, replyLength, @@ -459,7 +463,11 @@ const Composer = RestModel.extend({ return minimumPostLength - replyLength; }, - @computed("privateMessage", "topicFirstPost", "topic.pm_with_non_human_user") + @discourseComputed( + "privateMessage", + "topicFirstPost", + "topic.pm_with_non_human_user" + ) minimumPostLength(privateMessage, topicFirstPost, pmWithNonHumanUser) { if (pmWithNonHumanUser) { return 1; @@ -473,13 +481,13 @@ const Composer = RestModel.extend({ } }, - @computed("title") + @discourseComputed("title") titleLength(title) { title = title || ""; return title.replace(/\s+/gim, " ").trim().length; }, - @computed("reply") + @discourseComputed("reply") replyLength(reply) { reply = reply || ""; diff --git a/app/assets/javascripts/discourse/models/group-history.js.es6 b/app/assets/javascripts/discourse/models/group-history.js.es6 index 946741ae5d2..8c22e9af5fa 100644 --- a/app/assets/javascripts/discourse/models/group-history.js.es6 +++ b/app/assets/javascripts/discourse/models/group-history.js.es6 @@ -1,8 +1,8 @@ -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; import RestModel from "discourse/models/rest"; export default RestModel.extend({ - @computed("action") + @discourseComputed("action") actionTitle(action) { return I18n.t(`group_histories.actions.${action}`); } diff --git a/app/assets/javascripts/discourse/models/group.js.es6 b/app/assets/javascripts/discourse/models/group.js.es6 index b25746471e3..f8bed56d590 100644 --- a/app/assets/javascripts/discourse/models/group.js.es6 +++ b/app/assets/javascripts/discourse/models/group.js.es6 @@ -2,9 +2,9 @@ import { isEmpty } from "@ember/utils"; import { notEmpty, equal } from "@ember/object/computed"; import { ajax } from "discourse/lib/ajax"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import GroupHistory from "discourse/models/group-history"; import RestModel from "discourse/models/rest"; import Category from "discourse/models/category"; @@ -26,17 +26,17 @@ const Group = RestModel.extend({ hasOwners: notEmpty("owners"), - @computed("automatic_membership_email_domains") + @discourseComputed("automatic_membership_email_domains") emailDomains(value) { return isEmpty(value) ? "" : value; }, - @computed("automatic") + @discourseComputed("automatic") type(automatic) { return automatic ? "automatic" : "custom"; }, - @computed("user_count") + @discourseComputed("user_count") userCountDisplay(userCount) { // don't display zero its ugly if (userCount > 0) { @@ -119,19 +119,19 @@ const Group = RestModel.extend({ return this.findMembers({ filter: response.usernames.join(",") }); }, - @computed("display_name", "name") + @discourseComputed("display_name", "name") displayName(groupDisplayName, name) { return groupDisplayName || name; }, - @computed("flair_bg_color") + @discourseComputed("flair_bg_color") flairBackgroundHexColor(flairBgColor) { return flairBgColor ? flairBgColor.replace(new RegExp("[^0-9a-fA-F]", "g"), "") : null; }, - @computed("flair_color") + @discourseComputed("flair_color") flairHexColor(flairColor) { return flairColor ? flairColor.replace(new RegExp("[^0-9a-fA-F]", "g"), "") @@ -140,7 +140,7 @@ const Group = RestModel.extend({ canEveryoneMention: equal("mentionable_level", 99), - @computed("visibility_level") + @discourseComputed("visibility_level") isPrivate(visibilityLevel) { return visibilityLevel > 1; }, diff --git a/app/assets/javascripts/discourse/models/login-method.js.es6 b/app/assets/javascripts/discourse/models/login-method.js.es6 index 0bfddf39514..12a49697688 100644 --- a/app/assets/javascripts/discourse/models/login-method.js.es6 +++ b/app/assets/javascripts/discourse/models/login-method.js.es6 @@ -1,20 +1,20 @@ +import discourseComputed from "discourse-common/utils/decorators"; import EmberObject from "@ember/object"; -import computed from "ember-addons/ember-computed-decorators"; import { updateCsrfToken } from "discourse/lib/ajax"; import { Promise } from "rsvp"; const LoginMethod = EmberObject.extend({ - @computed + @discourseComputed title() { return this.title_override || I18n.t(`login.${this.name}.title`); }, - @computed + @discourseComputed prettyName() { return this.pretty_name_override || I18n.t(`login.${this.name}.name`); }, - @computed + @discourseComputed message() { return this.message_override || I18n.t(`login.${this.name}.message`); }, diff --git a/app/assets/javascripts/discourse/models/nav-item.js.es6 b/app/assets/javascripts/discourse/models/nav-item.js.es6 index 5b36d3b4e4d..0eff0051899 100644 --- a/app/assets/javascripts/discourse/models/nav-item.js.es6 +++ b/app/assets/javascripts/discourse/models/nav-item.js.es6 @@ -1,9 +1,9 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { toTitleCase } from "discourse/lib/formatter"; import { emojiUnescape } from "discourse/lib/text"; -import computed from "ember-addons/ember-computed-decorators"; const NavItem = Discourse.Model.extend({ - @computed("categoryName", "name") + @discourseComputed("categoryName", "name") title(categoryName, name) { const extra = {}; @@ -15,7 +15,7 @@ const NavItem = Discourse.Model.extend({ return I18n.t("filters." + name.replace("/", ".") + ".help", extra); }, - @computed("categoryName", "name", "count") + @discourseComputed("categoryName", "name", "count") displayName(categoryName, name, count) { count = count || 0; @@ -39,13 +39,13 @@ const NavItem = Discourse.Model.extend({ ); }, - @computed("name") + @discourseComputed("name") categoryName(name) { const split = name.split("/"); return split[0] === "category" ? split[1] : null; }, - @computed("name") + @discourseComputed("name") categorySlug(name) { const split = name.split("/"); if (split[0] === "category" && split[1]) { @@ -58,7 +58,7 @@ const NavItem = Discourse.Model.extend({ return null; }, - @computed("filterMode") + @discourseComputed("filterMode") href(filterMode) { let customHref = null; @@ -76,7 +76,7 @@ const NavItem = Discourse.Model.extend({ return Discourse.getURL("/") + filterMode; }, - @computed("name", "category", "categorySlug", "noSubcategories") + @discourseComputed("name", "category", "categorySlug", "noSubcategories") filterMode(name, category, categorySlug, noSubcategories) { if (name.split("/")[0] === "category") { return "c/" + categorySlug; @@ -94,7 +94,7 @@ const NavItem = Discourse.Model.extend({ } }, - @computed("name", "category", "topicTrackingState.messageCount") + @discourseComputed("name", "category", "topicTrackingState.messageCount") count(name, category) { const state = this.topicTrackingState; if (state) { @@ -104,7 +104,7 @@ const NavItem = Discourse.Model.extend({ }); const ExtraNavItem = NavItem.extend({ - href: computed("href", { + href: discourseComputed("href", { get() { if (this._href) { return this._href; diff --git a/app/assets/javascripts/discourse/models/permission-type.js.es6 b/app/assets/javascripts/discourse/models/permission-type.js.es6 index 858be5722f3..94a9af04016 100644 --- a/app/assets/javascripts/discourse/models/permission-type.js.es6 +++ b/app/assets/javascripts/discourse/models/permission-type.js.es6 @@ -1,7 +1,7 @@ -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; const PermissionType = Discourse.Model.extend({ - @computed("id") + @discourseComputed("id") description(id) { var key = ""; diff --git a/app/assets/javascripts/discourse/models/post-stream.js.es6 b/app/assets/javascripts/discourse/models/post-stream.js.es6 index 6baafb909b6..1abd6aaa650 100644 --- a/app/assets/javascripts/discourse/models/post-stream.js.es6 +++ b/app/assets/javascripts/discourse/models/post-stream.js.es6 @@ -5,7 +5,7 @@ import { ajax } from "discourse/lib/ajax"; import DiscourseURL from "discourse/lib/url"; import RestModel from "discourse/models/rest"; import PostsWithPlaceholders from "discourse/lib/posts-with-placeholders"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import { loadTopicView } from "discourse/models/topic"; import { Promise } from "rsvp"; @@ -50,17 +50,21 @@ export default RestModel.extend({ loading: or("loadingAbove", "loadingBelow", "loadingFilter", "stagingPost"), notLoading: not("loading"), - @computed("isMegaTopic", "stream.length", "topic.highest_post_number") + @discourseComputed( + "isMegaTopic", + "stream.length", + "topic.highest_post_number" + ) filteredPostsCount(isMegaTopic, streamLength, topicHighestPostNumber) { return isMegaTopic ? topicHighestPostNumber : streamLength; }, - @computed("posts.[]") + @discourseComputed("posts.[]") hasPosts() { return this.get("posts.length") > 0; }, - @computed("hasPosts", "filteredPostsCount") + @discourseComputed("hasPosts", "filteredPostsCount") hasLoadedData(hasPosts, filteredPostsCount) { return hasPosts && filteredPostsCount > 0; }, @@ -68,7 +72,7 @@ export default RestModel.extend({ canAppendMore: and("notLoading", "hasPosts", "lastPostNotLoaded"), canPrependMore: and("notLoading", "hasPosts", "firstPostNotLoaded"), - @computed("hasLoadedData", "firstPostId", "posts.[]") + @discourseComputed("hasLoadedData", "firstPostId", "posts.[]") firstPostPresent(hasLoadedData, firstPostId) { if (!hasLoadedData) { return false; @@ -81,17 +85,17 @@ export default RestModel.extend({ firstId: null, lastId: null, - @computed("isMegaTopic", "stream.firstObject", "firstId") + @discourseComputed("isMegaTopic", "stream.firstObject", "firstId") firstPostId(isMegaTopic, streamFirstId, firstId) { return isMegaTopic ? firstId : streamFirstId; }, - @computed("isMegaTopic", "stream.lastObject", "lastId") + @discourseComputed("isMegaTopic", "stream.lastObject", "lastId") lastPostId(isMegaTopic, streamLastId, lastId) { return isMegaTopic ? lastId : streamLastId; }, - @computed("hasLoadedData", "lastPostId", "posts.@each.id") + @discourseComputed("hasLoadedData", "lastPostId", "posts.@each.id") loadedAllPosts(hasLoadedData, lastPostId) { if (!hasLoadedData) { return false; @@ -109,7 +113,7 @@ export default RestModel.extend({ Returns a JS Object of current stream filter options. It should match the query params for the stream. **/ - @computed("summary", "userFilters.[]") + @discourseComputed("summary", "userFilters.[]") streamFilters(summary) { const result = {}; if (summary) { @@ -124,7 +128,7 @@ export default RestModel.extend({ return result; }, - @computed("streamFilters.[]", "topic.posts_count", "posts.length") + @discourseComputed("streamFilters.[]", "topic.posts_count", "posts.length") hasNoFilters() { const streamFilters = this.streamFilters; return !( @@ -137,7 +141,7 @@ export default RestModel.extend({ Returns the window of posts above the current set in the stream, bound to the top of the stream. This is the collection we'll ask for when scrolling upwards. **/ - @computed("posts.[]", "stream.[]") + @discourseComputed("posts.[]", "stream.[]") previousWindow() { // If we can't find the last post loaded, bail const firstPost = _.first(this.posts); @@ -163,7 +167,7 @@ export default RestModel.extend({ Returns the window of posts below the current set in the stream, bound by the bottom of the stream. This is the collection we use when scrolling downwards. **/ - @computed("posts.lastObject", "stream.[]") + @discourseComputed("posts.lastObject", "stream.[]") nextWindow(lastLoadedPost) { // If we can't find the last post loaded, bail if (!lastLoadedPost) { diff --git a/app/assets/javascripts/discourse/models/post.js.es6 b/app/assets/javascripts/discourse/models/post.js.es6 index 4fbfcdeea02..83a18d9a12f 100644 --- a/app/assets/javascripts/discourse/models/post.js.es6 +++ b/app/assets/javascripts/discourse/models/post.js.es6 @@ -1,3 +1,4 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { get } from "@ember/object"; import { isEmpty } from "@ember/utils"; import { equal, and, or, not } from "@ember/object/computed"; @@ -8,7 +9,6 @@ import { popupAjaxError } from "discourse/lib/ajax-error"; import ActionSummary from "discourse/models/action-summary"; import { propertyEqual } from "discourse/lib/computed"; import Quote from "discourse/lib/quote"; -import computed from "ember-addons/ember-computed-decorators"; import { postUrl } from "discourse/lib/utilities"; import { cookAsync } from "discourse/lib/text"; import { userPath } from "discourse/lib/url"; @@ -28,7 +28,7 @@ const Post = RestModel.extend({ } }), - @computed("url") + @discourseComputed("url") shareUrl(url) { const user = Discourse.User.current(); const userSuffix = user ? `?u=${user.username_lower}` : ""; @@ -48,24 +48,24 @@ const Post = RestModel.extend({ deleted: or("deleted_at", "deletedViaTopic"), notDeleted: not("deleted"), - @computed("name", "username") + @discourseComputed("name", "username") showName(name, username) { return ( name && name !== username && Discourse.SiteSettings.display_name_on_posts ); }, - @computed("firstPost", "deleted_by", "topic.deleted_by") + @discourseComputed("firstPost", "deleted_by", "topic.deleted_by") postDeletedBy(firstPost, deletedBy, topicDeletedBy) { return firstPost ? topicDeletedBy : deletedBy; }, - @computed("firstPost", "deleted_at", "topic.deleted_at") + @discourseComputed("firstPost", "deleted_at", "topic.deleted_at") postDeletedAt(firstPost, deletedAt, topicDeletedAt) { return firstPost ? topicDeletedAt : deletedAt; }, - @computed("post_number", "topic_id", "topic.slug") + @discourseComputed("post_number", "topic_id", "topic.slug") url(post_number, topic_id, topicSlug) { return postUrl( topicSlug || this.topic_slug, @@ -75,12 +75,12 @@ const Post = RestModel.extend({ }, // Don't drop the /1 - @computed("post_number", "url") + @discourseComputed("post_number", "url") urlWithNumber(postNumber, baseUrl) { return postNumber === 1 ? `${baseUrl}/1` : baseUrl; }, - @computed("username") + @discourseComputed("username") usernameUrl: userPath, topicOwner: propertyEqual("topic.details.created_by.id", "user_id"), @@ -94,14 +94,14 @@ const Post = RestModel.extend({ .catch(popupAjaxError); }, - @computed("link_counts.@each.internal") + @discourseComputed("link_counts.@each.internal") internalLinks() { if (isEmpty(this.link_counts)) return null; return this.link_counts.filterBy("internal").filterBy("title"); }, - @computed("actions_summary.@each.can_act") + @discourseComputed("actions_summary.@each.can_act") flagsAvailable() { // TODO: Investigate why `this.site` is sometimes null when running // Search - Search with context diff --git a/app/assets/javascripts/discourse/models/result-set.js.es6 b/app/assets/javascripts/discourse/models/result-set.js.es6 index 436abfd2de6..56e2c164b50 100644 --- a/app/assets/javascripts/discourse/models/result-set.js.es6 +++ b/app/assets/javascripts/discourse/models/result-set.js.es6 @@ -1,4 +1,4 @@ -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; import { Promise } from "rsvp"; export default Ember.ArrayProxy.extend({ @@ -15,7 +15,7 @@ export default Ember.ArrayProxy.extend({ __type: null, resultSetMeta: null, - @computed("totalRows", "length") + @discourseComputed("totalRows", "length") canLoadMore(totalRows, length) { return length < totalRows; }, diff --git a/app/assets/javascripts/discourse/models/reviewable.js.es6 b/app/assets/javascripts/discourse/models/reviewable.js.es6 index 892822c59e1..fd6ad396038 100644 --- a/app/assets/javascripts/discourse/models/reviewable.js.es6 +++ b/app/assets/javascripts/discourse/models/reviewable.js.es6 @@ -1,6 +1,6 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { ajax } from "discourse/lib/ajax"; import RestModel from "discourse/models/rest"; -import computed from "ember-addons/ember-computed-decorators"; import Category from "discourse/models/category"; import { Promise } from "rsvp"; @@ -11,7 +11,7 @@ export const IGNORED = 3; export const DELETED = 4; export default RestModel.extend({ - @computed("type", "topic") + @discourseComputed("type", "topic") humanType(type, topic) { // Display "Queued Topic" if the post will create a topic if (type === "ReviewableQueuedPost" && !topic) { diff --git a/app/assets/javascripts/discourse/models/site.js.es6 b/app/assets/javascripts/discourse/models/site.js.es6 index bb76b07a0ea..81d4acca567 100644 --- a/app/assets/javascripts/discourse/models/site.js.es6 +++ b/app/assets/javascripts/discourse/models/site.js.es6 @@ -1,8 +1,8 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { get } from "@ember/object"; import { isEmpty } from "@ember/utils"; import { alias, sort } from "@ember/object/computed"; import EmberObject from "@ember/object"; -import computed from "ember-addons/ember-computed-decorators"; import Archetype from "discourse/models/archetype"; import PostActionType from "discourse/models/post-action-type"; import Singleton from "discourse/mixins/singleton"; @@ -19,7 +19,7 @@ const Site = RestModel.extend({ this.topicCountDesc = ["topic_count:desc"]; }, - @computed("notification_types") + @discourseComputed("notification_types") notificationLookup(notificationTypes) { const result = []; Object.keys(notificationTypes).forEach( @@ -28,7 +28,7 @@ const Site = RestModel.extend({ return result; }, - @computed("post_action_types.[]") + @discourseComputed("post_action_types.[]") flagTypes() { const postActionTypes = this.post_action_types; if (!postActionTypes) return []; @@ -53,7 +53,7 @@ const Site = RestModel.extend({ }, // Sort subcategories under parents - @computed("categoriesByCount", "categories.[]") + @discourseComputed("categoriesByCount", "categories.[]") sortedCategories(cats) { const result = [], remaining = {}; @@ -80,13 +80,13 @@ const Site = RestModel.extend({ return result; }, - @computed + @discourseComputed baseUri() { return Discourse.baseUri; }, // Returns it in the correct order, by setting - @computed + @discourseComputed categoriesList() { return this.siteSettings.fixed_category_positions ? this.categories diff --git a/app/assets/javascripts/discourse/models/tag-group.js.es6 b/app/assets/javascripts/discourse/models/tag-group.js.es6 index e42ccee9dda..18afc52fe75 100644 --- a/app/assets/javascripts/discourse/models/tag-group.js.es6 +++ b/app/assets/javascripts/discourse/models/tag-group.js.es6 @@ -1,9 +1,9 @@ +import discourseComputed from "discourse-common/utils/decorators"; import RestModel from "discourse/models/rest"; -import computed from "ember-addons/ember-computed-decorators"; import PermissionType from "discourse/models/permission-type"; export default RestModel.extend({ - @computed("permissions") + @discourseComputed("permissions") permissionName(permissions) { if (!permissions) return "public"; diff --git a/app/assets/javascripts/discourse/models/tag.js.es6 b/app/assets/javascripts/discourse/models/tag.js.es6 index c9665111ac7..ebfa93d93d5 100644 --- a/app/assets/javascripts/discourse/models/tag.js.es6 +++ b/app/assets/javascripts/discourse/models/tag.js.es6 @@ -1,13 +1,13 @@ +import discourseComputed from "discourse-common/utils/decorators"; import RestModel from "discourse/models/rest"; -import computed from "ember-addons/ember-computed-decorators"; export default RestModel.extend({ - @computed("count", "pm_count") + @discourseComputed("count", "pm_count") totalCount(count, pmCount) { return count + pmCount; }, - @computed("count", "pm_count") + @discourseComputed("count", "pm_count") pmOnly(count, pmCount) { return count === 0 && pmCount > 0; } diff --git a/app/assets/javascripts/discourse/models/topic-details.js.es6 b/app/assets/javascripts/discourse/models/topic-details.js.es6 index 0622cacb690..0e0ad21b343 100644 --- a/app/assets/javascripts/discourse/models/topic-details.js.es6 +++ b/app/assets/javascripts/discourse/models/topic-details.js.es6 @@ -1,6 +1,6 @@ +import discourseComputed from "discourse-common/utils/decorators"; import EmberObject from "@ember/object"; import { ajax } from "discourse/lib/ajax"; -import computed from "ember-addons/ember-computed-decorators"; /** A model representing a Topic's details that aren't always present, such as a list of participants. @@ -32,7 +32,7 @@ const TopicDetails = RestModel.extend({ this.set("loaded", true); }, - @computed("notification_level", "notifications_reason_id") + @discourseComputed("notification_level", "notifications_reason_id") notificationReasonText(level, reason) { if (typeof level !== "number") { level = 1; diff --git a/app/assets/javascripts/discourse/models/topic-tracking-state.js.es6 b/app/assets/javascripts/discourse/models/topic-tracking-state.js.es6 index 89eab6119a9..de53d7c35a1 100644 --- a/app/assets/javascripts/discourse/models/topic-tracking-state.js.es6 +++ b/app/assets/javascripts/discourse/models/topic-tracking-state.js.es6 @@ -2,9 +2,9 @@ import { get } from "@ember/object"; import { isEmpty } from "@ember/utils"; import { NotificationLevels } from "discourse/lib/notification-levels"; import { - default as computed, + default as discourseComputed, on -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import { defaultHomepage } from "discourse/lib/utilities"; import PreloadStore from "preload-store"; @@ -206,7 +206,7 @@ const TopicTrackingState = Discourse.Model.extend({ this.set("incomingCount", 0); }, - @computed("incomingCount") + @discourseComputed("incomingCount") hasIncoming(incomingCount) { return incomingCount && incomingCount > 0; }, diff --git a/app/assets/javascripts/discourse/models/topic.js.es6 b/app/assets/javascripts/discourse/models/topic.js.es6 index f4bf6c65339..9590ffcda87 100644 --- a/app/assets/javascripts/discourse/models/topic.js.es6 +++ b/app/assets/javascripts/discourse/models/topic.js.es6 @@ -14,10 +14,10 @@ import { emojiUnescape } from "discourse/lib/text"; import PreloadStore from "preload-store"; import { userPath } from "discourse/lib/url"; import { - default as computed, + default as discourseComputed, observes, on -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; export function loadTopicView(topic, args) { const data = _.merge({}, args); @@ -42,18 +42,18 @@ const Topic = RestModel.extend({ message: null, errorLoading: false, - @computed("last_read_post_number", "highest_post_number") + @discourseComputed("last_read_post_number", "highest_post_number") visited(lastReadPostNumber, highestPostNumber) { // >= to handle case where there are deleted posts at the end of the topic return lastReadPostNumber >= highestPostNumber; }, - @computed("posters.firstObject") + @discourseComputed("posters.firstObject") creator(poster) { return poster && poster.user; }, - @computed("posters.[]") + @discourseComputed("posters.[]") lastPoster(posters) { let user; if (posters && posters.length > 0) { @@ -65,7 +65,7 @@ const Topic = RestModel.extend({ return user || this.creator; }, - @computed("posters.[]", "participants.[]") + @discourseComputed("posters.[]", "participants.[]") featuredUsers(posters, participants) { let users = posters; const maxUserCount = 5; @@ -95,7 +95,7 @@ const Topic = RestModel.extend({ return users; }, - @computed("fancy_title") + @discourseComputed("fancy_title") fancyTitle(title) { let fancyTitle = censor( emojiUnescape(title || ""), @@ -110,7 +110,7 @@ const Topic = RestModel.extend({ }, // returns createdAt if there's no bumped date - @computed("bumped_at", "createdAt") + @discourseComputed("bumped_at", "createdAt") bumpedAt(bumped_at, createdAt) { if (bumped_at) { return new Date(bumped_at); @@ -119,7 +119,7 @@ const Topic = RestModel.extend({ } }, - @computed("bumpedAt", "createdAt") + @discourseComputed("bumpedAt", "createdAt") bumpedAtTitle(bumpedAt, createdAt) { const firstPost = I18n.t("first_post"); const lastPost = I18n.t("last_post"); @@ -129,12 +129,12 @@ const Topic = RestModel.extend({ return `${firstPost}: ${createdAtDate}\n${lastPost}: ${bumpedAtDate}`; }, - @computed("created_at") + @discourseComputed("created_at") createdAt(created_at) { return new Date(created_at); }, - @computed + @discourseComputed postStream() { return this.store.createRecord("postStream", { id: this.id, @@ -142,7 +142,7 @@ const Topic = RestModel.extend({ }); }, - @computed("tags") + @discourseComputed("tags") visibleListTags(tags) { if (!tags || !Discourse.SiteSettings.suppress_overlapping_tags_in_list) { return tags; @@ -160,7 +160,7 @@ const Topic = RestModel.extend({ return newTags; }, - @computed("related_messages") + @discourseComputed("related_messages") relatedMessages(relatedMessages) { if (relatedMessages) { const store = this.store; @@ -172,7 +172,7 @@ const Topic = RestModel.extend({ } }, - @computed("suggested_topics") + @discourseComputed("suggested_topics") suggestedTopics(suggestedTopics) { if (suggestedTopics) { const store = this.store; @@ -184,12 +184,12 @@ const Topic = RestModel.extend({ } }, - @computed("posts_count") + @discourseComputed("posts_count") replyCount(postsCount) { return postsCount - 1; }, - @computed + @discourseComputed details() { return this.store.createRecord("topicDetails", { id: this.id, @@ -200,7 +200,7 @@ const Topic = RestModel.extend({ invisible: not("visible"), deleted: notEmpty("deleted_at"), - @computed("id") + @discourseComputed("id") searchContext(id) { return { type: "topic", id }; }, @@ -223,12 +223,12 @@ const Topic = RestModel.extend({ categoryClass: fmt("category.fullSlug", "category-%@"), - @computed("tags") + @discourseComputed("tags") tagClasses(tags) { return tags && tags.map(t => `tag-${t}`).join(" "); }, - @computed("url") + @discourseComputed("url") shareUrl(url) { const user = Discourse.User.current(); const userQueryString = user ? `?u=${user.get("username_lower")}` : ""; @@ -237,7 +237,7 @@ const Topic = RestModel.extend({ printUrl: fmt("url", "%@/print"), - @computed("id", "slug") + @discourseComputed("id", "slug") url(id, slug) { slug = slug || ""; if (slug.trim().length === 0) { @@ -255,18 +255,18 @@ const Topic = RestModel.extend({ return url; }, - @computed("new_posts", "unread") + @discourseComputed("new_posts", "unread") totalUnread(newPosts, unread) { const count = (unread || 0) + (newPosts || 0); return count > 0 ? count : null; }, - @computed("last_read_post_number", "url") + @discourseComputed("last_read_post_number", "url") lastReadUrl(lastReadPostNumber) { return this.urlForPostNumber(lastReadPostNumber); }, - @computed("last_read_post_number", "highest_post_number", "url") + @discourseComputed("last_read_post_number", "highest_post_number", "url") lastUnreadUrl(lastReadPostNumber, highestPostNumber) { if (highestPostNumber <= lastReadPostNumber) { if (this.get("category.navigate_to_first_post_after_read")) { @@ -279,23 +279,23 @@ const Topic = RestModel.extend({ } }, - @computed("highest_post_number", "url") + @discourseComputed("highest_post_number", "url") lastPostUrl(highestPostNumber) { return this.urlForPostNumber(highestPostNumber); }, - @computed("url") + @discourseComputed("url") firstPostUrl() { return this.urlForPostNumber(1); }, - @computed("url") + @discourseComputed("url") summaryUrl() { const summaryQueryString = this.has_summary ? "?filter=summary" : ""; return `${this.urlForPostNumber(1)}${summaryQueryString}`; }, - @computed("last_poster.username") + @discourseComputed("last_poster.username") lastPosterUrl(username) { return userPath(username); }, @@ -303,7 +303,7 @@ const Topic = RestModel.extend({ // The amount of new posts to display. It might be different than what the server // tells us if we are still asynchronously flushing our "recently read" data. // So take what the browser has seen into consideration. - @computed("new_posts", "id") + @discourseComputed("new_posts", "id") displayNewPosts(newPosts, id) { const highestSeen = Discourse.Session.currentProp("highestSeenByTopic")[id]; if (highestSeen) { @@ -319,7 +319,7 @@ const Topic = RestModel.extend({ return newPosts; }, - @computed("views") + @discourseComputed("views") viewsHeat(v) { if (v >= Discourse.SiteSettings.topic_views_heat_high) { return "heatmap-high"; @@ -333,7 +333,7 @@ const Topic = RestModel.extend({ return null; }, - @computed("archetype") + @discourseComputed("archetype") archetypeObject(archetype) { return Discourse.Site.currentProp("archetypes").findBy("id", archetype); }, @@ -532,14 +532,14 @@ const Topic = RestModel.extend({ }); }, - @computed("excerpt") + @discourseComputed("excerpt") escapedExcerpt(excerpt) { return emojiUnescape(excerpt); }, hasExcerpt: notEmpty("excerpt"), - @computed("excerpt") + @discourseComputed("excerpt") excerptTruncated(excerpt) { return excerpt && excerpt.substr(excerpt.length - 8, 8) === "…"; }, diff --git a/app/assets/javascripts/discourse/models/user-action-stat.js.es6 b/app/assets/javascripts/discourse/models/user-action-stat.js.es6 index fd531cde9ad..0791edd34dd 100644 --- a/app/assets/javascripts/discourse/models/user-action-stat.js.es6 +++ b/app/assets/javascripts/discourse/models/user-action-stat.js.es6 @@ -1,10 +1,10 @@ +import discourseComputed from "discourse-common/utils/decorators"; import RestModel from "discourse/models/rest"; import UserAction from "discourse/models/user-action"; import { i18n } from "discourse/lib/computed"; -import computed from "ember-addons/ember-computed-decorators"; export default RestModel.extend({ - @computed("action_type") + @discourseComputed("action_type") isPM(actionType) { return ( actionType === UserAction.TYPES.messages_sent || @@ -14,7 +14,7 @@ export default RestModel.extend({ description: i18n("action_type", "user_action_groups.%@"), - @computed("action_type") + @discourseComputed("action_type") isResponse(actionType) { return ( actionType === UserAction.TYPES.replies || diff --git a/app/assets/javascripts/discourse/models/user-action.js.es6 b/app/assets/javascripts/discourse/models/user-action.js.es6 index 5ca07e70259..183c47e44b7 100644 --- a/app/assets/javascripts/discourse/models/user-action.js.es6 +++ b/app/assets/javascripts/discourse/models/user-action.js.es6 @@ -1,7 +1,7 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { or, equal, and } from "@ember/object/computed"; import RestModel from "discourse/models/rest"; -import { on } from "ember-addons/ember-computed-decorators"; -import computed from "ember-addons/ember-computed-decorators"; +import { on } from "discourse-common/utils/decorators"; import UserActionGroup from "discourse/models/user-action-group"; import { postUrl } from "discourse/lib/utilities"; import { userPath } from "discourse/lib/url"; @@ -35,7 +35,7 @@ const UserAction = RestModel.extend({ } }, - @computed("action_type") + @discourseComputed("action_type") descriptionKey(action) { if (action === null || UserAction.TO_SHOW.indexOf(action) >= 0) { if (this.isPM) { @@ -66,12 +66,12 @@ const UserAction = RestModel.extend({ } }, - @computed("username") + @discourseComputed("username") sameUser(username) { return username === Discourse.User.currentProp("username"); }, - @computed("target_username") + @discourseComputed("target_username") targetUser(targetUsername) { return targetUsername === Discourse.User.currentProp("username"); }, @@ -80,27 +80,27 @@ const UserAction = RestModel.extend({ targetDisplayName: or("target_name", "target_username"), actingDisplayName: or("acting_name", "acting_username"), - @computed("target_username") + @discourseComputed("target_username") targetUserUrl(username) { return userPath(username); }, - @computed("username") + @discourseComputed("username") usernameLower(username) { return username.toLowerCase(); }, - @computed("usernameLower") + @discourseComputed("usernameLower") userUrl(usernameLower) { return userPath(usernameLower); }, - @computed() + @discourseComputed() postUrl() { return postUrl(this.slug, this.topic_id, this.post_number); }, - @computed() + @discourseComputed() replyUrl() { return postUrl(this.slug, this.topic_id, this.reply_to_post_number); }, @@ -145,7 +145,7 @@ const UserAction = RestModel.extend({ } }, - @computed( + @discourseComputed( "childGroups", "childGroups.likes.items", "childGroups.likes.items.[]", diff --git a/app/assets/javascripts/discourse/models/user-badge.js.es6 b/app/assets/javascripts/discourse/models/user-badge.js.es6 index 511ed71de20..3e00072f6e7 100644 --- a/app/assets/javascripts/discourse/models/user-badge.js.es6 +++ b/app/assets/javascripts/discourse/models/user-badge.js.es6 @@ -1,11 +1,11 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { ajax } from "discourse/lib/ajax"; import Badge from "discourse/models/badge"; -import computed from "ember-addons/ember-computed-decorators"; import { Promise } from "rsvp"; import Topic from "discourse/models/topic"; const UserBadge = Discourse.Model.extend({ - @computed + @discourseComputed postUrl: function() { if (this.topic_title) { return "/t/-/" + this.topic_id + "/" + this.post_number; diff --git a/app/assets/javascripts/discourse/models/user-draft.js.es6 b/app/assets/javascripts/discourse/models/user-draft.js.es6 index 2ab353e92cd..6e31ae3b2f3 100644 --- a/app/assets/javascripts/discourse/models/user-draft.js.es6 +++ b/app/assets/javascripts/discourse/models/user-draft.js.es6 @@ -1,33 +1,32 @@ +import discourseComputed from "discourse-common/utils/decorators"; import RestModel from "discourse/models/rest"; -import computed from "ember-addons/ember-computed-decorators"; import { postUrl } from "discourse/lib/utilities"; import { userPath } from "discourse/lib/url"; import User from "discourse/models/user"; - import { NEW_TOPIC_KEY, NEW_PRIVATE_MESSAGE_KEY } from "discourse/models/composer"; export default RestModel.extend({ - @computed("draft_username") + @discourseComputed("draft_username") editableDraft(draftUsername) { return draftUsername === User.currentProp("username"); }, - @computed("username_lower") + @discourseComputed("username_lower") userUrl(usernameLower) { return userPath(usernameLower); }, - @computed("topic_id") + @discourseComputed("topic_id") postUrl(topicId) { if (!topicId) return; return postUrl(this.slug, this.topic_id, this.post_number); }, - @computed("draft_key") + @discourseComputed("draft_key") draftType(draftKey) { switch (draftKey) { case NEW_TOPIC_KEY: diff --git a/app/assets/javascripts/discourse/models/user-drafts-stream.js.es6 b/app/assets/javascripts/discourse/models/user-drafts-stream.js.es6 index ee1d3cccad7..7472cc8e67c 100644 --- a/app/assets/javascripts/discourse/models/user-drafts-stream.js.es6 +++ b/app/assets/javascripts/discourse/models/user-drafts-stream.js.es6 @@ -1,9 +1,9 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { ajax } from "discourse/lib/ajax"; import { url } from "discourse/lib/computed"; import RestModel from "discourse/models/rest"; import UserDraft from "discourse/models/user-draft"; import { emojiUnescape } from "discourse/lib/text"; -import computed from "ember-addons/ember-computed-decorators"; import { Promise } from "rsvp"; import { NEW_TOPIC_KEY, @@ -38,7 +38,7 @@ export default RestModel.extend({ return this.findItems(); }, - @computed("content.length", "loaded") + @discourseComputed("content.length", "loaded") noContent(contentLength, loaded) { return loaded && contentLength === 0; }, diff --git a/app/assets/javascripts/discourse/models/user-posts-stream.js.es6 b/app/assets/javascripts/discourse/models/user-posts-stream.js.es6 index 74cadcb4553..6213d98d143 100644 --- a/app/assets/javascripts/discourse/models/user-posts-stream.js.es6 +++ b/app/assets/javascripts/discourse/models/user-posts-stream.js.es6 @@ -1,4 +1,4 @@ -import { on } from "ember-addons/ember-computed-decorators"; +import { on } from "discourse-common/utils/decorators"; import { ajax } from "discourse/lib/ajax"; import { url } from "discourse/lib/computed"; import UserAction from "discourse/models/user-action"; diff --git a/app/assets/javascripts/discourse/models/user-stream.js.es6 b/app/assets/javascripts/discourse/models/user-stream.js.es6 index 1a90ebd9403..d411b58cee2 100644 --- a/app/assets/javascripts/discourse/models/user-stream.js.es6 +++ b/app/assets/javascripts/discourse/models/user-stream.js.es6 @@ -5,9 +5,9 @@ import UserAction from "discourse/models/user-action"; import { emojiUnescape } from "discourse/lib/text"; import { Promise } from "rsvp"; import { - default as computed, + default as discourseComputed, on -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; export default RestModel.extend({ loaded: false, @@ -17,7 +17,7 @@ export default RestModel.extend({ this.setProperties({ itemsLoaded: 0, content: [] }); }, - @computed("filter") + @discourseComputed("filter") filterParam(filter) { if (filter === Discourse.UserAction.TYPES.replies) { return [UserAction.TYPES.replies, UserAction.TYPES.quotes].join(","); @@ -51,7 +51,7 @@ export default RestModel.extend({ return this.findItems(); }, - @computed("loaded", "content.[]") + @discourseComputed("loaded", "content.[]") noContent(loaded, content) { return loaded && content.length === 0; }, diff --git a/app/assets/javascripts/discourse/models/user.js.es6 b/app/assets/javascripts/discourse/models/user.js.es6 index af2a0dd2fc3..8b7289d5ce3 100644 --- a/app/assets/javascripts/discourse/models/user.js.es6 +++ b/app/assets/javascripts/discourse/models/user.js.es6 @@ -9,9 +9,9 @@ import UserPostsStream from "discourse/models/user-posts-stream"; import Singleton from "discourse/mixins/singleton"; import { longDate } from "discourse/lib/formatter"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import Badge from "discourse/models/badge"; import UserBadge from "discourse/models/user-badge"; import UserActionStat from "discourse/models/user-action-stat"; @@ -43,22 +43,22 @@ const User = RestModel.extend({ reason: null }, - @computed("can_be_deleted", "post_count") + @discourseComputed("can_be_deleted", "post_count") canBeDeleted(canBeDeleted, postCount) { return canBeDeleted && postCount <= 5; }, - @computed() + @discourseComputed() stream() { return UserStream.create({ user: this }); }, - @computed() + @discourseComputed() postsStream() { return UserPostsStream.create({ user: this }); }, - @computed() + @discourseComputed() userDraftsStream() { return UserDraftsStream.create({ user: this }); }, @@ -78,7 +78,7 @@ const User = RestModel.extend({ return ajax(`/session/${this.username}`, { type: "DELETE" }); }, - @computed("username_lower") + @discourseComputed("username_lower") searchContext(username) { return { type: "user", @@ -87,7 +87,7 @@ const User = RestModel.extend({ }; }, - @computed("username", "name") + @discourseComputed("username", "name") displayName(username, name) { if (Discourse.SiteSettings.enable_names && !isEmpty(name)) { return name; @@ -95,7 +95,7 @@ const User = RestModel.extend({ return username; }, - @computed("profile_background_upload_url") + @discourseComputed("profile_background_upload_url") profileBackgroundUrl(bgUrl) { if (isEmpty(bgUrl) || !Discourse.SiteSettings.allow_profile_backgrounds) { return "".htmlSafe(); @@ -107,13 +107,13 @@ const User = RestModel.extend({ ).htmlSafe(); }, - @computed() + @discourseComputed() path() { // no need to observe, requires a hard refresh to update return userPath(this.username_lower); }, - @computed() + @discourseComputed() userApiKeys() { const keys = this.user_api_keys; if (keys) { @@ -171,33 +171,33 @@ const User = RestModel.extend({ adminPath: url("id", "username_lower", "/admin/users/%@1/%@2"), - @computed() + @discourseComputed() mutedTopicsPath() { return defaultHomepage() === "latest" ? Discourse.getURL("/?state=muted") : Discourse.getURL("/latest?state=muted"); }, - @computed() + @discourseComputed() watchingTopicsPath() { return defaultHomepage() === "latest" ? Discourse.getURL("/?state=watching") : Discourse.getURL("/latest?state=watching"); }, - @computed() + @discourseComputed() trackingTopicsPath() { return defaultHomepage() === "latest" ? Discourse.getURL("/?state=tracking") : Discourse.getURL("/latest?state=tracking"); }, - @computed("username") + @discourseComputed("username") username_lower(username) { return username.toLowerCase(); }, - @computed("trust_level") + @discourseComputed("trust_level") trustLevel(trustLevel) { return Discourse.Site.currentProp("trustLevels").findBy( "id", @@ -210,26 +210,26 @@ const User = RestModel.extend({ isElder: equal("trust_level", 4), canManageTopic: or("staff", "isElder"), - @computed("previous_visit_at") + @discourseComputed("previous_visit_at") previousVisitAt(previous_visit_at) { return new Date(previous_visit_at); }, - @computed("suspended_till") + @discourseComputed("suspended_till") suspended(suspendedTill) { return suspendedTill && moment(suspendedTill).isAfter(); }, - @computed("suspended_till") + @discourseComputed("suspended_till") suspendedForever: isForever, - @computed("silenced_till") + @discourseComputed("silenced_till") silencedForever: isForever, - @computed("suspended_till") + @discourseComputed("suspended_till") suspendedTillDate: longDate, - @computed("silenced_till") + @discourseComputed("silenced_till") silencedTillDate: longDate, changeUsername(new_username) { @@ -492,7 +492,7 @@ const User = RestModel.extend({ numGroupsToDisplay: 2, - @computed("groups.[]") + @discourseComputed("groups.[]") filteredGroups() { const groups = this.groups || []; @@ -501,19 +501,19 @@ const User = RestModel.extend({ }); }, - @computed("filteredGroups", "numGroupsToDisplay") + @discourseComputed("filteredGroups", "numGroupsToDisplay") displayGroups(filteredGroups, numGroupsToDisplay) { const groups = filteredGroups.slice(0, numGroupsToDisplay); return groups.length === 0 ? null : groups; }, - @computed("filteredGroups", "numGroupsToDisplay") + @discourseComputed("filteredGroups", "numGroupsToDisplay") showMoreGroupsLink(filteredGroups, numGroupsToDisplay) { return filteredGroups.length > numGroupsToDisplay; }, // The user's stat count, excluding PMs. - @computed("statsExcludingPms.@each.count") + @discourseComputed("statsExcludingPms.@each.count") statsCountNonPM() { if (isEmpty(this.statsExcludingPms)) return 0; let count = 0; @@ -526,7 +526,7 @@ const User = RestModel.extend({ }, // The user's stats, excluding PMs. - @computed("stats.@each.isPM") + @discourseComputed("stats.@each.isPM") statsExcludingPms() { if (isEmpty(this.stats)) return []; return this.stats.rejectBy("isPM"); @@ -661,7 +661,7 @@ const User = RestModel.extend({ ); }, - @computed("can_delete_account") + @discourseComputed("can_delete_account") canDeleteAccount(canDeleteAccount) { return !Discourse.SiteSettings.enable_sso && canDeleteAccount; }, @@ -768,7 +768,7 @@ const User = RestModel.extend({ : this.admin || group.get("is_group_owner"); }, - @computed("groups.@each.title", "badges.[]") + @discourseComputed("groups.@each.title", "badges.[]") availableTitles() { let titles = []; @@ -794,7 +794,7 @@ const User = RestModel.extend({ }); }, - @computed("user_option.text_size_seq", "user_option.text_size") + @discourseComputed("user_option.text_size_seq", "user_option.text_size") currentTextSize(serverSeq, serverSize) { if ($.cookie("text_size")) { const [cookieSize, cookieSeq] = $.cookie("text_size").split("|"); @@ -817,7 +817,7 @@ const User = RestModel.extend({ } }, - @computed("second_factor_enabled", "staff") + @discourseComputed("second_factor_enabled", "staff") enforcedSecondFactor(secondFactorEnabled, staff) { const enforce = Discourse.SiteSettings.enforce_second_factor; return ( diff --git a/app/assets/javascripts/discourse/raw-views/list/post-count-or-badges.js.es6 b/app/assets/javascripts/discourse/raw-views/list/post-count-or-badges.js.es6 index d7c5f0aa068..20b15a3ebd2 100644 --- a/app/assets/javascripts/discourse/raw-views/list/post-count-or-badges.js.es6 +++ b/app/assets/javascripts/discourse/raw-views/list/post-count-or-badges.js.es6 @@ -1,12 +1,12 @@ import { or, and } from "@ember/object/computed"; import EmberObject from "@ember/object"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; export default EmberObject.extend({ postCountsPresent: or("topic.unread", "topic.displayNewPosts"), showBadges: and("postBadgesEnabled", "postCountsPresent"), - @computed + @discourseComputed newDotText() { return this.currentUser && this.currentUser.trust_level > 0 ? "" diff --git a/app/assets/javascripts/discourse/raw-views/list/posts-count-column.js.es6 b/app/assets/javascripts/discourse/raw-views/list/posts-count-column.js.es6 index 2c7ca4c9b9c..12a27f3a22f 100644 --- a/app/assets/javascripts/discourse/raw-views/list/posts-count-column.js.es6 +++ b/app/assets/javascripts/discourse/raw-views/list/posts-count-column.js.es6 @@ -1,11 +1,11 @@ +import discourseComputed from "discourse-common/utils/decorators"; import EmberObject from "@ember/object"; -import computed from "ember-addons/ember-computed-decorators"; import { fmt } from "discourse/lib/computed"; export default EmberObject.extend({ tagName: "td", - @computed("topic.like_count", "topic.posts_count") + @discourseComputed("topic.like_count", "topic.posts_count") ratio(likeCount, postCount) { const likes = parseFloat(likeCount); const posts = parseFloat(postCount); @@ -17,12 +17,12 @@ export default EmberObject.extend({ return (likes || 0) / posts; }, - @computed("topic.replyCount", "ratioText") + @discourseComputed("topic.replyCount", "ratioText") title(count, ratio) { return I18n.messageFormat("posts_likes_MF", { count, ratio }).trim(); }, - @computed("ratio") + @discourseComputed("ratio") ratioText(ratio) { const settings = this.siteSettings; if (ratio > settings.topic_post_like_heat_high) { diff --git a/app/assets/javascripts/discourse/raw-views/list/visited-line.js.es6 b/app/assets/javascripts/discourse/raw-views/list/visited-line.js.es6 index b2aac575506..2428c810123 100644 --- a/app/assets/javascripts/discourse/raw-views/list/visited-line.js.es6 +++ b/app/assets/javascripts/discourse/raw-views/list/visited-line.js.es6 @@ -1,8 +1,8 @@ +import discourseComputed from "discourse-common/utils/decorators"; import EmberObject from "@ember/object"; -import computed from "ember-addons/ember-computed-decorators"; export default EmberObject.extend({ - @computed + @discourseComputed isLastVisited: function() { return this.lastVisitedTopic === this.topic; } diff --git a/app/assets/javascripts/discourse/raw-views/topic-list-header-column.js.es6 b/app/assets/javascripts/discourse/raw-views/topic-list-header-column.js.es6 index 0ac85216b7f..e5b44af68ec 100644 --- a/app/assets/javascripts/discourse/raw-views/topic-list-header-column.js.es6 +++ b/app/assets/javascripts/discourse/raw-views/topic-list-header-column.js.es6 @@ -1,8 +1,8 @@ import EmberObject from "@ember/object"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; export default EmberObject.extend({ - @computed + @discourseComputed localizedName() { if (this.forceName) { return this.forceName; @@ -11,18 +11,18 @@ export default EmberObject.extend({ return this.name ? I18n.t(this.name) : ""; }, - @computed + @discourseComputed sortIcon() { const asc = this.parent.ascending ? "up" : "down"; return `chevron-${asc}`; }, - @computed + @discourseComputed isSorting() { return this.sortable && this.parent.order === this.order; }, - @computed + @discourseComputed className() { const name = []; diff --git a/app/assets/javascripts/discourse/raw-views/topic-status.js.es6 b/app/assets/javascripts/discourse/raw-views/topic-status.js.es6 index 8e7269bbca8..d6b2c749995 100644 --- a/app/assets/javascripts/discourse/raw-views/topic-status.js.es6 +++ b/app/assets/javascripts/discourse/raw-views/topic-status.js.es6 @@ -1,15 +1,15 @@ +import discourseComputed from "discourse-common/utils/decorators"; import EmberObject from "@ember/object"; -import computed from "ember-addons/ember-computed-decorators"; export default EmberObject.extend({ showDefault: null, - @computed("defaultIcon") + @discourseComputed("defaultIcon") renderDiv(defaultIcon) { return (defaultIcon || this.statuses.length > 0) && !this.noDiv; }, - @computed + @discourseComputed statuses() { const topic = this.topic; const results = []; diff --git a/app/assets/javascripts/discourse/services/logs-notice.js.es6 b/app/assets/javascripts/discourse/services/logs-notice.js.es6 index 73961054a1e..9d124edf0b7 100644 --- a/app/assets/javascripts/discourse/services/logs-notice.js.es6 +++ b/app/assets/javascripts/discourse/services/logs-notice.js.es6 @@ -1,10 +1,10 @@ import { isEmpty } from "@ember/utils"; import EmberObject from "@ember/object"; import { - default as computed, + default as discourseComputed, on, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import { autoUpdatingRelativeAge } from "discourse/lib/formatter"; const LOGS_NOTICE_KEY = "logs-notice-text"; @@ -47,22 +47,22 @@ const LogsNotice = EmberObject.extend({ }); }, - @computed("text") + @discourseComputed("text") isEmpty(text) { return isEmpty(text); }, - @computed("text") + @discourseComputed("text") message(text) { return new Handlebars.SafeString(text); }, - @computed("currentUser") + @discourseComputed("currentUser") isAdmin(currentUser) { return currentUser && currentUser.admin; }, - @computed("isEmpty", "isAdmin") + @discourseComputed("isEmpty", "isAdmin") hidden(thisIsEmpty, isAdmin) { return !isAdmin || thisIsEmpty; }, @@ -72,7 +72,7 @@ const LogsNotice = EmberObject.extend({ this.keyValueStore.setItem(LOGS_NOTICE_KEY, this.text); }, - @computed( + @discourseComputed( "siteSettings.alert_admins_if_errors_per_hour", "siteSettings.alert_admins_if_errors_per_minute" ) diff --git a/app/assets/javascripts/discourse/services/search.js.es6 b/app/assets/javascripts/discourse/services/search.js.es6 index 641e35e4825..c9e51f43c8a 100644 --- a/app/assets/javascripts/discourse/services/search.js.es6 +++ b/app/assets/javascripts/discourse/services/search.js.es6 @@ -1,9 +1,9 @@ import { get } from "@ember/object"; import EmberObject from "@ember/object"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; export default EmberObject.extend({ searchContextEnabled: false, // checkbox to scope search @@ -16,7 +16,7 @@ export default EmberObject.extend({ this.set("highlightTerm", this.term); }, - @computed("searchContext") + @discourseComputed("searchContext") contextType: { get(searchContext) { if (searchContext) { diff --git a/app/assets/javascripts/discourse/templates/components/reviewable-score.js.es6 b/app/assets/javascripts/discourse/templates/components/reviewable-score.js.es6 index 291db6c2384..ee36959c616 100644 --- a/app/assets/javascripts/discourse/templates/components/reviewable-score.js.es6 +++ b/app/assets/javascripts/discourse/templates/components/reviewable-score.js.es6 @@ -1,13 +1,13 @@ +import discourseComputed from "discourse-common/utils/decorators"; import { gt } from "@ember/object/computed"; import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; export default Component.extend({ tagName: "", showStatus: gt("rs.status", 0), - @computed("rs.score_type.title", "reviewable.target_created_by") + @discourseComputed("rs.score_type.title", "reviewable.target_created_by") title(title, targetCreatedBy) { if (title && targetCreatedBy) { return title.replace("{{username}}", targetCreatedBy.username); diff --git a/app/assets/javascripts/ember-addons/decorator-alias.js.es6 b/app/assets/javascripts/ember-addons/decorator-alias.js.es6 index 44d911a1ddd..327dc7a2cbc 100644 --- a/app/assets/javascripts/ember-addons/decorator-alias.js.es6 +++ b/app/assets/javascripts/ember-addons/decorator-alias.js.es6 @@ -2,7 +2,7 @@ import extractValue from "./utils/extract-value"; export default function decoratorAlias(fn, errorMessage) { return function(...params) { - // determine if user called as @computed('blah', 'blah') or @computed + // determine if user called as @discourseComputed('blah', 'blah') or @discourseComputed if (params.length === 0) { throw new Error(errorMessage); } else { diff --git a/app/assets/javascripts/pretty-text/engines/discourse-markdown/onebox.js.es6 b/app/assets/javascripts/pretty-text/engines/discourse-markdown/onebox.js.es6 index 3203110c946..7358bdaa062 100644 --- a/app/assets/javascripts/pretty-text/engines/discourse-markdown/onebox.js.es6 +++ b/app/assets/javascripts/pretty-text/engines/discourse-markdown/onebox.js.es6 @@ -1,6 +1,5 @@ import { lookupCache } from "pretty-text/oneboxer-cache"; import { cachedInlineOnebox } from "pretty-text/inline-oneboxer"; - import { INLINE_ONEBOX_LOADING_CSS_CLASS, INLINE_ONEBOX_CSS_CLASS diff --git a/app/assets/javascripts/select-kit/components/admin-group-selector.js.es6 b/app/assets/javascripts/select-kit/components/admin-group-selector.js.es6 index ddc883ee077..2d99404c0af 100644 --- a/app/assets/javascripts/select-kit/components/admin-group-selector.js.es6 +++ b/app/assets/javascripts/select-kit/components/admin-group-selector.js.es6 @@ -1,5 +1,6 @@ import MultiSelectComponent from "select-kit/components/multi-select"; -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; + const { makeArray } = Ember; export default MultiSelectComponent.extend({ @@ -10,7 +11,7 @@ export default MultiSelectComponent.extend({ allowAny: false, buffer: null, - @computed("buffer") + @discourseComputed("buffer") values(buffer) { return buffer === null ? makeArray(this.selected).map(s => this.valueForContentItem(s)) diff --git a/app/assets/javascripts/select-kit/components/category-chooser.js.es6 b/app/assets/javascripts/select-kit/components/category-chooser.js.es6 index a1d453aa2a8..8a91e9868e2 100644 --- a/app/assets/javascripts/select-kit/components/category-chooser.js.es6 +++ b/app/assets/javascripts/select-kit/components/category-chooser.js.es6 @@ -1,5 +1,5 @@ import ComboBoxComponent from "select-kit/components/combo-box"; -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; import PermissionType from "discourse/models/permission-type"; import Category from "discourse/models/category"; import { categoryBadgeHTML } from "discourse/helpers/category-link"; @@ -53,7 +53,7 @@ export default ComboBoxComponent.extend({ }); }, - @computed("rootNone", "rootNoneLabel") + @discourseComputed("rootNone", "rootNoneLabel") none(rootNone, rootNoneLabel) { if ( this.siteSettings.allow_uncategorized_topics || diff --git a/app/assets/javascripts/select-kit/components/category-drop.js.es6 b/app/assets/javascripts/select-kit/components/category-drop.js.es6 index 425c2bb038b..25f72b2655a 100644 --- a/app/assets/javascripts/select-kit/components/category-drop.js.es6 +++ b/app/assets/javascripts/select-kit/components/category-drop.js.es6 @@ -1,6 +1,6 @@ import ComboBoxComponent from "select-kit/components/combo-box"; import DiscourseURL from "discourse/lib/url"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import Category from "discourse/models/category"; import { categoryBadgeHTML } from "discourse/helpers/category-link"; const { isEmpty } = Ember; @@ -23,7 +23,12 @@ export default ComboBoxComponent.extend({ subCategory: false, isAsync: Ember.computed.not("subCategory"), - @computed("categories", "hasSelection", "subCategory", "noSubcategories") + @discourseComputed( + "categories", + "hasSelection", + "subCategory", + "noSubcategories" + ) categoriesWithShortcuts( categories, hasSelection, @@ -70,7 +75,7 @@ export default ComboBoxComponent.extend({ this.forceValue(this.get("category.id")); }, - @computed("content") + @discourseComputed("content") filterable(content) { const contentLength = (content && content.length) || 0; return ( @@ -107,7 +112,7 @@ export default ComboBoxComponent.extend({ return content; }, - @computed("parentCategory.name", "subCategory") + @discourseComputed("parentCategory.name", "subCategory") allCategoriesLabel(categoryName, subCategory) { if (subCategory) { return I18n.t("categories.all_subcategories", { categoryName }); @@ -115,12 +120,12 @@ export default ComboBoxComponent.extend({ return I18n.t("categories.all"); }, - @computed("parentCategory.url", "subCategory") + @discourseComputed("parentCategory.url", "subCategory") allCategoriesUrl(parentCategoryUrl, subCategory) { return Discourse.getURL(subCategory ? parentCategoryUrl || "/" : "/"); }, - @computed("parentCategory.url") + @discourseComputed("parentCategory.url") noCategoriesUrl(parentCategoryUrl) { return Discourse.getURL(`${parentCategoryUrl}/none`); }, diff --git a/app/assets/javascripts/select-kit/components/category-drop/category-drop-header.js.es6 b/app/assets/javascripts/select-kit/components/category-drop/category-drop-header.js.es6 index c04fc30840c..ad86019a19e 100644 --- a/app/assets/javascripts/select-kit/components/category-drop/category-drop-header.js.es6 +++ b/app/assets/javascripts/select-kit/components/category-drop/category-drop-header.js.es6 @@ -1,6 +1,6 @@ import { isEmpty } from "@ember/utils"; import ComboBoxSelectBoxHeaderComponent from "select-kit/components/combo-box/combo-box-header"; -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; import Category from "discourse/models/category"; export default ComboBoxSelectBoxHeaderComponent.extend({ @@ -11,7 +11,7 @@ export default ComboBoxSelectBoxHeaderComponent.extend({ classNameBindings: ["categoryStyleClass"], categoryStyleClass: Ember.computed.alias("site.category_style"), - @computed("computedContent.value", "computedContent.name") + @discourseComputed("computedContent.value", "computedContent.name") category(value, name) { if (isEmpty(value)) { const uncat = Category.findUncategorized(); @@ -23,17 +23,17 @@ export default ComboBoxSelectBoxHeaderComponent.extend({ } }, - @computed("category.color") + @discourseComputed("category.color") categoryBackgroundColor(categoryColor) { return categoryColor || "#e9e9e9"; }, - @computed("category.text_color") + @discourseComputed("category.text_color") categoryTextColor(categoryTextColor) { return categoryTextColor || "#333"; }, - @computed("category", "categoryBackgroundColor", "categoryTextColor") + @discourseComputed("category", "categoryBackgroundColor", "categoryTextColor") categoryStyle(category, categoryBackgroundColor, categoryTextColor) { const categoryStyle = this.siteSettings.category_style; diff --git a/app/assets/javascripts/select-kit/components/category-row.js.es6 b/app/assets/javascripts/select-kit/components/category-row.js.es6 index 8523bfb07e2..d2a548164ed 100644 --- a/app/assets/javascripts/select-kit/components/category-row.js.es6 +++ b/app/assets/javascripts/select-kit/components/category-row.js.es6 @@ -1,6 +1,6 @@ import { isEmpty } from "@ember/utils"; import SelectKitRowComponent from "select-kit/components/select-kit/select-kit-row"; -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; import Category from "discourse/models/category"; import { categoryBadgeHTML } from "discourse/helpers/category-link"; @@ -12,7 +12,7 @@ export default SelectKitRowComponent.extend({ allowUncategorized: Ember.computed.bool("options.allowUncategorized"), categoryLink: Ember.computed.bool("options.categoryLink"), - @computed("options.displayCategoryDescription") + @discourseComputed("options.displayCategoryDescription") displayCategoryDescription(displayCategoryDescription) { if (Ember.isNone(displayCategoryDescription)) { return true; @@ -21,12 +21,12 @@ export default SelectKitRowComponent.extend({ return displayCategoryDescription; }, - @computed("descriptionText", "description", "category.name") + @discourseComputed("descriptionText", "description", "category.name") title(descriptionText, description, name) { return descriptionText || description || name; }, - @computed("computedContent.value", "computedContent.name") + @discourseComputed("computedContent.value", "computedContent.name") category(value, name) { if (isEmpty(value)) { const uncat = Category.findUncategorized(); @@ -38,7 +38,7 @@ export default SelectKitRowComponent.extend({ } }, - @computed("category", "parentCategory") + @discourseComputed("category", "parentCategory") badgeForCategory(category, parentCategory) { return categoryBadgeHTML(category, { link: this.categoryLink, @@ -47,7 +47,7 @@ export default SelectKitRowComponent.extend({ }).htmlSafe(); }, - @computed("parentCategory") + @discourseComputed("parentCategory") badgeForParentCategory(parentCategory) { return categoryBadgeHTML(parentCategory, { link: this.categoryLink, @@ -55,22 +55,22 @@ export default SelectKitRowComponent.extend({ }).htmlSafe(); }, - @computed("parentCategoryid") + @discourseComputed("parentCategoryid") parentCategory(parentCategoryId) { return Category.findById(parentCategoryId); }, - @computed("parentCategoryid") + @discourseComputed("parentCategoryid") hasParentCategory(parentCategoryid) { return !Ember.isNone(parentCategoryid); }, - @computed("category") + @discourseComputed("category") parentCategoryid(category) { return category.get("parent_category_id"); }, - @computed( + @discourseComputed( "category.totalTopicCount", "category.topic_count", "options.countSubcategories" @@ -79,19 +79,19 @@ export default SelectKitRowComponent.extend({ return countSubcats ? totalCount : topicCount; }, - @computed("displayCategoryDescription", "category.description") + @discourseComputed("displayCategoryDescription", "category.description") shouldDisplayDescription(displayCategoryDescription, description) { return displayCategoryDescription && description && description !== "null"; }, - @computed("category.description_text") + @discourseComputed("category.description_text") descriptionText(descriptionText) { if (descriptionText) { return this._formatCategoryDescription(descriptionText); } }, - @computed("category.description") + @discourseComputed("category.description") description(description) { if (description) { return this._formatCategoryDescription(description); diff --git a/app/assets/javascripts/select-kit/components/color-palettes/color-palettes-row.js.es6 b/app/assets/javascripts/select-kit/components/color-palettes/color-palettes-row.js.es6 index e0ae6b7039f..7aa53eb5965 100644 --- a/app/assets/javascripts/select-kit/components/color-palettes/color-palettes-row.js.es6 +++ b/app/assets/javascripts/select-kit/components/color-palettes/color-palettes-row.js.es6 @@ -1,13 +1,13 @@ import { escapeExpression } from "discourse/lib/utilities"; import SelectKitRowComponent from "select-kit/components/select-kit/select-kit-row"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; export default SelectKitRowComponent.extend({ layoutName: "select-kit/templates/components/color-palettes/color-palettes-row", classNames: "color-palettes-row", - @computed("computedContent.originalContent.colors") + @discourseComputed("computedContent.originalContent.colors") colors(colors) { return (colors || []).map(color => `#${escapeExpression(color.hex)}`); } diff --git a/app/assets/javascripts/select-kit/components/combo-box.js.es6 b/app/assets/javascripts/select-kit/components/combo-box.js.es6 index 09e8a7c7bdf..71928d314f7 100644 --- a/app/assets/javascripts/select-kit/components/combo-box.js.es6 +++ b/app/assets/javascripts/select-kit/components/combo-box.js.es6 @@ -1,8 +1,8 @@ import SingleSelectComponent from "select-kit/components/single-select"; import { on, - default as computed -} from "ember-addons/ember-computed-decorators"; + default as discourseComputed +} from "discourse-common/utils/decorators"; export default SingleSelectComponent.extend({ pluginApiIdentifiers: ["combo-box"], @@ -20,7 +20,7 @@ export default SingleSelectComponent.extend({ return content; }, - @computed("isExpanded", "caretUpIcon", "caretDownIcon") + @discourseComputed("isExpanded", "caretUpIcon", "caretDownIcon") caretIcon(isExpanded, caretUpIcon, caretDownIcon) { return isExpanded ? caretUpIcon : caretDownIcon; }, diff --git a/app/assets/javascripts/select-kit/components/composer-actions.js.es6 b/app/assets/javascripts/select-kit/components/composer-actions.js.es6 index 98b1d06410b..e36b27f15e6 100644 --- a/app/assets/javascripts/select-kit/components/composer-actions.js.es6 +++ b/app/assets/javascripts/select-kit/components/composer-actions.js.es6 @@ -1,5 +1,5 @@ import DropdownSelectBoxComponent from "select-kit/components/dropdown-select-box"; -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; import { PRIVATE_MESSAGE, CREATE_TOPIC, @@ -76,7 +76,7 @@ export default DropdownSelectBoxComponent.extend({ return content; }, - @computed("options", "canWhisper", "action") + @discourseComputed("options", "canWhisper", "action") content(options, canWhisper, action) { let items = []; diff --git a/app/assets/javascripts/select-kit/components/dropdown-select-box.js.es6 b/app/assets/javascripts/select-kit/components/dropdown-select-box.js.es6 index 1bbf6d510ee..77c1927e96c 100644 --- a/app/assets/javascripts/select-kit/components/dropdown-select-box.js.es6 +++ b/app/assets/javascripts/select-kit/components/dropdown-select-box.js.es6 @@ -1,5 +1,5 @@ import SingleSelectComponent from "select-kit/components/single-select"; -import { on } from "ember-addons/ember-computed-decorators"; +import { on } from "discourse-common/utils/decorators"; export default SingleSelectComponent.extend({ pluginApiIdentifiers: ["dropdown-select-box"], diff --git a/app/assets/javascripts/select-kit/components/dropdown-select-box/dropdown-select-box-header.js.es6 b/app/assets/javascripts/select-kit/components/dropdown-select-box/dropdown-select-box-header.js.es6 index 1acccd3067c..d83156c0185 100644 --- a/app/assets/javascripts/select-kit/components/dropdown-select-box/dropdown-select-box-header.js.es6 +++ b/app/assets/javascripts/select-kit/components/dropdown-select-box/dropdown-select-box-header.js.es6 @@ -1,5 +1,5 @@ import SelectKitHeaderComponent from "select-kit/components/select-kit/select-kit-header"; -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; export default SelectKitHeaderComponent.extend({ layoutName: @@ -9,7 +9,7 @@ export default SelectKitHeaderComponent.extend({ classNameBindings: ["btnClassName"], - @computed("options.showFullTitle") + @discourseComputed("options.showFullTitle") btnClassName(showFullTitle) { return `btn ${showFullTitle ? "btn-icon-text" : "no-text btn-icon"}`; } diff --git a/app/assets/javascripts/select-kit/components/group-dropdown.js.es6 b/app/assets/javascripts/select-kit/components/group-dropdown.js.es6 index 882bf46cb98..a53988a953c 100644 --- a/app/assets/javascripts/select-kit/components/group-dropdown.js.es6 +++ b/app/assets/javascripts/select-kit/components/group-dropdown.js.es6 @@ -1,6 +1,6 @@ import ComboBoxComponent from "select-kit/components/combo-box"; import DiscourseURL from "discourse/lib/url"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; export default ComboBoxComponent.extend({ pluginApiIdentifiers: ["group-dropdown"], @@ -12,7 +12,7 @@ export default ComboBoxComponent.extend({ allowAutoSelectFirst: false, valueAttribute: "name", - @computed("content") + @discourseComputed("content") filterable(content) { return content && content.length >= 10; }, @@ -27,7 +27,7 @@ export default ComboBoxComponent.extend({ return content; }, - @computed + @discourseComputed collectionHeader() { if ( this.siteSettings.enable_group_directory || diff --git a/app/assets/javascripts/select-kit/components/mini-tag-chooser.js.es6 b/app/assets/javascripts/select-kit/components/mini-tag-chooser.js.es6 index c32e15e19ae..5a2fe7a73e8 100644 --- a/app/assets/javascripts/select-kit/components/mini-tag-chooser.js.es6 +++ b/app/assets/javascripts/select-kit/components/mini-tag-chooser.js.es6 @@ -1,7 +1,7 @@ import Category from "discourse/models/category"; import ComboBox from "select-kit/components/combo-box"; import TagsMixin from "select-kit/mixins/tags"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import renderTag from "discourse/lib/render-tag"; import { escapeExpression } from "discourse/lib/utilities"; import { makeArray } from "discourse-common/lib/helpers"; @@ -55,7 +55,7 @@ export default ComboBox.extend(TagsMixin, { ); }, - @computed( + @discourseComputed( "computedValue", "filter", "collectionComputedContent.[]", @@ -98,12 +98,12 @@ export default ComboBox.extend(TagsMixin, { ); }, - @computed("hasReachedMaximum") + @discourseComputed("hasReachedMaximum") caretIcon(hasReachedMaximum) { return hasReachedMaximum ? null : "plus"; }, - @computed("tags") + @discourseComputed("tags") selection(tags) { return makeArray(tags).map(c => this.computeContentItem(c)); }, @@ -139,7 +139,7 @@ export default ComboBox.extend(TagsMixin, { return true; }, - @computed("tags.[]", "filter", "highlightedSelection.[]") + @discourseComputed("tags.[]", "filter", "highlightedSelection.[]") collectionHeader(tags, filter, highlightedSelection) { if (!isEmpty(tags)) { let output = ""; diff --git a/app/assets/javascripts/select-kit/components/multi-select.js.es6 b/app/assets/javascripts/select-kit/components/multi-select.js.es6 index 2bb2bbb610a..40a5dc7f0be 100644 --- a/app/assets/javascripts/select-kit/components/multi-select.js.es6 +++ b/app/assets/javascripts/select-kit/components/multi-select.js.es6 @@ -1,6 +1,8 @@ import SelectKitComponent from "select-kit/components/select-kit"; -import computed from "ember-addons/ember-computed-decorators"; -import { on } from "ember-addons/ember-computed-decorators"; +import { + default as discourseComputed, + on +} from "discourse-common/utils/decorators"; const { get, isNone, isEmpty, makeArray, run } = Ember; import { applyOnSelectPluginApiCallbacks, @@ -67,7 +69,7 @@ export default SelectKitComponent.extend({ }); }, - @computed("filter", "shouldDisplayCreateRow") + @discourseComputed("filter", "shouldDisplayCreateRow") createRowComputedContent(filter, shouldDisplayCreateRow) { if (shouldDisplayCreateRow) { let content = this.createContentFromInput(filter); @@ -75,12 +77,12 @@ export default SelectKitComponent.extend({ } }, - @computed("filter", "computedValues") + @discourseComputed("filter", "computedValues") shouldDisplayCreateRow(filter, computedValues) { return this._super() && !computedValues.includes(filter); }, - @computed + @discourseComputed shouldDisplayFilter() { return true; }, @@ -126,7 +128,7 @@ export default SelectKitComponent.extend({ }); }, - @computed("computedAsyncContent.[]", "computedValues.[]") + @discourseComputed("computedAsyncContent.[]", "computedValues.[]") filteredAsyncComputedContent(computedAsyncContent, computedValues) { computedAsyncContent = computedAsyncContent.filter(c => { return !computedValues.includes(get(c, "value")); @@ -139,7 +141,7 @@ export default SelectKitComponent.extend({ return computedAsyncContent; }, - @computed("computedContent.[]", "computedValues.[]", "filter") + @discourseComputed("computedContent.[]", "computedValues.[]", "filter") filteredComputedContent(computedContent, computedValues, filter) { computedContent = computedContent.filter(c => { return !computedValues.includes(get(c, "value")); @@ -182,7 +184,7 @@ export default SelectKitComponent.extend({ return content; }, - @computed("filter") + @discourseComputed("filter") templateForCreateRow() { return rowComponent => { return I18n.t("select_kit.create", { @@ -195,7 +197,7 @@ export default SelectKitComponent.extend({ return this._super() && !this.hasReachedMaximum; }, - @computed("computedValues.[]", "computedContent.[]") + @discourseComputed("computedValues.[]", "computedContent.[]") selection(computedValues, computedContent) { const selected = []; @@ -207,7 +209,7 @@ export default SelectKitComponent.extend({ return selected; }, - @computed("selection.[]") + @discourseComputed("selection.[]") hasSelection(selection) { return !isEmpty(selection); }, diff --git a/app/assets/javascripts/select-kit/components/multi-select/multi-select-filter.js.es6 b/app/assets/javascripts/select-kit/components/multi-select/multi-select-filter.js.es6 index e9b92334484..3732ccd914c 100644 --- a/app/assets/javascripts/select-kit/components/multi-select/multi-select-filter.js.es6 +++ b/app/assets/javascripts/select-kit/components/multi-select/multi-select-filter.js.es6 @@ -1,4 +1,4 @@ -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; const { isEmpty } = Ember; import SelectKitFilterComponent from "select-kit/components/select-kit/select-kit-filter"; @@ -6,8 +6,8 @@ export default SelectKitFilterComponent.extend({ layoutName: "select-kit/templates/components/select-kit/select-kit-filter", classNames: ["multi-select-filter"], - @computed("placeholder", "hasSelection") - computedPlaceholder(placeholder, hasSelection) { + @discourseComputed("placeholder", "hasSelection") + discourseComputedPlaceholder(placeholder, hasSelection) { if (hasSelection) return ""; return isEmpty(placeholder) ? "" : I18n.t(placeholder); } diff --git a/app/assets/javascripts/select-kit/components/multi-select/multi-select-header.js.es6 b/app/assets/javascripts/select-kit/components/multi-select/multi-select-header.js.es6 index b16ed0c290d..67c3ac3f9e5 100644 --- a/app/assets/javascripts/select-kit/components/multi-select/multi-select-header.js.es6 +++ b/app/assets/javascripts/select-kit/components/multi-select/multi-select-header.js.es6 @@ -1,6 +1,6 @@ import { makeArray } from "discourse-common/lib/helpers"; -import { on } from "ember-addons/ember-computed-decorators"; -import computed from "ember-addons/ember-computed-decorators"; +import { on } from "discourse-common/utils/decorators"; +import discourseComputed from "discourse-common/utils/decorators"; import SelectKitHeaderComponent from "select-kit/components/select-kit/select-kit-header"; export default SelectKitHeaderComponent.extend({ @@ -38,14 +38,14 @@ export default SelectKitHeaderComponent.extend({ $filter.width(availableSpace - parentRightPadding * 4); }, - @computed("computedContent.selection.[]") + @discourseComputed("computedContent.selection.[]") names(selection) { return makeArray(selection) .map(s => s.name) .join(","); }, - @computed("computedContent.selection.[]") + @discourseComputed("computedContent.selection.[]") values(selection) { return makeArray(selection) .map(s => s.value) diff --git a/app/assets/javascripts/select-kit/components/multi-select/selected-category.js.es6 b/app/assets/javascripts/select-kit/components/multi-select/selected-category.js.es6 index a24ed6eae33..155506095b8 100644 --- a/app/assets/javascripts/select-kit/components/multi-select/selected-category.js.es6 +++ b/app/assets/javascripts/select-kit/components/multi-select/selected-category.js.es6 @@ -1,12 +1,12 @@ import SelectedNameComponent from "select-kit/components/multi-select/selected-name"; -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; import { categoryBadgeHTML } from "discourse/helpers/category-link"; export default SelectedNameComponent.extend({ classNames: "selected-category", layoutName: "select-kit/templates/components/multi-select/selected-category", - @computed("computedContent.originalContent") + @discourseComputed("computedContent.originalContent") badge(category) { return categoryBadgeHTML(category, { allowUncategorized: true, diff --git a/app/assets/javascripts/select-kit/components/multi-select/selected-color.js.es6 b/app/assets/javascripts/select-kit/components/multi-select/selected-color.js.es6 index f75e7a708f6..3574550c203 100644 --- a/app/assets/javascripts/select-kit/components/multi-select/selected-color.js.es6 +++ b/app/assets/javascripts/select-kit/components/multi-select/selected-color.js.es6 @@ -1,10 +1,10 @@ import SelectedNameComponent from "select-kit/components/multi-select/selected-name"; -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; export default SelectedNameComponent.extend({ classNames: "selected-color", - @computed("name") + @discourseComputed("name") footerContent(name) { return ``.htmlSafe(); } diff --git a/app/assets/javascripts/select-kit/components/multi-select/selected-name.js.es6 b/app/assets/javascripts/select-kit/components/multi-select/selected-name.js.es6 index 0c542410fbb..6de8c9d0a8a 100644 --- a/app/assets/javascripts/select-kit/components/multi-select/selected-name.js.es6 +++ b/app/assets/javascripts/select-kit/components/multi-select/selected-name.js.es6 @@ -1,5 +1,5 @@ import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ attributeBindings: [ @@ -16,14 +16,14 @@ export default Component.extend({ tagName: "span", tabindex: -1, - @computed("computedContent") + @discourseComputed("computedContent") guid(computedContent) { return Ember.guidFor(computedContent); }, ariaLabel: Ember.computed.or("computedContent.ariaLabel", "title"), - @computed("computedContent.title", "name") + @discourseComputed("computedContent.title", "name") title(computedContentTitle, name) { if (computedContentTitle) return computedContentTitle; if (name) return name; @@ -41,7 +41,7 @@ export default Component.extend({ return this.getWithDefault("computedContent.locked", false); }), - @computed("computedContent", "highlightedSelection.[]") + @discourseComputed("computedContent", "highlightedSelection.[]") isHighlighted(computedContent, highlightedSelection) { return highlightedSelection.includes(this.computedContent); }, diff --git a/app/assets/javascripts/select-kit/components/none-category-row.js.es6 b/app/assets/javascripts/select-kit/components/none-category-row.js.es6 index 8488a93a4a5..7d2aa1ef26b 100644 --- a/app/assets/javascripts/select-kit/components/none-category-row.js.es6 +++ b/app/assets/javascripts/select-kit/components/none-category-row.js.es6 @@ -1,12 +1,12 @@ import CategoryRowComponent from "select-kit/components/category-row"; import { categoryBadgeHTML } from "discourse/helpers/category-link"; -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; export default CategoryRowComponent.extend({ layoutName: "select-kit/templates/components/category-row", classNames: "none category-row", - @computed("category") + @discourseComputed("category") badgeForCategory(category) { return categoryBadgeHTML(category, { link: this.categoryLink, diff --git a/app/assets/javascripts/select-kit/components/notifications-button.js.es6 b/app/assets/javascripts/select-kit/components/notifications-button.js.es6 index fcfe0c5c8c0..5c5bec067bd 100644 --- a/app/assets/javascripts/select-kit/components/notifications-button.js.es6 +++ b/app/assets/javascripts/select-kit/components/notifications-button.js.es6 @@ -1,9 +1,9 @@ import DropdownSelectBoxComponent from "select-kit/components/dropdown-select-box"; import { - default as computed, + default as discourseComputed, observes, on -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import { buttonDetails } from "discourse/lib/notification-levels"; import { allLevels } from "discourse/lib/notification-levels"; @@ -20,7 +20,7 @@ export default DropdownSelectBoxComponent.extend({ i18nPrefix: "", i18nPostfix: "", - @computed("iconForSelectedDetails") + @discourseComputed("iconForSelectedDetails") headerIcon(iconForSelectedDetails) { return iconForSelectedDetails; }, @@ -47,7 +47,7 @@ export default DropdownSelectBoxComponent.extend({ return content; }, - @computed("computedValue") + @discourseComputed("computedValue") selectedDetails(computedValue) { return buttonDetails(computedValue); } diff --git a/app/assets/javascripts/select-kit/components/notifications-button/notifications-button-row.js.es6 b/app/assets/javascripts/select-kit/components/notifications-button/notifications-button-row.js.es6 index d41133b9b62..e4a3b45bd5a 100644 --- a/app/assets/javascripts/select-kit/components/notifications-button/notifications-button-row.js.es6 +++ b/app/assets/javascripts/select-kit/components/notifications-button/notifications-button-row.js.es6 @@ -1,6 +1,6 @@ import DropdownSelectBoxRoxComponent from "select-kit/components/dropdown-select-box/dropdown-select-box-row"; import { buttonDetails } from "discourse/lib/notification-levels"; -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; import { iconHTML } from "discourse-common/lib/icon-library"; export default DropdownSelectBoxRoxComponent.extend({ @@ -9,18 +9,21 @@ export default DropdownSelectBoxRoxComponent.extend({ i18nPrefix: Ember.computed.alias("options.i18nPrefix"), i18nPostfix: Ember.computed.alias("options.i18nPostfix"), - @computed("computedContent.value", "i18nPrefix", "i18nPostfix") + @discourseComputed("computedContent.value", "i18nPrefix", "i18nPostfix") title(value, prefix, postfix) { const key = buttonDetails(value).key; return I18n.t(`${prefix}.${key}${postfix}.title`); }, - @computed("computedContent.name", "computedContent.originalContent.icon") + @discourseComputed( + "computedContent.name", + "computedContent.originalContent.icon" + ) icon(contentName, icon) { return iconHTML(icon, { class: contentName.dasherize() }); }, - @computed("_start") + @discourseComputed("_start") description(_start) { if (this.site && this.site.mobileView) { return null; @@ -29,12 +32,12 @@ export default DropdownSelectBoxRoxComponent.extend({ return Handlebars.escapeExpression(I18n.t(`${_start}.description`)); }, - @computed("_start") + @discourseComputed("_start") name(_start) { return Handlebars.escapeExpression(I18n.t(`${_start}.title`)); }, - @computed("i18nPrefix", "i18nPostfix", "computedContent.name") + @discourseComputed("i18nPrefix", "i18nPostfix", "computedContent.name") _start(prefix, postfix, contentName) { return `${prefix}.${contentName}${postfix}`; } diff --git a/app/assets/javascripts/select-kit/components/period-chooser.js.es6 b/app/assets/javascripts/select-kit/components/period-chooser.js.es6 index 56a20799882..bc9befb89a4 100644 --- a/app/assets/javascripts/select-kit/components/period-chooser.js.es6 +++ b/app/assets/javascripts/select-kit/components/period-chooser.js.es6 @@ -1,5 +1,5 @@ import DropdownSelectBoxComponent from "select-kit/components/dropdown-select-box"; -import computed, { on } from "ember-addons/ember-computed-decorators"; +import discourseComputed, { on } from "discourse-common/utils/decorators"; export default DropdownSelectBoxComponent.extend({ classNames: ["period-chooser"], @@ -9,7 +9,7 @@ export default DropdownSelectBoxComponent.extend({ value: Ember.computed.alias("period"), isHidden: Ember.computed.alias("showPeriods"), - @computed("isExpanded") + @discourseComputed("isExpanded") caretIcon(isExpanded) { return isExpanded ? "caret-up" : "caret-down"; }, diff --git a/app/assets/javascripts/select-kit/components/period-chooser/period-chooser-row.js.es6 b/app/assets/javascripts/select-kit/components/period-chooser/period-chooser-row.js.es6 index 18a0b529fa4..4cb25af58e7 100644 --- a/app/assets/javascripts/select-kit/components/period-chooser/period-chooser-row.js.es6 +++ b/app/assets/javascripts/select-kit/components/period-chooser/period-chooser-row.js.es6 @@ -1,12 +1,12 @@ import DropdownSelectBoxRowComponent from "select-kit/components/dropdown-select-box/dropdown-select-box-row"; -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; export default DropdownSelectBoxRowComponent.extend({ layoutName: "select-kit/templates/components/period-chooser/period-chooser-row", classNames: "period-chooser-row", - @computed("computedContent") + @discourseComputed("computedContent") title(computedContent) { return I18n.t(`filters.top.${computedContent.name || "this_week"}`).title; } diff --git a/app/assets/javascripts/select-kit/components/pinned-button.js.es6 b/app/assets/javascripts/select-kit/components/pinned-button.js.es6 index 9002d913b37..8332f0f41a9 100644 --- a/app/assets/javascripts/select-kit/components/pinned-button.js.es6 +++ b/app/assets/javascripts/select-kit/components/pinned-button.js.es6 @@ -1,5 +1,5 @@ import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ pluginApiIdentifiers: ["pinned-button"], @@ -8,7 +8,7 @@ export default Component.extend({ classNameBindings: ["isHidden"], layoutName: "select-kit/templates/components/pinned-button", - @computed("topic.pinned_globally", "pinned") + @discourseComputed("topic.pinned_globally", "pinned") reasonText(pinnedGlobally, pinned) { const globally = pinnedGlobally ? "_globally" : ""; const pinnedKey = pinned ? `pinned${globally}` : "unpinned"; @@ -16,7 +16,7 @@ export default Component.extend({ return I18n.t(key); }, - @computed("pinned", "topic.deleted", "topic.unpinned") + @discourseComputed("pinned", "topic.deleted", "topic.unpinned") isHidden(pinned, deleted, unpinned) { return deleted || (!pinned && !unpinned); } diff --git a/app/assets/javascripts/select-kit/components/pinned-options.js.es6 b/app/assets/javascripts/select-kit/components/pinned-options.js.es6 index a560bff74da..c96856a804a 100644 --- a/app/assets/javascripts/select-kit/components/pinned-options.js.es6 +++ b/app/assets/javascripts/select-kit/components/pinned-options.js.es6 @@ -1,5 +1,5 @@ import DropdownSelectBoxComponent from "select-kit/components/dropdown-select-box"; -import { on } from "ember-addons/ember-computed-decorators"; +import { on } from "discourse-common/utils/decorators"; import { iconHTML } from "discourse-common/lib/icon-library"; export default DropdownSelectBoxComponent.extend({ diff --git a/app/assets/javascripts/select-kit/components/select-kit.js.es6 b/app/assets/javascripts/select-kit/components/select-kit.js.es6 index 9179e666801..6c2199a5b71 100644 --- a/app/assets/javascripts/select-kit/components/select-kit.js.es6 +++ b/app/assets/javascripts/select-kit/components/select-kit.js.es6 @@ -1,7 +1,8 @@ +import discourseComputed from "discourse-common/utils/decorators"; import EmberObject from "@ember/object"; import Component from "@ember/component"; const { get, isNone, run, isEmpty, makeArray } = Ember; -import computed from "ember-addons/ember-computed-decorators"; + import UtilsMixin from "select-kit/mixins/utils"; import DomHelpersMixin from "select-kit/mixins/dom-helpers"; import EventsMixin from "select-kit/mixins/events"; @@ -223,7 +224,7 @@ export default Component.extend( return this.computeContentItem(contentItem, options); }, - @computed( + @discourseComputed( "isAsync", "isLoading", "filteredAsyncComputedContent.[]", @@ -250,28 +251,28 @@ export default Component.extend( return !this.hasReachedMaximum; }, - @computed("maximum", "selection.[]") + @discourseComputed("maximum", "selection.[]") hasReachedMaximum(maximum, selection) { if (!maximum) return false; selection = makeArray(selection); return selection.length >= maximum; }, - @computed("minimum", "selection.[]") + @discourseComputed("minimum", "selection.[]") hasReachedMinimum(minimum, selection) { if (!minimum) return true; selection = makeArray(selection); return selection.length >= minimum; }, - @computed("shouldFilter", "allowAny") + @discourseComputed("shouldFilter", "allowAny") shouldDisplayFilter(shouldFilter, allowAny) { if (shouldFilter) return true; if (allowAny) return true; return false; }, - @computed("filter", "collectionComputedContent.[]", "isLoading") + @discourseComputed("filter", "collectionComputedContent.[]", "isLoading") noContentRow(filter, collectionComputedContent, isLoading) { if ( filter.length > 0 && @@ -282,7 +283,7 @@ export default Component.extend( } }, - @computed("hasReachedMaximum", "hasReachedMinimum", "isExpanded") + @discourseComputed("hasReachedMaximum", "hasReachedMinimum", "isExpanded") validationMessage(hasReachedMaximum, hasReachedMinimum) { if (hasReachedMaximum && this.maximum) { const key = this.maximumLabel || "select_kit.max_content_reached"; @@ -295,14 +296,19 @@ export default Component.extend( } }, - @computed("allowAny") + @discourseComputed("allowAny") filterPlaceholder(allowAny) { return allowAny ? "select_kit.filter_placeholder_with_any" : "select_kit.filter_placeholder"; }, - @computed("filter", "filterable", "autoFilterable", "renderedFilterOnce") + @discourseComputed( + "filter", + "filterable", + "autoFilterable", + "renderedFilterOnce" + ) shouldFilter(filter, filterable, autoFilterable, renderedFilterOnce) { if (renderedFilterOnce && filterable) return true; if (filterable) return true; @@ -310,7 +316,7 @@ export default Component.extend( return false; }, - @computed( + @discourseComputed( "computedValue", "filter", "collectionComputedContent.[]", @@ -331,7 +337,7 @@ export default Component.extend( return false; }, - @computed("filter", "shouldDisplayCreateRow") + @discourseComputed("filter", "shouldDisplayCreateRow") createRowComputedContent(filter, shouldDisplayCreateRow) { if (shouldDisplayCreateRow) { let content = this.createContentFromInput(filter); @@ -343,17 +349,17 @@ export default Component.extend( } }, - @computed + @discourseComputed templateForRow() { return () => null; }, - @computed + @discourseComputed templateForNoneRow() { return () => null; }, - @computed("filter") + @discourseComputed("filter") templateForCreateRow() { return rowComponent => { return I18n.t("select_kit.create", { @@ -362,7 +368,7 @@ export default Component.extend( }; }, - @computed("none") + @discourseComputed("none") noneRowComputedContent(none) { if (isNone(none)) return null; @@ -427,7 +433,12 @@ export default Component.extend( this._boundaryActionHandler("onStopLoading"); }, - @computed("selection.[]", "isExpanded", "filter", "highlightedSelection.[]") + @discourseComputed( + "selection.[]", + "isExpanded", + "filter", + "highlightedSelection.[]" + ) collectionHeaderComputedContent() { return applyCollectionHeaderCallbacks( this.pluginApiIdentifiers, @@ -436,7 +447,7 @@ export default Component.extend( ); }, - @computed("selection.[]", "isExpanded", "headerIcon") + @discourseComputed("selection.[]", "isExpanded", "headerIcon") headerComputedContent() { return applyHeaderContentPluginApiCallbacks( this.pluginApiIdentifiers, diff --git a/app/assets/javascripts/select-kit/components/select-kit/select-kit-filter.js.es6 b/app/assets/javascripts/select-kit/components/select-kit/select-kit-filter.js.es6 index 9576816708d..a239c780cd5 100644 --- a/app/assets/javascripts/select-kit/components/select-kit/select-kit-filter.js.es6 +++ b/app/assets/javascripts/select-kit/components/select-kit/select-kit-filter.js.es6 @@ -1,5 +1,6 @@ import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; + const { isEmpty } = Ember; export default Component.extend({ @@ -8,8 +9,8 @@ export default Component.extend({ classNameBindings: ["isFocused", "isHidden"], isHidden: Ember.computed.not("shouldDisplayFilter"), - @computed("placeholder") - computedPlaceholder(placeholder) { + @discourseComputed("placeholder") + discourseComputedPlaceholder(placeholder) { return isEmpty(placeholder) ? "" : I18n.t(placeholder); } }); diff --git a/app/assets/javascripts/select-kit/components/select-kit/select-kit-header.js.es6 b/app/assets/javascripts/select-kit/components/select-kit/select-kit-header.js.es6 index 807326c990d..fd145162d0e 100644 --- a/app/assets/javascripts/select-kit/components/select-kit/select-kit-header.js.es6 +++ b/app/assets/javascripts/select-kit/components/select-kit/select-kit-header.js.es6 @@ -1,5 +1,6 @@ import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; + const { isEmpty, makeArray } = Ember; export default Component.extend({ @@ -23,7 +24,7 @@ export default Component.extend({ ariaLabel: Ember.computed.or("computedContent.ariaLabel", "sanitizedTitle"), - @computed("computedContent.title", "name") + @discourseComputed("computedContent.title", "name") title(computedContentTitle, name) { if (computedContentTitle) return computedContentTitle; if (name) return name; @@ -33,7 +34,7 @@ export default Component.extend({ // this might need a more advanced solution // but atm it's the only case we have to handle - @computed("title") + @discourseComputed("title") sanitizedTitle(title) { return String(title).replace("…", ""); }, @@ -44,7 +45,7 @@ export default Component.extend({ value: Ember.computed.alias("computedContent.value"), - @computed("computedContent.icon", "computedContent.icons") + @discourseComputed("computedContent.icon", "computedContent.icons") icons(icon, icons) { return makeArray(icon) .concat(icons) diff --git a/app/assets/javascripts/select-kit/components/select-kit/select-kit-row.js.es6 b/app/assets/javascripts/select-kit/components/select-kit/select-kit-row.js.es6 index 5b016fe9050..01828a5e946 100644 --- a/app/assets/javascripts/select-kit/components/select-kit/select-kit-row.js.es6 +++ b/app/assets/javascripts/select-kit/components/select-kit/select-kit-row.js.es6 @@ -1,6 +1,9 @@ import Component from "@ember/component"; -import { on } from "ember-addons/ember-computed-decorators"; -import computed from "ember-addons/ember-computed-decorators"; +import { + default as discourseComputed, + on +} from "discourse-common/utils/decorators"; + const { run, isPresent, makeArray, isEmpty } = Ember; import UtilsMixin from "select-kit/mixins/utils"; @@ -27,7 +30,7 @@ export default Component.extend(UtilsMixin, { ariaLabel: Ember.computed.or("computedContent.ariaLabel", "title"), - @computed("computedContent.title", "name") + @discourseComputed("computedContent.title", "name") title(computedContentTitle, name) { if (computedContentTitle) return computedContentTitle; if (name) return name; @@ -35,7 +38,7 @@ export default Component.extend(UtilsMixin, { return null; }, - @computed("computedContent") + @discourseComputed("computedContent") guid(computedContent) { return Ember.guidFor(computedContent); }, @@ -46,7 +49,7 @@ export default Component.extend(UtilsMixin, { value: Ember.computed.alias("computedContent.value"), - @computed("templateForRow") + @discourseComputed("templateForRow") template(templateForRow) { return templateForRow(this); }, @@ -67,7 +70,7 @@ export default Component.extend(UtilsMixin, { } }, - @computed( + @discourseComputed( "computedContent.icon", "computedContent.icons", "computedContent.originalContent.icon" diff --git a/app/assets/javascripts/select-kit/components/single-select.js.es6 b/app/assets/javascripts/select-kit/components/single-select.js.es6 index 5b4f6cd8777..92c86cc4c5c 100644 --- a/app/assets/javascripts/select-kit/components/single-select.js.es6 +++ b/app/assets/javascripts/select-kit/components/single-select.js.es6 @@ -1,8 +1,8 @@ import SelectKitComponent from "select-kit/components/select-kit"; import { - default as computed, + default as discourseComputed, on -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; const { get, isNone, isEmpty, isPresent, run, makeArray } = Ember; import { @@ -115,7 +115,7 @@ export default SelectKitComponent.extend({ return content; }, - @computed("computedAsyncContent.[]", "computedValue") + @discourseComputed("computedAsyncContent.[]", "computedValue") filteredAsyncComputedContent(computedAsyncContent, computedValue) { computedAsyncContent = (computedAsyncContent || []).filter(c => { return computedValue !== get(c, "value"); @@ -128,7 +128,12 @@ export default SelectKitComponent.extend({ return computedAsyncContent; }, - @computed("computedContent.[]", "computedValue", "filter", "shouldFilter") + @discourseComputed( + "computedContent.[]", + "computedValue", + "filter", + "shouldFilter" + ) filteredComputedContent( computedContent, computedValue, @@ -150,17 +155,17 @@ export default SelectKitComponent.extend({ return computedContent; }, - @computed("computedValue", "computedContent.[]") + @discourseComputed("computedValue", "computedContent.[]") selection(computedValue, computedContent) { return computedContent.findBy("value", computedValue); }, - @computed("selection") + @discourseComputed("selection") hasSelection(selection) { return selection !== this.noneRowComputedContent && !isNone(selection); }, - @computed( + @discourseComputed( "computedValue", "filter", "collectionComputedContent.[]", diff --git a/app/assets/javascripts/select-kit/components/tag-chooser.js.es6 b/app/assets/javascripts/select-kit/components/tag-chooser.js.es6 index 3e92b80a884..1ad21b06424 100644 --- a/app/assets/javascripts/select-kit/components/tag-chooser.js.es6 +++ b/app/assets/javascripts/select-kit/components/tag-chooser.js.es6 @@ -1,7 +1,7 @@ import MultiSelectComponent from "select-kit/components/multi-select"; import TagsMixin from "select-kit/mixins/tags"; import renderTag from "discourse/lib/render-tag"; -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; import { makeArray } from "discourse-common/lib/helpers"; const { get, run } = Ember; @@ -55,12 +55,12 @@ export default MultiSelectComponent.extend(TagsMixin, { this.set("tags", values.filter(v => v)); }, - @computed("tags") + @discourseComputed("tags") values(tags) { return makeArray(tags); }, - @computed("tags") + @discourseComputed("tags") content(tags) { return makeArray(tags); }, diff --git a/app/assets/javascripts/select-kit/components/tag-drop.js.es6 b/app/assets/javascripts/select-kit/components/tag-drop.js.es6 index 66958c34527..9fbce57f855 100644 --- a/app/assets/javascripts/select-kit/components/tag-drop.js.es6 +++ b/app/assets/javascripts/select-kit/components/tag-drop.js.es6 @@ -2,7 +2,7 @@ import { makeArray } from "discourse-common/lib/helpers"; import ComboBoxComponent from "select-kit/components/combo-box"; import DiscourseURL from "discourse/lib/url"; import TagsMixin from "select-kit/mixins/tags"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; const { isEmpty, run } = Ember; export default ComboBoxComponent.extend(TagsMixin, { @@ -25,18 +25,18 @@ export default ComboBoxComponent.extend(TagsMixin, { allowContentReplacement: true, isAsync: true, - @computed("tagId") + @discourseComputed("tagId") noTagsSelected() { return this.tagId === "none"; }, - @computed("showFilterByTag", "content") + @discourseComputed("showFilterByTag", "content") isHidden(showFilterByTag, content) { if (showFilterByTag && !isEmpty(content)) return false; return true; }, - @computed("content") + @discourseComputed("content") filterable(content) { return content && content.length >= 15; }, @@ -63,12 +63,12 @@ export default ComboBoxComponent.extend(TagsMixin, { return content; }, - @computed("tagId") + @discourseComputed("tagId") tagClass(tagId) { return tagId ? `tag-${tagId}` : "tag_all"; }, - @computed("firstCategory", "secondCategory") + @discourseComputed("firstCategory", "secondCategory") allTagsUrl() { if (this.currentCategory) { return Discourse.getURL(this.get("currentCategory.url") + "?allTags=1"); @@ -77,7 +77,7 @@ export default ComboBoxComponent.extend(TagsMixin, { } }, - @computed("firstCategory", "secondCategory") + @discourseComputed("firstCategory", "secondCategory") noTagsUrl() { var url = "/tags"; if (this.currentCategory) { @@ -86,17 +86,17 @@ export default ComboBoxComponent.extend(TagsMixin, { return Discourse.getURL(`${url}/none`); }, - @computed("tag") + @discourseComputed("tag") allTagsLabel() { return I18n.t("tagging.selector_all_tags"); }, - @computed("tag") + @discourseComputed("tag") noTagsLabel() { return I18n.t("tagging.selector_no_tags"); }, - @computed("tagId", "allTagsLabel", "noTagsLabel") + @discourseComputed("tagId", "allTagsLabel", "noTagsLabel") shortcuts(tagId, allTagsLabel, noTagsLabel) { const shortcuts = []; @@ -119,7 +119,7 @@ export default ComboBoxComponent.extend(TagsMixin, { return shortcuts; }, - @computed("site.top_tags", "shortcuts") + @discourseComputed("site.top_tags", "shortcuts") content(topTags, shortcuts) { if (this.siteSettings.tags_sort_alphabetically && topTags) { return shortcuts.concat(topTags.sort()); diff --git a/app/assets/javascripts/select-kit/components/tag-group-chooser.js.es6 b/app/assets/javascripts/select-kit/components/tag-group-chooser.js.es6 index c3cb9d0ef30..71d2343b349 100644 --- a/app/assets/javascripts/select-kit/components/tag-group-chooser.js.es6 +++ b/app/assets/javascripts/select-kit/components/tag-group-chooser.js.es6 @@ -1,7 +1,8 @@ import MultiSelectComponent from "select-kit/components/multi-select"; import TagsMixin from "select-kit/mixins/tags"; import renderTag from "discourse/lib/render-tag"; -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; + const { get, isEmpty, run, makeArray } = Ember; export default MultiSelectComponent.extend(TagsMixin, { @@ -29,12 +30,12 @@ export default MultiSelectComponent.extend(TagsMixin, { this.set("tagGroups", values.filter(v => v)); }, - @computed("tagGroups") + @discourseComputed("tagGroups") values(tagGroups) { return makeArray(tagGroups); }, - @computed("tagGroups") + @discourseComputed("tagGroups") content(tagGroups) { return makeArray(tagGroups); }, diff --git a/app/assets/javascripts/select-kit/components/tag-notifications-button.js.es6 b/app/assets/javascripts/select-kit/components/tag-notifications-button.js.es6 index 12aef37fac0..c163c3d5d92 100644 --- a/app/assets/javascripts/select-kit/components/tag-notifications-button.js.es6 +++ b/app/assets/javascripts/select-kit/components/tag-notifications-button.js.es6 @@ -1,5 +1,5 @@ import NotificationOptionsComponent from "select-kit/components/notifications-button"; -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; export default NotificationOptionsComponent.extend({ pluginApiIdentifiers: ["tag-notifications-button"], @@ -16,7 +16,7 @@ export default NotificationOptionsComponent.extend({ return this.notificationLevel; }, - @computed("iconForSelectedDetails") + @discourseComputed("iconForSelectedDetails") headerIcon(iconForSelectedDetails) { return iconForSelectedDetails; } diff --git a/app/assets/javascripts/select-kit/components/timezone-input.js.es6 b/app/assets/javascripts/select-kit/components/timezone-input.js.es6 index e141839a1d1..cc837e1d661 100644 --- a/app/assets/javascripts/select-kit/components/timezone-input.js.es6 +++ b/app/assets/javascripts/select-kit/components/timezone-input.js.es6 @@ -1,5 +1,5 @@ import ComboBoxComponent from "select-kit/components/combo-box"; -import { default as computed } from "ember-addons/ember-computed-decorators"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; export default ComboBoxComponent.extend({ pluginApiIdentifiers: ["timezone-input"], @@ -9,7 +9,7 @@ export default ComboBoxComponent.extend({ filterable: true, allowAny: false, - @computed + @discourseComputed content() { let timezones; diff --git a/app/assets/javascripts/select-kit/components/toolbar-popup-menu-options.js.es6 b/app/assets/javascripts/select-kit/components/toolbar-popup-menu-options.js.es6 index 39d8348119d..0c0ab1f730d 100644 --- a/app/assets/javascripts/select-kit/components/toolbar-popup-menu-options.js.es6 +++ b/app/assets/javascripts/select-kit/components/toolbar-popup-menu-options.js.es6 @@ -1,5 +1,5 @@ import DropdownSelectBoxComponent from "select-kit/components/dropdown-select-box"; -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; export default DropdownSelectBoxComponent.extend({ pluginApiIdentifiers: ["toolbar-popup-menu-options"], @@ -7,7 +7,7 @@ export default DropdownSelectBoxComponent.extend({ isHidden: Ember.computed.empty("computedContent"), showFullTitle: false, - @computed("title") + @discourseComputed("title") collectionHeader(title) { return `

${title}

`; }, diff --git a/app/assets/javascripts/select-kit/components/topic-notifications-options.js.es6 b/app/assets/javascripts/select-kit/components/topic-notifications-options.js.es6 index e59e5d5d341..1001c7884de 100644 --- a/app/assets/javascripts/select-kit/components/topic-notifications-options.js.es6 +++ b/app/assets/javascripts/select-kit/components/topic-notifications-options.js.es6 @@ -1,8 +1,8 @@ import NotificationOptionsComponent from "select-kit/components/notifications-button"; import { - default as computed, + default as discourseComputed, on -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import { topicLevels } from "discourse/lib/notification-levels"; export default NotificationOptionsComponent.extend({ @@ -12,7 +12,7 @@ export default NotificationOptionsComponent.extend({ i18nPrefix: "topic.notifications", allowInitialValueMutation: false, - @computed("topic.archetype") + @discourseComputed("topic.archetype") i18nPostfix(archetype) { return archetype === "private_message" ? "_pm" : ""; }, diff --git a/app/assets/javascripts/select-kit/components/user-notifications-dropdown.js.es6 b/app/assets/javascripts/select-kit/components/user-notifications-dropdown.js.es6 index 2289b2f6672..2551e20b617 100644 --- a/app/assets/javascripts/select-kit/components/user-notifications-dropdown.js.es6 +++ b/app/assets/javascripts/select-kit/components/user-notifications-dropdown.js.es6 @@ -1,7 +1,7 @@ import DropdownSelectBox from "select-kit/components/dropdown-select-box"; import { popupAjaxError } from "discourse/lib/ajax-error"; import showModal from "discourse/lib/show-modal"; -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; export default DropdownSelectBox.extend({ classNames: ["user-notifications", "user-notifications-dropdown"], @@ -36,7 +36,7 @@ export default DropdownSelectBox.extend({ return content; }, - @computed("value") + @discourseComputed("value") headerIcon(value) { return this.computeContent().find(row => row.id === value).icon; }, @@ -53,7 +53,7 @@ export default DropdownSelectBox.extend({ }); }, - @computed("user.ignored", "user.muted") + @discourseComputed("user.ignored", "user.muted") value() { if (this.get("user.ignored")) { return "changeToIgnored"; diff --git a/app/assets/javascripts/select-kit/mixins/dom-helpers.js.es6 b/app/assets/javascripts/select-kit/mixins/dom-helpers.js.es6 index 98e79eba585..8de81dc5954 100644 --- a/app/assets/javascripts/select-kit/mixins/dom-helpers.js.es6 +++ b/app/assets/javascripts/select-kit/mixins/dom-helpers.js.es6 @@ -1,6 +1,6 @@ import { next } from "@ember/runloop"; import { schedule } from "@ember/runloop"; -import { on } from "ember-addons/ember-computed-decorators"; +import { on } from "discourse-common/utils/decorators"; import Mixin from "@ember/object/mixin"; export default Mixin.create({ diff --git a/app/assets/javascripts/select-kit/mixins/events.js.es6 b/app/assets/javascripts/select-kit/mixins/events.js.es6 index 739d0925e3d..4c54979d1f2 100644 --- a/app/assets/javascripts/select-kit/mixins/events.js.es6 +++ b/app/assets/javascripts/select-kit/mixins/events.js.es6 @@ -3,7 +3,7 @@ import { makeArray } from "discourse-common/lib/helpers"; import { isEmpty } from "@ember/utils"; import { throttle } from "@ember/runloop"; import { schedule } from "@ember/runloop"; -import { on } from "ember-addons/ember-computed-decorators"; +import { on } from "discourse-common/utils/decorators"; import Mixin from "@ember/object/mixin"; const { bind } = Ember.run; diff --git a/app/assets/javascripts/wizard-application.js b/app/assets/javascripts/wizard-application.js index d5460545ae7..3a409952c19 100644 --- a/app/assets/javascripts/wizard-application.js +++ b/app/assets/javascripts/wizard-application.js @@ -1,7 +1,7 @@ //= require_tree ./ember-addons/utils //= require ./ember-addons/decorator-alias //= require ./ember-addons/macro-alias -//= require ./ember-addons/ember-computed-decorators +//= require ./discourse-common/utils/decorators //= require_tree ./discourse-common //= require i18n-patches //= require_tree ./select-kit diff --git a/app/assets/javascripts/wizard/components/homepage-preview.js.es6 b/app/assets/javascripts/wizard/components/homepage-preview.js.es6 index f92f7b04f3a..c0de35c55aa 100644 --- a/app/assets/javascripts/wizard/components/homepage-preview.js.es6 +++ b/app/assets/javascripts/wizard/components/homepage-preview.js.es6 @@ -1,4 +1,4 @@ -import { observes } from "ember-addons/ember-computed-decorators"; +import { observes } from "discourse-common/utils/decorators"; import { createPreviewComponent, LOREM, diff --git a/app/assets/javascripts/wizard/components/image-preview-favicon.js.es6 b/app/assets/javascripts/wizard/components/image-preview-favicon.js.es6 index 91a72ecda70..31df907e58b 100644 --- a/app/assets/javascripts/wizard/components/image-preview-favicon.js.es6 +++ b/app/assets/javascripts/wizard/components/image-preview-favicon.js.es6 @@ -1,5 +1,4 @@ -import { observes } from "ember-addons/ember-computed-decorators"; - +import { observes } from "discourse-common/utils/decorators"; import { createPreviewComponent } from "wizard/lib/preview"; export default createPreviewComponent(371, 124, { diff --git a/app/assets/javascripts/wizard/components/image-preview-large-icon.js.es6 b/app/assets/javascripts/wizard/components/image-preview-large-icon.js.es6 index 17a605c23a7..30ad47db87d 100644 --- a/app/assets/javascripts/wizard/components/image-preview-large-icon.js.es6 +++ b/app/assets/javascripts/wizard/components/image-preview-large-icon.js.es6 @@ -1,4 +1,4 @@ -import { observes } from "ember-addons/ember-computed-decorators"; +import { observes } from "discourse-common/utils/decorators"; import { createPreviewComponent } from "wizard/lib/preview"; export default createPreviewComponent(325, 125, { diff --git a/app/assets/javascripts/wizard/components/image-preview-logo-small.js.es6 b/app/assets/javascripts/wizard/components/image-preview-logo-small.js.es6 index db498c91ee4..64ad289234d 100644 --- a/app/assets/javascripts/wizard/components/image-preview-logo-small.js.es6 +++ b/app/assets/javascripts/wizard/components/image-preview-logo-small.js.es6 @@ -1,5 +1,4 @@ -import { observes } from "ember-addons/ember-computed-decorators"; - +import { observes } from "discourse-common/utils/decorators"; import { createPreviewComponent, drawHeader, LOREM } from "wizard/lib/preview"; export default createPreviewComponent(375, 100, { diff --git a/app/assets/javascripts/wizard/components/image-preview-logo.js.es6 b/app/assets/javascripts/wizard/components/image-preview-logo.js.es6 index f8b5d3f39cb..3c37019b507 100644 --- a/app/assets/javascripts/wizard/components/image-preview-logo.js.es6 +++ b/app/assets/javascripts/wizard/components/image-preview-logo.js.es6 @@ -1,5 +1,4 @@ -import { observes } from "ember-addons/ember-computed-decorators"; - +import { observes } from "discourse-common/utils/decorators"; import { createPreviewComponent, drawHeader } from "wizard/lib/preview"; export default createPreviewComponent(400, 100, { diff --git a/app/assets/javascripts/wizard/components/invite-list-user.js.es6 b/app/assets/javascripts/wizard/components/invite-list-user.js.es6 index cc07ab1a2db..8cc39470a3d 100644 --- a/app/assets/javascripts/wizard/components/invite-list-user.js.es6 +++ b/app/assets/javascripts/wizard/components/invite-list-user.js.es6 @@ -1,10 +1,10 @@ import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ classNames: ["invite-list-user"], - @computed("user.role") + @discourseComputed("user.role") roleName(role) { return this.roles.findBy("id", role).label; } diff --git a/app/assets/javascripts/wizard/components/radio-button.js.es6 b/app/assets/javascripts/wizard/components/radio-button.js.es6 index e7ceaa898f7..6184362bb52 100644 --- a/app/assets/javascripts/wizard/components/radio-button.js.es6 +++ b/app/assets/javascripts/wizard/components/radio-button.js.es6 @@ -1,6 +1,6 @@ import { next } from "@ember/runloop"; import Component from "@ember/component"; -import { observes, on } from "ember-addons/ember-computed-decorators"; +import { observes, on } from "discourse-common/utils/decorators"; export default Component.extend({ tagName: "label", diff --git a/app/assets/javascripts/wizard/components/staff-count.js.es6 b/app/assets/javascripts/wizard/components/staff-count.js.es6 index 2e7db93b3cb..d37b2910373 100644 --- a/app/assets/javascripts/wizard/components/staff-count.js.es6 +++ b/app/assets/javascripts/wizard/components/staff-count.js.es6 @@ -1,7 +1,7 @@ import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ - @computed("field.value") + @discourseComputed("field.value") showStaffCount: staffCount => staffCount > 1 }); diff --git a/app/assets/javascripts/wizard/components/theme-preview.js.es6 b/app/assets/javascripts/wizard/components/theme-preview.js.es6 index 2a098fb8796..768e2e5522b 100644 --- a/app/assets/javascripts/wizard/components/theme-preview.js.es6 +++ b/app/assets/javascripts/wizard/components/theme-preview.js.es6 @@ -1,6 +1,5 @@ -import computed from "ember-addons/ember-computed-decorators"; -import { observes } from "ember-addons/ember-computed-decorators"; - +import discourseComputed from "discourse-common/utils/decorators"; +import { observes } from "discourse-common/utils/decorators"; import { createPreviewComponent, darkLightDiff, @@ -14,7 +13,7 @@ export default createPreviewComponent(305, 165, { classNameBindings: ["isSelected"], - @computed("selectedId", "colorsId") + @discourseComputed("selectedId", "colorsId") isSelected(selectedId, colorsId) { return selectedId === colorsId; }, diff --git a/app/assets/javascripts/wizard/components/wizard-field-image.js.es6 b/app/assets/javascripts/wizard/components/wizard-field-image.js.es6 index a407bd50461..e97137707d9 100644 --- a/app/assets/javascripts/wizard/components/wizard-field-image.js.es6 +++ b/app/assets/javascripts/wizard/components/wizard-field-image.js.es6 @@ -1,6 +1,6 @@ import Component from "@ember/component"; import getUrl from "discourse-common/lib/get-url"; -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; import { getToken } from "wizard/lib/ajax"; import { getOwner } from "discourse-common/lib/get-owner"; import { dasherize } from "@ember/string"; @@ -9,7 +9,7 @@ export default Component.extend({ classNames: ["wizard-image-row"], uploading: false, - @computed("field.id") + @discourseComputed("field.id") previewComponent(id) { const componentName = `image-preview-${dasherize(id)}`; const exists = getOwner(this).lookup(`component:${componentName}`); diff --git a/app/assets/javascripts/wizard/components/wizard-field.js.es6 b/app/assets/javascripts/wizard/components/wizard-field.js.es6 index 7636eee0d04..d5491a4ef92 100644 --- a/app/assets/javascripts/wizard/components/wizard-field.js.es6 +++ b/app/assets/javascripts/wizard/components/wizard-field.js.es6 @@ -1,17 +1,17 @@ import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; import { dasherize } from "@ember/string"; export default Component.extend({ classNameBindings: [":wizard-field", "typeClass", "field.invalid"], - @computed("field.type") + @discourseComputed("field.type") typeClass: type => `${dasherize(type)}-field`, - @computed("field.id") + @discourseComputed("field.id") fieldClass: id => `field-${dasherize(id)} wizard-focusable`, - @computed("field.type", "field.id") + @discourseComputed("field.type", "field.id") inputComponentName(type, id) { return type === "component" ? dasherize(id) : `wizard-field-${type}`; } diff --git a/app/assets/javascripts/wizard/components/wizard-step-form.js.es6 b/app/assets/javascripts/wizard/components/wizard-step-form.js.es6 index 7bc7a8446ec..461a5a0d186 100644 --- a/app/assets/javascripts/wizard/components/wizard-step-form.js.es6 +++ b/app/assets/javascripts/wizard/components/wizard-step-form.js.es6 @@ -1,9 +1,9 @@ import Component from "@ember/component"; -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; export default Component.extend({ classNameBindings: [":wizard-step-form", "customStepClass"], - @computed("step.id") + @discourseComputed("step.id") customStepClass: stepId => `wizard-step-${stepId}` }); diff --git a/app/assets/javascripts/wizard/components/wizard-step.js.es6 b/app/assets/javascripts/wizard/components/wizard-step.js.es6 index a1a3372473a..c5008ac2ac0 100644 --- a/app/assets/javascripts/wizard/components/wizard-step.js.es6 +++ b/app/assets/javascripts/wizard/components/wizard-step.js.es6 @@ -2,9 +2,9 @@ import { scheduleOnce } from "@ember/runloop"; import Component from "@ember/component"; import getUrl from "discourse-common/lib/get-url"; import { - default as computed, + default as discourseComputed, observes -} from "ember-addons/ember-computed-decorators"; +} from "discourse-common/utils/decorators"; import { htmlSafe } from "@ember/template"; jQuery.fn.wiggle = function(times, duration) { @@ -34,16 +34,16 @@ export default Component.extend({ this.autoFocus(); }, - @computed("step.index") + @discourseComputed("step.index") showQuitButton: index => index === 0, - @computed("step.displayIndex", "wizard.totalSteps") + @discourseComputed("step.displayIndex", "wizard.totalSteps") showNextButton: (current, total) => current < total, - @computed("step.displayIndex", "wizard.totalSteps") + @discourseComputed("step.displayIndex", "wizard.totalSteps") showDoneButton: (current, total) => current === total, - @computed( + @discourseComputed( "step.index", "step.displayIndex", "wizard.totalSteps", @@ -53,10 +53,10 @@ export default Component.extend({ return index !== 0 && displayIndex !== total && completed; }, - @computed("step.index") + @discourseComputed("step.index") showBackButton: index => index > 0, - @computed("step.banner") + @discourseComputed("step.banner") bannerImage(src) { if (!src) { return; @@ -80,7 +80,7 @@ export default Component.extend({ } }, - @computed("step.index", "wizard.totalSteps") + @discourseComputed("step.index", "wizard.totalSteps") barStyle(displayIndex, totalSteps) { let ratio = parseFloat(displayIndex) / parseFloat(totalSteps - 1); if (ratio < 0) { diff --git a/app/assets/javascripts/wizard/controllers/application.js.es6 b/app/assets/javascripts/wizard/controllers/application.js.es6 index 58aede12a14..ca6d2d3e9ee 100644 --- a/app/assets/javascripts/wizard/controllers/application.js.es6 +++ b/app/assets/javascripts/wizard/controllers/application.js.es6 @@ -1,10 +1,10 @@ import Controller from "@ember/controller"; -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; export default Controller.extend({ currentStepId: null, - @computed("currentStepId") + @discourseComputed("currentStepId") showCanvas(currentStepId) { return currentStepId === "finished"; } diff --git a/app/assets/javascripts/wizard/mixins/valid-state.js.es6 b/app/assets/javascripts/wizard/mixins/valid-state.js.es6 index b2dc3e89540..1f82cccb912 100644 --- a/app/assets/javascripts/wizard/mixins/valid-state.js.es6 +++ b/app/assets/javascripts/wizard/mixins/valid-state.js.es6 @@ -1,4 +1,4 @@ -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; export const States = { UNCHECKED: 0, @@ -15,13 +15,13 @@ export default { this.set("_validState", States.UNCHECKED); }, - @computed("_validState") + @discourseComputed("_validState") valid: state => state === States.VALID, - @computed("_validState") + @discourseComputed("_validState") invalid: state => state === States.INVALID, - @computed("_validState") + @discourseComputed("_validState") unchecked: state => state === States.UNCHECKED, setValid(valid, description) { diff --git a/app/assets/javascripts/wizard/models/step.js.es6 b/app/assets/javascripts/wizard/models/step.js.es6 index cbc7edca18d..7909d39aaf1 100644 --- a/app/assets/javascripts/wizard/models/step.js.es6 +++ b/app/assets/javascripts/wizard/models/step.js.es6 @@ -1,15 +1,15 @@ import EmberObject from "@ember/object"; -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; import ValidState from "wizard/mixins/valid-state"; import { ajax } from "wizard/lib/ajax"; export default EmberObject.extend(ValidState, { id: null, - @computed("index") + @discourseComputed("index") displayIndex: index => index + 1, - @computed("fields.[]") + @discourseComputed("fields.[]") fieldsById(fields) { const lookup = {}; fields.forEach(field => (lookup[field.get("id")] = field)); diff --git a/app/assets/javascripts/wizard/models/wizard.js.es6 b/app/assets/javascripts/wizard/models/wizard.js.es6 index 569a2d5bf7b..e907687e11a 100644 --- a/app/assets/javascripts/wizard/models/wizard.js.es6 +++ b/app/assets/javascripts/wizard/models/wizard.js.es6 @@ -1,11 +1,11 @@ import Step from "wizard/models/step"; import WizardField from "wizard/models/wizard-field"; import { ajax } from "wizard/lib/ajax"; -import computed from "ember-addons/ember-computed-decorators"; +import discourseComputed from "discourse-common/utils/decorators"; import EmberObject from "@ember/object"; const Wizard = EmberObject.extend({ - @computed("steps.length") + @discourseComputed("steps.length") totalSteps: length => length, getTitle() {