0
0
Fork 1
Spiegel von https://github.com/paviliondev/discourse-custom-wizard.git synchronisiert 2024-11-29 20:20:29 +01:00
discourse-custom-wizard/assets/javascripts/discourse/models/custom-wizard.js.es6

273 Zeilen
6,3 KiB
Text

2020-03-21 18:30:11 +01:00
import EmberObject from "@ember/object";
2021-09-03 00:38:30 +02:00
import { ajax } from "discourse/lib/ajax";
import { popupAjaxError } from "discourse/lib/ajax-error";
import { Promise } from "rsvp";
2021-04-12 07:44:47 +02:00
import { listProperties, snakeCase } from "../lib/wizard";
2021-09-03 00:38:30 +02:00
import { buildProperties, mapped, present } from "../lib/wizard-json";
import wizardSchema from "../lib/wizard-schema";
2017-11-01 05:21:14 +01:00
2020-03-21 18:30:11 +01:00
const CustomWizard = EmberObject.extend({
2020-04-13 14:17:22 +02:00
save(opts) {
return new Promise((resolve, reject) => {
let wizard = this.buildJson(this, "wizard");
2020-04-13 14:17:22 +02:00
if (wizard.error) {
reject(wizard);
2017-10-30 07:24:51 +01:00
}
2020-04-13 14:17:22 +02:00
let data = {
wizard,
2020-04-13 14:17:22 +02:00
};
2020-04-13 14:17:22 +02:00
if (opts.create) {
data.create = true;
}
2020-04-13 14:17:22 +02:00
ajax(`/admin/wizards/wizard/${wizard.id}`, {
type: "PUT",
2020-04-13 14:17:22 +02:00
contentType: "application/json",
data: JSON.stringify(data),
2017-10-30 07:24:51 +01:00
}).then((result) => {
if (result.backend_validation_error) {
2017-10-30 07:24:51 +01:00
reject(result);
} else {
resolve(result);
}
});
2017-10-13 15:02:34 +02:00
});
2017-10-07 04:27:38 +02:00
},
2017-09-24 05:01:18 +02:00
2020-04-08 09:59:54 +02:00
buildJson(object, type, result = {}) {
2020-04-10 09:57:49 +02:00
let objectType = object.type || null;
if (wizardSchema[type].types) {
2020-04-10 09:57:49 +02:00
if (!objectType) {
2020-04-08 09:59:54 +02:00
result.error = {
type: "required",
params: { type, property: "type" },
};
2020-04-08 09:59:54 +02:00
return result;
2020-04-08 04:52:07 +02:00
}
2020-04-08 09:59:54 +02:00
}
2020-04-20 11:41:13 +02:00
for (let property of listProperties(type, { objectType })) {
2020-04-08 09:59:54 +02:00
let value = object.get(property);
2020-04-11 08:22:12 +02:00
result = this.validateValue(property, value, object, type, result);
2020-04-10 09:57:49 +02:00
if (result.error) {
break;
2020-04-08 04:52:07 +02:00
}
2020-04-10 09:57:49 +02:00
if (mapped(property, type)) {
value = this.buildMappedJson(value);
}
2020-04-10 09:57:49 +02:00
if (value !== undefined && value !== null) {
result[property] = value;
}
}
2020-04-10 09:57:49 +02:00
if (!result.error) {
for (let arrayObjectType of Object.keys(
wizardSchema[type].objectArrays
)) {
let arraySchema = wizardSchema[type].objectArrays[arrayObjectType];
2020-04-10 09:57:49 +02:00
let objectArray = object.get(arraySchema.property);
2020-04-10 09:57:49 +02:00
if (arraySchema.required && !present(objectArray)) {
2020-04-08 09:59:54 +02:00
result.error = {
type: "required",
params: { type, property: arraySchema.property },
};
2020-04-10 09:57:49 +02:00
break;
2020-04-08 04:52:07 +02:00
}
2020-04-10 09:57:49 +02:00
result[arraySchema.property] = [];
2020-04-10 09:57:49 +02:00
for (let item of objectArray) {
let itemProps = this.buildJson(item, arrayObjectType);
2020-04-10 09:57:49 +02:00
if (itemProps.error) {
result.error = itemProps.error;
2020-04-08 09:59:54 +02:00
break;
} else {
2020-04-10 09:57:49 +02:00
result[arraySchema.property].push(itemProps);
2020-04-08 09:59:54 +02:00
}
}
}
2020-04-10 09:57:49 +02:00
}
2020-04-08 04:52:07 +02:00
return result;
2020-04-08 09:59:54 +02:00
},
2020-04-11 08:22:12 +02:00
validateValue(property, value, object, type, result) {
if (wizardSchema[type].required.indexOf(property) > -1 && !value) {
2020-04-10 09:57:49 +02:00
result.error = {
type: "required",
params: { type, property },
};
2020-04-10 09:57:49 +02:00
}
let dependent = wizardSchema[type].dependent[property];
2020-04-10 09:57:49 +02:00
if (dependent && value && !object[dependent]) {
result.error = {
type: "dependent",
params: { property, dependent },
};
2020-04-10 09:57:49 +02:00
}
if (property === "api_body") {
2020-04-10 09:57:49 +02:00
try {
value = JSON.parse(value);
} catch (e) {
result.error = {
type: "invalid",
params: { type, property },
};
2020-04-10 09:57:49 +02:00
}
}
2020-04-10 09:57:49 +02:00
return result;
},
2020-04-08 04:52:07 +02:00
buildMappedJson(value) {
if (typeof value === "string" || Number.isInteger(value)) {
return value;
}
if (!value || !value.length) {
2021-04-12 08:12:20 +02:00
return false;
}
let inputs = value;
2020-04-08 04:52:07 +02:00
let result = [];
inputs.forEach((inpt) => {
2020-04-08 04:52:07 +02:00
let input = {
type: inpt.type,
};
2020-04-11 08:22:12 +02:00
if (inpt.connector) {
input.connector = inpt.connector;
}
2020-04-08 04:52:07 +02:00
if (present(inpt.output)) {
input.output = inpt.output;
input.output_type = snakeCase(inpt.output_type);
input.output_connector = inpt.output_connector;
}
2020-04-08 04:52:07 +02:00
if (present(inpt.pairs)) {
input.pairs = [];
inpt.pairs.forEach((pr) => {
2020-04-08 04:52:07 +02:00
if (present(pr.key) && present(pr.value)) {
let pairParams = {
index: pr.index,
key: pr.key,
key_type: snakeCase(pr.key_type),
value: pr.value,
value_type: snakeCase(pr.value_type),
connector: pr.connector,
};
2020-04-08 04:52:07 +02:00
input.pairs.push(pairParams);
}
});
}
if (
(input.type === "assignment" && present(input.output)) ||
present(input.pairs)
) {
2020-04-08 04:52:07 +02:00
result.push(input);
}
});
2020-04-08 04:52:07 +02:00
if (!result.length) {
result = false;
}
2020-04-08 04:52:07 +02:00
return result;
},
2017-09-24 05:01:18 +02:00
remove() {
2020-04-13 14:17:22 +02:00
return ajax(`/admin/wizards/wizard/${this.id}`, {
type: "DELETE",
})
.then(() => this.destroy())
.catch(popupAjaxError);
},
2017-09-23 04:34:07 +02:00
});
CustomWizard.reopenClass({
2017-10-22 05:37:58 +02:00
all() {
2020-04-13 14:17:22 +02:00
return ajax("/admin/wizards/wizard", {
type: "GET",
})
.then((result) => {
return result.wizard_list;
})
.catch(popupAjaxError);
2017-09-23 04:34:07 +02:00
},
2021-07-14 08:04:19 +02:00
submissions(wizardId, page = null) {
let data = {};
if (page) {
data.page = page;
}
2017-10-22 05:37:58 +02:00
return ajax(`/admin/wizards/submissions/${wizardId}`, {
type: "GET",
2021-07-14 08:05:13 +02:00
data,
})
.then((result) => {
if (result.wizard) {
2021-09-03 00:38:30 +02:00
let fields = [{ id: "username", label: "User" }];
2021-07-14 08:05:13 +02:00
let submissions = [];
let wizard = result.wizard;
let total = result.total;
result.submissions.forEach((s) => {
let submission = {
username: s.user,
2021-07-14 08:05:13 +02:00
};
Object.keys(s.fields).forEach((fieldId) => {
2021-09-03 00:38:30 +02:00
if (!fields.some((field) => field.id === fieldId)) {
fields.push({ id: fieldId, label: s.fields[fieldId].label });
2021-07-14 08:05:13 +02:00
}
submission[fieldId] = s.fields[fieldId];
2021-07-14 08:05:13 +02:00
});
submission["submitted_at"] = s.submitted_at;
submissions.push(submission);
2021-07-14 08:04:19 +02:00
});
let submittedAt = {
id: "submitted_at",
2021-09-03 00:38:30 +02:00
label: "Submitted At",
2021-09-01 21:46:39 +02:00
};
fields.push(submittedAt);
2021-07-14 08:04:19 +02:00
2021-07-14 08:05:13 +02:00
return {
wizard,
fields,
submissions,
total,
};
}
})
.catch(popupAjaxError);
2017-10-05 02:36:46 +02:00
},
2020-04-01 12:58:30 +02:00
create(wizardJson = {}) {
const wizard = this._super.apply(this);
2020-04-01 14:16:26 +02:00
wizard.setProperties(buildProperties(wizardJson));
2017-09-23 04:34:07 +02:00
return wizard;
},
2017-09-23 04:34:07 +02:00
});
export default CustomWizard;