diff --git a/app/controllers/custom_wizard/admin/wizard.rb b/app/controllers/custom_wizard/admin/wizard.rb index 0a59e02b..71a5623b 100644 --- a/app/controllers/custom_wizard/admin/wizard.rb +++ b/app/controllers/custom_wizard/admin/wizard.rb @@ -88,6 +88,7 @@ class CustomWizard::AdminWizardController < CustomWizard::AdminController :title, :key, :banner, + :banner_upload_id, :raw_description, :required_data_message, :force_final, @@ -99,6 +100,7 @@ class CustomWizard::AdminWizardController < CustomWizard::AdminController :index, :label, :image, + :image_upload_id, :description, :required, :key, diff --git a/assets/javascripts/discourse/components/wizard-custom-field.js.es6 b/assets/javascripts/discourse/components/wizard-custom-field.js.es6 index 8efb7f0c..6966020c 100644 --- a/assets/javascripts/discourse/components/wizard-custom-field.js.es6 +++ b/assets/javascripts/discourse/components/wizard-custom-field.js.es6 @@ -144,11 +144,17 @@ export default Component.extend(UndoChanges, { actions: { imageUploadDone(upload) { - this.set("field.image", upload.url); + this.setProperties({ + "field.image": upload.url, + "field.image_upload_id": upload.id + }); }, imageUploadDeleted() { - this.set("field.image", null); + this.setProperties({ + "field.image": null, + "field.image_upload_id": null + }); }, }, }); diff --git a/assets/javascripts/discourse/components/wizard-custom-step.js.es6 b/assets/javascripts/discourse/components/wizard-custom-step.js.es6 index 2a07dd65..034931ce 100644 --- a/assets/javascripts/discourse/components/wizard-custom-step.js.es6 +++ b/assets/javascripts/discourse/components/wizard-custom-step.js.es6 @@ -24,11 +24,17 @@ export default Component.extend({ actions: { bannerUploadDone(upload) { - this.set("step.banner", upload.url); + this.setProperties({ + "step.banner": upload.url, + "step.banner_upload_id": upload.id + }); }, bannerUploadDeleted() { - this.set("step.banner", null); + this.setProperties({ + "step.banner": null, + "step.banner_upload_id": null + }); }, }, }); diff --git a/assets/javascripts/discourse/lib/wizard-schema.js.es6 b/assets/javascripts/discourse/lib/wizard-schema.js.es6 index 5445223a..b47df7e6 100644 --- a/assets/javascripts/discourse/lib/wizard-schema.js.es6 +++ b/assets/javascripts/discourse/lib/wizard-schema.js.es6 @@ -43,6 +43,7 @@ const step = { title: null, key: null, banner: null, + banner_upload_id: null, raw_description: null, required_data: null, required_data_message: null, @@ -68,6 +69,7 @@ const field = { index: null, label: null, image: null, + image_upload_id: null, description: null, required: null, key: null, diff --git a/assets/javascripts/discourse/templates/components/wizard-custom-field.hbs b/assets/javascripts/discourse/templates/components/wizard-custom-field.hbs index 6866f3ef..bc47b50f 100644 --- a/assets/javascripts/discourse/templates/components/wizard-custom-field.hbs +++ b/assets/javascripts/discourse/templates/components/wizard-custom-field.hbs @@ -44,7 +44,7 @@ imageUrl=field.image onUploadDone=(action "imageUploadDone") onUploadDeleted=(action "imageUploadDeleted") - type="wizard-step" + type=(concat "wizard-" wizard.id) class="no-repeat contain-image" id=(concat "wizard-field-" field.id "-image-upload")}} diff --git a/assets/javascripts/discourse/templates/components/wizard-custom-step.hbs b/assets/javascripts/discourse/templates/components/wizard-custom-step.hbs index ad4623c2..64afa703 100644 --- a/assets/javascripts/discourse/templates/components/wizard-custom-step.hbs +++ b/assets/javascripts/discourse/templates/components/wizard-custom-step.hbs @@ -18,7 +18,7 @@ imageUrl=step.banner onUploadDone=(action "bannerUploadDone") onUploadDeleted=(action "bannerUploadDeleted") - type="wizard-banner" + type=(concat "wizard-" wizard.id) class="no-repeat contain-image" id=(concat "wizard-step-" step.id "-banner-upload")}} diff --git a/lib/custom_wizard/field.rb b/lib/custom_wizard/field.rb index 65f29504..12c46623 100644 --- a/lib/custom_wizard/field.rb +++ b/lib/custom_wizard/field.rb @@ -11,6 +11,7 @@ class CustomWizard::Field :label, :description, :image, + :image_upload_id, :key, :validations, :min_length, diff --git a/lib/custom_wizard/step.rb b/lib/custom_wizard/step.rb index 5ffd8024..b6ba5910 100644 --- a/lib/custom_wizard/step.rb +++ b/lib/custom_wizard/step.rb @@ -16,6 +16,7 @@ class CustomWizard::Step :next, :previous, :banner, + :banner_upload_id, :disabled, :description_vars, :last_step, diff --git a/lib/custom_wizard/template.rb b/lib/custom_wizard/template.rb index b57ebbd8..9bd75307 100644 --- a/lib/custom_wizard/template.rb +++ b/lib/custom_wizard/template.rb @@ -32,6 +32,7 @@ class CustomWizard::Template end self.class.clear_cache_keys + remove_unused_wizard_upload_references @data[:id] end @@ -62,6 +63,7 @@ class CustomWizard::Template end clear_cache_keys + remove_wizard_upload_references true end @@ -176,4 +178,33 @@ class CustomWizard::Template object.delete(:index) end end + + def collect_upload_ids + upload_ids = [] + + @data[:steps].each do |step| + upload_ids << step[:banner_upload_id] if step[:banner_upload_id] + + step[:fields].each do |field| + upload_ids << field[:image_upload_id] if field[:image_upload_id] + end + end + + upload_ids + end + + def wizard_upload_references + @wizard_upload_references ||= begin + record = PluginStoreRow.find_by(plugin_name: CustomWizard::PLUGIN_NAME, key: @data[:id]) + UploadReference.where(target_type: "CustomWizard", target_id: custom_wizard_record.id) + end + end + + def remove_unused_wizard_upload_references + wizard_upload_references.where.not(upload_id: collect_upload_ids).delete_all + end + + def remove_wizard_upload_references + wizard_upload_references.delete_all + end end diff --git a/plugin.rb b/plugin.rb index b05911f7..c15ad19a 100644 --- a/plugin.rb +++ b/plugin.rb @@ -226,5 +226,21 @@ after_initialize do ::DiscourseTagging.singleton_class.prepend CustomWizardDiscourseTagging end + on(:after_upload_creation) do |upload, opts| + from_wizard = opts[:type].include?("wizard-") + wizard_id = opts[:type].split("wizard-").last + wizard_record = PluginStoreRow.find_by(plugin_name: CustomWizard::PLUGIN_NAME, key: wizard_id) + + if wizard_record + UploadReference.create( + upload_id: upload.id, + target_type: "CustomWizard", + target_id: wizard_record.id, + created_at: Time.zone.now, + updated_at: Time.zone.now + ) + end + end + DiscourseEvent.trigger(:custom_wizard_ready) end