diff --git a/assets/javascripts/discourse/components/custom-field-input.js.es6 b/assets/javascripts/discourse/components/custom-field-input.js.es6 index c30a016a..1ad0b152 100644 --- a/assets/javascripts/discourse/components/custom-field-input.js.es6 +++ b/assets/javascripts/discourse/components/custom-field-input.js.es6 @@ -2,118 +2,127 @@ import Component from "@ember/component"; import discourseComputed, { observes } from "discourse-common/utils/decorators"; import { or, alias } from "@ember/object/computed"; -const generateContent = function(array, type) { - return array.map(key => ({ +const generateContent = function (array, type) { + return array.map((key) => ({ id: key, - name: I18n.t(`admin.wizard.custom_field.${type}.${key}`) + name: I18n.t(`admin.wizard.custom_field.${type}.${key}`), })); -} +}; export default Component.extend({ - tagName: 'tr', - topicSerializers: ['topic_view', 'topic_list_item'], - postSerializers: ['post'], - groupSerializers: ['basic_group'], - categorySerializers: ['basic_category'], - klassContent: generateContent(['topic', 'post', 'group', 'category'], 'klass'), - typeContent: generateContent(['string', 'boolean', 'integer', 'json'], 'type'), - showInputs: or('field.new', 'field.edit'), - classNames: ['custom-field-input'], - loading: or('saving', 'destroying'), - destroyDisabled: alias('loading'), - closeDisabled: alias('loading'), - + tagName: "tr", + topicSerializers: ["topic_view", "topic_list_item"], + postSerializers: ["post"], + groupSerializers: ["basic_group"], + categorySerializers: ["basic_category"], + klassContent: generateContent( + ["topic", "post", "group", "category"], + "klass" + ), + typeContent: generateContent( + ["string", "boolean", "integer", "json"], + "type" + ), + showInputs: or("field.new", "field.edit"), + classNames: ["custom-field-input"], + loading: or("saving", "destroying"), + destroyDisabled: alias("loading"), + closeDisabled: alias("loading"), + didInsertElement() { - this.set('originalField', JSON.parse(JSON.stringify(this.field))); + this.set("originalField", JSON.parse(JSON.stringify(this.field))); }, - - @discourseComputed('field.klass') + + @discourseComputed("field.klass") serializerContent(klass, p2) { const serializers = this.get(`${klass}Serializers`); - + if (serializers) { - return generateContent(serializers, 'serializers'); + return generateContent(serializers, "serializers"); } else { return []; } }, - - @observes('field.klass') + + @observes("field.klass") clearSerializersWhenClassChanges() { - this.set('field.serializers', null); + this.set("field.serializers", null); }, - + compareArrays(array1, array2) { - return array1.length === array2.length && array1.every((value, index) => { - return value === array2[index]; - }); + return ( + array1.length === array2.length && + array1.every((value, index) => { + return value === array2[index]; + }) + ); }, - + @discourseComputed( - 'saving', - 'field.name', - 'field.klass', - 'field.type', - 'field.serializers' + "saving", + "field.name", + "field.klass", + "field.type", + "field.serializers" ) saveDisabled(saving) { if (saving) return true; - + const originalField = this.originalField; if (!originalField) return false; - - return ['name', 'klass', 'type', 'serializers'].every(attr => { + + return ["name", "klass", "type", "serializers"].every((attr) => { let current = this.get(attr); let original = originalField[attr]; - + if (!current) return false; - - if (attr == 'serializers') { + + if (attr == "serializers") { return this.compareArrays(current, original); } else { return current == original; } }); }, - + actions: { edit() { - this.set('field.edit', true); + this.set("field.edit", true); }, - + close() { if (this.field.edit) { - this.set('field.edit', false); + this.set("field.edit", false); } }, - + destroy() { - this.set('destroying', true); + this.set("destroying", true); this.removeField(this.field); }, - + save() { - this.set('saving', true); - + this.set("saving", true); + const field = this.field; - + let data = { id: field.id, klass: field.klass, type: field.type, serializers: field.serializers, - name: field.name - } - + name: field.name, + }; + this.saveField(data).then((result) => { - this.set('saving', false); + this.set("saving", false); if (result.success) { - this.set('field.edit', false); + this.set("field.edit", false); } else { - this.set('saveIcon', 'times'); + this.set("saveIcon", "times"); } - setTimeout(() => this.set('saveIcon', null), 10000); + setTimeout(() => this.set("saveIcon", null), 10000); }); - } - } -}); \ No newline at end of file + }, + }, +}); diff --git a/assets/javascripts/discourse/components/wizard-advanced-toggle.js.es6 b/assets/javascripts/discourse/components/wizard-advanced-toggle.js.es6 index 51b9948c..b03a7ce5 100644 --- a/assets/javascripts/discourse/components/wizard-advanced-toggle.js.es6 +++ b/assets/javascripts/discourse/components/wizard-advanced-toggle.js.es6 @@ -1,19 +1,19 @@ -import { default as discourseComputed } from 'discourse-common/utils/decorators'; -import Component from '@ember/component'; +import { default as discourseComputed } from "discourse-common/utils/decorators"; +import Component from "@ember/component"; export default Component.extend({ - classNames: 'wizard-advanced-toggle', - - @discourseComputed('showAdvanced') + classNames: "wizard-advanced-toggle", + + @discourseComputed("showAdvanced") toggleClass(showAdvanced) { - let classes = 'btn' - if (showAdvanced) classes += ' btn-primary'; + let classes = "btn"; + if (showAdvanced) classes += " btn-primary"; return classes; }, - + actions: { toggleAdvanced() { - this.toggleProperty('showAdvanced'); - } - } -}) \ No newline at end of file + this.toggleProperty("showAdvanced"); + }, + }, +}); diff --git a/assets/javascripts/discourse/components/wizard-custom-action.js.es6 b/assets/javascripts/discourse/components/wizard-custom-action.js.es6 index dbfa4e93..3dcc85d1 100644 --- a/assets/javascripts/discourse/components/wizard-custom-action.js.es6 +++ b/assets/javascripts/discourse/components/wizard-custom-action.js.es6 @@ -1,89 +1,98 @@ -import { default as discourseComputed } from 'discourse-common/utils/decorators'; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import { equal, empty, or, and } from "@ember/object/computed"; -import { generateName, selectKitContent } from '../lib/wizard'; +import { generateName, selectKitContent } from "../lib/wizard"; import { computed } from "@ember/object"; -import wizardSchema from '../lib/wizard-schema'; -import UndoChanges from '../mixins/undo-changes'; +import wizardSchema from "../lib/wizard-schema"; +import UndoChanges from "../mixins/undo-changes"; import Component from "@ember/component"; -import { notificationLevels } from '../lib/wizard'; +import { notificationLevels } from "../lib/wizard"; import I18n from "I18n"; export default Component.extend(UndoChanges, { - componentType: 'action', - classNameBindings: [':wizard-custom-action', 'visible'], - visible: computed('currentActionId', function() { return this.action.id === this.currentActionId }), - createTopic: equal('action.type', 'create_topic'), - updateProfile: equal('action.type', 'update_profile'), - watchCategories: equal('action.type', 'watch_categories'), - sendMessage: equal('action.type', 'send_message'), - openComposer: equal('action.type', 'open_composer'), - sendToApi: equal('action.type', 'send_to_api'), - addToGroup: equal('action.type', 'add_to_group'), - routeTo: equal('action.type', 'route_to'), - createCategory: equal('action.type', 'create_category'), - createGroup: equal('action.type', 'create_group'), - apiEmpty: empty('action.api'), - groupPropertyTypes: selectKitContent(['id', 'name']), - hasAdvanced: or('hasCustomFields', 'routeTo'), - showAdvanced: and('hasAdvanced', 'action.type'), - hasCustomFields: or('basicTopicFields', 'updateProfile', 'createGroup', 'createCategory'), - basicTopicFields: or('createTopic', 'sendMessage', 'openComposer'), - publicTopicFields: or('createTopic', 'openComposer'), - showPostAdvanced: or('createTopic', 'sendMessage'), - actionTypes: Object.keys(wizardSchema.action.types).map(type => { + componentType: "action", + classNameBindings: [":wizard-custom-action", "visible"], + visible: computed("currentActionId", function () { + return this.action.id === this.currentActionId; + }), + createTopic: equal("action.type", "create_topic"), + updateProfile: equal("action.type", "update_profile"), + watchCategories: equal("action.type", "watch_categories"), + sendMessage: equal("action.type", "send_message"), + openComposer: equal("action.type", "open_composer"), + sendToApi: equal("action.type", "send_to_api"), + addToGroup: equal("action.type", "add_to_group"), + routeTo: equal("action.type", "route_to"), + createCategory: equal("action.type", "create_category"), + createGroup: equal("action.type", "create_group"), + apiEmpty: empty("action.api"), + groupPropertyTypes: selectKitContent(["id", "name"]), + hasAdvanced: or("hasCustomFields", "routeTo"), + showAdvanced: and("hasAdvanced", "action.type"), + hasCustomFields: or( + "basicTopicFields", + "updateProfile", + "createGroup", + "createCategory" + ), + basicTopicFields: or("createTopic", "sendMessage", "openComposer"), + publicTopicFields: or("createTopic", "openComposer"), + showPostAdvanced: or("createTopic", "sendMessage"), + actionTypes: Object.keys(wizardSchema.action.types).map((type) => { return { id: type, - name: I18n.t(`admin.wizard.action.${type}.label`) + name: I18n.t(`admin.wizard.action.${type}.label`), }; }), availableNotificationLevels: notificationLevels.map((type, index) => { return { id: type, - name: I18n.t(`admin.wizard.action.watch_categories.notification_level.${type}`) + name: I18n.t( + `admin.wizard.action.watch_categories.notification_level.${type}` + ), }; }), - - messageUrl: 'https://thepavilion.io/t/2810', - - @discourseComputed('action.type') + + messageUrl: "https://thepavilion.io/t/2810", + + @discourseComputed("action.type") messageKey(type) { - let key = 'type'; + let key = "type"; if (type) { - key = 'edit'; + key = "edit"; } return key; }, - - @discourseComputed('wizard.steps') + + @discourseComputed("wizard.steps") runAfterContent(steps) { - let content = steps.map(function(step) { + let content = steps.map(function (step) { return { id: step.id, - name: step.title || step.id + name: step.title || step.id, }; }); - + content.unshift({ - id: 'wizard_completion', - name: I18n.t('admin.wizard.action.run_after.wizard_completion') + id: "wizard_completion", + name: I18n.t("admin.wizard.action.run_after.wizard_completion"), }); - + return content; }, - @discourseComputed('apis') + @discourseComputed("apis") availableApis(apis) { - return apis.map(a => { + return apis.map((a) => { return { id: a.name, - name: a.title + name: a.title, }; }); }, - @discourseComputed('apis', 'action.api') + @discourseComputed("apis", "action.api") availableEndpoints(apis, api) { if (!api) return []; - return apis.find(a => a.name === api).endpoints; - } + return apis.find((a) => a.name === api).endpoints; + }, }); diff --git a/assets/javascripts/discourse/components/wizard-custom-field.js.es6 b/assets/javascripts/discourse/components/wizard-custom-field.js.es6 index 9f9470ac..85c26677 100644 --- a/assets/javascripts/discourse/components/wizard-custom-field.js.es6 +++ b/assets/javascripts/discourse/components/wizard-custom-field.js.es6 @@ -1,117 +1,119 @@ -import { default as discourseComputed } from 'discourse-common/utils/decorators'; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import { equal, or, alias } from "@ember/object/computed"; import { computed } from "@ember/object"; -import { selectKitContent } from '../lib/wizard'; -import UndoChanges from '../mixins/undo-changes'; +import { selectKitContent } from "../lib/wizard"; +import UndoChanges from "../mixins/undo-changes"; import Component from "@ember/component"; -import wizardSchema from '../lib/wizard-schema'; +import wizardSchema from "../lib/wizard-schema"; export default Component.extend(UndoChanges, { - componentType: 'field', - classNameBindings: [':wizard-custom-field', 'visible'], - visible: computed('currentFieldId', function() { return this.field.id === this.currentFieldId }), - isDropdown: equal('field.type', 'dropdown'), - isUpload: equal('field.type', 'upload'), - isCategory: equal('field.type', 'category'), - isGroup: equal('field.type', 'group'), - isTag: equal('field.type', 'tag'), - isText: equal('field.type', 'text'), - isTextarea: equal('field.type', 'textarea'), - isUrl: equal('field.type', 'url'), - isComposer: equal('field.type', 'composer'), - showPrefill: or('isText', 'isCategory', 'isTag', 'isGroup', 'isDropdown'), - showContent: or('isCategory', 'isTag', 'isGroup', 'isDropdown'), - showLimit: or('isCategory', 'isTag'), - isTextType: or('isText', 'isTextarea', 'isComposer'), - categoryPropertyTypes: selectKitContent(['id', 'slug']), - showAdvanced: alias('field.type'), - messageUrl: 'https://thepavilion.io/t/2809', - - @discourseComputed('field.type') + componentType: "field", + classNameBindings: [":wizard-custom-field", "visible"], + visible: computed("currentFieldId", function () { + return this.field.id === this.currentFieldId; + }), + isDropdown: equal("field.type", "dropdown"), + isUpload: equal("field.type", "upload"), + isCategory: equal("field.type", "category"), + isGroup: equal("field.type", "group"), + isTag: equal("field.type", "tag"), + isText: equal("field.type", "text"), + isTextarea: equal("field.type", "textarea"), + isUrl: equal("field.type", "url"), + isComposer: equal("field.type", "composer"), + showPrefill: or("isText", "isCategory", "isTag", "isGroup", "isDropdown"), + showContent: or("isCategory", "isTag", "isGroup", "isDropdown"), + showLimit: or("isCategory", "isTag"), + isTextType: or("isText", "isTextarea", "isComposer"), + categoryPropertyTypes: selectKitContent(["id", "slug"]), + showAdvanced: alias("field.type"), + messageUrl: "https://thepavilion.io/t/2809", + + @discourseComputed("field.type") validations(type) { const applicableToField = []; - - for(let validation in wizardSchema.field.validations) { - if ((wizardSchema.field.validations[validation]["types"]).includes(type)) { - applicableToField.push(validation) + + for (let validation in wizardSchema.field.validations) { + if (wizardSchema.field.validations[validation]["types"].includes(type)) { + applicableToField.push(validation); } } return applicableToField; }, - @discourseComputed('field.type') + @discourseComputed("field.type") isDateTime(type) { - return ['date_time', 'date', 'time'].indexOf(type) > -1; + return ["date_time", "date", "time"].indexOf(type) > -1; }, - - @discourseComputed('field.type') + + @discourseComputed("field.type") messageKey(type) { - let key = 'type'; + let key = "type"; if (type) { - key = 'edit'; + key = "edit"; } return key; }, - - setupTypeOutput(fieldType, options) { + + setupTypeOutput(fieldType, options) { const selectionType = { - category: 'category', - tag: 'tag', - group: 'group' + category: "category", + tag: "tag", + group: "group", }[fieldType]; - + if (selectionType) { - options[`${selectionType}Selection`] = 'output'; + options[`${selectionType}Selection`] = "output"; options.outputDefaultSelection = selectionType; } return options; }, - - @discourseComputed('field.type') + + @discourseComputed("field.type") contentOptions(fieldType) { let options = { wizardFieldSelection: true, - textSelection: 'key,value', - userFieldSelection: 'key,value', - context: 'field' - } - + textSelection: "key,value", + userFieldSelection: "key,value", + context: "field", + }; + options = this.setupTypeOutput(fieldType, options); - + if (this.isDropdown) { - options.wizardFieldSelection = 'key,value'; - options.userFieldOptionsSelection = 'output'; - options.textSelection = 'key,value,output'; - options.inputTypes = 'conditional,association,assignment'; - options.pairConnector = 'association'; - options.keyPlaceholder = 'admin.wizard.key'; - options.valuePlaceholder = 'admin.wizard.value'; + options.wizardFieldSelection = "key,value"; + options.userFieldOptionsSelection = "output"; + options.textSelection = "key,value,output"; + options.inputTypes = "conditional,association,assignment"; + options.pairConnector = "association"; + options.keyPlaceholder = "admin.wizard.key"; + options.valuePlaceholder = "admin.wizard.value"; } - + return options; }, - - @discourseComputed('field.type') + + @discourseComputed("field.type") prefillOptions(fieldType) { let options = { wizardFieldSelection: true, textSelection: true, - userFieldSelection: 'key,value', - context: 'field' - } + userFieldSelection: "key,value", + context: "field", + }; return this.setupTypeOutput(fieldType, options); }, - - actions: { + + actions: { imageUploadDone(upload) { this.set("field.image", upload.url); }, - + imageUploadDeleted() { this.set("field.image", null); - } - } + }, + }, }); diff --git a/assets/javascripts/discourse/components/wizard-custom-step.js.es6 b/assets/javascripts/discourse/components/wizard-custom-step.js.es6 index b09ad462..102af717 100644 --- a/assets/javascripts/discourse/components/wizard-custom-step.js.es6 +++ b/assets/javascripts/discourse/components/wizard-custom-step.js.es6 @@ -1,16 +1,16 @@ import Component from "@ember/component"; -import { default as discourseComputed } from 'discourse-common/utils/decorators'; +import { default as discourseComputed } from "discourse-common/utils/decorators"; export default Component.extend({ - classNames: 'wizard-custom-step', - + classNames: "wizard-custom-step", + actions: { bannerUploadDone(upload) { this.set("step.banner", upload.url); }, - + bannerUploadDeleted() { this.set("step.banner", null); - } - } + }, + }, }); diff --git a/assets/javascripts/discourse/components/wizard-links.js.es6 b/assets/javascripts/discourse/components/wizard-links.js.es6 index cd68847c..6f2ca117 100644 --- a/assets/javascripts/discourse/components/wizard-links.js.es6 +++ b/assets/javascripts/discourse/components/wizard-links.js.es6 @@ -1,6 +1,13 @@ -import { default as discourseComputed, on, observes } from 'discourse-common/utils/decorators'; -import { generateName } from '../lib/wizard'; -import { default as wizardSchema, setWizardDefaults } from '../lib/wizard-schema'; +import { + default as discourseComputed, + on, + observes, +} from "discourse-common/utils/decorators"; +import { generateName } from "../lib/wizard"; +import { + default as wizardSchema, + setWizardDefaults, +} from "../lib/wizard-schema"; import { notEmpty } from "@ember/object/computed"; import { scheduleOnce, bind } from "@ember/runloop"; import EmberObject from "@ember/object"; @@ -8,56 +15,63 @@ import Component from "@ember/component"; import { A } from "@ember/array"; export default Component.extend({ - classNameBindings: [':wizard-links', 'itemType'], + classNameBindings: [":wizard-links", "itemType"], items: A(), - anyLinks: notEmpty('links'), + anyLinks: notEmpty("links"), - @on('didInsertElement') - @observes('links.[]') + @on("didInsertElement") + @observes("links.[]") setupSortable() { - scheduleOnce('afterRender', () => (this.applySortable())); + 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()); + $(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); + const item = items.findBy("id", itemId); items.removeObject(item); items.insertAt(newIndex, item); - scheduleOnce('afterRender', this, () => this.applySortable()); + scheduleOnce("afterRender", this, () => this.applySortable()); }, - @discourseComputed('itemType') + @discourseComputed("itemType") header: (itemType) => `admin.wizard.${itemType}.header`, - @discourseComputed('current', 'items.@each.id', 'items.@each.type', 'items.@each.label', 'items.@each.title') + @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 - } + 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'; + let classes = "btn"; if (current && item.id === current.id) { - classes += ' btn-primary'; - }; + classes += " btn-primary"; + } link.classes = classes; @@ -68,69 +82,73 @@ export default Component.extend({ actions: { add() { - const items = this.get('items'); + const items = this.get("items"); const itemType = this.itemType; let params = setWizardDefaults({}, itemType); - + params.isNew = true; - + let next = 1; - + if (items.length) { - next = Math.max.apply(Math, items.map((i) => { - let parts = i.id.split('_'); - let lastPart = parts[parts.length - 1]; - return isNaN(lastPart) ? 0 : lastPart; - })) + 1; + next = + Math.max.apply( + Math, + items.map((i) => { + let parts = i.id.split("_"); + let lastPart = parts[parts.length - 1]; + return isNaN(lastPart) ? 0 : lastPart; + }) + ) + 1; } - + let id = `${itemType}_${next}`; - - if (itemType === 'field') { + + if (itemType === "field") { id = `${this.parentId}_${id}`; } - + params.id = id; - + let objectArrays = wizardSchema[itemType].objectArrays; if (objectArrays) { - Object.keys(objectArrays).forEach(objectType => { + Object.keys(objectArrays).forEach((objectType) => { params[objectArrays[objectType].property] = A(); }); - }; - + } + const newItem = EmberObject.create(params); items.pushObject(newItem); - - this.set('current', newItem); + + this.set("current", newItem); }, change(itemId) { - this.set('current', this.items.findBy('id', 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); + nextIndex = index < items.length - 2 ? index + 1 : index - 1; } - + items.removeObject(item); - + if (nextIndex) { - this.set('current', items[nextIndex]); + this.set("current", items[nextIndex]); } - } - } + }, + }, }); diff --git a/assets/javascripts/discourse/components/wizard-mapper-connector.js.es6 b/assets/javascripts/discourse/components/wizard-mapper-connector.js.es6 index 58203e51..36c0ec20 100644 --- a/assets/javascripts/discourse/components/wizard-mapper-connector.js.es6 +++ b/assets/javascripts/discourse/components/wizard-mapper-connector.js.es6 @@ -1,35 +1,39 @@ import Component from "@ember/component"; -import { gt } from '@ember/object/computed'; +import { gt } from "@ember/object/computed"; import { computed } from "@ember/object"; -import { defaultConnector } from '../lib/wizard-mapper'; +import { defaultConnector } from "../lib/wizard-mapper"; import { later } from "@ember/runloop"; import { observes } from "discourse-common/utils/decorators"; import I18n from "I18n"; export default Component.extend({ - classNameBindings: [':mapper-connector', ':mapper-block', 'hasMultiple::single'], - hasMultiple: gt('connectors.length', 1), - connectorLabel: computed(function() { + classNameBindings: [ + ":mapper-connector", + ":mapper-block", + "hasMultiple::single", + ], + hasMultiple: gt("connectors.length", 1), + connectorLabel: computed(function () { let key = this.connector; let path = this.inputTypes ? `input.${key}.name` : `connector.${key}`; return I18n.t(`admin.wizard.${path}`); }), - + didReceiveAttrs() { if (!this.connector) { later(() => { this.set( - 'connector', + "connector", defaultConnector(this.connectorType, this.inputType, this.options) ); - }); + }); } }, - + actions: { changeConnector(value) { - this.set('connector', value); - this.onUpdate('connector', this.connectorType); - } - } -}); \ No newline at end of file + this.set("connector", value); + this.onUpdate("connector", this.connectorType); + }, + }, +}); diff --git a/assets/javascripts/discourse/components/wizard-mapper-input.js.es6 b/assets/javascripts/discourse/components/wizard-mapper-input.js.es6 index 2c81bb89..c7327fbc 100644 --- a/assets/javascripts/discourse/components/wizard-mapper-input.js.es6 +++ b/assets/javascripts/discourse/components/wizard-mapper-input.js.es6 @@ -1,69 +1,78 @@ import { computed, set } from "@ember/object"; import { alias, equal, or, not } from "@ember/object/computed"; -import { newPair, connectorContent, inputTypesContent, defaultSelectionType, defaultConnector } from '../lib/wizard-mapper'; +import { + newPair, + connectorContent, + inputTypesContent, + defaultSelectionType, + defaultConnector, +} from "../lib/wizard-mapper"; import Component from "@ember/component"; import { observes } from "discourse-common/utils/decorators"; import { A } from "@ember/array"; export default Component.extend({ - classNameBindings: [':mapper-input', 'inputType'], - inputType: alias('input.type'), - isConditional: equal('inputType', 'conditional'), - isAssignment: equal('inputType', 'assignment'), - isAssociation: equal('inputType', 'association'), - isValidation: equal('inputType', 'validation'), - hasOutput: or('isConditional', 'isAssignment'), - hasPairs: or('isConditional', 'isAssociation', 'isValidation'), - canAddPair: not('isAssignment'), - connectors: computed(function() { return connectorContent('output', this.input.type, this.options) }), - inputTypes: computed(function() { return inputTypesContent(this.options) }), - - @observes('input.type') + classNameBindings: [":mapper-input", "inputType"], + inputType: alias("input.type"), + isConditional: equal("inputType", "conditional"), + isAssignment: equal("inputType", "assignment"), + isAssociation: equal("inputType", "association"), + isValidation: equal("inputType", "validation"), + hasOutput: or("isConditional", "isAssignment"), + hasPairs: or("isConditional", "isAssociation", "isValidation"), + canAddPair: not("isAssignment"), + connectors: computed(function () { + return connectorContent("output", this.input.type, this.options); + }), + inputTypes: computed(function () { + return inputTypesContent(this.options); + }), + + @observes("input.type") setupType() { if (this.hasPairs && (!this.input.pairs || this.input.pairs.length < 1)) { - this.send('addPair'); + this.send("addPair"); } - + if (this.hasOutput) { - this.set('input.output', null); - + this.set("input.output", null); + if (!this.input.outputConnector) { const options = this.options; - this.set('input.output_type', defaultSelectionType('output', options)); - this.set('input.output_connector', defaultConnector('output', this.inputType, options)); + this.set("input.output_type", defaultSelectionType("output", options)); + this.set( + "input.output_connector", + defaultConnector("output", this.inputType, options) + ); } } }, - + actions: { addPair() { if (!this.input.pairs) { - this.set('input.pairs', A()); + this.set("input.pairs", A()); } - + const pairs = this.input.pairs; const pairCount = pairs.length + 1; - - pairs.forEach(p => (set(p, 'pairCount', pairCount))); - + + pairs.forEach((p) => set(p, "pairCount", pairCount)); + pairs.pushObject( newPair( - this.input.type, - Object.assign( - {}, - this.options, - { index: pairs.length, pairCount } - ) + this.input.type, + Object.assign({}, this.options, { index: pairs.length, pairCount }) ) ); }, - + removePair(pair) { const pairs = this.input.pairs; const pairCount = pairs.length - 1; - - pairs.forEach(p => (set(p, 'pairCount', pairCount))); + + pairs.forEach((p) => set(p, "pairCount", pairCount)); pairs.removeObject(pair); - } - } + }, + }, }); diff --git a/assets/javascripts/discourse/components/wizard-mapper-pair.js.es6 b/assets/javascripts/discourse/components/wizard-mapper-pair.js.es6 index b7d88c5e..bc7e9be9 100644 --- a/assets/javascripts/discourse/components/wizard-mapper-pair.js.es6 +++ b/assets/javascripts/discourse/components/wizard-mapper-pair.js.es6 @@ -1,12 +1,16 @@ -import { connectorContent } from '../lib/wizard-mapper'; +import { connectorContent } from "../lib/wizard-mapper"; import { gt, or, alias } from "@ember/object/computed"; -import { computed, observes } from "@ember/object"; +import { computed, observes } from "@ember/object"; import Component from "@ember/component"; export default Component.extend({ - classNameBindings: [':mapper-pair', 'hasConnector::no-connector'], - firstPair: gt('pair.index', 0), - showRemove: alias('firstPair'), - showJoin: computed('pair.pairCount', function() { return this.pair.index < (this.pair.pairCount - 1) }), - connectors: computed(function() { return connectorContent('pair', this.inputType, this.options) }) -}); \ No newline at end of file + classNameBindings: [":mapper-pair", "hasConnector::no-connector"], + firstPair: gt("pair.index", 0), + showRemove: alias("firstPair"), + showJoin: computed("pair.pairCount", function () { + return this.pair.index < this.pair.pairCount - 1; + }), + connectors: computed(function () { + return connectorContent("pair", this.inputType, this.options); + }), +}); diff --git a/assets/javascripts/discourse/components/wizard-mapper-selector-type.js.es6 b/assets/javascripts/discourse/components/wizard-mapper-selector-type.js.es6 index 53baccef..01566fa3 100644 --- a/assets/javascripts/discourse/components/wizard-mapper-selector-type.js.es6 +++ b/assets/javascripts/discourse/components/wizard-mapper-selector-type.js.es6 @@ -1,14 +1,16 @@ -import discourseComputed from 'discourse-common/utils/decorators'; +import discourseComputed from "discourse-common/utils/decorators"; import Component from "@ember/component"; export default Component.extend({ - tagName: 'a', - classNameBindings: ['active'], - - @discourseComputed('item.type', 'activeType') - active(type, activeType) { return type === activeType }, - + tagName: "a", + classNameBindings: ["active"], + + @discourseComputed("item.type", "activeType") + active(type, activeType) { + return type === activeType; + }, + click() { - this.toggle(this.item.type) - } -}) \ No newline at end of file + this.toggle(this.item.type); + }, +}); diff --git a/assets/javascripts/discourse/components/wizard-mapper-selector.js.es6 b/assets/javascripts/discourse/components/wizard-mapper-selector.js.es6 index 5a8c7d63..e70708c9 100644 --- a/assets/javascripts/discourse/components/wizard-mapper-selector.js.es6 +++ b/assets/javascripts/discourse/components/wizard-mapper-selector.js.es6 @@ -1,51 +1,132 @@ import { alias, or, gt } from "@ember/object/computed"; import { computed } from "@ember/object"; -import { default as discourseComputed, observes, on } from "discourse-common/utils/decorators"; -import { getOwner } from 'discourse-common/lib/get-owner'; -import { defaultSelectionType, selectionTypes } from '../lib/wizard-mapper'; -import { snakeCase, generateName, userProperties } from '../lib/wizard'; +import { + default as discourseComputed, + observes, + on, +} from "discourse-common/utils/decorators"; +import { getOwner } from "discourse-common/lib/get-owner"; +import { defaultSelectionType, selectionTypes } from "../lib/wizard-mapper"; +import { snakeCase, generateName, userProperties } from "../lib/wizard"; import Component from "@ember/component"; import { bind, later } from "@ember/runloop"; import I18n from "I18n"; export default Component.extend({ - classNameBindings: [':mapper-selector', 'activeType'], - - showText: computed('activeType', function() { return this.showInput('text') }), - showWizardField: computed('activeType', function() { return this.showInput('wizardField') }), - showWizardAction: computed('activeType', function() { return this.showInput('wizardAction') }), - showUserField: computed('activeType', function() { return this.showInput('userField') }), - showUserFieldOptions: computed('activeType', function() { return this.showInput('userFieldOptions') }), - showCategory: computed('activeType', function() { return this.showInput('category') }), - showTag: computed('activeType', function() { return this.showInput('tag') }), - showGroup: computed('activeType', function() { return this.showInput('group') }), - showUser: computed('activeType', function() { return this.showInput('user') }), - showList: computed('activeType', function() { return this.showInput('list') }), - showCustomField: computed('activeType', function() { return this.showInput('customField') }), - textEnabled: computed('options.textSelection', 'inputType', function() { return this.optionEnabled('textSelection') }), - wizardFieldEnabled: computed('options.wizardFieldSelection', 'inputType', function() { return this.optionEnabled('wizardFieldSelection') }), - wizardActionEnabled: computed('options.wizardActionSelection', 'inputType', function() { return this.optionEnabled('wizardActionSelection') }), - customFieldEnabled: computed('options.customFieldSelection', 'inputType', function() { return this.optionEnabled('customFieldSelection') }), - userFieldEnabled: computed('options.userFieldSelection', 'inputType', function() { return this.optionEnabled('userFieldSelection') }), - userFieldOptionsEnabled: computed('options.userFieldOptionsSelection', 'inputType', function() { return this.optionEnabled('userFieldOptionsSelection') }), - categoryEnabled: computed('options.categorySelection', 'inputType', function() { return this.optionEnabled('categorySelection') }), - tagEnabled: computed('options.tagSelection', 'inputType', function() { return this.optionEnabled('tagSelection') }), - groupEnabled: computed('options.groupSelection', 'inputType', function() { return this.optionEnabled('groupSelection') }), - userEnabled: computed('options.userSelection', 'inputType', function() { return this.optionEnabled('userSelection') }), - listEnabled: computed('options.listSelection', 'inputType', function() { return this.optionEnabled('listSelection') }), - - groups: alias('site.groups'), - categories: alias('site.categories'), - showComboBox: or('showWizardField', 'showWizardAction', 'showUserField', 'showUserFieldOptions', 'showCustomField'), - showMultiSelect: or('showCategory', 'showGroup'), - hasTypes: gt('selectorTypes.length', 1), + classNameBindings: [":mapper-selector", "activeType"], + + showText: computed("activeType", function () { + return this.showInput("text"); + }), + showWizardField: computed("activeType", function () { + return this.showInput("wizardField"); + }), + showWizardAction: computed("activeType", function () { + return this.showInput("wizardAction"); + }), + showUserField: computed("activeType", function () { + return this.showInput("userField"); + }), + showUserFieldOptions: computed("activeType", function () { + return this.showInput("userFieldOptions"); + }), + showCategory: computed("activeType", function () { + return this.showInput("category"); + }), + showTag: computed("activeType", function () { + return this.showInput("tag"); + }), + showGroup: computed("activeType", function () { + return this.showInput("group"); + }), + showUser: computed("activeType", function () { + return this.showInput("user"); + }), + showList: computed("activeType", function () { + return this.showInput("list"); + }), + showCustomField: computed("activeType", function () { + return this.showInput("customField"); + }), + textEnabled: computed("options.textSelection", "inputType", function () { + return this.optionEnabled("textSelection"); + }), + wizardFieldEnabled: computed( + "options.wizardFieldSelection", + "inputType", + function () { + return this.optionEnabled("wizardFieldSelection"); + } + ), + wizardActionEnabled: computed( + "options.wizardActionSelection", + "inputType", + function () { + return this.optionEnabled("wizardActionSelection"); + } + ), + customFieldEnabled: computed( + "options.customFieldSelection", + "inputType", + function () { + return this.optionEnabled("customFieldSelection"); + } + ), + userFieldEnabled: computed( + "options.userFieldSelection", + "inputType", + function () { + return this.optionEnabled("userFieldSelection"); + } + ), + userFieldOptionsEnabled: computed( + "options.userFieldOptionsSelection", + "inputType", + function () { + return this.optionEnabled("userFieldOptionsSelection"); + } + ), + categoryEnabled: computed( + "options.categorySelection", + "inputType", + function () { + return this.optionEnabled("categorySelection"); + } + ), + tagEnabled: computed("options.tagSelection", "inputType", function () { + return this.optionEnabled("tagSelection"); + }), + groupEnabled: computed("options.groupSelection", "inputType", function () { + return this.optionEnabled("groupSelection"); + }), + userEnabled: computed("options.userSelection", "inputType", function () { + return this.optionEnabled("userSelection"); + }), + listEnabled: computed("options.listSelection", "inputType", function () { + return this.optionEnabled("listSelection"); + }), + + groups: alias("site.groups"), + categories: alias("site.categories"), + showComboBox: or( + "showWizardField", + "showWizardAction", + "showUserField", + "showUserFieldOptions", + "showCustomField" + ), + showMultiSelect: or("showCategory", "showGroup"), + hasTypes: gt("selectorTypes.length", 1), showTypes: false, - + didInsertElement() { - if (!this.activeType || (this.activeType && !this[`${this.activeType}Enabled`])) { + if ( + !this.activeType || + (this.activeType && !this[`${this.activeType}Enabled`]) + ) { later(() => this.resetActiveType()); } - + $(document).on("click", bind(this, this.documentClick)); }, @@ -56,42 +137,45 @@ export default Component.extend({ documentClick(e) { if (this._state == "destroying") return; let $target = $(e.target); - - if (!$target.parents('.type-selector').length && this.showTypes) { - this.set('showTypes', false); + + if (!$target.parents(".type-selector").length && this.showTypes) { + this.set("showTypes", false); } }, - + @discourseComputed selectorTypes() { - return selectionTypes.filter(type => (this[`${type}Enabled`])) - .map(type => ({ type, label: this.typeLabel(type) })); + return selectionTypes + .filter((type) => this[`${type}Enabled`]) + .map((type) => ({ type, label: this.typeLabel(type) })); }, - - @discourseComputed('activeType') + + @discourseComputed("activeType") activeTypeLabel(activeType) { return this.typeLabel(activeType); }, - + typeLabel(type) { - return type ? I18n.t(`admin.wizard.selector.label.${snakeCase(type)}`) : null; + return type + ? I18n.t(`admin.wizard.selector.label.${snakeCase(type)}`) + : null; }, - - comboBoxAllowAny: or('showWizardField', 'showWizardAction'), - + + comboBoxAllowAny: or("showWizardField", "showWizardAction"), + @discourseComputed showController() { - return getOwner(this).lookup('controller:admin-wizards-wizard-show'); + return getOwner(this).lookup("controller:admin-wizards-wizard-show"); }, - + @discourseComputed( - 'activeType', - 'showController.wizardFields.[]', - 'showController.wizard.actions.[]', - 'showController.userFields.[]', - 'showController.currentField.id', - 'showController.currentAction.id', - 'showController.customFields' + "activeType", + "showController.wizardFields.[]", + "showController.wizard.actions.[]", + "showController.userFields.[]", + "showController.currentField.id", + "showController.currentAction.id", + "showController.customFields" ) comboBoxContent( activeType, @@ -103,133 +187,144 @@ export default Component.extend({ customFields ) { let content; - - if (activeType === 'wizardField') { + + if (activeType === "wizardField") { content = wizardFields; - - if (this.options.context === 'field') { - content = content.filter(field => field.id !== currentFieldId); + + if (this.options.context === "field") { + content = content.filter((field) => field.id !== currentFieldId); } } - - if (activeType === 'wizardAction') { - content = wizardActions.map(a => ({ + + if (activeType === "wizardAction") { + content = wizardActions.map((a) => ({ id: a.id, label: `${generateName(a.type)} (${a.id})`, - type: a.type + type: a.type, })); - - if (this.options.context === 'action') { - content = content.filter(a => a.id !== currentActionId); + + if (this.options.context === "action") { + content = content.filter((a) => a.id !== currentActionId); } } - - if (activeType === 'userField') { - content = userProperties.map((f) => ({ - id: f, - name: generateName(f) - })).concat((userFields || [])); - - if (this.options.context === 'action' && - this.inputType === 'association' && - this.selectorType === 'key') { - - const excludedFields = ['username','email', 'trust_level']; - content = content.filter(userField => excludedFields.indexOf(userField.id) === -1); + + if (activeType === "userField") { + content = userProperties + .map((f) => ({ + id: f, + name: generateName(f), + })) + .concat(userFields || []); + + if ( + this.options.context === "action" && + this.inputType === "association" && + this.selectorType === "key" + ) { + const excludedFields = ["username", "email", "trust_level"]; + content = content.filter( + (userField) => excludedFields.indexOf(userField.id) === -1 + ); } } - - if (activeType === 'userFieldOptions') { + + if (activeType === "userFieldOptions") { content = userFields; } - - if (activeType === 'customField') { + + if (activeType === "customField") { content = customFields; } - + return content; }, - - @discourseComputed('activeType') + + @discourseComputed("activeType") multiSelectContent(activeType) { return { category: this.categories, group: this.groups, - list: '' + list: "", }[activeType]; }, - - @discourseComputed('activeType', 'inputType') + + @discourseComputed("activeType", "inputType") placeholderKey(activeType, inputType) { - if (activeType === 'text' && this.options[`${this.selectorType}Placeholder`]) { + if ( + activeType === "text" && + this.options[`${this.selectorType}Placeholder`] + ) { return this.options[`${this.selectorType}Placeholder`]; } else { return `admin.wizard.selector.placeholder.${snakeCase(activeType)}`; - } + } }, - - @discourseComputed('activeType') + + @discourseComputed("activeType") multiSelectOptions(activeType) { let result = { - none: this.placeholderKey + none: this.placeholderKey, }; - - if (activeType === 'list') { + + if (activeType === "list") { result.allowAny = true; } - + return result; }, - + optionEnabled(type) { const options = this.options; if (!options) return false; - + const option = options[type]; if (option === true) return true; - if (typeof option !== 'string') return false; - - return option.split(',').filter(option => { + if (typeof option !== "string") return false; + + return option.split(",").filter((option) => { return [this.selectorType, this.inputType].indexOf(option) !== -1; }).length; }, - + showInput(type) { return this.activeType === type && this[`${type}Enabled`]; }, - + changeValue(value) { - this.set('value', value); - this.onUpdate('selector', this.activeType); + this.set("value", value); + this.onUpdate("selector", this.activeType); }, - - @observes('inputType') + + @observes("inputType") resetActiveType() { - this.set('activeType', defaultSelectionType(this.selectorType, this.options)); + this.set( + "activeType", + defaultSelectionType(this.selectorType, this.options) + ); }, - + actions: { toggleType(type) { - this.set('activeType', type); - this.set('showTypes', false); - this.set('value', null); - this.onUpdate('selector'); + this.set("activeType", type); + this.set("showTypes", false); + this.set("value", null); + this.onUpdate("selector"); }, - + toggleTypes() { - this.toggleProperty('showTypes'); + this.toggleProperty("showTypes"); }, - + changeValue(value) { this.changeValue(value); }, - + changeInputValue(event) { this.changeValue(event.target.value); }, - + changeUserValue(previousValue, value) { this.changeValue(value); - } - } -}) \ No newline at end of file + }, + }, +}); diff --git a/assets/javascripts/discourse/components/wizard-mapper.js.es6 b/assets/javascripts/discourse/components/wizard-mapper.js.es6 index 34c4000a..7581adbd 100644 --- a/assets/javascripts/discourse/components/wizard-mapper.js.es6 +++ b/assets/javascripts/discourse/components/wizard-mapper.js.es6 @@ -1,84 +1,90 @@ -import { getOwner } from 'discourse-common/lib/get-owner'; -import { newInput, selectionTypes } from '../lib/wizard-mapper'; -import { default as discourseComputed, observes, on } from 'discourse-common/utils/decorators'; +import { getOwner } from "discourse-common/lib/get-owner"; +import { newInput, selectionTypes } from "../lib/wizard-mapper"; +import { + default as discourseComputed, + observes, + on, +} from "discourse-common/utils/decorators"; import { later } from "@ember/runloop"; import Component from "@ember/component"; import { A } from "@ember/array"; export default Component.extend({ - classNames: 'wizard-mapper', - + classNames: "wizard-mapper", + didReceiveAttrs() { if (this.inputs && this.inputs.constructor !== Array) { - later(() => this.set('inputs', null)); + later(() => this.set("inputs", null)); } }, - - @discourseComputed('inputs.@each.type') + + @discourseComputed("inputs.@each.type") canAdd(inputs) { - return !inputs || - inputs.constructor !== Array || - inputs.every(i => { - return ['assignment','association'].indexOf(i.type) === -1; - }); + return ( + !inputs || + inputs.constructor !== Array || + inputs.every((i) => { + return ["assignment", "association"].indexOf(i.type) === -1; + }) + ); }, - - @discourseComputed('options.@each.inputType') + + @discourseComputed("options.@each.inputType") inputOptions(options) { let result = { - inputTypes: options.inputTypes || 'assignment,conditional', - inputConnector: options.inputConnector || 'or', + inputTypes: options.inputTypes || "assignment,conditional", + inputConnector: options.inputConnector || "or", pairConnector: options.pairConnector || null, outputConnector: options.outputConnector || null, - context: options.context || null - } - - let inputTypes = ['key', 'value', 'output']; - inputTypes.forEach(type => { + context: options.context || null, + }; + + let inputTypes = ["key", "value", "output"]; + inputTypes.forEach((type) => { result[`${type}Placeholder`] = options[`${type}Placeholder`] || null; - result[`${type}DefaultSelection`] = options[`${type}DefaultSelection`] || null; + result[`${type}DefaultSelection`] = + options[`${type}DefaultSelection`] || null; }); - - selectionTypes.forEach(type => { + + selectionTypes.forEach((type) => { if (options[`${type}Selection`] !== undefined) { - result[`${type}Selection`] = options[`${type}Selection`] + result[`${type}Selection`] = options[`${type}Selection`]; } else { - result[`${type}Selection`] = type === 'text' ? true : false; + result[`${type}Selection`] = type === "text" ? true : false; } }); - + return result; }, - - onUpdate() { - }, + + onUpdate() {}, actions: { add() { - if (!this.get('inputs')) { - this.set('inputs', A()); + if (!this.get("inputs")) { + this.set("inputs", A()); } - this.get('inputs').pushObject( + this.get("inputs").pushObject( newInput(this.inputOptions, this.inputs.length) ); - - this.onUpdate(this.property, 'input'); + + this.onUpdate(this.property, "input"); }, remove(input) { const inputs = this.inputs; inputs.removeObject(input); - + if (inputs.length) { - inputs[0].set('connector', null); + inputs[0].set("connector", null); } - - this.onUpdate(this.property, 'input'); + + this.onUpdate(this.property, "input"); }, - + inputUpdated(component, type) { this.onUpdate(this.property, component, type); - } - } + }, + }, }); diff --git a/assets/javascripts/discourse/components/wizard-message.js.es6 b/assets/javascripts/discourse/components/wizard-message.js.es6 index afcde014..b273e78b 100644 --- a/assets/javascripts/discourse/components/wizard-message.js.es6 +++ b/assets/javascripts/discourse/components/wizard-message.js.es6 @@ -1,32 +1,32 @@ -import { default as discourseComputed } from 'discourse-common/utils/decorators'; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import { not, notEmpty } from "@ember/object/computed"; import Component from "@ember/component"; import I18n from "I18n"; const icons = { - error: 'times-circle', - success: 'check-circle', - info: 'info-circle' -} + error: "times-circle", + success: "check-circle", + info: "info-circle", +}; export default Component.extend({ - classNameBindings: [':wizard-message', 'type', 'loading'], - showDocumentation: not('loading'), - showIcon: not('loading'), - hasItems: notEmpty('items'), - - @discourseComputed('type') + classNameBindings: [":wizard-message", "type", "loading"], + showDocumentation: not("loading"), + showIcon: not("loading"), + hasItems: notEmpty("items"), + + @discourseComputed("type") icon(type) { - return icons[type] || 'info-circle'; + return icons[type] || "info-circle"; }, - - @discourseComputed('key', 'component', 'opts') + + @discourseComputed("key", "component", "opts") message(key, component, opts) { return I18n.t(`admin.wizard.message.${component}.${key}`, opts || {}); }, - - @discourseComputed('component') + + @discourseComputed("component") documentation(component) { return I18n.t(`admin.wizard.message.${component}.documentation`); - } -}) \ No newline at end of file + }, +}); diff --git a/assets/javascripts/discourse/components/wizard-realtime-validations.js.es6 b/assets/javascripts/discourse/components/wizard-realtime-validations.js.es6 index c4b35d5c..b9b36e6f 100644 --- a/assets/javascripts/discourse/components/wizard-realtime-validations.js.es6 +++ b/assets/javascripts/discourse/components/wizard-realtime-validations.js.es6 @@ -9,17 +9,12 @@ export default Component.extend({ classNames: ["realtime-validations"], @discourseComputed timeUnits() { - return [ - "days", - "weeks", - "months", - "years" - ].map((unit) => { - return { - id: unit, - name: I18n.t(`admin.wizard.field.validations.time_units.${unit}`) - } - }); + return ["days", "weeks", "months", "years"].map((unit) => { + return { + id: unit, + name: I18n.t(`admin.wizard.field.validations.time_units.${unit}`), + }; + }); }, init() { @@ -28,7 +23,7 @@ export default Component.extend({ if (!this.field.validations) { const validations = {}; - + this.validations.forEach((validation) => { validations[validation] = {}; }); diff --git a/assets/javascripts/discourse/components/wizard-text-editor.js.es6 b/assets/javascripts/discourse/components/wizard-text-editor.js.es6 index eef26d9c..2866537d 100644 --- a/assets/javascripts/discourse/components/wizard-text-editor.js.es6 +++ b/assets/javascripts/discourse/components/wizard-text-editor.js.es6 @@ -1,71 +1,75 @@ -import { default as discourseComputed, on } from 'discourse-common/utils/decorators'; +import { + default as discourseComputed, + on, +} from "discourse-common/utils/decorators"; import { notEmpty } from "@ember/object/computed"; -import { userProperties } from '../lib/wizard'; +import { userProperties } from "../lib/wizard"; import { scheduleOnce } from "@ember/runloop"; import Component from "@ember/component"; import I18n from "I18n"; const excludedUserProperties = [ - 'avatar', - 'profile_background', - 'card_background' + "avatar", + "profile_background", + "card_background", ]; export default Component.extend({ - classNames: 'wizard-text-editor', + classNames: "wizard-text-editor", barEnabled: true, previewEnabled: true, fieldsEnabled: true, - hasWizardFields: notEmpty('wizardFieldList'), - hasWizardActions: notEmpty('wizardActionList'), - + hasWizardFields: notEmpty("wizardFieldList"), + hasWizardActions: notEmpty("wizardActionList"), + didReceiveAttrs() { this._super(...arguments); - + if (!this.barEnabled) { - scheduleOnce('afterRender', () => { - $(this.element).find('.d-editor-button-bar').addClass('hidden'); + scheduleOnce("afterRender", () => { + $(this.element).find(".d-editor-button-bar").addClass("hidden"); }); } }, - - @discourseComputed('forcePreview') + + @discourseComputed("forcePreview") previewLabel(forcePreview) { return I18n.t("admin.wizard.editor.preview", { - action: I18n.t(`admin.wizard.editor.${forcePreview ? 'hide' : 'show'}`) + action: I18n.t(`admin.wizard.editor.${forcePreview ? "hide" : "show"}`), }); }, - - @discourseComputed('showPopover') + + @discourseComputed("showPopover") popoverLabel(showPopover) { return I18n.t("admin.wizard.editor.popover", { - action: I18n.t(`admin.wizard.editor.${showPopover ? 'hide' : 'show'}`) + action: I18n.t(`admin.wizard.editor.${showPopover ? "hide" : "show"}`), }); }, - + @discourseComputed() userPropertyList() { - return userProperties.filter((f) => !excludedUserProperties.includes(f)) + return userProperties + .filter((f) => !excludedUserProperties.includes(f)) .map((f) => ` u{${f}}`); }, - - @discourseComputed('wizardFields') + + @discourseComputed("wizardFields") wizardFieldList(wizardFields) { return wizardFields.map((f) => ` w{${f.id}}`); }, - - @discourseComputed('wizardActions') + + @discourseComputed("wizardActions") wizardActionList(wizardActions) { return wizardActions.map((a) => ` w{${a.id}}`); }, - + actions: { togglePreview() { - this.toggleProperty('forcePreview'); + this.toggleProperty("forcePreview"); }, - + togglePopover() { - this.toggleProperty('showPopover'); - } - } -}); \ No newline at end of file + this.toggleProperty("showPopover"); + }, + }, +}); diff --git a/assets/javascripts/discourse/components/wizard-value-list.js.es6 b/assets/javascripts/discourse/components/wizard-value-list.js.es6 index acd54685..ccc54794 100644 --- a/assets/javascripts/discourse/components/wizard-value-list.js.es6 +++ b/assets/javascripts/discourse/components/wizard-value-list.js.es6 @@ -1,4 +1,4 @@ -import ValueList from 'admin/components/value-list'; +import ValueList from "admin/components/value-list"; export default ValueList.extend({ _saveValues() { @@ -8,5 +8,5 @@ export default ValueList.extend({ } this.onChange(this.collection.join(this.inputDelimiter || "\n")); - } -}) \ No newline at end of file + }, +}); diff --git a/assets/javascripts/discourse/connectors/top-notices/prompt-completion.js.es6 b/assets/javascripts/discourse/connectors/top-notices/prompt-completion.js.es6 index 8d097475..ea82a56a 100644 --- a/assets/javascripts/discourse/connectors/top-notices/prompt-completion.js.es6 +++ b/assets/javascripts/discourse/connectors/top-notices/prompt-completion.js.es6 @@ -1,6 +1,7 @@ export default { shouldRender(_, ctx) { - return ctx.siteSettings.custom_wizard_enabled && - ctx.site.complete_custom_wizard; - } -} \ No newline at end of file + return ( + ctx.siteSettings.custom_wizard_enabled && ctx.site.complete_custom_wizard + ); + }, +}; diff --git a/assets/javascripts/discourse/controllers/admin-wizards-api-show.js.es6 b/assets/javascripts/discourse/controllers/admin-wizards-api-show.js.es6 index da6822a3..f330c00c 100644 --- a/assets/javascripts/discourse/controllers/admin-wizards-api-show.js.es6 +++ b/assets/javascripts/discourse/controllers/admin-wizards-api-show.js.es6 @@ -1,93 +1,139 @@ -import { ajax } from 'discourse/lib/ajax'; -import { popupAjaxError } from 'discourse/lib/ajax-error'; -import CustomWizardApi from '../models/custom-wizard-api'; -import { default as discourseComputed } from 'discourse-common/utils/decorators'; +import { ajax } from "discourse/lib/ajax"; +import { popupAjaxError } from "discourse/lib/ajax-error"; +import CustomWizardApi from "../models/custom-wizard-api"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import { not, and, equal } from "@ember/object/computed"; -import { selectKitContent } from '../lib/wizard'; +import { selectKitContent } from "../lib/wizard"; import Controller from "@ember/controller"; import I18n from "I18n"; export default Controller.extend({ - queryParams: ['refresh_list'], + queryParams: ["refresh_list"], loadingSubscriptions: false, - notAuthorized: not('api.authorized'), - endpointMethods: selectKitContent(['GET', 'PUT', 'POST', 'PATCH', 'DELETE']), - showRemove: not('isNew'), - showRedirectUri: and('threeLeggedOauth', 'api.name'), + notAuthorized: not("api.authorized"), + endpointMethods: selectKitContent(["GET", "PUT", "POST", "PATCH", "DELETE"]), + showRemove: not("isNew"), + showRedirectUri: and("threeLeggedOauth", "api.name"), responseIcon: null, - contentTypes: selectKitContent(['application/json', 'application/x-www-form-urlencoded']), - successCodes: selectKitContent([100, 101, 102, 200, 201, 202, 203, 204, 205, 206, 207, 208, 226, 300, 301, 302, 303, 303, 304, 305, 306, 307, 308]), + contentTypes: selectKitContent([ + "application/json", + "application/x-www-form-urlencoded", + ]), + successCodes: selectKitContent([ + 100, + 101, + 102, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 226, + 300, + 301, + 302, + 303, + 303, + 304, + 305, + 306, + 307, + 308, + ]), - @discourseComputed('saveDisabled', 'api.authType', 'api.authUrl', 'api.tokenUrl', 'api.clientId', 'api.clientSecret', 'threeLeggedOauth') - authDisabled(saveDisabled, authType, authUrl, tokenUrl, clientId, clientSecret, threeLeggedOauth) { - if (saveDisabled || !authType || !tokenUrl || !clientId || !clientSecret) return true; + @discourseComputed( + "saveDisabled", + "api.authType", + "api.authUrl", + "api.tokenUrl", + "api.clientId", + "api.clientSecret", + "threeLeggedOauth" + ) + authDisabled( + saveDisabled, + authType, + authUrl, + tokenUrl, + clientId, + clientSecret, + threeLeggedOauth + ) { + if (saveDisabled || !authType || !tokenUrl || !clientId || !clientSecret) + return true; if (threeLeggedOauth) return !authUrl; return false; }, - @discourseComputed('api.name', 'api.authType') + @discourseComputed("api.name", "api.authType") saveDisabled(name, authType) { return !name || !authType; }, - authorizationTypes: selectKitContent(['none', 'basic', 'oauth_2', 'oauth_3']), - isBasicAuth: equal('api.authType', 'basic'), + authorizationTypes: selectKitContent(["none", "basic", "oauth_2", "oauth_3"]), + isBasicAuth: equal("api.authType", "basic"), - @discourseComputed('api.authType') + @discourseComputed("api.authType") isOauth(authType) { - return authType && authType.indexOf('oauth') > -1; + return authType && authType.indexOf("oauth") > -1; }, - twoLeggedOauth: equal('api.authType', 'oauth_2'), - threeLeggedOauth: equal('api.authType', 'oauth_3'), + twoLeggedOauth: equal("api.authType", "oauth_2"), + threeLeggedOauth: equal("api.authType", "oauth_3"), actions: { addParam() { - this.get('api.authParams').pushObject({}); + this.get("api.authParams").pushObject({}); }, removeParam(param) { - this.get('api.authParams').removeObject(param); + this.get("api.authParams").removeObject(param); }, addEndpoint() { - this.get('api.endpoints').pushObject({}); + this.get("api.endpoints").pushObject({}); }, removeEndpoint(endpoint) { - this.get('api.endpoints').removeObject(endpoint); + this.get("api.endpoints").removeObject(endpoint); }, authorize() { - const api = this.get('api'); + const api = this.get("api"); const { name, authType, authUrl, authParams } = api; - this.set('authErrorMessage', ''); + this.set("authErrorMessage", ""); - if (authType === 'oauth_2') { - this.set('authorizing', true); - ajax(`/admin/wizards/apis/${name.underscore()}/authorize`).catch(popupAjaxError) - .then(result => { + if (authType === "oauth_2") { + this.set("authorizing", true); + ajax(`/admin/wizards/apis/${name.underscore()}/authorize`) + .catch(popupAjaxError) + .then((result) => { if (result.success) { - this.set('api', CustomWizardApi.create(result.api)); + this.set("api", CustomWizardApi.create(result.api)); } else if (result.failed && result.message) { - this.set('authErrorMessage', result.message); + this.set("authErrorMessage", result.message); } else { - this.set('authErrorMessage', 'Authorization Failed'); + this.set("authErrorMessage", "Authorization Failed"); } setTimeout(() => { - this.set('authErrorMessage', ''); + this.set("authErrorMessage", ""); }, 6000); - }).finally(() => this.set('authorizing', false)); - } else if (authType === 'oauth_3') { - let query = '?'; + }) + .finally(() => this.set("authorizing", false)); + } else if (authType === "oauth_3") { + let query = "?"; query += `client_id=${api.clientId}`; query += `&redirect_uri=${encodeURIComponent(api.redirectUri)}`; query += `&response_type=code`; if (authParams) { - authParams.forEach(p => { + authParams.forEach((p) => { query += `&${p.key}=${encodeURIComponent(p.value)}`; }); } @@ -97,7 +143,7 @@ export default Controller.extend({ }, save() { - const api = this.get('api'); + const api = this.get("api"); const name = api.name; const authType = api.authType; let refreshList = false; @@ -106,35 +152,37 @@ export default Controller.extend({ if (!name || !authType) return; let data = { - auth_type: authType + auth_type: authType, }; - if (api.title) data['title'] = api.title; + if (api.title) data["title"] = api.title; - const originalTitle = this.get('api.originalTitle'); - if (api.get('isNew') || (originalTitle && (api.title !== originalTitle))) { + const originalTitle = this.get("api.originalTitle"); + if (api.get("isNew") || (originalTitle && api.title !== originalTitle)) { refreshList = true; } - if (api.get('isNew')) { - data['new'] = true; - }; + if (api.get("isNew")) { + data["new"] = true; + } let requiredParams; - if (authType === 'basic') { - requiredParams = ['username', 'password']; - } else if (authType === 'oauth_2') { - requiredParams = ['tokenUrl', 'clientId', 'clientSecret']; - } else if (authType === 'oauth_3') { - requiredParams = ['authUrl', 'tokenUrl', 'clientId', 'clientSecret']; + if (authType === "basic") { + requiredParams = ["username", "password"]; + } else if (authType === "oauth_2") { + requiredParams = ["tokenUrl", "clientId", "clientSecret"]; + } else if (authType === "oauth_3") { + requiredParams = ["authUrl", "tokenUrl", "clientId", "clientSecret"]; } if (requiredParams) { for (let rp of requiredParams) { if (!api[rp]) { - let key = rp.replace('auth', ''); - error = `${I18n.t(`admin.wizard.api.auth.${key.underscore()}`)} is required for ${authType}`; + let key = rp.replace("auth", ""); + error = `${I18n.t( + `admin.wizard.api.auth.${key.underscore()}` + )} is required for ${authType}`; break; } data[rp.underscore()] = api[rp]; @@ -143,73 +191,79 @@ export default Controller.extend({ const params = api.authParams; if (params.length) { - data['auth_params'] = JSON.stringify(params); + data["auth_params"] = JSON.stringify(params); } const endpoints = api.endpoints; if (endpoints.length) { for (let e of endpoints) { if (!e.name) { - error = 'Every endpoint must have a name'; + error = "Every endpoint must have a name"; break; } } - data['endpoints'] = JSON.stringify(endpoints); + data["endpoints"] = JSON.stringify(endpoints); } if (error) { - this.set('error', error); + this.set("error", error); setTimeout(() => { - this.set('error', ''); + this.set("error", ""); }, 6000); return; } - this.set('updating', true); + this.set("updating", true); ajax(`/admin/wizards/api/${name.underscore()}`, { - type: 'PUT', - data - }).catch(popupAjaxError) - .then(result => { + type: "PUT", + data, + }) + .catch(popupAjaxError) + .then((result) => { if (result.success) { - this.send('afterSave', result.api.name); + this.send("afterSave", result.api.name); } else { - this.set('responseIcon', 'times'); + this.set("responseIcon", "times"); } - }).finally(() => this.set('updating', false)); + }) + .finally(() => this.set("updating", false)); }, remove() { - const name = this.get('api.name'); + const name = this.get("api.name"); if (!name) return; - this.set('updating', true); + this.set("updating", true); ajax(`/admin/wizards/api/${name.underscore()}`, { - type: 'DELETE' - }).catch(popupAjaxError) - .then(result => { + type: "DELETE", + }) + .catch(popupAjaxError) + .then((result) => { if (result.success) { - this.send('afterDestroy'); + this.send("afterDestroy"); } - }).finally(() => this.set('updating', false)); + }) + .finally(() => this.set("updating", false)); }, clearLogs() { - const name = this.get('api.name'); + const name = this.get("api.name"); if (!name) return; ajax(`/admin/wizards/api/${name.underscore()}/logs`, { - type: 'DELETE' - }).catch(popupAjaxError) - .then(result => { + type: "DELETE", + }) + .catch(popupAjaxError) + .then((result) => { if (result.success) { - this.transitionToRoute('adminWizardsApis').then(() => { - this.send('refreshModel'); + this.transitionToRoute("adminWizardsApis").then(() => { + this.send("refreshModel"); }); } - }).finally(() => this.set('updating', false)); - } - } + }) + .finally(() => this.set("updating", false)); + }, + }, }); diff --git a/assets/javascripts/discourse/controllers/admin-wizards-custom-fields.js.es6 b/assets/javascripts/discourse/controllers/admin-wizards-custom-fields.js.es6 index 55b7a602..c1254d3b 100644 --- a/assets/javascripts/discourse/controllers/admin-wizards-custom-fields.js.es6 +++ b/assets/javascripts/discourse/controllers/admin-wizards-custom-fields.js.es6 @@ -1,55 +1,57 @@ import Controller from "@ember/controller"; -import EmberObject from '@ember/object'; -import { ajax } from 'discourse/lib/ajax'; -import { popupAjaxError } from 'discourse/lib/ajax-error'; +import EmberObject from "@ember/object"; +import { ajax } from "discourse/lib/ajax"; +import { popupAjaxError } from "discourse/lib/ajax-error"; import CustomWizardCustomField from "../models/custom-wizard-custom-field"; -import { default as discourseComputed } from 'discourse-common/utils/decorators'; +import { default as discourseComputed } from "discourse-common/utils/decorators"; export default Controller.extend({ - messageKey: 'create', - fieldKeys: ['klass', 'type', 'serializers', 'name'], + messageKey: "create", + fieldKeys: ["klass", "type", "serializers", "name"], documentationUrl: "https://thepavilion.io/t/3572", - + actions: { addField() { - this.get('customFields').pushObject( + this.get("customFields").pushObject( CustomWizardCustomField.create({ edit: true }) ); }, - + saveField(field) { - return CustomWizardCustomField.saveField(field) - .then(result => { - if (result.success) { + return CustomWizardCustomField.saveField(field).then((result) => { + if (result.success) { + this.setProperties({ + messageKey: "saved", + messageType: "success", + }); + } else { + if (result.messages) { this.setProperties({ - messageKey: 'saved', - messageType: 'success' + messageKey: "error", + messageType: "error", + messageOpts: { messages: result.messages }, }); - } else { - if (result.messages) { - this.setProperties({ - messageKey: 'error', - messageType: 'error', - messageOpts: { messages: result.messages } - }) - } } - - setTimeout(() => this.setProperties({ - messageKey: 'create', - messageType: null, - messageOpts: null - }), 10000); - - return result; - }); + } + + setTimeout( + () => + this.setProperties({ + messageKey: "create", + messageType: null, + messageOpts: null, + }), + 10000 + ); + + return result; + }); }, - + removeField(field) { - return CustomWizardCustomField.destroyField(field) - .then(result => { - this.get('customFields').removeObject(field); - }); - } - } -}); \ No newline at end of file + return CustomWizardCustomField.destroyField(field).then((result) => { + this.get("customFields").removeObject(field); + }); + }, + }, +}); diff --git a/assets/javascripts/discourse/controllers/admin-wizards-logs.js.es6 b/assets/javascripts/discourse/controllers/admin-wizards-logs.js.es6 index 71ced3a5..5a03f064 100644 --- a/assets/javascripts/discourse/controllers/admin-wizards-logs.js.es6 +++ b/assets/javascripts/discourse/controllers/admin-wizards-logs.js.es6 @@ -1,8 +1,8 @@ -import { default as computed } from 'discourse-common/utils/decorators'; -import { popupAjaxError } from 'discourse/lib/ajax-error'; -import { ajax } from 'discourse/lib/ajax'; +import { default as computed } from "discourse-common/utils/decorators"; +import { popupAjaxError } from "discourse/lib/ajax-error"; +import { ajax } from "discourse/lib/ajax"; import { notEmpty } from "@ember/object/computed"; -import CustomWizardLogs from '../models/custom-wizard-logs'; +import CustomWizardLogs from "../models/custom-wizard-logs"; import Controller from "@ember/controller"; export default Controller.extend({ @@ -11,40 +11,40 @@ export default Controller.extend({ page: 0, canLoadMore: true, logs: [], - + loadLogs() { if (!this.canLoadMore) return; this.set("refreshing", true); - + CustomWizardLogs.list() - .then(result => { + .then((result) => { if (!result || result.length === 0) { - this.set('canLoadMore', false); + this.set("canLoadMore", false); } this.set("logs", this.logs.concat(result)); }) .finally(() => this.set("refreshing", false)); }, - - @computed('hasLogs', 'refreshing') + + @computed("hasLogs", "refreshing") noResults(hasLogs, refreshing) { return !hasLogs && !refreshing; }, - + actions: { loadMore() { - this.set('page', this.page += 1); + this.set("page", (this.page += 1)); this.loadLogs(); }, - + refresh() { this.setProperties({ canLoadMore: true, page: 0, - logs: [] - }) + logs: [], + }); this.loadLogs(); - } - } -}); \ No newline at end of file + }, + }, +}); diff --git a/assets/javascripts/discourse/controllers/admin-wizards-manager.js.es6 b/assets/javascripts/discourse/controllers/admin-wizards-manager.js.es6 index 56aa4446..840d68b1 100644 --- a/assets/javascripts/discourse/controllers/admin-wizards-manager.js.es6 +++ b/assets/javascripts/discourse/controllers/admin-wizards-manager.js.es6 @@ -1,76 +1,80 @@ import Controller from "@ember/controller"; import { default as discourseComputed, - observes -} from 'discourse-common/utils/decorators'; + observes, +} from "discourse-common/utils/decorators"; import { empty } from "@ember/object/computed"; -import CustomWizardManager from '../models/custom-wizard-manager'; +import CustomWizardManager from "../models/custom-wizard-manager"; import { A } from "@ember/array"; import I18n from "I18n"; import { underscore } from "@ember/string"; export default Controller.extend({ - messageUrl: 'https://thepavilion.io/t/3652', - messageKey: 'info', - messageIcon: 'info-circle', - messageClass: 'info', - importDisabled: empty('file'), + messageUrl: "https://thepavilion.io/t/3652", + messageKey: "info", + messageIcon: "info-circle", + messageClass: "info", + importDisabled: empty("file"), exportWizards: A(), destroyWizards: A(), - exportDisabled: empty('exportWizards'), - destoryDisabled: empty('destroyWizards'), + exportDisabled: empty("exportWizards"), + destoryDisabled: empty("destroyWizards"), - setMessage(type, key, opts={}, items=[]) { + setMessage(type, key, opts = {}, items = []) { this.setProperties({ messageKey: key, messageOpts: opts, messageType: type, - messageItems: items + messageItems: items, }); setTimeout(() => { this.setProperties({ - messageKey: 'info', + messageKey: "info", messageOpts: null, messageType: null, - messageItems: null - }) + messageItems: null, + }); }, 10000); }, - + buildWizardLink(wizard) { let html = `${wizard.name}`; - html += `${I18n.t('admin.wizard.manager.imported')}`; + html += `${I18n.t( + "admin.wizard.manager.imported" + )}`; return { - icon: 'check-circle', - html + icon: "check-circle", + html, }; }, - + buildDestroyedItem(destroyed) { let html = `${destroyed.name}`; - html += `${I18n.t('admin.wizard.manager.destroyed')}`; + html += `${I18n.t( + "admin.wizard.manager.destroyed" + )}`; return { - icon: 'check-circle', - html + icon: "check-circle", + html, }; }, - + buildFailureItem(failure) { return { - icon: 'times-circle', - html: `${failure.id}: ${failure.messages}` + icon: "times-circle", + html: `${failure.id}: ${failure.messages}`, }; }, - + clearFile() { this.setProperties({ file: null, - filename: null + filename: null, }); - $('#file-upload').val(''); + $("#file-upload").val(""); }, - - @observes('importing', 'destroying') + + @observes("importing", "destroying") setLoadingMessages() { if (this.importing) { this.setMessage("loading", "importing"); @@ -82,47 +86,49 @@ export default Controller.extend({ actions: { upload() { - $('#file-upload').click(); + $("#file-upload").click(); }, - + clearFile() { this.clearFile(); }, - + setFile(event) { let maxFileSize = 512 * 1024; const file = event.target.files[0]; if (file === undefined) { - this.set('file', null); + this.set("file", null); return; } - + if (maxFileSize < file.size) { this.setMessage("error", "file_size_error"); this.set("file", null); - $('#file-upload').val(''); + $("#file-upload").val(""); } else { this.setProperties({ file, - filename: file.name + filename: file.name, }); } }, - + selectWizard(event) { - const type = event.target.classList.contains('export') ? 'export' : 'destroy'; + const type = event.target.classList.contains("export") + ? "export" + : "destroy"; const wizards = this.get(`${type}Wizards`); const checked = event.target.checked; - - let wizardId = event.target.closest('tr').getAttribute('data-wizard-id'); - + + let wizardId = event.target.closest("tr").getAttribute("data-wizard-id"); + if (wizardId) { wizardId = underscore(wizardId); } else { return false; } - + if (checked) { wizards.addObject(wizardId); } else { @@ -131,99 +137,113 @@ export default Controller.extend({ }, import() { - const file = this.get('file'); - + const file = this.get("file"); + if (!file) { - this.setMessage("error", 'no_file'); + this.setMessage("error", "no_file"); return; } - + let $formData = new FormData(); - $formData.append('file', file); - - this.set('importing', true); + $formData.append("file", file); + + this.set("importing", true); this.setMessage("loading", "importing"); - - CustomWizardManager.import($formData).then(result => { - if (result.error) { - this.setMessage("error", "server_error", { - message: result.error - }); - } else { - this.setMessage("success", "import_complete", {}, - result.imported.map(imported => { - return this.buildWizardLink(imported); - }).concat( - result.failures.map(failure => { - return this.buildFailureItem(failure); - }) - ) - ); - - if (result.imported.length) { - this.get('wizards').addObjects(result.imported); + + CustomWizardManager.import($formData) + .then((result) => { + if (result.error) { + this.setMessage("error", "server_error", { + message: result.error, + }); + } else { + this.setMessage( + "success", + "import_complete", + {}, + result.imported + .map((imported) => { + return this.buildWizardLink(imported); + }) + .concat( + result.failures.map((failure) => { + return this.buildFailureItem(failure); + }) + ) + ); + + if (result.imported.length) { + this.get("wizards").addObjects(result.imported); + } } - } - this.clearFile(); - }).finally(() => { - this.set('importing', false); - }); + this.clearFile(); + }) + .finally(() => { + this.set("importing", false); + }); }, export() { - const exportWizards = this.get('exportWizards'); + const exportWizards = this.get("exportWizards"); if (!exportWizards.length) { - this.setMessage("error", 'none_selected'); + this.setMessage("error", "none_selected"); } else { CustomWizardManager.export(exportWizards); exportWizards.clear(); - $('input.export').prop("checked", false); + $("input.export").prop("checked", false); } }, - + destroy() { - const destroyWizards = this.get('destroyWizards'); + const destroyWizards = this.get("destroyWizards"); if (!destroyWizards.length) { - this.setMessage("error", 'none_selected'); + this.setMessage("error", "none_selected"); } else { - this.set('destroying', true); - - CustomWizardManager.destroy(destroyWizards).then((result) => { - if (result.error) { - this.setMessage("error", "server_error", { - message: result.error - }); - } else { - this.setMessage("success", "destroy_complete", {}, - result.destroyed.map(destroyed => { - return this.buildDestroyedItem(destroyed); - }).concat( - result.failures.map(failure => { - return this.buildFailureItem(failure); - }) - ) - ); - - if (result.destroyed.length) { - const destroyedIds = result.destroyed.map(d => d.id); - const destroyWizards = this.get('destroyWizards'); - const wizards = this.get('wizards'); - - wizards.removeObjects( - wizards.filter(w => { - return destroyedIds.includes(w.id); - }) + this.set("destroying", true); + + CustomWizardManager.destroy(destroyWizards) + .then((result) => { + if (result.error) { + this.setMessage("error", "server_error", { + message: result.error, + }); + } else { + this.setMessage( + "success", + "destroy_complete", + {}, + result.destroyed + .map((destroyed) => { + return this.buildDestroyedItem(destroyed); + }) + .concat( + result.failures.map((failure) => { + return this.buildFailureItem(failure); + }) + ) ); - - destroyWizards.removeObjects(destroyedIds); + + if (result.destroyed.length) { + const destroyedIds = result.destroyed.map((d) => d.id); + const destroyWizards = this.get("destroyWizards"); + const wizards = this.get("wizards"); + + wizards.removeObjects( + wizards.filter((w) => { + return destroyedIds.includes(w.id); + }) + ); + + destroyWizards.removeObjects(destroyedIds); + } } - } - }).finally(() => { - this.set('destroying', false); - }); + }) + .finally(() => { + this.set("destroying", false); + }); } - } - } + }, + }, }); diff --git a/assets/javascripts/discourse/controllers/admin-wizards-submissions-show.js.es6 b/assets/javascripts/discourse/controllers/admin-wizards-submissions-show.js.es6 index 57b0ab57..f5f9926d 100644 --- a/assets/javascripts/discourse/controllers/admin-wizards-submissions-show.js.es6 +++ b/assets/javascripts/discourse/controllers/admin-wizards-submissions-show.js.es6 @@ -2,5 +2,5 @@ import Controller from "@ember/controller"; import { fmt } from "discourse/lib/computed"; export default Controller.extend({ - downloadUrl: fmt("wizard.id", "/admin/wizards/submissions/%@/download") -}); \ No newline at end of file + downloadUrl: fmt("wizard.id", "/admin/wizards/submissions/%@/download"), +}); diff --git a/assets/javascripts/discourse/controllers/admin-wizards-wizard-show.js.es6 b/assets/javascripts/discourse/controllers/admin-wizards-wizard-show.js.es6 index fd8470e4..68dee12e 100644 --- a/assets/javascripts/discourse/controllers/admin-wizards-wizard-show.js.es6 +++ b/assets/javascripts/discourse/controllers/admin-wizards-wizard-show.js.es6 @@ -1,123 +1,139 @@ -import { default as discourseComputed, observes, on } from 'discourse-common/utils/decorators'; +import { + default as discourseComputed, + observes, + on, +} from "discourse-common/utils/decorators"; import { notEmpty, alias } from "@ember/object/computed"; -import showModal from 'discourse/lib/show-modal'; -import { generateId, wizardFieldList } from '../lib/wizard'; -import { buildProperties } from '../lib/wizard-json'; +import showModal from "discourse/lib/show-modal"; +import { generateId, wizardFieldList } from "../lib/wizard"; +import { buildProperties } from "../lib/wizard-json"; import { dasherize } from "@ember/string"; import EmberObject from "@ember/object"; import { scheduleOnce, later } from "@ember/runloop"; import Controller from "@ember/controller"; import copyText from "discourse/lib/copy-text"; -import CustomWizard from '../models/custom-wizard'; +import CustomWizard from "../models/custom-wizard"; import I18n from "I18n"; export default Controller.extend({ - hasName: notEmpty('wizard.name'), - - @observes('currentStep') + hasName: notEmpty("wizard.name"), + + @observes("currentStep") resetCurrentObjects() { const currentStep = this.currentStep; - + if (currentStep) { const fields = currentStep.fields; - this.set('currentField', fields && fields.length ? fields[0] : null) + this.set("currentField", fields && fields.length ? fields[0] : null); } - - scheduleOnce('afterRender', () => ($("body").addClass('admin-wizard'))); - }, - - @observes('wizard.name') - setId() { - const wizard = this.wizard; - if (wizard && !wizard.existingId) { - this.set('wizard.id', generateId(wizard.name)); - } - }, - - @discourseComputed('wizard.id') - wizardUrl(wizardId) { - return window.location.origin + '/w/' + dasherize(wizardId); + + scheduleOnce("afterRender", () => $("body").addClass("admin-wizard")); }, - @discourseComputed('wizard.after_time_scheduled') - nextSessionScheduledLabel(scheduled) { - return scheduled ? - moment(scheduled).format('MMMM Do, HH:mm') : - I18n.t('admin.wizard.after_time_time_label'); + @observes("wizard.name") + setId() { + const wizard = this.wizard; + if (wizard && !wizard.existingId) { + this.set("wizard.id", generateId(wizard.name)); + } }, - - @discourseComputed('currentStep.id', 'wizard.save_submissions', 'currentStep.fields.@each.label') + + @discourseComputed("wizard.id") + wizardUrl(wizardId) { + return window.location.origin + "/w/" + dasherize(wizardId); + }, + + @discourseComputed("wizard.after_time_scheduled") + nextSessionScheduledLabel(scheduled) { + return scheduled + ? moment(scheduled).format("MMMM Do, HH:mm") + : I18n.t("admin.wizard.after_time_time_label"); + }, + + @discourseComputed( + "currentStep.id", + "wizard.save_submissions", + "currentStep.fields.@each.label" + ) wizardFields(currentStepId, saveSubmissions) { let steps = this.wizard.steps; if (!saveSubmissions) { - steps = [steps.findBy('id', currentStepId)]; + steps = [steps.findBy("id", currentStepId)]; } return wizardFieldList(steps); }, - actions: { + actions: { save() { this.setProperties({ saving: true, - error: null + error: null, }); - + const wizard = this.wizard; const creating = this.creating; let opts = {}; - + if (creating) { opts.create = true; } - - wizard.save(opts).then((result) => { - this.send('afterSave', result.wizard_id); - }).catch((result) => { - let errorType = 'failed'; - let errorParams = {}; - - if (result.error) { - errorType = result.error.type; - errorParams = result.error.params; - } - - this.set('error', I18n.t(`admin.wizard.error.${errorType}`, errorParams)); - - later(() => this.set('error', null), 10000); - }).finally(() => this.set('saving', false)); + + wizard + .save(opts) + .then((result) => { + this.send("afterSave", result.wizard_id); + }) + .catch((result) => { + let errorType = "failed"; + let errorParams = {}; + + if (result.error) { + errorType = result.error.type; + errorParams = result.error.params; + } + + this.set( + "error", + I18n.t(`admin.wizard.error.${errorType}`, errorParams) + ); + + later(() => this.set("error", null), 10000); + }) + .finally(() => this.set("saving", false)); }, remove() { - this.wizard.remove().then(() => this.send('afterDestroy')); + this.wizard.remove().then(() => this.send("afterDestroy")); }, setNextSessionScheduled() { - let controller = showModal('next-session-scheduled', { + let controller = showModal("next-session-scheduled", { model: { dateTime: this.wizard.after_time_scheduled, - update: (dateTime) => this.set('wizard.after_time_scheduled', dateTime) - } + update: (dateTime) => + this.set("wizard.after_time_scheduled", dateTime), + }, }); controller.setup(); }, - + toggleAdvanced() { - this.toggleProperty('wizard.showAdvanced'); + this.toggleProperty("wizard.showAdvanced"); }, - + copyUrl() { const $copyRange = $('
'); $copyRange.html(this.wizardUrl); - + $(document.body).append($copyRange); - + if (copyText(this.wizardUrl, $copyRange[0])) { this.set("copiedUrl", true); later(() => this.set("copiedUrl", false), 2000); } - + $copyRange.remove(); - } - } + }, + }, }); diff --git a/assets/javascripts/discourse/controllers/admin-wizards-wizard.js.es6 b/assets/javascripts/discourse/controllers/admin-wizards-wizard.js.es6 index 76cae945..ddd63337 100644 --- a/assets/javascripts/discourse/controllers/admin-wizards-wizard.js.es6 +++ b/assets/javascripts/discourse/controllers/admin-wizards-wizard.js.es6 @@ -1,25 +1,25 @@ import Controller from "@ember/controller"; -import { default as discourseComputed } from 'discourse-common/utils/decorators'; -import { equal } from '@ember/object/computed'; +import { default as discourseComputed } from "discourse-common/utils/decorators"; +import { equal } from "@ember/object/computed"; export default Controller.extend({ - creating: equal('wizardId', 'create'), - - @discourseComputed('creating', 'wizardId') + creating: equal("wizardId", "create"), + + @discourseComputed("creating", "wizardId") wizardListVal(creating, wizardId) { return creating ? null : wizardId; }, - - @discourseComputed('creating', 'wizardId') + + @discourseComputed("creating", "wizardId") messageKey(creating, wizardId) { - let key = 'select'; + let key = "select"; if (creating) { - key = 'create'; + key = "create"; } else if (wizardId) { - key = 'edit'; + key = "edit"; } - return key; + return key; }, - - messageUrl: "https://thepavilion.io/c/knowledge/discourse/custom-wizard" -}); \ No newline at end of file + + messageUrl: "https://thepavilion.io/c/knowledge/discourse/custom-wizard", +}); diff --git a/assets/javascripts/discourse/controllers/next-session-scheduled.js.es6 b/assets/javascripts/discourse/controllers/next-session-scheduled.js.es6 index 4cfd4883..4ea22d38 100644 --- a/assets/javascripts/discourse/controllers/next-session-scheduled.js.es6 +++ b/assets/javascripts/discourse/controllers/next-session-scheduled.js.es6 @@ -1,27 +1,27 @@ -import { default as discourseComputed } from 'discourse-common/utils/decorators'; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import Controller from "@ember/controller"; export default Controller.extend({ - title: 'admin.wizard.after_time_modal.title', + title: "admin.wizard.after_time_modal.title", setup() { - this.set('bufferedDateTime', moment(this.model.dateTime)); + this.set("bufferedDateTime", moment(this.model.dateTime)); }, - @discourseComputed('bufferedDateTime') + @discourseComputed("bufferedDateTime") submitDisabled(dateTime) { return moment().isAfter(dateTime); }, actions: { submit() { - const dateTime = this.get('bufferedDateTime'); - this.get('model.update')(moment(dateTime).utc().toISOString()); + const dateTime = this.get("bufferedDateTime"); + this.get("model.update")(moment(dateTime).utc().toISOString()); this.send("closeModal"); }, - + dateTimeChanged(dateTime) { - this.set('bufferedDateTime', dateTime); - } - } + this.set("bufferedDateTime", dateTime); + }, + }, }); diff --git a/assets/javascripts/discourse/custom-wizard-admin-route-map.js.es6 b/assets/javascripts/discourse/custom-wizard-admin-route-map.js.es6 index 8274ef12..90ab5359 100644 --- a/assets/javascripts/discourse/custom-wizard-admin-route-map.js.es6 +++ b/assets/javascripts/discourse/custom-wizard-admin-route-map.js.es6 @@ -1,25 +1,55 @@ export default { - resource: 'admin', + resource: "admin", map() { - this.route('adminWizards', { path: '/wizards', resetNamespace: true }, function() { - - this.route('adminWizardsWizard', { path: '/wizard/', resetNamespace: true }, function() { - this.route('adminWizardsWizardShow', { path: '/:wizardId/', resetNamespace: true }); - }); - - this.route('adminWizardsCustomFields', { path: '/custom-fields', resetNamespace: true }); - - this.route('adminWizardsSubmissions', { path: '/submissions', resetNamespace: true }, function() { - this.route('adminWizardsSubmissionsShow', { path: '/:wizardId/', resetNamespace: true }); - }) - - this.route('adminWizardsApi', { path: '/api', resetNamespace: true }, function() { - this.route('adminWizardsApiShow', { path: '/:name', resetNamespace: true }); - }); - - this.route('adminWizardsLogs', { path: '/logs', resetNamespace: true }); + this.route( + "adminWizards", + { path: "/wizards", resetNamespace: true }, + function () { + this.route( + "adminWizardsWizard", + { path: "/wizard/", resetNamespace: true }, + function () { + this.route("adminWizardsWizardShow", { + path: "/:wizardId/", + resetNamespace: true, + }); + } + ); - this.route('adminWizardsManager', { path: '/manager', resetNamespace: true }); - }); - } + this.route("adminWizardsCustomFields", { + path: "/custom-fields", + resetNamespace: true, + }); + + this.route( + "adminWizardsSubmissions", + { path: "/submissions", resetNamespace: true }, + function () { + this.route("adminWizardsSubmissionsShow", { + path: "/:wizardId/", + resetNamespace: true, + }); + } + ); + + this.route( + "adminWizardsApi", + { path: "/api", resetNamespace: true }, + function () { + this.route("adminWizardsApiShow", { + path: "/:name", + resetNamespace: true, + }); + } + ); + + this.route("adminWizardsLogs", { path: "/logs", resetNamespace: true }); + + this.route("adminWizardsManager", { + path: "/manager", + resetNamespace: true, + }); + } + ); + }, }; diff --git a/assets/javascripts/discourse/helpers/custom-wizard.js.es6 b/assets/javascripts/discourse/helpers/custom-wizard.js.es6 index 3b73e476..fb5063cc 100644 --- a/assets/javascripts/discourse/helpers/custom-wizard.js.es6 +++ b/assets/javascripts/discourse/helpers/custom-wizard.js.es6 @@ -1,6 +1,6 @@ -import { registerUnbound } from 'discourse-common/lib/helpers'; +import { registerUnbound } from "discourse-common/lib/helpers"; import { dasherize } from "@ember/string"; -registerUnbound('dasherize', function(string) { +registerUnbound("dasherize", function (string) { return dasherize(string); }); diff --git a/assets/javascripts/discourse/initializers/custom-wizard-edits.js.es6 b/assets/javascripts/discourse/initializers/custom-wizard-edits.js.es6 index cd2d9558..73eae8b9 100644 --- a/assets/javascripts/discourse/initializers/custom-wizard-edits.js.es6 +++ b/assets/javascripts/discourse/initializers/custom-wizard-edits.js.es6 @@ -1,19 +1,19 @@ -import { withPluginApi } from 'discourse/lib/plugin-api'; -import DiscourseURL from 'discourse/lib/url'; +import { withPluginApi } from "discourse/lib/plugin-api"; +import DiscourseURL from "discourse/lib/url"; export default { - name: 'custom-wizard-edits', + name: "custom-wizard-edits", initialize(container) { - const siteSettings = container.lookup('site-settings:main'); - + const siteSettings = container.lookup("site-settings:main"); + if (!siteSettings.custom_wizard_enabled) return; const existing = DiscourseURL.routeTo; - DiscourseURL.routeTo = function(path, opts) { - if (path && path.indexOf('/w/') > -1) { - return window.location = path; + DiscourseURL.routeTo = function (path, opts) { + if (path && path.indexOf("/w/") > -1) { + return (window.location = path); } return existing.apply(this, [path, opts]); }; - } + }, }; diff --git a/assets/javascripts/discourse/initializers/custom-wizard-redirect.js.es6 b/assets/javascripts/discourse/initializers/custom-wizard-redirect.js.es6 index 32827b9b..ae4db35b 100644 --- a/assets/javascripts/discourse/initializers/custom-wizard-redirect.js.es6 +++ b/assets/javascripts/discourse/initializers/custom-wizard-redirect.js.es6 @@ -1,36 +1,42 @@ -import ApplicationRoute from 'discourse/routes/application'; +import ApplicationRoute from "discourse/routes/application"; export default { name: "custom-wizard-redirect", after: "message-bus", initialize: function (container) { - const messageBus = container.lookup('message-bus:main'); - const siteSettings = container.lookup('site-settings:main'); - + const messageBus = container.lookup("message-bus:main"); + const siteSettings = container.lookup("site-settings:main"); + if (!siteSettings.custom_wizard_enabled || !messageBus) return; messageBus.subscribe("/redirect_to_wizard", function (wizardId) { - const wizardUrl = window.location.origin + '/w/' + wizardId; + const wizardUrl = window.location.origin + "/w/" + wizardId; window.location.href = wizardUrl; }); ApplicationRoute.reopen({ actions: { willTransition(transition) { - const redirectToWizard = this.get('currentUser.redirect_to_wizard'); - const excludedPaths = Discourse.SiteSettings.wizard_redirect_exclude_paths.split('|').concat(['loading']); + const redirectToWizard = this.get("currentUser.redirect_to_wizard"); + const excludedPaths = Discourse.SiteSettings.wizard_redirect_exclude_paths + .split("|") + .concat(["loading"]); - if (redirectToWizard && (!transition.intent.name || !excludedPaths.find((p) => { - return transition.intent.name.indexOf(p) > -1; - }))) { + if ( + redirectToWizard && + (!transition.intent.name || + !excludedPaths.find((p) => { + return transition.intent.name.indexOf(p) > -1; + })) + ) { transition.abort(); - window.location = '/w/' + redirectToWizard.dasherize(); + window.location = "/w/" + redirectToWizard.dasherize(); } return this._super(transition); - } - } - }) - } + }, + }, + }); + }, }; diff --git a/assets/javascripts/discourse/lib/wizard-json.js.es6 b/assets/javascripts/discourse/lib/wizard-json.js.es6 index 06cdb83b..ec85bb19 100644 --- a/assets/javascripts/discourse/lib/wizard-json.js.es6 +++ b/assets/javascripts/discourse/lib/wizard-json.js.es6 @@ -1,14 +1,14 @@ -import { listProperties, camelCase, snakeCase } from '../lib/wizard'; -import wizardSchema from '../lib/wizard-schema'; -import EmberObject from '@ember/object'; +import { listProperties, camelCase, snakeCase } from "../lib/wizard"; +import wizardSchema from "../lib/wizard-schema"; +import EmberObject from "@ember/object"; import { A } from "@ember/array"; function present(val) { if (val === null || val === undefined) { return false; - } else if (typeof val === 'object') { + } else if (typeof val === "object") { return Object.keys(val).length !== 0; - } else if (typeof val === 'string' || val.constructor === Array) { + } else if (typeof val === "string" || val.constructor === Array) { return val && val.length; } else { return false; @@ -20,51 +20,44 @@ function mapped(property, type) { } function castCase(property, value) { - return property.indexOf('_type') > -1 ? camelCase(value) : value; + return property.indexOf("_type") > -1 ? camelCase(value) : value; } function buildProperty(json, property, type) { let value = json[property]; - - if (mapped(property, type) && - present(value) && - value.constructor === Array) { - + + if (mapped(property, type) && present(value) && value.constructor === Array) { let inputs = []; - - value.forEach(inputJson => { - let input = {} - - Object.keys(inputJson).forEach(inputKey => { - if (inputKey === 'pairs') { + + value.forEach((inputJson) => { + let input = {}; + + Object.keys(inputJson).forEach((inputKey) => { + if (inputKey === "pairs") { let pairs = []; let pairCount = inputJson.pairs.length; - - inputJson.pairs.forEach(pairJson => { + + inputJson.pairs.forEach((pairJson) => { let pair = {}; - - Object.keys(pairJson).forEach(pairKey => { - pair[pairKey] = castCase(pairKey, pairJson[pairKey]); + + Object.keys(pairJson).forEach((pairKey) => { + pair[pairKey] = castCase(pairKey, pairJson[pairKey]); }); - + pair.pairCount = pairCount; - - pairs.push( - EmberObject.create(pair) - ); + + pairs.push(EmberObject.create(pair)); }); - + input.pairs = pairs; } else { - input[inputKey] = castCase(inputKey, inputJson[inputKey]); + input[inputKey] = castCase(inputKey, inputJson[inputKey]); } }); - - inputs.push( - EmberObject.create(input) - ); + + inputs.push(EmberObject.create(input)); }); - + return A(inputs); } else { return value; @@ -73,48 +66,48 @@ function buildProperty(json, property, type) { function buildObject(json, type) { let props = { - isNew: false - } - - Object.keys(json).forEach(prop => { - props[prop] = buildProperty(json, prop, type) + isNew: false, + }; + + Object.keys(json).forEach((prop) => { + props[prop] = buildProperty(json, prop, type); }); - + return EmberObject.create(props); } function buildObjectArray(json, type) { let array = A(); - + if (present(json)) { json.forEach((objJson) => { let object = buildObject(objJson, type); - + if (hasAdvancedProperties(object, type)) { - object.set('showAdvanced', true); + object.set("showAdvanced", true); } - + array.pushObject(object); }); } - + return array; } function buildBasicProperties(json, type, props) { listProperties(type).forEach((p) => { props[p] = buildProperty(json, p, type); - + if (hasAdvancedProperties(json, type)) { props.showAdvanced = true; } }); - + return props; } function hasAdvancedProperties(object, type) { - return Object.keys(object).some(p => { + return Object.keys(object).some((p) => { return wizardSchema[type].advanced.indexOf(p) > -1 && present(object[p]); }); } @@ -122,59 +115,55 @@ function hasAdvancedProperties(object, type) { /// to be removed: necessary due to action array being moved from step to wizard function actionPatch(json) { let actions = json.actions || []; - - json.steps.forEach(step => { + + json.steps.forEach((step) => { if (step.actions && step.actions.length) { - step.actions.forEach(action => { - action.run_after = 'wizard_completion'; + step.actions.forEach((action) => { + action.run_after = "wizard_completion"; actions.push(action); }); } }); - + json.actions = actions; - + return json; } /// function buildProperties(json) { - let props = { + let props = { steps: A(), - actions: A() + actions: A(), }; - + if (present(json)) { props.existingId = true; - props = buildBasicProperties(json, 'wizard', props); - + props = buildBasicProperties(json, "wizard", props); + if (present(json.steps)) { json.steps.forEach((stepJson) => { let stepProps = { - isNew: false + isNew: false, }; - - stepProps = buildBasicProperties(stepJson, 'step', stepProps); - stepProps.fields = buildObjectArray(stepJson.fields, 'field'); - + + stepProps = buildBasicProperties(stepJson, "step", stepProps); + stepProps.fields = buildObjectArray(stepJson.fields, "field"); + props.steps.pushObject(EmberObject.create(stepProps)); }); - }; + } json = actionPatch(json); // to be removed - see above - - props.actions = buildObjectArray(json.actions, 'action'); + + props.actions = buildObjectArray(json.actions, "action"); } else { - listProperties('wizard').forEach(prop => { + listProperties("wizard").forEach((prop) => { props[prop] = wizardSchema.wizard.basic[prop]; }); } - + return props; } -export { - buildProperties, - present, - mapped -} \ No newline at end of file +export { buildProperties, present, mapped }; diff --git a/assets/javascripts/discourse/lib/wizard-mapper.js.es6 b/assets/javascripts/discourse/lib/wizard-mapper.js.es6 index 6fc50588..8af93297 100644 --- a/assets/javascripts/discourse/lib/wizard-mapper.js.es6 +++ b/assets/javascripts/discourse/lib/wizard-mapper.js.es6 @@ -5,71 +5,71 @@ import I18n from "I18n"; // Inputs function defaultInputType(options = {}) { - return options.inputTypes.split(',')[0]; + return options.inputTypes.split(",")[0]; } function mapInputTypes(types) { - return types.map(function(type) { + return types.map(function (type) { return { - id: type, - name: I18n.t(`admin.wizard.input.${type}.name`) + id: type, + name: I18n.t(`admin.wizard.input.${type}.name`), }; }); } function inputTypesContent(options = {}) { - return options.inputTypes ? - mapInputTypes(options.inputTypes.split(',')) : - mapInputTypes(selectableInputTypes); + return options.inputTypes + ? mapInputTypes(options.inputTypes.split(",")) + : mapInputTypes(selectableInputTypes); } // connectorTypes const connectors = { pair: [ - 'equal', - 'greater', - 'less', - 'greater_or_equal', - 'less_or_equal', - 'regex', - 'is' + "equal", + "greater", + "less", + "greater_or_equal", + "less_or_equal", + "regex", + "is", ], - output: [ - 'then', - 'set', - ], -} + output: ["then", "set"], +}; -function defaultConnector(connectorType, inputType, options={}) { - if (connectorType === 'input') { +function defaultConnector(connectorType, inputType, options = {}) { + if (connectorType === "input") { return defaultInputType(options); } - if (connectorType === 'pair') { - if (inputType === 'conditional') return 'equal'; - if (inputType === 'association') return 'association'; - if (inputType === 'validation') return 'equal'; + if (connectorType === "pair") { + if (inputType === "conditional") return "equal"; + if (inputType === "association") return "association"; + if (inputType === "validation") return "equal"; } - if (connectorType === 'output') { - if (inputType === 'conditional') return 'then'; - if (inputType === 'assignment') return 'set'; + if (connectorType === "output") { + if (inputType === "conditional") return "then"; + if (inputType === "assignment") return "set"; } - return 'equal'; + return "equal"; } function connectorContent(connectorType, inputType, opts) { let connector = opts[`${connectorType}Connector`]; - - if ((!connector && connectorType === 'output') || inputType === 'association') { + + if ( + (!connector && connectorType === "output") || + inputType === "association" + ) { connector = defaultConnector(connectorType, inputType); } - + let content = connector ? [connector] : connectors[connectorType]; - - return content.map(function(item) { + + return content.map(function (item) { return { - id: item, - name: I18n.t(`admin.wizard.connector.${item}`) + id: item, + name: I18n.t(`admin.wizard.connector.${item}`), }; }); } @@ -77,38 +77,39 @@ function connectorContent(connectorType, inputType, opts) { // Selectors const selectionTypes = [ - 'text', - 'list', - 'wizardField', - 'wizardAction', - 'userField', - 'userFieldOptions', - 'group', - 'category', - 'tag', - 'user', - 'customField' -] + "text", + "list", + "wizardField", + "wizardAction", + "userField", + "userFieldOptions", + "group", + "category", + "tag", + "user", + "customField", +]; function defaultSelectionType(inputType, options = {}) { if (options[`${inputType}DefaultSelection`]) { return options[`${inputType}DefaultSelection`]; } - + let type = selectionTypes[0]; - + for (let t of selectionTypes) { let inputTypes = options[`${t}Selection`]; - - if (inputTypes === true || - ((typeof inputTypes === 'string') && - inputTypes.split(',').indexOf(inputType) > -1)) { - + + if ( + inputTypes === true || + (typeof inputTypes === "string" && + inputTypes.split(",").indexOf(inputType) > -1) + ) { type = t; break; } } - + return type; } @@ -118,46 +119,42 @@ function newPair(inputType, options = {}) { let params = { index: options.index, pairCount: options.pairCount, - key: '', - key_type: defaultSelectionType('key', options), - value: '', - value_type: defaultSelectionType('value', options), - connector: defaultConnector('pair', inputType, options) - } - + key: "", + key_type: defaultSelectionType("key", options), + value: "", + value_type: defaultSelectionType("value", options), + connector: defaultConnector("pair", inputType, options), + }; + return EmberObject.create(params); } function newInput(options = {}, count) { const inputType = defaultInputType(options); - + let params = { type: inputType, - pairs: A( - [ - newPair( - inputType, - Object.assign({}, - options, - { index: 0, pairCount: 1 } - ) - ) - ] - ) - } - + pairs: A([ + newPair( + inputType, + Object.assign({}, options, { index: 0, pairCount: 1 }) + ), + ]), + }; + if (count > 0) { params.connector = options.inputConnector; } - - if (['conditional', 'assignment'].indexOf(inputType) > -1 || - options.outputDefaultSelection || - options.outputConnector) { - - params['output_type'] = defaultSelectionType('output', options); - params['output_connector'] = defaultConnector('output', inputType, options); + + if ( + ["conditional", "assignment"].indexOf(inputType) > -1 || + options.outputDefaultSelection || + options.outputConnector + ) { + params["output_type"] = defaultSelectionType("output", options); + params["output_connector"] = defaultConnector("output", inputType, options); } - + return EmberObject.create(params); } @@ -169,5 +166,5 @@ export { inputTypesContent, selectionTypes, newInput, - newPair -} \ No newline at end of file + newPair, +}; diff --git a/assets/javascripts/discourse/lib/wizard-schema.js.es6 b/assets/javascripts/discourse/lib/wizard-schema.js.es6 index 36e1bb70..1a1455f8 100644 --- a/assets/javascripts/discourse/lib/wizard-schema.js.es6 +++ b/assets/javascripts/discourse/lib/wizard-schema.js.es6 @@ -14,30 +14,24 @@ const wizard = { prompt_completion: null, restart_on_revisit: null, theme_id: null, - permitted: null + permitted: null, }, - mapped: [ - 'permitted' - ], - advanced: [ - 'restart_on_revisit', - ], - required: [ - 'id', - ], + mapped: ["permitted"], + advanced: ["restart_on_revisit"], + required: ["id"], dependent: { - after_time: 'after_time_scheduled' + after_time: "after_time_scheduled", }, objectArrays: { step: { - property: 'steps', - required: false + property: "steps", + required: false, }, action: { - property: 'actions', - required: false - } - } + property: "actions", + required: false, + }, + }, }; const step = { @@ -49,28 +43,19 @@ const step = { raw_description: null, required_data: null, required_data_message: null, - permitted_params: null - }, - mapped: [ - 'required_data', - 'permitted_params' - ], - advanced: [ - 'required_data', - 'permitted_params' - ], - required: [ - 'id' - ], - dependent: { + permitted_params: null, }, + mapped: ["required_data", "permitted_params"], + advanced: ["required_data", "permitted_params"], + required: ["id"], + dependent: {}, objectArrays: { field: { - property: 'fields', - required: false - } - } -} + property: "fields", + required: false, + }, + }, +}; const field = { basic: { @@ -80,32 +65,21 @@ const field = { description: null, required: null, key: null, - type: null + type: null, }, types: {}, - mapped: [ - 'prefill', - 'content' - ], - advanced: [ - 'property', - 'key' - ], - required: [ - 'id', - 'type' - ], - dependent: { - }, - objectArrays: { - } -} + mapped: ["prefill", "content"], + advanced: ["property", "key"], + required: ["id", "type"], + dependent: {}, + objectArrays: {}, +}; const action = { basic: { id: null, - run_after: 'wizard_completion', - type: null + run_after: "wizard_completion", + type: null, }, types: { create_topic: { @@ -129,7 +103,7 @@ const action = { custom_fields: null, required: null, recipient: null, - suppress_notifications: null + suppress_notifications: null, }, open_composer: { title: null, @@ -138,30 +112,30 @@ const action = { post_template: null, category: null, tags: null, - custom_fields: null + custom_fields: null, }, update_profile: { profile_updates: null, - custom_fields: null + custom_fields: null, }, watch_categories: { categories: null, notification_level: null, mute_remainder: null, wizard_user: true, - usernames: null + usernames: null, }, send_to_api: { api: null, api_endpoint: null, - api_body: null + api_body: null, }, add_to_group: { - group: null + group: null, }, route_to: { url: null, - code: null + code: null, }, create_category: { name: null, @@ -170,7 +144,7 @@ const action = { text_color: "FFFFFF", parent_category_id: null, permissions: null, - custom_fields: null + custom_fields: null, }, create_group: { name: null, @@ -184,61 +158,56 @@ const action = { messageable_level: null, visibility_level: null, members_visibility_level: null, - custom_fields: null - } + custom_fields: null, + }, }, mapped: [ - 'title', - 'category', - 'tags', - 'visible', - 'custom_fields', - 'required', - 'recipient', - 'profile_updates', - 'group', - 'url', - 'categories', - 'mute_remainder', - 'name', - 'slug', - 'color', - 'text_color', - 'parent_category_id', - 'permissions', - 'full_name', - 'bio_raw', - 'owner_usernames', - 'usernames', - 'grant_trust_level', - 'mentionable_level', - 'messageable_level', - 'visibility_level', - 'members_visibility_level' + "title", + "category", + "tags", + "visible", + "custom_fields", + "required", + "recipient", + "profile_updates", + "group", + "url", + "categories", + "mute_remainder", + "name", + "slug", + "color", + "text_color", + "parent_category_id", + "permissions", + "full_name", + "bio_raw", + "owner_usernames", + "usernames", + "grant_trust_level", + "mentionable_level", + "messageable_level", + "visibility_level", + "members_visibility_level", ], advanced: [ - 'code', - 'custom_fields', - 'skip_redirect', - 'suppress_notifications', - 'required' + "code", + "custom_fields", + "skip_redirect", + "suppress_notifications", + "required", ], - required: [ - 'id', - 'type' - ], - dependent: { - }, - objectArrays: { - } -} + required: ["id", "type"], + dependent: {}, + objectArrays: {}, +}; const wizardSchema = { wizard, step, field, - action -} + action, +}; export function buildFieldTypes(types) { wizardSchema.field.types = types; @@ -252,34 +221,34 @@ if (Discourse.SiteSettings.wizard_apis_enabled) { wizardSchema.action.types.send_to_api = { api: null, api_endpoint: null, - api_body: null - } + api_body: null, + }; } -export function setWizardDefaults(obj, itemType, opts={}) { +export function setWizardDefaults(obj, itemType, opts = {}) { const objSchema = wizardSchema[itemType]; const basicDefaults = objSchema.basic; - - Object.keys(basicDefaults).forEach(property => { + + Object.keys(basicDefaults).forEach((property) => { let defaultValue = get(basicDefaults, property); if (defaultValue) { set(obj, property, defaultValue); } }); - + if (objSchema.types) { const typeDefaults = objSchema.types[obj.type]; - + if (typeDefaults) { - Object.keys(typeDefaults).forEach(property => { + Object.keys(typeDefaults).forEach((property) => { if (typeDefaults.hasOwnProperty(property)) { set(obj, property, get(typeDefaults, property)); - } + } }); } } - + return obj; } -export default wizardSchema; \ No newline at end of file +export default wizardSchema; diff --git a/assets/javascripts/discourse/lib/wizard.js.es6 b/assets/javascripts/discourse/lib/wizard.js.es6 index febaa01d..4746fda1 100644 --- a/assets/javascripts/discourse/lib/wizard.js.es6 +++ b/assets/javascripts/discourse/lib/wizard.js.es6 @@ -1,110 +1,111 @@ import EmberObject from "@ember/object"; -import wizardSchema from './wizard-schema'; +import wizardSchema from "./wizard-schema"; function selectKitContent(content) { - return content.map(i => ({id: i, name: i})); + return content.map((i) => ({ id: i, name: i })); } function generateName(id) { - return id ? sentenceCase(id) : ''; + return id ? sentenceCase(id) : ""; } -function generateId(name, opts={}) { - return name ? snakeCase(name) : ''; +function generateId(name, opts = {}) { + return name ? snakeCase(name) : ""; } function sentenceCase(string) { - return string.replace(/[_\-]+/g, ' ') + return string + .replace(/[_\-]+/g, " ") .toLowerCase() .replace(/(^\w|\b\w)/g, (m) => m.toUpperCase()); } function snakeCase(string) { - return string.match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) - .map(x => x.toLowerCase()) - .join('_'); + return string + .match(/[A-Z]{2,}(?=[A-Z][a-z]+[0-9]*|\b)|[A-Z]?[a-z]+[0-9]*|[A-Z]|[0-9]+/g) + .map((x) => x.toLowerCase()) + .join("_"); } function camelCase(string) { - return string.replace(/([-_][a-z])/ig, ($1) => { - return $1.toUpperCase() - .replace('-', '') - .replace('_', ''); + return string.replace(/([-_][a-z])/gi, ($1) => { + return $1.toUpperCase().replace("-", "").replace("_", ""); }); } const userProperties = [ - 'name', - 'username', - 'email', - 'avatar', - 'date_of_birth', - 'title', - 'profile_background', - 'card_background', - 'locale', - 'location', - 'website', - 'bio_raw', - 'trust_level', - 'email_level', - 'email_messages_level', - 'email_digests' + "name", + "username", + "email", + "avatar", + "date_of_birth", + "title", + "profile_background", + "card_background", + "locale", + "location", + "website", + "bio_raw", + "trust_level", + "email_level", + "email_messages_level", + "email_digests", ]; const notificationLevels = [ - 'regular', - 'watching', - 'tracking', - 'watching_first_post', - 'muted' + "regular", + "watching", + "tracking", + "watching_first_post", + "muted", ]; -function listProperties(type, opts={}) { +function listProperties(type, opts = {}) { let properties = Object.keys(wizardSchema[type].basic); - + const types = wizardSchema[type].types; - + if (types) { let typeProperties = []; - + if (opts.allTypes) { - Object.keys(types).forEach(type => { + Object.keys(types).forEach((type) => { typeProperties = typeProperties.concat(Object.keys(types[type])); }); } else if (opts.objectType && types[opts.objectType]) { typeProperties = Object.keys(types[opts.objectType]); } - + properties = properties.concat(typeProperties); } - + return properties; } function wizardFieldList(steps = [], opts = {}) { let upToIndex = null; - + if (opts.upTo) { - upToIndex = steps.map((s) => (s.id)).indexOf(opts.upTo); + upToIndex = steps.map((s) => s.id).indexOf(opts.upTo); } - + return steps.reduce((result, step, index) => { let fields = step.fields; - + if (fields && fields.length > 0) { - if (upToIndex === null || index < upToIndex) { - result.push(...fields.map((field) => { - return EmberObject.create({ - id: field.id, - label: `${field.label} (${field.id})`, - type: field.type - }); - })); + result.push( + ...fields.map((field) => { + return EmberObject.create({ + id: field.id, + label: `${field.label} (${field.id})`, + type: field.type, + }); + }) + ); } } - + return result; }, []); } @@ -118,5 +119,5 @@ export { userProperties, listProperties, notificationLevels, - wizardFieldList + wizardFieldList, }; diff --git a/assets/javascripts/discourse/mixins/undo-changes.js.es6 b/assets/javascripts/discourse/mixins/undo-changes.js.es6 index 776be1cd..61608cf2 100644 --- a/assets/javascripts/discourse/mixins/undo-changes.js.es6 +++ b/assets/javascripts/discourse/mixins/undo-changes.js.es6 @@ -1,9 +1,9 @@ -import { listProperties } from '../lib/wizard'; -import { default as wizardSchema } from '../lib/wizard-schema'; +import { listProperties } from "../lib/wizard"; +import { default as wizardSchema } from "../lib/wizard-schema"; import { set, get } from "@ember/object"; import Mixin from "@ember/object/mixin"; -import { observes } from 'discourse-common/utils/decorators'; -import { deepEqual } from 'discourse-common/lib/object'; +import { observes } from "discourse-common/utils/decorators"; +import { deepEqual } from "discourse-common/lib/object"; export default Mixin.create({ didInsertElement() { @@ -14,9 +14,9 @@ export default Mixin.create({ this.setProperties({ originalObject: JSON.parse(JSON.stringify(obj)), - undoIcon: obj.isNew ? 'times' : 'undo', - undoKey: `admin.wizard.${obj.isNew ? 'clear' : 'undo'}` - }) + undoIcon: obj.isNew ? "times" : "undo", + undoKey: `admin.wizard.${obj.isNew ? "clear" : "undo"}`, + }); }, willDestroyElement() { @@ -24,33 +24,33 @@ export default Mixin.create({ this.removeObservers(); }, - removeObservers(objType=null) { + removeObservers(objType = null) { const componentType = this.componentType; const obj = this.get(componentType); let opts = { - objectType: objType || obj.type - } + objectType: objType || obj.type, + }; - listProperties(componentType, opts).forEach(property => { + listProperties(componentType, opts).forEach((property) => { obj.removeObserver(property, this, this.toggleUndo); }); }, - setupObservers(objType=null) { + setupObservers(objType = null) { const componentType = this.componentType; const obj = this.get(componentType); let opts = { - objectType: objType || obj.type - } + objectType: objType || obj.type, + }; - listProperties(componentType, opts).forEach(property => { + listProperties(componentType, opts).forEach((property) => { obj.addObserver(property, this, this.toggleUndo); }); }, - revertToOriginal(revertBasic=false) { + revertToOriginal(revertBasic = false) { const original = JSON.parse(JSON.stringify(this.originalObject)); const componentType = this.componentType; const obj = this.get(componentType); @@ -58,7 +58,7 @@ export default Mixin.create({ const basicDefaults = objSchema.basic; if (revertBasic) { - Object.keys(basicDefaults).forEach(property => { + Object.keys(basicDefaults).forEach((property) => { let value; if (original.hasOwnProperty(property)) { @@ -74,7 +74,7 @@ export default Mixin.create({ if (objSchema.types && obj.type) { let typeDefaults = objSchema.types[obj.type]; - Object.keys(typeDefaults).forEach(property => { + Object.keys(typeDefaults).forEach((property) => { let value; if (original.type === obj.type && original.hasOwnProperty(property)) { @@ -91,36 +91,36 @@ export default Mixin.create({ toggleUndo() { const current = this.get(this.componentType); const original = this.originalObject; - this.set('showUndo', !deepEqual(current, original)); + this.set("showUndo", !deepEqual(current, original)); }, actions: { undoChanges() { const componentType = this.componentType; - const original = this.get('originalObject'); + const original = this.get("originalObject"); const obj = this.get(componentType); this.removeObservers(obj.type); this.revertToOriginal(true); - this.set('showUndo', false); + this.set("showUndo", false); this.setupObservers(this.get(componentType).type); }, changeType(type) { const componentType = this.componentType; - const original = this.get('originalObject'); + const original = this.get("originalObject"); const obj = this.get(componentType); this.removeObservers(obj.type); - obj.set('type', type); + obj.set("type", type); this.revertToOriginal(); - this.set('showUndo', type !== original.type); + this.set("showUndo", type !== original.type); this.setupObservers(type); }, mappedFieldUpdated(property, mappedComponent, type) { const obj = this.get(this.componentType); obj.notifyPropertyChange(property); - } - } -}) + }, + }, +}); diff --git a/assets/javascripts/discourse/models/custom-wizard-api.js.es6 b/assets/javascripts/discourse/models/custom-wizard-api.js.es6 index 14fb5469..e9a361fb 100644 --- a/assets/javascripts/discourse/models/custom-wizard-api.js.es6 +++ b/assets/javascripts/discourse/models/custom-wizard-api.js.es6 @@ -1,15 +1,19 @@ -import { ajax } from 'discourse/lib/ajax'; -import { default as discourseComputed } from 'discourse-common/utils/decorators'; +import { ajax } from "discourse/lib/ajax"; +import { default as discourseComputed } from "discourse-common/utils/decorators"; import EmberObject from "@ember/object"; import { A } from "@ember/array"; const CustomWizardApi = EmberObject.extend({ - @discourseComputed('name') + @discourseComputed("name") redirectUri(name) { let nameParam = name.toString().dasherize(); - const baseUrl = location.protocol+'//'+location.hostname+(location.port ? ':'+location.port: ''); + const baseUrl = + location.protocol + + "//" + + location.hostname + + (location.port ? ":" + location.port : ""); return baseUrl + `/admin/wizards/apis/${nameParam}/redirect`; - } + }, }); CustomWizardApi.reopenClass({ @@ -38,7 +42,7 @@ CustomWizardApi.reopenClass({ tokenRefreshAt: authorization.token_refresh_at, endpoints: A(endpoints), isNew: params.isNew, - log: params.log + log: params.log, }); return api; @@ -46,19 +50,19 @@ CustomWizardApi.reopenClass({ find(name) { return ajax(`/admin/wizards/api/${name}`, { - type: 'GET' - }).then(result => { + type: "GET", + }).then((result) => { return CustomWizardApi.create(result); }); }, list() { return ajax("/admin/wizards/api", { - type: 'GET' - }).then(result => { + type: "GET", + }).then((result) => { return result; }); - } + }, }); export default CustomWizardApi; diff --git a/assets/javascripts/discourse/models/custom-wizard-custom-field.js.es6 b/assets/javascripts/discourse/models/custom-wizard-custom-field.js.es6 index 95276bf6..ba3a388d 100644 --- a/assets/javascripts/discourse/models/custom-wizard-custom-field.js.es6 +++ b/assets/javascripts/discourse/models/custom-wizard-custom-field.js.es6 @@ -1,33 +1,33 @@ -import { ajax } from 'discourse/lib/ajax'; -import { popupAjaxError } from 'discourse/lib/ajax-error'; +import { ajax } from "discourse/lib/ajax"; +import { popupAjaxError } from "discourse/lib/ajax-error"; import EmberObject from "@ember/object"; import { isEmpty } from "@ember/utils"; const CustomWizardCustomField = EmberObject.extend({ - isNew: isEmpty('id') + isNew: isEmpty("id"), }); -const basePath = '/admin/wizards/custom-fields'; +const basePath = "/admin/wizards/custom-fields"; CustomWizardCustomField.reopenClass({ listFields() { return ajax(basePath).catch(popupAjaxError); }, - + saveField(customField) { return ajax(basePath, { - type: 'PUT', + type: "PUT", data: { - custom_field: customField - } + custom_field: customField, + }, }).catch(popupAjaxError); }, - + destroyField(field) { return ajax(`${basePath}/${field.name}`, { - type: 'DELETE' + type: "DELETE", }).catch(popupAjaxError); - } + }, }); -export default CustomWizardCustomField; \ No newline at end of file +export default CustomWizardCustomField; diff --git a/assets/javascripts/discourse/models/custom-wizard-logs.js.es6 b/assets/javascripts/discourse/models/custom-wizard-logs.js.es6 index 10f46d53..e2de8a07 100644 --- a/assets/javascripts/discourse/models/custom-wizard-logs.js.es6 +++ b/assets/javascripts/discourse/models/custom-wizard-logs.js.es6 @@ -1,17 +1,17 @@ -import { ajax } from 'discourse/lib/ajax'; -import { popupAjaxError } from 'discourse/lib/ajax-error'; +import { ajax } from "discourse/lib/ajax"; +import { popupAjaxError } from "discourse/lib/ajax-error"; import EmberObject from "@ember/object"; const CustomWizardLogs = EmberObject.extend(); CustomWizardLogs.reopenClass({ list(page = 0) { - return ajax('/admin/wizards/logs', { + return ajax("/admin/wizards/logs", { data: { - page - } + page, + }, }).catch(popupAjaxError); - } + }, }); -export default CustomWizardLogs; \ No newline at end of file +export default CustomWizardLogs; diff --git a/assets/javascripts/discourse/models/custom-wizard-manager.js.es6 b/assets/javascripts/discourse/models/custom-wizard-manager.js.es6 index 68d8d567..ea7cfd92 100644 --- a/assets/javascripts/discourse/models/custom-wizard-manager.js.es6 +++ b/assets/javascripts/discourse/models/custom-wizard-manager.js.es6 @@ -1,5 +1,5 @@ -import { ajax } from 'discourse/lib/ajax'; -import { popupAjaxError } from 'discourse/lib/ajax-error'; +import { ajax } from "discourse/lib/ajax"; +import { popupAjaxError } from "discourse/lib/ajax-error"; import EmberObject from "@ember/object"; const CustomWizardManager = EmberObject.extend(); @@ -9,35 +9,35 @@ const basePath = "admin/wizards/manager"; CustomWizardManager.reopenClass({ import($formData) { return ajax(`/${basePath}/import`, { - type: 'POST', + type: "POST", data: $formData, processData: false, contentType: false, }).catch(popupAjaxError); }, - + export(wizardIds) { let url = `${Discourse.BaseUrl}/${basePath}/export?`; - + wizardIds.forEach((wizardId, index) => { - let step = 'wizard_ids[]=' + wizardId; + let step = "wizard_ids[]=" + wizardId; if (index !== wizardIds[wizardIds.length - 1]) { - step += '&'; + step += "&"; } url += step; }); location.href = url; }, - + destroy(wizardIds) { return ajax(`/${basePath}/destroy`, { type: "DELETE", data: { - wizard_ids: wizardIds - } + wizard_ids: wizardIds, + }, }).catch(popupAjaxError); - } + }, }); -export default CustomWizardManager; \ No newline at end of file +export default CustomWizardManager; diff --git a/assets/javascripts/discourse/models/custom-wizard.js.es6 b/assets/javascripts/discourse/models/custom-wizard.js.es6 index ea555f41..aa9c1145 100644 --- a/assets/javascripts/discourse/models/custom-wizard.js.es6 +++ b/assets/javascripts/discourse/models/custom-wizard.js.es6 @@ -1,32 +1,32 @@ -import { ajax } from 'discourse/lib/ajax'; +import { ajax } from "discourse/lib/ajax"; import EmberObject from "@ember/object"; -import { buildProperties, present, mapped } from '../lib/wizard-json'; -import { listProperties, camelCase, snakeCase } from '../lib/wizard'; -import wizardSchema from '../lib/wizard-schema'; +import { buildProperties, present, mapped } from "../lib/wizard-json"; +import { listProperties, camelCase, snakeCase } from "../lib/wizard"; +import wizardSchema from "../lib/wizard-schema"; import { Promise } from "rsvp"; -import { popupAjaxError } from 'discourse/lib/ajax-error'; +import { popupAjaxError } from "discourse/lib/ajax-error"; const CustomWizard = EmberObject.extend({ save(opts) { - return new Promise((resolve, reject) => { - let wizard = this.buildJson(this, 'wizard'); - + return new Promise((resolve, reject) => { + let wizard = this.buildJson(this, "wizard"); + if (wizard.error) { reject(wizard); } - + let data = { - wizard + wizard, }; - + if (opts.create) { data.create = true; } - + ajax(`/admin/wizards/wizard/${wizard.id}`, { - type: 'PUT', + type: "PUT", contentType: "application/json", - data: JSON.stringify(data) + data: JSON.stringify(data), }).then((result) => { if (result.error) { reject(result); @@ -39,53 +39,55 @@ const CustomWizard = EmberObject.extend({ buildJson(object, type, result = {}) { let objectType = object.type || null; - + if (wizardSchema[type].types) { if (!objectType) { result.error = { - type: 'required', - params: { type, property: 'type' } - } + type: "required", + params: { type, property: "type" }, + }; return result; } } - + for (let property of listProperties(type, { objectType })) { let value = object.get(property); - + result = this.validateValue(property, value, object, type, result); - + if (result.error) { break; } - + if (mapped(property, type)) { value = this.buildMappedJson(value); } - + if (value !== undefined && value !== null) { result[property] = value; } - }; - + } + if (!result.error) { - for (let arrayObjectType of Object.keys(wizardSchema[type].objectArrays)) { + for (let arrayObjectType of Object.keys( + wizardSchema[type].objectArrays + )) { let arraySchema = wizardSchema[type].objectArrays[arrayObjectType]; let objectArray = object.get(arraySchema.property); - + if (arraySchema.required && !present(objectArray)) { result.error = { - type: 'required', - params: { type, property: arraySchema.property } - } + type: "required", + params: { type, property: arraySchema.property }, + }; break; } result[arraySchema.property] = []; - + for (let item of objectArray) { let itemProps = this.buildJson(item, arrayObjectType); - + if (itemProps.error) { result.error = itemProps.error; break; @@ -93,115 +95,119 @@ const CustomWizard = EmberObject.extend({ result[arraySchema.property].push(itemProps); } } - }; + } } - + return result; }, - + validateValue(property, value, object, type, result) { if (wizardSchema[type].required.indexOf(property) > -1 && !value) { result.error = { - type: 'required', - params: { type, property } - } + type: "required", + params: { type, property }, + }; } - + let dependent = wizardSchema[type].dependent[property]; if (dependent && value && !object[dependent]) { result.error = { - type: 'dependent', - params: { property, dependent } - } + type: "dependent", + params: { property, dependent }, + }; } - - if (property === 'api_body') { + + if (property === "api_body") { try { value = JSON.parse(value); } catch (e) { result.error = { - type: 'invalid', - params: { type, property } - } + type: "invalid", + params: { type, property }, + }; } } - + return result; }, buildMappedJson(inputs) { if (!inputs || !inputs.length) return false; - + let result = []; - - inputs.forEach(inpt => { + + inputs.forEach((inpt) => { let input = { type: inpt.type, }; - + if (inpt.connector) { input.connector = inpt.connector; } - + if (present(inpt.output)) { input.output = inpt.output; input.output_type = snakeCase(inpt.output_type); input.output_connector = inpt.output_connector; } - + if (present(inpt.pairs)) { input.pairs = []; - - inpt.pairs.forEach(pr => { + + inpt.pairs.forEach((pr) => { 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 - } - + connector: pr.connector, + }; + input.pairs.push(pairParams); } }); } - - if ((input.type === 'assignment' && present(input.output)) || - present(input.pairs)) { - + + if ( + (input.type === "assignment" && present(input.output)) || + present(input.pairs) + ) { result.push(input); } }); - + if (!result.length) { result = false; } - + return result; }, remove() { return ajax(`/admin/wizards/wizard/${this.id}`, { - type: 'DELETE' - }).then(() => this.destroy()).catch(popupAjaxError); - } + type: "DELETE", + }) + .then(() => this.destroy()) + .catch(popupAjaxError); + }, }); CustomWizard.reopenClass({ all() { return ajax("/admin/wizards/wizard", { - type: 'GET' - }).then(result => { - return result.wizard_list; - }).catch(popupAjaxError); + type: "GET", + }) + .then((result) => { + return result.wizard_list; + }) + .catch(popupAjaxError); }, submissions(wizardId) { return ajax(`/admin/wizards/submissions/${wizardId}`, { - type: "GET" + type: "GET", }).catch(popupAjaxError); }, @@ -209,7 +215,7 @@ CustomWizard.reopenClass({ const wizard = this._super.apply(this); wizard.setProperties(buildProperties(wizardJson)); return wizard; - } + }, }); export default CustomWizard; diff --git a/assets/javascripts/discourse/routes/admin-wizards-api-show.js.es6 b/assets/javascripts/discourse/routes/admin-wizards-api-show.js.es6 index b77074d5..6c0ed7a8 100644 --- a/assets/javascripts/discourse/routes/admin-wizards-api-show.js.es6 +++ b/assets/javascripts/discourse/routes/admin-wizards-api-show.js.es6 @@ -1,16 +1,16 @@ -import CustomWizardApi from '../models/custom-wizard-api'; +import CustomWizardApi from "../models/custom-wizard-api"; import DiscourseRoute from "discourse/routes/discourse"; export default DiscourseRoute.extend({ model(params) { - if (params.name === 'create') { + if (params.name === "create") { return CustomWizardApi.create({ isNew: true }); } else { return CustomWizardApi.find(params.name); } }, - setupController(controller, model){ + setupController(controller, model) { controller.set("api", model); - } + }, }); diff --git a/assets/javascripts/discourse/routes/admin-wizards-api.js.es6 b/assets/javascripts/discourse/routes/admin-wizards-api.js.es6 index 65c17865..927af8c8 100644 --- a/assets/javascripts/discourse/routes/admin-wizards-api.js.es6 +++ b/assets/javascripts/discourse/routes/admin-wizards-api.js.es6 @@ -1,45 +1,44 @@ import DiscourseRoute from "discourse/routes/discourse"; -import CustomWizardApi from '../models/custom-wizard-api'; +import CustomWizardApi from "../models/custom-wizard-api"; export default DiscourseRoute.extend({ model() { return CustomWizardApi.list(); }, - + setupController(controller, model) { - const showParams = this.paramsFor('adminWizardsApiShow'); - const apiName = showParams.name == 'create' ? null : showParams.name; - const apiList = (model || []).map(api => { + const showParams = this.paramsFor("adminWizardsApiShow"); + const apiName = showParams.name == "create" ? null : showParams.name; + const apiList = (model || []).map((api) => { return { id: api.name, - name: api.title - } + name: api.title, + }; }); - + controller.setProperties({ apiName, - apiList - }) + apiList, + }); }, - + actions: { changeApi(apiName) { - this.controllerFor('adminWizardsApi').set('apiName', apiName); - this.transitionTo('adminWizardsApiShow', apiName); + this.controllerFor("adminWizardsApi").set("apiName", apiName); + this.transitionTo("adminWizardsApiShow", apiName); }, - + afterDestroy() { - this.transitionTo('adminWizardsApi').then(() => this.refresh()); + this.transitionTo("adminWizardsApi").then(() => this.refresh()); }, - + afterSave(apiName) { - this.refresh().then(() => this.send('changeApi', apiName)); + this.refresh().then(() => this.send("changeApi", apiName)); }, - + createApi() { - this.controllerFor('adminWizardsApi').set('apiName', 'create'); - this.transitionTo('adminWizardsApiShow', 'create'); - } - } - -}); \ No newline at end of file + this.controllerFor("adminWizardsApi").set("apiName", "create"); + this.transitionTo("adminWizardsApiShow", "create"); + }, + }, +}); diff --git a/assets/javascripts/discourse/routes/admin-wizards-custom-fields.js.es6 b/assets/javascripts/discourse/routes/admin-wizards-custom-fields.js.es6 index b4fd1c4e..a1c625ad 100644 --- a/assets/javascripts/discourse/routes/admin-wizards-custom-fields.js.es6 +++ b/assets/javascripts/discourse/routes/admin-wizards-custom-fields.js.es6 @@ -6,9 +6,9 @@ export default DiscourseRoute.extend({ model() { return CustomWizardCustomField.listFields(); }, - + setupController(controller, model) { const customFields = A(model || []); - controller.set('customFields', customFields); - } -}); \ No newline at end of file + controller.set("customFields", customFields); + }, +}); diff --git a/assets/javascripts/discourse/routes/admin-wizards-logs.js.es6 b/assets/javascripts/discourse/routes/admin-wizards-logs.js.es6 index a7e62ad6..56b91350 100644 --- a/assets/javascripts/discourse/routes/admin-wizards-logs.js.es6 +++ b/assets/javascripts/discourse/routes/admin-wizards-logs.js.es6 @@ -1,4 +1,4 @@ -import CustomWizardLogs from '../models/custom-wizard-logs'; +import CustomWizardLogs from "../models/custom-wizard-logs"; import DiscourseRoute from "discourse/routes/discourse"; export default DiscourseRoute.extend({ @@ -7,6 +7,6 @@ export default DiscourseRoute.extend({ }, setupController(controller, model) { - controller.set('logs', model); - } -}) + controller.set("logs", model); + }, +}); diff --git a/assets/javascripts/discourse/routes/admin-wizards-manager.js.es6 b/assets/javascripts/discourse/routes/admin-wizards-manager.js.es6 index faba2e0e..dfbfc472 100644 --- a/assets/javascripts/discourse/routes/admin-wizards-manager.js.es6 +++ b/assets/javascripts/discourse/routes/admin-wizards-manager.js.es6 @@ -1,12 +1,12 @@ -import CustomWizard from '../models/custom-wizard'; +import CustomWizard from "../models/custom-wizard"; import DiscourseRoute from "discourse/routes/discourse"; export default DiscourseRoute.extend({ model() { return CustomWizard.all(); }, - + setupController(controller, model) { - controller.set('wizards', model) - } + controller.set("wizards", model); + }, }); diff --git a/assets/javascripts/discourse/routes/admin-wizards-submissions-show.js.es6 b/assets/javascripts/discourse/routes/admin-wizards-submissions-show.js.es6 index d4818024..abcaeb9e 100644 --- a/assets/javascripts/discourse/routes/admin-wizards-submissions-show.js.es6 +++ b/assets/javascripts/discourse/routes/admin-wizards-submissions-show.js.es6 @@ -1,4 +1,4 @@ -import CustomWizard from '../models/custom-wizard'; +import CustomWizard from "../models/custom-wizard"; import DiscourseRoute from "discourse/routes/discourse"; export default DiscourseRoute.extend({ @@ -25,12 +25,12 @@ export default DiscourseRoute.extend({ }); submissions.push(submission); }); - + controller.setProperties({ wizard: model.wizard, submissions, - fields + fields, }); } - } + }, }); diff --git a/assets/javascripts/discourse/routes/admin-wizards-submissions.js.es6 b/assets/javascripts/discourse/routes/admin-wizards-submissions.js.es6 index 6dff576d..9ecb183d 100644 --- a/assets/javascripts/discourse/routes/admin-wizards-submissions.js.es6 +++ b/assets/javascripts/discourse/routes/admin-wizards-submissions.js.es6 @@ -1,24 +1,24 @@ import DiscourseRoute from "discourse/routes/discourse"; -import { ajax } from 'discourse/lib/ajax'; +import { ajax } from "discourse/lib/ajax"; export default DiscourseRoute.extend({ model() { return ajax(`/admin/wizards/wizard`); }, - + setupController(controller, model) { - const showParams = this.paramsFor('adminWizardsSubmissionsShow'); - + const showParams = this.paramsFor("adminWizardsSubmissionsShow"); + controller.setProperties({ wizardId: showParams.wizardId, - wizardList: model.wizard_list - }) + wizardList: model.wizard_list, + }); }, - + actions: { changeWizard(wizardId) { - this.controllerFor('adminWizardsSubmissions').set('wizardId', wizardId); - this.transitionTo('adminWizardsSubmissionsShow', wizardId); - } - } -}); \ No newline at end of file + this.controllerFor("adminWizardsSubmissions").set("wizardId", wizardId); + this.transitionTo("adminWizardsSubmissionsShow", wizardId); + }, + }, +}); diff --git a/assets/javascripts/discourse/routes/admin-wizards-wizard-show.js.es6 b/assets/javascripts/discourse/routes/admin-wizards-wizard-show.js.es6 index 21f3bb1b..eaa6591c 100644 --- a/assets/javascripts/discourse/routes/admin-wizards-wizard-show.js.es6 +++ b/assets/javascripts/discourse/routes/admin-wizards-wizard-show.js.es6 @@ -1,47 +1,49 @@ -import CustomWizard from '../models/custom-wizard'; -import { ajax } from 'discourse/lib/ajax'; +import CustomWizard from "../models/custom-wizard"; +import { ajax } from "discourse/lib/ajax"; import DiscourseRoute from "discourse/routes/discourse"; import I18n from "I18n"; -import { selectKitContent } from '../lib/wizard'; +import { selectKitContent } from "../lib/wizard"; export default DiscourseRoute.extend({ model(params) { - if (params.wizardId === 'create') { + if (params.wizardId === "create") { return { create: true }; } else { return ajax(`/admin/wizards/wizard/${params.wizardId}`); } }, - + afterModel(model) { if (model.none) { - return this.transitionTo('adminWizardsWizard'); + return this.transitionTo("adminWizardsWizard"); } }, setupController(controller, model) { - const parentModel = this.modelFor('adminWizardsWizard'); - const wizard = CustomWizard.create((!model || model.create) ? {} : model); - const fieldTypes = Object.keys(parentModel.field_types).map(type => { + const parentModel = this.modelFor("adminWizardsWizard"); + const wizard = CustomWizard.create(!model || model.create ? {} : model); + const fieldTypes = Object.keys(parentModel.field_types).map((type) => { return { id: type, - name: I18n.t(`admin.wizard.field.type.${type}`) + name: I18n.t(`admin.wizard.field.type.${type}`), }; - }) - + }); + let props = { wizardList: parentModel.wizard_list, fieldTypes, userFields: parentModel.userFields, - customFields: selectKitContent(parentModel.custom_fields.map(f => f.name)), + customFields: selectKitContent( + parentModel.custom_fields.map((f) => f.name) + ), apis: parentModel.apis, themes: parentModel.themes, wizard, currentStep: wizard.steps[0], currentAction: wizard.actions[0], - creating: model.create + creating: model.create, }; - + controller.setProperties(props); - } + }, }); diff --git a/assets/javascripts/discourse/routes/admin-wizards-wizard.js.es6 b/assets/javascripts/discourse/routes/admin-wizards-wizard.js.es6 index e92e9d60..b23b63f6 100644 --- a/assets/javascripts/discourse/routes/admin-wizards-wizard.js.es6 +++ b/assets/javascripts/discourse/routes/admin-wizards-wizard.js.es6 @@ -1,15 +1,15 @@ import DiscourseRoute from "discourse/routes/discourse"; -import { buildFieldTypes, buildFieldValidations } from '../lib/wizard-schema'; +import { buildFieldTypes, buildFieldValidations } from "../lib/wizard-schema"; import EmberObject, { set } from "@ember/object"; import { A } from "@ember/array"; import { all } from "rsvp"; -import { ajax } from 'discourse/lib/ajax'; +import { ajax } from "discourse/lib/ajax"; -export default DiscourseRoute.extend({ +export default DiscourseRoute.extend({ model() { return ajax("/admin/wizards/wizard"); }, - + afterModel(model) { buildFieldTypes(model.field_types); buildFieldValidations(model.realtime_validations); @@ -17,80 +17,86 @@ export default DiscourseRoute.extend({ return all([ this._getThemes(model), this._getApis(model), - this._getUserFields(model) + this._getUserFields(model), ]); }, - + _getThemes(model) { - return ajax('/admin/themes') - .then((result) => { - set(model, 'themes', result.themes.map(t => { + return ajax("/admin/themes").then((result) => { + set( + model, + "themes", + result.themes.map((t) => { return { id: t.id, - name: t.name - } - })); - }); + name: t.name, + }; + }) + ); + }); }, _getApis(model) { - return ajax('/admin/wizards/api') - .then((result) => set(model, 'apis', result)); + return ajax("/admin/wizards/api").then((result) => + set(model, "apis", result) + ); }, - + _getUserFields(model) { - return this.store.findAll('user-field').then((result) => { + return this.store.findAll("user-field").then((result) => { if (result && result.content) { - set(model, 'userFields', + set( + model, + "userFields", result.content.map((f) => ({ id: `user_field_${f.id}`, - name: f.name + name: f.name, })) ); } }); }, - + currentWizard() { - const params = this.paramsFor('adminWizardsWizardShow'); - + const params = this.paramsFor("adminWizardsWizardShow"); + if (params && params.wizardId) { return params.wizardId; } else { return null; } }, - + setupController(controller, model) { controller.setProperties({ wizardList: model.wizard_list, wizardId: this.currentWizard(), - custom_fields: A(model.custom_fields.map(f => EmberObject.create(f))) + custom_fields: A(model.custom_fields.map((f) => EmberObject.create(f))), }); }, - + actions: { changeWizard(wizardId) { - this.controllerFor('adminWizardsWizard').set('wizardId', wizardId); - + this.controllerFor("adminWizardsWizard").set("wizardId", wizardId); + if (wizardId) { - this.transitionTo('adminWizardsWizardShow', wizardId); + this.transitionTo("adminWizardsWizardShow", wizardId); } else { - this.transitionTo('adminWizardsWizard'); + this.transitionTo("adminWizardsWizard"); } }, - + afterDestroy() { - this.transitionTo('adminWizardsWizard').then(() => this.refresh()); + this.transitionTo("adminWizardsWizard").then(() => this.refresh()); }, - + afterSave(wizardId) { - this.refresh().then(() => this.send('changeWizard', wizardId)); + this.refresh().then(() => this.send("changeWizard", wizardId)); }, - + createWizard() { - this.controllerFor('adminWizardsWizard').set('wizardId', 'create'); - this.transitionTo('adminWizardsWizardShow', 'create'); - } - } -}); \ No newline at end of file + this.controllerFor("adminWizardsWizard").set("wizardId", "create"); + this.transitionTo("adminWizardsWizardShow", "create"); + }, + }, +}); diff --git a/assets/javascripts/discourse/routes/admin-wizards.js.es6 b/assets/javascripts/discourse/routes/admin-wizards.js.es6 index 7647207a..5de271a8 100644 --- a/assets/javascripts/discourse/routes/admin-wizards.js.es6 +++ b/assets/javascripts/discourse/routes/admin-wizards.js.es6 @@ -3,7 +3,7 @@ import DiscourseRoute from "discourse/routes/discourse"; export default DiscourseRoute.extend({ beforeModel(transition) { if (transition.targetName === "adminWizards.index") { - this.transitionTo('adminWizardsWizard'); + this.transitionTo("adminWizardsWizard"); } }, -}); \ No newline at end of file +}); diff --git a/assets/javascripts/wizard/components/custom-user-selector.js.es6 b/assets/javascripts/wizard/components/custom-user-selector.js.es6 index 6ca5698d..ee88645c 100644 --- a/assets/javascripts/wizard/components/custom-user-selector.js.es6 +++ b/assets/javascripts/wizard/components/custom-user-selector.js.es6 @@ -1,9 +1,12 @@ -import { default as computed, observes } from 'discourse-common/utils/decorators'; -import { renderAvatar } from 'discourse/helpers/user-avatar'; -import userSearch from '../lib/user-search'; +import { + default as computed, + observes, +} from "discourse-common/utils/decorators"; +import { renderAvatar } from "discourse/helpers/user-avatar"; +import userSearch from "../lib/user-search"; import WizardI18n from "../lib/wizard-i18n"; -const template = function(params) { +const template = function (params) { const options = params.options; let html = "