From a806e14c64e097987e6a175255b1cda229ccb23c Mon Sep 17 00:00:00 2001 From: merefield Date: Sat, 23 Oct 2021 13:06:12 +0100 Subject: [PATCH] Admin custom fields subscription differentiation --- .../components/custom-field-input.js.es6 | 83 +++++++++++-------- .../discourse/lib/wizard-schema.js.es6 | 66 +++++++++++++++ .../routes/admin-wizards-custom-fields.js.es6 | 2 + .../templates/admin-wizards-custom-fields.hbs | 3 +- .../components/custom-field-input.hbs | 4 +- assets/stylesheets/admin/admin.scss | 22 +++-- .../custom_wizard/admin/custom_fields.rb | 3 +- 7 files changed, 132 insertions(+), 51 deletions(-) diff --git a/assets/javascripts/discourse/components/custom-field-input.js.es6 b/assets/javascripts/discourse/components/custom-field-input.js.es6 index a673112b..bd6c78a1 100644 --- a/assets/javascripts/discourse/components/custom-field-input.js.es6 +++ b/assets/javascripts/discourse/components/custom-field-input.js.es6 @@ -4,27 +4,12 @@ import { alias, equal, or } from "@ember/object/computed"; import { computed } from "@ember/object"; import I18n from "I18n"; -const klasses = ["topic", "post", "group", "category"]; -const types = ["string", "boolean", "integer", "json"]; -const subscriptionTypes = { - klass: ["group", "category"], - type: ["json"], -}; - -const generateContent = function (array, type, subscribed = false) { - return array.reduce((result, key) => { - let subArr = subscriptionTypes[type]; - let subscription = subArr && subArr.includes(key); - if (!subscription || subscribed) { - result.push({ - id: key, - name: I18n.t(`admin.wizard.custom_field.${type}.${key}`), - subscription, - }); - } - return result; - }, []); -}; +import wizardSchema, { + customFieldsKlassesRequiringAdditionalSubscription, + customFieldsKlassSubscriptionLevel, + customFieldsTypesRequiringAdditionalSubscription, + customFieldsTypeSubscriptionLevel, +} from "discourse/plugins/discourse-custom-wizard/discourse/lib/wizard-schema"; export default Component.extend({ tagName: "tr", @@ -32,12 +17,6 @@ export default Component.extend({ postSerializers: ["post"], groupSerializers: ["basic_group"], categorySerializers: ["basic_category"], - klassContent: computed("subscribed", function () { - return generateContent(klasses, "klass", this.subscribed); - }), - typeContent: computed("subscribed", function () { - return generateContent(types, "type", this.subscribed); - }), showInputs: or("field.new", "field.edit"), classNames: ["custom-field-input"], loading: or("saving", "destroying"), @@ -49,15 +28,49 @@ export default Component.extend({ this.set("originalField", JSON.parse(JSON.stringify(this.field))); }, - @discourseComputed("field.klass") - serializerContent(klass) { - const serializers = this.get(`${klass}Serializers`); + // @discourseComputed("field.klass") + // serializerContent(klass) { + // const serializers = this.get(`${klass}Serializers`); - if (serializers) { - return generateContent(serializers, "serializers", this.subscribed); - } else { - return []; - } + // if (serializers) { + // return generateContent(serializers, "serializers", this.subscribed); + // } else { + // return []; + // } + // }, + + @discourseComputed("subscription") + customFieldTypes(subscription) { + let unsubscribedCustomFields = customFieldsTypesRequiringAdditionalSubscription( + subscription + ); + return wizardSchema.custom_field.types.reduce((result, type) => { + let disabled = unsubscribedCustomFields.includes(type); + result.push({ + id: type, + name: I18n.t(`admin.wizard.custom_field.type.${type}`), + subscription: customFieldsTypeSubscriptionLevel(type), + disabled: disabled, + }); + return result; + }, []); + }, + + @discourseComputed("subscription") + customFieldKlasses(subscription) { + let unsubscribedCustomFields = customFieldsKlassesRequiringAdditionalSubscription( + subscription + ); + return wizardSchema.custom_field.klasses.reduce((result, klass) => { + let disabled = unsubscribedCustomFields.includes(klass); + result.push({ + id: klass, + name: I18n.t(`admin.wizard.custom_field.klass.${klass}`), + subscription: customFieldsKlassSubscriptionLevel(klass), + disabled: disabled, + }); + return result; + }, []); }, @observes("field.klass") diff --git a/assets/javascripts/discourse/lib/wizard-schema.js.es6 b/assets/javascripts/discourse/lib/wizard-schema.js.es6 index 250df371..a49dec14 100644 --- a/assets/javascripts/discourse/lib/wizard-schema.js.es6 +++ b/assets/javascripts/discourse/lib/wizard-schema.js.es6 @@ -208,10 +208,24 @@ const action = { objectArrays: {}, }; +const custom_field = { + klasses: ["topic", "post", "group", "category"], + types: ["string", "boolean", "integer", "json"], + customFieldKlassWithSubscription: { + standard: [], + business: ["group", "category"], + }, + customFieldTypeWithSubscription: { + standard: ["json"], + business: [], + }, +} + const wizardSchema = { wizard, step, field, + custom_field, action, }; @@ -242,6 +256,58 @@ export function actionSubscriptionLevel(type) { } } + + +export function customFieldsKlassesRequiringAdditionalSubscription( + currentSubscription +) { + switch (currentSubscription) { + case "business": + return []; + case "standard": + return custom_field.customFieldKlassWithSubscription["business"]; + default: + return custom_field.customFieldKlassWithSubscription["business"].concat(custom_field.customFieldKlassWithSubscription["standard"]); + } +} + +export function customFieldsKlassSubscriptionLevel(type) { + if (custom_field.customFieldKlassWithSubscription["business"].includes(type)) { + return "business" + } else { + if (custom_field.customFieldKlassWithSubscription["standard"].includes(type)) { + return "standard" + } else { + return "" + } + } +} + +export function customFieldsTypesRequiringAdditionalSubscription( + currentSubscription +) { + switch (currentSubscription) { + case "business": + return []; + case "standard": + return custom_field.customFieldTypeWithSubscription["business"]; + default: + return custom_field.customFieldTypeWithSubscription["business"].concat(custom_field.customFieldTypeWithSubscription["standard"]); + } +} + +export function customFieldsTypeSubscriptionLevel(type) { + if (custom_field.customFieldTypeWithSubscription["business"].includes(type)) { + return "business" + } else { + if (custom_field.customFieldTypeWithSubscription["standard"].includes(type)) { + return "standard" + } else { + return "" + } + } +} + export function buildFieldTypes(types) { wizardSchema.field.types = types; } 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 ca9c4c40..4992f92d 100644 --- a/assets/javascripts/discourse/routes/admin-wizards-custom-fields.js.es6 +++ b/assets/javascripts/discourse/routes/admin-wizards-custom-fields.js.es6 @@ -10,10 +10,12 @@ export default DiscourseRoute.extend({ setupController(controller, model) { const customFields = A(model.custom_fields || []); const subscribed = model.subscribed; + const subscription = model.subscription; controller.setProperties({ customFields, subscribed, + subscription, }); }, }); diff --git a/assets/javascripts/discourse/templates/admin-wizards-custom-fields.hbs b/assets/javascripts/discourse/templates/admin-wizards-custom-fields.hbs index 361d2d44..dceed458 100644 --- a/assets/javascripts/discourse/templates/admin-wizards-custom-fields.hbs +++ b/assets/javascripts/discourse/templates/admin-wizards-custom-fields.hbs @@ -33,7 +33,8 @@ field=field removeField=(action "removeField") saveField=(action "saveField") - subscribed=subscribed}} + subscribed=subscribed + subscription=subscription}} {{/each}} diff --git a/assets/javascripts/discourse/templates/components/custom-field-input.hbs b/assets/javascripts/discourse/templates/components/custom-field-input.hbs index ac7e8689..b4ddcc81 100644 --- a/assets/javascripts/discourse/templates/components/custom-field-input.hbs +++ b/assets/javascripts/discourse/templates/components/custom-field-input.hbs @@ -2,14 +2,14 @@ {{wizard-subscription-selector value=field.klass - content=klassContent + content=customFieldKlasses none="admin.wizard.custom_field.klass.select" onChange=(action (mut field.klass))}} {{wizard-subscription-selector value=field.type - content=typeContent + content=customFieldTypes none="admin.wizard.custom_field.type.select" onChange=(action (mut field.type))}} diff --git a/assets/stylesheets/admin/admin.scss b/assets/stylesheets/admin/admin.scss index 5973a1e7..94fe6839 100644 --- a/assets/stylesheets/admin/admin.scss +++ b/assets/stylesheets/admin/admin.scss @@ -427,10 +427,6 @@ margin-bottom: 0; } - .wizard-custom-action .select-kit-row.disabled { - background: var(--primary-low); - } - .select-box-kit-header { height: initial; } @@ -792,11 +788,6 @@ vertical-align: middle; } -.subscription-label { - color: var(--tertiary); - font-size: 0.75em; -} - .admin-wizards-subscription { .admin-wizard-controls { h3, @@ -857,14 +848,21 @@ } .wizard-subscription-selector.select-kit.single-select { - .select-kit-row .texts { - display: flex; - align-items: center; + .select-kit-row { + .texts { + display: flex; + align-items: center; + } + &.disabled { + background: var(--primary-low); + } } .subscription-label { margin-left: 0.75em; padding-top: 0.25em; + color: var(--tertiary); + font-size: 0.75em; } } diff --git a/controllers/custom_wizard/admin/custom_fields.rb b/controllers/custom_wizard/admin/custom_fields.rb index d10f82ed..1cd20f5d 100644 --- a/controllers/custom_wizard/admin/custom_fields.rb +++ b/controllers/custom_wizard/admin/custom_fields.rb @@ -3,7 +3,8 @@ class CustomWizard::AdminCustomFieldsController < CustomWizard::AdminController def index render_json_dump( custom_fields: custom_field_list, - subscribed: CustomWizard::Subscription.subscribed? + subscribed: CustomWizard::Subscription.subscribed?, + subscription: CustomWizard::Subscription.type ) end