Gitter migration: Point people to app.gitter.im (rollout pt. 1)
[gitter.git] / public / js / views / behaviors / isomorphic.js
blobea538dd0ed4d0968491ec19ae791cdf159d71bb2
1 'use strict';
2 var _ = require('lodash');
3 var Marionette = require('backbone.marionette');
4 var behaviourLookup = require('./lookup');
6 var Behavior = Marionette.Behavior.extend({
7   onRender: function() {
8     this.setupRegions();
9   },
11   onBeforeShow: function() {
12     this.setupRegions();
13   },
15   setupRegions: function() {
16     /* Only perform setup once */
17     if (this.setup) return;
18     this.setup = 1;
20     var view = this.view;
21     var isoRegions = this.options;
23     Object.keys(isoRegions).forEach(function(regionName) {
24       var isoRegionDefn = isoRegions[regionName];
25       var el = isoRegionDefn.el;
26       var region = view.addRegion(regionName, el);
27       var initMethod = isoRegionDefn.init;
29       if (!initMethod) return;
31       function optionsForRegion(options, config) {
32         var regionEl = region.$el[0];
33         if (!regionEl) throw new Error('Region ' + regionName + ' does not exist.');
35         var regionElChildLen = regionEl.children.length;
37         var baseOptions;
38         if (regionElChildLen === 0) {
39           baseOptions = {};
40         } else if (regionElChildLen === 1) {
41           if (config && config.rerender) {
42             baseOptions = { el: regionEl.children[0] };
43           } else {
44             baseOptions = { template: false, el: regionEl.children[0] };
45           }
46         } else {
47           throw new Error(
48             'Region can have zero or one elements, but not more. Region ' +
49               regionName +
50               ' has ' +
51               regionElChildLen +
52               '. Are you sure you wrapped the region with a parent?'
53           );
54         }
56         if (!options) return baseOptions;
57         return _.extend(baseOptions, options);
58       }
60       // Allow the init methods to be specified as a string
61       if (typeof initMethod === 'string') {
62         initMethod = view[initMethod];
63       }
65       var childView = initMethod.call(view, optionsForRegion, region);
66       if (childView) {
67         view.showChildView(regionName, childView);
68       }
69     });
70   }
71 });
73 behaviourLookup.register('Isomorphic', Behavior);
75 module.exports = Behavior;