app/assets/javascripts/fae/_modals.js in fae-rails-2.1.0 vs app/assets/javascripts/fae/_modals.js in fae-rails-2.2.0

- old
+ new

@@ -4,12 +4,23 @@ * Fae modals * @namespace */ Fae.modals = { ready: function() { + this.$body = $('body'); + this.openClass = 'modal-open'; + this.modalClass = 'MODAL_ID-modal-open'; + this.showEvent = 'modal:show'; + this.shownEvent = 'modal:shown'; + this.closeEvent = 'modal:close'; + this.closedEvent = 'modal:closed'; + this.modalOpen = false; + this.imageModals(); this.markdownModalListener(); + + this.ajaxModalListener(); }, /** * Click event to open modal with only an image */ @@ -54,7 +65,90 @@ * @fires {@link modals.markdownModal} * @has_test {features/form_helpers/fae_input_spec.rb} */ markdownModalListener: function() { FCH.$document.on('click', '.markdown-support', this.markdownModal); + }, + + /** + * load remote data, open modal view + * @see {@link modals.formModalListener} + * @has_test {features/form_helpers/fae_input_spec.rb} + */ + openAjaxModal: function (remoteUrl, relatedTarget) { + var _this = this; + + $.get(remoteUrl, function (data) { + //Open remote url content in modal window + $(data).modal({ + minHeight: "75%", + minWidth: "75%", + overlayClose: true, + zIndex: 1100, + containerId: "fae-modal", + persist: true, + opacity: 70, + overlayCss: { backgroundColor: "#000" }, + onOpen: function (dialog) { + // Fade in modal + show data + dialog.overlay.fadeIn(); + dialog.container.fadeIn(function() { + var shownEvent = $.Event(_this.shownEvent, { dialog: dialog, relatedTarget: relatedTarget }); + _this.$body.trigger(shownEvent); + }); + dialog.data.show(); + + var modalClasses = [_this.createClassFromModalId(relatedTarget.attr('id')), _this.openClass].join(' '); + + _this.modalOpen = true; + _this.$body.addClass(modalClasses); + }, + onShow: function (dialog) { + var showEvent = $.Event(_this.showEvent, { dialog: dialog, relatedTarget: relatedTarget }); + _this.$body.trigger(showEvent); + + $(dialog.container).css('height', 'auto') + }, + onClose: function (dialog) { + var closeEvent = $.Event(_this.closeEvent, { dialog: dialog, relatedTarget: relatedTarget }); + _this.$body.trigger(closeEvent); + + // Fade out modal and close + dialog.container.fadeOut(); + dialog.overlay.fadeOut(function () { + $.modal.close(); // must call this! + + var closedEvent = $.Event(_this.closedEvent, { dialog: dialog, relatedTarget: relatedTarget }); + var modalClasses = [_this.createClassFromModalId(relatedTarget.attr('id')), _this.openClass].join(' '); + + _this.modalOpen = false; + _this.$body.removeClass(modalClasses); + _this.$body.trigger(closedEvent); + }); + } + }); + + }); + }, + + /** + * Click event listener for ajax modal links triggering specific view within modal popup + * @fires {@link modals.ajaxModal} + * @has_test {features/form_helpers/fae_input_spec.rb} + */ + ajaxModalListener: function () { + var _this = this; + + FCH.$document.on('click', '.js-fae-modal', function (e) { + e.preventDefault(); + var $this = $(this); + var url = $this.attr('href'); + var id = $this.attr('id'); + + _this.openAjaxModal(url, $this) + }); + }, + + createClassFromModalId: function(modalId) { + return this.modalClass.replace('MODAL_ID', modalId); } };