diff --git a/bower.json b/bower.json index 8051bb592b..52d5d5d6c0 100644 --- a/bower.json +++ b/bower.json @@ -2,7 +2,7 @@ "name": "backbone.marionette", "description": "The Backbone Framework", "homepage": "https://marionettejs.com/", - "version": "4.0.0", + "version": "4.1.0", "main": "./dist/backbone.marionette.js", "license": "MIT", "keywords": [ diff --git a/changelog.md b/changelog.md index 6069cb556a..0c368cfb40 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,20 @@ +### v4.1.0 [view commit logs](https://github.com/marionettejs/backbone.marionette/compare/v4.0.0...v4.1.0) + +#### Features +* `CollectionView#addChildView` now accepts a `preventRender` option. +* Marionette now uses `el.ownerDocument.documentElement;` by default instead of `document.documentElement` for querying, customizable via `DomApi.getDocumentEl`. +* The UMD build now reinstates `noConflict` for using multiple versions on the global scope. + +#### Fixes +* Fixed a case where a child view could potentially get multiple `destroy` events. +* Pre-rendered views from outside of a region will now correctly empty an current view in a region if shown. +* `CollectionView`'s `emptyView` will now respect the `childViewContainer` for attachment. + +#### Misc +* Updated backbone dependency to allow for 1.4 without a warning. +* Tooling and testing was updated and improved removing gulp. +* `Region._setElement` was added for internal use, but may be made public in a future release. + ### v4.0.0 [view commit logs](https://github.com/marionettejs/backbone.marionette/compare/v3.5.1...v4.0.0) #### Breaking Changes diff --git a/dist/backbone.marionette.es6.js b/dist/backbone.marionette.es6.js new file mode 100644 index 0000000000..8921df072f --- /dev/null +++ b/dist/backbone.marionette.es6.js @@ -0,0 +1,2998 @@ +import Backbone from 'backbone'; +import _ from 'underscore'; +import Radio from 'backbone.radio'; + +var version = "4.1.0"; + +//Internal utility for creating context style global utils +var proxy = function proxy(method) { + return function (context) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + return method.apply(context, args); + }; +}; + +// Marionette.extend + +var extend = Backbone.Model.extend; + +// ---------------------- +// Pass in a mapping of events => functions or function names +// and return a mapping of events => functions + +var normalizeMethods = function normalizeMethods(hash) { + var _this = this; + + if (!hash) { + return; + } + + return _.reduce(hash, function (normalizedHash, method, name) { + if (!_.isFunction(method)) { + method = _this[method]; + } + + if (method) { + normalizedHash[name] = method; + } + + return normalizedHash; + }, {}); +}; + +// Error +var errorProps = ['description', 'fileName', 'lineNumber', 'name', 'message', 'number', 'url']; +var MarionetteError = extend.call(Error, { + urlRoot: "http://marionettejs.com/docs/v".concat(version, "/"), + url: '', + constructor: function constructor(options) { + var error = Error.call(this, options.message); + + _.extend(this, _.pick(error, errorProps), _.pick(options, errorProps)); + + if (Error.captureStackTrace) { + this.captureStackTrace(); + } + + this.url = this.urlRoot + this.url; + }, + captureStackTrace: function captureStackTrace() { + Error.captureStackTrace(this, MarionetteError); + }, + toString: function toString() { + return "".concat(this.name, ": ").concat(this.message, " See: ").concat(this.url); + } +}); + +// Bind Entity Events & Unbind Entity Events + +function normalizeBindings(context, bindings) { + if (!_.isObject(bindings)) { + throw new MarionetteError({ + message: 'Bindings must be an object.', + url: 'common.html#bindevents' + }); + } + + return normalizeMethods.call(context, bindings); +} + +function bindEvents(entity, bindings) { + if (!entity || !bindings) { + return this; + } + + this.listenTo(entity, normalizeBindings(this, bindings)); + return this; +} + +function unbindEvents(entity, bindings) { + if (!entity) { + return this; + } + + if (!bindings) { + this.stopListening(entity); + return this; + } + + this.stopListening(entity, normalizeBindings(this, bindings)); + return this; +} // Export Public API + +// Bind/Unbind Radio Requests + +function normalizeBindings$1(context, bindings) { + if (!_.isObject(bindings)) { + throw new MarionetteError({ + message: 'Bindings must be an object.', + url: 'common.html#bindrequests' + }); + } + + return normalizeMethods.call(context, bindings); +} + +function bindRequests(channel, bindings) { + if (!channel || !bindings) { + return this; + } + + channel.reply(normalizeBindings$1(this, bindings), this); + return this; +} + +function unbindRequests(channel, bindings) { + if (!channel) { + return this; + } + + if (!bindings) { + channel.stopReplying(null, null, this); + return this; + } + + channel.stopReplying(normalizeBindings$1(this, bindings)); + return this; +} + +// Marionette.getOption +// -------------------- +// Retrieve an object, function or other value from the +// object or its `options`, with `options` taking precedence. +var getOption = function getOption(optionName) { + if (!optionName) { + return; + } + + if (this.options && this.options[optionName] !== undefined) { + return this.options[optionName]; + } else { + return this[optionName]; + } +}; + +var mergeOptions = function mergeOptions(options, keys) { + var _this = this; + + if (!options) { + return; + } + + _.each(keys, function (key) { + var option = options[key]; + + if (option !== undefined) { + _this[key] = option; + } + }); +}; + +// DOM Refresh + +function triggerMethodChildren(view, event, shouldTrigger) { + if (!view._getImmediateChildren) { + return; + } + + _.each(view._getImmediateChildren(), function (child) { + if (!shouldTrigger(child)) { + return; + } + + child.triggerMethod(event, child); + }); +} + +function shouldTriggerAttach(view) { + return !view._isAttached; +} + +function shouldAttach(view) { + if (!shouldTriggerAttach(view)) { + return false; + } + + view._isAttached = true; + return true; +} + +function shouldTriggerDetach(view) { + return view._isAttached; +} + +function shouldDetach(view) { + view._isAttached = false; + return true; +} + +function triggerDOMRefresh(view) { + if (view._isAttached && view._isRendered) { + view.triggerMethod('dom:refresh', view); + } +} + +function triggerDOMRemove(view) { + if (view._isAttached && view._isRendered) { + view.triggerMethod('dom:remove', view); + } +} + +function handleBeforeAttach() { + triggerMethodChildren(this, 'before:attach', shouldTriggerAttach); +} + +function handleAttach() { + triggerMethodChildren(this, 'attach', shouldAttach); + triggerDOMRefresh(this); +} + +function handleBeforeDetach() { + triggerMethodChildren(this, 'before:detach', shouldTriggerDetach); + triggerDOMRemove(this); +} + +function handleDetach() { + triggerMethodChildren(this, 'detach', shouldDetach); +} + +function handleBeforeRender() { + triggerDOMRemove(this); +} + +function handleRender() { + triggerDOMRefresh(this); +} // Monitor a view's state, propagating attach/detach events to children and firing dom:refresh +// whenever a rendered view is attached or an attached view is rendered. + + +function monitorViewEvents(view) { + if (view._areViewEventsMonitored || view.monitorViewEvents === false) { + return; + } + + view._areViewEventsMonitored = true; + view.on({ + 'before:attach': handleBeforeAttach, + 'attach': handleAttach, + 'before:detach': handleBeforeDetach, + 'detach': handleDetach, + 'before:render': handleBeforeRender, + 'render': handleRender + }); +} + +// Trigger Method + +var splitter = /(^|:)(\w)/gi; // Only calc getOnMethodName once + +var methodCache = {}; // take the event section ("section1:section2:section3") +// and turn it in to uppercase name onSection1Section2Section3 + +function getEventName(match, prefix, eventName) { + return eventName.toUpperCase(); +} + +var getOnMethodName = function getOnMethodName(event) { + if (!methodCache[event]) { + methodCache[event] = 'on' + event.replace(splitter, getEventName); + } + + return methodCache[event]; +}; // Trigger an event and/or a corresponding method name. Examples: +// +// `this.triggerMethod("foo")` will trigger the "foo" event and +// call the "onFoo" method. +// +// `this.triggerMethod("foo:bar")` will trigger the "foo:bar" event and +// call the "onFooBar" method. + + +function triggerMethod(event) { + // get the method name from the event name + var methodName = getOnMethodName(event); + var method = getOption.call(this, methodName); + var result; // call the onMethodName if it exists + + if (_.isFunction(method)) { + // pass all args, except the event name + result = method.apply(this, _.drop(arguments)); + } // trigger the event + + + this.trigger.apply(this, arguments); + return result; +} + +var Events = { + triggerMethod: triggerMethod +}; + +var CommonMixin = { + // Imports the "normalizeMethods" to transform hashes of + // events=>function references/names to a hash of events=>function references + normalizeMethods: normalizeMethods, + _setOptions: function _setOptions(options, classOptions) { + this.options = _.extend({}, _.result(this, 'options'), options); + this.mergeOptions(options, classOptions); + }, + // A handy way to merge passed-in options onto the instance + mergeOptions: mergeOptions, + // Enable getting options from this or this.options by name. + getOption: getOption, + // Enable binding view's events from another entity. + bindEvents: bindEvents, + // Enable unbinding view's events from another entity. + unbindEvents: unbindEvents, + // Enable binding view's requests. + bindRequests: bindRequests, + // Enable unbinding view's requests. + unbindRequests: unbindRequests, + triggerMethod: triggerMethod +}; + +_.extend(CommonMixin, Backbone.Events); + +var DestroyMixin = { + _isDestroyed: false, + isDestroyed: function isDestroyed() { + return this._isDestroyed; + }, + destroy: function destroy(options) { + if (this._isDestroyed) { + return this; + } + + this.triggerMethod('before:destroy', this, options); + this._isDestroyed = true; + this.triggerMethod('destroy', this, options); + this.stopListening(); + return this; + } +}; + +// - channelName +// - radioEvents +// - radioRequests + +var RadioMixin = { + _initRadio: function _initRadio() { + var channelName = _.result(this, 'channelName'); + + if (!channelName) { + return; + } + /* istanbul ignore next */ + + + if (!Radio) { + throw new MarionetteError({ + message: 'The dependency "backbone.radio" is missing.', + url: 'backbone.radio.html#marionette-integration' + }); + } + + var channel = this._channel = Radio.channel(channelName); + + var radioEvents = _.result(this, 'radioEvents'); + + this.bindEvents(channel, radioEvents); + + var radioRequests = _.result(this, 'radioRequests'); + + this.bindRequests(channel, radioRequests); + this.on('destroy', this._destroyRadio); + }, + _destroyRadio: function _destroyRadio() { + this._channel.stopReplying(null, null, this); + }, + getChannel: function getChannel() { + return this._channel; + } +}; + +// Object +var ClassOptions = ['channelName', 'radioEvents', 'radioRequests']; // Object borrows many conventions and utilities from Backbone. + +var MarionetteObject = function MarionetteObject(options) { + this._setOptions(options, ClassOptions); + + this.cid = _.uniqueId(this.cidPrefix); + + this._initRadio(); + + this.initialize.apply(this, arguments); +}; + +MarionetteObject.extend = extend; // Object Methods +// -------------- + +_.extend(MarionetteObject.prototype, CommonMixin, DestroyMixin, RadioMixin, { + cidPrefix: 'mno', + // This is a noop method intended to be overridden + initialize: function initialize() {} +}); + +// Implementation of the invoke method (http://underscorejs.org/#invoke) with support for +var _invoke = _.invokeMap || _.invoke; + +// - behaviors +// Takes care of getting the behavior class +// given options and a key. +// If a user passes in options.behaviorClass +// default to using that. +// If a user passes in a Behavior Class directly, use that +// Otherwise an error is thrown + +function getBehaviorClass(options) { + if (options.behaviorClass) { + return { + BehaviorClass: options.behaviorClass, + options: options + }; + } //treat functions as a Behavior constructor + + + if (_.isFunction(options)) { + return { + BehaviorClass: options, + options: {} + }; + } + + throw new MarionetteError({ + message: 'Unable to get behavior class. A Behavior constructor should be passed directly or as behaviorClass property of options', + url: 'marionette.behavior.html#defining-and-attaching-behaviors' + }); +} // Iterate over the behaviors object, for each behavior +// instantiate it and get its grouped behaviors. +// This accepts a list of behaviors in either an object or array form + + +function parseBehaviors(view, behaviors, allBehaviors) { + return _.reduce(behaviors, function (reducedBehaviors, behaviorDefiniton) { + var _getBehaviorClass = getBehaviorClass(behaviorDefiniton), + BehaviorClass = _getBehaviorClass.BehaviorClass, + options = _getBehaviorClass.options; + + var behavior = new BehaviorClass(options, view); + reducedBehaviors.push(behavior); + return parseBehaviors(view, _.result(behavior, 'behaviors'), reducedBehaviors); + }, allBehaviors); +} + +var BehaviorsMixin = { + _initBehaviors: function _initBehaviors() { + this._behaviors = parseBehaviors(this, _.result(this, 'behaviors'), []); + }, + _getBehaviorTriggers: function _getBehaviorTriggers() { + var triggers = _invoke(this._behaviors, '_getTriggers'); + + return _.reduce(triggers, function (memo, _triggers) { + return _.extend(memo, _triggers); + }, {}); + }, + _getBehaviorEvents: function _getBehaviorEvents() { + var events = _invoke(this._behaviors, '_getEvents'); + + return _.reduce(events, function (memo, _events) { + return _.extend(memo, _events); + }, {}); + }, + // proxy behavior $el to the view's $el. + _proxyBehaviorViewProperties: function _proxyBehaviorViewProperties() { + _invoke(this._behaviors, 'proxyViewProperties'); + }, + // delegate modelEvents and collectionEvents + _delegateBehaviorEntityEvents: function _delegateBehaviorEntityEvents() { + _invoke(this._behaviors, 'delegateEntityEvents'); + }, + // undelegate modelEvents and collectionEvents + _undelegateBehaviorEntityEvents: function _undelegateBehaviorEntityEvents() { + _invoke(this._behaviors, 'undelegateEntityEvents'); + }, + _destroyBehaviors: function _destroyBehaviors(options) { + // Call destroy on each behavior after + // destroying the view. + // This unbinds event listeners + // that behaviors have registered for. + _invoke(this._behaviors, 'destroy', options); + }, + // Remove a behavior + _removeBehavior: function _removeBehavior(behavior) { + // Don't worry about the clean up if the view is destroyed + if (this._isDestroyed) { + return; + } // Remove behavior-only triggers and events + + + this.undelegate(".trig".concat(behavior.cid, " .").concat(behavior.cid)); + this._behaviors = _.without(this._behaviors, behavior); + }, + _bindBehaviorUIElements: function _bindBehaviorUIElements() { + _invoke(this._behaviors, 'bindUIElements'); + }, + _unbindBehaviorUIElements: function _unbindBehaviorUIElements() { + _invoke(this._behaviors, 'unbindUIElements'); + }, + _triggerEventOnBehaviors: function _triggerEventOnBehaviors(eventName, view, options) { + _invoke(this._behaviors, 'triggerMethod', eventName, view, options); + } +}; + +// - collectionEvents +// - modelEvents + +var DelegateEntityEventsMixin = { + // Handle `modelEvents`, and `collectionEvents` configuration + _delegateEntityEvents: function _delegateEntityEvents(model, collection) { + if (model) { + this._modelEvents = _.result(this, 'modelEvents'); + this.bindEvents(model, this._modelEvents); + } + + if (collection) { + this._collectionEvents = _.result(this, 'collectionEvents'); + this.bindEvents(collection, this._collectionEvents); + } + }, + // Remove any previously delegate entity events + _undelegateEntityEvents: function _undelegateEntityEvents(model, collection) { + if (this._modelEvents) { + this.unbindEvents(model, this._modelEvents); + delete this._modelEvents; + } + + if (this._collectionEvents) { + this.unbindEvents(collection, this._collectionEvents); + delete this._collectionEvents; + } + }, + // Remove cached event handlers + _deleteEntityEventHandlers: function _deleteEntityEventHandlers() { + delete this._modelEvents; + delete this._collectionEvents; + } +}; + +// - template +// - templateContext + +var TemplateRenderMixin = { + // Internal method to render the template with the serialized data + // and template context + _renderTemplate: function _renderTemplate(template) { + // Add in entity data and template context + var data = this.mixinTemplateContext(this.serializeData()) || {}; // Render and add to el + + var html = this._renderHtml(template, data); + + if (typeof html !== 'undefined') { + this.attachElContent(html); + } + }, + // Get the template for this view instance. + // You can set a `template` attribute in the view definition + // or pass a `template: TemplateFunction` parameter in + // to the constructor options. + getTemplate: function getTemplate() { + return this.template; + }, + // Mix in template context methods. Looks for a + // `templateContext` attribute, which can either be an + // object literal, or a function that returns an object + // literal. All methods and attributes from this object + // are copies to the object passed in. + mixinTemplateContext: function mixinTemplateContext(serializedData) { + var templateContext = _.result(this, 'templateContext'); + + if (!templateContext) { + return serializedData; + } + + if (!serializedData) { + return templateContext; + } + + return _.extend({}, serializedData, templateContext); + }, + // Serialize the view's model *or* collection, if + // it exists, for the template + serializeData: function serializeData() { + // If we have a model, we serialize that + if (this.model) { + return this.serializeModel(); + } // Otherwise, we serialize the collection, + // making it available under the `items` property + + + if (this.collection) { + return { + items: this.serializeCollection() + }; + } + }, + // Prepares the special `model` property of a view + // for being displayed in the template. Override this if + // you need a custom transformation for your view's model + serializeModel: function serializeModel() { + return this.model.attributes; + }, + // Serialize a collection + serializeCollection: function serializeCollection() { + return _.map(this.collection.models, function (model) { + return model.attributes; + }); + }, + // Renders the data into the template + _renderHtml: function _renderHtml(template, data) { + return template(data); + }, + // Attaches the content of a given view. + // This method can be overridden to optimize rendering, + // or to render in a non standard way. + // + // For example, using `innerHTML` instead of `$el.html` + // + // ```js + // attachElContent(html) { + // this.el.innerHTML = html; + // } + // ``` + attachElContent: function attachElContent(html) { + this.Dom.setContents(this.el, html, this.$el); + } +}; + +// Borrow event splitter from Backbone +var delegateEventSplitter = /^(\S+)\s*(.*)$/; // Set event name to be namespaced using a unique index +// to generate a non colliding event namespace +// http://api.jquery.com/event.namespace/ + +var getNamespacedEventName = function getNamespacedEventName(eventName, namespace) { + var match = eventName.match(delegateEventSplitter); + return "".concat(match[1], ".").concat(namespace, " ").concat(match[2]); +}; + +// Add Feature flags here +// e.g. 'class' => false +var FEATURES = { + childViewEventPrefix: false, + triggersStopPropagation: true, + triggersPreventDefault: true, + DEV_MODE: false +}; + +function isEnabled(name) { + return !!FEATURES[name]; +} + +function setEnabled(name, state) { + return FEATURES[name] = state; +} + +// 'click:foo' + +function buildViewTrigger(view, triggerDef) { + if (_.isString(triggerDef)) { + triggerDef = { + event: triggerDef + }; + } + + var eventName = triggerDef.event; + var shouldPreventDefault = !!triggerDef.preventDefault; + + if (isEnabled('triggersPreventDefault')) { + shouldPreventDefault = triggerDef.preventDefault !== false; + } + + var shouldStopPropagation = !!triggerDef.stopPropagation; + + if (isEnabled('triggersStopPropagation')) { + shouldStopPropagation = triggerDef.stopPropagation !== false; + } + + return function (event) { + if (shouldPreventDefault) { + event.preventDefault(); + } + + if (shouldStopPropagation) { + event.stopPropagation(); + } + + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + view.triggerMethod.apply(view, [eventName, view, event].concat(args)); + }; +} + +var TriggersMixin = { + // Configure `triggers` to forward DOM events to view + // events. `triggers: {"click .foo": "do:foo"}` + _getViewTriggers: function _getViewTriggers(view, triggers) { + var _this = this; + + // Configure the triggers, prevent default + // action and stop propagation of DOM events + return _.reduce(triggers, function (events, value, key) { + key = getNamespacedEventName(key, "trig".concat(_this.cid)); + events[key] = buildViewTrigger(view, value); + return events; + }, {}); + } +}; + +// a given key for triggers and events +// swaps the @ui with the associated selector. +// Returns a new, non-mutated, parsed events hash. + +var _normalizeUIKeys = function normalizeUIKeys(hash, ui) { + return _.reduce(hash, function (memo, val, key) { + var normalizedKey = _normalizeUIString(key, ui); + + memo[normalizedKey] = val; + return memo; + }, {}); +}; + +var uiRegEx = /@ui\.[a-zA-Z-_$0-9]*/g; // utility method for parsing @ui. syntax strings +// into associated selector + +var _normalizeUIString = function normalizeUIString(uiString, ui) { + return uiString.replace(uiRegEx, function (r) { + return ui[r.slice(4)]; + }); +}; // allows for the use of the @ui. syntax within +// a given value for regions +// swaps the @ui with the associated selector + + +var _normalizeUIValues = function normalizeUIValues(hash, ui, property) { + _.each(hash, function (val, key) { + if (_.isString(val)) { + hash[key] = _normalizeUIString(val, ui); + } else if (val) { + var propertyVal = val[property]; + + if (_.isString(propertyVal)) { + val[property] = _normalizeUIString(propertyVal, ui); + } + } + }); + + return hash; +}; + +var UIMixin = { + // normalize the keys of passed hash with the views `ui` selectors. + // `{"@ui.foo": "bar"}` + normalizeUIKeys: function normalizeUIKeys(hash) { + var uiBindings = this._getUIBindings(); + + return _normalizeUIKeys(hash, uiBindings); + }, + // normalize the passed string with the views `ui` selectors. + // `"@ui.bar"` + normalizeUIString: function normalizeUIString(uiString) { + var uiBindings = this._getUIBindings(); + + return _normalizeUIString(uiString, uiBindings); + }, + // normalize the values of passed hash with the views `ui` selectors. + // `{foo: "@ui.bar"}` + normalizeUIValues: function normalizeUIValues(hash, property) { + var uiBindings = this._getUIBindings(); + + return _normalizeUIValues(hash, uiBindings, property); + }, + _getUIBindings: function _getUIBindings() { + var uiBindings = _.result(this, '_uiBindings'); + + return uiBindings || _.result(this, 'ui'); + }, + // This method binds the elements specified in the "ui" hash inside the view's code with + // the associated jQuery selectors. + _bindUIElements: function _bindUIElements() { + var _this = this; + + if (!this.ui) { + return; + } // store the ui hash in _uiBindings so they can be reset later + // and so re-rendering the view will be able to find the bindings + + + if (!this._uiBindings) { + this._uiBindings = this.ui; + } // get the bindings result, as a function or otherwise + + + var bindings = _.result(this, '_uiBindings'); // empty the ui so we don't have anything to start with + + + this._ui = {}; // bind each of the selectors + + _.each(bindings, function (selector, key) { + _this._ui[key] = _this.$(selector); + }); + + this.ui = this._ui; + }, + _unbindUIElements: function _unbindUIElements() { + var _this2 = this; + + if (!this.ui || !this._uiBindings) { + return; + } // delete all of the existing ui bindings + + + _.each(this.ui, function ($el, name) { + delete _this2.ui[name]; + }); // reset the ui element to the original bindings configuration + + + this.ui = this._uiBindings; + delete this._uiBindings; + delete this._ui; + }, + _getUI: function _getUI(name) { + return this._ui[name]; + } +}; + +// DomApi + +function _getEl(el) { + return el instanceof Backbone.$ ? el : Backbone.$(el); +} // Static setter + + +function setDomApi(mixin) { + this.prototype.Dom = _.extend({}, this.prototype.Dom, mixin); + return this; +} +var DomApi = { + // Returns a new HTML DOM node instance + createBuffer: function createBuffer() { + return document.createDocumentFragment(); + }, + // Returns the document element for a given DOM element + getDocumentEl: function getDocumentEl(el) { + return el.ownerDocument.documentElement; + }, + // Lookup the `selector` string + // Selector may also be a DOM element + // Returns an array-like object of nodes + getEl: function getEl(selector) { + return _getEl(selector); + }, + // Finds the `selector` string with the el + // Returns an array-like object of nodes + findEl: function findEl(el, selector) { + return _getEl(el).find(selector); + }, + // Returns true if the el contains the node childEl + hasEl: function hasEl(el, childEl) { + return el.contains(childEl && childEl.parentNode); + }, + // Detach `el` from the DOM without removing listeners + detachEl: function detachEl(el) { + var _$el = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _getEl(el); + + _$el.detach(); + }, + // Remove `oldEl` from the DOM and put `newEl` in its place + replaceEl: function replaceEl(newEl, oldEl) { + if (newEl === oldEl) { + return; + } + + var parent = oldEl.parentNode; + + if (!parent) { + return; + } + + parent.replaceChild(newEl, oldEl); + }, + // Swaps the location of `el1` and `el2` in the DOM + swapEl: function swapEl(el1, el2) { + if (el1 === el2) { + return; + } + + var parent1 = el1.parentNode; + var parent2 = el2.parentNode; + + if (!parent1 || !parent2) { + return; + } + + var next1 = el1.nextSibling; + var next2 = el2.nextSibling; + parent1.insertBefore(el2, next1); + parent2.insertBefore(el1, next2); + }, + // Replace the contents of `el` with the HTML string of `html` + setContents: function setContents(el, html) { + var _$el = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _getEl(el); + + _$el.html(html); + }, + // Takes the DOM node `el` and appends the DOM node `contents` + // to the end of the element's contents. + appendContents: function appendContents(el, contents) { + var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, + _ref$_$el = _ref._$el, + _$el = _ref$_$el === void 0 ? _getEl(el) : _ref$_$el, + _ref$_$contents = _ref._$contents, + _$contents = _ref$_$contents === void 0 ? _getEl(contents) : _ref$_$contents; + + _$el.append(_$contents); + }, + // Does the el have child nodes + hasContents: function hasContents(el) { + return !!el && el.hasChildNodes(); + }, + // Remove the inner contents of `el` from the DOM while leaving + // `el` itself in the DOM. + detachContents: function detachContents(el) { + var _$el = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _getEl(el); + + _$el.contents().detach(); + } +}; + +// ViewMixin +// - behaviors +// - childViewEventPrefix +// - childViewEvents +// - childViewTriggers +// - collectionEvents +// - modelEvents +// - triggers +// - ui + +var ViewMixin = { + Dom: DomApi, + _isElAttached: function _isElAttached() { + return !!this.el && this.Dom.hasEl(this.Dom.getDocumentEl(this.el), this.el); + }, + supportsRenderLifecycle: true, + supportsDestroyLifecycle: true, + _isDestroyed: false, + isDestroyed: function isDestroyed() { + return !!this._isDestroyed; + }, + _isRendered: false, + isRendered: function isRendered() { + return !!this._isRendered; + }, + _isAttached: false, + isAttached: function isAttached() { + return !!this._isAttached; + }, + // Overriding Backbone.View's `delegateEvents` to handle + // `events` and `triggers` + delegateEvents: function delegateEvents(events) { + this._proxyBehaviorViewProperties(); + + this._buildEventProxies(); + + var combinedEvents = _.extend({}, this._getBehaviorEvents(), this._getEvents(events), this._getBehaviorTriggers(), this._getTriggers()); + + Backbone.View.prototype.delegateEvents.call(this, combinedEvents); + return this; + }, + // Allows Backbone.View events to utilize `@ui.` selectors + _getEvents: function _getEvents(events) { + if (events) { + return this.normalizeUIKeys(events); + } + + if (!this.events) { + return; + } + + return this.normalizeUIKeys(_.result(this, 'events')); + }, + // Configure `triggers` to forward DOM events to view + // events. `triggers: {"click .foo": "do:foo"}` + _getTriggers: function _getTriggers() { + if (!this.triggers) { + return; + } // Allow `triggers` to be configured as a function + + + var triggers = this.normalizeUIKeys(_.result(this, 'triggers')); // Configure the triggers, prevent default + // action and stop propagation of DOM events + + return this._getViewTriggers(this, triggers); + }, + // Handle `modelEvents`, and `collectionEvents` configuration + delegateEntityEvents: function delegateEntityEvents() { + this._delegateEntityEvents(this.model, this.collection); // bind each behaviors model and collection events + + + this._delegateBehaviorEntityEvents(); + + return this; + }, + // Handle unbinding `modelEvents`, and `collectionEvents` configuration + undelegateEntityEvents: function undelegateEntityEvents() { + this._undelegateEntityEvents(this.model, this.collection); // unbind each behaviors model and collection events + + + this._undelegateBehaviorEntityEvents(); + + return this; + }, + // Handle destroying the view and its children. + destroy: function destroy(options) { + if (this._isDestroyed || this._isDestroying) { + return this; + } + + this._isDestroying = true; + var shouldTriggerDetach = this._isAttached && !this._disableDetachEvents; + this.triggerMethod('before:destroy', this, options); + + if (shouldTriggerDetach) { + this.triggerMethod('before:detach', this); + } // unbind UI elements + + + this.unbindUIElements(); // remove the view from the DOM + + this._removeElement(); + + if (shouldTriggerDetach) { + this._isAttached = false; + this.triggerMethod('detach', this); + } // remove children after the remove to prevent extra paints + + + this._removeChildren(); + + this._isDestroyed = true; + this._isRendered = false; // Destroy behaviors after _isDestroyed flag + + this._destroyBehaviors(options); + + this._deleteEntityEventHandlers(); + + this.triggerMethod('destroy', this, options); + + this._triggerEventOnBehaviors('destroy', this, options); + + this.stopListening(); + return this; + }, + // Equates to this.$el.remove + _removeElement: function _removeElement() { + this.$el.off().removeData(); + this.Dom.detachEl(this.el, this.$el); + }, + // This method binds the elements specified in the "ui" hash + bindUIElements: function bindUIElements() { + this._bindUIElements(); + + this._bindBehaviorUIElements(); + + return this; + }, + // This method unbinds the elements specified in the "ui" hash + unbindUIElements: function unbindUIElements() { + this._unbindUIElements(); + + this._unbindBehaviorUIElements(); + + return this; + }, + getUI: function getUI(name) { + return this._getUI(name); + }, + // Cache `childViewEvents` and `childViewTriggers` + _buildEventProxies: function _buildEventProxies() { + this._childViewEvents = this.normalizeMethods(_.result(this, 'childViewEvents')); + this._childViewTriggers = _.result(this, 'childViewTriggers'); + this._eventPrefix = this._getEventPrefix(); + }, + _getEventPrefix: function _getEventPrefix() { + var defaultPrefix = isEnabled('childViewEventPrefix') ? 'childview' : false; + + var prefix = _.result(this, 'childViewEventPrefix', defaultPrefix); + + return prefix === false ? prefix : prefix + ':'; + }, + _proxyChildViewEvents: function _proxyChildViewEvents(view) { + if (this._childViewEvents || this._childViewTriggers || this._eventPrefix) { + this.listenTo(view, 'all', this._childViewEventHandler); + } + }, + _childViewEventHandler: function _childViewEventHandler(eventName) { + var childViewEvents = this._childViewEvents; // call collectionView childViewEvent if defined + + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + if (childViewEvents && childViewEvents[eventName]) { + childViewEvents[eventName].apply(this, args); + } // use the parent view's proxyEvent handlers + + + var childViewTriggers = this._childViewTriggers; // Call the event with the proxy name on the parent layout + + if (childViewTriggers && childViewTriggers[eventName]) { + this.triggerMethod.apply(this, [childViewTriggers[eventName]].concat(args)); + } + + if (this._eventPrefix) { + this.triggerMethod.apply(this, [this._eventPrefix + eventName].concat(args)); + } + } +}; + +_.extend(ViewMixin, BehaviorsMixin, CommonMixin, DelegateEntityEventsMixin, TemplateRenderMixin, TriggersMixin, UIMixin); + +function renderView(view) { + if (view._isRendered) { + return; + } + + if (!view.supportsRenderLifecycle) { + view.triggerMethod('before:render', view); + } + + view.render(); + view._isRendered = true; + + if (!view.supportsRenderLifecycle) { + view.triggerMethod('render', view); + } +} +function destroyView(view, disableDetachEvents) { + if (view.destroy) { + // Attach flag for public destroy function internal check + view._disableDetachEvents = disableDetachEvents; + view.destroy(); + return; + } // Destroy for non-Marionette Views + + + if (!view.supportsDestroyLifecycle) { + view.triggerMethod('before:destroy', view); + } + + var shouldTriggerDetach = view._isAttached && !disableDetachEvents; + + if (shouldTriggerDetach) { + view.triggerMethod('before:detach', view); + } + + view.remove(); + + if (shouldTriggerDetach) { + view._isAttached = false; + view.triggerMethod('detach', view); + } + + view._isDestroyed = true; + + if (!view.supportsDestroyLifecycle) { + view.triggerMethod('destroy', view); + } +} + +// Region +var classErrorName = 'RegionError'; +var ClassOptions$1 = ['allowMissingEl', 'parentEl', 'replaceElement']; + +var Region = function Region(options) { + this._setOptions(options, ClassOptions$1); + + this.cid = _.uniqueId(this.cidPrefix); // getOption necessary because options.el may be passed as undefined + + this._initEl = this.el = this.getOption('el'); // Handle when this.el is passed in as a $ wrapped element. + + this.el = this.el instanceof Backbone.$ ? this.el[0] : this.el; + + this._setEl(); + + this.initialize.apply(this, arguments); +}; + +Region.extend = extend; +Region.setDomApi = setDomApi; // Region Methods +// -------------- + +_.extend(Region.prototype, CommonMixin, { + Dom: DomApi, + cidPrefix: 'mnr', + replaceElement: false, + _isReplaced: false, + _isSwappingView: false, + // This is a noop method intended to be overridden + initialize: function initialize() {}, + // Displays a view instance inside of the region. If necessary handles calling the `render` + // method for you. Reads content directly from the `el` attribute. + show: function show(view, options) { + if (!this._ensureElement(options)) { + return; + } + + view = this._getView(view, options); + + if (view === this.currentView) { + return this; + } + + if (view._isShown) { + throw new MarionetteError({ + name: classErrorName, + message: 'View is already shown in a Region or CollectionView', + url: 'marionette.collectionview.html#region-viewAlreadyShown' + }); + } + + this._isSwappingView = !!this.currentView; + this.triggerMethod('before:show', this, view, options); // Assume an attached view is already in the region for pre-existing DOM + + if (this.currentView || !view._isAttached) { + this.empty(options); + } + + this._setupChildView(view); + + this.currentView = view; + renderView(view); + + this._attachView(view, options); + + this.triggerMethod('show', this, view, options); + this._isSwappingView = false; + return this; + }, + _setEl: function _setEl() { + if (!this.el) { + throw new MarionetteError({ + name: classErrorName, + message: 'An "el" must be specified for a region.', + url: 'marionette.region.html#additional-options' + }); + } + + this.$el = this.getEl(this.el); + + if (this.$el.length) { + this.el = this.$el[0]; + } // Make sure the $el contains only the el + + + if (this.$el.length > 1) { + this.$el = this.Dom.getEl(this.el); + } + }, + // Set the `el` of the region and move any current view to the new `el`. + _setElement: function _setElement(el) { + if (el === this.el) { + return this; + } + + var shouldReplace = this._isReplaced; + + this._restoreEl(); + + this.el = el; + + this._setEl(); + + if (this.currentView) { + var view = this.currentView; + + if (shouldReplace) { + this._replaceEl(view); + } else { + this.attachHtml(view); + } + } + + return this; + }, + _setupChildView: function _setupChildView(view) { + monitorViewEvents(view); + + this._proxyChildViewEvents(view); // We need to listen for if a view is destroyed in a way other than through the region. + // If this happens we need to remove the reference to the currentView since once a view + // has been destroyed we can not reuse it. + + + view.on('destroy', this._empty, this); + }, + _proxyChildViewEvents: function _proxyChildViewEvents(view) { + var parentView = this._parentView; + + if (!parentView) { + return; + } + + parentView._proxyChildViewEvents(view); + }, + // If the regions parent view is not monitoring its attach/detach events + _shouldDisableMonitoring: function _shouldDisableMonitoring() { + return this._parentView && this._parentView.monitorViewEvents === false; + }, + _isElAttached: function _isElAttached() { + return this.Dom.hasEl(this.Dom.getDocumentEl(this.el), this.el); + }, + _attachView: function _attachView(view) { + var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + replaceElement = _ref.replaceElement; + + var shouldTriggerAttach = !view._isAttached && this._isElAttached() && !this._shouldDisableMonitoring(); + var shouldReplaceEl = typeof replaceElement === 'undefined' ? !!_.result(this, 'replaceElement') : !!replaceElement; + + if (shouldTriggerAttach) { + view.triggerMethod('before:attach', view); + } + + if (shouldReplaceEl) { + this._replaceEl(view); + } else { + this.attachHtml(view); + } + + if (shouldTriggerAttach) { + view._isAttached = true; + view.triggerMethod('attach', view); + } // Corresponds that view is shown in a marionette Region or CollectionView + + + view._isShown = true; + }, + _ensureElement: function _ensureElement() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + if (!_.isObject(this.el)) { + this._setEl(); + } + + if (!this.$el || this.$el.length === 0) { + var allowMissingEl = typeof options.allowMissingEl === 'undefined' ? !!_.result(this, 'allowMissingEl') : !!options.allowMissingEl; + + if (allowMissingEl) { + return false; + } else { + throw new MarionetteError({ + name: classErrorName, + message: "An \"el\" must exist in DOM for this region ".concat(this.cid), + url: 'marionette.region.html#additional-options' + }); + } + } + + return true; + }, + _getView: function _getView(view) { + if (!view) { + throw new MarionetteError({ + name: classErrorName, + message: 'The view passed is undefined and therefore invalid. You must pass a view instance to show.', + url: 'marionette.region.html#showing-a-view' + }); + } + + if (view._isDestroyed) { + throw new MarionetteError({ + name: classErrorName, + message: "View (cid: \"".concat(view.cid, "\") has already been destroyed and cannot be used."), + url: 'marionette.region.html#showing-a-view' + }); + } + + if (view instanceof Backbone.View) { + return view; + } + + var viewOptions = this._getViewOptions(view); + + return new View(viewOptions); + }, + // This allows for a template or a static string to be + // used as a template + _getViewOptions: function _getViewOptions(viewOptions) { + if (_.isFunction(viewOptions)) { + return { + template: viewOptions + }; + } + + if (_.isObject(viewOptions)) { + return viewOptions; + } + + var template = function template() { + return viewOptions; + }; + + return { + template: template + }; + }, + // Override this method to change how the region finds the DOM element that it manages. Return + // a jQuery selector object scoped to a provided parent el or the document if none exists. + getEl: function getEl(el) { + var context = _.result(this, 'parentEl'); + + if (context && _.isString(el)) { + return this.Dom.findEl(context, el); + } + + return this.Dom.getEl(el); + }, + _replaceEl: function _replaceEl(view) { + // Always restore the el to ensure the regions el is present before replacing + this._restoreEl(); + + view.on('before:destroy', this._restoreEl, this); + this.Dom.replaceEl(view.el, this.el); + this._isReplaced = true; + }, + // Restore the region's element in the DOM. + _restoreEl: function _restoreEl() { + // There is nothing to replace + if (!this._isReplaced) { + return; + } + + var view = this.currentView; + + if (!view) { + return; + } + + this._detachView(view); + + this._isReplaced = false; + }, + // Check to see if the region's el was replaced. + isReplaced: function isReplaced() { + return !!this._isReplaced; + }, + // Check to see if a view is being swapped by another + isSwappingView: function isSwappingView() { + return !!this._isSwappingView; + }, + // Override this method to change how the new view is appended to the `$el` that the + // region is managing + attachHtml: function attachHtml(view) { + this.Dom.appendContents(this.el, view.el, { + _$el: this.$el, + _$contents: view.$el + }); + }, + // Destroy the current view, if there is one. If there is no current view, + // it will detach any html inside the region's `el`. + empty: function empty() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { + allowMissingEl: true + }; + var view = this.currentView; // If there is no view in the region we should only detach current html + + if (!view) { + if (this._ensureElement(options)) { + this.detachHtml(); + } + + return this; + } + + this._empty(view, true); + + return this; + }, + _empty: function _empty(view, shouldDestroy) { + view.off('destroy', this._empty, this); + this.triggerMethod('before:empty', this, view); + + this._restoreEl(); + + delete this.currentView; + + if (!view._isDestroyed) { + if (shouldDestroy) { + this.removeView(view); + } else { + this._detachView(view); + } + + view._isShown = false; + + this._stopChildViewEvents(view); + } + + this.triggerMethod('empty', this, view); + }, + _stopChildViewEvents: function _stopChildViewEvents(view) { + var parentView = this._parentView; + + if (!parentView) { + return; + } + + this._parentView.stopListening(view); + }, + // Non-Marionette safe view.destroy + destroyView: function destroyView$1(view) { + if (view._isDestroyed) { + return view; + } + + destroyView(view, this._shouldDisableMonitoring()); + + return view; + }, + // Override this method to determine what happens when the view + // is removed from the region when the view is not being detached + removeView: function removeView(view) { + this.destroyView(view); + }, + // Empties the Region without destroying the view + // Returns the detached view + detachView: function detachView() { + var view = this.currentView; + + if (!view) { + return; + } + + this._empty(view); + + return view; + }, + _detachView: function _detachView(view) { + var shouldTriggerDetach = view._isAttached && !this._shouldDisableMonitoring(); + var shouldRestoreEl = this._isReplaced; + + if (shouldTriggerDetach) { + view.triggerMethod('before:detach', view); + } + + if (shouldRestoreEl) { + this.Dom.replaceEl(this.el, view.el); + } else { + this.detachHtml(); + } + + if (shouldTriggerDetach) { + view._isAttached = false; + view.triggerMethod('detach', view); + } + }, + // Override this method to change how the region detaches current content + detachHtml: function detachHtml() { + this.Dom.detachContents(this.el, this.$el); + }, + // Checks whether a view is currently present within the region. Returns `true` if there is + // and `false` if no view is present. + hasView: function hasView() { + return !!this.currentView; + }, + // Reset the region by destroying any existing view and clearing out the cached `$el`. + // The next time a view is shown via this region, the region will re-query the DOM for + // the region's `el`. + reset: function reset(options) { + this.empty(options); + this.el = this._initEl; + delete this.$el; + return this; + }, + _isDestroyed: false, + isDestroyed: function isDestroyed() { + return this._isDestroyed; + }, + // Destroy the region, remove any child view + // and remove the region from any associated view + destroy: function destroy(options) { + if (this._isDestroyed) { + return this; + } + + this.triggerMethod('before:destroy', this, options); + this._isDestroyed = true; + this.reset(options); + + if (this._name) { + this._parentView._removeReferences(this._name); + } + + delete this._parentView; + delete this._name; + this.triggerMethod('destroy', this, options); + this.stopListening(); + return this; + } +}); + +function buildRegion (definition, defaults) { + if (definition instanceof Region) { + return definition; + } + + if (_.isString(definition)) { + return buildRegionFromObject(defaults, { + el: definition + }); + } + + if (_.isFunction(definition)) { + return buildRegionFromObject(defaults, { + regionClass: definition + }); + } + + if (_.isObject(definition)) { + return buildRegionFromObject(defaults, definition); + } + + throw new MarionetteError({ + message: 'Improper region configuration type.', + url: 'marionette.region.html#defining-regions' + }); +} + +function buildRegionFromObject(defaults, definition) { + var options = _.extend({}, defaults, definition); + + var RegionClass = options.regionClass; + delete options.regionClass; + return new RegionClass(options); +} + +// - regions +// - regionClass + +var RegionsMixin = { + regionClass: Region, + // Internal method to initialize the regions that have been defined in a + // `regions` attribute on this View. + _initRegions: function _initRegions() { + // init regions hash + this.regions = this.regions || {}; + this._regions = {}; + this.addRegions(_.result(this, 'regions')); + }, + // Internal method to re-initialize all of the regions by updating + // the `el` that they point to + _reInitRegions: function _reInitRegions() { + _invoke(this._regions, 'reset'); + }, + // Add a single region, by name, to the View + addRegion: function addRegion(name, definition) { + var regions = {}; + regions[name] = definition; + return this.addRegions(regions)[name]; + }, + // Add multiple regions as a {name: definition, name2: def2} object literal + addRegions: function addRegions(regions) { + // If there's nothing to add, stop here. + if (_.isEmpty(regions)) { + return; + } // Normalize region selectors hash to allow + // a user to use the @ui. syntax. + + + regions = this.normalizeUIValues(regions, 'el'); // Add the regions definitions to the regions property + + this.regions = _.extend({}, this.regions, regions); + return this._addRegions(regions); + }, + // internal method to build and add regions + _addRegions: function _addRegions(regionDefinitions) { + var _this = this; + + var defaults = { + regionClass: this.regionClass, + parentEl: _.partial(_.result, this, 'el') + }; + return _.reduce(regionDefinitions, function (regions, definition, name) { + regions[name] = buildRegion(definition, defaults); + + _this._addRegion(regions[name], name); + + return regions; + }, {}); + }, + _addRegion: function _addRegion(region, name) { + this.triggerMethod('before:add:region', this, name, region); + region._parentView = this; + region._name = name; + this._regions[name] = region; + this.triggerMethod('add:region', this, name, region); + }, + // Remove a single region from the View, by name + removeRegion: function removeRegion(name) { + var region = this._regions[name]; + + this._removeRegion(region, name); + + return region; + }, + // Remove all regions from the View + removeRegions: function removeRegions() { + var regions = this._getRegions(); + + _.each(this._regions, this._removeRegion.bind(this)); + + return regions; + }, + _removeRegion: function _removeRegion(region, name) { + this.triggerMethod('before:remove:region', this, name, region); + region.destroy(); + this.triggerMethod('remove:region', this, name, region); + }, + // Called in a region's destroy + _removeReferences: function _removeReferences(name) { + delete this.regions[name]; + delete this._regions[name]; + }, + // Empty all regions in the region manager, but + // leave them attached + emptyRegions: function emptyRegions() { + var regions = this.getRegions(); + + _invoke(regions, 'empty'); + + return regions; + }, + // Checks to see if view contains region + // Accepts the region name + // hasRegion('main') + hasRegion: function hasRegion(name) { + return !!this.getRegion(name); + }, + // Provides access to regions + // Accepts the region name + // getRegion('main') + getRegion: function getRegion(name) { + if (!this._isRendered) { + this.render(); + } + + return this._regions[name]; + }, + _getRegions: function _getRegions() { + return _.clone(this._regions); + }, + // Get all regions + getRegions: function getRegions() { + if (!this._isRendered) { + this.render(); + } + + return this._getRegions(); + }, + showChildView: function showChildView(name, view, options) { + var region = this.getRegion(name); + region.show(view, options); + return view; + }, + detachChildView: function detachChildView(name) { + return this.getRegion(name).detachView(); + }, + getChildView: function getChildView(name) { + return this.getRegion(name).currentView; + } +}; + +// Static setter for the renderer +function setRenderer(renderer) { + this.prototype._renderHtml = renderer; + return this; +} + +// View +var ClassOptions$2 = ['behaviors', 'childViewEventPrefix', 'childViewEvents', 'childViewTriggers', 'collectionEvents', 'events', 'modelEvents', 'regionClass', 'regions', 'template', 'templateContext', 'triggers', 'ui']; // Used by _getImmediateChildren + +function childReducer(children, region) { + if (region.currentView) { + children.push(region.currentView); + } + + return children; +} // The standard view. Includes view events, automatic rendering +// templates, nested views, and more. + + +var View = Backbone.View.extend({ + constructor: function constructor(options) { + this._setOptions(options, ClassOptions$2); + + monitorViewEvents(this); + + this._initBehaviors(); + + this._initRegions(); + + Backbone.View.prototype.constructor.apply(this, arguments); + this.delegateEntityEvents(); + + this._triggerEventOnBehaviors('initialize', this, options); + }, + // Overriding Backbone.View's `setElement` to handle + // if an el was previously defined. If so, the view might be + // rendered or attached on setElement. + setElement: function setElement() { + Backbone.View.prototype.setElement.apply(this, arguments); + this._isRendered = this.Dom.hasContents(this.el); + this._isAttached = this._isElAttached(); + + if (this._isRendered) { + this.bindUIElements(); + } + + return this; + }, + // If a template is available, renders it into the view's `el` + // Re-inits regions and binds UI. + render: function render() { + var template = this.getTemplate(); + + if (template === false || this._isDestroyed) { + return this; + } + + this.triggerMethod('before:render', this); // If this is not the first render call, then we need to + // re-initialize the `el` for each region + + if (this._isRendered) { + this._reInitRegions(); + } + + this._renderTemplate(template); + + this.bindUIElements(); + this._isRendered = true; + this.triggerMethod('render', this); + return this; + }, + // called by ViewMixin destroy + _removeChildren: function _removeChildren() { + this.removeRegions(); + }, + _getImmediateChildren: function _getImmediateChildren() { + return _.reduce(this._regions, childReducer, []); + } +}, { + setRenderer: setRenderer, + setDomApi: setDomApi +}); + +_.extend(View.prototype, ViewMixin, RegionsMixin); + +// shut down child views. + +var Container = function Container() { + this._init(); +}; // Mix in methods from Underscore, for iteration, and other +// collection related features. +// Borrowing this code from Backbone.Collection: +// https://github.com/jashkenas/backbone/blob/1.1.2/backbone.js#L962 + + +var methods = ['forEach', 'each', 'map', 'find', 'detect', 'filter', 'select', 'reject', 'every', 'all', 'some', 'any', 'include', 'contains', 'invoke', 'toArray', 'first', 'initial', 'rest', 'last', 'without', 'isEmpty', 'pluck', 'reduce', 'partition']; + +_.each(methods, function (method) { + Container.prototype[method] = function () { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + return _[method].apply(_, [this._views].concat(args)); + }; +}); + +function stringComparator(comparator, view) { + return view.model && view.model.get(comparator); +} // Container Methods +// ----------------- + + +_.extend(Container.prototype, { + // Initializes an empty container + _init: function _init() { + this._views = []; + this._viewsByCid = {}; + this._indexByModel = {}; + + this._updateLength(); + }, + // Add a view to this container. Stores the view + // by `cid` and makes it searchable by the model + // cid (and model itself). Additionally it stores + // the view by index in the _views array + _add: function _add(view) { + var index = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this._views.length; + + this._addViewIndexes(view); // add to end by default + + + this._views.splice(index, 0, view); + + this._updateLength(); + }, + _addViewIndexes: function _addViewIndexes(view) { + // store the view + this._viewsByCid[view.cid] = view; // index it by model + + if (view.model) { + this._indexByModel[view.model.cid] = view; + } + }, + // Sort (mutate) and return the array of the child views. + _sort: function _sort(comparator, context) { + if (typeof comparator === 'string') { + comparator = _.partial(stringComparator, comparator); + return this._sortBy(comparator); + } + + if (comparator.length === 1) { + return this._sortBy(comparator.bind(context)); + } + + return this._views.sort(comparator.bind(context)); + }, + // Makes `_.sortBy` mutate the array to match `this._views.sort` + _sortBy: function _sortBy(comparator) { + var sortedViews = _.sortBy(this._views, comparator); + + this._set(sortedViews); + + return sortedViews; + }, + // Replace array contents without overwriting the reference. + // Should not add/remove views + _set: function _set(views, shouldReset) { + this._views.length = 0; + + this._views.push.apply(this._views, views.slice(0)); + + if (shouldReset) { + this._viewsByCid = {}; + this._indexByModel = {}; + + _.each(views, this._addViewIndexes.bind(this)); + + this._updateLength(); + } + }, + // Swap views by index + _swap: function _swap(view1, view2) { + var view1Index = this.findIndexByView(view1); + var view2Index = this.findIndexByView(view2); + + if (view1Index === -1 || view2Index === -1) { + return; + } + + var swapView = this._views[view1Index]; + this._views[view1Index] = this._views[view2Index]; + this._views[view2Index] = swapView; + }, + // Find a view by the model that was attached to it. + // Uses the model's `cid` to find it. + findByModel: function findByModel(model) { + return this.findByModelCid(model.cid); + }, + // Find a view by the `cid` of the model that was attached to it. + findByModelCid: function findByModelCid(modelCid) { + return this._indexByModel[modelCid]; + }, + // Find a view by index. + findByIndex: function findByIndex(index) { + return this._views[index]; + }, + // Find the index of a view instance + findIndexByView: function findIndexByView(view) { + return this._views.indexOf(view); + }, + // Retrieve a view by its `cid` directly + findByCid: function findByCid(cid) { + return this._viewsByCid[cid]; + }, + hasView: function hasView(view) { + return !!this.findByCid(view.cid); + }, + // Remove a view and clean up index references. + _remove: function _remove(view) { + if (!this._viewsByCid[view.cid]) { + return; + } // delete model index + + + if (view.model) { + delete this._indexByModel[view.model.cid]; + } // remove the view from the container + + + delete this._viewsByCid[view.cid]; + var index = this.findIndexByView(view); + + this._views.splice(index, 1); + + this._updateLength(); + }, + // Update the `.length` attribute on this container + _updateLength: function _updateLength() { + this.length = this._views.length; + } +}); + +// Collection View +var classErrorName$1 = 'CollectionViewError'; +var ClassOptions$3 = ['behaviors', 'childView', 'childViewContainer', 'childViewEventPrefix', 'childViewEvents', 'childViewOptions', 'childViewTriggers', 'collectionEvents', 'emptyView', 'emptyViewOptions', 'events', 'modelEvents', 'sortWithCollection', 'template', 'templateContext', 'triggers', 'ui', 'viewComparator', 'viewFilter']; // A view that iterates over a Backbone.Collection +// and renders an individual child view for each model. + +var CollectionView = Backbone.View.extend({ + // flag for maintaining the sorted order of the collection + sortWithCollection: true, + // constructor + constructor: function constructor(options) { + this._setOptions(options, ClassOptions$3); + + monitorViewEvents(this); + + this._initChildViewStorage(); + + this._initBehaviors(); + + Backbone.View.prototype.constructor.apply(this, arguments); // Init empty region + + this.getEmptyRegion(); + this.delegateEntityEvents(); + + this._triggerEventOnBehaviors('initialize', this, options); + }, + // Internal method to set up the `children` object for storing all of the child views + // `_children` represents all child views + // `children` represents only views filtered to be shown + _initChildViewStorage: function _initChildViewStorage() { + this._children = new Container(); + this.children = new Container(); + }, + // Create an region to show the emptyView + getEmptyRegion: function getEmptyRegion() { + var $emptyEl = this.$container || this.$el; + + if (this._emptyRegion && !this._emptyRegion.isDestroyed()) { + this._emptyRegion._setElement($emptyEl[0]); + + return this._emptyRegion; + } + + this._emptyRegion = new Region({ + el: $emptyEl[0], + replaceElement: false + }); + this._emptyRegion._parentView = this; + return this._emptyRegion; + }, + // Configured the initial events that the collection view binds to. + _initialEvents: function _initialEvents() { + if (this._isRendered) { + return; + } + + this.listenTo(this.collection, { + 'sort': this._onCollectionSort, + 'reset': this._onCollectionReset, + 'update': this._onCollectionUpdate + }); + }, + // Internal method. This checks for any changes in the order of the collection. + // If the index of any view doesn't match, it will re-sort. + _onCollectionSort: function _onCollectionSort(collection, _ref) { + var add = _ref.add, + merge = _ref.merge, + remove = _ref.remove; + + if (!this.sortWithCollection || this.viewComparator === false) { + return; + } // If the data is changing we will handle the sort later in `_onCollectionUpdate` + + + if (add || remove || merge) { + return; + } // If the only thing happening here is sorting, sort. + + + this.sort(); + }, + _onCollectionReset: function _onCollectionReset() { + this._destroyChildren(); + + this._addChildModels(this.collection.models); + + this.sort(); + }, + // Handle collection update model additions and removals + _onCollectionUpdate: function _onCollectionUpdate(collection, options) { + var changes = options.changes; // Remove first since it'll be a shorter array lookup. + + var removedViews = changes.removed.length && this._removeChildModels(changes.removed); + + this._addedViews = changes.added.length && this._addChildModels(changes.added); + + this._detachChildren(removedViews); + + this.sort(); // Destroy removed child views after all of the render is complete + + this._removeChildViews(removedViews); + }, + _removeChildModels: function _removeChildModels(models) { + var _this = this; + + return _.reduce(models, function (views, model) { + var removeView = _this._removeChildModel(model); + + if (removeView) { + views.push(removeView); + } + + return views; + }, []); + }, + _removeChildModel: function _removeChildModel(model) { + var view = this._children.findByModel(model); + + if (view) { + this._removeChild(view); + } + + return view; + }, + _removeChild: function _removeChild(view) { + this.triggerMethod('before:remove:child', this, view); + + this.children._remove(view); + + this._children._remove(view); + + this.triggerMethod('remove:child', this, view); + }, + // Added views are returned for consistency with _removeChildModels + _addChildModels: function _addChildModels(models) { + return _.map(models, this._addChildModel.bind(this)); + }, + _addChildModel: function _addChildModel(model) { + var view = this._createChildView(model); + + this._addChild(view); + + return view; + }, + _createChildView: function _createChildView(model) { + var ChildView = this._getChildView(model); + + var childViewOptions = this._getChildViewOptions(model); + + var view = this.buildChildView(model, ChildView, childViewOptions); + return view; + }, + _addChild: function _addChild(view, index) { + this.triggerMethod('before:add:child', this, view); + + this._setupChildView(view); + + this._children._add(view, index); + + this.children._add(view, index); + + this.triggerMethod('add:child', this, view); + }, + // Retrieve the `childView` class + // The `childView` property can be either a view class or a function that + // returns a view class. If it is a function, it will receive the model that + // will be passed to the view instance (created from the returned view class) + _getChildView: function _getChildView(child) { + var childView = this.childView; + + if (!childView) { + throw new MarionetteError({ + name: classErrorName$1, + message: 'A "childView" must be specified', + url: 'marionette.collectionview.html#collectionviews-childview' + }); + } + + childView = this._getView(childView, child); + + if (!childView) { + throw new MarionetteError({ + name: classErrorName$1, + message: '"childView" must be a view class or a function that returns a view class', + url: 'marionette.collectionview.html#collectionviews-childview' + }); + } + + return childView; + }, + // First check if the `view` is a view class (the common case) + // Then check if it's a function (which we assume that returns a view class) + _getView: function _getView(view, child) { + if (view.prototype instanceof Backbone.View || view === Backbone.View) { + return view; + } else if (_.isFunction(view)) { + return view.call(this, child); + } + }, + _getChildViewOptions: function _getChildViewOptions(child) { + if (_.isFunction(this.childViewOptions)) { + return this.childViewOptions(child); + } + + return this.childViewOptions; + }, + // Build a `childView` for a model in the collection. + // Override to customize the build + buildChildView: function buildChildView(child, ChildViewClass, childViewOptions) { + var options = _.extend({ + model: child + }, childViewOptions); + + return new ChildViewClass(options); + }, + _setupChildView: function _setupChildView(view) { + monitorViewEvents(view); // We need to listen for if a view is destroyed in a way other + // than through the CollectionView. + // If this happens we need to remove the reference to the view + // since once a view has been destroyed we can not reuse it. + + view.on('destroy', this.removeChildView, this); // set up the child view event forwarding + + this._proxyChildViewEvents(view); + }, + // used by ViewMixin's `_childViewEventHandler` + _getImmediateChildren: function _getImmediateChildren() { + return this.children._views; + }, + // Overriding Backbone.View's `setElement` to handle + // if an el was previously defined. If so, the view might be + // attached on setElement. + setElement: function setElement() { + Backbone.View.prototype.setElement.apply(this, arguments); + this._isAttached = this._isElAttached(); + return this; + }, + // Render children views. + render: function render() { + if (this._isDestroyed) { + return this; + } + + this.triggerMethod('before:render', this); + + this._destroyChildren(); + + if (this.collection) { + this._addChildModels(this.collection.models); + + this._initialEvents(); + } + + var template = this.getTemplate(); + + if (template) { + this._renderTemplate(template); + + this.bindUIElements(); + } + + this._getChildViewContainer(); + + this.sort(); + this._isRendered = true; + this.triggerMethod('render', this); + return this; + }, + // Get a container within the template to add the children within + _getChildViewContainer: function _getChildViewContainer() { + var childViewContainer = _.result(this, 'childViewContainer'); + + this.$container = childViewContainer ? this.$(childViewContainer) : this.$el; + + if (!this.$container.length) { + throw new MarionetteError({ + name: classErrorName$1, + message: "The specified \"childViewContainer\" was not found: ".concat(childViewContainer), + url: 'marionette.collectionview.html#defining-the-childviewcontainer' + }); + } + }, + // Sorts the children then filters and renders the results. + sort: function sort() { + this._sortChildren(); + + this.filter(); + return this; + }, + // Sorts views by viewComparator and sets the children to the new order + _sortChildren: function _sortChildren() { + if (!this._children.length) { + return; + } + + var viewComparator = this.getComparator(); + + if (!viewComparator) { + return; + } // If children are sorted prevent added to end perf + + + delete this._addedViews; + this.triggerMethod('before:sort', this); + + this._children._sort(viewComparator, this); + + this.triggerMethod('sort', this); + }, + // Sets the view's `viewComparator` and applies the sort if the view is ready. + // To prevent the render pass `{ preventRender: true }` as the 2nd argument. + setComparator: function setComparator(comparator) { + var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + preventRender = _ref2.preventRender; + + var comparatorChanged = this.viewComparator !== comparator; + var shouldSort = comparatorChanged && !preventRender; + this.viewComparator = comparator; + + if (shouldSort) { + this.sort(); + } + + return this; + }, + // Clears the `viewComparator` and follows the same rules for rendering as `setComparator`. + removeComparator: function removeComparator(options) { + return this.setComparator(null, options); + }, + // If viewComparator is overriden it will be returned here. + // Additionally override this function to provide custom + // viewComparator logic + getComparator: function getComparator() { + if (this.viewComparator) { + return this.viewComparator; + } + + if (!this.sortWithCollection || this.viewComparator === false || !this.collection) { + return false; + } + + return this._viewComparator; + }, + // Default internal view comparator that order the views by + // the order of the collection + _viewComparator: function _viewComparator(view) { + return this.collection.indexOf(view.model); + }, + // This method filters the children views and renders the results + filter: function filter() { + if (this._isDestroyed) { + return this; + } + + this._filterChildren(); + + this._renderChildren(); + + return this; + }, + _filterChildren: function _filterChildren() { + var _this2 = this; + + if (!this._children.length) { + return; + } + + var viewFilter = this._getFilter(); + + if (!viewFilter) { + var shouldReset = this.children.length !== this._children.length; + + this.children._set(this._children._views, shouldReset); + + return; + } // If children are filtered prevent added to end perf + + + delete this._addedViews; + this.triggerMethod('before:filter', this); + var attachViews = []; + var detachViews = []; + + _.each(this._children._views, function (view, key, children) { + (viewFilter.call(_this2, view, key, children) ? attachViews : detachViews).push(view); + }); + + this._detachChildren(detachViews); // reset children + + + this.children._set(attachViews, true); + + this.triggerMethod('filter', this, attachViews, detachViews); + }, + // This method returns a function for the viewFilter + _getFilter: function _getFilter() { + var viewFilter = this.getFilter(); + + if (!viewFilter) { + return false; + } + + if (_.isFunction(viewFilter)) { + return viewFilter; + } // Support filter predicates `{ fooFlag: true }` + + + if (_.isObject(viewFilter)) { + var matcher = _.matches(viewFilter); + + return function (view) { + return matcher(view.model && view.model.attributes); + }; + } // Filter by model attribute + + + if (_.isString(viewFilter)) { + return function (view) { + return view.model && view.model.get(viewFilter); + }; + } + + throw new MarionetteError({ + name: classErrorName$1, + message: '"viewFilter" must be a function, predicate object literal, a string indicating a model attribute, or falsy', + url: 'marionette.collectionview.html#defining-the-viewfilter' + }); + }, + // Override this function to provide custom + // viewFilter logic + getFilter: function getFilter() { + return this.viewFilter; + }, + // Sets the view's `viewFilter` and applies the filter if the view is ready. + // To prevent the render pass `{ preventRender: true }` as the 2nd argument. + setFilter: function setFilter(filter) { + var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + preventRender = _ref3.preventRender; + + var filterChanged = this.viewFilter !== filter; + var shouldRender = filterChanged && !preventRender; + this.viewFilter = filter; + + if (shouldRender) { + this.filter(); + } + + return this; + }, + // Clears the `viewFilter` and follows the same rules for rendering as `setFilter`. + removeFilter: function removeFilter(options) { + return this.setFilter(null, options); + }, + _detachChildren: function _detachChildren(detachingViews) { + _.each(detachingViews, this._detachChildView.bind(this)); + }, + _detachChildView: function _detachChildView(view) { + var shouldTriggerDetach = view._isAttached && this.monitorViewEvents !== false; + + if (shouldTriggerDetach) { + view.triggerMethod('before:detach', view); + } + + this.detachHtml(view); + + if (shouldTriggerDetach) { + view._isAttached = false; + view.triggerMethod('detach', view); + } + + view._isShown = false; + }, + // Override this method to change how the collectionView detaches a child view + detachHtml: function detachHtml(view) { + this.Dom.detachEl(view.el, view.$el); + }, + _renderChildren: function _renderChildren() { + // If there are unrendered views prevent add to end perf + if (this._hasUnrenderedViews) { + delete this._addedViews; + delete this._hasUnrenderedViews; + } + + var views = this._addedViews || this.children._views; + this.triggerMethod('before:render:children', this, views); + + if (this.isEmpty()) { + this._showEmptyView(); + } else { + this._destroyEmptyView(); + + var els = this._getBuffer(views); + + this._attachChildren(els, views); + } + + delete this._addedViews; + this.triggerMethod('render:children', this, views); + }, + // Renders each view and creates a fragment buffer from them + _getBuffer: function _getBuffer(views) { + var _this3 = this; + + var elBuffer = this.Dom.createBuffer(); + + _.each(views, function (view) { + renderView(view); // corresponds that view is shown in a Region or CollectionView + + view._isShown = true; + + _this3.Dom.appendContents(elBuffer, view.el, { + _$contents: view.$el + }); + }); + + return elBuffer; + }, + _attachChildren: function _attachChildren(els, views) { + var shouldTriggerAttach = this._isAttached && this.monitorViewEvents !== false; + views = shouldTriggerAttach ? views : []; + + _.each(views, function (view) { + if (view._isAttached) { + return; + } + + view.triggerMethod('before:attach', view); + }); + + this.attachHtml(els, this.$container); + + _.each(views, function (view) { + if (view._isAttached) { + return; + } + + view._isAttached = true; + view.triggerMethod('attach', view); + }); + }, + // Override this method to do something other than `.append`. + // You can attach any HTML at this point including the els. + attachHtml: function attachHtml(els, $container) { + this.Dom.appendContents($container[0], els, { + _$el: $container + }); + }, + isEmpty: function isEmpty() { + return !this.children.length; + }, + _showEmptyView: function _showEmptyView() { + var EmptyView = this._getEmptyView(); + + if (!EmptyView) { + return; + } + + var options = this._getEmptyViewOptions(); + + var emptyRegion = this.getEmptyRegion(); + emptyRegion.show(new EmptyView(options)); + }, + // Retrieve the empty view class + _getEmptyView: function _getEmptyView() { + var emptyView = this.emptyView; + + if (!emptyView) { + return; + } + + return this._getView(emptyView); + }, + // Remove the emptyView + _destroyEmptyView: function _destroyEmptyView() { + var emptyRegion = this.getEmptyRegion(); // Only empty if a view is show so the region + // doesn't detach any other unrelated HTML + + if (emptyRegion.hasView()) { + emptyRegion.empty(); + } + }, + // + _getEmptyViewOptions: function _getEmptyViewOptions() { + var emptyViewOptions = this.emptyViewOptions || this.childViewOptions; + + if (_.isFunction(emptyViewOptions)) { + return emptyViewOptions.call(this); + } + + return emptyViewOptions; + }, + swapChildViews: function swapChildViews(view1, view2) { + if (!this._children.hasView(view1) || !this._children.hasView(view2)) { + throw new MarionetteError({ + name: classErrorName$1, + message: 'Both views must be children of the collection view to swap.', + url: 'marionette.collectionview.html#swapping-child-views' + }); + } + + this._children._swap(view1, view2); + + this.Dom.swapEl(view1.el, view2.el); // If the views are not filtered the same, refilter + + if (this.children.hasView(view1) !== this.children.hasView(view2)) { + this.filter(); + } else { + this.children._swap(view1, view2); + } + + return this; + }, + // Render the child's view and add it to the HTML for the collection view at a given index, based on the current sort + addChildView: function addChildView(view, index) { + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + if (!view || view._isDestroyed) { + return view; + } + + if (view._isShown) { + throw new MarionetteError({ + name: classErrorName$1, + message: 'View is already shown in a Region or CollectionView', + url: 'marionette.collectionview.html#region-viewAlreadyShown' + }); + } + + if (_.isObject(index)) { + options = index; + } // If options has defined index we should use it + + + if (options.index != null) { + index = options.index; + } + + if (!this._isRendered) { + this.render(); + } + + this._addChild(view, index); + + if (options.preventRender) { + this._hasUnrenderedViews = true; + return view; + } + + var hasIndex = typeof index !== 'undefined'; + var isAddedToEnd = !hasIndex || index >= this._children.length; // Only cache views if added to the end and there is no unrendered views + + if (isAddedToEnd && !this._hasUnrenderedViews) { + this._addedViews = [view]; + } + + if (hasIndex) { + this._renderChildren(); + } else { + this.sort(); + } + + return view; + }, + // Detach a view from the children. Best used when adding a + // childView from `addChildView` + detachChildView: function detachChildView(view) { + this.removeChildView(view, { + shouldDetach: true + }); + return view; + }, + // Remove the child view and destroy it. Best used when adding a + // childView from `addChildView` + // The options argument is for internal use only + removeChildView: function removeChildView(view, options) { + if (!view) { + return view; + } + + this._removeChildView(view, options); + + this._removeChild(view); + + if (this.isEmpty()) { + this._showEmptyView(); + } + + return view; + }, + _removeChildViews: function _removeChildViews(views) { + _.each(views, this._removeChildView.bind(this)); + }, + _removeChildView: function _removeChildView(view) { + var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + shouldDetach = _ref4.shouldDetach; + + view.off('destroy', this.removeChildView, this); + + if (shouldDetach) { + this._detachChildView(view); + } else { + this._destroyChildView(view); + } + + this.stopListening(view); + }, + _destroyChildView: function _destroyChildView(view) { + if (view._isDestroyed) { + return; + } + + var shouldDisableEvents = this.monitorViewEvents === false; + destroyView(view, shouldDisableEvents); + }, + // called by ViewMixin destroy + _removeChildren: function _removeChildren() { + this._destroyChildren(); + + var emptyRegion = this.getEmptyRegion(); + emptyRegion.destroy(); + delete this._addedViews; + }, + // Destroy the child views that this collection view is holding on to, if any + _destroyChildren: function _destroyChildren() { + if (!this._children.length) { + return; + } + + this.triggerMethod('before:destroy:children', this); + + if (this.monitorViewEvents === false) { + this.Dom.detachContents(this.el, this.$el); + } + + this._removeChildViews(this._children._views); // After all children have been destroyed re-init the container + + + this._children._init(); + + this.children._init(); + + this.triggerMethod('destroy:children', this); + } +}, { + setDomApi: setDomApi, + setRenderer: setRenderer +}); + +_.extend(CollectionView.prototype, ViewMixin); + +// Behavior +var ClassOptions$4 = ['collectionEvents', 'events', 'modelEvents', 'triggers', 'ui']; + +var Behavior = function Behavior(options, view) { + // Setup reference to the view. + // this comes in handle when a behavior + // wants to directly talk up the chain + // to the view. + this.view = view; + + this._setOptions(options, ClassOptions$4); + + this.cid = _.uniqueId(this.cidPrefix); // Construct an internal UI hash using the behaviors UI + // hash combined and overridden by the view UI hash. + // This allows the user to use UI hash elements defined + // in the parent view as well as those defined in the behavior. + // This order will help the reuse and share of a behavior + // between multiple views, while letting a view override + // a selector under an UI key. + + this.ui = _.extend({}, _.result(this, 'ui'), _.result(view, 'ui')); // Proxy view triggers + + this.listenTo(view, 'all', this.triggerMethod); + this.initialize.apply(this, arguments); +}; + +Behavior.extend = extend; // Behavior Methods +// -------------- + +_.extend(Behavior.prototype, CommonMixin, DelegateEntityEventsMixin, TriggersMixin, UIMixin, { + cidPrefix: 'mnb', + // This is a noop method intended to be overridden + initialize: function initialize() {}, + // proxy behavior $ method to the view + // this is useful for doing jquery DOM lookups + // scoped to behaviors view. + $: function $() { + return this.view.$.apply(this.view, arguments); + }, + // Stops the behavior from listening to events. + destroy: function destroy() { + this.stopListening(); + + this.view._removeBehavior(this); + + this._deleteEntityEventHandlers(); + + return this; + }, + proxyViewProperties: function proxyViewProperties() { + this.$el = this.view.$el; + this.el = this.view.el; + return this; + }, + bindUIElements: function bindUIElements() { + this._bindUIElements(); + + return this; + }, + unbindUIElements: function unbindUIElements() { + this._unbindUIElements(); + + return this; + }, + getUI: function getUI(name) { + return this._getUI(name); + }, + // Handle `modelEvents`, and `collectionEvents` configuration + delegateEntityEvents: function delegateEntityEvents() { + this._delegateEntityEvents(this.view.model, this.view.collection); + + return this; + }, + undelegateEntityEvents: function undelegateEntityEvents() { + this._undelegateEntityEvents(this.view.model, this.view.collection); + + return this; + }, + _getEvents: function _getEvents() { + var _this = this; + + if (!this.events) { + return; + } // Normalize behavior events hash to allow + // a user to use the @ui. syntax. + + + var behaviorEvents = this.normalizeUIKeys(_.result(this, 'events')); // binds the handler to the behavior and builds a unique eventName + + return _.reduce(behaviorEvents, function (events, behaviorHandler, key) { + if (!_.isFunction(behaviorHandler)) { + behaviorHandler = _this[behaviorHandler]; + } + + if (!behaviorHandler) { + return events; + } + + key = getNamespacedEventName(key, _this.cid); + events[key] = behaviorHandler.bind(_this); + return events; + }, {}); + }, + // Internal method to build all trigger handlers for a given behavior + _getTriggers: function _getTriggers() { + if (!this.triggers) { + return; + } // Normalize behavior triggers hash to allow + // a user to use the @ui. syntax. + + + var behaviorTriggers = this.normalizeUIKeys(_.result(this, 'triggers')); + return this._getViewTriggers(this.view, behaviorTriggers); + } +}); + +// Application +var ClassOptions$5 = ['channelName', 'radioEvents', 'radioRequests', 'region', 'regionClass']; + +var Application = function Application(options) { + this._setOptions(options, ClassOptions$5); + + this.cid = _.uniqueId(this.cidPrefix); + + this._initRegion(); + + this._initRadio(); + + this.initialize.apply(this, arguments); +}; + +Application.extend = extend; // Application Methods +// -------------- + +_.extend(Application.prototype, CommonMixin, DestroyMixin, RadioMixin, { + cidPrefix: 'mna', + // This is a noop method intended to be overridden + initialize: function initialize() {}, + // Kick off all of the application's processes. + start: function start(options) { + this.triggerMethod('before:start', this, options); + this.triggerMethod('start', this, options); + return this; + }, + regionClass: Region, + _initRegion: function _initRegion() { + var region = this.region; + + if (!region) { + return; + } + + var defaults = { + regionClass: this.regionClass + }; + this._region = buildRegion(region, defaults); + }, + getRegion: function getRegion() { + return this._region; + }, + showView: function showView(view) { + var region = this.getRegion(); + + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + region.show.apply(region, [view].concat(args)); + return view; + }, + getView: function getView() { + return this.getRegion().currentView; + } +}); + +var bindEvents$1 = proxy(bindEvents); +var unbindEvents$1 = proxy(unbindEvents); +var bindRequests$1 = proxy(bindRequests); +var unbindRequests$1 = proxy(unbindRequests); +var mergeOptions$1 = proxy(mergeOptions); +var getOption$1 = proxy(getOption); +var normalizeMethods$1 = proxy(normalizeMethods); +var triggerMethod$1 = proxy(triggerMethod); // Configuration + +var setDomApi$1 = function setDomApi(mixin) { + CollectionView.setDomApi(mixin); + Region.setDomApi(mixin); + View.setDomApi(mixin); +}; +var setRenderer$1 = function setRenderer(renderer) { + CollectionView.setRenderer(renderer); + View.setRenderer(renderer); +}; +var backbone_marionette = { + View: View, + CollectionView: CollectionView, + MnObject: MarionetteObject, + Object: MarionetteObject, + Region: Region, + Behavior: Behavior, + Application: Application, + isEnabled: isEnabled, + setEnabled: setEnabled, + monitorViewEvents: monitorViewEvents, + Events: Events, + extend: extend, + DomApi: DomApi, + VERSION: version +}; + +export default backbone_marionette; +export { Application, Behavior, CollectionView, DomApi, Events, MarionetteObject as MnObject, Region, version as VERSION, View, bindEvents$1 as bindEvents, bindRequests$1 as bindRequests, extend, getOption$1 as getOption, isEnabled, mergeOptions$1 as mergeOptions, monitorViewEvents, normalizeMethods$1 as normalizeMethods, setDomApi$1 as setDomApi, setEnabled, setRenderer$1 as setRenderer, triggerMethod$1 as triggerMethod, unbindEvents$1 as unbindEvents, unbindRequests$1 as unbindRequests }; diff --git a/dist/backbone.marionette.js b/dist/backbone.marionette.js new file mode 100644 index 0000000000..f5c7a6c85f --- /dev/null +++ b/dist/backbone.marionette.js @@ -0,0 +1,3050 @@ +/** +* @license +* MarionetteJS (Backbone.Marionette) +* ---------------------------------- +* v4.1.0 +* +* Copyright (c)2019 Derick Bailey, Muted Solutions, LLC. +* Distributed under MIT license +* +* http://marionettejs.com +*/ + + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('backbone'), require('underscore'), require('backbone.radio')) : + typeof define === 'function' && define.amd ? define(['exports', 'backbone', 'underscore', 'backbone.radio'], factory) : + (global = global || self, (function () { + var current = global.Marionette; + var exports = global.Marionette = {}; + factory(exports, global.Backbone, global._, global.Backbone.Radio); + exports.noConflict = function () { global.Marionette = current; return exports; }; + }())); +}(this, function (exports, Backbone, _, Radio) { 'use strict'; + + Backbone = Backbone && Backbone.hasOwnProperty('default') ? Backbone['default'] : Backbone; + _ = _ && _.hasOwnProperty('default') ? _['default'] : _; + Radio = Radio && Radio.hasOwnProperty('default') ? Radio['default'] : Radio; + + var version = "4.1.0"; + + //Internal utility for creating context style global utils + var proxy = function proxy(method) { + return function (context) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + return method.apply(context, args); + }; + }; + + // Marionette.extend + + var extend = Backbone.Model.extend; + + // ---------------------- + // Pass in a mapping of events => functions or function names + // and return a mapping of events => functions + + var normalizeMethods = function normalizeMethods(hash) { + var _this = this; + + if (!hash) { + return; + } + + return _.reduce(hash, function (normalizedHash, method, name) { + if (!_.isFunction(method)) { + method = _this[method]; + } + + if (method) { + normalizedHash[name] = method; + } + + return normalizedHash; + }, {}); + }; + + // Error + var errorProps = ['description', 'fileName', 'lineNumber', 'name', 'message', 'number', 'url']; + var MarionetteError = extend.call(Error, { + urlRoot: "http://marionettejs.com/docs/v".concat(version, "/"), + url: '', + constructor: function constructor(options) { + var error = Error.call(this, options.message); + + _.extend(this, _.pick(error, errorProps), _.pick(options, errorProps)); + + if (Error.captureStackTrace) { + this.captureStackTrace(); + } + + this.url = this.urlRoot + this.url; + }, + captureStackTrace: function captureStackTrace() { + Error.captureStackTrace(this, MarionetteError); + }, + toString: function toString() { + return "".concat(this.name, ": ").concat(this.message, " See: ").concat(this.url); + } + }); + + // Bind Entity Events & Unbind Entity Events + + function normalizeBindings(context, bindings) { + if (!_.isObject(bindings)) { + throw new MarionetteError({ + message: 'Bindings must be an object.', + url: 'common.html#bindevents' + }); + } + + return normalizeMethods.call(context, bindings); + } + + function bindEvents(entity, bindings) { + if (!entity || !bindings) { + return this; + } + + this.listenTo(entity, normalizeBindings(this, bindings)); + return this; + } + + function unbindEvents(entity, bindings) { + if (!entity) { + return this; + } + + if (!bindings) { + this.stopListening(entity); + return this; + } + + this.stopListening(entity, normalizeBindings(this, bindings)); + return this; + } // Export Public API + + // Bind/Unbind Radio Requests + + function normalizeBindings$1(context, bindings) { + if (!_.isObject(bindings)) { + throw new MarionetteError({ + message: 'Bindings must be an object.', + url: 'common.html#bindrequests' + }); + } + + return normalizeMethods.call(context, bindings); + } + + function bindRequests(channel, bindings) { + if (!channel || !bindings) { + return this; + } + + channel.reply(normalizeBindings$1(this, bindings), this); + return this; + } + + function unbindRequests(channel, bindings) { + if (!channel) { + return this; + } + + if (!bindings) { + channel.stopReplying(null, null, this); + return this; + } + + channel.stopReplying(normalizeBindings$1(this, bindings)); + return this; + } + + // Marionette.getOption + // -------------------- + // Retrieve an object, function or other value from the + // object or its `options`, with `options` taking precedence. + var getOption = function getOption(optionName) { + if (!optionName) { + return; + } + + if (this.options && this.options[optionName] !== undefined) { + return this.options[optionName]; + } else { + return this[optionName]; + } + }; + + var mergeOptions = function mergeOptions(options, keys) { + var _this = this; + + if (!options) { + return; + } + + _.each(keys, function (key) { + var option = options[key]; + + if (option !== undefined) { + _this[key] = option; + } + }); + }; + + // DOM Refresh + + function triggerMethodChildren(view, event, shouldTrigger) { + if (!view._getImmediateChildren) { + return; + } + + _.each(view._getImmediateChildren(), function (child) { + if (!shouldTrigger(child)) { + return; + } + + child.triggerMethod(event, child); + }); + } + + function shouldTriggerAttach(view) { + return !view._isAttached; + } + + function shouldAttach(view) { + if (!shouldTriggerAttach(view)) { + return false; + } + + view._isAttached = true; + return true; + } + + function shouldTriggerDetach(view) { + return view._isAttached; + } + + function shouldDetach(view) { + view._isAttached = false; + return true; + } + + function triggerDOMRefresh(view) { + if (view._isAttached && view._isRendered) { + view.triggerMethod('dom:refresh', view); + } + } + + function triggerDOMRemove(view) { + if (view._isAttached && view._isRendered) { + view.triggerMethod('dom:remove', view); + } + } + + function handleBeforeAttach() { + triggerMethodChildren(this, 'before:attach', shouldTriggerAttach); + } + + function handleAttach() { + triggerMethodChildren(this, 'attach', shouldAttach); + triggerDOMRefresh(this); + } + + function handleBeforeDetach() { + triggerMethodChildren(this, 'before:detach', shouldTriggerDetach); + triggerDOMRemove(this); + } + + function handleDetach() { + triggerMethodChildren(this, 'detach', shouldDetach); + } + + function handleBeforeRender() { + triggerDOMRemove(this); + } + + function handleRender() { + triggerDOMRefresh(this); + } // Monitor a view's state, propagating attach/detach events to children and firing dom:refresh + // whenever a rendered view is attached or an attached view is rendered. + + + function monitorViewEvents(view) { + if (view._areViewEventsMonitored || view.monitorViewEvents === false) { + return; + } + + view._areViewEventsMonitored = true; + view.on({ + 'before:attach': handleBeforeAttach, + 'attach': handleAttach, + 'before:detach': handleBeforeDetach, + 'detach': handleDetach, + 'before:render': handleBeforeRender, + 'render': handleRender + }); + } + + // Trigger Method + + var splitter = /(^|:)(\w)/gi; // Only calc getOnMethodName once + + var methodCache = {}; // take the event section ("section1:section2:section3") + // and turn it in to uppercase name onSection1Section2Section3 + + function getEventName(match, prefix, eventName) { + return eventName.toUpperCase(); + } + + var getOnMethodName = function getOnMethodName(event) { + if (!methodCache[event]) { + methodCache[event] = 'on' + event.replace(splitter, getEventName); + } + + return methodCache[event]; + }; // Trigger an event and/or a corresponding method name. Examples: + // + // `this.triggerMethod("foo")` will trigger the "foo" event and + // call the "onFoo" method. + // + // `this.triggerMethod("foo:bar")` will trigger the "foo:bar" event and + // call the "onFooBar" method. + + + function triggerMethod(event) { + // get the method name from the event name + var methodName = getOnMethodName(event); + var method = getOption.call(this, methodName); + var result; // call the onMethodName if it exists + + if (_.isFunction(method)) { + // pass all args, except the event name + result = method.apply(this, _.drop(arguments)); + } // trigger the event + + + this.trigger.apply(this, arguments); + return result; + } + + var Events = { + triggerMethod: triggerMethod + }; + + var CommonMixin = { + // Imports the "normalizeMethods" to transform hashes of + // events=>function references/names to a hash of events=>function references + normalizeMethods: normalizeMethods, + _setOptions: function _setOptions(options, classOptions) { + this.options = _.extend({}, _.result(this, 'options'), options); + this.mergeOptions(options, classOptions); + }, + // A handy way to merge passed-in options onto the instance + mergeOptions: mergeOptions, + // Enable getting options from this or this.options by name. + getOption: getOption, + // Enable binding view's events from another entity. + bindEvents: bindEvents, + // Enable unbinding view's events from another entity. + unbindEvents: unbindEvents, + // Enable binding view's requests. + bindRequests: bindRequests, + // Enable unbinding view's requests. + unbindRequests: unbindRequests, + triggerMethod: triggerMethod + }; + + _.extend(CommonMixin, Backbone.Events); + + var DestroyMixin = { + _isDestroyed: false, + isDestroyed: function isDestroyed() { + return this._isDestroyed; + }, + destroy: function destroy(options) { + if (this._isDestroyed) { + return this; + } + + this.triggerMethod('before:destroy', this, options); + this._isDestroyed = true; + this.triggerMethod('destroy', this, options); + this.stopListening(); + return this; + } + }; + + // - channelName + // - radioEvents + // - radioRequests + + var RadioMixin = { + _initRadio: function _initRadio() { + var channelName = _.result(this, 'channelName'); + + if (!channelName) { + return; + } + /* istanbul ignore next */ + + + if (!Radio) { + throw new MarionetteError({ + message: 'The dependency "backbone.radio" is missing.', + url: 'backbone.radio.html#marionette-integration' + }); + } + + var channel = this._channel = Radio.channel(channelName); + + var radioEvents = _.result(this, 'radioEvents'); + + this.bindEvents(channel, radioEvents); + + var radioRequests = _.result(this, 'radioRequests'); + + this.bindRequests(channel, radioRequests); + this.on('destroy', this._destroyRadio); + }, + _destroyRadio: function _destroyRadio() { + this._channel.stopReplying(null, null, this); + }, + getChannel: function getChannel() { + return this._channel; + } + }; + + // Object + var ClassOptions = ['channelName', 'radioEvents', 'radioRequests']; // Object borrows many conventions and utilities from Backbone. + + var MarionetteObject = function MarionetteObject(options) { + this._setOptions(options, ClassOptions); + + this.cid = _.uniqueId(this.cidPrefix); + + this._initRadio(); + + this.initialize.apply(this, arguments); + }; + + MarionetteObject.extend = extend; // Object Methods + // -------------- + + _.extend(MarionetteObject.prototype, CommonMixin, DestroyMixin, RadioMixin, { + cidPrefix: 'mno', + // This is a noop method intended to be overridden + initialize: function initialize() {} + }); + + // Implementation of the invoke method (http://underscorejs.org/#invoke) with support for + var _invoke = _.invokeMap || _.invoke; + + // - behaviors + // Takes care of getting the behavior class + // given options and a key. + // If a user passes in options.behaviorClass + // default to using that. + // If a user passes in a Behavior Class directly, use that + // Otherwise an error is thrown + + function getBehaviorClass(options) { + if (options.behaviorClass) { + return { + BehaviorClass: options.behaviorClass, + options: options + }; + } //treat functions as a Behavior constructor + + + if (_.isFunction(options)) { + return { + BehaviorClass: options, + options: {} + }; + } + + throw new MarionetteError({ + message: 'Unable to get behavior class. A Behavior constructor should be passed directly or as behaviorClass property of options', + url: 'marionette.behavior.html#defining-and-attaching-behaviors' + }); + } // Iterate over the behaviors object, for each behavior + // instantiate it and get its grouped behaviors. + // This accepts a list of behaviors in either an object or array form + + + function parseBehaviors(view, behaviors, allBehaviors) { + return _.reduce(behaviors, function (reducedBehaviors, behaviorDefiniton) { + var _getBehaviorClass = getBehaviorClass(behaviorDefiniton), + BehaviorClass = _getBehaviorClass.BehaviorClass, + options = _getBehaviorClass.options; + + var behavior = new BehaviorClass(options, view); + reducedBehaviors.push(behavior); + return parseBehaviors(view, _.result(behavior, 'behaviors'), reducedBehaviors); + }, allBehaviors); + } + + var BehaviorsMixin = { + _initBehaviors: function _initBehaviors() { + this._behaviors = parseBehaviors(this, _.result(this, 'behaviors'), []); + }, + _getBehaviorTriggers: function _getBehaviorTriggers() { + var triggers = _invoke(this._behaviors, '_getTriggers'); + + return _.reduce(triggers, function (memo, _triggers) { + return _.extend(memo, _triggers); + }, {}); + }, + _getBehaviorEvents: function _getBehaviorEvents() { + var events = _invoke(this._behaviors, '_getEvents'); + + return _.reduce(events, function (memo, _events) { + return _.extend(memo, _events); + }, {}); + }, + // proxy behavior $el to the view's $el. + _proxyBehaviorViewProperties: function _proxyBehaviorViewProperties() { + _invoke(this._behaviors, 'proxyViewProperties'); + }, + // delegate modelEvents and collectionEvents + _delegateBehaviorEntityEvents: function _delegateBehaviorEntityEvents() { + _invoke(this._behaviors, 'delegateEntityEvents'); + }, + // undelegate modelEvents and collectionEvents + _undelegateBehaviorEntityEvents: function _undelegateBehaviorEntityEvents() { + _invoke(this._behaviors, 'undelegateEntityEvents'); + }, + _destroyBehaviors: function _destroyBehaviors(options) { + // Call destroy on each behavior after + // destroying the view. + // This unbinds event listeners + // that behaviors have registered for. + _invoke(this._behaviors, 'destroy', options); + }, + // Remove a behavior + _removeBehavior: function _removeBehavior(behavior) { + // Don't worry about the clean up if the view is destroyed + if (this._isDestroyed) { + return; + } // Remove behavior-only triggers and events + + + this.undelegate(".trig".concat(behavior.cid, " .").concat(behavior.cid)); + this._behaviors = _.without(this._behaviors, behavior); + }, + _bindBehaviorUIElements: function _bindBehaviorUIElements() { + _invoke(this._behaviors, 'bindUIElements'); + }, + _unbindBehaviorUIElements: function _unbindBehaviorUIElements() { + _invoke(this._behaviors, 'unbindUIElements'); + }, + _triggerEventOnBehaviors: function _triggerEventOnBehaviors(eventName, view, options) { + _invoke(this._behaviors, 'triggerMethod', eventName, view, options); + } + }; + + // - collectionEvents + // - modelEvents + + var DelegateEntityEventsMixin = { + // Handle `modelEvents`, and `collectionEvents` configuration + _delegateEntityEvents: function _delegateEntityEvents(model, collection) { + if (model) { + this._modelEvents = _.result(this, 'modelEvents'); + this.bindEvents(model, this._modelEvents); + } + + if (collection) { + this._collectionEvents = _.result(this, 'collectionEvents'); + this.bindEvents(collection, this._collectionEvents); + } + }, + // Remove any previously delegate entity events + _undelegateEntityEvents: function _undelegateEntityEvents(model, collection) { + if (this._modelEvents) { + this.unbindEvents(model, this._modelEvents); + delete this._modelEvents; + } + + if (this._collectionEvents) { + this.unbindEvents(collection, this._collectionEvents); + delete this._collectionEvents; + } + }, + // Remove cached event handlers + _deleteEntityEventHandlers: function _deleteEntityEventHandlers() { + delete this._modelEvents; + delete this._collectionEvents; + } + }; + + // - template + // - templateContext + + var TemplateRenderMixin = { + // Internal method to render the template with the serialized data + // and template context + _renderTemplate: function _renderTemplate(template) { + // Add in entity data and template context + var data = this.mixinTemplateContext(this.serializeData()) || {}; // Render and add to el + + var html = this._renderHtml(template, data); + + if (typeof html !== 'undefined') { + this.attachElContent(html); + } + }, + // Get the template for this view instance. + // You can set a `template` attribute in the view definition + // or pass a `template: TemplateFunction` parameter in + // to the constructor options. + getTemplate: function getTemplate() { + return this.template; + }, + // Mix in template context methods. Looks for a + // `templateContext` attribute, which can either be an + // object literal, or a function that returns an object + // literal. All methods and attributes from this object + // are copies to the object passed in. + mixinTemplateContext: function mixinTemplateContext(serializedData) { + var templateContext = _.result(this, 'templateContext'); + + if (!templateContext) { + return serializedData; + } + + if (!serializedData) { + return templateContext; + } + + return _.extend({}, serializedData, templateContext); + }, + // Serialize the view's model *or* collection, if + // it exists, for the template + serializeData: function serializeData() { + // If we have a model, we serialize that + if (this.model) { + return this.serializeModel(); + } // Otherwise, we serialize the collection, + // making it available under the `items` property + + + if (this.collection) { + return { + items: this.serializeCollection() + }; + } + }, + // Prepares the special `model` property of a view + // for being displayed in the template. Override this if + // you need a custom transformation for your view's model + serializeModel: function serializeModel() { + return this.model.attributes; + }, + // Serialize a collection + serializeCollection: function serializeCollection() { + return _.map(this.collection.models, function (model) { + return model.attributes; + }); + }, + // Renders the data into the template + _renderHtml: function _renderHtml(template, data) { + return template(data); + }, + // Attaches the content of a given view. + // This method can be overridden to optimize rendering, + // or to render in a non standard way. + // + // For example, using `innerHTML` instead of `$el.html` + // + // ```js + // attachElContent(html) { + // this.el.innerHTML = html; + // } + // ``` + attachElContent: function attachElContent(html) { + this.Dom.setContents(this.el, html, this.$el); + } + }; + + // Borrow event splitter from Backbone + var delegateEventSplitter = /^(\S+)\s*(.*)$/; // Set event name to be namespaced using a unique index + // to generate a non colliding event namespace + // http://api.jquery.com/event.namespace/ + + var getNamespacedEventName = function getNamespacedEventName(eventName, namespace) { + var match = eventName.match(delegateEventSplitter); + return "".concat(match[1], ".").concat(namespace, " ").concat(match[2]); + }; + + // Add Feature flags here + // e.g. 'class' => false + var FEATURES = { + childViewEventPrefix: false, + triggersStopPropagation: true, + triggersPreventDefault: true, + DEV_MODE: false + }; + + function isEnabled(name) { + return !!FEATURES[name]; + } + + function setEnabled(name, state) { + return FEATURES[name] = state; + } + + // 'click:foo' + + function buildViewTrigger(view, triggerDef) { + if (_.isString(triggerDef)) { + triggerDef = { + event: triggerDef + }; + } + + var eventName = triggerDef.event; + var shouldPreventDefault = !!triggerDef.preventDefault; + + if (isEnabled('triggersPreventDefault')) { + shouldPreventDefault = triggerDef.preventDefault !== false; + } + + var shouldStopPropagation = !!triggerDef.stopPropagation; + + if (isEnabled('triggersStopPropagation')) { + shouldStopPropagation = triggerDef.stopPropagation !== false; + } + + return function (event) { + if (shouldPreventDefault) { + event.preventDefault(); + } + + if (shouldStopPropagation) { + event.stopPropagation(); + } + + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + view.triggerMethod.apply(view, [eventName, view, event].concat(args)); + }; + } + + var TriggersMixin = { + // Configure `triggers` to forward DOM events to view + // events. `triggers: {"click .foo": "do:foo"}` + _getViewTriggers: function _getViewTriggers(view, triggers) { + var _this = this; + + // Configure the triggers, prevent default + // action and stop propagation of DOM events + return _.reduce(triggers, function (events, value, key) { + key = getNamespacedEventName(key, "trig".concat(_this.cid)); + events[key] = buildViewTrigger(view, value); + return events; + }, {}); + } + }; + + // a given key for triggers and events + // swaps the @ui with the associated selector. + // Returns a new, non-mutated, parsed events hash. + + var _normalizeUIKeys = function normalizeUIKeys(hash, ui) { + return _.reduce(hash, function (memo, val, key) { + var normalizedKey = _normalizeUIString(key, ui); + + memo[normalizedKey] = val; + return memo; + }, {}); + }; + + var uiRegEx = /@ui\.[a-zA-Z-_$0-9]*/g; // utility method for parsing @ui. syntax strings + // into associated selector + + var _normalizeUIString = function normalizeUIString(uiString, ui) { + return uiString.replace(uiRegEx, function (r) { + return ui[r.slice(4)]; + }); + }; // allows for the use of the @ui. syntax within + // a given value for regions + // swaps the @ui with the associated selector + + + var _normalizeUIValues = function normalizeUIValues(hash, ui, property) { + _.each(hash, function (val, key) { + if (_.isString(val)) { + hash[key] = _normalizeUIString(val, ui); + } else if (val) { + var propertyVal = val[property]; + + if (_.isString(propertyVal)) { + val[property] = _normalizeUIString(propertyVal, ui); + } + } + }); + + return hash; + }; + + var UIMixin = { + // normalize the keys of passed hash with the views `ui` selectors. + // `{"@ui.foo": "bar"}` + normalizeUIKeys: function normalizeUIKeys(hash) { + var uiBindings = this._getUIBindings(); + + return _normalizeUIKeys(hash, uiBindings); + }, + // normalize the passed string with the views `ui` selectors. + // `"@ui.bar"` + normalizeUIString: function normalizeUIString(uiString) { + var uiBindings = this._getUIBindings(); + + return _normalizeUIString(uiString, uiBindings); + }, + // normalize the values of passed hash with the views `ui` selectors. + // `{foo: "@ui.bar"}` + normalizeUIValues: function normalizeUIValues(hash, property) { + var uiBindings = this._getUIBindings(); + + return _normalizeUIValues(hash, uiBindings, property); + }, + _getUIBindings: function _getUIBindings() { + var uiBindings = _.result(this, '_uiBindings'); + + return uiBindings || _.result(this, 'ui'); + }, + // This method binds the elements specified in the "ui" hash inside the view's code with + // the associated jQuery selectors. + _bindUIElements: function _bindUIElements() { + var _this = this; + + if (!this.ui) { + return; + } // store the ui hash in _uiBindings so they can be reset later + // and so re-rendering the view will be able to find the bindings + + + if (!this._uiBindings) { + this._uiBindings = this.ui; + } // get the bindings result, as a function or otherwise + + + var bindings = _.result(this, '_uiBindings'); // empty the ui so we don't have anything to start with + + + this._ui = {}; // bind each of the selectors + + _.each(bindings, function (selector, key) { + _this._ui[key] = _this.$(selector); + }); + + this.ui = this._ui; + }, + _unbindUIElements: function _unbindUIElements() { + var _this2 = this; + + if (!this.ui || !this._uiBindings) { + return; + } // delete all of the existing ui bindings + + + _.each(this.ui, function ($el, name) { + delete _this2.ui[name]; + }); // reset the ui element to the original bindings configuration + + + this.ui = this._uiBindings; + delete this._uiBindings; + delete this._ui; + }, + _getUI: function _getUI(name) { + return this._ui[name]; + } + }; + + // DomApi + + function _getEl(el) { + return el instanceof Backbone.$ ? el : Backbone.$(el); + } // Static setter + + + function setDomApi(mixin) { + this.prototype.Dom = _.extend({}, this.prototype.Dom, mixin); + return this; + } + var DomApi = { + // Returns a new HTML DOM node instance + createBuffer: function createBuffer() { + return document.createDocumentFragment(); + }, + // Returns the document element for a given DOM element + getDocumentEl: function getDocumentEl(el) { + return el.ownerDocument.documentElement; + }, + // Lookup the `selector` string + // Selector may also be a DOM element + // Returns an array-like object of nodes + getEl: function getEl(selector) { + return _getEl(selector); + }, + // Finds the `selector` string with the el + // Returns an array-like object of nodes + findEl: function findEl(el, selector) { + return _getEl(el).find(selector); + }, + // Returns true if the el contains the node childEl + hasEl: function hasEl(el, childEl) { + return el.contains(childEl && childEl.parentNode); + }, + // Detach `el` from the DOM without removing listeners + detachEl: function detachEl(el) { + var _$el = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _getEl(el); + + _$el.detach(); + }, + // Remove `oldEl` from the DOM and put `newEl` in its place + replaceEl: function replaceEl(newEl, oldEl) { + if (newEl === oldEl) { + return; + } + + var parent = oldEl.parentNode; + + if (!parent) { + return; + } + + parent.replaceChild(newEl, oldEl); + }, + // Swaps the location of `el1` and `el2` in the DOM + swapEl: function swapEl(el1, el2) { + if (el1 === el2) { + return; + } + + var parent1 = el1.parentNode; + var parent2 = el2.parentNode; + + if (!parent1 || !parent2) { + return; + } + + var next1 = el1.nextSibling; + var next2 = el2.nextSibling; + parent1.insertBefore(el2, next1); + parent2.insertBefore(el1, next2); + }, + // Replace the contents of `el` with the HTML string of `html` + setContents: function setContents(el, html) { + var _$el = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _getEl(el); + + _$el.html(html); + }, + // Takes the DOM node `el` and appends the DOM node `contents` + // to the end of the element's contents. + appendContents: function appendContents(el, contents) { + var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, + _ref$_$el = _ref._$el, + _$el = _ref$_$el === void 0 ? _getEl(el) : _ref$_$el, + _ref$_$contents = _ref._$contents, + _$contents = _ref$_$contents === void 0 ? _getEl(contents) : _ref$_$contents; + + _$el.append(_$contents); + }, + // Does the el have child nodes + hasContents: function hasContents(el) { + return !!el && el.hasChildNodes(); + }, + // Remove the inner contents of `el` from the DOM while leaving + // `el` itself in the DOM. + detachContents: function detachContents(el) { + var _$el = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _getEl(el); + + _$el.contents().detach(); + } + }; + + // ViewMixin + // - behaviors + // - childViewEventPrefix + // - childViewEvents + // - childViewTriggers + // - collectionEvents + // - modelEvents + // - triggers + // - ui + + var ViewMixin = { + Dom: DomApi, + _isElAttached: function _isElAttached() { + return !!this.el && this.Dom.hasEl(this.Dom.getDocumentEl(this.el), this.el); + }, + supportsRenderLifecycle: true, + supportsDestroyLifecycle: true, + _isDestroyed: false, + isDestroyed: function isDestroyed() { + return !!this._isDestroyed; + }, + _isRendered: false, + isRendered: function isRendered() { + return !!this._isRendered; + }, + _isAttached: false, + isAttached: function isAttached() { + return !!this._isAttached; + }, + // Overriding Backbone.View's `delegateEvents` to handle + // `events` and `triggers` + delegateEvents: function delegateEvents(events) { + this._proxyBehaviorViewProperties(); + + this._buildEventProxies(); + + var combinedEvents = _.extend({}, this._getBehaviorEvents(), this._getEvents(events), this._getBehaviorTriggers(), this._getTriggers()); + + Backbone.View.prototype.delegateEvents.call(this, combinedEvents); + return this; + }, + // Allows Backbone.View events to utilize `@ui.` selectors + _getEvents: function _getEvents(events) { + if (events) { + return this.normalizeUIKeys(events); + } + + if (!this.events) { + return; + } + + return this.normalizeUIKeys(_.result(this, 'events')); + }, + // Configure `triggers` to forward DOM events to view + // events. `triggers: {"click .foo": "do:foo"}` + _getTriggers: function _getTriggers() { + if (!this.triggers) { + return; + } // Allow `triggers` to be configured as a function + + + var triggers = this.normalizeUIKeys(_.result(this, 'triggers')); // Configure the triggers, prevent default + // action and stop propagation of DOM events + + return this._getViewTriggers(this, triggers); + }, + // Handle `modelEvents`, and `collectionEvents` configuration + delegateEntityEvents: function delegateEntityEvents() { + this._delegateEntityEvents(this.model, this.collection); // bind each behaviors model and collection events + + + this._delegateBehaviorEntityEvents(); + + return this; + }, + // Handle unbinding `modelEvents`, and `collectionEvents` configuration + undelegateEntityEvents: function undelegateEntityEvents() { + this._undelegateEntityEvents(this.model, this.collection); // unbind each behaviors model and collection events + + + this._undelegateBehaviorEntityEvents(); + + return this; + }, + // Handle destroying the view and its children. + destroy: function destroy(options) { + if (this._isDestroyed || this._isDestroying) { + return this; + } + + this._isDestroying = true; + var shouldTriggerDetach = this._isAttached && !this._disableDetachEvents; + this.triggerMethod('before:destroy', this, options); + + if (shouldTriggerDetach) { + this.triggerMethod('before:detach', this); + } // unbind UI elements + + + this.unbindUIElements(); // remove the view from the DOM + + this._removeElement(); + + if (shouldTriggerDetach) { + this._isAttached = false; + this.triggerMethod('detach', this); + } // remove children after the remove to prevent extra paints + + + this._removeChildren(); + + this._isDestroyed = true; + this._isRendered = false; // Destroy behaviors after _isDestroyed flag + + this._destroyBehaviors(options); + + this._deleteEntityEventHandlers(); + + this.triggerMethod('destroy', this, options); + + this._triggerEventOnBehaviors('destroy', this, options); + + this.stopListening(); + return this; + }, + // Equates to this.$el.remove + _removeElement: function _removeElement() { + this.$el.off().removeData(); + this.Dom.detachEl(this.el, this.$el); + }, + // This method binds the elements specified in the "ui" hash + bindUIElements: function bindUIElements() { + this._bindUIElements(); + + this._bindBehaviorUIElements(); + + return this; + }, + // This method unbinds the elements specified in the "ui" hash + unbindUIElements: function unbindUIElements() { + this._unbindUIElements(); + + this._unbindBehaviorUIElements(); + + return this; + }, + getUI: function getUI(name) { + return this._getUI(name); + }, + // Cache `childViewEvents` and `childViewTriggers` + _buildEventProxies: function _buildEventProxies() { + this._childViewEvents = this.normalizeMethods(_.result(this, 'childViewEvents')); + this._childViewTriggers = _.result(this, 'childViewTriggers'); + this._eventPrefix = this._getEventPrefix(); + }, + _getEventPrefix: function _getEventPrefix() { + var defaultPrefix = isEnabled('childViewEventPrefix') ? 'childview' : false; + + var prefix = _.result(this, 'childViewEventPrefix', defaultPrefix); + + return prefix === false ? prefix : prefix + ':'; + }, + _proxyChildViewEvents: function _proxyChildViewEvents(view) { + if (this._childViewEvents || this._childViewTriggers || this._eventPrefix) { + this.listenTo(view, 'all', this._childViewEventHandler); + } + }, + _childViewEventHandler: function _childViewEventHandler(eventName) { + var childViewEvents = this._childViewEvents; // call collectionView childViewEvent if defined + + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + if (childViewEvents && childViewEvents[eventName]) { + childViewEvents[eventName].apply(this, args); + } // use the parent view's proxyEvent handlers + + + var childViewTriggers = this._childViewTriggers; // Call the event with the proxy name on the parent layout + + if (childViewTriggers && childViewTriggers[eventName]) { + this.triggerMethod.apply(this, [childViewTriggers[eventName]].concat(args)); + } + + if (this._eventPrefix) { + this.triggerMethod.apply(this, [this._eventPrefix + eventName].concat(args)); + } + } + }; + + _.extend(ViewMixin, BehaviorsMixin, CommonMixin, DelegateEntityEventsMixin, TemplateRenderMixin, TriggersMixin, UIMixin); + + function renderView(view) { + if (view._isRendered) { + return; + } + + if (!view.supportsRenderLifecycle) { + view.triggerMethod('before:render', view); + } + + view.render(); + view._isRendered = true; + + if (!view.supportsRenderLifecycle) { + view.triggerMethod('render', view); + } + } + function destroyView(view, disableDetachEvents) { + if (view.destroy) { + // Attach flag for public destroy function internal check + view._disableDetachEvents = disableDetachEvents; + view.destroy(); + return; + } // Destroy for non-Marionette Views + + + if (!view.supportsDestroyLifecycle) { + view.triggerMethod('before:destroy', view); + } + + var shouldTriggerDetach = view._isAttached && !disableDetachEvents; + + if (shouldTriggerDetach) { + view.triggerMethod('before:detach', view); + } + + view.remove(); + + if (shouldTriggerDetach) { + view._isAttached = false; + view.triggerMethod('detach', view); + } + + view._isDestroyed = true; + + if (!view.supportsDestroyLifecycle) { + view.triggerMethod('destroy', view); + } + } + + // Region + var classErrorName = 'RegionError'; + var ClassOptions$1 = ['allowMissingEl', 'parentEl', 'replaceElement']; + + var Region = function Region(options) { + this._setOptions(options, ClassOptions$1); + + this.cid = _.uniqueId(this.cidPrefix); // getOption necessary because options.el may be passed as undefined + + this._initEl = this.el = this.getOption('el'); // Handle when this.el is passed in as a $ wrapped element. + + this.el = this.el instanceof Backbone.$ ? this.el[0] : this.el; + + this._setEl(); + + this.initialize.apply(this, arguments); + }; + + Region.extend = extend; + Region.setDomApi = setDomApi; // Region Methods + // -------------- + + _.extend(Region.prototype, CommonMixin, { + Dom: DomApi, + cidPrefix: 'mnr', + replaceElement: false, + _isReplaced: false, + _isSwappingView: false, + // This is a noop method intended to be overridden + initialize: function initialize() {}, + // Displays a view instance inside of the region. If necessary handles calling the `render` + // method for you. Reads content directly from the `el` attribute. + show: function show(view, options) { + if (!this._ensureElement(options)) { + return; + } + + view = this._getView(view, options); + + if (view === this.currentView) { + return this; + } + + if (view._isShown) { + throw new MarionetteError({ + name: classErrorName, + message: 'View is already shown in a Region or CollectionView', + url: 'marionette.collectionview.html#region-viewAlreadyShown' + }); + } + + this._isSwappingView = !!this.currentView; + this.triggerMethod('before:show', this, view, options); // Assume an attached view is already in the region for pre-existing DOM + + if (this.currentView || !view._isAttached) { + this.empty(options); + } + + this._setupChildView(view); + + this.currentView = view; + renderView(view); + + this._attachView(view, options); + + this.triggerMethod('show', this, view, options); + this._isSwappingView = false; + return this; + }, + _setEl: function _setEl() { + if (!this.el) { + throw new MarionetteError({ + name: classErrorName, + message: 'An "el" must be specified for a region.', + url: 'marionette.region.html#additional-options' + }); + } + + this.$el = this.getEl(this.el); + + if (this.$el.length) { + this.el = this.$el[0]; + } // Make sure the $el contains only the el + + + if (this.$el.length > 1) { + this.$el = this.Dom.getEl(this.el); + } + }, + // Set the `el` of the region and move any current view to the new `el`. + _setElement: function _setElement(el) { + if (el === this.el) { + return this; + } + + var shouldReplace = this._isReplaced; + + this._restoreEl(); + + this.el = el; + + this._setEl(); + + if (this.currentView) { + var view = this.currentView; + + if (shouldReplace) { + this._replaceEl(view); + } else { + this.attachHtml(view); + } + } + + return this; + }, + _setupChildView: function _setupChildView(view) { + monitorViewEvents(view); + + this._proxyChildViewEvents(view); // We need to listen for if a view is destroyed in a way other than through the region. + // If this happens we need to remove the reference to the currentView since once a view + // has been destroyed we can not reuse it. + + + view.on('destroy', this._empty, this); + }, + _proxyChildViewEvents: function _proxyChildViewEvents(view) { + var parentView = this._parentView; + + if (!parentView) { + return; + } + + parentView._proxyChildViewEvents(view); + }, + // If the regions parent view is not monitoring its attach/detach events + _shouldDisableMonitoring: function _shouldDisableMonitoring() { + return this._parentView && this._parentView.monitorViewEvents === false; + }, + _isElAttached: function _isElAttached() { + return this.Dom.hasEl(this.Dom.getDocumentEl(this.el), this.el); + }, + _attachView: function _attachView(view) { + var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + replaceElement = _ref.replaceElement; + + var shouldTriggerAttach = !view._isAttached && this._isElAttached() && !this._shouldDisableMonitoring(); + var shouldReplaceEl = typeof replaceElement === 'undefined' ? !!_.result(this, 'replaceElement') : !!replaceElement; + + if (shouldTriggerAttach) { + view.triggerMethod('before:attach', view); + } + + if (shouldReplaceEl) { + this._replaceEl(view); + } else { + this.attachHtml(view); + } + + if (shouldTriggerAttach) { + view._isAttached = true; + view.triggerMethod('attach', view); + } // Corresponds that view is shown in a marionette Region or CollectionView + + + view._isShown = true; + }, + _ensureElement: function _ensureElement() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + + if (!_.isObject(this.el)) { + this._setEl(); + } + + if (!this.$el || this.$el.length === 0) { + var allowMissingEl = typeof options.allowMissingEl === 'undefined' ? !!_.result(this, 'allowMissingEl') : !!options.allowMissingEl; + + if (allowMissingEl) { + return false; + } else { + throw new MarionetteError({ + name: classErrorName, + message: "An \"el\" must exist in DOM for this region ".concat(this.cid), + url: 'marionette.region.html#additional-options' + }); + } + } + + return true; + }, + _getView: function _getView(view) { + if (!view) { + throw new MarionetteError({ + name: classErrorName, + message: 'The view passed is undefined and therefore invalid. You must pass a view instance to show.', + url: 'marionette.region.html#showing-a-view' + }); + } + + if (view._isDestroyed) { + throw new MarionetteError({ + name: classErrorName, + message: "View (cid: \"".concat(view.cid, "\") has already been destroyed and cannot be used."), + url: 'marionette.region.html#showing-a-view' + }); + } + + if (view instanceof Backbone.View) { + return view; + } + + var viewOptions = this._getViewOptions(view); + + return new View(viewOptions); + }, + // This allows for a template or a static string to be + // used as a template + _getViewOptions: function _getViewOptions(viewOptions) { + if (_.isFunction(viewOptions)) { + return { + template: viewOptions + }; + } + + if (_.isObject(viewOptions)) { + return viewOptions; + } + + var template = function template() { + return viewOptions; + }; + + return { + template: template + }; + }, + // Override this method to change how the region finds the DOM element that it manages. Return + // a jQuery selector object scoped to a provided parent el or the document if none exists. + getEl: function getEl(el) { + var context = _.result(this, 'parentEl'); + + if (context && _.isString(el)) { + return this.Dom.findEl(context, el); + } + + return this.Dom.getEl(el); + }, + _replaceEl: function _replaceEl(view) { + // Always restore the el to ensure the regions el is present before replacing + this._restoreEl(); + + view.on('before:destroy', this._restoreEl, this); + this.Dom.replaceEl(view.el, this.el); + this._isReplaced = true; + }, + // Restore the region's element in the DOM. + _restoreEl: function _restoreEl() { + // There is nothing to replace + if (!this._isReplaced) { + return; + } + + var view = this.currentView; + + if (!view) { + return; + } + + this._detachView(view); + + this._isReplaced = false; + }, + // Check to see if the region's el was replaced. + isReplaced: function isReplaced() { + return !!this._isReplaced; + }, + // Check to see if a view is being swapped by another + isSwappingView: function isSwappingView() { + return !!this._isSwappingView; + }, + // Override this method to change how the new view is appended to the `$el` that the + // region is managing + attachHtml: function attachHtml(view) { + this.Dom.appendContents(this.el, view.el, { + _$el: this.$el, + _$contents: view.$el + }); + }, + // Destroy the current view, if there is one. If there is no current view, + // it will detach any html inside the region's `el`. + empty: function empty() { + var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { + allowMissingEl: true + }; + var view = this.currentView; // If there is no view in the region we should only detach current html + + if (!view) { + if (this._ensureElement(options)) { + this.detachHtml(); + } + + return this; + } + + this._empty(view, true); + + return this; + }, + _empty: function _empty(view, shouldDestroy) { + view.off('destroy', this._empty, this); + this.triggerMethod('before:empty', this, view); + + this._restoreEl(); + + delete this.currentView; + + if (!view._isDestroyed) { + if (shouldDestroy) { + this.removeView(view); + } else { + this._detachView(view); + } + + view._isShown = false; + + this._stopChildViewEvents(view); + } + + this.triggerMethod('empty', this, view); + }, + _stopChildViewEvents: function _stopChildViewEvents(view) { + var parentView = this._parentView; + + if (!parentView) { + return; + } + + this._parentView.stopListening(view); + }, + // Non-Marionette safe view.destroy + destroyView: function destroyView$1(view) { + if (view._isDestroyed) { + return view; + } + + destroyView(view, this._shouldDisableMonitoring()); + + return view; + }, + // Override this method to determine what happens when the view + // is removed from the region when the view is not being detached + removeView: function removeView(view) { + this.destroyView(view); + }, + // Empties the Region without destroying the view + // Returns the detached view + detachView: function detachView() { + var view = this.currentView; + + if (!view) { + return; + } + + this._empty(view); + + return view; + }, + _detachView: function _detachView(view) { + var shouldTriggerDetach = view._isAttached && !this._shouldDisableMonitoring(); + var shouldRestoreEl = this._isReplaced; + + if (shouldTriggerDetach) { + view.triggerMethod('before:detach', view); + } + + if (shouldRestoreEl) { + this.Dom.replaceEl(this.el, view.el); + } else { + this.detachHtml(); + } + + if (shouldTriggerDetach) { + view._isAttached = false; + view.triggerMethod('detach', view); + } + }, + // Override this method to change how the region detaches current content + detachHtml: function detachHtml() { + this.Dom.detachContents(this.el, this.$el); + }, + // Checks whether a view is currently present within the region. Returns `true` if there is + // and `false` if no view is present. + hasView: function hasView() { + return !!this.currentView; + }, + // Reset the region by destroying any existing view and clearing out the cached `$el`. + // The next time a view is shown via this region, the region will re-query the DOM for + // the region's `el`. + reset: function reset(options) { + this.empty(options); + this.el = this._initEl; + delete this.$el; + return this; + }, + _isDestroyed: false, + isDestroyed: function isDestroyed() { + return this._isDestroyed; + }, + // Destroy the region, remove any child view + // and remove the region from any associated view + destroy: function destroy(options) { + if (this._isDestroyed) { + return this; + } + + this.triggerMethod('before:destroy', this, options); + this._isDestroyed = true; + this.reset(options); + + if (this._name) { + this._parentView._removeReferences(this._name); + } + + delete this._parentView; + delete this._name; + this.triggerMethod('destroy', this, options); + this.stopListening(); + return this; + } + }); + + function buildRegion (definition, defaults) { + if (definition instanceof Region) { + return definition; + } + + if (_.isString(definition)) { + return buildRegionFromObject(defaults, { + el: definition + }); + } + + if (_.isFunction(definition)) { + return buildRegionFromObject(defaults, { + regionClass: definition + }); + } + + if (_.isObject(definition)) { + return buildRegionFromObject(defaults, definition); + } + + throw new MarionetteError({ + message: 'Improper region configuration type.', + url: 'marionette.region.html#defining-regions' + }); + } + + function buildRegionFromObject(defaults, definition) { + var options = _.extend({}, defaults, definition); + + var RegionClass = options.regionClass; + delete options.regionClass; + return new RegionClass(options); + } + + // - regions + // - regionClass + + var RegionsMixin = { + regionClass: Region, + // Internal method to initialize the regions that have been defined in a + // `regions` attribute on this View. + _initRegions: function _initRegions() { + // init regions hash + this.regions = this.regions || {}; + this._regions = {}; + this.addRegions(_.result(this, 'regions')); + }, + // Internal method to re-initialize all of the regions by updating + // the `el` that they point to + _reInitRegions: function _reInitRegions() { + _invoke(this._regions, 'reset'); + }, + // Add a single region, by name, to the View + addRegion: function addRegion(name, definition) { + var regions = {}; + regions[name] = definition; + return this.addRegions(regions)[name]; + }, + // Add multiple regions as a {name: definition, name2: def2} object literal + addRegions: function addRegions(regions) { + // If there's nothing to add, stop here. + if (_.isEmpty(regions)) { + return; + } // Normalize region selectors hash to allow + // a user to use the @ui. syntax. + + + regions = this.normalizeUIValues(regions, 'el'); // Add the regions definitions to the regions property + + this.regions = _.extend({}, this.regions, regions); + return this._addRegions(regions); + }, + // internal method to build and add regions + _addRegions: function _addRegions(regionDefinitions) { + var _this = this; + + var defaults = { + regionClass: this.regionClass, + parentEl: _.partial(_.result, this, 'el') + }; + return _.reduce(regionDefinitions, function (regions, definition, name) { + regions[name] = buildRegion(definition, defaults); + + _this._addRegion(regions[name], name); + + return regions; + }, {}); + }, + _addRegion: function _addRegion(region, name) { + this.triggerMethod('before:add:region', this, name, region); + region._parentView = this; + region._name = name; + this._regions[name] = region; + this.triggerMethod('add:region', this, name, region); + }, + // Remove a single region from the View, by name + removeRegion: function removeRegion(name) { + var region = this._regions[name]; + + this._removeRegion(region, name); + + return region; + }, + // Remove all regions from the View + removeRegions: function removeRegions() { + var regions = this._getRegions(); + + _.each(this._regions, this._removeRegion.bind(this)); + + return regions; + }, + _removeRegion: function _removeRegion(region, name) { + this.triggerMethod('before:remove:region', this, name, region); + region.destroy(); + this.triggerMethod('remove:region', this, name, region); + }, + // Called in a region's destroy + _removeReferences: function _removeReferences(name) { + delete this.regions[name]; + delete this._regions[name]; + }, + // Empty all regions in the region manager, but + // leave them attached + emptyRegions: function emptyRegions() { + var regions = this.getRegions(); + + _invoke(regions, 'empty'); + + return regions; + }, + // Checks to see if view contains region + // Accepts the region name + // hasRegion('main') + hasRegion: function hasRegion(name) { + return !!this.getRegion(name); + }, + // Provides access to regions + // Accepts the region name + // getRegion('main') + getRegion: function getRegion(name) { + if (!this._isRendered) { + this.render(); + } + + return this._regions[name]; + }, + _getRegions: function _getRegions() { + return _.clone(this._regions); + }, + // Get all regions + getRegions: function getRegions() { + if (!this._isRendered) { + this.render(); + } + + return this._getRegions(); + }, + showChildView: function showChildView(name, view, options) { + var region = this.getRegion(name); + region.show(view, options); + return view; + }, + detachChildView: function detachChildView(name) { + return this.getRegion(name).detachView(); + }, + getChildView: function getChildView(name) { + return this.getRegion(name).currentView; + } + }; + + // Static setter for the renderer + function setRenderer(renderer) { + this.prototype._renderHtml = renderer; + return this; + } + + // View + var ClassOptions$2 = ['behaviors', 'childViewEventPrefix', 'childViewEvents', 'childViewTriggers', 'collectionEvents', 'events', 'modelEvents', 'regionClass', 'regions', 'template', 'templateContext', 'triggers', 'ui']; // Used by _getImmediateChildren + + function childReducer(children, region) { + if (region.currentView) { + children.push(region.currentView); + } + + return children; + } // The standard view. Includes view events, automatic rendering + // templates, nested views, and more. + + + var View = Backbone.View.extend({ + constructor: function constructor(options) { + this._setOptions(options, ClassOptions$2); + + monitorViewEvents(this); + + this._initBehaviors(); + + this._initRegions(); + + Backbone.View.prototype.constructor.apply(this, arguments); + this.delegateEntityEvents(); + + this._triggerEventOnBehaviors('initialize', this, options); + }, + // Overriding Backbone.View's `setElement` to handle + // if an el was previously defined. If so, the view might be + // rendered or attached on setElement. + setElement: function setElement() { + Backbone.View.prototype.setElement.apply(this, arguments); + this._isRendered = this.Dom.hasContents(this.el); + this._isAttached = this._isElAttached(); + + if (this._isRendered) { + this.bindUIElements(); + } + + return this; + }, + // If a template is available, renders it into the view's `el` + // Re-inits regions and binds UI. + render: function render() { + var template = this.getTemplate(); + + if (template === false || this._isDestroyed) { + return this; + } + + this.triggerMethod('before:render', this); // If this is not the first render call, then we need to + // re-initialize the `el` for each region + + if (this._isRendered) { + this._reInitRegions(); + } + + this._renderTemplate(template); + + this.bindUIElements(); + this._isRendered = true; + this.triggerMethod('render', this); + return this; + }, + // called by ViewMixin destroy + _removeChildren: function _removeChildren() { + this.removeRegions(); + }, + _getImmediateChildren: function _getImmediateChildren() { + return _.reduce(this._regions, childReducer, []); + } + }, { + setRenderer: setRenderer, + setDomApi: setDomApi + }); + + _.extend(View.prototype, ViewMixin, RegionsMixin); + + // shut down child views. + + var Container = function Container() { + this._init(); + }; // Mix in methods from Underscore, for iteration, and other + // collection related features. + // Borrowing this code from Backbone.Collection: + // https://github.com/jashkenas/backbone/blob/1.1.2/backbone.js#L962 + + + var methods = ['forEach', 'each', 'map', 'find', 'detect', 'filter', 'select', 'reject', 'every', 'all', 'some', 'any', 'include', 'contains', 'invoke', 'toArray', 'first', 'initial', 'rest', 'last', 'without', 'isEmpty', 'pluck', 'reduce', 'partition']; + + _.each(methods, function (method) { + Container.prototype[method] = function () { + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + return _[method].apply(_, [this._views].concat(args)); + }; + }); + + function stringComparator(comparator, view) { + return view.model && view.model.get(comparator); + } // Container Methods + // ----------------- + + + _.extend(Container.prototype, { + // Initializes an empty container + _init: function _init() { + this._views = []; + this._viewsByCid = {}; + this._indexByModel = {}; + + this._updateLength(); + }, + // Add a view to this container. Stores the view + // by `cid` and makes it searchable by the model + // cid (and model itself). Additionally it stores + // the view by index in the _views array + _add: function _add(view) { + var index = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this._views.length; + + this._addViewIndexes(view); // add to end by default + + + this._views.splice(index, 0, view); + + this._updateLength(); + }, + _addViewIndexes: function _addViewIndexes(view) { + // store the view + this._viewsByCid[view.cid] = view; // index it by model + + if (view.model) { + this._indexByModel[view.model.cid] = view; + } + }, + // Sort (mutate) and return the array of the child views. + _sort: function _sort(comparator, context) { + if (typeof comparator === 'string') { + comparator = _.partial(stringComparator, comparator); + return this._sortBy(comparator); + } + + if (comparator.length === 1) { + return this._sortBy(comparator.bind(context)); + } + + return this._views.sort(comparator.bind(context)); + }, + // Makes `_.sortBy` mutate the array to match `this._views.sort` + _sortBy: function _sortBy(comparator) { + var sortedViews = _.sortBy(this._views, comparator); + + this._set(sortedViews); + + return sortedViews; + }, + // Replace array contents without overwriting the reference. + // Should not add/remove views + _set: function _set(views, shouldReset) { + this._views.length = 0; + + this._views.push.apply(this._views, views.slice(0)); + + if (shouldReset) { + this._viewsByCid = {}; + this._indexByModel = {}; + + _.each(views, this._addViewIndexes.bind(this)); + + this._updateLength(); + } + }, + // Swap views by index + _swap: function _swap(view1, view2) { + var view1Index = this.findIndexByView(view1); + var view2Index = this.findIndexByView(view2); + + if (view1Index === -1 || view2Index === -1) { + return; + } + + var swapView = this._views[view1Index]; + this._views[view1Index] = this._views[view2Index]; + this._views[view2Index] = swapView; + }, + // Find a view by the model that was attached to it. + // Uses the model's `cid` to find it. + findByModel: function findByModel(model) { + return this.findByModelCid(model.cid); + }, + // Find a view by the `cid` of the model that was attached to it. + findByModelCid: function findByModelCid(modelCid) { + return this._indexByModel[modelCid]; + }, + // Find a view by index. + findByIndex: function findByIndex(index) { + return this._views[index]; + }, + // Find the index of a view instance + findIndexByView: function findIndexByView(view) { + return this._views.indexOf(view); + }, + // Retrieve a view by its `cid` directly + findByCid: function findByCid(cid) { + return this._viewsByCid[cid]; + }, + hasView: function hasView(view) { + return !!this.findByCid(view.cid); + }, + // Remove a view and clean up index references. + _remove: function _remove(view) { + if (!this._viewsByCid[view.cid]) { + return; + } // delete model index + + + if (view.model) { + delete this._indexByModel[view.model.cid]; + } // remove the view from the container + + + delete this._viewsByCid[view.cid]; + var index = this.findIndexByView(view); + + this._views.splice(index, 1); + + this._updateLength(); + }, + // Update the `.length` attribute on this container + _updateLength: function _updateLength() { + this.length = this._views.length; + } + }); + + // Collection View + var classErrorName$1 = 'CollectionViewError'; + var ClassOptions$3 = ['behaviors', 'childView', 'childViewContainer', 'childViewEventPrefix', 'childViewEvents', 'childViewOptions', 'childViewTriggers', 'collectionEvents', 'emptyView', 'emptyViewOptions', 'events', 'modelEvents', 'sortWithCollection', 'template', 'templateContext', 'triggers', 'ui', 'viewComparator', 'viewFilter']; // A view that iterates over a Backbone.Collection + // and renders an individual child view for each model. + + var CollectionView = Backbone.View.extend({ + // flag for maintaining the sorted order of the collection + sortWithCollection: true, + // constructor + constructor: function constructor(options) { + this._setOptions(options, ClassOptions$3); + + monitorViewEvents(this); + + this._initChildViewStorage(); + + this._initBehaviors(); + + Backbone.View.prototype.constructor.apply(this, arguments); // Init empty region + + this.getEmptyRegion(); + this.delegateEntityEvents(); + + this._triggerEventOnBehaviors('initialize', this, options); + }, + // Internal method to set up the `children` object for storing all of the child views + // `_children` represents all child views + // `children` represents only views filtered to be shown + _initChildViewStorage: function _initChildViewStorage() { + this._children = new Container(); + this.children = new Container(); + }, + // Create an region to show the emptyView + getEmptyRegion: function getEmptyRegion() { + var $emptyEl = this.$container || this.$el; + + if (this._emptyRegion && !this._emptyRegion.isDestroyed()) { + this._emptyRegion._setElement($emptyEl[0]); + + return this._emptyRegion; + } + + this._emptyRegion = new Region({ + el: $emptyEl[0], + replaceElement: false + }); + this._emptyRegion._parentView = this; + return this._emptyRegion; + }, + // Configured the initial events that the collection view binds to. + _initialEvents: function _initialEvents() { + if (this._isRendered) { + return; + } + + this.listenTo(this.collection, { + 'sort': this._onCollectionSort, + 'reset': this._onCollectionReset, + 'update': this._onCollectionUpdate + }); + }, + // Internal method. This checks for any changes in the order of the collection. + // If the index of any view doesn't match, it will re-sort. + _onCollectionSort: function _onCollectionSort(collection, _ref) { + var add = _ref.add, + merge = _ref.merge, + remove = _ref.remove; + + if (!this.sortWithCollection || this.viewComparator === false) { + return; + } // If the data is changing we will handle the sort later in `_onCollectionUpdate` + + + if (add || remove || merge) { + return; + } // If the only thing happening here is sorting, sort. + + + this.sort(); + }, + _onCollectionReset: function _onCollectionReset() { + this._destroyChildren(); + + this._addChildModels(this.collection.models); + + this.sort(); + }, + // Handle collection update model additions and removals + _onCollectionUpdate: function _onCollectionUpdate(collection, options) { + var changes = options.changes; // Remove first since it'll be a shorter array lookup. + + var removedViews = changes.removed.length && this._removeChildModels(changes.removed); + + this._addedViews = changes.added.length && this._addChildModels(changes.added); + + this._detachChildren(removedViews); + + this.sort(); // Destroy removed child views after all of the render is complete + + this._removeChildViews(removedViews); + }, + _removeChildModels: function _removeChildModels(models) { + var _this = this; + + return _.reduce(models, function (views, model) { + var removeView = _this._removeChildModel(model); + + if (removeView) { + views.push(removeView); + } + + return views; + }, []); + }, + _removeChildModel: function _removeChildModel(model) { + var view = this._children.findByModel(model); + + if (view) { + this._removeChild(view); + } + + return view; + }, + _removeChild: function _removeChild(view) { + this.triggerMethod('before:remove:child', this, view); + + this.children._remove(view); + + this._children._remove(view); + + this.triggerMethod('remove:child', this, view); + }, + // Added views are returned for consistency with _removeChildModels + _addChildModels: function _addChildModels(models) { + return _.map(models, this._addChildModel.bind(this)); + }, + _addChildModel: function _addChildModel(model) { + var view = this._createChildView(model); + + this._addChild(view); + + return view; + }, + _createChildView: function _createChildView(model) { + var ChildView = this._getChildView(model); + + var childViewOptions = this._getChildViewOptions(model); + + var view = this.buildChildView(model, ChildView, childViewOptions); + return view; + }, + _addChild: function _addChild(view, index) { + this.triggerMethod('before:add:child', this, view); + + this._setupChildView(view); + + this._children._add(view, index); + + this.children._add(view, index); + + this.triggerMethod('add:child', this, view); + }, + // Retrieve the `childView` class + // The `childView` property can be either a view class or a function that + // returns a view class. If it is a function, it will receive the model that + // will be passed to the view instance (created from the returned view class) + _getChildView: function _getChildView(child) { + var childView = this.childView; + + if (!childView) { + throw new MarionetteError({ + name: classErrorName$1, + message: 'A "childView" must be specified', + url: 'marionette.collectionview.html#collectionviews-childview' + }); + } + + childView = this._getView(childView, child); + + if (!childView) { + throw new MarionetteError({ + name: classErrorName$1, + message: '"childView" must be a view class or a function that returns a view class', + url: 'marionette.collectionview.html#collectionviews-childview' + }); + } + + return childView; + }, + // First check if the `view` is a view class (the common case) + // Then check if it's a function (which we assume that returns a view class) + _getView: function _getView(view, child) { + if (view.prototype instanceof Backbone.View || view === Backbone.View) { + return view; + } else if (_.isFunction(view)) { + return view.call(this, child); + } + }, + _getChildViewOptions: function _getChildViewOptions(child) { + if (_.isFunction(this.childViewOptions)) { + return this.childViewOptions(child); + } + + return this.childViewOptions; + }, + // Build a `childView` for a model in the collection. + // Override to customize the build + buildChildView: function buildChildView(child, ChildViewClass, childViewOptions) { + var options = _.extend({ + model: child + }, childViewOptions); + + return new ChildViewClass(options); + }, + _setupChildView: function _setupChildView(view) { + monitorViewEvents(view); // We need to listen for if a view is destroyed in a way other + // than through the CollectionView. + // If this happens we need to remove the reference to the view + // since once a view has been destroyed we can not reuse it. + + view.on('destroy', this.removeChildView, this); // set up the child view event forwarding + + this._proxyChildViewEvents(view); + }, + // used by ViewMixin's `_childViewEventHandler` + _getImmediateChildren: function _getImmediateChildren() { + return this.children._views; + }, + // Overriding Backbone.View's `setElement` to handle + // if an el was previously defined. If so, the view might be + // attached on setElement. + setElement: function setElement() { + Backbone.View.prototype.setElement.apply(this, arguments); + this._isAttached = this._isElAttached(); + return this; + }, + // Render children views. + render: function render() { + if (this._isDestroyed) { + return this; + } + + this.triggerMethod('before:render', this); + + this._destroyChildren(); + + if (this.collection) { + this._addChildModels(this.collection.models); + + this._initialEvents(); + } + + var template = this.getTemplate(); + + if (template) { + this._renderTemplate(template); + + this.bindUIElements(); + } + + this._getChildViewContainer(); + + this.sort(); + this._isRendered = true; + this.triggerMethod('render', this); + return this; + }, + // Get a container within the template to add the children within + _getChildViewContainer: function _getChildViewContainer() { + var childViewContainer = _.result(this, 'childViewContainer'); + + this.$container = childViewContainer ? this.$(childViewContainer) : this.$el; + + if (!this.$container.length) { + throw new MarionetteError({ + name: classErrorName$1, + message: "The specified \"childViewContainer\" was not found: ".concat(childViewContainer), + url: 'marionette.collectionview.html#defining-the-childviewcontainer' + }); + } + }, + // Sorts the children then filters and renders the results. + sort: function sort() { + this._sortChildren(); + + this.filter(); + return this; + }, + // Sorts views by viewComparator and sets the children to the new order + _sortChildren: function _sortChildren() { + if (!this._children.length) { + return; + } + + var viewComparator = this.getComparator(); + + if (!viewComparator) { + return; + } // If children are sorted prevent added to end perf + + + delete this._addedViews; + this.triggerMethod('before:sort', this); + + this._children._sort(viewComparator, this); + + this.triggerMethod('sort', this); + }, + // Sets the view's `viewComparator` and applies the sort if the view is ready. + // To prevent the render pass `{ preventRender: true }` as the 2nd argument. + setComparator: function setComparator(comparator) { + var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + preventRender = _ref2.preventRender; + + var comparatorChanged = this.viewComparator !== comparator; + var shouldSort = comparatorChanged && !preventRender; + this.viewComparator = comparator; + + if (shouldSort) { + this.sort(); + } + + return this; + }, + // Clears the `viewComparator` and follows the same rules for rendering as `setComparator`. + removeComparator: function removeComparator(options) { + return this.setComparator(null, options); + }, + // If viewComparator is overriden it will be returned here. + // Additionally override this function to provide custom + // viewComparator logic + getComparator: function getComparator() { + if (this.viewComparator) { + return this.viewComparator; + } + + if (!this.sortWithCollection || this.viewComparator === false || !this.collection) { + return false; + } + + return this._viewComparator; + }, + // Default internal view comparator that order the views by + // the order of the collection + _viewComparator: function _viewComparator(view) { + return this.collection.indexOf(view.model); + }, + // This method filters the children views and renders the results + filter: function filter() { + if (this._isDestroyed) { + return this; + } + + this._filterChildren(); + + this._renderChildren(); + + return this; + }, + _filterChildren: function _filterChildren() { + var _this2 = this; + + if (!this._children.length) { + return; + } + + var viewFilter = this._getFilter(); + + if (!viewFilter) { + var shouldReset = this.children.length !== this._children.length; + + this.children._set(this._children._views, shouldReset); + + return; + } // If children are filtered prevent added to end perf + + + delete this._addedViews; + this.triggerMethod('before:filter', this); + var attachViews = []; + var detachViews = []; + + _.each(this._children._views, function (view, key, children) { + (viewFilter.call(_this2, view, key, children) ? attachViews : detachViews).push(view); + }); + + this._detachChildren(detachViews); // reset children + + + this.children._set(attachViews, true); + + this.triggerMethod('filter', this, attachViews, detachViews); + }, + // This method returns a function for the viewFilter + _getFilter: function _getFilter() { + var viewFilter = this.getFilter(); + + if (!viewFilter) { + return false; + } + + if (_.isFunction(viewFilter)) { + return viewFilter; + } // Support filter predicates `{ fooFlag: true }` + + + if (_.isObject(viewFilter)) { + var matcher = _.matches(viewFilter); + + return function (view) { + return matcher(view.model && view.model.attributes); + }; + } // Filter by model attribute + + + if (_.isString(viewFilter)) { + return function (view) { + return view.model && view.model.get(viewFilter); + }; + } + + throw new MarionetteError({ + name: classErrorName$1, + message: '"viewFilter" must be a function, predicate object literal, a string indicating a model attribute, or falsy', + url: 'marionette.collectionview.html#defining-the-viewfilter' + }); + }, + // Override this function to provide custom + // viewFilter logic + getFilter: function getFilter() { + return this.viewFilter; + }, + // Sets the view's `viewFilter` and applies the filter if the view is ready. + // To prevent the render pass `{ preventRender: true }` as the 2nd argument. + setFilter: function setFilter(filter) { + var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + preventRender = _ref3.preventRender; + + var filterChanged = this.viewFilter !== filter; + var shouldRender = filterChanged && !preventRender; + this.viewFilter = filter; + + if (shouldRender) { + this.filter(); + } + + return this; + }, + // Clears the `viewFilter` and follows the same rules for rendering as `setFilter`. + removeFilter: function removeFilter(options) { + return this.setFilter(null, options); + }, + _detachChildren: function _detachChildren(detachingViews) { + _.each(detachingViews, this._detachChildView.bind(this)); + }, + _detachChildView: function _detachChildView(view) { + var shouldTriggerDetach = view._isAttached && this.monitorViewEvents !== false; + + if (shouldTriggerDetach) { + view.triggerMethod('before:detach', view); + } + + this.detachHtml(view); + + if (shouldTriggerDetach) { + view._isAttached = false; + view.triggerMethod('detach', view); + } + + view._isShown = false; + }, + // Override this method to change how the collectionView detaches a child view + detachHtml: function detachHtml(view) { + this.Dom.detachEl(view.el, view.$el); + }, + _renderChildren: function _renderChildren() { + // If there are unrendered views prevent add to end perf + if (this._hasUnrenderedViews) { + delete this._addedViews; + delete this._hasUnrenderedViews; + } + + var views = this._addedViews || this.children._views; + this.triggerMethod('before:render:children', this, views); + + if (this.isEmpty()) { + this._showEmptyView(); + } else { + this._destroyEmptyView(); + + var els = this._getBuffer(views); + + this._attachChildren(els, views); + } + + delete this._addedViews; + this.triggerMethod('render:children', this, views); + }, + // Renders each view and creates a fragment buffer from them + _getBuffer: function _getBuffer(views) { + var _this3 = this; + + var elBuffer = this.Dom.createBuffer(); + + _.each(views, function (view) { + renderView(view); // corresponds that view is shown in a Region or CollectionView + + view._isShown = true; + + _this3.Dom.appendContents(elBuffer, view.el, { + _$contents: view.$el + }); + }); + + return elBuffer; + }, + _attachChildren: function _attachChildren(els, views) { + var shouldTriggerAttach = this._isAttached && this.monitorViewEvents !== false; + views = shouldTriggerAttach ? views : []; + + _.each(views, function (view) { + if (view._isAttached) { + return; + } + + view.triggerMethod('before:attach', view); + }); + + this.attachHtml(els, this.$container); + + _.each(views, function (view) { + if (view._isAttached) { + return; + } + + view._isAttached = true; + view.triggerMethod('attach', view); + }); + }, + // Override this method to do something other than `.append`. + // You can attach any HTML at this point including the els. + attachHtml: function attachHtml(els, $container) { + this.Dom.appendContents($container[0], els, { + _$el: $container + }); + }, + isEmpty: function isEmpty() { + return !this.children.length; + }, + _showEmptyView: function _showEmptyView() { + var EmptyView = this._getEmptyView(); + + if (!EmptyView) { + return; + } + + var options = this._getEmptyViewOptions(); + + var emptyRegion = this.getEmptyRegion(); + emptyRegion.show(new EmptyView(options)); + }, + // Retrieve the empty view class + _getEmptyView: function _getEmptyView() { + var emptyView = this.emptyView; + + if (!emptyView) { + return; + } + + return this._getView(emptyView); + }, + // Remove the emptyView + _destroyEmptyView: function _destroyEmptyView() { + var emptyRegion = this.getEmptyRegion(); // Only empty if a view is show so the region + // doesn't detach any other unrelated HTML + + if (emptyRegion.hasView()) { + emptyRegion.empty(); + } + }, + // + _getEmptyViewOptions: function _getEmptyViewOptions() { + var emptyViewOptions = this.emptyViewOptions || this.childViewOptions; + + if (_.isFunction(emptyViewOptions)) { + return emptyViewOptions.call(this); + } + + return emptyViewOptions; + }, + swapChildViews: function swapChildViews(view1, view2) { + if (!this._children.hasView(view1) || !this._children.hasView(view2)) { + throw new MarionetteError({ + name: classErrorName$1, + message: 'Both views must be children of the collection view to swap.', + url: 'marionette.collectionview.html#swapping-child-views' + }); + } + + this._children._swap(view1, view2); + + this.Dom.swapEl(view1.el, view2.el); // If the views are not filtered the same, refilter + + if (this.children.hasView(view1) !== this.children.hasView(view2)) { + this.filter(); + } else { + this.children._swap(view1, view2); + } + + return this; + }, + // Render the child's view and add it to the HTML for the collection view at a given index, based on the current sort + addChildView: function addChildView(view, index) { + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + + if (!view || view._isDestroyed) { + return view; + } + + if (view._isShown) { + throw new MarionetteError({ + name: classErrorName$1, + message: 'View is already shown in a Region or CollectionView', + url: 'marionette.collectionview.html#region-viewAlreadyShown' + }); + } + + if (_.isObject(index)) { + options = index; + } // If options has defined index we should use it + + + if (options.index != null) { + index = options.index; + } + + if (!this._isRendered) { + this.render(); + } + + this._addChild(view, index); + + if (options.preventRender) { + this._hasUnrenderedViews = true; + return view; + } + + var hasIndex = typeof index !== 'undefined'; + var isAddedToEnd = !hasIndex || index >= this._children.length; // Only cache views if added to the end and there is no unrendered views + + if (isAddedToEnd && !this._hasUnrenderedViews) { + this._addedViews = [view]; + } + + if (hasIndex) { + this._renderChildren(); + } else { + this.sort(); + } + + return view; + }, + // Detach a view from the children. Best used when adding a + // childView from `addChildView` + detachChildView: function detachChildView(view) { + this.removeChildView(view, { + shouldDetach: true + }); + return view; + }, + // Remove the child view and destroy it. Best used when adding a + // childView from `addChildView` + // The options argument is for internal use only + removeChildView: function removeChildView(view, options) { + if (!view) { + return view; + } + + this._removeChildView(view, options); + + this._removeChild(view); + + if (this.isEmpty()) { + this._showEmptyView(); + } + + return view; + }, + _removeChildViews: function _removeChildViews(views) { + _.each(views, this._removeChildView.bind(this)); + }, + _removeChildView: function _removeChildView(view) { + var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + shouldDetach = _ref4.shouldDetach; + + view.off('destroy', this.removeChildView, this); + + if (shouldDetach) { + this._detachChildView(view); + } else { + this._destroyChildView(view); + } + + this.stopListening(view); + }, + _destroyChildView: function _destroyChildView(view) { + if (view._isDestroyed) { + return; + } + + var shouldDisableEvents = this.monitorViewEvents === false; + destroyView(view, shouldDisableEvents); + }, + // called by ViewMixin destroy + _removeChildren: function _removeChildren() { + this._destroyChildren(); + + var emptyRegion = this.getEmptyRegion(); + emptyRegion.destroy(); + delete this._addedViews; + }, + // Destroy the child views that this collection view is holding on to, if any + _destroyChildren: function _destroyChildren() { + if (!this._children.length) { + return; + } + + this.triggerMethod('before:destroy:children', this); + + if (this.monitorViewEvents === false) { + this.Dom.detachContents(this.el, this.$el); + } + + this._removeChildViews(this._children._views); // After all children have been destroyed re-init the container + + + this._children._init(); + + this.children._init(); + + this.triggerMethod('destroy:children', this); + } + }, { + setDomApi: setDomApi, + setRenderer: setRenderer + }); + + _.extend(CollectionView.prototype, ViewMixin); + + // Behavior + var ClassOptions$4 = ['collectionEvents', 'events', 'modelEvents', 'triggers', 'ui']; + + var Behavior = function Behavior(options, view) { + // Setup reference to the view. + // this comes in handle when a behavior + // wants to directly talk up the chain + // to the view. + this.view = view; + + this._setOptions(options, ClassOptions$4); + + this.cid = _.uniqueId(this.cidPrefix); // Construct an internal UI hash using the behaviors UI + // hash combined and overridden by the view UI hash. + // This allows the user to use UI hash elements defined + // in the parent view as well as those defined in the behavior. + // This order will help the reuse and share of a behavior + // between multiple views, while letting a view override + // a selector under an UI key. + + this.ui = _.extend({}, _.result(this, 'ui'), _.result(view, 'ui')); // Proxy view triggers + + this.listenTo(view, 'all', this.triggerMethod); + this.initialize.apply(this, arguments); + }; + + Behavior.extend = extend; // Behavior Methods + // -------------- + + _.extend(Behavior.prototype, CommonMixin, DelegateEntityEventsMixin, TriggersMixin, UIMixin, { + cidPrefix: 'mnb', + // This is a noop method intended to be overridden + initialize: function initialize() {}, + // proxy behavior $ method to the view + // this is useful for doing jquery DOM lookups + // scoped to behaviors view. + $: function $() { + return this.view.$.apply(this.view, arguments); + }, + // Stops the behavior from listening to events. + destroy: function destroy() { + this.stopListening(); + + this.view._removeBehavior(this); + + this._deleteEntityEventHandlers(); + + return this; + }, + proxyViewProperties: function proxyViewProperties() { + this.$el = this.view.$el; + this.el = this.view.el; + return this; + }, + bindUIElements: function bindUIElements() { + this._bindUIElements(); + + return this; + }, + unbindUIElements: function unbindUIElements() { + this._unbindUIElements(); + + return this; + }, + getUI: function getUI(name) { + return this._getUI(name); + }, + // Handle `modelEvents`, and `collectionEvents` configuration + delegateEntityEvents: function delegateEntityEvents() { + this._delegateEntityEvents(this.view.model, this.view.collection); + + return this; + }, + undelegateEntityEvents: function undelegateEntityEvents() { + this._undelegateEntityEvents(this.view.model, this.view.collection); + + return this; + }, + _getEvents: function _getEvents() { + var _this = this; + + if (!this.events) { + return; + } // Normalize behavior events hash to allow + // a user to use the @ui. syntax. + + + var behaviorEvents = this.normalizeUIKeys(_.result(this, 'events')); // binds the handler to the behavior and builds a unique eventName + + return _.reduce(behaviorEvents, function (events, behaviorHandler, key) { + if (!_.isFunction(behaviorHandler)) { + behaviorHandler = _this[behaviorHandler]; + } + + if (!behaviorHandler) { + return events; + } + + key = getNamespacedEventName(key, _this.cid); + events[key] = behaviorHandler.bind(_this); + return events; + }, {}); + }, + // Internal method to build all trigger handlers for a given behavior + _getTriggers: function _getTriggers() { + if (!this.triggers) { + return; + } // Normalize behavior triggers hash to allow + // a user to use the @ui. syntax. + + + var behaviorTriggers = this.normalizeUIKeys(_.result(this, 'triggers')); + return this._getViewTriggers(this.view, behaviorTriggers); + } + }); + + // Application + var ClassOptions$5 = ['channelName', 'radioEvents', 'radioRequests', 'region', 'regionClass']; + + var Application = function Application(options) { + this._setOptions(options, ClassOptions$5); + + this.cid = _.uniqueId(this.cidPrefix); + + this._initRegion(); + + this._initRadio(); + + this.initialize.apply(this, arguments); + }; + + Application.extend = extend; // Application Methods + // -------------- + + _.extend(Application.prototype, CommonMixin, DestroyMixin, RadioMixin, { + cidPrefix: 'mna', + // This is a noop method intended to be overridden + initialize: function initialize() {}, + // Kick off all of the application's processes. + start: function start(options) { + this.triggerMethod('before:start', this, options); + this.triggerMethod('start', this, options); + return this; + }, + regionClass: Region, + _initRegion: function _initRegion() { + var region = this.region; + + if (!region) { + return; + } + + var defaults = { + regionClass: this.regionClass + }; + this._region = buildRegion(region, defaults); + }, + getRegion: function getRegion() { + return this._region; + }, + showView: function showView(view) { + var region = this.getRegion(); + + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + region.show.apply(region, [view].concat(args)); + return view; + }, + getView: function getView() { + return this.getRegion().currentView; + } + }); + + var bindEvents$1 = proxy(bindEvents); + var unbindEvents$1 = proxy(unbindEvents); + var bindRequests$1 = proxy(bindRequests); + var unbindRequests$1 = proxy(unbindRequests); + var mergeOptions$1 = proxy(mergeOptions); + var getOption$1 = proxy(getOption); + var normalizeMethods$1 = proxy(normalizeMethods); + var triggerMethod$1 = proxy(triggerMethod); // Configuration + + var setDomApi$1 = function setDomApi(mixin) { + CollectionView.setDomApi(mixin); + Region.setDomApi(mixin); + View.setDomApi(mixin); + }; + var setRenderer$1 = function setRenderer(renderer) { + CollectionView.setRenderer(renderer); + View.setRenderer(renderer); + }; + var backbone_marionette = { + View: View, + CollectionView: CollectionView, + MnObject: MarionetteObject, + Object: MarionetteObject, + Region: Region, + Behavior: Behavior, + Application: Application, + isEnabled: isEnabled, + setEnabled: setEnabled, + monitorViewEvents: monitorViewEvents, + Events: Events, + extend: extend, + DomApi: DomApi, + VERSION: version + }; + + exports.Application = Application; + exports.Behavior = Behavior; + exports.CollectionView = CollectionView; + exports.DomApi = DomApi; + exports.Events = Events; + exports.MnObject = MarionetteObject; + exports.Region = Region; + exports.VERSION = version; + exports.View = View; + exports.bindEvents = bindEvents$1; + exports.bindRequests = bindRequests$1; + exports.default = backbone_marionette; + exports.extend = extend; + exports.getOption = getOption$1; + exports.isEnabled = isEnabled; + exports.mergeOptions = mergeOptions$1; + exports.monitorViewEvents = monitorViewEvents; + exports.normalizeMethods = normalizeMethods$1; + exports.setDomApi = setDomApi$1; + exports.setEnabled = setEnabled; + exports.setRenderer = setRenderer$1; + exports.triggerMethod = triggerMethod$1; + exports.unbindEvents = unbindEvents$1; + exports.unbindRequests = unbindRequests$1; + + Object.defineProperty(exports, '__esModule', { value: true }); + +})); +this && this.Marionette && (this.Mn = this.Marionette); +//# sourceMappingURL=backbone.marionette.js.map diff --git a/dist/backbone.marionette.js.map b/dist/backbone.marionette.js.map new file mode 100644 index 0000000000..8e2bdbb661 --- /dev/null +++ b/dist/backbone.marionette.js.map @@ -0,0 +1 @@ +{"version":3,"file":"backbone.marionette.js","sources":["../src/utils/proxy.js","../src/utils/extend.js","../src/common/normalize-methods.js","../src/utils/error.js","../src/common/bind-events.js","../src/common/bind-requests.js","../src/common/get-option.js","../src/common/merge-options.js","../src/common/monitor-view-events.js","../src/common/trigger-method.js","../src/mixins/events.js","../src/mixins/common.js","../src/mixins/destroy.js","../src/mixins/radio.js","../src/object.js","../src/utils/invoke.js","../src/mixins/behaviors.js","../src/mixins/delegate-entity-events.js","../src/mixins/template-render.js","../src/utils/get-namespaced-event-name.js","../src/config/features.js","../src/mixins/triggers.js","../src/mixins/ui.js","../src/config/dom.js","../src/mixins/view.js","../src/common/view.js","../src/region.js","../src/common/build-region.js","../src/mixins/regions.js","../src/config/renderer.js","../src/view.js","../src/child-view-container.js","../src/collection-view.js","../src/behavior.js","../src/application.js","../src/backbone.marionette.js"],"sourcesContent":["//Internal utility for creating context style global utils\nconst proxy = function(method) {\n return function(context, ...args) {\n return method.apply(context, args);\n };\n};\n\nexport default proxy;\n","// Marionette.extend\n// -----------------\n\nimport Backbone from 'backbone';\n\n// Borrow the Backbone `extend` method so we can use it as needed\nconst extend = Backbone.Model.extend;\n\nexport default extend;\n","import _ from 'underscore';\n\n// Marionette.normalizeMethods\n// ----------------------\n\n// Pass in a mapping of events => functions or function names\n// and return a mapping of events => functions\nconst normalizeMethods = function(hash) {\n if (!hash) { return }\n\n return _.reduce(hash, (normalizedHash, method, name) => {\n if (!_.isFunction(method)) {\n method = this[method];\n }\n if (method) {\n normalizedHash[name] = method;\n }\n return normalizedHash;\n }, {});\n};\n\nexport default normalizeMethods;\n","// Error\n// -----\n\nimport _ from 'underscore';\nimport extend from './extend';\nimport {version} from '../../package.json';\n\nconst errorProps = ['description', 'fileName', 'lineNumber', 'name', 'message', 'number', 'url'];\n\nconst MarionetteError = extend.call(Error, {\n urlRoot: `http://marionettejs.com/docs/v${version}/`,\n\n url: '',\n\n constructor(options) {\n const error = Error.call(this, options.message);\n _.extend(this, _.pick(error, errorProps), _.pick(options, errorProps));\n\n if (Error.captureStackTrace) {\n this.captureStackTrace();\n }\n\n this.url = this.urlRoot + this.url;\n },\n\n captureStackTrace() {\n Error.captureStackTrace(this, MarionetteError);\n },\n\n toString() {\n return `${ this.name }: ${ this.message } See: ${ this.url }`;\n }\n});\n\nexport default MarionetteError;\n","// Bind Entity Events & Unbind Entity Events\n// -----------------------------------------\n//\n// These methods are used to bind/unbind a backbone \"entity\" (e.g. collection/model)\n// to methods on a target object.\n//\n// The first parameter, `target`, must have the Backbone.Events module mixed in.\n//\n// The second parameter is the `entity` (Backbone.Model, Backbone.Collection or\n// any object that has Backbone.Events mixed in) to bind the events from.\n//\n// The third parameter is a hash of { \"event:name\": \"eventHandler\" }\n// configuration. Multiple handlers can be separated by a space. A\n// function can be supplied instead of a string handler name.\n\nimport _ from 'underscore';\nimport normalizeMethods from './normalize-methods';\nimport MarionetteError from '../utils/error';\n\nfunction normalizeBindings(context, bindings) {\n if (!_.isObject(bindings)) {\n throw new MarionetteError({\n message: 'Bindings must be an object.',\n url: 'common.html#bindevents'\n });\n }\n\n return normalizeMethods.call(context, bindings);\n}\n\nfunction bindEvents(entity, bindings) {\n if (!entity || !bindings) { return this; }\n\n this.listenTo(entity, normalizeBindings(this, bindings));\n\n return this;\n}\n\nfunction unbindEvents(entity, bindings) {\n if (!entity) { return this; }\n\n if (!bindings) {\n this.stopListening(entity);\n return this;\n }\n\n this.stopListening(entity, normalizeBindings(this, bindings));\n\n return this;\n}\n\n// Export Public API\nexport {\n bindEvents,\n unbindEvents\n};\n","// Bind/Unbind Radio Requests\n// -----------------------------------------\n//\n// These methods are used to bind/unbind a backbone.radio request\n// to methods on a target object.\n//\n// The first parameter, `target`, will set the context of the reply method\n//\n// The second parameter is the `Radio.channel` to bind the reply to.\n//\n// The third parameter is a hash of { \"request:name\": \"replyHandler\" }\n// configuration. A function can be supplied instead of a string handler name.\n\nimport _ from 'underscore';\nimport normalizeMethods from './normalize-methods';\nimport MarionetteError from '../utils/error';\n\nfunction normalizeBindings(context, bindings) {\n if (!_.isObject(bindings)) {\n throw new MarionetteError({\n message: 'Bindings must be an object.',\n url: 'common.html#bindrequests'\n });\n }\n\n return normalizeMethods.call(context, bindings);\n}\n\nfunction bindRequests(channel, bindings) {\n if (!channel || !bindings) { return this; }\n\n channel.reply(normalizeBindings(this, bindings), this);\n\n return this;\n}\n\nfunction unbindRequests(channel, bindings) {\n if (!channel) { return this; }\n\n if (!bindings) {\n channel.stopReplying(null, null, this);\n return this;\n }\n\n channel.stopReplying(normalizeBindings(this, bindings));\n\n return this;\n}\n\nexport {\n bindRequests,\n unbindRequests\n};\n","// Marionette.getOption\n// --------------------\n\n// Retrieve an object, function or other value from the\n// object or its `options`, with `options` taking precedence.\nconst getOption = function(optionName) {\n if (!optionName) { return; }\n if (this.options && (this.options[optionName] !== undefined)) {\n return this.options[optionName];\n } else {\n return this[optionName];\n }\n};\n\nexport default getOption;\n","import _ from 'underscore';\n\n// Merge `keys` from `options` onto `this`\nconst mergeOptions = function(options, keys) {\n if (!options) { return; }\n\n _.each(keys, (key) => {\n const option = options[key];\n if (option !== undefined) {\n this[key] = option;\n }\n });\n};\n\nexport default mergeOptions;\n","// DOM Refresh\n// -----------\n\nimport _ from 'underscore';\n\n// Trigger method on children unless a pure Backbone.View\nfunction triggerMethodChildren(view, event, shouldTrigger) {\n if (!view._getImmediateChildren) { return; }\n _.each(view._getImmediateChildren(), child => {\n if (!shouldTrigger(child)) { return; }\n child.triggerMethod(event, child);\n });\n}\n\nfunction shouldTriggerAttach(view) {\n return !view._isAttached;\n}\n\nfunction shouldAttach(view) {\n if (!shouldTriggerAttach(view)) { return false; }\n view._isAttached = true;\n return true;\n}\n\nfunction shouldTriggerDetach(view) {\n return view._isAttached;\n}\n\nfunction shouldDetach(view) {\n view._isAttached = false;\n return true;\n}\n\nfunction triggerDOMRefresh(view) {\n if (view._isAttached && view._isRendered) {\n view.triggerMethod('dom:refresh', view);\n }\n}\n\nfunction triggerDOMRemove(view) {\n if (view._isAttached && view._isRendered) {\n view.triggerMethod('dom:remove', view);\n }\n}\n\nfunction handleBeforeAttach() {\n triggerMethodChildren(this, 'before:attach', shouldTriggerAttach);\n}\n\nfunction handleAttach() {\n triggerMethodChildren(this, 'attach', shouldAttach);\n triggerDOMRefresh(this);\n}\n\nfunction handleBeforeDetach() {\n triggerMethodChildren(this, 'before:detach', shouldTriggerDetach);\n triggerDOMRemove(this);\n}\n\nfunction handleDetach() {\n triggerMethodChildren(this, 'detach', shouldDetach);\n}\n\nfunction handleBeforeRender() {\n triggerDOMRemove(this);\n}\n\nfunction handleRender() {\n triggerDOMRefresh(this);\n}\n\n// Monitor a view's state, propagating attach/detach events to children and firing dom:refresh\n// whenever a rendered view is attached or an attached view is rendered.\nfunction monitorViewEvents(view) {\n if (view._areViewEventsMonitored || view.monitorViewEvents === false) { return; }\n\n view._areViewEventsMonitored = true;\n\n view.on({\n 'before:attach': handleBeforeAttach,\n 'attach': handleAttach,\n 'before:detach': handleBeforeDetach,\n 'detach': handleDetach,\n 'before:render': handleBeforeRender,\n 'render': handleRender\n });\n}\n\nexport default monitorViewEvents;\n","// Trigger Method\n// --------------\n\nimport _ from 'underscore';\nimport getOption from './get-option';\n\n// split the event name on the \":\"\nconst splitter = /(^|:)(\\w)/gi;\n\n// Only calc getOnMethodName once\nconst methodCache = {};\n\n// take the event section (\"section1:section2:section3\")\n// and turn it in to uppercase name onSection1Section2Section3\nfunction getEventName(match, prefix, eventName) {\n return eventName.toUpperCase();\n}\n\nconst getOnMethodName = function(event) {\n if (!methodCache[event]) {\n methodCache[event] = 'on' + event.replace(splitter, getEventName);\n }\n\n return methodCache[event];\n};\n\n// Trigger an event and/or a corresponding method name. Examples:\n//\n// `this.triggerMethod(\"foo\")` will trigger the \"foo\" event and\n// call the \"onFoo\" method.\n//\n// `this.triggerMethod(\"foo:bar\")` will trigger the \"foo:bar\" event and\n// call the \"onFooBar\" method.\nexport default function triggerMethod(event) {\n // get the method name from the event name\n const methodName = getOnMethodName(event);\n const method = getOption.call(this, methodName);\n let result;\n\n // call the onMethodName if it exists\n if (_.isFunction(method)) {\n // pass all args, except the event name\n result = method.apply(this, _.drop(arguments));\n }\n\n // trigger the event\n this.trigger.apply(this, arguments);\n\n return result;\n}\n","import triggerMethod from '../common/trigger-method';\n\nexport default {\n triggerMethod\n}\n","import _ from 'underscore';\nimport Backbone from 'backbone';\n\nimport getOption from '../common/get-option';\nimport mergeOptions from '../common/merge-options';\nimport normalizeMethods from '../common/normalize-methods';\nimport triggerMethod from '../common/trigger-method';\nimport {\n bindEvents,\n unbindEvents\n} from '../common/bind-events';\nimport {\n bindRequests,\n unbindRequests\n} from '../common/bind-requests';\n\nconst CommonMixin = {\n\n // Imports the \"normalizeMethods\" to transform hashes of\n // events=>function references/names to a hash of events=>function references\n normalizeMethods,\n\n _setOptions(options, classOptions) {\n this.options = _.extend({}, _.result(this, 'options'), options);\n this.mergeOptions(options, classOptions);\n },\n\n // A handy way to merge passed-in options onto the instance\n mergeOptions,\n\n // Enable getting options from this or this.options by name.\n getOption,\n\n // Enable binding view's events from another entity.\n bindEvents,\n\n // Enable unbinding view's events from another entity.\n unbindEvents,\n\n // Enable binding view's requests.\n bindRequests,\n\n // Enable unbinding view's requests.\n unbindRequests,\n\n triggerMethod\n};\n\n_.extend(CommonMixin, Backbone.Events);\n\nexport default CommonMixin;\n","export default {\n _isDestroyed: false,\n\n isDestroyed() {\n return this._isDestroyed;\n },\n\n destroy(options) {\n if (this._isDestroyed) { return this; }\n\n this.triggerMethod('before:destroy', this, options);\n this._isDestroyed = true;\n this.triggerMethod('destroy', this, options);\n this.stopListening();\n\n return this;\n }\n};\n","import _ from 'underscore';\nimport Radio from 'backbone.radio';\nimport MarionetteError from '../utils/error';\n\n// MixinOptions\n// - channelName\n// - radioEvents\n// - radioRequests\n\nexport default {\n\n _initRadio() {\n const channelName = _.result(this, 'channelName');\n\n if (!channelName) {\n return;\n }\n\n /* istanbul ignore next */\n if (!Radio) {\n throw new MarionetteError({\n message: 'The dependency \"backbone.radio\" is missing.',\n url: 'backbone.radio.html#marionette-integration'\n });\n }\n\n const channel = this._channel = Radio.channel(channelName);\n\n const radioEvents = _.result(this, 'radioEvents');\n this.bindEvents(channel, radioEvents);\n\n const radioRequests = _.result(this, 'radioRequests');\n this.bindRequests(channel, radioRequests);\n\n this.on('destroy', this._destroyRadio);\n },\n\n _destroyRadio() {\n this._channel.stopReplying(null, null, this);\n },\n\n getChannel() {\n return this._channel;\n }\n};\n","// Object\n// ------\n\nimport _ from 'underscore';\nimport extend from './utils/extend';\nimport CommonMixin from './mixins/common';\nimport DestroyMixin from './mixins/destroy';\nimport RadioMixin from './mixins/radio';\n\nconst ClassOptions = [\n 'channelName',\n 'radioEvents',\n 'radioRequests'\n];\n\n// Object borrows many conventions and utilities from Backbone.\nconst MarionetteObject = function(options) {\n this._setOptions(options, ClassOptions);\n this.cid = _.uniqueId(this.cidPrefix);\n this._initRadio();\n this.initialize.apply(this, arguments);\n};\n\nMarionetteObject.extend = extend;\n\n// Object Methods\n// --------------\n\n_.extend(MarionetteObject.prototype, CommonMixin, DestroyMixin, RadioMixin, {\n cidPrefix: 'mno',\n\n // This is a noop method intended to be overridden\n initialize() {}\n});\n\nexport default MarionetteObject;\n","// Implementation of the invoke method (http://underscorejs.org/#invoke) with support for\n// lodash v3, v4, and underscore.js\nimport _ from 'underscore';\n\nexport default _.invokeMap || _.invoke;\n","import _ from 'underscore';\nimport MarionetteError from '../utils/error';\nimport _invoke from '../utils/invoke';\n\n// MixinOptions\n// - behaviors\n\n// Takes care of getting the behavior class\n// given options and a key.\n// If a user passes in options.behaviorClass\n// default to using that.\n// If a user passes in a Behavior Class directly, use that\n// Otherwise an error is thrown\nfunction getBehaviorClass(options) {\n if (options.behaviorClass) {\n return { BehaviorClass: options.behaviorClass, options };\n }\n\n //treat functions as a Behavior constructor\n if (_.isFunction(options)) {\n return { BehaviorClass: options, options: {} };\n }\n\n throw new MarionetteError({\n message: 'Unable to get behavior class. A Behavior constructor should be passed directly or as behaviorClass property of options',\n url: 'marionette.behavior.html#defining-and-attaching-behaviors'\n });\n}\n\n// Iterate over the behaviors object, for each behavior\n// instantiate it and get its grouped behaviors.\n// This accepts a list of behaviors in either an object or array form\nfunction parseBehaviors(view, behaviors, allBehaviors) {\n return _.reduce(behaviors, (reducedBehaviors, behaviorDefiniton) => {\n const { BehaviorClass, options } = getBehaviorClass(behaviorDefiniton);\n const behavior = new BehaviorClass(options, view);\n reducedBehaviors.push(behavior);\n\n return parseBehaviors(view, _.result(behavior, 'behaviors'), reducedBehaviors);\n }, allBehaviors);\n}\n\nexport default {\n _initBehaviors() {\n this._behaviors = parseBehaviors(this, _.result(this, 'behaviors'), []);\n },\n\n _getBehaviorTriggers() {\n const triggers = _invoke(this._behaviors, '_getTriggers');\n return _.reduce(triggers, function(memo, _triggers) {\n return _.extend(memo, _triggers);\n }, {});\n },\n\n _getBehaviorEvents() {\n const events = _invoke(this._behaviors, '_getEvents');\n return _.reduce(events, function(memo, _events) {\n return _.extend(memo, _events);\n }, {});\n },\n\n // proxy behavior $el to the view's $el.\n _proxyBehaviorViewProperties() {\n _invoke(this._behaviors, 'proxyViewProperties');\n },\n\n // delegate modelEvents and collectionEvents\n _delegateBehaviorEntityEvents() {\n _invoke(this._behaviors, 'delegateEntityEvents');\n },\n\n // undelegate modelEvents and collectionEvents\n _undelegateBehaviorEntityEvents() {\n _invoke(this._behaviors, 'undelegateEntityEvents');\n },\n\n _destroyBehaviors(options) {\n // Call destroy on each behavior after\n // destroying the view.\n // This unbinds event listeners\n // that behaviors have registered for.\n _invoke(this._behaviors, 'destroy', options);\n },\n\n // Remove a behavior\n _removeBehavior(behavior) {\n // Don't worry about the clean up if the view is destroyed\n if (this._isDestroyed) { return; }\n\n // Remove behavior-only triggers and events\n this.undelegate(`.trig${ behavior.cid } .${ behavior.cid }`);\n\n this._behaviors = _.without(this._behaviors, behavior);\n },\n\n _bindBehaviorUIElements() {\n _invoke(this._behaviors, 'bindUIElements');\n },\n\n _unbindBehaviorUIElements() {\n _invoke(this._behaviors, 'unbindUIElements');\n },\n\n _triggerEventOnBehaviors(eventName, view, options) {\n _invoke(this._behaviors, 'triggerMethod', eventName, view, options);\n }\n};\n","import _ from 'underscore';\n\n// MixinOptions\n// - collectionEvents\n// - modelEvents\n\nexport default {\n // Handle `modelEvents`, and `collectionEvents` configuration\n _delegateEntityEvents(model, collection) {\n if (model) {\n this._modelEvents = _.result(this, 'modelEvents');\n this.bindEvents(model, this._modelEvents);\n }\n\n if (collection) {\n this._collectionEvents = _.result(this, 'collectionEvents');\n this.bindEvents(collection, this._collectionEvents);\n }\n },\n\n // Remove any previously delegate entity events\n _undelegateEntityEvents(model, collection) {\n if (this._modelEvents) {\n this.unbindEvents(model, this._modelEvents);\n delete this._modelEvents;\n }\n\n if (this._collectionEvents) {\n this.unbindEvents(collection, this._collectionEvents);\n delete this._collectionEvents;\n }\n },\n\n // Remove cached event handlers\n _deleteEntityEventHandlers() {\n delete this._modelEvents;\n delete this._collectionEvents;\n }\n};\n","import _ from 'underscore';\n\n// MixinOptions\n// - template\n// - templateContext\n\nexport default {\n\n // Internal method to render the template with the serialized data\n // and template context\n _renderTemplate(template) {\n // Add in entity data and template context\n const data = this.mixinTemplateContext(this.serializeData()) || {};\n\n // Render and add to el\n const html = this._renderHtml(template, data);\n if (typeof html !== 'undefined') {\n this.attachElContent(html);\n }\n },\n\n // Get the template for this view instance.\n // You can set a `template` attribute in the view definition\n // or pass a `template: TemplateFunction` parameter in\n // to the constructor options.\n getTemplate() {\n return this.template;\n },\n\n // Mix in template context methods. Looks for a\n // `templateContext` attribute, which can either be an\n // object literal, or a function that returns an object\n // literal. All methods and attributes from this object\n // are copies to the object passed in.\n mixinTemplateContext(serializedData) {\n const templateContext = _.result(this, 'templateContext');\n if (!templateContext) { return serializedData; }\n if (!serializedData) { return templateContext; }\n return _.extend({}, serializedData, templateContext);\n },\n\n // Serialize the view's model *or* collection, if\n // it exists, for the template\n serializeData() {\n // If we have a model, we serialize that\n if (this.model) {\n return this.serializeModel();\n }\n\n // Otherwise, we serialize the collection,\n // making it available under the `items` property\n if (this.collection) {\n return {\n items: this.serializeCollection()\n };\n }\n },\n\n // Prepares the special `model` property of a view\n // for being displayed in the template. Override this if\n // you need a custom transformation for your view's model\n serializeModel() {\n return this.model.attributes;\n },\n\n // Serialize a collection\n serializeCollection() {\n return _.map(this.collection.models, model => model.attributes);\n },\n\n // Renders the data into the template\n _renderHtml(template, data) {\n return template(data);\n },\n\n // Attaches the content of a given view.\n // This method can be overridden to optimize rendering,\n // or to render in a non standard way.\n //\n // For example, using `innerHTML` instead of `$el.html`\n //\n // ```js\n // attachElContent(html) {\n // this.el.innerHTML = html;\n // }\n // ```\n attachElContent(html) {\n this.Dom.setContents(this.el, html, this.$el);\n }\n};\n","// Borrow event splitter from Backbone\nconst delegateEventSplitter = /^(\\S+)\\s*(.*)$/;\n\n// Set event name to be namespaced using a unique index\n// to generate a non colliding event namespace\n// http://api.jquery.com/event.namespace/\nconst getNamespacedEventName = function(eventName, namespace) {\n const match = eventName.match(delegateEventSplitter);\n return `${ match[1] }.${ namespace } ${ match[2] }`;\n};\n\nexport default getNamespacedEventName;\n","// Add Feature flags here\n// e.g. 'class' => false\nconst FEATURES = {\n childViewEventPrefix: false,\n triggersStopPropagation: true,\n triggersPreventDefault: true,\n DEV_MODE: false\n};\n\nfunction isEnabled(name) {\n return !!FEATURES[name];\n}\n\nfunction setEnabled(name, state) {\n return FEATURES[name] = state;\n}\n\nexport {\n FEATURES,\n setEnabled,\n isEnabled\n};\n","import _ from 'underscore';\nimport getNamespacedEventName from '../utils/get-namespaced-event-name';\nimport { isEnabled } from '../config/features';\n\n// Internal method to create an event handler for a given `triggerDef` like\n// 'click:foo'\nfunction buildViewTrigger(view, triggerDef) {\n if (_.isString(triggerDef)) {\n triggerDef = {event: triggerDef};\n }\n\n const eventName = triggerDef.event;\n\n let shouldPreventDefault = !!triggerDef.preventDefault;\n\n if (isEnabled('triggersPreventDefault')) {\n shouldPreventDefault = triggerDef.preventDefault !== false;\n }\n\n let shouldStopPropagation = !!triggerDef.stopPropagation;\n\n if (isEnabled('triggersStopPropagation')) {\n shouldStopPropagation = triggerDef.stopPropagation !== false;\n }\n\n return function(event, ...args) {\n if (shouldPreventDefault) {\n event.preventDefault();\n }\n\n if (shouldStopPropagation) {\n event.stopPropagation();\n }\n\n view.triggerMethod(eventName, view, event, ...args);\n };\n}\n\nexport default {\n\n // Configure `triggers` to forward DOM events to view\n // events. `triggers: {\"click .foo\": \"do:foo\"}`\n _getViewTriggers(view, triggers) {\n // Configure the triggers, prevent default\n // action and stop propagation of DOM events\n return _.reduce(triggers, (events, value, key) => {\n key = getNamespacedEventName(key, `trig${ this.cid }`);\n events[key] = buildViewTrigger(view, value);\n return events;\n }, {});\n }\n\n};\n","import _ from 'underscore';\n// allows for the use of the @ui. syntax within\n// a given key for triggers and events\n// swaps the @ui with the associated selector.\n// Returns a new, non-mutated, parsed events hash.\nconst normalizeUIKeys = function(hash, ui) {\n return _.reduce(hash, (memo, val, key) => {\n const normalizedKey = normalizeUIString(key, ui);\n memo[normalizedKey] = val;\n return memo;\n }, {});\n};\n\nconst uiRegEx = /@ui\\.[a-zA-Z-_$0-9]*/g;\n\n// utility method for parsing @ui. syntax strings\n// into associated selector\nconst normalizeUIString = function(uiString, ui) {\n return uiString.replace(uiRegEx, (r) => {\n return ui[r.slice(4)];\n });\n};\n\n// allows for the use of the @ui. syntax within\n// a given value for regions\n// swaps the @ui with the associated selector\nconst normalizeUIValues = function(hash, ui, property) {\n _.each(hash, (val, key) => {\n if (_.isString(val)) {\n hash[key] = normalizeUIString(val, ui);\n } else if (val) {\n const propertyVal = val[property];\n if (_.isString(propertyVal)) {\n val[property] = normalizeUIString(propertyVal, ui);\n }\n }\n });\n return hash;\n};\n\nexport default {\n\n // normalize the keys of passed hash with the views `ui` selectors.\n // `{\"@ui.foo\": \"bar\"}`\n normalizeUIKeys(hash) {\n const uiBindings = this._getUIBindings();\n return normalizeUIKeys(hash, uiBindings);\n },\n\n // normalize the passed string with the views `ui` selectors.\n // `\"@ui.bar\"`\n normalizeUIString(uiString) {\n const uiBindings = this._getUIBindings();\n return normalizeUIString(uiString, uiBindings);\n },\n\n // normalize the values of passed hash with the views `ui` selectors.\n // `{foo: \"@ui.bar\"}`\n normalizeUIValues(hash, property) {\n const uiBindings = this._getUIBindings();\n return normalizeUIValues(hash, uiBindings, property);\n },\n\n _getUIBindings() {\n const uiBindings = _.result(this, '_uiBindings');\n return uiBindings || _.result(this, 'ui');\n },\n\n // This method binds the elements specified in the \"ui\" hash inside the view's code with\n // the associated jQuery selectors.\n _bindUIElements() {\n if (!this.ui) { return; }\n\n // store the ui hash in _uiBindings so they can be reset later\n // and so re-rendering the view will be able to find the bindings\n if (!this._uiBindings) {\n this._uiBindings = this.ui;\n }\n\n // get the bindings result, as a function or otherwise\n const bindings = _.result(this, '_uiBindings');\n\n // empty the ui so we don't have anything to start with\n this._ui = {};\n\n // bind each of the selectors\n _.each(bindings, (selector, key) => {\n this._ui[key] = this.$(selector);\n });\n\n this.ui = this._ui;\n },\n\n _unbindUIElements() {\n if (!this.ui || !this._uiBindings) { return; }\n\n // delete all of the existing ui bindings\n _.each(this.ui, ($el, name) => {\n delete this.ui[name];\n });\n\n // reset the ui element to the original bindings configuration\n this.ui = this._uiBindings;\n delete this._uiBindings;\n delete this._ui;\n },\n\n _getUI(name) {\n return this._ui[name];\n }\n};\n","// DomApi\n// ---------\nimport _ from 'underscore';\nimport Backbone from 'backbone';\n\n// Performant method for returning the jQuery instance\nfunction getEl(el) {\n return el instanceof Backbone.$ ? el : Backbone.$(el);\n}\n\n// Static setter\nexport function setDomApi(mixin) {\n this.prototype.Dom = _.extend({}, this.prototype.Dom, mixin);\n return this;\n}\n\nexport default {\n\n // Returns a new HTML DOM node instance\n createBuffer() {\n return document.createDocumentFragment();\n },\n\n // Returns the document element for a given DOM element\n getDocumentEl(el) {\n return el.ownerDocument.documentElement;\n },\n\n // Lookup the `selector` string\n // Selector may also be a DOM element\n // Returns an array-like object of nodes\n getEl(selector) {\n return getEl(selector);\n },\n\n // Finds the `selector` string with the el\n // Returns an array-like object of nodes\n findEl(el, selector) {\n return getEl(el).find(selector);\n },\n\n // Returns true if the el contains the node childEl\n hasEl(el, childEl) {\n return el.contains(childEl && childEl.parentNode);\n },\n\n // Detach `el` from the DOM without removing listeners\n detachEl(el, _$el = getEl(el)) {\n _$el.detach();\n },\n\n // Remove `oldEl` from the DOM and put `newEl` in its place\n replaceEl(newEl, oldEl) {\n if (newEl === oldEl) {\n return;\n }\n\n const parent = oldEl.parentNode;\n\n if (!parent) {\n return;\n }\n\n parent.replaceChild(newEl, oldEl);\n },\n\n // Swaps the location of `el1` and `el2` in the DOM\n swapEl(el1, el2) {\n if (el1 === el2) {\n return;\n }\n\n const parent1 = el1.parentNode;\n const parent2 = el2.parentNode;\n\n if (!parent1 || !parent2) {\n return;\n }\n\n const next1 = el1.nextSibling;\n const next2 = el2.nextSibling;\n\n parent1.insertBefore(el2, next1);\n parent2.insertBefore(el1, next2);\n },\n\n // Replace the contents of `el` with the HTML string of `html`\n setContents(el, html, _$el = getEl(el)) {\n _$el.html(html);\n },\n\n // Takes the DOM node `el` and appends the DOM node `contents`\n // to the end of the element's contents.\n appendContents(el, contents, {_$el = getEl(el), _$contents = getEl(contents)} = {}) {\n _$el.append(_$contents);\n },\n\n // Does the el have child nodes\n hasContents(el) {\n return !!el && el.hasChildNodes();\n },\n\n // Remove the inner contents of `el` from the DOM while leaving\n // `el` itself in the DOM.\n detachContents(el, _$el = getEl(el)) {\n _$el.contents().detach();\n }\n};\n","// ViewMixin\n// ---------\n\nimport Backbone from 'backbone';\nimport _ from 'underscore';\nimport BehaviorsMixin from './behaviors';\nimport CommonMixin from './common';\nimport DelegateEntityEventsMixin from './delegate-entity-events';\nimport TemplateRenderMixin from './template-render';\nimport TriggersMixin from './triggers';\nimport UIMixin from './ui';\nimport { isEnabled } from '../config/features';\nimport DomApi from '../config/dom';\n\n// MixinOptions\n// - behaviors\n// - childViewEventPrefix\n// - childViewEvents\n// - childViewTriggers\n// - collectionEvents\n// - modelEvents\n// - triggers\n// - ui\n\n\nconst ViewMixin = {\n Dom: DomApi,\n\n _isElAttached() {\n return !!this.el && this.Dom.hasEl(this.Dom.getDocumentEl(this.el), this.el);\n },\n\n supportsRenderLifecycle: true,\n supportsDestroyLifecycle: true,\n\n _isDestroyed: false,\n\n isDestroyed() {\n return !!this._isDestroyed;\n },\n\n _isRendered: false,\n\n isRendered() {\n return !!this._isRendered;\n },\n\n _isAttached: false,\n\n isAttached() {\n return !!this._isAttached;\n },\n\n // Overriding Backbone.View's `delegateEvents` to handle\n // `events` and `triggers`\n delegateEvents(events) {\n this._proxyBehaviorViewProperties();\n this._buildEventProxies();\n\n const combinedEvents = _.extend({},\n this._getBehaviorEvents(),\n this._getEvents(events),\n this._getBehaviorTriggers(),\n this._getTriggers()\n );\n\n Backbone.View.prototype.delegateEvents.call(this, combinedEvents);\n\n return this;\n },\n\n // Allows Backbone.View events to utilize `@ui.` selectors\n _getEvents(events) {\n if (events) {\n return this.normalizeUIKeys(events);\n }\n\n if (!this.events) { return; }\n\n return this.normalizeUIKeys(_.result(this, 'events'));\n },\n\n // Configure `triggers` to forward DOM events to view\n // events. `triggers: {\"click .foo\": \"do:foo\"}`\n _getTriggers() {\n if (!this.triggers) { return; }\n\n // Allow `triggers` to be configured as a function\n const triggers = this.normalizeUIKeys(_.result(this, 'triggers'));\n\n // Configure the triggers, prevent default\n // action and stop propagation of DOM events\n return this._getViewTriggers(this, triggers);\n },\n\n // Handle `modelEvents`, and `collectionEvents` configuration\n delegateEntityEvents() {\n this._delegateEntityEvents(this.model, this.collection);\n\n // bind each behaviors model and collection events\n this._delegateBehaviorEntityEvents();\n\n return this;\n },\n\n // Handle unbinding `modelEvents`, and `collectionEvents` configuration\n undelegateEntityEvents() {\n this._undelegateEntityEvents(this.model, this.collection);\n\n // unbind each behaviors model and collection events\n this._undelegateBehaviorEntityEvents();\n\n return this;\n },\n\n // Handle destroying the view and its children.\n destroy(options) {\n if (this._isDestroyed || this._isDestroying) { return this; }\n this._isDestroying = true;\n const shouldTriggerDetach = this._isAttached && !this._disableDetachEvents;\n\n this.triggerMethod('before:destroy', this, options);\n if (shouldTriggerDetach) {\n this.triggerMethod('before:detach', this);\n }\n\n // unbind UI elements\n this.unbindUIElements();\n\n // remove the view from the DOM\n this._removeElement();\n\n if (shouldTriggerDetach) {\n this._isAttached = false;\n this.triggerMethod('detach', this);\n }\n\n // remove children after the remove to prevent extra paints\n this._removeChildren();\n\n this._isDestroyed = true;\n this._isRendered = false;\n\n // Destroy behaviors after _isDestroyed flag\n this._destroyBehaviors(options);\n\n this._deleteEntityEventHandlers();\n\n this.triggerMethod('destroy', this, options);\n this._triggerEventOnBehaviors('destroy', this, options);\n\n this.stopListening();\n\n return this;\n },\n\n // Equates to this.$el.remove\n _removeElement() {\n this.$el.off().removeData();\n this.Dom.detachEl(this.el, this.$el);\n },\n\n // This method binds the elements specified in the \"ui\" hash\n bindUIElements() {\n this._bindUIElements();\n this._bindBehaviorUIElements();\n\n return this;\n },\n\n // This method unbinds the elements specified in the \"ui\" hash\n unbindUIElements() {\n this._unbindUIElements();\n this._unbindBehaviorUIElements();\n\n return this;\n },\n\n getUI(name) {\n return this._getUI(name);\n },\n\n // Cache `childViewEvents` and `childViewTriggers`\n _buildEventProxies() {\n this._childViewEvents = this.normalizeMethods(_.result(this, 'childViewEvents'));\n this._childViewTriggers = _.result(this, 'childViewTriggers');\n this._eventPrefix = this._getEventPrefix();\n },\n\n _getEventPrefix() {\n const defaultPrefix = isEnabled('childViewEventPrefix') ? 'childview' : false;\n const prefix = _.result(this, 'childViewEventPrefix', defaultPrefix);\n\n return (prefix === false) ? prefix : prefix + ':';\n },\n\n _proxyChildViewEvents(view) {\n if (this._childViewEvents || this._childViewTriggers || this._eventPrefix) {\n this.listenTo(view, 'all', this._childViewEventHandler);\n }\n },\n\n _childViewEventHandler(eventName, ...args) {\n const childViewEvents = this._childViewEvents;\n\n // call collectionView childViewEvent if defined\n if (childViewEvents && childViewEvents[eventName]) {\n childViewEvents[eventName].apply(this, args);\n }\n\n // use the parent view's proxyEvent handlers\n const childViewTriggers = this._childViewTriggers;\n\n // Call the event with the proxy name on the parent layout\n if (childViewTriggers && childViewTriggers[eventName]) {\n this.triggerMethod(childViewTriggers[eventName], ...args);\n }\n\n if (this._eventPrefix) {\n this.triggerMethod(this._eventPrefix + eventName, ...args);\n }\n }\n};\n\n_.extend(ViewMixin, BehaviorsMixin, CommonMixin, DelegateEntityEventsMixin, TemplateRenderMixin, TriggersMixin, UIMixin);\n\nexport default ViewMixin;\n","export function renderView(view) {\n if (view._isRendered) {\n return;\n }\n\n if (!view.supportsRenderLifecycle) {\n view.triggerMethod('before:render', view);\n }\n\n view.render();\n view._isRendered = true;\n\n if (!view.supportsRenderLifecycle) {\n view.triggerMethod('render', view);\n }\n}\n\nexport function destroyView(view, disableDetachEvents) {\n if (view.destroy) {\n // Attach flag for public destroy function internal check\n view._disableDetachEvents = disableDetachEvents;\n view.destroy();\n return;\n }\n\n // Destroy for non-Marionette Views\n if (!view.supportsDestroyLifecycle) {\n view.triggerMethod('before:destroy', view);\n }\n\n const shouldTriggerDetach = view._isAttached && !disableDetachEvents;\n\n if (shouldTriggerDetach) {\n view.triggerMethod('before:detach', view);\n }\n\n view.remove();\n\n if (shouldTriggerDetach) {\n view._isAttached = false;\n view.triggerMethod('detach', view);\n }\n\n view._isDestroyed = true;\n\n if (!view.supportsDestroyLifecycle) {\n view.triggerMethod('destroy', view);\n }\n}\n","// Region\n// ------\n\nimport _ from 'underscore';\nimport Backbone from 'backbone';\nimport MarionetteError from './utils/error';\nimport extend from './utils/extend';\nimport monitorViewEvents from './common/monitor-view-events';\nimport { renderView, destroyView } from './common/view';\nimport CommonMixin from './mixins/common';\nimport View from './view';\nimport DomApi, { setDomApi } from './config/dom';\n\nconst classErrorName = 'RegionError';\n\nconst ClassOptions = [\n 'allowMissingEl',\n 'parentEl',\n 'replaceElement'\n];\n\nconst Region = function(options) {\n this._setOptions(options, ClassOptions);\n\n this.cid = _.uniqueId(this.cidPrefix);\n\n // getOption necessary because options.el may be passed as undefined\n this._initEl = this.el = this.getOption('el');\n\n // Handle when this.el is passed in as a $ wrapped element.\n this.el = this.el instanceof Backbone.$ ? this.el[0] : this.el;\n\n this._setEl();\n\n this.initialize.apply(this, arguments);\n};\n\nRegion.extend = extend;\nRegion.setDomApi = setDomApi;\n\n// Region Methods\n// --------------\n\n_.extend(Region.prototype, CommonMixin, {\n Dom: DomApi,\n\n cidPrefix: 'mnr',\n replaceElement: false,\n _isReplaced: false,\n _isSwappingView: false,\n\n // This is a noop method intended to be overridden\n initialize() {},\n\n // Displays a view instance inside of the region. If necessary handles calling the `render`\n // method for you. Reads content directly from the `el` attribute.\n show(view, options) {\n if (!this._ensureElement(options)) {\n return;\n }\n\n view = this._getView(view, options);\n\n if (view === this.currentView) { return this; }\n\n if (view._isShown) {\n throw new MarionetteError({\n name: classErrorName,\n message: 'View is already shown in a Region or CollectionView',\n url: 'marionette.collectionview.html#region-viewAlreadyShown'\n });\n }\n\n this._isSwappingView = !!this.currentView;\n\n this.triggerMethod('before:show', this, view, options);\n\n // Assume an attached view is already in the region for pre-existing DOM\n if (this.currentView || !view._isAttached) {\n this.empty(options);\n }\n\n this._setupChildView(view);\n\n this.currentView = view;\n\n renderView(view);\n\n this._attachView(view, options);\n\n this.triggerMethod('show', this, view, options);\n\n this._isSwappingView = false;\n\n return this;\n },\n\n _setEl() {\n if (!this.el) {\n throw new MarionetteError({\n name: classErrorName,\n message: 'An \"el\" must be specified for a region.',\n url: 'marionette.region.html#additional-options'\n });\n }\n\n this.$el = this.getEl(this.el);\n\n if (this.$el.length) {\n this.el = this.$el[0];\n }\n\n // Make sure the $el contains only the el\n if (this.$el.length > 1) {\n this.$el = this.Dom.getEl(this.el);\n }\n },\n\n // Set the `el` of the region and move any current view to the new `el`.\n _setElement(el) {\n if (el === this.el) { return this; }\n\n const shouldReplace = this._isReplaced;\n\n this._restoreEl();\n\n this.el = el;\n\n this._setEl();\n\n if (this.currentView) {\n const view = this.currentView;\n\n if (shouldReplace) {\n this._replaceEl(view);\n } else {\n this.attachHtml(view);\n }\n }\n\n return this;\n },\n\n _setupChildView(view) {\n monitorViewEvents(view);\n\n this._proxyChildViewEvents(view);\n\n // We need to listen for if a view is destroyed in a way other than through the region.\n // If this happens we need to remove the reference to the currentView since once a view\n // has been destroyed we can not reuse it.\n view.on('destroy', this._empty, this);\n },\n\n _proxyChildViewEvents(view) {\n const parentView = this._parentView;\n\n if (!parentView) { return; }\n\n parentView._proxyChildViewEvents(view);\n },\n\n // If the regions parent view is not monitoring its attach/detach events\n _shouldDisableMonitoring() {\n return this._parentView && this._parentView.monitorViewEvents === false;\n },\n\n _isElAttached() {\n return this.Dom.hasEl(this.Dom.getDocumentEl(this.el), this.el);\n },\n\n _attachView(view, { replaceElement } = {}) {\n const shouldTriggerAttach = !view._isAttached && this._isElAttached() && !this._shouldDisableMonitoring();\n const shouldReplaceEl = typeof replaceElement === 'undefined' ? !!_.result(this, 'replaceElement') : !!replaceElement;\n\n if (shouldTriggerAttach) {\n view.triggerMethod('before:attach', view);\n }\n\n if (shouldReplaceEl) {\n this._replaceEl(view);\n } else {\n this.attachHtml(view);\n }\n\n if (shouldTriggerAttach) {\n view._isAttached = true;\n view.triggerMethod('attach', view);\n }\n\n // Corresponds that view is shown in a marionette Region or CollectionView\n view._isShown = true;\n },\n\n _ensureElement(options = {}) {\n if (!_.isObject(this.el)) {\n this._setEl();\n }\n\n if (!this.$el || this.$el.length === 0) {\n const allowMissingEl = typeof options.allowMissingEl === 'undefined' ? !!_.result(this, 'allowMissingEl') : !!options.allowMissingEl;\n\n if (allowMissingEl) {\n return false;\n } else {\n throw new MarionetteError({\n name: classErrorName,\n message: `An \"el\" must exist in DOM for this region ${this.cid}`,\n url: 'marionette.region.html#additional-options'\n });\n }\n }\n return true;\n },\n\n _getView(view) {\n if (!view) {\n throw new MarionetteError({\n name: classErrorName,\n message: 'The view passed is undefined and therefore invalid. You must pass a view instance to show.',\n url: 'marionette.region.html#showing-a-view'\n });\n }\n\n if (view._isDestroyed) {\n throw new MarionetteError({\n name: classErrorName,\n message: `View (cid: \"${view.cid}\") has already been destroyed and cannot be used.`,\n url: 'marionette.region.html#showing-a-view'\n });\n }\n\n if (view instanceof Backbone.View) {\n return view;\n }\n\n const viewOptions = this._getViewOptions(view);\n\n return new View(viewOptions);\n },\n\n // This allows for a template or a static string to be\n // used as a template\n _getViewOptions(viewOptions) {\n if (_.isFunction(viewOptions)) {\n return { template: viewOptions };\n }\n\n if (_.isObject(viewOptions)) {\n return viewOptions;\n }\n\n const template = function() { return viewOptions; };\n\n return { template };\n },\n\n // Override this method to change how the region finds the DOM element that it manages. Return\n // a jQuery selector object scoped to a provided parent el or the document if none exists.\n getEl(el) {\n const context = _.result(this, 'parentEl');\n\n if (context && _.isString(el)) {\n return this.Dom.findEl(context, el);\n }\n\n return this.Dom.getEl(el);\n },\n\n _replaceEl(view) {\n // Always restore the el to ensure the regions el is present before replacing\n this._restoreEl();\n\n view.on('before:destroy', this._restoreEl, this);\n\n this.Dom.replaceEl(view.el, this.el);\n\n this._isReplaced = true;\n },\n\n // Restore the region's element in the DOM.\n _restoreEl() {\n // There is nothing to replace\n if (!this._isReplaced) {\n return;\n }\n\n const view = this.currentView;\n\n if (!view) {\n return;\n }\n\n this._detachView(view);\n\n this._isReplaced = false;\n },\n\n // Check to see if the region's el was replaced.\n isReplaced() {\n return !!this._isReplaced;\n },\n\n // Check to see if a view is being swapped by another\n isSwappingView() {\n return !!this._isSwappingView;\n },\n\n // Override this method to change how the new view is appended to the `$el` that the\n // region is managing\n attachHtml(view) {\n this.Dom.appendContents(this.el, view.el, {_$el: this.$el, _$contents: view.$el});\n },\n\n // Destroy the current view, if there is one. If there is no current view,\n // it will detach any html inside the region's `el`.\n empty(options = { allowMissingEl: true }) {\n const view = this.currentView;\n\n // If there is no view in the region we should only detach current html\n if (!view) {\n if (this._ensureElement(options)) {\n this.detachHtml();\n }\n return this;\n }\n\n this._empty(view, true);\n return this;\n },\n\n _empty(view, shouldDestroy) {\n view.off('destroy', this._empty, this);\n this.triggerMethod('before:empty', this, view);\n\n this._restoreEl();\n\n delete this.currentView;\n\n if (!view._isDestroyed) {\n if (shouldDestroy) {\n this.removeView(view);\n } else {\n this._detachView(view);\n }\n view._isShown = false;\n this._stopChildViewEvents(view);\n }\n\n this.triggerMethod('empty', this, view);\n },\n\n _stopChildViewEvents(view) {\n const parentView = this._parentView;\n\n if (!parentView) { return; }\n\n this._parentView.stopListening(view);\n },\n\n // Non-Marionette safe view.destroy\n destroyView(view) {\n if (view._isDestroyed) {\n return view;\n }\n\n destroyView(view, this._shouldDisableMonitoring());\n return view;\n },\n\n // Override this method to determine what happens when the view\n // is removed from the region when the view is not being detached\n removeView(view) {\n this.destroyView(view);\n },\n\n // Empties the Region without destroying the view\n // Returns the detached view\n detachView() {\n const view = this.currentView;\n\n if (!view) {\n return;\n }\n\n this._empty(view);\n\n return view;\n },\n\n _detachView(view) {\n const shouldTriggerDetach = view._isAttached && !this._shouldDisableMonitoring();\n const shouldRestoreEl = this._isReplaced;\n if (shouldTriggerDetach) {\n view.triggerMethod('before:detach', view);\n }\n\n if (shouldRestoreEl) {\n this.Dom.replaceEl(this.el, view.el);\n } else {\n this.detachHtml();\n }\n\n if (shouldTriggerDetach) {\n view._isAttached = false;\n view.triggerMethod('detach', view);\n }\n },\n\n // Override this method to change how the region detaches current content\n detachHtml() {\n this.Dom.detachContents(this.el, this.$el);\n },\n\n // Checks whether a view is currently present within the region. Returns `true` if there is\n // and `false` if no view is present.\n hasView() {\n return !!this.currentView;\n },\n\n // Reset the region by destroying any existing view and clearing out the cached `$el`.\n // The next time a view is shown via this region, the region will re-query the DOM for\n // the region's `el`.\n reset(options) {\n this.empty(options);\n\n this.el = this._initEl;\n\n delete this.$el;\n return this;\n },\n\n _isDestroyed: false,\n\n isDestroyed() {\n return this._isDestroyed;\n },\n\n // Destroy the region, remove any child view\n // and remove the region from any associated view\n destroy(options) {\n if (this._isDestroyed) { return this; }\n\n this.triggerMethod('before:destroy', this, options);\n this._isDestroyed = true;\n\n this.reset(options);\n\n if (this._name) {\n this._parentView._removeReferences(this._name);\n }\n delete this._parentView;\n delete this._name;\n\n this.triggerMethod('destroy', this, options);\n this.stopListening();\n\n return this;\n }\n});\n\nexport default Region;\n","import _ from 'underscore';\nimport MarionetteError from '../utils/error';\nimport Region from '../region';\n\n// return the region instance from the definition\nexport default function(definition, defaults) {\n if (definition instanceof Region) {\n return definition;\n }\n\n if (_.isString(definition)) {\n return buildRegionFromObject(defaults, { el: definition });\n }\n\n if (_.isFunction(definition)) {\n return buildRegionFromObject(defaults, { regionClass: definition });\n }\n\n if (_.isObject(definition)) {\n return buildRegionFromObject(defaults, definition);\n }\n\n throw new MarionetteError({\n message: 'Improper region configuration type.',\n url: 'marionette.region.html#defining-regions'\n });\n}\n\nfunction buildRegionFromObject(defaults, definition) {\n const options = _.extend({}, defaults, definition);\n\n const RegionClass = options.regionClass\n\n delete options.regionClass;\n\n return new RegionClass(options);\n}\n","import _ from 'underscore';\nimport _invoke from '../utils/invoke';\nimport buildRegion from '../common/build-region';\nimport Region from '../region';\n\n// MixinOptions\n// - regions\n// - regionClass\n\nexport default {\n regionClass: Region,\n\n // Internal method to initialize the regions that have been defined in a\n // `regions` attribute on this View.\n _initRegions() {\n\n // init regions hash\n this.regions = this.regions || {};\n this._regions = {};\n\n this.addRegions(_.result(this, 'regions'));\n },\n\n // Internal method to re-initialize all of the regions by updating\n // the `el` that they point to\n _reInitRegions() {\n _invoke(this._regions, 'reset');\n },\n\n // Add a single region, by name, to the View\n addRegion(name, definition) {\n const regions = {};\n regions[name] = definition;\n return this.addRegions(regions)[name];\n },\n\n // Add multiple regions as a {name: definition, name2: def2} object literal\n addRegions(regions) {\n // If there's nothing to add, stop here.\n if (_.isEmpty(regions)) {\n return;\n }\n\n // Normalize region selectors hash to allow\n // a user to use the @ui. syntax.\n regions = this.normalizeUIValues(regions, 'el');\n\n // Add the regions definitions to the regions property\n this.regions = _.extend({}, this.regions, regions);\n\n return this._addRegions(regions);\n },\n\n // internal method to build and add regions\n _addRegions(regionDefinitions) {\n const defaults = {\n regionClass: this.regionClass,\n parentEl: _.partial(_.result, this, 'el')\n };\n\n return _.reduce(regionDefinitions, (regions, definition, name) => {\n regions[name] = buildRegion(definition, defaults);\n this._addRegion(regions[name], name);\n return regions;\n }, {});\n },\n\n _addRegion(region, name) {\n this.triggerMethod('before:add:region', this, name, region);\n\n region._parentView = this;\n region._name = name;\n\n this._regions[name] = region;\n\n this.triggerMethod('add:region', this, name, region);\n },\n\n // Remove a single region from the View, by name\n removeRegion(name) {\n const region = this._regions[name];\n\n this._removeRegion(region, name);\n\n return region;\n },\n\n // Remove all regions from the View\n removeRegions() {\n const regions = this._getRegions();\n\n _.each(this._regions, this._removeRegion.bind(this));\n\n return regions;\n },\n\n _removeRegion(region, name) {\n this.triggerMethod('before:remove:region', this, name, region);\n\n region.destroy();\n\n this.triggerMethod('remove:region', this, name, region);\n },\n\n // Called in a region's destroy\n _removeReferences(name) {\n delete this.regions[name];\n delete this._regions[name];\n },\n\n // Empty all regions in the region manager, but\n // leave them attached\n emptyRegions() {\n const regions = this.getRegions();\n _invoke(regions, 'empty');\n return regions;\n },\n\n // Checks to see if view contains region\n // Accepts the region name\n // hasRegion('main')\n hasRegion(name) {\n return !!this.getRegion(name);\n },\n\n // Provides access to regions\n // Accepts the region name\n // getRegion('main')\n getRegion(name) {\n if (!this._isRendered) {\n this.render();\n }\n return this._regions[name];\n },\n\n _getRegions() {\n return _.clone(this._regions);\n },\n\n // Get all regions\n getRegions() {\n if (!this._isRendered) {\n this.render();\n }\n return this._getRegions();\n },\n\n showChildView(name, view, options) {\n const region = this.getRegion(name);\n region.show(view, options);\n return view;\n },\n\n detachChildView(name) {\n return this.getRegion(name).detachView();\n },\n\n getChildView(name) {\n return this.getRegion(name).currentView;\n }\n\n};\n","// Static setter for the renderer\nexport function setRenderer(renderer) {\n this.prototype._renderHtml = renderer;\n return this;\n}\n","// View\n// ---------\n\nimport _ from 'underscore';\nimport Backbone from 'backbone';\nimport monitorViewEvents from './common/monitor-view-events';\nimport ViewMixin from './mixins/view';\nimport RegionsMixin from './mixins/regions';\nimport { setDomApi } from './config/dom';\nimport { setRenderer } from './config/renderer';\n\nconst ClassOptions = [\n 'behaviors',\n 'childViewEventPrefix',\n 'childViewEvents',\n 'childViewTriggers',\n 'collectionEvents',\n 'events',\n 'modelEvents',\n 'regionClass',\n 'regions',\n 'template',\n 'templateContext',\n 'triggers',\n 'ui'\n];\n\n// Used by _getImmediateChildren\nfunction childReducer(children, region) {\n if (region.currentView) {\n children.push(region.currentView);\n }\n\n return children;\n}\n\n// The standard view. Includes view events, automatic rendering\n// templates, nested views, and more.\nconst View = Backbone.View.extend({\n\n constructor(options) {\n this._setOptions(options, ClassOptions);\n\n monitorViewEvents(this);\n\n this._initBehaviors();\n this._initRegions();\n\n Backbone.View.prototype.constructor.apply(this, arguments);\n\n this.delegateEntityEvents();\n\n this._triggerEventOnBehaviors('initialize', this, options);\n },\n\n // Overriding Backbone.View's `setElement` to handle\n // if an el was previously defined. If so, the view might be\n // rendered or attached on setElement.\n setElement() {\n Backbone.View.prototype.setElement.apply(this, arguments);\n\n this._isRendered = this.Dom.hasContents(this.el);\n this._isAttached = this._isElAttached();\n\n if (this._isRendered) {\n this.bindUIElements();\n }\n\n return this;\n },\n\n // If a template is available, renders it into the view's `el`\n // Re-inits regions and binds UI.\n render() {\n const template = this.getTemplate();\n\n if (template === false || this._isDestroyed) { return this; }\n\n this.triggerMethod('before:render', this);\n\n // If this is not the first render call, then we need to\n // re-initialize the `el` for each region\n if (this._isRendered) {\n this._reInitRegions();\n }\n\n this._renderTemplate(template);\n this.bindUIElements();\n\n this._isRendered = true;\n this.triggerMethod('render', this);\n\n return this;\n },\n\n // called by ViewMixin destroy\n _removeChildren() {\n this.removeRegions();\n },\n\n _getImmediateChildren() {\n return _.reduce(this._regions, childReducer, []);\n }\n}, {\n setRenderer,\n setDomApi\n});\n\n_.extend(View.prototype, ViewMixin, RegionsMixin);\n\nexport default View;\n","import _ from 'underscore';\n\n// Provide a container to store, retrieve and\n// shut down child views.\nconst Container = function() {\n this._init();\n};\n\n// Mix in methods from Underscore, for iteration, and other\n// collection related features.\n// Borrowing this code from Backbone.Collection:\n// https://github.com/jashkenas/backbone/blob/1.1.2/backbone.js#L962\nconst methods = ['forEach', 'each', 'map', 'find', 'detect', 'filter',\n 'select', 'reject', 'every', 'all', 'some', 'any', 'include',\n 'contains', 'invoke', 'toArray', 'first', 'initial', 'rest',\n 'last', 'without', 'isEmpty', 'pluck', 'reduce', 'partition'];\n\n_.each(methods, function(method) {\n Container.prototype[method] = function(...args) {\n return _[method].apply(_, [this._views].concat(args));\n };\n});\n\nfunction stringComparator(comparator, view) {\n return view.model && view.model.get(comparator);\n}\n\n// Container Methods\n// -----------------\n\n_.extend(Container.prototype, {\n\n // Initializes an empty container\n _init() {\n this._views = [];\n this._viewsByCid = {};\n this._indexByModel = {};\n this._updateLength();\n },\n\n // Add a view to this container. Stores the view\n // by `cid` and makes it searchable by the model\n // cid (and model itself). Additionally it stores\n // the view by index in the _views array\n _add(view, index = this._views.length) {\n this._addViewIndexes(view);\n\n // add to end by default\n this._views.splice(index, 0, view);\n\n this._updateLength();\n },\n\n _addViewIndexes(view) {\n // store the view\n this._viewsByCid[view.cid] = view;\n\n // index it by model\n if (view.model) {\n this._indexByModel[view.model.cid] = view;\n }\n },\n\n // Sort (mutate) and return the array of the child views.\n _sort(comparator, context) {\n if (typeof comparator === 'string') {\n comparator = _.partial(stringComparator, comparator);\n return this._sortBy(comparator);\n }\n\n if (comparator.length === 1) {\n return this._sortBy(comparator.bind(context));\n }\n\n return this._views.sort(comparator.bind(context));\n },\n\n // Makes `_.sortBy` mutate the array to match `this._views.sort`\n _sortBy(comparator) {\n const sortedViews = _.sortBy(this._views, comparator);\n\n this._set(sortedViews);\n\n return sortedViews;\n },\n\n // Replace array contents without overwriting the reference.\n // Should not add/remove views\n _set(views, shouldReset) {\n this._views.length = 0;\n\n this._views.push.apply(this._views, views.slice(0));\n\n if (shouldReset) {\n this._viewsByCid = {};\n this._indexByModel = {};\n\n _.each(views, this._addViewIndexes.bind(this));\n\n this._updateLength();\n }\n },\n\n // Swap views by index\n _swap(view1, view2) {\n const view1Index = this.findIndexByView(view1);\n const view2Index = this.findIndexByView(view2);\n\n if (view1Index === -1 || view2Index === -1) {\n return;\n }\n\n const swapView = this._views[view1Index];\n this._views[view1Index] = this._views[view2Index];\n this._views[view2Index] = swapView;\n },\n\n // Find a view by the model that was attached to it.\n // Uses the model's `cid` to find it.\n findByModel(model) {\n return this.findByModelCid(model.cid);\n },\n\n // Find a view by the `cid` of the model that was attached to it.\n findByModelCid(modelCid) {\n return this._indexByModel[modelCid];\n },\n\n // Find a view by index.\n findByIndex(index) {\n return this._views[index];\n },\n\n // Find the index of a view instance\n findIndexByView(view) {\n return this._views.indexOf(view);\n },\n\n // Retrieve a view by its `cid` directly\n findByCid(cid) {\n return this._viewsByCid[cid];\n },\n\n hasView(view) {\n return !!this.findByCid(view.cid);\n },\n\n // Remove a view and clean up index references.\n _remove(view) {\n if (!this._viewsByCid[view.cid]) {\n return;\n }\n\n // delete model index\n if (view.model) {\n delete this._indexByModel[view.model.cid];\n }\n\n // remove the view from the container\n delete this._viewsByCid[view.cid];\n\n const index = this.findIndexByView(view);\n this._views.splice(index, 1);\n\n this._updateLength();\n },\n\n // Update the `.length` attribute on this container\n _updateLength() {\n this.length = this._views.length;\n }\n});\n\nexport default Container;\n","// Collection View\n// ---------------\n\nimport _ from 'underscore';\nimport Backbone from 'backbone';\nimport MarionetteError from './utils/error';\nimport { renderView, destroyView } from './common/view';\nimport monitorViewEvents from './common/monitor-view-events';\nimport ChildViewContainer from './child-view-container';\nimport Region from './region';\nimport ViewMixin from './mixins/view';\nimport { setDomApi } from './config/dom';\nimport { setRenderer } from './config/renderer';\n\nconst classErrorName = 'CollectionViewError';\n\nconst ClassOptions = [\n 'behaviors',\n 'childView',\n 'childViewContainer',\n 'childViewEventPrefix',\n 'childViewEvents',\n 'childViewOptions',\n 'childViewTriggers',\n 'collectionEvents',\n 'emptyView',\n 'emptyViewOptions',\n 'events',\n 'modelEvents',\n 'sortWithCollection',\n 'template',\n 'templateContext',\n 'triggers',\n 'ui',\n 'viewComparator',\n 'viewFilter'\n];\n\n// A view that iterates over a Backbone.Collection\n// and renders an individual child view for each model.\nconst CollectionView = Backbone.View.extend({\n // flag for maintaining the sorted order of the collection\n sortWithCollection: true,\n\n // constructor\n constructor(options) {\n this._setOptions(options, ClassOptions);\n\n monitorViewEvents(this);\n\n this._initChildViewStorage();\n this._initBehaviors();\n\n Backbone.View.prototype.constructor.apply(this, arguments);\n\n // Init empty region\n this.getEmptyRegion();\n\n this.delegateEntityEvents();\n\n this._triggerEventOnBehaviors('initialize', this, options);\n },\n\n // Internal method to set up the `children` object for storing all of the child views\n // `_children` represents all child views\n // `children` represents only views filtered to be shown\n _initChildViewStorage() {\n this._children = new ChildViewContainer();\n this.children = new ChildViewContainer();\n },\n\n // Create an region to show the emptyView\n getEmptyRegion() {\n const $emptyEl = this.$container || this.$el;\n\n if (this._emptyRegion && !this._emptyRegion.isDestroyed()) {\n this._emptyRegion._setElement($emptyEl[0]);\n return this._emptyRegion;\n }\n\n this._emptyRegion = new Region({ el: $emptyEl[0], replaceElement: false });\n\n this._emptyRegion._parentView = this;\n\n return this._emptyRegion;\n },\n\n // Configured the initial events that the collection view binds to.\n _initialEvents() {\n if (this._isRendered) { return; }\n\n this.listenTo(this.collection, {\n 'sort': this._onCollectionSort,\n 'reset': this._onCollectionReset,\n 'update': this._onCollectionUpdate\n });\n },\n\n // Internal method. This checks for any changes in the order of the collection.\n // If the index of any view doesn't match, it will re-sort.\n _onCollectionSort(collection, { add, merge, remove }) {\n if (!this.sortWithCollection || this.viewComparator === false) {\n return;\n }\n\n // If the data is changing we will handle the sort later in `_onCollectionUpdate`\n if (add || remove || merge) {\n return;\n }\n\n // If the only thing happening here is sorting, sort.\n this.sort();\n },\n\n _onCollectionReset() {\n this._destroyChildren();\n\n this._addChildModels(this.collection.models);\n\n this.sort();\n },\n\n // Handle collection update model additions and removals\n _onCollectionUpdate(collection, options) {\n const changes = options.changes;\n\n // Remove first since it'll be a shorter array lookup.\n const removedViews = changes.removed.length && this._removeChildModels(changes.removed);\n\n this._addedViews = changes.added.length && this._addChildModels(changes.added);\n\n this._detachChildren(removedViews);\n\n this.sort();\n\n // Destroy removed child views after all of the render is complete\n this._removeChildViews(removedViews);\n },\n\n _removeChildModels(models) {\n return _.reduce(models, (views, model) => {\n const removeView = this._removeChildModel(model);\n\n if (removeView) { views.push(removeView); }\n\n return views;\n }, []);\n },\n\n _removeChildModel(model) {\n const view = this._children.findByModel(model);\n\n if (view) { this._removeChild(view); }\n\n return view;\n },\n\n _removeChild(view) {\n this.triggerMethod('before:remove:child', this, view);\n\n this.children._remove(view);\n this._children._remove(view);\n\n this.triggerMethod('remove:child', this, view);\n },\n\n // Added views are returned for consistency with _removeChildModels\n _addChildModels(models) {\n return _.map(models, this._addChildModel.bind(this));\n },\n\n _addChildModel(model) {\n const view = this._createChildView(model);\n\n this._addChild(view);\n\n return view;\n },\n\n _createChildView(model) {\n const ChildView = this._getChildView(model);\n const childViewOptions = this._getChildViewOptions(model);\n const view = this.buildChildView(model, ChildView, childViewOptions);\n\n return view;\n },\n\n _addChild(view, index) {\n this.triggerMethod('before:add:child', this, view);\n\n this._setupChildView(view);\n this._children._add(view, index);\n this.children._add(view, index);\n\n this.triggerMethod('add:child', this, view);\n },\n\n // Retrieve the `childView` class\n // The `childView` property can be either a view class or a function that\n // returns a view class. If it is a function, it will receive the model that\n // will be passed to the view instance (created from the returned view class)\n _getChildView(child) {\n let childView = this.childView;\n\n if (!childView) {\n throw new MarionetteError({\n name: classErrorName,\n message: 'A \"childView\" must be specified',\n url: 'marionette.collectionview.html#collectionviews-childview'\n });\n }\n\n childView = this._getView(childView, child);\n\n if (!childView) {\n throw new MarionetteError({\n name: classErrorName,\n message: '\"childView\" must be a view class or a function that returns a view class',\n url: 'marionette.collectionview.html#collectionviews-childview'\n });\n }\n\n return childView;\n },\n\n // First check if the `view` is a view class (the common case)\n // Then check if it's a function (which we assume that returns a view class)\n _getView(view, child) {\n if (view.prototype instanceof Backbone.View || view === Backbone.View) {\n return view;\n } else if (_.isFunction(view)) {\n return view.call(this, child);\n }\n },\n\n _getChildViewOptions(child) {\n if (_.isFunction(this.childViewOptions)) {\n return this.childViewOptions(child);\n }\n\n return this.childViewOptions;\n },\n\n // Build a `childView` for a model in the collection.\n // Override to customize the build\n buildChildView(child, ChildViewClass, childViewOptions) {\n const options = _.extend({model: child}, childViewOptions);\n return new ChildViewClass(options);\n },\n\n _setupChildView(view) {\n monitorViewEvents(view);\n\n // We need to listen for if a view is destroyed in a way other\n // than through the CollectionView.\n // If this happens we need to remove the reference to the view\n // since once a view has been destroyed we can not reuse it.\n view.on('destroy', this.removeChildView, this);\n\n // set up the child view event forwarding\n this._proxyChildViewEvents(view);\n },\n\n // used by ViewMixin's `_childViewEventHandler`\n _getImmediateChildren() {\n return this.children._views;\n },\n\n // Overriding Backbone.View's `setElement` to handle\n // if an el was previously defined. If so, the view might be\n // attached on setElement.\n setElement() {\n Backbone.View.prototype.setElement.apply(this, arguments);\n\n this._isAttached = this._isElAttached();\n\n return this;\n },\n\n // Render children views.\n render() {\n if (this._isDestroyed) { return this; }\n this.triggerMethod('before:render', this);\n\n this._destroyChildren();\n\n if (this.collection) {\n this._addChildModels(this.collection.models);\n this._initialEvents();\n }\n\n const template = this.getTemplate();\n\n if (template) {\n this._renderTemplate(template);\n this.bindUIElements();\n }\n this._getChildViewContainer();\n this.sort();\n\n this._isRendered = true;\n\n this.triggerMethod('render', this);\n return this;\n },\n\n // Get a container within the template to add the children within\n _getChildViewContainer() {\n const childViewContainer = _.result(this, 'childViewContainer');\n this.$container = childViewContainer ? this.$(childViewContainer) : this.$el;\n\n if (!this.$container.length) {\n throw new MarionetteError({\n name: classErrorName,\n message: `The specified \"childViewContainer\" was not found: ${childViewContainer}`,\n url: 'marionette.collectionview.html#defining-the-childviewcontainer'\n });\n }\n },\n\n // Sorts the children then filters and renders the results.\n sort() {\n this._sortChildren();\n\n this.filter();\n\n return this;\n },\n\n // Sorts views by viewComparator and sets the children to the new order\n _sortChildren() {\n if (!this._children.length) { return; }\n\n let viewComparator = this.getComparator();\n\n if (!viewComparator) { return; }\n\n // If children are sorted prevent added to end perf\n delete this._addedViews;\n\n this.triggerMethod('before:sort', this);\n\n this._children._sort(viewComparator, this);\n\n this.triggerMethod('sort', this);\n },\n\n // Sets the view's `viewComparator` and applies the sort if the view is ready.\n // To prevent the render pass `{ preventRender: true }` as the 2nd argument.\n setComparator(comparator, {preventRender} = {}) {\n const comparatorChanged = this.viewComparator !== comparator;\n const shouldSort = comparatorChanged && !preventRender;\n\n this.viewComparator = comparator;\n\n if (shouldSort) {\n this.sort();\n }\n\n return this;\n },\n\n // Clears the `viewComparator` and follows the same rules for rendering as `setComparator`.\n removeComparator(options) {\n return this.setComparator(null, options);\n },\n\n // If viewComparator is overriden it will be returned here.\n // Additionally override this function to provide custom\n // viewComparator logic\n getComparator() {\n if (this.viewComparator) { return this.viewComparator }\n\n if (!this.sortWithCollection || this.viewComparator === false || !this.collection) {\n return false;\n }\n\n return this._viewComparator;\n },\n\n // Default internal view comparator that order the views by\n // the order of the collection\n _viewComparator(view) {\n return this.collection.indexOf(view.model);\n },\n\n // This method filters the children views and renders the results\n filter() {\n if (this._isDestroyed) { return this; }\n\n this._filterChildren();\n\n this._renderChildren();\n\n return this;\n },\n\n _filterChildren() {\n if (!this._children.length) { return; }\n\n const viewFilter = this._getFilter();\n\n if (!viewFilter) {\n const shouldReset = this.children.length !== this._children.length;\n\n this.children._set(this._children._views, shouldReset);\n\n return;\n }\n\n // If children are filtered prevent added to end perf\n delete this._addedViews;\n\n this.triggerMethod('before:filter', this);\n\n const attachViews = [];\n const detachViews = [];\n\n _.each(this._children._views, (view, key, children) => {\n (viewFilter.call(this, view, key, children) ? attachViews : detachViews).push(view);\n });\n\n this._detachChildren(detachViews);\n\n // reset children\n this.children._set(attachViews, true);\n\n this.triggerMethod('filter', this, attachViews, detachViews);\n },\n\n // This method returns a function for the viewFilter\n _getFilter() {\n const viewFilter = this.getFilter();\n\n if (!viewFilter) { return false; }\n\n if (_.isFunction(viewFilter)) {\n return viewFilter;\n }\n\n // Support filter predicates `{ fooFlag: true }`\n if (_.isObject(viewFilter)) {\n const matcher = _.matches(viewFilter);\n return function(view) {\n return matcher(view.model && view.model.attributes);\n };\n }\n\n // Filter by model attribute\n if (_.isString(viewFilter)) {\n return function(view) {\n return view.model && view.model.get(viewFilter);\n };\n }\n\n throw new MarionetteError({\n name: classErrorName,\n message: '\"viewFilter\" must be a function, predicate object literal, a string indicating a model attribute, or falsy',\n url: 'marionette.collectionview.html#defining-the-viewfilter'\n });\n },\n\n // Override this function to provide custom\n // viewFilter logic\n getFilter() {\n return this.viewFilter;\n },\n\n // Sets the view's `viewFilter` and applies the filter if the view is ready.\n // To prevent the render pass `{ preventRender: true }` as the 2nd argument.\n setFilter(filter, {preventRender} = {}) {\n const filterChanged = this.viewFilter !== filter;\n const shouldRender = filterChanged && !preventRender;\n\n this.viewFilter = filter;\n\n if (shouldRender) {\n this.filter();\n }\n\n return this;\n },\n\n // Clears the `viewFilter` and follows the same rules for rendering as `setFilter`.\n removeFilter(options) {\n return this.setFilter(null, options);\n },\n\n _detachChildren(detachingViews) {\n _.each(detachingViews, this._detachChildView.bind(this));\n },\n\n _detachChildView(view) {\n const shouldTriggerDetach = view._isAttached && this.monitorViewEvents !== false;\n if (shouldTriggerDetach) {\n view.triggerMethod('before:detach', view);\n }\n\n this.detachHtml(view);\n\n if (shouldTriggerDetach) {\n view._isAttached = false;\n view.triggerMethod('detach', view);\n }\n\n view._isShown = false;\n },\n\n // Override this method to change how the collectionView detaches a child view\n detachHtml(view) {\n this.Dom.detachEl(view.el, view.$el);\n },\n\n _renderChildren() {\n // If there are unrendered views prevent add to end perf\n if (this._hasUnrenderedViews) {\n delete this._addedViews;\n delete this._hasUnrenderedViews;\n }\n\n const views = this._addedViews || this.children._views;\n\n this.triggerMethod('before:render:children', this, views);\n\n if (this.isEmpty()) {\n this._showEmptyView();\n } else {\n this._destroyEmptyView();\n\n const els = this._getBuffer(views);\n\n this._attachChildren(els, views);\n }\n\n delete this._addedViews;\n\n this.triggerMethod('render:children', this, views);\n },\n\n // Renders each view and creates a fragment buffer from them\n _getBuffer(views) {\n const elBuffer = this.Dom.createBuffer();\n\n _.each(views, view => {\n renderView(view);\n // corresponds that view is shown in a Region or CollectionView\n view._isShown = true;\n this.Dom.appendContents(elBuffer, view.el, {_$contents: view.$el});\n });\n\n return elBuffer;\n },\n\n _attachChildren(els, views) {\n const shouldTriggerAttach = this._isAttached && this.monitorViewEvents !== false;\n\n views = shouldTriggerAttach ? views : [];\n\n _.each(views, view => {\n if (view._isAttached) { return; }\n view.triggerMethod('before:attach', view);\n });\n\n this.attachHtml(els, this.$container);\n\n _.each(views, view => {\n if (view._isAttached) { return; }\n view._isAttached = true;\n view.triggerMethod('attach', view);\n });\n },\n\n // Override this method to do something other than `.append`.\n // You can attach any HTML at this point including the els.\n attachHtml(els, $container) {\n this.Dom.appendContents($container[0], els, {_$el: $container});\n },\n\n isEmpty() {\n return !this.children.length;\n },\n\n _showEmptyView() {\n const EmptyView = this._getEmptyView();\n\n if (!EmptyView) {\n return;\n }\n\n const options = this._getEmptyViewOptions();\n\n const emptyRegion = this.getEmptyRegion();\n\n emptyRegion.show(new EmptyView(options));\n },\n\n // Retrieve the empty view class\n _getEmptyView() {\n const emptyView = this.emptyView;\n\n if (!emptyView) { return; }\n\n return this._getView(emptyView);\n },\n\n // Remove the emptyView\n _destroyEmptyView() {\n const emptyRegion = this.getEmptyRegion();\n // Only empty if a view is show so the region\n // doesn't detach any other unrelated HTML\n if (emptyRegion.hasView()) {\n emptyRegion.empty();\n }\n },\n\n //\n _getEmptyViewOptions() {\n const emptyViewOptions = this.emptyViewOptions || this.childViewOptions;\n\n if (_.isFunction(emptyViewOptions)) {\n return emptyViewOptions.call(this);\n }\n\n return emptyViewOptions;\n },\n\n swapChildViews(view1, view2) {\n if (!this._children.hasView(view1) || !this._children.hasView(view2)) {\n throw new MarionetteError({\n name: classErrorName,\n message: 'Both views must be children of the collection view to swap.',\n url: 'marionette.collectionview.html#swapping-child-views'\n });\n }\n\n this._children._swap(view1, view2);\n this.Dom.swapEl(view1.el, view2.el);\n\n // If the views are not filtered the same, refilter\n if (this.children.hasView(view1) !== this.children.hasView(view2)) {\n this.filter();\n } else {\n this.children._swap(view1, view2);\n }\n\n return this;\n },\n\n // Render the child's view and add it to the HTML for the collection view at a given index, based on the current sort\n addChildView(view, index, options = {}) {\n if (!view || view._isDestroyed) {\n return view;\n }\n\n if (view._isShown) {\n throw new MarionetteError({\n name: classErrorName,\n message: 'View is already shown in a Region or CollectionView',\n url: 'marionette.collectionview.html#region-viewAlreadyShown'\n });\n }\n\n if (_.isObject(index)) {\n options = index;\n }\n\n // If options has defined index we should use it\n if (options.index != null) {\n index = options.index;\n }\n\n if (!this._isRendered) {\n this.render();\n }\n\n this._addChild(view, index);\n\n if (options.preventRender) {\n this._hasUnrenderedViews = true;\n return view;\n }\n\n const hasIndex = (typeof index !== 'undefined');\n const isAddedToEnd = !hasIndex || index >= this._children.length;\n\n // Only cache views if added to the end and there is no unrendered views\n if (isAddedToEnd && !this._hasUnrenderedViews) {\n this._addedViews = [view];\n }\n\n if (hasIndex) {\n this._renderChildren();\n } else {\n this.sort();\n }\n\n return view;\n },\n\n // Detach a view from the children. Best used when adding a\n // childView from `addChildView`\n detachChildView(view) {\n this.removeChildView(view, { shouldDetach: true });\n\n return view;\n },\n\n // Remove the child view and destroy it. Best used when adding a\n // childView from `addChildView`\n // The options argument is for internal use only\n removeChildView(view, options) {\n if (!view) {\n return view;\n }\n\n this._removeChildView(view, options);\n\n this._removeChild(view);\n\n if (this.isEmpty()) {\n this._showEmptyView();\n }\n\n return view;\n },\n\n _removeChildViews(views) {\n _.each(views, this._removeChildView.bind(this));\n },\n\n _removeChildView(view, {shouldDetach} = {}) {\n view.off('destroy', this.removeChildView, this);\n\n if (shouldDetach) {\n this._detachChildView(view);\n } else {\n this._destroyChildView(view);\n }\n\n this.stopListening(view);\n },\n\n _destroyChildView(view) {\n if (view._isDestroyed) {\n return;\n }\n\n const shouldDisableEvents = this.monitorViewEvents === false;\n destroyView(view, shouldDisableEvents);\n },\n\n // called by ViewMixin destroy\n _removeChildren() {\n this._destroyChildren();\n const emptyRegion = this.getEmptyRegion();\n emptyRegion.destroy();\n delete this._addedViews;\n },\n\n // Destroy the child views that this collection view is holding on to, if any\n _destroyChildren() {\n if (!this._children.length) {\n return;\n }\n\n this.triggerMethod('before:destroy:children', this);\n if (this.monitorViewEvents === false) {\n this.Dom.detachContents(this.el, this.$el);\n }\n\n this._removeChildViews(this._children._views);\n\n // After all children have been destroyed re-init the container\n this._children._init();\n this.children._init();\n\n this.triggerMethod('destroy:children', this);\n }\n}, {\n setDomApi,\n setRenderer\n});\n\n_.extend(CollectionView.prototype, ViewMixin);\n\nexport default CollectionView;\n","// Behavior\n// --------\n\n// A Behavior is an isolated set of DOM /\n// user interactions that can be mixed into any View.\n// Behaviors allow you to blackbox View specific interactions\n// into portable logical chunks, keeping your views simple and your code DRY.\n\nimport _ from 'underscore';\nimport extend from './utils/extend';\nimport getNamespacedEventName from './utils/get-namespaced-event-name';\nimport CommonMixin from './mixins/common';\nimport DelegateEntityEventsMixin from './mixins/delegate-entity-events';\nimport TriggersMixin from './mixins/triggers';\nimport UIMixin from './mixins/ui';\n\nconst ClassOptions = [\n 'collectionEvents',\n 'events',\n 'modelEvents',\n 'triggers',\n 'ui'\n];\n\nconst Behavior = function(options, view) {\n // Setup reference to the view.\n // this comes in handle when a behavior\n // wants to directly talk up the chain\n // to the view.\n this.view = view;\n\n this._setOptions(options, ClassOptions);\n this.cid = _.uniqueId(this.cidPrefix);\n\n // Construct an internal UI hash using the behaviors UI\n // hash combined and overridden by the view UI hash.\n // This allows the user to use UI hash elements defined\n // in the parent view as well as those defined in the behavior.\n // This order will help the reuse and share of a behavior\n // between multiple views, while letting a view override\n // a selector under an UI key.\n this.ui = _.extend({}, _.result(this, 'ui'), _.result(view, 'ui'));\n\n // Proxy view triggers\n this.listenTo(view, 'all', this.triggerMethod);\n\n this.initialize.apply(this, arguments);\n};\n\nBehavior.extend = extend;\n\n// Behavior Methods\n// --------------\n\n_.extend(Behavior.prototype, CommonMixin, DelegateEntityEventsMixin, TriggersMixin, UIMixin, {\n cidPrefix: 'mnb',\n\n // This is a noop method intended to be overridden\n initialize() {},\n\n // proxy behavior $ method to the view\n // this is useful for doing jquery DOM lookups\n // scoped to behaviors view.\n $() {\n return this.view.$.apply(this.view, arguments);\n },\n\n // Stops the behavior from listening to events.\n destroy() {\n this.stopListening();\n\n this.view._removeBehavior(this);\n\n this._deleteEntityEventHandlers();\n\n return this;\n },\n\n proxyViewProperties() {\n this.$el = this.view.$el;\n this.el = this.view.el;\n\n return this;\n },\n\n bindUIElements() {\n this._bindUIElements();\n\n return this;\n },\n\n unbindUIElements() {\n this._unbindUIElements();\n\n return this;\n },\n\n getUI(name) {\n return this._getUI(name);\n },\n\n // Handle `modelEvents`, and `collectionEvents` configuration\n delegateEntityEvents() {\n this._delegateEntityEvents(this.view.model, this.view.collection);\n\n return this;\n },\n\n undelegateEntityEvents() {\n this._undelegateEntityEvents(this.view.model, this.view.collection);\n\n return this;\n },\n\n _getEvents() {\n if (!this.events) { return; }\n\n // Normalize behavior events hash to allow\n // a user to use the @ui. syntax.\n const behaviorEvents = this.normalizeUIKeys(_.result(this, 'events'));\n\n // binds the handler to the behavior and builds a unique eventName\n return _.reduce(behaviorEvents, (events, behaviorHandler, key) => {\n if (!_.isFunction(behaviorHandler)) {\n behaviorHandler = this[behaviorHandler];\n }\n if (!behaviorHandler) { return events; }\n key = getNamespacedEventName(key, this.cid);\n events[key] = behaviorHandler.bind(this);\n return events;\n }, {});\n },\n\n // Internal method to build all trigger handlers for a given behavior\n _getTriggers() {\n if (!this.triggers) { return; }\n\n // Normalize behavior triggers hash to allow\n // a user to use the @ui. syntax.\n const behaviorTriggers = this.normalizeUIKeys(_.result(this, 'triggers'));\n\n return this._getViewTriggers(this.view, behaviorTriggers);\n }\n});\n\nexport default Behavior;\n","// Application\n// -----------\n\nimport _ from 'underscore';\nimport extend from './utils/extend';\nimport buildRegion from './common/build-region';\nimport CommonMixin from './mixins/common';\nimport DestroyMixin from './mixins/destroy';\nimport RadioMixin from './mixins/radio';\nimport Region from './region';\n\nconst ClassOptions = [\n 'channelName',\n 'radioEvents',\n 'radioRequests',\n 'region',\n 'regionClass'\n];\n\nconst Application = function(options) {\n this._setOptions(options, ClassOptions);\n this.cid = _.uniqueId(this.cidPrefix);\n this._initRegion();\n this._initRadio();\n this.initialize.apply(this, arguments);\n};\n\nApplication.extend = extend;\n\n// Application Methods\n// --------------\n\n_.extend(Application.prototype, CommonMixin, DestroyMixin, RadioMixin, {\n cidPrefix: 'mna',\n\n // This is a noop method intended to be overridden\n initialize() {},\n\n // Kick off all of the application's processes.\n start(options) {\n this.triggerMethod('before:start', this, options);\n this.triggerMethod('start', this, options);\n return this;\n },\n\n regionClass: Region,\n\n _initRegion() {\n const region = this.region;\n\n if (!region) { return; }\n\n const defaults = {\n regionClass: this.regionClass\n };\n\n this._region = buildRegion(region, defaults);\n },\n\n getRegion() {\n return this._region;\n },\n\n showView(view, ...args) {\n const region = this.getRegion();\n region.show(view, ...args);\n return view;\n },\n\n getView() {\n return this.getRegion().currentView;\n }\n});\n\nexport default Application;\n","import {version as VERSION} from '../package.json';\n\nimport proxy from './utils/proxy';\nimport extend from './utils/extend';\n\nimport {\n bindEvents as _bindEvents,\n unbindEvents as _unbindEvents\n} from './common/bind-events';\nimport {\n bindRequests as _bindRequests,\n unbindRequests as _unbindRequests\n} from './common/bind-requests';\nimport _getOption from './common/get-option';\nimport _mergeOptions from './common/merge-options';\nimport monitorViewEvents from './common/monitor-view-events';\nimport _normalizeMethods from './common/normalize-methods';\nimport _triggerMethod from './common/trigger-method';\n\nimport Events from './mixins/events';\n\nimport MnObject from './object';\nimport View from './view';\nimport CollectionView from './collection-view';\nimport Behavior from './behavior';\nimport Region from './region';\nimport Application from './application';\n\nimport DomApi from './config/dom';\n\nimport {\n isEnabled,\n setEnabled\n} from './config/features';\n\n// Utilities\n\nexport const bindEvents = proxy(_bindEvents);\nexport const unbindEvents = proxy(_unbindEvents);\nexport const bindRequests = proxy(_bindRequests);\nexport const unbindRequests = proxy(_unbindRequests);\nexport const mergeOptions = proxy(_mergeOptions);\nexport const getOption = proxy(_getOption);\nexport const normalizeMethods = proxy(_normalizeMethods);\nexport const triggerMethod = proxy(_triggerMethod);\n\n\n// Configuration\n\nexport const setDomApi = function(mixin) {\n CollectionView.setDomApi(mixin);\n Region.setDomApi(mixin);\n View.setDomApi(mixin);\n};\nexport const setRenderer = function(renderer) {\n CollectionView.setRenderer(renderer);\n View.setRenderer(renderer);\n};\n\nexport {\n View,\n CollectionView,\n MnObject,\n Region,\n Behavior,\n Application,\n isEnabled,\n setEnabled,\n monitorViewEvents,\n Events,\n extend,\n DomApi,\n VERSION\n};\n\nexport default {\n View,\n CollectionView,\n MnObject,\n Object: MnObject,\n Region,\n Behavior,\n Application,\n isEnabled,\n setEnabled,\n monitorViewEvents,\n Events,\n extend,\n DomApi,\n VERSION\n};\n"],"names":["proxy","method","context","args","apply","extend","Backbone","Model","normalizeMethods","hash","_","reduce","normalizedHash","name","isFunction","errorProps","MarionetteError","call","Error","urlRoot","version","url","constructor","options","error","message","pick","captureStackTrace","toString","normalizeBindings","bindings","isObject","bindEvents","entity","listenTo","unbindEvents","stopListening","bindRequests","channel","reply","unbindRequests","stopReplying","getOption","optionName","undefined","mergeOptions","keys","each","key","option","triggerMethodChildren","view","event","shouldTrigger","_getImmediateChildren","child","triggerMethod","shouldTriggerAttach","_isAttached","shouldAttach","shouldTriggerDetach","shouldDetach","triggerDOMRefresh","_isRendered","triggerDOMRemove","handleBeforeAttach","handleAttach","handleBeforeDetach","handleDetach","handleBeforeRender","handleRender","monitorViewEvents","_areViewEventsMonitored","on","splitter","methodCache","getEventName","match","prefix","eventName","toUpperCase","getOnMethodName","replace","methodName","result","drop","arguments","trigger","CommonMixin","_setOptions","classOptions","Events","_isDestroyed","isDestroyed","destroy","_initRadio","channelName","Radio","_channel","radioEvents","radioRequests","_destroyRadio","getChannel","ClassOptions","MarionetteObject","cid","uniqueId","cidPrefix","initialize","prototype","DestroyMixin","RadioMixin","invokeMap","invoke","getBehaviorClass","behaviorClass","BehaviorClass","parseBehaviors","behaviors","allBehaviors","reducedBehaviors","behaviorDefiniton","behavior","push","_initBehaviors","_behaviors","_getBehaviorTriggers","triggers","_invoke","memo","_triggers","_getBehaviorEvents","events","_events","_proxyBehaviorViewProperties","_delegateBehaviorEntityEvents","_undelegateBehaviorEntityEvents","_destroyBehaviors","_removeBehavior","undelegate","without","_bindBehaviorUIElements","_unbindBehaviorUIElements","_triggerEventOnBehaviors","_delegateEntityEvents","model","collection","_modelEvents","_collectionEvents","_undelegateEntityEvents","_deleteEntityEventHandlers","_renderTemplate","template","data","mixinTemplateContext","serializeData","html","_renderHtml","attachElContent","getTemplate","serializedData","templateContext","serializeModel","items","serializeCollection","attributes","map","models","Dom","setContents","el","$el","delegateEventSplitter","getNamespacedEventName","namespace","FEATURES","childViewEventPrefix","triggersStopPropagation","triggersPreventDefault","DEV_MODE","isEnabled","setEnabled","state","buildViewTrigger","triggerDef","isString","shouldPreventDefault","preventDefault","shouldStopPropagation","stopPropagation","_getViewTriggers","value","normalizeUIKeys","ui","val","normalizedKey","normalizeUIString","uiRegEx","uiString","r","slice","normalizeUIValues","property","propertyVal","uiBindings","_getUIBindings","_bindUIElements","_uiBindings","_ui","selector","$","_unbindUIElements","_getUI","getEl","setDomApi","mixin","createBuffer","document","createDocumentFragment","getDocumentEl","ownerDocument","documentElement","findEl","find","hasEl","childEl","contains","parentNode","detachEl","_$el","detach","replaceEl","newEl","oldEl","parent","replaceChild","swapEl","el1","el2","parent1","parent2","next1","nextSibling","next2","insertBefore","appendContents","contents","_$contents","append","hasContents","hasChildNodes","detachContents","ViewMixin","DomApi","_isElAttached","supportsRenderLifecycle","supportsDestroyLifecycle","isRendered","isAttached","delegateEvents","_buildEventProxies","combinedEvents","_getEvents","_getTriggers","View","delegateEntityEvents","undelegateEntityEvents","_isDestroying","_disableDetachEvents","unbindUIElements","_removeElement","_removeChildren","off","removeData","bindUIElements","getUI","_childViewEvents","_childViewTriggers","_eventPrefix","_getEventPrefix","defaultPrefix","_proxyChildViewEvents","_childViewEventHandler","childViewEvents","childViewTriggers","BehaviorsMixin","DelegateEntityEventsMixin","TemplateRenderMixin","TriggersMixin","UIMixin","renderView","render","destroyView","disableDetachEvents","remove","classErrorName","Region","_initEl","_setEl","replaceElement","_isReplaced","_isSwappingView","show","_ensureElement","_getView","currentView","_isShown","empty","_setupChildView","_attachView","length","_setElement","shouldReplace","_restoreEl","_replaceEl","attachHtml","_empty","parentView","_parentView","_shouldDisableMonitoring","shouldReplaceEl","allowMissingEl","viewOptions","_getViewOptions","_detachView","isReplaced","isSwappingView","detachHtml","shouldDestroy","removeView","_stopChildViewEvents","detachView","shouldRestoreEl","hasView","reset","_name","_removeReferences","definition","defaults","buildRegionFromObject","regionClass","RegionClass","_initRegions","regions","_regions","addRegions","_reInitRegions","addRegion","isEmpty","_addRegions","regionDefinitions","parentEl","partial","buildRegion","_addRegion","region","removeRegion","_removeRegion","removeRegions","_getRegions","bind","emptyRegions","getRegions","hasRegion","getRegion","clone","showChildView","detachChildView","getChildView","setRenderer","renderer","childReducer","children","setElement","RegionsMixin","Container","_init","methods","_views","concat","stringComparator","comparator","get","_viewsByCid","_indexByModel","_updateLength","_add","index","_addViewIndexes","splice","_sort","_sortBy","sort","sortedViews","sortBy","_set","views","shouldReset","_swap","view1","view2","view1Index","findIndexByView","view2Index","swapView","findByModel","findByModelCid","modelCid","findByIndex","indexOf","findByCid","_remove","CollectionView","sortWithCollection","_initChildViewStorage","getEmptyRegion","_children","ChildViewContainer","$emptyEl","$container","_emptyRegion","_initialEvents","_onCollectionSort","_onCollectionReset","_onCollectionUpdate","add","merge","viewComparator","_destroyChildren","_addChildModels","changes","removedViews","removed","_removeChildModels","_addedViews","added","_detachChildren","_removeChildViews","_removeChildModel","_removeChild","_addChildModel","_createChildView","_addChild","ChildView","_getChildView","childViewOptions","_getChildViewOptions","buildChildView","childView","ChildViewClass","removeChildView","_getChildViewContainer","childViewContainer","_sortChildren","filter","getComparator","setComparator","preventRender","comparatorChanged","shouldSort","removeComparator","_viewComparator","_filterChildren","_renderChildren","viewFilter","_getFilter","attachViews","detachViews","getFilter","matcher","matches","setFilter","filterChanged","shouldRender","removeFilter","detachingViews","_detachChildView","_hasUnrenderedViews","_showEmptyView","_destroyEmptyView","els","_getBuffer","_attachChildren","elBuffer","EmptyView","_getEmptyView","_getEmptyViewOptions","emptyRegion","emptyView","emptyViewOptions","swapChildViews","addChildView","hasIndex","isAddedToEnd","_removeChildView","_destroyChildView","shouldDisableEvents","Behavior","proxyViewProperties","behaviorEvents","behaviorHandler","behaviorTriggers","Application","_initRegion","start","_region","showView","getView","_bindEvents","_unbindEvents","_bindRequests","_unbindRequests","_mergeOptions","_getOption","_normalizeMethods","_triggerMethod","MnObject","Object","VERSION"],"mappings":"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"} \ No newline at end of file diff --git a/dist/backbone.marionette.min.js b/dist/backbone.marionette.min.js new file mode 100644 index 0000000000..53f3f0973d --- /dev/null +++ b/dist/backbone.marionette.min.js @@ -0,0 +1,13 @@ +/** +* @license +* MarionetteJS (Backbone.Marionette) +* ---------------------------------- +* v4.1.0 +* +* Copyright (c)2019 Derick Bailey, Muted Solutions, LLC. +* Distributed under MIT license +* +* http://marionettejs.com +*/ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("backbone"),require("underscore"),require("backbone.radio")):"function"==typeof define&&define.amd?define(["exports","backbone","underscore","backbone.radio"],t):(e=e||self,function(){var i=e.Marionette,n=e.Marionette={};t(n,e.Backbone,e._,e.Backbone.Radio),n.noConflict=function(){return e.Marionette=i,n}}())}(this,function(e,t,i,n){"use strict";t=t&&t.hasOwnProperty("default")?t.default:t,i=i&&i.hasOwnProperty("default")?i.default:i,n=n&&n.hasOwnProperty("default")?n.default:n;var s=function(e){return function(t){for(var i=arguments.length,n=new Array(i>1?i-1:0),s=1;s1?i-1:0),h=1;h1&&void 0!==arguments[1]?arguments[1]:ie(e)).detach()},replaceEl:function(e,t){if(e!==t){var i=t.parentNode;i&&i.replaceChild(e,t)}},swapEl:function(e,t){if(e!==t){var i=e.parentNode,n=t.parentNode;if(i&&n){var s=e.nextSibling,r=t.nextSibling;i.insertBefore(t,s),n.insertBefore(e,r)}}},setContents:function(e,t){(arguments.length>2&&void 0!==arguments[2]?arguments[2]:ie(e)).html(t)},appendContents:function(e,t){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=i._$el,s=void 0===n?ie(e):n,r=i._$contents,o=void 0===r?ie(t):r;s.append(o)},hasContents:function(e){return!!e&&e.hasChildNodes()},detachContents:function(e){(arguments.length>1&&void 0!==arguments[1]?arguments[1]:ie(e)).contents().detach()}},re={Dom:se,_isElAttached:function(){return!!this.el&&this.Dom.hasEl(this.Dom.getDocumentEl(this.el),this.el)},supportsRenderLifecycle:!0,supportsDestroyLifecycle:!0,_isDestroyed:!1,isDestroyed:function(){return!!this._isDestroyed},_isRendered:!1,isRendered:function(){return!!this._isRendered},_isAttached:!1,isAttached:function(){return!!this._isAttached},delegateEvents:function(e){this._proxyBehaviorViewProperties(),this._buildEventProxies();var n=i.extend({},this._getBehaviorEvents(),this._getEvents(e),this._getBehaviorTriggers(),this._getTriggers());return t.View.prototype.delegateEvents.call(this,n),this},_getEvents:function(e){return e?this.normalizeUIKeys(e):this.events?this.normalizeUIKeys(i.result(this,"events")):void 0},_getTriggers:function(){if(this.triggers){var e=this.normalizeUIKeys(i.result(this,"triggers"));return this._getViewTriggers(this,e)}},delegateEntityEvents:function(){return this._delegateEntityEvents(this.model,this.collection),this._delegateBehaviorEntityEvents(),this},undelegateEntityEvents:function(){return this._undelegateEntityEvents(this.model,this.collection),this._undelegateBehaviorEntityEvents(),this},destroy:function(e){if(this._isDestroyed||this._isDestroying)return this;this._isDestroying=!0;var t=this._isAttached&&!this._disableDetachEvents;return this.triggerMethod("before:destroy",this,e),t&&this.triggerMethod("before:detach",this),this.unbindUIElements(),this._removeElement(),t&&(this._isAttached=!1,this.triggerMethod("detach",this)),this._removeChildren(),this._isDestroyed=!0,this._isRendered=!1,this._destroyBehaviors(e),this._deleteEntityEventHandlers(),this.triggerMethod("destroy",this,e),this._triggerEventOnBehaviors("destroy",this,e),this.stopListening(),this},_removeElement:function(){this.$el.off().removeData(),this.Dom.detachEl(this.el,this.$el)},bindUIElements:function(){return this._bindUIElements(),this._bindBehaviorUIElements(),this},unbindUIElements:function(){return this._unbindUIElements(),this._unbindBehaviorUIElements(),this},getUI:function(e){return this._getUI(e)},_buildEventProxies:function(){this._childViewEvents=this.normalizeMethods(i.result(this,"childViewEvents")),this._childViewTriggers=i.result(this,"childViewTriggers"),this._eventPrefix=this._getEventPrefix()},_getEventPrefix:function(){var e=!!G("childViewEventPrefix")&&"childview",t=i.result(this,"childViewEventPrefix",e);return!1===t?t:t+":"},_proxyChildViewEvents:function(e){(this._childViewEvents||this._childViewTriggers||this._eventPrefix)&&this.listenTo(e,"all",this._childViewEventHandler)},_childViewEventHandler:function(e){for(var t=this._childViewEvents,i=arguments.length,n=new Array(i>1?i-1:0),s=1;s1&&(this.$el=this.Dom.getEl(this.el))},_setElement:function(e){if(e===this.el)return this;var t=this._isReplaced;if(this._restoreEl(),this.el=e,this._setEl(),this.currentView){var i=this.currentView;t?this._replaceEl(i):this.attachHtml(i)}return this},_setupChildView:function(e){I(e),this._proxyChildViewEvents(e),e.on("destroy",this._empty,this)},_proxyChildViewEvents:function(e){var t=this._parentView;t&&t._proxyChildViewEvents(e)},_shouldDisableMonitoring:function(){return this._parentView&&!1===this._parentView.monitorViewEvents},_isElAttached:function(){return this.Dom.hasEl(this.Dom.getDocumentEl(this.el),this.el)},_attachView:function(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).replaceElement,n=!e._isAttached&&this._isElAttached()&&!this._shouldDisableMonitoring(),s=void 0===t?!!i.result(this,"replaceElement"):!!t;n&&e.triggerMethod("before:attach",e),s?this._replaceEl(e):this.attachHtml(e),n&&(e._isAttached=!0,e.triggerMethod("attach",e)),e._isShown=!0},_ensureElement:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(i.isObject(this.el)||this._setEl(),!this.$el||0===this.$el.length){if(void 0===e.allowMissingEl?!!i.result(this,"allowMissingEl"):!!e.allowMissingEl)return!1;throw new d({name:"RegionError",message:'An "el" must exist in DOM for this region '.concat(this.cid),url:"marionette.region.html#additional-options"})}return!0},_getView:function(e){if(!e)throw new d({name:"RegionError",message:"The view passed is undefined and therefore invalid. You must pass a view instance to show.",url:"marionette.region.html#showing-a-view"});if(e._isDestroyed)throw new d({name:"RegionError",message:'View (cid: "'.concat(e.cid,'") has already been destroyed and cannot be used.'),url:"marionette.region.html#showing-a-view"});if(e instanceof t.View)return e;var i=this._getViewOptions(e);return new ve(i)},_getViewOptions:function(e){if(i.isFunction(e))return{template:e};if(i.isObject(e))return e;return{template:function(){return e}}},getEl:function(e){var t=i.result(this,"parentEl");return t&&i.isString(e)?this.Dom.findEl(t,e):this.Dom.getEl(e)},_replaceEl:function(e){this._restoreEl(),e.on("before:destroy",this._restoreEl,this),this.Dom.replaceEl(e.el,this.el),this._isReplaced=!0},_restoreEl:function(){if(this._isReplaced){var e=this.currentView;e&&(this._detachView(e),this._isReplaced=!1)}},isReplaced:function(){return!!this._isReplaced},isSwappingView:function(){return!!this._isSwappingView},attachHtml:function(e){this.Dom.appendContents(this.el,e.el,{_$el:this.$el,_$contents:e.$el})},empty:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{allowMissingEl:!0},t=this.currentView;return t?(this._empty(t,!0),this):(this._ensureElement(e)&&this.detachHtml(),this)},_empty:function(e,t){e.off("destroy",this._empty,this),this.triggerMethod("before:empty",this,e),this._restoreEl(),delete this.currentView,e._isDestroyed||(t?this.removeView(e):this._detachView(e),e._isShown=!1,this._stopChildViewEvents(e)),this.triggerMethod("empty",this,e)},_stopChildViewEvents:function(e){this._parentView&&this._parentView.stopListening(e)},destroyView:function(e){return e._isDestroyed?e:(he(e,this._shouldDisableMonitoring()),e)},removeView:function(e){this.destroyView(e)},detachView:function(){var e=this.currentView;if(e)return this._empty(e),e},_detachView:function(e){var t=e._isAttached&&!this._shouldDisableMonitoring(),i=this._isReplaced;t&&e.triggerMethod("before:detach",e),i?this.Dom.replaceEl(this.el,e.el):this.detachHtml(),t&&(e._isAttached=!1,e.triggerMethod("detach",e))},detachHtml:function(){this.Dom.detachContents(this.el,this.$el)},hasView:function(){return!!this.currentView},reset:function(e){return this.empty(e),this.el=this._initEl,delete this.$el,this},_isDestroyed:!1,isDestroyed:function(){return this._isDestroyed},destroy:function(e){return this._isDestroyed?this:(this.triggerMethod("before:destroy",this,e),this._isDestroyed=!0,this.reset(e),this._name&&this._parentView._removeReferences(this._name),delete this._parentView,delete this._name,this.triggerMethod("destroy",this,e),this.stopListening(),this)}});var ue={regionClass:le,_initRegions:function(){this.regions=this.regions||{},this._regions={},this.addRegions(i.result(this,"regions"))},_reInitRegions:function(){H(this._regions,"reset")},addRegion:function(e,t){var i={};return i[e]=t,this.addRegions(i)[e]},addRegions:function(e){if(!i.isEmpty(e))return e=this.normalizeUIValues(e,"el"),this.regions=i.extend({},this.regions,e),this._addRegions(e)},_addRegions:function(e){var t=this,n={regionClass:this.regionClass,parentEl:i.partial(i.result,this,"el")};return i.reduce(e,function(e,i,s){return e[s]=ae(i,n),t._addRegion(e[s],s),e},{})},_addRegion:function(e,t){this.triggerMethod("before:add:region",this,t,e),e._parentView=this,e._name=t,this._regions[t]=e,this.triggerMethod("add:region",this,t,e)},removeRegion:function(e){var t=this._regions[e];return this._removeRegion(t,e),t},removeRegions:function(){var e=this._getRegions();return i.each(this._regions,this._removeRegion.bind(this)),e},_removeRegion:function(e,t){this.triggerMethod("before:remove:region",this,t,e),e.destroy(),this.triggerMethod("remove:region",this,t,e)},_removeReferences:function(e){delete this.regions[e],delete this._regions[e]},emptyRegions:function(){var e=this.getRegions();return H(e,"empty"),e},hasRegion:function(e){return!!this.getRegion(e)},getRegion:function(e){return this._isRendered||this.render(),this._regions[e]},_getRegions:function(){return i.clone(this._regions)},getRegions:function(){return this._isRendered||this.render(),this._getRegions()},showChildView:function(e,t,i){return this.getRegion(e).show(t,i),t},detachChildView:function(e){return this.getRegion(e).detachView()},getChildView:function(e){return this.getRegion(e).currentView}};function ge(e){return this.prototype._renderHtml=e,this}var fe=["behaviors","childViewEventPrefix","childViewEvents","childViewTriggers","collectionEvents","events","modelEvents","regionClass","regions","template","templateContext","triggers","ui"];function _e(e,t){return t.currentView&&e.push(t.currentView),e}var ve=t.View.extend({constructor:function(e){this._setOptions(e,fe),I(this),this._initBehaviors(),this._initRegions(),t.View.prototype.constructor.apply(this,arguments),this.delegateEntityEvents(),this._triggerEventOnBehaviors("initialize",this,e)},setElement:function(){return t.View.prototype.setElement.apply(this,arguments),this._isRendered=this.Dom.hasContents(this.el),this._isAttached=this._isElAttached(),this._isRendered&&this.bindUIElements(),this},render:function(){var e=this.getTemplate();return!1===e||this._isDestroyed?this:(this.triggerMethod("before:render",this),this._isRendered&&this._reInitRegions(),this._renderTemplate(e),this.bindUIElements(),this._isRendered=!0,this.triggerMethod("render",this),this)},_removeChildren:function(){this.removeRegions()},_getImmediateChildren:function(){return i.reduce(this._regions,_e,[])}},{setRenderer:ge,setDomApi:ne});i.extend(ve.prototype,re,ue);var me=function(){this._init()};function pe(e,t){return t.model&&t.model.get(e)}i.each(["forEach","each","map","find","detect","filter","select","reject","every","all","some","any","include","contains","invoke","toArray","first","initial","rest","last","without","isEmpty","pluck","reduce","partition"],function(e){me.prototype[e]=function(){for(var t=arguments.length,n=new Array(t),s=0;s1&&void 0!==arguments[1]?arguments[1]:this._views.length;this._addViewIndexes(e),this._views.splice(t,0,e),this._updateLength()},_addViewIndexes:function(e){this._viewsByCid[e.cid]=e,e.model&&(this._indexByModel[e.model.cid]=e)},_sort:function(e,t){return"string"==typeof e?(e=i.partial(pe,e),this._sortBy(e)):1===e.length?this._sortBy(e.bind(t)):this._views.sort(e.bind(t))},_sortBy:function(e){var t=i.sortBy(this._views,e);return this._set(t),t},_set:function(e,t){this._views.length=0,this._views.push.apply(this._views,e.slice(0)),t&&(this._viewsByCid={},this._indexByModel={},i.each(e,this._addViewIndexes.bind(this)),this._updateLength())},_swap:function(e,t){var i=this.findIndexByView(e),n=this.findIndexByView(t);if(-1!==i&&-1!==n){var s=this._views[i];this._views[i]=this._views[n],this._views[n]=s}},findByModel:function(e){return this.findByModelCid(e.cid)},findByModelCid:function(e){return this._indexByModel[e]},findByIndex:function(e){return this._views[e]},findIndexByView:function(e){return this._views.indexOf(e)},findByCid:function(e){return this._viewsByCid[e]},hasView:function(e){return!!this.findByCid(e.cid)},_remove:function(e){if(this._viewsByCid[e.cid]){e.model&&delete this._indexByModel[e.model.cid],delete this._viewsByCid[e.cid];var t=this.findIndexByView(e);this._views.splice(t,1),this._updateLength()}},_updateLength:function(){this.length=this._views.length}});var we=["behaviors","childView","childViewContainer","childViewEventPrefix","childViewEvents","childViewOptions","childViewTriggers","collectionEvents","emptyView","emptyViewOptions","events","modelEvents","sortWithCollection","template","templateContext","triggers","ui","viewComparator","viewFilter"],Ee=t.View.extend({sortWithCollection:!0,constructor:function(e){this._setOptions(e,we),I(this),this._initChildViewStorage(),this._initBehaviors(),t.View.prototype.constructor.apply(this,arguments),this.getEmptyRegion(),this.delegateEntityEvents(),this._triggerEventOnBehaviors("initialize",this,e)},_initChildViewStorage:function(){this._children=new me,this.children=new me},getEmptyRegion:function(){var e=this.$container||this.$el;return this._emptyRegion&&!this._emptyRegion.isDestroyed()?(this._emptyRegion._setElement(e[0]),this._emptyRegion):(this._emptyRegion=new le({el:e[0],replaceElement:!1}),this._emptyRegion._parentView=this,this._emptyRegion)},_initialEvents:function(){this._isRendered||this.listenTo(this.collection,{sort:this._onCollectionSort,reset:this._onCollectionReset,update:this._onCollectionUpdate})},_onCollectionSort:function(e,t){var i=t.add,n=t.merge,s=t.remove;this.sortWithCollection&&!1!==this.viewComparator&&(i||s||n||this.sort())},_onCollectionReset:function(){this._destroyChildren(),this._addChildModels(this.collection.models),this.sort()},_onCollectionUpdate:function(e,t){var i=t.changes,n=i.removed.length&&this._removeChildModels(i.removed);this._addedViews=i.added.length&&this._addChildModels(i.added),this._detachChildren(n),this.sort(),this._removeChildViews(n)},_removeChildModels:function(e){var t=this;return i.reduce(e,function(e,i){var n=t._removeChildModel(i);return n&&e.push(n),e},[])},_removeChildModel:function(e){var t=this._children.findByModel(e);return t&&this._removeChild(t),t},_removeChild:function(e){this.triggerMethod("before:remove:child",this,e),this.children._remove(e),this._children._remove(e),this.triggerMethod("remove:child",this,e)},_addChildModels:function(e){return i.map(e,this._addChildModel.bind(this))},_addChildModel:function(e){var t=this._createChildView(e);return this._addChild(t),t},_createChildView:function(e){var t=this._getChildView(e),i=this._getChildViewOptions(e);return this.buildChildView(e,t,i)},_addChild:function(e,t){this.triggerMethod("before:add:child",this,e),this._setupChildView(e),this._children._add(e,t),this.children._add(e,t),this.triggerMethod("add:child",this,e)},_getChildView:function(e){var t=this.childView;if(!t)throw new d({name:"CollectionViewError",message:'A "childView" must be specified',url:"marionette.collectionview.html#collectionviews-childview"});if(!(t=this._getView(t,e)))throw new d({name:"CollectionViewError",message:'"childView" must be a view class or a function that returns a view class',url:"marionette.collectionview.html#collectionviews-childview"});return t},_getView:function(e,n){return e.prototype instanceof t.View||e===t.View?e:i.isFunction(e)?e.call(this,n):void 0},_getChildViewOptions:function(e){return i.isFunction(this.childViewOptions)?this.childViewOptions(e):this.childViewOptions},buildChildView:function(e,t,n){return new t(i.extend({model:e},n))},_setupChildView:function(e){I(e),e.on("destroy",this.removeChildView,this),this._proxyChildViewEvents(e)},_getImmediateChildren:function(){return this.children._views},setElement:function(){return t.View.prototype.setElement.apply(this,arguments),this._isAttached=this._isElAttached(),this},render:function(){if(this._isDestroyed)return this;this.triggerMethod("before:render",this),this._destroyChildren(),this.collection&&(this._addChildModels(this.collection.models),this._initialEvents());var e=this.getTemplate();return e&&(this._renderTemplate(e),this.bindUIElements()),this._getChildViewContainer(),this.sort(),this._isRendered=!0,this.triggerMethod("render",this),this},_getChildViewContainer:function(){var e=i.result(this,"childViewContainer");if(this.$container=e?this.$(e):this.$el,!this.$container.length)throw new d({name:"CollectionViewError",message:'The specified "childViewContainer" was not found: '.concat(e),url:"marionette.collectionview.html#defining-the-childviewcontainer"})},sort:function(){return this._sortChildren(),this.filter(),this},_sortChildren:function(){if(this._children.length){var e=this.getComparator();e&&(delete this._addedViews,this.triggerMethod("before:sort",this),this._children._sort(e,this),this.triggerMethod("sort",this))}},setComparator:function(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).preventRender,i=this.viewComparator!==e&&!t;return this.viewComparator=e,i&&this.sort(),this},removeComparator:function(e){return this.setComparator(null,e)},getComparator:function(){return this.viewComparator?this.viewComparator:!(!this.sortWithCollection||!1===this.viewComparator||!this.collection)&&this._viewComparator},_viewComparator:function(e){return this.collection.indexOf(e.model)},filter:function(){return this._isDestroyed?this:(this._filterChildren(),this._renderChildren(),this)},_filterChildren:function(){var e=this;if(this._children.length){var t=this._getFilter();if(t){delete this._addedViews,this.triggerMethod("before:filter",this);var n=[],s=[];i.each(this._children._views,function(i,r,o){(t.call(e,i,r,o)?n:s).push(i)}),this._detachChildren(s),this.children._set(n,!0),this.triggerMethod("filter",this,n,s)}else{var r=this.children.length!==this._children.length;this.children._set(this._children._views,r)}}},_getFilter:function(){var e=this.getFilter();if(!e)return!1;if(i.isFunction(e))return e;if(i.isObject(e)){var t=i.matches(e);return function(e){return t(e.model&&e.model.attributes)}}if(i.isString(e))return function(t){return t.model&&t.model.get(e)};throw new d({name:"CollectionViewError",message:'"viewFilter" must be a function, predicate object literal, a string indicating a model attribute, or falsy',url:"marionette.collectionview.html#defining-the-viewfilter"})},getFilter:function(){return this.viewFilter},setFilter:function(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).preventRender,i=this.viewFilter!==e&&!t;return this.viewFilter=e,i&&this.filter(),this},removeFilter:function(e){return this.setFilter(null,e)},_detachChildren:function(e){i.each(e,this._detachChildView.bind(this))},_detachChildView:function(e){var t=e._isAttached&&!1!==this.monitorViewEvents;t&&e.triggerMethod("before:detach",e),this.detachHtml(e),t&&(e._isAttached=!1,e.triggerMethod("detach",e)),e._isShown=!1},detachHtml:function(e){this.Dom.detachEl(e.el,e.$el)},_renderChildren:function(){this._hasUnrenderedViews&&(delete this._addedViews,delete this._hasUnrenderedViews);var e=this._addedViews||this.children._views;if(this.triggerMethod("before:render:children",this,e),this.isEmpty())this._showEmptyView();else{this._destroyEmptyView();var t=this._getBuffer(e);this._attachChildren(t,e)}delete this._addedViews,this.triggerMethod("render:children",this,e)},_getBuffer:function(e){var t=this,n=this.Dom.createBuffer();return i.each(e,function(e){oe(e),e._isShown=!0,t.Dom.appendContents(n,e.el,{_$contents:e.$el})}),n},_attachChildren:function(e,t){t=this._isAttached&&!1!==this.monitorViewEvents?t:[],i.each(t,function(e){e._isAttached||e.triggerMethod("before:attach",e)}),this.attachHtml(e,this.$container),i.each(t,function(e){e._isAttached||(e._isAttached=!0,e.triggerMethod("attach",e))})},attachHtml:function(e,t){this.Dom.appendContents(t[0],e,{_$el:t})},isEmpty:function(){return!this.children.length},_showEmptyView:function(){var e=this._getEmptyView();if(e){var t=this._getEmptyViewOptions();this.getEmptyRegion().show(new e(t))}},_getEmptyView:function(){var e=this.emptyView;if(e)return this._getView(e)},_destroyEmptyView:function(){var e=this.getEmptyRegion();e.hasView()&&e.empty()},_getEmptyViewOptions:function(){var e=this.emptyViewOptions||this.childViewOptions;return i.isFunction(e)?e.call(this):e},swapChildViews:function(e,t){if(!this._children.hasView(e)||!this._children.hasView(t))throw new d({name:"CollectionViewError",message:"Both views must be children of the collection view to swap.",url:"marionette.collectionview.html#swapping-child-views"});return this._children._swap(e,t),this.Dom.swapEl(e.el,t.el),this.children.hasView(e)!==this.children.hasView(t)?this.filter():this.children._swap(e,t),this},addChildView:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(!e||e._isDestroyed)return e;if(e._isShown)throw new d({name:"CollectionViewError",message:"View is already shown in a Region or CollectionView",url:"marionette.collectionview.html#region-viewAlreadyShown"});if(i.isObject(t)&&(n=t),null!=n.index&&(t=n.index),this._isRendered||this.render(),this._addChild(e,t),n.preventRender)return this._hasUnrenderedViews=!0,e;var s=void 0!==t;return(!s||t>=this._children.length)&&!this._hasUnrenderedViews&&(this._addedViews=[e]),s?this._renderChildren():this.sort(),e},detachChildView:function(e){return this.removeChildView(e,{shouldDetach:!0}),e},removeChildView:function(e,t){return e?(this._removeChildView(e,t),this._removeChild(e),this.isEmpty()&&this._showEmptyView(),e):e},_removeChildViews:function(e){i.each(e,this._removeChildView.bind(this))},_removeChildView:function(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).shouldDetach;e.off("destroy",this.removeChildView,this),t?this._detachChildView(e):this._destroyChildView(e),this.stopListening(e)},_destroyChildView:function(e){e._isDestroyed||he(e,!1===this.monitorViewEvents)},_removeChildren:function(){this._destroyChildren(),this.getEmptyRegion().destroy(),delete this._addedViews},_destroyChildren:function(){this._children.length&&(this.triggerMethod("before:destroy:children",this),!1===this.monitorViewEvents&&this.Dom.detachContents(this.el,this.$el),this._removeChildViews(this._children._views),this._children._init(),this.children._init(),this.triggerMethod("destroy:children",this))}},{setDomApi:ne,setRenderer:ge});i.extend(Ee.prototype,re);var ye=["collectionEvents","events","modelEvents","triggers","ui"],Ve=function(e,t){this.view=t,this._setOptions(e,ye),this.cid=i.uniqueId(this.cidPrefix),this.ui=i.extend({},i.result(this,"ui"),i.result(t,"ui")),this.listenTo(t,"all",this.triggerMethod),this.initialize.apply(this,arguments)};Ve.extend=r,i.extend(Ve.prototype,T,N,Q,te,{cidPrefix:"mnb",initialize:function(){},$:function(){return this.view.$.apply(this.view,arguments)},destroy:function(){return this.stopListening(),this.view._removeBehavior(this),this._deleteEntityEventHandlers(),this},proxyViewProperties:function(){return this.$el=this.view.$el,this.el=this.view.el,this},bindUIElements:function(){return this._bindUIElements(),this},unbindUIElements:function(){return this._unbindUIElements(),this},getUI:function(e){return this._getUI(e)},delegateEntityEvents:function(){return this._delegateEntityEvents(this.view.model,this.view.collection),this},undelegateEntityEvents:function(){return this._undelegateEntityEvents(this.view.model,this.view.collection),this},_getEvents:function(){var e=this;if(this.events){var t=this.normalizeUIKeys(i.result(this,"events"));return i.reduce(t,function(t,n,s){return i.isFunction(n)||(n=e[n]),n?(t[s=Y(s,e.cid)]=n.bind(e),t):t},{})}},_getTriggers:function(){if(this.triggers){var e=this.normalizeUIKeys(i.result(this,"triggers"));return this._getViewTriggers(this.view,e)}}});var Ce=["channelName","radioEvents","radioRequests","region","regionClass"],be=function(e){this._setOptions(e,Ce),this.cid=i.uniqueId(this.cidPrefix),this._initRegion(),this._initRadio(),this.initialize.apply(this,arguments)};be.extend=r,i.extend(be.prototype,T,z,F,{cidPrefix:"mna",initialize:function(){},start:function(e){return this.triggerMethod("before:start",this,e),this.triggerMethod("start",this,e),this},regionClass:le,_initRegion:function(){var e=this.region;if(e){var t={regionClass:this.regionClass};this._region=ae(e,t)}},getRegion:function(){return this._region},showView:function(e){for(var t=this.getRegion(),i=arguments.length,n=new Array(i>1?i-1:0),s=1;s functions or function names\n// and return a mapping of events => functions\nconst normalizeMethods = function(hash) {\n if (!hash) { return }\n\n return _.reduce(hash, (normalizedHash, method, name) => {\n if (!_.isFunction(method)) {\n method = this[method];\n }\n if (method) {\n normalizedHash[name] = method;\n }\n return normalizedHash;\n }, {});\n};\n\nexport default normalizeMethods;\n","// Error\n// -----\n\nimport _ from 'underscore';\nimport extend from './extend';\nimport {version} from '../../package.json';\n\nconst errorProps = ['description', 'fileName', 'lineNumber', 'name', 'message', 'number', 'url'];\n\nconst MarionetteError = extend.call(Error, {\n urlRoot: `http://marionettejs.com/docs/v${version}/`,\n\n url: '',\n\n constructor(options) {\n const error = Error.call(this, options.message);\n _.extend(this, _.pick(error, errorProps), _.pick(options, errorProps));\n\n if (Error.captureStackTrace) {\n this.captureStackTrace();\n }\n\n this.url = this.urlRoot + this.url;\n },\n\n captureStackTrace() {\n Error.captureStackTrace(this, MarionetteError);\n },\n\n toString() {\n return `${ this.name }: ${ this.message } See: ${ this.url }`;\n }\n});\n\nexport default MarionetteError;\n","// Bind Entity Events & Unbind Entity Events\n// -----------------------------------------\n//\n// These methods are used to bind/unbind a backbone \"entity\" (e.g. collection/model)\n// to methods on a target object.\n//\n// The first parameter, `target`, must have the Backbone.Events module mixed in.\n//\n// The second parameter is the `entity` (Backbone.Model, Backbone.Collection or\n// any object that has Backbone.Events mixed in) to bind the events from.\n//\n// The third parameter is a hash of { \"event:name\": \"eventHandler\" }\n// configuration. Multiple handlers can be separated by a space. A\n// function can be supplied instead of a string handler name.\n\nimport _ from 'underscore';\nimport normalizeMethods from './normalize-methods';\nimport MarionetteError from '../utils/error';\n\nfunction normalizeBindings(context, bindings) {\n if (!_.isObject(bindings)) {\n throw new MarionetteError({\n message: 'Bindings must be an object.',\n url: 'common.html#bindevents'\n });\n }\n\n return normalizeMethods.call(context, bindings);\n}\n\nfunction bindEvents(entity, bindings) {\n if (!entity || !bindings) { return this; }\n\n this.listenTo(entity, normalizeBindings(this, bindings));\n\n return this;\n}\n\nfunction unbindEvents(entity, bindings) {\n if (!entity) { return this; }\n\n if (!bindings) {\n this.stopListening(entity);\n return this;\n }\n\n this.stopListening(entity, normalizeBindings(this, bindings));\n\n return this;\n}\n\n// Export Public API\nexport {\n bindEvents,\n unbindEvents\n};\n","// Bind/Unbind Radio Requests\n// -----------------------------------------\n//\n// These methods are used to bind/unbind a backbone.radio request\n// to methods on a target object.\n//\n// The first parameter, `target`, will set the context of the reply method\n//\n// The second parameter is the `Radio.channel` to bind the reply to.\n//\n// The third parameter is a hash of { \"request:name\": \"replyHandler\" }\n// configuration. A function can be supplied instead of a string handler name.\n\nimport _ from 'underscore';\nimport normalizeMethods from './normalize-methods';\nimport MarionetteError from '../utils/error';\n\nfunction normalizeBindings(context, bindings) {\n if (!_.isObject(bindings)) {\n throw new MarionetteError({\n message: 'Bindings must be an object.',\n url: 'common.html#bindrequests'\n });\n }\n\n return normalizeMethods.call(context, bindings);\n}\n\nfunction bindRequests(channel, bindings) {\n if (!channel || !bindings) { return this; }\n\n channel.reply(normalizeBindings(this, bindings), this);\n\n return this;\n}\n\nfunction unbindRequests(channel, bindings) {\n if (!channel) { return this; }\n\n if (!bindings) {\n channel.stopReplying(null, null, this);\n return this;\n }\n\n channel.stopReplying(normalizeBindings(this, bindings));\n\n return this;\n}\n\nexport {\n bindRequests,\n unbindRequests\n};\n","// Marionette.getOption\n// --------------------\n\n// Retrieve an object, function or other value from the\n// object or its `options`, with `options` taking precedence.\nconst getOption = function(optionName) {\n if (!optionName) { return; }\n if (this.options && (this.options[optionName] !== undefined)) {\n return this.options[optionName];\n } else {\n return this[optionName];\n }\n};\n\nexport default getOption;\n","import _ from 'underscore';\n\n// Merge `keys` from `options` onto `this`\nconst mergeOptions = function(options, keys) {\n if (!options) { return; }\n\n _.each(keys, (key) => {\n const option = options[key];\n if (option !== undefined) {\n this[key] = option;\n }\n });\n};\n\nexport default mergeOptions;\n","// DOM Refresh\n// -----------\n\nimport _ from 'underscore';\n\n// Trigger method on children unless a pure Backbone.View\nfunction triggerMethodChildren(view, event, shouldTrigger) {\n if (!view._getImmediateChildren) { return; }\n _.each(view._getImmediateChildren(), child => {\n if (!shouldTrigger(child)) { return; }\n child.triggerMethod(event, child);\n });\n}\n\nfunction shouldTriggerAttach(view) {\n return !view._isAttached;\n}\n\nfunction shouldAttach(view) {\n if (!shouldTriggerAttach(view)) { return false; }\n view._isAttached = true;\n return true;\n}\n\nfunction shouldTriggerDetach(view) {\n return view._isAttached;\n}\n\nfunction shouldDetach(view) {\n view._isAttached = false;\n return true;\n}\n\nfunction triggerDOMRefresh(view) {\n if (view._isAttached && view._isRendered) {\n view.triggerMethod('dom:refresh', view);\n }\n}\n\nfunction triggerDOMRemove(view) {\n if (view._isAttached && view._isRendered) {\n view.triggerMethod('dom:remove', view);\n }\n}\n\nfunction handleBeforeAttach() {\n triggerMethodChildren(this, 'before:attach', shouldTriggerAttach);\n}\n\nfunction handleAttach() {\n triggerMethodChildren(this, 'attach', shouldAttach);\n triggerDOMRefresh(this);\n}\n\nfunction handleBeforeDetach() {\n triggerMethodChildren(this, 'before:detach', shouldTriggerDetach);\n triggerDOMRemove(this);\n}\n\nfunction handleDetach() {\n triggerMethodChildren(this, 'detach', shouldDetach);\n}\n\nfunction handleBeforeRender() {\n triggerDOMRemove(this);\n}\n\nfunction handleRender() {\n triggerDOMRefresh(this);\n}\n\n// Monitor a view's state, propagating attach/detach events to children and firing dom:refresh\n// whenever a rendered view is attached or an attached view is rendered.\nfunction monitorViewEvents(view) {\n if (view._areViewEventsMonitored || view.monitorViewEvents === false) { return; }\n\n view._areViewEventsMonitored = true;\n\n view.on({\n 'before:attach': handleBeforeAttach,\n 'attach': handleAttach,\n 'before:detach': handleBeforeDetach,\n 'detach': handleDetach,\n 'before:render': handleBeforeRender,\n 'render': handleRender\n });\n}\n\nexport default monitorViewEvents;\n","// Trigger Method\n// --------------\n\nimport _ from 'underscore';\nimport getOption from './get-option';\n\n// split the event name on the \":\"\nconst splitter = /(^|:)(\\w)/gi;\n\n// Only calc getOnMethodName once\nconst methodCache = {};\n\n// take the event section (\"section1:section2:section3\")\n// and turn it in to uppercase name onSection1Section2Section3\nfunction getEventName(match, prefix, eventName) {\n return eventName.toUpperCase();\n}\n\nconst getOnMethodName = function(event) {\n if (!methodCache[event]) {\n methodCache[event] = 'on' + event.replace(splitter, getEventName);\n }\n\n return methodCache[event];\n};\n\n// Trigger an event and/or a corresponding method name. Examples:\n//\n// `this.triggerMethod(\"foo\")` will trigger the \"foo\" event and\n// call the \"onFoo\" method.\n//\n// `this.triggerMethod(\"foo:bar\")` will trigger the \"foo:bar\" event and\n// call the \"onFooBar\" method.\nexport default function triggerMethod(event) {\n // get the method name from the event name\n const methodName = getOnMethodName(event);\n const method = getOption.call(this, methodName);\n let result;\n\n // call the onMethodName if it exists\n if (_.isFunction(method)) {\n // pass all args, except the event name\n result = method.apply(this, _.drop(arguments));\n }\n\n // trigger the event\n this.trigger.apply(this, arguments);\n\n return result;\n}\n","import triggerMethod from '../common/trigger-method';\n\nexport default {\n triggerMethod\n}\n","import _ from 'underscore';\nimport Backbone from 'backbone';\n\nimport getOption from '../common/get-option';\nimport mergeOptions from '../common/merge-options';\nimport normalizeMethods from '../common/normalize-methods';\nimport triggerMethod from '../common/trigger-method';\nimport {\n bindEvents,\n unbindEvents\n} from '../common/bind-events';\nimport {\n bindRequests,\n unbindRequests\n} from '../common/bind-requests';\n\nconst CommonMixin = {\n\n // Imports the \"normalizeMethods\" to transform hashes of\n // events=>function references/names to a hash of events=>function references\n normalizeMethods,\n\n _setOptions(options, classOptions) {\n this.options = _.extend({}, _.result(this, 'options'), options);\n this.mergeOptions(options, classOptions);\n },\n\n // A handy way to merge passed-in options onto the instance\n mergeOptions,\n\n // Enable getting options from this or this.options by name.\n getOption,\n\n // Enable binding view's events from another entity.\n bindEvents,\n\n // Enable unbinding view's events from another entity.\n unbindEvents,\n\n // Enable binding view's requests.\n bindRequests,\n\n // Enable unbinding view's requests.\n unbindRequests,\n\n triggerMethod\n};\n\n_.extend(CommonMixin, Backbone.Events);\n\nexport default CommonMixin;\n","export default {\n _isDestroyed: false,\n\n isDestroyed() {\n return this._isDestroyed;\n },\n\n destroy(options) {\n if (this._isDestroyed) { return this; }\n\n this.triggerMethod('before:destroy', this, options);\n this._isDestroyed = true;\n this.triggerMethod('destroy', this, options);\n this.stopListening();\n\n return this;\n }\n};\n","import _ from 'underscore';\nimport Radio from 'backbone.radio';\nimport MarionetteError from '../utils/error';\n\n// MixinOptions\n// - channelName\n// - radioEvents\n// - radioRequests\n\nexport default {\n\n _initRadio() {\n const channelName = _.result(this, 'channelName');\n\n if (!channelName) {\n return;\n }\n\n /* istanbul ignore next */\n if (!Radio) {\n throw new MarionetteError({\n message: 'The dependency \"backbone.radio\" is missing.',\n url: 'backbone.radio.html#marionette-integration'\n });\n }\n\n const channel = this._channel = Radio.channel(channelName);\n\n const radioEvents = _.result(this, 'radioEvents');\n this.bindEvents(channel, radioEvents);\n\n const radioRequests = _.result(this, 'radioRequests');\n this.bindRequests(channel, radioRequests);\n\n this.on('destroy', this._destroyRadio);\n },\n\n _destroyRadio() {\n this._channel.stopReplying(null, null, this);\n },\n\n getChannel() {\n return this._channel;\n }\n};\n","// Object\n// ------\n\nimport _ from 'underscore';\nimport extend from './utils/extend';\nimport CommonMixin from './mixins/common';\nimport DestroyMixin from './mixins/destroy';\nimport RadioMixin from './mixins/radio';\n\nconst ClassOptions = [\n 'channelName',\n 'radioEvents',\n 'radioRequests'\n];\n\n// Object borrows many conventions and utilities from Backbone.\nconst MarionetteObject = function(options) {\n this._setOptions(options, ClassOptions);\n this.cid = _.uniqueId(this.cidPrefix);\n this._initRadio();\n this.initialize.apply(this, arguments);\n};\n\nMarionetteObject.extend = extend;\n\n// Object Methods\n// --------------\n\n_.extend(MarionetteObject.prototype, CommonMixin, DestroyMixin, RadioMixin, {\n cidPrefix: 'mno',\n\n // This is a noop method intended to be overridden\n initialize() {}\n});\n\nexport default MarionetteObject;\n","// Implementation of the invoke method (http://underscorejs.org/#invoke) with support for\n// lodash v3, v4, and underscore.js\nimport _ from 'underscore';\n\nexport default _.invokeMap || _.invoke;\n","import _ from 'underscore';\nimport MarionetteError from '../utils/error';\nimport _invoke from '../utils/invoke';\n\n// MixinOptions\n// - behaviors\n\n// Takes care of getting the behavior class\n// given options and a key.\n// If a user passes in options.behaviorClass\n// default to using that.\n// If a user passes in a Behavior Class directly, use that\n// Otherwise an error is thrown\nfunction getBehaviorClass(options) {\n if (options.behaviorClass) {\n return { BehaviorClass: options.behaviorClass, options };\n }\n\n //treat functions as a Behavior constructor\n if (_.isFunction(options)) {\n return { BehaviorClass: options, options: {} };\n }\n\n throw new MarionetteError({\n message: 'Unable to get behavior class. A Behavior constructor should be passed directly or as behaviorClass property of options',\n url: 'marionette.behavior.html#defining-and-attaching-behaviors'\n });\n}\n\n// Iterate over the behaviors object, for each behavior\n// instantiate it and get its grouped behaviors.\n// This accepts a list of behaviors in either an object or array form\nfunction parseBehaviors(view, behaviors, allBehaviors) {\n return _.reduce(behaviors, (reducedBehaviors, behaviorDefiniton) => {\n const { BehaviorClass, options } = getBehaviorClass(behaviorDefiniton);\n const behavior = new BehaviorClass(options, view);\n reducedBehaviors.push(behavior);\n\n return parseBehaviors(view, _.result(behavior, 'behaviors'), reducedBehaviors);\n }, allBehaviors);\n}\n\nexport default {\n _initBehaviors() {\n this._behaviors = parseBehaviors(this, _.result(this, 'behaviors'), []);\n },\n\n _getBehaviorTriggers() {\n const triggers = _invoke(this._behaviors, '_getTriggers');\n return _.reduce(triggers, function(memo, _triggers) {\n return _.extend(memo, _triggers);\n }, {});\n },\n\n _getBehaviorEvents() {\n const events = _invoke(this._behaviors, '_getEvents');\n return _.reduce(events, function(memo, _events) {\n return _.extend(memo, _events);\n }, {});\n },\n\n // proxy behavior $el to the view's $el.\n _proxyBehaviorViewProperties() {\n _invoke(this._behaviors, 'proxyViewProperties');\n },\n\n // delegate modelEvents and collectionEvents\n _delegateBehaviorEntityEvents() {\n _invoke(this._behaviors, 'delegateEntityEvents');\n },\n\n // undelegate modelEvents and collectionEvents\n _undelegateBehaviorEntityEvents() {\n _invoke(this._behaviors, 'undelegateEntityEvents');\n },\n\n _destroyBehaviors(options) {\n // Call destroy on each behavior after\n // destroying the view.\n // This unbinds event listeners\n // that behaviors have registered for.\n _invoke(this._behaviors, 'destroy', options);\n },\n\n // Remove a behavior\n _removeBehavior(behavior) {\n // Don't worry about the clean up if the view is destroyed\n if (this._isDestroyed) { return; }\n\n // Remove behavior-only triggers and events\n this.undelegate(`.trig${ behavior.cid } .${ behavior.cid }`);\n\n this._behaviors = _.without(this._behaviors, behavior);\n },\n\n _bindBehaviorUIElements() {\n _invoke(this._behaviors, 'bindUIElements');\n },\n\n _unbindBehaviorUIElements() {\n _invoke(this._behaviors, 'unbindUIElements');\n },\n\n _triggerEventOnBehaviors(eventName, view, options) {\n _invoke(this._behaviors, 'triggerMethod', eventName, view, options);\n }\n};\n","import _ from 'underscore';\n\n// MixinOptions\n// - collectionEvents\n// - modelEvents\n\nexport default {\n // Handle `modelEvents`, and `collectionEvents` configuration\n _delegateEntityEvents(model, collection) {\n if (model) {\n this._modelEvents = _.result(this, 'modelEvents');\n this.bindEvents(model, this._modelEvents);\n }\n\n if (collection) {\n this._collectionEvents = _.result(this, 'collectionEvents');\n this.bindEvents(collection, this._collectionEvents);\n }\n },\n\n // Remove any previously delegate entity events\n _undelegateEntityEvents(model, collection) {\n if (this._modelEvents) {\n this.unbindEvents(model, this._modelEvents);\n delete this._modelEvents;\n }\n\n if (this._collectionEvents) {\n this.unbindEvents(collection, this._collectionEvents);\n delete this._collectionEvents;\n }\n },\n\n // Remove cached event handlers\n _deleteEntityEventHandlers() {\n delete this._modelEvents;\n delete this._collectionEvents;\n }\n};\n","import _ from 'underscore';\n\n// MixinOptions\n// - template\n// - templateContext\n\nexport default {\n\n // Internal method to render the template with the serialized data\n // and template context\n _renderTemplate(template) {\n // Add in entity data and template context\n const data = this.mixinTemplateContext(this.serializeData()) || {};\n\n // Render and add to el\n const html = this._renderHtml(template, data);\n if (typeof html !== 'undefined') {\n this.attachElContent(html);\n }\n },\n\n // Get the template for this view instance.\n // You can set a `template` attribute in the view definition\n // or pass a `template: TemplateFunction` parameter in\n // to the constructor options.\n getTemplate() {\n return this.template;\n },\n\n // Mix in template context methods. Looks for a\n // `templateContext` attribute, which can either be an\n // object literal, or a function that returns an object\n // literal. All methods and attributes from this object\n // are copies to the object passed in.\n mixinTemplateContext(serializedData) {\n const templateContext = _.result(this, 'templateContext');\n if (!templateContext) { return serializedData; }\n if (!serializedData) { return templateContext; }\n return _.extend({}, serializedData, templateContext);\n },\n\n // Serialize the view's model *or* collection, if\n // it exists, for the template\n serializeData() {\n // If we have a model, we serialize that\n if (this.model) {\n return this.serializeModel();\n }\n\n // Otherwise, we serialize the collection,\n // making it available under the `items` property\n if (this.collection) {\n return {\n items: this.serializeCollection()\n };\n }\n },\n\n // Prepares the special `model` property of a view\n // for being displayed in the template. Override this if\n // you need a custom transformation for your view's model\n serializeModel() {\n return this.model.attributes;\n },\n\n // Serialize a collection\n serializeCollection() {\n return _.map(this.collection.models, model => model.attributes);\n },\n\n // Renders the data into the template\n _renderHtml(template, data) {\n return template(data);\n },\n\n // Attaches the content of a given view.\n // This method can be overridden to optimize rendering,\n // or to render in a non standard way.\n //\n // For example, using `innerHTML` instead of `$el.html`\n //\n // ```js\n // attachElContent(html) {\n // this.el.innerHTML = html;\n // }\n // ```\n attachElContent(html) {\n this.Dom.setContents(this.el, html, this.$el);\n }\n};\n","// Borrow event splitter from Backbone\nconst delegateEventSplitter = /^(\\S+)\\s*(.*)$/;\n\n// Set event name to be namespaced using a unique index\n// to generate a non colliding event namespace\n// http://api.jquery.com/event.namespace/\nconst getNamespacedEventName = function(eventName, namespace) {\n const match = eventName.match(delegateEventSplitter);\n return `${ match[1] }.${ namespace } ${ match[2] }`;\n};\n\nexport default getNamespacedEventName;\n","// Add Feature flags here\n// e.g. 'class' => false\nconst FEATURES = {\n childViewEventPrefix: false,\n triggersStopPropagation: true,\n triggersPreventDefault: true,\n DEV_MODE: false\n};\n\nfunction isEnabled(name) {\n return !!FEATURES[name];\n}\n\nfunction setEnabled(name, state) {\n return FEATURES[name] = state;\n}\n\nexport {\n FEATURES,\n setEnabled,\n isEnabled\n};\n","import _ from 'underscore';\nimport getNamespacedEventName from '../utils/get-namespaced-event-name';\nimport { isEnabled } from '../config/features';\n\n// Internal method to create an event handler for a given `triggerDef` like\n// 'click:foo'\nfunction buildViewTrigger(view, triggerDef) {\n if (_.isString(triggerDef)) {\n triggerDef = {event: triggerDef};\n }\n\n const eventName = triggerDef.event;\n\n let shouldPreventDefault = !!triggerDef.preventDefault;\n\n if (isEnabled('triggersPreventDefault')) {\n shouldPreventDefault = triggerDef.preventDefault !== false;\n }\n\n let shouldStopPropagation = !!triggerDef.stopPropagation;\n\n if (isEnabled('triggersStopPropagation')) {\n shouldStopPropagation = triggerDef.stopPropagation !== false;\n }\n\n return function(event, ...args) {\n if (shouldPreventDefault) {\n event.preventDefault();\n }\n\n if (shouldStopPropagation) {\n event.stopPropagation();\n }\n\n view.triggerMethod(eventName, view, event, ...args);\n };\n}\n\nexport default {\n\n // Configure `triggers` to forward DOM events to view\n // events. `triggers: {\"click .foo\": \"do:foo\"}`\n _getViewTriggers(view, triggers) {\n // Configure the triggers, prevent default\n // action and stop propagation of DOM events\n return _.reduce(triggers, (events, value, key) => {\n key = getNamespacedEventName(key, `trig${ this.cid }`);\n events[key] = buildViewTrigger(view, value);\n return events;\n }, {});\n }\n\n};\n","import _ from 'underscore';\n// allows for the use of the @ui. syntax within\n// a given key for triggers and events\n// swaps the @ui with the associated selector.\n// Returns a new, non-mutated, parsed events hash.\nconst normalizeUIKeys = function(hash, ui) {\n return _.reduce(hash, (memo, val, key) => {\n const normalizedKey = normalizeUIString(key, ui);\n memo[normalizedKey] = val;\n return memo;\n }, {});\n};\n\nconst uiRegEx = /@ui\\.[a-zA-Z-_$0-9]*/g;\n\n// utility method for parsing @ui. syntax strings\n// into associated selector\nconst normalizeUIString = function(uiString, ui) {\n return uiString.replace(uiRegEx, (r) => {\n return ui[r.slice(4)];\n });\n};\n\n// allows for the use of the @ui. syntax within\n// a given value for regions\n// swaps the @ui with the associated selector\nconst normalizeUIValues = function(hash, ui, property) {\n _.each(hash, (val, key) => {\n if (_.isString(val)) {\n hash[key] = normalizeUIString(val, ui);\n } else if (val) {\n const propertyVal = val[property];\n if (_.isString(propertyVal)) {\n val[property] = normalizeUIString(propertyVal, ui);\n }\n }\n });\n return hash;\n};\n\nexport default {\n\n // normalize the keys of passed hash with the views `ui` selectors.\n // `{\"@ui.foo\": \"bar\"}`\n normalizeUIKeys(hash) {\n const uiBindings = this._getUIBindings();\n return normalizeUIKeys(hash, uiBindings);\n },\n\n // normalize the passed string with the views `ui` selectors.\n // `\"@ui.bar\"`\n normalizeUIString(uiString) {\n const uiBindings = this._getUIBindings();\n return normalizeUIString(uiString, uiBindings);\n },\n\n // normalize the values of passed hash with the views `ui` selectors.\n // `{foo: \"@ui.bar\"}`\n normalizeUIValues(hash, property) {\n const uiBindings = this._getUIBindings();\n return normalizeUIValues(hash, uiBindings, property);\n },\n\n _getUIBindings() {\n const uiBindings = _.result(this, '_uiBindings');\n return uiBindings || _.result(this, 'ui');\n },\n\n // This method binds the elements specified in the \"ui\" hash inside the view's code with\n // the associated jQuery selectors.\n _bindUIElements() {\n if (!this.ui) { return; }\n\n // store the ui hash in _uiBindings so they can be reset later\n // and so re-rendering the view will be able to find the bindings\n if (!this._uiBindings) {\n this._uiBindings = this.ui;\n }\n\n // get the bindings result, as a function or otherwise\n const bindings = _.result(this, '_uiBindings');\n\n // empty the ui so we don't have anything to start with\n this._ui = {};\n\n // bind each of the selectors\n _.each(bindings, (selector, key) => {\n this._ui[key] = this.$(selector);\n });\n\n this.ui = this._ui;\n },\n\n _unbindUIElements() {\n if (!this.ui || !this._uiBindings) { return; }\n\n // delete all of the existing ui bindings\n _.each(this.ui, ($el, name) => {\n delete this.ui[name];\n });\n\n // reset the ui element to the original bindings configuration\n this.ui = this._uiBindings;\n delete this._uiBindings;\n delete this._ui;\n },\n\n _getUI(name) {\n return this._ui[name];\n }\n};\n","// DomApi\n// ---------\nimport _ from 'underscore';\nimport Backbone from 'backbone';\n\n// Performant method for returning the jQuery instance\nfunction getEl(el) {\n return el instanceof Backbone.$ ? el : Backbone.$(el);\n}\n\n// Static setter\nexport function setDomApi(mixin) {\n this.prototype.Dom = _.extend({}, this.prototype.Dom, mixin);\n return this;\n}\n\nexport default {\n\n // Returns a new HTML DOM node instance\n createBuffer() {\n return document.createDocumentFragment();\n },\n\n // Returns the document element for a given DOM element\n getDocumentEl(el) {\n return el.ownerDocument.documentElement;\n },\n\n // Lookup the `selector` string\n // Selector may also be a DOM element\n // Returns an array-like object of nodes\n getEl(selector) {\n return getEl(selector);\n },\n\n // Finds the `selector` string with the el\n // Returns an array-like object of nodes\n findEl(el, selector) {\n return getEl(el).find(selector);\n },\n\n // Returns true if the el contains the node childEl\n hasEl(el, childEl) {\n return el.contains(childEl && childEl.parentNode);\n },\n\n // Detach `el` from the DOM without removing listeners\n detachEl(el, _$el = getEl(el)) {\n _$el.detach();\n },\n\n // Remove `oldEl` from the DOM and put `newEl` in its place\n replaceEl(newEl, oldEl) {\n if (newEl === oldEl) {\n return;\n }\n\n const parent = oldEl.parentNode;\n\n if (!parent) {\n return;\n }\n\n parent.replaceChild(newEl, oldEl);\n },\n\n // Swaps the location of `el1` and `el2` in the DOM\n swapEl(el1, el2) {\n if (el1 === el2) {\n return;\n }\n\n const parent1 = el1.parentNode;\n const parent2 = el2.parentNode;\n\n if (!parent1 || !parent2) {\n return;\n }\n\n const next1 = el1.nextSibling;\n const next2 = el2.nextSibling;\n\n parent1.insertBefore(el2, next1);\n parent2.insertBefore(el1, next2);\n },\n\n // Replace the contents of `el` with the HTML string of `html`\n setContents(el, html, _$el = getEl(el)) {\n _$el.html(html);\n },\n\n // Takes the DOM node `el` and appends the DOM node `contents`\n // to the end of the element's contents.\n appendContents(el, contents, {_$el = getEl(el), _$contents = getEl(contents)} = {}) {\n _$el.append(_$contents);\n },\n\n // Does the el have child nodes\n hasContents(el) {\n return !!el && el.hasChildNodes();\n },\n\n // Remove the inner contents of `el` from the DOM while leaving\n // `el` itself in the DOM.\n detachContents(el, _$el = getEl(el)) {\n _$el.contents().detach();\n }\n};\n","// ViewMixin\n// ---------\n\nimport Backbone from 'backbone';\nimport _ from 'underscore';\nimport BehaviorsMixin from './behaviors';\nimport CommonMixin from './common';\nimport DelegateEntityEventsMixin from './delegate-entity-events';\nimport TemplateRenderMixin from './template-render';\nimport TriggersMixin from './triggers';\nimport UIMixin from './ui';\nimport { isEnabled } from '../config/features';\nimport DomApi from '../config/dom';\n\n// MixinOptions\n// - behaviors\n// - childViewEventPrefix\n// - childViewEvents\n// - childViewTriggers\n// - collectionEvents\n// - modelEvents\n// - triggers\n// - ui\n\n\nconst ViewMixin = {\n Dom: DomApi,\n\n _isElAttached() {\n return !!this.el && this.Dom.hasEl(this.Dom.getDocumentEl(this.el), this.el);\n },\n\n supportsRenderLifecycle: true,\n supportsDestroyLifecycle: true,\n\n _isDestroyed: false,\n\n isDestroyed() {\n return !!this._isDestroyed;\n },\n\n _isRendered: false,\n\n isRendered() {\n return !!this._isRendered;\n },\n\n _isAttached: false,\n\n isAttached() {\n return !!this._isAttached;\n },\n\n // Overriding Backbone.View's `delegateEvents` to handle\n // `events` and `triggers`\n delegateEvents(events) {\n this._proxyBehaviorViewProperties();\n this._buildEventProxies();\n\n const combinedEvents = _.extend({},\n this._getBehaviorEvents(),\n this._getEvents(events),\n this._getBehaviorTriggers(),\n this._getTriggers()\n );\n\n Backbone.View.prototype.delegateEvents.call(this, combinedEvents);\n\n return this;\n },\n\n // Allows Backbone.View events to utilize `@ui.` selectors\n _getEvents(events) {\n if (events) {\n return this.normalizeUIKeys(events);\n }\n\n if (!this.events) { return; }\n\n return this.normalizeUIKeys(_.result(this, 'events'));\n },\n\n // Configure `triggers` to forward DOM events to view\n // events. `triggers: {\"click .foo\": \"do:foo\"}`\n _getTriggers() {\n if (!this.triggers) { return; }\n\n // Allow `triggers` to be configured as a function\n const triggers = this.normalizeUIKeys(_.result(this, 'triggers'));\n\n // Configure the triggers, prevent default\n // action and stop propagation of DOM events\n return this._getViewTriggers(this, triggers);\n },\n\n // Handle `modelEvents`, and `collectionEvents` configuration\n delegateEntityEvents() {\n this._delegateEntityEvents(this.model, this.collection);\n\n // bind each behaviors model and collection events\n this._delegateBehaviorEntityEvents();\n\n return this;\n },\n\n // Handle unbinding `modelEvents`, and `collectionEvents` configuration\n undelegateEntityEvents() {\n this._undelegateEntityEvents(this.model, this.collection);\n\n // unbind each behaviors model and collection events\n this._undelegateBehaviorEntityEvents();\n\n return this;\n },\n\n // Handle destroying the view and its children.\n destroy(options) {\n if (this._isDestroyed || this._isDestroying) { return this; }\n this._isDestroying = true;\n const shouldTriggerDetach = this._isAttached && !this._disableDetachEvents;\n\n this.triggerMethod('before:destroy', this, options);\n if (shouldTriggerDetach) {\n this.triggerMethod('before:detach', this);\n }\n\n // unbind UI elements\n this.unbindUIElements();\n\n // remove the view from the DOM\n this._removeElement();\n\n if (shouldTriggerDetach) {\n this._isAttached = false;\n this.triggerMethod('detach', this);\n }\n\n // remove children after the remove to prevent extra paints\n this._removeChildren();\n\n this._isDestroyed = true;\n this._isRendered = false;\n\n // Destroy behaviors after _isDestroyed flag\n this._destroyBehaviors(options);\n\n this._deleteEntityEventHandlers();\n\n this.triggerMethod('destroy', this, options);\n this._triggerEventOnBehaviors('destroy', this, options);\n\n this.stopListening();\n\n return this;\n },\n\n // Equates to this.$el.remove\n _removeElement() {\n this.$el.off().removeData();\n this.Dom.detachEl(this.el, this.$el);\n },\n\n // This method binds the elements specified in the \"ui\" hash\n bindUIElements() {\n this._bindUIElements();\n this._bindBehaviorUIElements();\n\n return this;\n },\n\n // This method unbinds the elements specified in the \"ui\" hash\n unbindUIElements() {\n this._unbindUIElements();\n this._unbindBehaviorUIElements();\n\n return this;\n },\n\n getUI(name) {\n return this._getUI(name);\n },\n\n // Cache `childViewEvents` and `childViewTriggers`\n _buildEventProxies() {\n this._childViewEvents = this.normalizeMethods(_.result(this, 'childViewEvents'));\n this._childViewTriggers = _.result(this, 'childViewTriggers');\n this._eventPrefix = this._getEventPrefix();\n },\n\n _getEventPrefix() {\n const defaultPrefix = isEnabled('childViewEventPrefix') ? 'childview' : false;\n const prefix = _.result(this, 'childViewEventPrefix', defaultPrefix);\n\n return (prefix === false) ? prefix : prefix + ':';\n },\n\n _proxyChildViewEvents(view) {\n if (this._childViewEvents || this._childViewTriggers || this._eventPrefix) {\n this.listenTo(view, 'all', this._childViewEventHandler);\n }\n },\n\n _childViewEventHandler(eventName, ...args) {\n const childViewEvents = this._childViewEvents;\n\n // call collectionView childViewEvent if defined\n if (childViewEvents && childViewEvents[eventName]) {\n childViewEvents[eventName].apply(this, args);\n }\n\n // use the parent view's proxyEvent handlers\n const childViewTriggers = this._childViewTriggers;\n\n // Call the event with the proxy name on the parent layout\n if (childViewTriggers && childViewTriggers[eventName]) {\n this.triggerMethod(childViewTriggers[eventName], ...args);\n }\n\n if (this._eventPrefix) {\n this.triggerMethod(this._eventPrefix + eventName, ...args);\n }\n }\n};\n\n_.extend(ViewMixin, BehaviorsMixin, CommonMixin, DelegateEntityEventsMixin, TemplateRenderMixin, TriggersMixin, UIMixin);\n\nexport default ViewMixin;\n","export function renderView(view) {\n if (view._isRendered) {\n return;\n }\n\n if (!view.supportsRenderLifecycle) {\n view.triggerMethod('before:render', view);\n }\n\n view.render();\n view._isRendered = true;\n\n if (!view.supportsRenderLifecycle) {\n view.triggerMethod('render', view);\n }\n}\n\nexport function destroyView(view, disableDetachEvents) {\n if (view.destroy) {\n // Attach flag for public destroy function internal check\n view._disableDetachEvents = disableDetachEvents;\n view.destroy();\n return;\n }\n\n // Destroy for non-Marionette Views\n if (!view.supportsDestroyLifecycle) {\n view.triggerMethod('before:destroy', view);\n }\n\n const shouldTriggerDetach = view._isAttached && !disableDetachEvents;\n\n if (shouldTriggerDetach) {\n view.triggerMethod('before:detach', view);\n }\n\n view.remove();\n\n if (shouldTriggerDetach) {\n view._isAttached = false;\n view.triggerMethod('detach', view);\n }\n\n view._isDestroyed = true;\n\n if (!view.supportsDestroyLifecycle) {\n view.triggerMethod('destroy', view);\n }\n}\n","// Region\n// ------\n\nimport _ from 'underscore';\nimport Backbone from 'backbone';\nimport MarionetteError from './utils/error';\nimport extend from './utils/extend';\nimport monitorViewEvents from './common/monitor-view-events';\nimport { renderView, destroyView } from './common/view';\nimport CommonMixin from './mixins/common';\nimport View from './view';\nimport DomApi, { setDomApi } from './config/dom';\n\nconst classErrorName = 'RegionError';\n\nconst ClassOptions = [\n 'allowMissingEl',\n 'parentEl',\n 'replaceElement'\n];\n\nconst Region = function(options) {\n this._setOptions(options, ClassOptions);\n\n this.cid = _.uniqueId(this.cidPrefix);\n\n // getOption necessary because options.el may be passed as undefined\n this._initEl = this.el = this.getOption('el');\n\n // Handle when this.el is passed in as a $ wrapped element.\n this.el = this.el instanceof Backbone.$ ? this.el[0] : this.el;\n\n this._setEl();\n\n this.initialize.apply(this, arguments);\n};\n\nRegion.extend = extend;\nRegion.setDomApi = setDomApi;\n\n// Region Methods\n// --------------\n\n_.extend(Region.prototype, CommonMixin, {\n Dom: DomApi,\n\n cidPrefix: 'mnr',\n replaceElement: false,\n _isReplaced: false,\n _isSwappingView: false,\n\n // This is a noop method intended to be overridden\n initialize() {},\n\n // Displays a view instance inside of the region. If necessary handles calling the `render`\n // method for you. Reads content directly from the `el` attribute.\n show(view, options) {\n if (!this._ensureElement(options)) {\n return;\n }\n\n view = this._getView(view, options);\n\n if (view === this.currentView) { return this; }\n\n if (view._isShown) {\n throw new MarionetteError({\n name: classErrorName,\n message: 'View is already shown in a Region or CollectionView',\n url: 'marionette.collectionview.html#region-viewAlreadyShown'\n });\n }\n\n this._isSwappingView = !!this.currentView;\n\n this.triggerMethod('before:show', this, view, options);\n\n // Assume an attached view is already in the region for pre-existing DOM\n if (this.currentView || !view._isAttached) {\n this.empty(options);\n }\n\n this._setupChildView(view);\n\n this.currentView = view;\n\n renderView(view);\n\n this._attachView(view, options);\n\n this.triggerMethod('show', this, view, options);\n\n this._isSwappingView = false;\n\n return this;\n },\n\n _setEl() {\n if (!this.el) {\n throw new MarionetteError({\n name: classErrorName,\n message: 'An \"el\" must be specified for a region.',\n url: 'marionette.region.html#additional-options'\n });\n }\n\n this.$el = this.getEl(this.el);\n\n if (this.$el.length) {\n this.el = this.$el[0];\n }\n\n // Make sure the $el contains only the el\n if (this.$el.length > 1) {\n this.$el = this.Dom.getEl(this.el);\n }\n },\n\n // Set the `el` of the region and move any current view to the new `el`.\n _setElement(el) {\n if (el === this.el) { return this; }\n\n const shouldReplace = this._isReplaced;\n\n this._restoreEl();\n\n this.el = el;\n\n this._setEl();\n\n if (this.currentView) {\n const view = this.currentView;\n\n if (shouldReplace) {\n this._replaceEl(view);\n } else {\n this.attachHtml(view);\n }\n }\n\n return this;\n },\n\n _setupChildView(view) {\n monitorViewEvents(view);\n\n this._proxyChildViewEvents(view);\n\n // We need to listen for if a view is destroyed in a way other than through the region.\n // If this happens we need to remove the reference to the currentView since once a view\n // has been destroyed we can not reuse it.\n view.on('destroy', this._empty, this);\n },\n\n _proxyChildViewEvents(view) {\n const parentView = this._parentView;\n\n if (!parentView) { return; }\n\n parentView._proxyChildViewEvents(view);\n },\n\n // If the regions parent view is not monitoring its attach/detach events\n _shouldDisableMonitoring() {\n return this._parentView && this._parentView.monitorViewEvents === false;\n },\n\n _isElAttached() {\n return this.Dom.hasEl(this.Dom.getDocumentEl(this.el), this.el);\n },\n\n _attachView(view, { replaceElement } = {}) {\n const shouldTriggerAttach = !view._isAttached && this._isElAttached() && !this._shouldDisableMonitoring();\n const shouldReplaceEl = typeof replaceElement === 'undefined' ? !!_.result(this, 'replaceElement') : !!replaceElement;\n\n if (shouldTriggerAttach) {\n view.triggerMethod('before:attach', view);\n }\n\n if (shouldReplaceEl) {\n this._replaceEl(view);\n } else {\n this.attachHtml(view);\n }\n\n if (shouldTriggerAttach) {\n view._isAttached = true;\n view.triggerMethod('attach', view);\n }\n\n // Corresponds that view is shown in a marionette Region or CollectionView\n view._isShown = true;\n },\n\n _ensureElement(options = {}) {\n if (!_.isObject(this.el)) {\n this._setEl();\n }\n\n if (!this.$el || this.$el.length === 0) {\n const allowMissingEl = typeof options.allowMissingEl === 'undefined' ? !!_.result(this, 'allowMissingEl') : !!options.allowMissingEl;\n\n if (allowMissingEl) {\n return false;\n } else {\n throw new MarionetteError({\n name: classErrorName,\n message: `An \"el\" must exist in DOM for this region ${this.cid}`,\n url: 'marionette.region.html#additional-options'\n });\n }\n }\n return true;\n },\n\n _getView(view) {\n if (!view) {\n throw new MarionetteError({\n name: classErrorName,\n message: 'The view passed is undefined and therefore invalid. You must pass a view instance to show.',\n url: 'marionette.region.html#showing-a-view'\n });\n }\n\n if (view._isDestroyed) {\n throw new MarionetteError({\n name: classErrorName,\n message: `View (cid: \"${view.cid}\") has already been destroyed and cannot be used.`,\n url: 'marionette.region.html#showing-a-view'\n });\n }\n\n if (view instanceof Backbone.View) {\n return view;\n }\n\n const viewOptions = this._getViewOptions(view);\n\n return new View(viewOptions);\n },\n\n // This allows for a template or a static string to be\n // used as a template\n _getViewOptions(viewOptions) {\n if (_.isFunction(viewOptions)) {\n return { template: viewOptions };\n }\n\n if (_.isObject(viewOptions)) {\n return viewOptions;\n }\n\n const template = function() { return viewOptions; };\n\n return { template };\n },\n\n // Override this method to change how the region finds the DOM element that it manages. Return\n // a jQuery selector object scoped to a provided parent el or the document if none exists.\n getEl(el) {\n const context = _.result(this, 'parentEl');\n\n if (context && _.isString(el)) {\n return this.Dom.findEl(context, el);\n }\n\n return this.Dom.getEl(el);\n },\n\n _replaceEl(view) {\n // Always restore the el to ensure the regions el is present before replacing\n this._restoreEl();\n\n view.on('before:destroy', this._restoreEl, this);\n\n this.Dom.replaceEl(view.el, this.el);\n\n this._isReplaced = true;\n },\n\n // Restore the region's element in the DOM.\n _restoreEl() {\n // There is nothing to replace\n if (!this._isReplaced) {\n return;\n }\n\n const view = this.currentView;\n\n if (!view) {\n return;\n }\n\n this._detachView(view);\n\n this._isReplaced = false;\n },\n\n // Check to see if the region's el was replaced.\n isReplaced() {\n return !!this._isReplaced;\n },\n\n // Check to see if a view is being swapped by another\n isSwappingView() {\n return !!this._isSwappingView;\n },\n\n // Override this method to change how the new view is appended to the `$el` that the\n // region is managing\n attachHtml(view) {\n this.Dom.appendContents(this.el, view.el, {_$el: this.$el, _$contents: view.$el});\n },\n\n // Destroy the current view, if there is one. If there is no current view,\n // it will detach any html inside the region's `el`.\n empty(options = { allowMissingEl: true }) {\n const view = this.currentView;\n\n // If there is no view in the region we should only detach current html\n if (!view) {\n if (this._ensureElement(options)) {\n this.detachHtml();\n }\n return this;\n }\n\n this._empty(view, true);\n return this;\n },\n\n _empty(view, shouldDestroy) {\n view.off('destroy', this._empty, this);\n this.triggerMethod('before:empty', this, view);\n\n this._restoreEl();\n\n delete this.currentView;\n\n if (!view._isDestroyed) {\n if (shouldDestroy) {\n this.removeView(view);\n } else {\n this._detachView(view);\n }\n view._isShown = false;\n this._stopChildViewEvents(view);\n }\n\n this.triggerMethod('empty', this, view);\n },\n\n _stopChildViewEvents(view) {\n const parentView = this._parentView;\n\n if (!parentView) { return; }\n\n this._parentView.stopListening(view);\n },\n\n // Non-Marionette safe view.destroy\n destroyView(view) {\n if (view._isDestroyed) {\n return view;\n }\n\n destroyView(view, this._shouldDisableMonitoring());\n return view;\n },\n\n // Override this method to determine what happens when the view\n // is removed from the region when the view is not being detached\n removeView(view) {\n this.destroyView(view);\n },\n\n // Empties the Region without destroying the view\n // Returns the detached view\n detachView() {\n const view = this.currentView;\n\n if (!view) {\n return;\n }\n\n this._empty(view);\n\n return view;\n },\n\n _detachView(view) {\n const shouldTriggerDetach = view._isAttached && !this._shouldDisableMonitoring();\n const shouldRestoreEl = this._isReplaced;\n if (shouldTriggerDetach) {\n view.triggerMethod('before:detach', view);\n }\n\n if (shouldRestoreEl) {\n this.Dom.replaceEl(this.el, view.el);\n } else {\n this.detachHtml();\n }\n\n if (shouldTriggerDetach) {\n view._isAttached = false;\n view.triggerMethod('detach', view);\n }\n },\n\n // Override this method to change how the region detaches current content\n detachHtml() {\n this.Dom.detachContents(this.el, this.$el);\n },\n\n // Checks whether a view is currently present within the region. Returns `true` if there is\n // and `false` if no view is present.\n hasView() {\n return !!this.currentView;\n },\n\n // Reset the region by destroying any existing view and clearing out the cached `$el`.\n // The next time a view is shown via this region, the region will re-query the DOM for\n // the region's `el`.\n reset(options) {\n this.empty(options);\n\n this.el = this._initEl;\n\n delete this.$el;\n return this;\n },\n\n _isDestroyed: false,\n\n isDestroyed() {\n return this._isDestroyed;\n },\n\n // Destroy the region, remove any child view\n // and remove the region from any associated view\n destroy(options) {\n if (this._isDestroyed) { return this; }\n\n this.triggerMethod('before:destroy', this, options);\n this._isDestroyed = true;\n\n this.reset(options);\n\n if (this._name) {\n this._parentView._removeReferences(this._name);\n }\n delete this._parentView;\n delete this._name;\n\n this.triggerMethod('destroy', this, options);\n this.stopListening();\n\n return this;\n }\n});\n\nexport default Region;\n","import _ from 'underscore';\nimport MarionetteError from '../utils/error';\nimport Region from '../region';\n\n// return the region instance from the definition\nexport default function(definition, defaults) {\n if (definition instanceof Region) {\n return definition;\n }\n\n if (_.isString(definition)) {\n return buildRegionFromObject(defaults, { el: definition });\n }\n\n if (_.isFunction(definition)) {\n return buildRegionFromObject(defaults, { regionClass: definition });\n }\n\n if (_.isObject(definition)) {\n return buildRegionFromObject(defaults, definition);\n }\n\n throw new MarionetteError({\n message: 'Improper region configuration type.',\n url: 'marionette.region.html#defining-regions'\n });\n}\n\nfunction buildRegionFromObject(defaults, definition) {\n const options = _.extend({}, defaults, definition);\n\n const RegionClass = options.regionClass\n\n delete options.regionClass;\n\n return new RegionClass(options);\n}\n","import _ from 'underscore';\nimport _invoke from '../utils/invoke';\nimport buildRegion from '../common/build-region';\nimport Region from '../region';\n\n// MixinOptions\n// - regions\n// - regionClass\n\nexport default {\n regionClass: Region,\n\n // Internal method to initialize the regions that have been defined in a\n // `regions` attribute on this View.\n _initRegions() {\n\n // init regions hash\n this.regions = this.regions || {};\n this._regions = {};\n\n this.addRegions(_.result(this, 'regions'));\n },\n\n // Internal method to re-initialize all of the regions by updating\n // the `el` that they point to\n _reInitRegions() {\n _invoke(this._regions, 'reset');\n },\n\n // Add a single region, by name, to the View\n addRegion(name, definition) {\n const regions = {};\n regions[name] = definition;\n return this.addRegions(regions)[name];\n },\n\n // Add multiple regions as a {name: definition, name2: def2} object literal\n addRegions(regions) {\n // If there's nothing to add, stop here.\n if (_.isEmpty(regions)) {\n return;\n }\n\n // Normalize region selectors hash to allow\n // a user to use the @ui. syntax.\n regions = this.normalizeUIValues(regions, 'el');\n\n // Add the regions definitions to the regions property\n this.regions = _.extend({}, this.regions, regions);\n\n return this._addRegions(regions);\n },\n\n // internal method to build and add regions\n _addRegions(regionDefinitions) {\n const defaults = {\n regionClass: this.regionClass,\n parentEl: _.partial(_.result, this, 'el')\n };\n\n return _.reduce(regionDefinitions, (regions, definition, name) => {\n regions[name] = buildRegion(definition, defaults);\n this._addRegion(regions[name], name);\n return regions;\n }, {});\n },\n\n _addRegion(region, name) {\n this.triggerMethod('before:add:region', this, name, region);\n\n region._parentView = this;\n region._name = name;\n\n this._regions[name] = region;\n\n this.triggerMethod('add:region', this, name, region);\n },\n\n // Remove a single region from the View, by name\n removeRegion(name) {\n const region = this._regions[name];\n\n this._removeRegion(region, name);\n\n return region;\n },\n\n // Remove all regions from the View\n removeRegions() {\n const regions = this._getRegions();\n\n _.each(this._regions, this._removeRegion.bind(this));\n\n return regions;\n },\n\n _removeRegion(region, name) {\n this.triggerMethod('before:remove:region', this, name, region);\n\n region.destroy();\n\n this.triggerMethod('remove:region', this, name, region);\n },\n\n // Called in a region's destroy\n _removeReferences(name) {\n delete this.regions[name];\n delete this._regions[name];\n },\n\n // Empty all regions in the region manager, but\n // leave them attached\n emptyRegions() {\n const regions = this.getRegions();\n _invoke(regions, 'empty');\n return regions;\n },\n\n // Checks to see if view contains region\n // Accepts the region name\n // hasRegion('main')\n hasRegion(name) {\n return !!this.getRegion(name);\n },\n\n // Provides access to regions\n // Accepts the region name\n // getRegion('main')\n getRegion(name) {\n if (!this._isRendered) {\n this.render();\n }\n return this._regions[name];\n },\n\n _getRegions() {\n return _.clone(this._regions);\n },\n\n // Get all regions\n getRegions() {\n if (!this._isRendered) {\n this.render();\n }\n return this._getRegions();\n },\n\n showChildView(name, view, options) {\n const region = this.getRegion(name);\n region.show(view, options);\n return view;\n },\n\n detachChildView(name) {\n return this.getRegion(name).detachView();\n },\n\n getChildView(name) {\n return this.getRegion(name).currentView;\n }\n\n};\n","// Static setter for the renderer\nexport function setRenderer(renderer) {\n this.prototype._renderHtml = renderer;\n return this;\n}\n","// View\n// ---------\n\nimport _ from 'underscore';\nimport Backbone from 'backbone';\nimport monitorViewEvents from './common/monitor-view-events';\nimport ViewMixin from './mixins/view';\nimport RegionsMixin from './mixins/regions';\nimport { setDomApi } from './config/dom';\nimport { setRenderer } from './config/renderer';\n\nconst ClassOptions = [\n 'behaviors',\n 'childViewEventPrefix',\n 'childViewEvents',\n 'childViewTriggers',\n 'collectionEvents',\n 'events',\n 'modelEvents',\n 'regionClass',\n 'regions',\n 'template',\n 'templateContext',\n 'triggers',\n 'ui'\n];\n\n// Used by _getImmediateChildren\nfunction childReducer(children, region) {\n if (region.currentView) {\n children.push(region.currentView);\n }\n\n return children;\n}\n\n// The standard view. Includes view events, automatic rendering\n// templates, nested views, and more.\nconst View = Backbone.View.extend({\n\n constructor(options) {\n this._setOptions(options, ClassOptions);\n\n monitorViewEvents(this);\n\n this._initBehaviors();\n this._initRegions();\n\n Backbone.View.prototype.constructor.apply(this, arguments);\n\n this.delegateEntityEvents();\n\n this._triggerEventOnBehaviors('initialize', this, options);\n },\n\n // Overriding Backbone.View's `setElement` to handle\n // if an el was previously defined. If so, the view might be\n // rendered or attached on setElement.\n setElement() {\n Backbone.View.prototype.setElement.apply(this, arguments);\n\n this._isRendered = this.Dom.hasContents(this.el);\n this._isAttached = this._isElAttached();\n\n if (this._isRendered) {\n this.bindUIElements();\n }\n\n return this;\n },\n\n // If a template is available, renders it into the view's `el`\n // Re-inits regions and binds UI.\n render() {\n const template = this.getTemplate();\n\n if (template === false || this._isDestroyed) { return this; }\n\n this.triggerMethod('before:render', this);\n\n // If this is not the first render call, then we need to\n // re-initialize the `el` for each region\n if (this._isRendered) {\n this._reInitRegions();\n }\n\n this._renderTemplate(template);\n this.bindUIElements();\n\n this._isRendered = true;\n this.triggerMethod('render', this);\n\n return this;\n },\n\n // called by ViewMixin destroy\n _removeChildren() {\n this.removeRegions();\n },\n\n _getImmediateChildren() {\n return _.reduce(this._regions, childReducer, []);\n }\n}, {\n setRenderer,\n setDomApi\n});\n\n_.extend(View.prototype, ViewMixin, RegionsMixin);\n\nexport default View;\n","import _ from 'underscore';\n\n// Provide a container to store, retrieve and\n// shut down child views.\nconst Container = function() {\n this._init();\n};\n\n// Mix in methods from Underscore, for iteration, and other\n// collection related features.\n// Borrowing this code from Backbone.Collection:\n// https://github.com/jashkenas/backbone/blob/1.1.2/backbone.js#L962\nconst methods = ['forEach', 'each', 'map', 'find', 'detect', 'filter',\n 'select', 'reject', 'every', 'all', 'some', 'any', 'include',\n 'contains', 'invoke', 'toArray', 'first', 'initial', 'rest',\n 'last', 'without', 'isEmpty', 'pluck', 'reduce', 'partition'];\n\n_.each(methods, function(method) {\n Container.prototype[method] = function(...args) {\n return _[method].apply(_, [this._views].concat(args));\n };\n});\n\nfunction stringComparator(comparator, view) {\n return view.model && view.model.get(comparator);\n}\n\n// Container Methods\n// -----------------\n\n_.extend(Container.prototype, {\n\n // Initializes an empty container\n _init() {\n this._views = [];\n this._viewsByCid = {};\n this._indexByModel = {};\n this._updateLength();\n },\n\n // Add a view to this container. Stores the view\n // by `cid` and makes it searchable by the model\n // cid (and model itself). Additionally it stores\n // the view by index in the _views array\n _add(view, index = this._views.length) {\n this._addViewIndexes(view);\n\n // add to end by default\n this._views.splice(index, 0, view);\n\n this._updateLength();\n },\n\n _addViewIndexes(view) {\n // store the view\n this._viewsByCid[view.cid] = view;\n\n // index it by model\n if (view.model) {\n this._indexByModel[view.model.cid] = view;\n }\n },\n\n // Sort (mutate) and return the array of the child views.\n _sort(comparator, context) {\n if (typeof comparator === 'string') {\n comparator = _.partial(stringComparator, comparator);\n return this._sortBy(comparator);\n }\n\n if (comparator.length === 1) {\n return this._sortBy(comparator.bind(context));\n }\n\n return this._views.sort(comparator.bind(context));\n },\n\n // Makes `_.sortBy` mutate the array to match `this._views.sort`\n _sortBy(comparator) {\n const sortedViews = _.sortBy(this._views, comparator);\n\n this._set(sortedViews);\n\n return sortedViews;\n },\n\n // Replace array contents without overwriting the reference.\n // Should not add/remove views\n _set(views, shouldReset) {\n this._views.length = 0;\n\n this._views.push.apply(this._views, views.slice(0));\n\n if (shouldReset) {\n this._viewsByCid = {};\n this._indexByModel = {};\n\n _.each(views, this._addViewIndexes.bind(this));\n\n this._updateLength();\n }\n },\n\n // Swap views by index\n _swap(view1, view2) {\n const view1Index = this.findIndexByView(view1);\n const view2Index = this.findIndexByView(view2);\n\n if (view1Index === -1 || view2Index === -1) {\n return;\n }\n\n const swapView = this._views[view1Index];\n this._views[view1Index] = this._views[view2Index];\n this._views[view2Index] = swapView;\n },\n\n // Find a view by the model that was attached to it.\n // Uses the model's `cid` to find it.\n findByModel(model) {\n return this.findByModelCid(model.cid);\n },\n\n // Find a view by the `cid` of the model that was attached to it.\n findByModelCid(modelCid) {\n return this._indexByModel[modelCid];\n },\n\n // Find a view by index.\n findByIndex(index) {\n return this._views[index];\n },\n\n // Find the index of a view instance\n findIndexByView(view) {\n return this._views.indexOf(view);\n },\n\n // Retrieve a view by its `cid` directly\n findByCid(cid) {\n return this._viewsByCid[cid];\n },\n\n hasView(view) {\n return !!this.findByCid(view.cid);\n },\n\n // Remove a view and clean up index references.\n _remove(view) {\n if (!this._viewsByCid[view.cid]) {\n return;\n }\n\n // delete model index\n if (view.model) {\n delete this._indexByModel[view.model.cid];\n }\n\n // remove the view from the container\n delete this._viewsByCid[view.cid];\n\n const index = this.findIndexByView(view);\n this._views.splice(index, 1);\n\n this._updateLength();\n },\n\n // Update the `.length` attribute on this container\n _updateLength() {\n this.length = this._views.length;\n }\n});\n\nexport default Container;\n","// Collection View\n// ---------------\n\nimport _ from 'underscore';\nimport Backbone from 'backbone';\nimport MarionetteError from './utils/error';\nimport { renderView, destroyView } from './common/view';\nimport monitorViewEvents from './common/monitor-view-events';\nimport ChildViewContainer from './child-view-container';\nimport Region from './region';\nimport ViewMixin from './mixins/view';\nimport { setDomApi } from './config/dom';\nimport { setRenderer } from './config/renderer';\n\nconst classErrorName = 'CollectionViewError';\n\nconst ClassOptions = [\n 'behaviors',\n 'childView',\n 'childViewContainer',\n 'childViewEventPrefix',\n 'childViewEvents',\n 'childViewOptions',\n 'childViewTriggers',\n 'collectionEvents',\n 'emptyView',\n 'emptyViewOptions',\n 'events',\n 'modelEvents',\n 'sortWithCollection',\n 'template',\n 'templateContext',\n 'triggers',\n 'ui',\n 'viewComparator',\n 'viewFilter'\n];\n\n// A view that iterates over a Backbone.Collection\n// and renders an individual child view for each model.\nconst CollectionView = Backbone.View.extend({\n // flag for maintaining the sorted order of the collection\n sortWithCollection: true,\n\n // constructor\n constructor(options) {\n this._setOptions(options, ClassOptions);\n\n monitorViewEvents(this);\n\n this._initChildViewStorage();\n this._initBehaviors();\n\n Backbone.View.prototype.constructor.apply(this, arguments);\n\n // Init empty region\n this.getEmptyRegion();\n\n this.delegateEntityEvents();\n\n this._triggerEventOnBehaviors('initialize', this, options);\n },\n\n // Internal method to set up the `children` object for storing all of the child views\n // `_children` represents all child views\n // `children` represents only views filtered to be shown\n _initChildViewStorage() {\n this._children = new ChildViewContainer();\n this.children = new ChildViewContainer();\n },\n\n // Create an region to show the emptyView\n getEmptyRegion() {\n const $emptyEl = this.$container || this.$el;\n\n if (this._emptyRegion && !this._emptyRegion.isDestroyed()) {\n this._emptyRegion._setElement($emptyEl[0]);\n return this._emptyRegion;\n }\n\n this._emptyRegion = new Region({ el: $emptyEl[0], replaceElement: false });\n\n this._emptyRegion._parentView = this;\n\n return this._emptyRegion;\n },\n\n // Configured the initial events that the collection view binds to.\n _initialEvents() {\n if (this._isRendered) { return; }\n\n this.listenTo(this.collection, {\n 'sort': this._onCollectionSort,\n 'reset': this._onCollectionReset,\n 'update': this._onCollectionUpdate\n });\n },\n\n // Internal method. This checks for any changes in the order of the collection.\n // If the index of any view doesn't match, it will re-sort.\n _onCollectionSort(collection, { add, merge, remove }) {\n if (!this.sortWithCollection || this.viewComparator === false) {\n return;\n }\n\n // If the data is changing we will handle the sort later in `_onCollectionUpdate`\n if (add || remove || merge) {\n return;\n }\n\n // If the only thing happening here is sorting, sort.\n this.sort();\n },\n\n _onCollectionReset() {\n this._destroyChildren();\n\n this._addChildModels(this.collection.models);\n\n this.sort();\n },\n\n // Handle collection update model additions and removals\n _onCollectionUpdate(collection, options) {\n const changes = options.changes;\n\n // Remove first since it'll be a shorter array lookup.\n const removedViews = changes.removed.length && this._removeChildModels(changes.removed);\n\n this._addedViews = changes.added.length && this._addChildModels(changes.added);\n\n this._detachChildren(removedViews);\n\n this.sort();\n\n // Destroy removed child views after all of the render is complete\n this._removeChildViews(removedViews);\n },\n\n _removeChildModels(models) {\n return _.reduce(models, (views, model) => {\n const removeView = this._removeChildModel(model);\n\n if (removeView) { views.push(removeView); }\n\n return views;\n }, []);\n },\n\n _removeChildModel(model) {\n const view = this._children.findByModel(model);\n\n if (view) { this._removeChild(view); }\n\n return view;\n },\n\n _removeChild(view) {\n this.triggerMethod('before:remove:child', this, view);\n\n this.children._remove(view);\n this._children._remove(view);\n\n this.triggerMethod('remove:child', this, view);\n },\n\n // Added views are returned for consistency with _removeChildModels\n _addChildModels(models) {\n return _.map(models, this._addChildModel.bind(this));\n },\n\n _addChildModel(model) {\n const view = this._createChildView(model);\n\n this._addChild(view);\n\n return view;\n },\n\n _createChildView(model) {\n const ChildView = this._getChildView(model);\n const childViewOptions = this._getChildViewOptions(model);\n const view = this.buildChildView(model, ChildView, childViewOptions);\n\n return view;\n },\n\n _addChild(view, index) {\n this.triggerMethod('before:add:child', this, view);\n\n this._setupChildView(view);\n this._children._add(view, index);\n this.children._add(view, index);\n\n this.triggerMethod('add:child', this, view);\n },\n\n // Retrieve the `childView` class\n // The `childView` property can be either a view class or a function that\n // returns a view class. If it is a function, it will receive the model that\n // will be passed to the view instance (created from the returned view class)\n _getChildView(child) {\n let childView = this.childView;\n\n if (!childView) {\n throw new MarionetteError({\n name: classErrorName,\n message: 'A \"childView\" must be specified',\n url: 'marionette.collectionview.html#collectionviews-childview'\n });\n }\n\n childView = this._getView(childView, child);\n\n if (!childView) {\n throw new MarionetteError({\n name: classErrorName,\n message: '\"childView\" must be a view class or a function that returns a view class',\n url: 'marionette.collectionview.html#collectionviews-childview'\n });\n }\n\n return childView;\n },\n\n // First check if the `view` is a view class (the common case)\n // Then check if it's a function (which we assume that returns a view class)\n _getView(view, child) {\n if (view.prototype instanceof Backbone.View || view === Backbone.View) {\n return view;\n } else if (_.isFunction(view)) {\n return view.call(this, child);\n }\n },\n\n _getChildViewOptions(child) {\n if (_.isFunction(this.childViewOptions)) {\n return this.childViewOptions(child);\n }\n\n return this.childViewOptions;\n },\n\n // Build a `childView` for a model in the collection.\n // Override to customize the build\n buildChildView(child, ChildViewClass, childViewOptions) {\n const options = _.extend({model: child}, childViewOptions);\n return new ChildViewClass(options);\n },\n\n _setupChildView(view) {\n monitorViewEvents(view);\n\n // We need to listen for if a view is destroyed in a way other\n // than through the CollectionView.\n // If this happens we need to remove the reference to the view\n // since once a view has been destroyed we can not reuse it.\n view.on('destroy', this.removeChildView, this);\n\n // set up the child view event forwarding\n this._proxyChildViewEvents(view);\n },\n\n // used by ViewMixin's `_childViewEventHandler`\n _getImmediateChildren() {\n return this.children._views;\n },\n\n // Overriding Backbone.View's `setElement` to handle\n // if an el was previously defined. If so, the view might be\n // attached on setElement.\n setElement() {\n Backbone.View.prototype.setElement.apply(this, arguments);\n\n this._isAttached = this._isElAttached();\n\n return this;\n },\n\n // Render children views.\n render() {\n if (this._isDestroyed) { return this; }\n this.triggerMethod('before:render', this);\n\n this._destroyChildren();\n\n if (this.collection) {\n this._addChildModels(this.collection.models);\n this._initialEvents();\n }\n\n const template = this.getTemplate();\n\n if (template) {\n this._renderTemplate(template);\n this.bindUIElements();\n }\n this._getChildViewContainer();\n this.sort();\n\n this._isRendered = true;\n\n this.triggerMethod('render', this);\n return this;\n },\n\n // Get a container within the template to add the children within\n _getChildViewContainer() {\n const childViewContainer = _.result(this, 'childViewContainer');\n this.$container = childViewContainer ? this.$(childViewContainer) : this.$el;\n\n if (!this.$container.length) {\n throw new MarionetteError({\n name: classErrorName,\n message: `The specified \"childViewContainer\" was not found: ${childViewContainer}`,\n url: 'marionette.collectionview.html#defining-the-childviewcontainer'\n });\n }\n },\n\n // Sorts the children then filters and renders the results.\n sort() {\n this._sortChildren();\n\n this.filter();\n\n return this;\n },\n\n // Sorts views by viewComparator and sets the children to the new order\n _sortChildren() {\n if (!this._children.length) { return; }\n\n let viewComparator = this.getComparator();\n\n if (!viewComparator) { return; }\n\n // If children are sorted prevent added to end perf\n delete this._addedViews;\n\n this.triggerMethod('before:sort', this);\n\n this._children._sort(viewComparator, this);\n\n this.triggerMethod('sort', this);\n },\n\n // Sets the view's `viewComparator` and applies the sort if the view is ready.\n // To prevent the render pass `{ preventRender: true }` as the 2nd argument.\n setComparator(comparator, {preventRender} = {}) {\n const comparatorChanged = this.viewComparator !== comparator;\n const shouldSort = comparatorChanged && !preventRender;\n\n this.viewComparator = comparator;\n\n if (shouldSort) {\n this.sort();\n }\n\n return this;\n },\n\n // Clears the `viewComparator` and follows the same rules for rendering as `setComparator`.\n removeComparator(options) {\n return this.setComparator(null, options);\n },\n\n // If viewComparator is overriden it will be returned here.\n // Additionally override this function to provide custom\n // viewComparator logic\n getComparator() {\n if (this.viewComparator) { return this.viewComparator }\n\n if (!this.sortWithCollection || this.viewComparator === false || !this.collection) {\n return false;\n }\n\n return this._viewComparator;\n },\n\n // Default internal view comparator that order the views by\n // the order of the collection\n _viewComparator(view) {\n return this.collection.indexOf(view.model);\n },\n\n // This method filters the children views and renders the results\n filter() {\n if (this._isDestroyed) { return this; }\n\n this._filterChildren();\n\n this._renderChildren();\n\n return this;\n },\n\n _filterChildren() {\n if (!this._children.length) { return; }\n\n const viewFilter = this._getFilter();\n\n if (!viewFilter) {\n const shouldReset = this.children.length !== this._children.length;\n\n this.children._set(this._children._views, shouldReset);\n\n return;\n }\n\n // If children are filtered prevent added to end perf\n delete this._addedViews;\n\n this.triggerMethod('before:filter', this);\n\n const attachViews = [];\n const detachViews = [];\n\n _.each(this._children._views, (view, key, children) => {\n (viewFilter.call(this, view, key, children) ? attachViews : detachViews).push(view);\n });\n\n this._detachChildren(detachViews);\n\n // reset children\n this.children._set(attachViews, true);\n\n this.triggerMethod('filter', this, attachViews, detachViews);\n },\n\n // This method returns a function for the viewFilter\n _getFilter() {\n const viewFilter = this.getFilter();\n\n if (!viewFilter) { return false; }\n\n if (_.isFunction(viewFilter)) {\n return viewFilter;\n }\n\n // Support filter predicates `{ fooFlag: true }`\n if (_.isObject(viewFilter)) {\n const matcher = _.matches(viewFilter);\n return function(view) {\n return matcher(view.model && view.model.attributes);\n };\n }\n\n // Filter by model attribute\n if (_.isString(viewFilter)) {\n return function(view) {\n return view.model && view.model.get(viewFilter);\n };\n }\n\n throw new MarionetteError({\n name: classErrorName,\n message: '\"viewFilter\" must be a function, predicate object literal, a string indicating a model attribute, or falsy',\n url: 'marionette.collectionview.html#defining-the-viewfilter'\n });\n },\n\n // Override this function to provide custom\n // viewFilter logic\n getFilter() {\n return this.viewFilter;\n },\n\n // Sets the view's `viewFilter` and applies the filter if the view is ready.\n // To prevent the render pass `{ preventRender: true }` as the 2nd argument.\n setFilter(filter, {preventRender} = {}) {\n const filterChanged = this.viewFilter !== filter;\n const shouldRender = filterChanged && !preventRender;\n\n this.viewFilter = filter;\n\n if (shouldRender) {\n this.filter();\n }\n\n return this;\n },\n\n // Clears the `viewFilter` and follows the same rules for rendering as `setFilter`.\n removeFilter(options) {\n return this.setFilter(null, options);\n },\n\n _detachChildren(detachingViews) {\n _.each(detachingViews, this._detachChildView.bind(this));\n },\n\n _detachChildView(view) {\n const shouldTriggerDetach = view._isAttached && this.monitorViewEvents !== false;\n if (shouldTriggerDetach) {\n view.triggerMethod('before:detach', view);\n }\n\n this.detachHtml(view);\n\n if (shouldTriggerDetach) {\n view._isAttached = false;\n view.triggerMethod('detach', view);\n }\n\n view._isShown = false;\n },\n\n // Override this method to change how the collectionView detaches a child view\n detachHtml(view) {\n this.Dom.detachEl(view.el, view.$el);\n },\n\n _renderChildren() {\n // If there are unrendered views prevent add to end perf\n if (this._hasUnrenderedViews) {\n delete this._addedViews;\n delete this._hasUnrenderedViews;\n }\n\n const views = this._addedViews || this.children._views;\n\n this.triggerMethod('before:render:children', this, views);\n\n if (this.isEmpty()) {\n this._showEmptyView();\n } else {\n this._destroyEmptyView();\n\n const els = this._getBuffer(views);\n\n this._attachChildren(els, views);\n }\n\n delete this._addedViews;\n\n this.triggerMethod('render:children', this, views);\n },\n\n // Renders each view and creates a fragment buffer from them\n _getBuffer(views) {\n const elBuffer = this.Dom.createBuffer();\n\n _.each(views, view => {\n renderView(view);\n // corresponds that view is shown in a Region or CollectionView\n view._isShown = true;\n this.Dom.appendContents(elBuffer, view.el, {_$contents: view.$el});\n });\n\n return elBuffer;\n },\n\n _attachChildren(els, views) {\n const shouldTriggerAttach = this._isAttached && this.monitorViewEvents !== false;\n\n views = shouldTriggerAttach ? views : [];\n\n _.each(views, view => {\n if (view._isAttached) { return; }\n view.triggerMethod('before:attach', view);\n });\n\n this.attachHtml(els, this.$container);\n\n _.each(views, view => {\n if (view._isAttached) { return; }\n view._isAttached = true;\n view.triggerMethod('attach', view);\n });\n },\n\n // Override this method to do something other than `.append`.\n // You can attach any HTML at this point including the els.\n attachHtml(els, $container) {\n this.Dom.appendContents($container[0], els, {_$el: $container});\n },\n\n isEmpty() {\n return !this.children.length;\n },\n\n _showEmptyView() {\n const EmptyView = this._getEmptyView();\n\n if (!EmptyView) {\n return;\n }\n\n const options = this._getEmptyViewOptions();\n\n const emptyRegion = this.getEmptyRegion();\n\n emptyRegion.show(new EmptyView(options));\n },\n\n // Retrieve the empty view class\n _getEmptyView() {\n const emptyView = this.emptyView;\n\n if (!emptyView) { return; }\n\n return this._getView(emptyView);\n },\n\n // Remove the emptyView\n _destroyEmptyView() {\n const emptyRegion = this.getEmptyRegion();\n // Only empty if a view is show so the region\n // doesn't detach any other unrelated HTML\n if (emptyRegion.hasView()) {\n emptyRegion.empty();\n }\n },\n\n //\n _getEmptyViewOptions() {\n const emptyViewOptions = this.emptyViewOptions || this.childViewOptions;\n\n if (_.isFunction(emptyViewOptions)) {\n return emptyViewOptions.call(this);\n }\n\n return emptyViewOptions;\n },\n\n swapChildViews(view1, view2) {\n if (!this._children.hasView(view1) || !this._children.hasView(view2)) {\n throw new MarionetteError({\n name: classErrorName,\n message: 'Both views must be children of the collection view to swap.',\n url: 'marionette.collectionview.html#swapping-child-views'\n });\n }\n\n this._children._swap(view1, view2);\n this.Dom.swapEl(view1.el, view2.el);\n\n // If the views are not filtered the same, refilter\n if (this.children.hasView(view1) !== this.children.hasView(view2)) {\n this.filter();\n } else {\n this.children._swap(view1, view2);\n }\n\n return this;\n },\n\n // Render the child's view and add it to the HTML for the collection view at a given index, based on the current sort\n addChildView(view, index, options = {}) {\n if (!view || view._isDestroyed) {\n return view;\n }\n\n if (view._isShown) {\n throw new MarionetteError({\n name: classErrorName,\n message: 'View is already shown in a Region or CollectionView',\n url: 'marionette.collectionview.html#region-viewAlreadyShown'\n });\n }\n\n if (_.isObject(index)) {\n options = index;\n }\n\n // If options has defined index we should use it\n if (options.index != null) {\n index = options.index;\n }\n\n if (!this._isRendered) {\n this.render();\n }\n\n this._addChild(view, index);\n\n if (options.preventRender) {\n this._hasUnrenderedViews = true;\n return view;\n }\n\n const hasIndex = (typeof index !== 'undefined');\n const isAddedToEnd = !hasIndex || index >= this._children.length;\n\n // Only cache views if added to the end and there is no unrendered views\n if (isAddedToEnd && !this._hasUnrenderedViews) {\n this._addedViews = [view];\n }\n\n if (hasIndex) {\n this._renderChildren();\n } else {\n this.sort();\n }\n\n return view;\n },\n\n // Detach a view from the children. Best used when adding a\n // childView from `addChildView`\n detachChildView(view) {\n this.removeChildView(view, { shouldDetach: true });\n\n return view;\n },\n\n // Remove the child view and destroy it. Best used when adding a\n // childView from `addChildView`\n // The options argument is for internal use only\n removeChildView(view, options) {\n if (!view) {\n return view;\n }\n\n this._removeChildView(view, options);\n\n this._removeChild(view);\n\n if (this.isEmpty()) {\n this._showEmptyView();\n }\n\n return view;\n },\n\n _removeChildViews(views) {\n _.each(views, this._removeChildView.bind(this));\n },\n\n _removeChildView(view, {shouldDetach} = {}) {\n view.off('destroy', this.removeChildView, this);\n\n if (shouldDetach) {\n this._detachChildView(view);\n } else {\n this._destroyChildView(view);\n }\n\n this.stopListening(view);\n },\n\n _destroyChildView(view) {\n if (view._isDestroyed) {\n return;\n }\n\n const shouldDisableEvents = this.monitorViewEvents === false;\n destroyView(view, shouldDisableEvents);\n },\n\n // called by ViewMixin destroy\n _removeChildren() {\n this._destroyChildren();\n const emptyRegion = this.getEmptyRegion();\n emptyRegion.destroy();\n delete this._addedViews;\n },\n\n // Destroy the child views that this collection view is holding on to, if any\n _destroyChildren() {\n if (!this._children.length) {\n return;\n }\n\n this.triggerMethod('before:destroy:children', this);\n if (this.monitorViewEvents === false) {\n this.Dom.detachContents(this.el, this.$el);\n }\n\n this._removeChildViews(this._children._views);\n\n // After all children have been destroyed re-init the container\n this._children._init();\n this.children._init();\n\n this.triggerMethod('destroy:children', this);\n }\n}, {\n setDomApi,\n setRenderer\n});\n\n_.extend(CollectionView.prototype, ViewMixin);\n\nexport default CollectionView;\n","// Behavior\n// --------\n\n// A Behavior is an isolated set of DOM /\n// user interactions that can be mixed into any View.\n// Behaviors allow you to blackbox View specific interactions\n// into portable logical chunks, keeping your views simple and your code DRY.\n\nimport _ from 'underscore';\nimport extend from './utils/extend';\nimport getNamespacedEventName from './utils/get-namespaced-event-name';\nimport CommonMixin from './mixins/common';\nimport DelegateEntityEventsMixin from './mixins/delegate-entity-events';\nimport TriggersMixin from './mixins/triggers';\nimport UIMixin from './mixins/ui';\n\nconst ClassOptions = [\n 'collectionEvents',\n 'events',\n 'modelEvents',\n 'triggers',\n 'ui'\n];\n\nconst Behavior = function(options, view) {\n // Setup reference to the view.\n // this comes in handle when a behavior\n // wants to directly talk up the chain\n // to the view.\n this.view = view;\n\n this._setOptions(options, ClassOptions);\n this.cid = _.uniqueId(this.cidPrefix);\n\n // Construct an internal UI hash using the behaviors UI\n // hash combined and overridden by the view UI hash.\n // This allows the user to use UI hash elements defined\n // in the parent view as well as those defined in the behavior.\n // This order will help the reuse and share of a behavior\n // between multiple views, while letting a view override\n // a selector under an UI key.\n this.ui = _.extend({}, _.result(this, 'ui'), _.result(view, 'ui'));\n\n // Proxy view triggers\n this.listenTo(view, 'all', this.triggerMethod);\n\n this.initialize.apply(this, arguments);\n};\n\nBehavior.extend = extend;\n\n// Behavior Methods\n// --------------\n\n_.extend(Behavior.prototype, CommonMixin, DelegateEntityEventsMixin, TriggersMixin, UIMixin, {\n cidPrefix: 'mnb',\n\n // This is a noop method intended to be overridden\n initialize() {},\n\n // proxy behavior $ method to the view\n // this is useful for doing jquery DOM lookups\n // scoped to behaviors view.\n $() {\n return this.view.$.apply(this.view, arguments);\n },\n\n // Stops the behavior from listening to events.\n destroy() {\n this.stopListening();\n\n this.view._removeBehavior(this);\n\n this._deleteEntityEventHandlers();\n\n return this;\n },\n\n proxyViewProperties() {\n this.$el = this.view.$el;\n this.el = this.view.el;\n\n return this;\n },\n\n bindUIElements() {\n this._bindUIElements();\n\n return this;\n },\n\n unbindUIElements() {\n this._unbindUIElements();\n\n return this;\n },\n\n getUI(name) {\n return this._getUI(name);\n },\n\n // Handle `modelEvents`, and `collectionEvents` configuration\n delegateEntityEvents() {\n this._delegateEntityEvents(this.view.model, this.view.collection);\n\n return this;\n },\n\n undelegateEntityEvents() {\n this._undelegateEntityEvents(this.view.model, this.view.collection);\n\n return this;\n },\n\n _getEvents() {\n if (!this.events) { return; }\n\n // Normalize behavior events hash to allow\n // a user to use the @ui. syntax.\n const behaviorEvents = this.normalizeUIKeys(_.result(this, 'events'));\n\n // binds the handler to the behavior and builds a unique eventName\n return _.reduce(behaviorEvents, (events, behaviorHandler, key) => {\n if (!_.isFunction(behaviorHandler)) {\n behaviorHandler = this[behaviorHandler];\n }\n if (!behaviorHandler) { return events; }\n key = getNamespacedEventName(key, this.cid);\n events[key] = behaviorHandler.bind(this);\n return events;\n }, {});\n },\n\n // Internal method to build all trigger handlers for a given behavior\n _getTriggers() {\n if (!this.triggers) { return; }\n\n // Normalize behavior triggers hash to allow\n // a user to use the @ui. syntax.\n const behaviorTriggers = this.normalizeUIKeys(_.result(this, 'triggers'));\n\n return this._getViewTriggers(this.view, behaviorTriggers);\n }\n});\n\nexport default Behavior;\n","// Application\n// -----------\n\nimport _ from 'underscore';\nimport extend from './utils/extend';\nimport buildRegion from './common/build-region';\nimport CommonMixin from './mixins/common';\nimport DestroyMixin from './mixins/destroy';\nimport RadioMixin from './mixins/radio';\nimport Region from './region';\n\nconst ClassOptions = [\n 'channelName',\n 'radioEvents',\n 'radioRequests',\n 'region',\n 'regionClass'\n];\n\nconst Application = function(options) {\n this._setOptions(options, ClassOptions);\n this.cid = _.uniqueId(this.cidPrefix);\n this._initRegion();\n this._initRadio();\n this.initialize.apply(this, arguments);\n};\n\nApplication.extend = extend;\n\n// Application Methods\n// --------------\n\n_.extend(Application.prototype, CommonMixin, DestroyMixin, RadioMixin, {\n cidPrefix: 'mna',\n\n // This is a noop method intended to be overridden\n initialize() {},\n\n // Kick off all of the application's processes.\n start(options) {\n this.triggerMethod('before:start', this, options);\n this.triggerMethod('start', this, options);\n return this;\n },\n\n regionClass: Region,\n\n _initRegion() {\n const region = this.region;\n\n if (!region) { return; }\n\n const defaults = {\n regionClass: this.regionClass\n };\n\n this._region = buildRegion(region, defaults);\n },\n\n getRegion() {\n return this._region;\n },\n\n showView(view, ...args) {\n const region = this.getRegion();\n region.show(view, ...args);\n return view;\n },\n\n getView() {\n return this.getRegion().currentView;\n }\n});\n\nexport default Application;\n","import {version as VERSION} from '../package.json';\n\nimport proxy from './utils/proxy';\nimport extend from './utils/extend';\n\nimport {\n bindEvents as _bindEvents,\n unbindEvents as _unbindEvents\n} from './common/bind-events';\nimport {\n bindRequests as _bindRequests,\n unbindRequests as _unbindRequests\n} from './common/bind-requests';\nimport _getOption from './common/get-option';\nimport _mergeOptions from './common/merge-options';\nimport monitorViewEvents from './common/monitor-view-events';\nimport _normalizeMethods from './common/normalize-methods';\nimport _triggerMethod from './common/trigger-method';\n\nimport Events from './mixins/events';\n\nimport MnObject from './object';\nimport View from './view';\nimport CollectionView from './collection-view';\nimport Behavior from './behavior';\nimport Region from './region';\nimport Application from './application';\n\nimport DomApi from './config/dom';\n\nimport {\n isEnabled,\n setEnabled\n} from './config/features';\n\n// Utilities\n\nexport const bindEvents = proxy(_bindEvents);\nexport const unbindEvents = proxy(_unbindEvents);\nexport const bindRequests = proxy(_bindRequests);\nexport const unbindRequests = proxy(_unbindRequests);\nexport const mergeOptions = proxy(_mergeOptions);\nexport const getOption = proxy(_getOption);\nexport const normalizeMethods = proxy(_normalizeMethods);\nexport const triggerMethod = proxy(_triggerMethod);\n\n\n// Configuration\n\nexport const setDomApi = function(mixin) {\n CollectionView.setDomApi(mixin);\n Region.setDomApi(mixin);\n View.setDomApi(mixin);\n};\nexport const setRenderer = function(renderer) {\n CollectionView.setRenderer(renderer);\n View.setRenderer(renderer);\n};\n\nexport {\n View,\n CollectionView,\n MnObject,\n Region,\n Behavior,\n Application,\n isEnabled,\n setEnabled,\n monitorViewEvents,\n Events,\n extend,\n DomApi,\n VERSION\n};\n\nexport default {\n View,\n CollectionView,\n MnObject,\n Object: MnObject,\n Region,\n Behavior,\n Application,\n isEnabled,\n setEnabled,\n monitorViewEvents,\n Events,\n extend,\n DomApi,\n VERSION\n};\n"],"names":["proxy","method","context","args","apply","extend","Backbone","Model","normalizeMethods","hash","_","reduce","normalizedHash","name","isFunction","_this","errorProps","MarionetteError","call","Error","urlRoot","url","constructor","options","error","this","message","pick","captureStackTrace","toString","normalizeBindings","bindings","isObject","bindEvents","entity","listenTo","unbindEvents","stopListening","bindRequests","channel","reply","unbindRequests","stopReplying","getOption","optionName","undefined","mergeOptions","keys","each","key","option","triggerMethodChildren","view","event","shouldTrigger","_getImmediateChildren","child","triggerMethod","shouldTriggerAttach","_isAttached","shouldAttach","shouldTriggerDetach","shouldDetach","triggerDOMRefresh","_isRendered","triggerDOMRemove","handleBeforeAttach","handleAttach","handleBeforeDetach","handleDetach","handleBeforeRender","handleRender","monitorViewEvents","_areViewEventsMonitored","on","splitter","methodCache","getEventName","match","prefix","eventName","toUpperCase","getOnMethodName","replace","result","methodName","drop","arguments","trigger","CommonMixin","_setOptions","classOptions","Events","_isDestroyed","isDestroyed","destroy","_initRadio","channelName","Radio","_channel","radioEvents","radioRequests","_destroyRadio","getChannel","ClassOptions","MarionetteObject","cid","uniqueId","cidPrefix","initialize","prototype","DestroyMixin","RadioMixin","invokeMap","invoke","parseBehaviors","behaviors","allBehaviors","reducedBehaviors","behaviorDefiniton","behaviorClass","BehaviorClass","getBehaviorClass","behavior","push","_initBehaviors","_behaviors","_getBehaviorTriggers","triggers","_invoke","memo","_triggers","_getBehaviorEvents","events","_events","_proxyBehaviorViewProperties","_delegateBehaviorEntityEvents","_undelegateBehaviorEntityEvents","_destroyBehaviors","_removeBehavior","undelegate","without","_bindBehaviorUIElements","_unbindBehaviorUIElements","_triggerEventOnBehaviors","_delegateEntityEvents","model","collection","_modelEvents","_collectionEvents","_undelegateEntityEvents","_deleteEntityEventHandlers","_renderTemplate","template","data","mixinTemplateContext","serializeData","html","_renderHtml","attachElContent","getTemplate","serializedData","templateContext","serializeModel","items","serializeCollection","attributes","map","models","Dom","setContents","el","$el","delegateEventSplitter","getNamespacedEventName","namespace","FEATURES","childViewEventPrefix","triggersStopPropagation","triggersPreventDefault","DEV_MODE","isEnabled","setEnabled","state","_getViewTriggers","value","triggerDef","isString","shouldPreventDefault","preventDefault","shouldStopPropagation","stopPropagation","buildViewTrigger","uiRegEx","normalizeUIString","uiString","ui","r","slice","normalizeUIKeys","val","_getUIBindings","uiBindings","normalizeUIValues","property","propertyVal","_bindUIElements","_uiBindings","_ui","selector","$","_unbindUIElements","_this2","_getUI","getEl","setDomApi","mixin","createBuffer","document","createDocumentFragment","getDocumentEl","ownerDocument","documentElement","findEl","find","hasEl","childEl","contains","parentNode","detachEl","detach","replaceEl","newEl","oldEl","parent","replaceChild","swapEl","el1","el2","parent1","parent2","next1","nextSibling","next2","insertBefore","appendContents","contents","_$el","_$contents","append","hasContents","hasChildNodes","detachContents","ViewMixin","DomApi","_isElAttached","supportsRenderLifecycle","supportsDestroyLifecycle","isRendered","isAttached","delegateEvents","_buildEventProxies","combinedEvents","_getEvents","_getTriggers","View","delegateEntityEvents","undelegateEntityEvents","_isDestroying","_disableDetachEvents","unbindUIElements","_removeElement","_removeChildren","off","removeData","bindUIElements","getUI","_childViewEvents","_childViewTriggers","_eventPrefix","_getEventPrefix","defaultPrefix","_proxyChildViewEvents","_childViewEventHandler","childViewEvents","childViewTriggers","renderView","render","destroyView","disableDetachEvents","remove","BehaviorsMixin","DelegateEntityEventsMixin","TemplateRenderMixin","TriggersMixin","UIMixin","Region","_initEl","_setEl","definition","defaults","buildRegionFromObject","regionClass","RegionClass","replaceElement","_isReplaced","_isSwappingView","show","_ensureElement","_getView","currentView","_isShown","empty","_setupChildView","_attachView","length","_setElement","shouldReplace","_restoreEl","_replaceEl","attachHtml","_empty","parentView","_parentView","_shouldDisableMonitoring","shouldReplaceEl","allowMissingEl","viewOptions","_getViewOptions","_detachView","isReplaced","isSwappingView","detachHtml","shouldDestroy","removeView","_stopChildViewEvents","detachView","shouldRestoreEl","hasView","reset","_name","_removeReferences","_initRegions","regions","_regions","addRegions","_reInitRegions","addRegion","isEmpty","_addRegions","regionDefinitions","parentEl","partial","buildRegion","_addRegion","region","removeRegion","_removeRegion","removeRegions","_getRegions","bind","emptyRegions","getRegions","hasRegion","getRegion","clone","showChildView","detachChildView","getChildView","setRenderer","renderer","childReducer","children","setElement","RegionsMixin","Container","_init","stringComparator","comparator","get","_views","concat","_viewsByCid","_indexByModel","_updateLength","_add","index","_addViewIndexes","splice","_sort","_sortBy","sort","sortedViews","sortBy","_set","views","shouldReset","_swap","view1","view2","view1Index","findIndexByView","view2Index","swapView","findByModel","findByModelCid","modelCid","findByIndex","indexOf","findByCid","_remove","CollectionView","sortWithCollection","_initChildViewStorage","getEmptyRegion","_children","ChildViewContainer","$emptyEl","$container","_emptyRegion","_initialEvents","_onCollectionSort","_onCollectionReset","_onCollectionUpdate","add","merge","viewComparator","_destroyChildren","_addChildModels","changes","removedViews","removed","_removeChildModels","_addedViews","added","_detachChildren","_removeChildViews","_removeChildModel","_removeChild","_addChildModel","_createChildView","_addChild","ChildView","_getChildView","childViewOptions","_getChildViewOptions","buildChildView","childView","ChildViewClass","removeChildView","_getChildViewContainer","childViewContainer","_sortChildren","filter","getComparator","setComparator","preventRender","shouldSort","removeComparator","_viewComparator","_filterChildren","_renderChildren","viewFilter","_getFilter","attachViews","detachViews","getFilter","matcher","matches","setFilter","shouldRender","removeFilter","detachingViews","_detachChildView","_hasUnrenderedViews","_showEmptyView","_destroyEmptyView","els","_getBuffer","_attachChildren","elBuffer","_this3","EmptyView","_getEmptyView","_getEmptyViewOptions","emptyView","emptyRegion","emptyViewOptions","swapChildViews","addChildView","hasIndex","_removeChildView","_destroyChildView","Behavior","proxyViewProperties","behaviorEvents","behaviorHandler","behaviorTriggers","Application","_initRegion","start","_region","showView","getView","_bindEvents","_unbindEvents","_bindRequests","_unbindRequests","_mergeOptions","_getOption","_normalizeMethods","_triggerMethod","MnObject","Object","VERSION"],"mappings":"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"} \ No newline at end of file diff --git a/docs/basics.md b/docs/basics.md index 28b0ba54f9..e519741f48 100644 --- a/docs/basics.md +++ b/docs/basics.md @@ -16,10 +16,12 @@ patterns etc. ## Using ES6 Modules Marionette still supports using the library via an inline script. +The UMD build supports `noConflict()`. ```html - + + ``` The recommended solution is to choose a solution like a [package manager](./installation.md) diff --git a/docs/dom.api.md b/docs/dom.api.md index 0509239402..aa0391b6c1 100644 --- a/docs/dom.api.md +++ b/docs/dom.api.md @@ -17,6 +17,14 @@ API. You will, however, [need to also handle Backbone's jQuery integration](#bac Returns a new HTML DOM node instance. The resulting node can be passed into the other DOM functions. +### `getDocumentEl(el)` + +Look up the top level element of `el`. Used by Marionette to determine attachment. + +```javascript +const elIsAttached = this.Dom.hasEl(this.Dom.getDocumentEl(this.el), this.el); +``` + ### `getEl(selector)` Lookup the `selector` string withing the DOM. The `selector` may also be a DOM element. diff --git a/docs/marionette.collectionview.md b/docs/marionette.collectionview.md index 2347bc8d35..24810dd1fa 100644 --- a/docs/marionette.collectionview.md +++ b/docs/marionette.collectionview.md @@ -655,9 +655,10 @@ the `children` of the `CollectionView` can be manually managed. ### Adding a Child View The `addChildView` method can be used to add a view that is independent of your -`Backbone.Collection`. This method takes two parameters, the child view instance -and optionally the index for where it should be placed within the -[CollectionView's `children`](#managing-children). It returns the added view. +`Backbone.Collection`. This method takes three parameters, the child view instance, +optionally the index for where it should be placed within the +[CollectionView's `children`](#managing-children), and an options hash. +It returns the added view. ```javascript import { CollectionView } from 'backbone.marionette'; @@ -677,6 +678,24 @@ myCollectionView.render(); **Note** Unless an index is specified, this added view will be subject to filtering and sorting and may be difficult to manage in complex situations. Use with care. +#### `preventRender` option + +If you wish to add a child view to the children without the collectionview rendering +the children use the `preventRender` option. + +```javascript +import { CollectionView } from 'backbone.marionette'; +import ButtonView from './button-view'; + +const myCollectionView = new CollectionView({...}); + +const insertIndex = 0; // Add to the top + +myCollectionView.addChildView(new ButtonView(), { preventRender: true, index: insertIndex }); +myCollectionView.addChildView(new ButtonView(), insertIndex, { preventRender: true }); +myCollectionView.addChildView(new ButtonView()); // renders all three children +``` + ### Removing a Child View The `removeChildView` method is useful if you need to remove and destroy a view from diff --git a/package.json b/package.json index c3dc64e5af..4c865c0d75 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "backbone.marionette", "description": "The Backbone Framework", - "version": "4.0.0", + "version": "4.1.0", "homepage": "https://marionettejs.com/", "browser": "dist/backbone.marionette.js", "main": "dist/backbone.marionette.js",