Spiegel von
https://github.com/paviliondev/discourse-custom-wizard.git
synchronisiert 2024-11-25 10:40:28 +01:00
ceef3f4bc9
* Re structure builder logic to allow for step conditionality Concerns - Performance. Look at whether the additional build in the steps controller can be reduced - Does not work if applied to the last step. - Certain conditions will not work with the first step(?) - How should this be scoped to known functionality? * Add indexes and conditions to steps and fields * Complete and add spec * Complete backend * Complete step conditionality and field indexing * Fix failing spec * Update coverage * Apply rubocop * Apply prettier * Apply prettier to wizard js * Fix schema issues created in merge * Remove setting label for force_final * Improve client wizard cache naming * Improve steps controller and spec conditionality * Improve final step attribute naming * Fix failing spec * Linting * Add one more final step test * Linting * Fix eslint issues * Apply prettier * Linting, syntax, merge and copy cleanups * Update wizard-admin.scss * Fix template linting * Rubocop fixes
149 Zeilen
3,3 KiB
JavaScript
149 Zeilen
3,3 KiB
JavaScript
import {
|
|
default as discourseComputed,
|
|
observes,
|
|
on,
|
|
} from "discourse-common/utils/decorators";
|
|
import { generateName } from "../lib/wizard";
|
|
import {
|
|
setWizardDefaults,
|
|
default as wizardSchema,
|
|
} from "../lib/wizard-schema";
|
|
import { notEmpty } from "@ember/object/computed";
|
|
import { scheduleOnce } from "@ember/runloop";
|
|
import EmberObject from "@ember/object";
|
|
import Component from "@ember/component";
|
|
import { A } from "@ember/array";
|
|
|
|
export default Component.extend({
|
|
classNameBindings: [":wizard-links", "itemType"],
|
|
items: A(),
|
|
anyLinks: notEmpty("links"),
|
|
|
|
@on("didInsertElement")
|
|
@observes("links.[]")
|
|
setupSortable() {
|
|
scheduleOnce("afterRender", () => this.applySortable());
|
|
},
|
|
|
|
applySortable() {
|
|
$(this.element)
|
|
.find(".link-list")
|
|
.sortable({ tolerance: "pointer" })
|
|
.on("sortupdate", (e, ui) => {
|
|
this.updateItemOrder(ui.item.data("id"), ui.item.index());
|
|
});
|
|
},
|
|
|
|
updateItemOrder(itemId, newIndex) {
|
|
const items = this.items;
|
|
const item = items.findBy("id", itemId);
|
|
items.removeObject(item);
|
|
item.set("index", newIndex);
|
|
items.insertAt(newIndex, item);
|
|
scheduleOnce("afterRender", this, () => this.applySortable());
|
|
},
|
|
|
|
@discourseComputed("itemType")
|
|
header: (itemType) => `admin.wizard.${itemType}.header`,
|
|
|
|
@discourseComputed(
|
|
"current",
|
|
"items.@each.id",
|
|
"items.@each.type",
|
|
"items.@each.label",
|
|
"items.@each.title"
|
|
)
|
|
links(current, items) {
|
|
if (!items) {
|
|
return;
|
|
}
|
|
|
|
return items.map((item) => {
|
|
if (item) {
|
|
let link = {
|
|
id: item.id,
|
|
};
|
|
|
|
let label = item.label || item.title || item.id;
|
|
if (this.generateLabels && item.type) {
|
|
label = generateName(item.type);
|
|
}
|
|
|
|
link.label = `${label} (${item.id})`;
|
|
|
|
let classes = "btn";
|
|
if (current && item.id === current.id) {
|
|
classes += " btn-primary";
|
|
}
|
|
|
|
link.classes = classes;
|
|
|
|
return link;
|
|
}
|
|
});
|
|
},
|
|
|
|
actions: {
|
|
add() {
|
|
const items = this.get("items");
|
|
const itemType = this.itemType;
|
|
let params = setWizardDefaults({}, itemType);
|
|
|
|
params.isNew = true;
|
|
|
|
let index = 0;
|
|
if (items.length) {
|
|
index = items.length;
|
|
}
|
|
|
|
params.index = index;
|
|
|
|
let id = `${itemType}_${index + 1}`;
|
|
if (itemType === "field") {
|
|
id = `${this.parentId}_${id}`;
|
|
}
|
|
|
|
params.id = id;
|
|
|
|
let objectArrays = wizardSchema[itemType].objectArrays;
|
|
if (objectArrays) {
|
|
Object.keys(objectArrays).forEach((objectType) => {
|
|
params[objectArrays[objectType].property] = A();
|
|
});
|
|
}
|
|
|
|
const newItem = EmberObject.create(params);
|
|
items.pushObject(newItem);
|
|
|
|
this.set("current", newItem);
|
|
},
|
|
|
|
change(itemId) {
|
|
this.set("current", this.items.findBy("id", itemId));
|
|
},
|
|
|
|
remove(itemId) {
|
|
const items = this.items;
|
|
let item;
|
|
let index;
|
|
|
|
items.forEach((it, ind) => {
|
|
if (it.id === itemId) {
|
|
item = it;
|
|
index = ind;
|
|
}
|
|
});
|
|
|
|
let nextIndex;
|
|
if (this.current.id === itemId) {
|
|
nextIndex = index < items.length - 2 ? index + 1 : index - 1;
|
|
}
|
|
|
|
items.removeObject(item);
|
|
|
|
if (nextIndex) {
|
|
this.set("current", items[nextIndex]);
|
|
}
|
|
},
|
|
},
|
|
});
|