} escaped\r\n\t * @return {String}\r\n\t */\r\n\texports.cls = function cls(classes, escaped) {\r\n\t var buf = [];\r\n\t for (var i = 0; i < classes.length; i++) {\r\n\t if (escaped && escaped[i]) {\r\n\t buf.push(exports.escape(joinClasses([classes[i]])));\r\n\t } else {\r\n\t buf.push(joinClasses(classes[i]));\r\n\t }\r\n\t }\r\n\t var text = joinClasses(buf);\r\n\t if (text.length) {\r\n\t return ' class=\"' + text + '\"';\r\n\t } else {\r\n\t return '';\r\n\t }\r\n\t};\r\n\r\n\r\n\texports.style = function (val) {\r\n\t if (val && typeof val === 'object') {\r\n\t return Object.keys(val).map(function (style) {\r\n\t return style + ':' + val[style];\r\n\t }).join(';');\r\n\t } else {\r\n\t return val;\r\n\t }\r\n\t};\r\n\t/**\r\n\t * Render the given attribute.\r\n\t *\r\n\t * @param {String} key\r\n\t * @param {String} val\r\n\t * @param {Boolean} escaped\r\n\t * @param {Boolean} terse\r\n\t * @return {String}\r\n\t */\r\n\texports.attr = function attr(key, val, escaped, terse) {\r\n\t if (key === 'style') {\r\n\t val = exports.style(val);\r\n\t }\r\n\t if ('boolean' == typeof val || null == val) {\r\n\t if (val) {\r\n\t return ' ' + (terse ? key : key + '=\"' + key + '\"');\r\n\t } else {\r\n\t return '';\r\n\t }\r\n\t } else if (0 == key.indexOf('data') && 'string' != typeof val) {\r\n\t if (JSON.stringify(val).indexOf('&') !== -1) {\r\n\t console.warn('Since Jade 2.0.0, ampersands (`&`) in data attributes ' +\r\n\t 'will be escaped to `&`');\r\n\t };\r\n\t if (val && typeof val.toISOString === 'function') {\r\n\t console.warn('Jade will eliminate the double quotes around dates in ' +\r\n\t 'ISO form after 2.0.0');\r\n\t }\r\n\t return ' ' + key + \"='\" + JSON.stringify(val).replace(/'/g, ''') + \"'\";\r\n\t } else if (escaped) {\r\n\t if (val && typeof val.toISOString === 'function') {\r\n\t console.warn('Jade will stringify dates in ISO form after 2.0.0');\r\n\t }\r\n\t return ' ' + key + '=\"' + exports.escape(val) + '\"';\r\n\t } else {\r\n\t if (val && typeof val.toISOString === 'function') {\r\n\t console.warn('Jade will stringify dates in ISO form after 2.0.0');\r\n\t }\r\n\t return ' ' + key + '=\"' + val + '\"';\r\n\t }\r\n\t};\r\n\r\n\t/**\r\n\t * Render the given attributes object.\r\n\t *\r\n\t * @param {Object} obj\r\n\t * @param {Object} escaped\r\n\t * @return {String}\r\n\t */\r\n\texports.attrs = function attrs(obj, terse){\r\n\t var buf = [];\r\n\r\n\t var keys = Object.keys(obj);\r\n\r\n\t if (keys.length) {\r\n\t for (var i = 0; i < keys.length; ++i) {\r\n\t var key = keys[i]\r\n\t , val = obj[key];\r\n\r\n\t if ('class' == key) {\r\n\t if (val = joinClasses(val)) {\r\n\t buf.push(' ' + key + '=\"' + val + '\"');\r\n\t }\r\n\t } else {\r\n\t buf.push(exports.attr(key, val, false, terse));\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t return buf.join('');\r\n\t};\r\n\r\n\t/**\r\n\t * Escape the given string of `html`.\r\n\t *\r\n\t * @param {String} html\r\n\t * @return {String}\r\n\t * @api private\r\n\t */\r\n\r\n\tvar jade_encode_html_rules = {\r\n\t '&': '&',\r\n\t '<': '<',\r\n\t '>': '>',\r\n\t '\"': '"'\r\n\t};\r\n\tvar jade_match_html = /[&<>\"]/g;\r\n\r\n\tfunction jade_encode_char(c) {\r\n\t return jade_encode_html_rules[c] || c;\r\n\t}\r\n\r\n\texports.escape = jade_escape;\r\n\tfunction jade_escape(html){\r\n\t var result = String(html).replace(jade_match_html, jade_encode_char);\r\n\t if (result === '' + html) return html;\r\n\t else return result;\r\n\t};\r\n\r\n\t/**\r\n\t * Re-throw the given `err` in context to the\r\n\t * the jade in `filename` at the given `lineno`.\r\n\t *\r\n\t * @param {Error} err\r\n\t * @param {String} filename\r\n\t * @param {String} lineno\r\n\t * @api private\r\n\t */\r\n\r\n\texports.rethrow = function rethrow(err, filename, lineno, str){\r\n\t if (!(err instanceof Error)) throw err;\r\n\t if ((typeof window != 'undefined' || !filename) && !str) {\r\n\t err.message += ' on line ' + lineno;\r\n\t throw err;\r\n\t }\r\n\t try {\r\n\t str = str || __webpack_require__(8).readFileSync(filename, 'utf8')\r\n\t } catch (ex) {\r\n\t rethrow(err, null, lineno)\r\n\t }\r\n\t var context = 3\r\n\t , lines = str.split('\\n')\r\n\t , start = Math.max(lineno - context, 0)\r\n\t , end = Math.min(lines.length, lineno + context);\r\n\r\n\t // Error context\r\n\t var context = lines.slice(start, end).map(function(line, i){\r\n\t var curr = i + start + 1;\r\n\t return (curr == lineno ? ' > ' : ' ')\r\n\t + curr\r\n\t + '| '\r\n\t + line;\r\n\t }).join('\\n');\r\n\r\n\t // Alter exception message\r\n\t err.path = filename;\r\n\t err.message = (filename || 'Jade') + ':' + lineno\r\n\t + '\\n' + context + '\\n\\n' + err.message;\r\n\t throw err;\r\n\t};\r\n\r\n\texports.DebugItem = function DebugItem(lineno, filename) {\r\n\t this.lineno = lineno;\r\n\t this.filename = filename;\r\n\t}\r\n\r\n\r\n/***/ }),\r\n/* 8 */\r\n/***/ (function(module, exports) {\r\n\r\n\t/* (ignored) */\r\n\r\n/***/ }),\r\n/* 9 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\t'use strict';\r\n\r\n\tObject.defineProperty(exports, \"__esModule\", {\r\n\t value: true\r\n\t});\r\n\r\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n\r\n\tvar _underscore = __webpack_require__(2);\r\n\r\n\tvar _underscore2 = _interopRequireDefault(_underscore);\r\n\r\n\tvar _knockout = __webpack_require__(5);\r\n\r\n\tvar _knockout2 = _interopRequireDefault(_knockout);\r\n\r\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\r\n\r\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n\r\n\tvar parseInt = Number.parseInt || window.parseInt;\r\n\r\n\tfunction isInteger(n) {\r\n\t return n === parseInt(n, 10);\r\n\t}\r\n\r\n\tfunction isFiniteInteger(n) {\r\n\t return isFinite(n) && isInteger(n);\r\n\t}\r\n\r\n\tvar _class = function () {\r\n\t function _class(options) {\r\n\t var _this = this;\r\n\r\n\t _classCallCheck(this, _class);\r\n\r\n\t var pageNumber = options.pageNumber,\r\n\t pageSize = options.pageSize,\r\n\t itemCount = options.itemCount,\r\n\t availablePageSizes = options.availablePageSizes,\r\n\t enableRandomPage = options.enableRandomPage;\r\n\r\n\r\n\t this.validate(options);\r\n\r\n\t // All numbers / calculations in this model are\r\n\t // base 0; so page 0 is the first page\r\n\t this.pageSize = _knockout2.default.observable(pageSize);\r\n\t this.itemCount = _knockout2.default.observable(itemCount);\r\n\t this.pageNumber = _knockout2.default.observable(pageNumber);\r\n\t this.availablePageSizes = _knockout2.default.observableArray(availablePageSizes);\r\n\t this.enableRandomPage = _knockout2.default.observable(enableRandomPage);\r\n\r\n\t this.pageSizeInput = _knockout2.default.computed({\r\n\t read: function read() {\r\n\t return _this.pageSize();\r\n\t },\r\n\t write: function write(value) {\r\n\t if (isInteger(value)) {\r\n\t _this.pageSize(value);\r\n\t _this.pageNumberInput(_this.pageNumber());\r\n\t }\r\n\t }\r\n\t });\r\n\r\n\t this.pageCount = _knockout2.default.computed(function () {\r\n\t return Math.ceil(_this.itemCount() / _this.pageSize());\r\n\t });\r\n\t this.pageNumberInput = _knockout2.default.computed({\r\n\t read: function read() {\r\n\t return _this.pageNumber();\r\n\t },\r\n\t write: function write(value) {\r\n\t if (isInteger(value)) {\r\n\t _this.pageNumber(Math.max(Math.min(value, _this.pageCount() - 1), 0));\r\n\t }\r\n\t }\r\n\t });\r\n\t this.pageNumberText = _knockout2.default.computed({\r\n\t read: function read() {\r\n\t return (_this.pageNumberInput() + 1).toString();\r\n\t },\r\n\t write: function write(value) {\r\n\t var intValue = parseInt(value, 10) - 1;\r\n\t if (isInteger(intValue)) {\r\n\t _this.pageNumberInput(intValue);\r\n\t } else {\r\n\t _this.pageNumberInput.notifySubscribers();\r\n\t _this.pageNumberText.notifySubscribers();\r\n\t }\r\n\t }\r\n\t });\r\n\t this.pageNumberSize = _knockout2.default.computed(function () {\r\n\t return Math.floor(_this.pageCount().toString().length);\r\n\t });\r\n\r\n\t this.onKeyPress = function (data, event) {\r\n\t var keyCode = event.which || event.keyCode;\r\n\r\n\t if (keyCode === 13) {\r\n\t event.target.blur();\r\n\t return false;\r\n\t }\r\n\r\n\t return true;\r\n\t };\r\n\r\n\t this.skip = _knockout2.default.computed(function () {\r\n\t return _this.pageNumber() * _this.pageSize();\r\n\t });\r\n\t this.take = _knockout2.default.computed(function () {\r\n\t return _this.pageSize();\r\n\t });\r\n\t // initialize the\r\n\t }\r\n\r\n\t _createClass(_class, [{\r\n\t key: 'incPageNumber',\r\n\t value: function incPageNumber() {\r\n\t this.pageNumberInput(this.pageNumber() + 1);\r\n\t }\r\n\t }, {\r\n\t key: 'decPageNumber',\r\n\t value: function decPageNumber() {\r\n\t this.pageNumberInput(this.pageNumber() - 1);\r\n\t }\r\n\t }, {\r\n\t key: 'validate',\r\n\t value: function validate(_ref) {\r\n\t var pageNumber = _ref.pageNumber,\r\n\t pageSize = _ref.pageSize,\r\n\t itemCount = _ref.itemCount,\r\n\t availablePageSizes = _ref.availablePageSizes;\r\n\r\n\t if (!isFiniteInteger(pageNumber) || pageNumber < 0) {\r\n\t throw new Error('invalid pageNumber ' + pageNumber);\r\n\t }\r\n\r\n\t if (!isFiniteInteger(pageSize) || pageSize <= 0) {\r\n\t throw new Error('invalid pageSize ' + pageSize);\r\n\t }\r\n\r\n\t if (!isFiniteInteger(itemCount) || itemCount < 0) {\r\n\t throw new Error('invalid itemCount ' + itemCount);\r\n\t }\r\n\r\n\t if (pageNumber > 0 && pageNumber * pageSize >= itemCount) {\r\n\t throw new Error('pageNumber ' + pageNumber + ' out of range');\r\n\t }\r\n\r\n\t if (!_underscore2.default.isArray(availablePageSizes)) {\r\n\t throw new Error('availablePageSizes should be an array');\r\n\t }\r\n\r\n\t _underscore2.default.each(availablePageSizes, function (size) {\r\n\t if (!isFiniteInteger(size) || size < 0) {\r\n\t throw new Error('invalid size ' + size + ' in availablePageSizes');\r\n\t }\r\n\t });\r\n\t }\r\n\t }]);\r\n\r\n\t return _class;\r\n\t}();\r\n\r\n\texports.default = _class;\r\n\r\n/***/ })\r\n/******/ ])\r\n});\r\n;\r\n","/* eslint-disable */\r\n(function webpackUniversalModuleDefinition(root, factory) {\r\n\tif(typeof exports === 'object' && typeof module === 'object')\r\n\t\tmodule.exports = factory(require(\"underscore\"), require(\"jquery\"), require(\"backbone\"), require(\"bluebird\"), require(\"backbone-virtualized-listview\"));\r\n\telse if(typeof define === 'function' && define.amd)\r\n\t\tdefine([\"underscore\", \"jquery\", \"backbone\", \"bluebird\", \"backbone-virtualized-listview\"], factory);\r\n\telse if(typeof exports === 'object')\r\n\t\texports[\"projection-grid\"] = factory(require(\"underscore\"), require(\"jquery\"), require(\"backbone\"), require(\"bluebird\"), require(\"backbone-virtualized-listview\"));\r\n\telse\r\n\t\troot[\"projection-grid\"] = factory(root[\"underscore\"], root[\"jquery\"], root[\"backbone\"], root[\"bluebird\"], root[\"backbone-virtualized-listview\"]);\r\n})(this, function(__WEBPACK_EXTERNAL_MODULE_3__, __WEBPACK_EXTERNAL_MODULE_7__, __WEBPACK_EXTERNAL_MODULE_8__, __WEBPACK_EXTERNAL_MODULE_33__, __WEBPACK_EXTERNAL_MODULE_93__) {\r\nreturn /******/ (function(modules) { // webpackBootstrap\r\n/******/ \t// The module cache\r\n/******/ \tvar installedModules = {};\r\n/******/\r\n/******/ \t// The require function\r\n/******/ \tfunction __webpack_require__(moduleId) {\r\n/******/\r\n/******/ \t\t// Check if module is in cache\r\n/******/ \t\tif(installedModules[moduleId])\r\n/******/ \t\t\treturn installedModules[moduleId].exports;\r\n/******/\r\n/******/ \t\t// Create a new module (and put it into the cache)\r\n/******/ \t\tvar module = installedModules[moduleId] = {\r\n/******/ \t\t\texports: {},\r\n/******/ \t\t\tid: moduleId,\r\n/******/ \t\t\tloaded: false\r\n/******/ \t\t};\r\n/******/\r\n/******/ \t\t// Execute the module function\r\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\r\n/******/\r\n/******/ \t\t// Flag the module as loaded\r\n/******/ \t\tmodule.loaded = true;\r\n/******/\r\n/******/ \t\t// Return the exports of the module\r\n/******/ \t\treturn module.exports;\r\n/******/ \t}\r\n/******/\r\n/******/\r\n/******/ \t// expose the modules object (__webpack_modules__)\r\n/******/ \t__webpack_require__.m = modules;\r\n/******/\r\n/******/ \t// expose the module cache\r\n/******/ \t__webpack_require__.c = installedModules;\r\n/******/\r\n/******/ \t// __webpack_public_path__\r\n/******/ \t__webpack_require__.p = \"\";\r\n/******/\r\n/******/ \t// Load entry module and return exports\r\n/******/ \treturn __webpack_require__(0);\r\n/******/ })\r\n/************************************************************************/\r\n/******/ ([\r\n/* 0 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\t'use strict';\r\n\r\n\tvar _gridFactory = __webpack_require__(2);\r\n\r\n\tvar _gridFactory2 = _interopRequireDefault(_gridFactory);\r\n\r\n\tvar _package = __webpack_require__(102);\r\n\r\n\tvar _package2 = _interopRequireDefault(_package);\r\n\r\n\tvar _dataSource = __webpack_require__(64);\r\n\r\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\r\n\r\n\tmodule.exports = {\r\n\t version: _package2.default.version,\r\n\t GridView: __webpack_require__(58),\r\n\t projections: __webpack_require__(18),\r\n\t layout: __webpack_require__(5),\r\n\t factory: _gridFactory2.default,\r\n\t popupEditorPrompt: __webpack_require__(32),\r\n\t dataSource: {\r\n\t Base: _dataSource.DataSource,\r\n\t Memory: _dataSource.MemoryDataSource,\r\n\t OData: _dataSource.ODataDataSource,\r\n\t JSData: _dataSource.JSDataDataSource\r\n\t }\r\n\t};\r\n\r\n/***/ }),\r\n/* 1 */,\r\n/* 2 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\t'use strict';\r\n\r\n\tObject.defineProperty(exports, \"__esModule\", {\r\n\t value: true\r\n\t});\r\n\r\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n\r\n\texports.default = function (options) {\r\n\t return new GridFactory(options);\r\n\t};\r\n\r\n\tvar _underscore = __webpack_require__(3);\r\n\r\n\tvar _underscore2 = _interopRequireDefault(_underscore);\r\n\r\n\tvar _renderersPlugin = __webpack_require__(4);\r\n\r\n\tvar _renderersPlugin2 = _interopRequireDefault(_renderersPlugin);\r\n\r\n\tvar _projectionPlugin = __webpack_require__(17);\r\n\r\n\tvar _projectionPlugin2 = _interopRequireDefault(_projectionPlugin);\r\n\r\n\tvar _gridViewPlugin = __webpack_require__(57);\r\n\r\n\tvar _gridViewPlugin2 = _interopRequireDefault(_gridViewPlugin);\r\n\r\n\tvar _dataSourcePlugin = __webpack_require__(63);\r\n\r\n\tvar _dataSourcePlugin2 = _interopRequireDefault(_dataSourcePlugin);\r\n\r\n\tvar _gridViewPlugin3 = __webpack_require__(69);\r\n\r\n\tvar _gridViewPlugin4 = _interopRequireDefault(_gridViewPlugin3);\r\n\r\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\r\n\r\n\tfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\r\n\r\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n\r\n\tvar configPlugin = function configPlugin(definePlugin) {\r\n\t return definePlugin('config', [], function () {\r\n\t return this.config;\r\n\t });\r\n\t};\r\n\r\n\tvar GridFactory = function () {\r\n\t function GridFactory() {\r\n\t var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\r\n\t _ref$vnext = _ref.vnext,\r\n\t vnext = _ref$vnext === undefined ? false : _ref$vnext;\r\n\r\n\t _classCallCheck(this, GridFactory);\r\n\r\n\t this.pluginIndex = {};\r\n\t this.plugins = [];\r\n\t if (vnext) {\r\n\t this.use(configPlugin).use(_dataSourcePlugin2.default).use(_gridViewPlugin4.default);\r\n\t } else {\r\n\t this.use(configPlugin).use(_projectionPlugin2.default).use(_renderersPlugin2.default).use(_gridViewPlugin2.default);\r\n\t }\r\n\t }\r\n\r\n\t _createClass(GridFactory, [{\r\n\t key: 'definePlugin',\r\n\t value: function definePlugin(name, deps, callback) {\r\n\t var _this = this;\r\n\r\n\t var plugin = { name: name, deps: deps, callback: callback };\r\n\r\n\t this.pluginIndex[name] = plugin;\r\n\t this.plugins.push(plugin);\r\n\t _underscore2.default.each(deps, function (dep) {\r\n\t if (!_underscore2.default.has(_this.pluginIndex, dep)) {\r\n\t throw new Error('unresolved plugin dependency ' + name + ' -> ' + dep);\r\n\t }\r\n\t });\r\n\t }\r\n\t }, {\r\n\t key: 'use',\r\n\t value: function use(callback) {\r\n\t callback(this.definePlugin.bind(this));\r\n\t return this;\r\n\t }\r\n\t }, {\r\n\t key: 'create',\r\n\t value: function create(config) {\r\n\t return _underscore2.default.reduce(this.plugins, function (result, _ref2) {\r\n\t var name = _ref2.name,\r\n\t deps = _ref2.deps,\r\n\t callback = _ref2.callback;\r\n\t return _underscore2.default.extend(result, _defineProperty({}, name, callback.apply(result, _underscore2.default.map(deps, function (dep) {\r\n\t return result[dep];\r\n\t }))));\r\n\t }, { config: config });\r\n\t }\r\n\t }]);\r\n\r\n\t return GridFactory;\r\n\t}();\r\n\r\n/***/ }),\r\n/* 3 */\r\n/***/ (function(module, exports) {\r\n\r\n\tmodule.exports = __WEBPACK_EXTERNAL_MODULE_3__;\r\n\r\n/***/ }),\r\n/* 4 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\t'use strict';\r\n\r\n\tObject.defineProperty(exports, \"__esModule\", {\r\n\t value: true\r\n\t});\r\n\r\n\tvar _index = __webpack_require__(5);\r\n\r\n\tvar _index2 = _interopRequireDefault(_index);\r\n\r\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\r\n\r\n\texports.default = function (definePlugin) {\r\n\t return definePlugin('renderers', ['config'], function (config) {\r\n\t var renderers = [];\r\n\r\n\t if (config.scrollable) {\r\n\t if (config.scrollable.virtual) {\r\n\t renderers.push(_index2.default.renderers.Virtualization);\r\n\t }\r\n\t if (config.scrollable.fixedHeader) {\r\n\t renderers.push(_index2.default.renderers.FixedHeader);\r\n\t }\r\n\t }\r\n\r\n\t return renderers;\r\n\t });\r\n\t};\r\n\r\n/***/ }),\r\n/* 5 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\t'use strict';\r\n\r\n\tmodule.exports = {\r\n\t TableLayout: __webpack_require__(6),\r\n\t templates: {\r\n\t table: __webpack_require__(9)\r\n\t },\r\n\t renderers: __webpack_require__(12)\r\n\t};\r\n\r\n/***/ }),\r\n/* 6 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\r\n\r\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(3), __webpack_require__(7), __webpack_require__(8)], __WEBPACK_AMD_DEFINE_RESULT__ = function (_, $, Backbone) {\r\n\t var View = Backbone.View.extend({\r\n\t events: {\r\n\t 'click th': 'thClick',\r\n\t 'click td': 'tdClick',\r\n\t 'change td>input.grid-text-input': 'editableStringChange'\r\n\t },\r\n\r\n\t initialize: function initialize(options) {\r\n\t _.bindAll(this, 'update', 'thClick', 'tdClick', 'dataFor');\r\n\r\n\t this.options = _.extend(this.options, options);\r\n\r\n\t // TODO [akamel] rename? this isn't a backbone data obj?\r\n\t this.data = undefined;\r\n\r\n\t this.container = options.container;\r\n\t this.grid = options.grid;\r\n\r\n\t this.renderers = _.map(this.options.renderers, function (Renderer) {\r\n\t return new Renderer({ layout: this });\r\n\t }.bind(this));\r\n\r\n\t this.subviews = [];\r\n\r\n\t this.onChange = this.onViewPortChange.bind(this);\r\n\r\n\t if (!_.isEmpty(this.renderers)) {\r\n\t this.listenTo(this.container, 'scroll:container', this.onViewPortChange);\r\n\t this.listenTo(this.container, 'resize:container', this.onViewPortChange);\r\n\t }\r\n\r\n\t this.on('change:viewport', function () {\r\n\t if (this.$el.is(':visible')) {\r\n\t this.scheduleDraw();\r\n\t }\r\n\t });\r\n\t },\r\n\r\n\t onViewPortChange: function onViewPortChange() {\r\n\t this.trigger('change:viewport');\r\n\t },\r\n\r\n\t monitorViewportChange: function monitorViewportChange(timeout, interval) {\r\n\t timeout = timeout || 1000;\r\n\t interval = interval || 100;\r\n\r\n\t var rect = this.el.getBoundingClientRect();\r\n\t var id = window.setInterval(function () {\r\n\t var rectNew = this.el.getBoundingClientRect();\r\n\r\n\t if (_.some(['left', 'top', 'width', 'height'], function (key) {\r\n\t return Math.abs(rectNew[key] - rect[key]) > 0.5;\r\n\t })) {\r\n\t this.onViewPortChange();\r\n\t }\r\n\t }.bind(this), interval);\r\n\r\n\t window.setTimeout(function () {\r\n\t window.clearInterval(id);\r\n\t }, timeout);\r\n\t },\r\n\r\n\t removeSubviews: function removeSubviews() {\r\n\t _.each(this.subviews, function (subview) {\r\n\t subview.remove();\r\n\t });\r\n\t this.subviews = [];\r\n\t },\r\n\r\n\t remove: function remove() {\r\n\t this.removeSubviews();\r\n\t this.container.stopListening(this.container);\r\n\t _.each(this.renderers, function (renderer) {\r\n\t return renderer.remove();\r\n\t });\r\n\t Backbone.View.prototype.remove.apply(this, arguments);\r\n\t },\r\n\r\n\t thClick: function thClick(e) {\r\n\t var arg = this.dataFor(e.currentTarget);\r\n\r\n\t if (arg.column) {\r\n\t this.trigger('click:header', e, arg);\r\n\t }\r\n\t },\r\n\r\n\t tdClick: function tdClick(e) {\r\n\t var arg = this.dataFor(e.currentTarget);\r\n\r\n\t if (arg.column) {\r\n\t this.trigger('click:cell', e, arg);\r\n\t }\r\n\t },\r\n\r\n\t editableStringChange: function editableStringChange(e) {\r\n\t var arg = this.dataFor(e.currentTarget);\r\n\t var colEditableStr = this.grid.projection.get('column.editable.string');\r\n\r\n\t if (arg.column) {\r\n\t if (_.isObject(colEditableStr) && !_.isUndefined(colEditableStr[arg.property])) {\r\n\t this.grid.projection.get('projection:column-editable-string').trigger('change:string', e, arg);\r\n\t } else {\r\n\t this.trigger('change:editable.string', e, arg);\r\n\t }\r\n\t }\r\n\t },\r\n\r\n\t dataFor: function dataFor(el) {\r\n\t if (!$.contains(this.el, el)) {\r\n\t return undefined;\r\n\t }\r\n\r\n\t var $el = $(el);\r\n\t // TODO [akamel] can we use target instead?\r\n\t var $tr = $el.closest('tr', this.el);\r\n\t var $closestTD = $el.closest('td', this.el);\r\n\t var $closestTH = $el.closest('th', this.el);\r\n\t var $td = _.size($closestTD) ? $closestTD : $closestTH;\r\n\t var virtualizer = this.getRenderer('virtualization');\r\n\t var i = $tr.index();\r\n\t var j = $td.index();\r\n\t // TODO [akamel] 1- check if $td is th; 2- throw if el is neither th or td as it is assumed in this function\r\n\t var isHeader = $td.closest('thead', this.el).length;\r\n\t var ret = { header: isHeader };\r\n\r\n\t // we are not in header\r\n\t if (isHeader) {\r\n\t if (i === 0) {\r\n\t ret.property = this.data.select[j];\r\n\t } else if (i === 1) {\r\n\t ret.property = this.data.subSelect[j];\r\n\t } else {\r\n\t ret.property = this.data.selectExpand[j];\r\n\t }\r\n\t } else {\r\n\t i += virtualizer ? virtualizer.first : 0;\r\n\t ret.model = this.data.value[i];\r\n\t if (this.data.selectExpand) {\r\n\t ret.property = this.data.selectExpand[j];\r\n\t } else {\r\n\t ret.property = this.data.select[j];\r\n\t }\r\n\t }\r\n\r\n\t ret.column = this.data.columns[ret.property];\r\n\t if (ret.property === this.grid.projection.get('column.checked')) {\r\n\t // TODO [akamel] this shouldn't be here\r\n\t var checkbox = $el.find('.column-selection');\r\n\t if (checkbox.length) {\r\n\t ret.checked = checkbox[0].checked;\r\n\t }\r\n\t }\r\n\t ret.grid = this.grid;\r\n\r\n\t return ret;\r\n\t },\r\n\r\n\t // TODO [akamel] [perf] 8.5%\r\n\t toHTML: function toHTML(value) {\r\n\t var data = _.defaults({\r\n\t value: value.rows,\r\n\t isSticky: value.isSticky\r\n\t }, this.data);\r\n\r\n\t _.each(data.columns, function (col) {\r\n\t if (_.isObject(col.$metadata)) {\r\n\t if (_.has(col.$metadata['attr.head'], 'class') && _.isArray(col.$metadata['attr.head'].class)) {\r\n\t col.$metadata['attr.head'].class = col.$metadata['attr.head'].class.join(' ');\r\n\t }\r\n\r\n\t if (_.has(col.$metadata['attr.body'], 'class') && _.isArray(col.$metadata['attr.body'].class)) {\r\n\t col.$metadata['attr.body'].class = col.$metadata['attr.body'].class.join(' ');\r\n\t }\r\n\r\n\t // TODO [akamel] merge attr that are on $metadata['attr']\r\n\t }\r\n\t });\r\n\r\n\t return this.options.template(data);\r\n\t },\r\n\r\n\t update: function update(model) {\r\n\t _.each(this.renderers, function (renderer) {\r\n\t renderer.update && renderer.update();\r\n\t });\r\n\r\n\t var value = model.get('value');\r\n\t var columns = model.get('columns');\r\n\t var columnsDelta = {};\r\n\t var colOptions = this.options.columns || {};\r\n\t var orderby = {};\r\n\r\n\t _.each(this.grid.projection.get('orderby'), function (element, index) {\r\n\t var key = _.first(_.keys(element));\r\n\t orderby[key] = {\r\n\t dir: element[key],\r\n\t index: index\r\n\t };\r\n\t });\r\n\r\n\t _.each(columns, function (col, property) {\r\n\t // TODO [akamel] consider filtering which props to copy/override\r\n\t var delta = {};\r\n\t var colOption = colOptions[property];\r\n\t var orderName = property;\r\n\r\n\t if (colOption && _.isString(colOption.sortable)) {\r\n\t orderName = colOption.sortable;\r\n\t } else if (col && _.isString(col.sortable)) {\r\n\t orderName = col.sortable;\r\n\t }\r\n\r\n\t if (orderby[orderName]) {\r\n\t delta.$orderby = orderby[orderName];\r\n\t }\r\n\r\n\t columnsDelta[property] = _.defaults(delta, colOption, col);\r\n\t });\r\n\r\n\t if (_.has(this.options.$metadata, 'class') && _.isArray(this.options.$metadata.class)) {\r\n\t this.options.$metadata.class = this.options.$metadata.class.join(' ');\r\n\t }\r\n\r\n\t var delta = {\r\n\t 'value': value,\r\n\t 'columns': columnsDelta,\r\n\t 'columns.lookup': _.indexBy(columns, function (col) {\r\n\t return col.property;\r\n\t }),\r\n\t '$metadata': this.options.$metadata,\r\n\t 'hideHeaders': this.options.hideHeaders\r\n\t };\r\n\r\n\t this.data = _.defaults(delta, model.toJSON());\r\n\r\n\t this.draw({ canSkipDraw: false });\r\n\t },\r\n\r\n\t scheduleDraw: function scheduleDraw() {\r\n\t if (!this.scheduledDraw) {\r\n\t this.scheduledDraw = true;\r\n\r\n\t window.requestAnimationFrame(function () {\r\n\t this.scheduledDraw = false;\r\n\t this.draw();\r\n\t }.bind(this));\r\n\t }\r\n\t },\r\n\r\n\t drawable: function drawable() {\r\n\t return this.data;\r\n\t },\r\n\r\n\t getRenderer: function getRenderer(name) {\r\n\t return _.find(this.renderers, function (r) {\r\n\t return r.name === name;\r\n\t });\r\n\t },\r\n\r\n\t draw: function draw(options) {\r\n\t if (!this.drawable()) {\r\n\t return;\r\n\t }\r\n\r\n\t this.trigger('render:beginning');\r\n\r\n\t var renderers = this.renderers;\r\n\t var i = 0;\r\n\r\n\t var middleware = function middleware(data, cb) {\r\n\t var r = renderers[i++];\r\n\t if (r) {\r\n\t var clone = _.defaults({}, data, { css: {} });\r\n\t delete clone.canSkipDraw;\r\n\r\n\t r.draw(clone, _.once(function (err, res) {\r\n\t res.canSkipDraw = data.canSkipDraw === true && res.canSkipDraw === true;\r\n\t if (err) {\r\n\t cb(err);\r\n\t } else {\r\n\t middleware(res || clone, cb);\r\n\t }\r\n\t }));\r\n\t } else {\r\n\t cb(undefined, data);\r\n\t }\r\n\t };\r\n\r\n\t var canSkipDraw = _.has(options, 'canSkipDraw') ? options.canSkipDraw : true;\r\n\r\n\t // this is _not_ and _cannot_ be async\r\n\t middleware({ rows: this.data.value, canSkipDraw: canSkipDraw }, function (err, res) {\r\n\t res.css && this.$el.css(res.css);\r\n\r\n\t if (err) {\r\n\t throw err;\r\n\t }\r\n\r\n\t this.removeSubviews();\r\n\r\n\t if (res.canSkipDraw !== true) {\r\n\t this.el.innerHTML = this.toHTML(res);\r\n\t }\r\n\r\n\t _.each(this.data.columns, function (column) {\r\n\t if (column.config) {\r\n\t if (_.isFunction(column.config.View)) {\r\n\t this.$('td.col-' + column.config.name).each(function (index, el) {\r\n\t var cellView = new column.config.View({ model: this.dataFor(el).model });\r\n\t this.$(el).html(cellView.render().el);\r\n\t this.subviews.push(cellView);\r\n\t }.bind(this));\r\n\t }\r\n\t if (_.isFunction(column.config.HeaderView)) {\r\n\t this.$('th.col-' + column.config.name).each(function (index, el) {\r\n\t var headerView = new column.config.HeaderView();\r\n\t this.$(el).html(headerView.render().el);\r\n\t this.subviews.push(headerView);\r\n\t }.bind(this));\r\n\t }\r\n\t }\r\n\t }, this);\r\n\t }.bind(this));\r\n\r\n\t this.trigger('render:finished');\r\n\t },\r\n\r\n\t render: function render() {\r\n\t this.grid.on('change:data', this.update);\r\n\r\n\t // this.grid.projection.data.on('change', this.update);\r\n\t },\r\n\r\n\t rerender: function rerender() {\r\n\t this.scheduleDraw();\r\n\t }\r\n\t });\r\n\r\n\t View.partial = function (options) {\r\n\t return View.extend({ options: options });\r\n\t };\r\n\r\n\t return View;\r\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n\r\n/***/ }),\r\n/* 7 */\r\n/***/ (function(module, exports) {\r\n\r\n\tmodule.exports = __WEBPACK_EXTERNAL_MODULE_7__;\r\n\r\n/***/ }),\r\n/* 8 */\r\n/***/ (function(module, exports) {\r\n\r\n\tmodule.exports = __WEBPACK_EXTERNAL_MODULE_8__;\r\n\r\n/***/ }),\r\n/* 9 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\tvar jade = __webpack_require__(10);\r\n\r\n\tmodule.exports = function template(locals) {\r\n\tvar buf = [];\r\n\tvar jade_mixins = {};\r\n\tvar jade_interp;\r\n\t;var locals_for_with = (locals || {});(function ($metadata, columns, hideHeaders, isApplyGroup, isSticky, subSelect, undefined, value) {\r\n\tjade_mixins[\"columnHeader\"] = jade_interp = function(column, isSubHeader){\r\n\tvar block = (this && this.block), attributes = (this && this.attributes) || {};\r\n\tif ( column.headerBuilder)\r\n\t{\r\n\tbuf.push(null == (jade_interp = column.headerBuilder(column, isSubHeader)) ? \"\" : jade_interp);\r\n\t}\r\n\telse\r\n\t{\r\n\tif ( column.$orderby)\r\n\t{\r\n\tif ( column.$orderby.dir > 0)\r\n\t{\r\n\tbuf.push(\"\");\r\n\t}\r\n\telse\r\n\t{\r\n\tbuf.push(\"\");\r\n\t}\r\n\t}\r\n\tif ( (column && column.$html))\r\n\t{\r\n\tbuf.push(null == (jade_interp = column.$html) ? \"\" : jade_interp);\r\n\t}\r\n\telse\r\n\t{\r\n\tif ( isSubHeader && column.config.subColTitle)\r\n\t{\r\n\tbuf.push(jade.escape(null == (jade_interp = column.config.subColTitle) ? \"\" : jade_interp));\r\n\t}\r\n\telse\r\n\t{\r\n\tbuf.push(jade.escape(null == (jade_interp = (typeof column.$text != 'undefined')? column.$text : (column.property || column)) ? \"\" : jade_interp));\r\n\t}\r\n\t}\r\n\t}\r\n\t};\r\n\tjade_mixins[\"th\"] = jade_interp = function(column, hasGroup, isSubColumn){\r\n\tvar block = (this && this.block), attributes = (this && this.attributes) || {};\r\n\tvar attr = (column.$metadata || {})['attr.head'] || {}\r\n\tvar colName = column.config && column.config.name || '';\r\n\tvar cls = [];\r\n\tif ( (colName))\r\n\t{\r\n\tcls.push('col-' + colName);\r\n\t}\r\n\tif ( column.sortable)\r\n\t{\r\n\tcls.push('sortable');\r\n\t}\r\n\tif ( column.$orderby)\r\n\t{\r\n\tcls.push('orderby');\r\n\t}\r\n\tcls = cls.join(' ');\r\n\tif ( isSubColumn )\r\n\t{\r\n\tvar colspan = 1, rowspan = 1;\r\n\tbuf.push(\"\");\r\n\tjade_mixins[\"columnHeader\"](column, true);\r\n\tbuf.push(\" | \");\r\n\t}\r\n\telse if ( hasGroup && column.groupExpansion)\r\n\t{\r\n\tvar colspan = column.group.length, rowspan = 1;\r\n\tbuf.push(\"\");\r\n\tjade_mixins[\"columnHeader\"](column);\r\n\tbuf.push(\" | \");\r\n\t}\r\n\telse if ( hasGroup && column.group)\r\n\t{\r\n\tvar colspan = 1, rowspan = 2;\r\n\tbuf.push(\"\");\r\n\tjade_mixins[\"columnHeader\"](column);\r\n\tbuf.push(\" | \");\r\n\t}\r\n\telse\r\n\t{\r\n\tvar colspan = 1, rowspan = 2;\r\n\tbuf.push(\"\");\r\n\tjade_mixins[\"columnHeader\"](column);\r\n\tbuf.push(\" | \");\r\n\t}\r\n\t};\r\n\tjade_mixins[\"td\"] = jade_interp = function(row, column){\r\n\tvar block = (this && this.block), attributes = (this && this.attributes) || {};\r\n\tvar attr = (column.$metadata || {})['attr.body'] || {}\r\n\tvar colName = column.config && column.config.name || '';\r\n\tvar cls = colName ? 'col-' + colName : '';\r\n\tbuf.push(\"\");\r\n\tvar res = row[column.property]\r\n\tif ( (res && res.$html))\r\n\t{\r\n\tbuf.push(null == (jade_interp = res.$html) ? \"\" : jade_interp);\r\n\t}\r\n\telse\r\n\t{\r\n\tbuf.push(jade.escape(null == (jade_interp = res) ? \"\" : jade_interp));\r\n\t}\r\n\tbuf.push(\" | \");\r\n\t};\r\n\tjade_mixins[\"thead\"] = jade_interp = function(isApplyGroup, subSelect, locals, columns){\r\n\tvar block = (this && this.block), attributes = (this && this.attributes) || {};\r\n\tbuf.push(\"\");\r\n\tif ( isApplyGroup && subSelect.length === 0)\r\n\t{\r\n\tbuf.push(\"\");\r\n\t}\r\n\telse if ( isApplyGroup)\r\n\t{\r\n\tbuf.push(\"\");\r\n\t}\r\n\telse\r\n\t{\r\n\tbuf.push(\"\");\r\n\t}\r\n\tbuf.push(\"\");\r\n\t};\r\n\tif ( isSticky)\r\n\t{\r\n\tbuf.push(\"\");\r\n\tjade_mixins[\"thead\"](isApplyGroup, subSelect, locals, columns);\r\n\tbuf.push(\"
\");\r\n\t}\r\n\tbuf.push(\"\");\r\n\tif ( !hideHeaders && !isSticky)\r\n\t{\r\n\tjade_mixins[\"thead\"](isApplyGroup, subSelect, locals, columns);\r\n\t}\r\n\tbuf.push(\"\");\r\n\t// iterate value\r\n\t;(function(){\r\n\t var $$obj = value;\r\n\t if ('number' == typeof $$obj.length) {\r\n\r\n\t for (var i = 0, $$l = $$obj.length; i < $$l; i++) {\r\n\t var row = $$obj[i];\r\n\r\n\tvar attr = (row.$metadata || {}).attr || {}\r\n\tbuf.push(\"\");\r\n\t// iterate locals['selectExpand'] || locals.select\r\n\t;(function(){\r\n\t var $$obj = locals['selectExpand'] || locals.select;\r\n\t if ('number' == typeof $$obj.length) {\r\n\r\n\t for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {\r\n\t var columnName = $$obj[$index];\r\n\r\n\tjade_mixins[\"td\"](row, columns[columnName]);\r\n\t }\r\n\r\n\t } else {\r\n\t var $$l = 0;\r\n\t for (var $index in $$obj) {\r\n\t $$l++; var columnName = $$obj[$index];\r\n\r\n\tjade_mixins[\"td\"](row, columns[columnName]);\r\n\t }\r\n\r\n\t }\r\n\t}).call(this);\r\n\r\n\tbuf.push(\"
\");\r\n\t }\r\n\r\n\t } else {\r\n\t var $$l = 0;\r\n\t for (var i in $$obj) {\r\n\t $$l++; var row = $$obj[i];\r\n\r\n\tvar attr = (row.$metadata || {}).attr || {}\r\n\tbuf.push(\"\");\r\n\t// iterate locals['selectExpand'] || locals.select\r\n\t;(function(){\r\n\t var $$obj = locals['selectExpand'] || locals.select;\r\n\t if ('number' == typeof $$obj.length) {\r\n\r\n\t for (var $index = 0, $$l = $$obj.length; $index < $$l; $index++) {\r\n\t var columnName = $$obj[$index];\r\n\r\n\tjade_mixins[\"td\"](row, columns[columnName]);\r\n\t }\r\n\r\n\t } else {\r\n\t var $$l = 0;\r\n\t for (var $index in $$obj) {\r\n\t $$l++; var columnName = $$obj[$index];\r\n\r\n\tjade_mixins[\"td\"](row, columns[columnName]);\r\n\t }\r\n\r\n\t }\r\n\t}).call(this);\r\n\r\n\tbuf.push(\"
\");\r\n\t }\r\n\r\n\t }\r\n\t}).call(this);\r\n\r\n\tbuf.push(\"
\");}.call(this,\"$metadata\" in locals_for_with?locals_for_with.$metadata:typeof $metadata!==\"undefined\"?$metadata:undefined,\"columns\" in locals_for_with?locals_for_with.columns:typeof columns!==\"undefined\"?columns:undefined,\"hideHeaders\" in locals_for_with?locals_for_with.hideHeaders:typeof hideHeaders!==\"undefined\"?hideHeaders:undefined,\"isApplyGroup\" in locals_for_with?locals_for_with.isApplyGroup:typeof isApplyGroup!==\"undefined\"?isApplyGroup:undefined,\"isSticky\" in locals_for_with?locals_for_with.isSticky:typeof isSticky!==\"undefined\"?isSticky:undefined,\"subSelect\" in locals_for_with?locals_for_with.subSelect:typeof subSelect!==\"undefined\"?subSelect:undefined,\"undefined\" in locals_for_with?locals_for_with.undefined: false?undefined:undefined,\"value\" in locals_for_with?locals_for_with.value:typeof value!==\"undefined\"?value:undefined));;return buf.join(\"\");\r\n\t}\r\n\r\n/***/ }),\r\n/* 10 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\t'use strict';\r\n\r\n\t/**\r\n\t * Merge two attribute objects giving precedence\r\n\t * to values in object `b`. Classes are special-cased\r\n\t * allowing for arrays and merging/joining appropriately\r\n\t * resulting in a string.\r\n\t *\r\n\t * @param {Object} a\r\n\t * @param {Object} b\r\n\t * @return {Object} a\r\n\t * @api private\r\n\t */\r\n\r\n\texports.merge = function merge(a, b) {\r\n\t if (arguments.length === 1) {\r\n\t var attrs = a[0];\r\n\t for (var i = 1; i < a.length; i++) {\r\n\t attrs = merge(attrs, a[i]);\r\n\t }\r\n\t return attrs;\r\n\t }\r\n\t var ac = a['class'];\r\n\t var bc = b['class'];\r\n\r\n\t if (ac || bc) {\r\n\t ac = ac || [];\r\n\t bc = bc || [];\r\n\t if (!Array.isArray(ac)) ac = [ac];\r\n\t if (!Array.isArray(bc)) bc = [bc];\r\n\t a['class'] = ac.concat(bc).filter(nulls);\r\n\t }\r\n\r\n\t for (var key in b) {\r\n\t if (key != 'class') {\r\n\t a[key] = b[key];\r\n\t }\r\n\t }\r\n\r\n\t return a;\r\n\t};\r\n\r\n\t/**\r\n\t * Filter null `val`s.\r\n\t *\r\n\t * @param {*} val\r\n\t * @return {Boolean}\r\n\t * @api private\r\n\t */\r\n\r\n\tfunction nulls(val) {\r\n\t return val != null && val !== '';\r\n\t}\r\n\r\n\t/**\r\n\t * join array as classes.\r\n\t *\r\n\t * @param {*} val\r\n\t * @return {String}\r\n\t */\r\n\texports.joinClasses = joinClasses;\r\n\tfunction joinClasses(val) {\r\n\t return (Array.isArray(val) ? val.map(joinClasses) :\r\n\t (val && typeof val === 'object') ? Object.keys(val).filter(function (key) { return val[key]; }) :\r\n\t [val]).filter(nulls).join(' ');\r\n\t}\r\n\r\n\t/**\r\n\t * Render the given classes.\r\n\t *\r\n\t * @param {Array} classes\r\n\t * @param {Array.} escaped\r\n\t * @return {String}\r\n\t */\r\n\texports.cls = function cls(classes, escaped) {\r\n\t var buf = [];\r\n\t for (var i = 0; i < classes.length; i++) {\r\n\t if (escaped && escaped[i]) {\r\n\t buf.push(exports.escape(joinClasses([classes[i]])));\r\n\t } else {\r\n\t buf.push(joinClasses(classes[i]));\r\n\t }\r\n\t }\r\n\t var text = joinClasses(buf);\r\n\t if (text.length) {\r\n\t return ' class=\"' + text + '\"';\r\n\t } else {\r\n\t return '';\r\n\t }\r\n\t};\r\n\r\n\r\n\texports.style = function (val) {\r\n\t if (val && typeof val === 'object') {\r\n\t return Object.keys(val).map(function (style) {\r\n\t return style + ':' + val[style];\r\n\t }).join(';');\r\n\t } else {\r\n\t return val;\r\n\t }\r\n\t};\r\n\t/**\r\n\t * Render the given attribute.\r\n\t *\r\n\t * @param {String} key\r\n\t * @param {String} val\r\n\t * @param {Boolean} escaped\r\n\t * @param {Boolean} terse\r\n\t * @return {String}\r\n\t */\r\n\texports.attr = function attr(key, val, escaped, terse) {\r\n\t if (key === 'style') {\r\n\t val = exports.style(val);\r\n\t }\r\n\t if ('boolean' == typeof val || null == val) {\r\n\t if (val) {\r\n\t return ' ' + (terse ? key : key + '=\"' + key + '\"');\r\n\t } else {\r\n\t return '';\r\n\t }\r\n\t } else if (0 == key.indexOf('data') && 'string' != typeof val) {\r\n\t if (JSON.stringify(val).indexOf('&') !== -1) {\r\n\t console.warn('Since Jade 2.0.0, ampersands (`&`) in data attributes ' +\r\n\t 'will be escaped to `&`');\r\n\t };\r\n\t if (val && typeof val.toISOString === 'function') {\r\n\t console.warn('Jade will eliminate the double quotes around dates in ' +\r\n\t 'ISO form after 2.0.0');\r\n\t }\r\n\t return ' ' + key + \"='\" + JSON.stringify(val).replace(/'/g, ''') + \"'\";\r\n\t } else if (escaped) {\r\n\t if (val && typeof val.toISOString === 'function') {\r\n\t console.warn('Jade will stringify dates in ISO form after 2.0.0');\r\n\t }\r\n\t return ' ' + key + '=\"' + exports.escape(val) + '\"';\r\n\t } else {\r\n\t if (val && typeof val.toISOString === 'function') {\r\n\t console.warn('Jade will stringify dates in ISO form after 2.0.0');\r\n\t }\r\n\t return ' ' + key + '=\"' + val + '\"';\r\n\t }\r\n\t};\r\n\r\n\t/**\r\n\t * Render the given attributes object.\r\n\t *\r\n\t * @param {Object} obj\r\n\t * @param {Object} escaped\r\n\t * @return {String}\r\n\t */\r\n\texports.attrs = function attrs(obj, terse){\r\n\t var buf = [];\r\n\r\n\t var keys = Object.keys(obj);\r\n\r\n\t if (keys.length) {\r\n\t for (var i = 0; i < keys.length; ++i) {\r\n\t var key = keys[i]\r\n\t , val = obj[key];\r\n\r\n\t if ('class' == key) {\r\n\t if (val = joinClasses(val)) {\r\n\t buf.push(' ' + key + '=\"' + val + '\"');\r\n\t }\r\n\t } else {\r\n\t buf.push(exports.attr(key, val, false, terse));\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t return buf.join('');\r\n\t};\r\n\r\n\t/**\r\n\t * Escape the given string of `html`.\r\n\t *\r\n\t * @param {String} html\r\n\t * @return {String}\r\n\t * @api private\r\n\t */\r\n\r\n\tvar jade_encode_html_rules = {\r\n\t '&': '&',\r\n\t '<': '<',\r\n\t '>': '>',\r\n\t '\"': '"'\r\n\t};\r\n\tvar jade_match_html = /[&<>\"]/g;\r\n\r\n\tfunction jade_encode_char(c) {\r\n\t return jade_encode_html_rules[c] || c;\r\n\t}\r\n\r\n\texports.escape = jade_escape;\r\n\tfunction jade_escape(html){\r\n\t var result = String(html).replace(jade_match_html, jade_encode_char);\r\n\t if (result === '' + html) return html;\r\n\t else return result;\r\n\t};\r\n\r\n\t/**\r\n\t * Re-throw the given `err` in context to the\r\n\t * the jade in `filename` at the given `lineno`.\r\n\t *\r\n\t * @param {Error} err\r\n\t * @param {String} filename\r\n\t * @param {String} lineno\r\n\t * @api private\r\n\t */\r\n\r\n\texports.rethrow = function rethrow(err, filename, lineno, str){\r\n\t if (!(err instanceof Error)) throw err;\r\n\t if ((typeof window != 'undefined' || !filename) && !str) {\r\n\t err.message += ' on line ' + lineno;\r\n\t throw err;\r\n\t }\r\n\t try {\r\n\t str = str || __webpack_require__(11).readFileSync(filename, 'utf8')\r\n\t } catch (ex) {\r\n\t rethrow(err, null, lineno)\r\n\t }\r\n\t var context = 3\r\n\t , lines = str.split('\\n')\r\n\t , start = Math.max(lineno - context, 0)\r\n\t , end = Math.min(lines.length, lineno + context);\r\n\r\n\t // Error context\r\n\t var context = lines.slice(start, end).map(function(line, i){\r\n\t var curr = i + start + 1;\r\n\t return (curr == lineno ? ' > ' : ' ')\r\n\t + curr\r\n\t + '| '\r\n\t + line;\r\n\t }).join('\\n');\r\n\r\n\t // Alter exception message\r\n\t err.path = filename;\r\n\t err.message = (filename || 'Jade') + ':' + lineno\r\n\t + '\\n' + context + '\\n\\n' + err.message;\r\n\t throw err;\r\n\t};\r\n\r\n\texports.DebugItem = function DebugItem(lineno, filename) {\r\n\t this.lineno = lineno;\r\n\t this.filename = filename;\r\n\t}\r\n\r\n\r\n/***/ }),\r\n/* 11 */\r\n/***/ (function(module, exports) {\r\n\r\n\t/* (ignored) */\r\n\r\n/***/ }),\r\n/* 12 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\t'use strict';\r\n\r\n\tvar _fixedHeader = __webpack_require__(13);\r\n\r\n\tvar _fixedHeader2 = _interopRequireDefault(_fixedHeader);\r\n\r\n\tvar _virtualization = __webpack_require__(16);\r\n\r\n\tvar _virtualization2 = _interopRequireDefault(_virtualization);\r\n\r\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\r\n\r\n\tmodule.exports = {\r\n\t FixedHeader: _fixedHeader2.default,\r\n\t Virtualization: _virtualization2.default\r\n\t};\r\n\r\n/***/ }),\r\n/* 13 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\t'use strict';\r\n\r\n\tObject.defineProperty(exports, \"__esModule\", {\r\n\t value: true\r\n\t});\r\n\r\n\tvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\r\n\r\n\tvar _jquery = __webpack_require__(7);\r\n\r\n\tvar _jquery2 = _interopRequireDefault(_jquery);\r\n\r\n\tvar _underscore = __webpack_require__(3);\r\n\r\n\tvar _underscore2 = _interopRequireDefault(_underscore);\r\n\r\n\tvar _measure = __webpack_require__(14);\r\n\r\n\tvar _measure2 = _interopRequireDefault(_measure);\r\n\r\n\tvar _px = __webpack_require__(15);\r\n\r\n\tvar _px2 = _interopRequireDefault(_px);\r\n\r\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\r\n\r\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\r\n\r\n\tvar FixedHeaderRenderer = function () {\r\n\t function FixedHeaderRenderer() {\r\n\t var _this = this;\r\n\r\n\t var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\r\n\r\n\t _classCallCheck(this, FixedHeaderRenderer);\r\n\r\n\t this.name = 'fixed-header';\r\n\t this.state = 'normal';\r\n\r\n\t this.options = options;\r\n\t this.layout = this.options.layout;\r\n\t this.columnWidth = null;\r\n\t this.windowWidth = (0, _jquery2.default)(window).width();\r\n\r\n\t this.onViewPortChange = function () {\r\n\t if (_underscore2.default.isFunction(_this.freezeColumnWidth)) {\r\n\t _this.freezeColumnWidth();\r\n\t }\r\n\t };\r\n\r\n\t this.layout.on('change:viewport', this.onViewPortChange);\r\n\t }\r\n\r\n\t _createClass(FixedHeaderRenderer, [{\r\n\t key: 'draw',\r\n\t value: function draw(data, cb) {\r\n\t var _this2 = this;\r\n\r\n\t data.vpMeasures = _measure2.default.viewport.call(this.layout);\r\n\r\n\t var $el = this.layout.$el;\r\n\t var offset = _underscore2.default.result(this.layout, 'top', 0);\r\n\t var isSticky = data.vpMeasures.viewportTop + offset > data.vpMeasures.boundsTop;\r\n\t var newState = isSticky ? 'sticky' : 'normal';\r\n\r\n\t data.canSkipDraw = newState === this.state;\r\n\t data.isSticky = isSticky;\r\n\r\n\t cb(undefined, data);\r\n\r\n\t $el.find('table.grid').css({ tableLayout: 'fixed' });\r\n\r\n\t if (isSticky) {\r\n\t var $tableStickyHeader = $el.find('table.grid-sticky-header');\r\n\t var $tableContent = $el.find('table.grid-content');\r\n\t var $thLastRow = $tableStickyHeader.find('thead > tr:last-child').children();\r\n\t var $tdFirstRow = $tableContent.find('tbody > tr:first-child').children();\r\n\r\n\t if (this.state === 'normal') {\r\n\t var $stickyHeaderFiller = $el.find('.sticky-header-filler');\r\n\t $stickyHeaderFiller.css({\r\n\t height: $tableStickyHeader.outerHeight()\r\n\t });\r\n\t }\r\n\r\n\t var setColumnWidth = function setColumnWidth(tableWidth, columnWidth) {\r\n\t _underscore2.default.each([$thLastRow, $tdFirstRow], function ($elems) {\r\n\t return _underscore2.default.each($elems, function (el, index) {\r\n\t (0, _jquery2.default)(el).css({\r\n\t width: _underscore2.default.result(columnWidth, index, '')\r\n\t });\r\n\t });\r\n\t });\r\n\r\n\t $el.find('table.grid').css({\r\n\t width: tableWidth\r\n\t });\r\n\t };\r\n\r\n\t var unfreezeColumnWidth = function unfreezeColumnWidth() {\r\n\t setColumnWidth('', null);\r\n\t };\r\n\r\n\t var freezeColumnWidth = this.freezeColumnWidth = function () {\r\n\t if (!_this2.columnWidth || Math.abs((0, _jquery2.default)(window).width() - _this2.windowWidth) >= 1) {\r\n\t unfreezeColumnWidth();\r\n\t _this2.windowWidth = (0, _jquery2.default)(window).width();\r\n\t _this2.tableWidth = $tableContent.outerWidth();\r\n\t _this2.columnWidth = _underscore2.default.map($tdFirstRow, function (td) {\r\n\t return (0, _jquery2.default)(td).outerWidth();\r\n\t });\r\n\t }\r\n\r\n\t setColumnWidth(_this2.tableWidth, _this2.columnWidth);\r\n\t };\r\n\r\n\t freezeColumnWidth();\r\n\t $tableStickyHeader.css({\r\n\t top: offset,\r\n\t left: $tableContent.offset().left - window.scrollX,\r\n\t position: 'fixed'\r\n\t });\r\n\t } else {\r\n\t this.freezeColumnWidth = null;\r\n\t }\r\n\r\n\t if (this.state !== newState) {\r\n\t this.layout.grid.trigger('change:header-state', newState);\r\n\t this.state = newState;\r\n\t }\r\n\t }\r\n\t }, {\r\n\t key: 'remove',\r\n\t value: function remove() {}\r\n\t }], [{\r\n\t key: 'partial',\r\n\t value: function partial(options) {\r\n\t return function (o) {\r\n\t return new Renderer(_underscore2.default.defaults({}, o, options));\r\n\t };\r\n\t }\r\n\t }]);\r\n\r\n\t return FixedHeaderRenderer;\r\n\t}();\r\n\r\n\texports.default = FixedHeaderRenderer;\r\n\r\n/***/ }),\r\n/* 14 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\r\n\r\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(7), __webpack_require__(3)], __WEBPACK_AMD_DEFINE_RESULT__ = function ($, _) {\r\n\t function viewport(el, container) {\r\n\t var $el = el ? $(el) : this.$el;\r\n\r\n\t container = container || this.container;\r\n\t var $viewport = container.$el;\r\n\r\n\t var viewportTop = $viewport.scrollTop();\r\n\t var viewportBottom = viewportTop + $viewport.height();\r\n\t var viewportLeft = $viewport.scrollLeft();\r\n\r\n\t var boundsTop = container.offset($el).top;\r\n\t var boundsBottom = boundsTop + $el.innerHeight();\r\n\t // var boundsLeft = $el.offset().left;\r\n\r\n\t var visibleTop = Math.max(boundsTop, viewportTop);\r\n\t var visibleBottom = Math.min(boundsBottom, viewportBottom);\r\n\t // var visibleLeft = Math.max(boundsLeft, viewportLeft);\r\n\r\n\t return {\r\n\t boundsTop: boundsTop,\r\n\t viewportTop: viewportTop,\r\n\t top: visibleTop - boundsTop,\r\n\t bottom: visibleBottom - boundsTop,\r\n\t offsetLeft: viewportLeft\r\n\t };\r\n\t }\r\n\r\n\t function dimensions(el) {\r\n\t var $el = el ? $(el) : this.$el;\r\n\r\n\t // calculate heights\r\n\t // a. header\r\n\t var ret = {\r\n\t rows: [],\r\n\t thead: $el.find('thead > tr').outerHeight()\r\n\t };\r\n\r\n\t // b. keep row info\r\n\t $el.find('tbody').children('tr').each(function () {\r\n\t ret.rows.push($(this).outerHeight());\r\n\t });\r\n\r\n\t // c. update average row height\r\n\t var avg = _.reduce(ret.rows, function (memo, num) {\r\n\t return memo + num;\r\n\t }, 0) / (ret.rows.length === 0 ? 1 : ret.rows.length);\r\n\r\n\t ret.avgRowHeight = avg;\r\n\t ret.estimateHeight = _.size(this.data.value) * avg + ret.thead;\r\n\r\n\t return ret;\r\n\t }\r\n\r\n\t function sample() {\r\n\t // a. render test pass\r\n\t var $tmpEl = $('');\r\n\t var sample = _.first(this.data.value, 20);\r\n\r\n\t this.$el.append($tmpEl);\r\n\r\n\t $tmpEl[0].innerHTML = this.toHTML({ rows: sample });\r\n\r\n\t // b. take measures\r\n\t var ret = dimensions.call(this, $tmpEl);\r\n\r\n\t // c. clean-up\r\n\t $tmpEl.remove();\r\n\r\n\t return ret;\r\n\t }\r\n\r\n\t return {\r\n\t viewport: viewport,\r\n\t dimensions: dimensions,\r\n\t sample: sample\r\n\t };\r\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n\r\n/***/ }),\r\n/* 15 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\r\n\r\n\t// todo [akamel] move to /component\r\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(3)], __WEBPACK_AMD_DEFINE_RESULT__ = function (_) {\r\n\t function parse(a) {\r\n\t return abs(parseFloat(a));\r\n\t }\r\n\r\n\t function abs(a) {\r\n\t return _.isFinite(a) ? a : 0;\r\n\t }\r\n\r\n\t function pixelify(a) {\r\n\t return abs(a) + 'px';\r\n\t }\r\n\r\n\t return {\r\n\t parse: parse,\r\n\t pixelify: pixelify\r\n\t };\r\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n\r\n/***/ }),\r\n/* 16 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\r\n\r\n\t// TODO [akamel] [bug] with large data set, jitters when scrolling to bottom\r\n\r\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(7), __webpack_require__(3), __webpack_require__(14), __webpack_require__(15)], __WEBPACK_AMD_DEFINE_RESULT__ = function ($, _, measure, px) {\r\n\t function rowHeight(row) {\r\n\t return _.isNumber(row.__height) ? row.__height : this.__measures.avgRowHeight;\r\n\t }\r\n\r\n\t function estimateHeight(first, last) {\r\n\t var rows = this.layout.data.value;\r\n\r\n\t var ret = 0;\r\n\t for (var i = first; i <= last; i++) {\r\n\t ret += rowHeight.call(this, rows[i]);\r\n\t }\r\n\r\n\t return ret;\r\n\t }\r\n\r\n\t function rowAtOffset(offset) {\r\n\t var rem = offset;\r\n\r\n\t if (rem <= 0) {\r\n\t return 0;\r\n\t }\r\n\r\n\t var ret = -1;\r\n\t var count = _.size(this.layout.data.value);\r\n\r\n\t while (rem > 0 && ret < count - 1) {\r\n\t ret++;\r\n\t rem -= rowHeight.call(this, ret);\r\n\t }\r\n\r\n\t return ret < count ? ret : -1;\r\n\t }\r\n\r\n\t function Renderer(options) {\r\n\t this.options = options || {};\r\n\r\n\t this.name = 'virtualization';\r\n\t this.layout = this.options.layout;\r\n\t }\r\n\r\n\t Renderer.prototype.draw = function (data, cb) {\r\n\t // a. define data set\r\n\t var value = this.layout.data.value;\r\n\t var count = _.size(value);\r\n\t var first = 0;\r\n\t var last = count - 1;\r\n\r\n\t // b. render test pass / take initial measures\r\n\t if (!this.__measures) {\r\n\t var smpl = measure.sample.call(this.layout);\r\n\t this.__measures = _.pick(smpl, 'avgRowHeight', 'estimateHeight', 'thead');\r\n\r\n\t // b.1 set height based on measures estimate\r\n\t this.layout.$el.css({\r\n\t 'padding-top': px.pixelify(this.__measures.estimateHeight)\r\n\t });\r\n\t }\r\n\r\n\t // c. find visible viewport\r\n\t data.vpMeasures = data.vpMeasures || measure.viewport.call(this.layout);\r\n\r\n\t // d. find rendable rows\r\n\t first = rowAtOffset.call(this, data.vpMeasures.top - this.__measures.thead);\r\n\t last = rowAtOffset.call(this, data.vpMeasures.bottom - this.__measures.thead);\r\n\r\n\t // d.1 add a few rows before and after our calculations to account for measurment estimation err\r\n\t var errMarginRowCount = 5;\r\n\r\n\t first -= errMarginRowCount;\r\n\t last += errMarginRowCount;\r\n\r\n\t first = Math.max(0, first);\r\n\t last = Math.min(last < 0 ? count - 1 : last, count - 1);\r\n\r\n\t var pTop = estimateHeight.call(this, 0, first - 1);\r\n\t var pBottom = estimateHeight.call(this, last + 1, count - 1);\r\n\r\n\t data.rows = value.slice(first, last + 1);\r\n\r\n\t _.extend(data.css, {\r\n\t 'padding-top': px.pixelify(pTop + px.parse(data.css['padding-top'])),\r\n\t 'padding-bottom': px.pixelify(pBottom + px.parse(data.css['padding-bottom']))\r\n\t });\r\n\r\n\t if (this.first === first && this.last === last) {\r\n\t data.canSkipDraw = true;\r\n\t }\r\n\r\n\t // e. yield to render\r\n\t cb(undefined, data);\r\n\r\n\t // f. take new measures and update avg row height\r\n\t // todo [akamel] [perf] 7.5%\r\n\t var tblMeasure = measure.dimensions.call(this.layout);\r\n\t _.each(tblMeasure.rows, function (height, i) {\r\n\t value[i + first].__height = height;\r\n\t });\r\n\r\n\t var heights = _.chain(value).map(function (row) {\r\n\t return row.__height;\r\n\t }).compact().value();\r\n\r\n\t if (_.size(heights)) {\r\n\t this.__measures.avgRowHeight = _.reduce(heights, function (memo, num) {\r\n\t return memo + num;\r\n\t }, 0) / _.size(heights);\r\n\t }\r\n\r\n\t this.first = first;\r\n\t this.last = last;\r\n\t };\r\n\r\n\t Renderer.prototype.update = function () {\r\n\t delete this.__measures;\r\n\t };\r\n\r\n\t Renderer.prototype.remove = _.noop;\r\n\r\n\t Renderer.partial = function (options) {\r\n\t return function (o) {\r\n\t return new Renderer(_.defaults({}, o, options));\r\n\t };\r\n\t };\r\n\r\n\t return Renderer;\r\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n\r\n/***/ }),\r\n/* 17 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\t'use strict';\r\n\r\n\tObject.defineProperty(exports, \"__esModule\", {\r\n\t value: true\r\n\t});\r\n\r\n\tvar _underscore = __webpack_require__(3);\r\n\r\n\tvar _underscore2 = _interopRequireDefault(_underscore);\r\n\r\n\tvar _backbone = __webpack_require__(8);\r\n\r\n\tvar _backbone2 = _interopRequireDefault(_backbone);\r\n\r\n\tvar _index = __webpack_require__(18);\r\n\r\n\tvar _index2 = _interopRequireDefault(_index);\r\n\r\n\tvar _utility = __webpack_require__(56);\r\n\r\n\tvar _index3 = __webpack_require__(32);\r\n\r\n\tvar _index4 = _interopRequireDefault(_index3);\r\n\r\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\r\n\r\n\tvar projectionConfigs = {\r\n\t A11y: function A11y(config) {\r\n\t var accConfig = {};\r\n\r\n\t // temp config to fix a11y bug of latency projection grid, should not to reuse it.\r\n\t if (_underscore2.default.has(config.a11y, 'selection') && _underscore2.default.has(config.a11y.selection, 'selectAllLabel')) {\r\n\t accConfig['a11y.selection.selectAllLabel'] = config.a11y.selection.selectAllLabel;\r\n\t }\r\n\r\n\t return accConfig;\r\n\t },\r\n\t AggregateRow: function AggregateRow(config) {\r\n\t var configAgg = {};\r\n\r\n\t if (_underscore2.default.has(config.aggregate, 'top')) {\r\n\t configAgg['aggregate.top'] = config.aggregate.top;\r\n\t }\r\n\r\n\t if (_underscore2.default.has(config.aggregate, 'bottom')) {\r\n\t configAgg['aggregate.bottom'] = config.aggregate.bottom;\r\n\t }\r\n\r\n\t return configAgg;\r\n\t },\r\n\t JSData: function JSData(config) {\r\n\t return _underscore2.default.extend(_underscore2.default.pick(config.dataSource, ['skip', 'take', 'filter', 'orderby', 'select']), {\r\n\t 'jsdata.entity': config.dataSource.resource,\r\n\t 'jsdata.query': config.dataSource.query,\r\n\t 'jsdata.options': config.dataSource.options\r\n\t });\r\n\t },\r\n\t Map: function Map(config) {\r\n\t var properties = _underscore2.default.reduce(config.columns, function (memo, _ref) {\r\n\t var name = _ref.name,\r\n\t value = _ref.value,\r\n\t field = _ref.field;\r\n\r\n\t memo[name] = value || function (item) {\r\n\t return _underscore2.default.reduce((field || name).split('/'), function (memo, prop) {\r\n\t return _underscore2.default.result(memo, prop);\r\n\t }, item);\r\n\t };\r\n\t return memo;\r\n\t }, {});\r\n\r\n\t return {\r\n\t map: function map(item) {\r\n\t return _underscore2.default.reduce(config.columns, function (memo, _ref2) {\r\n\t var name = _ref2.name;\r\n\r\n\t memo[name] = properties[name](item);\r\n\t return memo;\r\n\t }, {});\r\n\t }\r\n\t };\r\n\t },\r\n\t Columns: function Columns(config) {\r\n\t var columns = _underscore2.default.reduce(config.columns, function (columns, column) {\r\n\t var $metadata = {};\r\n\r\n\t if (column.attributes) {\r\n\t $metadata['attr.body'] = column.attributes;\r\n\t }\r\n\r\n\t if (column.headerAttributes) {\r\n\t $metadata['attr.head'] = column.headerAttributes;\r\n\t }\r\n\r\n\t columns[column.name] = {\r\n\t sortable: column.sortable,\r\n\t $metadata: $metadata,\r\n\t headerBuilder: column.headerBuilder,\r\n\t config: column\r\n\t };\r\n\r\n\t return columns;\r\n\t }, {});\r\n\r\n\t if (config.selectable) {\r\n\t columns.checkbox = {\r\n\t config: { name: 'selection' }\r\n\t };\r\n\t }\r\n\r\n\t if (_underscore2.default.has(config.columnShifter, 'totalColumns')) {\r\n\t columns['column.skip.less'] = {\r\n\t config: { name: 'skip-less' }\r\n\t };\r\n\t columns['column.skip.more'] = {\r\n\t config: { name: 'skip-more' }\r\n\t };\r\n\t }\r\n\r\n\t return { columns: columns };\r\n\t },\r\n\t ColumnI18n: function ColumnI18n(config) {\r\n\t return _underscore2.default.reduce(config.columns, function (columnI18n, column) {\r\n\t columnI18n['column.i18n'][column.name] = column.title || column.name;\r\n\t columnI18n['subColumn.i18n'][column.name] = column.subColTitle;\r\n\t return columnI18n;\r\n\t }, { 'column.i18n': {}, 'subColumn.i18n': {} });\r\n\t },\r\n\t ColumnQueryable: function ColumnQueryable(config) {\r\n\t var columnIn = _underscore2.default.chain(config.columns).reject(_underscore2.default.property('hidden')).map(_underscore2.default.property('name')).value();\r\n\t var columnLock = _underscore2.default.chain(config.columns).filter(_underscore2.default.property('locked')).map(_underscore2.default.property('name')).value();\r\n\t var colqConfig = {\r\n\t 'column.lock': columnLock,\r\n\t 'column.in': columnIn\r\n\t };\r\n\r\n\t if (config.selectable) {\r\n\t columnIn.unshift('checkbox');\r\n\t columnLock.unshift('checkbox');\r\n\t }\r\n\r\n\t if (_underscore2.default.has(config.columnShifter, 'totalColumns')) {\r\n\t colqConfig['column.take'] = config.columnShifter.totalColumns;\r\n\t }\r\n\t return colqConfig;\r\n\t },\r\n\r\n\r\n\t // Todo[hezhan]: deprecated?\r\n\t // ColumnGroup(config) {\r\n\t // return {\r\n\t // 'column.group': config.columnGroup,\r\n\t // };\r\n\t // },\r\n\r\n\t ColumnShifter: function ColumnShifter() {},\r\n\t ColumnTemplate: function ColumnTemplate(config) {\r\n\t return {\r\n\t 'column.template': _underscore2.default.reduce(config.columns, function (columnTmpl, column) {\r\n\t if (column.headerTemplate) {\r\n\t columnTmpl[column.name] = column.headerTemplate;\r\n\t }\r\n\t return columnTmpl;\r\n\t }, {})\r\n\t };\r\n\t },\r\n\t ColumnHoverText: function ColumnHoverText() {},\r\n\t Editable: function Editable(config) {\r\n\t var editableOptions = {};\r\n\r\n\t _underscore2.default.each(config.columns, function (column) {\r\n\t if (column.editable) {\r\n\t var options = editableOptions[column.name] = {\r\n\t condition: function condition() {\r\n\t return true;\r\n\t },\r\n\t editor: _index4.default\r\n\t };\r\n\r\n\t if (_underscore2.default.isFunction(column.editable)) {\r\n\t options.condition = column.editable;\r\n\t } else if (_underscore2.default.isObject(column.editable)) {\r\n\t _underscore2.default.extend(options, column.editable);\r\n\t }\r\n\t }\r\n\t });\r\n\r\n\t var tooltipText = _underscore2.default.result(config.editable, 'tooltipText', 'Edit');\r\n\t var iconClasses = _underscore2.default.result(config.editable, 'iconClasses', ['glyphicon', 'glyphicon-pencil']);\r\n\r\n\t return {\r\n\t 'column.editable': editableOptions,\r\n\t 'editable.tooltip.text': tooltipText,\r\n\t 'editable.icon.class': iconClasses\r\n\t };\r\n\t },\r\n\t MemoryQueryable: function MemoryQueryable(config) {\r\n\t return {\r\n\t 'column.sortable': _underscore2.default.reduce(config.columns, function (columnSortable, column) {\r\n\t if (column.sortable) {\r\n\t columnSortable[column.name] = column.sortable;\r\n\t }\r\n\t return columnSortable;\r\n\t }, {})\r\n\t };\r\n\t },\r\n\t Odata: function Odata(config) {\r\n\t return _underscore2.default.extend(_underscore2.default.pick(config.dataSource, ['url', 'skip', 'take', 'filter', 'orderby', 'select']));\r\n\t },\r\n\t PropertyTemplate: function PropertyTemplate(config) {\r\n\t return {\r\n\t 'property.template': _underscore2.default.reduce(config.columns, function (propTmpl, column) {\r\n\t if (column.template) {\r\n\t propTmpl[column.name] = column.template;\r\n\t }\r\n\t return propTmpl;\r\n\t }, {})\r\n\t };\r\n\t },\r\n\t RowIndex: function RowIndex() {},\r\n\t Row: function Row(config) {\r\n\t return {\r\n\t 'row.classes': _underscore2.default.result(config.rows, 'classes')\r\n\t };\r\n\t },\r\n\t RowCheckbox: function RowCheckbox(config) {\r\n\t return {\r\n\t 'row.check.id': _underscore2.default.chain(config).result('dataSource').result('schema').result('key', 'rowIndex').value(),\r\n\t 'row.check.single': config.selectable === 'single',\r\n\t 'column.checked': 'checkbox',\r\n\t 'row.check.allow': function rowCheckAllow(model) {\r\n\t var type = _underscore2.default.chain(model).result('$metadata').result('type').value();\r\n\r\n\t return !_underscore2.default.contains(['segmentation', 'aggregate'], type);\r\n\t }\r\n\t };\r\n\t },\r\n\t Page: function Page(config) {\r\n\t return {\r\n\t 'page.size': config.pageable.pageSize,\r\n\t 'page.number': 0\r\n\t };\r\n\t },\r\n\t Sink: function Sink(config) {\r\n\t var data = _underscore2.default.result(config.dataSource, 'data', []);\r\n\r\n\t if (_underscore2.default.isArray(data)) {\r\n\t return { seed: data };\r\n\t } else if (data instanceof _backbone2.default.Collection) {\r\n\t return { seed: data.toJSON() };\r\n\t }\r\n\t }\r\n\t};\r\n\r\n\texports.default = function (definePlugin) {\r\n\t return definePlugin('projection', ['config'], function (config) {\r\n\t var projection = null;\r\n\r\n\t function pipeProjection(name) {\r\n\t var Projection = _index2.default[name];\r\n\t var configProj = projectionConfigs[name](config);\r\n\t var projectionDest = new Projection(configProj);\r\n\r\n\t if (projection) {\r\n\t projection = projection.pipe(projectionDest);\r\n\t } else {\r\n\t projection = projectionDest;\r\n\t }\r\n\t }\r\n\r\n\t var dataSourceType = config.dataSource.type || 'memory';\r\n\t if (dataSourceType === 'js-data') {\r\n\t pipeProjection('JSData');\r\n\t } else if (dataSourceType === 'memory') {\r\n\t pipeProjection('Sink');\r\n\t pipeProjection('MemoryQueryable');\r\n\t if (config.dataSource.data instanceof _backbone2.default.Collection) {\r\n\t var updating = false;\r\n\t var scheduleUpdate = function scheduleUpdate() {\r\n\t if (!updating) {\r\n\t updating = true;\r\n\t window.setTimeout(function () {\r\n\t projection.set('seed', config.dataSource.data.toJSON());\r\n\t updating = false;\r\n\t }, 0);\r\n\t }\r\n\t };\r\n\t config.dataSource.data.on('all', scheduleUpdate);\r\n\t }\r\n\t } else if (dataSourceType === 'odata') {\r\n\t pipeProjection('Odata');\r\n\t } else {\r\n\t throw new Error('dataSource.type \"' + config.dataSource.type + '\" is not supported');\r\n\t }\r\n\r\n\t var dataSourceProjection = projection;\r\n\r\n\t pipeProjection('A11y');\r\n\t pipeProjection('Columns');\r\n\t pipeProjection('Map');\r\n\t if (config.aggregate) {\r\n\t pipeProjection('AggregateRow');\r\n\t }\r\n\t pipeProjection('ColumnQueryable');\r\n\t pipeProjection('ColumnI18n');\r\n\t // Todo[hezhan]: deprecated?\r\n\t // if (config.enablePoP) {\r\n\t // pipeProjection('ColumnGroup');\r\n\t // }\r\n\t if (_underscore2.default.has(config.columnShifter, 'totalColumns')) {\r\n\t pipeProjection('ColumnShifter');\r\n\t }\r\n\t pipeProjection('ColumnTemplate');\r\n\t pipeProjection('ColumnHoverText');\r\n\t pipeProjection('PropertyTemplate');\r\n\t if (config.selectable) {\r\n\t pipeProjection('RowIndex');\r\n\t pipeProjection('RowCheckbox');\r\n\t }\r\n\t if (config.rows || config.selectable) {\r\n\t pipeProjection('Row');\r\n\t }\r\n\t if (_underscore2.default.has(config.pageable, 'pageSize')) {\r\n\t pipeProjection('Page');\r\n\t }\r\n\t if (_underscore2.default.find(config.columns, _underscore2.default.property('editable'))) {\r\n\t pipeProjection('Editable');\r\n\t }\r\n\r\n\t (0, _utility.delegateEvents)({\r\n\t from: dataSourceProjection,\r\n\t to: projection,\r\n\t events: ['update:beginning', 'update:finished']\r\n\t });\r\n\r\n\t return projection;\r\n\t });\r\n\t};\r\n\r\n/***/ }),\r\n/* 18 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\t'use strict';\r\n\r\n\tmodule.exports = {\r\n\t A11y: __webpack_require__(19),\r\n\t AggregateRow: __webpack_require__(22),\r\n\t Base: __webpack_require__(20),\r\n\t ColumnI18n: __webpack_require__(23),\r\n\t ColumnQueryable: __webpack_require__(25),\r\n\t ColumnShifter: __webpack_require__(26),\r\n\t ColumnTemplate: __webpack_require__(27),\r\n\t EditableString: __webpack_require__(28),\r\n\t Editable: __webpack_require__(30),\r\n\t JSData: __webpack_require__(39),\r\n\t Map: __webpack_require__(40),\r\n\t MemoryQueryable: __webpack_require__(41),\r\n\t Memory: __webpack_require__(42),\r\n\t Mock: __webpack_require__(43),\r\n\t Odata: __webpack_require__(44),\r\n\t Page: __webpack_require__(45),\r\n\t PropertyTemplate: __webpack_require__(46),\r\n\t RowCheckbox: __webpack_require__(47),\r\n\t Row: __webpack_require__(49),\r\n\t RowTriStateCheckboxProjection: __webpack_require__(50),\r\n\t RowIndex: __webpack_require__(52),\r\n\t Sink: __webpack_require__(53),\r\n\t // Todo[hezhan]: deprecated?\r\n\t // ColumnGroup: require('./column-group'),\r\n\t ColumnHoverText: __webpack_require__(54),\r\n\t Columns: __webpack_require__(55).default\r\n\t};\r\n\r\n/***/ }),\r\n/* 19 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\r\n\r\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(3), __webpack_require__(8), __webpack_require__(20)], __WEBPACK_AMD_DEFINE_RESULT__ = function (_, Backbone, BaseProjection /* , schemaProperties, Response */) {\r\n\t var defaultselectAllLabel = 'Select All';\r\n\t var Model = BaseProjection.extend({\r\n\t defaults: {\r\n\t 'a11y.selection.selectAllLabel': 'Select All'\r\n\t },\r\n\t name: 'a11y',\r\n\t update: function update(options) {\r\n\t var selectAllLabel = this.get('a11y.selection.selectAllLabel');\r\n\t if (Model.__super__.update.call(this, options)) {\r\n\t this.patch({\r\n\t 'a11y.selection.uniqueId': _.uniqueId().concat('-'),\r\n\t 'a11y.selection.selectAllLabel': _.isString(selectAllLabel) ? selectAllLabel : defaultselectAllLabel\r\n\t });\r\n\t }\r\n\t }\r\n\t });\r\n\t return Model;\r\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n\r\n/***/ }),\r\n/* 20 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\r\n\r\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(3), __webpack_require__(8), __webpack_require__(21)], __WEBPACK_AMD_DEFINE_RESULT__ = function (_, Backbone, Response) {\r\n\t var Model = Backbone.Model.extend({\r\n\t initialize: function initialize() {\r\n\t _.bindAll(this, 'onSrcUpdate', 'beforeSet', 'afterSet', 'update');\r\n\t this.data = new Response();\r\n\t this.src = undefined;\r\n\t this.on('change', function (model) {\r\n\t // todo [akamel] the model here is the settings model\r\n\t this.update({ model: model });\r\n\t }.bind(this));\r\n\t },\r\n\r\n\t constructor: function constructor() {\r\n\t // used to figure out which options to set localy and which ones to pass down the pipe\r\n\t this.localKeys = _.keys(this.defaults);\r\n\t // todo [akamel] this might prevent us from overriding initialize\r\n\t Model.__super__.constructor.apply(this, arguments);\r\n\t },\r\n\r\n\t pipe: function pipe(to) {\r\n\t if (to) {\r\n\t to.setSrc(this);\r\n\t }\r\n\r\n\t return to;\r\n\t },\r\n\r\n\t setSrc: function setSrc(src) {\r\n\t this.src = src;\r\n\t if (this.src) {\r\n\t this.src.data.off('change', this.onSrcUpdate);\r\n\t this.src.off('all', this.bubble);\r\n\t }\r\n\r\n\t if (this.src) {\r\n\t this.src.data.on('change', this.onSrcUpdate);\r\n\t this.src.on('all', this.bubble);\r\n\t }\r\n\r\n\t this.update();\r\n\t },\r\n\r\n\t patch: function patch(delta) {\r\n\t var src = this.src ? this.src.data.toJSON() : {};\r\n\t delta = _.isObject(delta) ? delta : {};\r\n\r\n\t if (delta.error) {\r\n\t console.warn(delta.error.stack || delta.error);\r\n\t }\r\n\r\n\t this.data.set(_.defaults(delta, this.attributes, src));\r\n\t },\r\n\r\n\t beforeSet: function beforeSet() /* local, other */{},\r\n\t afterSet: function afterSet() {},\r\n\r\n\t onSrcUpdate: function onSrcUpdate() /* model */{\r\n\t this.update();\r\n\t },\r\n\t bubble: function bubble() {\r\n\t var key = _.first(arguments);\r\n\r\n\t if (_.has(this.events, key)) {\r\n\t var fct = this[this.events[key]];\r\n\t if (_.isFunction(fct)) {\r\n\t fct.apply(this, _.rest(arguments));\r\n\t }\r\n\t }\r\n\r\n\t // todo [akamel] can this result in multiple redraw calls?\r\n\t if (this.src) {\r\n\t this.src.bubble.apply(this.src, _.toArray(arguments));\r\n\t }\r\n\t },\r\n\r\n\t update: function update(options) {\r\n\t options = options || {};\r\n\r\n\t if (this.src) {\r\n\t if (options.deep) {\r\n\t this.src.update(options);\r\n\t return false;\r\n\t }\r\n\r\n\t return true;\r\n\t }\r\n\r\n\t return false;\r\n\t }\r\n\t });\r\n\r\n\t Model.prototype.set = function (key, value, options) {\r\n\t var obj = {};\r\n\r\n\t if (_.isString(key)) {\r\n\t obj[key] = value;\r\n\t } else {\r\n\t obj = key;\r\n\t options = value;\r\n\t }\r\n\r\n\t var local = _.pick(obj, this.localKeys);\r\n\t var other = _.omit(obj, this.localKeys);\r\n\r\n\t this.beforeSet(local, other);\r\n\r\n\t var ret = Model.__super__.set.call(this, local, options);\r\n\r\n\t // todo [akamel] if we set options that span multiple data sources we will trigger change multiple times in the chain??\r\n\t // pass along non-local options\r\n\t if (_.size(other)) {\r\n\t if (this.src) {\r\n\t this.src.set(other, options);\r\n\t }\r\n\t }\r\n\t this.afterSet();\r\n\r\n\t return ret;\r\n\t };\r\n\r\n\t Model.keyRegex = /^([\\w_\\-$]+):(.+)$/;\r\n\r\n\t Model.prototype.get = function (key) {\r\n\t var match = Model.keyRegex.exec(key);\r\n\r\n\t if (match) {\r\n\t var type = match[1];\r\n\t var name = match[2];\r\n\r\n\t switch (type) {\r\n\t case 'projection':\r\n\t {\r\n\t var p = this;\r\n\t do {\r\n\t if (p.name === name) {\r\n\t return p;\r\n\t }\r\n\t p = p.src;\r\n\t } while (p);\r\n\t break;\r\n\t }\r\n\t default:\r\n\t {\r\n\t throw new Error('unknown special get key type');\r\n\t }\r\n\t }\r\n\t } else {\r\n\t var ret = Model.__super__.get.apply(this, arguments);\r\n\r\n\t if (_.isUndefined(ret)) {\r\n\t if (this.src) {\r\n\t ret = this.src.get.apply(this.src, arguments);\r\n\t }\r\n\t }\r\n\r\n\t return ret;\r\n\t }\r\n\t };\r\n\r\n\t return Model;\r\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n\r\n/***/ }),\r\n/* 21 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\r\n\r\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(3), __webpack_require__(8)], __WEBPACK_AMD_DEFINE_RESULT__ = function (_, Backbone) {\r\n\t return Backbone.Model.extend({\r\n\t defaults: {\r\n\t value: [],\r\n\t select: null,\r\n\t count: 0,\r\n\t aggregate: []\r\n\t }\r\n\t });\r\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n\r\n/***/ }),\r\n/* 22 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\r\n\r\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(3), __webpack_require__(8), __webpack_require__(20)], __WEBPACK_AMD_DEFINE_RESULT__ = function (_, Backbone, BaseProjection) {\r\n\t var createRows = function createRows(fn, data) {\r\n\t var rows = fn(data);\r\n\r\n\t _.each(rows, function (row) {\r\n\t row.$metadata = _.extend({}, row.$metadata, { type: 'aggregate' });\r\n\t });\r\n\r\n\t return rows;\r\n\t };\r\n\r\n\t var Model = BaseProjection.extend({\r\n\r\n\t defaults: {\r\n\t 'aggregate.top': null,\r\n\t 'aggregate.bottom': null\r\n\t },\r\n\r\n\t name: 'aggregate-row',\r\n\r\n\t update: function update(options) {\r\n\t var value, topFn, rowTop, bottomFn, rowBottom;\r\n\r\n\t if (Model.__super__.update.call(this, options)) {\r\n\t value = this.src.data.get('value');\r\n\r\n\t if (value) {\r\n\t topFn = this.get('aggregate.top');\r\n\t bottomFn = this.get('aggregate.bottom');\r\n\t rowTop = _.isFunction(topFn) ? createRows(topFn, this.src.data) : null;\r\n\t rowBottom = _.isFunction(bottomFn) ? createRows(bottomFn, this.src.data) : null;\r\n\r\n\t if (rowTop) {\r\n\t value = _.flatten(rowTop).concat(value);\r\n\t }\r\n\r\n\t if (rowBottom) {\r\n\t value = value.concat(_.flatten(rowBottom));\r\n\t }\r\n\r\n\t this.patch({\r\n\t value: value\r\n\t });\r\n\t }\r\n\t }\r\n\t }\r\n\r\n\t });\r\n\r\n\t return Model;\r\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n\r\n/***/ }),\r\n/* 23 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\r\n\r\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(3), __webpack_require__(8), __webpack_require__(20), __webpack_require__(24), __webpack_require__(21)], __WEBPACK_AMD_DEFINE_RESULT__ = function (_, Backbone, BaseProjection /* , schemaProperties, Response */) {\r\n\t var Model = BaseProjection.extend({\r\n\t defaults: {\r\n\t 'column.i18n': {\r\n\t '': function _(name) {\r\n\t return name;\r\n\t }\r\n\t },\r\n\t 'subColumn.i18n': {}\r\n\t },\r\n\t name: 'column-i18n',\r\n\t beforeSet: function beforeSet(local) {\r\n\t if (_.has(local, 'column.i18n')) {\r\n\t if (!_.isObject(local['column.i18n'])) {\r\n\t local['column.i18n'] = this.defaults['column.i18n'];\r\n\t }\r\n\t }\r\n\t },\r\n\t update: function update(options) {\r\n\t // todo [akamel] when calling a deep update; suppress onchange event based updates\r\n\t // Model.__super__.update.call(this, options);\r\n\r\n\t if (Model.__super__.update.call(this, options)) {\r\n\t var model = this.src.data;\r\n\t var colOptions = this.get('column.i18n');\r\n\t var subColOptions = this.get('subColumn.i18n');\r\n\t var columns = model.get('columns') || {};\r\n\t var $default = colOptions[''];\r\n\r\n\t var i18nColumns = {};\r\n\t _.each(_.keys(columns), function (element) {\r\n\t var opt = colOptions[element];\r\n\t if (_.isUndefined(opt)) {\r\n\t opt = $default;\r\n\t }\r\n\r\n\t i18nColumns[element] = _.defaults({\r\n\t $text: _.isFunction(opt) ? opt(element) : opt,\r\n\t property: element\r\n\t }, columns[element]);\r\n\r\n\t i18nColumns[element].config = i18nColumns[element].config || {};\r\n\t i18nColumns[element].config.subColTitle = subColOptions[element];\r\n\t });\r\n\r\n\t this.patch({\r\n\t columns: i18nColumns\r\n\t });\r\n\t } else {\r\n\t // todo [akamel] unset our properties only\r\n\t // this.unset();\r\n\t }\r\n\t }\r\n\t });\r\n\r\n\t return Model;\r\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n\r\n/***/ }),\r\n/* 24 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\r\n\r\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(3)], __WEBPACK_AMD_DEFINE_RESULT__ = function (_) {\r\n\t function from(arr) {\r\n\t var obj = _.first(arr);\r\n\r\n\t return _.keys(obj || {});\r\n\t }\r\n\r\n\t return { from: from };\r\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n\r\n/***/ }),\r\n/* 25 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\r\n\r\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(3), __webpack_require__(8), __webpack_require__(20), __webpack_require__(24), __webpack_require__(21)], __WEBPACK_AMD_DEFINE_RESULT__ = function (_, Backbone, BaseProjection /* , schemaProperties, Response */) {\r\n\t var Model = BaseProjection.extend({\r\n\t defaults: {\r\n\t 'column.skip': 0,\r\n\t 'column.take': Number.MAX_VALUE,\r\n\t 'column.lock': [],\r\n\t 'column.filter': function columnFilter() {\r\n\t return true;\r\n\t },\r\n\t 'column.in': undefined\r\n\t },\r\n\t name: 'column-queryable',\r\n\t update: function update(options) {\r\n\t if (Model.__super__.update.call(this, options)) {\r\n\t var model = this.src.data;\r\n\t var take = this.get('column.take');\r\n\t var skip = this.get('column.skip');\r\n\t var lock = this.get('column.lock') || [];\r\n\t var filter = this.get('column.filter');\r\n\t // todo [akamel] consider renaming to column.select\r\n\t var $in = this.get('column.in');\r\n\t var select = _.size(model.get('columns')) ? _.map(model.get('columns'), function (i) {\r\n\t return i.property;\r\n\t }) : model.get('select');\r\n\t var unlocked = _.isFunction(filter) ? _.filter($in || select, filter) : $in || select;\r\n\t var lookup = model.get('columns');\r\n\t var set = _.chain(unlocked).difference(lock).value();\r\n\t var col = set;\r\n\r\n\t if (!_.isNumber(take)) {\r\n\t take = Number.MAX_VALUE;\r\n\t }\r\n\r\n\t take = Math.max(take - _.size(lock), 0);\r\n\t if (_.size(set) < skip) {\r\n\t skip = 0;\r\n\t // this.set({ 'columns.skip' : 0 }, { silent : true });\r\n\t }\r\n\r\n\t // start query\r\n\t var skipped = _.first(set, skip);\r\n\r\n\t if (skip) {\r\n\t col = _.rest(set, skip);\r\n\t }\r\n\r\n\t var remaining = _.rest(col, take);\r\n\r\n\t col = _.union(lock, _.first(col, take));\r\n\t // end query\r\n\r\n\t _.each(col, function (element) {\r\n\t if (!lookup[element]) {\r\n\t lookup[element] = { property: element };\r\n\t }\r\n\t lookup[element].$lock = _.contains(lock, element);\r\n\t });\r\n\r\n\t this.patch({\r\n\t 'select': col,\r\n\t // todo [akamel] rename to column.in???\r\n\t // , 'columns.select' : set\r\n\t 'columns.skipped': skipped,\r\n\t 'columns.remaining': remaining,\r\n\t // , 'columns.count' : _.size(res)\r\n\t // todo [akamel] do we still need to update skip?\r\n\t 'column.skip': skip\r\n\t });\r\n\t } else {\r\n\t // todo [akamel] unset our properties only\r\n\t // this.unset();\r\n\t }\r\n\t }\r\n\t });\r\n\r\n\t return Model;\r\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n\r\n/***/ }),\r\n/* 26 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\r\n\r\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(3), __webpack_require__(8), __webpack_require__(20), __webpack_require__(24), __webpack_require__(21)], __WEBPACK_AMD_DEFINE_RESULT__ = function (_, Backbone, BaseProjection /* , schemaProperties, Response */) {\r\n\t var Model = BaseProjection.extend({\r\n\t defaults: {},\r\n\t name: 'column-shifter',\r\n\t events: {\r\n\t 'layout:click:header': 'thClick'\r\n\t },\r\n\t update: function update(options) {\r\n\t // todo [akamel] when calling a deep update; suppress onchange event based updates\r\n\t if (Model.__super__.update.call(this, options)) {\r\n\t var model = this.src.data;\r\n\t // todo [akamel] have 'columns' crated at the source so we don't have to put this all over the place\r\n\t var columns = model.get('columns');\r\n\t var select = model.get('select');\r\n\t var colSkipped = model.get('columns.skipped');\r\n\t var colRemaining = model.get('columns.remaining');\r\n\r\n\t var unlockedAt = Math.max(_.findIndex(select, function (col) {\r\n\t return columns[col] && !columns[col].$lock;\r\n\t }), 0);\r\n\r\n\t var hasLess = _.size(colSkipped);\r\n\t var hasMore = _.size(colRemaining);\r\n\r\n\t var colLess = {\r\n\t property: 'column.skip.less',\r\n\t $metadata: {\r\n\t 'attr.head': { class: ['skip-less'] },\r\n\t 'enabled': hasLess\r\n\t },\r\n\t $html: ''\r\n\t };\r\n\t var colMore = {\r\n\t property: 'column.skip.more',\r\n\t $metadata: {\r\n\t 'attr.head': { class: ['skip-more'] },\r\n\t 'enabled': hasMore\r\n\t },\r\n\t $html: ''\r\n\t };\r\n\r\n\t if (!hasLess) {\r\n\t colLess.$metadata['attr.head'].class.push('disabled');\r\n\t }\r\n\r\n\t if (!hasMore) {\r\n\t colMore.$metadata['attr.head'].class.push('disabled');\r\n\t }\r\n\r\n\t select.splice(unlockedAt, 0, colLess.property);\r\n\t columns[colLess.property] = _.defaults(colLess, columns[colLess.property]);\r\n\t select.push(colMore.property);\r\n\t columns[colMore.property] = _.defaults(colMore, columns[colMore.property]);\r\n\r\n\t this.patch({\r\n\t columns: columns,\r\n\t select: select\r\n\t });\r\n\t } else {\r\n\t // todo [akamel] unset our properties only\r\n\t // this.unset();\r\n\t }\r\n\t },\r\n\t thClick: function thClick(e, arg) {\r\n\t if (_.has(arg.column, '$metadata') && arg.column.$metadata.enabled) {\r\n\t var ret = 0;\r\n\t var skip = this.get('column.skip');\r\n\r\n\t // todo [akamel] is this logic solid?\r\n\t switch (arg.property) {\r\n\t case 'column.skip.less':\r\n\t {\r\n\t ret = _.isNumber(skip) ? Math.max(skip - 1, 0) : 0;\r\n\t break;\r\n\t }\r\n\t case 'column.skip.more':\r\n\t {\r\n\t ret = _.isNumber(skip) ? skip + 1 : 0;\r\n\t break;\r\n\t }\r\n\t default:\r\n\t }\r\n\r\n\t this.set({ 'column.skip': ret });\r\n\t }\r\n\t }\r\n\t });\r\n\r\n\t return Model;\r\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n\r\n/***/ }),\r\n/* 27 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\r\n\r\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(3), __webpack_require__(20)], __WEBPACK_AMD_DEFINE_RESULT__ = function (_, BaseProjection) {\r\n\t 'use strict';\r\n\r\n\t var Model = BaseProjection.extend({\r\n\t defaults: {\r\n\t 'column.template': {}\r\n\t },\r\n\t name: 'column-template',\r\n\t update: function update(options) {\r\n\t // todo [akamel] when calling a deep update; suppress onchange event based updates\r\n\t // Model.__super__.update.call(this, options);\r\n\r\n\t // TODO [imang]: columns: ideally we should not need to read from select.\r\n\t if (Model.__super__.update.call(this, options)) {\r\n\t var model = this.src.data;\r\n\t var colTemplate = this.get('column.template');\r\n\t var columns = model.get('columns');\r\n\t _.each(columns, function (item, property) {\r\n\t var ret = _.clone(item);\r\n\t var templateValue = colTemplate[property];\r\n\r\n\t if (_.has(colTemplate, property)) {\r\n\t ret.$html = _.isFunction(templateValue) ? templateValue(ret) : templateValue;\r\n\t }\r\n\r\n\t columns[property] = ret;\r\n\t });\r\n\r\n\t this.patch({ columns: columns });\r\n\t } else {\r\n\t // todo [akamel] unset our properties only\r\n\t // this.unset();\r\n\t }\r\n\t }\r\n\t });\r\n\r\n\t return Model;\r\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n\r\n/***/ }),\r\n/* 28 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\r\n\r\n\t/**\r\n\t *\r\n\t * Important!!!\r\n\t *\r\n\t * The initial check-in is for unblock the simple grid in advanced campaign creation and\r\n\t * may cause bugs if you try to use it with some more complex grid. Please DO NOT use this\r\n\t * projection until we update this and remove the comments here.\r\n\t *\r\n\t * todo [yucongj, wewei] add the model to maintail the input data.\r\n\t *\r\n\t */\r\n\r\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(3), __webpack_require__(7), __webpack_require__(20), __webpack_require__(29)], __WEBPACK_AMD_DEFINE_RESULT__ = function (_, jquery, BaseProjection, editableTemplate) {\r\n\t 'use strict';\r\n\r\n\t var Model = BaseProjection.extend({\r\n\t defaults: {\r\n\t 'column.editable.string': {}\r\n\t },\r\n\t name: 'column-editable-string',\r\n\t update: function update(options) {\r\n\t if (Model.__super__.update.call(this, options)) {\r\n\t var model = this.src.data;\r\n\t var columnEditable = this.get('column.editable.string');\r\n\t var value = _.map(model.get('value'), function (item) {\r\n\t var ret = _.clone(item);\r\n\r\n\t _.each(columnEditable, function (value, key) {\r\n\t if (_.has(ret, key)) {\r\n\t if (!_.isObject(ret[key])) {\r\n\t var obj = new Object(ret[key]); //eslint-disable-line\r\n\r\n\t if (_.isUndefined(ret[key])) {\r\n\t obj.$undefined = true;\r\n\t }\r\n\r\n\t if (_.isNull(ret[key])) {\r\n\t obj.$null = true;\r\n\t }\r\n\r\n\t ret[key] = obj;\r\n\t }\r\n\r\n\t var defaultValue = ret[key].$undefined || ret[key].$null ? value.defaultValue : ret[key];\r\n\r\n\t ret[key].$html = editableTemplate({ defaultValue: defaultValue });\r\n\t }\r\n\t });\r\n\r\n\t return ret;\r\n\t });\r\n\r\n\t this.patch({ value: value });\r\n\t }\r\n\t }\r\n\t });\r\n\r\n\t return Model;\r\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n\r\n/***/ }),\r\n/* 29 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\tvar jade = __webpack_require__(10);\r\n\r\n\tmodule.exports = function template(locals) {\r\n\tvar buf = [];\r\n\tvar jade_mixins = {};\r\n\tvar jade_interp;\r\n\t;var locals_for_with = (locals || {});(function (defaultValue) {\r\n\tbuf.push(\"\");}.call(this,\"defaultValue\" in locals_for_with?locals_for_with.defaultValue:typeof defaultValue!==\"undefined\"?defaultValue:undefined));;return buf.join(\"\");\r\n\t}\r\n\r\n/***/ }),\r\n/* 30 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\r\n\r\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(3), __webpack_require__(7), __webpack_require__(20), __webpack_require__(31), __webpack_require__(32), __webpack_require__(35)], __WEBPACK_AMD_DEFINE_RESULT__ = function (_, $, BaseProjection, defaultEditableTemplate, prompt) {\r\n\t 'use strict';\r\n\r\n\t function isReadonlyRow(item) {\r\n\t return !item || item.$metadata && _.contains(['aggregate', 'segmentation'], item.$metadata.type);\r\n\t }\r\n\r\n\t return BaseProjection.extend({\r\n\t defaults: {\r\n\t 'column.editable': [],\r\n\t 'editable.icon.class': ['glyphicon', 'glyphicon-pencil'],\r\n\t 'editable.tooltip.text': 'Edit',\r\n\t 'editable.template': defaultEditableTemplate\r\n\t },\r\n\t name: 'column-editable',\r\n\t events: {\r\n\t 'layout:click:cell': 'tdClick'\r\n\t },\r\n\r\n\t beforeSet: function beforeSet(local) {\r\n\t var editable = function editable() {\r\n\t return true;\r\n\t };\r\n\r\n\t if (_.has(local, 'column.editable')) {\r\n\t var editableOptions = local['column.editable'];\r\n\t var viewConfig = {};\r\n\t var conditions = {};\r\n\r\n\t if (_.isArray(editableOptions)) {\r\n\t _.each(editableOptions, function (editableColumn) {\r\n\t if (_.isString(editableColumn)) {\r\n\t conditions[editableColumn] = editable;\r\n\t } else if (_.isObject(editableColumn) && _.isString(editableColumn.name)) {\r\n\t conditions[editableColumn.name] = _.isFunction(editableColumn.condition) ? editableColumn.condition : editable;\r\n\t }\r\n\t viewConfig[editableColumn] = null;\r\n\t });\r\n\t } else {\r\n\t _.each(editableOptions, function (options, columnName) {\r\n\t if (_.isFunction(options)) {\r\n\t conditions[columnName] = editable;\r\n\t viewConfig[columnName] = options;\r\n\t } else if (_.isObject(options)) {\r\n\t conditions[columnName] = options.condition;\r\n\t viewConfig[columnName] = options.editor;\r\n\t }\r\n\t });\r\n\t }\r\n\r\n\t this.viewConfig = viewConfig;\r\n\t this.isEditable = function (key, item) {\r\n\t return _.isFunction(conditions[key]) && conditions[key](item);\r\n\t };\r\n\t }\r\n\t },\r\n\r\n\t update: function update(options) {\r\n\t if (BaseProjection.prototype.update.call(this, options)) {\r\n\t var model = this.src.data;\r\n\t var columns = model.get('columns');\r\n\t var iconClasses = this.get('editable.icon.class');\r\n\t var tooltipText = this.get('editable.tooltip.text');\r\n\t var editableTemplate = this.get('editable.template');\r\n\r\n\t _.each(this.viewConfig, function (view, key) {\r\n\t var column = columns[key] || { property: key };\r\n\t var $metadata = column.$metadata = column.$metadata || {};\r\n\t var attrBody = $metadata['attr.body'] = $metadata['attr.body'] || {};\r\n\t var className = attrBody.class || [];\r\n\r\n\t if (_.isString(className)) {\r\n\t className = className.split(/\\s+/);\r\n\t }\r\n\t attrBody.class = _.union(className, ['grid-editable-cell']);\r\n\r\n\t columns[key] = column;\r\n\t });\r\n\r\n\t var value = _.map(model.get('value'), function (item) {\r\n\t return isReadonlyRow(item) ? item : _.mapObject(item, function (value, key) {\r\n\t if (this.isEditable(key, item)) {\r\n\t var $html = null;\r\n\t var text = null;\r\n\r\n\t if (_.isObject(value)) {\r\n\t $html = value.$html;\r\n\t } else {\r\n\t text = value;\r\n\t value = {};\r\n\t }\r\n\r\n\t value.$html = editableTemplate({\r\n\t $html: $html,\r\n\t text: text,\r\n\t tooltipText: tooltipText,\r\n\t classes: iconClasses\r\n\t });\r\n\t }\r\n\t return value;\r\n\t }, this);\r\n\t }, this);\r\n\r\n\t this.patch({ value: value });\r\n\t }\r\n\t },\r\n\r\n\t tdClick: function tdClick(e, arg) {\r\n\t var _this = this;\r\n\r\n\t var schema = null;\r\n\t var metadata = arg.column.$metadata;\r\n\t // TODO: wewei\r\n\t // let's rethink this\r\n\t var property = metadata && metadata.map || arg.property;\r\n\r\n\t if (!isReadonlyRow(arg.model) && this.isEditable(arg.property, arg.model) && e.target.tagName !== 'A' && $(e.target).closest('.is-not-trigger').length === 0) {\r\n\t schema = arg.grid.options.get('schema');\r\n\t var editor = this.viewConfig[arg.property] || prompt;\r\n\t var position = arg.grid.layout.container.offset(e.currentTarget);\r\n\t var $td = $(e.currentTarget);\r\n\r\n\t position.right = position.left + $td.outerWidth();\r\n\t position.bottom = position.top + $td.outerHeight();\r\n\t editor({\r\n\t model: arg.model,\r\n\t schema: schema,\r\n\t position: position,\r\n\t property: property,\r\n\t onSubmit: function onSubmit(model) {\r\n\t _this.trigger('edit', model, property);\r\n\t }\r\n\t });\r\n\t }\r\n\t }\r\n\r\n\t });\r\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n\r\n/***/ }),\r\n/* 31 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\tvar jade = __webpack_require__(10);\r\n\r\n\tmodule.exports = function template(locals) {\r\n\tvar buf = [];\r\n\tvar jade_mixins = {};\r\n\tvar jade_interp;\r\n\t;var locals_for_with = (locals || {});(function ($html, classes, text, tooltipText) {\r\n\tbuf.push(\"\" + (null == (jade_interp = $html) ? \"\" : jade_interp) + (jade.escape(null == (jade_interp = text) ? \"\" : jade_interp)));}.call(this,\"$html\" in locals_for_with?locals_for_with.$html:typeof $html!==\"undefined\"?$html:undefined,\"classes\" in locals_for_with?locals_for_with.classes:typeof classes!==\"undefined\"?classes:undefined,\"text\" in locals_for_with?locals_for_with.text:typeof text!==\"undefined\"?text:undefined,\"tooltipText\" in locals_for_with?locals_for_with.tooltipText:typeof tooltipText!==\"undefined\"?tooltipText:undefined));;return buf.join(\"\");\r\n\t}\r\n\r\n/***/ }),\r\n/* 32 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\tvar __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;'use strict';\r\n\r\n\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__(7), __webpack_require__(33), __webpack_require__(8), __webpack_require__(3), __webpack_require__(34)], __WEBPACK_AMD_DEFINE_RESULT__ = function ($, Promise, Backbone, _, template) {\r\n\t var PopupEditor = Backbone.View.extend({\r\n\t events: {\r\n\t 'click .save': function clickSave() {\r\n\t this.trigger('save', this.model);\r\n\t },\r\n\t 'click .cancel': function clickCancel() {\r\n\t this.trigger('cancel');\r\n\t },\r\n\t 'change .editor': function changeEditor(e) {\r\n\t this.setValue(e.target.value);\r\n\t },\r\n\t 'click form': function clickForm(e) {\r\n\t e.stopPropagation();\r\n\t },\r\n\t 'submit form': function submitForm() {\r\n\t this.trigger('save', this.model);\r\n\t return false;\r\n\t }\r\n\t },\r\n\r\n\t initialize: function initialize(options) {\r\n\t this.position = options.position;\r\n\t this.model = options.model;\r\n\t this.property = options.property;\r\n\t this.saveButtonText = options.saveButtonText || 'Save';\r\n\t this.cancelButtonText = options.cancelButtonText || 'Cancel';\r\n\t },\r\n\r\n\t getValue: function getValue() {\r\n\t if (this.property && _.isObject(this.property)) {\r\n\t var _property = this.property,\r\n\t name = _property.name,\r\n\t value = _property.value;\r\n\r\n\t return value(this.model)[name];\r\n\t }\r\n\r\n\t return (this.model || {})[this.property];\r\n\t },\r\n\r\n\t setValue: function setValue(val) {\r\n\t if (this.property && _.isObject(this.property)) {\r\n\t var _property2 = this.property,\r\n\t name = _property2.name,\r\n\t value = _property2.value;\r\n\r\n\t value(this.model)[name] = val;\r\n\t } else {\r\n\t this.model[this.property] = val;\r\n\t }\r\n\t },\r\n\r\n\t render: function render() {\r\n\t var _this = this;\r\n\r\n\t var val = this.getValue();\r\n\r\n\t this.$el.html(template({\r\n\t value: val,\r\n\t saveButtonText: this.saveButtonText,\r\n\t cancelButtonText: this.cancelButtonText\r\n\t }));\r\n\t this.$el.css({ position: 'absolute' });\r\n\r\n\t if (this.position.left) {\r\n\t this.$el.css({ left: this.position.left });\r\n\t } else {\r\n\t this.$el.css({ right: this.position.right });\r\n\t }\r\n\t if (this.position.top) {\r\n\t this.$el.css({ top: this.position.top });\r\n\t } else {\r\n\t this.$el.css({ bottom: this.position.bottom });\r\n\t }\r\n\r\n\t this.dismiss = function () {\r\n\t this.trigger('cancel');\r\n\t }.bind(this);\r\n\r\n\t window.setTimeout(function () {\r\n\t $(window).on('click', _this.dismiss);\r\n\t }, 0);\r\n\r\n\t return this;\r\n\t },\r\n\r\n\t remove: function remove() {\r\n\t $(window).off('click', this.dismiss);\r\n\t Backbone.View.prototype.remove.apply(this, arguments);\r\n\t },\r\n\r\n\t focus: function focus() {\r\n\t var input = this.$el.find('.editor');\r\n\t input.select();\r\n\t }\r\n\r\n\t });\r\n\r\n\t return function (options) {\r\n\t var editor = new PopupEditor(options);\r\n\r\n\t document.body.appendChild(editor.render().el);\r\n\r\n\t editor.focus();\r\n\r\n\t editor.on('save', function (model) {\r\n\t editor.remove();\r\n\t options.onSubmit && options.onSubmit(model);\r\n\t });\r\n\r\n\t editor.on('cancel', function () {\r\n\t editor.remove();\r\n\t options.onCancel && options.onCancel();\r\n\t });\r\n\t };\r\n\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\r\n\r\n/***/ }),\r\n/* 33 */\r\n/***/ (function(module, exports) {\r\n\r\n\tmodule.exports = __WEBPACK_EXTERNAL_MODULE_33__;\r\n\r\n/***/ }),\r\n/* 34 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\tvar jade = __webpack_require__(10);\r\n\r\n\tmodule.exports = function template(locals) {\r\n\tvar buf = [];\r\n\tvar jade_mixins = {};\r\n\tvar jade_interp;\r\n\t;var locals_for_with = (locals || {});(function (cancelButtonText, saveButtonText, value) {\r\n\tbuf.push(\"\");}.call(this,\"cancelButtonText\" in locals_for_with?locals_for_with.cancelButtonText:typeof cancelButtonText!==\"undefined\"?cancelButtonText:undefined,\"saveButtonText\" in locals_for_with?locals_for_with.saveButtonText:typeof saveButtonText!==\"undefined\"?saveButtonText:undefined,\"value\" in locals_for_with?locals_for_with.value:typeof value!==\"undefined\"?value:undefined));;return buf.join(\"\");\r\n\t}\r\n\r\n/***/ }),\r\n/* 35 */\r\n/***/ (function(module, exports, __webpack_require__) {\r\n\r\n\t// style-loader: Adds some css to the DOM by adding a