From 20d1d310411cf2a749c92d7652b4100b7796d67e Mon Sep 17 00:00:00 2001 From: Benjamin ter Kuile Date: Fri, 9 Feb 2018 15:17:58 -0300 Subject: [PATCH] Implement experimental loading state functionality to prevent double action triggering for saving records --- addon/mixins/modal-base.coffee | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/addon/mixins/modal-base.coffee b/addon/mixins/modal-base.coffee index 4547684..c533723 100644 --- a/addon/mixins/modal-base.coffee +++ b/addon/mixins/modal-base.coffee @@ -4,6 +4,7 @@ export default Ember.Component.extend modal_options: {} layoutName: 'modals/layout' willOpenModal: -> # can be implemented, is fired after loading attributes, before rendering + is_saving: false # temporary state to prevent double triggering title: (-> # return title if directly set by options return @get('modal_options.title') if @get('modal_options.title') @@ -37,14 +38,18 @@ export default Ember.Component.extend body: (-> @get('modal_options.body') ).property('modal_options.body') + save_error: (error)-> + @set 'is_saving', false if typeof error is 'string' @set 'alert_message', error else if error?.status is 403 or error?.status is 401 @set 'alert_message', 'Unauthorized action' else @set 'alert_message', 'Something went wrong' + save_success: -> + @set 'is_saving', false @set 'alert_message', '' pre_hook_modals_count = @get('globals.modals_counter') if save_callback = @get('modal_options.save') @@ -74,6 +79,8 @@ export default Ember.Component.extend @send 'closeModal' unless @preventClose confirm: -> @send('ok') saveRecord: -> + return if @get('is_saving') + @set 'is_saving', true # prevent click enthusiasts from creating to many instances or things like that model = @get("model") if typeof model.validate is 'function' model.validate() # validate if method exists @@ -81,13 +88,17 @@ export default Ember.Component.extend changeset.validate() if changeset.get('isValid') changeset.save().then @save_success.bind(@), @save_error.bind(@) + else + @set 'is_saving', false else if model.get('isValid') model.save().then @save_success.bind(@), @save_error.bind(@) #@send 'closeModal' unless @preventClose else console.log "[VALIDATION ERRORS]" + @set 'is_saving', false console.log model.get("errors") + rollback_and_close: -> if model = @get("model") if model.__changeset__