217 lines
5.8 KiB
JavaScript
217 lines
5.8 KiB
JavaScript
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";
|
|
import RestModel from "discourse/models/rest";
|
|
import PreloadStore from "preload-store";
|
|
|
|
const Site = RestModel.extend({
|
|
isReadOnly: Ember.computed.alias("is_readonly"),
|
|
|
|
init() {
|
|
this._super(...arguments);
|
|
|
|
this.topicCountDesc = ["topic_count:desc"];
|
|
},
|
|
|
|
@computed("notification_types")
|
|
notificationLookup(notificationTypes) {
|
|
const result = [];
|
|
Object.keys(notificationTypes).forEach(
|
|
k => (result[notificationTypes[k]] = k)
|
|
);
|
|
return result;
|
|
},
|
|
|
|
@computed("post_action_types.[]")
|
|
flagTypes() {
|
|
const postActionTypes = this.post_action_types;
|
|
if (!postActionTypes) return [];
|
|
return postActionTypes.filterBy("is_flag", true);
|
|
},
|
|
|
|
categoriesByCount: Ember.computed.sort("categories", "topicCountDesc"),
|
|
|
|
collectUserFields(fields) {
|
|
fields = fields || {};
|
|
|
|
let siteFields = this.user_fields;
|
|
|
|
if (!Ember.isEmpty(siteFields)) {
|
|
return siteFields.map(f => {
|
|
let value = fields ? fields[f.id.toString()] : null;
|
|
value = value || "—".htmlSafe();
|
|
return { name: f.name, value };
|
|
});
|
|
}
|
|
return [];
|
|
},
|
|
|
|
// Sort subcategories under parents
|
|
@computed("categoriesByCount", "categories.[]")
|
|
sortedCategories(cats) {
|
|
const result = [],
|
|
remaining = {};
|
|
|
|
cats.forEach(c => {
|
|
const parentCategoryId = parseInt(c.get("parent_category_id"), 10);
|
|
if (!parentCategoryId) {
|
|
result.pushObject(c);
|
|
} else {
|
|
remaining[parentCategoryId] = remaining[parentCategoryId] || [];
|
|
remaining[parentCategoryId].pushObject(c);
|
|
}
|
|
});
|
|
|
|
Object.keys(remaining).forEach(parentCategoryId => {
|
|
const category = result.findBy("id", parseInt(parentCategoryId, 10)),
|
|
index = result.indexOf(category);
|
|
|
|
if (index !== -1) {
|
|
result.replace(index + 1, 0, remaining[parentCategoryId]);
|
|
}
|
|
});
|
|
|
|
return result;
|
|
},
|
|
|
|
@computed
|
|
baseUri() {
|
|
return Discourse.baseUri;
|
|
},
|
|
|
|
// Returns it in the correct order, by setting
|
|
@computed
|
|
categoriesList() {
|
|
return this.siteSettings.fixed_category_positions
|
|
? this.categories
|
|
: this.sortedCategories;
|
|
},
|
|
|
|
postActionTypeById(id) {
|
|
return this.get("postActionByIdLookup.action" + id);
|
|
},
|
|
|
|
topicFlagTypeById(id) {
|
|
return this.get("topicFlagByIdLookup.action" + id);
|
|
},
|
|
|
|
removeCategory(id) {
|
|
const categories = this.categories;
|
|
const existingCategory = categories.findBy("id", id);
|
|
if (existingCategory) {
|
|
categories.removeObject(existingCategory);
|
|
delete this.categoriesById.categoryId;
|
|
}
|
|
},
|
|
|
|
updateCategory(newCategory) {
|
|
const categories = this.categories;
|
|
const categoryId = Ember.get(newCategory, "id");
|
|
const existingCategory = categories.findBy("id", categoryId);
|
|
|
|
// Don't update null permissions
|
|
if (newCategory.permission === null) {
|
|
delete newCategory.permission;
|
|
}
|
|
|
|
if (existingCategory) {
|
|
existingCategory.setProperties(newCategory);
|
|
} else {
|
|
// TODO insert in right order?
|
|
newCategory = this.store.createRecord("category", newCategory);
|
|
categories.pushObject(newCategory);
|
|
this.categoriesById[categoryId] = newCategory;
|
|
}
|
|
}
|
|
});
|
|
|
|
Site.reopenClass(Singleton, {
|
|
// The current singleton will retrieve its attributes from the `PreloadStore`.
|
|
createCurrent() {
|
|
const store = Discourse.__container__.lookup("service:store");
|
|
return store.createRecord("site", PreloadStore.get("site"));
|
|
},
|
|
|
|
create() {
|
|
const result = this._super.apply(this, arguments);
|
|
const store = result.store;
|
|
|
|
if (result.categories) {
|
|
let subcatMap = {};
|
|
|
|
result.categoriesById = {};
|
|
result.categories = result.categories.map(c => {
|
|
if (c.parent_category_id) {
|
|
subcatMap[c.parent_category_id] =
|
|
subcatMap[c.parent_category_id] || [];
|
|
subcatMap[c.parent_category_id].push(c.id);
|
|
}
|
|
return (result.categoriesById[c.id] = store.createRecord(
|
|
"category",
|
|
c
|
|
));
|
|
});
|
|
|
|
// Associate the categories with their parents
|
|
result.categories.forEach(c => {
|
|
let subcategoryIds = subcatMap[c.get("id")];
|
|
if (subcategoryIds) {
|
|
c.set(
|
|
"subcategories",
|
|
subcategoryIds.map(id => result.categoriesById[id])
|
|
);
|
|
}
|
|
if (c.get("parent_category_id")) {
|
|
c.set(
|
|
"parentCategory",
|
|
result.categoriesById[c.get("parent_category_id")]
|
|
);
|
|
}
|
|
});
|
|
}
|
|
|
|
if (result.trust_levels) {
|
|
result.trustLevels = result.trust_levels.map(tl =>
|
|
Discourse.TrustLevel.create(tl)
|
|
);
|
|
delete result.trust_levels;
|
|
}
|
|
|
|
if (result.post_action_types) {
|
|
result.postActionByIdLookup = Ember.Object.create();
|
|
result.post_action_types = result.post_action_types.map(p => {
|
|
const actionType = PostActionType.create(p);
|
|
result.postActionByIdLookup.set("action" + p.id, actionType);
|
|
return actionType;
|
|
});
|
|
}
|
|
|
|
if (result.topic_flag_types) {
|
|
result.topicFlagByIdLookup = Ember.Object.create();
|
|
result.topic_flag_types = result.topic_flag_types.map(p => {
|
|
const actionType = PostActionType.create(p);
|
|
result.topicFlagByIdLookup.set("action" + p.id, actionType);
|
|
return actionType;
|
|
});
|
|
}
|
|
|
|
if (result.archetypes) {
|
|
result.archetypes = result.archetypes.map(a => {
|
|
a.site = result;
|
|
return Archetype.create(a);
|
|
});
|
|
}
|
|
|
|
if (result.user_fields) {
|
|
result.user_fields = result.user_fields.map(uf =>
|
|
Ember.Object.create(uf)
|
|
);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
});
|
|
|
|
export default Site;
|