various
Dieser Commit ist enthalten in:
Ursprung
ab18769820
Commit
92e61f3f51
10 geänderte Dateien mit 74 neuen und 86 gelöschten Zeilen
|
@ -18,7 +18,7 @@ export default DiscourseRoute.extend({
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
setupController(controller, model) {
|
setupController(controller, model) {
|
||||||
const parentModel = this.modelFor('adminWizardsWizard');
|
const parentModel = this.modelFor('adminWizardsWizard');
|
||||||
const wizard = CustomWizard.create((!model || model.create) ? {} : model);
|
const wizard = CustomWizard.create((!model || model.create) ? {} : model);
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ import { ajax } from 'discourse/lib/ajax';
|
||||||
|
|
||||||
export default DiscourseRoute.extend({
|
export default DiscourseRoute.extend({
|
||||||
model() {
|
model() {
|
||||||
return ajax(`/admin/wizards/wizard`);
|
return ajax("/admin/wizards/wizard");
|
||||||
},
|
},
|
||||||
|
|
||||||
afterModel(model) {
|
afterModel(model) {
|
||||||
|
@ -52,14 +52,20 @@ export default DiscourseRoute.extend({
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
currentWizard() {
|
||||||
|
const params = this.paramsFor('adminWizardsWizardShow');
|
||||||
|
|
||||||
|
if (params && params.wizardId) {
|
||||||
|
return params.wizardId;
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
setupController(controller, model) {
|
setupController(controller, model) {
|
||||||
let props = {
|
let props = {
|
||||||
wizardList: model.wizard_list
|
wizardList: model.wizard_list,
|
||||||
}
|
wizardId: this.currentWizard()
|
||||||
|
|
||||||
const params = this.paramsFor('adminWizardsWizardShow');
|
|
||||||
if (params && params.wizardId) {
|
|
||||||
props.wizardId = params.wizardId;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
controller.setProperties(props);
|
controller.setProperties(props);
|
||||||
|
|
|
@ -80,7 +80,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="setting-value">
|
<div class="setting-value">
|
||||||
{{input value=field.file_types}}
|
{{input value=field.file_types class="medium"}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
@ -156,7 +156,7 @@
|
||||||
{{input
|
{{input
|
||||||
name="key"
|
name="key"
|
||||||
value=field.key
|
value=field.key
|
||||||
class="small"
|
class="medium"
|
||||||
placeholderKey="admin.wizard.translation_placeholder"}}
|
placeholderKey="admin.wizard.translation_placeholder"}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -14,6 +14,12 @@
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
|
|
||||||
|
.wizard-message {
|
||||||
|
.d-icon {
|
||||||
|
margin-right: 4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.admin-wizard-container {
|
.admin-wizard-container {
|
||||||
|
@ -178,6 +184,10 @@
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
input[type="number"] {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
input[disabled] {
|
input[disabled] {
|
||||||
background-color: $primary-low;
|
background-color: $primary-low;
|
||||||
cursor: not-allowed;
|
cursor: not-allowed;
|
||||||
|
|
|
@ -13,7 +13,7 @@ en:
|
||||||
name: "Name"
|
name: "Name"
|
||||||
name_placeholder: "wizard name"
|
name_placeholder: "wizard name"
|
||||||
background: "Background"
|
background: "Background"
|
||||||
background_placeholder: "color"
|
background_placeholder: "#hex"
|
||||||
save_submissions: "Save"
|
save_submissions: "Save"
|
||||||
save_submissions_label: "Save wizard submissions."
|
save_submissions_label: "Save wizard submissions."
|
||||||
multiple_submissions: "Multiple"
|
multiple_submissions: "Multiple"
|
||||||
|
@ -105,6 +105,7 @@ en:
|
||||||
invalid: "{{property}} is invalid"
|
invalid: "{{property}} is invalid"
|
||||||
dependent: "{{property}} is dependent on {{dependent}}"
|
dependent: "{{property}} is dependent on {{dependent}}"
|
||||||
conflict: "{{type}} with {{property}} '{{value}}' already exists"
|
conflict: "{{type}} with {{property}} '{{value}}' already exists"
|
||||||
|
after_time: "After time invalid"
|
||||||
|
|
||||||
step:
|
step:
|
||||||
header: "Steps"
|
header: "Steps"
|
||||||
|
|
|
@ -29,16 +29,14 @@ class CustomWizard::AdminWizardController < CustomWizard::AdminController
|
||||||
def save
|
def save
|
||||||
opts = {}
|
opts = {}
|
||||||
opts[:create] = params[:create] if params[:create]
|
opts[:create] = params[:create] if params[:create]
|
||||||
|
|
||||||
validator = CustomWizard::Validator.new(save_wizard_params.to_h, opts)
|
validator = CustomWizard::Validator.new(save_wizard_params.to_h, opts)
|
||||||
validation = validator.perform
|
validation = validator.perform
|
||||||
|
|
||||||
if validation[:error]
|
if validation[:error]
|
||||||
render json: { error: validation[:error] }
|
render json: { error: validation[:error] }
|
||||||
else
|
else
|
||||||
params = validation[:wizard]
|
if wizard_id = CustomWizard::Wizard.save(validation[:wizard])
|
||||||
|
|
||||||
if wizard_id = CustomWizard::Wizard.save(params)
|
|
||||||
render json: success_json.merge(wizard_id: wizard_id)
|
render json: success_json.merge(wizard_id: wizard_id)
|
||||||
else
|
else
|
||||||
render json: failed_json
|
render json: failed_json
|
||||||
|
@ -116,10 +114,9 @@ class CustomWizard::AdminWizardController < CustomWizard::AdminController
|
||||||
:code,
|
:code,
|
||||||
:skip_redirect,
|
:skip_redirect,
|
||||||
:url,
|
:url,
|
||||||
|
:post,
|
||||||
|
:post_template,
|
||||||
title: mapped_params,
|
title: mapped_params,
|
||||||
post: mapped_params,
|
|
||||||
post_builder: mapped_params,
|
|
||||||
post_template: mapped_params,
|
|
||||||
category: mapped_params,
|
category: mapped_params,
|
||||||
tags: mapped_params,
|
tags: mapped_params,
|
||||||
custom_fields: mapped_params,
|
custom_fields: mapped_params,
|
||||||
|
|
|
@ -69,7 +69,6 @@ class CustomWizard::Builder
|
||||||
|
|
||||||
if (required_data = step_template['required_data']).present?
|
if (required_data = step_template['required_data']).present?
|
||||||
has_required_data = true
|
has_required_data = true
|
||||||
pairs =
|
|
||||||
|
|
||||||
required_data.each do |required|
|
required_data.each do |required|
|
||||||
required['pairs'].each do |pair|
|
required['pairs'].each do |pair|
|
||||||
|
@ -122,7 +121,7 @@ class CustomWizard::Builder
|
||||||
validate_field(field, updater, step_template) if field['type'] != 'text_only'
|
validate_field(field, updater, step_template) if field['type'] != 'text_only'
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
next if updater.errors.any?
|
next if updater.errors.any?
|
||||||
|
|
||||||
CustomWizard::Builder.step_handlers.each do |handler|
|
CustomWizard::Builder.step_handlers.each do |handler|
|
||||||
|
@ -274,36 +273,31 @@ class CustomWizard::Builder
|
||||||
def validate_field(field, updater, step_template)
|
def validate_field(field, updater, step_template)
|
||||||
value = updater.fields[field['id']]
|
value = updater.fields[field['id']]
|
||||||
min_length = false
|
min_length = false
|
||||||
label = field['label'] || I18n.t("#{field['key']}.label")
|
|
||||||
|
|
||||||
if field['required'] && !value
|
label = field['label'] || I18n.t("#{field['key']}.label")
|
||||||
updater.errors.add(field['id'].to_s, I18n.t('wizard.field.required', label: label))
|
type = field['type']
|
||||||
end
|
required = field['required']
|
||||||
|
id = field['id'].to_s
|
||||||
if is_text_type(field)
|
min_length = field['min_length'] if is_text_type(field)
|
||||||
min_length = field['min_length']
|
|
||||||
|
if required && !value
|
||||||
|
updater.errors.add(id, I18n.t('wizard.field.required', label: label))
|
||||||
end
|
end
|
||||||
|
|
||||||
if min_length && value.is_a?(String) && value.strip.length < min_length.to_i
|
if min_length && value.is_a?(String) && value.strip.length < min_length.to_i
|
||||||
updater.errors.add(
|
updater.errors.add(id, I18n.t('wizard.field.too_short', label: label, min: min_length.to_i))
|
||||||
field['id'].to_s,
|
|
||||||
I18n.t('wizard.field.too_short', label: label, min: min_length.to_i)
|
|
||||||
)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
if is_url_type(field)
|
if is_url_type(field) && !check_if_url(value)
|
||||||
if !check_if_url(value)
|
updater.errors.add(id, I18n.t('wizard.field.not_url', label: label))
|
||||||
updater.errors.add(field['id'].to_s, I18n.t('wizard.field.not_url', label: label))
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
## ensure all checkboxes are booleans
|
if type === 'checkbox'
|
||||||
if field['type'] === 'checkbox'
|
updater.fields[id] = standardise_boolean(value)
|
||||||
updater.fields[field['id']] = standardise_boolean(value)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
CustomWizard::Builder.field_validators.each do |validator|
|
CustomWizard::Builder.field_validators.each do |validator|
|
||||||
if field['type'] === validator[:type]
|
if type === validator[:type]
|
||||||
validator[:block].call(field, updater, step_template)
|
validator[:block].call(field, updater, step_template)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -18,10 +18,12 @@ class CustomWizard::StepUpdater
|
||||||
@step.updater.call(self) if @step.present? && @step.updater.present?
|
@step.updater.call(self) if @step.present? && @step.updater.present?
|
||||||
|
|
||||||
if success?
|
if success?
|
||||||
UserHistory.create(action: UserHistory.actions[:custom_wizard_step],
|
UserHistory.create(
|
||||||
acting_user_id: @current_user.id,
|
action: UserHistory.actions[:custom_wizard_step],
|
||||||
context: @wizard.id,
|
acting_user_id: @current_user.id,
|
||||||
subject: @step.id)
|
context: @wizard.id,
|
||||||
|
subject: @step.id
|
||||||
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -8,17 +8,17 @@ class CustomWizard::Validator
|
||||||
|
|
||||||
def perform
|
def perform
|
||||||
params = @params
|
params = @params
|
||||||
|
|
||||||
check_id(params, :wizard)
|
check_id(params, :wizard)
|
||||||
check_required(params, :wizard)
|
check_required(params, :wizard)
|
||||||
check_depdendent(params, :wizard)
|
check_depdendent(params, :wizard)
|
||||||
|
|
||||||
after_time = nil
|
after_time = nil
|
||||||
|
|
||||||
if !@error && @params[:after_time]
|
|
||||||
after_time = validate_after_time
|
|
||||||
end
|
|
||||||
|
|
||||||
|
if !@error && @params[:after_time]
|
||||||
|
validate_after_time
|
||||||
|
end
|
||||||
|
|
||||||
if !@error
|
if !@error
|
||||||
params[:steps].each do |step|
|
params[:steps].each do |step|
|
||||||
check_required(step, :step)
|
check_required(step, :step)
|
||||||
|
@ -42,13 +42,11 @@ class CustomWizard::Validator
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if @error
|
if @error
|
||||||
{ error: @error }
|
{ error: @error }
|
||||||
else
|
else
|
||||||
result = { wizard: params }
|
{ wizard: params }
|
||||||
result[:after_time] = after_time if after_time
|
|
||||||
result
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -105,39 +103,16 @@ class CustomWizard::Validator
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def validate_after_time
|
def validate_after_time
|
||||||
if !@opts[:create]
|
wizard = CustomWizard::Wizard.create(@params[:id]) if !@opts[:create]
|
||||||
wizard = CustomWizard::Wizard.create(params)
|
current_time = wizard.present? ? wizard.after_time_scheduled : nil
|
||||||
end
|
new_time = @params[:after_time_scheduled]
|
||||||
|
|
||||||
new = false
|
|
||||||
error = nil
|
|
||||||
scheduled = nil
|
|
||||||
|
|
||||||
if !@params[:after_time_scheduled] && !wizard[:after_time_scheduled]
|
|
||||||
error = 'after_time_need_time'
|
|
||||||
else
|
|
||||||
scheduled = Time.parse(@params[:after_time_scheduled]).utc
|
|
||||||
new = false
|
|
||||||
|
|
||||||
if wizard[:after_time_scheduled]
|
|
||||||
new = scheduled != Time.parse(wizard[:after_time_scheduled]).utc
|
|
||||||
end
|
|
||||||
|
|
||||||
begin
|
if (new_time.blank? && current_time.blank?) ||
|
||||||
error = 'after_time_invalid' if new && scheduled < Time.now.utc
|
(new_time !~ /^([01]?[0-9]|2[0-3])\:[0-5][0-9]$/) ||
|
||||||
rescue ArgumentError
|
(Time.parse(new_time).utc < Time.now.utc)
|
||||||
error = 'after_time_invalid'
|
|
||||||
end
|
@error = { type: 'after_time' }
|
||||||
end
|
|
||||||
|
|
||||||
if error
|
|
||||||
@error = { type: error }
|
|
||||||
else
|
|
||||||
{
|
|
||||||
new: new,
|
|
||||||
scheduled: scheduled
|
|
||||||
}
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
|
@ -298,7 +298,8 @@ class CustomWizard::Wizard
|
||||||
|
|
||||||
if wizard[:after_time]
|
if wizard[:after_time]
|
||||||
Jobs.cancel_scheduled_job(:set_after_time_wizard, wizard_id: wizard[:id])
|
Jobs.cancel_scheduled_job(:set_after_time_wizard, wizard_id: wizard[:id])
|
||||||
Jobs.enqueue_at(wizard[:after_time_scheduled], :set_after_time_wizard, wizard_id: wizard[:id])
|
enqueue_at = Time.parse(wizard[:after_time_scheduled]).utc
|
||||||
|
Jobs.enqueue_at(enqueue_at, :set_after_time_wizard, wizard_id: wizard[:id])
|
||||||
end
|
end
|
||||||
|
|
||||||
if existing_wizard && existing_wizard.after_time && !wizard[:after_time]
|
if existing_wizard && existing_wizard.after_time && !wizard[:after_time]
|
||||||
|
@ -330,6 +331,8 @@ class CustomWizard::Wizard
|
||||||
def self.create(wizard_id, user = nil)
|
def self.create(wizard_id, user = nil)
|
||||||
if wizard = self.find(wizard_id)
|
if wizard = self.find(wizard_id)
|
||||||
CustomWizard::Wizard.new(wizard.to_h, user)
|
CustomWizard::Wizard.new(wizard.to_h, user)
|
||||||
|
else
|
||||||
|
false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Laden …
In neuem Issue referenzieren