1
0
Fork 0
discourse-custom-wizard-unl.../assets/javascripts/discourse/components/wizard-links.js.es6

115 Zeilen
3,1 KiB
Text

2020-04-05 03:37:09 +02:00
import { default as discourseComputed, on, observes } from 'discourse-common/utils/decorators';
2020-04-10 09:57:49 +02:00
import { generateName, schema } from '../lib/wizard';
2020-03-29 09:49:33 +02:00
import { notEmpty } from "@ember/object/computed";
2020-04-05 03:37:09 +02:00
import { scheduleOnce, bind } from "@ember/runloop";
2020-04-02 07:21:57 +02:00
import EmberObject from "@ember/object";
2020-04-05 03:37:09 +02:00
import Component from "@ember/component";
import { A } from "@ember/array";
2017-10-17 09:18:53 +02:00
2020-04-05 03:37:09 +02:00
export default Component.extend({
2020-04-10 09:57:49 +02:00
classNameBindings: [':wizard-links', 'itemType'],
2020-04-05 03:37:09 +02:00
items: A(),
2020-03-29 09:49:33 +02:00
anyLinks: notEmpty('links'),
2017-10-17 09:18:53 +02:00
2018-06-29 08:54:06 +02:00
@on('didInsertElement')
@observes('links.@each')
2017-10-17 09:18:53 +02:00
didInsertElement() {
2020-03-30 01:53:28 +02:00
scheduleOnce('afterRender', () => (this.applySortable()));
2017-10-17 09:18:53 +02:00
},
applySortable() {
2020-03-29 09:49:33 +02:00
$(this.element).find("ul").sortable({tolerance: 'pointer'}).on('sortupdate', (e, ui) => {
2017-10-17 09:18:53 +02:00
const itemId = ui.item.data('id');
const index = ui.item.index();
2020-04-05 03:37:09 +02:00
bind(this, this.updateItemOrder(itemId, index));
2017-10-17 09:18:53 +02:00
});
},
updateItemOrder(itemId, newIndex) {
2020-04-01 07:03:26 +02:00
const items = this.items;
2017-10-17 09:18:53 +02:00
const item = items.findBy('id', itemId);
items.removeObject(item);
items.insertAt(newIndex, item);
2020-03-30 01:53:28 +02:00
scheduleOnce('afterRender', this, () => this.applySortable());
2017-10-17 09:18:53 +02:00
},
2020-04-10 09:57:49 +02:00
@discourseComputed('itemType')
header: (itemType) => `admin.wizard.${itemType}.header`,
2017-10-17 09:18:53 +02:00
2020-04-10 09:57:49 +02:00
@discourseComputed('current', 'items.@each.id', 'items.@each.type', 'items.@each.label', 'items.@each.title')
2020-04-06 03:54:16 +02:00
links(current, items) {
2017-10-17 09:18:53 +02:00
if (!items) return;
return items.map((item) => {
if (item) {
2020-04-08 09:59:54 +02:00
let link = {
id: item.id
}
let label = item.label || item.title || item.id;
if (this.generateLabels && item.type) {
label = generateName(item.type);
}
2020-04-10 09:57:49 +02:00
2020-04-08 09:59:54 +02:00
link.label = label;
2017-10-17 09:18:53 +02:00
let classes = 'btn';
2020-04-01 07:03:26 +02:00
if (current && item.id === current.id) {
2017-10-17 09:18:53 +02:00
classes += ' btn-primary';
};
2020-04-08 09:59:54 +02:00
link.classes = classes;
2017-10-17 09:18:53 +02:00
return link;
}
});
},
2020-04-10 09:57:49 +02:00
setDefaults(object, params) {
Object.keys(object).forEach(property => {
if (object[property]) {
params[property] = object[property];
}
});
return params;
},
2017-10-17 09:18:53 +02:00
actions: {
add() {
2020-04-01 07:03:26 +02:00
const items = this.items;
2020-04-10 09:57:49 +02:00
const itemType = this.itemType;
2020-04-08 09:59:54 +02:00
let params = {
2020-04-10 09:57:49 +02:00
id: `${itemType}_${items.length + 1}`,
2020-04-08 09:59:54 +02:00
isNew: true
};
2020-04-10 09:57:49 +02:00
if (schema[itemType].objectArrays) {
Object.keys(schema[itemType].objectArrays).forEach(objectType => {
params[objectArrays[objectType].property] = A();
2020-04-08 09:59:54 +02:00
});
2020-04-10 09:57:49 +02:00
};
2020-04-08 09:59:54 +02:00
2020-04-10 09:57:49 +02:00
params = this.setDefaults(schema[itemType].basic, params);
if (schema[itemType].types) {
params = this.setDefaults(schema[itemType].types[params.type], params);
}
2020-04-02 07:21:57 +02:00
const newItem = EmberObject.create(params);
2017-10-17 09:18:53 +02:00
items.pushObject(newItem);
2020-04-08 09:59:54 +02:00
2017-10-17 09:18:53 +02:00
this.set('current', newItem);
},
change(itemId) {
2020-04-01 07:03:26 +02:00
this.set('current', this.items.findBy('id', itemId));
2017-10-17 09:18:53 +02:00
},
remove(itemId) {
2020-04-01 07:03:26 +02:00
const items = this.items;
2017-10-17 09:18:53 +02:00
items.removeObject(items.findBy('id', itemId));
this.set('current', items[items.length - 1]);
}
}
});