Spiegel von
https://github.com/paviliondev/discourse-custom-wizard.git
synchronisiert 2024-11-25 18:50:27 +01:00
validation framework code working
Dieser Commit ist enthalten in:
Ursprung
5d749fe426
Commit
79e2368b57
13 geänderte Dateien mit 67 neuen und 33 gelöschten Zeilen
|
@ -1,5 +1,17 @@
|
||||||
import Component from "@ember/component";
|
import Component from "@ember/component";
|
||||||
|
|
||||||
Component.extend({
|
export default Component.extend({
|
||||||
|
init(){
|
||||||
|
this._super(...arguments);
|
||||||
|
if (!this.validations) return;
|
||||||
|
|
||||||
|
if (!this.field.validations) {
|
||||||
|
const validations = {};
|
||||||
|
this.validations.forEach((validation) => {
|
||||||
|
validations[validation] = {};
|
||||||
|
});
|
||||||
|
|
||||||
|
this.set('field.validations', EmberObject.create(validations));
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
|
@ -31,8 +31,8 @@ export default Component.extend(UndoChanges, {
|
||||||
validations(type) {
|
validations(type) {
|
||||||
const applicableToField = [];
|
const applicableToField = [];
|
||||||
for(let validation in wizardSchema.field.validations) {
|
for(let validation in wizardSchema.field.validations) {
|
||||||
if (wizardSchema.field.validations[validation].includes(type)) {
|
if (wizardSchema.field.validations[validation]["type"] === type) {
|
||||||
applicableToField.push(validation);
|
applicableToField.push(validation)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
<div>
|
<div>
|
||||||
<label>{{i18n 'admin.wizard.field.validations.header'}}</label>
|
<label>{{i18n 'admin.wizard.field.validations.header'}}</label>
|
||||||
</div>
|
</div>
|
||||||
|
{{#each-in field.validations as |name props|}}
|
||||||
{{#each validations as |validation|}}
|
<span class="setting-title">
|
||||||
<span class="setting-title">
|
{{i18n (concat 'admin.wizard.field.validations.' name)}}
|
||||||
{{i18n (concat 'admin.wizard.field.validations.' validation)}} {{input type="checkbox" }}
|
{{input type="checkbox" checked=props.status }}
|
||||||
</span>
|
</span>
|
||||||
<div>
|
<div>
|
||||||
{{input type="radio"}} :before
|
{{radio-button name=(concat name field.id) value="above" selection=props.position}} {{i18n 'admin.wizard.field.validations.above'}}
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
{{input type="radio"}} :after
|
{{radio-button name=(concat name field.id) value="below" selection=props.position}} {{i18n 'admin.wizard.field.validations.below'}}
|
||||||
</div>
|
</div>
|
||||||
{{/each}}
|
{{/each-in}}
|
||||||
|
|
|
@ -3,7 +3,7 @@ import { observes } from "discourse-common/utils/decorators";
|
||||||
export default Component.extend({
|
export default Component.extend({
|
||||||
actions:{
|
actions:{
|
||||||
perform() {
|
perform() {
|
||||||
this.toggleProperty('performValidation');
|
this.appEvents.trigger('custom-wizard:validate');
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
});
|
});
|
|
@ -9,8 +9,11 @@ export default Component.extend({
|
||||||
isValid: null,
|
isValid: null,
|
||||||
isInvalid: not('isValid'),
|
isInvalid: not('isValid'),
|
||||||
layoutName: 'components/validator', // useful for sharing the template with extending components
|
layoutName: 'components/validator', // useful for sharing the template with extending components
|
||||||
@observes('perform')
|
didInsertElement() {
|
||||||
performValidation() {
|
this.appEvents.on('custom-wizard:validate', this, this.validate);
|
||||||
this.validate();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
willDestroyElement() {
|
||||||
|
this.appEvents.off('custom-wizard:validate', this, this.validate);
|
||||||
|
}
|
||||||
});
|
});
|
|
@ -1,13 +1,13 @@
|
||||||
{{#if field.validations}}
|
{{#if field.validations}}
|
||||||
{{#each field.validations.top as |validation|}}
|
{{#each-in field.validations.above as |name validation|}}
|
||||||
{{validation.component field=field perform=perform}}
|
{{component validation.component field=field}}
|
||||||
{{/each}}
|
{{/each-in}}
|
||||||
|
|
||||||
{{yield (hash perform=(action 'perform')) }}
|
{{yield (hash perform=(action 'perform'))}}
|
||||||
|
|
||||||
{{#each field.validations.bottom as |validation|}}
|
{{#each-in field.validations.below as |name validation|}}
|
||||||
{{validation.component field=field perform=perform}}
|
{{component validation.component field=field}}
|
||||||
{{/each}}
|
{{/each-in}}
|
||||||
{{else}}
|
{{else}}
|
||||||
{{yield}}
|
{{yield}}
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
|
@ -179,6 +179,8 @@ en:
|
||||||
validations:
|
validations:
|
||||||
header: "Realtime Validation Settings"
|
header: "Realtime Validation Settings"
|
||||||
suggested_topics: "Suggested Topics"
|
suggested_topics: "Suggested Topics"
|
||||||
|
above: "Above"
|
||||||
|
below: "Below"
|
||||||
|
|
||||||
type:
|
type:
|
||||||
text: "Text"
|
text: "Text"
|
||||||
|
|
|
@ -105,7 +105,8 @@ class CustomWizard::AdminWizardController < CustomWizard::AdminController
|
||||||
:limit,
|
:limit,
|
||||||
:property,
|
:property,
|
||||||
prefill: mapped_params,
|
prefill: mapped_params,
|
||||||
content: mapped_params
|
content: mapped_params,
|
||||||
|
validations: {},
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
actions: [
|
actions: [
|
||||||
|
|
|
@ -4,6 +4,7 @@ module CustomWizardFieldExtension
|
||||||
:description,
|
:description,
|
||||||
:image,
|
:image,
|
||||||
:key,
|
:key,
|
||||||
|
:validations,
|
||||||
:min_length,
|
:min_length,
|
||||||
:max_length,
|
:max_length,
|
||||||
:char_counter,
|
:char_counter,
|
||||||
|
@ -20,6 +21,7 @@ module CustomWizardFieldExtension
|
||||||
@description = attrs[:description]
|
@description = attrs[:description]
|
||||||
@image = attrs[:image]
|
@image = attrs[:image]
|
||||||
@key = attrs[:key]
|
@key = attrs[:key]
|
||||||
|
@validations = attrs[:validations]
|
||||||
@min_length = attrs[:min_length]
|
@min_length = attrs[:min_length]
|
||||||
@max_length = attrs[:max_length]
|
@max_length = attrs[:max_length]
|
||||||
@char_counter = attrs[:char_counter]
|
@char_counter = attrs[:char_counter]
|
||||||
|
|
|
@ -158,6 +158,7 @@ class CustomWizard::Builder
|
||||||
params[:description] = field_template['description'] if field_template['description']
|
params[:description] = field_template['description'] if field_template['description']
|
||||||
params[:image] = field_template['image'] if field_template['image']
|
params[:image] = field_template['image'] if field_template['image']
|
||||||
params[:key] = field_template['key'] if field_template['key']
|
params[:key] = field_template['key'] if field_template['key']
|
||||||
|
params[:validations] = field_template['validations'] if field_template['validations']
|
||||||
params[:min_length] = field_template['min_length'] if field_template['min_length']
|
params[:min_length] = field_template['min_length'] if field_template['min_length']
|
||||||
params[:max_length] = field_template['max_length'] if field_template['max_length']
|
params[:max_length] = field_template['max_length'] if field_template['max_length']
|
||||||
params[:char_counter] = field_template['char_counter'] if field_template['char_counter']
|
params[:char_counter] = field_template['char_counter'] if field_template['char_counter']
|
||||||
|
|
|
@ -5,7 +5,8 @@ class CustomWizard::Field
|
||||||
min_length: nil,
|
min_length: nil,
|
||||||
max_length: nil,
|
max_length: nil,
|
||||||
prefill: nil,
|
prefill: nil,
|
||||||
char_counter: nil
|
char_counter: nil,
|
||||||
|
validations: nil
|
||||||
},
|
},
|
||||||
textarea: {
|
textarea: {
|
||||||
min_length: nil,
|
min_length: nil,
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
class CustomWizard::RealtimeValidation
|
class CustomWizard::RealtimeValidation
|
||||||
cattr_accessor :types
|
cattr_accessor :types
|
||||||
@@types ||= {
|
@@types ||= {
|
||||||
suggested_topics: [:text]
|
suggested_topics: {type: :text, component: "alpha-validator"}
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
|
@ -8,6 +8,7 @@ class CustomWizard::FieldSerializer < ::WizardFieldSerializer
|
||||||
:limit,
|
:limit,
|
||||||
:property,
|
:property,
|
||||||
:content,
|
:content,
|
||||||
|
:validations,
|
||||||
:max_length,
|
:max_length,
|
||||||
:char_counter,
|
:char_counter,
|
||||||
:number
|
:number
|
||||||
|
@ -58,6 +59,17 @@ class CustomWizard::FieldSerializer < ::WizardFieldSerializer
|
||||||
object.choices.present?
|
object.choices.present?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def validations
|
||||||
|
validations = {}
|
||||||
|
object.validations&.each do |name, props|
|
||||||
|
next unless props["status"]
|
||||||
|
validations[props["position"]] ||= {}
|
||||||
|
validations[props["position"]][name] = props.merge CustomWizard::RealtimeValidation.types[name.to_sym]
|
||||||
|
end
|
||||||
|
|
||||||
|
validations
|
||||||
|
end
|
||||||
|
|
||||||
def max_length
|
def max_length
|
||||||
object.max_length
|
object.max_length
|
||||||
end
|
end
|
||||||
|
|
Laden …
In neuem Issue referenzieren