157 lines
4.5 KiB
JavaScript
157 lines
4.5 KiB
JavaScript
import { tracked } from "@glimmer/tracking";
|
|
import Controller, { inject as controller } from "@ember/controller";
|
|
import EmberObject, { action } from "@ember/object";
|
|
import { service } from "@ember/service";
|
|
import { TrackedObject } from "@ember-compat/tracked-built-ins";
|
|
import { observes } from "@ember-decorators/object";
|
|
import { ajax } from "discourse/lib/ajax";
|
|
import { popupAjaxError } from "discourse/lib/ajax-error";
|
|
import Category from "discourse/models/category";
|
|
import I18n from "I18n";
|
|
import Preview from "../components/modal/preview";
|
|
|
|
export default class adminPluginsHouseAdsShow extends Controller {
|
|
@service router;
|
|
@service modal;
|
|
|
|
@controller("adminPlugins.houseAds") houseAdsController;
|
|
|
|
@tracked selectedCategories = [];
|
|
@tracked selectedGroups = [];
|
|
@tracked saving = false;
|
|
@tracked savingStatus = "";
|
|
@tracked buffered;
|
|
|
|
@observes("model")
|
|
modelChanged() {
|
|
this.buffered = new TrackedObject({ ...this.model });
|
|
this.selectedCategories = this.model.categories || [];
|
|
this.selectedGroups = this.model.group_ids || [];
|
|
}
|
|
|
|
get disabledSave() {
|
|
for (const key in this.buffered) {
|
|
// we don't want to compare the categories array
|
|
if (key !== "categories" && this.buffered[key] !== this.model[key]) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
@action
|
|
async save() {
|
|
if (!this.saving) {
|
|
this.saving = true;
|
|
this.savingStatus = I18n.t("saving");
|
|
const data = {};
|
|
const newRecord = !this.buffered.id;
|
|
if (!newRecord) {
|
|
data.id = this.buffered.id;
|
|
}
|
|
data.name = this.buffered.name;
|
|
data.html = this.buffered.html;
|
|
data.visible_to_logged_in_users =
|
|
this.buffered.visible_to_logged_in_users;
|
|
data.visible_to_anons = this.buffered.visible_to_anons;
|
|
data.category_ids = this.buffered.category_ids;
|
|
data.group_ids = this.buffered.group_ids;
|
|
try {
|
|
const ajaxData = await ajax(
|
|
newRecord
|
|
? `/admin/plugins/pluginad/house_creatives`
|
|
: `/admin/plugins/pluginad/house_creatives/${this.buffered.id}`,
|
|
{
|
|
type: newRecord ? "POST" : "PUT",
|
|
data,
|
|
}
|
|
);
|
|
this.savingStatus = I18n.t("saved");
|
|
const houseAds = this.houseAdsController.model;
|
|
if (newRecord) {
|
|
this.buffered.id = ajaxData.house_ad.id;
|
|
if (!houseAds.includes(this.buffered)) {
|
|
houseAds.pushObject(EmberObject.create(this.buffered));
|
|
}
|
|
this.router.transitionTo(
|
|
"adminPlugins.houseAds.show",
|
|
this.buffered.id
|
|
);
|
|
} else {
|
|
houseAds
|
|
.find((ad) => ad.id === this.buffered.id)
|
|
.setProperties(this.buffered);
|
|
}
|
|
} catch (error) {
|
|
popupAjaxError(error);
|
|
} finally {
|
|
this.set("model", this.buffered);
|
|
this.saving = false;
|
|
this.savingStatus = "";
|
|
}
|
|
}
|
|
}
|
|
|
|
@action
|
|
setCategoryIds(categoryArray) {
|
|
this.selectedCategories = categoryArray;
|
|
this.buffered.category_ids = categoryArray.map((c) => c.id);
|
|
this.setCategoriesForBuffered();
|
|
}
|
|
|
|
@action
|
|
setGroupIds(groupIds) {
|
|
this.selectedGroups = groupIds;
|
|
this.buffered.group_ids = groupIds.map((id) => id);
|
|
}
|
|
|
|
@action
|
|
cancel() {
|
|
this.buffered = new TrackedObject({ ...this.model });
|
|
this.selectedCategories = this.model.categories || [];
|
|
this.selectedGroups = this.model.group_ids || [];
|
|
this.setCategoriesForBuffered();
|
|
}
|
|
|
|
@action
|
|
async destroy() {
|
|
if (!this.buffered.id) {
|
|
this.router.transitionTo("adminPlugins.houseAds.index");
|
|
return;
|
|
}
|
|
try {
|
|
await ajax(
|
|
`/admin/plugins/pluginad/house_creatives/${this.buffered.id}`,
|
|
{
|
|
type: "DELETE",
|
|
}
|
|
);
|
|
this.houseAdsController.model.removeObject(
|
|
this.houseAdsController.model.findBy("id", this.buffered.id)
|
|
);
|
|
this.router.transitionTo("adminPlugins.houseAds.index");
|
|
} catch (error) {
|
|
popupAjaxError(error);
|
|
}
|
|
}
|
|
|
|
@action
|
|
openPreview() {
|
|
this.modal.show(Preview, {
|
|
model: {
|
|
html: this.buffered.html,
|
|
},
|
|
});
|
|
}
|
|
|
|
setCategoriesForBuffered() {
|
|
// we need to fetch the categories because the serializer is not being used
|
|
// to attach the category object to the house ads
|
|
this.buffered.categories = this.buffered.category_ids
|
|
? this.buffered.category_ids.map((categoryId) =>
|
|
Category.findById(categoryId)
|
|
)
|
|
: [];
|
|
}
|
|
}
|