import { default as computed } from "ember-addons/ember-computed-decorators"; import { url } from "discourse/lib/computed"; import { popupAjaxError } from "discourse/lib/ajax-error"; import showModal from "discourse/lib/show-modal"; import ThemeSettings from "admin/models/theme-settings"; const THEME_UPLOAD_VAR = 2; export default Ember.Controller.extend({ editRouteName: "adminCustomizeThemes.edit", @computed("model", "allThemes") parentThemes(model, allThemes) { let parents = allThemes.filter(theme => _.contains(theme.get("childThemes"), model) ); return parents.length === 0 ? null : parents; }, @computed("model.theme_fields.@each") hasEditedFields(fields) { return fields.any(f => !Em.isBlank(f.value)); }, @computed("model.theme_fields.@each") editedDescriptions(fields) { let descriptions = []; let description = target => { let current = fields.filter( field => field.target === target && !Em.isBlank(field.value) ); if (current.length > 0) { let text = I18n.t("admin.customize.theme." + target); let localized = current.map(f => I18n.t("admin.customize.theme." + f.name + ".text") ); return text + ": " + localized.join(" , "); } }; ["common", "desktop", "mobile"].forEach(target => { descriptions.push(description(target)); }); return descriptions.reject(d => Em.isBlank(d)); }, previewUrl: url("model.id", "/admin/themes/%@/preview"), @computed("colorSchemeId", "model.color_scheme_id") colorSchemeChanged(colorSchemeId, existingId) { colorSchemeId = colorSchemeId === null ? null : parseInt(colorSchemeId); return colorSchemeId !== existingId; }, @computed( "availableChildThemes", "model.childThemes.@each", "model", "allowChildThemes" ) selectableChildThemes(available, childThemes, model, allowChildThemes) { if (!allowChildThemes && (!childThemes || childThemes.length === 0)) { return null; } let themes = []; available.forEach(t => { if (!childThemes || childThemes.indexOf(t) === -1) { themes.push(t); } }); return themes.length === 0 ? null : themes; }, @computed("allThemes", "allThemes.length", "model") availableChildThemes(allThemes, count) { if (count === 1) { return null; } let excludeIds = [this.get("model.id")]; let themes = []; allThemes.forEach(theme => { if (excludeIds.indexOf(theme.get("id")) === -1) { themes.push(theme); } }); return themes; }, @computed("model.settings") settings(settings) { return settings.map(setting => ThemeSettings.create(setting)); }, @computed("settings") hasSettings(settings) { return settings.length > 0; }, downloadUrl: url("model.id", "/admin/themes/%@"), actions: { updateToLatest() { this.set("updatingRemote", true); this.get("model") .updateToLatest() .catch(popupAjaxError) .finally(() => { this.set("updatingRemote", false); }); }, checkForThemeUpdates() { this.set("updatingRemote", true); this.get("model") .checkForUpdates() .catch(popupAjaxError) .finally(() => { this.set("updatingRemote", false); }); }, addUploadModal() { showModal("admin-add-upload", { admin: true, name: "" }); }, addUpload(info) { let model = this.get("model"); model.setField("common", info.name, "", info.upload_id, THEME_UPLOAD_VAR); model.saveChanges("theme_fields").catch(e => popupAjaxError(e)); }, cancelChangeScheme() { this.set("colorSchemeId", this.get("model.color_scheme_id")); }, changeScheme() { let schemeId = this.get("colorSchemeId"); this.set( "model.color_scheme_id", schemeId === null ? null : parseInt(schemeId) ); this.get("model").saveChanges("color_scheme_id"); }, startEditingName() { this.set("oldName", this.get("model.name")); this.set("editingName", true); }, cancelEditingName() { this.set("model.name", this.get("oldName")); this.set("editingName", false); }, finishedEditingName() { this.get("model").saveChanges("name"); this.set("editingName", false); }, editTheme() { let edit = () => this.transitionToRoute( this.get("editRouteName"), this.get("model.id"), "common", "scss" ); if (this.get("model.remote_theme")) { bootbox.confirm( I18n.t("admin.customize.theme.edit_confirm"), result => { if (result) { edit(); } } ); } else { edit(); } }, applyDefault() { const model = this.get("model"); model.saveChanges("default").then(() => { if (model.get("default")) { this.get("allThemes").forEach(theme => { if (theme !== model && theme.get("default")) { theme.set("default", false); } }); } }); }, applyUserSelectable() { this.get("model").saveChanges("user_selectable"); }, addChildTheme() { let themeId = parseInt(this.get("selectedChildThemeId")); let theme = this.get("allThemes").findBy("id", themeId); this.get("model").addChildTheme(theme); }, removeUpload(upload) { return bootbox.confirm( I18n.t("admin.customize.theme.delete_upload_confirm"), I18n.t("no_value"), I18n.t("yes_value"), result => { if (result) { this.get("model").removeField(upload); } } ); }, removeChildTheme(theme) { this.get("model").removeChildTheme(theme); }, destroy() { return bootbox.confirm( I18n.t("admin.customize.delete_confirm"), I18n.t("no_value"), I18n.t("yes_value"), result => { if (result) { const model = this.get("model"); model.destroyRecord().then(() => { this.get("allThemes").removeObject(model); this.transitionToRoute("adminCustomizeThemes"); }); } } ); } } });