1
0
Fork 0
discourse-custom-wizard-unl.../assets/javascripts/discourse/models/custom-wizard-step.js.es6
2022-08-24 12:02:28 +02:00

114 Zeilen
3,1 KiB
JavaScript

import EmberObject from "@ember/object";
import ValidState from "discourse/plugins/discourse-custom-wizard/discourse/mixins/valid-state";
import { ajax } from "discourse/lib/ajax";
import discourseComputed from "discourse-common/utils/decorators";
import { later } from "@ember/runloop";
import { translationOrText } from "discourse/plugins/discourse-custom-wizard/discourse/lib/wizard";
export default EmberObject.extend(ValidState, {
id: null,
@discourseComputed("wizardId", "id")
i18nKey(wizardId, stepId) {
return `${wizardId}.${stepId}`;
},
@discourseComputed("i18nKey", "title")
translatedTitle(i18nKey, title) {
return translationOrText(`${i18nKey}.title`, title);
},
@discourseComputed("i18nKey", "description")
translatedDescription(i18nKey, description) {
return translationOrText(`${i18nKey}.description`, description);
},
@discourseComputed("index")
displayIndex: (index) => index + 1,
@discourseComputed("fields.[]")
fieldsById(fields) {
const lookup = {};
fields.forEach((field) => (lookup[field.get("id")] = field));
return lookup;
},
validate() {
let allValid = true;
const result = { warnings: [] };
this.fields.forEach((field) => {
allValid = allValid && field.check();
const warning = field.get("warning");
if (warning) {
result.warnings.push(warning);
}
});
this.setValid(allValid);
return result;
},
fieldError(id, description) {
const field = this.fields.findBy("id", id);
if (field) {
field.setValid(false, description);
}
},
save() {
const wizardId = this.get("wizardId");
const fields = {};
this.get("fields").forEach((f) => {
if (f.type !== "text_only") {
fields[f.id] = f.value;
}
});
return ajax({
url: `/w/${wizardId}/steps/${this.get("id")}`,
type: "PUT",
data: { fields },
}).catch((response) => {
if (response.jqXHR) {
response = response.jqXHR;
}
if (response && response.responseJSON && response.responseJSON.errors) {
let wizardErrors = [];
response.responseJSON.errors.forEach((err) => {
if (err.field === wizardId) {
wizardErrors.push(err.description);
} else if (err.field) {
this.fieldError(err.field, err.description);
} else if (err) {
wizardErrors.push(err);
}
});
if (wizardErrors.length) {
this.handleWizardError(wizardErrors.join("\n"));
}
this.animateInvalidFields();
throw response;
}
if (response && response.responseText) {
const responseText = response.responseText;
const start = responseText.indexOf(">") + 1;
const end = responseText.indexOf("plugins");
const message = responseText.substring(start, end);
this.handleWizardError(message);
throw message;
}
});
},
handleWizardError(message) {
this.set("message", {
state: "error",
text: message,
});
later(() => this.set("message", null), 6000);
},
});