Server IP : 66.29.132.124 / Your IP : 3.145.32.238 Web Server : LiteSpeed System : Linux business141.web-hosting.com 4.18.0-553.lve.el8.x86_64 #1 SMP Mon May 27 15:27:34 UTC 2024 x86_64 User : wavevlvu ( 1524) PHP Version : 7.4.33 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /home/wavevlvu/book24.ng/public/libs/tui.calendar/ |
Upload File : |
/*! * TOAST UI Calendar * @version 1.12.1 | Fri May 31 2019 * @author NHN FE Development Lab <dl_javascript@nhn.com> * @license MIT */ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(require("tui-code-snippet"), require("tui-date-picker")); else if(typeof define === 'function' && define.amd) define(["tui-code-snippet", "tui-date-picker"], factory); else if(typeof exports === 'object') exports["Calendar"] = factory(require("tui-code-snippet"), require("tui-date-picker")); else root["tui"] = root["tui"] || {}, root["tui"]["Calendar"] = factory((root["tui"] && root["tui"]["util"]), (root["tui"] && root["tui"]["DatePicker"])); })(window, function(__WEBPACK_EXTERNAL_MODULE_tui_code_snippet__, __WEBPACK_EXTERNAL_MODULE_tui_date_picker__) { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); /******/ } /******/ }; /******/ /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ /******/ // create a fake namespace object /******/ // mode & 1: value is a module id, require it /******/ // mode & 2: merge all properties of value into the ns /******/ // mode & 4: return value when already ns object /******/ // mode & 8|1: behave like require /******/ __webpack_require__.t = function(value, mode) { /******/ if(mode & 1) value = __webpack_require__(value); /******/ if(mode & 8) return value; /******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; /******/ var ns = Object.create(null); /******/ __webpack_require__.r(ns); /******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); /******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); /******/ return ns; /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = "/dist"; /******/ /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = "./src/index.js"); /******/ }) /************************************************************************/ /******/ ({ /***/ "./node_modules/handlebars-template-loader/runtime/index.js": /*!******************************************************************!*\ !*** ./node_modules/handlebars-template-loader/runtime/index.js ***! \******************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { module.exports = __webpack_require__(/*! handlebars/runtime */ "./node_modules/handlebars/runtime.js"); /***/ }), /***/ "./node_modules/handlebars/dist/cjs/handlebars.runtime.js": /*!****************************************************************!*\ !*** ./node_modules/handlebars/dist/cjs/handlebars.runtime.js ***! \****************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; // istanbul ignore next function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } // istanbul ignore next function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } var _handlebarsBase = __webpack_require__(/*! ./handlebars/base */ "./node_modules/handlebars/dist/cjs/handlebars/base.js"); var base = _interopRequireWildcard(_handlebarsBase); // Each of these augment the Handlebars object. No need to setup here. // (This is done to easily share code between commonjs and browse envs) var _handlebarsSafeString = __webpack_require__(/*! ./handlebars/safe-string */ "./node_modules/handlebars/dist/cjs/handlebars/safe-string.js"); var _handlebarsSafeString2 = _interopRequireDefault(_handlebarsSafeString); var _handlebarsException = __webpack_require__(/*! ./handlebars/exception */ "./node_modules/handlebars/dist/cjs/handlebars/exception.js"); var _handlebarsException2 = _interopRequireDefault(_handlebarsException); var _handlebarsUtils = __webpack_require__(/*! ./handlebars/utils */ "./node_modules/handlebars/dist/cjs/handlebars/utils.js"); var Utils = _interopRequireWildcard(_handlebarsUtils); var _handlebarsRuntime = __webpack_require__(/*! ./handlebars/runtime */ "./node_modules/handlebars/dist/cjs/handlebars/runtime.js"); var runtime = _interopRequireWildcard(_handlebarsRuntime); var _handlebarsNoConflict = __webpack_require__(/*! ./handlebars/no-conflict */ "./node_modules/handlebars/dist/cjs/handlebars/no-conflict.js"); var _handlebarsNoConflict2 = _interopRequireDefault(_handlebarsNoConflict); // For compatibility and usage outside of module systems, make the Handlebars object a namespace function create() { var hb = new base.HandlebarsEnvironment(); Utils.extend(hb, base); hb.SafeString = _handlebarsSafeString2['default']; hb.Exception = _handlebarsException2['default']; hb.Utils = Utils; hb.escapeExpression = Utils.escapeExpression; hb.VM = runtime; hb.template = function (spec) { return runtime.template(spec, hb); }; return hb; } var inst = create(); inst.create = create; _handlebarsNoConflict2['default'](inst); inst['default'] = inst; exports['default'] = inst; module.exports = exports['default']; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9oYW5kbGViYXJzLnJ1bnRpbWUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OEJBQXNCLG1CQUFtQjs7SUFBN0IsSUFBSTs7Ozs7b0NBSU8sMEJBQTBCOzs7O21DQUMzQix3QkFBd0I7Ozs7K0JBQ3ZCLG9CQUFvQjs7SUFBL0IsS0FBSzs7aUNBQ1Esc0JBQXNCOztJQUFuQyxPQUFPOztvQ0FFSSwwQkFBMEI7Ozs7O0FBR2pELFNBQVMsTUFBTSxHQUFHO0FBQ2hCLE1BQUksRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7O0FBRTFDLE9BQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3ZCLElBQUUsQ0FBQyxVQUFVLG9DQUFhLENBQUM7QUFDM0IsSUFBRSxDQUFDLFNBQVMsbUNBQVksQ0FBQztBQUN6QixJQUFFLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNqQixJQUFFLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDOztBQUU3QyxJQUFFLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQztBQUNoQixJQUFFLENBQUMsUUFBUSxHQUFHLFVBQVMsSUFBSSxFQUFFO0FBQzNCLFdBQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7R0FDbkMsQ0FBQzs7QUFFRixTQUFPLEVBQUUsQ0FBQztDQUNYOztBQUVELElBQUksSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDO0FBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDOztBQUVyQixrQ0FBVyxJQUFJLENBQUMsQ0FBQzs7QUFFakIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQzs7cUJBRVIsSUFBSSIsImZpbGUiOiJoYW5kbGViYXJzLnJ1bnRpbWUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBiYXNlIGZyb20gJy4vaGFuZGxlYmFycy9iYXNlJztcblxuLy8gRWFjaCBvZiB0aGVzZSBhdWdtZW50IHRoZSBIYW5kbGViYXJzIG9iamVjdC4gTm8gbmVlZCB0byBzZXR1cCBoZXJlLlxuLy8gKFRoaXMgaXMgZG9uZSB0byBlYXNpbHkgc2hhcmUgY29kZSBiZXR3ZWVuIGNvbW1vbmpzIGFuZCBicm93c2UgZW52cylcbmltcG9ydCBTYWZlU3RyaW5nIGZyb20gJy4vaGFuZGxlYmFycy9zYWZlLXN0cmluZyc7XG5pbXBvcnQgRXhjZXB0aW9uIGZyb20gJy4vaGFuZGxlYmFycy9leGNlcHRpb24nO1xuaW1wb3J0ICogYXMgVXRpbHMgZnJvbSAnLi9oYW5kbGViYXJzL3V0aWxzJztcbmltcG9ydCAqIGFzIHJ1bnRpbWUgZnJvbSAnLi9oYW5kbGViYXJzL3J1bnRpbWUnO1xuXG5pbXBvcnQgbm9Db25mbGljdCBmcm9tICcuL2hhbmRsZWJhcnMvbm8tY29uZmxpY3QnO1xuXG4vLyBGb3IgY29tcGF0aWJpbGl0eSBhbmQgdXNhZ2Ugb3V0c2lkZSBvZiBtb2R1bGUgc3lzdGVtcywgbWFrZSB0aGUgSGFuZGxlYmFycyBvYmplY3QgYSBuYW1lc3BhY2VcbmZ1bmN0aW9uIGNyZWF0ZSgpIHtcbiAgbGV0IGhiID0gbmV3IGJhc2UuSGFuZGxlYmFyc0Vudmlyb25tZW50KCk7XG5cbiAgVXRpbHMuZXh0ZW5kKGhiLCBiYXNlKTtcbiAgaGIuU2FmZVN0cmluZyA9IFNhZmVTdHJpbmc7XG4gIGhiLkV4Y2VwdGlvbiA9IEV4Y2VwdGlvbjtcbiAgaGIuVXRpbHMgPSBVdGlscztcbiAgaGIuZXNjYXBlRXhwcmVzc2lvbiA9IFV0aWxzLmVzY2FwZUV4cHJlc3Npb247XG5cbiAgaGIuVk0gPSBydW50aW1lO1xuICBoYi50ZW1wbGF0ZSA9IGZ1bmN0aW9uKHNwZWMpIHtcbiAgICByZXR1cm4gcnVudGltZS50ZW1wbGF0ZShzcGVjLCBoYik7XG4gIH07XG5cbiAgcmV0dXJuIGhiO1xufVxuXG5sZXQgaW5zdCA9IGNyZWF0ZSgpO1xuaW5zdC5jcmVhdGUgPSBjcmVhdGU7XG5cbm5vQ29uZmxpY3QoaW5zdCk7XG5cbmluc3RbJ2RlZmF1bHQnXSA9IGluc3Q7XG5cbmV4cG9ydCBkZWZhdWx0IGluc3Q7XG4iXX0= /***/ }), /***/ "./node_modules/handlebars/dist/cjs/handlebars/base.js": /*!*************************************************************!*\ !*** ./node_modules/handlebars/dist/cjs/handlebars/base.js ***! \*************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.HandlebarsEnvironment = HandlebarsEnvironment; // istanbul ignore next function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _utils = __webpack_require__(/*! ./utils */ "./node_modules/handlebars/dist/cjs/handlebars/utils.js"); var _exception = __webpack_require__(/*! ./exception */ "./node_modules/handlebars/dist/cjs/handlebars/exception.js"); var _exception2 = _interopRequireDefault(_exception); var _helpers = __webpack_require__(/*! ./helpers */ "./node_modules/handlebars/dist/cjs/handlebars/helpers.js"); var _decorators = __webpack_require__(/*! ./decorators */ "./node_modules/handlebars/dist/cjs/handlebars/decorators.js"); var _logger = __webpack_require__(/*! ./logger */ "./node_modules/handlebars/dist/cjs/handlebars/logger.js"); var _logger2 = _interopRequireDefault(_logger); var VERSION = '4.0.11'; exports.VERSION = VERSION; var COMPILER_REVISION = 7; exports.COMPILER_REVISION = COMPILER_REVISION; var REVISION_CHANGES = { 1: '<= 1.0.rc.2', // 1.0.rc.2 is actually rev2 but doesn't report it 2: '== 1.0.0-rc.3', 3: '== 1.0.0-rc.4', 4: '== 1.x.x', 5: '== 2.0.0-alpha.x', 6: '>= 2.0.0-beta.1', 7: '>= 4.0.0' }; exports.REVISION_CHANGES = REVISION_CHANGES; var objectType = '[object Object]'; function HandlebarsEnvironment(helpers, partials, decorators) { this.helpers = helpers || {}; this.partials = partials || {}; this.decorators = decorators || {}; _helpers.registerDefaultHelpers(this); _decorators.registerDefaultDecorators(this); } HandlebarsEnvironment.prototype = { constructor: HandlebarsEnvironment, logger: _logger2['default'], log: _logger2['default'].log, registerHelper: function registerHelper(name, fn) { if (_utils.toString.call(name) === objectType) { if (fn) { throw new _exception2['default']('Arg not supported with multiple helpers'); } _utils.extend(this.helpers, name); } else { this.helpers[name] = fn; } }, unregisterHelper: function unregisterHelper(name) { delete this.helpers[name]; }, registerPartial: function registerPartial(name, partial) { if (_utils.toString.call(name) === objectType) { _utils.extend(this.partials, name); } else { if (typeof partial === 'undefined') { throw new _exception2['default']('Attempting to register a partial called "' + name + '" as undefined'); } this.partials[name] = partial; } }, unregisterPartial: function unregisterPartial(name) { delete this.partials[name]; }, registerDecorator: function registerDecorator(name, fn) { if (_utils.toString.call(name) === objectType) { if (fn) { throw new _exception2['default']('Arg not supported with multiple decorators'); } _utils.extend(this.decorators, name); } else { this.decorators[name] = fn; } }, unregisterDecorator: function unregisterDecorator(name) { delete this.decorators[name]; } }; var log = _logger2['default'].log; exports.log = log; exports.createFrame = _utils.createFrame; exports.logger = _logger2['default']; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2Jhc2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7cUJBQTRDLFNBQVM7O3lCQUMvQixhQUFhOzs7O3VCQUNFLFdBQVc7OzBCQUNSLGNBQWM7O3NCQUNuQyxVQUFVOzs7O0FBRXRCLElBQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQzs7QUFDekIsSUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7OztBQUU1QixJQUFNLGdCQUFnQixHQUFHO0FBQzlCLEdBQUMsRUFBRSxhQUFhO0FBQ2hCLEdBQUMsRUFBRSxlQUFlO0FBQ2xCLEdBQUMsRUFBRSxlQUFlO0FBQ2xCLEdBQUMsRUFBRSxVQUFVO0FBQ2IsR0FBQyxFQUFFLGtCQUFrQjtBQUNyQixHQUFDLEVBQUUsaUJBQWlCO0FBQ3BCLEdBQUMsRUFBRSxVQUFVO0NBQ2QsQ0FBQzs7O0FBRUYsSUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUM7O0FBRTlCLFNBQVMscUJBQXFCLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUU7QUFDbkUsTUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLElBQUksRUFBRSxDQUFDO0FBQzdCLE1BQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxJQUFJLEVBQUUsQ0FBQztBQUMvQixNQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsSUFBSSxFQUFFLENBQUM7O0FBRW5DLGtDQUF1QixJQUFJLENBQUMsQ0FBQztBQUM3Qix3Q0FBMEIsSUFBSSxDQUFDLENBQUM7Q0FDakM7O0FBRUQscUJBQXFCLENBQUMsU0FBUyxHQUFHO0FBQ2hDLGFBQVcsRUFBRSxxQkFBcUI7O0FBRWxDLFFBQU0scUJBQVE7QUFDZCxLQUFHLEVBQUUsb0JBQU8sR0FBRzs7QUFFZixnQkFBYyxFQUFFLHdCQUFTLElBQUksRUFBRSxFQUFFLEVBQUU7QUFDakMsUUFBSSxnQkFBUyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssVUFBVSxFQUFFO0FBQ3RDLFVBQUksRUFBRSxFQUFFO0FBQUUsY0FBTSwyQkFBYyx5Q0FBeUMsQ0FBQyxDQUFDO09BQUU7QUFDM0Usb0JBQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztLQUM1QixNQUFNO0FBQ0wsVUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7S0FDekI7R0FDRjtBQUNELGtCQUFnQixFQUFFLDBCQUFTLElBQUksRUFBRTtBQUMvQixXQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7R0FDM0I7O0FBRUQsaUJBQWUsRUFBRSx5QkFBUyxJQUFJLEVBQUUsT0FBTyxFQUFFO0FBQ3ZDLFFBQUksZ0JBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLFVBQVUsRUFBRTtBQUN0QyxvQkFBTyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQzdCLE1BQU07QUFDTCxVQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsRUFBRTtBQUNsQyxjQUFNLHlFQUEwRCxJQUFJLG9CQUFpQixDQUFDO09BQ3ZGO0FBQ0QsVUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUM7S0FDL0I7R0FDRjtBQUNELG1CQUFpQixFQUFFLDJCQUFTLElBQUksRUFBRTtBQUNoQyxXQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7R0FDNUI7O0FBRUQsbUJBQWlCLEVBQUUsMkJBQVMsSUFBSSxFQUFFLEVBQUUsRUFBRTtBQUNwQyxRQUFJLGdCQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxVQUFVLEVBQUU7QUFDdEMsVUFBSSxFQUFFLEVBQUU7QUFBRSxjQUFNLDJCQUFjLDRDQUE0QyxDQUFDLENBQUM7T0FBRTtBQUM5RSxvQkFBTyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQy9CLE1BQU07QUFDTCxVQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztLQUM1QjtHQUNGO0FBQ0QscUJBQW1CLEVBQUUsNkJBQVMsSUFBSSxFQUFFO0FBQ2xDLFdBQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztHQUM5QjtDQUNGLENBQUM7O0FBRUssSUFBSSxHQUFHLEdBQUcsb0JBQU8sR0FBRyxDQUFDOzs7UUFFcEIsV0FBVztRQUFFLE1BQU0iLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Y3JlYXRlRnJhbWUsIGV4dGVuZCwgdG9TdHJpbmd9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IEV4Y2VwdGlvbiBmcm9tICcuL2V4Y2VwdGlvbic7XG5pbXBvcnQge3JlZ2lzdGVyRGVmYXVsdEhlbHBlcnN9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge3JlZ2lzdGVyRGVmYXVsdERlY29yYXRvcnN9IGZyb20gJy4vZGVjb3JhdG9ycyc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcblxuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSAnNC4wLjExJztcbmV4cG9ydCBjb25zdCBDT01QSUxFUl9SRVZJU0lPTiA9IDc7XG5cbmV4cG9ydCBjb25zdCBSRVZJU0lPTl9DSEFOR0VTID0ge1xuICAxOiAnPD0gMS4wLnJjLjInLCAvLyAxLjAucmMuMiBpcyBhY3R1YWxseSByZXYyIGJ1dCBkb2Vzbid0IHJlcG9ydCBpdFxuICAyOiAnPT0gMS4wLjAtcmMuMycsXG4gIDM6ICc9PSAxLjAuMC1yYy40JyxcbiAgNDogJz09IDEueC54JyxcbiAgNTogJz09IDIuMC4wLWFscGhhLngnLFxuICA2OiAnPj0gMi4wLjAtYmV0YS4xJyxcbiAgNzogJz49IDQuMC4wJ1xufTtcblxuY29uc3Qgb2JqZWN0VHlwZSA9ICdbb2JqZWN0IE9iamVjdF0nO1xuXG5leHBvcnQgZnVuY3Rpb24gSGFuZGxlYmFyc0Vudmlyb25tZW50KGhlbHBlcnMsIHBhcnRpYWxzLCBkZWNvcmF0b3JzKSB7XG4gIHRoaXMuaGVscGVycyA9IGhlbHBlcnMgfHwge307XG4gIHRoaXMucGFydGlhbHMgPSBwYXJ0aWFscyB8fCB7fTtcbiAgdGhpcy5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycyB8fCB7fTtcblxuICByZWdpc3RlckRlZmF1bHRIZWxwZXJzKHRoaXMpO1xuICByZWdpc3RlckRlZmF1bHREZWNvcmF0b3JzKHRoaXMpO1xufVxuXG5IYW5kbGViYXJzRW52aXJvbm1lbnQucHJvdG90eXBlID0ge1xuICBjb25zdHJ1Y3RvcjogSGFuZGxlYmFyc0Vudmlyb25tZW50LFxuXG4gIGxvZ2dlcjogbG9nZ2VyLFxuICBsb2c6IGxvZ2dlci5sb2csXG5cbiAgcmVnaXN0ZXJIZWxwZXI6IGZ1bmN0aW9uKG5hbWUsIGZuKSB7XG4gICAgaWYgKHRvU3RyaW5nLmNhbGwobmFtZSkgPT09IG9iamVjdFR5cGUpIHtcbiAgICAgIGlmIChmbikgeyB0aHJvdyBuZXcgRXhjZXB0aW9uKCdBcmcgbm90IHN1cHBvcnRlZCB3aXRoIG11bHRpcGxlIGhlbHBlcnMnKTsgfVxuICAgICAgZXh0ZW5kKHRoaXMuaGVscGVycywgbmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGVscGVyc1tuYW1lXSA9IGZuO1xuICAgIH1cbiAgfSxcbiAgdW5yZWdpc3RlckhlbHBlcjogZnVuY3Rpb24obmFtZSkge1xuICAgIGRlbGV0ZSB0aGlzLmhlbHBlcnNbbmFtZV07XG4gIH0sXG5cbiAgcmVnaXN0ZXJQYXJ0aWFsOiBmdW5jdGlvbihuYW1lLCBwYXJ0aWFsKSB7XG4gICAgaWYgKHRvU3RyaW5nLmNhbGwobmFtZSkgPT09IG9iamVjdFR5cGUpIHtcbiAgICAgIGV4dGVuZCh0aGlzLnBhcnRpYWxzLCBuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiBwYXJ0aWFsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKGBBdHRlbXB0aW5nIHRvIHJlZ2lzdGVyIGEgcGFydGlhbCBjYWxsZWQgXCIke25hbWV9XCIgYXMgdW5kZWZpbmVkYCk7XG4gICAgICB9XG4gICAgICB0aGlzLnBhcnRpYWxzW25hbWVdID0gcGFydGlhbDtcbiAgICB9XG4gIH0sXG4gIHVucmVnaXN0ZXJQYXJ0aWFsOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgZGVsZXRlIHRoaXMucGFydGlhbHNbbmFtZV07XG4gIH0sXG5cbiAgcmVnaXN0ZXJEZWNvcmF0b3I6IGZ1bmN0aW9uKG5hbWUsIGZuKSB7XG4gICAgaWYgKHRvU3RyaW5nLmNhbGwobmFtZSkgPT09IG9iamVjdFR5cGUpIHtcbiAgICAgIGlmIChmbikgeyB0aHJvdyBuZXcgRXhjZXB0aW9uKCdBcmcgbm90IHN1cHBvcnRlZCB3aXRoIG11bHRpcGxlIGRlY29yYXRvcnMnKTsgfVxuICAgICAgZXh0ZW5kKHRoaXMuZGVjb3JhdG9ycywgbmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGVjb3JhdG9yc1tuYW1lXSA9IGZuO1xuICAgIH1cbiAgfSxcbiAgdW5yZWdpc3RlckRlY29yYXRvcjogZnVuY3Rpb24obmFtZSkge1xuICAgIGRlbGV0ZSB0aGlzLmRlY29yYXRvcnNbbmFtZV07XG4gIH1cbn07XG5cbmV4cG9ydCBsZXQgbG9nID0gbG9nZ2VyLmxvZztcblxuZXhwb3J0IHtjcmVhdGVGcmFtZSwgbG9nZ2VyfTtcbiJdfQ== /***/ }), /***/ "./node_modules/handlebars/dist/cjs/handlebars/decorators.js": /*!*******************************************************************!*\ !*** ./node_modules/handlebars/dist/cjs/handlebars/decorators.js ***! \*******************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.registerDefaultDecorators = registerDefaultDecorators; // istanbul ignore next function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _decoratorsInline = __webpack_require__(/*! ./decorators/inline */ "./node_modules/handlebars/dist/cjs/handlebars/decorators/inline.js"); var _decoratorsInline2 = _interopRequireDefault(_decoratorsInline); function registerDefaultDecorators(instance) { _decoratorsInline2['default'](instance); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2RlY29yYXRvcnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Z0NBQTJCLHFCQUFxQjs7OztBQUV6QyxTQUFTLHlCQUF5QixDQUFDLFFBQVEsRUFBRTtBQUNsRCxnQ0FBZSxRQUFRLENBQUMsQ0FBQztDQUMxQiIsImZpbGUiOiJkZWNvcmF0b3JzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHJlZ2lzdGVySW5saW5lIGZyb20gJy4vZGVjb3JhdG9ycy9pbmxpbmUnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJEZWZhdWx0RGVjb3JhdG9ycyhpbnN0YW5jZSkge1xuICByZWdpc3RlcklubGluZShpbnN0YW5jZSk7XG59XG5cbiJdfQ== /***/ }), /***/ "./node_modules/handlebars/dist/cjs/handlebars/decorators/inline.js": /*!**************************************************************************!*\ !*** ./node_modules/handlebars/dist/cjs/handlebars/decorators/inline.js ***! \**************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; var _utils = __webpack_require__(/*! ../utils */ "./node_modules/handlebars/dist/cjs/handlebars/utils.js"); exports['default'] = function (instance) { instance.registerDecorator('inline', function (fn, props, container, options) { var ret = fn; if (!props.partials) { props.partials = {}; ret = function (context, options) { // Create a new partials stack frame prior to exec. var original = container.partials; container.partials = _utils.extend({}, original, props.partials); var ret = fn(context, options); container.partials = original; return ret; }; } props.partials[options.args[0]] = options.fn; return ret; }); }; module.exports = exports['default']; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2RlY29yYXRvcnMvaW5saW5lLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7cUJBQXFCLFVBQVU7O3FCQUVoQixVQUFTLFFBQVEsRUFBRTtBQUNoQyxVQUFRLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLFVBQVMsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFO0FBQzNFLFFBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztBQUNiLFFBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFO0FBQ25CLFdBQUssQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0FBQ3BCLFNBQUcsR0FBRyxVQUFTLE9BQU8sRUFBRSxPQUFPLEVBQUU7O0FBRS9CLFlBQUksUUFBUSxHQUFHLFNBQVMsQ0FBQyxRQUFRLENBQUM7QUFDbEMsaUJBQVMsQ0FBQyxRQUFRLEdBQUcsY0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMxRCxZQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQy9CLGlCQUFTLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztBQUM5QixlQUFPLEdBQUcsQ0FBQztPQUNaLENBQUM7S0FDSDs7QUFFRCxTQUFLLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDOztBQUU3QyxXQUFPLEdBQUcsQ0FBQztHQUNaLENBQUMsQ0FBQztDQUNKIiwiZmlsZSI6ImlubGluZS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7ZXh0ZW5kfSBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnJlZ2lzdGVyRGVjb3JhdG9yKCdpbmxpbmUnLCBmdW5jdGlvbihmbiwgcHJvcHMsIGNvbnRhaW5lciwgb3B0aW9ucykge1xuICAgIGxldCByZXQgPSBmbjtcbiAgICBpZiAoIXByb3BzLnBhcnRpYWxzKSB7XG4gICAgICBwcm9wcy5wYXJ0aWFscyA9IHt9O1xuICAgICAgcmV0ID0gZnVuY3Rpb24oY29udGV4dCwgb3B0aW9ucykge1xuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgcGFydGlhbHMgc3RhY2sgZnJhbWUgcHJpb3IgdG8gZXhlYy5cbiAgICAgICAgbGV0IG9yaWdpbmFsID0gY29udGFpbmVyLnBhcnRpYWxzO1xuICAgICAgICBjb250YWluZXIucGFydGlhbHMgPSBleHRlbmQoe30sIG9yaWdpbmFsLCBwcm9wcy5wYXJ0aWFscyk7XG4gICAgICAgIGxldCByZXQgPSBmbihjb250ZXh0LCBvcHRpb25zKTtcbiAgICAgICAgY29udGFpbmVyLnBhcnRpYWxzID0gb3JpZ2luYWw7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHByb3BzLnBhcnRpYWxzW29wdGlvbnMuYXJnc1swXV0gPSBvcHRpb25zLmZuO1xuXG4gICAgcmV0dXJuIHJldDtcbiAgfSk7XG59XG4iXX0= /***/ }), /***/ "./node_modules/handlebars/dist/cjs/handlebars/exception.js": /*!******************************************************************!*\ !*** ./node_modules/handlebars/dist/cjs/handlebars/exception.js ***! \******************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack']; function Exception(message, node) { var loc = node && node.loc, line = undefined, column = undefined; if (loc) { line = loc.start.line; column = loc.start.column; message += ' - ' + line + ':' + column; } var tmp = Error.prototype.constructor.call(this, message); // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work. for (var idx = 0; idx < errorProps.length; idx++) { this[errorProps[idx]] = tmp[errorProps[idx]]; } /* istanbul ignore else */ if (Error.captureStackTrace) { Error.captureStackTrace(this, Exception); } try { if (loc) { this.lineNumber = line; // Work around issue under safari where we can't directly set the column value /* istanbul ignore next */ if (Object.defineProperty) { Object.defineProperty(this, 'column', { value: column, enumerable: true }); } else { this.column = column; } } } catch (nop) { /* Ignore if the browser is very particular */ } } Exception.prototype = new Error(); exports['default'] = Exception; module.exports = exports['default']; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2V4Y2VwdGlvbi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsSUFBTSxVQUFVLEdBQUcsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQzs7QUFFbkcsU0FBUyxTQUFTLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRTtBQUNoQyxNQUFJLEdBQUcsR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUc7TUFDdEIsSUFBSSxZQUFBO01BQ0osTUFBTSxZQUFBLENBQUM7QUFDWCxNQUFJLEdBQUcsRUFBRTtBQUNQLFFBQUksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztBQUN0QixVQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7O0FBRTFCLFdBQU8sSUFBSSxLQUFLLEdBQUcsSUFBSSxHQUFHLEdBQUcsR0FBRyxNQUFNLENBQUM7R0FDeEM7O0FBRUQsTUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQzs7O0FBRzFELE9BQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxFQUFFO0FBQ2hELFFBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7R0FDOUM7OztBQUdELE1BQUksS0FBSyxDQUFDLGlCQUFpQixFQUFFO0FBQzNCLFNBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7R0FDMUM7O0FBRUQsTUFBSTtBQUNGLFFBQUksR0FBRyxFQUFFO0FBQ1AsVUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7Ozs7QUFJdkIsVUFBSSxNQUFNLENBQUMsY0FBYyxFQUFFO0FBQ3pCLGNBQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtBQUNwQyxlQUFLLEVBQUUsTUFBTTtBQUNiLG9CQUFVLEVBQUUsSUFBSTtTQUNqQixDQUFDLENBQUM7T0FDSixNQUFNO0FBQ0wsWUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7T0FDdEI7S0FDRjtHQUNGLENBQUMsT0FBTyxHQUFHLEVBQUU7O0dBRWI7Q0FDRjs7QUFFRCxTQUFTLENBQUMsU0FBUyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7O3FCQUVuQixTQUFTIiwiZmlsZSI6ImV4Y2VwdGlvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIlxuY29uc3QgZXJyb3JQcm9wcyA9IFsnZGVzY3JpcHRpb24nLCAnZmlsZU5hbWUnLCAnbGluZU51bWJlcicsICdtZXNzYWdlJywgJ25hbWUnLCAnbnVtYmVyJywgJ3N0YWNrJ107XG5cbmZ1bmN0aW9uIEV4Y2VwdGlvbihtZXNzYWdlLCBub2RlKSB7XG4gIGxldCBsb2MgPSBub2RlICYmIG5vZGUubG9jLFxuICAgICAgbGluZSxcbiAgICAgIGNvbHVtbjtcbiAgaWYgKGxvYykge1xuICAgIGxpbmUgPSBsb2Muc3RhcnQubGluZTtcbiAgICBjb2x1bW4gPSBsb2Muc3RhcnQuY29sdW1uO1xuXG4gICAgbWVzc2FnZSArPSAnIC0gJyArIGxpbmUgKyAnOicgKyBjb2x1bW47XG4gIH1cblxuICBsZXQgdG1wID0gRXJyb3IucHJvdG90eXBlLmNvbnN0cnVjdG9yLmNhbGwodGhpcywgbWVzc2FnZSk7XG5cbiAgLy8gVW5mb3J0dW5hdGVseSBlcnJvcnMgYXJlIG5vdCBlbnVtZXJhYmxlIGluIENocm9tZSAoYXQgbGVhc3QpLCBzbyBgZm9yIHByb3AgaW4gdG1wYCBkb2Vzbid0IHdvcmsuXG4gIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IGVycm9yUHJvcHMubGVuZ3RoOyBpZHgrKykge1xuICAgIHRoaXNbZXJyb3JQcm9wc1tpZHhdXSA9IHRtcFtlcnJvclByb3BzW2lkeF1dO1xuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgRXhjZXB0aW9uKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgaWYgKGxvYykge1xuICAgICAgdGhpcy5saW5lTnVtYmVyID0gbGluZTtcblxuICAgICAgLy8gV29yayBhcm91bmQgaXNzdWUgdW5kZXIgc2FmYXJpIHdoZXJlIHdlIGNhbid0IGRpcmVjdGx5IHNldCB0aGUgY29sdW1uIHZhbHVlXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2NvbHVtbicsIHtcbiAgICAgICAgICB2YWx1ZTogY29sdW1uLFxuICAgICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjtcbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKG5vcCkge1xuICAgIC8qIElnbm9yZSBpZiB0aGUgYnJvd3NlciBpcyB2ZXJ5IHBhcnRpY3VsYXIgKi9cbiAgfVxufVxuXG5FeGNlcHRpb24ucHJvdG90eXBlID0gbmV3IEVycm9yKCk7XG5cbmV4cG9ydCBkZWZhdWx0IEV4Y2VwdGlvbjtcbiJdfQ== /***/ }), /***/ "./node_modules/handlebars/dist/cjs/handlebars/helpers.js": /*!****************************************************************!*\ !*** ./node_modules/handlebars/dist/cjs/handlebars/helpers.js ***! \****************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.registerDefaultHelpers = registerDefaultHelpers; // istanbul ignore next function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _helpersBlockHelperMissing = __webpack_require__(/*! ./helpers/block-helper-missing */ "./node_modules/handlebars/dist/cjs/handlebars/helpers/block-helper-missing.js"); var _helpersBlockHelperMissing2 = _interopRequireDefault(_helpersBlockHelperMissing); var _helpersEach = __webpack_require__(/*! ./helpers/each */ "./node_modules/handlebars/dist/cjs/handlebars/helpers/each.js"); var _helpersEach2 = _interopRequireDefault(_helpersEach); var _helpersHelperMissing = __webpack_require__(/*! ./helpers/helper-missing */ "./node_modules/handlebars/dist/cjs/handlebars/helpers/helper-missing.js"); var _helpersHelperMissing2 = _interopRequireDefault(_helpersHelperMissing); var _helpersIf = __webpack_require__(/*! ./helpers/if */ "./node_modules/handlebars/dist/cjs/handlebars/helpers/if.js"); var _helpersIf2 = _interopRequireDefault(_helpersIf); var _helpersLog = __webpack_require__(/*! ./helpers/log */ "./node_modules/handlebars/dist/cjs/handlebars/helpers/log.js"); var _helpersLog2 = _interopRequireDefault(_helpersLog); var _helpersLookup = __webpack_require__(/*! ./helpers/lookup */ "./node_modules/handlebars/dist/cjs/handlebars/helpers/lookup.js"); var _helpersLookup2 = _interopRequireDefault(_helpersLookup); var _helpersWith = __webpack_require__(/*! ./helpers/with */ "./node_modules/handlebars/dist/cjs/handlebars/helpers/with.js"); var _helpersWith2 = _interopRequireDefault(_helpersWith); function registerDefaultHelpers(instance) { _helpersBlockHelperMissing2['default'](instance); _helpersEach2['default'](instance); _helpersHelperMissing2['default'](instance); _helpersIf2['default'](instance); _helpersLog2['default'](instance); _helpersLookup2['default'](instance); _helpersWith2['default'](instance); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7eUNBQXVDLGdDQUFnQzs7OzsyQkFDOUMsZ0JBQWdCOzs7O29DQUNQLDBCQUEwQjs7Ozt5QkFDckMsY0FBYzs7OzswQkFDYixlQUFlOzs7OzZCQUNaLGtCQUFrQjs7OzsyQkFDcEIsZ0JBQWdCOzs7O0FBRWxDLFNBQVMsc0JBQXNCLENBQUMsUUFBUSxFQUFFO0FBQy9DLHlDQUEyQixRQUFRLENBQUMsQ0FBQztBQUNyQywyQkFBYSxRQUFRLENBQUMsQ0FBQztBQUN2QixvQ0FBc0IsUUFBUSxDQUFDLENBQUM7QUFDaEMseUJBQVcsUUFBUSxDQUFDLENBQUM7QUFDckIsMEJBQVksUUFBUSxDQUFDLENBQUM7QUFDdEIsNkJBQWUsUUFBUSxDQUFDLENBQUM7QUFDekIsMkJBQWEsUUFBUSxDQUFDLENBQUM7Q0FDeEIiLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByZWdpc3RlckJsb2NrSGVscGVyTWlzc2luZyBmcm9tICcuL2hlbHBlcnMvYmxvY2staGVscGVyLW1pc3NpbmcnO1xuaW1wb3J0IHJlZ2lzdGVyRWFjaCBmcm9tICcuL2hlbHBlcnMvZWFjaCc7XG5pbXBvcnQgcmVnaXN0ZXJIZWxwZXJNaXNzaW5nIGZyb20gJy4vaGVscGVycy9oZWxwZXItbWlzc2luZyc7XG5pbXBvcnQgcmVnaXN0ZXJJZiBmcm9tICcuL2hlbHBlcnMvaWYnO1xuaW1wb3J0IHJlZ2lzdGVyTG9nIGZyb20gJy4vaGVscGVycy9sb2cnO1xuaW1wb3J0IHJlZ2lzdGVyTG9va3VwIGZyb20gJy4vaGVscGVycy9sb29rdXAnO1xuaW1wb3J0IHJlZ2lzdGVyV2l0aCBmcm9tICcuL2hlbHBlcnMvd2l0aCc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckRlZmF1bHRIZWxwZXJzKGluc3RhbmNlKSB7XG4gIHJlZ2lzdGVyQmxvY2tIZWxwZXJNaXNzaW5nKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJFYWNoKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJIZWxwZXJNaXNzaW5nKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJJZihpbnN0YW5jZSk7XG4gIHJlZ2lzdGVyTG9nKGluc3RhbmNlKTtcbiAgcmVnaXN0ZXJMb29rdXAoaW5zdGFuY2UpO1xuICByZWdpc3RlcldpdGgoaW5zdGFuY2UpO1xufVxuIl19 /***/ }), /***/ "./node_modules/handlebars/dist/cjs/handlebars/helpers/block-helper-missing.js": /*!*************************************************************************************!*\ !*** ./node_modules/handlebars/dist/cjs/handlebars/helpers/block-helper-missing.js ***! \*************************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; var _utils = __webpack_require__(/*! ../utils */ "./node_modules/handlebars/dist/cjs/handlebars/utils.js"); exports['default'] = function (instance) { instance.registerHelper('blockHelperMissing', function (context, options) { var inverse = options.inverse, fn = options.fn; if (context === true) { return fn(this); } else if (context === false || context == null) { return inverse(this); } else if (_utils.isArray(context)) { if (context.length > 0) { if (options.ids) { options.ids = [options.name]; } return instance.helpers.each(context, options); } else { return inverse(this); } } else { if (options.data && options.ids) { var data = _utils.createFrame(options.data); data.contextPath = _utils.appendContextPath(options.data.contextPath, options.name); options = { data: data }; } return fn(context, options); } }); }; module.exports = exports['default']; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvYmxvY2staGVscGVyLW1pc3NpbmcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztxQkFBc0QsVUFBVTs7cUJBRWpELFVBQVMsUUFBUSxFQUFFO0FBQ2hDLFVBQVEsQ0FBQyxjQUFjLENBQUMsb0JBQW9CLEVBQUUsVUFBUyxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQ3ZFLFFBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPO1FBQ3pCLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDOztBQUVwQixRQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUU7QUFDcEIsYUFBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDakIsTUFBTSxJQUFJLE9BQU8sS0FBSyxLQUFLLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtBQUMvQyxhQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUN0QixNQUFNLElBQUksZUFBUSxPQUFPLENBQUMsRUFBRTtBQUMzQixVQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO0FBQ3RCLFlBQUksT0FBTyxDQUFDLEdBQUcsRUFBRTtBQUNmLGlCQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzlCOztBQUVELGVBQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO09BQ2hELE1BQU07QUFDTCxlQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztPQUN0QjtLQUNGLE1BQU07QUFDTCxVQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRTtBQUMvQixZQUFJLElBQUksR0FBRyxtQkFBWSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckMsWUFBSSxDQUFDLFdBQVcsR0FBRyx5QkFBa0IsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdFLGVBQU8sR0FBRyxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQztPQUN4Qjs7QUFFRCxhQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDN0I7R0FDRixDQUFDLENBQUM7Q0FDSiIsImZpbGUiOiJibG9jay1oZWxwZXItbWlzc2luZy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YXBwZW5kQ29udGV4dFBhdGgsIGNyZWF0ZUZyYW1lLCBpc0FycmF5fSBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGluc3RhbmNlKSB7XG4gIGluc3RhbmNlLnJlZ2lzdGVySGVscGVyKCdibG9ja0hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgbGV0IGludmVyc2UgPSBvcHRpb25zLmludmVyc2UsXG4gICAgICAgIGZuID0gb3B0aW9ucy5mbjtcblxuICAgIGlmIChjb250ZXh0ID09PSB0cnVlKSB7XG4gICAgICByZXR1cm4gZm4odGhpcyk7XG4gICAgfSBlbHNlIGlmIChjb250ZXh0ID09PSBmYWxzZSB8fCBjb250ZXh0ID09IG51bGwpIHtcbiAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShjb250ZXh0KSkge1xuICAgICAgaWYgKGNvbnRleHQubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAob3B0aW9ucy5pZHMpIHtcbiAgICAgICAgICBvcHRpb25zLmlkcyA9IFtvcHRpb25zLm5hbWVdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnMuZWFjaChjb250ZXh0LCBvcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpbnZlcnNlKHRoaXMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7XG4gICAgICAgIGxldCBkYXRhID0gY3JlYXRlRnJhbWUob3B0aW9ucy5kYXRhKTtcbiAgICAgICAgZGF0YS5jb250ZXh0UGF0aCA9IGFwcGVuZENvbnRleHRQYXRoKG9wdGlvbnMuZGF0YS5jb250ZXh0UGF0aCwgb3B0aW9ucy5uYW1lKTtcbiAgICAgICAgb3B0aW9ucyA9IHtkYXRhOiBkYXRhfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZuKGNvbnRleHQsIG9wdGlvbnMpO1xuICAgIH1cbiAgfSk7XG59XG4iXX0= /***/ }), /***/ "./node_modules/handlebars/dist/cjs/handlebars/helpers/each.js": /*!*********************************************************************!*\ !*** ./node_modules/handlebars/dist/cjs/handlebars/helpers/each.js ***! \*********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; // istanbul ignore next function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _utils = __webpack_require__(/*! ../utils */ "./node_modules/handlebars/dist/cjs/handlebars/utils.js"); var _exception = __webpack_require__(/*! ../exception */ "./node_modules/handlebars/dist/cjs/handlebars/exception.js"); var _exception2 = _interopRequireDefault(_exception); exports['default'] = function (instance) { instance.registerHelper('each', function (context, options) { if (!options) { throw new _exception2['default']('Must pass iterator to #each'); } var fn = options.fn, inverse = options.inverse, i = 0, ret = '', data = undefined, contextPath = undefined; if (options.data && options.ids) { contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]) + '.'; } if (_utils.isFunction(context)) { context = context.call(this); } if (options.data) { data = _utils.createFrame(options.data); } function execIteration(field, index, last) { if (data) { data.key = field; data.index = index; data.first = index === 0; data.last = !!last; if (contextPath) { data.contextPath = contextPath + field; } } ret = ret + fn(context[field], { data: data, blockParams: _utils.blockParams([context[field], field], [contextPath + field, null]) }); } if (context && typeof context === 'object') { if (_utils.isArray(context)) { for (var j = context.length; i < j; i++) { if (i in context) { execIteration(i, i, i === context.length - 1); } } } else { var priorKey = undefined; for (var key in context) { if (context.hasOwnProperty(key)) { // We're running the iterations one step out of sync so we can detect // the last iteration without have to scan the object twice and create // an itermediate keys array. if (priorKey !== undefined) { execIteration(priorKey, i - 1); } priorKey = key; i++; } } if (priorKey !== undefined) { execIteration(priorKey, i - 1, true); } } } if (i === 0) { ret = inverse(this); } return ret; }); }; module.exports = exports['default']; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvZWFjaC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O3FCQUErRSxVQUFVOzt5QkFDbkUsY0FBYzs7OztxQkFFckIsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsVUFBUyxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQ3pELFFBQUksQ0FBQyxPQUFPLEVBQUU7QUFDWixZQUFNLDJCQUFjLDZCQUE2QixDQUFDLENBQUM7S0FDcEQ7O0FBRUQsUUFBSSxFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUU7UUFDZixPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU87UUFDekIsQ0FBQyxHQUFHLENBQUM7UUFDTCxHQUFHLEdBQUcsRUFBRTtRQUNSLElBQUksWUFBQTtRQUNKLFdBQVcsWUFBQSxDQUFDOztBQUVoQixRQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRTtBQUMvQixpQkFBVyxHQUFHLHlCQUFrQixPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0tBQ2pGOztBQUVELFFBQUksa0JBQVcsT0FBTyxDQUFDLEVBQUU7QUFBRSxhQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUFFOztBQUUxRCxRQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUU7QUFDaEIsVUFBSSxHQUFHLG1CQUFZLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNsQzs7QUFFRCxhQUFTLGFBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtBQUN6QyxVQUFJLElBQUksRUFBRTtBQUNSLFlBQUksQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDO0FBQ2pCLFlBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQ25CLFlBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxLQUFLLENBQUMsQ0FBQztBQUN6QixZQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7O0FBRW5CLFlBQUksV0FBVyxFQUFFO0FBQ2YsY0FBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLEdBQUcsS0FBSyxDQUFDO1NBQ3hDO09BQ0Y7O0FBRUQsU0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO0FBQzdCLFlBQUksRUFBRSxJQUFJO0FBQ1YsbUJBQVcsRUFBRSxtQkFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLFdBQVcsR0FBRyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7T0FDL0UsQ0FBQyxDQUFDO0tBQ0o7O0FBRUQsUUFBSSxPQUFPLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFO0FBQzFDLFVBQUksZUFBUSxPQUFPLENBQUMsRUFBRTtBQUNwQixhQUFLLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN2QyxjQUFJLENBQUMsSUFBSSxPQUFPLEVBQUU7QUFDaEIseUJBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1dBQy9DO1NBQ0Y7T0FDRixNQUFNO0FBQ0wsWUFBSSxRQUFRLFlBQUEsQ0FBQzs7QUFFYixhQUFLLElBQUksR0FBRyxJQUFJLE9BQU8sRUFBRTtBQUN2QixjQUFJLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7Ozs7QUFJL0IsZ0JBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtBQUMxQiwyQkFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDaEM7QUFDRCxvQkFBUSxHQUFHLEdBQUcsQ0FBQztBQUNmLGFBQUMsRUFBRSxDQUFDO1dBQ0w7U0FDRjtBQUNELFlBQUksUUFBUSxLQUFLLFNBQVMsRUFBRTtBQUMxQix1QkFBYSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3RDO09BQ0Y7S0FDRjs7QUFFRCxRQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7QUFDWCxTQUFHLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ3JCOztBQUVELFdBQU8sR0FBRyxDQUFDO0dBQ1osQ0FBQyxDQUFDO0NBQ0oiLCJmaWxlIjoiZWFjaC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7YXBwZW5kQ29udGV4dFBhdGgsIGJsb2NrUGFyYW1zLCBjcmVhdGVGcmFtZSwgaXNBcnJheSwgaXNGdW5jdGlvbn0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IEV4Y2VwdGlvbiBmcm9tICcuLi9leGNlcHRpb24nO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignZWFjaCcsIGZ1bmN0aW9uKGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ011c3QgcGFzcyBpdGVyYXRvciB0byAjZWFjaCcpO1xuICAgIH1cblxuICAgIGxldCBmbiA9IG9wdGlvbnMuZm4sXG4gICAgICAgIGludmVyc2UgPSBvcHRpb25zLmludmVyc2UsXG4gICAgICAgIGkgPSAwLFxuICAgICAgICByZXQgPSAnJyxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgY29udGV4dFBhdGg7XG5cbiAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7XG4gICAgICBjb250ZXh0UGF0aCA9IGFwcGVuZENvbnRleHRQYXRoKG9wdGlvbnMuZGF0YS5jb250ZXh0UGF0aCwgb3B0aW9ucy5pZHNbMF0pICsgJy4nO1xuICAgIH1cblxuICAgIGlmIChpc0Z1bmN0aW9uKGNvbnRleHQpKSB7IGNvbnRleHQgPSBjb250ZXh0LmNhbGwodGhpcyk7IH1cblxuICAgIGlmIChvcHRpb25zLmRhdGEpIHtcbiAgICAgIGRhdGEgPSBjcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4ZWNJdGVyYXRpb24oZmllbGQsIGluZGV4LCBsYXN0KSB7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBkYXRhLmtleSA9IGZpZWxkO1xuICAgICAgICBkYXRhLmluZGV4ID0gaW5kZXg7XG4gICAgICAgIGRhdGEuZmlyc3QgPSBpbmRleCA9PT0gMDtcbiAgICAgICAgZGF0YS5sYXN0ID0gISFsYXN0O1xuXG4gICAgICAgIGlmIChjb250ZXh0UGF0aCkge1xuICAgICAgICAgIGRhdGEuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aCArIGZpZWxkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldCA9IHJldCArIGZuKGNvbnRleHRbZmllbGRdLCB7XG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyhbY29udGV4dFtmaWVsZF0sIGZpZWxkXSwgW2NvbnRleHRQYXRoICsgZmllbGQsIG51bGxdKVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoaXNBcnJheShjb250ZXh0KSkge1xuICAgICAgICBmb3IgKGxldCBqID0gY29udGV4dC5sZW5ndGg7IGkgPCBqOyBpKyspIHtcbiAgICAgICAgICBpZiAoaSBpbiBjb250ZXh0KSB7XG4gICAgICAgICAgICBleGVjSXRlcmF0aW9uKGksIGksIGkgPT09IGNvbnRleHQubGVuZ3RoIC0gMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgcHJpb3JLZXk7XG5cbiAgICAgICAgZm9yIChsZXQga2V5IGluIGNvbnRleHQpIHtcbiAgICAgICAgICBpZiAoY29udGV4dC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAvLyBXZSdyZSBydW5uaW5nIHRoZSBpdGVyYXRpb25zIG9uZSBzdGVwIG91dCBvZiBzeW5jIHNvIHdlIGNhbiBkZXRlY3RcbiAgICAgICAgICAgIC8vIHRoZSBsYXN0IGl0ZXJhdGlvbiB3aXRob3V0IGhhdmUgdG8gc2NhbiB0aGUgb2JqZWN0IHR3aWNlIGFuZCBjcmVhdGVcbiAgICAgICAgICAgIC8vIGFuIGl0ZXJtZWRpYXRlIGtleXMgYXJyYXkuXG4gICAgICAgICAgICBpZiAocHJpb3JLZXkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBleGVjSXRlcmF0aW9uKHByaW9yS2V5LCBpIC0gMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwcmlvcktleSA9IGtleTtcbiAgICAgICAgICAgIGkrKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByaW9yS2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBleGVjSXRlcmF0aW9uKHByaW9yS2V5LCBpIC0gMSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgcmV0ID0gaW52ZXJzZSh0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0O1xuICB9KTtcbn1cbiJdfQ== /***/ }), /***/ "./node_modules/handlebars/dist/cjs/handlebars/helpers/helper-missing.js": /*!*******************************************************************************!*\ !*** ./node_modules/handlebars/dist/cjs/handlebars/helpers/helper-missing.js ***! \*******************************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; // istanbul ignore next function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } var _exception = __webpack_require__(/*! ../exception */ "./node_modules/handlebars/dist/cjs/handlebars/exception.js"); var _exception2 = _interopRequireDefault(_exception); exports['default'] = function (instance) { instance.registerHelper('helperMissing', function () /* [args, ]options */{ if (arguments.length === 1) { // A missing field in a {{foo}} construct. return undefined; } else { // Someone is actually trying to call something, blow up. throw new _exception2['default']('Missing helper: "' + arguments[arguments.length - 1].name + '"'); } }); }; module.exports = exports['default']; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvaGVscGVyLW1pc3NpbmcuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozt5QkFBc0IsY0FBYzs7OztxQkFFckIsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxlQUFlLEVBQUUsaUNBQWdDO0FBQ3ZFLFFBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7O0FBRTFCLGFBQU8sU0FBUyxDQUFDO0tBQ2xCLE1BQU07O0FBRUwsWUFBTSwyQkFBYyxtQkFBbUIsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7S0FDdkY7R0FDRixDQUFDLENBQUM7Q0FDSiIsImZpbGUiOiJoZWxwZXItbWlzc2luZy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFeGNlcHRpb24gZnJvbSAnLi4vZXhjZXB0aW9uJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2hlbHBlck1pc3NpbmcnLCBmdW5jdGlvbigvKiBbYXJncywgXW9wdGlvbnMgKi8pIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgLy8gQSBtaXNzaW5nIGZpZWxkIGluIGEge3tmb299fSBjb25zdHJ1Y3QuXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBTb21lb25lIGlzIGFjdHVhbGx5IHRyeWluZyB0byBjYWxsIHNvbWV0aGluZywgYmxvdyB1cC5cbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ01pc3NpbmcgaGVscGVyOiBcIicgKyBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDFdLm5hbWUgKyAnXCInKTtcbiAgICB9XG4gIH0pO1xufVxuIl19 /***/ }), /***/ "./node_modules/handlebars/dist/cjs/handlebars/helpers/if.js": /*!*******************************************************************!*\ !*** ./node_modules/handlebars/dist/cjs/handlebars/helpers/if.js ***! \*******************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; var _utils = __webpack_require__(/*! ../utils */ "./node_modules/handlebars/dist/cjs/handlebars/utils.js"); exports['default'] = function (instance) { instance.registerHelper('if', function (conditional, options) { if (_utils.isFunction(conditional)) { conditional = conditional.call(this); } // Default behavior is to render the positive path if the value is truthy and not empty. // The `includeZero` option may be set to treat the condtional as purely not empty based on the // behavior of isEmpty. Effectively this determines if 0 is handled by the positive path or negative. if (!options.hash.includeZero && !conditional || _utils.isEmpty(conditional)) { return options.inverse(this); } else { return options.fn(this); } }); instance.registerHelper('unless', function (conditional, options) { return instance.helpers['if'].call(this, conditional, { fn: options.inverse, inverse: options.fn, hash: options.hash }); }); }; module.exports = exports['default']; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvaWYuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztxQkFBa0MsVUFBVTs7cUJBRTdCLFVBQVMsUUFBUSxFQUFFO0FBQ2hDLFVBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFVBQVMsV0FBVyxFQUFFLE9BQU8sRUFBRTtBQUMzRCxRQUFJLGtCQUFXLFdBQVcsQ0FBQyxFQUFFO0FBQUUsaUJBQVcsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQUU7Ozs7O0FBS3RFLFFBQUksQUFBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsV0FBVyxJQUFLLGVBQVEsV0FBVyxDQUFDLEVBQUU7QUFDdkUsYUFBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzlCLE1BQU07QUFDTCxhQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDekI7R0FDRixDQUFDLENBQUM7O0FBRUgsVUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBUyxXQUFXLEVBQUUsT0FBTyxFQUFFO0FBQy9ELFdBQU8sUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxFQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQztHQUN2SCxDQUFDLENBQUM7Q0FDSiIsImZpbGUiOiJpZi5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aXNFbXB0eSwgaXNGdW5jdGlvbn0gZnJvbSAnLi4vdXRpbHMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignaWYnLCBmdW5jdGlvbihjb25kaXRpb25hbCwgb3B0aW9ucykge1xuICAgIGlmIChpc0Z1bmN0aW9uKGNvbmRpdGlvbmFsKSkgeyBjb25kaXRpb25hbCA9IGNvbmRpdGlvbmFsLmNhbGwodGhpcyk7IH1cblxuICAgIC8vIERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcmVuZGVyIHRoZSBwb3NpdGl2ZSBwYXRoIGlmIHRoZSB2YWx1ZSBpcyB0cnV0aHkgYW5kIG5vdCBlbXB0eS5cbiAgICAvLyBUaGUgYGluY2x1ZGVaZXJvYCBvcHRpb24gbWF5IGJlIHNldCB0byB0cmVhdCB0aGUgY29uZHRpb25hbCBhcyBwdXJlbHkgbm90IGVtcHR5IGJhc2VkIG9uIHRoZVxuICAgIC8vIGJlaGF2aW9yIG9mIGlzRW1wdHkuIEVmZmVjdGl2ZWx5IHRoaXMgZGV0ZXJtaW5lcyBpZiAwIGlzIGhhbmRsZWQgYnkgdGhlIHBvc2l0aXZlIHBhdGggb3IgbmVnYXRpdmUuXG4gICAgaWYgKCghb3B0aW9ucy5oYXNoLmluY2x1ZGVaZXJvICYmICFjb25kaXRpb25hbCkgfHwgaXNFbXB0eShjb25kaXRpb25hbCkpIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmZuKHRoaXMpO1xuICAgIH1cbiAgfSk7XG5cbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3VubGVzcycsIGZ1bmN0aW9uKGNvbmRpdGlvbmFsLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlLmhlbHBlcnNbJ2lmJ10uY2FsbCh0aGlzLCBjb25kaXRpb25hbCwge2ZuOiBvcHRpb25zLmludmVyc2UsIGludmVyc2U6IG9wdGlvbnMuZm4sIGhhc2g6IG9wdGlvbnMuaGFzaH0pO1xuICB9KTtcbn1cbiJdfQ== /***/ }), /***/ "./node_modules/handlebars/dist/cjs/handlebars/helpers/log.js": /*!********************************************************************!*\ !*** ./node_modules/handlebars/dist/cjs/handlebars/helpers/log.js ***! \********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports['default'] = function (instance) { instance.registerHelper('log', function () /* message, options */{ var args = [undefined], options = arguments[arguments.length - 1]; for (var i = 0; i < arguments.length - 1; i++) { args.push(arguments[i]); } var level = 1; if (options.hash.level != null) { level = options.hash.level; } else if (options.data && options.data.level != null) { level = options.data.level; } args[0] = level; instance.log.apply(instance, args); }); }; module.exports = exports['default']; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvbG9nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7cUJBQWUsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsa0NBQWlDO0FBQzlELFFBQUksSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDO1FBQ2xCLE9BQU8sR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM5QyxTQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDN0MsVUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN6Qjs7QUFFRCxRQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7QUFDZCxRQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRTtBQUM5QixXQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7S0FDNUIsTUFBTSxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFO0FBQ3JELFdBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztLQUM1QjtBQUNELFFBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7O0FBRWhCLFlBQVEsQ0FBQyxHQUFHLE1BQUEsQ0FBWixRQUFRLEVBQVMsSUFBSSxDQUFDLENBQUM7R0FDeEIsQ0FBQyxDQUFDO0NBQ0oiLCJmaWxlIjoibG9nLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ2xvZycsIGZ1bmN0aW9uKC8qIG1lc3NhZ2UsIG9wdGlvbnMgKi8pIHtcbiAgICBsZXQgYXJncyA9IFt1bmRlZmluZWRdLFxuICAgICAgICBvcHRpb25zID0gYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGggLSAxXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pO1xuICAgIH1cblxuICAgIGxldCBsZXZlbCA9IDE7XG4gICAgaWYgKG9wdGlvbnMuaGFzaC5sZXZlbCAhPSBudWxsKSB7XG4gICAgICBsZXZlbCA9IG9wdGlvbnMuaGFzaC5sZXZlbDtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmRhdGEubGV2ZWwgIT0gbnVsbCkge1xuICAgICAgbGV2ZWwgPSBvcHRpb25zLmRhdGEubGV2ZWw7XG4gICAgfVxuICAgIGFyZ3NbMF0gPSBsZXZlbDtcblxuICAgIGluc3RhbmNlLmxvZyguLi4gYXJncyk7XG4gIH0pO1xufVxuIl19 /***/ }), /***/ "./node_modules/handlebars/dist/cjs/handlebars/helpers/lookup.js": /*!***********************************************************************!*\ !*** ./node_modules/handlebars/dist/cjs/handlebars/helpers/lookup.js ***! \***********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports['default'] = function (instance) { instance.registerHelper('lookup', function (obj, field) { return obj && obj[field]; }); }; module.exports = exports['default']; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvbG9va3VwLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7cUJBQWUsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBUyxHQUFHLEVBQUUsS0FBSyxFQUFFO0FBQ3JELFdBQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztHQUMxQixDQUFDLENBQUM7Q0FDSiIsImZpbGUiOiJsb29rdXAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihpbnN0YW5jZSkge1xuICBpbnN0YW5jZS5yZWdpc3RlckhlbHBlcignbG9va3VwJywgZnVuY3Rpb24ob2JqLCBmaWVsZCkge1xuICAgIHJldHVybiBvYmogJiYgb2JqW2ZpZWxkXTtcbiAgfSk7XG59XG4iXX0= /***/ }), /***/ "./node_modules/handlebars/dist/cjs/handlebars/helpers/with.js": /*!*********************************************************************!*\ !*** ./node_modules/handlebars/dist/cjs/handlebars/helpers/with.js ***! \*********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; var _utils = __webpack_require__(/*! ../utils */ "./node_modules/handlebars/dist/cjs/handlebars/utils.js"); exports['default'] = function (instance) { instance.registerHelper('with', function (context, options) { if (_utils.isFunction(context)) { context = context.call(this); } var fn = options.fn; if (!_utils.isEmpty(context)) { var data = options.data; if (options.data && options.ids) { data = _utils.createFrame(options.data); data.contextPath = _utils.appendContextPath(options.data.contextPath, options.ids[0]); } return fn(context, { data: data, blockParams: _utils.blockParams([context], [data && data.contextPath]) }); } else { return options.inverse(this); } }); }; module.exports = exports['default']; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2hlbHBlcnMvd2l0aC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O3FCQUErRSxVQUFVOztxQkFFMUUsVUFBUyxRQUFRLEVBQUU7QUFDaEMsVUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsVUFBUyxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQ3pELFFBQUksa0JBQVcsT0FBTyxDQUFDLEVBQUU7QUFBRSxhQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUFFOztBQUUxRCxRQUFJLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDOztBQUVwQixRQUFJLENBQUMsZUFBUSxPQUFPLENBQUMsRUFBRTtBQUNyQixVQUFJLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO0FBQ3hCLFVBQUksT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFO0FBQy9CLFlBQUksR0FBRyxtQkFBWSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDakMsWUFBSSxDQUFDLFdBQVcsR0FBRyx5QkFBa0IsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO09BQ2hGOztBQUVELGFBQU8sRUFBRSxDQUFDLE9BQU8sRUFBRTtBQUNqQixZQUFJLEVBQUUsSUFBSTtBQUNWLG1CQUFXLEVBQUUsbUJBQVksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7T0FDaEUsQ0FBQyxDQUFDO0tBQ0osTUFBTTtBQUNMLGFBQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUM5QjtHQUNGLENBQUMsQ0FBQztDQUNKIiwiZmlsZSI6IndpdGguanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2FwcGVuZENvbnRleHRQYXRoLCBibG9ja1BhcmFtcywgY3JlYXRlRnJhbWUsIGlzRW1wdHksIGlzRnVuY3Rpb259IGZyb20gJy4uL3V0aWxzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oaW5zdGFuY2UpIHtcbiAgaW5zdGFuY2UucmVnaXN0ZXJIZWxwZXIoJ3dpdGgnLCBmdW5jdGlvbihjb250ZXh0LCBvcHRpb25zKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24oY29udGV4dCkpIHsgY29udGV4dCA9IGNvbnRleHQuY2FsbCh0aGlzKTsgfVxuXG4gICAgbGV0IGZuID0gb3B0aW9ucy5mbjtcblxuICAgIGlmICghaXNFbXB0eShjb250ZXh0KSkge1xuICAgICAgbGV0IGRhdGEgPSBvcHRpb25zLmRhdGE7XG4gICAgICBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMuaWRzKSB7XG4gICAgICAgIGRhdGEgPSBjcmVhdGVGcmFtZShvcHRpb25zLmRhdGEpO1xuICAgICAgICBkYXRhLmNvbnRleHRQYXRoID0gYXBwZW5kQ29udGV4dFBhdGgob3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoLCBvcHRpb25zLmlkc1swXSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmbihjb250ZXh0LCB7XG4gICAgICAgIGRhdGE6IGRhdGEsXG4gICAgICAgIGJsb2NrUGFyYW1zOiBibG9ja1BhcmFtcyhbY29udGV4dF0sIFtkYXRhICYmIGRhdGEuY29udGV4dFBhdGhdKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UodGhpcyk7XG4gICAgfVxuICB9KTtcbn1cbiJdfQ== /***/ }), /***/ "./node_modules/handlebars/dist/cjs/handlebars/logger.js": /*!***************************************************************!*\ !*** ./node_modules/handlebars/dist/cjs/handlebars/logger.js ***! \***************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; var _utils = __webpack_require__(/*! ./utils */ "./node_modules/handlebars/dist/cjs/handlebars/utils.js"); var logger = { methodMap: ['debug', 'info', 'warn', 'error'], level: 'info', // Maps a given level value to the `methodMap` indexes above. lookupLevel: function lookupLevel(level) { if (typeof level === 'string') { var levelMap = _utils.indexOf(logger.methodMap, level.toLowerCase()); if (levelMap >= 0) { level = levelMap; } else { level = parseInt(level, 10); } } return level; }, // Can be overridden in the host environment log: function log(level) { level = logger.lookupLevel(level); if (typeof console !== 'undefined' && logger.lookupLevel(logger.level) <= level) { var method = logger.methodMap[level]; if (!console[method]) { // eslint-disable-line no-console method = 'log'; } for (var _len = arguments.length, message = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { message[_key - 1] = arguments[_key]; } console[method].apply(console, message); // eslint-disable-line no-console } } }; exports['default'] = logger; module.exports = exports['default']; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL2xvZ2dlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O3FCQUFzQixTQUFTOztBQUUvQixJQUFJLE1BQU0sR0FBRztBQUNYLFdBQVMsRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQztBQUM3QyxPQUFLLEVBQUUsTUFBTTs7O0FBR2IsYUFBVyxFQUFFLHFCQUFTLEtBQUssRUFBRTtBQUMzQixRQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtBQUM3QixVQUFJLFFBQVEsR0FBRyxlQUFRLE1BQU0sQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7QUFDOUQsVUFBSSxRQUFRLElBQUksQ0FBQyxFQUFFO0FBQ2pCLGFBQUssR0FBRyxRQUFRLENBQUM7T0FDbEIsTUFBTTtBQUNMLGFBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO09BQzdCO0tBQ0Y7O0FBRUQsV0FBTyxLQUFLLENBQUM7R0FDZDs7O0FBR0QsS0FBRyxFQUFFLGFBQVMsS0FBSyxFQUFjO0FBQy9CLFNBQUssR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDOztBQUVsQyxRQUFJLE9BQU8sT0FBTyxLQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEVBQUU7QUFDL0UsVUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNyQyxVQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFOztBQUNwQixjQUFNLEdBQUcsS0FBSyxDQUFDO09BQ2hCOzt3Q0FQbUIsT0FBTztBQUFQLGVBQU87OztBQVEzQixhQUFPLENBQUMsTUFBTSxPQUFDLENBQWYsT0FBTyxFQUFZLE9BQU8sQ0FBQyxDQUFDO0tBQzdCO0dBQ0Y7Q0FDRixDQUFDOztxQkFFYSxNQUFNIiwiZmlsZSI6ImxvZ2dlci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7aW5kZXhPZn0gZnJvbSAnLi91dGlscyc7XG5cbmxldCBsb2dnZXIgPSB7XG4gIG1ldGhvZE1hcDogWydkZWJ1ZycsICdpbmZvJywgJ3dhcm4nLCAnZXJyb3InXSxcbiAgbGV2ZWw6ICdpbmZvJyxcblxuICAvLyBNYXBzIGEgZ2l2ZW4gbGV2ZWwgdmFsdWUgdG8gdGhlIGBtZXRob2RNYXBgIGluZGV4ZXMgYWJvdmUuXG4gIGxvb2t1cExldmVsOiBmdW5jdGlvbihsZXZlbCkge1xuICAgIGlmICh0eXBlb2YgbGV2ZWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICBsZXQgbGV2ZWxNYXAgPSBpbmRleE9mKGxvZ2dlci5tZXRob2RNYXAsIGxldmVsLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgaWYgKGxldmVsTWFwID49IDApIHtcbiAgICAgICAgbGV2ZWwgPSBsZXZlbE1hcDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldmVsID0gcGFyc2VJbnQobGV2ZWwsIDEwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGV2ZWw7XG4gIH0sXG5cbiAgLy8gQ2FuIGJlIG92ZXJyaWRkZW4gaW4gdGhlIGhvc3QgZW52aXJvbm1lbnRcbiAgbG9nOiBmdW5jdGlvbihsZXZlbCwgLi4ubWVzc2FnZSkge1xuICAgIGxldmVsID0gbG9nZ2VyLmxvb2t1cExldmVsKGxldmVsKTtcblxuICAgIGlmICh0eXBlb2YgY29uc29sZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbG9nZ2VyLmxvb2t1cExldmVsKGxvZ2dlci5sZXZlbCkgPD0gbGV2ZWwpIHtcbiAgICAgIGxldCBtZXRob2QgPSBsb2dnZXIubWV0aG9kTWFwW2xldmVsXTtcbiAgICAgIGlmICghY29uc29sZVttZXRob2RdKSB7ICAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgICAgIG1ldGhvZCA9ICdsb2cnO1xuICAgICAgfVxuICAgICAgY29uc29sZVttZXRob2RdKC4uLm1lc3NhZ2UpOyAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGxvZ2dlcjtcbiJdfQ== /***/ }), /***/ "./node_modules/handlebars/dist/cjs/handlebars/no-conflict.js": /*!********************************************************************!*\ !*** ./node_modules/handlebars/dist/cjs/handlebars/no-conflict.js ***! \********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(global) {/* global window */ exports.__esModule = true; exports['default'] = function (Handlebars) { /* istanbul ignore next */ var root = typeof global !== 'undefined' ? global : window, $Handlebars = root.Handlebars; /* istanbul ignore next */ Handlebars.noConflict = function () { if (root.Handlebars === Handlebars) { root.Handlebars = $Handlebars; } return Handlebars; }; }; module.exports = exports['default']; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL25vLWNvbmZsaWN0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O3FCQUNlLFVBQVMsVUFBVSxFQUFFOztBQUVsQyxNQUFJLElBQUksR0FBRyxPQUFPLE1BQU0sS0FBSyxXQUFXLEdBQUcsTUFBTSxHQUFHLE1BQU07TUFDdEQsV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7O0FBRWxDLFlBQVUsQ0FBQyxVQUFVLEdBQUcsWUFBVztBQUNqQyxRQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssVUFBVSxFQUFFO0FBQ2xDLFVBQUksQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDO0tBQy9CO0FBQ0QsV0FBTyxVQUFVLENBQUM7R0FDbkIsQ0FBQztDQUNIIiwiZmlsZSI6Im5vLWNvbmZsaWN0LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyogZ2xvYmFsIHdpbmRvdyAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oSGFuZGxlYmFycykge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBsZXQgcm9vdCA9IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogd2luZG93LFxuICAgICAgJEhhbmRsZWJhcnMgPSByb290LkhhbmRsZWJhcnM7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIEhhbmRsZWJhcnMubm9Db25mbGljdCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmIChyb290LkhhbmRsZWJhcnMgPT09IEhhbmRsZWJhcnMpIHtcbiAgICAgIHJvb3QuSGFuZGxlYmFycyA9ICRIYW5kbGViYXJzO1xuICAgIH1cbiAgICByZXR1cm4gSGFuZGxlYmFycztcbiAgfTtcbn1cbiJdfQ== /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) /***/ }), /***/ "./node_modules/handlebars/dist/cjs/handlebars/runtime.js": /*!****************************************************************!*\ !*** ./node_modules/handlebars/dist/cjs/handlebars/runtime.js ***! \****************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.checkRevision = checkRevision; exports.template = template; exports.wrapProgram = wrapProgram; exports.resolvePartial = resolvePartial; exports.invokePartial = invokePartial; exports.noop = noop; // istanbul ignore next function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } // istanbul ignore next function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } } var _utils = __webpack_require__(/*! ./utils */ "./node_modules/handlebars/dist/cjs/handlebars/utils.js"); var Utils = _interopRequireWildcard(_utils); var _exception = __webpack_require__(/*! ./exception */ "./node_modules/handlebars/dist/cjs/handlebars/exception.js"); var _exception2 = _interopRequireDefault(_exception); var _base = __webpack_require__(/*! ./base */ "./node_modules/handlebars/dist/cjs/handlebars/base.js"); function checkRevision(compilerInfo) { var compilerRevision = compilerInfo && compilerInfo[0] || 1, currentRevision = _base.COMPILER_REVISION; if (compilerRevision !== currentRevision) { if (compilerRevision < currentRevision) { var runtimeVersions = _base.REVISION_CHANGES[currentRevision], compilerVersions = _base.REVISION_CHANGES[compilerRevision]; throw new _exception2['default']('Template was precompiled with an older version of Handlebars than the current runtime. ' + 'Please update your precompiler to a newer version (' + runtimeVersions + ') or downgrade your runtime to an older version (' + compilerVersions + ').'); } else { // Use the embedded version info since the runtime doesn't know about this revision yet throw new _exception2['default']('Template was precompiled with a newer version of Handlebars than the current runtime. ' + 'Please update your runtime to a newer version (' + compilerInfo[1] + ').'); } } } function template(templateSpec, env) { /* istanbul ignore next */ if (!env) { throw new _exception2['default']('No environment passed to template'); } if (!templateSpec || !templateSpec.main) { throw new _exception2['default']('Unknown template object: ' + typeof templateSpec); } templateSpec.main.decorator = templateSpec.main_d; // Note: Using env.VM references rather than local var references throughout this section to allow // for external users to override these as psuedo-supported APIs. env.VM.checkRevision(templateSpec.compiler); function invokePartialWrapper(partial, context, options) { if (options.hash) { context = Utils.extend({}, context, options.hash); if (options.ids) { options.ids[0] = true; } } partial = env.VM.resolvePartial.call(this, partial, context, options); var result = env.VM.invokePartial.call(this, partial, context, options); if (result == null && env.compile) { options.partials[options.name] = env.compile(partial, templateSpec.compilerOptions, env); result = options.partials[options.name](context, options); } if (result != null) { if (options.indent) { var lines = result.split('\n'); for (var i = 0, l = lines.length; i < l; i++) { if (!lines[i] && i + 1 === l) { break; } lines[i] = options.indent + lines[i]; } result = lines.join('\n'); } return result; } else { throw new _exception2['default']('The partial ' + options.name + ' could not be compiled when running in runtime-only mode'); } } // Just add water var container = { strict: function strict(obj, name) { if (!(name in obj)) { throw new _exception2['default']('"' + name + '" not defined in ' + obj); } return obj[name]; }, lookup: function lookup(depths, name) { var len = depths.length; for (var i = 0; i < len; i++) { if (depths[i] && depths[i][name] != null) { return depths[i][name]; } } }, lambda: function lambda(current, context) { return typeof current === 'function' ? current.call(context) : current; }, escapeExpression: Utils.escapeExpression, invokePartial: invokePartialWrapper, fn: function fn(i) { var ret = templateSpec[i]; ret.decorator = templateSpec[i + '_d']; return ret; }, programs: [], program: function program(i, data, declaredBlockParams, blockParams, depths) { var programWrapper = this.programs[i], fn = this.fn(i); if (data || depths || blockParams || declaredBlockParams) { programWrapper = wrapProgram(this, i, fn, data, declaredBlockParams, blockParams, depths); } else if (!programWrapper) { programWrapper = this.programs[i] = wrapProgram(this, i, fn); } return programWrapper; }, data: function data(value, depth) { while (value && depth--) { value = value._parent; } return value; }, merge: function merge(param, common) { var obj = param || common; if (param && common && param !== common) { obj = Utils.extend({}, common, param); } return obj; }, // An empty object to use as replacement for null-contexts nullContext: Object.seal({}), noop: env.VM.noop, compilerInfo: templateSpec.compiler }; function ret(context) { var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; var data = options.data; ret._setup(options); if (!options.partial && templateSpec.useData) { data = initData(context, data); } var depths = undefined, blockParams = templateSpec.useBlockParams ? [] : undefined; if (templateSpec.useDepths) { if (options.depths) { depths = context != options.depths[0] ? [context].concat(options.depths) : options.depths; } else { depths = [context]; } } function main(context /*, options*/) { return '' + templateSpec.main(container, context, container.helpers, container.partials, data, blockParams, depths); } main = executeDecorators(templateSpec.main, main, container, options.depths || [], data, blockParams); return main(context, options); } ret.isTop = true; ret._setup = function (options) { if (!options.partial) { container.helpers = container.merge(options.helpers, env.helpers); if (templateSpec.usePartial) { container.partials = container.merge(options.partials, env.partials); } if (templateSpec.usePartial || templateSpec.useDecorators) { container.decorators = container.merge(options.decorators, env.decorators); } } else { container.helpers = options.helpers; container.partials = options.partials; container.decorators = options.decorators; } }; ret._child = function (i, data, blockParams, depths) { if (templateSpec.useBlockParams && !blockParams) { throw new _exception2['default']('must pass block params'); } if (templateSpec.useDepths && !depths) { throw new _exception2['default']('must pass parent depths'); } return wrapProgram(container, i, templateSpec[i], data, 0, blockParams, depths); }; return ret; } function wrapProgram(container, i, fn, data, declaredBlockParams, blockParams, depths) { function prog(context) { var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; var currentDepths = depths; if (depths && context != depths[0] && !(context === container.nullContext && depths[0] === null)) { currentDepths = [context].concat(depths); } return fn(container, context, container.helpers, container.partials, options.data || data, blockParams && [options.blockParams].concat(blockParams), currentDepths); } prog = executeDecorators(fn, prog, container, depths, data, blockParams); prog.program = i; prog.depth = depths ? depths.length : 0; prog.blockParams = declaredBlockParams || 0; return prog; } function resolvePartial(partial, context, options) { if (!partial) { if (options.name === '@partial-block') { partial = options.data['partial-block']; } else { partial = options.partials[options.name]; } } else if (!partial.call && !options.name) { // This is a dynamic partial that returned a string options.name = partial; partial = options.partials[partial]; } return partial; } function invokePartial(partial, context, options) { // Use the current closure context to save the partial-block if this partial var currentPartialBlock = options.data && options.data['partial-block']; options.partial = true; if (options.ids) { options.data.contextPath = options.ids[0] || options.data.contextPath; } var partialBlock = undefined; if (options.fn && options.fn !== noop) { (function () { options.data = _base.createFrame(options.data); // Wrapper function to get access to currentPartialBlock from the closure var fn = options.fn; partialBlock = options.data['partial-block'] = function partialBlockWrapper(context) { var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; // Restore the partial-block from the closure for the execution of the block // i.e. the part inside the block of the partial call. options.data = _base.createFrame(options.data); options.data['partial-block'] = currentPartialBlock; return fn(context, options); }; if (fn.partials) { options.partials = Utils.extend({}, options.partials, fn.partials); } })(); } if (partial === undefined && partialBlock) { partial = partialBlock; } if (partial === undefined) { throw new _exception2['default']('The partial ' + options.name + ' could not be found'); } else if (partial instanceof Function) { return partial(context, options); } } function noop() { return ''; } function initData(context, data) { if (!data || !('root' in data)) { data = data ? _base.createFrame(data) : {}; data.root = context; } return data; } function executeDecorators(fn, prog, container, depths, data, blockParams) { if (fn.decorator) { var props = {}; prog = fn.decorator(prog, props, container, depths && depths[0], data, blockParams, depths); Utils.extend(prog, props); } return prog; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL3J1bnRpbWUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7cUJBQXVCLFNBQVM7O0lBQXBCLEtBQUs7O3lCQUNLLGFBQWE7Ozs7b0JBQzhCLFFBQVE7O0FBRWxFLFNBQVMsYUFBYSxDQUFDLFlBQVksRUFBRTtBQUMxQyxNQUFNLGdCQUFnQixHQUFHLFlBQVksSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztNQUN2RCxlQUFlLDBCQUFvQixDQUFDOztBQUUxQyxNQUFJLGdCQUFnQixLQUFLLGVBQWUsRUFBRTtBQUN4QyxRQUFJLGdCQUFnQixHQUFHLGVBQWUsRUFBRTtBQUN0QyxVQUFNLGVBQWUsR0FBRyx1QkFBaUIsZUFBZSxDQUFDO1VBQ25ELGdCQUFnQixHQUFHLHVCQUFpQixnQkFBZ0IsQ0FBQyxDQUFDO0FBQzVELFlBQU0sMkJBQWMseUZBQXlGLEdBQ3ZHLHFEQUFxRCxHQUFHLGVBQWUsR0FBRyxtREFBbUQsR0FBRyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsQ0FBQztLQUNoSyxNQUFNOztBQUVMLFlBQU0sMkJBQWMsd0ZBQXdGLEdBQ3RHLGlEQUFpRCxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztLQUNuRjtHQUNGO0NBQ0Y7O0FBRU0sU0FBUyxRQUFRLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRTs7QUFFMUMsTUFBSSxDQUFDLEdBQUcsRUFBRTtBQUNSLFVBQU0sMkJBQWMsbUNBQW1DLENBQUMsQ0FBQztHQUMxRDtBQUNELE1BQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFO0FBQ3ZDLFVBQU0sMkJBQWMsMkJBQTJCLEdBQUcsT0FBTyxZQUFZLENBQUMsQ0FBQztHQUN4RTs7QUFFRCxjQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDOzs7O0FBSWxELEtBQUcsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQzs7QUFFNUMsV0FBUyxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRTtBQUN2RCxRQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUU7QUFDaEIsYUFBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbEQsVUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFO0FBQ2YsZUFBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7T0FDdkI7S0FDRjs7QUFFRCxXQUFPLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3RFLFFBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQzs7QUFFeEUsUUFBSSxNQUFNLElBQUksSUFBSSxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUU7QUFDakMsYUFBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLGVBQWUsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUN6RixZQUFNLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQzNEO0FBQ0QsUUFBSSxNQUFNLElBQUksSUFBSSxFQUFFO0FBQ2xCLFVBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtBQUNsQixZQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9CLGFBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDNUMsY0FBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUM1QixrQkFBTTtXQUNQOztBQUVELGVBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN0QztBQUNELGNBQU0sR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO09BQzNCO0FBQ0QsYUFBTyxNQUFNLENBQUM7S0FDZixNQUFNO0FBQ0wsWUFBTSwyQkFBYyxjQUFjLEdBQUcsT0FBTyxDQUFDLElBQUksR0FBRywwREFBMEQsQ0FBQyxDQUFDO0tBQ2pIO0dBQ0Y7OztBQUdELE1BQUksU0FBUyxHQUFHO0FBQ2QsVUFBTSxFQUFFLGdCQUFTLEdBQUcsRUFBRSxJQUFJLEVBQUU7QUFDMUIsVUFBSSxFQUFFLElBQUksSUFBSSxHQUFHLENBQUEsQUFBQyxFQUFFO0FBQ2xCLGNBQU0sMkJBQWMsR0FBRyxHQUFHLElBQUksR0FBRyxtQkFBbUIsR0FBRyxHQUFHLENBQUMsQ0FBQztPQUM3RDtBQUNELGFBQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ2xCO0FBQ0QsVUFBTSxFQUFFLGdCQUFTLE1BQU0sRUFBRSxJQUFJLEVBQUU7QUFDN0IsVUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztBQUMxQixXQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzVCLFlBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUU7QUFDeEMsaUJBQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3hCO09BQ0Y7S0FDRjtBQUNELFVBQU0sRUFBRSxnQkFBUyxPQUFPLEVBQUUsT0FBTyxFQUFFO0FBQ2pDLGFBQU8sT0FBTyxPQUFPLEtBQUssVUFBVSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsT0FBTyxDQUFDO0tBQ3hFOztBQUVELG9CQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0I7QUFDeEMsaUJBQWEsRUFBRSxvQkFBb0I7O0FBRW5DLE1BQUUsRUFBRSxZQUFTLENBQUMsRUFBRTtBQUNkLFVBQUksR0FBRyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQixTQUFHLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7QUFDdkMsYUFBTyxHQUFHLENBQUM7S0FDWjs7QUFFRCxZQUFRLEVBQUUsRUFBRTtBQUNaLFdBQU8sRUFBRSxpQkFBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUU7QUFDbkUsVUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7VUFDakMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsVUFBSSxJQUFJLElBQUksTUFBTSxJQUFJLFdBQVcsSUFBSSxtQkFBbUIsRUFBRTtBQUN4RCxzQkFBYyxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLE1BQU0sQ0FBQyxDQUFDO09BQzNGLE1BQU0sSUFBSSxDQUFDLGNBQWMsRUFBRTtBQUMxQixzQkFBYyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7T0FDOUQ7QUFDRCxhQUFPLGNBQWMsQ0FBQztLQUN2Qjs7QUFFRCxRQUFJLEVBQUUsY0FBUyxLQUFLLEVBQUUsS0FBSyxFQUFFO0FBQzNCLGFBQU8sS0FBSyxJQUFJLEtBQUssRUFBRSxFQUFFO0FBQ3ZCLGFBQUssR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO09BQ3ZCO0FBQ0QsYUFBTyxLQUFLLENBQUM7S0FDZDtBQUNELFNBQUssRUFBRSxlQUFTLEtBQUssRUFBRSxNQUFNLEVBQUU7QUFDN0IsVUFBSSxHQUFHLEdBQUcsS0FBSyxJQUFJLE1BQU0sQ0FBQzs7QUFFMUIsVUFBSSxLQUFLLElBQUksTUFBTSxJQUFLLEtBQUssS0FBSyxNQUFNLEFBQUMsRUFBRTtBQUN6QyxXQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO09BQ3ZDOztBQUVELGFBQU8sR0FBRyxDQUFDO0tBQ1o7O0FBRUQsZUFBVyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDOztBQUU1QixRQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJO0FBQ2pCLGdCQUFZLEVBQUUsWUFBWSxDQUFDLFFBQVE7R0FDcEMsQ0FBQzs7QUFFRixXQUFTLEdBQUcsQ0FBQyxPQUFPLEVBQWdCO1FBQWQsT0FBTyx5REFBRyxFQUFFOztBQUNoQyxRQUFJLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDOztBQUV4QixPQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3BCLFFBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLFlBQVksQ0FBQyxPQUFPLEVBQUU7QUFDNUMsVUFBSSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDaEM7QUFDRCxRQUFJLE1BQU0sWUFBQTtRQUNOLFdBQVcsR0FBRyxZQUFZLENBQUMsY0FBYyxHQUFHLEVBQUUsR0FBRyxTQUFTLENBQUM7QUFDL0QsUUFBSSxZQUFZLENBQUMsU0FBUyxFQUFFO0FBQzFCLFVBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtBQUNsQixjQUFNLEdBQUcsT0FBTyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7T0FDM0YsTUFBTTtBQUNMLGNBQU0sR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO09BQ3BCO0tBQ0Y7O0FBRUQsYUFBUyxJQUFJLENBQUMsT0FBTyxnQkFBZTtBQUNsQyxhQUFPLEVBQUUsR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDckg7QUFDRCxRQUFJLEdBQUcsaUJBQWlCLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxNQUFNLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztBQUN0RyxXQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7R0FDL0I7QUFDRCxLQUFHLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQzs7QUFFakIsS0FBRyxDQUFDLE1BQU0sR0FBRyxVQUFTLE9BQU8sRUFBRTtBQUM3QixRQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTtBQUNwQixlQUFTLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7O0FBRWxFLFVBQUksWUFBWSxDQUFDLFVBQVUsRUFBRTtBQUMzQixpQkFBUyxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO09BQ3RFO0FBQ0QsVUFBSSxZQUFZLENBQUMsVUFBVSxJQUFJLFlBQVksQ0FBQyxhQUFhLEVBQUU7QUFDekQsaUJBQVMsQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztPQUM1RTtLQUNGLE1BQU07QUFDTCxlQUFTLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7QUFDcEMsZUFBUyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO0FBQ3RDLGVBQVMsQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztLQUMzQztHQUNGLENBQUM7O0FBRUYsS0FBRyxDQUFDLE1BQU0sR0FBRyxVQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRTtBQUNsRCxRQUFJLFlBQVksQ0FBQyxjQUFjLElBQUksQ0FBQyxXQUFXLEVBQUU7QUFDL0MsWUFBTSwyQkFBYyx3QkFBd0IsQ0FBQyxDQUFDO0tBQy9DO0FBQ0QsUUFBSSxZQUFZLENBQUMsU0FBUyxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQ3JDLFlBQU0sMkJBQWMseUJBQXlCLENBQUMsQ0FBQztLQUNoRDs7QUFFRCxXQUFPLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztHQUNqRixDQUFDO0FBQ0YsU0FBTyxHQUFHLENBQUM7Q0FDWjs7QUFFTSxTQUFTLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRTtBQUM1RixXQUFTLElBQUksQ0FBQyxPQUFPLEVBQWdCO1FBQWQsT0FBTyx5REFBRyxFQUFFOztBQUNqQyxRQUFJLGFBQWEsR0FBRyxNQUFNLENBQUM7QUFDM0IsUUFBSSxNQUFNLElBQUksT0FBTyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLE9BQU8sS0FBSyxTQUFTLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUEsQUFBQyxFQUFFO0FBQ2hHLG1CQUFhLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDMUM7O0FBRUQsV0FBTyxFQUFFLENBQUMsU0FBUyxFQUNmLE9BQU8sRUFDUCxTQUFTLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxRQUFRLEVBQ3JDLE9BQU8sQ0FBQyxJQUFJLElBQUksSUFBSSxFQUNwQixXQUFXLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUN4RCxhQUFhLENBQUMsQ0FBQztHQUNwQjs7QUFFRCxNQUFJLEdBQUcsaUJBQWlCLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQzs7QUFFekUsTUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7QUFDakIsTUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDeEMsTUFBSSxDQUFDLFdBQVcsR0FBRyxtQkFBbUIsSUFBSSxDQUFDLENBQUM7QUFDNUMsU0FBTyxJQUFJLENBQUM7Q0FDYjs7QUFFTSxTQUFTLGNBQWMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRTtBQUN4RCxNQUFJLENBQUMsT0FBTyxFQUFFO0FBQ1osUUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLGdCQUFnQixFQUFFO0FBQ3JDLGFBQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0tBQ3pDLE1BQU07QUFDTCxhQUFPLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDMUM7R0FDRixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRTs7QUFFekMsV0FBTyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7QUFDdkIsV0FBTyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7R0FDckM7QUFDRCxTQUFPLE9BQU8sQ0FBQztDQUNoQjs7QUFFTSxTQUFTLGFBQWEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRTs7QUFFdkQsTUFBTSxtQkFBbUIsR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDMUUsU0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7QUFDdkIsTUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFO0FBQ2YsV0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztHQUN2RTs7QUFFRCxNQUFJLFlBQVksWUFBQSxDQUFDO0FBQ2pCLE1BQUksT0FBTyxDQUFDLEVBQUUsSUFBSSxPQUFPLENBQUMsRUFBRSxLQUFLLElBQUksRUFBRTs7QUFDckMsYUFBTyxDQUFDLElBQUksR0FBRyxrQkFBWSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7O0FBRXpDLFVBQUksRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUM7QUFDcEIsa0JBQVksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLFNBQVMsbUJBQW1CLENBQUMsT0FBTyxFQUFnQjtZQUFkLE9BQU8seURBQUcsRUFBRTs7OztBQUkvRixlQUFPLENBQUMsSUFBSSxHQUFHLGtCQUFZLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QyxlQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLG1CQUFtQixDQUFDO0FBQ3BELGVBQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztPQUM3QixDQUFDO0FBQ0YsVUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO0FBQ2YsZUFBTyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztPQUNwRTs7R0FDRjs7QUFFRCxNQUFJLE9BQU8sS0FBSyxTQUFTLElBQUksWUFBWSxFQUFFO0FBQ3pDLFdBQU8sR0FBRyxZQUFZLENBQUM7R0FDeEI7O0FBRUQsTUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFO0FBQ3pCLFVBQU0sMkJBQWMsY0FBYyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEdBQUcscUJBQXFCLENBQUMsQ0FBQztHQUM1RSxNQUFNLElBQUksT0FBTyxZQUFZLFFBQVEsRUFBRTtBQUN0QyxXQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7R0FDbEM7Q0FDRjs7QUFFTSxTQUFTLElBQUksR0FBRztBQUFFLFNBQU8sRUFBRSxDQUFDO0NBQUU7O0FBRXJDLFNBQVMsUUFBUSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUU7QUFDL0IsTUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUEsQUFBQyxFQUFFO0FBQzlCLFFBQUksR0FBRyxJQUFJLEdBQUcsa0JBQVksSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0FBQ3JDLFFBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO0dBQ3JCO0FBQ0QsU0FBTyxJQUFJLENBQUM7Q0FDYjs7QUFFRCxTQUFTLGlCQUFpQixDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO0FBQ3pFLE1BQUksRUFBRSxDQUFDLFNBQVMsRUFBRTtBQUNoQixRQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7QUFDZixRQUFJLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDNUYsU0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7R0FDM0I7QUFDRCxTQUFPLElBQUksQ0FBQztDQUNiIiwiZmlsZSI6InJ1bnRpbWUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBVdGlscyBmcm9tICcuL3V0aWxzJztcbmltcG9ydCBFeGNlcHRpb24gZnJvbSAnLi9leGNlcHRpb24nO1xuaW1wb3J0IHsgQ09NUElMRVJfUkVWSVNJT04sIFJFVklTSU9OX0NIQU5HRVMsIGNyZWF0ZUZyYW1lIH0gZnJvbSAnLi9iYXNlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrUmV2aXNpb24oY29tcGlsZXJJbmZvKSB7XG4gIGNvbnN0IGNvbXBpbGVyUmV2aXNpb24gPSBjb21waWxlckluZm8gJiYgY29tcGlsZXJJbmZvWzBdIHx8IDEsXG4gICAgICAgIGN1cnJlbnRSZXZpc2lvbiA9IENPTVBJTEVSX1JFVklTSU9OO1xuXG4gIGlmIChjb21waWxlclJldmlzaW9uICE9PSBjdXJyZW50UmV2aXNpb24pIHtcbiAgICBpZiAoY29tcGlsZXJSZXZpc2lvbiA8IGN1cnJlbnRSZXZpc2lvbikge1xuICAgICAgY29uc3QgcnVudGltZVZlcnNpb25zID0gUkVWSVNJT05fQ0hBTkdFU1tjdXJyZW50UmV2aXNpb25dLFxuICAgICAgICAgICAgY29tcGlsZXJWZXJzaW9ucyA9IFJFVklTSU9OX0NIQU5HRVNbY29tcGlsZXJSZXZpc2lvbl07XG4gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdUZW1wbGF0ZSB3YXMgcHJlY29tcGlsZWQgd2l0aCBhbiBvbGRlciB2ZXJzaW9uIG9mIEhhbmRsZWJhcnMgdGhhbiB0aGUgY3VycmVudCBydW50aW1lLiAnICtcbiAgICAgICAgICAgICdQbGVhc2UgdXBkYXRlIHlvdXIgcHJlY29tcGlsZXIgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgcnVudGltZVZlcnNpb25zICsgJykgb3IgZG93bmdyYWRlIHlvdXIgcnVudGltZSB0byBhbiBvbGRlciB2ZXJzaW9uICgnICsgY29tcGlsZXJWZXJzaW9ucyArICcpLicpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVc2UgdGhlIGVtYmVkZGVkIHZlcnNpb24gaW5mbyBzaW5jZSB0aGUgcnVudGltZSBkb2Vzbid0IGtub3cgYWJvdXQgdGhpcyByZXZpc2lvbiB5ZXRcbiAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ1RlbXBsYXRlIHdhcyBwcmVjb21waWxlZCB3aXRoIGEgbmV3ZXIgdmVyc2lvbiBvZiBIYW5kbGViYXJzIHRoYW4gdGhlIGN1cnJlbnQgcnVudGltZS4gJyArXG4gICAgICAgICAgICAnUGxlYXNlIHVwZGF0ZSB5b3VyIHJ1bnRpbWUgdG8gYSBuZXdlciB2ZXJzaW9uICgnICsgY29tcGlsZXJJbmZvWzFdICsgJykuJyk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZW1wbGF0ZSh0ZW1wbGF0ZVNwZWMsIGVudikge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBpZiAoIWVudikge1xuICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ05vIGVudmlyb25tZW50IHBhc3NlZCB0byB0ZW1wbGF0ZScpO1xuICB9XG4gIGlmICghdGVtcGxhdGVTcGVjIHx8ICF0ZW1wbGF0ZVNwZWMubWFpbikge1xuICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ1Vua25vd24gdGVtcGxhdGUgb2JqZWN0OiAnICsgdHlwZW9mIHRlbXBsYXRlU3BlYyk7XG4gIH1cblxuICB0ZW1wbGF0ZVNwZWMubWFpbi5kZWNvcmF0b3IgPSB0ZW1wbGF0ZVNwZWMubWFpbl9kO1xuXG4gIC8vIE5vdGU6IFVzaW5nIGVudi5WTSByZWZlcmVuY2VzIHJhdGhlciB0aGFuIGxvY2FsIHZhciByZWZlcmVuY2VzIHRocm91Z2hvdXQgdGhpcyBzZWN0aW9uIHRvIGFsbG93XG4gIC8vIGZvciBleHRlcm5hbCB1c2VycyB0byBvdmVycmlkZSB0aGVzZSBhcyBwc3VlZG8tc3VwcG9ydGVkIEFQSXMuXG4gIGVudi5WTS5jaGVja1JldmlzaW9uKHRlbXBsYXRlU3BlYy5jb21waWxlcik7XG5cbiAgZnVuY3Rpb24gaW52b2tlUGFydGlhbFdyYXBwZXIocGFydGlhbCwgY29udGV4dCwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmhhc2gpIHtcbiAgICAgIGNvbnRleHQgPSBVdGlscy5leHRlbmQoe30sIGNvbnRleHQsIG9wdGlvbnMuaGFzaCk7XG4gICAgICBpZiAob3B0aW9ucy5pZHMpIHtcbiAgICAgICAgb3B0aW9ucy5pZHNbMF0gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHBhcnRpYWwgPSBlbnYuVk0ucmVzb2x2ZVBhcnRpYWwuY2FsbCh0aGlzLCBwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKTtcbiAgICBsZXQgcmVzdWx0ID0gZW52LlZNLmludm9rZVBhcnRpYWwuY2FsbCh0aGlzLCBwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKTtcblxuICAgIGlmIChyZXN1bHQgPT0gbnVsbCAmJiBlbnYuY29tcGlsZSkge1xuICAgICAgb3B0aW9ucy5wYXJ0aWFsc1tvcHRpb25zLm5hbWVdID0gZW52LmNvbXBpbGUocGFydGlhbCwgdGVtcGxhdGVTcGVjLmNvbXBpbGVyT3B0aW9ucywgZW52KTtcbiAgICAgIHJlc3VsdCA9IG9wdGlvbnMucGFydGlhbHNbb3B0aW9ucy5uYW1lXShjb250ZXh0LCBvcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7XG4gICAgICBpZiAob3B0aW9ucy5pbmRlbnQpIHtcbiAgICAgICAgbGV0IGxpbmVzID0gcmVzdWx0LnNwbGl0KCdcXG4nKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBsaW5lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICBpZiAoIWxpbmVzW2ldICYmIGkgKyAxID09PSBsKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsaW5lc1tpXSA9IG9wdGlvbnMuaW5kZW50ICsgbGluZXNbaV07XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ID0gbGluZXMuam9pbignXFxuJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdUaGUgcGFydGlhbCAnICsgb3B0aW9ucy5uYW1lICsgJyBjb3VsZCBub3QgYmUgY29tcGlsZWQgd2hlbiBydW5uaW5nIGluIHJ1bnRpbWUtb25seSBtb2RlJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gSnVzdCBhZGQgd2F0ZXJcbiAgbGV0IGNvbnRhaW5lciA9IHtcbiAgICBzdHJpY3Q6IGZ1bmN0aW9uKG9iaiwgbmFtZSkge1xuICAgICAgaWYgKCEobmFtZSBpbiBvYmopKSB7XG4gICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oJ1wiJyArIG5hbWUgKyAnXCIgbm90IGRlZmluZWQgaW4gJyArIG9iaik7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqW25hbWVdO1xuICAgIH0sXG4gICAgbG9va3VwOiBmdW5jdGlvbihkZXB0aHMsIG5hbWUpIHtcbiAgICAgIGNvbnN0IGxlbiA9IGRlcHRocy5sZW5ndGg7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGlmIChkZXB0aHNbaV0gJiYgZGVwdGhzW2ldW25hbWVdICE9IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZGVwdGhzW2ldW25hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBsYW1iZGE6IGZ1bmN0aW9uKGN1cnJlbnQsIGNvbnRleHQpIHtcbiAgICAgIHJldHVybiB0eXBlb2YgY3VycmVudCA9PT0gJ2Z1bmN0aW9uJyA/IGN1cnJlbnQuY2FsbChjb250ZXh0KSA6IGN1cnJlbnQ7XG4gICAgfSxcblxuICAgIGVzY2FwZUV4cHJlc3Npb246IFV0aWxzLmVzY2FwZUV4cHJlc3Npb24sXG4gICAgaW52b2tlUGFydGlhbDogaW52b2tlUGFydGlhbFdyYXBwZXIsXG5cbiAgICBmbjogZnVuY3Rpb24oaSkge1xuICAgICAgbGV0IHJldCA9IHRlbXBsYXRlU3BlY1tpXTtcbiAgICAgIHJldC5kZWNvcmF0b3IgPSB0ZW1wbGF0ZVNwZWNbaSArICdfZCddO1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9LFxuXG4gICAgcHJvZ3JhbXM6IFtdLFxuICAgIHByb2dyYW06IGZ1bmN0aW9uKGksIGRhdGEsIGRlY2xhcmVkQmxvY2tQYXJhbXMsIGJsb2NrUGFyYW1zLCBkZXB0aHMpIHtcbiAgICAgIGxldCBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0sXG4gICAgICAgICAgZm4gPSB0aGlzLmZuKGkpO1xuICAgICAgaWYgKGRhdGEgfHwgZGVwdGhzIHx8IGJsb2NrUGFyYW1zIHx8IGRlY2xhcmVkQmxvY2tQYXJhbXMpIHtcbiAgICAgICAgcHJvZ3JhbVdyYXBwZXIgPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbiwgZGF0YSwgZGVjbGFyZWRCbG9ja1BhcmFtcywgYmxvY2tQYXJhbXMsIGRlcHRocyk7XG4gICAgICB9IGVsc2UgaWYgKCFwcm9ncmFtV3JhcHBlcikge1xuICAgICAgICBwcm9ncmFtV3JhcHBlciA9IHRoaXMucHJvZ3JhbXNbaV0gPSB3cmFwUHJvZ3JhbSh0aGlzLCBpLCBmbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvZ3JhbVdyYXBwZXI7XG4gICAgfSxcblxuICAgIGRhdGE6IGZ1bmN0aW9uKHZhbHVlLCBkZXB0aCkge1xuICAgICAgd2hpbGUgKHZhbHVlICYmIGRlcHRoLS0pIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5fcGFyZW50O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sXG4gICAgbWVyZ2U6IGZ1bmN0aW9uKHBhcmFtLCBjb21tb24pIHtcbiAgICAgIGxldCBvYmogPSBwYXJhbSB8fCBjb21tb247XG5cbiAgICAgIGlmIChwYXJhbSAmJiBjb21tb24gJiYgKHBhcmFtICE9PSBjb21tb24pKSB7XG4gICAgICAgIG9iaiA9IFV0aWxzLmV4dGVuZCh7fSwgY29tbW9uLCBwYXJhbSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSxcbiAgICAvLyBBbiBlbXB0eSBvYmplY3QgdG8gdXNlIGFzIHJlcGxhY2VtZW50IGZvciBudWxsLWNvbnRleHRzXG4gICAgbnVsbENvbnRleHQ6IE9iamVjdC5zZWFsKHt9KSxcblxuICAgIG5vb3A6IGVudi5WTS5ub29wLFxuICAgIGNvbXBpbGVySW5mbzogdGVtcGxhdGVTcGVjLmNvbXBpbGVyXG4gIH07XG5cbiAgZnVuY3Rpb24gcmV0KGNvbnRleHQsIG9wdGlvbnMgPSB7fSkge1xuICAgIGxldCBkYXRhID0gb3B0aW9ucy5kYXRhO1xuXG4gICAgcmV0Ll9zZXR1cChvcHRpb25zKTtcbiAgICBpZiAoIW9wdGlvbnMucGFydGlhbCAmJiB0ZW1wbGF0ZVNwZWMudXNlRGF0YSkge1xuICAgICAgZGF0YSA9IGluaXREYXRhKGNvbnRleHQsIGRhdGEpO1xuICAgIH1cbiAgICBsZXQgZGVwdGhzLFxuICAgICAgICBibG9ja1BhcmFtcyA9IHRlbXBsYXRlU3BlYy51c2VCbG9ja1BhcmFtcyA/IFtdIDogdW5kZWZpbmVkO1xuICAgIGlmICh0ZW1wbGF0ZVNwZWMudXNlRGVwdGhzKSB7XG4gICAgICBpZiAob3B0aW9ucy5kZXB0aHMpIHtcbiAgICAgICAgZGVwdGhzID0gY29udGV4dCAhPSBvcHRpb25zLmRlcHRoc1swXSA/IFtjb250ZXh0XS5jb25jYXQob3B0aW9ucy5kZXB0aHMpIDogb3B0aW9ucy5kZXB0aHM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZXB0aHMgPSBbY29udGV4dF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFpbihjb250ZXh0LyosIG9wdGlvbnMqLykge1xuICAgICAgcmV0dXJuICcnICsgdGVtcGxhdGVTcGVjLm1haW4oY29udGFpbmVyLCBjb250ZXh0LCBjb250YWluZXIuaGVscGVycywgY29udGFpbmVyLnBhcnRpYWxzLCBkYXRhLCBibG9ja1BhcmFtcywgZGVwdGhzKTtcbiAgICB9XG4gICAgbWFpbiA9IGV4ZWN1dGVEZWNvcmF0b3JzKHRlbXBsYXRlU3BlYy5tYWluLCBtYWluLCBjb250YWluZXIsIG9wdGlvbnMuZGVwdGhzIHx8IFtdLCBkYXRhLCBibG9ja1BhcmFtcyk7XG4gICAgcmV0dXJuIG1haW4oY29udGV4dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0LmlzVG9wID0gdHJ1ZTtcblxuICByZXQuX3NldHVwID0gZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIGlmICghb3B0aW9ucy5wYXJ0aWFsKSB7XG4gICAgICBjb250YWluZXIuaGVscGVycyA9IGNvbnRhaW5lci5tZXJnZShvcHRpb25zLmhlbHBlcnMsIGVudi5oZWxwZXJzKTtcblxuICAgICAgaWYgKHRlbXBsYXRlU3BlYy51c2VQYXJ0aWFsKSB7XG4gICAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IGNvbnRhaW5lci5tZXJnZShvcHRpb25zLnBhcnRpYWxzLCBlbnYucGFydGlhbHMpO1xuICAgICAgfVxuICAgICAgaWYgKHRlbXBsYXRlU3BlYy51c2VQYXJ0aWFsIHx8IHRlbXBsYXRlU3BlYy51c2VEZWNvcmF0b3JzKSB7XG4gICAgICAgIGNvbnRhaW5lci5kZWNvcmF0b3JzID0gY29udGFpbmVyLm1lcmdlKG9wdGlvbnMuZGVjb3JhdG9ycywgZW52LmRlY29yYXRvcnMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb250YWluZXIuaGVscGVycyA9IG9wdGlvbnMuaGVscGVycztcbiAgICAgIGNvbnRhaW5lci5wYXJ0aWFscyA9IG9wdGlvbnMucGFydGlhbHM7XG4gICAgICBjb250YWluZXIuZGVjb3JhdG9ycyA9IG9wdGlvbnMuZGVjb3JhdG9ycztcbiAgICB9XG4gIH07XG5cbiAgcmV0Ll9jaGlsZCA9IGZ1bmN0aW9uKGksIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpIHtcbiAgICBpZiAodGVtcGxhdGVTcGVjLnVzZUJsb2NrUGFyYW1zICYmICFibG9ja1BhcmFtcykge1xuICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignbXVzdCBwYXNzIGJsb2NrIHBhcmFtcycpO1xuICAgIH1cbiAgICBpZiAodGVtcGxhdGVTcGVjLnVzZURlcHRocyAmJiAhZGVwdGhzKSB7XG4gICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCdtdXN0IHBhc3MgcGFyZW50IGRlcHRocycpO1xuICAgIH1cblxuICAgIHJldHVybiB3cmFwUHJvZ3JhbShjb250YWluZXIsIGksIHRlbXBsYXRlU3BlY1tpXSwgZGF0YSwgMCwgYmxvY2tQYXJhbXMsIGRlcHRocyk7XG4gIH07XG4gIHJldHVybiByZXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3cmFwUHJvZ3JhbShjb250YWluZXIsIGksIGZuLCBkYXRhLCBkZWNsYXJlZEJsb2NrUGFyYW1zLCBibG9ja1BhcmFtcywgZGVwdGhzKSB7XG4gIGZ1bmN0aW9uIHByb2coY29udGV4dCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgbGV0IGN1cnJlbnREZXB0aHMgPSBkZXB0aHM7XG4gICAgaWYgKGRlcHRocyAmJiBjb250ZXh0ICE9IGRlcHRoc1swXSAmJiAhKGNvbnRleHQgPT09IGNvbnRhaW5lci5udWxsQ29udGV4dCAmJiBkZXB0aHNbMF0gPT09IG51bGwpKSB7XG4gICAgICBjdXJyZW50RGVwdGhzID0gW2NvbnRleHRdLmNvbmNhdChkZXB0aHMpO1xuICAgIH1cblxuICAgIHJldHVybiBmbihjb250YWluZXIsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIGNvbnRhaW5lci5oZWxwZXJzLCBjb250YWluZXIucGFydGlhbHMsXG4gICAgICAgIG9wdGlvbnMuZGF0YSB8fCBkYXRhLFxuICAgICAgICBibG9ja1BhcmFtcyAmJiBbb3B0aW9ucy5ibG9ja1BhcmFtc10uY29uY2F0KGJsb2NrUGFyYW1zKSxcbiAgICAgICAgY3VycmVudERlcHRocyk7XG4gIH1cblxuICBwcm9nID0gZXhlY3V0ZURlY29yYXRvcnMoZm4sIHByb2csIGNvbnRhaW5lciwgZGVwdGhzLCBkYXRhLCBibG9ja1BhcmFtcyk7XG5cbiAgcHJvZy5wcm9ncmFtID0gaTtcbiAgcHJvZy5kZXB0aCA9IGRlcHRocyA/IGRlcHRocy5sZW5ndGggOiAwO1xuICBwcm9nLmJsb2NrUGFyYW1zID0gZGVjbGFyZWRCbG9ja1BhcmFtcyB8fCAwO1xuICByZXR1cm4gcHJvZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVQYXJ0aWFsKHBhcnRpYWwsIGNvbnRleHQsIG9wdGlvbnMpIHtcbiAgaWYgKCFwYXJ0aWFsKSB7XG4gICAgaWYgKG9wdGlvbnMubmFtZSA9PT0gJ0BwYXJ0aWFsLWJsb2NrJykge1xuICAgICAgcGFydGlhbCA9IG9wdGlvbnMuZGF0YVsncGFydGlhbC1ibG9jayddO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJ0aWFsID0gb3B0aW9ucy5wYXJ0aWFsc1tvcHRpb25zLm5hbWVdO1xuICAgIH1cbiAgfSBlbHNlIGlmICghcGFydGlhbC5jYWxsICYmICFvcHRpb25zLm5hbWUpIHtcbiAgICAvLyBUaGlzIGlzIGEgZHluYW1pYyBwYXJ0aWFsIHRoYXQgcmV0dXJuZWQgYSBzdHJpbmdcbiAgICBvcHRpb25zLm5hbWUgPSBwYXJ0aWFsO1xuICAgIHBhcnRpYWwgPSBvcHRpb25zLnBhcnRpYWxzW3BhcnRpYWxdO1xuICB9XG4gIHJldHVybiBwYXJ0aWFsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW52b2tlUGFydGlhbChwYXJ0aWFsLCBjb250ZXh0LCBvcHRpb25zKSB7XG4gIC8vIFVzZSB0aGUgY3VycmVudCBjbG9zdXJlIGNvbnRleHQgdG8gc2F2ZSB0aGUgcGFydGlhbC1ibG9jayBpZiB0aGlzIHBhcnRpYWxcbiAgY29uc3QgY3VycmVudFBhcnRpYWxCbG9jayA9IG9wdGlvbnMuZGF0YSAmJiBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXTtcbiAgb3B0aW9ucy5wYXJ0aWFsID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMuaWRzKSB7XG4gICAgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoID0gb3B0aW9ucy5pZHNbMF0gfHwgb3B0aW9ucy5kYXRhLmNvbnRleHRQYXRoO1xuICB9XG5cbiAgbGV0IHBhcnRpYWxCbG9jaztcbiAgaWYgKG9wdGlvbnMuZm4gJiYgb3B0aW9ucy5mbiAhPT0gbm9vcCkge1xuICAgIG9wdGlvbnMuZGF0YSA9IGNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7XG4gICAgLy8gV3JhcHBlciBmdW5jdGlvbiB0byBnZXQgYWNjZXNzIHRvIGN1cnJlbnRQYXJ0aWFsQmxvY2sgZnJvbSB0aGUgY2xvc3VyZVxuICAgIGxldCBmbiA9IG9wdGlvbnMuZm47XG4gICAgcGFydGlhbEJsb2NrID0gb3B0aW9ucy5kYXRhWydwYXJ0aWFsLWJsb2NrJ10gPSBmdW5jdGlvbiBwYXJ0aWFsQmxvY2tXcmFwcGVyKGNvbnRleHQsIG9wdGlvbnMgPSB7fSkge1xuXG4gICAgICAvLyBSZXN0b3JlIHRoZSBwYXJ0aWFsLWJsb2NrIGZyb20gdGhlIGNsb3N1cmUgZm9yIHRoZSBleGVjdXRpb24gb2YgdGhlIGJsb2NrXG4gICAgICAvLyBpLmUuIHRoZSBwYXJ0IGluc2lkZSB0aGUgYmxvY2sgb2YgdGhlIHBhcnRpYWwgY2FsbC5cbiAgICAgIG9wdGlvbnMuZGF0YSA9IGNyZWF0ZUZyYW1lKG9wdGlvbnMuZGF0YSk7XG4gICAgICBvcHRpb25zLmRhdGFbJ3BhcnRpYWwtYmxvY2snXSA9IGN1cnJlbnRQYXJ0aWFsQmxvY2s7XG4gICAgICByZXR1cm4gZm4oY29udGV4dCwgb3B0aW9ucyk7XG4gICAgfTtcbiAgICBpZiAoZm4ucGFydGlhbHMpIHtcbiAgICAgIG9wdGlvbnMucGFydGlhbHMgPSBVdGlscy5leHRlbmQoe30sIG9wdGlvbnMucGFydGlhbHMsIGZuLnBhcnRpYWxzKTtcbiAgICB9XG4gIH1cblxuICBpZiAocGFydGlhbCA9PT0gdW5kZWZpbmVkICYmIHBhcnRpYWxCbG9jaykge1xuICAgIHBhcnRpYWwgPSBwYXJ0aWFsQmxvY2s7XG4gIH1cblxuICBpZiAocGFydGlhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEV4Y2VwdGlvbignVGhlIHBhcnRpYWwgJyArIG9wdGlvbnMubmFtZSArICcgY291bGQgbm90IGJlIGZvdW5kJyk7XG4gIH0gZWxzZSBpZiAocGFydGlhbCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XG4gICAgcmV0dXJuIHBhcnRpYWwoY29udGV4dCwgb3B0aW9ucyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vb3AoKSB7IHJldHVybiAnJzsgfVxuXG5mdW5jdGlvbiBpbml0RGF0YShjb250ZXh0LCBkYXRhKSB7XG4gIGlmICghZGF0YSB8fCAhKCdyb290JyBpbiBkYXRhKSkge1xuICAgIGRhdGEgPSBkYXRhID8gY3JlYXRlRnJhbWUoZGF0YSkgOiB7fTtcbiAgICBkYXRhLnJvb3QgPSBjb250ZXh0O1xuICB9XG4gIHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBleGVjdXRlRGVjb3JhdG9ycyhmbiwgcHJvZywgY29udGFpbmVyLCBkZXB0aHMsIGRhdGEsIGJsb2NrUGFyYW1zKSB7XG4gIGlmIChmbi5kZWNvcmF0b3IpIHtcbiAgICBsZXQgcHJvcHMgPSB7fTtcbiAgICBwcm9nID0gZm4uZGVjb3JhdG9yKHByb2csIHByb3BzLCBjb250YWluZXIsIGRlcHRocyAmJiBkZXB0aHNbMF0sIGRhdGEsIGJsb2NrUGFyYW1zLCBkZXB0aHMpO1xuICAgIFV0aWxzLmV4dGVuZChwcm9nLCBwcm9wcyk7XG4gIH1cbiAgcmV0dXJuIHByb2c7XG59XG4iXX0= /***/ }), /***/ "./node_modules/handlebars/dist/cjs/handlebars/safe-string.js": /*!********************************************************************!*\ !*** ./node_modules/handlebars/dist/cjs/handlebars/safe-string.js ***! \********************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; // Build out our basic SafeString type exports.__esModule = true; function SafeString(string) { this.string = string; } SafeString.prototype.toString = SafeString.prototype.toHTML = function () { return '' + this.string; }; exports['default'] = SafeString; module.exports = exports['default']; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL3NhZmUtc3RyaW5nLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFDQSxTQUFTLFVBQVUsQ0FBQyxNQUFNLEVBQUU7QUFDMUIsTUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7Q0FDdEI7O0FBRUQsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsWUFBVztBQUN2RSxTQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0NBQ3pCLENBQUM7O3FCQUVhLFVBQVUiLCJmaWxlIjoic2FmZS1zdHJpbmcuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBCdWlsZCBvdXQgb3VyIGJhc2ljIFNhZmVTdHJpbmcgdHlwZVxuZnVuY3Rpb24gU2FmZVN0cmluZyhzdHJpbmcpIHtcbiAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7XG59XG5cblNhZmVTdHJpbmcucHJvdG90eXBlLnRvU3RyaW5nID0gU2FmZVN0cmluZy5wcm90b3R5cGUudG9IVE1MID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAnJyArIHRoaXMuc3RyaW5nO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgU2FmZVN0cmluZztcbiJdfQ== /***/ }), /***/ "./node_modules/handlebars/dist/cjs/handlebars/utils.js": /*!**************************************************************!*\ !*** ./node_modules/handlebars/dist/cjs/handlebars/utils.js ***! \**************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; exports.__esModule = true; exports.extend = extend; exports.indexOf = indexOf; exports.escapeExpression = escapeExpression; exports.isEmpty = isEmpty; exports.createFrame = createFrame; exports.blockParams = blockParams; exports.appendContextPath = appendContextPath; var escape = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''', '`': '`', '=': '=' }; var badChars = /[&<>"'`=]/g, possible = /[&<>"'`=]/; function escapeChar(chr) { return escape[chr]; } function extend(obj /* , ...source */) { for (var i = 1; i < arguments.length; i++) { for (var key in arguments[i]) { if (Object.prototype.hasOwnProperty.call(arguments[i], key)) { obj[key] = arguments[i][key]; } } } return obj; } var toString = Object.prototype.toString; exports.toString = toString; // Sourced from lodash // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt /* eslint-disable func-style */ var isFunction = function isFunction(value) { return typeof value === 'function'; }; // fallback for older versions of Chrome and Safari /* istanbul ignore next */ if (isFunction(/x/)) { exports.isFunction = isFunction = function (value) { return typeof value === 'function' && toString.call(value) === '[object Function]'; }; } exports.isFunction = isFunction; /* eslint-enable func-style */ /* istanbul ignore next */ var isArray = Array.isArray || function (value) { return value && typeof value === 'object' ? toString.call(value) === '[object Array]' : false; }; exports.isArray = isArray; // Older IE versions do not directly support indexOf so we must implement our own, sadly. function indexOf(array, value) { for (var i = 0, len = array.length; i < len; i++) { if (array[i] === value) { return i; } } return -1; } function escapeExpression(string) { if (typeof string !== 'string') { // don't escape SafeStrings, since they're already safe if (string && string.toHTML) { return string.toHTML(); } else if (string == null) { return ''; } else if (!string) { return string + ''; } // Force a string conversion as this will be done by the append regardless and // the regex test will do this transparently behind the scenes, causing issues if // an object's to string has escaped characters in it. string = '' + string; } if (!possible.test(string)) { return string; } return string.replace(badChars, escapeChar); } function isEmpty(value) { if (!value && value !== 0) { return true; } else if (isArray(value) && value.length === 0) { return true; } else { return false; } } function createFrame(object) { var frame = extend({}, object); frame._parent = object; return frame; } function blockParams(params, ids) { params.path = ids; return params; } function appendContextPath(contextPath, id) { return (contextPath ? contextPath + '.' : '') + id; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9oYW5kbGViYXJzL3V0aWxzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQSxJQUFNLE1BQU0sR0FBRztBQUNiLEtBQUcsRUFBRSxPQUFPO0FBQ1osS0FBRyxFQUFFLE1BQU07QUFDWCxLQUFHLEVBQUUsTUFBTTtBQUNYLEtBQUcsRUFBRSxRQUFRO0FBQ2IsS0FBRyxFQUFFLFFBQVE7QUFDYixLQUFHLEVBQUUsUUFBUTtBQUNiLEtBQUcsRUFBRSxRQUFRO0NBQ2QsQ0FBQzs7QUFFRixJQUFNLFFBQVEsR0FBRyxZQUFZO0lBQ3ZCLFFBQVEsR0FBRyxXQUFXLENBQUM7O0FBRTdCLFNBQVMsVUFBVSxDQUFDLEdBQUcsRUFBRTtBQUN2QixTQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztDQUNwQjs7QUFFTSxTQUFTLE1BQU0sQ0FBQyxHQUFHLG9CQUFtQjtBQUMzQyxPQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN6QyxTQUFLLElBQUksR0FBRyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUM1QixVQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEVBQUU7QUFDM0QsV0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztPQUM5QjtLQUNGO0dBQ0Y7O0FBRUQsU0FBTyxHQUFHLENBQUM7Q0FDWjs7QUFFTSxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQzs7Ozs7O0FBS2hELElBQUksVUFBVSxHQUFHLG9CQUFTLEtBQUssRUFBRTtBQUMvQixTQUFPLE9BQU8sS0FBSyxLQUFLLFVBQVUsQ0FBQztDQUNwQyxDQUFDOzs7QUFHRixJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtBQUNuQixVQUlNLFVBQVUsR0FKaEIsVUFBVSxHQUFHLFVBQVMsS0FBSyxFQUFFO0FBQzNCLFdBQU8sT0FBTyxLQUFLLEtBQUssVUFBVSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssbUJBQW1CLENBQUM7R0FDcEYsQ0FBQztDQUNIO1FBQ08sVUFBVSxHQUFWLFVBQVU7Ozs7O0FBSVgsSUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSxVQUFTLEtBQUssRUFBRTtBQUN0RCxTQUFPLEFBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsR0FBSSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLGdCQUFnQixHQUFHLEtBQUssQ0FBQztDQUNqRyxDQUFDOzs7OztBQUdLLFNBQVMsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUU7QUFDcEMsT0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNoRCxRQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEVBQUU7QUFDdEIsYUFBTyxDQUFDLENBQUM7S0FDVjtHQUNGO0FBQ0QsU0FBTyxDQUFDLENBQUMsQ0FBQztDQUNYOztBQUdNLFNBQVMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFO0FBQ3ZDLE1BQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFOztBQUU5QixRQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO0FBQzNCLGFBQU8sTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO0tBQ3hCLE1BQU0sSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFO0FBQ3pCLGFBQU8sRUFBRSxDQUFDO0tBQ1gsTUFBTSxJQUFJLENBQUMsTUFBTSxFQUFFO0FBQ2xCLGFBQU8sTUFBTSxHQUFHLEVBQUUsQ0FBQztLQUNwQjs7Ozs7QUFLRCxVQUFNLEdBQUcsRUFBRSxHQUFHLE1BQU0sQ0FBQztHQUN0Qjs7QUFFRCxNQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUFFLFdBQU8sTUFBTSxDQUFDO0dBQUU7QUFDOUMsU0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztDQUM3Qzs7QUFFTSxTQUFTLE9BQU8sQ0FBQyxLQUFLLEVBQUU7QUFDN0IsTUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLEtBQUssQ0FBQyxFQUFFO0FBQ3pCLFdBQU8sSUFBSSxDQUFDO0dBQ2IsTUFBTSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtBQUMvQyxXQUFPLElBQUksQ0FBQztHQUNiLE1BQU07QUFDTCxXQUFPLEtBQUssQ0FBQztHQUNkO0NBQ0Y7O0FBRU0sU0FBUyxXQUFXLENBQUMsTUFBTSxFQUFFO0FBQ2xDLE1BQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDL0IsT0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7QUFDdkIsU0FBTyxLQUFLLENBQUM7Q0FDZDs7QUFFTSxTQUFTLFdBQVcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFO0FBQ3ZDLFFBQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO0FBQ2xCLFNBQU8sTUFBTSxDQUFDO0NBQ2Y7O0FBRU0sU0FBUyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFO0FBQ2pELFNBQU8sQ0FBQyxXQUFXLEdBQUcsV0FBVyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUEsR0FBSSxFQUFFLENBQUM7Q0FDcEQiLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBlc2NhcGUgPSB7XG4gICcmJzogJyZhbXA7JyxcbiAgJzwnOiAnJmx0OycsXG4gICc+JzogJyZndDsnLFxuICAnXCInOiAnJnF1b3Q7JyxcbiAgXCInXCI6ICcmI3gyNzsnLFxuICAnYCc6ICcmI3g2MDsnLFxuICAnPSc6ICcmI3gzRDsnXG59O1xuXG5jb25zdCBiYWRDaGFycyA9IC9bJjw+XCInYD1dL2csXG4gICAgICBwb3NzaWJsZSA9IC9bJjw+XCInYD1dLztcblxuZnVuY3Rpb24gZXNjYXBlQ2hhcihjaHIpIHtcbiAgcmV0dXJuIGVzY2FwZVtjaHJdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5kKG9iai8qICwgLi4uc291cmNlICovKSB7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgZm9yIChsZXQga2V5IGluIGFyZ3VtZW50c1tpXSkge1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhcmd1bWVudHNbaV0sIGtleSkpIHtcbiAgICAgICAgb2JqW2tleV0gPSBhcmd1bWVudHNbaV1ba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG5leHBvcnQgbGV0IHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcblxuLy8gU291cmNlZCBmcm9tIGxvZGFzaFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2Jlc3RpZWpzL2xvZGFzaC9ibG9iL21hc3Rlci9MSUNFTlNFLnR4dFxuLyogZXNsaW50LWRpc2FibGUgZnVuYy1zdHlsZSAqL1xubGV0IGlzRnVuY3Rpb24gPSBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufTtcbi8vIGZhbGxiYWNrIGZvciBvbGRlciB2ZXJzaW9ucyBvZiBDaHJvbWUgYW5kIFNhZmFyaVxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmlmIChpc0Z1bmN0aW9uKC94LykpIHtcbiAgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbiAgfTtcbn1cbmV4cG9ydCB7aXNGdW5jdGlvbn07XG4vKiBlc2xpbnQtZW5hYmxlIGZ1bmMtc3R5bGUgKi9cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbmV4cG9ydCBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbih2YWx1ZSkge1xuICByZXR1cm4gKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpID8gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IEFycmF5XScgOiBmYWxzZTtcbn07XG5cbi8vIE9sZGVyIElFIHZlcnNpb25zIGRvIG5vdCBkaXJlY3RseSBzdXBwb3J0IGluZGV4T2Ygc28gd2UgbXVzdCBpbXBsZW1lbnQgb3VyIG93biwgc2FkbHkuXG5leHBvcnQgZnVuY3Rpb24gaW5kZXhPZihhcnJheSwgdmFsdWUpIHtcbiAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgaWYgKGFycmF5W2ldID09PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cblxuXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlRXhwcmVzc2lvbihzdHJpbmcpIHtcbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgLy8gZG9uJ3QgZXNjYXBlIFNhZmVTdHJpbmdzLCBzaW5jZSB0aGV5J3JlIGFscmVhZHkgc2FmZVxuICAgIGlmIChzdHJpbmcgJiYgc3RyaW5nLnRvSFRNTCkge1xuICAgICAgcmV0dXJuIHN0cmluZy50b0hUTUwoKTtcbiAgICB9IGVsc2UgaWYgKHN0cmluZyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfSBlbHNlIGlmICghc3RyaW5nKSB7XG4gICAgICByZXR1cm4gc3RyaW5nICsgJyc7XG4gICAgfVxuXG4gICAgLy8gRm9yY2UgYSBzdHJpbmcgY29udmVyc2lvbiBhcyB0aGlzIHdpbGwgYmUgZG9uZSBieSB0aGUgYXBwZW5kIHJlZ2FyZGxlc3MgYW5kXG4gICAgLy8gdGhlIHJlZ2V4IHRlc3Qgd2lsbCBkbyB0aGlzIHRyYW5zcGFyZW50bHkgYmVoaW5kIHRoZSBzY2VuZXMsIGNhdXNpbmcgaXNzdWVzIGlmXG4gICAgLy8gYW4gb2JqZWN0J3MgdG8gc3RyaW5nIGhhcyBlc2NhcGVkIGNoYXJhY3RlcnMgaW4gaXQuXG4gICAgc3RyaW5nID0gJycgKyBzdHJpbmc7XG4gIH1cblxuICBpZiAoIXBvc3NpYmxlLnRlc3Qoc3RyaW5nKSkgeyByZXR1cm4gc3RyaW5nOyB9XG4gIHJldHVybiBzdHJpbmcucmVwbGFjZShiYWRDaGFycywgZXNjYXBlQ2hhcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5KHZhbHVlKSB7XG4gIGlmICghdmFsdWUgJiYgdmFsdWUgIT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIGlmIChpc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZyYW1lKG9iamVjdCkge1xuICBsZXQgZnJhbWUgPSBleHRlbmQoe30sIG9iamVjdCk7XG4gIGZyYW1lLl9wYXJlbnQgPSBvYmplY3Q7XG4gIHJldHVybiBmcmFtZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJsb2NrUGFyYW1zKHBhcmFtcywgaWRzKSB7XG4gIHBhcmFtcy5wYXRoID0gaWRzO1xuICByZXR1cm4gcGFyYW1zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kQ29udGV4dFBhdGgoY29udGV4dFBhdGgsIGlkKSB7XG4gIHJldHVybiAoY29udGV4dFBhdGggPyBjb250ZXh0UGF0aCArICcuJyA6ICcnKSArIGlkO1xufVxuIl19 /***/ }), /***/ "./node_modules/handlebars/runtime.js": /*!********************************************!*\ !*** ./node_modules/handlebars/runtime.js ***! \********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { // Create a simple path alias to allow browserify to resolve // the runtime on a supported path. module.exports = __webpack_require__(/*! ./dist/cjs/handlebars.runtime */ "./node_modules/handlebars/dist/cjs/handlebars.runtime.js")['default']; /***/ }), /***/ "./node_modules/webpack/buildin/global.js": /*!***********************************!*\ !*** (webpack)/buildin/global.js ***! \***********************************/ /*! no static exports found */ /***/ (function(module, exports) { var g; // This works in non-strict mode g = (function() { return this; })(); try { // This works if eval is allowed (see CSP) g = g || Function("return this")() || (1, eval)("this"); } catch (e) { // This works if the window reference is available if (typeof window === "object") g = window; } // g can still be undefined, but nothing to do about it... // We return undefined, instead of nothing here, so it's // easier to handle this case. if(!global) { ...} module.exports = g; /***/ }), /***/ "./src/css/main.styl": /*!***************************!*\ !*** ./src/css/main.styl ***! \***************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { // extracted by mini-css-extract-plugin /***/ }), /***/ "./src/index.js": /*!**********************!*\ !*** ./src/index.js ***! \**********************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(global) {/** * @fileoverview The entry file of fullcalendar * @author NHN FE Development Lab */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var Calendar = __webpack_require__(/*! ./js/factory/calendar */ "./src/js/factory/calendar.js"); __webpack_require__(/*! ./css/main.styl */ "./src/css/main.styl"); __webpack_require__(/*! ./js/view/template/helper */ "./src/js/view/template/helper.js"); // for jquery if (global.jQuery) { global.jQuery.fn.tuiCalendar = function() { var options, instance; var el = this.get(0); var args = Array.prototype.slice.apply(arguments); if (el) { options = util.pick(args, 0) || {}; instance = global.jQuery.data(el, 'tuiCalendar'); if (instance) { if (typeof options === 'string' && instance[options]) { return instance[options].apply(instance, args.slice(1)); } } else { instance = new Calendar(el, options); global.jQuery.data(el, 'tuiCalendar', instance); } } return this; }; } module.exports = Calendar; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) /***/ }), /***/ "./src/js/common/array.js": /*!********************************!*\ !*** ./src/js/common/array.js ***! \********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Utility module for array sort, binary search. * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var datetime = __webpack_require__(/*! ../common/datetime */ "./src/js/common/datetime.js"); /** * A module for sorting array. * @module array */ /********** * Search **********/ /** * search item index using binary search algorithm. * * the array must be sorted. * @param {array} arr array to search. * @param {(string|number|boolean)} search value to search. * @param {function} [fn] iteratee for retrieve each element's value to search. * @param {function} [compare] compare function for specific sort status. default is string ascending. * @returns {number} The number of item index searched. return negative number when no exist that item. * It can use insert index after Math.abs() * @example * * var arr = [1, 3, 7, 11, 15, 23]; * * function sortNumber(a, b) { * return a - b; * } * * bsearch(arr, 15, null, sortNumber); // 4 * bsearch(arr, 21, null, sortNumber); // -5 * * arr.splice(Math.abs(bsearch(arr, 21, null, sortNumber)), 0, 21); * // [1, 2, 7, 11, 15, 21, 23] */ function bsearch(arr, search, fn, compare) { var minIndex = 0, maxIndex = arr.length - 1, currentIndex, value, comp; compare = compare || stringASC; while (minIndex <= maxIndex) { currentIndex = (minIndex + maxIndex) / 2 | 0; // Math.floor value = fn ? fn(arr[currentIndex]) : arr[currentIndex]; comp = compare(value, search); if (comp < 0) { minIndex = currentIndex + 1; } else if (comp > 0) { maxIndex = currentIndex - 1; } else { return currentIndex; } } return ~maxIndex; } /********** * Compare Functions **********/ /** * compare function for array sort. * * sort array by ascending. * @param {boolean} a The boolean to compare * @param {boolean} b The boolean to compare. * @returns {number} Result of comparison. */ function booleanASC(a, b) { if (a !== b) { return a ? -1 : 1; } return 0; } /** * compare function for array sort. * * sort array by descending. * @param {boolean} a The boolean to compare * @param {boolean} b The boolean to compare. * @returns {number} Result of comparison. */ function booleanDESC(a, b) { if (a !== b) { return a ? 1 : -1; } return 0; } /** * compare function for array sort. * * sort array by number ascending. * @param {number} _a The number to compare. * @param {number} _b The number to compare. * @returns {number} Result of comparison. */ function numberASC(_a, _b) { var a = Number(_a), b = Number(_b); return a - b; } /** * compare function for array sort. * * sort array by number descending. * @param {number} _a The number to compare. * @param {number} _b The number to compare. * @returns {number} Result of comparison. */ function numberDESC(_a, _b) { var a = Number(_a), b = Number(_b); return b - a; } /** * compare function for array sort. * * sort array by string ascending * @param {string} _a The string to compare. * @param {string} _b The string to compare. * @returns {number} Result of comparison. */ function stringASC(_a, _b) { var a = String(_a), b = String(_b); if (a > b) { return 1; } if (a < b) { return -1; } return 0; } /** * compare function for array sort. * * sort array by string descending * @param {string} _a The string to compare. * @param {string} _b The string to compare. * @returns {number} Result of comparison. */ function stringDESC(_a, _b) { var a = String(_a), b = String(_b); if (a > b) { return -1; } if (a < b) { return 1; } return 0; } /** * compare function for array sort. * * sort array by string ascending with ignore case. * @param {string} _a The string to compare. * @param {string} _b The string to compare. * @returns {number} Result of comparison. */ function stringASCIgnoreCase(_a, _b) { var a = String(_a).toLowerCase(), b = String(_b).toLowerCase(); if (a > b) { return 1; } if (a < b) { return -1; } return 0; } /** * compare function for array sort. * * sort array by string descending with ignore case. * @param {string} _a The string to compare. * @param {string} _b The string to compare. * @returns {number} Result of comparison. */ function stringDESCIgnoreCase(_a, _b) { var a = String(_a).toLowerCase(), b = String(_b).toLowerCase(); if (a > b) { return -1; } if (a < b) { return 1; } return 0; } /** * Compare schedule models for sort. * * 1. all day schedule first. * 2. early start. * 3. longest duration. * 4. early created. * @param {Schedule|ScheduleViewModel} a The object schedule instance. * @param {Schedule|ScheduleViewModel} b The object schedule instance. * @returns {number} Result of comparison. */ function scheduleASC(a, b) { var durationA, durationB; var allDayCompare, startsCompare; var modelA = a.valueOf(); var modelB = b.valueOf(); allDayCompare = booleanASC(modelA.isAllDay || a.hasMultiDates, modelB.isAllDay || b.hasMultiDates); if (allDayCompare) { return allDayCompare; } startsCompare = datetime.compare(a.getStarts(), b.getStarts()); if (startsCompare) { return startsCompare; } durationA = a.duration(); durationB = b.duration(); if (durationA < durationB) { return 1; } if (durationA > durationB) { return -1; } return util.stamp(modelA) - util.stamp(modelB); } module.exports = { bsearch: bsearch, compare: { schedule: { asc: scheduleASC }, bool: { asc: booleanASC, desc: booleanDESC }, num: { asc: numberASC, desc: numberDESC }, str: { asc: stringASC, desc: stringDESC, ascIgnoreCase: stringASCIgnoreCase, descIgnoreCase: stringDESCIgnoreCase } } }; /***/ }), /***/ "./src/js/common/autoScroll.js": /*!*************************************!*\ !*** ./src/js/common/autoScroll.js ***! \*************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(global) {/** * @fileoverview Add autoscroll feature to elements that prevented text selection. * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var domevent = __webpack_require__(/*! ../common/domevent */ "./src/js/common/domevent.js"); var domutil = __webpack_require__(/*! ../common/domutil */ "./src/js/common/domutil.js"); var Point = __webpack_require__(/*! ../common/point */ "./src/js/common/point.js"); var SCROLL_INTERVAL = 30; var SCROLL_MAX = 15; var SCROLL_CLICK_INCREASED = 2; // In IE, the offset of the actual UI pixel when the scroll bar is clicked is offset. /** * Add autoscroll feature to elements that prevented text selection. * @constructor * @param {HTMLElement} container - HTMLElement to add autoscroll features. */ function AutoScroll(container) { /** * @type {HTMLElement} */ this.container = container; /** * @type {AutoScroll.DIRECTION} */ this._direction = AutoScroll.DIRECTION.INSIDE; /** * @type {number} */ this._offset = 0; /** * interval to scrolling * @type {number} */ this._intervalID = 0; domevent.on(container, { 'mousedown': this._onMouseDown }, this); } /** * @enum */ AutoScroll.DIRECTION = { INSIDE: 0, TOP: 1, RIGHT: 2, BOTTOM: 3, LEFT: 4 }; /** * Instance destroy method. */ AutoScroll.prototype.destroy = function() { domevent.off(this.container, { 'mousedown': this._onMouseDown, 'mousemove': this._onMouseMove, 'mouseup': this._onMouseUp }, this); window.clearInterval(this._intervalID); this._intervalID = this._direction = this.container = null; }; /** * Normalize ClientRect and calculate each position of edges. * @param {ClientRect} clientRect - ClientRect object of element. * @returns {object} edges. */ AutoScroll.prototype._getEdgePositions = function(clientRect) { return { top: clientRect.top, right: clientRect.left + clientRect.width, bottom: clientRect.bottom, left: clientRect.left }; }; /** * Get element real size ("real size" -> size without scrollbar) * @param {HTMLElement} el - element want to know real size ("real size" -> size without scrollbar) * @returns {number[]} real size [width, height] */ AutoScroll.prototype.getRealSize = function(el) { var computed = domutil.getComputedStyle(el), border, padding; border = parseFloat(computed.getPropertyValue('border-top-width')) + parseFloat(computed.getPropertyValue('border-bottom-width')); padding = parseFloat(computed.getPropertyValue('padding-top')) + parseFloat(computed.getPropertyValue('padding-bottom')); return [el.clientWidth + border + padding, el.clientHeight + border + padding]; }; /** * Check supplied element has scrollbar. * @param {HTMLElement} el - element want to know has scrollbar. * @returns {boolean[]} has scrollbar? [horizontal, vertical] */ AutoScroll.prototype.hasScrollbar = function(el) { var realSize = this.getRealSize(el); return [ el.offsetWidth > Math.ceil(realSize[0]), el.offsetHeight > Math.ceil(realSize[1]) ]; }; /** * @param {HTMLElement} el - element want to know. * @param {MouseEvent} mouseEvent - mouse event object. * @returns {boolean} mouse pointer is on the scrollbar? */ AutoScroll.prototype.isOnScrollbar = function(el, mouseEvent) { var realSize = this.getRealSize(el), pos = domevent.getMousePosition(mouseEvent, el), mouseInScrollbar = false; mouseInScrollbar = (realSize[0] - SCROLL_CLICK_INCREASED < pos[0] || realSize[1] - SCROLL_CLICK_INCREASED < pos[1]); return mouseInScrollbar; }; /** * MouseDown event handler * @param {MouseEvent} mouseDownEvent - mouse down event */ AutoScroll.prototype._onMouseDown = function(mouseDownEvent) { // only primary button can start drag. if (domevent.getMouseButton(mouseDownEvent) !== 0) { return; } // deactivate autoscroll feature when mouse is on the scrollbar. (IE) if (util.browser.msie && this.isOnScrollbar(this.container, mouseDownEvent)) { return; } window.clearInterval(this._intervalID); this._intervalID = window.setInterval(util.bind(this._onTick, this), SCROLL_INTERVAL); domevent.on(global, { 'mousemove': this._onMouseMove, 'mouseup': this._onMouseUp }, this); }; /** * MouseMove event handler * @param {MouseEvent} mouseEvent - mouse move event object. */ AutoScroll.prototype._onMouseMove = function(mouseEvent) { var edge = this._getEdgePositions(this.container.getBoundingClientRect()), pos = Point.n(domevent.getMousePosition(mouseEvent)); if (pos.y >= edge.top && pos.y <= edge.bottom && pos.x >= edge.left && pos.x <= edge.right) { this._direction = AutoScroll.DIRECTION.INSIDE; return; } if (pos.y < edge.top) { this._direction = AutoScroll.DIRECTION.TOP; this._offset = edge.top - pos.y; return; } if (pos.y > edge.bottom) { this._direction = AutoScroll.DIRECTION.BOTTOM; this._offset = pos.y - edge.bottom; return; } if (pos.x < edge.left) { this._direction = AutoScroll.DIRECTION.LEFT; this._offset = edge.left - pos.x; return; } this._direction = AutoScroll.DIRECTION.RIGHT; this._offset = pos.x - edge.right; }; /** * MouseUp event handler. */ AutoScroll.prototype._onMouseUp = function() { window.clearInterval(this._intervalID); this._intervalID = 0; this._direction = AutoScroll.DIRECTION.INSIDE; this._offset = 0; domevent.off(global, { 'mousemove': this._onMouseMove, 'mouseup': this._onMouseUp }, this); }; /** * Interval tick event handler */ AutoScroll.prototype._onTick = function() { var direction = this._direction, container, factor; if (!direction) { return; } container = this.container; factor = Math.min(this._offset, SCROLL_MAX); switch (direction) { case AutoScroll.DIRECTION.TOP: container.scrollTop -= factor; break; case AutoScroll.DIRECTION.RIGHT: container.scrollLeft += factor; break; case AutoScroll.DIRECTION.BOTTOM: container.scrollTop += factor; break; default: container.scrollLeft -= factor; break; } }; module.exports = AutoScroll; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) /***/ }), /***/ "./src/js/common/collection.js": /*!*************************************!*\ !*** ./src/js/common/collection.js ***! \*************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Common collections. * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var forEachProp = util.forEachOwnProperties, forEachArr = util.forEachArray, isFunc = util.isFunction, isObj = util.isObject; var aps = Array.prototype.slice; /** * Common collection. * * It need function for get model's unique id. * * if the function is not supplied then it use default function {@link Collection#getItemID} * @constructor * @param {function} [getItemIDFn] function for get model's id. */ function Collection(getItemIDFn) { /** * @type {object.<string, *>} */ this.items = {}; /** * @type {number} */ this.length = 0; if (isFunc(getItemIDFn)) { /** * @type {function} */ this.getItemID = getItemIDFn; } } /********** * static props **********/ /** * Combind supplied function filters and condition. * @param {...function} filters - function filters * @returns {function} combined filter */ Collection.and = function(filters) { var cnt; filters = aps.call(arguments); cnt = filters.length; return function(item) { var i = 0; for (; i < cnt; i += 1) { if (!filters[i].call(null, item)) { return false; } } return true; }; }; /** * Combine multiple function filters with OR clause. * @param {...function} filters - function filters * @returns {function} combined filter */ Collection.or = function(filters) { var cnt; filters = aps.call(arguments); cnt = filters.length; return function(item) { var i = 1, result = filters[0].call(null, item); for (; i < cnt; i += 1) { result = (result || filters[i].call(null, item)); } return result; }; }; /** * Merge several collections. * * You can\'t merge collections different _getScheduleID functions. Take case of use. * @param {...Collection} collections collection arguments to merge * @returns {Collection} merged collection. */ Collection.merge = function(collections) { // eslint-disable-line var cols = aps.call(arguments), newItems = {}, merged = new Collection(cols[0].getItemID), extend = util.extend; forEachArr(cols, function(col) { extend(newItems, col.items); }); merged.items = newItems; merged.length = util.keys(merged.items).length; return merged; }; /********** * prototype props **********/ /** * get model's unique id. * @param {object} item model instance. * @returns {number} model unique id. */ Collection.prototype.getItemID = function(item) { return String(item._id); }; /** * add models. * @param {...*} item models to add this collection. */ Collection.prototype.add = function(item) { var self = this, id, ownItems; if (arguments.length > 1) { forEachArr(aps.call(arguments), function(o) { self.add(o); }); return; } id = this.getItemID(item); ownItems = this.items; if (!ownItems[id]) { this.length += 1; } ownItems[id] = item; }; /** * remove models. * @param {...(object|string|number)} id model instance or unique id to delete. * @returns {array} deleted model list. */ Collection.prototype.remove = function(id) { var self = this, removed = [], ownItems, itemToRemove; if (!this.length) { return removed; } if (arguments.length > 1) { removed = util.map(aps.call(arguments), function(_id) { return self.remove(_id); }); return removed; } ownItems = this.items; if (isObj(id)) { id = this.getItemID(id); } if (!ownItems[id]) { return removed; } this.length -= 1; itemToRemove = ownItems[id]; delete ownItems[id]; return itemToRemove; }; /** * remove all models in collection. */ Collection.prototype.clear = function() { this.items = {}; this.length = 0; }; /** * check collection has specific model. * @param {(object|string|number|function)} id model instance or id or filter function to check * @returns {boolean} is has model? */ Collection.prototype.has = function(id) { var isFilter, has; if (!this.length) { return false; } isFilter = isFunc(id); has = false; if (isFilter) { this.each(function(item) { if (id(item) === true) { has = true; return false; // returning false can stop this loop } return true; }); } else { id = isObj(id) ? this.getItemID(id) : id; has = util.isExisty(this.items[id]); } return has; }; /** * invoke callback when model exist in collection. * @param {(string|number)} id model unique id. * @param {function} fn the callback. * @param {*} [context] callback context. */ Collection.prototype.doWhenHas = function(id, fn, context) { var item = this.items[id]; if (!util.isExisty(item)) { return; } fn.call(context || this, item); }; /** * Search model. and return new collection. * @param {function} filter filter function. * @returns {Collection} new collection with filtered models. * @example * collection.find(function(item) { * return item.edited === true; * }); * * function filter1(item) { * return item.edited === false; * } * * function filter2(item) { * return item.disabled === false; * } * * collection.find(Collection.and(filter1, filter2)); * * collection.find(Collection.or(filter1, filter2)); */ Collection.prototype.find = function(filter) { var result = new Collection(); if (this.hasOwnProperty('getItemID')) { result.getItemID = this.getItemID; } this.each(function(item) { if (filter(item) === true) { result.add(item); } }); return result; }; /** * Group element by specific key values. * * if key parameter is function then invoke it and use returned value. * @param {(string|number|function|array)} key key property or getter function. * if string[] supplied, create each collection before grouping. * @param {function} [groupFunc] - function that return each group's key * @returns {object.<string, Collection>} grouped object * @example * * // pass `string`, `number`, `boolean` type value then group by property value. * collection.groupBy('gender'); // group by 'gender' property value. * collection.groupBy(50); // group by '50' property value. * * // pass `function` then group by return value. each invocation `function` is called with `(item)`. * collection.groupBy(function(item) { * if (item.score > 60) { * return 'pass'; * } * return 'fail'; * }); * * // pass `array` with first arguments then create each collection before grouping. * collection.groupBy(['go', 'ruby', 'javascript']); * // result: { 'go': empty Collection, 'ruby': empty Collection, 'javascript': empty Collection } * * // can pass `function` with `array` then group each elements. * collection.groupBy(['go', 'ruby', 'javascript'], function(item) { * if (item.isFast) { * return 'go'; * } * * return item.name; * }); */ Collection.prototype.groupBy = function(key, groupFunc) { var result = {}, collection, baseValue, keyIsFunc = isFunc(key), getItemIDFn = this.getItemID; if (util.isArray(key)) { util.forEachArray(key, function(k) { result[String(k)] = new Collection(getItemIDFn); }); if (!groupFunc) { return result; } key = groupFunc; keyIsFunc = true; } this.each(function(item) { if (keyIsFunc) { baseValue = key(item); } else { baseValue = item[key]; if (isFunc(baseValue)) { baseValue = baseValue.apply(item); } } collection = result[baseValue]; if (!collection) { collection = result[baseValue] = new Collection(getItemIDFn); } collection.add(item); }); return result; }; /** * Return single item in collection. * * Returned item is inserted in this collection firstly. * @param {function} [filter] - function filter * @returns {object} item. */ Collection.prototype.single = function(filter) { var result, useFilter = util.isFunction(filter); this.each(function(item) { if (!useFilter) { result = item; return false; // returning false can stop this loop } if (filter(item)) { result = item; return false; // returning false can stop this loop } return true; }, this); return result; }; /** * sort a basis of supplied compare function. * @param {function} compareFunction compareFunction * @returns {array} sorted array. */ Collection.prototype.sort = function(compareFunction) { var arr = []; this.each(function(item) { arr.push(item); }); if (isFunc(compareFunction)) { arr = arr.sort(compareFunction); } return arr; }; /** * iterate each model element. * * when iteratee return false then break the loop. * @param {function} iteratee iteratee(item, index, items) * @param {*} [context] context */ Collection.prototype.each = function(iteratee, context) { forEachProp(this.items, iteratee, context || this); }; /** * return new array with collection items. * @returns {array} new array. */ Collection.prototype.toArray = function() { if (!this.length) { return []; } return util.map(this.items, function(item) { return item; }); }; module.exports = Collection; /***/ }), /***/ "./src/js/common/common.js": /*!*********************************!*\ !*** ./src/js/common/common.js ***! \*********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview common/general utilities. * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var aps = Array.prototype.slice; var domutil = __webpack_require__(/*! ../common/domutil */ "./src/js/common/domutil.js"), Collection = __webpack_require__(/*! ../common/collection */ "./src/js/common/collection.js"); /** * Default schedule id getter for collection * @param {Schedule} schedule - schedule instance * @returns {string} schedule id */ function scheduleIDGetter(schedule) { return schedule.cid(); } module.exports = { /** * @param {...*} initItems - items to add newly created collection. * @returns {Collection} new collection for schedule models. */ createScheduleCollection: function(initItems) { // eslint-disable-line var collection = new Collection(scheduleIDGetter); if (arguments.length) { collection.add.apply(collection, arguments); } return collection; }, /** * Get ratio value. * * a : b = y : X; * * = * * X = (b * y) / a; * @param {number} a - a * @param {number} b - b * @param {number} y - y * @returns {number} ratio value */ ratio: function(a, b, y) { // a : b = y : x; return (b * y) / a; }, /** * Find nearest value from supplied params. * @param {number} value - value to find. * @param {array} nearest - nearest array. * @returns {number} nearest value */ nearest: function(value, nearest) { var diff = util.map(nearest, function(v) { return Math.abs(value - v); }), nearestIndex = util.inArray(Math.min.apply(null, diff), diff); return nearest[nearestIndex]; }, /** * pick value from object then return utility object to treat it. * @param {object} obj - object to search supplied path property. * @param {...string} paths - rest parameter that string value to search property in object. * @returns {object} pick object. */ pick2: function(obj, paths) { // eslint-disable-line var result = util.pick.apply(null, arguments), pick; pick = { /** * @returns {*} picked value. */ val: function() { return result; }, /** * invoke supplied function in picked object. * * the callback context is set picked object. * @param {string|function} fn - function to invoke in picked object. * @returns {*} result of invoke. */ then: function(fn) { var args; if (!result) { return undefined; //eslint-disable-line } args = aps.call(arguments, 1); if (util.isString(fn)) { return (util.pick(result, fn) || function() {}).apply(result, args); } return fn.call(result, result); } }; return pick; }, /** * Mixin method. * * (extend methods except property name 'mixin') * @param {object} from - mixin object. * @param {object} to - object to mixin. */ mixin: function(from, to) { util.extend(to.prototype, from); }, /** * Limit supplied value base on `minArr`, `maxArr` * @param {number} value - value * @param {array} minArr - min * @param {array} maxArr - max * @returns {number} limited value */ limit: function(value, minArr, maxArr) { var v = Math.max.apply(null, [value].concat(minArr)); v = Math.min.apply(null, [v].concat(maxArr)); return v; }, /** * Limit supplied date base on `min`, `max` * @param {TZDate} date - date * @param {TZDate} min - min * @param {TZDate} max - max * @returns {TZDate} limited value */ limitDate: function(date, min, max) { if (date < min) { return min; } if (date > max) { return max; } return date; }, /** * Max value with TZDate type for timezone calculation * @param {TZDate} d1 - date 1 * @param {TZDate} d2 - date 2 * @returns {TZDate} */ maxDate: function(d1, d2) { if (d1 > d2) { return d1; } return d2; }, stripTags: function(str) { return str.replace(/<([^>]+)>/ig, ''); }, /** * Get first value in 2-dimentional array. * @param {Array.<Array>} arr2d - 2-dimentional array * @returns {*} first value in 2d array */ firstIn2dArray: function(arr2d) { return util.pick(arr2d, '0', '0'); }, /** * Get last value in 2-dimentional array. * @param {Array.<Array>} arr2d - 2-dimentional array * @returns {*} last value in 2d array */ lastIn2dArray: function(arr2d) { var lastRow = arr2d.length - 1, lastCol = arr2d[lastRow].length - 1; return util.pick(arr2d, lastRow, lastCol); }, /** * Set 'title' attribute for all element that has exceeded content in * container * @param {string} selector - CSS selector {@see domutil#find} * @param {HTMLElement} container - container element * @param {boolean} force - force to apply */ setAutoEllipsis: function(selector, container, force) { util.forEach(domutil.find(selector, container, true), function(el) { if (force || el.offsetWidth < el.scrollWidth) { el.setAttribute('title', domutil.getData(el, 'title')); } }); }, /** * Set the value at path of object. * @param {object} object - the object to modify * @param {string} path -the path of property to set * @param {*} value - the value to set */ set: function(object, path, value) { var names = path.split('.'); var store = object; util.forEach(names, function(name, index) { store[name] = store[name] || {}; if (index === names.length - 1) { store[name] = value; } else { store = store[name]; } }); }, /** * shift a array * @param {Array.<any>} array - array * @param {number} shift - positive or negative integer to shift * @returns {Array.<any>} shifted array */ shiftArray: function(array, shift) { var length = Math.abs(shift); var i; if (shift > 0) { for (i = 0; i < length; i += 1) { array.push(array.shift()); } } else if (shift < 0) { for (i = 0; i < length; i += 1) { array.unshift(array.pop()); } } return array; }, /** * take elements from array between start and end. * @param {Array.<any>} array - array * @param {number} start - start index * @param {number} end - end index * @returns {Array.<any>} */ takeArray: function(array, start, end) { var length = array.length; var rightCount = length - end; var leftCount = start; // remove right array.splice(end, rightCount); // remove left array.splice(0, leftCount); return array; }, /** * shift hours * @param {number} hours - hours * @param {number} shift - positive or negative integer to shift * @returns {number} shifted hours */ shiftHours: function(hours, shift) { if (shift > 0) { hours = (hours + shift) % 24; } else if (shift < 0) { hours += shift; hours = hours > 0 ? hours : 24 + hours; } return hours; }, /** * Parse css value into number and units * @param {string} cssValue - css value like '72px' * @returns {Array} [number, unit] */ parseUnit: function(cssValue) { var number = parseFloat(cssValue, 10); var unit = cssValue.match(/[\d.\-+]*\s*(.*)/)[1] || ''; return [number, unit]; }, find: function(array, iteratee, contextopt) { var found; util.forEach(array, function(item) { if (iteratee) { found = iteratee(item); } if (found) { found = item; return false; } return true; }, contextopt); return found; } }; /***/ }), /***/ "./src/js/common/datetime.js": /*!***********************************!*\ !*** ./src/js/common/datetime.js ***! \***********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(global) {/** * @fileoverview datetime utility module * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var TZDate = __webpack_require__(/*! ./timezone */ "./src/js/common/timezone.js").Date, dw = __webpack_require__(/*! ../common/dw */ "./src/js/common/dw.js"); var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); /* eslint-disable no-useless-escape */ var dateFormatRx = /^(\d{4}[-|\/]*\d{2}[-|\/]*\d{2})\s?(\d{2}:\d{2}:\d{2})?$/; var datetime, tokenFunc; var memo = { millisecondsTo: {}, millisecondsFrom: {} }; tokenFunc = { /** * @param {TZDate} date date object. * @returns {string} YYYYMMDD */ 'YYYYMMDD': function(date) { return [ date.getFullYear(), datetime.leadingZero(date.getMonth() + 1, 2), datetime.leadingZero(date.getDate(), 2) ].join(''); }, /** * @param {TZDate} date date object * @returns {string} four digit year number */ 'YYYY': function(date) { return String(date.getFullYear()); }, /** * @param {TZDate} date date object * @returns {string} two digit month number */ 'MM': function(date) { return datetime.leadingZero(date.getMonth() + 1, 2); }, /** * @param {TZDate} date date object * @returns {string} two digit date number */ 'DD': function(date) { return datetime.leadingZero(date.getDate(), 2); }, /** * @param {TZDate} date date object * @returns {string} HH:mm */ 'HH:mm': function(date) { var hour = date.getHours(), minutes = date.getMinutes(); return datetime.leadingZero(hour, 2) + ':' + datetime.leadingZero(minutes, 2); }, /** * @param {TZDate} date date object * @returns {string} hh:mm */ 'hh:mm': function(date) { var hour = Math.floor(date.getHours() % 12), minutes = date.getMinutes(); return datetime.leadingZero(hour, 2) + ':' + datetime.leadingZero(minutes, 2); }, /** * @param {TZDate} date date object * @returns {string} tt */ 'tt': function(date) { var hour = date.getHours(); return hour < 12 ? 'am' : 'pm'; } }; datetime = { /** * The number of milliseconds one day. * @type {number} */ MILLISECONDS_PER_DAY: 86400000, /** * The number of milliseconds one hour. * @type {number} */ MILLISECONDS_PER_HOUR: 3600000, /** * The number of milliseconds one minutes. * @type {number} */ MILLISECONDS_PER_MINUTES: 60000, /** * The number of milliseconds 20 minutes for schedule min duration * @type {number} */ MILLISECONDS_SCHEDULE_MIN_DURATION: 20 * 60000, /** * convert milliseconds * @param {string} type - type of value. * @param {number} value - value to convert. * @param {function} iteratee - iteratee function to use reduce. * @returns {number} converted value. */ _convMilliseconds: function(type, value, iteratee) { var conv = [24, 60, 60, 1000], index = { day: 0, hour: 1, minutes: 2, seconds: 3 }; if (!(type in index) || global.isNaN(value)) { return false; } return util.reduce([value].concat(conv.slice(index[type])), iteratee); }, /** * Convert milliseconds value to other type * @param {type} type convert to type want to. support "day", "hour", * "minutes", "seconds" only. * @param {value} value - value to convert. * @returns {number} converted value. */ millisecondsTo: function(type, value) { var cache = memo.millisecondsTo, key = type + value; if (cache[key]) { return cache[key]; } cache[key] = datetime._convMilliseconds(type, value, function(m, v) { return m / v; }); return cache[key]; }, /** * Convert value to milliseconds * @param {type} type - type of supplied value. support "hour", "minutes", "seconds" only. * @param {value} value - value to convert. * @returns {number} converted value. */ millisecondsFrom: function(type, value) { var cache = memo.millisecondsFrom, key = type + value; if (cache[key]) { return cache[key]; } cache[key] = datetime._convMilliseconds(type, value, function(m, v) { return m * v; }); return cache[key]; }, /** * Convert hours to minutes * @param {number} hours - hours * @returns {number} minutes */ minutesFromHours: function(hours) { return hours * 60; }, /** * Make date array from supplied paramters. * @param {TZDate} start Start date. * @param {TZDate} end End date. * @param {number} step The number of milliseconds to use increment. * @returns {TZDate[]} TZDate array. */ range: function(start, end, step) { var startTime = start.getTime(); var endTime = end.getTime(); var cursor = startTime; var date = dw(new TZDate(start)); var result = []; while (cursor <= endTime && endTime >= date.d.getTime()) { result.push(datetime.start(date.d)); cursor = cursor + step; date.addDate(1); } return result; }, /** * Clone supplied date. * @param {TZDate} date date object to clone. * @returns {TZDate} Cloned date object */ clone: function(date) { return new TZDate(date); }, /** * Compare two dates. * * when first date is latest then seconds then return -1. * * return +1 reverse, and return 0 is same. * @param {TZDate} d1 Date object to compare. * @param {TZDate} d2 Date object to compare. * @returns {number} result of compare */ compare: function(d1, d2) { var _d1 = d1.getTime(), _d2 = d2.getTime(); if (_d1 < _d2) { return -1; } if (_d1 > _d2) { return 1; } return 0; }, /** * @param {TZDate} d1 - date one * @param {TZDate} d2 - date two * @returns {boolean} is two date are same year, month? */ isSameMonth: function(d1, d2) { return (d1.getFullYear() === d2.getFullYear() && d1.getMonth() === d2.getMonth()); }, /** * @param {TZDate} d1 - date one * @param {TZDate} d2 - date two * @returns {boolean} is two date are same year, month, date? */ isSameDate: function(d1, d2) { var sameMonth = datetime.isSameMonth(d1, d2); return sameMonth && (d1.getDate() === d2.getDate()); }, /** * Check supplied parameter is valid date object. * @param {*} d Object to validate. * @returns {boolean} return true when parameter is valid date object. */ isValid: function(d) { if (d instanceof TZDate) { return !window.isNaN(d.getTime()); } return false; }, /** * convert non local date to UTC date. * @param {TZDate} d Date to convert UTC. * @returns {TZDate} The UTC Date. */ toUTC: function(d) { var l = d.getTime(), offset = datetime.millisecondsFrom('minutes', new Date().getTimezoneOffset()); return new TZDate(l + offset); }, /** * pad left zero characters. * @param {number} number number value to pad zero. * @param {number} length pad length to want. * @returns {string} padded string. */ leadingZero: function(number, length) { var zero = '', i = 0; if (String(number).length > length) { return String(number); } for (; i < (length - 1); i += 1) { zero += '0'; } return (zero + number).slice(length * -1); }, /** * Convert date string to date object. * * Only listed below formats avaliable. * * - YYYYMMDD * - YYYY/MM/DD * - YYYY-MM-DD * - YYYY/MM/DD HH:mm:SS * - YYYY-MM-DD HH:mm:SS * * @param {string} str Formatted string. * @param {number} [fixMonth=-1] - number for fix month calculating. * @returns {(TZDate|boolean)} Converted Date object. when supplied str is not available then return false. */ parse: function(str, fixMonth) { var separator, matches = str.match(dateFormatRx), ymd, hms; if (util.isUndefined(fixMonth)) { fixMonth = -1; } if (!matches) { return false; } if (str.length > 8) { // YYYY/MM/DD // YYYY-MM-DD // YYYY/MM/DD HH:mm:SS // YYYY-MM-DD HH:mm:SS separator = ~str.indexOf('/') ? '/' : '-'; matches = matches.splice(1); ymd = matches[0].split(separator); hms = matches[1] ? matches[1].split(':') : [0, 0, 0]; } else { // YYYYMMDD matches = matches[0]; ymd = [matches.substr(0, 4), matches.substr(4, 2), matches.substr(6, 2)]; hms = [0, 0, 0]; } return new TZDate().setWithRaw( Number(ymd[0]), Number(ymd[1]) + fixMonth, Number(ymd[2]), Number(hms[0]), Number(hms[1]), Number(hms[2]), 0 ); }, /** * Return date object from Date. * @param {TZDate} date date * @returns {object} Date object. */ raw: function(date) { return { y: date.getFullYear(), M: date.getMonth(), d: date.getDate(), h: date.getHours(), m: date.getMinutes(), s: date.getSeconds(), ms: date.getMilliseconds() }; }, /** * Return 00:00:00 supplied date. * @param {TZDate} date date. if undefined, use now. * @returns {TZDate} start date. */ start: function(date) { var d = date ? new TZDate(date) : new TZDate(); d.setHours(0, 0, 0, 0); return d; }, /** * Return 23:59:59 supplied date. * @param {TZDate} date date. if undefined, use now. * @returns {TZDate} end date. */ end: function(date) { var d = date ? new TZDate(date) : new TZDate(); d.setHours(23, 59, 59, 0); return d; }, /** * Return formatted string as basis of supplied string. * * Supported Token Lists. * * - YYYY => 1988 * - MM => 01 ~ 12 * - DD => 01 ~ 31 * - YYYYMMDD => 19880925 * @param {TZDate} date String want to formatted. * @param {string} format format str. * @returns {string} Formatted date string. */ format: function(date, format) { var result = format; util.forEachOwnProperties(tokenFunc, function(converter, token) { result = result.replace(token, converter(date)); }); return result; }, /** * Get start date of specific month * @param {TZDate} date - date to get start date * @returns {TZDate} start date of supplied month */ startDateOfMonth: function(date) { var startDate = new TZDate(date); startDate.setDate(1); startDate.setHours(0, 0, 0, 0); return startDate; }, /** * Get end date of specific month * @param {TZDate} date - date to get end date * @returns {TZDate} end date of supplied month */ endDateOfMonth: function(date) { var endDate = datetime.startDateOfMonth(date); endDate.setMonth(endDate.getMonth() + 1); endDate.setDate(endDate.getDate() - 1); endDate.setHours(23, 59, 59); return endDate; }, /** * Return 2-dimensional array month calendar * * dates that different month with given date are negative values * @param {TZDate} month - date want to calculate month calendar * @param {object} options - options * @param {number} [options.startDayOfWeek=0] - start day of week * @param {boolean} options.isAlways6Week - whether the number of weeks are always 6 * @param {number} options.visibleWeeksCount visible weeks count * @param {boolean} options.workweek - only show work week * @param {function} [iteratee] - iteratee for customizing calendar object * @returns {Array.<TZDate[]>} calendar 2d array */ arr2dCalendar: function(month, options, iteratee) { var weekArr, start, end, startIndex, endIndex, totalDate, afterDates, cursor, week, calendar = [], startDayOfWeek = options.startDayOfWeek, isAlways6Week = util.isUndefined(options.isAlways6Week) ? true : options.isAlways6Week, visibleWeeksCount = options.visibleWeeksCount, workweek = options.workweek; if (visibleWeeksCount) { start = new TZDate(month); end = dw(new TZDate(month)); end.addDate(7 * (visibleWeeksCount - 1)); end = end.d; } else { start = datetime.startDateOfMonth(month); end = datetime.endDateOfMonth(month); } // create day number array by startDayOfWeek number // 4 -> [4, 5, 6, 0, 1, 2, 3] // 2 -> [2, 3, 4, 5, 6, 0, 1] weekArr = util.range(startDayOfWeek, 7).concat(util.range(7)).slice(0, 7); startIndex = util.inArray(start.getDay(), weekArr); endIndex = util.inArray(end.getDay(), weekArr); // free dates after last date of this month afterDates = 7 - (endIndex + 1); if (visibleWeeksCount) { totalDate = 7 * visibleWeeksCount; } else { totalDate = isAlways6Week ? (7 * 6) : (startIndex + end.getDate() + afterDates); } cursor = datetime.start(start).addDate(-startIndex); // iteratee all dates to render util.forEachArray(util.range(totalDate), function(i) { var date; if (!(i % 7)) { // group each date by week week = calendar[i / 7] = []; } date = datetime.start(cursor); date = iteratee ? iteratee(date) : date; if (!workweek || !datetime.isWeekend(date.getDay())) { week.push(date); } // add date cursor.setDate(cursor.getDate() + 1); }); return calendar; }, /** * Calculate grid left(%), width(%) by narrowWeekend, startDayOfWeek, workweek * * @param {number} days - day length of week * @param {boolean} narrowWeekend - narrow weekend * @param {number} startDayOfWeek - start day of week * @param {boolean} workweek - only show work week * @returns {Array} day, left, width */ getGridLeftAndWidth: function(days, narrowWeekend, startDayOfWeek, workweek) { var limitDaysToApplyNarrowWeekend = 5; var uniformWidth = 100 / days; var wideWidth = days > limitDaysToApplyNarrowWeekend ? 100 / (days - 1) : uniformWidth; var accumulatedWidth = 0; var dates = util.range(startDayOfWeek, 7).concat(util.range(days)).slice(0, 7); if (workweek) { dates = util.filter(dates, function(day) { return !datetime.isWeekend(day); }); } narrowWeekend = workweek ? false : narrowWeekend; return util.map(dates, function(day) { var model; var width = narrowWeekend ? wideWidth : uniformWidth; if (days > limitDaysToApplyNarrowWeekend && narrowWeekend && datetime.isWeekend(day)) { width = wideWidth / 2; } model = { day: day, width: width, left: accumulatedWidth }; accumulatedWidth += width; return model; }); }, /** * Get that day is weekend * @param {number} day number * @returns {boolean} true if weekend or false */ isWeekend: function(day) { return day === 0 || day === 6; }, /** * Whether date is between supplied dates with date value? * @param {TZDate} d - target date * @param {TZDate} d1 - from date * @param {TZDate} d2 - to date * @returns {boolean} is between? */ isBetweenWithDate: function(d, d1, d2) { var format = 'YYYYMMDD'; d = parseInt(datetime.format(d, format), 10); d1 = parseInt(datetime.format(d1, format), 10); d2 = parseInt(datetime.format(d2, format), 10); return d1 <= d && d <= d2; } }; module.exports = datetime; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) /***/ }), /***/ "./src/js/common/dirty.js": /*!********************************!*\ !*** ./src/js/common/dirty.js ***! \********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Dirty flagging module for objects. * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var common = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var existy = common.isExisty, pick = common.pick, isFunc = common.isFunction; /** * Mixin module for dirty flagging on specific objects. * @mixin * @example * var obj = { hello: 'good', test: '123' }; * dirty.mixin(obj); * * obj.set('hello', 'world'); * obj.isDirty(); // true * obj.isPropChanged('hello'); // true * obj.isPropChanged('test'); // false * obj.dirty(false); * * obj.isDirty(); // false * obj.isPropChanged('hello'); // false */ var dirty = { /** * Set property value with dirty flagging. * @param {string} propName Property name. * @param {*} value Proprty value. */ set: function(propName, value) { var originValue = this[propName]; if (originValue === value) { return; } this[propName] = value; if (!this._changed) { /** * Save changed properties. * @memberof dirty * @name _changed * @type {Object} */ this._changed = {}; } this._changed[propName] = true; /** * Dirty flag * @type {Boolean} * @name _dirty * @memberof dirty */ this._dirty = true; }, /** * Check dirty flag. * @returns {boolean} Property is changed. */ isDirty: function() { return !!this._dirty; }, /** * Set dirty flag manually. * @param {Boolean} [toDirty=true] This will set dirty flag directly. */ dirty: function(toDirty) { toDirty = existy(toDirty) ? toDirty : true; /* istanbul ignore else */ if (!toDirty) { this._changed = {}; } this._dirty = toDirty; }, /** * Delete property safety. * @param {String} propName The name of property. */ deleteProp: function(propName) { delete this[propName]; if (this._changed) { delete this._changed[propName]; } }, /** * Check the changes with specific property. * @param {String} propName The name of property you want. * @returns {boolean} Is property changed? */ isPropChanged: function(propName) { if (!this._changed) { return false; } return this._changed[propName] === true; }, /** * Mixin to specific objects. * @param {Object} target The object to mix this module. * @memberof module:util/dirty * @example * function Animal() {} * dirty.mixin(Animal.prototype); */ mixin: function(target) { var methodFilterR = /(^_|mixin|wrap)/; common.forEachOwnProperties(dirty, function(o, k) { if (!methodFilterR.test(k)) { target[k] = dirty[k]; } }); }, /** * Wrapper method for dirty flagging. * * This method invoke after invoked specific method that added by you. * * The method want to add are must exist before add. * @param {object} target Target object to method wrap. * @param {(string|object)} methodName * Method name to wrap or methodName: flag objects. * @param {boolean} [flag=true] * this will used to flagging by dirty flagger after invoke the methods added by you. * @memberof module:util/dirty * @example * function Animal(name) { * this.name = name; * } * Animal.prototype.growl = jasmine.createSpy('growl'); * Animal.prototype.test = function() { * return this.name; * }; * * dirty.mixin(Animal.prototype); * // single * dirty.wrap(Animal.prototype, 'growl', true); * // multiple * dirty.wrap(Animap.prototype, { * growl: true, * test: false * }); * */ wrap: function(target, methodName, flag) { var wrap = dirty.wrap, fn; if (common.isObject(methodName)) { common.forEachOwnProperties(methodName, function(_flag, _name) { wrap(target, _name, _flag); }); return; } flag = existy(flag) ? flag : true; if (!target._wrapper) { /** * @param {function} _fn Original method to wrap. * @param {boolean} flagToSet The boolean value to using dirty flagging. * @returns {*} The result value of original method. * @name _wrapper * @memberof dirty */ target._wrapper = function(_fn, flagToSet) { return function() { var args = Array.prototype.slice.call(arguments); var result = _fn.apply(this, args); // eslint-disable-line this._dirty = flagToSet; // eslint-disable-line return result; }; }; } if (existy(pick(target, methodName)) && isFunc(target[methodName]) && !existy(pick(target, methodName, '_wrapped'))) { fn = target[methodName]; target[methodName] = target._wrapper(fn, flag); target[methodName]._wrapped = true; } } }; module.exports = dirty; /***/ }), /***/ "./src/js/common/domevent.js": /*!***********************************!*\ !*** ./src/js/common/domevent.js ***! \***********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* eslint complexity: 0 */ /** * @fileoverview Utility module for handling DOM events. * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var browser = util.browser, eventKey = '_evt', DRAG = { START: ['touchstart', 'mousedown'], END: { mousedown: 'mouseup', touchstart: 'touchend', pointerdown: 'touchend', MSPointerDown: 'touchend' }, MOVE: { mousedown: 'mousemove', touchstart: 'touchmove', pointerdown: 'touchmove', MSPointerDown: 'touchmove' } }; var domevent = { /** * Bind dom events. * @param {HTMLElement} obj HTMLElement to bind events. * @param {(string|object)} types Space splitted events names or eventName:handler object. * @param {*} fn handler function or context for handler method. * @param {*} [context] context object for handler method. */ on: function(obj, types, fn, context) { if (util.isString(types)) { util.forEach(types.split(' '), function(type) { domevent._on(obj, type, fn, context); }); return; } util.forEachOwnProperties(types, function(handler, type) { domevent._on(obj, type, handler, fn); }); }, /** * DOM event binding. * @param {HTMLElement} obj HTMLElement to bind events. * @param {String} type The name of events. * @param {*} fn handler function * @param {*} [context] context object for handler method. * @private */ _on: function(obj, type, fn, context) { var id, handler, originHandler; id = type + util.stamp(fn) + (context ? '_' + util.stamp(context) : ''); if (obj[eventKey] && obj[eventKey][id]) { return; } handler = function(e) { fn.call(context || obj, e || window.event); }; originHandler = handler; if ('addEventListener' in obj) { if (type === 'mouseenter' || type === 'mouseleave') { handler = function(e) { e = e || window.event; if (!domevent._checkMouse(obj, e)) { return; } originHandler(e); }; obj.addEventListener((type === 'mouseenter') ? 'mouseover' : 'mouseout', handler, false); } else { if (type === 'mousewheel') { obj.addEventListener('DOMMouseScroll', handler, false); } obj.addEventListener(type, handler, false); } } else if ('attachEvent' in obj) { obj.attachEvent('on' + type, handler); } obj[eventKey] = obj[eventKey] || {}; obj[eventKey][id] = handler; }, /** * Unbind DOM Event handler. * @param {HTMLElement} obj HTMLElement to unbind. * @param {(string|object)} types Space splitted events names or eventName:handler object. * @param {*} fn handler function or context for handler method. * @param {*} [context] context object for handler method. */ off: function(obj, types, fn, context) { if (util.isString(types)) { util.forEach(types.split(' '), function(type) { domevent._off(obj, type, fn, context); }); return; } util.forEachOwnProperties(types, function(handler, type) { domevent._off(obj, type, handler, fn); }); }, /** * Unbind DOM event handler. * @param {HTMLElement} obj HTMLElement to unbind. * @param {String} type The name of event to unbind. * @param {function()} fn Event handler that supplied when binding. * @param {*} context context object that supplied when binding. * @private */ _off: function(obj, type, fn, context) { var id = type + util.stamp(fn) + (context ? '_' + util.stamp(context) : ''), handler = obj[eventKey] && obj[eventKey][id]; if (!handler) { return; } if ('removeEventListener' in obj) { if (type === 'mouseenter' || type === 'mouseleave') { obj.removeEventListener((type === 'mouseenter') ? 'mouseover' : 'mouseout', handler, false); } else { if (type === 'mousewheel') { obj.removeEventListener('DOMMouseScroll', handler, false); } obj.removeEventListener(type, handler, false); } } else if ('detachEvent' in obj) { try { obj.detachEvent('on' + type, handler); } catch (e) {} //eslint-disable-line } delete obj[eventKey][id]; if (util.keys(obj[eventKey]).length) { return; } // throw exception when deleting host object's property in below IE8 if (util.browser.msie && util.browser.version < 9) { obj[eventKey] = null; return; } delete obj[eventKey]; }, /** * Bind DOM event. this event will unbind after invokes. * @param {HTMLElement} obj HTMLElement to bind events. * @param {(string|object)} types Space splitted events names or eventName:handler object. * @param {*} fn handler function or context for handler method. * @param {*} [context] context object for handler method. */ once: function(obj, types, fn, context) { var self = this; if (util.isObject(types)) { util.forEachOwnProperties(types, function(handler, type) { domevent.once(obj, type, handler, fn); }); return; } /** * Handler for temporary usage for once implementation */ function onceHandler() { fn.apply(context || obj, arguments); self._off(obj, types, onceHandler, context); } domevent.on(obj, types, onceHandler, context); }, /** * Cancel event bubbling. * @param {Event} e Event object. */ stopPropagation: function(e) { if (e.stopPropagation) { e.stopPropagation(); } else { e.cancelBubble = true; } }, /** * Cancel browser default actions. * @param {Event} e Event object. */ preventDefault: function(e) { if (e.preventDefault) { e.preventDefault(); } else { e.returnValue = false; } }, /** * Syntatic sugar of stopPropagation and preventDefault * @param {Event} e Event object. */ stop: function(e) { domevent.preventDefault(e); domevent.stopPropagation(e); }, /** * Stop scroll events. * @param {HTMLElement} el HTML element to prevent scroll. */ disableScrollPropagation: function(el) { domevent.on(el, 'mousewheel MozMousePixelScroll', domevent.stopPropagation); }, /** * Stop all events related with click. * @param {HTMLElement} el HTML element to prevent all event related with click. */ disableClickPropagation: function(el) { domevent.on(el, DRAG.START.join(' ') + ' click dblclick', domevent.stopPropagation); }, /** * Get mouse position from mouse event. * * If supplied relatveElement parameter then return relative position based on element. * @param {Event} mouseEvent Mouse event object * @param {HTMLElement} relativeElement HTML element that calculate relative position. * @returns {number[]} mouse position. */ getMousePosition: function(mouseEvent, relativeElement) { var rect; if (!relativeElement) { return [mouseEvent.clientX, mouseEvent.clientY]; } rect = relativeElement.getBoundingClientRect(); return [ mouseEvent.clientX - rect.left - relativeElement.clientLeft, mouseEvent.clientY - rect.top - relativeElement.clientTop ]; }, /** * Normalize mouse wheel event that different each browsers. * @param {MouseEvent} e Mouse wheel event. * @returns {Number} delta */ getWheelDelta: function(e) { var delta = 0; if (e.wheelDelta) { delta = e.wheelDelta / 120; } if (e.detail) { delta = -e.detail / 3; } return delta; }, /** * prevent firing mouseleave event when mouse entered child elements. * @param {HTMLElement} el HTML element * @param {MouseEvent} e Mouse event * @returns {Boolean} leave? * @private */ _checkMouse: function(el, e) { var related = e.relatedTarget; if (!related) { return true; } try { while (related && (related !== el)) { related = related.parentNode; } } catch (err) { return false; } return (related !== el); }, /** * Trigger specific events to html element. * @param {HTMLElement} obj HTMLElement * @param {string} type Event type name * @param {object} [eventData] Event data */ trigger: function(obj, type, eventData) { var rMouseEvent = /(mouse|click)/; if (util.isUndefined(eventData) && rMouseEvent.exec(type)) { eventData = domevent.mouseEvent(type); } if (obj.dispatchEvent) { obj.dispatchEvent(eventData); } else if (obj.fireEvent) { obj.fireEvent('on' + type, eventData); } }, /** * Create virtual mouse event. * * Tested at * * - IE7 ~ IE11 * - Chrome * - Firefox * - Safari * @param {string} type Event type * @param {object} [eventObj] Event data * @returns {MouseEvent} Virtual mouse event. */ mouseEvent: function(type, eventObj) { var evt, e; e = util.extend({ bubbles: true, cancelable: (type !== 'mousemove'), view: window, wheelDelta: 0, detail: 0, screenX: 0, screenY: 0, clientX: 0, clientY: 0, ctrlKey: false, altKey: false, shiftKey: false, metaKey: false, button: 0, relatedTarget: undefined // eslint-disable-line }, eventObj); // prevent throw error when inserting wheelDelta property to mouse event on below IE8 if (browser.msie && browser.version < 9) { delete e.wheelDelta; } if (typeof document.createEvent === 'function') { evt = document.createEvent('MouseEvents'); evt.initMouseEvent(type, e.bubbles, e.cancelable, e.view, e.detail, e.screenX, e.screenY, e.clientX, e.clientY, e.ctrlKey, e.altKey, e.shiftKey, e.metaKey, e.button, document.body.parentNode ); } else if (document.createEventObject) { evt = document.createEventObject(); util.forEach(e, function(value, propName) { evt[propName] = value; }, this); evt.button = {0: 1, 1: 4, 2: 2}[evt.button] || evt.button; } return evt; }, /** * Normalize mouse event's button attributes. * * Can detect which button is clicked by this method. * * Meaning of return numbers * * - 0: primary mouse button * - 1: wheel button or center button * - 2: secondary mouse button * @param {MouseEvent} mouseEvent - The mouse event object want to know. * @returns {number} - The value of meaning which button is clicked? */ getMouseButton: function(mouseEvent) { var button, primary = '0,1,3,5,7', secondary = '2,6', wheel = '4'; /* istanbul ignore else */ if (document.implementation.hasFeature('MouseEvents', '2.0')) { return mouseEvent.button; } button = String(mouseEvent.button); if (primary.indexOf(button) > -1) { return 0; } if (secondary.indexOf(button) > -1) { return 2; } if (~wheel.indexOf(button)) { return 1; } return -1; } }; module.exports = domevent; /***/ }), /***/ "./src/js/common/domutil.js": /*!**********************************!*\ !*** ./src/js/common/domutil.js ***! \**********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* eslint complexity: 0, no-shadow: 0, max-nested-callbacks: 0 */ /** * @fileoverview Utility modules for manipulate DOM elements. * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var domevent = __webpack_require__(/*! ./domevent */ "./src/js/common/domevent.js"); var Collection = __webpack_require__(/*! ./collection */ "./src/js/common/collection.js"); var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var posKey = '_pos', domutil; var CSS_AUTO_REGEX = /^auto$|^$|%/; /** * Trim leading, trailing whitespace * @param {string} str - string to trim * @returns {string} trimmed string */ function trim(str) { return str.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); } domutil = { /** * Create DOM element and return it. * @param {string} tagName Tag name to append. * @param {HTMLElement} [container] HTML element will be parent to created element. * if not supplied, will use **document.body** * @param {string} [className] Design class names to appling created element. * @returns {HTMLElement} HTML element created. */ appendHTMLElement: function(tagName, container, className) { var el; className = className || ''; el = document.createElement(tagName); el.className = className; if (container) { container.appendChild(el); } else { document.body.appendChild(el); } return el; }, /** * Remove element from parent node. * @param {HTMLElement} el - element to remove. */ remove: function(el) { if (el && el.parentNode) { el.parentNode.removeChild(el); } }, /** * Get element by id * @param {string} id element id attribute * @returns {HTMLElement} element */ get: function(id) { return document.getElementById(id); }, /** * Check supplied element is matched selector. * @param {HTMLElement} el - element to check * @param {string} selector - selector string to check * @returns {boolean} match? */ _matcher: function(el, selector) { var cssClassSelector = /^\./, idSelector = /^#/; if (cssClassSelector.test(selector)) { return domutil.hasClass(el, selector.replace('.', '')); } if (idSelector.test(selector)) { return el.id === selector.replace('#', ''); } return el.nodeName.toLowerCase() === selector.toLowerCase(); }, /** * Find DOM element by specific selectors. * below three selector only supported. * * 1. css selector * 2. id selector * 3. nodeName selector * @param {string} selector selector * @param {(HTMLElement|string)} [root] You can assign root element to find * if not supplied, document.body will use. * @param {boolean|function} [multiple=false] - set true then return all * elements that meet condition, if set function then use it filter function. * @returns {HTMLElement} HTML element finded. */ find: function(selector, root, multiple) { var result = [], found = false, isFirst = util.isUndefined(multiple) || multiple === false, isFilter = util.isFunction(multiple); if (util.isString(root)) { root = domutil.get(root); } root = root || window.document.body; /** * Function for recursive find specific node * @param {HTMLElement} el - element to search * @param {string} selector - selector */ function recurse(el, selector) { var childNodes = el.childNodes, i = 0, len = childNodes.length, cursor; for (; i < len; i += 1) { cursor = childNodes[i]; if (cursor.nodeName === '#text') { continue; } if (domutil._matcher(cursor, selector)) { if ((isFilter && multiple(cursor)) || !isFilter) { result.push(cursor); } if (isFirst) { found = true; break; } } else if (cursor.childNodes.length > 0) { recurse(cursor, selector); if (found) { break; } } } } recurse(root, selector); return isFirst ? (result[0] || null) : result; }, /** * Find parent element recursively. * @param {HTMLElement} el - base element to start find. * @param {string} selector - selector string for find * @param {boolean} excludeEl - exclude the base element to find * @returns {HTMLElement} - element finded or null. */ closest: function(el, selector, excludeEl) { var parent = el.parentNode; if (!excludeEl && domutil._matcher(el, selector)) { return el; } while (parent && parent !== window.document.body) { if (domutil._matcher(parent, selector)) { return parent; } parent = parent.parentNode; } return null; }, /** * Return texts inside element. * @param {HTMLElement} el target element * @returns {string} text inside node */ text: function(el) { var ret = '', i = 0, nodeType = el.nodeType; if (nodeType) { if (nodeType === 1 || nodeType === 9 || nodeType === 11) { // nodes that available contain other nodes if (typeof el.textContent === 'string') { return el.textContent; } for (el = el.firstChild; el; el = el.nextSibling) { ret += domutil.text(el); } } else if (nodeType === 3 || nodeType === 4) { // TEXT, CDATA SECTION return el.nodeValue; } } else { for (; el[i]; i += 1) { ret += domutil.text(el[i]); } } return ret; }, /** * Set data attribute to target element * @param {HTMLElement} el - element to set data attribute * @param {string} key - key * @param {string|number} data - data value */ setData: function(el, key, data) { if ('dataset' in el) { el.dataset[key] = data; return; } el.setAttribute('data-' + key, data); }, /** * Get data value from data-attribute * @param {HTMLElement} el - target element * @param {string} key - key * @returns {string} value */ getData: function(el, key) { if ('dataset' in el) { return el.dataset[key]; } return el.getAttribute('data-' + key); }, /** * Check element has specific design class name. * @param {HTMLElement} el target element * @param {string} name css class * @returns {boolean} return true when element has that css class name */ hasClass: function(el, name) { var className; if (!util.isUndefined(el.classList)) { return el.classList.contains(name); } className = domutil.getClass(el); return className.length > 0 && new RegExp('(^|\\s)' + name + '(\\s|$)').test(className); }, /** * Add design class to HTML element. * @param {HTMLElement} el target element * @param {string} name css class name */ addClass: function(el, name) { var className; if (!util.isUndefined(el.classList)) { util.forEachArray(name.split(' '), function(value) { el.classList.add(value); }); } else if (!domutil.hasClass(el, name)) { className = domutil.getClass(el); domutil.setClass(el, (className ? className + ' ' : '') + name); } }, /** * * Overwrite design class to HTML element. * @param {HTMLElement} el target element * @param {string} name css class name */ setClass: function(el, name) { if (util.isUndefined(el.className.baseVal)) { el.className = name; } else { el.className.baseVal = name; } }, /** * Element에 cssClass속성을 제거하는 메서드 * Remove specific design class from HTML element. * @param {HTMLElement} el target element * @param {string} name class name to remove */ removeClass: function(el, name) { var removed = ''; if (!util.isUndefined(el.classList)) { el.classList.remove(name); } else { removed = (' ' + domutil.getClass(el) + ' ').replace(' ' + name + ' ', ' '); domutil.setClass(el, trim(removed)); } }, /** * Get HTML element's design classes. * @param {HTMLElement} el target element * @returns {string} element css class name */ getClass: function(el) { if (!el || !el.className) { return ''; } return util.isUndefined(el.className.baseVal) ? el.className : el.className.baseVal; }, /** * Get specific CSS style value from HTML element. * @param {HTMLElement} el target element * @param {string} style css attribute name * @returns {(string|null)} css style value */ getStyle: function(el, style) { var value = el.style[style] || (el.currentStyle && el.currentStyle[style]), css; if ((!value || value === 'auto') && document.defaultView) { css = document.defaultView.getComputedStyle(el, null); value = css ? css[style] : null; } return value === 'auto' ? null : value; }, /** * get element's computed style values. * * in lower IE8. use polyfill function that return object. it has only one function 'getPropertyValue' * @param {HTMLElement} el - element want to get style. * @returns {object} virtual CSSStyleDeclaration object. */ getComputedStyle: function(el) { var defaultView = document.defaultView; if (!defaultView || !defaultView.getComputedStyle) { return { getPropertyValue: function(prop) { /* eslint-disable no-useless-escape */ var re = /(\-([a-z]){1})/g; if (prop === 'float') { prop = 'styleFloat'; } if (re.test(prop)) { prop = prop.replace(re, function() { return arguments[2].toUpperCase(); }); } return el.currentStyle[prop] ? el.currentStyle[prop] : null; } }; } return document.defaultView.getComputedStyle(el); }, /** * Set position CSS style. * @param {HTMLElement} el target element * @param {number} [x=0] left pixel value. * @param {number} [y=0] top pixel value. */ setPosition: function(el, x, y) { x = util.isUndefined(x) ? 0 : x; y = util.isUndefined(y) ? 0 : y; el[posKey] = [x, y]; el.style.left = util.isNumber(x) ? (x + 'px') : x; el.style.top = util.isNumber(y) ? (y + 'px') : y; }, /** * Set position CSS style with left, top, right, bottom * @param {HTMLElement} el target element * @param {object} ltrb object of left, top, right, bottom * @param {number} [ltrb.left] left pixel value. * @param {number} [ltrb.top] top pixel value. * @param {number} [ltrb.right] right pixel value. * @param {number} [ltrb.bottom] bottom pixel value. */ setLTRB: function(el, ltrb) { var props = ['left', 'top', 'right', 'bottom']; var value; props.forEach(function(prop) { value = util.isUndefined(ltrb[prop]) ? '' : ltrb[prop]; el.style[prop] = util.isNumber(value) ? (value + 'px') : value; }); }, /** * Get position from HTML element. * @param {HTMLElement} el target element * @param {boolean} [clear=false] clear cache before calculating position. * @returns {number[]} point */ getPosition: function(el, clear) { var left, top, bound; if (clear) { el[posKey] = null; } if (el[posKey]) { return el[posKey]; } left = 0; top = 0; if ((CSS_AUTO_REGEX.test(el.style.left) || CSS_AUTO_REGEX.test(el.style.top)) && 'getBoundingClientRect' in el) { // When the element's left or top is 'auto' bound = el.getBoundingClientRect(); left = bound.left; top = bound.top; } else { left = parseFloat(el.style.left || 0); top = parseFloat(el.style.top || 0); } return [left, top]; }, /** * Return element's size * @param {HTMLElement} el target element * @returns {number[]} width, height */ getSize: function(el) { var bound, width = domutil.getStyle(el, 'width'), height = domutil.getStyle(el, 'height'); if ((CSS_AUTO_REGEX.test(width) || CSS_AUTO_REGEX.test(height) || util.isNull(width) || util.isNull(height)) && 'getBoundingClientRect' in el) { bound = el.getBoundingClientRect(); width = bound.width || el.offsetWidth; height = bound.height || el.offsetHeight; } else { width = parseFloat(width || 0); height = parseFloat(height || 0); } return [width, height]; }, /** * Fallback of getBoundingClientRect * @param {HTMLElement} el - element * @returns {object} rect */ getBCRect: function(el) { var rect = el.getBoundingClientRect(); rect = util.extend({ width: el.offsetWidth, height: el.offsetHeight }, rect); return rect; }, /** * Check specific CSS style is available. * @param {array} props property name to testing * @returns {(string|boolean)} return true when property is available * @example * var props = ['transform', '-webkit-transform']; * domutil.testProp(props); // 'transform' */ testProp: function(props) { var style = document.documentElement.style, i = 0, len = props.length; for (; i < len; i += 1) { if (props[i] in style) { return props[i]; } } return false; }, /** * Get form data * @param {HTMLFormElement} formElement - form element to extract data * @returns {object} form data */ getFormData: function(formElement) { var groupedByName = new Collection(function() { return this.length; }), noDisabledFilter = function(el) { return !el.disabled; }, output = {}; groupedByName.add.apply( groupedByName, domutil.find('input', formElement, noDisabledFilter) .concat(domutil.find('select', formElement, noDisabledFilter)) .concat(domutil.find('textarea', formElement, noDisabledFilter)) ); groupedByName = groupedByName.groupBy(function(el) { return (el && el.getAttribute('name')) || '_other'; }); util.forEach(groupedByName, function(elements, name) { if (name === '_other') { return; } elements.each(function(el) { var nodeName = el.nodeName.toLowerCase(), type = el.type, result = []; if (type === 'radio') { result = [elements.find(function(el) { return el.checked; }).toArray().pop()]; } else if (type === 'checkbox') { result = elements.find(function(el) { return el.checked; }).toArray(); } else if (nodeName === 'select') { elements.find(function(el) { return !!el.childNodes.length; }).each(function(el) { result = result.concat( domutil.find('option', el, function(opt) { return opt.selected; }) ); }); } else { result = elements.find(function(el) { return el.value !== ''; }).toArray(); } result = util.map(result, function(el) { return el.value; }); if (!result.length) { result = ''; } else if (result.length === 1) { result = result[0]; } output[name] = result; }); }); return output; } }; /*eslint-disable*/ var userSelectProperty = domutil.testProp([ 'userSelect', 'WebkitUserSelect', 'OUserSelect', 'MozUserSelect', 'msUserSelect' ]); var supportSelectStart = 'onselectstart' in document; var prevSelectStyle = ''; /* eslint-enable*/ /** * Disable browser's text selection behaviors. * @method */ domutil.disableTextSelection = (function() { if (supportSelectStart) { return function(dom) { domevent.on(dom, 'selectstart', domevent.preventDefault); }; } return function(dom) { var style = dom.style; prevSelectStyle = style[userSelectProperty]; style[userSelectProperty] = 'none'; }; })(); /** * Enable browser's text selection behaviors. * @method */ domutil.enableTextSelection = (function() { if (supportSelectStart) { return function() { domevent.off(window, 'selectstart', domevent.preventDefault); }; } return function() { document.documentElement.style[userSelectProperty] = prevSelectStyle; }; })(); /** * Disable browser's image drag behaviors. */ domutil.disableImageDrag = function() { domevent.on(window, 'dragstart', domevent.preventDefault); }; /** * Enable browser's image drag behaviors. */ domutil.enableImageDrag = function() { domevent.off(window, 'dragstart', domevent.preventDefault); }; module.exports = domutil; /***/ }), /***/ "./src/js/common/dw.js": /*!*****************************!*\ !*** ./src/js/common/dw.js ***! \*****************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Wrapper module for easy calc date object * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var TZDate = __webpack_require__(/*! ./timezone */ "./src/js/common/timezone.js").Date; /** * @constructor * @param {TZDate} date to wrapping DW class */ function DW(date) { if (!(this instanceof DW)) { return new DW(date); } if (!(date instanceof TZDate)) { date = new TZDate(date); } /** * @type {TZDate} */ this.d = date; } /** * Return d property when supplied object is DW. else return itself * @param {*} obj - object * @returns {TZDate} date */ DW.prototype.safe = function(obj) { if (obj.constructor === DW) { return obj.d; } return obj; }; /** * Clone DW object * @returns {DW} cloned dwrap object */ DW.prototype.clone = function() { return new DW(new TZDate(this.d)); }; /** * Add days * @param {number} day - day to add * @returns {DW} wrapper object */ DW.prototype.addDate = function(day) { this.d.setDate(this.d.getDate() + day); return this; }; /** * Add month. * @param {number} m - month to add * @returns {DW} wrapper object */ DW.prototype.addMonth = function(m) { var currentMonth = this.d.getMonth(); var currentDay = this.d.getDate(); var leapYear = this._isLeapYear(); var targetMonth = currentMonth + m; var clone = this.clone(); var targetDaysOfMonth = currentDay; if (m) { if (targetMonth === 1) { targetDaysOfMonth = leapYear ? 29 : 28; } else { if (m > 0) { clone.d.setMonth(targetMonth + 1, 0); } else { clone.d.setMonth(currentMonth, 0); } targetDaysOfMonth = clone.d.getDate(); } } this.d.setMonth(targetMonth, Math.min(currentDay, targetDaysOfMonth)); return this; }; /** * Is leap year or not * @returns {boolean} */ DW.prototype._isLeapYear = function() { var year = this.d.getFullYear(); return ((year % 4 === 0) && (year % 100 !== 0)) || !(year % 400); }; /** * Set hour, minutes, seconds, milliseconds * @param {number} h - hours * @param {number} m - minutes * @param {number} s - seconds * @param {number} ms - milliseconds * @returns {DW} wrapper object */ DW.prototype.setHours = function(h, m, s, ms) { this.d.setHours(h, m, s, ms); return this; }; /** * Whether date is between supplied dates? * @param {TZDate|DW} d1 - from date * @param {TZDate|DW} d2 - to date * @returns {boolean} is between? */ DW.prototype.isBetween = function(d1, d2) { var safe = this.safe; return safe(d1) <= this.d && this.d <= safe(d2); }; module.exports = DW; /***/ }), /***/ "./src/js/common/floatingLayer.js": /*!****************************************!*\ !*** ./src/js/common/floatingLayer.js ***! \****************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Floating layer module * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../config */ "./src/js/config.js"), domutil = __webpack_require__(/*! ../common/domutil */ "./src/js/common/domutil.js"), View = __webpack_require__(/*! ../view/view */ "./src/js/view/view.js"); /** * @constructor * @extends {View} * @param {object} options - options for floating layer module * @param {HTMLElement} container - parent continer for floating layer */ function FloatingLayer(options, container) { var sibling = container[FloatingLayer.PROP_KEY], layerContainer; if (!sibling) { sibling = container[FloatingLayer.PROP_KEY] = []; } sibling.push(this); /** * @type {Collection} */ this.sibling = sibling; /** * @type {number} */ this.zIndex = this.getLargestZIndex() || FloatingLayer.INIT_ZINDEX; layerContainer = document.createElement('div'); layerContainer.style.display = 'none'; layerContainer.style.position = 'absolute'; domutil.addClass(layerContainer, config.classname('floating-layer')); container.appendChild(layerContainer); View.call(this, layerContainer); /** * @type {HTMLElement} */ this.parent = container; } util.inherit(FloatingLayer, View); /** * @const */ FloatingLayer.PROP_KEY = '__fe_floating_layer'; /** * @const */ FloatingLayer.INIT_ZINDEX = 999; /** * Destroy floating layer instance. if there no instnace in parent container * * remove instance cache property in container element */ FloatingLayer.prototype.destroy = function() { var parent = this.parent, sibling = this.sibling, i = 0, cnt = sibling.length; for (; i < cnt; i += 1) { if (sibling[i] === this) { sibling.splice(i, 1); break; } } if (!sibling.length) { try { delete parent[FloatingLayer.PROP_KEY]; } catch (e) { parent[FloatingLayer.PROP_KEY] = null; } parent.style.position = ''; } domutil.remove(this.container); this.sibling = null; View.prototype.destroy.call(this); }; /** * @returns {boolean} whether layer is visible? */ FloatingLayer.prototype.isVisible = function() { return this.container.style.display !== 'none'; }; /** * Set layer position * @param {number} x - x coordinate of layer * @param {number} y - y coordinate of layer */ FloatingLayer.prototype.setPosition = function(x, y) { domutil.setPosition(this.container, x, y); }; /** * Set layer left, top, right, bottom position * @param {object} ltrb object of left, top, right, bottom * @param {number} [ltrb.left] left pixel value. * @param {number} [ltrb.top] top pixel value. * @param {number} [ltrb.right] right pixel value. * @param {number} [ltrb.bottom] bottom pixel value. */ FloatingLayer.prototype.setLTRB = function(ltrb) { domutil.setLTRB(this.container, ltrb); }; /** * Set layer size * @param {number|string} w - layer width * @param {number|string} h - layer height */ FloatingLayer.prototype.setSize = function(w, h) { var container = this.container; w = util.isNumber(w) ? w + 'px' : w; h = util.isNumber(h) ? h + 'px' : h; container.style.width = w; container.style.height = h; }; /** * Set layer content * @param {string} html - html string */ FloatingLayer.prototype.setContent = function(html) { this.container.innerHTML = html; }; /** * Get largest z-index from sibling layers * @returns {number} largest z-index value */ FloatingLayer.prototype.getLargestZIndex = function() { var zIndexes = util.map(this.sibling, function(layer) { return layer.zIndex; }); return Math.max.apply(null, zIndexes); }; /** * Set focus to layer */ FloatingLayer.prototype.focus = function() { var zIndexForShow = this.getLargestZIndex() + 1; this.container.style.zIndex = this.zIndex = zIndexForShow; }; /** * Show layer */ FloatingLayer.prototype.show = function() { this.focus(); this.container.style.display = 'block'; }; /** * Hide layer */ FloatingLayer.prototype.hide = function() { this.container.style.display = 'none'; }; module.exports = FloatingLayer; /***/ }), /***/ "./src/js/common/model.js": /*!********************************!*\ !*** ./src/js/common/model.js ***! \********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Mixin module for models. * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var TZDate = __webpack_require__(/*! ../common/timezone */ "./src/js/common/timezone.js").Date; var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var spaceRx = /^\s*|\s*$/g, model; var datetime = __webpack_require__(/*! ../common/datetime */ "./src/js/common/datetime.js"); /** * Mixin module for models. * @mixin */ model = { /** * string trim * @param {string} str string to trim * @returns {string} trimed string */ trim: function(str) { return str.replace(spaceRx, ''); }, /** * The collections of validator functions. */ validators: { /** * check all of supplied fields(property) is not undefined or empty string. * @param {object} instance model instance. * @param {string[]} fields property names to check. * @returns {boolean} return true when supplied fields are not undefined or empty string. */ required: function(instance, fields) { var valid = true, isValid = function(obj) { return !util.isUndefined(obj) && model.trim(obj) !== ''; }; util.forEach(fields, function(fieldName) { valid = isValid(instance[fieldName]); return valid; }); return valid; }, /** * check supplied fields are valid dates and valid date ranges. * @param {object} instance model instance. * @param {Date[]} fields array of date range (start, end) * @returns {boolean} is valid date range? */ dateRange: function(instance, fields) { var start, end; if (!util.isExisty(instance) || fields.length !== 2) { return true; } start = new TZDate(instance[fields[0]]); end = new TZDate(instance[fields[1]]); if (!datetime.isValid(start) || !datetime.isValid(end)) { return false; } if (datetime.compare(start, end) === 1) { return false; } return true; } }, /** * Check validate for model instance. * * The validate are works on a basis of constructor's "schema" property. * * You can customize validators add some method to model#validators. * @returns {Boolean} model is valid? */ isValid: function() { var self = this, schema = this.constructor.schema, validators = model.validators, validator, valid = true; if (!schema) { return true; } util.forEach(schema, function(values, validatorName) { validator = validators[validatorName]; if (validator) { valid = validator(self, values); return valid; // returning false can stop this loop } return true; }); return valid; }, /** * Make data object form instance. * * It return object fill with all owned properties but exclude functions. * @returns {object} Data object */ parameterize: function() { var param = {}, isFunc = util.isFunction; util.forEach(this, function(value, propName) { if (!isFunc(value)) { param[propName] = value; } }); return param; }, /** * Mixin model module to supplied target. * @param {Object} target The object of want to mixed. * @example * function Man() { * this.name = 'john'; * } * model.mixin(Man.prototype); */ mixin: function(target) { util.forEach(model, function(method, name) { if (name !== 'mixin') { target[name] = method; } }); } }; module.exports = model; /***/ }), /***/ "./src/js/common/point.js": /*!********************************!*\ !*** ./src/js/common/point.js ***! \********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview * Class for represent two dimensional x, y coordinates. * * It suppliy a group of functions for manipulate coordinates. * @author NHN FE Development Lab <dl_javascript@nhn.com> * @example * var p = point(10, 10); * var r1 = p.add(Point(5, 5)); * console.log(p.toString()) // "Point(10, 10)" * console.log(r1.toString()) // "Point(15, 15)" * * var p2 = new Point(10, 10); * p2._add(point(5, 5)); * console.log(p2.toString()) // "Point(15, 15)" */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); /** * Class for represent two dimentional x, y coordinates. * @constructor * @param {number} x The number of X coordinates. * @param {number} y The number of Y coordinates. * @param {boolean} [useRound=false] set true when each coordinates are rounded before initialize. * @example * var t = new Point(13, 5); */ function Point(x, y, useRound) { /** * @type {number} */ this.x = (useRound ? Math.round(x) : x); /** * @type {number} */ this.y = (useRound ? Math.round(y) : y); } /********** * static props **********/ /** * Calculate point ratio. * @param {Point} point The instance of point. * @param {number} factor From factor * @param {number} toFactor To factor * @returns {Point} Point instance calculated. */ Point.getRatio = function(point, factor, toFactor) { if (factor === toFactor) { return point.clone(); } return point.multiplyBy(toFactor)._divideBy(factor); }; /** * Syntatic sugar of new Point() * @param {(Point|number|number[])} x X coordinate value. * @param {(number|boolean)} [y] Y coordinate value or boolean value for coordinates round. * @param {boolean} [useRound] Set true then round initial coordinate values. * @returns {Point} The instance of point. * @example * var p1 = point(10, 15); * var p2 = point([10, 15]); */ Point.n = function(x, y, useRound) { if (x instanceof Point) { return x; } if (util.isArray(x)) { return new Point(x[0], x[1], y); } return new Point(x, y, useRound); }; /********** * prototype props **********/ /** * Clone points * @returns {Point} The point instance cloned. */ Point.prototype.clone = function() { return new Point(this.x, this.y); }; /** * Add points. * @param {Point} point The point instance to add. * @returns {Point} Point calculated. */ Point.prototype.add = function(point) { return this.clone()._add(Point.n(point)); }; /** * Add self points. * @param {Point} point The point instance to add. * @returns {Point} Point calculated. */ Point.prototype._add = function(point) { this.x += point.x; this.y += point.y; return this; }; /** * Subtract points. * @param {Point} point The point instance to subtract. * @returns {Point} Point calculated. */ Point.prototype.subtract = function(point) { return this.clone()._subtract(Point.n(point)); }; /** * Subtract points. (manipulate self) * @param {Point} point The point instance to subtract. * @returns {Point} Point calculated. */ Point.prototype._subtract = function(point) { this.x -= point.x; this.y -= point.y; return this; }; /** * Divide points. * @param {number} num The number to divide. * @returns {Point} Point calculated. */ Point.prototype.divideBy = function(num) { return this.clone()._divideBy(num); }; /** * Divide points. (manipulate self) * @param {number} num The number to divide. * @returns {Point} Point calculated. */ Point.prototype._divideBy = function(num) { this.x /= num; this.y /= num; return this; }; /** * Multiply coordinates. * @param {number} num Thyen number to multiply * @returns {Point} Point calculated. */ Point.prototype.multiplyBy = function(num) { return this.clone()._multiplyBy(num); }; /** * Multiply self coordinates. * @param {number} num The number to multiply. * @returns {Point} Point calculated. */ Point.prototype._multiplyBy = function(num) { this.x *= num; this.y *= num; return this; }; /** * Round coordinates. * @returns {Point} Point calculated. */ Point.prototype.round = function() { return this.clone()._round(); }; /** * Round self coordinates. * @returns {Point} Point calculated. */ Point.prototype._round = function() { this.x = Math.round(this.x); this.y = Math.round(this.y); return this; }; /** * Reverse values between positive and negative. * @returns {Point} Point calculated. */ Point.prototype.reverse = function() { return this.clone()._reverse(); }; /** * Reverse self values between positive and negative. * @returns {Point} Point calculated. */ Point.prototype._reverse = function() { this.x *= -1; this.y *= -1; return this; }; /** * Floor coordinates. * @returns {Point} Point calculated. */ Point.prototype.floor = function() { return this.clone()._floor(); }; /** * Floor self coordinates. * @returns {Point} Point calculated. */ Point.prototype._floor = function() { this.x = Math.floor(this.x); this.y = Math.floor(this.y); return this; }; /** * Ceil coordinates. * @returns {Point} Point calculated. */ Point.prototype.ceil = function() { return this.clone()._ceil(); }; /** * Ceil self coodinates. * @returns {Point} Point calculated. */ Point.prototype._ceil = function() { this.x = Math.ceil(this.x); this.y = Math.ceil(this.y); return this; }; /** * Rotate point. * @param {number} deg The number of rotate degree. * @param {Point} [center=this] Center point instance to use rotate center. use own when not supplied. * @param {number} [cos] Cosine values for rotate. it useful when multi point rotate. * @param {number} [sin] Sine values for rotate. it useful when multi point rotate. * @returns {Point} The point instance rotated. */ Point.prototype.rotate = function(deg, center, cos, sin) { return this.clone()._rotate(deg, center, cos, sin); }; /** * Rotate self. * @param {number} deg The number of rotate degree. * @param {Point} [center=this] Center point instance to use rotate center. use own when not supplied. * @param {number} [cos] Cosine values for rotate. it useful when multi point rotate. * @param {number} [sin] Sine values for rotate. it useful when multi point rotate. * @returns {Point} The point instance rotated. */ Point.prototype._rotate = function(deg, center, cos, sin) { var rad = deg * (Math.PI / 180), x, y; cos = cos || parseFloat(Math.cos(rad).toFixed(8)); sin = sin || parseFloat(Math.sin(rad).toFixed(8)); this._subtract(center); x = this.x; y = this.y; this.x = (x * cos) - (y * sin); this.y = (x * sin) + (y * cos); this._add(center); return this; }; /** * Calculate distance between two points. * @param {Point} point Point instance. * @returns {number} The number of distance between two points. */ Point.prototype.distanceTo = function(point) { var x, y; point = Point.n(point); x = point.x - this.x; y = point.y - this.y; return Math.sqrt((x * x) + (y * y)); }; /** * Check point equals. * @param {Point} point Point instance to compare * @returns {boolean} equality */ Point.prototype.equals = function(point) { point = Point.n(point); return point.x === this.x && point.y === this.y; }; /** * Return formatted string. 'Point(x, y)' * @returns {string} string */ Point.prototype.toString = function() { return 'Point(' + this.x + ', ' + this.y + ')'; }; /** * Return coodinates to array. [x, y] * @returns {number[]} coordinate array. */ Point.prototype.toArray = function() { return [this.x, this.y]; }; module.exports = Point; /***/ }), /***/ "./src/js/common/reqAnimFrame.js": /*!***************************************!*\ !*** ./src/js/common/reqAnimFrame.js ***! \***************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(global) {/** * @fileoverview RequestAnimFrame * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var requestFn, cancelFn; /** * Get name with vendor prefix * @param {string} name - name to prepend prefix * @returns {string} vendor prefixed name */ function getPrefixed(name) { return global['webkit' + name] || global['moz' + name] || global['ms' + name]; } requestFn = global.requestAnimationFrame || getPrefixed('RequestAnimationFrame') || function(fn, context) { fn.call(context); }; cancelFn = global.cancelAnimationFrame || getPrefixed('CancelAnimationFrame') || getPrefixed('CancelRequestAnimationFrame') || function() {}; /** * @module module:reqAnimFrame */ module.exports = { /** * Shim of requestAnimationFrame * @param {function} fn callback function * @param {*} context context for callback * @returns {number} Unique id */ requestAnimFrame: function(fn, context) { return requestFn.call(global, util.bind(fn, context)); }, /** * Shim of cancelAnimationFrame * @param {number} id requestAnimationFrame id */ cancelAnimFrame: function(id) { if (!id) { return; } cancelFn.call(global, id); } }; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) /***/ }), /***/ "./src/js/common/timezone.js": /*!***********************************!*\ !*** ./src/js/common/timezone.js ***! \***********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview timezone * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var MIN_TO_MS = 60 * 1000; var nativeOffsetMs = getTimezoneOffset(); var customOffsetMs = nativeOffsetMs; var timezoneOffsetCallback = null; var setByTimezoneOption = false; var getterMethods = [ 'getDate', 'getDay', 'getFullYear', 'getHours', 'getMilliseconds', 'getMinutes', 'getMonth', 'getSeconds' ]; var setterMethods = [ 'setDate', 'setFullYear', 'setHours', 'setMilliseconds', 'setMinutes', 'setMonth', 'setSeconds' ]; /** * Get the timezone offset by timestampe * @param {number} timestamp - timestamp * @returns {number} timezone offset * @private */ function getTimezoneOffset(timestamp) { timestamp = timestamp || Date.now(); return new Date(timestamp).getTimezoneOffset() * MIN_TO_MS; } /** * Get the custome timezone offset by timestampe * @param {number} timestamp - timestamp * @returns {number} timezone offset * @private */ function getCustomTimezoneOffset(timestamp) { if (!setByTimezoneOption && timezoneOffsetCallback) { return timezoneOffsetCallback(timestamp) * MIN_TO_MS; } return customOffsetMs; } /** * Convert to local time * @param {number} time - time * @returns {number} local time */ function getLocalTime(time) { var timezoneOffset = getTimezoneOffset(time); var customTimezoneOffset = getCustomTimezoneOffset(time); var timezoneOffsetDiff = customTimezoneOffset ? 0 : nativeOffsetMs - timezoneOffset; var localTime = time - customTimezoneOffset + timezoneOffset + timezoneOffsetDiff; return localTime; } /** * Create a Date instance with multiple arguments * @param {Array} args - arguments * @returns {Date} * @private */ function createDateWithMultipleArgs(args) { var utc = Date.UTC.apply(null, args); return new Date(utc + getTimezoneOffset(utc)); } /** * To convert a Date to TZDate as it is. * @param {TZDate|number|null} arg - date * @returns {Date} */ function createDateWithUTCTime(arg) { var time; if (arg instanceof TZDate) { time = arg.getUTCTime(); } else if ((typeof arg) === 'number') { time = arg; } else if (arg === null) { time = 0; } else { throw new Error('Invalid Type'); } return new Date(time); } /** * Convert time to local time. Those times are only from API and not from inner source code. * @param {Date|string} arg - date * @returns {Date} */ function createDateAsLocalTime(arg) { var time; if (arg instanceof Date) { time = arg.getTime(); } else if ((typeof arg) === 'string') { time = Date.parse(arg); } else { throw new Error('Invalid Type'); } time = getLocalTime(time); return new Date(time); } /** * is it for local time? These type can be used from Calendar API. * @param {Date|string} arg - date * @returns {boolean} */ function useLocalTimeConverter(arg) { return arg instanceof Date || (typeof arg) === 'string'; } /** * Timezone Date Class * @param {number|TZDate|Date|string} date - date to be converted * @constructor */ function TZDate(date) { var nativeDate; if (util.isUndefined(date)) { date = Date.now(); } if (arguments.length > 1) { nativeDate = createDateWithMultipleArgs(arguments); } else if (useLocalTimeConverter(date)) { nativeDate = createDateAsLocalTime(date); } else { nativeDate = createDateWithUTCTime(date); } this._date = nativeDate; } /** * Get milliseconds which is converted by timezone * @returns {number} milliseconds */ TZDate.prototype.getTime = function() { var time = this._date.getTime(); return time + getCustomTimezoneOffset(time) - getTimezoneOffset(time); }; /** * Get UTC milliseconds * @returns {number} milliseconds */ TZDate.prototype.getUTCTime = function() { return this._date.getTime(); }; /** * toUTCString * @returns {Date} */ TZDate.prototype.toUTCString = function() { return this._date.toUTCString(); }; /** * to Date * @returns {Date} */ TZDate.prototype.toDate = function() { return this._date; }; TZDate.prototype.valueOf = function() { return this.getTime(); }; TZDate.prototype.addDate = function(day) { this.setDate(this.getDate() + day); return this; }; TZDate.prototype.addMinutes = function(minutes) { this.setMinutes(this.getMinutes() + minutes); return this; }; TZDate.prototype.addMilliseconds = function(milliseconds) { this.setMilliseconds(this.getMilliseconds() + milliseconds); return this; }; /* eslint-disable max-params*/ TZDate.prototype.setWithRaw = function(y, M, d, h, m, s, ms) { this.setFullYear(y, M, d); this.setHours(h, m, s, ms); return this; }; /** * @returns {TZDate} local time */ TZDate.prototype.toLocalTime = function() { var time = this.getTime(); var utcTime = this.getUTCTime(); var diff = time - utcTime; return new TZDate(utcTime - diff); }; getterMethods.forEach(function(methodName) { TZDate.prototype[methodName] = function() { return this._date[methodName].apply(this._date, arguments); }; }); setterMethods.forEach(function(methodName) { TZDate.prototype[methodName] = function() { this._date[methodName].apply(this._date, arguments); return this.getTime(); }; }); module.exports = { Date: TZDate, /** * Set offset * @param {number} offset - timezone offset based on minutes */ setOffset: function(offset) { customOffsetMs = offset * MIN_TO_MS; }, /** * Set offset * @param {number} offset - timezone offset based on minutes */ setOffsetByTimezoneOption: function(offset) { this.setOffset(-offset); setByTimezoneOption = true; }, /** * Get offset in case of `setByTimezoneOption`. Or return 0. * @returns {number} timezone offset offset minutes */ getOffset: function() { if (setByTimezoneOption) { return customOffsetMs / MIN_TO_MS; } return 0; }, /** * Set a callback function to get timezone offset by timestamp * @param {function} callback - callback function */ setOffsetCallback: function(callback) { timezoneOffsetCallback = callback; }, /** * (Use this method only for testing) * Reset system timezone and custom timezone */ restoreOffset: function() { customOffsetMs = getTimezoneOffset(); } }; /***/ }), /***/ "./src/js/common/vlayout.js": /*!**********************************!*\ !*** ./src/js/common/vlayout.js ***! \**********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Layout module that supplied split height, resize height features. * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../config */ "./src/js/config.js"), common = __webpack_require__(/*! ./common */ "./src/js/common/common.js"), domutil = __webpack_require__(/*! ./domutil */ "./src/js/common/domutil.js"), domevent = __webpack_require__(/*! ./domevent */ "./src/js/common/domevent.js"), View = __webpack_require__(/*! ../view/view */ "./src/js/view/view.js"), VPanel = __webpack_require__(/*! ./vpanel */ "./src/js/common/vpanel.js"), Drag = __webpack_require__(/*! ../handler/drag */ "./src/js/handler/drag.js"); var mAbs = Math.abs; /** * @typedef PanelOptions * @type {object} * @property {number} [minHeight=0] - minimum height of panel * @property {number} [height=0] - current panel height * @property {boolean} [splitter=false] - is this panel uses splitter? * @property {boolean} [autoHeight=false] - is this panel uses remain height of container? * @property {string} [className=''] - className string for add created element */ /** * @constructor * @extends {View} * @param {object} options - options for VLayout module * @param {PanelOptions[]} [options.panels] - panels to add layout when initialize * @param {number[]} [options.panelHeights] - panel height list * @param {HTMLElement} container - container element * @param {Theme} theme - theme instance */ function VLayout(options, container, theme) { var opt, tempHeights; if (!(this instanceof VLayout)) { return new VLayout(options, container); } View.call(this, container); domutil.addClass(container, config.classname('vlayout-container')); /** * @type {object} */ opt = this.options = util.extend({ panels: [], panelHeights: [] }, options); /** * @type {VPanel[]} */ this.panels = []; /** * @type {Drag} */ this._drag = new Drag({ distance: 10, exclude: function(target) { return !domutil.hasClass(target, config.classname('splitter')); } }, container); this._drag.on({ dragStart: this._onDragStart, drag: this._onDrag, dragEnd: this._onDragEnd }, this); /** * @type {object} */ this._dragData = null; /** * @type {Theme} */ this.theme = theme; if (opt.panels.length) { if (opt.panelHeights.length) { tempHeights = opt.panelHeights.slice(); util.forEach(opt.panels, function(panelOpt) { if (!panelOpt.isSplitter && !panelOpt.autoHeight) { panelOpt.height = tempHeights.shift(); } }); } this.addPanels(opt.panels, this.container); } this.refresh(); } util.inherit(VLayout, View); /** * Get current panels height in layout * @returns {number[]} height of panels with `autoHeight` false */ VLayout.prototype.getLayoutData = function() { var heightList = []; util.forEach(this.panels, function(panel) { if (panel.isSplitter() || panel.options.autoHeight) { return; } heightList.push(panel.getHeight()); }); return heightList; }; /** * Set panels height in layout * @param {number[]} heightList of panels with `autoHeight` false */ VLayout.prototype.setLayoutData = function(heightList) { if (!heightList.length) { return; } util.forEach(this.panels, function(panel) { if (panel.isSplitter() || panel.options.autoHeight) { return; } panel.setHeight(null, heightList.shift()); }); this.refresh(); }; /** * Get next panel instance by specific panel * @param {VPanel} panel - panel instance * @returns {VPanel} next panel */ VLayout.prototype.nextPanel = function(panel) { return this.panels[panel.index + 1]; }; /** * Get previous panel instance by specific panel * @param {VPanel} panel - panel instance * @returns {VPanel} previous panel */ VLayout.prototype.prevPanel = function(panel) { return this.panels[panel.index - 1]; }; /** * Initialize resizing guide element * @param {HTMLElement} element - element to use guide element after cloned * @param {number} top - top pixel value for guide element * @returns {HTMLElement} cloned element == guide element */ VLayout.prototype._initializeGuideElement = function(element, top) { var cloned = element.cloneNode(true); domutil.addClass(cloned, config.classname('splitter-guide')); this._refreshGuideElement(cloned, top); this.container.appendChild(cloned); return cloned; }; /** * Refresh guide element position * @param {HTMLElement} element - guide element * @param {number} top - top pixel value for guide element */ VLayout.prototype._refreshGuideElement = function(element, top) { element.style.top = top + 'px'; }; /** * Clear guide element position * @param {HTMLElement} element - guide element */ VLayout.prototype._clearGuideElement = function(element) { domutil.remove(element); }; /** * Resize overall panels size * @param {VPanel} splPanel - splitter panel instance * @param {number} startY - dragstart Y position * @param {number} mouseY - dragend Y position */ VLayout.prototype._resize = function(splPanel, startY, mouseY) { var diffY = startY - mouseY, resizedHeight = mAbs(diffY), resizeMap = [], toDown = mouseY > startY, backwardMethod = toDown ? 'prevPanel' : 'nextPanel', forwardMethod = toDown ? 'nextPanel' : 'prevPanel', cursor, resizeInfo; cursor = this[backwardMethod](splPanel); resizeInfo = cursor.getResizeInfoByGrowth(resizedHeight); resizeMap.push([cursor, resizeInfo[0]]); for (cursor = this[forwardMethod](cursor); util.isExisty(cursor); cursor = this[forwardMethod](cursor)) { if (cursor.isSplitter()) { continue; } resizeInfo = cursor.getResizeInfoByGrowth(-resizedHeight); resizeMap.push([cursor, resizeInfo[0]]); resizedHeight -= resizeInfo[1]; } util.forEach(resizeMap, function(pair) { pair[0].setHeight(null, pair[1], true); pair[0].fire('resize'); }); }; /** * Get summation of splitter and panel's minimum height upper and below of supplied splitter * @param {VPanel} splPanel - splitter panel instance * @returns {number[]} upper and below splitter's height and panel minimum height summation. */ VLayout.prototype._getMouseYAdditionalLimit = function(splPanel) { var upper = 0, below = 0, cursor, func = function(panel) { if (panel.isSplitter()) { return panel.getHeight(); } return panel.options.minHeight; }; for (cursor = this.prevPanel(splPanel); util.isExisty(cursor); cursor = this.prevPanel(cursor)) { upper += func(cursor); } for (cursor = this.nextPanel(splPanel); util.isExisty(cursor); cursor = this.nextPanel(cursor)) { below += func(cursor); } return [upper, below]; }; /********** * Drag Handlers **********/ /** * Drag start schedule handler * @param {object} e - drag start schedule data */ VLayout.prototype._onDragStart = function(e) { var oEvent = e.originEvent, target = e.target, splIndex = domutil.getData(target, 'panelIndex'), splPanel = this.panels[splIndex], splHeight = splPanel.getHeight(), splOffsetY = domevent.getMousePosition(oEvent, target)[1], mouseY = domevent.getMousePosition(oEvent, this.container)[1], guideElement = this._initializeGuideElement(target, mouseY); splPanel.addClass(config.classname('splitter-focused')); this._dragData = { splPanel: splPanel, splOffsetY: splOffsetY, guideElement: guideElement, startY: mouseY - splOffsetY, minY: 0, maxY: this.getViewBound().height - splHeight }; if (!util.browser.msie) { domutil.addClass(document.body, config.classname('resizing')); } }; /** * Drag schedule handler * @param {object} e - drag schedule data */ VLayout.prototype._onDrag = function(e) { var dragData = this._dragData, mouseY = domevent.getMousePosition(e.originEvent, this.container)[1]; mouseY = common.limit(mouseY - dragData.splOffsetY, [dragData.minY], [dragData.maxY]); this._refreshGuideElement(dragData.guideElement, mouseY); }; /** * Drag end schedule handler * @fires VLayout#resize * @param {object} e - dragend schedule data */ VLayout.prototype._onDragEnd = function(e) { var dragData = this._dragData, asideMinMax = this._getMouseYAdditionalLimit(dragData.splPanel), mouseY = domevent.getMousePosition(e.originEvent, this.container)[1]; // mouseY value can't exceed summation of splitter height and panel's minimum height based on target splitter. mouseY = common.limit( mouseY - dragData.splOffsetY, [dragData.minY + asideMinMax[0]], [dragData.maxY - asideMinMax[1]] ); this._resize(dragData.splPanel, dragData.startY, mouseY); /** * @event VLayout#resize * @type {object} * @property {number[]} layoutData - layout data after resized */ this.fire('resize', { layoutData: this.getLayoutData() }); this._dragData = null; this._clearGuideElement(dragData.guideElement); dragData.splPanel.removeClass(config.classname('splitter-focused')); domutil.removeClass(document.body, config.classname('resizing')); }; /********** * Methods **********/ /** * refresh each panels */ VLayout.prototype.refresh = function() { var panelToFillHeight = []; var layoutHeight = this.getViewBound().height; var usedHeight = 0; var remainHeight; if (!layoutHeight) { return; } util.forEach(this.panels, function(panel) { if (panel.options.autoHeight) { panelToFillHeight.push(panel); } else { usedHeight += panel.getHeight(); } }); remainHeight = (layoutHeight - usedHeight) / panelToFillHeight.length; util.forEach(panelToFillHeight, function(panel) { panel.setHeight(null, remainHeight); }); }; /** * add panel * @param {PanelOptions} options - options for panel * @param {container} [container] - container element */ VLayout.prototype.addPanel = function(options, container) { var element = document.createElement('div'), panels = this.panels, index = panels.length; options = util.extend({ index: index }, options); panels.push(new VPanel(options, element, this.theme)); container.appendChild(element); }; /** * Add multiple panel * @param {PanelOptions[]} options - panel options list * @param {HTMLElement} container - container element */ VLayout.prototype.addPanels = function(options, container) { var self = this, frag = document.createDocumentFragment(); util.forEach(options, function(option) { self.addPanel(option, frag); }); container.appendChild(frag); }; /** * Get a panel by name * @param {string} name - panel's name * @returns {VPanel} */ VLayout.prototype.getPanelByName = function(name) { var found; util.forEach(this.panels, function(panel) { if (panel.name === name) { found = panel; } }); return found; }; module.exports = VLayout; /***/ }), /***/ "./src/js/common/vpanel.js": /*!*********************************!*\ !*** ./src/js/common/vpanel.js ***! \*********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Panel class for VLayout module * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../config */ "./src/js/config.js"), common = __webpack_require__(/*! ./common */ "./src/js/common/common.js"), domutil = __webpack_require__(/*! ./domutil */ "./src/js/common/domutil.js"), View = __webpack_require__(/*! ../view/view */ "./src/js/view/view.js"); /** * @constructor * @extends {View} * @param {object} options - options for VPanel * @param {number} options.index - index of panel in vlayout * @param {number} [options.minHeight=0] - minimum height of panel * @param {number} [options.height] - initial height of panel * @param {boolean} [options.isSplitter=false] - set true then this panel works splitter * @param {boolean} [options.autoHeight=false] - set true then this panel use remain height after other panel resized. * @param {string} [options.className] - additional class name to add element * @param {HTMLElement} container - container element * @param {Theme} theme - theme instance */ function VPanel(options, container, theme) { View.call(this, container); /** * @type {object} */ this.options = util.extend({ index: 0, name: '0', minHeight: 0, maxHeight: null, height: null, isSplitter: false, autoHeight: false, className: '' }, options); /** * @type {number} */ this.index = this.options.index; /** * @type {string} */ this.name = this.options.name || String(this.index); this.isHeightForcedSet = false; /** * @type {Theme} */ this.theme = theme; this._initPanel(this.options, container); } util.inherit(VPanel, View); /** * whether this panel is splitter? * @returns {boolean} panel is splitter? */ VPanel.prototype.isSplitter = function() { return this.options.isSplitter; }; /** * set max height of panel * @param {number} maxHeight - maxHeight */ VPanel.prototype.setMaxHeight = function(maxHeight) { if (!this.options.autoHeight) { this.options.maxHeight = maxHeight; } }; /** * set forced height flag * @param {boolean} set - enable or not */ VPanel.prototype.setHeightForcedSet = function(set) { this.isHeightForcedSet = set; }; /** * get forced height flag * @returns {boolean} set - enable or not */ VPanel.prototype.getHeightForcedSet = function() { return this.isHeightForcedSet; }; /** * set height of html element * @param {HTMLElement} [container] - container element * @param {number} newHeight - height * @param {boolean} force - whether ignore max-length */ VPanel.prototype.setHeight = function(container, newHeight, force) { var maxHeight = this.options.maxHeight; var minHeight = this.options.minHeight; var autoHeight = this.options.autoHeight; container = container || this.container; // 한번 force 호출이 일어난 이후에는 force 호출만 허용한다 if (!force && this.isHeightForcedSet && !autoHeight) { return; } if (force) { this.isHeightForcedSet = true; } else if (maxHeight) { newHeight = Math.min(newHeight, maxHeight); } newHeight = Math.max(minHeight, newHeight); container.style.height = newHeight + 'px'; }; /** * Calculate new height of panel and remains by supplied height growth * @param {number} growth - growth value * @returns {number[]} newHeight, remainHeight */ VPanel.prototype.getResizeInfoByGrowth = function(growth) { var height = this.getHeight(), newHeight = height + growth, resizeTo = Math.max(0, newHeight, this.options.minHeight); return [resizeTo, height - resizeTo]; }; /** * get outer height of panel element * @returns {number} outer height of panel element */ VPanel.prototype.getHeight = function() { return domutil.getSize(this.container)[1]; }; /** * add design class to panel element * @param {string} className - classname string */ VPanel.prototype.addClass = function(className) { domutil.addClass(this.container, className); }; /** * remove design class to panel element * @param {string} className - classname string */ VPanel.prototype.removeClass = function(className) { domutil.removeClass(this.container, className); }; /** * initialize panel element * @param {PanelOptions} options - options for panel * @param {HTMLDivElement} container - panel element */ VPanel.prototype._initPanel = function(options, container) { var height; domutil.setData(container, 'panelIndex', options.index); if (options.isSplitter) { domutil.addClass(container, config.classname('splitter')); this.applyTheme(); return; } if (options.className) { domutil.addClass(container, options.className); } if (options.autoHeight) { domutil.setData(container, 'autoHeight', true); } else { height = common.limit(options.height || 0, [options.minHeight], [options.maxHeight || options.height] ); options.height = height; this.setHeight(container, height); } }; VPanel.prototype.applyTheme = function() { var style = this.container.style; var theme = this.theme; if (!theme) { return; } style.borderTop = theme.week.vpanelSplitter.border || theme.common.border; style.borderBottom = theme.week.vpanelSplitter.border || theme.common.border; style.height = theme.week.vpanelSplitter.height; }; module.exports = VPanel; /***/ }), /***/ "./src/js/config.js": /*!**************************!*\ !*** ./src/js/config.js ***! \**************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Global configuration object module. This @echo syntax will change preprocess context. See gulpfile.js * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var cssPrefix = 'tui-full-calendar-', alldayGetViewID = new RegExp('^' + cssPrefix + 'weekday[\\s]tui-view-(\\d+)'), alldayCheckPermission = new RegExp('^' + cssPrefix + 'schedule(-title)?$'), timeGetViewID = new RegExp('^' + cssPrefix + 'time-date[\\s]tui-view-(\\d+)'); var config = { throwError: function(msg) { throw new Error(msg); }, cssPrefix: cssPrefix, classname: function(str) { str = str || ''; if (str.charAt(0) === '.') { return '.' + config.cssPrefix + str.slice(1); } return config.cssPrefix + str; }, allday: { getViewIDRegExp: alldayGetViewID, checkCondRegExp: alldayCheckPermission }, daygrid: { getViewIDRegExp: alldayGetViewID, checkCondRegExp: alldayCheckPermission }, time: { getViewIDRegExp: timeGetViewID } }; module.exports = config; /***/ }), /***/ "./src/js/controller/base.js": /*!***********************************!*\ !*** ./src/js/controller/base.js ***! \***********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Base calendar controller * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var Schedule = __webpack_require__(/*! ../model/schedule */ "./src/js/model/schedule.js"); var ScheduleViewModel = __webpack_require__(/*! ../model/viewModel/scheduleViewModel */ "./src/js/model/viewModel/scheduleViewModel.js"); var datetime = __webpack_require__(/*! ../common/datetime */ "./src/js/common/datetime.js"); var common = __webpack_require__(/*! ../common/common */ "./src/js/common/common.js"); var Theme = __webpack_require__(/*! ../theme/theme */ "./src/js/theme/theme.js"); /** * @constructor * @param {object} options - options for base controller * @param {function} [options.groupFunc] - function for group each models {@see Collection#groupBy} * @param {themeConfig} [options.theme] - theme object * @mixes util.CustomEvents */ function Base(options) { options = options || {}; /** * function for group each schedule models. * @type {function} * @param {ScheduleViewModel} viewModel - view model instance * @returns {string} group key */ this.groupFunc = options.groupFunc || function(viewModel) { var model = viewModel.model; if (viewModel.model.isAllDay) { return 'allday'; } if (model.category === 'time' && (model.end - model.start > datetime.MILLISECONDS_PER_DAY)) { return 'allday'; } return model.category; }; /** * schedules collection. * @type {Collection} */ this.schedules = common.createScheduleCollection(); /** * Matrix for multidate schedules. * @type {object.<string, array>} */ this.dateMatrix = {}; /** * Theme * @type {Theme} */ this.theme = new Theme(options.theme); /** * Calendar list * @type {Array.<Calendar>} */ this.calendars = []; } /** * Calculate contain dates in schedule. * @private * @param {Schedule} schedule The instance of schedule. * @returns {array} contain dates. */ Base.prototype._getContainDatesInSchedule = function(schedule) { var range = datetime.range( datetime.start(schedule.getStarts()), datetime.end(schedule.getEnds()), datetime.MILLISECONDS_PER_DAY ); return range; }; /**************** * CRUD Schedule ****************/ /** * Create an schedule instance from raw data. * @emits Base#beforeCreateSchedule * @emits Base#createdSchedule * @param {object} options Data object to create schedule. * @param {boolean} silent - set true then don't fire events. * @returns {Schedule} The instance of Schedule that created. */ Base.prototype.createSchedule = function(options, silent) { var schedule, scheduleData = { data: options }; /** * @event Base#beforeCreateSchedule * @type {Calendar~Schedule[]} */ if (!this.invoke('beforeCreateSchedule', scheduleData)) { return null; } schedule = this.addSchedule(Schedule.create(options)); if (!silent) { /** * @event Base#createdSchedule * @type {Schedule} */ this.fire('createdSchedule', schedule); } return schedule; }; /** * @emits Base#beforeCreateSchedule * @emits Base#createdSchedule * @param {Calendar~Schedule[]} dataList - dataObject list to create schedule. * @param {boolean} [silent=false] - set true then don't fire events. * @returns {Schedule[]} The instance list of Schedule that created. */ Base.prototype.createSchedules = function(dataList, silent) { var self = this; return util.map(dataList, function(data) { return self.createSchedule(data, silent); }); }; /** * Update an schedule. * @emits Base#updateSchedule * @param {Schedule} schedule - schedule instance to update * @param {object} options updated object data. * @returns {Schedule} updated schedule instance */ Base.prototype.updateSchedule = function(schedule, options) { var start = options.start || schedule.start; var end = options.end || schedule.end; options = options || {}; if (options.title) { schedule.set('title', options.title); } if (options.body) { schedule.set('body', options.body); } if (options.start || options.end) { if (schedule.isAllDay) { schedule.setAllDayPeriod(start, end); } else { schedule.setTimePeriod(start, end); } } if (options.color) { schedule.set('color', options.color); } if (options.bgColor) { schedule.set('bgColor', options.bgColor); } if (options.borderColor) { schedule.set('borderColor', options.borderColor); } if (options.origin) { schedule.set('origin', options.origin); } if (!util.isUndefined(options.isAllDay)) { schedule.set('isAllDay', options.isAllDay); } if (!util.isUndefined(options.isPending)) { schedule.set('isPending', options.isPending); } if (!util.isUndefined(options.isFocused)) { schedule.set('isFocused', options.isFocused); } if (options.location) { schedule.set('location', options.location); } if (options.state) { schedule.set('state', options.state); } this._removeFromMatrix(schedule); this._addToMatrix(schedule); /** * @event Base#updateSchedule */ this.fire('updateSchedule'); return schedule; }; /** * Delete schedule instance from controller. * @param {Schedule} schedule - schedule instance to delete * @returns {Schedule} deleted model instance. */ Base.prototype.deleteSchedule = function(schedule) { this._removeFromMatrix(schedule); this.schedules.remove(schedule); return schedule; }; /** * Set date matrix to supplied schedule instance. * @param {Schedule} schedule - instance of schedule. */ Base.prototype._addToMatrix = function(schedule) { var ownMatrix = this.dateMatrix; var containDates = this._getContainDatesInSchedule(schedule); util.forEach(containDates, function(date) { var ymd = datetime.format(date, 'YYYYMMDD'), matrix = ownMatrix[ymd] = ownMatrix[ymd] || []; matrix.push(util.stamp(schedule)); }); }; /** * Remove schedule's id from matrix. * @param {Schedule} schedule - instance of schedule */ Base.prototype._removeFromMatrix = function(schedule) { var modelID = util.stamp(schedule); util.forEach(this.dateMatrix, function(matrix) { var index = util.inArray(modelID, matrix); if (~index) { matrix.splice(index, 1); } }, this); }; /** * Add an schedule instance. * @emits Base#addedSchedule * @param {Schedule} schedule The instance of Schedule. * @param {boolean} silent - set true then don't fire events. * @returns {Schedule} The instance of Schedule that added. */ Base.prototype.addSchedule = function(schedule, silent) { this.schedules.add(schedule); this._addToMatrix(schedule); if (!silent) { /** * @event Base#addedSchedule * @type {object} */ this.fire('addedSchedule', schedule); } return schedule; }; /** * split schedule model by ymd. * @param {Date} start - start date * @param {Date} end - end date * @param {Collection} scheduleCollection - collection of schedule model. * @returns {object.<string, Collection>} splitted schedule model collections. */ Base.prototype.splitScheduleByDateRange = function(start, end, scheduleCollection) { var range = datetime.range( datetime.start(start), datetime.end(end), datetime.MILLISECONDS_PER_DAY ), ownMatrix = this.dateMatrix, result = {}; util.forEachArray(range, function(date) { var ymd = datetime.format(date, 'YYYYMMDD'), matrix = ownMatrix[ymd], collection; collection = result[ymd] = common.createScheduleCollection(); if (matrix && matrix.length) { util.forEachArray(matrix, function(id) { scheduleCollection.doWhenHas(id, function(schedule) { collection.add(schedule); }); }); } }); return result; }; /** * Return schedules in supplied date range. * * available only YMD. * @param {TZDate} start start date. * @param {TZDate} end end date. * @returns {object.<string, Collection>} schedule collection grouped by dates. */ Base.prototype.findByDateRange = function(start, end) { var range = datetime.range( datetime.start(start), datetime.end(end), datetime.MILLISECONDS_PER_DAY ), ownSchedules = this.schedules.items, ownMatrix = this.dateMatrix, dformat = datetime.format, result = {}, matrix, ymd, viewModels; util.forEachArray(range, function(date) { ymd = dformat(date, 'YYYYMMDD'); matrix = ownMatrix[ymd]; viewModels = result[ymd] = common.createScheduleCollection(); if (matrix && matrix.length) { viewModels.add.apply(viewModels, util.map(matrix, function(id) { return ScheduleViewModel.create(ownSchedules[id]); })); } }); return result; }; Base.prototype.clearSchedules = function() { this.dateMatrix = {}; this.schedules.clear(); /** * for inner view when clear schedules * @event Base#clearSchedules * @type {Schedule} */ this.fire('clearSchedules'); }; /** * Set a theme. * @param {themeConfig} theme - theme keys, styles * @returns {Array.<string>} keys - error keys not predefined. */ Base.prototype.setTheme = function(theme) { return this.theme.setStyles(theme); }; /** * Set calendar list * @param {Array.<Calendar>} calendars - calendar list */ Base.prototype.setCalendars = function(calendars) { this.calendars = calendars; }; // mixin util.CustomEvents.mixin(Base); module.exports = Base; /***/ }), /***/ "./src/js/controller/viewMixin/core.js": /*!*********************************************!*\ !*** ./src/js/controller/viewMixin/core.js ***! \*********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Core methods for schedule block placing * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var forEachArr = util.forEachArray, aps = Array.prototype.slice; var datetime = __webpack_require__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); var TZDate = __webpack_require__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date; var Collection = __webpack_require__(/*! ../../common/collection */ "./src/js/common/collection.js"); var ScheduleViewModel = __webpack_require__(/*! ../../model/viewModel/scheduleViewModel */ "./src/js/model/viewModel/scheduleViewModel.js"); var Core = { /** * Calculate collision group. * @param {array} viewModels List of viewmodels. * @returns {array} Collision Group. */ getCollisionGroup: function(viewModels) { var collisionGroups = [], foundPrevCollisionSchedule = false, previousScheduleList; if (!viewModels.length) { return collisionGroups; } collisionGroups[0] = [util.stamp(viewModels[0].valueOf())]; forEachArr(viewModels.slice(1), function(schedule, index) { foundPrevCollisionSchedule = false; previousScheduleList = aps.apply(viewModels, [0, index + 1]).reverse(); forEachArr(previousScheduleList, function(previous) { if (schedule.collidesWith(previous)) { // If overlapping previous schedules, find a Collision Group of overlapping schedules and add this schedules foundPrevCollisionSchedule = true; forEachArr(collisionGroups.slice(0).reverse(), function(group) { if (~util.inArray(util.stamp(previous.valueOf()), group)) { // If you find a previous schedule that overlaps, include it in the Collision Group to which it belongs. group.push(util.stamp(schedule.valueOf())); return false; // returning false can stop this loop } return true; }); return false; // returning false can stop this loop } return true; }); if (!foundPrevCollisionSchedule) { // This schedule is a schedule that does not overlap with the previous schedule, so a new Collision Group is constructed. collisionGroups.push([util.stamp(schedule.valueOf())]); } }); return collisionGroups; }, /** * Get row length by column index in 2d matrix. * @param {array[]} arr2d Matrix * @param {number} col Column index. * @returns {number} Last row number in column. */ getLastRowInColumn: function(arr2d, col) { var row = arr2d.length; while (row > 0) { row -= 1; if (!util.isUndefined(arr2d[row][col])) { return row; } } return false; }, /** * Calculate matrix for appointment block element placing. * @param {Collection} collection model collection. * @param {array[]} collisionGroups Collision groups for schedule set. * @returns {array} matrices */ getMatrices: function(collection, collisionGroups) { var result = [], getLastRowInColumn = Core.getLastRowInColumn; forEachArr(collisionGroups, function(group) { var matrix = [[]]; forEachArr(group, function(scheduleID) { var schedule = collection.items[scheduleID], col = 0, found = false, nextRow, lastRowInColumn; while (!found) { lastRowInColumn = getLastRowInColumn(matrix, col); if (lastRowInColumn === false) { matrix[0].push(schedule); found = true; } else if (!schedule.collidesWith(matrix[lastRowInColumn][col])) { nextRow = lastRowInColumn + 1; if (util.isUndefined(matrix[nextRow])) { matrix[nextRow] = []; } matrix[nextRow][col] = schedule; found = true; } col += 1; } }); result.push(matrix); }); return result; }, /** * Filter that get schedule model in supplied date ranges. * @param {Date} start - start date * @param {Date} end - end date * @returns {function} schedule filter function */ getScheduleInDateRangeFilter: function(start, end) { return function(model) { var ownStarts = model.getStarts(), ownEnds = model.getEnds(); // shorthand condition of // // (ownStarts >= start && ownEnds <= end) || // (ownStarts < start && ownEnds >= start) || // (ownEnds > end && ownStarts <= end) return !(ownEnds < start || ownStarts > end); }; }, /** * Position each view model for placing into container * @param {Date} start - start date to render * @param {Date} end - end date to render * @param {array} matrices - matrices from controller * @param {function} [iteratee] - iteratee function invoke each view models */ positionViewModels: function(start, end, matrices, iteratee) { var ymdListToRender; ymdListToRender = util.map( datetime.range(start, end, datetime.MILLISECONDS_PER_DAY), function(date) { return datetime.format(date, 'YYYYMMDD'); } ); forEachArr(matrices, function(matrix) { forEachArr(matrix, function(column) { forEachArr(column, function(viewModel, index) { var ymd, dateLength; if (!viewModel) { return; } ymd = datetime.format(viewModel.getStarts(), 'YYYYMMDD'); dateLength = datetime.range( datetime.start(viewModel.getStarts()), datetime.end(viewModel.getEnds()), datetime.MILLISECONDS_PER_DAY ).length; viewModel.top = index; viewModel.left = util.inArray(ymd, ymdListToRender); viewModel.width = dateLength; if (iteratee) { iteratee(viewModel); } }); }); }); }, /** * Limit start, end date each view model for render properly * @param {TZDate} start - start date to render * @param {TZDate} end - end date to render * @param {Collection|ScheduleViewModel} viewModelColl - schedule view * model collection or ScheduleViewModel * @returns {ScheduleViewModel} return view model when third parameter is * view model */ limitRenderRange: function(start, end, viewModelColl) { /** * Limit render range for view models * @param {ScheduleViewModel} viewModel - view model instance * @returns {ScheduleViewModel} view model that limited render range */ function limit(viewModel) { if (viewModel.getStarts() < start) { viewModel.exceedLeft = true; viewModel.renderStarts = new TZDate(start); } if (viewModel.getEnds() > end) { viewModel.exceedRight = true; viewModel.renderEnds = new TZDate(end); } return viewModel; } if (viewModelColl.constructor === Collection) { viewModelColl.each(limit); return null; } return limit(viewModelColl); }, /** * Convert schedule model collection to view model collection. * @param {Collection} modelColl - collection of schedule model * @returns {Collection} collection of schedule view model */ convertToViewModel: function(modelColl) { var viewModelColl; viewModelColl = new Collection(function(viewModel) { return viewModel.cid(); }); modelColl.each(function(model) { viewModelColl.add(ScheduleViewModel.create(model)); }); return viewModelColl; } }; module.exports = Core; /***/ }), /***/ "./src/js/controller/viewMixin/month.js": /*!**********************************************!*\ !*** ./src/js/controller/viewMixin/month.js ***! \**********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Controller mixin for Month View * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var array = __webpack_require__(/*! ../../common/array */ "./src/js/common/array.js"), datetime = __webpack_require__(/*! ../../common/datetime */ "./src/js/common/datetime.js"), Collection = __webpack_require__(/*! ../../common/collection */ "./src/js/common/collection.js"); var mmax = Math.max; var Month = { /** * Filter function for find time schedule * @param {ScheduleViewModel} viewModel - schedule view model * @returns {boolean} whether model is time schedule? */ _onlyTimeFilter: function(viewModel) { return !viewModel.model.isAllDay && !viewModel.hasMultiDates; }, /** * Filter function for find allday schedule * @param {ScheduleViewModel} viewModel - schedule view model * @returns {boolean} whether model is allday schedule? */ _onlyAlldayFilter: function(viewModel) { return viewModel.model.isAllDay || viewModel.hasMultiDates; }, /** * Weight top value +1 for month view render * @param {ScheduleViewModel} viewModel - schedule view model */ _weightTopValue: function(viewModel) { viewModel.top = viewModel.top || 0; viewModel.top += 1; }, /** * Adjust render range to render properly. * * Limit start, end for each allday schedules and expand start, end for * each time schedules * @this Base * @param {TZDate} start - render start date * @param {TZDate} end - render end date * @param {Collection} vColl - view model collection * property. */ _adjustRenderRange: function(start, end, vColl) { var ctrlCore = this.Core; vColl.each(function(viewModel) { if (viewModel.model.isAllDay || viewModel.hasMultiDates) { ctrlCore.limitRenderRange(start, end, viewModel); } }); }, /** * Get max top index value for allday schedules in specific date (YMD) * @this Base * @param {string} ymd - yyyymmdd formatted value * @param {Collection} vAlldayColl - collection of allday schedules * @returns {number} max top index value in date */ _getAlldayMaxTopIndexAtYMD: function(ymd, vAlldayColl) { var dateMatrix = this.dateMatrix, topIndexesInDate = []; util.forEach(dateMatrix[ymd], function(cid) { vAlldayColl.doWhenHas(cid, function(viewModel) { topIndexesInDate.push(viewModel.top); }); }); if (topIndexesInDate.length > 0) { return mmax.apply(null, topIndexesInDate); } return 0; }, /** * Adjust time view model's top index value * @this Base * @param {Collection} vColl - collection of schedules */ _adjustTimeTopIndex: function(vColl) { var ctrlMonth = this.Month; var getAlldayMaxTopIndexAtYMD = ctrlMonth._getAlldayMaxTopIndexAtYMD; var vAlldayColl = vColl.find(ctrlMonth._onlyAlldayFilter); var sortedTimeSchedules = vColl.find(ctrlMonth._onlyTimeFilter).sort(array.compare.schedule.asc); var maxIndexInYMD = {}; sortedTimeSchedules.forEach(function(timeViewModel) { var scheduleYMD = datetime.format(timeViewModel.getStarts(), 'YYYYMMDD'); var alldayMaxTopInYMD = maxIndexInYMD[scheduleYMD]; if (util.isUndefined(alldayMaxTopInYMD)) { alldayMaxTopInYMD = maxIndexInYMD[scheduleYMD] = getAlldayMaxTopIndexAtYMD(scheduleYMD, vAlldayColl); } maxIndexInYMD[scheduleYMD] = timeViewModel.top = (alldayMaxTopInYMD + 1); }); }, /** * Adjust time view model's top index value * @this Base * @param {Collection} vColl - collection of schedules */ _stackTimeFromTop: function(vColl) { var ctrlMonth = this.Month; var vAlldayColl = vColl.find(ctrlMonth._onlyAlldayFilter); var sortedTimeSchedules = vColl.find(ctrlMonth._onlyTimeFilter).sort(array.compare.schedule.asc); var indiceInYMD = {}; var dateMatrix = this.dateMatrix; sortedTimeSchedules.forEach(function(timeViewModel) { var scheduleYMD = datetime.format(timeViewModel.getStarts(), 'YYYYMMDD'); var topArrayInYMD = indiceInYMD[scheduleYMD]; var maxTopInYMD; var i; if (util.isUndefined(topArrayInYMD)) { topArrayInYMD = indiceInYMD[scheduleYMD] = []; util.forEach(dateMatrix[scheduleYMD], function(cid) { vAlldayColl.doWhenHas(cid, function(viewModel) { topArrayInYMD.push(viewModel.top); }); }); } if (util.inArray(timeViewModel.top, topArrayInYMD) >= 0) { maxTopInYMD = mmax.apply(null, topArrayInYMD) + 1; for (i = 1; i <= maxTopInYMD; i += 1) { timeViewModel.top = i; if (util.inArray(timeViewModel.top, topArrayInYMD) < 0) { break; } } } topArrayInYMD.push(timeViewModel.top); }); }, /** * Convert multi-date time schedule to all-day schedule * @this Base * @param {Collection} vColl - view model collection * property. */ _addMultiDatesInfo: function(vColl) { vColl.each(function(viewModel) { var model = viewModel.model; var start = model.getStarts(); var end = model.getEnds(); viewModel.hasMultiDates = !datetime.isSameDate(start, end); if (!model.isAllDay && viewModel.hasMultiDates) { viewModel.renderStarts = datetime.start(start); viewModel.renderEnds = datetime.end(end); } }); }, /** * Find schedule and get view model for specific month * @this Base * @param {TZDate} start - start date to find schedules * @param {TZDate} end - end date to find schedules * @param {function[]} [andFilters] - optional filters to applying search query * @param {boolean} [alldayFirstMode=false] if true, time schedule is lower than all-day schedule. Or stack schedules from the top. * @returns {object} view model data */ findByDateRange: function(start, end, andFilters, alldayFirstMode) { var ctrlCore = this.Core, ctrlMonth = this.Month, filter = ctrlCore.getScheduleInDateRangeFilter(start, end), coll, vColl, vList, collisionGroup, matrices; alldayFirstMode = alldayFirstMode || false; andFilters = andFilters || []; filter = Collection.and.apply(null, [filter].concat(andFilters)); coll = this.schedules.find(filter); vColl = ctrlCore.convertToViewModel(coll); ctrlMonth._addMultiDatesInfo(vColl); ctrlMonth._adjustRenderRange(start, end, vColl); vList = vColl.sort(array.compare.schedule.asc); collisionGroup = ctrlCore.getCollisionGroup(vList); matrices = ctrlCore.getMatrices(vColl, collisionGroup); ctrlCore.positionViewModels(start, end, matrices, ctrlMonth._weightTopValue); if (alldayFirstMode) { ctrlMonth._adjustTimeTopIndex(vColl); } else { ctrlMonth._stackTimeFromTop(vColl); } return matrices; } }; module.exports = Month; /***/ }), /***/ "./src/js/controller/viewMixin/week.js": /*!*********************************************!*\ !*** ./src/js/controller/viewMixin/week.js ***! \*********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* eslint no-shadow: 0 */ /** * @fileoverview Controller mixin modules for day views. * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var Collection = __webpack_require__(/*! ../../common/collection */ "./src/js/common/collection.js"); var array = __webpack_require__(/*! ../../common/array */ "./src/js/common/array.js"); var datetime = __webpack_require__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); var TZDate = __webpack_require__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date; var SCHEDULE_MIN_DURATION = datetime.MILLISECONDS_SCHEDULE_MIN_DURATION; /** * @mixin Base.Week */ var Week = { /********** * TIME GRID VIEW **********/ /** * Make array with start and end times on schedules. * @this Base.Week * @param {array[]} matrix - matrix from controller. * @returns {array[]} starttime, endtime array (exclude first row's schedules) */ generateTimeArrayInRow: function(matrix) { var row, col, schedule, start, end, map = [], cursor = [], maxColLen = Math.max.apply(null, util.map(matrix, function(col) { return col.length; })); for (col = 1; col < maxColLen; col += 1) { row = 0; schedule = util.pick(matrix, row, col); while (schedule) { start = schedule.getStarts().getTime() - datetime.millisecondsFrom('minutes', schedule.valueOf().goingDuration); end = schedule.getEnds().getTime() + datetime.millisecondsFrom('minutes', schedule.valueOf().comingDuration); if (Math.abs(end - start) < SCHEDULE_MIN_DURATION) { end += SCHEDULE_MIN_DURATION; } cursor.push([start, end]); row += 1; schedule = util.pick(matrix, row, col); } map.push(cursor); cursor = []; } return map; }, /** * Get collision information from list * @this Base * @param {array.<number[]>} arr - list to detecting collision. [[start, end], [start, end]] * @param {number} start - schedule start time that want to detect collisions. * @param {number} end - schedule end time that want to detect collisions. * @returns {boolean} target has collide in supplied array? */ hasCollide: function(arr, start, end) { var startStart, startEnd, endStart, endEnd, getFunc = function(index) { return function(block) { return block[index]; }; }, abs = Math.abs, compare = array.compare.num.asc, hasCollide; if (!arr.length) { return false; } startStart = abs(array.bsearch(arr, start, getFunc(0), compare)); startEnd = abs(array.bsearch(arr, start, getFunc(1), compare)); endStart = abs(array.bsearch(arr, end, getFunc(0), compare)); endEnd = abs(array.bsearch(arr, end, getFunc(1), compare)); hasCollide = !(startStart === startEnd && startEnd === endStart && endStart === endEnd); return hasCollide; }, /** * Initialize values to viewmodels for detect real collision at rendering phase. * @this Base * @param {array[]} matrices - Matrix data. */ getCollides: function(matrices) { util.forEachArray(matrices, function(matrix) { var binaryMap, maxRowLength; binaryMap = Week.generateTimeArrayInRow(matrix); maxRowLength = Math.max.apply(null, util.map(matrix, function(row) { return row.length; })); util.forEachArray(matrix, function(row) { util.forEachArray(row, function(viewModel, col) { var startTime, endTime, hasCollide, i; if (!viewModel) { return; } startTime = viewModel.getStarts().getTime(); endTime = viewModel.getEnds().getTime(); if (Math.abs(endTime - startTime) < SCHEDULE_MIN_DURATION) { endTime += SCHEDULE_MIN_DURATION; } startTime -= datetime.millisecondsFrom('minutes', viewModel.valueOf().goingDuration); endTime += datetime.millisecondsFrom('minutes', viewModel.valueOf().comingDuration); endTime -= 1; for (i = (col + 1); i < maxRowLength; i += 1) { hasCollide = Week.hasCollide(binaryMap[i - 1], startTime, endTime); if (hasCollide) { viewModel.hasCollide = true; break; } viewModel.extraSpace += 1; } }); }); }); }, /** * create view model for time view part * @this Base * @param {Date} start - start date. * @param {Date} end - end date. * @param {Collection} time - view model collection. * @param {number} hourStart - start hour to be shown * @param {number} hourEnd - end hour to be shown * @returns {object} view model for time part. */ getViewModelForTimeView: function(start, end, time, hourStart, hourEnd) { var self = this, ymdSplitted = this.splitScheduleByDateRange(start, end, time), result = {}; var _getViewModel = Week._makeGetViewModelFuncForTimeView(hourStart, hourEnd); util.forEach(ymdSplitted, function(collection, ymd) { var viewModels = _getViewModel(collection); var collisionGroups, matrices; collisionGroups = self.Core.getCollisionGroup(viewModels); matrices = self.Core.getMatrices(collection, collisionGroups); self.Week.getCollides(matrices); result[ymd] = matrices; }); return result; }, /** * make view model function depending on start and end hour * if time view option has start or end hour condition * it add filter * @param {number} hourStart - start hour to be shown * @param {number} hourEnd - end hour to be shown * @returns {function} function */ _makeGetViewModelFuncForTimeView: function(hourStart, hourEnd) { if (hourStart === 0 && hourEnd === 24) { return function(collection) { return collection.sort(array.compare.schedule.asc); }; } return function(collection) { return collection.find(Week._makeHourRangeFilter(hourStart, hourEnd)) .sort(array.compare.schedule.asc); }; }, /** * make a filter function that is not included range of start, end hour * @param {number} hStart - hour start * @param {number} hEnd - hour end * @returns {function} - filtering function */ _makeHourRangeFilter: function(hStart, hEnd) { return function(schedule) { var ownHourStart = schedule.model.start; var ownHourEnd = schedule.model.end; var yyyy = ownHourStart.getFullYear(); var mm = ownHourStart.getMonth(); var dd = ownHourStart.getDate(); var hourStart = new TZDate(yyyy, mm, dd).setHours(hStart); var hourEnd = new TZDate(yyyy, mm, dd).setHours(hEnd); return (ownHourStart >= hourStart && ownHourStart < hourEnd) || (ownHourEnd > hourStart && ownHourEnd <= hourEnd) || (ownHourStart < hourStart && ownHourEnd > hourStart) || (ownHourEnd > hourEnd && ownHourStart < hourEnd); }; }, /********** * ALLDAY VIEW **********/ /** * Set hasMultiDates flag to true and set date ranges for rendering * @this Base * @param {Collection} vColl - view model collection */ _addMultiDatesInfo: function(vColl) { vColl.each(function(viewModel) { var model = viewModel.model; viewModel.hasMultiDates = true; viewModel.renderStarts = datetime.start(model.getStarts()); viewModel.renderEnds = datetime.end(model.getEnds()); }); }, /** * create view model for allday view part * @this Base * @param {Date} start start date. * @param {Date} end end date. * @param {Collection} viewModelColl - allday schedule viewModel viewModels. * @returns {object} allday viewModel. */ getViewModelForAlldayView: function(start, end, viewModelColl) { var ctrlCore = this.Core, ctrlWeek = this.Week, viewModels, collisionGroups, matrices; if (!viewModelColl || !viewModelColl.length) { return []; } ctrlWeek._addMultiDatesInfo(viewModelColl); ctrlCore.limitRenderRange(start, end, viewModelColl); viewModels = viewModelColl.sort(array.compare.schedule.asc); collisionGroups = ctrlCore.getCollisionGroup(viewModels); matrices = ctrlCore.getMatrices(viewModelColl, collisionGroups); ctrlCore.positionViewModels(start, end, matrices); return matrices; }, /********** * READ **********/ /** * Populate schedules in date range. * @this Base * @param {Date} start start date. * @param {Date} end end date. * @param {Array.<object>} panels - schedule panels like 'milestone', 'task', 'allday', 'time' * @param {function[]} [andFilters] - optional filters to applying search query * @param {Object} options - week view options * @returns {object} schedules grouped by dates. */ findByDateRange: function(start, end, panels, andFilters, options) { var ctrlCore = this.Core, ctrlWeek = this.Week, filter = ctrlCore.getScheduleInDateRangeFilter(start, end), scheduleTypes = util.pluck(panels, 'name'), hourStart = util.pick(options, 'hourStart'), hourEnd = util.pick(options, 'hourEnd'), modelColl, group; andFilters = andFilters || []; filter = Collection.and.apply(null, [filter].concat(andFilters)); modelColl = this.schedules.find(filter); modelColl = ctrlCore.convertToViewModel(modelColl); group = modelColl.groupBy(scheduleTypes, this.groupFunc); util.forEach(panels, function(panel) { var name = panel.name; if (panel.type === 'daygrid') { group[name] = ctrlWeek.getViewModelForAlldayView(start, end, group[name]); } else if (panel.type === 'timegrid') { group[name] = ctrlWeek.getViewModelForTimeView(start, end, group[name], hourStart, hourEnd); } }); return group; }, /* eslint max-nested-callbacks: 0 */ /** * Make exceed date information * @param {number} maxCount - exceed schedule count * @param {Array} eventsInDateRange - matrix of ScheduleViewModel * @param {Array.<TZDate>} range - date range of one week * @returns {object} exceedDate */ getExceedDate: function(maxCount, eventsInDateRange, range) { var exceedDate = {}; util.forEach(range, function(date) { var ymd = datetime.format(date, 'YYYYMMDD'); exceedDate[ymd] = 0; }); util.forEach(eventsInDateRange, function(matrix) { util.forEach(matrix, function(column) { util.forEach(column, function(viewModel) { var period; if (!viewModel || viewModel.top < maxCount) { return; } period = datetime.range( viewModel.getStarts(), viewModel.getEnds(), datetime.MILLISECONDS_PER_DAY ); util.forEach(period, function(date) { var ymd = datetime.format(date, 'YYYYMMDD'); exceedDate[ymd] += 1; }); }); }); }); return exceedDate; }, /** * Exclude overflow schedules from matrices * @param {array} matrices - The matrices for schedule placing. * @param {number} visibleScheduleCount - maximum visible count on panel * @returns {array} - The matrices for schedule placing except overflowed schedules. */ excludeExceedSchedules: function(matrices, visibleScheduleCount) { return matrices.map(function(matrix) { return matrix.map(function(row) { if (row.length > visibleScheduleCount) { return row.filter(function(item) { return item.top < visibleScheduleCount; }, this); } return row; }, this); }, this); } }; module.exports = Week; /***/ }), /***/ "./src/js/factory/calendar.js": /*!************************************!*\ !*** ./src/js/factory/calendar.js ***! \************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Factory module for control all other factory. * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var GA_TRACKING_ID = 'UA-129951699-1'; var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"), Handlebars = __webpack_require__(/*! handlebars-template-loader/runtime */ "./node_modules/handlebars-template-loader/runtime/index.js"); var dw = __webpack_require__(/*! ../common/dw */ "./src/js/common/dw.js"), datetime = __webpack_require__(/*! ../common/datetime */ "./src/js/common/datetime.js"), Layout = __webpack_require__(/*! ../view/layout */ "./src/js/view/layout.js"), Drag = __webpack_require__(/*! ../handler/drag */ "./src/js/handler/drag.js"), controllerFactory = __webpack_require__(/*! ./controller */ "./src/js/factory/controller.js"), weekViewFactory = __webpack_require__(/*! ./weekView */ "./src/js/factory/weekView.js"), monthViewFactory = __webpack_require__(/*! ./monthView */ "./src/js/factory/monthView.js"), TZDate = __webpack_require__(/*! ../common/timezone */ "./src/js/common/timezone.js").Date, config = __webpack_require__(/*! ../config */ "./src/js/config.js"), timezone = __webpack_require__(/*! ../common/timezone */ "./src/js/common/timezone.js"), reqAnimFrame = __webpack_require__(/*! ../common/reqAnimFrame */ "./src/js/common/reqAnimFrame.js"); var mmin = Math.min; /** * Schedule information * @typedef {object} Schedule * @property {string} [id] - The unique schedule id depends on calendar id * @property {string} calendarId - The unique calendar id * @property {string} [title] - The schedule title * @property {string} [body] - The schedule body text which is text/plain * @property {string|TZDate} [start] - The start time. It's 'string' for input. It's 'TZDate' for output like event handler. * @property {string|TZDate} [end] - The end time. It's 'string' for input. It's 'TZDate' for output like event handler. * @property {number} [goingDuration] - The travel time: Going duration minutes * @property {number} [comingDuration] - The travel time: Coming duration minutes * @property {boolean} [isAllDay] - The all day schedule * @property {string} [category] - The schedule type('milestone', 'task', allday', 'time') * @property {string} [dueDateClass] - The task schedule type string * (any string value is ok and mandatory if category is 'task') * @property {string} [location] - The location * @property {Array.<string>} [attendees] - The attendees * @property {string} [recurrenceRule] - The recurrence rule * @property {boolean} [isPending] - The in progress flag to do something like network job(The schedule will be transparent.) * @property {boolean} [isFocused] - The focused schedule flag * @property {boolean} [isVisible] - The schedule visibility flag * @property {boolean} [isReadOnly] - The schedule read-only flag * @property {boolean} [isPrivate] - The private schedule * @property {string} [color] - The schedule text color * @property {string} [bgColor] - The schedule background color * @property {string} [dragBgColor] - The schedule background color when dragging it * @property {string} [borderColor] - The schedule left border color * @property {string} [customStyle] - The schedule's custom css class * @property {any} [raw] - The user data * @property {string} [state] - The schedule's state ('busy', 'free') */ /** * Template functions to support customer renderer * @typedef {object} Template * @property {function} [milestoneTitle] - The milestone title(at left column) template function * @property {function} [milestone] - The milestone template function * @property {function} [taskTitle] - The task title(at left column) template function * @property {function} [task] - The task template function * @property {function} [alldayTitle] - The allday title(at left column) template function * @property {function} [allday] - The allday template function * @property {function} [time] - The time template function * @property {function} [goingDuration] - The travel time(going duration) template function * @property {function} [comingDuration] - The travel time(coming duration) template function * @property {function} [monthMoreTitleDate] - The month more layer title template function * @property {function} [monthMoreClose] - The month more layer close button template function * @property {function} [monthGridHeader] - The month grid header(date, decorator, title) template function * @property {function} [monthGridHeaderExceed] - The month grid header(exceed schedule count) template function * @property {function} [monthGridFooter] - The month grid footer(date, decorator, title) template function * @property {function} [monthGridFooterExceed] - The month grid footer(exceed schedule count) template function * @property {function} [monthDayname] - The monthly dayname template function * @property {function} [weekDayname] - The weekly dayname template function * @property {function} [weekGridFooterExceed] - The week/day grid footer(exceed schedule count) template function * @property {function} [dayGridTitle] - The week/day grid title template function(e.g. milestone, task, allday) * @property {function} [schedule] - The week/day schedule template function(When the schedule category attribute is milestone, task, or all day) * @property {function} [collapseBtnTitle] - The week/day (exceed schedule more view) collapse button title template function * @property {function} [timezoneDisplayLabel] - The timezone display label template function in time grid * @property {function} [timegridDisplayPrimayTime] - Deprecated: use 'timegridDisplayPrimaryTime' * @property {function} [timegridDisplayPrimaryTime] - The display label template function of primary timezone in time grid * @property {function} [timegridDisplayTime] - The display time template function in time grid * @property {function} [timegridCurrentTime] - The current time template function in time grid * @property {function} [popupIsAllDay] - The all day checkbox label text template function in the default creation popup * @property {function} [popupStateFree] - The free option template function in the state select box of the default creation popup * @property {function} [popupStateBusy] - The busy option template function in the state select box of the default creation popup * @property {function} [titlePlaceholder] - The title input placeholder text template function in the default creation popup * @property {function} [locationPlaceholder] - The location input placeholder text template function in the default creation popup * @property {function} [startDatePlaceholder] - The start date input placeholder text template function in the default creation popup * @property {function} [endDatePlaceholder] - The end date input placeholder text template function in the default creation popup * @property {function} [popupSave] - The 'Save' button text template function in the default creation popup * @property {function} [popupUpdate] - The 'Update' button text template function in the default creation popup when in edit mode * @property {function} [popupDetailDate] - The schedule date information's template function on the default detail popup * @property {function} [popupDetailLocation] - The schedule location text information's template function on the default detail popup * @property {function} [popupDetailUser] - The schedule user text information's template function on the default detail popup * @property {function} [popupDetailState] - The schedule state(busy or free) text information's template function on the default detail popup * @property {function} [popupDetailRepeat] - The schedule repeat information's template function on the default detail popup * @property {function} [popupDetailBody] - The schedule body text information's template function on the default detail popup * @property {function} [popupEdit] - The 'Edit' button text template function on the default detail popup * @property {function} [popupDelete] - The 'Delete' button text template function on the default detail popup * @example * var calendar = new tui.Calendar(document.getElementById('calendar'), { * ... * template: { * milestone: function(schedule) { * return '<span class="calendar-font-icon ic-milestone-b"></span> <span style="background-color: ' + schedule.bgColor + '">' + schedule.title + '</span>'; * }, * milestoneTitle: function() { * return '<span class="tui-full-calendar-left-content">MILESTONE</span>'; * }, * task: function(schedule) { * return '#' + schedule.title; * }, * taskTitle: function() { * return '<span class="tui-full-calendar-left-content">TASK</span>'; * }, * allday: function(schedule) { * return getTimeTemplate(schedule, true); * }, * alldayTitle: function() { * return '<span class="tui-full-calendar-left-content">ALL DAY</span>'; * }, * time: function(schedule) { * return '<strong>' + moment(schedule.start.getTime()).format('HH:mm') + '</strong> ' + schedule.title; * }, * goingDuration: function(schedule) { * return '<span class="calendar-icon ic-travel-time"></span>' + schedule.goingDuration + 'min.'; * }, * comingDuration: function(schedule) { * return '<span class="calendar-icon ic-travel-time"></span>' + schedule.comingDuration + 'min.'; * }, * monthMoreTitleDate: function(date, dayname) { * var day = date.split('.')[2]; * * return '<span class="tui-full-calendar-month-more-title-day">' + day + '</span> <span class="tui-full-calendar-month-more-title-day-label">' + dayname + '</span>'; * }, * monthMoreClose: function() { * return '<span class="tui-full-calendar-icon tui-full-calendar-ic-close"></span>'; * }, * monthGridHeader: function(dayModel) { * var date = parseInt(dayModel.date.split('-')[2], 10); * var classNames = ['tui-full-calendar-weekday-grid-date ']; * * if (dayModel.isToday) { * classNames.push('tui-full-calendar-weekday-grid-date-decorator'); * } * * return '<span class="' + classNames.join(' ') + '">' + date + '</span>'; * }, * monthGridHeaderExceed: function(hiddenSchedules) { * return '<span class="weekday-grid-more-schedules">+' + hiddenSchedules + '</span>'; * }, * monthGridFooter: function() { * return ''; * }, * monthGridFooterExceed: function(hiddenSchedules) { * return ''; * }, * monthDayname: function(model) { * return (model.label).toString().toLocaleUpperCase(); * }, * weekDayname: function(model) { * return '<span class="tui-full-calendar-dayname-date">' + model.date + '</span> <span class="tui-full-calendar-dayname-name">' + model.dayName + '</span>'; * }, * weekGridFooterExceed: function(hiddenSchedules) { * return '+' + hiddenSchedules; * }, * dayGridTitle: function(viewName) { * * // use another functions instead of 'dayGridTitle' * // milestoneTitle: function() {...} * // taskTitle: function() {...} * // alldayTitle: function() {...} * * var title = ''; * switch(viewName) { * case 'milestone': * title = '<span class="tui-full-calendar-left-content">MILESTONE</span>'; * break; * case 'task': * title = '<span class="tui-full-calendar-left-content">TASK</span>'; * break; * case 'allday': * title = '<span class="tui-full-calendar-left-content">ALL DAY</span>'; * break; * } * * return title; * }, * schedule: function(schedule) { * * // use another functions instead of 'schedule' * // milestone: function() {...} * // task: function() {...} * // allday: function() {...} * * var tpl; * * switch(category) { * case 'milestone': * tpl = '<span class="calendar-font-icon ic-milestone-b"></span> <span style="background-color: ' + schedule.bgColor + '">' + schedule.title + '</span>'; * break; * case 'task': * tpl = '#' + schedule.title; * break; * case 'allday': * tpl = getTimeTemplate(schedule, true); * break; * } * * return tpl; * }, * collapseBtnTitle: function() { * return '<span class="tui-full-calendar-icon tui-full-calendar-ic-arrow-solid-top"></span>'; * }, * timezoneDisplayLabel: function(timezoneOffset, displayLabel) { * var gmt, hour, minutes; * * if (!displayLabel) { * gmt = timezoneOffset < 0 ? '-' : '+'; * hour = Math.abs(parseInt(timezoneOffset / 60, 10)); * minutes = Math.abs(timezoneOffset % 60); * displayLabel = gmt + getPadStart(hour) + ':' + getPadStart(minutes); * } * * return displayLabel; * }, * timegridDisplayPrimayTime: function(time) { * // will be deprecated. use 'timegridDisplayPrimaryTime' * var meridiem = 'am'; * var hour = time.hour; * * if (time.hour > 12) { * meridiem = 'pm'; * hour = time.hour - 12; * } * * return hour + ' ' + meridiem; * }, * timegridDisplayPrimaryTime: function(time) { * var meridiem = 'am'; * var hour = time.hour; * * if (time.hour > 12) { * meridiem = 'pm'; * hour = time.hour - 12; * } * * return hour + ' ' + meridiem; * }, * timegridDisplayTime: function(time) { * return getPadStart(time.hour) + ':' + getPadStart(time.hour); * }, * timegridCurrentTime: function(timezone) { * var templates = []; * * if (timezone.dateDifference) { * templates.push('[' + timezone.dateDifferenceSign + timezone.dateDifference + ']<br>'); * } * * templates.push(moment(timezone.hourmarker).format('HH:mm a')); * * return templates.join(''); * }, * popupIsAllDay: function() { * return 'All Day'; * }, * popupStateFree: function() { * return 'Free'; * }, * popupStateBusy: function() { * return 'Busy'; * }, * titlePlaceholder: function() { * return 'Subject'; * }, * locationPlaceholder: function() { * return 'Location'; * }, * startDatePlaceholder: function() { * return 'Start date'; * }, * endDatePlaceholder: function() { * return 'End date'; * }, * popupSave: function() { * return 'Save'; * }, * popupUpdate: function() { * return 'Update'; * }, * popupDetailDate: function(isAllDay, start, end) { * var isSameDate = moment(start).isSame(end); * var endFormat = (isSameDate ? '' : 'YYYY.MM.DD ') + 'hh:mm a'; * * if (isAllDay) { * return moment(start).format('YYYY.MM.DD') + (isSameDate ? '' : ' - ' + moment(end).format('YYYY.MM.DD')); * } * * return (moment(start).format('YYYY.MM.DD hh:mm a') + ' - ' + moment(end).format(endFormat)); * }, * popupDetailLocation: function(schedule) { * return 'Location : ' + schedule.location; * }, * popupDetailUser: function(schedule) { * return 'User : ' + (schedule.attendees || []).join(', '); * }, * popupDetailState: function(schedule) { * return 'State : ' + schedule.state || 'Busy'; * }, * popupDetailRepeat: function(schedule) { * return 'Repeat : ' + schedule.recurrenceRule; * }, * popupDetailBody: function(schedule) { * return 'Body : ' + schedule.body; * }, * popupEdit: function() { * return 'Edit'; * }, * popupDelete: function() { * return 'Delete'; * } * } * } */ /** * Options for daily, weekly view. * @typedef {object} WeekOptions * @property {number} [startDayOfWeek=0] - The start day of week, * @property {Array.<string>} [daynames] - The day names in weekly and daily. Default values are ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] * @property {boolean} [narrowWeekend=false] - Make weekend column narrow(1/2 width) * @property {boolean} [workweek=false] - Show only 5 days except for weekend * @property {boolean} [showTimezoneCollapseButton=false] - Show a collapse button to close multiple timezones * @property {boolean} [timezonesCollapsed=false] - An initial multiple timezones collapsed state * @property {number} [hourStart=0] - Can limit of render hour start. * @property {number} [hourEnd=24] - Can limit of render hour end. */ /** * Options for monthly view. * @typedef {object} MonthOptions * @property {Array.<string>} [daynames] - The day names in monthly. Default values are ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] * @property {number} [startDayOfWeek=0] - The start day of week * @property {boolean} [narrowWeekend=false] - Make weekend column narrow(1/2 width) * @property {number} [visibleWeeksCount=6] - The visible week count in monthly(0 or null are same with 6) * @property {boolean} [isAlways6Week=true] - Always show 6 weeks. If false, show 5 weeks or 6 weeks based on the month. * @property {boolean} [workweek=false] - Show only 5 days except for weekend * @property {number} [visibleScheduleCount] - The visible schedule count in monthly grid * @property {object} [moreLayerSize] - The more layer size * @property {object} [moreLayerSize.width=null] - The css width value(px, 'auto'). * The default value 'null' is to fit a grid cell. * @property {object} [moreLayerSize.height=null] - The css height value(px, 'auto'). * The default value 'null' is to fit a grid cell. * @property {object} [grid] - The grid's header and footer information * @property {object} [grid.header] - The grid's header informatioin * @property {number} [grid.header.height=34] - The grid's header height * @property {object} [grid.footer] - The grid's footer informatioin * @property {number} [grid.footer.height=34] - The grid's footer height * @property {function} [scheduleFilter=null] - The filter schedules on month view. A parameter is {Schedule} object. */ /** * @typedef {object} CalendarColor * @property {string} [color] - The calendar color * @property {string} [bgColor] - The calendar background color * @property {string} [borderColor] - The calendar left border color */ /** * @typedef {object} Timezone * @property {number} [timezoneOffset] - The minutes for your timezone offset. If null, use the browser's timezone. Refer to Date.prototype.getTimezoneOffset() * @property {string} [displayLabel] - The display label of your timezone at weekly/daily view(e.g. 'GMT+09:00') * @property {string} [tooltip] - The tooltip(e.g. 'Seoul') * @example * var cal = new Calendar('#calendar', { * timezones: [{ * timezoneOffset: 540, * displayLabel: 'GMT+09:00', * tooltip: 'Seoul' * }, { * timezoneOffset: -420, * displayLabel: 'GMT-08:00', * tooltip: 'Los Angeles' * }] * }); */ /** * @typedef {object} CalendarProps * @property {string|number} id - The calendar id * @property {string} name - The calendar name * @property {string} color - The text color when schedule is displayed * @property {string} bgColor - The background color schedule is displayed * @property {string} borderColor - The color of left border or bullet point when schedule is displayed * @example * var cal = new Calendar('#calendar', { * ... * calendars: [ * { * id: '1', * name: 'My Calendar', * color: '#ffffff', * bgColor: '#9e5fff', * dragBgColor: '#9e5fff', * borderColor: '#9e5fff' * }, * { * id: '2', * name: 'Company', * color: '#00a9ff', * bgColor: '#00a9ff', * dragBgColor: '#00a9ff', * borderColor: '#00a9ff' * }, * ] * }); */ /** * @typedef {object} Options - Calendar option object * @property {string} [defaultView='week'] - Default view of calendar. The default value is 'week'. * @property {boolean|Array.<string>} [taskView=true] - Show the milestone and task in weekly, daily view. The default value is true. If the value is array, it can be ['milestone', 'task']. * @property {boolean|Array.<string>} [scheduleView=true] - Show the all day and time grid in weekly, daily view. The default value is false. If the value is array, it can be ['allday', 'time']. * @property {themeConfig} [theme=themeConfig] - {@link themeConfig} for custom style. * @property {Template} [template={}] - {@link Template} for further informatio * @property {WeekOptions} [week={}] - {@link WeekOptions} for week view * @property {MonthOptions} [month={}] - {@link MonthOptions} for month view * @property {Array.<CalendarProps>} [calendars=[]] - {@link CalendarProps} List that can be used to add new schedule. The default value is []. * @property {boolean} [useCreationPopup=false] - Whether use default creation popup or not. The default value is false. * @property {boolean} [useDetailPopup=false] - Whether use default detail popup or not. The default value is false. * @property {Array.<Timezone>} [timezones] - {@link Timezone} array. * The first Timezone element is primary and can override Calendar#setTimezoneOffset function * The rest timezone elements are shown in left timegrid of weekly/daily view * @property {boolean} [disableDblClick=false] - Disable double click to create a schedule. The default value is false. * @property {boolean} [disableClick=false] - Disable click to create a schedule. The default value is false. * @property {boolean} [isReadOnly=false] - {@link Calendar} is read-only mode and a user can't create and modify any schedule. The default value is false. * @property {boolean} [usageStatistics=true] - Let us know the hostname. If you don't want to send the hostname, please set to false. */ /** * {@link https://nhn.github.io/tui.code-snippet/latest/tui.util.CustomEvents.html CustomEvents} document at {@link https://github.com/nhn/tui.code-snippet tui-code-snippet} * @typedef {class} CustomEvents */ /** * @typedef {object} TimeCreationGuide - Time creation guide instance to present selected time period * @property {HTMLElement} guideElement - Guide element * @property {Object.<string, HTMLElement>} guideElements - Map by key. It can be used in monthly view * @property {function} clearGuideElement - Hide the creation guide * @example * calendar.on('beforeCreateSchedule', function(event) { * var guide = event.guide; * // Use guideEl$'s left, top to locate your schedule creation popup * var guideEl$ = guide.guideElement ? * guide.guideElement : guide.guideElements[Object.keys(guide.guideElements)[0]]; * * // After that call this to hide the creation guide * guide.clearGuideElement(); * }); */ /** * Calendar class * @constructor * @mixes CustomEvents * @param {HTMLElement|string} container - The container element or selector id * @param {Options} options - The calendar {@link Options} object * @example * var calendar = new tui.Calendar(document.getElementById('calendar'), { * defaultView: 'week', * taskView: true, // Can be also ['milestone', 'task'] * scheduleView: true, // Can be also ['allday', 'time'] * template: { * milestone: function(schedule) { * return '<span style="color:red;"><i class="fa fa-flag"></i> ' + schedule.title + '</span>'; * }, * milestoneTitle: function() { * return 'Milestone'; * }, * task: function(schedule) { * return ' #' + schedule.title; * }, * taskTitle: function() { * return '<label><input type="checkbox" />Task</label>'; * }, * allday: function(schedule) { * return schedule.title + ' <i class="fa fa-refresh"></i>'; * }, * alldayTitle: function() { * return 'All Day'; * }, * time: function(schedule) { * return schedule.title + ' <i class="fa fa-refresh"></i>' + schedule.start; * } * }, * month: { * daynames: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], * startDayOfWeek: 0, * narrowWeekend: true * }, * week: { * daynames: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], * startDayOfWeek: 0, * narrowWeekend: true * } * }); */ function Calendar(container, options) { var opt = util.extend({ usageStatistics: true }, options); if (opt.usageStatistics === true && util.sendHostname) { util.sendHostname('calendar', GA_TRACKING_ID); } if (util.isString(container)) { container = document.querySelector(container); } /** * Calendar color map * @type {object} * @private */ this._calendarColor = {}; /** * Current rendered date * @type {TZDate} * @private */ this._renderDate = datetime.start(); /** * start and end date of weekly, monthly * @type {object} * @private */ this._renderRange = { start: null, end: null }; /** * base controller * @type {Base} * @private */ this._controller = _createController(options); this._controller.setCalendars(options.calendars); /** * layout view (layout manager) * @type {Layout} * @private */ this._layout = new Layout(container, this._controller.theme); /** * global drag handler * @type {Drag} * @private */ this._dragHandler = new Drag({distance: 10}, this._layout.container); /** * current rendered view name. ('day', 'week', 'month') * @type {string} * @default 'week' * @private */ this._viewName = opt.defaultView || 'week'; /** * Refresh method. it can be ref different functions for each view modes. * @type {function} * @private */ this._refreshMethod = null; /** * Scroll to now. It can be called for 'week', 'day' view modes. * @type {function} * @private */ this._scrollToNowMethod = null; /** * It's true if Calendar.prototype.scrollToNow() is called. * @type {boolean} * @private */ this._requestScrollToNow = false; /** * Open schedule creation popup * @type {function} * @private */ this._openCreationPopup = null; /** * Hide the more view * @type {function} * @private */ this._hideMoreView = null; /** * Unique id for requestAnimFrame() * @type {number} * @private */ this._requestRender = 0; /** * calendar options * @type {Options} * @private */ this._options = {}; this._initialize(options); } /** * destroy calendar instance. */ Calendar.prototype.destroy = function() { this._dragHandler.destroy(); this._controller.off(); this._layout.clear(); this._layout.destroy(); util.forEach(this._options.template, function(func, name) { if (func) { Handlebars.unregisterHelper(name + '-tmpl'); } }); this._options = this._renderDate = this._controller = this._layout = this._dragHandler = this._viewName = this._refreshMethod = this._scrollToNowMethod = null; }; /** * Initialize calendar * @param {Options} options - calendar options * @private */ Calendar.prototype._initialize = function(options) { var controller = this._controller, viewName = this._viewName, timezones = options.timezones || []; this._options = util.extend({ defaultView: viewName, taskView: true, scheduleView: true, template: util.extend({ allday: null, time: null }, util.pick(options, 'template') || {}), week: util.extend({}, util.pick(options, 'week') || {}), month: util.extend({}, util.pick(options, 'month') || {}), calendars: [], useCreationPopup: false, useDetailPopup: false, timezones: options.timezones || [{ timezoneOffset: 0, displayLabel: '', tooltip: '' }], disableDblClick: false, disableClick: false, isReadOnly: false }, options); this._options.week = util.extend({ startDayOfWeek: 0, workweek: false }, util.pick(this._options, 'week') || {}); this._options.month = util.extend({ startDayOfWeek: 0, workweek: false, scheduleFilter: function(schedule) { return Boolean(schedule.isVisible) && (schedule.category === 'allday' || schedule.category === 'time'); } }, util.pick(options, 'month') || {}); if (this._options.isReadOnly) { this._options.useCreationPopup = false; } this._layout.controller = controller; util.forEach(this._options.template, function(func, name) { if (func) { Handlebars.registerHelper(name + '-tmpl', func); } }); util.forEach(this._options.calendars || [], function(calendar) { this.setCalendarColor(calendar.id, calendar, true); }, this); // set by primary timezone if (timezones.length) { timezone.setOffsetByTimezoneOption(timezones[0].timezoneOffset); } this.changeView(viewName, true); }; /********** * CRUD Methods **********/ /** * Create schedules and render calendar. * @param {Array.<Schedule>} schedules - {@link Schedule} data list * @param {boolean} [silent=false] - no auto render after creation when set true * @example * calendar.createSchedules([ * { * id: '1', * calendarId: '1', * title: 'my schedule', * category: 'time', * dueDateClass: '', * start: '2018-01-18T22:30:00+09:00', * end: '2018-01-19T02:30:00+09:00' * }, * { * id: '2', * calendarId: '1', * title: 'second schedule', * category: 'time', * dueDateClass: '', * start: '2018-01-18T17:30:00+09:00', * end: '2018-01-19T17:31:00+09:00' * } * ]); */ Calendar.prototype.createSchedules = function(schedules, silent) { var calColor = this._calendarColor; util.forEach(schedules, function(obj) { var color = calColor[obj.calendarId]; if (color) { obj.color = color.color; obj.bgColor = color.bgColor; obj.borderColor = color.borderColor; } }); this._controller.createSchedules(schedules, silent); if (!silent) { this.render(); } }; /** * Get a {@link Schedule} object by schedule id and calendar id. * @param {string} scheduleId - ID of schedule * @param {string} calendarId - calendarId of the schedule * @returns {Schedule} schedule object * @example * var schedule = calendar.getSchedule(scheduleId, calendarId); * console.log(schedule.title); */ Calendar.prototype.getSchedule = function(scheduleId, calendarId) { return this._controller.schedules.single(function(model) { return model.id === scheduleId && model.calendarId === calendarId; }); }; /** * Update the schedule * @param {string} scheduleId - ID of a schedule to update * @param {string} calendarId - The calendarId of the schedule to update * @param {Schedule} scheduleData - The {@link Schedule} data to update * @param {boolean} [silent=false] - No auto render after creation when set true * @example * calendar.on('beforeUpdateSchedule', function(event) { * var schedule = event.schedule; * var startTime = event.start; * var endTime = event.end; * calendar.updateSchedule(schedule.id, schedule.calendarId, { * start: startTime, * end: endTime * }); * }); */ Calendar.prototype.updateSchedule = function(scheduleId, calendarId, scheduleData, silent) { var ctrl = this._controller, ownSchedules = ctrl.schedules, schedule = ownSchedules.single(function(model) { return model.id === scheduleId && model.calendarId === calendarId; }); if (schedule) { ctrl.updateSchedule(schedule, scheduleData); if (!silent) { this.render(); } } }; /** * Delete a schedule. * @param {string} scheduleId - ID of schedule to delete * @param {string} calendarId - The CalendarId of the schedule to delete * @param {boolean} [silent=false] - No auto render after creation when set true */ Calendar.prototype.deleteSchedule = function(scheduleId, calendarId, silent) { var ctrl = this._controller, ownSchedules = ctrl.schedules, schedule = ownSchedules.single(function(model) { return model.id === scheduleId && model.calendarId === calendarId; }); if (!schedule) { return; } ctrl.deleteSchedule(schedule); if (!silent) { this.render(); } }; /********** * Private Methods **********/ /** * @param {string|Date} date - The Date to show in calendar * @param {number} [startDayOfWeek=0] - The Start day of week * @param {boolean} [workweek=false] - The only show work week * @returns {array} render range * @private */ Calendar.prototype._getWeekDayRange = function(date, startDayOfWeek, workweek) { var day; var start; var end; var range; startDayOfWeek = (startDayOfWeek || 0); // eslint-disable-line date = util.isDate(date) ? date : new TZDate(date); day = date.getDay(); // calculate default render range first. start = new TZDate(date).addDate(-day + startDayOfWeek); end = new TZDate(start).addDate(6); if (day < startDayOfWeek) { start = new TZDate(start).addDate(-7); end = new TZDate(end).addDate(-7); } if (workweek) { range = datetime.range( datetime.start(start), datetime.end(end), datetime.MILLISECONDS_PER_DAY ); range = util.filter(range, function(weekday) { return !datetime.isWeekend(weekday.getDay()); }); start = range[0]; end = range[range.length - 1]; } start = datetime.start(start); end = datetime.start(end); return [start, end]; }; /** * Toggle schedules' visibility by calendar ID * @param {string} calendarId - The calendar id value * @param {boolean} toHide - Set true to hide schedules * @param {boolean} [render=true] - set true then render after change visible property each models */ Calendar.prototype.toggleSchedules = function(calendarId, toHide, render) { var ownSchedules = this._controller.schedules; render = util.isExisty(render) ? render : true; calendarId = util.isArray(calendarId) ? calendarId : [calendarId]; ownSchedules.each(function(schedule) { if (~util.inArray(schedule.calendarId, calendarId)) { schedule.set('isVisible', !toHide); } }); if (render) { this.render(); } }; /********** * General Methods **********/ /** * Render the calendar. The real rendering occurs after requestAnimationFrame. * If you have to render immediately, use the 'immediately' parameter as true. * @param {boolean} [immediately=false] - Render it immediately * @example * var silent = true; * calendar.clear(); * calendar.createSchedules(schedules, silent); * calendar.render(); * @example * // Render a calendar when resizing a window. * window.addEventListener('resize', function() { * calendar.render(); * }); */ Calendar.prototype.render = function(immediately) { if (this._requestRender) { reqAnimFrame.cancelAnimFrame(this._requestRender); } if (immediately) { this._renderFunc(); } else { this._requestRender = reqAnimFrame.requestAnimFrame(this._renderFunc, this); } }; /** * Render and refresh all layout and process requests. * @private */ Calendar.prototype._renderFunc = function() { if (this._refreshMethod) { this._refreshMethod(); } if (this._layout) { this._layout.render(); } if (this._scrollToNowMethod && this._requestScrollToNow) { this._scrollToNowMethod(); } this._requestScrollToNow = false; this._requestRender = null; }; /** * Delete all schedules and clear view. The real rendering occurs after requestAnimationFrame. * If you have to render immediately, use the 'immediately' parameter as true. * @param {boolean} [immediately=false] - Render it immediately * @example * calendar.clear(); * calendar.createSchedules(schedules, true); * calendar.render(); */ Calendar.prototype.clear = function(immediately) { this._controller.clearSchedules(); this.render(immediately); }; /** * Scroll to current time on today in case of daily, weekly view * @example * function onNewSchedules(schedules) { * calendar.createSchedules(schedules); * if (calendar.getViewName() !== 'month') { * calendar.scrollToNow(); * } * } */ Calendar.prototype.scrollToNow = function() { if (this._scrollToNowMethod) { this._requestScrollToNow = true; // this._scrollToNowMethod() will be called at next frame rendering. } }; /** * Move to today. * @example * function onClickTodayBtn() { * calendar.today(); * } */ Calendar.prototype.today = function() { this._renderDate = datetime.start(); this._setViewName(this._viewName); this.move(); this.render(); }; /** * Move the calendar amount of offset value * @param {number} offset - The offset value. * @private * @example * // move previous week when "week" view. * // move previous month when "month" view. * calendar.move(-1); */ Calendar.prototype.move = function(offset) { var renderDate = dw(datetime.start(this._renderDate)), viewName = this._viewName, view = this._getCurrentView(), recursiveSet = _setOptionRecurseively, startDate, endDate, tempDate, startDayOfWeek, visibleWeeksCount, workweek, isAlways6Week, datetimeOptions; offset = util.isExisty(offset) ? offset : 0; if (viewName === 'month') { startDayOfWeek = util.pick(this._options, 'month', 'startDayOfWeek') || 0; visibleWeeksCount = mmin(util.pick(this._options, 'month', 'visibleWeeksCount') || 0, 6); workweek = util.pick(this._options, 'month', 'workweek') || false; isAlways6Week = util.pick(this._options, 'month', 'isAlways6Week'); if (visibleWeeksCount) { datetimeOptions = { startDayOfWeek: startDayOfWeek, isAlways6Week: false, visibleWeeksCount: visibleWeeksCount, workweek: workweek }; renderDate.addDate(offset * 7 * datetimeOptions.visibleWeeksCount); tempDate = datetime.arr2dCalendar(renderDate.d, datetimeOptions); recursiveSet(view, function(childView, opt) { opt.renderMonth = new TZDate(renderDate.d); }); } else { datetimeOptions = { startDayOfWeek: startDayOfWeek, isAlways6Week: isAlways6Week, workweek: workweek }; renderDate.addMonth(offset); tempDate = datetime.arr2dCalendar(renderDate.d, datetimeOptions); recursiveSet(view, function(childView, opt) { opt.renderMonth = new TZDate(renderDate.d); }); } startDate = tempDate[0][0]; endDate = tempDate[tempDate.length - 1][tempDate[tempDate.length - 1].length - 1]; } else if (viewName === 'week') { renderDate.addDate(offset * 7); startDayOfWeek = util.pick(this._options, 'week', 'startDayOfWeek') || 0; workweek = util.pick(this._options, 'week', 'workweek') || false; tempDate = this._getWeekDayRange(renderDate.d, startDayOfWeek, workweek); startDate = tempDate[0]; endDate = tempDate[1]; recursiveSet(view, function(childView, opt) { opt.renderStartDate = new TZDate(startDate); opt.renderEndDate = new TZDate(endDate); childView.setState({ collapsed: true }); }); } else if (viewName === 'day') { renderDate.addDate(offset); startDate = datetime.start(renderDate.d); endDate = datetime.end(renderDate.d); recursiveSet(view, function(childView, opt) { opt.renderStartDate = new TZDate(startDate); opt.renderEndDate = new TZDate(endDate); childView.setState({ collapsed: true }); }); } this._renderDate = renderDate.d; this._renderRange = { start: startDate, end: endDate }; }; /** * Move to specific date * @param {(Date|string)} date - The date to move * @example * calendar.on('clickDayname', function(event) { * if (calendar.getViewName() === 'week') { * calendar.setDate(new Date(event.date)); * calendar.changeView('day', true); * } * }); */ Calendar.prototype.setDate = function(date) { if (util.isString(date)) { date = datetime.parse(date); } this._renderDate = new TZDate(date); this._setViewName(this._viewName); this.move(0); this.render(); }; /** * Move the calendar forward a day, a week, a month, 2 weeks, 3 weeks. * @example * function moveToNextOrPrevRange(val) { if (val === -1) { calendar.prev(); } else if (val === 1) { calendar.next(); } } */ Calendar.prototype.next = function() { this.move(1); this.render(); }; /** * Move the calendar backward a day, a week, a month, 2 weeks, 3 weeks. * @example * function moveToNextOrPrevRange(val) { if (val === -1) { calendar.prev(); } else if (val === 1) { calendar.next(); } } */ Calendar.prototype.prev = function() { this.move(-1); this.render(); }; /** * Return current rendered view. * @returns {View} current view instance * @private */ Calendar.prototype._getCurrentView = function() { var viewName = this._viewName; if (viewName === 'day') { viewName = 'week'; } return util.pick(this._layout.children.items, viewName); }; /** * Change calendar's schedule color with option * @param {string} calendarId - The calendar ID * @param {CalendarColor} option - The {@link CalendarColor} object * @param {boolean} [silent=false] - No auto render after creation when set true * @example * calendar.setCalendarColor('1', { * color: '#e8e8e8', * bgColor: '#585858', * borderColor: '#a1b56c' * }); * calendar.setCalendarColor('2', { * color: '#282828', * bgColor: '#dc9656', * borderColor: '#a1b56c' * }); * calendar.setCalendarColor('3', { * color: '#a16946', * bgColor: '#ab4642', * borderColor: '#a1b56c' * }); */ Calendar.prototype.setCalendarColor = function(calendarId, option, silent) { var calColor = this._calendarColor, ownSchedules = this._controller.schedules, ownColor = calColor[calendarId]; if (!util.isObject(option)) { config.throwError('Calendar#changeCalendarColor(): color 는 {color: \'\', bgColor: \'\'} 형태여야 합니다.'); } ownColor = calColor[calendarId] = util.extend({ color: '#000', bgColor: '#a1b56c', borderColor: '#a1b56c' }, option); ownSchedules.each(function(model) { if (model.calendarId !== calendarId) { return; } model.color = ownColor.color; model.bgColor = ownColor.bgColor; model.borderColor = ownColor.borderColor; }); if (!silent) { this.render(); } }; /********** * Custom Events **********/ /** * A bridge-based event handler for connecting a click handler to a user click event handler for each view * @fires Calendar#clickSchedule * @param {object} clickScheduleData - The event data of 'clickSchedule' handler * @private */ Calendar.prototype._onClick = function(clickScheduleData) { /** * Fire this event when click a schedule. * @event Calendar#clickSchedule * @type {object} * @property {Schedule} schedule - The {@link Schedule} instance * @property {MouseEvent} event - MouseEvent * @example * calendar.on('clickSchedule', function(event) { * var schedule = event.schedule; * * if (lastClickSchedule) { * calendar.updateSchedule(lastClickSchedule.id, lastClickSchedule.calendarId, { * isFocused: false * }); * } * calendar.updateSchedule(schedule.id, schedule.calendarId, { * isFocused: true * }); * * lastClickSchedule = schedule; * // open detail view * }); */ this.fire('clickSchedule', clickScheduleData); }; /** * A bridge-based event handler for connecting a click handler to a user click event handler for each view * @fires Calendar#clickMore * @param {object} clickMoreSchedule - The event data of 'clickMore' handler * @private */ Calendar.prototype._onClickMore = function(clickMoreSchedule) { /** * Fire this event when click a schedule. * @event Calendar#clickMore * @type {object} * @property {Date} date - The Clicked date * @property {HTMLElement} target - The more element * @example * calendar.on('clickMore', function(event) { * console.log('clickMore', event.date, event.target); * }); */ this.fire('clickMore', clickMoreSchedule); }; /** * dayname click event handler * @fires Calendar#clickDayname * @param {object} clickScheduleData - The event data of 'clickDayname' handler * @private */ Calendar.prototype._onClickDayname = function(clickScheduleData) { /** * Fire this event when click a day name in weekly. * @event Calendar#clickDayname * @type {object} * @property {string} date - The date string by format 'YYYY-MM-DD' * @example * calendar.on('clickDayname', function(event) { * if (calendar.getViewName() === 'week') { * calendar.setDate(new Date(event.date)); * calendar.changeView('day', true); * } * }); */ this.fire('clickDayname', clickScheduleData); }; /** * @fires {Calendar#n('beforeCreateSchedule', function} * @param {object} createScheduleData - select schedule data from allday, time * @private */ Calendar.prototype._onBeforeCreate = function(createScheduleData) { if (this._options.useCreationPopup && !createScheduleData.useCreationPopup) { if (this._showCreationPopup) { this._showCreationPopup(createScheduleData); return; } } /** * Fire this event when select time period in daily, weekly, monthly. * @event Calendar#beforeCreateSchedule * @type {object} * @property {boolean} isAllDay - The allday schedule * @property {Date} start - The selected start time * @property {Date} end - The selected end time * @property {TimeCreationGuide} guide - {@link TimeCreationGuide} instance * @property {string} triggerEventName - The event name like 'click', 'dblclick' * @example * calendar.on('beforeCreateSchedule', function(event) { * var startTime = event.start; * var endTime = event.end; * var isAllDay = event.isAllDay; * var guide = event.guide; * var triggerEventName = event.triggerEventName; * var schedule; * * if (triggerEventName === 'click') { * // open writing simple schedule popup * schedule = {...}; * } else if (triggerEventName === 'dblclick') { * // open writing detail schedule popup * schedule = {...}; * } * * calendar.createSchedules([schedule]); * }); */ this.fire('beforeCreateSchedule', createScheduleData); }; /** * @fires Calendar#beforeUpdateSchedule * @param {object} updateScheduleData - update {@link Schedule} data * @private */ Calendar.prototype._onBeforeUpdate = function(updateScheduleData) { /** * Fire this event when drag a schedule to change time in daily, weekly, monthly. * @event Calendar#beforeUpdateSchedule * @type {object} * @property {Schedule} schedule - The {@link Schedule} instance to update * @property {Date} start - The start time to update * @property {Date} end - The end time to update * @example * calendar.on('beforeUpdateSchedule', function(event) { * var schedule = event.schedule; * var startTime = event.start; * var endTime = event.end; * * calendar.updateSchedule(schedule.id, schedule.calendarId, { * start: startTime, * end: endTime * }); * }); */ this.fire('beforeUpdateSchedule', updateScheduleData); }; /** * @fires Calendar#beforeDeleteSchedule * @param {object} deleteScheduleData - delete schedule data * @private */ Calendar.prototype._onBeforeDelete = function(deleteScheduleData) { /** * Fire this event when delete a schedule. * @event Calendar#beforeDeleteSchedule * @type {object} * @property {Schedule} schedule - The {@link Schedule} instance to delete * @example * calendar.on('beforeDeleteSchedule', function(event) { * var schedule = event.schedule; * alert('The schedule is removed.', schedule); * }); */ this.fire('beforeDeleteSchedule', deleteScheduleData); }; /** * @fires Calendar#afterRenderSchedule * @param {Schedule} scheduleData - The schedule data * @private */ Calendar.prototype._onAfterRenderSchedule = function(scheduleData) { /** * Fire this event by every single schedule after rendering whole calendar. * @event Calendar#afterRenderSchedule * @type {object} * @property {Schedule} schedule - A rendered {@link Schedule} instance * @example * calendar.on('afterRenderSchedule', function(event) { * var schedule = event.schedule; * var element = calendar.getElement(schedule.id, schedule.calendarId); * // use the element * console.log(element); * }); */ this.fire('afterRenderSchedule', scheduleData); }; /** * @fires Calendar#clickTimezonesCollapseBtn * @param {boolean} timezonesCollapsed - timezones collapsed flag * @private */ Calendar.prototype._onClickTimezonesCollapseBtn = function(timezonesCollapsed) { /** * Fire this event by clicking timezones collapse button * @event Calendar#clickTimezonesCollapseBtn * @type {object} * @property {boolean} timezonesCollapsed - The timezones collapes flag * @example * calendar.on('clickTimezonesCollapseBtn', function(timezonesCollapsed) { * console.log(timezonesCollapsed); * }); */ this.fire('clickTimezonesCollapseBtn', timezonesCollapsed); }; /** * Toggle calendar factory class, main view, wallview event connection * @param {boolean} isAttach - attach events if true. * @param {Week|Month} view - Weekly view or Monthly view * @private */ Calendar.prototype._toggleViewSchedule = function(isAttach, view) { var self = this, handler = view.handler, method = isAttach ? 'on' : 'off'; util.forEach(handler.click, function(clickHandler) { clickHandler[method]('clickSchedule', self._onClick, self); }); util.forEach(handler.dayname, function(clickHandler) { clickHandler[method]('clickDayname', self._onClickDayname, self); }); util.forEach(handler.creation, function(creationHandler) { creationHandler[method]('beforeCreateSchedule', self._onBeforeCreate, self); creationHandler[method]('beforeDeleteSchedule', self._onBeforeDelete, self); }); util.forEach(handler.move, function(moveHandler) { moveHandler[method]('beforeUpdateSchedule', self._onBeforeUpdate, self); }); util.forEach(handler.resize, function(resizeHandler) { resizeHandler[method]('beforeUpdateSchedule', self._onBeforeUpdate, self); }); // bypass events from view view[method]('afterRenderSchedule', self._onAfterRenderSchedule, self); view[method]('clickTimezonesCollapseBtn', self._onClickTimezonesCollapseBtn, self); view[method]('clickMore', self._onClickMore, self); }; /** * Change current view with view name('day', 'week', 'month') * @param {string} newViewName - The New view name to render * @param {boolean} force - Force render despite of current view and new view are equal * @example * // daily view * calendar.changeView('day', true); * * // weekly view * calendar.changeView('week', true); * * // monthly view(default 6 weeks view) * calendar.setOptions({month: {visibleWeeksCount: 6}}, true); // or null * calendar.changeView('month', true); * * // 2 weeks monthly view * calendar.setOptions({month: {visibleWeeksCount: 2}}, true); * calendar.changeView('month', true); * * // 3 weeks monthly view * calendar.setOptions({month: {visibleWeeksCount: 3}}, true); * calendar.changeView('month', true); * * // narrow weekend * calendar.setOptions({month: {narrowWeekend: true}}, true); * calendar.setOptions({week: {narrowWeekend: true}}, true); * calendar.changeView(calendar.getViewName(), true); * * // change start day of week(from monday) * calendar.setOptions({week: {startDayOfWeek: 1}}, true); * calendar.setOptions({month: {startDayOfWeek: 1}}, true); * calendar.changeView(calendar.getViewName(), true); * * // work week * calendar.setOptions({week: {workweek: true}}, true); * calendar.setOptions({month: {workweek: true}}, true); * calendar.changeView(calendar.getViewName(), true); */ Calendar.prototype.changeView = function(newViewName, force) { var self = this, layout = this._layout, controller = this._controller, dragHandler = this._dragHandler, options = this._options, viewName = this._viewName, created; if (!force && viewName === newViewName) { return; } this._setViewName(newViewName); // convert day to week if (viewName === 'day') { viewName = 'week'; } if (newViewName === 'day') { newViewName = 'week'; } layout.children.doWhenHas(viewName, function(view) { self._toggleViewSchedule(false, view); }); layout.clear(); if (newViewName === 'month') { created = _createMonthView( controller, layout.container, dragHandler, options ); } else if (newViewName === 'week' || newViewName === 'day') { created = _createWeekView( controller, layout.container, dragHandler, options ); } layout.addChild(created.view); layout.children.doWhenHas(newViewName, function(view) { self._toggleViewSchedule(true, view); }); this._refreshMethod = created.refresh; this._scrollToNowMethod = created.scrollToNow; this._openCreationPopup = created.openCreationPopup; this._showCreationPopup = created.showCreationPopup; this._hideMoreView = created.hideMoreView; this.move(); this.render(); }; /** * @deprecated * Toggle task view('Milestone', 'Task') panel * @param {boolean} enabled - use task view * @example * // There is no milestone, task, so hide those view panel * calendar.toggleTaskView(false); * * // There are some milestone, task, so show those view panel. * calendar.toggleTaskView(true); */ Calendar.prototype.toggleTaskView = function(enabled) { var viewName = this._viewName, options = this._options; options.taskView = enabled; this.changeView(viewName, true); }; /** * @deprecated * Toggle schedule view('AllDay', TimeGrid') panel * @param {boolean} enabled - use task view * @example * // hide those view panel to show only 'Milestone', 'Task' * calendar.toggleScheduleView(false); * * // show those view panel. * calendar.toggleScheduleView(true); */ Calendar.prototype.toggleScheduleView = function(enabled) { var viewName = this._viewName, options = this._options; options.scheduleView = enabled; this.changeView(viewName, true); }; /** * Set current view name * @param {string} viewName - new view name to render * @private */ Calendar.prototype._setViewName = function(viewName) { this._viewName = viewName; }; /** * Get a schedule element by schedule id and calendar id. * @param {string} scheduleId - ID of schedule * @param {string} calendarId - calendarId of schedule * @returns {HTMLElement} schedule element if found or null * @example * var element = calendar.getElement(scheduleId, calendarId); * console.log(element); */ Calendar.prototype.getElement = function(scheduleId, calendarId) { var schedule = this.getSchedule(scheduleId, calendarId); if (schedule) { return document.querySelector('[data-schedule-id="' + scheduleId + '"][data-calendar-id="' + calendarId + '"]'); } return null; }; /** * Set a theme. If some keys are not defined in the preset, will be return. * @param {object} theme - multiple styles map * @returns {Array.<string>} keys - error keys not predefined. * @example * cal.setTheme({ 'month.dayname.height': '31px', 'common.dayname.color': '#333', 'month.dayname.borderBottom': '1px solid #e5e5e5' // Not valid key will be return. * }); */ Calendar.prototype.setTheme = function(theme) { var result = this._controller.setTheme(theme); this.render(true); return result; }; /** * Set options of calendar * @param {Options} options - set {@link Options} * @param {boolean} [silent=false] - no auto render after creation when set true */ Calendar.prototype.setOptions = function(options, silent) { util.forEach(options, function(value, name) { if (util.isObject(value) && !util.isArray(value)) { util.forEach(value, function(innerValue, innerName) { this._options[name][innerName] = innerValue; }, this); } else { this._options[name] = value; } }, this); if (!silent) { this.changeView(this._viewName, true); } }; /** * Get current {@link Options}. * @returns {Options} options */ Calendar.prototype.getOptions = function() { return this._options; }; /** * Current rendered date ({@link TZDate} for further information) * @returns {TZDate} */ Calendar.prototype.getDate = function() { return this._renderDate; }; /** * Start time of rendered date range ({@link TZDate} for further information) * @returns {TZDate} */ Calendar.prototype.getDateRangeStart = function() { return this._renderRange.start; }; /** * End time of rendered date range ({@link TZDate} for further information) * @returns {TZDate} */ Calendar.prototype.getDateRangeEnd = function() { return this._renderRange.end; }; /** * Get current view name('day', 'week', 'month') * @returns {string} view name */ Calendar.prototype.getViewName = function() { return this._viewName; }; /** * Set calendar list * @param {Array.<Object>} calendars - calendar list */ Calendar.prototype.setCalendars = function(calendars) { this._controller.setCalendars(calendars); this.render(); }; /** * Open schedule creation popup * @param {Schedule} schedule - The preset {@link Schedule} data */ Calendar.prototype.openCreationPopup = function(schedule) { if (this._openCreationPopup) { this._openCreationPopup(schedule); } }; /** * Hide the more view */ Calendar.prototype.hideMoreView = function() { if (this._hideMoreView) { this._hideMoreView(); } }; /** * Set timezone offset * @param {number} offset - The offset (min) * @static * @deprecated * @example * var timezoneName = moment.tz.guess(); * tui.Calendar.setTimezoneOffset(moment.tz.zone(timezoneName).utcOffset(moment())); */ Calendar.setTimezoneOffset = function(offset) { timezone.setOffset(offset); }; /** * Set a callback function to get timezone offset by timestamp * @param {function} callback - The callback function * @static * @deprecated * @example * var timezoneName = moment.tz.guess(); * tui.Calendar.setTimezoneOffsetCallback(function(timestamp) { * return moment.tz.zone(timezoneName).utcOffset(timestamp)); * }); */ Calendar.setTimezoneOffsetCallback = function(callback) { timezone.setOffsetCallback(callback); }; /** * Create controller instance * @returns {Base} controller instance * @param {Options} options - calendar options * @private */ function _createController(options) { return controllerFactory(options); } /** * Create week view instance by dependent module instances * @param {Base} controller - controller * @param {HTMLElement} container - container element * @param {Drag} dragHandler - global drag handler * @param {object} options - options for week view * @returns {Week} week view instance * @private */ function _createWeekView(controller, container, dragHandler, options) { return weekViewFactory( controller, container, dragHandler, options ); } /** * Create week view instance by dependent module instances * @param {Base} controller - controller * @param {HTMLElement} container - container element * @param {Drag} dragHandler - global drag handler * @param {object} options - options for week view * @returns {Month} month view instance * @private */ function _createMonthView(controller, container, dragHandler, options) { return monthViewFactory( controller, container, dragHandler, options ); } /** * Set child view's options recursively * @param {View} view - parent view * @param {function} func - option manipulate function * @private */ function _setOptionRecurseively(view, func) { view.recursive(function(childView) { var opt = childView.options; if (!opt) { return; } func(childView, opt); }); } util.CustomEvents.mixin(Calendar); module.exports = Calendar; /***/ }), /***/ "./src/js/factory/controller.js": /*!**************************************!*\ !*** ./src/js/factory/controller.js ***! \**************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Controller factory module. * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var Base = __webpack_require__(/*! ../controller/base */ "./src/js/controller/base.js"), Core = __webpack_require__(/*! ../controller/viewMixin/core */ "./src/js/controller/viewMixin/core.js"), Week = __webpack_require__(/*! ../controller/viewMixin/week */ "./src/js/controller/viewMixin/week.js"), Month = __webpack_require__(/*! ../controller/viewMixin/month */ "./src/js/controller/viewMixin/month.js"); /** * Mixin object. create object property to target and mix to that * @param {object} from - source object * @param {object} to - target object * @param {string} propertyName - property name */ function mixin(from, to, propertyName) { var obj = to[propertyName] = {}; util.forEach(from, function(method, methodName) { obj[methodName] = util.bind(method, to); }); } /** * @param {object} options - options for base controller * @param {function} [options.groupFunc] - function for group each models {@see Collection#groupBy} * @returns {Base} The controller instance. */ module.exports = function(options) { var controller = new Base(options); mixin(Core, controller, 'Core'); mixin(Week, controller, 'Week'); mixin(Month, controller, 'Month'); // for Theme controller.Core.theme = controller.theme; controller.Week.theme = controller.theme; controller.Month.theme = controller.theme; return controller; }; /***/ }), /***/ "./src/js/factory/monthView.js": /*!*************************************!*\ !*** ./src/js/factory/monthView.js ***! \*************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Month view factory module * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../config */ "./src/js/config.js"), array = __webpack_require__(/*! ../common/array */ "./src/js/common/array.js"), datetime = __webpack_require__(/*! ../common/datetime */ "./src/js/common/datetime.js"), domutil = __webpack_require__(/*! ../common/domutil */ "./src/js/common/domutil.js"), common = __webpack_require__(/*! ../common/common */ "./src/js/common/common.js"), Month = __webpack_require__(/*! ../view/month/month */ "./src/js/view/month/month.js"), MonthClick = __webpack_require__(/*! ../handler/month/click */ "./src/js/handler/month/click.js"), MonthCreation = __webpack_require__(/*! ../handler/month/creation */ "./src/js/handler/month/creation.js"), MonthResize = __webpack_require__(/*! ../handler/month/resize */ "./src/js/handler/month/resize.js"), MonthMove = __webpack_require__(/*! ../handler/month/move */ "./src/js/handler/month/move.js"), More = __webpack_require__(/*! ../view/month/more */ "./src/js/view/month/more.js"), ScheduleCreationPopup = __webpack_require__(/*! ../view/popup/scheduleCreationPopup */ "./src/js/view/popup/scheduleCreationPopup.js"), ScheduleDetailPopup = __webpack_require__(/*! ../view/popup/scheduleDetailPopup */ "./src/js/view/popup/scheduleDetailPopup.js"), Schedule = __webpack_require__(/*! ../model/schedule */ "./src/js/model/schedule.js"); /** * Get the view model for more layer * @param {TZDate} date - date has more schedules * @param {HTMLElement} target - target element * @param {Collection} schedules - schedule collection * @param {string[]} daynames - daynames to use upside of month more view * @returns {object} view model */ function getViewModelForMoreLayer(date, target, schedules, daynames) { schedules.each(function(schedule) { var model = schedule.model; schedule.hasMultiDates = !datetime.isSameDate(model.start, model.end); }); return { target: target, date: datetime.format(date, 'YYYY.MM.DD'), dayname: daynames[date.getDay()], schedules: schedules.sort(array.compare.schedule.asc) }; } /** * @param {Base} baseController - controller instance * @param {HTMLElement} layoutContainer - container element for month view * @param {Drag} dragHandler - drag handler instance * @param {object} options - options * @returns {object} view instance and refresh method */ function createMonthView(baseController, layoutContainer, dragHandler, options) { var monthViewContainer, monthView, moreView, createView; var clickHandler, creationHandler, resizeHandler, moveHandler, clearSchedulesHandler, onUpdateSchedule; var onShowCreationPopup, onSaveNewSchedule, onShowEditPopup; var detailView, onShowDetailPopup, onDeleteSchedule, onEditSchedule; monthViewContainer = domutil.appendHTMLElement( 'div', layoutContainer, config.classname('month')); monthView = new Month(options, monthViewContainer, baseController.Month); moreView = new More(options.month, layoutContainer, baseController.theme); // handlers clickHandler = new MonthClick(dragHandler, monthView, baseController); if (!options.isReadOnly) { creationHandler = new MonthCreation(dragHandler, monthView, baseController, options); resizeHandler = new MonthResize(dragHandler, monthView, baseController); moveHandler = new MonthMove(dragHandler, monthView, baseController); } clearSchedulesHandler = function() { if (moreView) { moreView.hide(); } }; onUpdateSchedule = function() { if (moreView) { moreView.refresh(); } }; // binding +n click schedule clickHandler.on('clickMore', function(clickMoreSchedule) { var date = clickMoreSchedule.date, target = clickMoreSchedule.target, schedules = util.pick(baseController.findByDateRange( datetime.start(date), datetime.end(date) ), clickMoreSchedule.ymd); schedules.items = util.filter(schedules.items, function(item) { return options.month.scheduleFilter(item.model); }); if (schedules && schedules.length) { moreView.render(getViewModelForMoreLayer(date, target, schedules, monthView.options.daynames)); schedules.each(function(scheduleViewModel) { if (scheduleViewModel) { /** * @event More#afterRenderSchedule */ monthView.fire('afterRenderSchedule', {schedule: scheduleViewModel.model}); } }); monthView.fire('clickMore', { date: clickMoreSchedule.date, target: moreView.getMoreViewElement() }); } }); // binding popup for schedules creation if (options.useCreationPopup) { createView = new ScheduleCreationPopup(layoutContainer, baseController.calendars); onSaveNewSchedule = function(scheduleData) { creationHandler.fire('beforeCreateSchedule', util.extend(scheduleData, { useCreationPopup: true })); }; createView.on('beforeCreateSchedule', onSaveNewSchedule); } // binding popup for schedule detail if (options.useDetailPopup) { detailView = new ScheduleDetailPopup(layoutContainer, baseController.calendars); onShowDetailPopup = function(eventData) { var scheduleId = eventData.schedule.calendarId; eventData.calendar = common.find(baseController.calendars, function(calendar) { return calendar.id === scheduleId; }); if (options.isReadOnly) { eventData.schedule = util.extend({}, eventData.schedule, {isReadOnly: true}); } detailView.render(eventData); }; onDeleteSchedule = function(eventData) { if (creationHandler) { creationHandler.fire('beforeDeleteSchedule', eventData); } }; onEditSchedule = function(eventData) { moveHandler.fire('beforeUpdateSchedule', eventData); }; clickHandler.on('clickSchedule', onShowDetailPopup); detailView.on('beforeDeleteSchedule', onDeleteSchedule); if (options.useCreationPopup) { onShowEditPopup = function(eventData) { createView.setCalendars(baseController.calendars); createView.render(eventData); }; createView.on('beforeUpdateSchedule', onEditSchedule); detailView.on('beforeUpdateSchedule', onShowEditPopup); } else { detailView.on('beforeUpdateSchedule', onEditSchedule); } } // binding clear schedules baseController.on('clearSchedules', clearSchedulesHandler); // bind update schedule event baseController.on('updateSchedule', onUpdateSchedule); if (moveHandler) { moveHandler.on('monthMoveStart_from_morelayer', function() { moreView.hide(); }); } monthView.handler = { click: { 'default': clickHandler } }; if (!options.isReadOnly) { monthView.handler = util.extend(monthView.handler, { creation: { 'default': creationHandler }, resize: { 'default': resizeHandler }, move: { 'default': moveHandler } }); } monthView._beforeDestroy = function() { moreView.destroy(); baseController.off('clearSchedules', clearSchedulesHandler); baseController.off('updateSchedule', onUpdateSchedule); util.forEach(monthView.handler, function(type) { util.forEach(type, function(handler) { handler.off(); handler.destroy(); }); }); if (options.useCreationPopup && options.useDetailPopup) { createView.off('beforeUpdateSchedule', onUpdateSchedule); } if (options.useCreationPopup) { if (creationHandler) { creationHandler.off('beforeCreateSchedule', onShowCreationPopup); } createView.off('saveSchedule', onSaveNewSchedule); createView.destroy(); } if (options.useDetailPopup) { clickHandler.off('clickSchedule', onShowDetailPopup); detailView.off('beforeUpdateSchedule', onUpdateSchedule); detailView.off('beforeDeleteSchedule', onDeleteSchedule); detailView.destroy(); } }; // add controller monthView.controller = baseController.Month; return { view: monthView, refresh: function() { monthView.vLayout.refresh(); }, openCreationPopup: function(schedule) { if (createView && creationHandler) { creationHandler.invokeCreationClick(Schedule.create(schedule)); } }, showCreationPopup: function(eventData) { if (createView) { createView.setCalendars(baseController.calendars); createView.render(eventData); } }, hideMoreView: function() { if (moreView) { moreView.hide(); } } }; } module.exports = createMonthView; /***/ }), /***/ "./src/js/factory/weekView.js": /*!************************************!*\ !*** ./src/js/factory/weekView.js ***! \************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Factory module for WeekView * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../config */ "./src/js/config.js"); var domutil = __webpack_require__(/*! ../common/domutil */ "./src/js/common/domutil.js"); var common = __webpack_require__(/*! ../common/common */ "./src/js/common/common.js"); var VLayout = __webpack_require__(/*! ../common/vlayout */ "./src/js/common/vlayout.js"); var reqAnimFrame = __webpack_require__(/*! ../common/reqAnimFrame */ "./src/js/common/reqAnimFrame.js"); var Schedule = __webpack_require__(/*! ../model/schedule */ "./src/js/model/schedule.js"); // Parent views var Week = __webpack_require__(/*! ../view/week/week */ "./src/js/view/week/week.js"); // Sub views var DayName = __webpack_require__(/*! ../view/week/dayname */ "./src/js/view/week/dayname.js"); var DayGrid = __webpack_require__(/*! ../view/week/dayGrid */ "./src/js/view/week/dayGrid.js"); var TimeGrid = __webpack_require__(/*! ../view/week/timeGrid */ "./src/js/view/week/timeGrid.js"); var ScheduleCreationPopup = __webpack_require__(/*! ../view/popup/scheduleCreationPopup */ "./src/js/view/popup/scheduleCreationPopup.js"); var ScheduleDetailPopup = __webpack_require__(/*! ../view/popup/scheduleDetailPopup */ "./src/js/view/popup/scheduleDetailPopup.js"); // Handlers var DayNameClick = __webpack_require__(/*! ../handler/time/clickDayname */ "./src/js/handler/time/clickDayname.js"); var DayGridClick = __webpack_require__(/*! ../handler/daygrid/click */ "./src/js/handler/daygrid/click.js"); var DayGridCreation = __webpack_require__(/*! ../handler/daygrid/creation */ "./src/js/handler/daygrid/creation.js"); var DayGridMove = __webpack_require__(/*! ../handler/daygrid/move */ "./src/js/handler/daygrid/move.js"); var DayGridResize = __webpack_require__(/*! ../handler/daygrid/resize */ "./src/js/handler/daygrid/resize.js"); var TimeClick = __webpack_require__(/*! ../handler/time/click */ "./src/js/handler/time/click.js"); var TimeCreation = __webpack_require__(/*! ../handler/time/creation */ "./src/js/handler/time/creation.js"); var TimeMove = __webpack_require__(/*! ../handler/time/move */ "./src/js/handler/time/move.js"); var TimeResize = __webpack_require__(/*! ../handler/time/resize */ "./src/js/handler/time/resize.js"); var DAYGRID_HANDLDERS = { 'click': DayGridClick, 'creation': DayGridCreation, 'move': DayGridMove, 'resize': DayGridResize }; var TIMEGRID_HANDLERS = { 'click': TimeClick, 'creation': TimeCreation, 'move': TimeMove, 'resize': TimeResize }; var DEFAULT_PANELS = [ { name: 'milestone', type: 'daygrid', minHeight: 20, maxHeight: 80, showExpandableButton: true, maxExpandableHeight: 210, handlers: ['click'], show: true }, { name: 'task', type: 'daygrid', minHeight: 40, maxHeight: 120, showExpandableButton: true, maxExpandableHeight: 210, handlers: ['click', 'move'], show: true }, { name: 'allday', type: 'daygrid', minHeight: 30, maxHeight: 80, showExpandableButton: true, maxExpandableHeight: 210, handlers: ['click', 'creation', 'move', 'resize'], show: true }, { name: 'time', type: 'timegrid', autoHeight: true, handlers: ['click', 'creation', 'move', 'resize'], show: true } ]; /* eslint-disable complexity*/ module.exports = function(baseController, layoutContainer, dragHandler, options) { var panels = [], vpanels = []; var weekView, dayNameContainer, dayNameView, vLayoutContainer, vLayout; var createView, onSaveNewSchedule, onSetCalendars, lastVPanel; var detailView, onShowDetailPopup, onDeleteSchedule, onShowEditPopup, onEditSchedule; var taskView = options.taskView; var scheduleView = options.scheduleView; var viewVisibilities = { 'milestone': util.isArray(taskView) ? util.inArray('milestone', taskView) >= 0 : taskView, 'task': util.isArray(taskView) ? util.inArray('task', taskView) >= 0 : taskView, 'allday': util.isArray(scheduleView) ? util.inArray('allday', scheduleView) >= 0 : scheduleView, 'time': util.isArray(scheduleView) ? util.inArray('time', scheduleView) >= 0 : scheduleView }; // Make panels by view sequence and visibilities util.forEach(DEFAULT_PANELS, function(panel) { var name = panel.name; panel = util.extend({}, panel); panels.push(panel); // Change visibilities panel.show = viewVisibilities[name]; if (panel.show) { if (vpanels.length) { vpanels.push({ isSplitter: true }); } vpanels.push(util.extend({}, panel)); } }); if (vpanels.length) { lastVPanel = vpanels[vpanels.length - 1]; lastVPanel.autoHeight = true; lastVPanel.maxHeight = null; lastVPanel.showExpandableButton = false; util.forEach(panels, function(panel) { if (panel.name === lastVPanel.name) { panel.showExpandableButton = false; return false; } return true; }); } util.extend(options.week, {panels: panels}); weekView = new Week(null, options.week, layoutContainer, panels); weekView.handler = { click: {}, dayname: {}, creation: {}, move: {}, resize: {} }; dayNameContainer = domutil.appendHTMLElement('div', weekView.container, config.classname('dayname-layout')); /********** * Day name (top row(Mon, Tue, Wed...)) **********/ dayNameView = new DayName(options, dayNameContainer, baseController.theme); weekView.handler.dayname.date = new DayNameClick(dragHandler, dayNameView, baseController); weekView.addChild(dayNameView); /********** * Initialize vertical layout module **********/ vLayoutContainer = domutil.appendHTMLElement('div', weekView.container, config.classname('vlayout-area')); vLayoutContainer.style.height = (domutil.getSize(weekView.container)[1] - dayNameView.container.offsetHeight) + 'px'; vLayout = new VLayout({ panels: vpanels, panelHeights: options.week.panelHeights || [] }, vLayoutContainer, baseController.theme); weekView.vLayout = vLayout; util.forEach(panels, function(panel) { var name = panel.name; var handlers = panel.handlers; var view; if (!panel.show) { return; } if (panel.type === 'daygrid') { /********** * Schedule panel by Grid **********/ view = new DayGrid(name, options, vLayout.getPanelByName(panel.name).container, baseController.theme); view.on('afterRender', function(viewModel) { vLayout.getPanelByName(name).setHeight(null, viewModel.height); }); weekView.addChild(view); util.forEach(handlers, function(type) { if (!options.isReadOnly || type === 'click') { weekView.handler[type][name] = new DAYGRID_HANDLDERS[type](dragHandler, view, baseController, options); view.addHandler(type, weekView.handler[type][name], vLayout.getPanelByName(name)); } }); } else if (panel.type === 'timegrid') { /********** * Schedule panel by TimeGrid **********/ view = new TimeGrid(name, options, vLayout.getPanelByName(name).container); weekView.addChild(view); util.forEach(handlers, function(type) { if (!options.isReadOnly || type === 'click') { weekView.handler[type][name] = new TIMEGRID_HANDLERS[type](dragHandler, view, baseController, options); } }); view.on('clickTimezonesCollapsedBtn', function() { var timezonesCollapsed = !weekView.state.timezonesCollapsed; weekView.setState({ timezonesCollapsed: timezonesCollapsed }); reqAnimFrame.requestAnimFrame(function() { if (!weekView.invoke('clickTimezonesCollapseBtn', timezonesCollapsed)) { weekView.render(); } }); }); } }); vLayout.on('resize', function() { reqAnimFrame.requestAnimFrame(function() { weekView.render(); }); }); // binding create schedules event if (options.useCreationPopup) { createView = new ScheduleCreationPopup(layoutContainer, baseController.calendars); onSaveNewSchedule = function(scheduleData) { util.extend(scheduleData, { useCreationPopup: true }); if (scheduleData.isAllDay) { weekView.handler.creation.allday.fire('beforeCreateSchedule', scheduleData); } else { weekView.handler.creation.time.fire('beforeCreateSchedule', scheduleData); } }; createView.on('beforeCreateSchedule', onSaveNewSchedule); } onSetCalendars = function(calendars) { if (createView) { createView.setCalendars(calendars); } }; baseController.on('setCalendars', onSetCalendars); // binding popup for schedule detail if (options.useDetailPopup) { detailView = new ScheduleDetailPopup(layoutContainer, baseController.calendars); onShowDetailPopup = function(eventData) { var scheduleId = eventData.schedule.calendarId; eventData.calendar = common.find(baseController.calendars, function(calendar) { return calendar.id === scheduleId; }); if (options.isReadOnly) { eventData.schedule = util.extend({}, eventData.schedule, {isReadOnly: true}); } detailView.render(eventData); }; onDeleteSchedule = function(eventData) { if (eventData.isAllDay) { weekView.handler.creation.allday.fire('beforeDeleteSchedule', eventData); } else { weekView.handler.creation.time.fire('beforeDeleteSchedule', eventData); } }; onEditSchedule = function(eventData) { if (eventData.isAllDay) { weekView.handler.move.allday.fire('beforeUpdateSchedule', eventData); } else { weekView.handler.move.time.fire('beforeUpdateSchedule', eventData); } }; util.forEach(weekView.handler.click, function(panel) { panel.on('clickSchedule', onShowDetailPopup); }); if (options.useCreationPopup) { onShowEditPopup = function(eventData) { var calendars = baseController.calendars; eventData.isEditMode = true; createView.setCalendars(calendars); createView.render(eventData); }; createView.on('beforeUpdateSchedule', onEditSchedule); detailView.on('beforeUpdateSchedule', onShowEditPopup); } else { detailView.on('beforeUpdateSchedule', onEditSchedule); } detailView.on('beforeDeleteSchedule', onDeleteSchedule); } weekView.on('afterRender', function() { vLayout.refresh(); }); // add controller weekView.controller = baseController.Week; // add destroy weekView._beforeDestroy = function() { util.forEach(weekView.handler, function(type) { util.forEach(type, function(handler) { handler.off(); handler.destroy(); }); }); if (options.useCreationPopup) { createView.off('beforeCreateSchedule', onSaveNewSchedule); createView.destroy(); } if (options.useDetailPopup) { detailView.off('beforeDeleteSchedule', onDeleteSchedule); detailView.destroy(); } weekView.off(); }; return { view: weekView, refresh: function() { var weekViewHeight = weekView.getViewBound().height, daynameViewHeight = domutil.getBCRect( dayNameView.container ).height; vLayout.container.style.height = weekViewHeight - daynameViewHeight + 'px'; vLayout.refresh(); }, scrollToNow: function() { weekView.children.each(function(childView) { if (childView.scrollToNow) { childView.scrollToNow(); } }); }, openCreationPopup: function(schedule) { if (createView) { if (schedule.isAllDay) { weekView.handler.creation.allday.invokeCreationClick(Schedule.create(schedule)); } else { weekView.handler.creation.time.invokeCreationClick(Schedule.create(schedule)); } } }, showCreationPopup: function(eventData) { if (createView) { createView.setCalendars(baseController.calendars); createView.render(eventData); } } }; }; /***/ }), /***/ "./src/js/handler/daygrid/click.js": /*!*****************************************!*\ !*** ./src/js/handler/daygrid/click.js ***! \*****************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Click handle module for daygrid schedules * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"); var domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); var DayGridMove = __webpack_require__(/*! ./move */ "./src/js/handler/daygrid/move.js"); /** * @constructor * @implements {Handler} * @mixes CustomEvents * @param {Drag} [dragHandler] - Drag handler instance. * @param {DayGrid} [view] - daygrid view instance. * @param {Base} [controller] - Base controller instance. */ function DayGridClick(dragHandler, view, controller) { /** * @type {Drag} */ this.dragHandler = dragHandler; /** * @type {DayGrid} */ this.view = view; /** * @type {Base} */ this.controller = controller; dragHandler.on({ 'click': this._onClick }, this); } /** * Destroy handler module */ DayGridClick.prototype.destroy = function() { this.dragHandler.off(this); this.view = this.controller = this.dragHandler = null; }; /** * Check target element is expected condition for activate this plugins. * @param {HTMLElement} target - The element to check * @returns {string} - model id */ DayGridClick.prototype.checkExpectCondition = DayGridMove.prototype.checkExpectedCondition; /** * Click event handler * @param {object} clickEvent - click event data * @emits DayGridClick#clickSchedule * @emits DayGridClick#collapse * @emits DayGridClick#expand */ DayGridClick.prototype._onClick = function(clickEvent) { var self = this, target = clickEvent.target, dayGridScheduleView = this.checkExpectCondition(target), scheduleCollection = this.controller.schedules, collapseBtnElement = domutil.closest( target, config.classname('.weekday-collapse-btn') ), expandBtnElement = domutil.closest( target, config.classname('.weekday-exceed-in-week') ), containsTarget = this.view.container.contains(target); var blockElement, scheduleElement; if (!containsTarget) { return; } if (collapseBtnElement) { /** * click collpase btn event * @events DayGridClick#collapse */ self.fire('collapse'); return; } if (expandBtnElement) { this.view.setState({ clickedExpandBtnIndex: parseInt(domutil.getData(expandBtnElement, 'index'), 10) }); /** * click expand btn event * @events DayGridClick#expand */ self.fire('expand'); return; } if (!dayGridScheduleView) { return; } scheduleElement = domutil.closest(target, config.classname('.weekday-schedule')); if (scheduleElement) { blockElement = domutil.closest(target, config.classname('.weekday-schedule-block')); scheduleCollection.doWhenHas(domutil.getData(blockElement, 'id'), function(schedule) { /** * @events DayGridClick#clickSchedule * @type {object} * @property {Schedule} schedule - schedule instance * @property {MouseEvent} event - MouseEvent object */ self.fire('clickSchedule', { schedule: schedule, event: clickEvent.originEvent }); }); } }; util.CustomEvents.mixin(DayGridClick); module.exports = DayGridClick; /***/ }), /***/ "./src/js/handler/daygrid/core.js": /*!****************************************!*\ !*** ./src/js/handler/daygrid/core.js ***! \****************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* eslint no-shadow: 0 */ /** * @fileoverview Base mixin object for handler/daygrid * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); var domevent = __webpack_require__(/*! ../../common/domevent */ "./src/js/common/domevent.js"); var common = __webpack_require__(/*! ../../common/common */ "./src/js/common/common.js"); var datetime = __webpack_require__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); var mmax = Math.max, mmin = Math.min; /** * @mixin dayGridCore */ var dayGridCore = { /** * @param {view} view - view instance. * @param {MouseEvent} mouseEvent - mouse schedule object. * @returns {function|boolean} function that return schedule data by mouse events. */ _retriveScheduleData: function(view, mouseEvent) { var weekdayView = view.children.single(), container, datesInRange, containerWidth, mousePos, dragStartXIndex, grids, range; if (!weekdayView) { return false; } container = weekdayView.container; range = weekdayView.getRenderDateRange(); datesInRange = range.length; grids = weekdayView.getRenderDateGrids(); containerWidth = domutil.getSize(container)[0]; mousePos = domevent.getMousePosition(mouseEvent, container); dragStartXIndex = getX(grids, common.ratio(containerWidth, 100, mousePos[0])); /** * @param {MouseEvent} mouseEvent - mouse schedule in drag actions. * @returns {object} schedule data. */ return function(mouseEvent) { var pos = domevent.getMousePosition(mouseEvent, container), mouseX = pos[0], xIndex = getX(grids, common.ratio(containerWidth, 100, mouseX)); // apply limitation of creation schedule X index. xIndex = mmax(xIndex, 0); xIndex = mmin(xIndex, datesInRange - 1); return { relatedView: view, dragStartXIndex: dragStartXIndex, datesInRange: datesInRange, xIndex: xIndex, triggerEvent: mouseEvent.type, grids: grids, range: range }; }; }, /** * @param {view} view - view instance. * @param {TZDate} startDate - start date * @returns {function|boolean} function that return schedule data by mouse events. */ _retriveScheduleDataFromDate: function(view, startDate) { var weekdayView = view.children.single(), datesInRange, dragStartXIndex = 0, grids, range; if (!weekdayView) { return false; } range = weekdayView.getRenderDateRange(); datesInRange = range.length; grids = weekdayView.getRenderDateGrids(); util.forEach(range, function(date, index) { if (datetime.isSameDate(date, startDate)) { dragStartXIndex = index; } }); /** * @param {TZDate} targetDate - target date * @returns {object} schedule data. */ return function(targetDate) { var xIndex = 0; util.forEach(range, function(date, index) { if (datetime.isSameDate(date, targetDate)) { xIndex = index; } }); // apply limitation of creation schedule X index. xIndex = mmax(xIndex, 0); xIndex = mmin(xIndex, datesInRange - 1); return { relatedView: view, dragStartXIndex: dragStartXIndex, datesInRange: datesInRange, xIndex: xIndex, triggerEvent: 'manual', grids: grids, range: range }; }; } }; /** * Get the left index * @param {Array} grids - grid size information * @param {number} left - left position(percent) * @returns {number} grid left index */ function getX(grids, left) { var i = 0; var length = grids.length; var grid; if (left < 0) { left = 0; } for (; i < length; i += 1) { grid = grids[i]; if (grid.left <= left && left <= (grid.left + grid.width)) { return i; } } return i; } module.exports = dayGridCore; /***/ }), /***/ "./src/js/handler/daygrid/creation.js": /*!********************************************!*\ !*** ./src/js/handler/daygrid/creation.js ***! \********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Handler module for WeekdayInWeek view's creation actions. * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"); var datetime = __webpack_require__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); var common = __webpack_require__(/*! ../../common/common */ "./src/js/common/common.js"); var domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); var domevent = __webpack_require__(/*! ../../common/domevent */ "./src/js/common/domevent.js"); var dayGridCore = __webpack_require__(/*! ./core */ "./src/js/handler/daygrid/core.js"); var DayGridCreationGuide = __webpack_require__(/*! ./creationGuide */ "./src/js/handler/daygrid/creationGuide.js"); var TZDate = __webpack_require__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date; var CLICK_DELAY = 300; /** * @constructor * @implements {Handler} * @mixes dayGridCore * @mixes CutomEvents * @param {Drag} [dragHandler] - Drag handler instance. * @param {DayGrid} [view] - DayGrid view instance. * @param {Base} [controller] - Base controller instance. * @param {Options} [options] - calendar Options */ function DayGridCreation(dragHandler, view, controller, options) { /** * Drag handler instance. * @type {Drag} */ this.dragHandler = dragHandler; /** * view instance. * @type {DayGrid} */ this.view = view; /** * Base controller instance. * @type {Base} */ this.controller = controller; /** * @type {function} */ this.getScheduleDataFunc = null; /** * @type {DayGridCreationGuide} */ this.guide = new DayGridCreationGuide(this); /** * @type {boolean} */ this._requestOnClick = false; /** * @type {boolean} */ this._disableDblClick = options.disableDblClick; /** * @type {boolean} */ this._disableClick = options.disableClick; dragHandler.on('dragStart', this._onDragStart, this); dragHandler.on('click', this._onClick, this); if (this._disableDblClick) { CLICK_DELAY = 0; } else { domevent.on(view.container, 'dblclick', this._onDblClick, this); } } /** * Destroy method */ DayGridCreation.prototype.destroy = function() { this.guide.destroy(); this.dragHandler.off(this); if (this.view && this.view.container) { domevent.off(this.view.container, 'dblclick', this._onDblClick, this); } this.dragHandler = this.view = this.controller = this.getScheduleDataFunc = null; }; /** * Check dragstart target is expected conditions for this handler. * @param {HTMLElement} target - dragstart event handler's target element. * @returns {boolean|WeekdayInWeek} return WeekdayInWeek view instance when satiate condition. */ DayGridCreation.prototype.checkExpectedCondition = function(target) { var cssClass = domutil.getClass(target).trim(); var excludeTarget = true; var matches, schedulesElement; if (domutil.closest(target, config.classname('.weekday-exceed-in-week')) || domutil.closest(target, config.classname('.weekday-collapse-btn')) ) { return false; } if (domutil.closest(target, config.classname('.weekday-schedule-block'), excludeTarget)) { return false; } schedulesElement = domutil.closest(target, config.classname('.weekday-schedules')); if (!schedulesElement && cssClass !== config.classname('weekday-schedules')) { return false; } target = schedulesElement ? schedulesElement.parentNode : target.parentNode; cssClass = domutil.getClass(target); matches = cssClass.match(config.daygrid.getViewIDRegExp); if (!matches || matches.length < 2) { return false; } return util.pick(this.view.children.items, matches[1]); }; /** * Request schedule model creation to controller by custom schedules. * @fires {DayGridCreation#beforeCreateSchedule} * @param {object} scheduleData - schedule data from DayGridCreation module. */ DayGridCreation.prototype._createSchedule = function(scheduleData) { var dateRange = scheduleData.range, startXIndex = scheduleData.dragStartXIndex, xIndex = scheduleData.xIndex, start, end; // when inverse start, end then change it. if (xIndex < startXIndex) { startXIndex = xIndex + startXIndex; xIndex = startXIndex - xIndex; startXIndex = startXIndex - xIndex; } start = new TZDate(dateRange[startXIndex]); end = datetime.end(dateRange[xIndex]); /** * @event {DayGridCreation#beforeCreateSchedule} * @type {object} * @property {string} category - schedule category * @property {boolean} isAllDay - whether schedule is fired in view area? * @property {Date} start - select start time * @property {Date} end - select end time * @property {DayGridCreationGuide} guide - DayGridCreationGuide instance * @property {string} triggerEventName - event name */ this.fire('beforeCreateSchedule', { category: this.view.options.viewName, isAllDay: true, start: start, end: end, guide: this.guide, triggerEventName: scheduleData.triggerEvent }); }; /** * DragStart event handler method. * @emits DayGridCreation#dragstart * @param {object} dragStartEventData - Drag#dragStart event handler schedule data. */ DayGridCreation.prototype._onDragStart = function(dragStartEventData) { var target = dragStartEventData.target, result = this.checkExpectedCondition(target), getScheduleDataFunc, scheduleData; if (!result) { return; } this.dragHandler.on({ drag: this._onDrag, dragEnd: this._onDragEnd }, this); getScheduleDataFunc = this._retriveScheduleData(this.view, dragStartEventData.originEvent); this.getScheduleDataFunc = getScheduleDataFunc; scheduleData = getScheduleDataFunc(dragStartEventData.originEvent); /** * @event DayGridCreation#dragstart * @type {object} * @property {DayGridView} relatedView - view instance. * @property {number} datesInRange - date count of this view. * @property {number} dragStartXIndex - index number of dragstart grid index. * @property {number} xIndex - index number of mouse positions. */ this.fire('dragstart', scheduleData); }; /** * Drag event handler method. * @emits DayGridCreation#drag * @param {object} dragEventData - Drag#drag event handler scheduledata. */ DayGridCreation.prototype._onDrag = function(dragEventData) { var getScheduleDataFunc = this.getScheduleDataFunc, scheduleData; if (!getScheduleDataFunc) { return; } scheduleData = getScheduleDataFunc(dragEventData.originEvent); /** * @event DayGridCreation#drag * @type {object} * @property {DayGridView} relatedView - view instance. * @property {number} datesInRange - date count of this view. * @property {number} dragStartXIndex - index number of dragstart grid index. * @property {number} xIndex - index number of mouse positions. */ this.fire('drag', scheduleData); }; /** * DragEnd event hander method. * @emits DayGridCreation#dragend * @param {object} dragEndEventData - Drag#dragEnd event handler data. * @param {string} [overrideEventName] - override emitted event name when supplied. */ DayGridCreation.prototype._onDragEnd = function(dragEndEventData, overrideEventName) { var getScheduleDataFunc = this.getScheduleDataFunc; var scheduleData; if (!getScheduleDataFunc) { return; } this.dragHandler.off({ drag: this._onDrag, dragEnd: this._onDragEnd }, this); scheduleData = getScheduleDataFunc(dragEndEventData.originEvent); this._createSchedule(scheduleData); /** * @event DayGridCreation#dragend * @type {object} * @property {DayGridView} relatedView - view instance. * @property {number} datesInRange - date count of this view. * @property {number} dragStartXIndex - index number of dragstart grid index. * @property {number} xIndex - index number of mouse positions. */ this.fire(overrideEventName || 'dragend', scheduleData); this.getScheduleDataFunc = null; }; /** * Click event handler method. * @emits DayGridCreation#click * @param {object} clickEventData - Drag#click event handler data. */ DayGridCreation.prototype._onClick = function(clickEventData) { var self = this; var getScheduleDataFunc, scheduleData; if (!this.checkExpectedCondition(clickEventData.target) || this._disableClick) { return; } getScheduleDataFunc = this._retriveScheduleData(this.view, clickEventData.originEvent); scheduleData = getScheduleDataFunc(clickEventData.originEvent); this._requestOnClick = true; setTimeout(function() { if (self._requestOnClick) { self.fire('click', scheduleData); self._createSchedule(scheduleData); } self._requestOnClick = false; }, CLICK_DELAY); }; /** * Dblclick event handler method. * @emits DayGridCreation#click * @param {object} clickEventData - Drag#Click event handler data. */ DayGridCreation.prototype._onDblClick = function(clickEventData) { var getScheduleDataFunc, scheduleData; if (!this.checkExpectedCondition(clickEventData.target)) { return; } getScheduleDataFunc = this._retriveScheduleData(this.view, clickEventData); scheduleData = getScheduleDataFunc(clickEventData); this.fire('click', scheduleData); this._createSchedule(scheduleData); this._requestOnClick = false; }; /** * Invoke creation click * @param {Schedule} schedule - schedule instance */ DayGridCreation.prototype.invokeCreationClick = function(schedule) { var getScheduleDataFunc, scheduleData; getScheduleDataFunc = this._retriveScheduleDataFromDate(this.view, schedule.start); scheduleData = getScheduleDataFunc(schedule.start); this.fire('click', scheduleData); this._createSchedule(scheduleData); }; common.mixin(dayGridCore, DayGridCreation); util.CustomEvents.mixin(DayGridCreation); module.exports = DayGridCreation; /***/ }), /***/ "./src/js/handler/daygrid/creationGuide.js": /*!*************************************************!*\ !*** ./src/js/handler/daygrid/creationGuide.js ***! \*************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Guide element for DayGrid.Creation * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"); var domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); var reqAnimFrame = __webpack_require__(/*! ../../common/reqAnimFrame */ "./src/js/common/reqAnimFrame.js"); /** * Class for DayGrid.Creation dragging effect. * @constructor * @param {DayGridCreation} creation - instance of DayGridCreation. */ function DayGridCreationGuide(creation) { /** * @type {DayGridCreation} */ this.creation = creation; /** * @type {HTMLDIVElement} */ this.scheduleContainer = null; /** * @type {HTMLDIVElement} */ this.guideElement = document.createElement('div'); this.initializeGuideElement(); this.applyTheme(creation.controller.theme); creation.on({ dragstart: this._createGuideElement, drag: this._onDrag, click: this._createGuideElement }, this); } /** * Destroy method */ DayGridCreationGuide.prototype.destroy = function() { this.clearGuideElement(); this.creation.off(this); this.creation = this.scheduleContainer = this.guideElement = null; }; /** * initialize guide element's default style. */ DayGridCreationGuide.prototype.initializeGuideElement = function() { domutil.addClass(this.guideElement, config.classname('daygrid-guide-creation-block')); }; /** * Drag event handler * @param {object} scheduleData - schedule data from DayGrid.Creation handler. */ DayGridCreationGuide.prototype._onDrag = function(scheduleData) { this._refreshGuideElement(scheduleData, true); }; /** * Get element width based on narrowWeekend * @param {number} dragStartIndex - grid start index * @param {number} dragEndIndex - grid end index * @param {Array} grids - dates information * @returns {number} element width */ DayGridCreationGuide.prototype._getGuideWidth = function(dragStartIndex, dragEndIndex, grids) { var width = 0; var i = dragStartIndex; for (; i <= dragEndIndex; i += 1) { width += grids[i] ? grids[i].width : 0; } return width; }; /** * Refresh guide element. * @param {object} scheduleData - schedule data from DayGrid.Creation handler. * @param {boolean} defer - If set to true, set style in the next frame */ DayGridCreationGuide.prototype._refreshGuideElement = function(scheduleData, defer) { var guideElement = this.guideElement, data = scheduleData, dragStartXIndex = data.dragStartXIndex < data.xIndex ? data.dragStartXIndex : data.xIndex, dragEndXIndex = data.dragStartXIndex < data.xIndex ? data.xIndex : data.dragStartXIndex, leftPercent, widthPercent; leftPercent = data.grids[dragStartXIndex] ? data.grids[dragStartXIndex].left : 0; widthPercent = this._getGuideWidth(dragStartXIndex, dragEndXIndex, data.grids); /** eslint-disable require-jsdoc */ function setStyle() { guideElement.style.display = 'block'; guideElement.style.left = leftPercent + '%'; guideElement.style.width = widthPercent + '%'; } if (defer) { reqAnimFrame.requestAnimFrame(setStyle); } else { setStyle(); } }; /** * Clear guide element. */ DayGridCreationGuide.prototype.clearGuideElement = function() { var guideElement = this.guideElement; domutil.remove(guideElement); guideElement.style.display = 'none'; guideElement.style.left = ''; guideElement.style.width = ''; }; /** * Create guide element * @param {object} dragStartEventData - schedule data object of DayGrid.Creation. */ DayGridCreationGuide.prototype._createGuideElement = function(dragStartEventData) { var creation = this.creation, view = creation.view, container = view.container, scheduleContainer = domutil.find(config.classname('.weekday-grid'), container); scheduleContainer.appendChild(this.guideElement); this._refreshGuideElement(dragStartEventData); }; /** * Drag event handler. * @param {object} dragEventData - event data object of DayGrid.Creation. */ DayGridCreationGuide.prototype._onDrag = function(dragEventData) { this._refreshGuideElement(dragEventData); }; DayGridCreationGuide.prototype.applyTheme = function(theme) { var style = this.guideElement.style; style.backgroundColor = theme.common.creationGuide.backgroundColor; style.border = theme.common.creationGuide.border; }; module.exports = DayGridCreationGuide; /***/ }), /***/ "./src/js/handler/daygrid/move.js": /*!****************************************!*\ !*** ./src/js/handler/daygrid/move.js ***! \****************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Move handler for DayGrid view. * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"); var common = __webpack_require__(/*! ../../common/common */ "./src/js/common/common.js"); var domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); var dayGridCore = __webpack_require__(/*! ./core */ "./src/js/handler/daygrid/core.js"); var DayGridMoveGuide = __webpack_require__(/*! ./moveGuide */ "./src/js/handler/daygrid/moveGuide.js"); var TZDate = __webpack_require__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date; /** * @constructor * @implements {Handler} * @mixes dayGridCore * @mixes CustomEvents * @param {Drag} dragHandler - Drag handler instance. * @param {DayGrid} view - view instance. * @param {Base} controller - Base controller instance. */ function DayGridMove(dragHandler, view, controller) { /** * Drag handler instance. * @type {Drag} */ this.dragHandler = dragHandler; /** * view instance. * @type {DayGrid} */ this.view = view; /** * Base controller instance. * @type {Base} */ this.controller = controller; /** * Temporary variable for dragstart event data. * @type {object} */ this._dragStart = null; dragHandler.on({ dragStart: this._onDragStart }, this); /** * @type {DayGridMoveGuide} */ this.guide = new DayGridMoveGuide(this); } DayGridMove.prototype.destroy = function() { this.guide.destroy(); this.dragHandler.off(this); this.dragHandler = this.view = this.controller = this.guide = this._dragStart = null; }; /** * Check dragstart target is expected conditions for this handler. * @param {HTMLElement} target - dragstart event handler's target element. * @returns {boolean|DayGridSchedule} return DayGridSchedule view instance when satiate condition. */ DayGridMove.prototype.checkExpectedCondition = function(target) { var cssClass = domutil.getClass(target), parentView, matches; if (~cssClass.indexOf(config.classname('weekday-resize-handle'))) { return false; } parentView = domutil.closest(target, config.classname('.weekday')); if (!parentView) { return false; } cssClass = domutil.getClass(parentView); matches = cssClass.match(config.daygrid.getViewIDRegExp); if (!matches || matches.length < 2) { return false; } return util.pick(this.view.children.items, matches[1]); }; /** * DragStart event handler method. * @emits DayGridMove#dragstart * @param {object} dragStartEventData - Drag#dragStart event handler event data. */ DayGridMove.prototype._onDragStart = function(dragStartEventData) { var target = dragStartEventData.target, result = this.checkExpectedCondition(target), controller = this.controller, excludeTarget = true, scheduleBlockElement, modelID, targetModel, getScheduleDataFunc, scheduleData; if (!result) { return; } scheduleBlockElement = domutil.closest(target, config.classname('.weekday-schedule-block'), excludeTarget); if (!scheduleBlockElement) { return; } modelID = domutil.getData(scheduleBlockElement, 'id'); targetModel = controller.schedules.items[modelID]; if (!targetModel) { return; } if (targetModel.isReadOnly) { return; } getScheduleDataFunc = this._retriveScheduleData(this.view, dragStartEventData.originEvent); this.getScheduleDataFunc = getScheduleDataFunc; scheduleData = this._dragStart = getScheduleDataFunc(dragStartEventData.originEvent); util.extend(scheduleData, { scheduleBlockElement: scheduleBlockElement, model: targetModel }); this.dragHandler.on({ drag: this._onDrag, dragEnd: this._onDragEnd, click: this._onClick }, this); /** * @event DayGridMove#dragstart * @type {object} * @property {DayGrid} relatedView - view instance. * @property {number} datesInRange - date count of this view. * @property {number} dragStartXIndex - index number of dragstart grid index. * @property {number} xIndex - index number of mouse positions. * @property {Schedule} model - data object of model isntance. * @property {HTMLDivElement} scheduleBlockElement - target schedule block element. */ this.fire('dragstart', scheduleData); }; /** * Drag event handler method. * @emits DayGridMove#drag * @param {object} dragEventData - Drag#drag event handler eventdata. */ DayGridMove.prototype._onDrag = function(dragEventData) { var getScheduleDataFunc = this.getScheduleDataFunc; if (!getScheduleDataFunc) { return; } /** * @schedule DayGridMove#drag * @type {object} * @property {DayGrid} relatedView - view instance. * @property {number} datesInRange - date count of this view. * @property {number} dragStartXIndex - index number of dragstart grid index. * @property {number} xIndex - index number of mouse positions. */ this.fire('drag', getScheduleDataFunc(dragEventData.originEvent)); }; /** * Request update schedule model to base controller. * @fires DayGridMove#beforeUpdateSchedule * @param {object} scheduleData - schedule data from DayGridMove handler module. */ DayGridMove.prototype._updateSchedule = function(scheduleData) { var schedule = scheduleData.targetModel, dateOffset = scheduleData.xIndex - scheduleData.dragStartXIndex, newStarts = new TZDate(schedule.start), newEnds = new TZDate(schedule.end); newStarts = newStarts.addDate(dateOffset); newEnds = newEnds.addDate(dateOffset); /** * @event DayGridMove#beforeUpdateSchedule * @type {object} * @property {Schedule} schedule - schedule instance to update * @property {Date} start - start time to update * @property {Date} end - end time to update */ this.fire('beforeUpdateSchedule', { schedule: schedule, start: newStarts, end: newEnds }); }; /** * DragEnd event hander method. * @emits DayGridMove#dragend * @param {object} dragEndEventData - Drag#DragEnd event handler data. * @param {string} [overrideEventName] - override emitted event name when supplied. * @param {?boolean} skipUpdate - true then skip update schedule model. */ DayGridMove.prototype._onDragEnd = function(dragEndEventData, overrideEventName, skipUpdate) { var getScheduleDataFunc = this.getScheduleDataFunc, dragStart = this._dragStart, scheduleData; if (!getScheduleDataFunc || !dragStart) { return; } this.dragHandler.off({ drag: this._onDrag, dragEnd: this._onDragEnd, click: this._onClick }, this); scheduleData = getScheduleDataFunc(dragEndEventData.originEvent); util.extend(scheduleData, { targetModel: dragStart.model }); if (!skipUpdate) { this._updateSchedule(scheduleData); } /** * @event DayGridMove#dragend * @type {object} * @property {DayGrid} relatedView - view instance. * @property {number} datesInRange - date count of this view. * @property {number} dragStartXIndex - index number of dragstart grid index. * @property {number} xIndex - index number of mouse positions. */ this.fire(overrideEventName || 'dragend', scheduleData); this.getScheduleDataFunc = this._dragStart = null; }; /** * Click event handler method. * @emits DayGridMove#click * @param {object} clickEventData - Drag#Click event handler data. */ DayGridMove.prototype._onClick = function(clickEventData) { /** * @event DayGridMove#click * @type {object} * @property {DayGrid} relatedView - view instance. * @property {number} datesInRange - date count of this view. * @property {number} dragStartXIndex - index number of dragstart grid index. * @property {number} xIndex - index number of mouse positions. */ this._onDragEnd(clickEventData, 'click', true); }; common.mixin(dayGridCore, DayGridMove); util.CustomEvents.mixin(DayGridMove); module.exports = DayGridMove; /***/ }), /***/ "./src/js/handler/daygrid/moveGuide.js": /*!*********************************************!*\ !*** ./src/js/handler/daygrid/moveGuide.js ***! \*********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(global) {/** * @fileoverview Effect module for DayGrid.Move * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"); var datetime = __webpack_require__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); var domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); var reqAnimFrame = __webpack_require__(/*! ../../common/reqAnimFrame */ "./src/js/common/reqAnimFrame.js"); /** * Class for DayGrid.Move dragging effect. * @constructor * @param {DayGridMove} daygridMove - instance of DayGridMove. */ function DayGridMoveGuide(daygridMove) { /** * @type {DayGridMove} */ this.daygridMove = daygridMove; /** * The element that actually contains the event element * @type {HTMLDIVElement} */ this.scheduleContainer = null; /** * @type {number} */ this._dragStartXIndex = null; /** * @type {HTMLDIVElement} */ this.guideElement = null; /** * @type {HTMLElement[]} */ this.elements = null; daygridMove.on({ 'dragstart': this._onDragStart, 'drag': this._onDrag, 'dragend': this._clearGuideElement, 'click': this._clearGuideElement }, this); } /** * Destroy method */ DayGridMoveGuide.prototype.destroy = function() { this._clearGuideElement(); this.daygridMove.off(this); this.daygridMove = this.scheduleContainer = this._dragStartXIndex = this.elements = this.guideElement = null; }; /** * Clear guide element. */ DayGridMoveGuide.prototype._clearGuideElement = function() { this._showOriginScheduleBlocks(); domutil.remove(this.guideElement); if (!util.browser.msie) { domutil.removeClass(global.document.body, config.classname('dragging')); } this._dragStartXIndex = this.getScheduleDataFunc = this.guideElement = null; }; /** * Dim element blocks * @param {number} modelID - Schedule model instance ID */ DayGridMoveGuide.prototype._hideOriginScheduleBlocks = function(modelID) { var className = config.classname('weekday-schedule-block-dragging-dim'); var scheduleBlocks = domutil.find( config.classname('.weekday-schedule-block'), this.daygridMove.view.container, true ); this.elements = util.filter(scheduleBlocks, function(schedule) { return domutil.getData(schedule, 'id') === modelID; }); util.forEach(this.elements, function(el) { domutil.addClass(el, className); }); }; /** * Show element blocks */ DayGridMoveGuide.prototype._showOriginScheduleBlocks = function() { var className = config.classname('weekday-schedule-block-dragging-dim'); util.forEach(this.elements, function(el) { domutil.removeClass(el, className); }); }; /** * Highlight element blocks * @param {Schedule} model - model * @param {HTMLElement} parent - parent element */ DayGridMoveGuide.prototype._highlightScheduleBlocks = function(model, parent) { var elements = domutil.find(config.classname('.weekday-schedule'), parent, true); util.forEach(elements, function(el) { el.style.margin = '0'; if (!model.isFocused) { el.style.backgroundColor = model.dragBgColor; el.style.borderLeftColor = model.borderColor; el.style.color = '#ffffff'; } }); }; /** * Refresh guide element. * @param {number} leftPercent - left percent of guide element. * @param {number} widthPercent - width percent of guide element. * @param {boolean} isExceededLeft - schedule start is faster then render start date? * @param {boolean} isExceededRight - schedule end is later then render end date? */ DayGridMoveGuide.prototype.refreshGuideElement = function(leftPercent, widthPercent, isExceededLeft, isExceededRight) { var guideElement = this.guideElement; reqAnimFrame.requestAnimFrame(function() { guideElement.style.left = leftPercent + '%'; guideElement.style.width = widthPercent + '%'; if (isExceededLeft) { domutil.addClass(guideElement, config.classname('weekday-exceed-left')); } else { domutil.removeClass(guideElement, config.classname('weekday-exceed-left')); } if (isExceededRight) { domutil.addClass(guideElement, config.classname('weekday-exceed-right')); } else { domutil.removeClass(guideElement, config.classname('weekday-exceed-right')); } }); }; /** * Get schedule block information from schedule data. * * For example, there is single schedule has 10 length. but render range in view is 5 then * rendered block must be cut out to render properly. in this case, this method return * how many block are cut before rendering. * * @param {object} dragStartEventData - schedule data from DayGrid.Move handler. * @returns {function} function that return schedule block information. */ DayGridMoveGuide.prototype._getScheduleBlockDataFunc = function(dragStartEventData) { var model = dragStartEventData.model, datesInRange = dragStartEventData.datesInRange, range = dragStartEventData.range, baseWidthPercent = (100 / datesInRange), originScheduleStarts = datetime.start(model.start), originScheduleEnds = datetime.end(model.end), renderStartDate = datetime.start(range[0]), renderEndDate = datetime.end(range[range.length - 1]), fromLeft = Math.ceil((originScheduleStarts.getTime() - renderStartDate.getTime()) / datetime.MILLISECONDS_PER_DAY) || 0, fromRight = Math.ceil((originScheduleEnds.getTime() - renderEndDate.getTime()) / datetime.MILLISECONDS_PER_DAY) || 0; return function(indexOffset) { return { baseWidthPercent: baseWidthPercent, fromLeft: fromLeft + indexOffset, fromRight: fromRight + indexOffset }; }; }; /** * DragStart event handler. * @param {object} dragStartEventData - schedule data. */ DayGridMoveGuide.prototype._onDragStart = function(dragStartEventData) { var container = this.daygridMove.view.container, guideElement = this.guideElement = dragStartEventData.scheduleBlockElement.cloneNode(true), scheduleContainer; if (!util.browser.msie) { domutil.addClass(global.document.body, config.classname('dragging')); } this._hideOriginScheduleBlocks(String(dragStartEventData.model.cid())); scheduleContainer = domutil.find(config.classname('.weekday-schedules'), container); domutil.appendHTMLElement('div', guideElement, config.classname('weekday-schedule-cover')); scheduleContainer.appendChild(guideElement); this._dragStartXIndex = dragStartEventData.xIndex; this.getScheduleDataFunc = this._getScheduleBlockDataFunc(dragStartEventData); this._highlightScheduleBlocks(dragStartEventData.model, guideElement); }; /** * Drag event handler. * @param {object} dragEventData - schedule data. */ DayGridMoveGuide.prototype._onDrag = function(dragEventData) { var getScheduleDataFunc = this.getScheduleDataFunc, dragStartXIndex = this._dragStartXIndex, datesInRange = dragEventData.datesInRange, grids = dragEventData.grids, scheduleData, isExceededLeft, isExceededRight, originLength, leftIndex, size, newLeft, newWidth; if (!getScheduleDataFunc) { return; } scheduleData = getScheduleDataFunc(dragEventData.xIndex - dragStartXIndex); isExceededLeft = scheduleData.fromLeft < 0; isExceededRight = scheduleData.fromRight > 0; leftIndex = Math.max(0, scheduleData.fromLeft); originLength = (scheduleData.fromLeft * -1) + (datesInRange + scheduleData.fromRight); size = isExceededLeft ? (originLength + scheduleData.fromLeft) : originLength; size = isExceededRight ? (size - scheduleData.fromRight) : size; newLeft = grids[leftIndex] ? grids[leftIndex].left : 0; newWidth = getScheduleBlockWidth(leftIndex, size, grids); this.refreshGuideElement(newLeft, newWidth, isExceededLeft, isExceededRight); }; /** * Get schedule width based on grids * @param {number} left - left index * @param {number} size - schedule width * @param {Array} grids - dates information * @returns {number} element width */ function getScheduleBlockWidth(left, size, grids) { var width = 0; var i = 0; var length = grids.length; for (; i < size; i += 1) { left = (left + i) % length; if (left < length) { width += grids[left] ? grids[left].width : 0; } } return width; } module.exports = DayGridMoveGuide; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) /***/ }), /***/ "./src/js/handler/daygrid/resize.js": /*!******************************************!*\ !*** ./src/js/handler/daygrid/resize.js ***! \******************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Resize handler module for DayGrid view. * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"); var datetime = __webpack_require__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); var domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); var common = __webpack_require__(/*! ../../common/common */ "./src/js/common/common.js"); var dayGridCore = __webpack_require__(/*! ./core */ "./src/js/handler/daygrid/core.js"); var DayGridResizeGuide = __webpack_require__(/*! ./resizeGuide */ "./src/js/handler/daygrid/resizeGuide.js"); var TZDate = __webpack_require__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date; /** * @constructor * @implements {Handler} * @mixes dayGridCore * @mixes CustomEvents * @param {Drag} [dragHandler] - Drag handler instance. * @param {DayGrid} [view] - view instance. * @param {Base} [controller] - Base controller instance. */ function DayGridResize(dragHandler, view, controller) { /** * Drag handler instance. * @type {Drag} */ this.dragHandler = dragHandler; /** * view instance. * @type {DayGrid} */ this.view = view; /** * Base controller instance. * @type {Base} */ this.controller = controller; /** * Temporary variable for dragStart event data. * @type {object} */ this._dragStart = null; dragHandler.on({ dragStart: this._onDragStart }, this); /** * @type {DayGridResizeGuide} */ this.guide = new DayGridResizeGuide(this); } /** * Destroy method */ DayGridResize.prototype.destroy = function() { this.guide.destroy(); this.dragHandler.off(this); this.dragHandler = this.view = this.controller = this.guide = this._dragStart = null; }; /** * Check dragstart target is expected conditions for this handler. * @param {HTMLElement} target - dragstart event handler's target element. * @returns {boolean|WeekdayInWeek} return WeekdayInWeek view instance when satiate condition. */ DayGridResize.prototype.checkExpectedCondition = function(target) { var cssClass = domutil.getClass(target), matches; if (!~cssClass.indexOf(config.classname('weekday-resize-handle'))) { return false; } target = domutil.closest(target, config.classname('.weekday')); if (!target) { return false; } cssClass = domutil.getClass(target); matches = cssClass.match(config.daygrid.getViewIDRegExp); if (!matches || matches.length < 2) { return false; } return util.pick(this.view.children.items, matches[1]); }; /** * DragStart event handler. * @emits DayGridResize#dragstart * @param {object} dragStartEventData - schedule data. */ DayGridResize.prototype._onDragStart = function(dragStartEventData) { var target = dragStartEventData.target, result = this.checkExpectedCondition(target), controller = this.controller, scheduleBlockElement, modelID, targetModel, getScheduleDataFunc, scheduleData; if (!result) { return; } scheduleBlockElement = domutil.closest(target, config.classname('.weekday-schedule-block')); modelID = domutil.getData(scheduleBlockElement, 'id'); targetModel = controller.schedules.items[modelID]; if (!targetModel) { return; } getScheduleDataFunc = this._retriveScheduleData(this.view, dragStartEventData.originEvent); this.getScheduleDataFunc = getScheduleDataFunc; scheduleData = this._dragStart = getScheduleDataFunc(dragStartEventData.originEvent); util.extend(scheduleData, { scheduleBlockElement: scheduleBlockElement, model: targetModel }); this.dragHandler.on({ drag: this._onDrag, dragEnd: this._onDragEnd, click: this._onClick }, this); /** * @event DayGridResize#dragstart * @type {object} * @property {View} relatedView - view instance. * @property {number} datesInRange - date count of this view. * @property {number} dragStartXIndex - index number of dragstart grid index. * @property {number} xIndex - index number of mouse positions. * @property {Schedule} model - data object of model isntance. * @property {HTMLDivElement} scheduleBlockElement - target schedule block element. */ this.fire('dragstart', scheduleData); }; /** * Drag event handler method. * @emits DayGridResize#drag * @param {object} dragEventData - Drag#drag event handler scheduledata. */ DayGridResize.prototype._onDrag = function(dragEventData) { var getScheduleDataFunc = this.getScheduleDataFunc; if (!getScheduleDataFunc) { return; } /** * @event DayGridResize#drag * @type {object} * @property {View} relatedView - view instance. * @property {number} datesInRange - date count of this view. * @property {number} dragStartXIndex - index number of dragstart grid index. * @property {number} xIndex - index number of mouse positions. */ this.fire('drag', getScheduleDataFunc(dragEventData.originEvent)); }; /** * Request update schedule instance to base controller. * @fires DayGridResize#beforeUpdateSchedule * @param {object} scheduleData - schedule data from DayGridResize handler. */ DayGridResize.prototype._updateSchedule = function(scheduleData) { var schedule = scheduleData.targetModel, dateOffset = scheduleData.xIndex - scheduleData.dragStartXIndex, newEnds = new TZDate(schedule.end); newEnds = newEnds.addDate(dateOffset); newEnds = new TZDate(common.maxDate(datetime.end(schedule.start), newEnds)); /** * @event DayGridResize#beforeUpdateSchedule * @type {object} * @property {Schedule} schedule - schedule instance to update * @property {date} start - start time to update * @property {date} end - end time to update */ this.fire('beforeUpdateSchedule', { schedule: schedule, start: schedule.getStarts(), end: newEnds }); }; /** * DragEnd event hander method. * @emits DayGridResize#dragend * @param {object} dragEndEventData - Drag#DragEnd event handler data. * @param {string} [overrideEventName] - override emitted event name when supplied. * @param {?boolean} skipUpdate - true then skip update schedule model. */ DayGridResize.prototype._onDragEnd = function(dragEndEventData, overrideEventName, skipUpdate) { var getScheduleDataFunc = this.getScheduleDataFunc, dragStart = this._dragStart, scheduleData; if (!getScheduleDataFunc || !dragStart) { return; } this.dragHandler.off({ drag: this._onDrag, dragEnd: this._onDragEnd, click: this._onClick }, this); scheduleData = getScheduleDataFunc(dragEndEventData.originEvent); util.extend(scheduleData, { targetModel: dragStart.model }); if (!skipUpdate) { this._updateSchedule(scheduleData); } /** * @event DayGridResize#dragend * @type {object} * @property {View} relatedView - view instance. * @property {number} datesInRange - date count of this view. * @property {number} dragStartXIndex - index number of dragstart grid index. * @property {number} xIndex - index number of mouse positions. */ this.fire(overrideEventName || 'dragend', scheduleData); this.getScheduleDataFunc = this._dragStart = null; }; /** * Click event handler method. * @emits DayGridResize#click * @param {object} clickEventData - Drag#Click event handler data. */ DayGridResize.prototype._onClick = function(clickEventData) { /** * @event DayGridResize#click * @type {object} * @property {View} relatedView - view instance. * @property {number} datesInRange - date count of this view. * @property {number} dragStartXIndex - index number of dragstart grid index. * @property {number} xIndex - index number of mouse positions. */ this._onDragEnd(clickEventData, 'click', true); }; common.mixin(dayGridCore, DayGridResize); util.CustomEvents.mixin(DayGridResize); module.exports = DayGridResize; /***/ }), /***/ "./src/js/handler/daygrid/resizeGuide.js": /*!***********************************************!*\ !*** ./src/js/handler/daygrid/resizeGuide.js ***! \***********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(global) {/** * @fileoverview Resize Guide module. * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"); var domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); var datetime = __webpack_require__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); var reqAnimFrame = __webpack_require__(/*! ../../common/reqAnimFrame */ "./src/js/common/reqAnimFrame.js"); /** * @constructor * @param {DayGridResize} resizeHandler - instance of DayGridResize */ function DayGridResizeGuide(resizeHandler) { /** * @type {DayGridResize} */ this.resizeHandler = resizeHandler; /** * The element that actually contains the event element * @type {HTMLDIVElement} */ this.scheduleContainer = null; /** * @type {function} */ this.getScheduleDataFunc = null; /** * @type {HTMLDIVElement} */ this.guideElement = null; /** * @type {HTMLDIVElement} */ this.scheduleBlockElement = null; resizeHandler.on({ 'dragstart': this._onDragStart, 'drag': this._onDrag, 'dragend': this._clearGuideElement, 'click': this._clearGuideElement }, this); } /** * Destroy method */ DayGridResizeGuide.prototype.destroy = function() { this._clearGuideElement(); this.resizeHandler.off(this); this.resizeHandler = this.scheduleContainer = this.getScheduleDataFunc = this.guideElement = this.scheduleBlockElement = null; }; /** * Clear guide element. */ DayGridResizeGuide.prototype._clearGuideElement = function() { domutil.remove(this.guideElement); if (!util.browser.msie) { domutil.removeClass(global.document.body, config.classname('resizing-x')); } if (this.scheduleBlockElement) { domutil.removeClass(this.scheduleBlockElement, config.classname('weekday-schedule-block-dragging-dim')); } this.getScheduleDataFunc = null; }; /** * Refresh guide element * @param {number} newWidth - new width percentage value to resize guide element. */ DayGridResizeGuide.prototype.refreshGuideElement = function(newWidth) { var guideElement = this.guideElement; reqAnimFrame.requestAnimFrame(function() { guideElement.style.width = newWidth + '%'; }); }; /** * Return function that calculate guide element's new width percentage value. * @param {object} dragStartEventData - dragstart schedule data. * @returns {function} return function that calculate guide element new width percentage. */ DayGridResizeGuide.prototype.getGuideElementWidthFunc = function(dragStartEventData) { var model = dragStartEventData.model, viewOptions = this.resizeHandler.view.options, fromLeft = Math.ceil( (model.start - viewOptions.renderStartDate) / datetime.MILLISECONDS_PER_DAY ) || 0, grids = dragStartEventData.grids; return function(xIndex) { var width = 0; var i = 0; var length = grids.length; width += grids[fromLeft] ? grids[fromLeft].width : 0; for (; i < length; i += 1) { if (i > fromLeft && i <= xIndex) { width += grids[i] ? grids[i].width : 0; } } return width; }; }; /** * DragStart event handler. * @param {object} dragStartEventData - schedule data. */ DayGridResizeGuide.prototype._onDragStart = function(dragStartEventData) { var container = this.resizeHandler.view.container, scheduleBlockElement = this.scheduleBlockElement = dragStartEventData.scheduleBlockElement, guideElement = this.guideElement = scheduleBlockElement.cloneNode(true), scheduleContainer; if (!util.browser.msie) { domutil.addClass(global.document.body, config.classname('resizing-x')); } scheduleContainer = domutil.find(config.classname('.weekday-schedules'), container); domutil.addClass(guideElement, config.classname('daygrid-guide-move')); domutil.addClass(scheduleBlockElement, config.classname('weekday-schedule-block-dragging-dim')); scheduleContainer.appendChild(guideElement); this.getScheduleDataFunc = this.getGuideElementWidthFunc(dragStartEventData); }; /** * Drag event handler. * @param {object} dragEventData - schedule data. */ DayGridResizeGuide.prototype._onDrag = function(dragEventData) { var func = this.getScheduleDataFunc; if (!func) { return; } this.refreshGuideElement(func(dragEventData.xIndex)); }; module.exports = DayGridResizeGuide; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) /***/ }), /***/ "./src/js/handler/drag.js": /*!********************************!*\ !*** ./src/js/handler/drag.js ***! \********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(global) {/** * @fileoverview Drag handler for calendar. * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var domutil = __webpack_require__(/*! ../common/domutil */ "./src/js/common/domutil.js"); var domevent = __webpack_require__(/*! ../common/domevent */ "./src/js/common/domevent.js"); /** * @constructor * @mixes CustomEvents * @param {object} options - options for drag handler * @param {number} [options.distance=10] - distance in pixels after mouse must move before dragging should start * @param {function} [options.exclude] - filter function for don't fire drag events that specific conditions. * @param {HTMLElement} container element to watching drag interaction. */ function Drag(options, container) { domevent.on(container, 'mousedown', this._onMouseDown, this); this.options = util.extend({ distance: 10, exclude: null }, options); /** * @type {HTMLElement} */ this.container = container; /** * Flag for represent current dragging session has been cancelled for exclude option. * @type {boolean} */ this._cancelled = false; /** * @type {boolean} */ this._isMoved = false; /** * dragging distance in pixel between mousedown and firing dragStart events * @type {number} */ this._distance = 0; /** * @type {boolean} */ this._dragStartFired = false; /** * @type {object} */ this._dragStartEventData = null; } /** * Destroy method. */ Drag.prototype.destroy = function() { domevent.off(this.container, 'mousedown', this._onMouseDown, this); this._isMoved = null; this.container = null; }; /** * Clear cache data for single dragging session. */ Drag.prototype._clearData = function() { this._cancelled = false; this._distance = 0; this._isMoved = false; this._dragStartFired = false; this._dragStartEventData = null; }; /** * Toggle events for mouse dragging. * @param {boolean} toBind - bind events related with dragging when supplied "true" */ Drag.prototype._toggleDragEvent = function(toBind) { var container = this.container, domMethod, method; if (toBind) { domMethod = 'on'; method = 'disable'; } else { domMethod = 'off'; method = 'enable'; } domutil[method + 'TextSelection'](container); domutil[method + 'ImageDrag'](container); domevent[domMethod](global.document, { mousemove: this._onMouseMove, mouseup: this._onMouseUp }, this); }; /** * Normalize mouse event object. * @param {MouseEvent} mouseEvent - mouse event object. * @returns {object} normalized mouse event data. */ Drag.prototype._getEventData = function(mouseEvent) { return { target: mouseEvent.target || mouseEvent.srcElement, originEvent: mouseEvent }; }; /** * MouseDown DOM event handler. * @param {MouseEvent} mouseDownEvent MouseDown event object. */ Drag.prototype._onMouseDown = function(mouseDownEvent) { var opt = this.options, target = (mouseDownEvent.srcElement || mouseDownEvent.target); // only primary button can start drag. if (domevent.getMouseButton(mouseDownEvent) !== 0) { return; } if (opt.exclude && opt.exclude(target)) { this._cancelled = true; return; } this._clearData(); this._dragStartEventData = this._getEventData(mouseDownEvent); this._toggleDragEvent(true); /** * mousedown event for firefox bug. cancelable. * @event Drag#mouseDown * @type {object} * @property {HTMLElement} target - target element in this event. * @property {MouseEvent} originEvent - original mouse event object. */ this.fire('mousedown', this._dragStartEventData); }; /** * MouseMove DOM event handler. * @emits Drag#drag * @emits Drag#dragStart * @param {MouseEvent} mouseMoveEvent MouseMove event object. */ Drag.prototype._onMouseMove = function(mouseMoveEvent) { var distance; if (this._cancelled) { this._clearData(); return; } distance = this.options.distance; // prevent automatic scrolling. domevent.preventDefault(mouseMoveEvent); if (this._distance < distance) { this._distance += 1; return; } this._isMoved = true; if (!this._dragStartFired) { this._dragStartFired = true; /** * Drag start events. cancelable. * @event Drag#dragStart * @type {object} * @property {HTMLElement} target - target element in this event. * @property {MouseEvent} originEvent - original mouse event object. */ if (!this.invoke('dragStart', this._dragStartEventData)) { this._toggleDragEvent(false); this._clearData(); return; } } /** * CalEvents while dragging. * @event Drag#drag * @type {object} * @property {HTMLElement} target - target element in this event. * @property {MouseEvent} originEvent - original mouse event object. */ this.fire('drag', this._getEventData(mouseMoveEvent)); }; /** * MouseUp DOM event handler. * @param {MouseEvent} mouseUpEvent MouseUp event object. * @emits Drag#dragEnd * @emits Drag#click */ Drag.prototype._onMouseUp = function(mouseUpEvent) { if (this._cancelled) { return; } this._toggleDragEvent(false); // emit "click" event when not emitted drag event between mousedown and mouseup. if (this._isMoved) { this._isMoved = false; /** * Drag end events. * @event Drag#dragEnd * @type {MouseEvent} * @property {HTMLElement} target - target element in this event. * @property {MouseEvent} originEvent - original mouse event object. */ this.fire('dragEnd', this._getEventData(mouseUpEvent)); } else { /** * Click events. * @event Drag#click * @type {MouseEvent} * @property {HTMLElement} target - target element in this event. * @property {MouseEvent} originEvent - original mouse event object. */ this.fire('click', this._getEventData(mouseUpEvent)); } this._clearData(); }; util.CustomEvents.mixin(Drag); module.exports = Drag; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) /***/ }), /***/ "./src/js/handler/month/click.js": /*!***************************************!*\ !*** ./src/js/handler/month/click.js ***! \***************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Click handler for month view * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"), datetime = __webpack_require__(/*! ../../common/datetime */ "./src/js/common/datetime.js"), domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); /** * @constructor * @implements {Handler} * @mixes util.CustomEvents * @param {Drag} [dragHandler] - Drag handler instance. * @param {Month} [monthView] - Month view instance. * @param {Base} [baseController] - Base controller instance. */ function MonthClick(dragHandler, monthView, baseController) { /** * @type {Drag} */ this.dragHandler = dragHandler; /** * @type {Month} */ this.monthView = monthView; /** * @type {Base} */ this.baseController = baseController; dragHandler.on({ 'click': this._onClick }, this); } /** * Destructor */ MonthClick.prototype.destroy = function() { this.dragHandler.off(this); this.monthView = this.baseController = this.dragHandler = null; }; /** * @fires MonthClick#clickMore * @param {object} clickEvent - click event object */ MonthClick.prototype._onClick = function(clickEvent) { var self = this, moreElement, scheduleCollection = this.baseController.schedules, blockElement = domutil.closest(clickEvent.target, config.classname('.weekday-schedule-block')) || domutil.closest(clickEvent.target, config.classname('.month-more-schedule')); moreElement = domutil.closest( clickEvent.target, config.classname('.weekday-exceed-in-month') ); if (moreElement) { self.fire('clickMore', { date: datetime.parse(domutil.getData(moreElement, 'ymd')), target: moreElement, ymd: domutil.getData(moreElement, 'ymd') }); } if (blockElement) { scheduleCollection.doWhenHas(domutil.getData(blockElement, 'id'), function(schedule) { /** * @events AlldayClick#clickSchedule * @type {object} * @property {Schedule} schedule - schedule instance * @property {MouseEvent} event - MouseEvent object */ self.fire('clickSchedule', { schedule: schedule, event: clickEvent.originEvent }); }); } }; util.CustomEvents.mixin(MonthClick); module.exports = MonthClick; /***/ }), /***/ "./src/js/handler/month/core.js": /*!**************************************!*\ !*** ./src/js/handler/month/core.js ***! \**************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Module for calculate date by month view and mouse event object * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var common = __webpack_require__(/*! ../../common/common */ "./src/js/common/common.js"), domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"), domevent = __webpack_require__(/*! ../../common/domevent */ "./src/js/common/domevent.js"); var mfloor = Math.floor; /** * Get high order function that can calc date in mouse point * @param {Month} monthView - month view * @returns {function} function return event data by mouse event object */ function getMousePosDate(monthView) { var weekColl = monthView.children, weeks = weekColl.sort(function(a, b) { return util.stamp(a) - util.stamp(b); }), weekCount = weekColl.length, days = weekColl.single().getRenderDateRange(), dayCount = days.length, relativeContainer = util.pick(monthView.vLayout.panels[1], 'container'), size = domutil.getSize(relativeContainer), grids = monthView.grids; /** * Get the left index * @param {number} left - left position(percent) * @returns {number} grid left index */ function getX(left) { var i = 0; var length = grids.length; var grid; for (; i < length; i += 1) { grid = grids[i]; if (grid.left <= left && left <= (grid.left + grid.width)) { return i; } } return left < 0 ? -1 : i; } /** * Get date related with mouse event object * @param {object} mouseEvent - click event data * @returns {object} data related with mouse event */ function getDate(mouseEvent) { var pos = domevent.getMousePosition(mouseEvent, relativeContainer), x = getX(common.ratio(size[0], 100, pos[0])), y = mfloor(common.ratio(size[1], weekCount, pos[1])), weekdayView, date, dateRange; if (y < 0) { y = 0; } if (y >= weeks.length) { y = weeks.length - 1; } weekdayView = util.pick(weeks, y); if (!weekdayView) { return null; } dateRange = weekdayView.getRenderDateRange(); if (x < 0) { x = 0; } if (x >= dateRange.length) { x = dateRange.length - 1; } date = util.pick(dateRange, x); if (!date) { return null; } return { x: x, y: y, sizeX: dayCount, sizeY: weekCount, date: date, weekdayView: weekdayView, triggerEvent: mouseEvent.type }; } return getDate; } module.exports = getMousePosDate; /***/ }), /***/ "./src/js/handler/month/creation.js": /*!******************************************!*\ !*** ./src/js/handler/month/creation.js ***! \******************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Creation handler for month view * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"); var datetime = __webpack_require__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); var array = __webpack_require__(/*! ../../common/array */ "./src/js/common/array.js"); var domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); var domevent = __webpack_require__(/*! ../../common/domevent */ "./src/js/common/domevent.js"); var getMousePosDate = __webpack_require__(/*! ./core */ "./src/js/handler/month/core.js"); var Guide = __webpack_require__(/*! ./creationGuide */ "./src/js/handler/month/creationGuide.js"); var TZDate = __webpack_require__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date; var CLICK_DELAY = 300; /** * @constructor * @param {Drag} dragHandler - Drag handler instance. * @param {Month} monthView - Month view instance. * @param {Base} baseController - Base controller instance. * @param {Options} [options] - calendar Options */ function MonthCreation(dragHandler, monthView, baseController, options) { /** * @type {Drag} */ this.dragHandler = dragHandler; /** * @type {Month} */ this.monthView = monthView; /** * @type {Base} */ this.baseController = baseController; /** * @type {function} */ this.getScheduleData = null; /** * Cache for dragging session * @type {object} */ this._cache = null; /** * @type {MonthCreationGuide} */ this.guide = new Guide(this); /** * @type {boolean} */ this._requestOnClick = false; /** * @type {boolean} */ this._disableDblClick = options.disableDblClick; /** * @type {boolean} */ this._disableClick = options.disableClick; dragHandler.on('dragStart', this._onDragStart, this); dragHandler.on('click', this._onClick, this); if (this._disableDblClick) { CLICK_DELAY = 0; } else { domevent.on(monthView.container, 'dblclick', this._onDblClick, this); } } /** * Destructor */ MonthCreation.prototype.destroy = function() { this.dragHandler.off(this); this.guide.destroy(); if (this.monthView && this.monthView.container) { domevent.off(this.monthView.container, 'dblclick', this._onDblClick, this); } this.dragHandler = this.monthView = this.baseController = this.getScheduleData = this._cache = this.guide = null; }; /** * Fire before create schedule * @fires {MonthCreation#beforeCreateSchedule} * @param {object} eventData - cache data from single dragging session */ MonthCreation.prototype._createSchedule = function(eventData) { /** * @event {MonthCreation#beforeCreateSchedule} * @type {object} * @property {boolean} isAllDay - whether schedule is fired in allday view area? * @property {Date} start - select start time * @property {Date} end - select end time * @property {TimeCreationGuide} guide - TimeCreationGuide instance * @property {string} triggerEventName - event name */ this.fire('beforeCreateSchedule', { isAllDay: eventData.isAllDay, start: eventData.start, end: eventData.end, guide: this.guide.guide, triggerEventName: eventData.triggerEvent }); }; /** * DragStart event handler * @fires {MonthCreation#monthCreationDragstart} * @param {object} dragStartEvent - dragStart event data */ MonthCreation.prototype._onDragStart = function(dragStartEvent) { var eventData; if (!isElementWeekdayGrid(dragStartEvent.target)) { return; } this.dragHandler.on({ drag: this._onDrag, dragEnd: this._onDragEnd }, this); this.getScheduleData = getMousePosDate(this.monthView); eventData = this.getScheduleData(dragStartEvent.originEvent); this._cache = { start: new TZDate(eventData.date) }; /** * @event {MonthCreation#monthCreationDragstart} * @type {object} * @property {number} x - x index * @property {number} y - y index * @property {Date} date - drag date */ this.fire('monthCreationDragstart', eventData); }; /** * Drag event handler * @fires {MonthCreation#monthCreationDrag} * @param {object} dragEvent - drag event data */ MonthCreation.prototype._onDrag = function(dragEvent) { var eventData; if (!this.getScheduleData) { return; } eventData = this.getScheduleData(dragEvent.originEvent); if (!eventData) { return; } /** * @event {MonthCreation#monthCreationDrag} * @type {object} * @property {number} x - x index * @property {number} y - y index * @property {Date} date - drag date */ this.fire('monthCreationDrag', eventData); }; /** * DragEnd event handler * @fires {MonthCreation#monthCreationDragend} * @param {object} dragEndEvent - drag end event data */ MonthCreation.prototype._onDragEnd = function(dragEndEvent) { var cache = this._cache; var eventData; var times; this.dragHandler.off({ drag: this._onDrag, dragEnd: this._onDragEnd }, this); if (!this.getScheduleData) { return; } eventData = this.getScheduleData(dragEndEvent.originEvent); if (eventData) { cache.end = new TZDate(eventData.date); cache.isAllDay = true; times = [ cache.start, cache.end ].sort(array.compare.num.asc); cache.start = new TZDate(times[0]); cache.end = datetime.end(times[1]); this._createSchedule(cache); } /** * @event {MonthCreation#monthCreationDragend} * @type {object} * @property {number} x - x index * @property {number} y - y index * @property {Date} date - drag date */ this.fire('monthCreationDragend', eventData); this.getScheduleData = this._cache = null; }; /** * Dblclick event handler * @fires {MonthCreation#monthCreationDragstart} * @param {MouseEvent} e - Native MouseEvent */ MonthCreation.prototype._onDblClick = function(e) { var eventData, range; if (!isElementWeekdayGrid(e.target)) { return; } eventData = getMousePosDate(this.monthView)(e); this.fire('monthCreationClick', eventData); range = this._adjustStartAndEndTime(new TZDate(eventData.date), new TZDate(eventData.date)); this._createSchedule({ start: range.start, end: range.end, isAllDay: false, triggerEvent: eventData.triggerEvent }); this._requestOnClick = false; }; /** * Click event handler * @fires {MonthCreation#monthCreationDragstart} * @param {MouseEvent} e - Native MouseEvent */ MonthCreation.prototype._onClick = function(e) { var self = this; var eventData, range; if (!isElementWeekdayGrid(e.target) || this._disableClick) { return; } eventData = getMousePosDate(this.monthView)(e.originEvent); this._requestOnClick = true; setTimeout(function() { if (self._requestOnClick) { self.fire('monthCreationClick', eventData); range = self._adjustStartAndEndTime(new TZDate(eventData.date), new TZDate(eventData.date)); self._createSchedule({ start: range.start, end: range.end, isAllDay: false, triggerEvent: eventData.triggerEvent }); } self._requestOnClick = false; }, CLICK_DELAY); }; /** * Adjust time to our o'clock * @param {TZDate} start - start time * @param {TZDate} end - end time * @returns {Object} start and end */ MonthCreation.prototype._adjustStartAndEndTime = function(start, end) { var now = new TZDate(); var hours = now.getHours(); var minutes = now.getMinutes(); // adjust start to less time. Adjusting had been greater time in monthly view when clicking grid if (minutes <= 30) { minutes = 0; } else { minutes = 30; } start.setHours(hours, minutes, 0, 0); end.setHours(hours + 1, minutes, 0, 0); return { start: start, end: end }; }; /** * Invoke creation click * @param {Schedule} schedule - schedule instance */ MonthCreation.prototype.invokeCreationClick = function(schedule) { var eventData = { model: schedule }; this.fire('monthCreationClick', eventData); this._createSchedule({ start: schedule.start, end: schedule.end, isAllDay: schedule.isAllDay, triggerEvent: 'manual' }); }; /** * Returns whether the given element is Weekday-Schedule. * @param {HTMLElement} el - target element * @returns {boolean} */ function isElementWeekdayGrid(el) { return domutil.closest(el, config.classname('.weekday-grid')) && !domutil.closest(el, config.classname('.weekday-exceed-in-month')); } util.CustomEvents.mixin(MonthCreation); module.exports = MonthCreation; /***/ }), /***/ "./src/js/handler/month/creationGuide.js": /*!***********************************************!*\ !*** ./src/js/handler/month/creationGuide.js ***! \***********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Creation guide module for month view * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var MonthGuide = __webpack_require__(/*! ./guide */ "./src/js/handler/month/guide.js"); /** * @constructor * @param {MonthCreation} monthCreation - instance of MonthCreation */ function MonthCreationGuide(monthCreation) { /** * @type {MonthCreation} */ this.monthCreation = monthCreation; /** * @type {MonthGuide} */ this.guide = null; monthCreation.on({ monthCreationDragstart: this._createGuideElement, monthCreationDrag: this._onDrag, monthCreationDragend: this._onDragEnd, monthCreationClick: this._createGuideElement }, this); } /** * Destructor */ MonthCreationGuide.prototype.destroy = function() { this.monthCreation.off(this); if (this.guide) { this.guide.destroy(); } this.guide = this.monthCreation = null; }; /** * Drag start event handler * @param {object} dragStartEvent - schedule data from MonthCreation */ MonthCreationGuide.prototype._createGuideElement = function(dragStartEvent) { var options = { isCreationMode: true, height: '100%', top: 0 }; this.guide = new MonthGuide(options, this.monthCreation.monthView); this.guide.start(dragStartEvent); }; /** * Drag event handler * @param {object} dragEvent - schedule data from MonthCreation */ MonthCreationGuide.prototype._onDrag = function(dragEvent) { this.guide.update(dragEvent.x, dragEvent.y); }; /** * Drag end event handler */ MonthCreationGuide.prototype._onDragEnd = function() { // Do nothing. User calls destroy directly. this.guide = null; }; module.exports = MonthCreationGuide; /***/ }), /***/ "./src/js/handler/month/guide.hbs": /*!****************************************!*\ !*** ./src/js/handler/month/guide.hbs ***! \****************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var Handlebars = __webpack_require__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); module.exports = (Handlebars['default'] || Handlebars).template({"1":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=container.escapeExpression, alias2=container.lambda; return "<div class=\"" + alias1(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "month-creation-guide\" style=\"border: " + alias1(alias2(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.border : stack1), depth0)) + "; background-color: " + alias1(alias2(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.backgroundColor : stack1), depth0)) + ";\"></div>\n"; },"3":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda; return "<div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedule\"\n style=\"height: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.scheduleHeight : stack1), depth0)) + "; line-height: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.scheduleHeight : stack1), depth0)) + "; margin-top: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.scheduleGutter : stack1), depth0)) + "; border-radius:" + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.borderRadius : stack1), depth0)) + "; margin-left: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.marginLeft : stack1), depth0)) + "; margin-right: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.marginRight : stack1), depth0)) + ";\n color:" + alias4(((helper = (helper = helpers.color || (depth0 != null ? depth0.color : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"color","hash":{},"data":data}) : helper))) + ";border-color:" + alias4(((helper = (helper = helpers.borderColor || (depth0 != null ? depth0.borderColor : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"borderColor","hash":{},"data":data}) : helper))) + ";background-color:" + alias4(((helper = (helper = helpers.bgColor || (depth0 != null ? depth0.bgColor : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"bgColor","hash":{},"data":data}) : helper))) + "\">\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedule-title\">\n" + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.isAllDay : depth0),{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.program(6, data, 0),"data":data})) != null ? stack1 : "") + " </div>\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-resize-handle handle-y\" style=\"line-height: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.scheduleHeight : stack1), depth0)) + ";\"> </div>\n </div>\n"; },"4":function(container,depth0,helpers,partials,data) { var stack1; return " " + ((stack1 = (helpers["allday-tmpl"] || (depth0 && depth0["allday-tmpl"]) || helpers.helperMissing).call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,{"name":"allday-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "\n"; },"6":function(container,depth0,helpers,partials,data) { var stack1; return " " + ((stack1 = (helpers["time-tmpl"] || (depth0 && depth0["time-tmpl"]) || helpers.helperMissing).call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,{"name":"time-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "\n"; },"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; return "<div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "month-guide-block\" style=\"top:" + alias4(((helper = (helper = helpers.top || (depth0 != null ? depth0.top : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"top","hash":{},"data":data}) : helper))) + ";height:" + alias4(((helper = (helper = helpers.height || (depth0 != null ? depth0.height : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"height","hash":{},"data":data}) : helper))) + ";display:none\">\n" + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.isCreationMode : depth0),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.program(3, data, 0),"data":data})) != null ? stack1 : "") + "</div>\n"; },"useData":true}); /***/ }), /***/ "./src/js/handler/month/guide.js": /*!***************************************!*\ !*** ./src/js/handler/month/guide.js ***! \***************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Guide element controller for creation, resize in month view * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"), common = __webpack_require__(/*! ../../common/common */ "./src/js/common/common.js"), domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"), datetime = __webpack_require__(/*! ../../common/datetime */ "./src/js/common/datetime.js"), TZDate = __webpack_require__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date, tmpl = __webpack_require__(/*! ./guide.hbs */ "./src/js/handler/month/guide.hbs"); var mmax = Math.max, mmin = Math.min, mabs = Math.abs, mfloor = Math.floor; /** * @constructor * @param {object} [options] - options * @param {boolean} [options.useHandle=false] - whether displaying resize handle on * guide element? * @param {boolean} [options.isResizeMode=false] - whether resize mode? * @param {Month} monthView - Month view instance */ function MonthGuide(options, monthView) { var self = this; /** * @type {object} */ this.options = util.extend({ top: 0, height: '20px', bgColor: '#f7ca88', label: 'New event', isResizeMode: false, isCreationMode: false, styles: this._getStyles(monthView.controller.theme) }, options); /** * @type {Month} */ this.view = monthView; /** * @type {WeekdayInMonth[]} */ this.weeks = monthView.children.sort(function(a, b) { return util.stamp(a) - util.stamp(b); }); /** * @type {number} */ this.days = monthView.children.single().getRenderDateRange().length; /** * @type {function} */ this.ratio = util.bind(function(value) { return common.ratio(self.days, 100, value); }); /** * start coordinate of guide effect. (x, y) (days, weeks) effect can't * start lower than this coordinate. * @type {number[]} */ this.startCoord = [0, 0]; /** * @type {Object.<string, HTMLElement>} */ this.guideElements = {}; /** * horizontal grid information * @type {Object} */ this.grids = monthView.grids; } /** * Destructor */ MonthGuide.prototype.destroy = function() { this.clear(); this.options = this.view = this.weeks = this.days = this.ratio = this.startCoord = this.guideElements = null; }; MonthGuide.prototype.clearGuideElement = function() { this.destroy(); }; /** * Get ratio value in week. * @param {number} value - value for calc ratio in week * @returns {number} percent value */ MonthGuide.prototype._getRatioValueInWeek = function(value) { var grid = this.grids[value] || {left: 100}; return grid.left; }; /** * Create guide element * @returns {HTMLElement} guide element */ MonthGuide.prototype._createGuideElement = function() { var guide = document.createElement('div'); guide.innerHTML = tmpl(this.options); return guide.firstChild; }; /** * Get guide element. if not exist then create one * @param {number} y - y coordinate * @returns {?HTMLElement} guide element */ MonthGuide.prototype._getGuideElement = function(y) { var guideElements = this.guideElements, guide = guideElements[y], weekdayView = this.weeks[y], container; if (!weekdayView) { return null; } if (!guide) { guide = this._createGuideElement(); container = weekdayView.container; container.appendChild(guide); guideElements[y] = guide; } return guide; }; /** * Get coordinate by supplied date in month * @param {TZDate} date - date to find coordinate * @returns {number[]} coordinate (x, y) */ MonthGuide.prototype._getCoordByDate = function(date) { var weeks = this.weeks, days = this.days, getIdxFromDiff = function(d1, d2) { return mfloor(datetime.millisecondsTo('day', mabs(d2 - d1))); }, monthStart = datetime.start(weeks[0].options.renderStartDate), isBefore = date < monthStart, start = new TZDate(monthStart), end = new TZDate(monthStart).addDate(isBefore ? -days : days).addDate(-1), x = getIdxFromDiff(date, start), y = 0; while (!datetime.isBetweenWithDate(date, start, end)) { start.addDate(isBefore ? -days : days); end = new TZDate(start).addDate(days - 1); x = getIdxFromDiff(date, start); y += (isBefore ? -1 : 1); } return [x, y]; }; /** * Get limited coordinate by supplied coodinates * @param {number[]} coord - coordinate need to limit * @param {number[]} [min] - minimum limitaion of coordinate * @param {number[]} [max] - maximum limitation of coordinate * @returns {number[]} limited coordiate */ MonthGuide.prototype._getLimitedCoord = function(coord, min, max) { var toIndex = 1, x = coord[0], y = coord[1], result; min = min || [0, 0]; max = max || [this.days - toIndex, this.weeks.length - toIndex]; if (y < min[1]) { result = min.slice(0); } else if (y > max[1]) { result = max.slice(0); } else { x = mmax(min[0], x); x = mmin(max[0], x); result = [x, y]; } return result; }; /** * Prepare guide element modification * @param {object} dragStartEvent - dragStart schedule data from *guide */ MonthGuide.prototype.start = function(dragStartEvent) { var opt = this.options, target = dragStartEvent.target, model = dragStartEvent.model, x = dragStartEvent.x, y = dragStartEvent.y, renderMonth = new TZDate(this.view.options.renderMonth), temp; if (opt.isCreationMode) { if (model && !datetime.isSameMonth(renderMonth, model.start)) { model.start.setMonth(renderMonth.getMonth()); model.start.setDate(1); model.end.setMonth(renderMonth.getMonth()); model.end.setDate(1); } } else { temp = this._getCoordByDate(model.getStarts()); x = temp[0]; y = temp[1]; util.extend(this.options, { top: parseInt(target.style.top, 10) + 'px', height: parseInt(target.style.height, 10) + 'px', label: model.title }, model); } if (util.isUndefined(x) || util.isUndefined(y)) { temp = this._getCoordByDate(model.getStarts()); x = temp[0]; y = temp[1]; } this.startCoord = [x, y]; this.update(x, y); }; /** * Data for update several guide elements * @typedef UpdateIndication * @type {object} * @property {HTMLElement} guide - guide element * @property {number} left - left style value * @property {number} width - width style value * @property {boolean} [exceedL=false] - whether schedule is exceeded past weeks? * @property {boolean} [exceedR=false] - whether schedule is exceeded future weeks? */ /** * Modify HTML element that uses for guide element * @param {UpdateIndication[]} inds - indication of update severel guide element */ MonthGuide.prototype._updateGuides = function(inds) { util.forEach(inds, function(ind) { var guide = ind.guide, exceedLClass = config.classname('month-exceed-left'), exceedRClass = config.classname('month-exceed-right'); guide.style.display = 'block'; guide.style.left = ind.left + '%'; guide.style.width = ind.width + '%'; if (ind.exceedL) { domutil.addClass(guide, exceedLClass); } else { domutil.removeClass(guide, exceedLClass); } if (ind.exceedR) { domutil.addClass(guide, exceedRClass); } else { domutil.removeClass(guide, exceedRClass); } }); }; /** * Get guide element indicate for origin week * @param {number[]} startCoord - drag start coordinate * @param {number[]} mouseCoord - mouse coordinate * @returns {object} indicate */ MonthGuide.prototype._getOriginIndicate = function(startCoord, mouseCoord) { var left = mmin(startCoord[0], mouseCoord[0]), right = mmax(startCoord[0], mouseCoord[0]) + 1, exceedL, exceedR; if (mouseCoord[1] > startCoord[1]) { left = startCoord[0]; right = this.days; exceedR = true; } else if (mouseCoord[1] < startCoord[1]) { left = 0; right = startCoord[0] + 1; exceedL = true; } return { left: this._getRatioValueInWeek(left), width: this._getRatioValueInWeek(right) - this._getRatioValueInWeek(left), exceedL: exceedL, exceedR: exceedR }; }; /** * Get guide element indicate for week related with mouse position * @param {number[]} startCoord - drag start coordinate * @param {number[]} mouseCoord - mouse coordinate * @returns {object} indicate */ MonthGuide.prototype._getMouseIndicate = function(startCoord, mouseCoord) { var left = mouseCoord[0], right = mouseCoord[0] + 1, exceedL, exceedR; if (mouseCoord[1] > startCoord[1]) { left = 0; exceedL = true; } else if (mouseCoord[1] < startCoord[1]) { right = this.days; exceedR = true; } return { left: this._getRatioValueInWeek(left), width: this._getRatioValueInWeek(right) - this._getRatioValueInWeek(left), exceedL: exceedL, exceedR: exceedR }; }; /** * Get guide element indicate for contained weeks * @returns {object} indicate */ MonthGuide.prototype._getContainIndicate = function() { return { left: 0, width: 100, exceedL: true, exceedR: true }; }; /** * Remove several guide element that supplied by parameter * @param {number[]} yCoords - array of y coordinate to remove guide element */ MonthGuide.prototype._removeGuideElements = function(yCoords) { var guides = this.guideElements; util.forEach(yCoords, function(y) { domutil.remove(guides[y]); delete guides[y]; }); }; /** * Get excluded numbers in range * @param {number[]} range - the range. value must be sequencial. * @param {number[]} numbers - numbers to check * @returns {number[]} excluded numbers */ MonthGuide.prototype._getExcludesInRange = function(range, numbers) { var min = mmin.apply(null, range), max = mmax.apply(null, range), excludes = []; util.forEach(numbers, function(num) { num = parseInt(num, 10); if (num < min || num > max) { excludes.push(num); } }); return excludes; }; /** * Update guide elements by coordinate in month grid from mousemove event * @param {number} x - x coordinate * @param {number} y - y coordinate */ MonthGuide.prototype.update = function(x, y) { var self = this, startCoord = this.startCoord, mouseCoord = [x, y], limitedCoord = this.options.isResizeMode ? this._getLimitedCoord(mouseCoord, startCoord) : mouseCoord, renderedYIndex = util.keys(this.guideElements), yCoordsToUpdate = util.range( mmin(startCoord[1], limitedCoord[1]), mmax(startCoord[1], limitedCoord[1]) + 1 ), yCoordsToRemove = this._getExcludesInRange( yCoordsToUpdate, renderedYIndex ), renderIndication = {}; this._removeGuideElements(yCoordsToRemove); util.forEach(yCoordsToUpdate, function(guideYCoord) { var guide = self._getGuideElement(guideYCoord), indicate; if (!guide) { return; } if (guideYCoord === startCoord[1]) { indicate = self._getOriginIndicate(startCoord, limitedCoord); } else if (guideYCoord === mouseCoord[1]) { indicate = self._getMouseIndicate(startCoord, mouseCoord); } else { indicate = self._getContainIndicate(); } renderIndication[guideYCoord] = util.extend({ guide: guide }, indicate); }); this._updateGuides(renderIndication); }; /** * Clear all guide elements */ MonthGuide.prototype.clear = function() { util.forEach(this.guideElements, function(element) { domutil.remove(element); }); this.guideElements = {}; }; /** * Get the styles from theme * @param {Theme} theme - theme instance * @returns {object} styles - styles object */ MonthGuide.prototype._getStyles = function(theme) { var styles = {}; if (theme) { styles.border = theme.common.creationGuide.border; styles.backgroundColor = theme.common.creationGuide.backgroundColor; styles.scheduleHeight = theme.month.schedule.height; styles.scheduleGutter = theme.month.schedule.marginTop; styles.marginLeft = theme.month.schedule.marginLeft; styles.marginRight = theme.month.schedule.marginRight; styles.borderRadius = theme.month.schedule.borderRadius; } return styles; }; module.exports = MonthGuide; /***/ }), /***/ "./src/js/handler/month/move.js": /*!**************************************!*\ !*** ./src/js/handler/month/move.js ***! \**************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Move handler for month view * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"), domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"), datetime = __webpack_require__(/*! ../../common/datetime */ "./src/js/common/datetime.js"), getMousePosData = __webpack_require__(/*! ./core */ "./src/js/handler/month/core.js"), MonthMoveGuide = __webpack_require__(/*! ./moveGuide */ "./src/js/handler/month/moveGuide.js"), TZDate = __webpack_require__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date; /** * @constructor * @mixes CustomEvents * @param {Drag} dragHandler - Drag handler instance. * @param {Month} monthView - Month view instance. * @param {Base} baseController - Base controller instance. */ function MonthMove(dragHandler, monthView, baseController) { /** * @type {Drag} */ this.dragHandler = dragHandler; /** * @type {Month} */ this.monthView = monthView; /** * @type {Base} */ this.baseController = baseController; /** * @type {function} */ this.getScheduleData = null; /** * @type {object} */ this._cache = null; /** * @type {MonthMoveGuide} */ this.guide = new MonthMoveGuide(this); dragHandler.on('dragStart', this._onDragStart, this); } /** * Destructor */ MonthMove.prototype.destroy = function() { this.dragHandler.off(this); this.dragHandler = this.monthView = this.baseController = null; }; /** * Update target schedule * @fires {MonthMove#beforeUpdateSchedule} * @param {object} scheduleCache - cache object that result of single dragging * session. */ MonthMove.prototype.updateSchedule = function(scheduleCache) { var schedule = scheduleCache.model; var duration = schedule.duration(); var startDateRaw = datetime.raw(schedule.start); var dragEndTime = new TZDate(scheduleCache.end); var newStartDate = new TZDate(dragEndTime); newStartDate.setHours(startDateRaw.h, startDateRaw.m, startDateRaw.s, startDateRaw.ms); /** * @event MonthMove#beforeUpdateSchedule * @type {object} * @property {Schedule} schedule - schedule instance to update * @property {Date} start - start time to update * @property {Date} end - end time to update */ this.fire('beforeUpdateSchedule', { schedule: schedule, start: newStartDate, end: new TZDate(newStartDate).addMilliseconds(duration) }); }; /** * Get schedule block to clone for month guide effect * @param {HTMLElement} target - target element that related with drag schedule * @returns {HTMLElement} element to create guide effect */ MonthMove.prototype.getMonthScheduleBlock = function(target) { var blockSelector = config.classname('.weekday-schedule-block'); return domutil.closest(target, blockSelector); }; /** * Get schedule block from more layer * @param {HTMLElement} target - element to check * @returns {HTMLElement} schedule element */ MonthMove.prototype.getMoreLayerScheduleBlock = function(target) { var className = config.classname('.month-more-schedule'); return domutil.closest(target, className); }; /** * Check handler has permission to handle fired schedule * @fires {MonthMove#monthMoveStart_from_morelayer} * @param {HTMLElement} target - target element of fired schedule * @returns {(string|null)} model instance ID related with schedule. if handle * has not permission to handle the schedule then return null. */ MonthMove.prototype.hasPermissionToHandle = function(target) { var modelID = null; var blockElement; if (domutil.hasClass(target, config.classname('weekday-resize-handle'))) { return null; } blockElement = this.getMonthScheduleBlock(target); if (blockElement) { modelID = domutil.getData(blockElement, 'id'); } else { blockElement = this.getMoreLayerScheduleBlock(target); if (blockElement) { modelID = domutil.getData(blockElement, 'id'); /** * Fire for notificate that the drag schedule start at more layer view. * @event {MonthMove#monthMoveStart_from_morelayer} */ this.fire('monthMoveStart_from_morelayer'); } } return modelID; }; /** * Event handler for Drag#dragStart * @fires {MonthMove#monthMoveDragstart} * @param {object} dragStartEvent - drag start schedule data */ MonthMove.prototype._onDragStart = function(dragStartEvent) { var target = dragStartEvent.target, modelID = this.hasPermissionToHandle(target), model = this.baseController.schedules.items[modelID], scheduleData; if (!modelID || !model || model.isReadOnly || model.isPending) { return; } this.dragHandler.on({ drag: this._onDrag, dragEnd: this._onDragEnd }, this); this.getScheduleData = getMousePosData(this.monthView); scheduleData = this.getScheduleData(dragStartEvent.originEvent); scheduleData.originEvent = dragStartEvent.originEvent; scheduleData.target = this.getMonthScheduleBlock(target); scheduleData.model = model; this._cache = { model: model, target: target, start: new TZDate(Number(scheduleData.date)) }; /** * @event {MonthMove#monthMoveDragstart} * @type {object} * @property {number} x - x index * @property {number} y - y index * @property {Date} date - drag date * @property {HTMLElement} target - schedule block element * @property {Schedule} model - model instance */ this.fire('monthMoveDragstart', scheduleData); }; /** * @fires {MonthMove#monthMoveDrag} * @param {object} dragEvent - drag event data */ MonthMove.prototype._onDrag = function(dragEvent) { var scheduleData; if (!this.getScheduleData) { return; } scheduleData = util.extend({ originEvent: dragEvent.originEvent }, this.getScheduleData(dragEvent.originEvent)); if (!scheduleData) { return; } /** * @event {MonthMove#monthMoveDrag} * @type {object} * @property {number} x - x index * @property {number} y - y index * @property {Date} date - drag date */ this.fire('monthMoveDrag', scheduleData); }; /** * Event handler for Drag#dragEnd * @fires {MonthMove#monthMoveDragend} * @param {object} dragEndEvent - dragend event data */ MonthMove.prototype._onDragEnd = function(dragEndEvent) { var cache = this._cache; var scheduleData; this.dragHandler.off({ drag: this._onDrag, dragEnd: this._onDragEnd }, this); if (!this.getScheduleData) { return; } scheduleData = this.getScheduleData(dragEndEvent.originEvent); if (scheduleData) { cache.end = new TZDate(scheduleData.date); this.updateSchedule(cache); } /** * @event {MonthResize#monthMoveDragend} * @type {object} * @property {number} x - x index * @property {number} y - y index * @property {Date} date - drag date */ this.fire('monthMoveDragend', scheduleData); this.getScheduleData = this._cache = null; }; util.CustomEvents.mixin(MonthMove); module.exports = MonthMove; /***/ }), /***/ "./src/js/handler/month/moveGuide.hbs": /*!********************************************!*\ !*** ./src/js/handler/month/moveGuide.hbs ***! \********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var Handlebars = __webpack_require__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); module.exports = (Handlebars['default'] || Handlebars).template({"1":function(container,depth0,helpers,partials,data) { var stack1; return " border-left:3px solid " + container.escapeExpression(container.lambda(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.borderColor : stack1), depth0)) + ";\n "; },"3":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; return " <span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedule-bullet " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedule-bullet-focused\" style=\"top: " + alias4(container.lambda(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.scheduleBulletTop : stack1), depth0)) + "px;\"></span>\n"; },"5":function(container,depth0,helpers,partials,data) { var helper; return container.escapeExpression(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedule-title-focused\""; },"7":function(container,depth0,helpers,partials,data) { var stack1; return " " + ((stack1 = (helpers["allday-tmpl"] || (depth0 && depth0["allday-tmpl"]) || helpers.helperMissing).call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.model : depth0),{"name":"allday-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "\n"; },"9":function(container,depth0,helpers,partials,data) { var stack1; return " " + ((stack1 = (helpers["time-tmpl"] || (depth0 && depth0["time-tmpl"]) || helpers.helperMissing).call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.model : depth0),{"name":"time-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "\n"; },"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda; return "<div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "month-guide " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "month-guide-focused\"\n style=\"top: -50%;\n left: -50%;\n width: 100%;\n color: #ffffff;\n background-color:" + alias4(alias5(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.dragBgColor : stack1), depth0)) + ";\n height:" + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.scheduleHeight : stack1), depth0)) + "px;\n line-height:" + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.scheduleHeight : stack1), depth0)) + "px;\n border-radius: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.borderRadius : stack1), depth0)) + ";\n" + ((stack1 = helpers["if"].call(alias1,((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.isAllDay : stack1),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\">\n" + ((stack1 = helpers.unless.call(alias1,((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.isAllDay : stack1),{"name":"unless","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + " <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "month-move-guide " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedule-title " + ((stack1 = helpers.unless.call(alias1,((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.isAllDay : stack1),{"name":"unless","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + ">\n" + ((stack1 = helpers["if"].call(alias1,((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.isAllDay : stack1),{"name":"if","hash":{},"fn":container.program(7, data, 0),"inverse":container.program(9, data, 0),"data":data})) != null ? stack1 : "") + " </div>\n</div>\n<div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "month-guide-cover\" style=\"height:" + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.scheduleHeight : stack1), depth0)) + "px; border-radius: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.borderRadius : stack1), depth0)) + ";\"></div>\n"; },"useData":true}); /***/ }), /***/ "./src/js/handler/month/moveGuide.js": /*!*******************************************!*\ !*** ./src/js/handler/month/moveGuide.js ***! \*******************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(global) {/** * @fileoverview Module for modification of guide element for move in month view * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"), domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"), domevent = __webpack_require__(/*! ../../common/domevent */ "./src/js/common/domevent.js"), FloatingLayer = __webpack_require__(/*! ../../common/floatingLayer */ "./src/js/common/floatingLayer.js"), tmpl = __webpack_require__(/*! ./moveGuide.hbs */ "./src/js/handler/month/moveGuide.hbs"), Schedule = __webpack_require__(/*! ../../model/schedule */ "./src/js/model/schedule.js"); /** * @constructor * @param {MonthMove} monthMove - month/move module instance */ function MonthMoveGuide(monthMove) { /** * @type {MonthMove} */ this.monthMove = monthMove; /** * @type {HTMLElement[]} */ this.elements = null; /** * @type {FloatingLayer} */ this.layer = null; monthMove.on({ monthMoveDragstart: this._onDragStart, monthMoveDrag: this._onDrag, monthMoveDragend: this._onDragEnd }, this); } /** * Destructor */ MonthMoveGuide.prototype.destroy = function() { this.monthMove.off(this); this._clearGridBgColor(); if (this.layer) { this.layer.destroy(); } if (this.element) { domutil.remove(this.element); } this.monthMove = this.elements = this.layer = null; }; /** * Hide element blocks for resize effect * @param {number} modelID - Schedule model instance ID */ MonthMoveGuide.prototype._hideOriginScheduleBlocks = function(modelID) { var className = config.classname('weekday-schedule-block-dragging-dim'); this.elements = domutil.find( config.classname('.weekday-schedule-block-' + modelID), this.monthMove.monthView.container, true ); util.forEach(this.elements, function(el) { domutil.addClass(el, className); }); }; /** * Show element blocks */ MonthMoveGuide.prototype._showOriginScheduleBlocks = function() { var className = config.classname('weekday-schedule-block-dragging-dim'); util.forEach(this.elements, function(el) { domutil.removeClass(el, className); }); }; /** * Clear background color for filled grid element. */ MonthMoveGuide.prototype._clearGridBgColor = function() { var selector = config.classname('.weekday-filled'), className = config.classname('weekday-filled'), beforeGridElement = domutil.find(selector, this.monthMove.monthView.container); if (beforeGridElement) { domutil.removeClass(beforeGridElement, className); } }; /** * Fill background color of date grids relatied with model updates. * @param {object} dragEvent - drag event data from MonthMoveGuide#_onDrag */ MonthMoveGuide.prototype._updateGridBgColor = function(dragEvent) { var gridElements = domutil.find(config.classname('.weekday-grid-line'), this.monthMove.monthView.container, true), className = config.classname('weekday-filled'), targetIndex = (dragEvent.x + (dragEvent.sizeX * dragEvent.y)); this._clearGridBgColor(); if (!gridElements || !gridElements[targetIndex]) { return; } domutil.addClass(gridElements[targetIndex], className); }; /** * Handler for MonthMove#dragStart * @param {object} dragStartEvent - dragStart schedule data object */ MonthMoveGuide.prototype._onDragStart = function(dragStartEvent) { var monthView = this.monthMove.monthView, firstWeekdayView = monthView.children.single(), weekdayOptions = firstWeekdayView.options, widthPercent = 100 / firstWeekdayView.getRenderDateRange().length, height = weekdayOptions.scheduleGutter + weekdayOptions.scheduleHeight, container = monthView.container, mousePos = domevent.getMousePosition(dragStartEvent.originEvent, container), model = dragStartEvent.model, layer = new FloatingLayer(null, container); this._hideOriginScheduleBlocks(model.cid()); this.layer = layer; layer.setSize(widthPercent + '%', height); layer.setPosition(mousePos[0], mousePos[1]); layer.setContent(tmpl({ model: util.extend( Schedule.create(model), model ), styles: { scheduleHeight: weekdayOptions.scheduleHeight, scheduleBulletTop: weekdayOptions.scheduleHeight / 3, borderRadius: monthView.controller.theme.month.schedule.borderRadius } })); layer.show(); if (!util.browser.msie) { domutil.addClass(global.document.body, config.classname('dragging')); } }; /** * Handler for MonthMove#drag * @param {object} dragEvent - drag event data object */ MonthMoveGuide.prototype._onDrag = function(dragEvent) { var container = this.monthMove.monthView.container, mousePos = domevent.getMousePosition( dragEvent.originEvent, container ); this._updateGridBgColor(dragEvent); if (!this.layer) { return; } this.layer.setPosition(mousePos[0], mousePos[1]); }; /** * Handler for MonthMove#dragEnd */ MonthMoveGuide.prototype._onDragEnd = function() { this._showOriginScheduleBlocks(); if (!util.browser.msie) { domutil.removeClass(global.document.body, config.classname('dragging')); } this._clearGridBgColor(); this.layer.destroy(); this.layer = null; }; module.exports = MonthMoveGuide; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) /***/ }), /***/ "./src/js/handler/month/resize.js": /*!****************************************!*\ !*** ./src/js/handler/month/resize.js ***! \****************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Module for resize schedule in month view * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"), datetime = __webpack_require__(/*! ../../common/datetime */ "./src/js/common/datetime.js"), domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"), getMousePosData = __webpack_require__(/*! ./core */ "./src/js/handler/month/core.js"), MonthResizeGuide = __webpack_require__(/*! ./resizeGuide */ "./src/js/handler/month/resizeGuide.js"), TZDate = __webpack_require__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date; /** * @constructor * @param {Drag} dragHandler - Drag handler instance. * @param {Month} monthView - Month view instance. * @param {Base} baseController - Base controller instance. */ function MonthResize(dragHandler, monthView, baseController) { /** * @type {Drag} */ this.dragHandler = dragHandler; /** * @type {Month} */ this.monthView = monthView; /** * @type {Base} */ this.baseController = baseController; /** * @type {function} */ this.getScheduleData = null; /** * @type {object} */ this._cache = null; /** * @type {MonthResizeGuide} */ this.guide = new MonthResizeGuide(this); dragHandler.on('dragStart', this._onDragStart, this); } /** * Destructor */ MonthResize.prototype.destroy = function() { this.dragHandler.off(this); this.dragHandler = this.monthView = this.baseController = null; }; /** * Fire event for update model * @fires {MonthResize#beforeUpdateSchedule} * @param {object} scheduleCache - cache object that result of single dragging * session. */ MonthResize.prototype._updateSchedule = function(scheduleCache) { // You can not change the start date of the event. Only the end time can be changed. var newEnd = datetime.end(new TZDate(scheduleCache.end)), schedule = scheduleCache.schedule; /** * @event MonthResize#beforeUpdateSchedule * @type {object} * @property {Schedule} schedule - schedule instance to update * @property {Date} start - start time to update * @property {Date} end - end time to update */ this.fire('beforeUpdateSchedule', { schedule: schedule, start: new TZDate(schedule.getStarts()), end: newEnd }); }; /** * Event handler for Drag#dragStart * @fires {MonthResize#monthResizeDragstart} * @param {object} dragStartEvent - drag start event data */ MonthResize.prototype._onDragStart = function(dragStartEvent) { var target = dragStartEvent.target, modelID, schedule, scheduleData; if (!domutil.hasClass(target, config.classname('weekday-resize-handle'))) { return; } target = domutil.closest(target, config.classname('.weekday-schedule-block')); if (!target) { return; } modelID = domutil.getData(target, 'id'); schedule = this.baseController.schedules.items[modelID]; this.dragHandler.on({ drag: this._onDrag, dragEnd: this._onDragEnd }, this); this.getScheduleData = getMousePosData(this.monthView); scheduleData = this.getScheduleData(dragStartEvent.originEvent); scheduleData.target = target; scheduleData.model = schedule; this._cache = { schedule: schedule, target: target, start: new TZDate(scheduleData.date) }; /** * @event {MonthCreation#monthResizeDragstart} * @type {object} * @property {number} x - x index * @property {number} y - y index * @property {Date} date - drag date * @property {HTMLElement} target - schedule block element * @property {Schedule} model - model instance */ this.fire('monthResizeDragstart', scheduleData); }; /** * @fires {MonthResize#monthResizeDrag} * @param {object} dragEvent - drag event data */ MonthResize.prototype._onDrag = function(dragEvent) { var scheduleData; if (!this.getScheduleData) { return; } scheduleData = this.getScheduleData(dragEvent.originEvent); if (!scheduleData) { return; } /** * @event {MonthResize#monthResizeDrag} * @type {object} * @property {number} x - x index * @property {number} y - y index * @property {Date} date - drag date */ this.fire('monthResizeDrag', scheduleData); }; /** * @fires {MonthResize#monthResizeDragend} * @param {object} dragEndEvent - drag end event data */ MonthResize.prototype._onDragEnd = function(dragEndEvent) { var cache = this._cache; var scheduleData; var start, end; this.dragHandler.off({ drag: this._onDrag, dragEnd: this._onDragEnd }, this); if (!this.getScheduleData) { return; } scheduleData = this.getScheduleData(dragEndEvent.originEvent); if (scheduleData) { start = new TZDate(cache.schedule.getStarts()); end = new TZDate(scheduleData.date); cache.end = end; if (start <= cache.end) { this._updateSchedule(cache); } } /** * @event {MonthResize#monthResizeDragend} * @type {object} * @property {number} x - x index * @property {number} y - y index * @property {Date} date - drag date */ this.fire('monthResizeDragend', scheduleData); this.getScheduleData = this._cache = null; }; util.CustomEvents.mixin(MonthResize); module.exports = MonthResize; /***/ }), /***/ "./src/js/handler/month/resizeGuide.js": /*!*********************************************!*\ !*** ./src/js/handler/month/resizeGuide.js ***! \*********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(global) {/** * @fileoverview Module for modification of guide element in schedule resize * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"), domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"), MonthGuide = __webpack_require__(/*! ./guide */ "./src/js/handler/month/guide.js"); /** * @constructor * @param {MonthResize} monthResize - month/resize module instance */ function MonthResizeGuide(monthResize) { /** * @type {MonthResize} */ this.monthResize = monthResize; /** * @type {HTMLElement[]} */ this.elements = null; /** * @type {MonthGuide} */ this.guide = null; monthResize.on({ monthResizeDragstart: this._onDragStart, monthResizeDrag: this._onDrag, monthResizeDragend: this._onDragEnd }, this); } /** * Destructor */ MonthResizeGuide.prototype.destroy = function() { this.monthResize.off(this); this.guide.destroy(); this.guide = this.monthResize = null; }; /** * Hide element blocks for resize effect * @param {number} modelID - Schedule model instance ID */ MonthResizeGuide.prototype._hideScheduleBlocks = function(modelID) { this.elements = domutil.find( config.classname('.weekday-schedule-block-' + modelID), this.monthResize.monthView.container, true ); util.forEach(this.elements, function(el) { el.style.display = 'none'; }); }; /** * Show element blocks */ MonthResizeGuide.prototype._showScheduleBlocks = function() { util.forEach(this.elements, function(el) { el.style.display = 'block'; }); }; /** * Drag start event handler * @param {object} dragStartEvent - schedule data from MonthResize */ MonthResizeGuide.prototype._onDragStart = function(dragStartEvent) { this.guide = new MonthGuide({ isResizeMode: true }, this.monthResize.monthView); this.guide.start(dragStartEvent); this._hideScheduleBlocks(dragStartEvent.model.cid()); if (!util.browser.msie) { domutil.addClass(global.document.body, config.classname('resizing-x')); } }; /** * Drag event handler * @param {object} dragEvent - event data from MonthCreation */ MonthResizeGuide.prototype._onDrag = function(dragEvent) { this.guide.update(dragEvent.x, dragEvent.y); }; /** * Drag end event handler */ MonthResizeGuide.prototype._onDragEnd = function() { this._showScheduleBlocks(); this.guide.destroy(); this.elements = this.guide = null; if (!util.browser.msie) { domutil.removeClass(global.document.body, config.classname('resizing-x')); } }; module.exports = MonthResizeGuide; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) /***/ }), /***/ "./src/js/handler/time/click.js": /*!**************************************!*\ !*** ./src/js/handler/time/click.js ***! \**************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Allday event click event hander module * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"); var domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); /** * @constructor * @implements {Handler} * @mixes util.CustomEvents * @param {Drag} [dragHandler] - Drag handler instance. * @param {TimeGrid} [timeGridView] - TimeGrid view instance. * @param {Base} [baseController] - Base controller instance. */ function TimeClick(dragHandler, timeGridView, baseController) { /** * @type {Drag} */ this.dragHandler = dragHandler; /** * @type {TimeGrid} */ this.timeGridView = timeGridView; /** * @type {Base} */ this.baseController = baseController; dragHandler.on({ 'click': this._onClick }, this); } /** * Destroy method */ TimeClick.prototype.destroy = function() { this.dragHandler.off(this); this.timeGridView = this.baseController = this.dragHandler = null; }; /** * Check target element is expected condition for activate this plugins. * @param {HTMLElement} target - The element to check * @returns {string} - model id */ TimeClick.prototype.checkExpectCondition = function(target) { var container, matches; container = domutil.closest(target, config.classname('.time-date')); if (!container) { return false; } matches = domutil.getClass(container).match(config.time.getViewIDRegExp); if (!matches || matches.length < 2) { return false; } return util.pick(this.timeGridView.children.items, Number(matches[1])); }; /** * Click event hander * @param {object} clickEvent - click event from {@link Drag} * @emits TimeClick#clickEvent */ TimeClick.prototype._onClick = function(clickEvent) { var self = this, target = clickEvent.target, timeView = this.checkExpectCondition(target), blockElement = domutil.closest(target, config.classname('.time-date-schedule-block')), schedulesCollection = this.baseController.schedules; if (!timeView || !blockElement) { return; } schedulesCollection.doWhenHas(domutil.getData(blockElement, 'id'), function(schedule) { /** * @events TimeClick#clickSchedule * @type {object} * @property {Schedule} schedule - schedule instance * @property {MouseEvent} event - MouseEvent object */ self.fire('clickSchedule', { schedule: schedule, event: clickEvent.originEvent }); }); }; util.CustomEvents.mixin(TimeClick); module.exports = TimeClick; /***/ }), /***/ "./src/js/handler/time/clickDayname.js": /*!*********************************************!*\ !*** ./src/js/handler/time/clickDayname.js ***! \*********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Dayname click event hander module * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"); var domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); /** * @constructor * @implements {Handler} * @mixes util.CustomEvents * @param {Drag} [dragHandler] - Drag handler instance. * @param {DayName} [dayNameView] - DayName view instance. * @param {Base} [baseController] - Base controller instance. */ function DayNameClick(dragHandler, dayNameView, baseController) { /** * @type {Drag} */ this.dragHandler = dragHandler; /** * @type {DayName} */ this.dayNameView = dayNameView; /** * @type {Base} */ this.baseController = baseController; dragHandler.on({ 'click': this._onClick }, this); } /** * Destroy method */ DayNameClick.prototype.destroy = function() { this.dragHandler.off(this); this.dayNameView = this.baseController = this.dragHandler = null; }; /** * Check target element is expected condition for activate this plugins. * @param {HTMLElement} target - The element to check * @returns {string} - model id */ DayNameClick.prototype.checkExpectCondition = function(target) { var container = domutil.closest(target, config.classname('.dayname-date-area')); if (!container) { return false; } return true; }; /** * Click event hander * @param {object} clickEvent - click event from {@link Drag} * @emits DayNameClick#clickDayname */ DayNameClick.prototype._onClick = function(clickEvent) { var self = this, target = clickEvent.target, daynameView = this.checkExpectCondition(target), blockElement = domutil.closest(target, config.classname('.dayname')); if (!daynameView || !blockElement) { return; } /** * @events DayNameClick#clickDayname * @type {object} * @property {string} date - click date */ self.fire('clickDayname', { date: domutil.getData(blockElement, 'date') }); }; util.CustomEvents.mixin(DayNameClick); module.exports = DayNameClick; /***/ }), /***/ "./src/js/handler/time/core.js": /*!*************************************!*\ !*** ./src/js/handler/time/core.js ***! \*************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Core methods for dragging actions * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var common = __webpack_require__(/*! ../../common/common */ "./src/js/common/common.js"); var datetime = __webpack_require__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); var domevent = __webpack_require__(/*! ../../common/domevent */ "./src/js/common/domevent.js"); var Point = __webpack_require__(/*! ../../common/point */ "./src/js/common/point.js"); var TZDate = __webpack_require__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date; /** * @mixin Time.Core */ var timeCore = { /** * Get Y index ratio(hour) in time grids by supplied parameters. * @param {number} baseMil - base milliseconds number for supplied height. * @param {number} height - container element height. * @param {number} y - Y coordinate to calculate hour ratio. * @returns {number} hour index ratio value. */ _calcGridYIndex: function(baseMil, height, y) { // get ratio from right expression > point.y : x = session.height : baseMil // and convert milliseconds value to hours. var result = datetime.millisecondsTo('hour', (y * baseMil) / height), floored = result | 0, nearest = common.nearest(result - floored, [0, 1]); return floored + (nearest ? 0.5 : 0); }, /** * Get function to makes event data from Time and mouseEvent * @param {Time} timeView - Instance of time view. * @returns {function} - Function that return event data from mouse event. */ _retriveScheduleData: function(timeView) { var self = this, container = timeView.container, options = timeView.options, viewHeight = timeView.getViewBound().height, viewTime = timeView.getDate(), hourLength = options.hourEnd - options.hourStart, baseMil = datetime.millisecondsFrom('hour', hourLength); /** * @param {MouseEvent} mouseEvent - mouse event object to get common event data. * @param {object} [extend] - object to extend event data before return. * @returns {object} - common event data for time.* */ return util.bind(function(mouseEvent, extend) { var mouseY = Point.n(domevent.getMousePosition(mouseEvent, container)).y, gridY = common.ratio(viewHeight, hourLength, mouseY), timeY = new TZDate(viewTime).addMinutes(datetime.minutesFromHours(gridY)), nearestGridY = self._calcGridYIndex(baseMil, viewHeight, mouseY), nearestGridTimeY = new TZDate(viewTime).addMinutes( datetime.minutesFromHours(nearestGridY + options.hourStart) ); return util.extend({ target: mouseEvent.target || mouseEvent.srcElement, relatedView: timeView, originEvent: mouseEvent, mouseY: mouseY, gridY: gridY, timeY: timeY, nearestGridY: nearestGridY, nearestGridTimeY: nearestGridTimeY, triggerEvent: mouseEvent.type }, extend); }, this); }, /** * Get function to makes event data from Time and mouseEvent * @param {Time} timeView - Instance of time view. * @param {number} xIndex - Time view index * @returns {function} - Function that return event data from mouse event. */ _retriveScheduleDataFromDate: function(timeView) { var viewTime = timeView.getDate(); /** * @param {TZDate} startDate - start date * @param {TZDate} endDate - end date * @param {number} hourStart Can limit of render hour start. * @returns {object} - common event data for time.* */ return util.bind(function(startDate, endDate, hourStart) { var gridY, timeY, nearestGridY, nearestGridTimeY, nearestGridEndY, nearestGridEndTimeY; gridY = startDate.getHours() - hourStart + getNearestHour(startDate.getMinutes()); timeY = new TZDate(viewTime).addMinutes(datetime.minutesFromHours(gridY)); nearestGridY = gridY; nearestGridTimeY = new TZDate(viewTime).addMinutes(datetime.minutesFromHours(nearestGridY)); nearestGridEndY = endDate.getHours() - hourStart + getNearestHour(endDate.getMinutes()); nearestGridEndTimeY = new TZDate(viewTime).addMinutes(datetime.minutesFromHours(nearestGridEndY)); return util.extend({ target: timeView, relatedView: timeView, gridY: gridY, timeY: timeY, nearestGridY: nearestGridY, nearestGridTimeY: nearestGridTimeY, nearestGridEndY: nearestGridEndY, nearestGridEndTimeY: nearestGridEndTimeY, triggerEvent: 'manual', hourStart: hourStart }); }, this); }, /** * Mixin method. * @param {(TimeCreation|TimeMove)} obj - Constructor functions */ mixin: function(obj) { var proto = obj.prototype; util.forEach(timeCore, function(method, methodName) { if (methodName === 'mixin') { return; } proto[methodName] = method; }); } }; /** * Get the nearest hour * @param {number} minutes - minutes * @returns {number} hour */ function getNearestHour(minutes) { var nearestHour; if (minutes === 0) { nearestHour = 0; } else if (minutes > 30) { nearestHour = 1; } else if (minutes <= 30) { nearestHour = 0.5; } return nearestHour; } module.exports = timeCore; /***/ }), /***/ "./src/js/handler/time/creation.js": /*!*****************************************!*\ !*** ./src/js/handler/time/creation.js ***! \*****************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Handling creation events from drag handler and time grid view * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"); var array = __webpack_require__(/*! ../../common/array */ "./src/js/common/array.js"); var datetime = __webpack_require__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); var domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); var domevent = __webpack_require__(/*! ../../common/domevent */ "./src/js/common/domevent.js"); var common = __webpack_require__(/*! ../../common/common */ "./src/js/common/common.js"); var TimeCreationGuide = __webpack_require__(/*! ./creationGuide */ "./src/js/handler/time/creationGuide.js"); var TZDate = __webpack_require__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date; var timeCore = __webpack_require__(/*! ./core */ "./src/js/handler/time/core.js"); var CLICK_DELAY = 300; /** * @constructor * @implements {Handler} * @mixes timeCore * @mixes CustomEvents * @param {Drag} [dragHandler] - Drag handler instance. * @param {TimeGrid} [timeGridView] - TimeGrid view instance. * @param {Base} [baseController] - Base controller instance. * @param {Options} [options] - calendar Options */ function TimeCreation(dragHandler, timeGridView, baseController, options) { /** * Drag handler instance. * @type {Drag} */ this.dragHandler = dragHandler; /** * TimeGrid view instance. * @type {TimeGrid} */ this.timeGridView = timeGridView; /** * Base controller instance. * @type {Base} */ this.baseController = baseController; /** * @type {TimeCreationGuide} */ this.guide = new TimeCreationGuide(this); /** * Temporary function for single drag session's calc. * @type {function} */ this._getScheduleDataFunc = null; /** * Temporary function for drag start data cache. * @type {object} */ this._dragStart = null; /** * @type {boolean} */ this._requestOnClick = false; /** * @type {boolean} */ this._disableDblClick = options.disableDblClick; /** * @type {boolean} */ this._disableClick = options.disableClick; dragHandler.on('dragStart', this._onDragStart, this); dragHandler.on('click', this._onClick, this); if (this._disableDblClick) { CLICK_DELAY = 0; } else { domevent.on(timeGridView.container, 'dblclick', this._onDblClick, this); } } /** * Destroy method */ TimeCreation.prototype.destroy = function() { var timeGridView = this.timeGridView; this.guide.destroy(); this.dragHandler.off(this); if (timeGridView && timeGridView.container) { domevent.off(timeGridView.container, 'dblclick', this._onDblClick, this); } this.dragHandler = this.timeGridView = this.baseController = this._getScheduleDataFunc = this._dragStart = this.guide = null; }; /** * Check target element is expected condition for activate this plugins. * @param {HTMLElement} target - The element to check * @returns {(boolean|Time)} - return Time view instance when satiate condition. */ TimeCreation.prototype.checkExpectedCondition = function(target) { var cssClass = domutil.getClass(target), matches; if (cssClass === config.classname('time-date-schedule-block-wrap')) { target = target.parentNode; cssClass = domutil.getClass(target); } matches = cssClass.match(config.time.getViewIDRegExp); if (!matches || matches.length < 2) { return false; } return util.pick(this.timeGridView.children.items, matches[1]); }; /** * Drag#dragStart event handler. * @emits TimeCreation#timeCreationDragstart * @param {object} dragStartEventData - Drag#dragStart event data. * @param {string} [overrideEventName] - override emitted event name when supplied. * @param {function} [revise] - supply function for revise event data before emit. */ TimeCreation.prototype._onDragStart = function(dragStartEventData, overrideEventName, revise) { var target = dragStartEventData.target, result = this.checkExpectedCondition(target), getScheduleDataFunc, eventData; if (!result) { return; } getScheduleDataFunc = this._getScheduleDataFunc = this._retriveScheduleData(result); eventData = this._dragStart = getScheduleDataFunc(dragStartEventData.originEvent); if (revise) { revise(eventData); } this.dragHandler.on({ drag: this._onDrag, dragEnd: this._onDragEnd }, this); /** * @event TimeCreation#timeCreationDragstart * @type {object} * @property {Time} relatedView - time view instance related with mouse position. * @property {MouseEvent} originEvent - mouse event object. * @property {number} mouseY - mouse Y px mouse event. * @property {number} gridY - grid Y index value related with mouseY value. * @property {number} timeY - milliseconds value of mouseY points. * @property {number} nearestGridY - nearest grid index related with mouseY value. * @property {number} nearestGridTimeY - time value for nearestGridY. */ this.fire(overrideEventName || 'timeCreationDragstart', eventData); }; /** * Drag#drag event handler * @emits TimeCreation#timeCreationDrag * @param {object} dragEventData - event data from Drag#drag. * @param {string} [overrideEventName] - override emitted event name when supplied. * @param {function} [revise] - supply function for revise event data before emit. */ TimeCreation.prototype._onDrag = function(dragEventData, overrideEventName, revise) { var getScheduleDataFunc = this._getScheduleDataFunc, eventData; if (!getScheduleDataFunc) { return; } eventData = getScheduleDataFunc(dragEventData.originEvent); if (revise) { revise(eventData); } /** * @event TimeCreation#timeCreationDrag * @type {object} * @property {Time} relatedView - time view instance related with mouse position. * @property {MouseEvent} originEvent - mouse event object. * @property {number} mouseY - mouse Y px mouse event. * @property {number} gridY - grid Y index value related with mouseY value. * @property {number} timeY - milliseconds value of mouseY points. * @property {number} nearestGridY - nearest grid index related with mouseY value. * @property {number} nearestGridTimeY - time value for nearestGridY. */ this.fire(overrideEventName || 'timeCreationDrag', eventData); }; /** * @fires TimeCreation#beforeCreateSchedule * @param {object} eventData - event data object from TimeCreation#timeCreationDragend * or TimeCreation#timeCreationClick */ TimeCreation.prototype._createSchedule = function(eventData) { var relatedView = eventData.relatedView, createRange = eventData.createRange, nearestGridTimeY = eventData.nearestGridTimeY, nearestGridEndTimeY = eventData.nearestGridEndTimeY ? eventData.nearestGridEndTimeY : new TZDate(nearestGridTimeY).addMinutes(30), baseDate, dateStart, dateEnd, start, end; if (!createRange) { createRange = [ nearestGridTimeY, nearestGridEndTimeY ]; } baseDate = new TZDate(relatedView.getDate()); dateStart = datetime.start(baseDate); dateEnd = datetime.end(baseDate); start = common.limitDate(createRange[0], dateStart, dateEnd); end = common.limitDate(createRange[1], dateStart, dateEnd); /** * @event TimeCreation#beforeCreateSchedule * @type {object} * @property {boolean} isAllDay - whether schedule is fired in allday view area? * @property {Date} start - select start time * @property {Date} end - select end time * @property {TimeCreationGuide} guide - TimeCreationGuide instance * @property {string} triggerEventName - event name */ this.fire('beforeCreateSchedule', { isAllDay: false, start: new TZDate(start), end: new TZDate(end), guide: this.guide, triggerEventName: eventData.triggerEvent }); }; /** * Drag#dragEnd event handler * @emits TimeCreation#timeCreationDragend * @param {object} dragEndEventData - event data from Drag#dragend */ TimeCreation.prototype._onDragEnd = function(dragEndEventData) { var self = this, dragStart = this._dragStart; this.dragHandler.off({ drag: this._onDrag, dragEnd: this._onDragEnd }, this); /** * Function for manipulate event data before firing event * @param {object} eventData - event data */ function reviseFunc(eventData) { var range = [ dragStart.nearestGridTimeY, eventData.nearestGridTimeY ].sort(array.compare.num.asc); range[1].addMinutes(30); eventData.createRange = range; self._createSchedule(eventData); } /** * @event TimeCreation#timeCreationDragend * @type {object} * @property {Time} relatedView - time view instance related with mouse position. * @property {MouseEvent} originEvent - mouse event object. * @property {number} mouseY - mouse Y px mouse event. * @property {number} gridY - grid Y index value related with mouseY value. * @property {number} timeY - milliseconds value of mouseY points. * @property {number} nearestGridY - nearest grid index related with mouseY value. * @property {number} nearestGridTimeY - time value for nearestGridY. * @property {number[]} createRange - milliseconds range between drag start and end to create. */ this._onDrag(dragEndEventData, 'timeCreationDragend', reviseFunc); this._dragStart = this._getScheduleDataFunc = null; }; /** * Drag#click event handler * @emits TimeCreation#timeCreationClick * @param {object} clickEventData - event data from Drag#click. */ TimeCreation.prototype._onClick = function(clickEventData) { var self = this; var condResult, getScheduleDataFunc, eventData; this.dragHandler.off({ drag: this._onDrag, dragEnd: this._onDragEnd }, this); condResult = this.checkExpectedCondition(clickEventData.target); if (!condResult || this._disableClick) { return; } getScheduleDataFunc = this._retriveScheduleData(condResult); eventData = getScheduleDataFunc(clickEventData.originEvent); this._requestOnClick = true; setTimeout(function() { if (self._requestOnClick) { self.fire('timeCreationClick', eventData); self._createSchedule(eventData); } self._requestOnClick = false; }, CLICK_DELAY); this._dragStart = this._getScheduleDataFunc = null; }; /** * Dblclick event handler * @param {MouseEvent} e - Native MouseEvent */ TimeCreation.prototype._onDblClick = function(e) { var condResult, getScheduleDataFunc, eventData; condResult = this.checkExpectedCondition(e.target); if (!condResult) { return; } getScheduleDataFunc = this._retriveScheduleData(condResult); eventData = getScheduleDataFunc(e); this.fire('timeCreationClick', eventData); this._createSchedule(eventData); this._requestOnClick = false; }; /** * Invoke creation click * @param {Schedule} schedule - schedule instance */ TimeCreation.prototype.invokeCreationClick = function(schedule) { var opt = this.timeGridView.options, range = datetime.range( opt.renderStartDate, opt.renderEndDate, datetime.MILLISECONDS_PER_DAY), hourStart = opt.hourStart, targetDate = schedule.start; var getScheduleDataFunc, eventData, timeView; util.forEach(range, function(date, index) { if (datetime.isSameDate(date, targetDate)) { timeView = this.timeGridView.children.toArray()[index]; } }, this); // If start date is not in current date, set start date as first date. if (!timeView) { timeView = this.timeGridView.children.toArray()[0]; } getScheduleDataFunc = this._retriveScheduleDataFromDate(timeView); eventData = getScheduleDataFunc(schedule.start, schedule.end, hourStart); this.fire('timeCreationClick', eventData); this._createSchedule(eventData); }; timeCore.mixin(TimeCreation); util.CustomEvents.mixin(TimeCreation); module.exports = TimeCreation; /***/ }), /***/ "./src/js/handler/time/creationGuide.js": /*!**********************************************!*\ !*** ./src/js/handler/time/creationGuide.js ***! \**********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(global) {/** * @fileoverview Module for Time.Creation effect while dragging. * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var common = __webpack_require__(/*! ../../common/common */ "./src/js/common/common.js"); var datetime = __webpack_require__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"); var domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); var reqAnimFrame = __webpack_require__(/*! ../../common/reqAnimFrame */ "./src/js/common/reqAnimFrame.js"); var ratio = __webpack_require__(/*! ../../common/common */ "./src/js/common/common.js").ratio; var TZDate = __webpack_require__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date; var MIN60 = (datetime.MILLISECONDS_PER_MINUTES * 60); /** * Class for Time.Creation dragging effect. * @constructor * @param {TimeCreation} timeCreation - instance of TimeCreation. */ function TimeCreationGuide(timeCreation) { /** * Guide element for creation effect. * @type {HTMLElement} */ this.guideElement = global.document.createElement('div'); /** * @type {HTMLDivElement} */ this.guideTimeElement = domutil.appendHTMLElement( 'span', this.guideElement, config.classname('time-guide-creation-label') ); domutil.addClass(this.guideElement, config.classname('time-guide-creation')); /** * @type {TimeCreation} */ this.timeCreation = timeCreation; /** * @type {array} */ this._styleUnit = null; /** * @type {array} */ this._styleStart = null; /** * @type {function} */ this._styleFunc = null; timeCreation.on({ timeCreationDragstart: this._createGuideElement, timeCreationDrag: this._onDrag, timeCreationClick: this._createGuideElement }, this); this.applyTheme(timeCreation.baseController.theme); } /** * Destroy method. */ TimeCreationGuide.prototype.destroy = function() { this.clearGuideElement(); this.timeCreation.off(this); this.timeCreation = this._styleUnit = this._styleStart = this._styleFunc = this.guideElement = this.guideTimeElement = null; }; /** * Clear guide element. */ TimeCreationGuide.prototype.clearGuideElement = function() { var guideElement = this.guideElement, timeElement = this.guideTimeElement; domutil.remove(guideElement); reqAnimFrame.requestAnimFrame(function() { guideElement.style.display = 'none'; guideElement.style.top = ''; guideElement.style.height = ''; timeElement.innerHTML = ''; }); }; /** * Refresh guide element * @param {number} top - The number of guide element's style top * @param {number} height - The number of guide element's style height * @param {TZDate} start - start time of schedule to create * @param {TZDate} end - end time of schedule to create * @param {boolean} bottomLabel - is label need to render bottom of guide element? */ TimeCreationGuide.prototype._refreshGuideElement = function(top, height, start, end, bottomLabel) { var guideElement = this.guideElement; var timeElement = this.guideTimeElement; guideElement.style.top = top + 'px'; guideElement.style.height = height + 'px'; guideElement.style.display = 'block'; timeElement.innerHTML = datetime.format(start, 'HH:mm') + ' - ' + datetime.format(end, 'HH:mm'); if (bottomLabel) { domutil.removeClass(timeElement, config.classname('time-guide-bottom')); } else { domutil.addClass(timeElement, config.classname('time-guide-bottom')); } }; /** * Get unit data of calculating new style of guide element by user interaction * @param {Time} relatedView - time view instance related with schedule * @returns {array} unit data. */ TimeCreationGuide.prototype._getUnitData = function(relatedView) { var viewOpt = relatedView.options, viewHeight = relatedView.getViewBound().height, hourLength = viewOpt.hourEnd - viewOpt.hourStart, todayStart = datetime.parse(viewOpt.ymd), todayEnd = datetime.end(todayStart); todayStart.setHours(0, 0, 0, 0); todayStart.setHours(viewOpt.hourStart); // [0] height of view // [1] hour length of view // [2] start time of view // [3] end time of view // [4] height of view for one hour return [ viewHeight, hourLength, todayStart, todayEnd, viewHeight / hourLength ]; }; /** * Applying limitation to supplied data and return it. * @param {number} top - top pixel of guide element * @param {number} height - height pixel of guide element * @param {TZDate} start - relative time value of dragstart point * @param {TZDate} end - relative time value of dragend point * @returns {array} limited style data */ TimeCreationGuide.prototype._limitStyleData = function(top, height, start, end) { var unitData = this._styleUnit; top = common.limit(top, [0], [unitData[0]]); height = common.limit(top + height, [0], [unitData[0]]) - top; start = common.limitDate(start, unitData[2], unitData[3]); end = common.limitDate(end, unitData[2], unitData[3]); return [top, height, start, end]; }; /** * Get function to calculate guide element UI data from supplied units * @param {number} viewHeight - total height of view's container element * @param {number} hourLength - hour length that rendered in time view * @param {TZDate} todayStart - time for view's start date * @returns {function} UI data calculator function */ TimeCreationGuide.prototype._getStyleDataFunc = function(viewHeight, hourLength, todayStart) { var todayStartTime = todayStart; var todayEndTime = datetime.end(todayStart); /** * Get top, time value from schedule data * @param {object} scheduleData - schedule data object * @returns {number[]} top, time */ function getStyleData(scheduleData) { var minMinutes = 30; var gridY = scheduleData.nearestGridY, gridTimeY = scheduleData.nearestGridTimeY, gridEndTimeY = scheduleData.nearestGridEndTimeY || new TZDate(gridTimeY).addMinutes(minMinutes), top, startTime, endTime; top = common.limit(ratio(hourLength, viewHeight, gridY), [0], [viewHeight]); startTime = common.limitDate(gridTimeY, todayStartTime, todayEndTime); endTime = common.limitDate(gridEndTimeY, todayStartTime, todayEndTime); return [top, startTime, endTime]; } return getStyleData; }; /** * DragStart event handler * @param {object} dragStartEventData - dragStart schedule data. */ TimeCreationGuide.prototype._createGuideElement = function(dragStartEventData) { var relatedView = dragStartEventData.relatedView, hourStart = datetime.millisecondsFrom('hour', dragStartEventData.hourStart) || 0, unitData, styleFunc, styleData, result, top, height, start, end; unitData = this._styleUnit = this._getUnitData(relatedView); styleFunc = this._styleFunc = this._getStyleDataFunc.apply(this, unitData); styleData = this._styleStart = styleFunc(dragStartEventData); start = new TZDate(styleData[1]).addMinutes(datetime.minutesFromHours(hourStart)); end = new TZDate(styleData[2]).addMinutes(datetime.minutesFromHours(hourStart)); top = styleData[0]; height = (unitData[4] * (end - start) / MIN60); result = this._limitStyleData( top, height, start, end ); this._refreshGuideElement.apply(this, result); relatedView.container.appendChild(this.guideElement); }; /** * Drag event handler * @param {object} dragEventData - drag schedule data. */ TimeCreationGuide.prototype._onDrag = function(dragEventData) { var minutes30 = 30; var styleFunc = this._styleFunc, unitData = this._styleUnit, startStyle = this._styleStart, refreshGuideElement = this._refreshGuideElement.bind(this), heightOfHalfHour, endStyle, result; if (!styleFunc || !unitData || !startStyle) { return; } heightOfHalfHour = (unitData[4] / 2); endStyle = styleFunc(dragEventData); if (endStyle[0] > startStyle[0]) { result = this._limitStyleData( startStyle[0], (endStyle[0] - startStyle[0]) + heightOfHalfHour, startStyle[1], new TZDate(endStyle[1]).addMinutes(minutes30) ); } else { result = this._limitStyleData( endStyle[0], (startStyle[0] - endStyle[0]) + heightOfHalfHour, endStyle[1], new TZDate(startStyle[1]).addMinutes(minutes30) ); result.push(true); } reqAnimFrame.requestAnimFrame(function() { refreshGuideElement.apply(null, result); }); }; TimeCreationGuide.prototype.applyTheme = function(theme) { var style = this.guideElement.style; var timeStyle = this.guideTimeElement.style; // block style.backgroundColor = theme.common.creationGuide.backgroundColor; style.border = theme.common.creationGuide.border; // label timeStyle.color = theme.week.creationGuide.color; timeStyle.fontSize = theme.week.creationGuide.fontSize; timeStyle.fontWeight = theme.week.creationGuide.fontWeight; }; module.exports = TimeCreationGuide; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) /***/ }), /***/ "./src/js/handler/time/move.js": /*!*************************************!*\ !*** ./src/js/handler/time/move.js ***! \*************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Handling move schedules from drag handler and time grid view * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"); var datetime = __webpack_require__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); var domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); var domevent = __webpack_require__(/*! ../../common/domevent */ "./src/js/common/domevent.js"); var TZDate = __webpack_require__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date; var timeCore = __webpack_require__(/*! ./core */ "./src/js/handler/time/core.js"); var TimeMoveGuide = __webpack_require__(/*! ./moveGuide */ "./src/js/handler/time/moveGuide.js"); /** * @constructor * @implements {Handler} * @mixes timeCore * @mixes util.CustomEvents * @param {Drag} [dragHandler] - Drag handler instance. * @param {TimeGrid} [timeGridView] - TimeGrid view instance. * @param {Base} [baseController] - Base controller instance. */ function TimeMove(dragHandler, timeGridView, baseController) { /** * @type {Drag} */ this.dragHandler = dragHandler; /** * @type {TimeGrid} */ this.timeGridView = timeGridView; /** * @type {Base} */ this.baseController = baseController; /** * @type {function} */ this._getScheduleDataFunc = null; /** * @type {object} */ this._dragStart = null; /** * @type {TimeMoveGuide} */ this._guide = new TimeMoveGuide(this); dragHandler.on('dragStart', this._onDragStart, this); dragHandler.on('mousedown', this._onMouseDown, this); } /** * Destroy method. */ TimeMove.prototype.destroy = function() { this._guide.destroy(); this.dragHandler.off(this); this.dragHandler = this.timeGridView = this.baseController = this._getScheduleDataFunc = this._dragStart = this._guide = null; }; /** * Check target element is expected condition for activate this plugins. * @param {HTMLElement} target - The element to check * @returns {boolean|object} - return object when satiate condition. */ TimeMove.prototype.checkExpectCondition = function(target) { if (!domutil.closest(target, config.classname('.time-schedule'))) { return false; } return this._getTimeView(target); }; /** * Get Time view container from supplied element. * @param {HTMLElement} target - element to find time view container. * @returns {object|boolean} - return time view instance when finded. */ TimeMove.prototype._getTimeView = function(target) { var container = domutil.closest(target, config.classname('.time-date')), matches; if (!container) { return false; } matches = domutil.getClass(container).match(config.time.getViewIDRegExp); if (!matches || matches.length < 2) { return false; } return util.pick(this.timeGridView.children.items, Number(matches[1])); }; /** * @emits TimeMove#mousedown * @param {object} mouseDownEventData - Drag#mousedown schedule data. */ TimeMove.prototype._onMouseDown = function(mouseDownEventData) { var target = mouseDownEventData.target, timeView = this.checkExpectCondition(target), blockElement = domutil.closest(target, config.classname('.time-date-schedule-block')); if (!timeView || !blockElement) { return; } // EventTarget.target is not changed in mousemove event even if mouse is over the other element. // It's different with other browsers(IE, Chrome, Safari) if (util.browser.firefox) { domevent.preventDefault(mouseDownEventData.originEvent); } }; /** * @emits TimeMove#timeMoveDragstart * @param {object} dragStartEventData - Drag#dragStart schedule data. */ TimeMove.prototype._onDragStart = function(dragStartEventData) { var target = dragStartEventData.target, timeView = this.checkExpectCondition(target), blockElement = domutil.closest(target, config.classname('.time-date-schedule-block')), getScheduleDataFunc, scheduleData, ctrl = this.baseController, targetModelID, targetModel; if (!timeView || !blockElement) { return; } targetModelID = domutil.getData(blockElement, 'id'); targetModel = ctrl.schedules.items[targetModelID]; if (targetModel.isReadOnly) { return; } getScheduleDataFunc = this._getScheduleDataFunc = this._retriveScheduleData(timeView); scheduleData = this._dragStart = getScheduleDataFunc( dragStartEventData.originEvent, { targetModelID: targetModelID, model: targetModel } ); this.dragHandler.on({ drag: this._onDrag, dragEnd: this._onDragEnd, click: this._onClick }, this); /** * @event TimeMove#timeMoveDragstart * @type {object} * @property {HTMLElement} target - current target in mouse event object. * @property {Time} relatedView - time view instance related with mouse position. * @property {MouseEvent} originEvent - mouse event object. * @property {number} mouseY - mouse Y px mouse event. * @property {number} gridY - grid Y index value related with mouseY value. * @property {number} timeY - milliseconds value of mouseY points. * @property {number} nearestGridY - nearest grid index related with mouseY value. * @property {number} nearestGridTimeY - time value for nearestGridY. * @property {string} targetModelID - The model unique id emitted move schedule. * @property {Schedule} model - model instance */ this.fire('timeMoveDragstart', scheduleData); }; /** * @emits TimeMove#timeMoveDrag * @param {MouseEvent} dragEventData - mousemove event object * @param {string} [overrideEventName] - name of emitting event to override. * @param {function} [revise] - supply function for revise schedule data before emit. */ TimeMove.prototype._onDrag = function(dragEventData, overrideEventName, revise) { var getScheduleDataFunc = this._getScheduleDataFunc, timeView = this._getTimeView(dragEventData.target), dragStart = this._dragStart, scheduleData; if (!timeView || !getScheduleDataFunc || !dragStart) { return; } scheduleData = getScheduleDataFunc(dragEventData.originEvent, { currentView: timeView, targetModelID: dragStart.targetModelID }); if (revise) { revise(scheduleData); } /** * @event TimeMove#timeMoveDrag * @type {object} * @property {HTMLElement} target - current target in mouse event object. * @property {Time} relatedView - time view instance related with drag start position. * @property {MouseEvent} originEvent - mouse event object. * @property {number} mouseY - mouse Y px mouse event. * @property {number} gridY - grid Y index value related with mouseY value. * @property {number} timeY - milliseconds value of mouseY points. * @property {number} nearestGridY - nearest grid index related with mouseY value. * @property {number} nearestGridTimeY - time value for nearestGridY. * @property {Time} currentView - time view instance related with current mouse position. * @property {string} targetModelID - The model unique id emitted move schedule. */ this.fire(overrideEventName || 'timeMoveDrag', scheduleData); }; /** * Update model instance by dragend event results. * @fires TimeMove#beforeUpdateSchedule * @param {object} scheduleData - schedule data from TimeMove#timeMoveDragend */ TimeMove.prototype._updateSchedule = function(scheduleData) { var ctrl = this.baseController, modelID = scheduleData.targetModelID, range = scheduleData.nearestRange, timeDiff = range[1] - range[0], dateDiff = 0, schedule = ctrl.schedules.items[modelID], relatedView = scheduleData.relatedView, currentView = scheduleData.currentView, newStarts, newEnds; if (!schedule || !currentView) { return; } timeDiff -= datetime.millisecondsFrom('minutes', 30); newStarts = new TZDate(schedule.getStarts()).addMilliseconds(timeDiff); newEnds = new TZDate(schedule.getEnds()).addMilliseconds(timeDiff); if (currentView) { dateDiff = currentView.getDate() - relatedView.getDate(); } newStarts.addMilliseconds(dateDiff); newEnds.addMilliseconds(dateDiff); /** * @event TimeMove#beforeUpdateSchedule * @type {object} * @property {Schedule} schedule - schedule instance to update * @property {Date} start - start time to update * @property {Date} end - end time to update */ this.fire('beforeUpdateSchedule', { schedule: schedule, start: newStarts, end: newEnds }); }; /** * @emits TimeMove#timeMoveDragend * @param {MouseEvent} dragEndEventData - mouseup mouse event object. */ TimeMove.prototype._onDragEnd = function(dragEndEventData) { var getScheduleDataFunc = this._getScheduleDataFunc, currentView = this._getTimeView(dragEndEventData.target), dragStart = this._dragStart, scheduleData; this.dragHandler.off({ drag: this._onDrag, dragEnd: this._onDragEnd, click: this._onClick }, this); if (!getScheduleDataFunc || !dragStart) { return; } scheduleData = getScheduleDataFunc(dragEndEventData.originEvent, { currentView: currentView, targetModelID: dragStart.targetModelID }); scheduleData.range = [ dragStart.timeY, new TZDate(scheduleData.timeY).addMinutes(30) ]; scheduleData.nearestRange = [ dragStart.nearestGridTimeY, new TZDate(scheduleData.nearestGridTimeY).addMinutes(30) ]; this._updateSchedule(scheduleData); /** * @event TimeMove#timeMoveDragend * @type {object} * @property {HTMLElement} target - current target in mouse event object. * @property {Time} relatedView - time view instance related with drag start position. * @property {Time} currentView - time view instance related with current mouse position. * @property {MouseEvent} originEvent - mouse event object. * @property {number} mouseY - mouse Y px mouse event. * @property {number} gridY - grid Y index value related with mouseY value. * @property {number} timeY - milliseconds value of mouseY points. * @property {number} nearestGridY - nearest grid index related with mouseY value. * @property {number} nearestGridTimeY - time value for nearestGridY. * @property {string} targetModelID - The model unique id emitted move schedule. * @property {number[]} range - milliseconds range between drag start and end. * @property {number[]} nearestRange - milliseconds range related with nearestGridY between start and end. */ this.fire('timeMoveDragend', scheduleData); }; /** * @emits TimeMove#timeMoveClick * @param {MouseEvent} clickEventData - click mouse event object. */ TimeMove.prototype._onClick = function(clickEventData) { var getScheduleDataFunc = this._getScheduleDataFunc, dragStart = this._dragStart, scheduleData; this.dragHandler.off({ drag: this._onDrag, dragEnd: this._onDragEnd, click: this._onClick }, this); if (!getScheduleDataFunc || !dragStart) { return; } scheduleData = getScheduleDataFunc(clickEventData.originEvent, { targetModelID: dragStart.targetModelID }); /** * @event TimeMove#timeMoveClick * @type {object} * @property {HTMLElement} target - current target in mouse event object. * @property {Time} relatedView - time view instance related with drag start position. * @property {MouseEvent} originEvent - mouse event object. * @property {number} mouseY - mouse Y px mouse event. * @property {number} gridY - grid Y index value related with mouseY value. * @property {number} timeY - milliseconds value of mouseY points. * @property {number} nearestGridY - nearest grid index related with mouseY value. * @property {number} nearestGridTimeY - time value for nearestGridY. * @property {string} targetModelID - The model unique id emitted move schedule. */ this.fire('timeMoveClick', scheduleData); }; timeCore.mixin(TimeMove); util.CustomEvents.mixin(TimeMove); module.exports = TimeMove; /***/ }), /***/ "./src/js/handler/time/moveGuide.js": /*!******************************************!*\ !*** ./src/js/handler/time/moveGuide.js ***! \******************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(global) {/** * @fileoverview Module for Time.Move effect while dragging. * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"); var domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); var reqAnimFrame = __webpack_require__(/*! ../../common/reqAnimFrame */ "./src/js/common/reqAnimFrame.js"); var ratio = __webpack_require__(/*! ../../common/common */ "./src/js/common/common.js").ratio; var FloatingLayer = __webpack_require__(/*! ../../common/floatingLayer */ "./src/js/common/floatingLayer.js"); var tmpl = __webpack_require__(/*! ../../view/template/week/timeMoveGuide.hbs */ "./src/js/view/template/week/timeMoveGuide.hbs"); var TZDate = __webpack_require__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date; var Schedule = __webpack_require__(/*! ../../model/schedule */ "./src/js/model/schedule.js"); var datetime = __webpack_require__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); var common = __webpack_require__(/*! ../../common/common */ "./src/js/common/common.js"); var SCHEDULE_MIN_DURATION = datetime.MILLISECONDS_SCHEDULE_MIN_DURATION; /** * Class for Time.Move effect. * @constructor * @param {TimeMove} timeMove - The instance of TimeMove. */ function TimeMoveGuide(timeMove) { /** * @type {FloatingLayer} */ this._guideLayer = null; /** * @Type {Schedule} */ this._model = null; /** * @type {object} */ this._viewModel = null; /** * @type {object} */ this._lastDrag = null; /** * @type {HTMLElement} */ this.guideElement = null; /** * @type {TimeMove} */ this.timeMove = timeMove; /** * @type {HTMLElement} */ this._container = null; /** * @type {function} */ this._getTopFunc = null; /** * @type {number} */ this._startGridY = 0; /** * @type {number} */ this._startTopPixel = 0; timeMove.on({ 'timeMoveDragstart': this._onDragStart, 'timeMoveDrag': this._onDrag, 'timeMoveDragend': this._clearGuideElement, 'timeMoveClick': this._clearGuideElement }, this); } /** * Destroy method */ TimeMoveGuide.prototype.destroy = function() { this._clearGuideElement(); this.timeMove.off(this); if (this._guideLayer) { this._guideLayer.destroy(); } this.guideElement = this.timeMove = this._container = this._guideLayer = this._lastDrag = this._getTopFunc = this._startGridY = this._startTopPixel = this._viewModel = null; }; /** * Clear guide element. */ TimeMoveGuide.prototype._clearGuideElement = function() { if (!util.browser.msie) { domutil.removeClass(global.document.body, config.classname('dragging')); } if (this._guideLayer) { this._guideLayer.destroy(); } this._showOriginScheduleBlocks(); this.guideElement = this._getTopFunc = this._guideLayer = this._model = this._lastDrag = this._startGridY = this._startTopPixel = this._viewModel = null; }; /** * Dim element blocks * @param {number} modelID - Schedule model instance ID */ TimeMoveGuide.prototype._hideOriginScheduleBlocks = function() { var className = config.classname('time-date-schedule-block-dragging-dim'); if (this.guideElement) { domutil.addClass(this.guideElement, className); } }; /** * Show element blocks */ TimeMoveGuide.prototype._showOriginScheduleBlocks = function() { var className = config.classname('time-date-schedule-block-dragging-dim'); if (this.guideElement) { domutil.removeClass(this.guideElement, className); } }; /** * Refresh guide element * @param {string} top - guide element's style top. * @param {Schedule} model - updated model * @param {object} viewModel - view model */ TimeMoveGuide.prototype._refreshGuideElement = function(top, model, viewModel) { var self = this; reqAnimFrame.requestAnimFrame(function() { if (!self._guideLayer) { return; } self._guideLayer.setPosition(0, top); self._guideLayer.setContent(tmpl(util.extend({model: model}, viewModel))); }); }; /** * TimeMove#timeMoveDragstart event handler * @param {object} dragStartEventData - dragstart event data */ TimeMoveGuide.prototype._onDragStart = function(dragStartEventData) { var guideElement = domutil.closest( dragStartEventData.target, config.classname('.time-date-schedule-block') ); var duration, modelDuration, goingDuration, comingDuration; if (!guideElement) { return; } this._startTopPixel = parseFloat(guideElement.style.top); this._startGridY = dragStartEventData.nearestGridY; this.guideElement = guideElement; this._container = dragStartEventData.relatedView.container; this._model = util.extend( Schedule.create(dragStartEventData.model), dragStartEventData.model ); modelDuration = this._model.duration(); modelDuration = modelDuration > SCHEDULE_MIN_DURATION ? modelDuration : SCHEDULE_MIN_DURATION; goingDuration = datetime.millisecondsFrom('minutes', this._model.goingDuration); comingDuration = datetime.millisecondsFrom('minutes', this._model.comingDuration); duration = goingDuration + modelDuration + comingDuration; this._lastDrag = dragStartEventData; this._viewModel = { hasGoingDuration: goingDuration > 0, hasComingDuration: comingDuration > 0, goingDurationHeight: common.ratio(duration, goingDuration, 100), modelDurationHeight: common.ratio(duration, modelDuration, 100), comingDurationHeight: common.ratio(duration, comingDuration, 100) }; this._resetGuideLayer(); this._hideOriginScheduleBlocks(); }; /** * TimeMove#timeMoveDrag event handler * @param {object} dragEventData - drag event data */ TimeMoveGuide.prototype._onDrag = function(dragEventData) { var timeView = dragEventData.currentView, viewOptions = timeView.options, viewHeight = timeView.getViewBound().height, guideHeight = parseFloat(this.guideElement.style.height), hourLength = viewOptions.hourEnd - viewOptions.hourStart, gridYOffset = dragEventData.nearestGridY - this._startGridY, gridYOffsetPixel = ratio(hourLength, viewHeight, gridYOffset), gridDiff = dragEventData.nearestGridY - this._lastDrag.nearestGridY, bottomLimit, top; if (!util.browser.msie) { domutil.addClass(global.document.body, config.classname('dragging')); } if (this._container !== timeView.container) { this._container = timeView.container; this._resetGuideLayer(); } top = this._startTopPixel + gridYOffsetPixel; bottomLimit = viewHeight - guideHeight; top = Math.max(top, 0); top = Math.min(top, bottomLimit); // update time this._model.start = new TZDate(this._model.getStarts()).addMinutes(datetime.minutesFromHours(gridDiff)); this._model.end = new TZDate(this._model.getEnds()).addMinutes(datetime.minutesFromHours(gridDiff)); this._lastDrag = dragEventData; this._refreshGuideElement(top, this._model, this._viewModel); }; TimeMoveGuide.prototype._resetGuideLayer = function() { if (this._guideLayer) { this._guideLayer.destroy(); this._guideLayer = null; } this._guideLayer = new FloatingLayer(null, this._container); this._guideLayer.setSize(this._container.getBoundingClientRect().width, this.guideElement.style.height); this._guideLayer.setPosition(0, this.guideElement.style.top); this._guideLayer.setContent(tmpl(util.extend({model: this._model}, this._viewModel))); this._guideLayer.show(); }; module.exports = TimeMoveGuide; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) /***/ }), /***/ "./src/js/handler/time/resize.js": /*!***************************************!*\ !*** ./src/js/handler/time/resize.js ***! \***************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Handling resize schedules from drag handler and time grid view * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"); var datetime = __webpack_require__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); var domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); var TZDate = __webpack_require__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date; var timeCore = __webpack_require__(/*! ./core */ "./src/js/handler/time/core.js"); var TimeResizeGuide = __webpack_require__(/*! ./resizeGuide */ "./src/js/handler/time/resizeGuide.js"); /** * @constructor * @implements {Handler} * @mixes timeCore * @mixes util.CustomEvents * @param {Drag} [dragHandler] - Drag handler instance. * @param {TimeGrid} [timeGridView] - TimeGrid view instance. * @param {Base} [baseController] - Base controller instance. */ function TimeResize(dragHandler, timeGridView, baseController) { /** * @type {Drag} */ this.dragHandler = dragHandler; /** * @type {TimeGrid} */ this.timeGridView = timeGridView; /** * @type {Base} */ this.baseController = baseController; /** * @type {function} */ this._getScheduleDataFunc = null; /** * @type {object} */ this._dragStart = null; /** * @type {TimeResizeGuide} */ this._guide = new TimeResizeGuide(this); dragHandler.on('dragStart', this._onDragStart, this); } /** * Destroy method */ TimeResize.prototype.destroy = function() { this._guide.destroy(); this.dragHandler.off(this); this.dragHandler = this.timeGridView = this.baseController = this._getScheduleDataFunc = this._dragStart = this._guide = null; }; /** * @param {HTMLElement} target - element to check condition. * @returns {object|boolean} - return time view instance or false */ TimeResize.prototype.checkExpectCondition = function(target) { var container, matches; if (!domutil.hasClass(target, config.classname('time-resize-handle'))) { return false; } container = domutil.closest(target, config.classname('.time-date')); if (!container) { return false; } matches = domutil.getClass(container).match(config.time.getViewIDRegExp); if (!matches || matches.length < 2) { return false; } return util.pick(this.timeGridView.children.items, Number(matches[1])); }; /** * @emits TimeResize#timeResizeDragstart * @param {object} dragStartEventData - event data of Drag#dragstart */ TimeResize.prototype._onDragStart = function(dragStartEventData) { var target = dragStartEventData.target, timeView = this.checkExpectCondition(target), blockElement = domutil.closest(target, config.classname('.time-date-schedule-block')), ctrl = this.baseController, targetModelID, getScheduleDataFunc, scheduleData; if (!timeView || !blockElement) { return; } targetModelID = domutil.getData(blockElement, 'id'); getScheduleDataFunc = this._getScheduleDataFunc = this._retriveScheduleData(timeView); scheduleData = this._dragStart = getScheduleDataFunc( dragStartEventData.originEvent, { targetModelID: targetModelID, schedule: ctrl.schedules.items[targetModelID] } ); this.dragHandler.on({ drag: this._onDrag, dragEnd: this._onDragEnd, click: this._onClick }, this); /** * @event TimeResize#timeResizeDragstart * @type {object} * @property {HTMLElement} target - current target in mouse event object. * @property {Time} relatedView - time view instance related with mouse position. * @property {MouseEvent} originEvent - mouse event object. * @property {number} mouseY - mouse Y px mouse event. * @property {number} gridY - grid Y index value related with mouseY value. * @property {number} timeY - milliseconds value of mouseY points. * @property {number} nearestGridY - nearest grid index related with mouseY value. * @property {number} nearestGridTimeY - time value for nearestGridY. * @property {string} targetModelID - The model unique id emitted move schedule. * @property {Schedule} schedule - schedule data */ this.fire('timeResizeDragstart', scheduleData); }; /** * Drag#drag event handler * @emits TimeResize#timeResizeDrag * @param {object} dragEventData - event data of Drag#drag custom event. * @param {string} [overrideEventName] - override emitted event name when supplied. * @param {function} [revise] - supply function for revise schedule data before emit. */ TimeResize.prototype._onDrag = function(dragEventData, overrideEventName, revise) { var getScheduleDataFunc = this._getScheduleDataFunc, startScheduleData = this._dragStart, scheduleData; if (!getScheduleDataFunc || !startScheduleData) { return; } scheduleData = getScheduleDataFunc(dragEventData.originEvent, { targetModelID: startScheduleData.targetModelID }); if (revise) { revise(scheduleData); } /** * @event TimeResize#timeResizeDrag * @type {object} * @property {HTMLElement} target - current target in mouse event object. * @property {Time} relatedView - time view instance related with drag start position. * @property {MouseEvent} originEvent - mouse event object. * @property {number} mouseY - mouse Y px mouse event. * @property {number} gridY - grid Y index value related with mouseY value. * @property {number} timeY - milliseconds value of mouseY points. * @property {number} nearestGridY - nearest grid index related with mouseY value. * @property {number} nearestGridTimeY - time value for nearestGridY. * @property {string} targetModelID - The model unique id emitted move schedule. */ this.fire(overrideEventName || 'timeResizeDrag', scheduleData); }; /** * Update model instance by dragend event results. * @fires TimeResize#beforeUpdateSchedule * @param {object} scheduleData - schedule data from TimeResize#timeResizeDragend */ TimeResize.prototype._updateSchedule = function(scheduleData) { var ctrl = this.baseController, modelID = scheduleData.targetModelID, range = scheduleData.nearestRange, timeDiff = range[1] - range[0], schedule = ctrl.schedules.items[modelID], relatedView = scheduleData.relatedView, dateEnd, newEnds, baseDate; if (!schedule) { return; } timeDiff -= datetime.millisecondsFrom('minutes', 30); baseDate = new TZDate(relatedView.getDate()); dateEnd = datetime.end(baseDate); newEnds = new TZDate(schedule.getEnds()).addMilliseconds(timeDiff); if (newEnds > dateEnd) { newEnds = new TZDate(dateEnd); } if (newEnds.getTime() - schedule.getStarts().getTime() < datetime.millisecondsFrom('minutes', 30)) { newEnds = new TZDate(schedule.getStarts()).addMinutes(30); } /** * @event TimeResize#beforeUpdateSchedule * @type {object} * @property {Schedule} schedule - schedule instance to update * @property {Date} start - start time to update * @property {Date} end - end time to update */ this.fire('beforeUpdateSchedule', { schedule: schedule, start: schedule.getStarts(), end: newEnds }); }; /** * Drag#dragEnd event handler * @emits TimeResize#timeResizeDragend * @param {MouseEvent} dragEndEventData - Mouse event of Drag#dragEnd custom event. */ TimeResize.prototype._onDragEnd = function(dragEndEventData) { var getScheduleDataFunc = this._getScheduleDataFunc, dragStart = this._dragStart, scheduleData; this.dragHandler.off({ drag: this._onDrag, dragEnd: this._onDragEnd, click: this._onClick }, this); if (!getScheduleDataFunc || !dragStart) { return; } scheduleData = getScheduleDataFunc(dragEndEventData.originEvent, { targetModelID: dragStart.targetModelID }); scheduleData.range = [ dragStart.timeY, new TZDate(scheduleData.timeY).addMinutes(30) ]; scheduleData.nearestRange = [ dragStart.nearestGridTimeY, scheduleData.nearestGridTimeY.addMinutes(30) ]; this._updateSchedule(scheduleData); /** * @event TimeResize#timeResizeDragend * @type {object} * @property {HTMLElement} target - current target in mouse event object. * @property {Time} relatedView - time view instance related with drag start position. * @property {MouseEvent} originEvent - mouse event object. * @property {number} mouseY - mouse Y px mouse event. * @property {number} gridY - grid Y index value related with mouseY value. * @property {number} timeY - milliseconds value of mouseY points. * @property {number} nearestGridY - nearest grid index related with mouseY value. * @property {number} nearestGridTimeY - time value for nearestGridY. * @property {string} targetModelID - The model unique id emitted move schedule. * @property {number[]} range - milliseconds range between drag start and end. * @property {number[]} nearestRange - milliseconds range related with nearestGridY between start and end. */ this.fire('timeResizeDragend', scheduleData); this._getScheduleDataFunc = this._dragStart = null; }; /** * @emits TimeResize#timeResizeClick */ TimeResize.prototype._onClick = function() { this.dragHandler.off({ drag: this._onDrag, dragEnd: this._onDragEnd, click: this._onClick }, this); /** * @event TimeResize#timeResizeClick */ this.fire('timeResizeClick'); }; timeCore.mixin(TimeResize); util.CustomEvents.mixin(TimeResize); module.exports = TimeResize; /***/ }), /***/ "./src/js/handler/time/resizeGuide.js": /*!********************************************!*\ !*** ./src/js/handler/time/resizeGuide.js ***! \********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* WEBPACK VAR INJECTION */(function(global) {/** * @fileoverview Module for Time.Resize effect while dragging. * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"); var domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); var reqAnimFrame = __webpack_require__(/*! ../../common/reqAnimFrame */ "./src/js/common/reqAnimFrame.js"); var ratio = __webpack_require__(/*! ../../common/common */ "./src/js/common/common.js").ratio; var datetime = __webpack_require__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); /** * Class for Time.Resize effect. * @constructor * @param {TimeResize} timeResize - the instance of TimeResize handler. */ function TimeResizeGuide(timeResize) { /** * @type {HTMLElement} */ this.guideElement = null; /** * @type {TimeResize} */ this.timeResize = timeResize; /** * @type {function} */ this._getTopFunc = null; /** * @type {HTMLElement} */ this._originScheduleElement = null; /** * @type {number} */ this._startTopPixel = 0; /** * @type {number} */ this._startHeightPixel = 0; /** * @type {number} */ this._startGridY = 0; /** * @type {Schedule} */ this._schedule = null; timeResize.on({ 'timeResizeDragstart': this._onDragStart, 'timeResizeDrag': this._onDrag, 'timeResizeDragend': this._clearGuideElement, 'timeResizeClick': this._clearGuideElement }, this); } /** * Destroy method */ TimeResizeGuide.prototype.destroy = function() { this._clearGuideElement(); this.timeResize.off(this); this.guideElement = this.timeResize = this._getTopFunc = this._originScheduleElement = this._startHeightPixel = this._startGridY = this._startTopPixel = null; }; /** * Clear guide element. */ TimeResizeGuide.prototype._clearGuideElement = function() { var guideElement = this.guideElement, originElement = this._originScheduleElement; if (!util.browser.msie) { domutil.removeClass(global.document.body, config.classname('resizing')); } if (originElement) { originElement.style.display = 'block'; } domutil.remove(guideElement); this.guideElement = this._getTopFunc = this._originScheduleElement = this._startHeightPixel = this._startGridY = this._startTopPixel = null; }; /** * Refresh guide element * @param {number} guideHeight - guide element's style height. * @param {number} minTimeHeight - time element's min height * @param {number} timeHeight - time element's height. */ TimeResizeGuide.prototype._refreshGuideElement = function(guideHeight, minTimeHeight, timeHeight) { var guideElement = this.guideElement; var timeElement; if (!guideElement) { return; } timeElement = domutil.find(config.classname('.time-schedule-content-time'), guideElement); reqAnimFrame.requestAnimFrame(function() { guideElement.style.height = guideHeight + 'px'; guideElement.style.display = 'block'; if (timeElement) { timeElement.style.height = timeHeight + 'px'; timeElement.style.minHeight = minTimeHeight + 'px'; } }); }; /** * TimeMove#timeMoveDragstart event handler * @param {object} dragStartEventData - dragstart event data */ TimeResizeGuide.prototype._onDragStart = function(dragStartEventData) { var originElement = domutil.closest( dragStartEventData.target, config.classname('.time-date-schedule-block') ), schedule = dragStartEventData.schedule, guideElement; if (!util.browser.msie) { domutil.addClass(global.document.body, config.classname('resizing')); } if (!originElement || !schedule) { return; } this._startGridY = dragStartEventData.nearestGridY; this._startHeightPixel = parseFloat(originElement.style.height); this._startTopPixel = parseFloat(originElement.style.top); this._originScheduleElement = originElement; this._schedule = schedule; guideElement = this.guideElement = originElement.cloneNode(true); domutil.addClass(guideElement, config.classname('time-guide-resize')); originElement.style.display = 'none'; dragStartEventData.relatedView.container.appendChild(guideElement); }; /** * @param {object} dragEventData - event data from Drag#drag. */ TimeResizeGuide.prototype._onDrag = function(dragEventData) { var timeView = dragEventData.relatedView, viewOptions = timeView.options, viewHeight = timeView.getViewBound().height, hourLength = viewOptions.hourEnd - viewOptions.hourStart, guideElement = this.guideElement, guideTop = parseFloat(guideElement.style.top), gridYOffset = dragEventData.nearestGridY - this._startGridY, // hourLength : viewHeight = gridYOffset : X; gridYOffsetPixel = ratio(hourLength, viewHeight, gridYOffset), goingDuration = this._schedule.goingDuration, modelDuration = this._schedule.duration() / datetime.MILLISECONDS_PER_MINUTES, comingDuration = this._schedule.comingDuration, minutesLength = hourLength * 60, timeHeight, timeMinHeight, minHeight, maxHeight, height; height = (this._startHeightPixel + gridYOffsetPixel); // at least large than 30min from schedule start time. minHeight = guideTop + ratio(hourLength, viewHeight, 0.5); minHeight -= this._startTopPixel; timeMinHeight = minHeight; minHeight += ratio(minutesLength, viewHeight, goingDuration) + ratio(minutesLength, viewHeight, comingDuration); // smaller than 24h maxHeight = viewHeight - guideTop; height = Math.max(height, minHeight); height = Math.min(height, maxHeight); timeHeight = ratio(minutesLength, viewHeight, modelDuration) + gridYOffsetPixel; this._refreshGuideElement(height, timeMinHeight, timeHeight); }; module.exports = TimeResizeGuide; /* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../../../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"))) /***/ }), /***/ "./src/js/model/schedule.js": /*!**********************************!*\ !*** ./src/js/model/schedule.js ***! \**********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* eslint complexity: 0 */ /** * @fileoverview Model of schedule. * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var TZDate = __webpack_require__(/*! ../common/timezone */ "./src/js/common/timezone.js").Date; var datetime = __webpack_require__(/*! ../common/datetime */ "./src/js/common/datetime.js"); var dirty = __webpack_require__(/*! ../common/dirty */ "./src/js/common/dirty.js"); var model = __webpack_require__(/*! ../common/model */ "./src/js/common/model.js"); var SCHEDULE_MIN_DURATION = datetime.MILLISECONDS_SCHEDULE_MIN_DURATION; /** * Schedule category * @readonly * @enum {string} */ var SCHEDULE_CATEGORY = { /** milestone */ MILESTONE: 'milestone', /** task */ TASK: 'task', /** all-day schedule */ ALLDAY: 'allday', /** normal schedule */ TIME: 'time' }; /** * The model of calendar schedules. * @constructor * @mixes dirty * @mixes model */ function Schedule() { /** * `Optional` unique id for various use. * @type {string} */ this.id = ''; /** * title for schedule. * @type {string} */ this.title = ''; /** * body for schedule. * @type {string} */ this.body = ''; /** * is schedule is all day schedule? * @type {boolean} */ this.isAllDay = false; /** * schedule start * @type {TZDate} */ this.start = null; /** * schedule end * @type {TZDate} */ this.end = null; /** * schedule text color * @type {string} */ this.color = '#000'; /** * schedule block visibility * @type {boolean} */ this.isVisible = true; /** * schedule background color * @type {string} */ this.bgColor = '#a1b56c'; /** * schedule background color when dragging it * @type {string} */ this.dragBgColor = '#a1b56c'; /** * schedule left border color * @type {string} */ this.borderColor = '#000'; /** * calendar ID * @type {string} */ this.calendarId = ''; /** * Schedule category(milestone, task, allday, time) * @type {string} */ this.category = ''; /** * Classification of work schedules (before work, before lunch, before work) * @type {string} */ this.dueDateClass = ''; /** * Custom style for schedule element * @type {string} */ this.customStyle = ''; /** * in progress flag to do something * @type {boolean} */ this.isPending = false; /** * focused schedule flag * @type {boolean} */ this.isFocused = false; /** * read-only schedule flag * @type {boolean} */ this.isReadOnly = false; /** * private schedule * @type {boolean} */ this.isPrivate = false; /** * location * @type {string} */ this.location = ''; /** * attendees * @type {Array.<string>} */ this.attendees = []; /** * recurrence rule * @type {any} */ this.recurrenceRule = ''; /** * state. 'Busy' is default. * @type {string} */ this.state = ''; /** * travelTime: going-Duration minutes * @type {number} */ this.goingDuration = 0; /** * travelTime: coming-Duration minutes * @type {number} */ this.comingDuration = 0; /** * Separate data storage space independent of rendering. * @type {object} */ this.raw = null; // initialize model id util.stamp(this); } /********** * static props **********/ Schedule.schema = { required: ['title'], dateRange: ['start', 'end'] }; /** * create schedule model from json(object) data. * @param {object} data object for model. * @returns {Schedule} Schedule model instance. */ Schedule.create = function(data) { var inst = new Schedule(); inst.init(data); return inst; }; /********** * prototype props **********/ /** * Initialize schedule instance. * @param {object} options options. */ Schedule.prototype.init = function(options) { options = util.extend({}, options); if (options.category === SCHEDULE_CATEGORY.ALLDAY) { options.isAllDay = true; } this.id = options.id || ''; this.title = options.title || ''; this.body = options.body || ''; this.isAllDay = util.isExisty(options.isAllDay) ? options.isAllDay : false; this.isVisible = util.isExisty(options.isVisible) ? options.isVisible : true; this.color = options.color || this.color; this.bgColor = options.bgColor || this.bgColor; this.dragBgColor = options.dragBgColor || this.dragBgColor; this.borderColor = options.borderColor || this.borderColor; this.calendarId = options.calendarId || ''; this.category = options.category || ''; this.dueDateClass = options.dueDateClass || ''; this.customStyle = options.customStyle || ''; this.location = options.location || ''; this.attendees = options.attendees || []; this.recurrenceRule = options.recurrenceRule || ''; this.isPrivate = options.isPrivate || false; this.isPending = options.isPending || false; this.isFocused = options.isFocused || false; this.isReadOnly = options.isReadOnly || false; this.goingDuration = options.goingDuration || 0; this.comingDuration = options.comingDuration || 0; this.state = options.state || ''; if (this.isAllDay) { this.setAllDayPeriod(options.start, options.end); } else { this.setTimePeriod(options.start, options.end); } if (options.category === SCHEDULE_CATEGORY.MILESTONE || options.category === SCHEDULE_CATEGORY.TASK) { this.start = new TZDate(this.end); } this.raw = options.raw || null; }; Schedule.prototype.setAllDayPeriod = function(start, end) { // If it is an all-day schedule, only the date information of the string is used. if (util.isString(start)) { start = datetime.parse(start.substring(0, 10)); } else { start = new TZDate(start || Date.now()); } if (util.isString(end)) { end = datetime.parse(end.substring(0, 10)); } else { end = new TZDate(end || this.start); } this.start = start; this.start.setHours(0, 0, 0); this.end = end || new TZDate(this.start); this.end.setHours(23, 59, 59); }; Schedule.prototype.setTimePeriod = function(start, end) { this.start = new TZDate(start || Date.now()); this.end = new TZDate(end || this.start); if (!end) { this.end.setMinutes(this.end.getMinutes() + 30); } }; /** * @returns {Date} render start date. */ Schedule.prototype.getStarts = function() { return this.start; }; /** * @returns {Date} render end date. */ Schedule.prototype.getEnds = function() { return this.end; }; /** * @returns {number} instance unique id. */ Schedule.prototype.cid = function() { return util.stamp(this); }; /** * Check two schedule are equals (means title, isAllDay, start, end are same) * @param {Schedule} schedule Schedule model instance to compare. * @returns {boolean} Return false when not same. */ Schedule.prototype.equals = function(schedule) { if (this.id !== schedule.id) { return false; } if (this.title !== schedule.title) { return false; } if (this.body !== schedule.body) { return false; } if (this.isAllDay !== schedule.isAllDay) { return false; } if (datetime.compare(this.getStarts(), schedule.getStarts()) !== 0) { return false; } if (datetime.compare(this.getEnds(), schedule.getEnds()) !== 0) { return false; } if (this.color !== schedule.color) { return false; } if (this.bgColor !== schedule.bgColor) { return false; } if (this.dragBgColor !== schedule.dragBgColor) { return false; } if (this.borderColor !== schedule.borderColor) { return false; } return true; }; /** * return duration between start and end. * @returns {Date} duration (UTC) */ Schedule.prototype.duration = function() { var start = this.getStarts(), end = this.getEnds(), duration; if (this.isAllDay) { duration = datetime.end(end) - datetime.start(start); } else { duration = end - start; } return duration; }; /** * Returns true if the given Schedule coincides with the same time as the * calling Schedule. * @param {Schedule} schedule The other schedule to compare with this Schedule. * @returns {boolean} If the other schedule occurs within the same time as the first object. */ Schedule.prototype.collidesWith = function(schedule) { var ownStarts = this.getStarts(), ownEnds = this.getEnds(), start = schedule.getStarts(), end = schedule.getEnds(); var ownGoingDuration = datetime.millisecondsFrom('minutes', this.goingDuration), ownComingDuration = datetime.millisecondsFrom('minutes', this.comingDuration), goingDuration = datetime.millisecondsFrom('minutes', schedule.goingDuration), comingDuration = datetime.millisecondsFrom('minutes', schedule.comingDuration); if (Math.abs(ownEnds - ownStarts) < SCHEDULE_MIN_DURATION) { ownEnds += SCHEDULE_MIN_DURATION; } if (Math.abs(end - start) < SCHEDULE_MIN_DURATION) { end += SCHEDULE_MIN_DURATION; } ownStarts -= ownGoingDuration; ownEnds += ownComingDuration; start -= goingDuration; end += comingDuration; if ((start > ownStarts && start < ownEnds) || (end > ownStarts && end < ownEnds) || (start <= ownStarts && end >= ownEnds)) { return true; } return false; }; model.mixin(Schedule.prototype); dirty.mixin(Schedule.prototype); module.exports = Schedule; /***/ }), /***/ "./src/js/model/viewModel/scheduleViewModel.js": /*!*****************************************************!*\ !*** ./src/js/model/viewModel/scheduleViewModel.js ***! \*****************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Model for views * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var datetime = __webpack_require__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); var SCHEDULE_MIN_DURATION = datetime.MILLISECONDS_SCHEDULE_MIN_DURATION; /** * Schedule ViewModel * @constructor * @param {Schedule} schedule Schedule instance. */ function ScheduleViewModel(schedule) { /** * The model of schedule. * @type {Schedule} */ this.model = schedule; /** * @type {number} */ this.top = 0; /** * @type {number} */ this.left = 0; /** * @type {number} */ this.width = 0; /** * @type {number} */ this.height = 0; /** * Represent schedule has collide with other schedules when rendering. * @type {boolean} */ this.hasCollide = false; /** * Extra space at rigth side of this schedule. * @type {number} */ this.extraSpace = 0; /** * represent this schedule block is not visible after rendered. * * in month view, some viewmodel in date need to hide when already rendered before dates. * * set true then it just shows empty space. * @type {boolean} */ this.hidden = false; /** * whether the schedule includes multiple dates */ this.hasMultiDates = false; /** * represent render start date used at rendering. * * if set null then use model's 'start' property. * @type {TZDate} */ this.renderStarts = null; /** * whether the actual start-date is before the render-start-date * @type {boolean} */ this.exceedLeft = false; /** * represent render end date used at rendering. * * if set null then use model's 'end' property. * @type {TZDate} */ this.renderEnds = null; /** * whether the actual end-date is after the render-end-date * @type {boolean} */ this.exceedRight = false; } /********** * static props **********/ /** * ScheduleViewModel factory method. * @param {Schedule} schedule Schedule instance. * @returns {ScheduleViewModel} ScheduleViewModel instance. */ ScheduleViewModel.create = function(schedule) { return new ScheduleViewModel(schedule); }; /********** * prototype props **********/ /** * return renderStarts property to render properly when specific schedule that exceed rendering date range. * * if renderStarts is not set. return model's start property. * @override * @returns {Date} render start date. */ ScheduleViewModel.prototype.getStarts = function() { if (this.renderStarts) { return this.renderStarts; } return this.model.start; }; /** * return renderStarts property to render properly when specific schedule that exceed rendering date range. * * if renderEnds is not set. return model's end property. * @override * @returns {Date} render end date. */ ScheduleViewModel.prototype.getEnds = function() { if (this.renderEnds) { return this.renderEnds; } return this.model.end; }; /** * @returns {number} unique number for model. */ ScheduleViewModel.prototype.cid = function() { return util.stamp(this.model); }; /** * Shadowing valueOf method for schedule sorting. * @returns {Schedule} The model of schedule. */ ScheduleViewModel.prototype.valueOf = function() { return this.model; }; /** * Link duration method * @returns {number} Schedule#duration result. */ ScheduleViewModel.prototype.duration = function() { return this.model.duration(); }; /** * Link collidesWith method * @param {Schedule|ScheduleViewModel} viewModel - Model or viewmodel instance of Schedule. * @returns {boolean} Schedule#collidesWith result. */ ScheduleViewModel.prototype.collidesWith = function(viewModel) { var ownStarts = this.getStarts(), ownEnds = this.getEnds(), start = viewModel.getStarts(), end = viewModel.getEnds(); var ownGoingDuration = datetime.millisecondsFrom('minutes', this.valueOf().goingDuration), ownComingDuration = datetime.millisecondsFrom('minutes', this.valueOf().comingDuration), goingDuration = datetime.millisecondsFrom('minutes', viewModel.valueOf().goingDuration), comingDuration = datetime.millisecondsFrom('minutes', viewModel.valueOf().comingDuration); if (Math.abs(ownEnds - ownStarts) < SCHEDULE_MIN_DURATION) { ownEnds += SCHEDULE_MIN_DURATION; } if (Math.abs(end - start) < SCHEDULE_MIN_DURATION) { end += SCHEDULE_MIN_DURATION; } ownStarts -= ownGoingDuration; ownEnds += ownComingDuration; start -= goingDuration; end += comingDuration; if ((start > ownStarts && start < ownEnds) || (end > ownStarts && end < ownEnds) || (start <= ownStarts && end >= ownEnds)) { return true; } return false; }; module.exports = ScheduleViewModel; /***/ }), /***/ "./src/js/theme/standard.js": /*!**********************************!*\ !*** ./src/js/theme/standard.js ***! \**********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview The standard theme * @author NHN FE Development Lab <dl_javascript@nhn.com> */ /** * "common" prefix is for entire calendar. "common" properties can be overriden by "week", "month". * "week" prefix is for weekly and daily view. * "month" prefix is for monthly view. */ var theme = { 'common.border': '1px solid #e5e5e5', 'common.backgroundColor': 'white', 'common.holiday.color': '#ff4040', 'common.saturday.color': '#333', 'common.dayname.color': '#333', 'common.today.color': '#333', // creation guide style 'common.creationGuide.backgroundColor': 'rgba(81, 92, 230, 0.05)', 'common.creationGuide.border': '1px solid #515ce6', // month header 'dayname' 'month.dayname.height': '31px', 'month.dayname.borderLeft': 'none', 'month.dayname.paddingLeft': '10px', 'month.dayname.paddingRight': '0', 'month.dayname.backgroundColor': 'inherit', 'month.dayname.fontSize': '12px', 'month.dayname.fontWeight': 'normal', 'month.dayname.textAlign': 'left', // month day grid cell 'day' 'month.holidayExceptThisMonth.color': 'rgba(255, 64, 64, 0.4)', 'month.dayExceptThisMonth.color': 'rgba(51, 51, 51, 0.4)', 'month.weekend.backgroundColor': 'inherit', 'month.day.fontSize': '14px', // month schedule style 'month.schedule.borderRadius': '2px', 'month.schedule.height': '24px', 'month.schedule.marginTop': '2px', 'month.schedule.marginLeft': '8px', 'month.schedule.marginRight': '8px', // month more view 'month.moreView.border': '1px solid #d5d5d5', 'month.moreView.boxShadow': '0 2px 6px 0 rgba(0, 0, 0, 0.1)', 'month.moreView.backgroundColor': 'white', 'month.moreView.paddingBottom': '17px', 'month.moreViewTitle.height': '44px', 'month.moreViewTitle.marginBottom': '12px', 'month.moreViewTitle.borderBottom': 'none', 'month.moreViewTitle.padding': '12px 17px 0 17px', 'month.moreViewList.padding': '0 17px', // week header 'dayname' 'week.dayname.height': '42px', 'week.dayname.borderTop': '1px solid #e5e5e5', 'week.dayname.borderBottom': '1px solid #e5e5e5', 'week.dayname.borderLeft': 'none', 'week.dayname.paddingLeft': '0', 'week.dayname.backgroundColor': 'inherit', 'week.dayname.textAlign': 'left', 'week.today.color': 'inherit', 'week.pastDay.color': '#bbb', // week vertical panel 'vpanel' 'week.vpanelSplitter.border': '1px solid #e5e5e5', 'week.vpanelSplitter.height': '3px', // week daygrid 'daygrid' 'week.daygrid.borderRight': '1px solid #e5e5e5', 'week.daygrid.backgroundColor': 'inherit', 'week.daygridLeft.width': '72px', 'week.daygridLeft.backgroundColor': 'inherit', 'week.daygridLeft.paddingRight': '8px', 'week.daygridLeft.borderRight': '1px solid #e5e5e5', 'week.today.backgroundColor': 'rgba(81, 92, 230, 0.05)', 'week.weekend.backgroundColor': 'inherit', // week timegrid 'timegrid' 'week.timegridLeft.width': '72px', 'week.timegridLeft.backgroundColor': 'inherit', 'week.timegridLeft.borderRight': '1px solid #e5e5e5', 'week.timegridLeft.fontSize': '11px', 'week.timegridOneHour.height': '52px', 'week.timegridHalfHour.height': '26px', 'week.timegridHalfHour.borderBottom': 'none', 'week.timegridHorizontalLine.borderBottom': '1px solid #e5e5e5', 'week.timegrid.paddingRight': '8px', 'week.timegrid.borderRight': '1px solid #e5e5e5', 'week.timegridSchedule.borderRadius': '2px', 'week.timegridSchedule.paddingLeft': '2px', 'week.currentTime.color': '#515ce6', 'week.currentTime.fontSize': '11px', 'week.currentTime.fontWeight': 'normal', 'week.currentTimeLinePast.border': '1px dashed #515ce6', 'week.currentTimeLineBullet.backgroundColor': '#515ce6', 'week.currentTimeLineToday.border': '1px solid #515ce6', 'week.currentTimeLineFuture.border': 'none', // week creation guide style 'week.creationGuide.color': '#515ce6', 'week.creationGuide.fontSize': '11px', 'week.creationGuide.fontWeight': 'bold', // week daygrid schedule style 'week.dayGridSchedule.borderRadius': '2px', 'week.dayGridSchedule.height': '24px', 'week.dayGridSchedule.marginTop': '2px', 'week.dayGridSchedule.marginLeft': '8px', 'week.dayGridSchedule.marginRight': '8px' }; module.exports = theme; /***/ }), /***/ "./src/js/theme/theme.js": /*!*******************************!*\ !*** ./src/js/theme/theme.js ***! \*******************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview The all configuration of a theme * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var themeStandard = __webpack_require__(/*! ./standard */ "./src/js/theme/standard.js"); var themeConfig = __webpack_require__(/*! ./themeConfig */ "./src/js/theme/themeConfig.js"); var common = __webpack_require__(/*! ../common/common */ "./src/js/common/common.js"); /** * Theme manager * @param {object} customTheme - custom theme */ function Theme(customTheme) { var theme = customTheme || themeStandard; /** * @type {util.HashMap} */ this._map = new util.HashMap(); this.setStyles(theme); } /** * Get a style with key * @param {string} key - key for getting a style * @returns {string|undefined} style */ Theme.prototype.getStyle = function(key) { return this._map.get(key); }; /** * Set a style * @param {string} key - key for setting a style * @param {string} style - style value * @returns {boolean} true if the give key is valid or false */ Theme.prototype.setStyle = function(key, style) { var styles = {}; styles[key] = style; return this.setStyles(styles).length === 0; }; /** * Set styles * @param {object} styles - multiple styles map * @returns {Array.<string>} error keys */ Theme.prototype.setStyles = function(styles) { var errors = []; util.forEach(styles, function(style, key) { if (util.isUndefined(themeConfig[key])) { errors.push(key); } else { this._map.set(key, style); common.set(this, key, style); } }, this); // apply missing styles which have to be default util.forEach(themeConfig, function(style, key) { if (!this.getStyle(key)) { this._map.set(key, style); common.set(this, key, style); } }, this); return errors; }; /** * Delete all styles */ Theme.prototype.clear = function() { var keys = this._map.keys(); var categories = {}; util.forEach(keys, function(key) { var category = key.split('.')[0]; if (!categories[category]) { categories[category] = category; } }); util.forEach(categories, function(child) { delete this[child]; }, this); this._map.removeAll(); }; module.exports = Theme; /***/ }), /***/ "./src/js/theme/themeConfig.js": /*!*************************************!*\ !*** ./src/js/theme/themeConfig.js ***! \*************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview The all configuration of a theme * @author NHN FE Development Lab <dl_javascript@nhn.com> */ /** * Full configuration for theme. * "common" prefix is for entire calendar. "common" properties can be overriden by "week", "month". * "week" prefix is for weekly and daily view. * "month" prefix is for monthly view. * @typedef {object} themeConfig * @example // default keys and styles var themeConfig = { 'common.border': '1px solid #e5e5e5', 'common.backgroundColor': 'white', 'common.holiday.color': '#ff4040', 'common.saturday.color': '#333', 'common.dayname.color': '#333', 'common.today.color': '#333', // creation guide style 'common.creationGuide.backgroundColor': 'rgba(81, 92, 230, 0.05)', 'common.creationGuide.border': '1px solid #515ce6', // month header 'dayname' 'month.dayname.height': '31px', 'month.dayname.borderLeft': '1px solid #e5e5e5', 'month.dayname.paddingLeft': '10px', 'month.dayname.paddingRight': '10px', 'month.dayname.backgroundColor': 'inherit', 'month.dayname.fontSize': '12px', 'month.dayname.fontWeight': 'normal', 'month.dayname.textAlign': 'left', // month day grid cell 'day' 'month.holidayExceptThisMonth.color': 'rgba(255, 64, 64, 0.4)', 'month.dayExceptThisMonth.color': 'rgba(51, 51, 51, 0.4)', 'month.weekend.backgroundColor': 'inherit', 'month.day.fontSize': '14px', // month schedule style 'month.schedule.borderRadius': '2px', 'month.schedule.height': '24px', 'month.schedule.marginTop': '2px', 'month.schedule.marginLeft': '8px', 'month.schedule.marginRight': '8px', // month more view 'month.moreView.border': '1px solid #d5d5d5', 'month.moreView.boxShadow': '0 2px 6px 0 rgba(0, 0, 0, 0.1)', 'month.moreView.backgroundColor': 'white', 'month.moreView.paddingBottom': '17px', 'month.moreViewTitle.height': '44px', 'month.moreViewTitle.marginBottom': '12px', 'month.moreViewTitle.backgroundColor': 'inherit', 'month.moreViewTitle.borderBottom': 'none', 'month.moreViewTitle.padding': '12px 17px 0 17px', 'month.moreViewList.padding': '0 17px', // week header 'dayname' 'week.dayname.height': '42px', 'week.dayname.borderTop': '1px solid #e5e5e5', 'week.dayname.borderBottom': '1px solid #e5e5e5', 'week.dayname.borderLeft': 'inherit', 'week.dayname.paddingLeft': '0', 'week.dayname.backgroundColor': 'inherit', 'week.dayname.textAlign': 'left', 'week.today.color': '#333', 'week.pastDay.color': '#bbb', // week vertical panel 'vpanel' 'week.vpanelSplitter.border': '1px solid #e5e5e5', 'week.vpanelSplitter.height': '3px', // week daygrid 'daygrid' 'week.daygrid.borderRight': '1px solid #e5e5e5', 'week.daygrid.backgroundColor': 'inherit', 'week.daygridLeft.width': '72px', 'week.daygridLeft.backgroundColor': 'inherit', 'week.daygridLeft.paddingRight': '8px', 'week.daygridLeft.borderRight': '1px solid #e5e5e5', 'week.today.backgroundColor': 'rgba(81, 92, 230, 0.05)', 'week.weekend.backgroundColor': 'inherit', // week timegrid 'timegrid' 'week.timegridLeft.width': '72px', 'week.timegridLeft.backgroundColor': 'inherit', 'week.timegridLeft.borderRight': '1px solid #e5e5e5', 'week.timegridLeft.fontSize': '11px', 'week.timegridLeftTimezoneLabel.height': '40px', 'week.timegridLeftAdditionalTimezone.backgroundColor': 'white', 'week.timegridOneHour.height': '52px', 'week.timegridHalfHour.height': '26px', 'week.timegridHalfHour.borderBottom': 'none', 'week.timegridHorizontalLine.borderBottom': '1px solid #e5e5e5', 'week.timegrid.paddingRight': '8px', 'week.timegrid.borderRight': '1px solid #e5e5e5', 'week.timegridSchedule.borderRadius': '2px', 'week.timegridSchedule.paddingLeft': '2px', 'week.currentTime.color': '#515ce6', 'week.currentTime.fontSize': '11px', 'week.currentTime.fontWeight': 'normal', 'week.pastTime.color': '#bbb', 'week.pastTime.fontWeight': 'normal', 'week.futureTime.color': '#333', 'week.futureTime.fontWeight': 'normal', 'week.currentTimeLinePast.border': '1px dashed #515ce6', 'week.currentTimeLineBullet.backgroundColor': '#515ce6', 'week.currentTimeLineToday.border': '1px solid #515ce6', 'week.currentTimeLineFuture.border': 'none', // week creation guide style 'week.creationGuide.color': '#515ce6', 'week.creationGuide.fontSize': '11px', 'week.creationGuide.fontWeight': 'bold', // week daygrid schedule style 'week.dayGridSchedule.borderRadius': '2px', 'week.dayGridSchedule.height': '24px', 'week.dayGridSchedule.marginTop': '2px', 'week.dayGridSchedule.marginLeft': '8px', 'week.dayGridSchedule.marginRight': '8px' }; */ var themeConfig = { 'common.border': '1px solid #e5e5e5', 'common.backgroundColor': 'white', 'common.holiday.color': '#ff4040', 'common.saturday.color': '#333', 'common.dayname.color': '#333', 'common.today.color': '#333', // creation guide style 'common.creationGuide.backgroundColor': 'rgba(81, 92, 230, 0.05)', 'common.creationGuide.border': '1px solid #515ce6', // month header 'dayname' 'month.dayname.height': '31px', 'month.dayname.borderLeft': '1px solid #e5e5e5', 'month.dayname.paddingLeft': '10px', 'month.dayname.paddingRight': '10px', 'month.dayname.backgroundColor': 'inherit', 'month.dayname.fontSize': '12px', 'month.dayname.fontWeight': 'normal', 'month.dayname.textAlign': 'left', // month day grid cell 'day' 'month.holidayExceptThisMonth.color': 'rgba(255, 64, 64, 0.4)', 'month.dayExceptThisMonth.color': 'rgba(51, 51, 51, 0.4)', 'month.weekend.backgroundColor': 'inherit', 'month.day.fontSize': '14px', // month schedule style 'month.schedule.borderRadius': '2px', 'month.schedule.height': '24px', 'month.schedule.marginTop': '2px', 'month.schedule.marginLeft': '8px', 'month.schedule.marginRight': '8px', // month more view 'month.moreView.border': '1px solid #d5d5d5', 'month.moreView.boxShadow': '0 2px 6px 0 rgba(0, 0, 0, 0.1)', 'month.moreView.backgroundColor': 'white', 'month.moreView.paddingBottom': '17px', 'month.moreViewTitle.height': '44px', 'month.moreViewTitle.marginBottom': '12px', 'month.moreViewTitle.backgroundColor': 'inherit', 'month.moreViewTitle.borderBottom': 'none', 'month.moreViewTitle.padding': '12px 17px 0 17px', 'month.moreViewList.padding': '0 17px', // week header 'dayname' 'week.dayname.height': '42px', 'week.dayname.borderTop': '1px solid #e5e5e5', 'week.dayname.borderBottom': '1px solid #e5e5e5', 'week.dayname.borderLeft': 'inherit', 'week.dayname.paddingLeft': '0', 'week.dayname.backgroundColor': 'inherit', 'week.dayname.textAlign': 'left', 'week.today.color': '#333', 'week.pastDay.color': '#bbb', // week vertical panel 'vpanel' 'week.vpanelSplitter.border': '1px solid #e5e5e5', 'week.vpanelSplitter.height': '3px', // week daygrid 'daygrid' 'week.daygrid.borderRight': '1px solid #e5e5e5', 'week.daygrid.backgroundColor': 'inherit', 'week.daygridLeft.width': '72px', 'week.daygridLeft.backgroundColor': 'inherit', 'week.daygridLeft.paddingRight': '8px', 'week.daygridLeft.borderRight': '1px solid #e5e5e5', 'week.today.backgroundColor': 'rgba(81, 92, 230, 0.05)', 'week.weekend.backgroundColor': 'inherit', // week timegrid 'timegrid' 'week.timegridLeft.width': '72px', 'week.timegridLeft.backgroundColor': 'inherit', 'week.timegridLeft.borderRight': '1px solid #e5e5e5', 'week.timegridLeft.fontSize': '11px', 'week.timegridLeftTimezoneLabel.height': '40px', 'week.timegridLeftAdditionalTimezone.backgroundColor': 'white', 'week.timegridOneHour.height': '52px', 'week.timegridHalfHour.height': '26px', 'week.timegridHalfHour.borderBottom': 'none', 'week.timegridHorizontalLine.borderBottom': '1px solid #e5e5e5', 'week.timegrid.paddingRight': '8px', 'week.timegrid.borderRight': '1px solid #e5e5e5', 'week.timegridSchedule.borderRadius': '2px', 'week.timegridSchedule.paddingLeft': '2px', 'week.currentTime.color': '#515ce6', 'week.currentTime.fontSize': '11px', 'week.currentTime.fontWeight': 'normal', 'week.pastTime.color': '#bbb', 'week.pastTime.fontWeight': 'normal', 'week.futureTime.color': '#333', 'week.futureTime.fontWeight': 'normal', 'week.currentTimeLinePast.border': '1px dashed #515ce6', 'week.currentTimeLineBullet.backgroundColor': '#515ce6', 'week.currentTimeLineToday.border': '1px solid #515ce6', 'week.currentTimeLineFuture.border': 'none', // week creation guide style 'week.creationGuide.color': '#515ce6', 'week.creationGuide.fontSize': '11px', 'week.creationGuide.fontWeight': 'bold', // week daygrid schedule style 'week.dayGridSchedule.borderRadius': '2px', 'week.dayGridSchedule.height': '24px', 'week.dayGridSchedule.marginTop': '2px', 'week.dayGridSchedule.marginLeft': '8px', 'week.dayGridSchedule.marginRight': '8px' }; module.exports = themeConfig; /***/ }), /***/ "./src/js/view/layout.js": /*!*******************************!*\ !*** ./src/js/view/layout.js ***! \*******************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Layout view. wrap all view containers at outside. * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../config */ "./src/js/config.js"); var domutil = __webpack_require__(/*! ../common/domutil */ "./src/js/common/domutil.js"); var Collection = __webpack_require__(/*! ../common/collection */ "./src/js/common/collection.js"); var View = __webpack_require__(/*! ./view */ "./src/js/view/view.js"); /** * Layout view for toggle each child view. It will controlled via navigation UI. * @constructor * @extends {View} * @param {HTMLElement} container Container element to use layout view. * @param {Theme} theme - theme instance */ function Layout(container, theme) { container = domutil.appendHTMLElement('div', container, config.classname('layout')); /** * @type {HTMLElement} */ this.container = container; /*eslint-disable*/ /** * @type {Collection} Child view collection. */ this.children = new Collection(function(childView) { return childView.viewName; }); /* eslint-enable*/ /** * @type {Theme} */ this.theme = theme; this.applyTheme(); } util.inherit(Layout, View); /** * Clear child views. */ Layout.prototype.clear = function() { this.children.each(function(childView) { childView.destroy(); }); this.children.clear(); this.container.innerHTML = ''; }; /** * Remove child view. * @override * @param {(string|View)} viewName - name of view or instance. */ Layout.prototype.removeChild = function(viewName) { this.children.remove(viewName); }; /** * Toggle child views. * @param {string} viewName - Name of view. */ Layout.prototype.toggleChildView = function(viewName) { var container, prefix = ['add', 'remove'], flag; this.children.each(function(childView) { container = childView.container; flag = Number(childView.viewName === viewName); domutil[prefix[flag] + 'Class'](container, config.classname('hidden')); }); }; Layout.prototype.applyTheme = function() { var style = this.container.style; var theme = this.theme.common; // background color style.backgroundColor = theme.backgroundColor; }; module.exports = Layout; /***/ }), /***/ "./src/js/view/month/month.js": /*!************************************!*\ !*** ./src/js/view/month/month.js ***! \************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Month view * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"), datetime = __webpack_require__(/*! ../../common/datetime */ "./src/js/common/datetime.js"), domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"), TZDate = __webpack_require__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date, tmpl = __webpack_require__(/*! ../template/month/month.hbs */ "./src/js/view/template/month/month.hbs"), View = __webpack_require__(/*! ../view */ "./src/js/view/view.js"), VLayout = __webpack_require__(/*! ../..//common/vlayout */ "./src/js/common/vlayout.js"), WeekdayInMonth = __webpack_require__(/*! ./weekdayInMonth */ "./src/js/view/month/weekdayInMonth.js"); var mmin = Math.min; /** * @constructor * @extends {View} * @param {object} options - options * @param {function} [options.scheduleFilter] - schedule filter * @param {number} [options.startDayOfWeek=0] - start day of week * @param {string} [options.renderMonth='2015-12'] - render month * @param {string[]} [options.daynames] - daynames to use upside of month view * @param {HTMLElement} container - container element * @param {Base.Month} controller - controller instance */ function Month(options, container, controller) { var theme = controller ? controller.theme : null; var monthOption; options = options || {}; monthOption = options ? options.month : {}; View.call(this, container); /** * @type {Base.Month} */ this.controller = controller; /** * @type {VLayout} */ this.vLayout = new VLayout({ panels: [ {height: parseInt(controller.theme.month.dayname.height, 10) || 42}, {autoHeight: true} ] }, container, theme); /** * @type {string} */ this.options = util.extend({ scheduleFilter: function(schedule) { return Boolean(schedule.isVisible); }, startDayOfWeek: 0, renderMonth: '2018-01', daynames: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], narrowWeekend: false, visibleWeeksCount: null, isAlways6Week: true, isReadOnly: options.isReadOnly, grid: { header: { height: 34 }, footer: { height: 3 } } }, monthOption); this.options.grid.header = util.extend({ height: 34 }, util.pick(monthOption, 'grid', 'header')); this.options.grid.footer = util.extend({ height: 3 }, util.pick(monthOption, 'grid', 'footer')); /** * horizontal grid information * @type {Object} */ this.grids = datetime.getGridLeftAndWidth( this.options.daynames.length, this.options.narrowWeekend, this.options.startDayOfWeek); } util.inherit(Month, View); /** * Name of view. for managing subview at layout view * @type {string} */ Month.prototype.viewName = 'month'; /** * Get calendar array by supplied date * @param {string} renderMonth - month to render YYYY-MM, weeks2/3 to render YYYY-MM-DD * @returns {array.<Date[]>} calendar array */ Month.prototype._getMonthCalendar = function(renderMonth) { var date = new TZDate(renderMonth); var startDayOfWeek = this.options.startDayOfWeek || 0; var visibleWeeksCount = mmin(this.options.visibleWeeksCount || 0, 6); var workweek = this.options.workweek || false; var datetimeOptions, calendar; if (this.options.visibleWeeksCount) { datetimeOptions = { startDayOfWeek: startDayOfWeek, isAlways6Week: false, visibleWeeksCount: visibleWeeksCount, workweek: workweek }; } else { datetimeOptions = { startDayOfWeek: startDayOfWeek, isAlways6Week: this.options.isAlways6Week, workweek: workweek }; } calendar = datetime.arr2dCalendar(date, datetimeOptions); return calendar; }; /** * Create children view (week) and add children * @param {HTMLElement} container - container element to render weeks * @param {array.<Date[]>} calendar - calendar array from datetime#arr2dCalendar * @param {Theme} theme - theme instance */ Month.prototype._renderChildren = function(container, calendar, theme) { var self = this; var weekCount = calendar.length; var heightPercent = 100 / weekCount; var opt = this.options; var renderMonth = opt.renderMonth; var narrowWeekend = opt.narrowWeekend; var startDayOfWeek = opt.startDayOfWeek; var visibleWeeksCount = opt.visibleWeeksCount; var visibleScheduleCount = opt.visibleScheduleCount; var gridOption = opt.grid; var isReadOnly = opt.isReadOnly; container.innerHTML = ''; this.children.clear(); util.forEach(calendar, function(weekArr) { var start = new TZDate(weekArr[0]), end = new TZDate(weekArr[weekArr.length - 1]), weekdayViewContainer, weekdayView; weekdayViewContainer = domutil.appendHTMLElement( 'div', container, config.classname('month-week-item')); weekdayView = new WeekdayInMonth({ renderMonth: renderMonth, heightPercent: heightPercent, renderStartDate: start, renderEndDate: end, narrowWeekend: narrowWeekend, startDayOfWeek: startDayOfWeek, visibleWeeksCount: visibleWeeksCount, visibleScheduleCount: visibleScheduleCount, grid: gridOption, scheduleHeight: parseInt(theme.month.schedule.height, 10), scheduleGutter: parseInt(theme.month.schedule.marginTop, 10), isReadOnly: isReadOnly }, weekdayViewContainer); self.addChild(weekdayView); }); }; /** * Render month view * @override */ Month.prototype.render = function() { var self = this, opt = this.options, vLayout = this.vLayout, controller = this.controller, daynames = opt.daynames, workweek = opt.workweek, calendar = this._getMonthCalendar(opt.renderMonth), scheduleFilter = opt.scheduleFilter, theme = controller ? controller.theme : null, styles = this._getStyles(theme), grids, daynameViewModel, baseViewModel; grids = this.grids = datetime.getGridLeftAndWidth( opt.daynames.length, opt.narrowWeekend, opt.startDayOfWeek ); daynameViewModel = util.map( util.range(opt.startDayOfWeek, 7).concat(util.range(7)).slice(0, 7), function(day, index) { return { day: day, label: daynames[day], width: grids[index] ? grids[index].width : 0, left: grids[index] ? grids[index].left : 0, color: this._getDayNameColor(theme, day) }; }, this ); if (workweek) { grids = this.grids = datetime.getGridLeftAndWidth(5, opt.narrowWeekend, opt.startDayOfWeek, workweek); daynameViewModel = util.filter(daynameViewModel, function(daynameModel) { return !datetime.isWeekend(daynameModel.day); }); util.forEach(daynameViewModel, function(daynameModel, index) { daynameModel.width = grids[index] ? grids[index].width : 0; daynameModel.left = grids[index] ? grids[index].left : 0; }); } baseViewModel = { daynames: daynameViewModel, styles: styles }; vLayout.panels[0].container.innerHTML = tmpl(baseViewModel); this._renderChildren(vLayout.panels[1].container, calendar, theme); baseViewModel.panelHeight = vLayout.panels[1].getHeight(); this.children.each(function(childView) { var start = datetime.start(childView.options.renderStartDate); var end = datetime.start(childView.options.renderEndDate); var eventsInDateRange = controller.findByDateRange( datetime.start(start), datetime.end(end), scheduleFilter ); var dateRange = datetime.range( datetime.start(start), datetime.end(end), datetime.MILLISECONDS_PER_DAY); var viewModel = { eventsInDateRange: eventsInDateRange, range: dateRange.slice(0, grids.length), grids: grids, panelHeight: baseViewModel.panelHeight, theme: theme }; childView.render(viewModel); self._invokeAfterRenderSchedule(eventsInDateRange); }); }; /** * Fire 'afterRenderSchedule' event * @param {Array} matrices - schedule matrices from view model * @fires Month#afterRenderSchedule */ Month.prototype._invokeAfterRenderSchedule = function(matrices) { var self = this; util.forEachArray(matrices, function(matrix) { util.forEachArray(matrix, function(column) { util.forEachArray(column, function(scheduleViewModel) { if (scheduleViewModel && !scheduleViewModel.hidden) { /** * @event Month#afterRenderSchedule */ self.fire('afterRenderSchedule', {schedule: scheduleViewModel.model}); } }); }); }); }; /** * Get the styles from theme * @param {Theme} theme - theme instance * @returns {object} styles - styles object */ Month.prototype._getStyles = function(theme) { var styles = {}; var dayname; if (theme) { dayname = theme.month.dayname; styles.borderTop = dayname.borderTop || theme.common.border; styles.borderLeft = dayname.borderLeft || theme.common.border; styles.height = dayname.height; styles.paddingLeft = dayname.paddingLeft; styles.paddingRight = dayname.paddingRight; styles.fontSize = dayname.fontSize; styles.backgroundColor = dayname.backgroundColor; styles.fontWeight = dayname.fontWeight; styles.textAlign = dayname.textAlign; } return styles; }; /** * Get a day name color * @param {Theme} theme - theme instance * @param {number} day - day number * @returns {string} style - color style */ Month.prototype._getDayNameColor = function(theme, day) { var color = ''; if (theme) { if (day === 0) { color = theme.common.holiday.color; } else if (day === 6) { color = theme.common.saturday.color; } else { color = theme.common.dayname.color; } } return color; }; module.exports = Month; /***/ }), /***/ "./src/js/view/month/more.js": /*!***********************************!*\ !*** ./src/js/view/month/more.js ***! \***********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Floating layer for displaying schedule in specific date * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var OUT_PADDING = 5; var VIEW_MIN_WIDTH = 280; var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"), domevent = __webpack_require__(/*! ../../common/domevent */ "./src/js/common/domevent.js"), domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"), View = __webpack_require__(/*! ../../view/view */ "./src/js/view/view.js"), FloatingLayer = __webpack_require__(/*! ../../common/floatingLayer */ "./src/js/common/floatingLayer.js"), common = __webpack_require__(/*! ../../common/common */ "./src/js/common/common.js"), tmpl = __webpack_require__(/*! ../template/month/more.hbs */ "./src/js/view/template/month/more.hbs"); /** * @constructor * @extends {View} * @param {object} options - options * @param {object} [options.moreLayerSize] - more layer size * @param {object} [options.moreLayerSize.width=null] - css width value(px, auto). * The default value 'null' is to fit a grid cell. * @param {object} [options.moreLayerSize.height=null] - css height value(px, auto). * The default value 'null' is to fit a grid cell. * @param {HTMLElement} container = container element * @param {Theme} theme - theme instance */ function More(options, container, theme) { View.call(this, container); /** * @type {FloatingLayer} */ this.layer = new FloatingLayer(null, container); /** * cached view model * @type {object} */ this._viewModel = null; /** * @type {object} */ this.options = util.extend({ moreLayerSize: { width: null, height: null }, scheduleHeight: parseInt(theme.month.schedule.height, 10) || 18, scheduleGutter: parseInt(theme.month.schedule.marginTop, 10) || 2, scheduleBulletTop: (parseInt(theme.month.schedule.height, 10) || 18) / 3, borderRadius: theme.month.schedule.borderRadius }, options); /** * @type {Theme} */ this.theme = theme; domevent.on(container, 'click', this._onClick, this); } util.inherit(More, View); /** * Click event handler for close button * @param {MouseEvent} clickEvent - mouse event object */ More.prototype._onClick = function(clickEvent) { var target = (clickEvent.target || clickEvent.srcElement); var className = config.classname('month-more-close'); if (!domutil.hasClass(target, className) && !domutil.closest(target, '.' + className)) { return; } this.hide(); }; /** * Mousedown event handler for hiding more layer when user mousedown outside of * layer * @param {MouseEvent} mouseDownEvent - mouse event object */ More.prototype._onMouseDown = function(mouseDownEvent) { var target = (mouseDownEvent.target || mouseDownEvent.srcElement), moreLayer = domutil.closest(target, config.classname('.month-more')); if (moreLayer) { return; } this.hide(); }; /** * Get new position for more layer by +n element itself * @param {HTMLElement} target - parent grid-line element of +n element * @param {HTMLElement} weekItem - weekItem container element * @returns {number[]} new position of more layer */ More.prototype._getRenderPosition = function(target, weekItem) { var pos = domevent.getMousePosition({ clientX: domutil.getPosition(target)[0], clientY: domutil.getPosition(weekItem)[1] }, this.container); var containerSize = domutil.getSize(this.container); var left = pos[0] - OUT_PADDING; var top = pos[1] - OUT_PADDING; left = common.ratio(containerSize[0], 100, left); top = common.ratio(containerSize[1], 100, top); return [left, top]; }; /** * @override */ More.prototype.destroy = function() { this.layer.destroy(); this.layer = null; domevent.off(this.container, 'click', this._onClick, this); domevent.off(document.body, 'mousedown', this._onMouseDown, this); View.prototype.destroy.call(this); }; /** * @override * @param {object} viewModel - view model from factory/monthView */ More.prototype.render = function(viewModel) { var target = domutil.closest(viewModel.target, config.classname('.weekday-grid-line')); var weekItem = domutil.closest(target, config.classname('.month-week-item')); var layer = this.layer; var self = this; var pos = this._getRenderPosition(target, weekItem); var minHeight = domutil.getSize(weekItem)[1] + (OUT_PADDING * 2); var width = target.offsetWidth + (OUT_PADDING * 2); var opt = this.options; var optMoreLayerSize = opt.moreLayerSize; var styles = this._getStyles(this.theme); var maxVisibleSchedulesInLayer = 10; var height = ''; var containerSize = domutil.getSize(this.container); var calWidth = 0; var calHeight = 0; var isOverWidth = false; var isOverHeight = false; var leftPos = pos[0]; var topPos = pos[1]; this._viewModel = util.extend(viewModel, { scheduleGutter: opt.scheduleGutter, scheduleHeight: opt.scheduleHeight, scheduleBulletTop: opt.scheduleBulletTop, borderRadius: opt.borderRadius, styles: styles }); width = Math.max(width, VIEW_MIN_WIDTH); height = parseInt(styles.titleHeight, 10); height += parseInt(styles.titleMarginBottom, 10); if (viewModel.schedules.length <= maxVisibleSchedulesInLayer) { height += (opt.scheduleGutter + opt.scheduleHeight) * viewModel.schedules.length; } else { height += (opt.scheduleGutter + opt.scheduleHeight) * maxVisibleSchedulesInLayer; } height += parseInt(styles.paddingBottom, 10); height += OUT_PADDING; // for border if (optMoreLayerSize.width) { width = optMoreLayerSize.width; } if (optMoreLayerSize.height) { height = optMoreLayerSize.height; } if (isNaN(height) || height < minHeight) { height = minHeight; } layer.setContent(tmpl(viewModel)); calWidth = leftPos * containerSize[0] / 100; calHeight = topPos * containerSize[1] / 100; isOverWidth = calWidth + width >= containerSize[0]; isOverHeight = calHeight + height >= containerSize[1]; leftPos = leftPos + '%'; topPos = topPos + '%'; if (isOverWidth && isOverHeight) { layer.setLTRB({ right: 0, bottom: 0 }); } else if (!isOverWidth && isOverHeight) { layer.setLTRB({ left: leftPos, bottom: 0 }); } else if (isOverWidth && !isOverHeight) { layer.setLTRB({ right: 0, top: topPos }); } else { layer.setPosition(leftPos, topPos); } layer.setSize(width, height); layer.show(); util.debounce(function() { domevent.on(document.body, 'mousedown', self._onMouseDown, self); })(); }; /** * Hide layer */ More.prototype.hide = function() { this.layer.hide(); domevent.off(document.body, 'mousedown', this._onMouseDown, this); }; /** * refresh layer */ More.prototype.refresh = function() { if (this._viewModel) { this.layer.setContent(tmpl(this._viewModel)); } }; /** * Return more layer root element * @returns {HTMLElement} root element */ More.prototype.getMoreViewElement = function() { return domutil.find(config.classname('.month-more'), this.layer.container); }; /** * Get the styles from theme * @param {Theme} theme - theme instance * @returns {object} styles - styles object */ More.prototype._getStyles = function(theme) { var styles = {}; var listHeight = ''; if (theme) { styles.border = theme.month.moreView.border || theme.common.border; styles.boxShadow = theme.month.moreView.boxShadow; styles.backgroundColor = theme.month.moreView.backgroundColor || theme.common.backgroundColor; styles.paddingBottom = theme.month.moreView.paddingBottom; styles.titleHeight = theme.month.moreViewTitle.height; styles.titleMarginBottom = theme.month.moreViewTitle.marginBottom; styles.titleBackgroundColor = theme.month.moreViewTitle.backgroundColor; styles.titleBorderBottom = theme.month.moreViewTitle.borderBottom; styles.titlePadding = theme.month.moreViewTitle.padding; styles.listPadding = theme.month.moreViewList.padding; listHeight = 'calc(100%'; if (parseInt(styles.titleHeight, 10)) { listHeight += ' - ' + styles.titleHeight; } if (parseInt(styles.titleMarginBottom, 10)) { listHeight += ' - ' + styles.titleMarginBottom; } listHeight += ')'; styles.listHeight = listHeight; } return styles; }; module.exports = More; /***/ }), /***/ "./src/js/view/month/weekdayInMonth.js": /*!*********************************************!*\ !*** ./src/js/view/month/weekdayInMonth.js ***! \*********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Monthday in month view * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"), common = __webpack_require__(/*! ../../common/common.js */ "./src/js/common/common.js"), domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"), View = __webpack_require__(/*! ../../view/view */ "./src/js/view/view.js"), Weekday = __webpack_require__(/*! ../weekday */ "./src/js/view/weekday.js"), baseTmpl = __webpack_require__(/*! ../template/month/weekdayInMonth.hbs */ "./src/js/view/template/month/weekdayInMonth.hbs"), scheduleTmpl = __webpack_require__(/*! ../template/month/weekdayInMonthSchedule.hbs */ "./src/js/view/template/month/weekdayInMonthSchedule.hbs"); var mfloor = Math.floor, mmin = Math.min; /** * @constructor * @extends {Weekday} * @param {object} options - options for WeekdayInWeek view * @param {number} [options.heightPercent] - height percent of view * @param {number} [options.containerButtonGutter=8] - free space at bottom to * make create easy. * @param {number} [options.scheduleHeight=18] - height of each schedule block. * @param {number} [options.scheduleGutter=2] - gutter height of each schedule block. * @param {HTMLDIVElement} container - DOM element to use container for this * view. */ function WeekdayInMonth(options, container) { Weekday.call(this, options, container); container.style.height = options.heightPercent + '%'; } util.inherit(WeekdayInMonth, Weekday); /** * Get schedule container element's bound properly by override * * View#getViewBound. * @override */ WeekdayInMonth.prototype.getViewBound = function() { var bound = View.prototype.getViewBound.call(this); return bound; }; /** * Get limit index of schedule block in current view * @param {number} panelHeight - panel's height for pre-calculation * @returns {number} limit index */ WeekdayInMonth.prototype._getRenderLimitIndex = function(panelHeight) { var opt = this.options; var containerHeight = panelHeight || this.getViewBound().height; var gridHeaderHeight = util.pick(opt, 'grid', 'header', 'height') || 0; var gridFooterHeight = util.pick(opt, 'grid', 'footer', 'height') || 0; var visibleScheduleCount = opt.visibleScheduleCount || 0; var count; containerHeight -= (gridHeaderHeight + gridFooterHeight); count = mfloor(containerHeight / (opt.scheduleHeight + opt.scheduleGutter)); if (!visibleScheduleCount) { visibleScheduleCount = count; } return mmin(count, visibleScheduleCount); // subtraction for '+n' label block }; /** * @override * @param {object} viewModel - schedules view models */ WeekdayInMonth.prototype.getBaseViewModel = function(viewModel) { var opt = this.options, gridHeaderHeight = util.pick(opt, 'grid', 'header', 'height') || 0, gridFooterHeight = util.pick(opt, 'grid', 'footer', 'height') || 0, renderLimitIdx = this._getRenderLimitIndex() + 1, exceedDate = this.getExceedDate(renderLimitIdx, viewModel.eventsInDateRange, viewModel.range), styles = this._getStyles(viewModel.theme); var baseViewModel; viewModel = util.extend({ exceedDate: exceedDate }, viewModel); baseViewModel = Weekday.prototype.getBaseViewModel.call(this, viewModel); baseViewModel = util.extend({ matrices: viewModel.eventsInDateRange, gridHeaderHeight: gridHeaderHeight, gridFooterHeight: gridFooterHeight, renderLimitIdx: renderLimitIdx, isReadOnly: opt.isReadOnly, styles: styles }, baseViewModel); return baseViewModel; }; /** * @override * @param {object} viewModel - schedules view models */ WeekdayInMonth.prototype.render = function(viewModel) { var container = this.container, baseViewModel = this.getBaseViewModel(viewModel), scheduleContainer; if (!this.options.visibleWeeksCount) { setIsOtherMonthFlag(baseViewModel.dates, this.options.renderMonth, viewModel.theme); } container.innerHTML = baseTmpl(baseViewModel); scheduleContainer = domutil.find( config.classname('.weekday-schedules'), container ); if (!scheduleContainer) { return; } scheduleContainer.innerHTML = scheduleTmpl(baseViewModel); common.setAutoEllipsis( config.classname('.weekday-schedule-title'), container, true ); }; WeekdayInMonth.prototype._beforeDestroy = function() { }; /** * Get the styles from theme * @param {Theme} theme - theme instance * @returns {object} styles - styles object */ WeekdayInMonth.prototype._getStyles = function(theme) { var styles = {}; if (theme) { styles.borderTop = theme.common.border; styles.borderLeft = theme.common.border; styles.fontSize = theme.month.day.fontSize; styles.borderRadius = theme.month.schedule.borderRadius; styles.marginLeft = theme.month.schedule.marginLeft; styles.marginRight = theme.month.schedule.marginRight; styles.scheduleBulletTop = this.options.scheduleHeight / 3; } return styles; }; /** * 현재 달이 아닌 날짜에 대해 isOtherMonth = true 플래그를 추가한다. * @param {Array} dates - 날짜정보 배열 * @param {TZDate} renderMonth - 현재 렌더링중인 월 (YYYYMM) * @param {Theme} theme - theme instance */ function setIsOtherMonthFlag(dates, renderMonth, theme) { var month = renderMonth.getMonth() + 1; util.forEach(dates, function(dateObj) { var isOtherMonth = dateObj.month !== month; dateObj.isOtherMonth = isOtherMonth; if (isOtherMonth) { dateObj.color = Weekday.prototype._getDayNameColor(theme, dateObj.day, dateObj.isToday, isOtherMonth); } }); } module.exports = WeekdayInMonth; /***/ }), /***/ "./src/js/view/popup/scheduleCreationPopup.js": /*!****************************************************!*\ !*** ./src/js/view/popup/scheduleCreationPopup.js ***! \****************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Floating layer for writing new schedules * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var View = __webpack_require__(/*! ../../view/view */ "./src/js/view/view.js"); var FloatingLayer = __webpack_require__(/*! ../../common/floatingLayer */ "./src/js/common/floatingLayer.js"); var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var DatePicker = __webpack_require__(/*! tui-date-picker */ "tui-date-picker"); var timezone = __webpack_require__(/*! ../../common/timezone */ "./src/js/common/timezone.js"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"); var domevent = __webpack_require__(/*! ../../common/domevent */ "./src/js/common/domevent.js"); var domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); var common = __webpack_require__(/*! ../../common/common */ "./src/js/common/common.js"); var tmpl = __webpack_require__(/*! ../template/popup/scheduleCreationPopup.hbs */ "./src/js/view/template/popup/scheduleCreationPopup.hbs"); var TZDate = timezone.Date; var MAX_WEEK_OF_MONTH = 6; var ARROW_WIDTH_HALF = 8; /** * @constructor * @extends {View} * @param {HTMLElement} container - container element * @param {Array.<Calendar>} calendars - calendar list used to create new schedule */ function ScheduleCreationPopup(container, calendars) { View.call(this, container); /** * @type {FloatingLayer} */ this.layer = new FloatingLayer(null, container); /** * cached view model * @type {object} */ this._viewModel = null; this._selectedCal = null; this._schedule = null; this.calendars = calendars; this._focusedDropdown = null; this._onClickListeners = [ this._selectDropdownMenuItem.bind(this), this._toggleDropdownMenuView.bind(this), this._closeDropdownMenuView.bind(this, null), this._closePopup.bind(this), this._toggleIsAllday.bind(this), this._toggleIsPrivate.bind(this), this._onClickSaveSchedule.bind(this) ]; domevent.on(container, 'click', this._onClick, this); } util.inherit(ScheduleCreationPopup, View); /** * Mousedown event handler for hiding popup layer when user mousedown outside of * layer * @param {MouseEvent} mouseDownEvent - mouse event object */ ScheduleCreationPopup.prototype._onMouseDown = function(mouseDownEvent) { var target = (mouseDownEvent.target || mouseDownEvent.srcElement), popupLayer = domutil.closest(target, config.classname('.floating-layer')); if (popupLayer) { return; } this.hide(); }; /** * @override */ ScheduleCreationPopup.prototype.destroy = function() { this.layer.destroy(); this.layer = null; domevent.off(this.container, 'click', this._onClick, this); domevent.off(document.body, 'mousedown', this._onMouseDown, this); View.prototype.destroy.call(this); }; /** * @override * Click event handler for close button * @param {MouseEvent} clickEvent - mouse event object */ ScheduleCreationPopup.prototype._onClick = function(clickEvent) { var target = (clickEvent.target || clickEvent.srcElement); util.forEach(this._onClickListeners, function(listener) { return !listener(target); }); }; /** * Test click event target is close button, and return layer is closed(hidden) * @param {HTMLElement} target click event target * @returns {boolean} whether popup layer is closed or not */ ScheduleCreationPopup.prototype._closePopup = function(target) { var className = config.classname('popup-close'); if (domutil.hasClass(target, className) || domutil.closest(target, '.' + className)) { this.hide(); return true; } return false; }; /** * Toggle dropdown menu view, when user clicks dropdown button * @param {HTMLElement} target click event target * @returns {boolean} whether user clicked dropdown button or not */ ScheduleCreationPopup.prototype._toggleDropdownMenuView = function(target) { var className = config.classname('dropdown-button'); var dropdownBtn = domutil.hasClass(target, className) ? target : domutil.closest(target, '.' + className); if (!dropdownBtn) { return false; } if (domutil.hasClass(dropdownBtn.parentNode, config.classname('open'))) { this._closeDropdownMenuView(dropdownBtn.parentNode); } else { this._openDropdownMenuView(dropdownBtn.parentNode); } return true; }; /** * Close drop down menu * @param {HTMLElement} dropdown - dropdown element that has a opened dropdown menu */ ScheduleCreationPopup.prototype._closeDropdownMenuView = function(dropdown) { dropdown = dropdown || this._focusedDropdown; if (dropdown) { domutil.removeClass(dropdown, config.classname('open')); this._focusedDropdown = null; } }; /** * Open drop down menu * @param {HTMLElement} dropdown - dropdown element that has a closed dropdown menu */ ScheduleCreationPopup.prototype._openDropdownMenuView = function(dropdown) { domutil.addClass(dropdown, config.classname('open')); this._focusedDropdown = dropdown; }; /** * If click dropdown menu item, close dropdown menu * @param {HTMLElement} target click event target * @returns {boolean} whether */ ScheduleCreationPopup.prototype._selectDropdownMenuItem = function(target) { var itemClassName = config.classname('dropdown-menu-item'); var iconClassName = config.classname('icon'); var contentClassName = config.classname('content'); var selectedItem = domutil.hasClass(target, itemClassName) ? target : domutil.closest(target, '.' + itemClassName); var bgColor, title, dropdown, dropdownBtn; if (!selectedItem) { return false; } bgColor = domutil.find('.' + iconClassName, selectedItem).style.backgroundColor || 'transparent'; title = domutil.find('.' + contentClassName, selectedItem).innerHTML; dropdown = domutil.closest(selectedItem, config.classname('.dropdown')); dropdownBtn = domutil.find(config.classname('.dropdown-button'), dropdown); domutil.find('.' + contentClassName, dropdownBtn).innerText = title; if (domutil.hasClass(dropdown, config.classname('section-calendar'))) { domutil.find('.' + iconClassName, dropdownBtn).style.backgroundColor = bgColor; this._selectedCal = common.find(this.calendars, function(cal) { return cal.id === domutil.getData(selectedItem, 'calendarId'); }); } domutil.removeClass(dropdown, config.classname('open')); return true; }; /** * Toggle allday checkbox state * @param {HTMLElement} target click event target * @returns {boolean} whether event target is allday section or not */ ScheduleCreationPopup.prototype._toggleIsAllday = function(target) { var className = config.classname('section-allday'); var alldaySection = domutil.hasClass(target, className) ? target : domutil.closest(target, '.' + className); var checkbox; if (alldaySection) { checkbox = domutil.find(config.classname('.checkbox-square'), alldaySection); checkbox.checked = !checkbox.checked; return true; } return false; }; /** * Toggle private button * @param {HTMLElement} target click event target * @returns {boolean} whether event target is private section or not */ ScheduleCreationPopup.prototype._toggleIsPrivate = function(target) { var className = config.classname('section-private'); var privateSection = domutil.hasClass(target, className) ? target : domutil.closest(target, '.' + className); if (privateSection) { if (domutil.hasClass(privateSection, config.classname('public'))) { domutil.removeClass(privateSection, config.classname('public')); } else { domutil.addClass(privateSection, config.classname('public')); } return true; } return false; }; /** * Save new schedule if user clicked save button * @emits ScheduleCreationPopup#saveSchedule * @param {HTMLElement} target click event target * @returns {boolean} whether save button is clicked or not */ ScheduleCreationPopup.prototype._onClickSaveSchedule = function(target) { var className = config.classname('popup-save'); var cssPrefix = config.cssPrefix; var title, isPrivate, location, isAllDay, startDate, endDate, state; var start, end, calendarId; if (!domutil.hasClass(target, className) && !domutil.closest(target, '.' + className)) { return false; } title = domutil.get(cssPrefix + 'schedule-title'); startDate = new TZDate(this.rangePicker.getStartDate()).toLocalTime(); endDate = new TZDate(this.rangePicker.getEndDate()).toLocalTime(); if (!title.value) { title.focus(); return true; } if (!startDate && !endDate) { return true; } isPrivate = !domutil.hasClass(domutil.get(cssPrefix + 'schedule-private'), config.classname('public')); location = domutil.get(cssPrefix + 'schedule-location'); state = domutil.get(cssPrefix + 'schedule-state'); isAllDay = !!domutil.get(cssPrefix + 'schedule-allday').checked; if (isAllDay) { startDate.setHours(0, 0, 0); endDate.setHours(23, 59, 59); } start = new TZDate(startDate); end = new TZDate(endDate); if (this._selectedCal) { calendarId = this._selectedCal.id; } if (this._isEditMode) { this.fire('beforeUpdateSchedule', { schedule: { calendarId: calendarId || this._schedule.calendarId, title: title.value, location: location.value, raw: { class: isPrivate ? 'private' : 'public' }, start: start, end: end, isAllDay: isAllDay, state: state.innerText, triggerEventName: 'click', id: this._schedule.id }, start: start, end: end, calendar: this._selectedCal, triggerEventName: 'click' }); } else { /** * @event ScheduleCreationPopup#beforeCreateSchedule * @type {object} * @property {Schedule} schedule - new schedule instance to be added */ this.fire('beforeCreateSchedule', { calendarId: calendarId, title: title.value, location: location.value, raw: { class: isPrivate ? 'private' : 'public' }, start: start, end: end, isAllDay: isAllDay, state: state.innerText }); } this.hide(); return true; }; /** * @override * @param {object} viewModel - view model from factory/monthView */ ScheduleCreationPopup.prototype.render = function(viewModel) { var calendars = this.calendars; var layer = this.layer; var self = this; var boxElement, guideElements; viewModel.zIndex = this.layer.zIndex + 5; viewModel.calendars = calendars; if (calendars.length) { viewModel.selectedCal = this._selectedCal = calendars[0]; } this._isEditMode = viewModel.schedule && viewModel.schedule.id; if (this._isEditMode) { boxElement = viewModel.target; viewModel = this._makeEditModeData(viewModel); } else { this.guide = viewModel.guide; guideElements = this._getGuideElements(this.guide); boxElement = guideElements.length ? guideElements[0] : null; } layer.setContent(tmpl(viewModel)); this._createDatepicker(viewModel.start, viewModel.end, viewModel.isAllDay); layer.show(); if (boxElement) { this._setPopupPositionAndArrowDirection(boxElement.getBoundingClientRect()); } util.debounce(function() { domevent.on(document.body, 'mousedown', self._onMouseDown, self); })(); }; /** * Make view model for edit mode * @param {object} viewModel - original view model from 'beforeCreateEditPopup' * @returns {object} - edit mode view model */ ScheduleCreationPopup.prototype._makeEditModeData = function(viewModel) { var schedule = viewModel.schedule; var title, isPrivate, location, startDate, endDate, isAllDay, state; var raw = schedule.raw || {}; var calendars = this.calendars; var id = schedule.id; title = schedule.title; isPrivate = raw['class'] === 'private'; location = schedule.location; startDate = schedule.start; endDate = schedule.end; isAllDay = schedule.isAllDay; state = schedule.state; viewModel.selectedCal = this._selectedCal = common.find(this.calendars, function(cal) { return cal.id === viewModel.schedule.calendarId; }); this._schedule = schedule; return { id: id, selectedCal: this._selectedCal, calendars: calendars, title: title, isPrivate: isPrivate, location: location, isAllDay: isAllDay, state: state, start: startDate, end: endDate, raw: { class: isPrivate ? 'private' : 'public' }, zIndex: this.layer.zIndex + 5, isEditMode: this._isEditMode }; }; /** * Set popup position and arrow direction to apear near guide element * @param {MonthCreationGuide|TimeCreationGuide|DayGridCreationGuide} guideBound - creation guide element */ ScheduleCreationPopup.prototype._setPopupPositionAndArrowDirection = function(guideBound) { var layer = domutil.find(config.classname('.popup'), this.layer.container); var layerSize = { width: layer.offsetWidth, height: layer.offsetHeight }; var windowSize = { right: window.innerWidth, bottom: window.innerHeight }; var parentRect = this.layer.parent.getBoundingClientRect(); var parentBounds = { left: parentRect.left, top: parentRect.top }; var pos; pos = this._calcRenderingData(layerSize, windowSize, guideBound); pos.x -= parentBounds.left; pos.y -= (parentBounds.top + 6); this.layer.setPosition(pos.x, pos.y); this._setArrowDirection(pos.arrow); }; /** * Get guide elements from creation guide object * It is used to calculate rendering position of popup * It will be disappeared when hiding popup * @param {MonthCreationGuide|TimeCreationGuide|AlldayCreationGuide} guide - creation guide * @returns {Array.<HTMLElement>} creation guide element */ ScheduleCreationPopup.prototype._getGuideElements = function(guide) { var guideElements = []; var i = 0; if (guide.guideElement) { guideElements.push(guide.guideElement); } else if (guide.guideElements) { for (; i < MAX_WEEK_OF_MONTH; i += 1) { if (guide.guideElements[i]) { guideElements.push(guide.guideElements[i]); } } } return guideElements; }; /** * Get guide element's bound data which only includes top, right, bottom, left * @param {Array.<HTMLElement>} guideElements - creation guide elements * @returns {Object} - popup bound data */ ScheduleCreationPopup.prototype._getBoundOfFirstRowGuideElement = function(guideElements) { var bound; if (!guideElements.length) { return null; } bound = guideElements[0].getBoundingClientRect(); return { top: bound.top, left: bound.left, bottom: bound.bottom, right: bound.right }; }; /** * Calculate rendering position usering guide elements * @param {{width: {number}, height: {number}}} layerSize - popup layer's width and height * @param {{top: {number}, left: {number}, right: {number}, bottom: {number}}} parentSize - width and height of the upper layer, that acts as a border of popup * @param {{top: {number}, left: {number}, right: {number}, bottom: {number}}} guideBound - guide element bound data * @returns {PopupRenderingData} rendering position of popup and popup arrow */ ScheduleCreationPopup.prototype._calcRenderingData = function(layerSize, parentSize, guideBound) { var guideHorizontalCenter = (guideBound.left + guideBound.right) / 2; var x = guideHorizontalCenter - (layerSize.width / 2); var y = guideBound.top - layerSize.height + 3; var arrowDirection = 'arrow-bottom'; var arrowLeft; if (y < 0) { y = guideBound.bottom + 9; arrowDirection = 'arrow-top'; } if (x > 0 && (x + layerSize.width > parentSize.right)) { x = parentSize.right - layerSize.width; } if (x < 0) { x = 0; } if (guideHorizontalCenter - x !== layerSize.width / 2) { arrowLeft = guideHorizontalCenter - x - ARROW_WIDTH_HALF; } /** * @typedef {Object} PopupRenderingData * @property {number} x - left position * @property {number} y - top position * @property {string} arrow.direction - direction of popup arrow * @property {number} [arrow.position] - relative position of popup arrow, if it is not set, arrow appears on the middle of popup */ return { x: x, y: y, arrow: { direction: arrowDirection, position: arrowLeft } }; }; /** * Set arrow's direction and position * @param {Object} arrow rendering data for popup arrow */ ScheduleCreationPopup.prototype._setArrowDirection = function(arrow) { var direction = arrow.direction || 'arrow-bottom'; var arrowEl = domutil.get(config.classname('popup-arrow')); var borderElement = domutil.find(config.classname('.popup-arrow-border', arrowEl)); if (direction !== config.classname('arrow-bottom')) { domutil.removeClass(arrowEl, config.classname('arrow-bottom')); domutil.addClass(arrowEl, config.classname(direction)); } if (arrow.position) { borderElement.style.left = arrow.position + 'px'; } }; /** * Create date range picker using start date and end date * @param {TZDate} start - start date * @param {TZDate} end - end date * @param {boolean} isAllDay - isAllDay */ ScheduleCreationPopup.prototype._createDatepicker = function(start, end, isAllDay) { var cssPrefix = config.cssPrefix; this.rangePicker = DatePicker.createRangePicker({ startpicker: { date: new TZDate(start).toDate(), input: '#' + cssPrefix + 'schedule-start-date', container: '#' + cssPrefix + 'startpicker-container' }, endpicker: { date: new TZDate(end).toDate(), input: '#' + cssPrefix + 'schedule-end-date', container: '#' + cssPrefix + 'endpicker-container' }, format: isAllDay ? 'yyyy-MM-dd' : 'yyyy-MM-dd HH:mm', timepicker: isAllDay ? null : { showMeridiem: false }, usageStatistics: true }); }; /** * Hide layer */ ScheduleCreationPopup.prototype.hide = function() { this.layer.hide(); if (this.guide) { this.guide.clearGuideElement(); this.guide = null; } domevent.off(document.body, 'mousedown', this._onMouseDown, this); }; /** * refresh layer */ ScheduleCreationPopup.prototype.refresh = function() { if (this._viewModel) { this.layer.setContent(this.tmpl(this._viewModel)); } }; /** * Set calendar list * @param {Array.<Calendar>} calendars - calendar list */ ScheduleCreationPopup.prototype.setCalendars = function(calendars) { this.calendars = calendars || []; }; module.exports = ScheduleCreationPopup; /***/ }), /***/ "./src/js/view/popup/scheduleDetailPopup.js": /*!**************************************************!*\ !*** ./src/js/view/popup/scheduleDetailPopup.js ***! \**************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Floating layer for showing detail schedule * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var View = __webpack_require__(/*! ../../view/view */ "./src/js/view/view.js"); var FloatingLayer = __webpack_require__(/*! ../../common/floatingLayer */ "./src/js/common/floatingLayer.js"); var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"), domevent = __webpack_require__(/*! ../../common/domevent */ "./src/js/common/domevent.js"), domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); var tmpl = __webpack_require__(/*! ../template/popup/scheduleDetailPopup.hbs */ "./src/js/view/template/popup/scheduleDetailPopup.hbs"); var ARROW_WIDTH_HALF = 8; /** * @constructor * @extends {View} * @param {HTMLElement} container - container element */ function ScheduleDetailPopup(container) { View.call(this, container); /** * @type {FloatingLayer} */ this.layer = new FloatingLayer(null, container); /** * cached view model * @type {object} */ this._viewModel = null; this._schedule = null; this._calendar = null; domevent.on(container, 'click', this._onClick, this); } util.inherit(ScheduleDetailPopup, View); /** * Mousedown event handler for hiding popup layer when user mousedown outside of * layer * @param {MouseEvent} mouseDownEvent - mouse event object */ ScheduleDetailPopup.prototype._onMouseDown = function(mouseDownEvent) { var target = (mouseDownEvent.target || mouseDownEvent.srcElement), popupLayer = domutil.closest(target, config.classname('.floating-layer')); if (popupLayer) { return; } this.hide(); }; /** * @override */ ScheduleDetailPopup.prototype.destroy = function() { this.layer.destroy(); this.layer = null; domevent.off(this.container, 'click', this._onClick, this); domevent.off(document.body, 'mousedown', this._onMouseDown, this); View.prototype.destroy.call(this); }; /** * @override * Click event handler for close button * @param {MouseEvent} clickEvent - mouse event object */ ScheduleDetailPopup.prototype._onClick = function(clickEvent) { var target = (clickEvent.target || clickEvent.srcElement); this._onClickEditSchedule(target); this._onClickDeleteSchedule(target); }; /** * @fires ScheduleDetailPopup#clickEditSchedule * @param {HTMLElement} target - event target */ ScheduleDetailPopup.prototype._onClickEditSchedule = function(target) { var className = config.classname('popup-edit'); if (domutil.hasClass(target, className) || domutil.closest(target, '.' + className)) { this.fire('beforeUpdateSchedule', { schedule: this._schedule, triggerEventName: 'click', target: this._scheduleEl }); this.hide(); } }; /** * @fires ScheduleDetailPopup#clickEditSchedule * @param {HTMLElement} target - event target */ ScheduleDetailPopup.prototype._onClickDeleteSchedule = function(target) { var className = config.classname('popup-delete'); if (domutil.hasClass(target, className) || domutil.closest(target, '.' + className)) { this.fire('beforeDeleteSchedule', { schedule: this._schedule }); this.hide(); } }; /** * @override * @param {object} viewModel - view model from factory/monthView */ ScheduleDetailPopup.prototype.render = function(viewModel) { var layer = this.layer; var self = this; layer.setContent(tmpl({ schedule: viewModel.schedule, calendar: viewModel.calendar })); layer.show(); this._setPopupPositionAndArrowDirection(viewModel.event); this._schedule = viewModel.schedule; this._calendar = viewModel.calendar; util.debounce(function() { domevent.on(document.body, 'mousedown', self._onMouseDown, self); })(); }; /** * Set popup position and arrow direction to apear near guide element * @param {Event} event - creation guide element */ ScheduleDetailPopup.prototype._setPopupPositionAndArrowDirection = function(event) { var layer = domutil.find(config.classname('.popup'), this.layer.container); var layerSize = { width: layer.offsetWidth, height: layer.offsetHeight }; var windowSize = { right: window.innerWidth, bottom: window.innerHeight }; var parentRect = this.layer.parent.getBoundingClientRect(); var parentBounds = { left: parentRect.left, top: parentRect.top }; var scheduleEl = event.target || event.srcElement; var blockEl = domutil.closest(scheduleEl, config.classname('.time-date-schedule-block')) || domutil.closest(scheduleEl, config.classname('.weekday-schedule')) || scheduleEl; var scheduleBound = blockEl.getBoundingClientRect(); var pos; this._scheduleEl = blockEl; pos = this._calcRenderingData(layerSize, windowSize, scheduleBound); pos.x -= parentBounds.left + 4; pos.y -= (parentBounds.top + ARROW_WIDTH_HALF); this.layer.setPosition(pos.x, pos.y); this._setArrowDirection(pos.arrow); }; /** * Calculate rendering position usering guide elements * @param {{width: {number}, height: {number}}} layerSize - popup layer's width and height * @param {{top: {number}, left: {number}, right: {number}, bottom: {number}}} parentSize - width and height of the upper layer, that acts as a border of popup * @param {{top: {number}, left: {number}, right: {number}, bottom: {number}}} guideBound - guide element bound data * @returns {PopupRenderingData} rendering position of popup and popup arrow */ ScheduleDetailPopup.prototype._calcRenderingData = function(layerSize, parentSize, guideBound) { var guideVerticalCenter = (guideBound.top + guideBound.bottom) / 2; var x = guideBound.right; var y = guideVerticalCenter; var arrowDirection = 'arrow-left'; var arrowTop; if (y < 0) { y = y + (layerSize.height / 2) - guideVerticalCenter; } if (x > 0 && (x + layerSize.width > parentSize.right)) { x = guideBound.left - layerSize.width - ARROW_WIDTH_HALF - 3; arrowDirection = 'arrow-right'; } if (x < 0) { x = 0; } if (guideBound.right > x + layerSize.width) { arrowDirection = 'arrow-right'; } /** * @typedef {Object} PopupRenderingData * @property {number} x - left position * @property {number} y - top position * @property {string} arrow.direction - direction of popup arrow * @property {number} [arrow.position] - relative position of popup arrow, if it is not set, arrow appears on the middle of popup */ return { x: x + ARROW_WIDTH_HALF, y: y - (layerSize.height / 2) + ARROW_WIDTH_HALF, arrow: { direction: arrowDirection, position: arrowTop } }; }; /** * Set arrow's direction and position * @param {Object} arrow rendering data for popup arrow */ ScheduleDetailPopup.prototype._setArrowDirection = function(arrow) { var direction = arrow.direction || 'arrow-left'; var arrowEl = domutil.find(config.classname('.popup-arrow'), this.layer.container); var borderElement = domutil.find(config.classname('.popup-arrow-border', arrowEl)); if (direction !== config.classname('arrow-left')) { domutil.removeClass(arrowEl, config.classname('arrow-left')); domutil.addClass(arrowEl, config.classname(direction)); } if (arrow.position) { borderElement.style.top = arrow.position + 'px'; } }; /** * Hide layer */ ScheduleDetailPopup.prototype.hide = function() { this.layer.hide(); if (this.guide) { this.guide.clearGuideElement(); this.guide = null; } domevent.off(document.body, 'mousedown', this._onMouseDown, this); }; /** * refresh layer */ ScheduleDetailPopup.prototype.refresh = function() { if (this._viewModel) { this.layer.setContent(this.tmpl(this._viewModel)); } }; module.exports = ScheduleDetailPopup; /***/ }), /***/ "./src/js/view/template/helper.js": /*!****************************************!*\ !*** ./src/js/view/template/helper.js ***! \****************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /* eslint complexity: 0 */ /** * @fileoverview Helpers for handlebar templates. * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var Handlebars = __webpack_require__(/*! handlebars-template-loader/runtime */ "./node_modules/handlebars-template-loader/runtime/index.js"); var datetime = __webpack_require__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); var common = __webpack_require__(/*! ../../common/common */ "./src/js/common/common.js"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"); var mmax = Math.max; var SIXTY_MINUTES = 60; var helpers = { /** * Stamp supplied object * * Commonly use for rendering object's unique ID to rendered view * @param {object} obj - object to stamp * @returns {number} stamp value */ 'stamp': function(obj) { return util.stamp(obj); }, /** * Whether supplied object are equal? * @param {*} a - a * @param {*} b - b * @returns {boolean} result of operation */ 'equal': function(a, b) { return a === b; }, /** * OR * @param {*} a - a * @param {*} b - b * @returns {boolean} or */ 'or': function(a, b) { return a || b; }, /** * AND * @param {*} a - a * @param {*} b - b * @returns {boolean} or */ 'and': function(a, b) { return a && b; }, /** * Compare object or apply logical operation by customizable oper parameter * @param {*} a - a * @param {string} oper - operator ex) '==', '<' * @param {*} b - b * @param {Handlebars} options - handlebar options * @returns {boolean} result of operation */ 'fi': function(a, oper, b, options) { switch (oper) { case '==': return (a == b) ? options.fn(this) : options.inverse(this); // eslint-disable-line case '===': return (a === b) ? options.fn(this) : options.inverse(this); case '!==': return (a !== b) ? options.fn(this) : options.inverse(this); case '<': return (a < b) ? options.fn(this) : options.inverse(this); case '||': return (a || b) ? options.fn(this) : options.inverse(this); default: throw new Error('Not match operation'); } }, /** * Get hhmm formatted time str * @param {Date} date - date object * @returns {string} formatted value */ 'hhmm': function(date) { return datetime.format(date, 'HH:mm'); }, /** * Get `width` stylesheet string * @param {number} width - width percentage * @returns {string} css style part */ 'common-width': function(width) { return getElSize(width, '%', 'width'); }, /** * Get element left based on narrowWeekend * @param {object} viewModel - view model * @param {Array} grids - dates information * @returns {number} element left */ 'grid-left': function(viewModel, grids) { return getElLeft(viewModel, grids); }, /** * Get element width based on narrowWeekend * @param {object} viewModel - view model * @param {Array} grids - dates information * @returns {number} element width */ 'grid-width': function(viewModel, grids) { return getElWidth(viewModel, grids); }, /** * Use in time.hbs * @param {ScheduleViewModel} viewModel viewModel * @returns {string} element size css class */ 'time-scheduleBlock': function(viewModel) { var top = getElSize(viewModel.top, 'px', 'top'), left = getElSize(viewModel.left, '%', 'left'), width = getElSize(viewModel.width, '%', 'width'), height = getElSize(viewModel.height, 'px', 'height'); return [top, left, width, height].join(';'); }, 'month-scheduleBlock': function(viewModel, grids, blockHeight, paddingTop) { var top = getElSize(((viewModel.top - 1) * blockHeight) + paddingTop, 'px', 'top'); var left = getElSize(grids[viewModel.left] ? grids[viewModel.left].left : 0, '%', 'left'); var width = getElSize(getElWidth(viewModel, grids), '%', 'width'); var height = getElSize(viewModel.height, 'px', 'height'); return [top, left, width, height].join(';'); }, 'holiday': function(day) { var cssClass = ''; if (day === 0) { cssClass = config.classname('holiday-sun'); } if (day === 6) { cssClass = config.classname('holiday-sat'); } return cssClass; }, /** * Add supplied two parameter * @param {*} a - a * @param {*} b - b * @returns {number} result of operation */ 'add': function(a, b) { return a + b; }, /** * Multiply supplied two parameter * @param {*} a - a * @param {*} b - b * @returns {number} result of operation */ 'multiply': function(a, b) { return a * b; }, /** * Divide supplied two parameter * @param {*} a - a * @param {*} b - b * @returns {number} result of operation */ 'divide': function(a, b) { return a / b; }, /** * Subtract supplied two parameter * @param {*} a - a * @param {*} b - b * @returns {number} result of operation */ 'subtract': function(a, b) { return a - b; }, 'getRight': function(a, b) { return mmax(0, 100 - (a + b)); }, /** * Get css prefix in global configuration * @returns {string} css prefix */ 'CSS_PREFIX': function() { return config.cssPrefix; }, 'reverse': function(array) { return array.slice().reverse(); }, /********** * Default schedule template **********/ 'milestone-tmpl': function(model) { var icon = config.classname('icon'); var iconName = config.classname('ic-milestone'); return '<span class="' + icon + ' ' + iconName + '"></span><span style="background-color: ' + model.bgColor + '">' + common.stripTags(model.title) + '</span>'; }, 'milestoneTitle-tmpl': function() { var className = config.classname('left-content'); return '<span class="' + className + '">Milestone</span>'; }, 'task-tmpl': function(model) { return '#' + model.title; }, 'taskTitle-tmpl': function() { var className = config.classname('left-content'); return '<span class="' + className + '">Task</span>'; }, 'alldayTitle-tmpl': function() { var className = config.classname('left-content'); return '<span class="' + className + '">All Day</span>'; }, 'allday-tmpl': function(model) { return common.stripTags(model.title); }, 'time-tmpl': function(model) { return common.stripTags(model.title); }, 'goingDuration-tmpl': function(model) { var goingDuration = model.goingDuration; var hour = parseInt(goingDuration / SIXTY_MINUTES, 10); var minutes = goingDuration % SIXTY_MINUTES; return 'GoingTime ' + datetime.leadingZero(hour, 2) + ':' + datetime.leadingZero(minutes, 2); }, 'comingDuration-tmpl': function(model) { var goingDuration = model.goingDuration; var hour = parseInt(goingDuration / SIXTY_MINUTES, 10); var minutes = goingDuration % SIXTY_MINUTES; return 'ComingTime ' + datetime.leadingZero(hour, 2) + ':' + datetime.leadingZero(minutes, 2); }, 'monthMoreTitleDate-tmpl': function(date, dayname) { var classDay = config.classname('month-more-title-day'); var classDayLabel = config.classname('month-more-title-day-label'); var day = util.pick(date.split('.'), 2); return '<span class="' + classDay + '">' + day + '</span> <span class="' + classDayLabel + '">' + dayname + '</span>'; }, 'monthMoreClose-tmpl': function() { return ''; }, 'monthGridHeader-tmpl': function(model) { var date = parseInt(model.date.split('-')[2], 10); var classNames = []; classNames.push(config.classname('weekday-grid-date')); if (model.isToday) { classNames.push(config.classname('weekday-grid-date-decorator')); } return '<span class="' + classNames.join(' ') + '">' + date + '</span>'; }, 'monthGridHeaderExceed-tmpl': function(hiddenSchedules) { var className = config.classname('weekday-grid-more-schedules'); return '<span class="' + className + '">' + hiddenSchedules + ' more</span>'; }, 'monthGridFooter-tmpl': function() { return ''; }, /* eslint no-unused-vars: 0 */ 'monthGridFooterExceed-tmpl': function(hiddenSchedules) { return ''; }, 'monthDayname-tmpl': function(model) { return model.label; }, 'weekDayname-tmpl': function(model) { var classDate = config.classname('dayname-date'); var className = config.classname('dayname-name'); return '<span class="' + classDate + '">' + model.date + '</span> <span class="' + className + '">' + model.dayName + '</span>'; }, 'weekGridFooterExceed-tmpl': function(hiddenSchedules) { return '+' + hiddenSchedules; }, 'dayGridTitle-tmpl': function(viewName) { var tmpl = Handlebars.helpers[viewName + 'Title-tmpl']; if (tmpl) { return tmpl(viewName); } return viewName; }, 'schedule-tmpl': function(model) { var tmpl = Handlebars.helpers[model.category + '-tmpl']; if (tmpl) { return tmpl(model); } return ''; }, 'collapseBtnTitle-tmpl': function() { var iconName = config.classname('icon'); var closeIconName = config.classname('ic-arrow-solid-top'); return '<span class="' + iconName + ' ' + closeIconName + '"></span>'; }, 'timezoneDisplayLabel-tmpl': function(timezoneOffset, displayLabel) { var gmt, hour, minutes; if (util.isUndefined(displayLabel)) { gmt = timezoneOffset < 0 ? '-' : '+'; hour = Math.abs(parseInt(timezoneOffset / SIXTY_MINUTES, 10)); minutes = Math.abs(timezoneOffset % SIXTY_MINUTES); displayLabel = gmt + datetime.leadingZero(hour, 2) + ':' + datetime.leadingZero(minutes, 2); } return displayLabel; }, 'timegridDisplayPrimayTime-tmpl': function(time) { /* TODO: 삭제 필요 (will be deprecated) */ return helpers['timegridDisplayPrimaryTime-tmpl'](time); }, 'timegridDisplayPrimaryTime-tmpl': function(time) { var hour = time.hour; var meridiem = hour >= 12 ? 'pm' : 'am'; if (hour > 12) { hour = hour - 12; } return hour + ' ' + meridiem; }, 'timegridDisplayTime-tmpl': function(time) { return datetime.leadingZero(time.hour, 2) + ':' + datetime.leadingZero(time.minutes, 2); }, 'timegridCurrentTime-tmpl': function(timezone) { var templates = []; if (timezone.dateDifference) { templates.push('[' + timezone.dateDifferenceSign + timezone.dateDifference + ']<br>'); } templates.push(datetime.format(timezone.hourmarker, 'HH:mm')); return templates.join(''); }, 'popupIsAllDay-tmpl': function() { return 'All day'; }, 'popupStateFree-tmpl': function() { return 'Free'; }, 'popupStateBusy-tmpl': function() { return 'Busy'; }, 'titlePlaceholder-tmpl': function() { return 'Subject'; }, 'locationPlaceholder-tmpl': function() { return 'Location'; }, 'startDatePlaceholder-tmpl': function() { return 'Start date'; }, 'endDatePlaceholder-tmpl': function() { return 'End date'; }, 'popupSave-tmpl': function() { return 'Save'; }, 'popupUpdate-tmpl': function() { return 'Update'; }, 'popupDetailDate-tmpl': function(isAllDay, start, end) { var isSameDate = datetime.isSameDate(start, end); var endFormat = (isSameDate ? '' : 'YYYY.MM.DD ') + 'hh:mm tt'; if (isAllDay) { return datetime.format(start, 'YYYY.MM.DD') + (isSameDate ? '' : ' - ' + datetime.format(end, 'YYYY.MM.DD')); } return (datetime.format(start, 'YYYY.MM.DD hh:mm tt') + ' - ' + datetime.format(end, endFormat)); }, 'popupDetailLocation-tmpl': function(schedule) { return schedule.location; }, 'popupDetailUser-tmpl': function(schedule) { return (schedule.attendees || []).join(', '); }, 'popupDetailState-tmpl': function(schedule) { return schedule.state || 'Busy'; }, 'popupDetailRepeat-tmpl': function(schedule) { return schedule.recurrenceRule; }, 'popupDetailBody-tmpl': function(schedule) { return schedule.body; }, 'popupEdit-tmpl': function() { return 'Edit'; }, 'popupDelete-tmpl': function() { return 'Delete'; } }; /** * Get CSS syntax for element size * @param {number} value - size value to apply element * @param {string} postfix - postfix string ex) px, em, % * @param {string} prefix - property name ex) width, height * @returns {string} CSS syntax */ function getElSize(value, postfix, prefix) { prefix = prefix || ''; if (util.isNumber(value)) { return prefix + ':' + value + postfix; } return prefix + ':auto'; } /** * Get element left based on narrowWeekend * @param {object} viewModel - view model * @param {Array} grids - dates information * @returns {number} element left */ function getElLeft(viewModel, grids) { return grids[viewModel.left] ? grids[viewModel.left].left : 0; } /** * Get element width based on narrowWeekend * @param {object} viewModel - view model * @param {Array} grids - dates information * @returns {number} element width */ function getElWidth(viewModel, grids) { var width = 0; var i = 0; var length = grids.length; var left; for (; i < viewModel.width; i += 1) { left = (viewModel.left + i) % length; left += parseInt((viewModel.left + i) / length, 10); if (left < length) { width += grids[left] ? grids[left].width : 0; } } return width; } Handlebars.registerHelper(helpers); /***/ }), /***/ "./src/js/view/template/month/month.hbs": /*!**********************************************!*\ !*** ./src/js/view/template/month/month.hbs ***! \**********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var Handlebars = __webpack_require__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); module.exports = (Handlebars['default'] || Handlebars).template({"1":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda; return " <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "month-dayname-item\"\n style=\"position: absolute;\n width: " + alias4(((helper = (helper = helpers.width || (depth0 != null ? depth0.width : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"width","hash":{},"data":data}) : helper))) + "%;\n left: " + alias4(((helper = (helper = helpers.left || (depth0 != null ? depth0.left : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"left","hash":{},"data":data}) : helper))) + "%;\n padding-left: " + alias4(alias5(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.paddingLeft), depth0)) + ";\n padding-right: " + alias4(alias5(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.paddingRight), depth0)) + ";\n line-height: " + alias4(alias5(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.height), depth0)) + ";\n" + ((stack1 = helpers.unless.call(alias1,(data && data.last),{"name":"unless","hash":{},"fn":container.program(2, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + " \">\n <span class=\"" + alias4((helpers.holiday || (depth0 && depth0.holiday) || alias2).call(alias1,(depth0 != null ? depth0.day : depth0),{"name":"holiday","hash":{},"data":data})) + "\" style=\"color: " + alias4(((helper = (helper = helpers.color || (depth0 != null ? depth0.color : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"color","hash":{},"data":data}) : helper))) + ";\">\n " + ((stack1 = (helpers["monthDayname-tmpl"] || (depth0 && depth0["monthDayname-tmpl"]) || alias2).call(alias1,depth0,{"name":"monthDayname-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "\n </span>\n </div>\n"; },"2":function(container,depth0,helpers,partials,data) { var stack1; return " border-right: " + container.escapeExpression(container.lambda(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.borderLeft), depth0)) + ";\n"; },"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.escapeExpression, alias3=container.lambda; return "<div class=\"" + alias2(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "month-dayname\"\n style=\"border-top: " + alias2(alias3(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.borderTop : stack1), depth0)) + "; height: " + alias2(alias3(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.height : stack1), depth0)) + "; font-size: " + alias2(alias3(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.fontSize : stack1), depth0)) + "; background-color: " + alias2(alias3(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.backgroundColor : stack1), depth0)) + "; text-align: " + alias2(alias3(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.textAlign : stack1), depth0)) + "; font-weight: " + alias2(alias3(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.fontWeight : stack1), depth0)) + ";\">\n" + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.daynames : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "</div>\n"; },"useData":true}); /***/ }), /***/ "./src/js/view/template/month/more.hbs": /*!*********************************************!*\ !*** ./src/js/view/template/month/more.hbs ***! \*********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var Handlebars = __webpack_require__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); module.exports = (Handlebars['default'] || Handlebars).template({"1":function(container,depth0,helpers,partials,data) { var stack1; return ((stack1 = (helpers.fi || (depth0 && depth0.fi) || helpers.helperMissing).call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.isAllDay : stack1),"||",(depth0 != null ? depth0.hasMultiDates : depth0),{"name":"fi","hash":{},"fn":container.program(2, data, 0),"inverse":container.program(7, data, 0),"data":data})) != null ? stack1 : ""); },"2":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=container.escapeExpression, alias4=container.lambda, alias5="function"; return "<div data-id=\"" + alias3((helpers.stamp || (depth0 && depth0.stamp) || alias2).call(alias1,(depth0 != null ? depth0.model : depth0),{"name":"stamp","hash":{},"data":data})) + "\"\n data-schedule-id=\"" + alias3(alias4(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.id : stack1), depth0)) + "\" data-calendar-id=\"" + alias3(alias4(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.calendarId : stack1), depth0)) + "\"\n class=\"" + alias3(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias5 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "month-more-schedule " + alias3(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias5 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "month-more-allday " + alias3(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias5 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedule-title\"\n style=\"height: " + alias3(alias4(((stack1 = (data && data.root)) && stack1.scheduleHeight), depth0)) + "px; line-height: " + alias3(alias4(((stack1 = (data && data.root)) && stack1.scheduleHeight), depth0)) + "px; margin-top: " + alias3(alias4(((stack1 = (data && data.root)) && stack1.scheduleGutter), depth0)) + "px; border-radius: " + alias3(alias4(((stack1 = (data && data.root)) && stack1.borderRadius), depth0)) + ";\n" + ((stack1 = helpers["if"].call(alias1,((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.isFocused : stack1),{"name":"if","hash":{},"fn":container.program(3, data, 0),"inverse":container.program(5, data, 0),"data":data})) != null ? stack1 : "") + " \n " + alias3(alias4(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.customStyle : stack1), depth0)) + "\">\n " + ((stack1 = (helpers["allday-tmpl"] || (depth0 && depth0["allday-tmpl"]) || alias2).call(alias1,(depth0 != null ? depth0.model : depth0),{"name":"allday-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "\n </div>\n"; },"3":function(container,depth0,helpers,partials,data) { var stack1, alias1=container.lambda, alias2=container.escapeExpression; return " color: #ffffff; background-color:" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.color : stack1), depth0)) + "; border-left:3px solid " + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.borderColor : stack1), depth0)) + ";\n"; },"5":function(container,depth0,helpers,partials,data) { var stack1, alias1=container.lambda, alias2=container.escapeExpression; return " color:" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.color : stack1), depth0)) + "; background-color:" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.bgColor : stack1), depth0)) + "; border-left:3px solid " + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.borderColor : stack1), depth0)) + "\n"; },"7":function(container,depth0,helpers,partials,data) { var stack1; return ((stack1 = (helpers.fi || (depth0 && depth0.fi) || helpers.helperMissing).call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.category : stack1),"===","time",{"name":"fi","hash":{},"fn":container.program(8, data, 0),"inverse":container.program(17, data, 0),"data":data})) != null ? stack1 : ""); },"8":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=container.escapeExpression, alias4=container.lambda, alias5="function"; return " <div data-id=\"" + alias3((helpers.stamp || (depth0 && depth0.stamp) || alias2).call(alias1,(depth0 != null ? depth0.model : depth0),{"name":"stamp","hash":{},"data":data})) + "\"\n data-schedule-id=\"" + alias3(alias4(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.id : stack1), depth0)) + "\" data-calendar-id=\"" + alias3(alias4(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.calendarId : stack1), depth0)) + "\"\n class=\"" + alias3(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias5 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "month-more-schedule " + alias3(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias5 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedule " + alias3(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias5 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedule-time\"\n style=\"height: " + alias3(alias4(((stack1 = (data && data.root)) && stack1.scheduleHeight), depth0)) + "px; line-height: " + alias3(alias4(((stack1 = (data && data.root)) && stack1.scheduleHeight), depth0)) + "px; margin-top: " + alias3(alias4(((stack1 = (data && data.root)) && stack1.scheduleGutter), depth0)) + "px;" + alias3(alias4(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.customStyle : stack1), depth0)) + "\">\n <span class=\"" + alias3(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias5 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedule-bullet\"\n style=\"top: " + alias3(alias4(((stack1 = (data && data.root)) && stack1.scheduleBulletTop), depth0)) + "px;\n" + ((stack1 = helpers["if"].call(alias1,((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.isFocused : stack1),{"name":"if","hash":{},"fn":container.program(9, data, 0),"inverse":container.program(11, data, 0),"data":data})) != null ? stack1 : "") + "\"></span>\n <span class=\"" + alias3(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias5 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedule-title\"\n style=\"" + ((stack1 = helpers["if"].call(alias1,((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.isFocused : stack1),{"name":"if","hash":{},"fn":container.program(13, data, 0),"inverse":container.program(15, data, 0),"data":data})) != null ? stack1 : "") + "\"\n data-title=\"" + alias3(alias4(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.title : stack1), depth0)) + "\">" + ((stack1 = (helpers["time-tmpl"] || (depth0 && depth0["time-tmpl"]) || alias2).call(alias1,(depth0 != null ? depth0.model : depth0),{"name":"time-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "</span>\n </div>\n"; },"9":function(container,depth0,helpers,partials,data) { return " background: #ffffff\n"; },"11":function(container,depth0,helpers,partials,data) { var stack1; return " background:" + container.escapeExpression(container.lambda(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.borderColor : stack1), depth0)) + "\n "; },"13":function(container,depth0,helpers,partials,data) { var stack1; return "\n color: #ffffff;\n background-color: " + container.escapeExpression(container.lambda(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.color : stack1), depth0)) + "\n"; },"15":function(container,depth0,helpers,partials,data) { return " color:#333;\n "; },"17":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=container.escapeExpression, alias4=container.lambda, alias5="function"; return "<div data-id=\"" + alias3((helpers.stamp || (depth0 && depth0.stamp) || alias2).call(alias1,(depth0 != null ? depth0.model : depth0),{"name":"stamp","hash":{},"data":data})) + "\"\n data-schedule-id=\"" + alias3(alias4(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.id : stack1), depth0)) + "\" data-calendar-id=\"" + alias3(alias4(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.calendarId : stack1), depth0)) + "\"\n class=\"" + alias3(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias5 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "month-more-schedule " + alias3(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias5 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedule " + ((stack1 = helpers["if"].call(alias1,((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.isFocused : stack1),{"name":"if","hash":{},"fn":container.program(18, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\"\n style=\"height:" + alias3(alias4(((stack1 = (data && data.root)) && stack1.scheduleHeight), depth0)) + "px; line-height:" + alias3(alias4(((stack1 = (data && data.root)) && stack1.scheduleHeight), depth0)) + "px; border-radius: " + alias3(alias4(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.borderRadius), depth0)) + ";\n" + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.exceedLeft : depth0),{"name":"unless","hash":{},"fn":container.program(20, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.exceedRight : depth0),{"name":"unless","hash":{},"fn":container.program(22, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + ((stack1 = helpers["if"].call(alias1,((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.isFocused : stack1),{"name":"if","hash":{},"fn":container.program(24, data, 0),"inverse":container.program(26, data, 0),"data":data})) != null ? stack1 : "") + " " + alias3(alias4(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.customStyle : stack1), depth0)) + "\">\n <span class=\"" + alias3(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias5 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedule-title\"\n data-title=\"" + alias3(alias4(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.title : stack1), depth0)) + "\">" + ((stack1 = (helpers["schedule-tmpl"] || (depth0 && depth0["schedule-tmpl"]) || alias2).call(alias1,(depth0 != null ? depth0.model : depth0),{"name":"schedule-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "</span>\n </div>\n"; },"18":function(container,depth0,helpers,partials,data) { var helper; return container.escapeExpression(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedule-focused "; },"20":function(container,depth0,helpers,partials,data) { var stack1; return " margin-left: " + container.escapeExpression(container.lambda(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.marginLeft), depth0)) + ";\n"; },"22":function(container,depth0,helpers,partials,data) { var stack1; return " margin-right: " + container.escapeExpression(container.lambda(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.marginRight), depth0)) + ";\n"; },"24":function(container,depth0,helpers,partials,data) { var stack1, alias1=container.lambda, alias2=container.escapeExpression; return " color: #ffffff; background-color:" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.color : stack1), depth0)) + "; border-color:" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.color : stack1), depth0)) + ";\n"; },"26":function(container,depth0,helpers,partials,data) { var stack1, alias1=container.lambda, alias2=container.escapeExpression; return " color:" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.color : stack1), depth0)) + "; background-color:" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.bgColor : stack1), depth0)) + "; border-color:" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.borderColor : stack1), depth0)) + ";\n"; },"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda; return "<div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "month-more\" style=\"padding-bottom: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.paddingBottom : stack1), depth0)) + "; border: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.border : stack1), depth0)) + "; box-shadow: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.boxShadow : stack1), depth0)) + "; background-color: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.backgroundColor : stack1), depth0)) + ";\">\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "month-more-title\"\n style=\"height: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.titleHeight : stack1), depth0)) + "; margin-bottom: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.titleMarginBottom : stack1), depth0)) + "; background-color: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.titleBackgroundColor : stack1), depth0)) + "; border-bottom: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.titleBorderBottom : stack1), depth0)) + "; padding: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.titlePadding : stack1), depth0)) + ";\">\n <span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "month-more-title-date\">" + ((stack1 = (helpers["monthMoreTitleDate-tmpl"] || (depth0 && depth0["monthMoreTitleDate-tmpl"]) || alias2).call(alias1,(depth0 != null ? depth0.date : depth0),(depth0 != null ? depth0.dayname : depth0),{"name":"monthMoreTitleDate-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "</span>\n <button type=\"button\" class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "month-more-close\">" + ((stack1 = ((helper = (helper = helpers["monthMoreClose-tmpl"] || (depth0 != null ? depth0["monthMoreClose-tmpl"] : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"monthMoreClose-tmpl","hash":{},"data":data}) : helper))) != null ? stack1 : "") + "</button>\n </div>\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "month-more-list\" style=\"padding: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.listPadding : stack1), depth0)) + "; height: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.listHeight : stack1), depth0)) + ";\">\n" + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.schedules : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + " </div>\n</div>\n"; },"useData":true}); /***/ }), /***/ "./src/js/view/template/month/weekdayInMonth.hbs": /*!*******************************************************!*\ !*** ./src/js/view/template/month/weekdayInMonth.hbs ***! \*******************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var Handlebars = __webpack_require__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); module.exports = (Handlebars['default'] || Handlebars).template({"1":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; return "<div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-grid-line " + alias4((helpers.holiday || (depth0 && depth0.holiday) || alias2).call(alias1,(depth0 != null ? depth0.day : depth0),{"name":"holiday","hash":{},"data":data})) + ((stack1 = (helpers.fi || (depth0 && depth0.fi) || alias2).call(alias1,(depth0 != null ? depth0.date : depth0),"!==",1,{"name":"fi","hash":{},"fn":container.program(2, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.isToday : depth0),{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.isOtherMonth : depth0),{"name":"if","hash":{},"fn":container.program(6, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\"\n style=\"width:" + alias4(((helper = (helper = helpers.width || (depth0 != null ? depth0.width : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"width","hash":{},"data":data}) : helper))) + "%; left:" + alias4(((helper = (helper = helpers.left || (depth0 != null ? depth0.left : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"left","hash":{},"data":data}) : helper))) + "%; background-color: " + alias4(((helper = (helper = helpers.backgroundColor || (depth0 != null ? depth0.backgroundColor : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"backgroundColor","hash":{},"data":data}) : helper))) + "; font-size: " + alias4(container.lambda(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.fontSize), depth0)) + ";\n" + ((stack1 = helpers.unless.call(alias1,(data && data.last),{"name":"unless","hash":{},"fn":container.program(8, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + " \">\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-grid-header\">\n <span style=\"color: " + alias4(((helper = (helper = helpers.color || (depth0 != null ? depth0.color : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"color","hash":{},"data":data}) : helper))) + ";\">" + ((stack1 = (helpers["monthGridHeader-tmpl"] || (depth0 && depth0["monthGridHeader-tmpl"]) || alias2).call(alias1,depth0,{"name":"monthGridHeader-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "</span>\n" + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.hiddenSchedules : depth0),{"name":"if","hash":{},"fn":container.program(10, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + " </div>\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-grid-footer\">\n <span style=\"color: " + alias4(((helper = (helper = helpers.color || (depth0 != null ? depth0.color : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"color","hash":{},"data":data}) : helper))) + ";\">" + ((stack1 = (helpers["monthGridFooter-tmpl"] || (depth0 && depth0["monthGridFooter-tmpl"]) || alias2).call(alias1,depth0,{"name":"monthGridFooter-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "</span>\n" + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.hiddenSchedules : depth0),{"name":"if","hash":{},"fn":container.program(12, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + " </div>\n </div>\n"; },"2":function(container,depth0,helpers,partials,data) { var helper; return " " + container.escapeExpression(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "near-month-day"; },"4":function(container,depth0,helpers,partials,data) { var helper; return " " + container.escapeExpression(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "today"; },"6":function(container,depth0,helpers,partials,data) { var helper; return " " + container.escapeExpression(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "extra-date"; },"8":function(container,depth0,helpers,partials,data) { var stack1; return " border-right:" + container.escapeExpression(container.lambda(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.borderLeft), depth0)) + ";\n"; },"10":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; return " <span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-exceed-in-month\" data-ymd=\"" + alias4(((helper = (helper = helpers.ymd || (depth0 != null ? depth0.ymd : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"ymd","hash":{},"data":data}) : helper))) + "\">" + ((stack1 = (helpers["monthGridHeaderExceed-tmpl"] || (depth0 && depth0["monthGridHeaderExceed-tmpl"]) || alias2).call(alias1,(depth0 != null ? depth0.hiddenSchedules : depth0),{"name":"monthGridHeaderExceed-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "</span>\n"; },"12":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; return " <span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-exceed-in-month\" data-ymd=\"" + alias4(((helper = (helper = helpers.ymd || (depth0 != null ? depth0.ymd : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"ymd","hash":{},"data":data}) : helper))) + "\">" + ((stack1 = (helpers["monthGridFooterExceed-tmpl"] || (depth0 && depth0["monthGridFooterExceed-tmpl"]) || alias2).call(alias1,(depth0 != null ? depth0.hiddenSchedules : depth0),{"name":"monthGridFooterExceed-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "</span>\n"; },"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; return "<div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-border\"\n style=\"\n border-top: " + alias4(container.lambda(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.borderTop : stack1), depth0)) + ";\n\"></div>\n<div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-grid\">\n" + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.dates : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "</div>\n<div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedules\"></div>\n"; },"useData":true}); /***/ }), /***/ "./src/js/view/template/month/weekdayInMonthSchedule.hbs": /*!***************************************************************!*\ !*** ./src/js/view/template/month/weekdayInMonthSchedule.hbs ***! \***************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var Handlebars = __webpack_require__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); module.exports = (Handlebars['default'] || Handlebars).template({"1":function(container,depth0,helpers,partials,data) { var stack1; return ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,{"name":"each","hash":{},"fn":container.program(2, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); },"2":function(container,depth0,helpers,partials,data) { var stack1; return "\n" + ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,{"name":"each","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); },"3":function(container,depth0,helpers,partials,data) { var stack1; return "\n" + ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); },"4":function(container,depth0,helpers,partials,data) { var stack1; return "\n" + ((stack1 = (helpers.fi || (depth0 && depth0.fi) || helpers.helperMissing).call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.top : depth0),"<",((stack1 = (data && data.root)) && stack1.renderLimitIdx),{"name":"fi","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); },"5":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=container.escapeExpression, alias4="function"; return "<div data-id=\"" + alias3((helpers.stamp || (depth0 && depth0.stamp) || alias2).call(alias1,(depth0 != null ? depth0.model : depth0),{"name":"stamp","hash":{},"data":data})) + "\"\n class=\"" + alias3(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias4 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedule-block\n " + alias3(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias4 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedule-block-" + alias3((helpers.stamp || (depth0 && depth0.stamp) || alias2).call(alias1,(depth0 != null ? depth0.model : depth0),{"name":"stamp","hash":{},"data":data})) + "\n " + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.exceedLeft : depth0),{"name":"if","hash":{},"fn":container.program(6, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\n " + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.exceedRight : depth0),{"name":"if","hash":{},"fn":container.program(8, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\"\n style=\"" + alias3((helpers["month-scheduleBlock"] || (depth0 && depth0["month-scheduleBlock"]) || alias2).call(alias1,depth0,((stack1 = (data && data.root)) && stack1.dates),((stack1 = (data && data.root)) && stack1.scheduleBlockHeight),((stack1 = (data && data.root)) && stack1.gridHeaderHeight),{"name":"month-scheduleBlock","hash":{},"data":data})) + ";\n margin-top:" + alias3(container.lambda(((stack1 = (data && data.root)) && stack1.scheduleBlockGutter), depth0)) + "px\">\n" + ((stack1 = (helpers.fi || (depth0 && depth0.fi) || alias2).call(alias1,((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.isAllDay : stack1),"||",(depth0 != null ? depth0.hasMultiDates : depth0),{"name":"fi","hash":{},"fn":container.program(10, data, 0),"inverse":container.program(23, data, 0),"data":data})) != null ? stack1 : "") + " </div>\n"; },"6":function(container,depth0,helpers,partials,data) { var helper; return " " + container.escapeExpression(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-exceed-left"; },"8":function(container,depth0,helpers,partials,data) { var helper; return " " + container.escapeExpression(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-exceed-right"; },"10":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=container.lambda, alias2=container.escapeExpression, alias3=depth0 != null ? depth0 : (container.nullContext || {}), alias4=helpers.helperMissing, alias5="function"; return " <div data-schedule-id=\"" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.id : stack1), depth0)) + "\" data-calendar-id=\"" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.calendarId : stack1), depth0)) + "\" class=\"" + alias2(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias4),(typeof helper === alias5 ? helper.call(alias3,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedule " + ((stack1 = helpers["if"].call(alias3,((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.isFocused : stack1),{"name":"if","hash":{},"fn":container.program(11, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\"\n style=\"height:" + alias2(alias1(((stack1 = (data && data.root)) && stack1.scheduleHeight), depth0)) + "px; line-height:" + alias2(alias1(((stack1 = (data && data.root)) && stack1.scheduleHeight), depth0)) + "px; border-radius: " + alias2(alias1(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.borderRadius), depth0)) + ";\n" + ((stack1 = helpers.unless.call(alias3,(depth0 != null ? depth0.exceedLeft : depth0),{"name":"unless","hash":{},"fn":container.program(13, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + ((stack1 = helpers.unless.call(alias3,(depth0 != null ? depth0.exceedRight : depth0),{"name":"unless","hash":{},"fn":container.program(15, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + ((stack1 = helpers["if"].call(alias3,((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.isFocused : stack1),{"name":"if","hash":{},"fn":container.program(17, data, 0),"inverse":container.program(19, data, 0),"data":data})) != null ? stack1 : "") + " " + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.customStyle : stack1), depth0)) + "\">\n <span class=\"" + alias2(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias4),(typeof helper === alias5 ? helper.call(alias3,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedule-title\"\n data-title=\"" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.title : stack1), depth0)) + "\">" + ((stack1 = (helpers["allday-tmpl"] || (depth0 && depth0["allday-tmpl"]) || alias4).call(alias3,(depth0 != null ? depth0.model : depth0),{"name":"allday-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "</span>\n " + ((stack1 = helpers.unless.call(alias3,(helpers.or || (depth0 && depth0.or) || alias4).call(alias3,((stack1 = (data && data.root)) && stack1.isReadOnly),((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.isReadOnly : stack1),{"name":"or","hash":{},"data":data}),{"name":"unless","hash":{},"fn":container.program(21, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\n </div>\n"; },"11":function(container,depth0,helpers,partials,data) { var helper; return container.escapeExpression(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedule-focused "; },"13":function(container,depth0,helpers,partials,data) { var stack1; return " margin-left: " + container.escapeExpression(container.lambda(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.marginLeft), depth0)) + ";\n"; },"15":function(container,depth0,helpers,partials,data) { var stack1; return " margin-right: " + container.escapeExpression(container.lambda(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.marginRight), depth0)) + ";\n"; },"17":function(container,depth0,helpers,partials,data) { var stack1, alias1=container.lambda, alias2=container.escapeExpression; return " color: #ffffff; background-color:" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.color : stack1), depth0)) + "; border-color:" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.color : stack1), depth0)) + ";\n"; },"19":function(container,depth0,helpers,partials,data) { var stack1, alias1=container.lambda, alias2=container.escapeExpression; return " color:" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.color : stack1), depth0)) + "; background-color:" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.bgColor : stack1), depth0)) + "; border-color:" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.borderColor : stack1), depth0)) + ";\n"; },"21":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=container.escapeExpression; return "<span class=\"" + alias1(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-resize-handle handle-y\" style=\"line-height: " + alias1(container.lambda(((stack1 = (data && data.root)) && stack1.scheduleHeight), depth0)) + "px;\"> </span>"; },"23":function(container,depth0,helpers,partials,data) { var stack1; return ((stack1 = (helpers.fi || (depth0 && depth0.fi) || helpers.helperMissing).call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.category : stack1),"===","time",{"name":"fi","hash":{},"fn":container.program(24, data, 0),"inverse":container.program(33, data, 0),"data":data})) != null ? stack1 : ""); },"24":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=container.lambda, alias2=container.escapeExpression, alias3=depth0 != null ? depth0 : (container.nullContext || {}), alias4=helpers.helperMissing, alias5="function"; return " <div data-schedule-id=\"" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.id : stack1), depth0)) + "\" data-calendar-id=\"" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.calendarId : stack1), depth0)) + "\" class=\"" + alias2(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias4),(typeof helper === alias5 ? helper.call(alias3,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedule " + alias2(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias4),(typeof helper === alias5 ? helper.call(alias3,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedule-time\"\n style=\"height:" + alias2(alias1(((stack1 = (data && data.root)) && stack1.scheduleHeight), depth0)) + "px; line-height:" + alias2(alias1(((stack1 = (data && data.root)) && stack1.scheduleHeight), depth0)) + "px; " + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.customStyle : stack1), depth0)) + "\">\n <span class=\"" + alias2(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias4),(typeof helper === alias5 ? helper.call(alias3,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedule-bullet\"\n style=\"top: " + alias2(alias1(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.scheduleBulletTop), depth0)) + "px;\n" + ((stack1 = helpers["if"].call(alias3,((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.isFocused : stack1),{"name":"if","hash":{},"fn":container.program(25, data, 0),"inverse":container.program(27, data, 0),"data":data})) != null ? stack1 : "") + " \"\n ></span>\n <span class=\"" + alias2(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias4),(typeof helper === alias5 ? helper.call(alias3,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedule-title\"\n style=\"\n" + ((stack1 = helpers["if"].call(alias3,((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.isFocused : stack1),{"name":"if","hash":{},"fn":container.program(29, data, 0),"inverse":container.program(31, data, 0),"data":data})) != null ? stack1 : "") + " \"\n data-title=\"" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.title : stack1), depth0)) + "\">" + ((stack1 = (helpers["time-tmpl"] || (depth0 && depth0["time-tmpl"]) || alias4).call(alias3,(depth0 != null ? depth0.model : depth0),{"name":"time-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "</span>\n </div>\n"; },"25":function(container,depth0,helpers,partials,data) { return " background: #ffffff\n"; },"27":function(container,depth0,helpers,partials,data) { var stack1; return " background:" + container.escapeExpression(container.lambda(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.borderColor : stack1), depth0)) + "\n"; },"29":function(container,depth0,helpers,partials,data) { var stack1; return " color: #ffffff;\n background-color: " + container.escapeExpression(container.lambda(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.color : stack1), depth0)) + "\n"; },"31":function(container,depth0,helpers,partials,data) { return " color:#333;\n"; },"33":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=container.lambda, alias2=container.escapeExpression, alias3=depth0 != null ? depth0 : (container.nullContext || {}), alias4=helpers.helperMissing, alias5="function"; return "<div data-schedule-id=\"" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.id : stack1), depth0)) + "\" data-calendar-id=\"" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.calendarId : stack1), depth0)) + "\" class=\"" + alias2(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias4),(typeof helper === alias5 ? helper.call(alias3,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedule " + ((stack1 = helpers["if"].call(alias3,((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.isFocused : stack1),{"name":"if","hash":{},"fn":container.program(11, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\"\n style=\"height:" + alias2(alias1(((stack1 = (data && data.root)) && stack1.scheduleHeight), depth0)) + "px; line-height:" + alias2(alias1(((stack1 = (data && data.root)) && stack1.scheduleHeight), depth0)) + "px; border-radius: " + alias2(alias1(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.borderRadius), depth0)) + ";\n" + ((stack1 = helpers.unless.call(alias3,(depth0 != null ? depth0.exceedLeft : depth0),{"name":"unless","hash":{},"fn":container.program(34, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + ((stack1 = helpers.unless.call(alias3,(depth0 != null ? depth0.exceedRight : depth0),{"name":"unless","hash":{},"fn":container.program(36, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + ((stack1 = helpers["if"].call(alias3,((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.isFocused : stack1),{"name":"if","hash":{},"fn":container.program(38, data, 0),"inverse":container.program(40, data, 0),"data":data})) != null ? stack1 : "") + " " + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.customStyle : stack1), depth0)) + "\">\n <span class=\"" + alias2(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias4),(typeof helper === alias5 ? helper.call(alias3,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedule-title\"\n data-title=\"" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.title : stack1), depth0)) + "\">" + ((stack1 = (helpers["schedule-tmpl"] || (depth0 && depth0["schedule-tmpl"]) || alias4).call(alias3,(depth0 != null ? depth0.model : depth0),{"name":"schedule-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "</span>\n </div>\n"; },"34":function(container,depth0,helpers,partials,data) { var stack1; return " margin-left: " + container.escapeExpression(container.lambda(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.marginLeft), depth0)) + ";\n"; },"36":function(container,depth0,helpers,partials,data) { var stack1; return " margin-right: " + container.escapeExpression(container.lambda(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.marginRight), depth0)) + ";\n"; },"38":function(container,depth0,helpers,partials,data) { var stack1, alias1=container.lambda, alias2=container.escapeExpression; return " color: #ffffff; background-color:" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.color : stack1), depth0)) + "; border-color:" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.color : stack1), depth0)) + ";\n"; },"40":function(container,depth0,helpers,partials,data) { var stack1, alias1=container.lambda, alias2=container.escapeExpression; return " color:" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.color : stack1), depth0)) + "; background-color:" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.bgColor : stack1), depth0)) + "; border-color:" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.borderColor : stack1), depth0)) + ";\n"; },"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { var stack1; return ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.matrices : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); },"useData":true}); /***/ }), /***/ "./src/js/view/template/popup/scheduleCreationPopup.hbs": /*!**************************************************************!*\ !*** ./src/js/view/template/popup/scheduleCreationPopup.hbs ***! \**************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var Handlebars = __webpack_require__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); module.exports = (Handlebars['default'] || Handlebars).template({"1":function(container,depth0,helpers,partials,data) { var helper; return " " + container.escapeExpression(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "hide"; },"3":function(container,depth0,helpers,partials,data) { var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; return " <li class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-section-item " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "dropdown-menu-item\" data-calendar-id=\"" + alias4(((helper = (helper = helpers.id || (depth0 != null ? depth0.id : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"id","hash":{},"data":data}) : helper))) + "\">\n <span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "icon " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "calendar-dot\" style=\"background-color: " + alias4(((helper = (helper = helpers.bgColor || (depth0 != null ? depth0.bgColor : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"bgColor","hash":{},"data":data}) : helper))) + "\"></span>\n <span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "content\">" + alias4(((helper = (helper = helpers.name || (depth0 != null ? depth0.name : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"name","hash":{},"data":data}) : helper))) + "</span>\n </li>\n"; },"5":function(container,depth0,helpers,partials,data) { var helper; return " " + container.escapeExpression(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "public"; },"7":function(container,depth0,helpers,partials,data) { return " checked"; },"9":function(container,depth0,helpers,partials,data) { var helper; return container.escapeExpression(((helper = (helper = helpers.state || (depth0 != null ? depth0.state : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"state","hash":{},"data":data}) : helper))); },"11":function(container,depth0,helpers,partials,data) { var helper; return container.escapeExpression(((helper = (helper = helpers["popupStateBusy-tmpl"] || (depth0 != null ? depth0["popupStateBusy-tmpl"] : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"popupStateBusy-tmpl","hash":{},"data":data}) : helper))); },"13":function(container,depth0,helpers,partials,data) { var helper; return container.escapeExpression(((helper = (helper = helpers["popupUpdate-tmpl"] || (depth0 != null ? depth0["popupUpdate-tmpl"] : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"popupUpdate-tmpl","hash":{},"data":data}) : helper))); },"15":function(container,depth0,helpers,partials,data) { var helper; return container.escapeExpression(((helper = (helper = helpers["popupSave-tmpl"] || (depth0 != null ? depth0["popupSave-tmpl"] : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"popupSave-tmpl","hash":{},"data":data}) : helper))); },"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda; return "<div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup\">\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-container\">\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-section " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "dropdown " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "close " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "section-calendar" + ((stack1 = helpers.unless.call(alias1,((stack1 = (depth0 != null ? depth0.calendars : depth0)) != null ? stack1.length : stack1),{"name":"unless","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\">\n <button class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "button " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "dropdown-button " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-section-item\">\n <span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "icon " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "calendar-dot\" style=\"background-color: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.selectedCal : depth0)) != null ? stack1.bgColor : stack1), depth0)) + "\"></span>\n <span id=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "schedule-calendar\" class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "content\">" + alias4(alias5(((stack1 = (depth0 != null ? depth0.selectedCal : depth0)) != null ? stack1.name : stack1), depth0)) + "</span>\n <span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "icon " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "dropdown-arrow\"></span>\n </span>\n </button>\n <ul class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "dropdown-menu\" style=\"z-index: " + alias4(((helper = (helper = helpers.zIndex || (depth0 != null ? depth0.zIndex : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"zIndex","hash":{},"data":data}) : helper))) + "\">\n" + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.calendars : depth0),{"name":"each","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + " </ul>\n </div>\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-section\">\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-section-item " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "section-title\">\n <span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "icon " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "ic-title\"></span>\n <input id=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "schedule-title\" class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "content\" placeholder=\"" + alias4(((helper = (helper = helpers["titlePlaceholder-tmpl"] || (depth0 != null ? depth0["titlePlaceholder-tmpl"] : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"titlePlaceholder-tmpl","hash":{},"data":data}) : helper))) + "\" value=\"" + alias4(((helper = (helper = helpers.title || (depth0 != null ? depth0.title : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"title","hash":{},"data":data}) : helper))) + "\"></span>\n </div>\n <button id=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "schedule-private\" class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "button " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "section-private" + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.isPrivate : depth0),{"name":"unless","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\">\n <span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "icon " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "ic-private\"></span>\n </button>\n </div>\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-section\">\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-section-item " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "section-location\">\n <span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "icon " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "ic-location\"></span>\n <input id=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "schedule-location\" class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "content\" placeholder=\"" + alias4(((helper = (helper = helpers["locationPlaceholder-tmpl"] || (depth0 != null ? depth0["locationPlaceholder-tmpl"] : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"locationPlaceholder-tmpl","hash":{},"data":data}) : helper))) + "\" value=\"" + alias4(((helper = (helper = helpers.location || (depth0 != null ? depth0.location : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"location","hash":{},"data":data}) : helper))) + "\"></span>\n </div>\n </div>\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-section\">\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-section-item " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "section-start-date\">\n <span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "icon " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "ic-date\"></span>\n <input id=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "schedule-start-date\" class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "content\" placeholder=\"" + alias4(((helper = (helper = helpers["startDatePlaceholder-tmpl"] || (depth0 != null ? depth0["startDatePlaceholder-tmpl"] : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"startDatePlaceholder-tmpl","hash":{},"data":data}) : helper))) + "\"></span>\n <div id=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "startpicker-container\" style=\"margin-left: -1px; position: relative\"></div>\n </div>\n <span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "section-date-dash\">-</span>\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-section-item " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "section-end-date\">\n <span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "icon " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "ic-date\"></span>\n <input id=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "schedule-end-date\" class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "content\" placeholder=\"" + alias4(((helper = (helper = helpers["endDatePlaceholder-tmpl"] || (depth0 != null ? depth0["endDatePlaceholder-tmpl"] : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"endDatePlaceholder-tmpl","hash":{},"data":data}) : helper))) + "\"></span>\n <div id=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "endpicker-container\" style=\"margin-left: -1px; position: relative\"></div>\n </div>\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-section-item " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "section-allday\">\n <input id=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "schedule-allday\" type=\"checkbox\" class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "checkbox-square\"" + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.isAllDay : depth0),{"name":"if","hash":{},"fn":container.program(7, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "></input>\n <span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "icon " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "ic-checkbox\"></span>\n <span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "content\">" + alias4(((helper = (helper = helpers["popupIsAllDay-tmpl"] || (depth0 != null ? depth0["popupIsAllDay-tmpl"] : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"popupIsAllDay-tmpl","hash":{},"data":data}) : helper))) + "</span>\n </div>\n </div>\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-section " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "dropdown " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "close " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "section-state\">\n <button class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "button " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "dropdown-button " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-section-item\">\n <span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "icon " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "ic-state\"></span>\n <span id=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "schedule-state\" class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "content\">" + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.state : depth0),{"name":"if","hash":{},"fn":container.program(9, data, 0),"inverse":container.program(11, data, 0),"data":data})) != null ? stack1 : "") + "</span>\n <span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "icon " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "dropdown-arrow\"></span>\n </button>\n <ul class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "dropdown-menu\" style=\"z-index: " + alias4(((helper = (helper = helpers.zIndex || (depth0 != null ? depth0.zIndex : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"zIndex","hash":{},"data":data}) : helper))) + "\">\n <li class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-section-item " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "dropdown-menu-item\">\n <span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "icon " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "none\"></span>\n <span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "content\">" + alias4(((helper = (helper = helpers["popupStateBusy-tmpl"] || (depth0 != null ? depth0["popupStateBusy-tmpl"] : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"popupStateBusy-tmpl","hash":{},"data":data}) : helper))) + "</span>\n </li>\n <li class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-section-item " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "dropdown-menu-item\">\n <span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "icon " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "none\"></span>\n <span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "content\">" + alias4(((helper = (helper = helpers["popupStateFree-tmpl"] || (depth0 != null ? depth0["popupStateFree-tmpl"] : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"popupStateFree-tmpl","hash":{},"data":data}) : helper))) + "</span>\n </li>\n </ul>\n </div>\n <button class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "button " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-close\"><span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "icon " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "ic-close\"></span></button>\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "section-button-save\"><button class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "button " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "confirm " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-save\"><span>" + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.isEditMode : depth0),{"name":"if","hash":{},"fn":container.program(13, data, 0),"inverse":container.program(15, data, 0),"data":data})) != null ? stack1 : "") + "</span></button></div>\n </div>\n <div id=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-arrow\" class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-arrow " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "arrow-bottom\">\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-arrow-border\">\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-arrow-fill\"></div>\n </div>\n </div>\n</div>\n"; },"useData":true}); /***/ }), /***/ "./src/js/view/template/popup/scheduleDetailPopup.hbs": /*!************************************************************!*\ !*** ./src/js/view/template/popup/scheduleDetailPopup.hbs ***! \************************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var Handlebars = __webpack_require__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); module.exports = (Handlebars['default'] || Handlebars).template({"1":function(container,depth0,helpers,partials,data) { var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; return "<div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-detail-item\"><span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "icon " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "ic-location-b\"></span><span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "content\">" + alias4((helpers["popupDetailLocation-tmpl"] || (depth0 && depth0["popupDetailLocation-tmpl"]) || alias2).call(alias1,(depth0 != null ? depth0.schedule : depth0),{"name":"popupDetailLocation-tmpl","hash":{},"data":data})) + "</span></div>"; },"3":function(container,depth0,helpers,partials,data) { var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; return "<div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-detail-item\"><span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "icon " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "ic-repeat-b\"></span><span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "content\">" + alias4((helpers["popupDetailRepeat-tmpl"] || (depth0 && depth0["popupDetailRepeat-tmpl"]) || alias2).call(alias1,(depth0 != null ? depth0.schedule : depth0),{"name":"popupDetailRepeat-tmpl","hash":{},"data":data})) + "</span></div>"; },"5":function(container,depth0,helpers,partials,data) { var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; return "<div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-detail-item " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-detail-item-indent\"><span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "icon " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "ic-user-b\"></span><span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "content\">" + alias4((helpers["popupDetailUser-tmpl"] || (depth0 && depth0["popupDetailUser-tmpl"]) || alias2).call(alias1,(depth0 != null ? depth0.schedule : depth0),{"name":"popupDetailUser-tmpl","hash":{},"data":data})) + "</span></div>"; },"7":function(container,depth0,helpers,partials,data) { var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; return "<div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-detail-item\"><span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "icon " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "ic-state-b\"></span><span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "content\">" + alias4((helpers["popupDetailState-tmpl"] || (depth0 && depth0["popupDetailState-tmpl"]) || alias2).call(alias1,(depth0 != null ? depth0.schedule : depth0),{"name":"popupDetailState-tmpl","hash":{},"data":data})) + "</span></div>"; },"9":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda; return " <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-detail-item\"><span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "icon " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "calendar-dot\" style=\"background-color: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.schedule : depth0)) != null ? stack1.bgColor : stack1), depth0)) + "\"></span><span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "content\">" + alias4(alias5(((stack1 = (depth0 != null ? depth0.calendar : depth0)) != null ? stack1.name : stack1), depth0)) + "</span></div>\n"; },"11":function(container,depth0,helpers,partials,data) { var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; return "<div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-detail-item " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-detail-item-separate\"><span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "content\">" + alias4((helpers["popupDetailBody-tmpl"] || (depth0 && depth0["popupDetailBody-tmpl"]) || alias2).call(alias1,(depth0 != null ? depth0.schedule : depth0),{"name":"popupDetailBody-tmpl","hash":{},"data":data})) + "</span></div>"; },"13":function(container,depth0,helpers,partials,data) { return ""; },"15":function(container,depth0,helpers,partials,data) { var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; return " <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "section-button\">\n <button class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-edit\"><span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "icon " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "ic-edit\"></span><span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "content\">" + alias4(((helper = (helper = helpers["popupEdit-tmpl"] || (depth0 != null ? depth0["popupEdit-tmpl"] : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"popupEdit-tmpl","hash":{},"data":data}) : helper))) + "</span></button>\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-vertical-line\"></div>\n <button class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-delete\"><span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "icon " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "ic-delete\"></span><span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "content\">" + alias4(((helper = (helper = helpers["popupDelete-tmpl"] || (depth0 != null ? depth0["popupDelete-tmpl"] : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"popupDelete-tmpl","hash":{},"data":data}) : helper))) + "</span></button>\n </div>\n"; },"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda; return "<div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-detail\">\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-container\">\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-section " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "section-header\">\n <div>\n <span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "schedule-private " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "icon " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "ic-private\"></span>\n <span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "schedule-title\">" + alias4(alias5(((stack1 = (depth0 != null ? depth0.schedule : depth0)) != null ? stack1.title : stack1), depth0)) + "</span>\n </div>\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-detail-date " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "content\">" + alias4((helpers["popupDetailDate-tmpl"] || (depth0 && depth0["popupDetailDate-tmpl"]) || alias2).call(alias1,((stack1 = (depth0 != null ? depth0.schedule : depth0)) != null ? stack1.isAllDay : stack1),((stack1 = (depth0 != null ? depth0.schedule : depth0)) != null ? stack1.start : stack1),((stack1 = (depth0 != null ? depth0.schedule : depth0)) != null ? stack1.end : stack1),{"name":"popupDetailDate-tmpl","hash":{},"data":data})) + "</div>\n </div>\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "section-detail\">\n " + ((stack1 = helpers["if"].call(alias1,((stack1 = (depth0 != null ? depth0.schedule : depth0)) != null ? stack1.location : stack1),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\n " + ((stack1 = helpers["if"].call(alias1,((stack1 = (depth0 != null ? depth0.schedule : depth0)) != null ? stack1.recurrenceRule : stack1),{"name":"if","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\n " + ((stack1 = helpers["if"].call(alias1,((stack1 = (depth0 != null ? depth0.schedule : depth0)) != null ? stack1.attendees : stack1),{"name":"if","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\n " + ((stack1 = helpers["if"].call(alias1,((stack1 = (depth0 != null ? depth0.schedule : depth0)) != null ? stack1.state : stack1),{"name":"if","hash":{},"fn":container.program(7, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\n" + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.calendar : depth0),{"name":"if","hash":{},"fn":container.program(9, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + " " + ((stack1 = helpers["if"].call(alias1,((stack1 = (depth0 != null ? depth0.schedule : depth0)) != null ? stack1.body : stack1),{"name":"if","hash":{},"fn":container.program(11, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\n </div>\n" + ((stack1 = helpers["if"].call(alias1,((stack1 = (depth0 != null ? depth0.schedule : depth0)) != null ? stack1.isReadOnly : stack1),{"name":"if","hash":{},"fn":container.program(13, data, 0),"inverse":container.program(15, data, 0),"data":data})) != null ? stack1 : "") + " </div>\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-top-line\" style=\"background-color: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.schedule : depth0)) != null ? stack1.bgColor : stack1), depth0)) + "\"></div>\n <div id=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-arrow\" class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-arrow " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "arrow-left\">\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-arrow-border\">\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "popup-arrow-fill\"></div>\n </div>\n </div>\n</div>\n"; },"useData":true}); /***/ }), /***/ "./src/js/view/template/week/dayGrid.hbs": /*!***********************************************!*\ !*** ./src/js/view/template/week/dayGrid.hbs ***! \***********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var Handlebars = __webpack_require__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); module.exports = (Handlebars['default'] || Handlebars).template({"1":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; return "<div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-grid-line\"\n style=\"left:" + alias4(((helper = (helper = helpers.left || (depth0 != null ? depth0.left : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"left","hash":{},"data":data}) : helper))) + "%; width:" + alias4(((helper = (helper = helpers.width || (depth0 != null ? depth0.width : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"width","hash":{},"data":data}) : helper))) + "%; background-color: " + alias4(((helper = (helper = helpers.backgroundColor || (depth0 != null ? depth0.backgroundColor : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"backgroundColor","hash":{},"data":data}) : helper))) + ";\n" + ((stack1 = helpers.unless.call(alias1,(data && data.last),{"name":"unless","hash":{},"fn":container.program(2, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + " \"></div>\n"; },"2":function(container,depth0,helpers,partials,data) { var stack1; return " border-right: " + container.escapeExpression(container.lambda(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.borderRight), depth0)) + ";\n"; },"4":function(container,depth0,helpers,partials,data) { var stack1; return ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.days : depth0),{"name":"each","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); },"5":function(container,depth0,helpers,partials,data) { var stack1; return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),((stack1 = (data && data.root)) && stack1.collapsed),{"name":"if","hash":{},"fn":container.program(6, data, 0),"inverse":container.program(9, data, 0),"data":data})) != null ? stack1 : ""); },"6":function(container,depth0,helpers,partials,data) { var stack1; return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.hiddenSchedules : depth0),{"name":"if","hash":{},"fn":container.program(7, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); },"7":function(container,depth0,helpers,partials,data) { var helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; return " <span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-exceed-in-week\" style=\"z-index: 1; right:" + alias4((helpers.getRight || (depth0 && depth0.getRight) || alias2).call(alias1,(depth0 != null ? depth0.left : depth0),(depth0 != null ? depth0.width : depth0),{"name":"getRight","hash":{},"data":data})) + "%;\" data-index=\"" + alias4(((helper = (helper = helpers.key || (data && data.key)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"key","hash":{},"data":data}) : helper))) + "\">" + alias4((helpers["weekGridFooterExceed-tmpl"] || (depth0 && depth0["weekGridFooterExceed-tmpl"]) || alias2).call(alias1,(depth0 != null ? depth0.hiddenSchedules : depth0),{"name":"weekGridFooterExceed-tmpl","hash":{},"data":data})) + "</span>\n"; },"9":function(container,depth0,helpers,partials,data) { var stack1; return ((stack1 = (helpers.fi || (depth0 && depth0.fi) || helpers.helperMissing).call(depth0 != null ? depth0 : (container.nullContext || {}),(data && data.key),"===",((stack1 = (data && data.root)) && stack1.collapseBtnIndex),{"name":"fi","hash":{},"fn":container.program(10, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); },"10":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; return " <span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-collapse-btn\" style=\"z-index: 1; right:" + alias4((helpers.getRight || (depth0 && depth0.getRight) || alias2).call(alias1,(depth0 != null ? depth0.left : depth0),(depth0 != null ? depth0.width : depth0),{"name":"getRight","hash":{},"data":data})) + "%;\">" + ((stack1 = ((helper = (helper = helpers["collapseBtnTitle-tmpl"] || (depth0 != null ? depth0["collapseBtnTitle-tmpl"] : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"collapseBtnTitle-tmpl","hash":{},"data":data}) : helper))) != null ? stack1 : "") + "</span>\n"; },"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda; return "<div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + alias4(((helper = (helper = helpers.viewName || (depth0 != null ? depth0.viewName : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"viewName","hash":{},"data":data}) : helper))) + "-left " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "left\" style=\"border-right: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.leftBorderRight : stack1), depth0)) + "; width: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.leftWidth : stack1), depth0)) + "; background-color: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.leftBackgroundColor : stack1), depth0)) + "; padding-right: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.leftPaddingRight : stack1), depth0)) + ";\">\n " + ((stack1 = (helpers["dayGridTitle-tmpl"] || (depth0 && depth0["dayGridTitle-tmpl"]) || alias2).call(alias1,(depth0 != null ? depth0.viewName : depth0),{"name":"dayGridTitle-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "\n</div>\n<div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + alias4(((helper = (helper = helpers.viewName || (depth0 != null ? depth0.viewName : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"viewName","hash":{},"data":data}) : helper))) + "-right " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "right\">\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "container\">\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-grid\">\n" + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.days : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + ((stack1 = helpers["if"].call(alias1,((stack1 = (data && data.root)) && stack1.showExpandableButton),{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + " </div>\n </div>\n</div>"; },"useData":true}); /***/ }), /***/ "./src/js/view/template/week/dayGridSchedule.hbs": /*!*******************************************************!*\ !*** ./src/js/view/template/week/dayGridSchedule.hbs ***! \*******************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var Handlebars = __webpack_require__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); module.exports = (Handlebars['default'] || Handlebars).template({"1":function(container,depth0,helpers,partials,data) { var stack1; return ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,{"name":"each","hash":{},"fn":container.program(2, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); },"2":function(container,depth0,helpers,partials,data) { var stack1; return "\n " + ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,{"name":"each","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); },"3":function(container,depth0,helpers,partials,data) { var stack1; return "\n " + ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); },"4":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3=container.escapeExpression, alias4="function", alias5=container.lambda; return "\n <div data-id=\"" + alias3((helpers.stamp || (depth0 && depth0.stamp) || alias2).call(alias1,(depth0 != null ? depth0.model : depth0),{"name":"stamp","hash":{},"data":data})) + "\"\n class=\"" + alias3(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias4 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedule-block\n " + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.exceedLeft : depth0),{"name":"if","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\n " + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.exceedRight : depth0),{"name":"if","hash":{},"fn":container.program(7, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\"\n style=\"top:" + alias3((helpers.multiply || (depth0 && depth0.multiply) || alias2).call(alias1,(depth0 != null ? depth0.top : depth0),((stack1 = (data && data.root)) && stack1.scheduleBlockHeight),{"name":"multiply","hash":{},"data":data})) + "px;\n left:" + alias3((helpers["grid-left"] || (depth0 && depth0["grid-left"]) || alias2).call(alias1,depth0,((stack1 = (data && data.root)) && stack1.dates),{"name":"grid-left","hash":{},"data":data})) + "%;\n width:" + alias3((helpers["grid-width"] || (depth0 && depth0["grid-width"]) || alias2).call(alias1,depth0,((stack1 = (data && data.root)) && stack1.dates),{"name":"grid-width","hash":{},"data":data})) + "%\">\n <div data-schedule-id=\"" + alias3(alias5(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.id : stack1), depth0)) + "\" data-calendar-id=\"" + alias3(alias5(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.calendarId : stack1), depth0)) + "\" class=\"" + alias3(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias4 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedule " + ((stack1 = helpers["if"].call(alias1,((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.isFocused : stack1),{"name":"if","hash":{},"fn":container.program(9, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\"\n style=\"height:" + alias3(alias5(((stack1 = (data && data.root)) && stack1.scheduleHeight), depth0)) + "px; line-height:" + alias3(alias5(((stack1 = (data && data.root)) && stack1.scheduleHeight), depth0)) + "px; border-radius: " + alias3(alias5(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.borderRadius), depth0)) + ";\n" + ((stack1 = helpers["if"].call(alias1,((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.isFocused : stack1),{"name":"if","hash":{},"fn":container.program(11, data, 0),"inverse":container.program(13, data, 0),"data":data})) != null ? stack1 : "") + " " + alias3(alias5(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.customStyle : stack1), depth0)) + "\">\n <span class=\"" + alias3(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias4 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedule-title\" title=\"" + alias3(alias5(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.title : stack1), depth0)) + "\">" + ((stack1 = (helpers["schedule-tmpl"] || (depth0 && depth0["schedule-tmpl"]) || alias2).call(alias1,(depth0 != null ? depth0.model : depth0),{"name":"schedule-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "</span>\n " + ((stack1 = helpers.unless.call(alias1,(helpers.or || (depth0 && depth0.or) || alias2).call(alias1,((stack1 = (data && data.root)) && stack1.isReadOnly),((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.isReadOnly : stack1),{"name":"or","hash":{},"data":data}),{"name":"unless","hash":{},"fn":container.program(15, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\n </div>\n </div>\n"; },"5":function(container,depth0,helpers,partials,data) { var helper; return " " + container.escapeExpression(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-exceed-left"; },"7":function(container,depth0,helpers,partials,data) { var helper; return " " + container.escapeExpression(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-exceed-right"; },"9":function(container,depth0,helpers,partials,data) { var helper; return container.escapeExpression(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedule-focused "; },"11":function(container,depth0,helpers,partials,data) { var stack1, alias1=container.lambda, alias2=container.escapeExpression; return " color: #ffffff; background-color:" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.color : stack1), depth0)) + "; border-color:" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.color : stack1), depth0)) + ";\n"; },"13":function(container,depth0,helpers,partials,data) { var stack1, alias1=container.lambda, alias2=container.escapeExpression; return " color:" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.color : stack1), depth0)) + "; background-color:" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.bgColor : stack1), depth0)) + "; border-color:" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.borderColor : stack1), depth0)) + ";\n"; },"15":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=container.escapeExpression; return "<span class=\"" + alias1(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-resize-handle handle-y\" style=\"line-height:" + alias1(container.lambda(((stack1 = (data && data.root)) && stack1.scheduleHeight), depth0)) + "px;\"> </span>"; },"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; return "<div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "weekday-schedules " + alias4(((helper = (helper = helpers.collapsed || (depth0 != null ? depth0.collapsed : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"collapsed","hash":{},"data":data}) : helper))) + "\"style=\"top:" + alias4(container.lambda(((stack1 = (data && data.root)) && stack1.scheduleContainerTop), depth0)) + "px;\">\n" + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.matrices : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "</div>\n"; },"useData":true}); /***/ }), /***/ "./src/js/view/template/week/daynames.hbs": /*!************************************************!*\ !*** ./src/js/view/template/week/daynames.hbs ***! \************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var Handlebars = __webpack_require__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); module.exports = (Handlebars['default'] || Handlebars).template({"1":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda; return "<div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "dayname " + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.isToday : depth0),{"name":"if","hash":{},"fn":container.program(2, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + " " + alias4((helpers.holiday || (depth0 && depth0.holiday) || alias2).call(alias1,(depth0 != null ? depth0.day : depth0),{"name":"holiday","hash":{},"data":data})) + "\"\n data-date=\"" + alias4(((helper = (helper = helpers.renderDate || (depth0 != null ? depth0.renderDate : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"renderDate","hash":{},"data":data}) : helper))) + "\"\n style=\"" + alias4((helpers["common-width"] || (depth0 && depth0["common-width"]) || alias2).call(alias1,(depth0 != null ? depth0.width : depth0),{"name":"common-width","hash":{},"data":data})) + ";left:" + alias4(((helper = (helper = helpers.left || (depth0 != null ? depth0.left : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"left","hash":{},"data":data}) : helper))) + "%; line-height: " + alias4(alias5(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.height), depth0)) + "; border-left: " + alias4(alias5(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.borderLeft), depth0)) + "; padding-left: " + alias4(alias5(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.paddingLeft), depth0)) + ";\">\n <span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "dayname-date-area\" style=\"color: " + alias4(((helper = (helper = helpers.color || (depth0 != null ? depth0.color : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"color","hash":{},"data":data}) : helper))) + ";\">\n " + ((stack1 = (helpers["weekDayname-tmpl"] || (depth0 && depth0["weekDayname-tmpl"]) || alias2).call(alias1,depth0,{"name":"weekDayname-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "\n </span>\n</div>\n"; },"2":function(container,depth0,helpers,partials,data) { var helper; return container.escapeExpression(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "today"; },"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.escapeExpression; return "<div class=\"" + alias2(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "dayname-leftmargin\" style=\"margin-left: " + alias2(container.lambda(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.marginLeft), depth0)) + ";\">\n" + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.dayNames : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "</div>\n"; },"useData":true}); /***/ }), /***/ "./src/js/view/template/week/time.hbs": /*!********************************************!*\ !*** ./src/js/view/template/week/time.hbs ***! \********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var Handlebars = __webpack_require__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); module.exports = (Handlebars['default'] || Handlebars).template({"1":function(container,depth0,helpers,partials,data) { var stack1; return ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,{"name":"each","hash":{},"fn":container.program(2, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); },"2":function(container,depth0,helpers,partials,data) { var stack1; return ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,{"name":"each","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); },"3":function(container,depth0,helpers,partials,data) { var stack1; return ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); },"4":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda; return "<div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "time-date-schedule-block " + ((stack1 = helpers["if"].call(alias1,((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.isPending : stack1),{"name":"if","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\" data-id=\"" + alias4((helpers.stamp || (depth0 && depth0.stamp) || alias2).call(alias1,(depth0 != null ? depth0.model : depth0),{"name":"stamp","hash":{},"data":data})) + "\"\n style=\"" + alias4((helpers["time-scheduleBlock"] || (depth0 && depth0["time-scheduleBlock"]) || alias2).call(alias1,depth0,{"name":"time-scheduleBlock","hash":{},"data":data})) + ";\n" + ((stack1 = (helpers.fi || (depth0 && depth0.fi) || alias2).call(alias1,(depth0 != null ? depth0.left : depth0),"!==",0,{"name":"fi","hash":{},"fn":container.program(7, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + " \">\n <div data-schedule-id=\"" + alias4(alias5(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.id : stack1), depth0)) + "\" data-calendar-id=\"" + alias4(alias5(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.calendarId : stack1), depth0)) + "\" class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "time-schedule " + ((stack1 = helpers["if"].call(alias1,((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.isFocused : stack1),{"name":"if","hash":{},"fn":container.program(9, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\"\n style=\"\n" + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.croppedEnd : depth0),{"name":"unless","hash":{},"fn":container.program(11, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.croppedStart : depth0),{"name":"unless","hash":{},"fn":container.program(13, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + ((stack1 = helpers["if"].call(alias1,((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.isFocused : stack1),{"name":"if","hash":{},"fn":container.program(15, data, 0),"inverse":container.program(17, data, 0),"data":data})) != null ? stack1 : "") + " " + alias4(alias5(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.customStyle : stack1), depth0)) + "\"\n >\n" + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.hasGoingDuration : depth0),{"name":"if","hash":{},"fn":container.program(19, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + " <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "time-schedule-content " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "time-schedule-content-time\" style=\"height: " + alias4(((helper = (helper = helpers.modelDurationHeight || (depth0 != null ? depth0.modelDurationHeight : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"modelDurationHeight","hash":{},"data":data}) : helper))) + "px;\n" + ((stack1 = helpers["if"].call(alias1,((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.isFocused : stack1),{"name":"if","hash":{},"fn":container.program(20, data, 0),"inverse":container.program(22, data, 0),"data":data})) != null ? stack1 : "") + " " + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.hasComingDuration : depth0),{"name":"if","hash":{},"fn":container.program(24, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\">\n " + ((stack1 = (helpers["time-tmpl"] || (depth0 && depth0["time-tmpl"]) || alias2).call(alias1,(depth0 != null ? depth0.model : depth0),{"name":"time-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "\n </div>\n" + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.hasComingDuration : depth0),{"name":"if","hash":{},"fn":container.program(26, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + " </div>\n " + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.croppedEnd : depth0),{"name":"unless","hash":{},"fn":container.program(29, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\n </div>\n"; },"5":function(container,depth0,helpers,partials,data) { var helper; return " " + container.escapeExpression(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "time-date-schedule-block-pending"; },"7":function(container,depth0,helpers,partials,data) { var stack1; return " padding-left: " + container.escapeExpression(container.lambda(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.paddingLeft), depth0)) + ";\n"; },"9":function(container,depth0,helpers,partials,data) { var helper; return container.escapeExpression(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "time-schedule-focused "; },"11":function(container,depth0,helpers,partials,data) { var stack1, alias1=container.lambda, alias2=container.escapeExpression; return " border-bottom-left-radius: " + alias2(alias1(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.borderRadius), depth0)) + ";\n border-bottom-right-radius: " + alias2(alias1(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.borderRadius), depth0)) + ";\n"; },"13":function(container,depth0,helpers,partials,data) { var stack1, alias1=container.lambda, alias2=container.escapeExpression; return " border-top-left-radius: " + alias2(alias1(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.borderRadius), depth0)) + ";\n border-top-right-radius: " + alias2(alias1(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.borderRadius), depth0)) + ";\n"; },"15":function(container,depth0,helpers,partials,data) { var stack1, alias1=container.lambda, alias2=container.escapeExpression; return " color: #ffffff; background-color:" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.color : stack1), depth0)) + "; border-color:" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.color : stack1), depth0)) + ";\n"; },"17":function(container,depth0,helpers,partials,data) { var stack1, alias1=container.lambda, alias2=container.escapeExpression; return " color:" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.color : stack1), depth0)) + "; background-color:" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.bgColor : stack1), depth0)) + "; border-color:" + alias2(alias1(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.borderColor : stack1), depth0)) + ";\n"; },"19":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; return " <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "time-schedule-content " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "time-schedule-content-travel-time\" style=\"height: " + alias4(((helper = (helper = helpers.goingDurationHeight || (depth0 != null ? depth0.goingDurationHeight : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"goingDurationHeight","hash":{},"data":data}) : helper))) + "px;\n" + ((stack1 = helpers["if"].call(alias1,((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.isFocused : stack1),{"name":"if","hash":{},"fn":container.program(20, data, 0),"inverse":container.program(22, data, 0),"data":data})) != null ? stack1 : "") + " border-bottom: 1px dashed " + alias4(((helper = (helper = helpers.travelBorderColor || (depth0 != null ? depth0.travelBorderColor : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"travelBorderColor","hash":{},"data":data}) : helper))) + ";\">" + ((stack1 = (helpers["goingDuration-tmpl"] || (depth0 && depth0["goingDuration-tmpl"]) || alias2).call(alias1,(depth0 != null ? depth0.model : depth0),{"name":"goingDuration-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "</div>\n"; },"20":function(container,depth0,helpers,partials,data) { var stack1; return " border-color:" + container.escapeExpression(container.lambda(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.color : stack1), depth0)) + ";\n"; },"22":function(container,depth0,helpers,partials,data) { var stack1; return " border-color:" + container.escapeExpression(container.lambda(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.borderColor : stack1), depth0)) + ";\n"; },"24":function(container,depth0,helpers,partials,data) { var helper; return "border-bottom: 1px dashed " + container.escapeExpression(((helper = (helper = helpers.travelBorderColor || (depth0 != null ? depth0.travelBorderColor : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"travelBorderColor","hash":{},"data":data}) : helper))) + ";"; },"26":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; return " <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "time-schedule-content " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "time-schedule-content-travel-time\" style=\"height: " + alias4(((helper = (helper = helpers.comingDurationHeight || (depth0 != null ? depth0.comingDurationHeight : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"comingDurationHeight","hash":{},"data":data}) : helper))) + "px;\n" + ((stack1 = helpers["if"].call(alias1,((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.isFocused : stack1),{"name":"if","hash":{},"fn":container.program(20, data, 0),"inverse":container.program(27, data, 0),"data":data})) != null ? stack1 : "") + ";\">" + ((stack1 = (helpers["comingDuration-tmpl"] || (depth0 && depth0["comingDuration-tmpl"]) || alias2).call(alias1,(depth0 != null ? depth0.model : depth0),{"name":"comingDuration-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "</div>\n"; },"27":function(container,depth0,helpers,partials,data) { var stack1; return " border-color:" + container.escapeExpression(container.lambda(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.borderColor : stack1), depth0)) + ";\n "; },"29":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=container.escapeExpression; return "<div class=\"" + alias1(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "time-resize-handle handle-x\" style=\"margin-left: " + alias1(container.lambda(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.paddingLeft), depth0)) + ";\"> </div>"; },"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=container.escapeExpression; return "<div class=\"" + alias2(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "time-date-schedule-block-wrap\" style=\"margin-right: " + alias2(container.lambda(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.marginRight : stack1), depth0)) + ";\">\n" + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.matrices : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "</div>\n"; },"useData":true}); /***/ }), /***/ "./src/js/view/template/week/timeGrid.hbs": /*!************************************************!*\ !*** ./src/js/view/template/week/timeGrid.hbs ***! \************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var Handlebars = __webpack_require__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); module.exports = (Handlebars['default'] || Handlebars).template({"1":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; return "<div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "timegrid-timezone\" data-timezone-index=\"" + alias4(((helper = (helper = helpers.index || (data && data.index)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"index","hash":{},"data":data}) : helper))) + "\" style=\"" + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.hidden : depth0),{"name":"if","hash":{},"fn":container.program(2, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "position: absolute; top: 0; width: " + alias4(((helper = (helper = helpers.width || (depth0 != null ? depth0.width : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"width","hash":{},"data":data}) : helper))) + "%; left: " + alias4(((helper = (helper = helpers.left || (depth0 != null ? depth0.left : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"left","hash":{},"data":data}) : helper))) + "%; border-right: " + alias4(container.lambda(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.leftBorderRight), depth0)) + "; background-color: " + alias4(((helper = (helper = helpers.backgroundColor || (depth0 != null ? depth0.backgroundColor : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"backgroundColor","hash":{},"data":data}) : helper))) + ";\" >\n" + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.isPrimary : depth0),{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.program(10, data, 0),"data":data})) != null ? stack1 : "") + " </div>\n"; },"2":function(container,depth0,helpers,partials,data) { return "display:none;"; },"4":function(container,depth0,helpers,partials,data) { var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {}); return ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.timeSlots : depth0),{"name":"each","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + ((stack1 = helpers["if"].call(alias1,((stack1 = (data && data.root)) && stack1.showHourMarker),{"name":"if","hash":{},"fn":container.program(8, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); },"5":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; return "<div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "timegrid-hour\" style=\"height: " + alias4(container.lambda(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.oneHourHeight), depth0)) + "; color: " + alias4(((helper = (helper = helpers.color || (depth0 != null ? depth0.color : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"color","hash":{},"data":data}) : helper))) + "; font-weight: " + alias4(((helper = (helper = helpers.fontWeight || (depth0 != null ? depth0.fontWeight : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"fontWeight","hash":{},"data":data}) : helper))) + ";\">\n <span style=\"" + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.hidden : depth0),{"name":"if","hash":{},"fn":container.program(6, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\">" + ((stack1 = (helpers["timegridDisplayPrimayTime-tmpl"] || (depth0 && depth0["timegridDisplayPrimayTime-tmpl"]) || alias2).call(alias1,depth0,{"name":"timegridDisplayPrimayTime-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "</span>\n </div>\n"; },"6":function(container,depth0,helpers,partials,data) { return "display:none"; },"8":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda; return " <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "timegrid-hourmarker\" style=\"top:" + alias4(alias5(((stack1 = (data && data.root)) && stack1.hourmarkerTop), depth0)) + "%; margin-top: calc(6px - " + alias4(alias5(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.halfHourHeight), depth0)) + "); height: " + alias4(alias5(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.halfHourHeight), depth0)) + ";\">\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "timegrid-hourmarker-time\" style=\"color: " + alias4(alias5(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.currentTimeColor), depth0)) + "; font-size: " + alias4(alias5(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.currentTimeFontSize), depth0)) + "; font-weight: " + alias4(alias5(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.currentTimeFontWeight), depth0)) + "\">" + ((stack1 = (helpers["timegridCurrentTime-tmpl"] || (depth0 && depth0["timegridCurrentTime-tmpl"]) || alias2).call(alias1,depth0,{"name":"timegridCurrentTime-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "</div>\n </div>\n"; },"10":function(container,depth0,helpers,partials,data) { var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {}); return ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.timeSlots : depth0),{"name":"each","hash":{},"fn":container.program(11, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + ((stack1 = helpers["if"].call(alias1,((stack1 = (data && data.root)) && stack1.showHourMarker),{"name":"if","hash":{},"fn":container.program(13, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); },"11":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression; return "<div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "timegrid-hour\" style=\"height: " + alias4(container.lambda(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.oneHourHeight), depth0)) + "; color: " + alias4(((helper = (helper = helpers.color || (depth0 != null ? depth0.color : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"color","hash":{},"data":data}) : helper))) + "; font-weight: " + alias4(((helper = (helper = helpers.fontWeight || (depth0 != null ? depth0.fontWeight : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"fontWeight","hash":{},"data":data}) : helper))) + ";\">\n <span style=\"" + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.hidden : depth0),{"name":"if","hash":{},"fn":container.program(6, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\">" + ((stack1 = (helpers["timegridDisplayTime-tmpl"] || (depth0 && depth0["timegridDisplayTime-tmpl"]) || alias2).call(alias1,depth0,{"name":"timegridDisplayTime-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "</span>\n </div>\n"; },"13":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda; return " <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "timegrid-hourmarker\" style=\"top:" + alias4(alias5(((stack1 = (data && data.root)) && stack1.hourmarkerTop), depth0)) + "%; margin-top: calc(6px - " + alias4(alias5(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.halfHourHeight), depth0)) + "); height: " + alias4(alias5(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.halfHourHeight), depth0)) + ";\">\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "timegrid-hourmarker-time\" style=\"color: " + alias4(alias5(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.currentTimeColor), depth0)) + "; font-size: " + alias4(alias5(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.currentTimeFontSize), depth0)) + ";\">" + ((stack1 = (helpers["timegridCurrentTime-tmpl"] || (depth0 && depth0["timegridCurrentTime-tmpl"]) || alias2).call(alias1,depth0,{"name":"timegridCurrentTime-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "</div>\n </div>\n"; },"15":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda; return "<div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "timegrid-gridline\" style=\"height: " + alias4(alias5(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.oneHourHeight), depth0)) + ";\n" + ((stack1 = helpers.unless.call(alias1,(data && data.last),{"name":"unless","hash":{},"fn":container.program(16, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + " \">\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "timegrid-gridline-half\" style=\"height: " + alias4(alias5(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.halfHourHeight), depth0)) + "; border-bottom: " + alias4(alias5(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.halfHourBorderBottom), depth0)) + ";\"></div>\n </div>\n"; },"16":function(container,depth0,helpers,partials,data) { var stack1; return " border-bottom: " + container.escapeExpression(container.lambda(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.borderBottom), depth0)) + ";\n"; },"18":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda; return " <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "timegrid-hourmarker\" style=\"top:" + alias4(((helper = (helper = helpers.hourmarkerTop || (depth0 != null ? depth0.hourmarkerTop : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"hourmarkerTop","hash":{},"data":data}) : helper))) + "%\">\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "timegrid-hourmarker-line-left\" style=\"width:" + alias4(((helper = (helper = helpers.todaymarkerLeft || (depth0 != null ? depth0.todaymarkerLeft : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"todaymarkerLeft","hash":{},"data":data}) : helper))) + "%; border-top: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.currentTimeLeftBorderTop : stack1), depth0)) + ";\"></div>\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "timegrid-todaymarker\" style=\"left:" + alias4(((helper = (helper = helpers.todaymarkerLeft || (depth0 != null ? depth0.todaymarkerLeft : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"todaymarkerLeft","hash":{},"data":data}) : helper))) + "%; background-color: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.currentTimeBulletBackgroundColor : stack1), depth0)) + "; \">today</div>\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "timegrid-hourmarker-line-today\" style=\"left:" + alias4(((helper = (helper = helpers.todaymarkerLeft || (depth0 != null ? depth0.todaymarkerLeft : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"todaymarkerLeft","hash":{},"data":data}) : helper))) + "%; width: " + alias4(((helper = (helper = helpers.todaymarkerWidth || (depth0 != null ? depth0.todaymarkerWidth : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"todaymarkerWidth","hash":{},"data":data}) : helper))) + "%; border-top: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.currentTimeTodayBorderTop : stack1), depth0)) + ";\"></div>\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "timegrid-hourmarker-line-right\" style=\"left:" + alias4(((helper = (helper = helpers.todaymarkerRight || (depth0 != null ? depth0.todaymarkerRight : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"todaymarkerRight","hash":{},"data":data}) : helper))) + "%; border-top: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.currentTimeRightBorderTop : stack1), depth0)) + ";\"></div>\n </div>\n"; },"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda; return "<div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "timegrid-left\" style=\"width: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.leftWidth : stack1), depth0)) + "; font-size: " + alias4(alias5(((stack1 = (depth0 != null ? depth0.styles : depth0)) != null ? stack1.leftFontSize : stack1), depth0)) + ";\">\n" + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.timezones : depth0),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "</div>\n<div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "timegrid-right\" style=\"margin-left: " + alias4(alias5(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.leftWidth), depth0)) + ";\">\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "timegrid-h-grid\">\n" + ((stack1 = helpers.each.call(alias1,(depth0 != null ? depth0.hoursLabels : depth0),{"name":"each","hash":{},"fn":container.program(15, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "</div>\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "timegrid-schedules\">\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "timegrid-schedules-container\"></div>\n </div>\n\n" + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.showHourMarker : depth0),{"name":"if","hash":{},"fn":container.program(18, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "</div>\n"; },"useData":true}); /***/ }), /***/ "./src/js/view/template/week/timeGridCurrentTime.hbs": /*!***********************************************************!*\ !*** ./src/js/view/template/week/timeGridCurrentTime.hbs ***! \***********************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var Handlebars = __webpack_require__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); module.exports = (Handlebars['default'] || Handlebars).template({"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { var stack1; return ((stack1 = (helpers["timegridCurrentTime-tmpl"] || (depth0 && depth0["timegridCurrentTime-tmpl"]) || helpers.helperMissing).call(depth0 != null ? depth0 : (container.nullContext || {}),depth0,{"name":"timegridCurrentTime-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "\n"; },"useData":true}); /***/ }), /***/ "./src/js/view/template/week/timeMoveGuide.hbs": /*!*****************************************************!*\ !*** ./src/js/view/template/week/timeMoveGuide.hbs ***! \*****************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var Handlebars = __webpack_require__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); module.exports = (Handlebars['default'] || Handlebars).template({"1":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda; return " <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "time-schedule-content " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "time-schedule-content-travel-time\" style=\"border-color:" + alias4(alias5(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.borderColor : stack1), depth0)) + "; border-bottom: 1px dashed " + alias4(alias5(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.color : stack1), depth0)) + "; height: " + alias4(((helper = (helper = helpers.goingDurationHeight || (depth0 != null ? depth0.goingDurationHeight : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"goingDurationHeight","hash":{},"data":data}) : helper))) + "%;\">" + ((stack1 = (helpers["goingDuration-tmpl"] || (depth0 && depth0["goingDuration-tmpl"]) || alias2).call(alias1,(depth0 != null ? depth0.model : depth0),{"name":"goingDuration-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "</div>\n"; },"3":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda; return " <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "time-schedule-content " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "time-schedule-content-travel-time\" style=\"border-color:" + alias4(alias5(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.borderColor : stack1), depth0)) + "; border-top: 1px dashed " + alias4(alias5(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.color : stack1), depth0)) + "; height: " + alias4(((helper = (helper = helpers.comingDurationHeight || (depth0 != null ? depth0.comingDurationHeight : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"comingDurationHeight","hash":{},"data":data}) : helper))) + "%;\">" + ((stack1 = (helpers["comingDuration-tmpl"] || (depth0 && depth0["comingDuration-tmpl"]) || alias2).call(alias1,(depth0 != null ? depth0.model : depth0),{"name":"comingDuration-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "</div>\n"; },"5":function(container,depth0,helpers,partials,data) { var helper; return "<div class=\"" + container.escapeExpression(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "time-resize-handle handle-x\"> </div>"; },"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda; return "<div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "time-date-schedule-block\" data-id=\"" + alias4((helpers.stamp || (depth0 && depth0.stamp) || alias2).call(alias1,(depth0 != null ? depth0.model : depth0),{"name":"stamp","hash":{},"data":data})) + "\" style=\"width: 100%; height: 100%;\">\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "time-schedule " + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "time-date-schedule-block-focused\" style=\"color: #ffffff; background-color:" + alias4(alias5(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.dragBgColor : stack1), depth0)) + ";\">\n" + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.hasGoingDuration : depth0),{"name":"if","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + " <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "time-schedule-content\" style=\"height: " + alias4(((helper = (helper = helpers.modelDurationHeight || (depth0 != null ? depth0.modelDurationHeight : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"modelDurationHeight","hash":{},"data":data}) : helper))) + "%; border-color:" + alias4(alias5(((stack1 = (depth0 != null ? depth0.model : depth0)) != null ? stack1.borderColor : stack1), depth0)) + ";\">\n " + ((stack1 = (helpers["time-tmpl"] || (depth0 && depth0["time-tmpl"]) || alias2).call(alias1,(depth0 != null ? depth0.model : depth0),{"name":"time-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "\n </div>\n" + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.hasComingDuration : depth0),{"name":"if","hash":{},"fn":container.program(3, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + " </div>\n " + ((stack1 = helpers.unless.call(alias1,(depth0 != null ? depth0.croppedEnd : depth0),{"name":"unless","hash":{},"fn":container.program(5, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\n <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "time-date-schedule-block-cover\"></div>\n</div>\n"; },"useData":true}); /***/ }), /***/ "./src/js/view/template/week/timezoneSticky.hbs": /*!******************************************************!*\ !*** ./src/js/view/template/week/timezoneSticky.hbs ***! \******************************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { var Handlebars = __webpack_require__(/*! ./node_modules/handlebars/runtime.js */ "./node_modules/handlebars/runtime.js"); module.exports = (Handlebars['default'] || Handlebars).template({"1":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda; return "<div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "timegrid-timezone-label-container\" style=\"" + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.hidden : depth0),{"name":"if","hash":{},"fn":container.program(2, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "background-color: " + alias4(((helper = (helper = helpers.backgroundColor || (depth0 != null ? depth0.backgroundColor : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"backgroundColor","hash":{},"data":data}) : helper))) + "; height: 100%; width: " + alias4(((helper = (helper = helpers.width || (depth0 != null ? depth0.width : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"width","hash":{},"data":data}) : helper))) + "%; left: " + alias4(((helper = (helper = helpers.left || (depth0 != null ? depth0.left : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"left","hash":{},"data":data}) : helper))) + "%; font-size: " + alias4(alias5(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.leftFontSize), depth0)) + "; border-right: " + alias4(alias5(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.leftBorderRight), depth0)) + ";\">\n <div title=\"" + alias4(((helper = (helper = helpers.tooltip || (depth0 != null ? depth0.tooltip : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"tooltip","hash":{},"data":data}) : helper))) + "\" class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "timegrid-timezone-label-cell\" data-timezone=\"" + alias4(((helper = (helper = helpers.displayLabel || (depth0 != null ? depth0.displayLabel : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"displayLabel","hash":{},"data":data}) : helper))) + "\" style=\"height: 100%; width: 100%;\">\n" + ((stack1 = helpers["if"].call(alias1,(helpers.and || (depth0 && depth0.and) || alias2).call(alias1,(depth0 != null ? depth0.isPrimary : depth0),((stack1 = (data && data.root)) && stack1.showTimezoneCollapseButton),{"name":"and","hash":{},"data":data}),{"name":"if","hash":{},"fn":container.program(4, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + " <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "timegrid-timezone-label\">" + ((stack1 = (helpers["timezoneDisplayLabel-tmpl"] || (depth0 && depth0["timezoneDisplayLabel-tmpl"]) || alias2).call(alias1,(depth0 != null ? depth0.timezoneOffset : depth0),(depth0 != null ? depth0.displayLabel : depth0),{"name":"timezoneDisplayLabel-tmpl","hash":{},"data":data})) != null ? stack1 : "") + "</div>\n </div>\n</div>\n"; },"2":function(container,depth0,helpers,partials,data) { return "display:none;"; },"4":function(container,depth0,helpers,partials,data) { var stack1, helper, alias1=depth0 != null ? depth0 : (container.nullContext || {}), alias2=helpers.helperMissing, alias3="function", alias4=container.escapeExpression, alias5=container.lambda; return " <div class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "timegrid-timezone-close-btn\" style=\"border: 1px solid #ddd; top:2px; bottom: 2px; width: 10px; border-left: none;\">\n <span style=\"color: #777; height: calc(" + alias4(alias5(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.displayTimezoneLabelHeight), depth0)) + " - 6px); line-height: calc(" + alias4(alias5(((stack1 = ((stack1 = (data && data.root)) && stack1.styles)) && stack1.displayTimezoneLabelHeight), depth0)) + " - 6px);\">\n <span class=\"" + alias4(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : alias2),(typeof helper === alias3 ? helper.call(alias1,{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "icon " + ((stack1 = helpers["if"].call(alias1,((stack1 = (data && data.root)) && stack1.timezonesCollapsed),{"name":"if","hash":{},"fn":container.program(5, data, 0),"inverse":container.program(7, data, 0),"data":data})) != null ? stack1 : "") + "\"></span>\n </span>\n </div>\n"; },"5":function(container,depth0,helpers,partials,data) { var helper; return container.escapeExpression(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "ic-arrow-right"; },"7":function(container,depth0,helpers,partials,data) { var helper; return container.escapeExpression(((helper = (helper = helpers.CSS_PREFIX || (depth0 != null ? depth0.CSS_PREFIX : depth0)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"CSS_PREFIX","hash":{},"data":data}) : helper))) + "ic-arrow-left"; },"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data) { var stack1, alias1=depth0 != null ? depth0 : (container.nullContext || {}); return ((stack1 = helpers.each.call(alias1,(helpers.reverse || (depth0 && depth0.reverse) || helpers.helperMissing).call(alias1,(depth0 != null ? depth0.timezones : depth0),{"name":"reverse","hash":{},"data":data}),{"name":"each","hash":{},"fn":container.program(1, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); },"useData":true}); /***/ }), /***/ "./src/js/view/view.js": /*!*****************************!*\ !*** ./src/js/view/view.js ***! \*****************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview The base class of views. * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var domutil = __webpack_require__(/*! ../common/domutil */ "./src/js/common/domutil.js"); var Collection = __webpack_require__(/*! ../common/collection */ "./src/js/common/collection.js"); /** * Base class of views. * * All views create own container element inside supplied container element. * @constructor * @param {HTMLElement} container Default container element for view. * you can use this element for this.container syntax. */ function View(container) { var id = util.stamp(this); if (util.isUndefined(container)) { container = domutil.appendHTMLElement('div'); } domutil.addClass(container, this.cssprefix(id)); /** * unique id * @type {number} */ this.id = id; /** * base element of view. * @type {HTMLDIVElement} */ this.container = container; /*eslint-disable*/ /** * child views. * @type {Collection} */ this.children = new Collection(function(view) { return util.stamp(view); }); /* eslint-enable*/ /** * parent view instance. * @type {View} */ this.parent = null; /** * state of view */ this.state = {}; } /** * CSS classname prefix * @type {string} */ View.prototype.cssPrefix = 'tui-view-'; /** * Add child views. * @param {View} view The view instance to add. * @param {function} [fn] Function for invoke before add. parent view class is supplied first arguments. */ View.prototype.addChild = function(view, fn) { if (fn) { fn.call(view, this); } // add parent view view.parent = this; this.children.add(view); }; /** * Remove added child view. * @param {(number|View)} id View id or instance itself to remove. * @param {function} [fn] Function for invoke before remove. parent view class is supplied first arguments. */ View.prototype.removeChild = function(id, fn) { var view = util.isNumber(id) ? this.children.items[id] : id; id = util.stamp(view); if (fn) { fn.call(view, this); } this.children.remove(id); }; /** * Render view recursively. */ View.prototype.render = function() { this.children.each(function(childView) { childView.render(); }); }; /** * Invoke function recursively. * @param {function} fn - function to invoke child view recursively * @param {boolean} [skipThis=false] - set true then skip invoke with this(root) view. */ View.prototype.recursive = function(fn, skipThis) { if (!util.isFunction(fn)) { return; } if (!skipThis) { fn(this); } this.children.each(function(childView) { childView.recursive(fn); }); }; /** * Resize view recursively to parent. */ View.prototype.resize = function() { var args = Array.prototype.slice.call(arguments), parent = this.parent; while (parent) { if (util.isFunction(parent._onResize)) { parent._onResize.apply(parent, args); } parent = parent.parent; } }; /** * Invoking method before destroying. */ View.prototype._beforeDestroy = function() {}; /** * Clear properties */ View.prototype._destroy = function() { this._beforeDestroy(); this.children.clear(); this.container.innerHTML = ''; this.id = this.parent = this.children = this.container = null; }; /*eslint-disable*/ /** * Destroy child view recursively. */ View.prototype.destroy = function(isChildView) { this.children.each(function(childView) { childView.destroy(true); childView._destroy(); }); if (isChildView) { return; } this._destroy(); }; /* eslint-enable*/ /** * Calculate view's container element bound. * @returns {object} The bound of container element. */ View.prototype.getViewBound = function() { var container = this.container, position = domutil.getPosition(container), size = domutil.getSize(container); return { x: position[0], y: position[1], width: size[0], height: size[1] }; }; /** * Return view default CSS prefix * @param {string} [className] - if supplied then return prefix added class name * @returns {string} CSS prefix value */ View.prototype.cssprefix = function(className) { return this.cssPrefix + (className || ''); }; /** * set state * @param {object} state - state */ View.prototype.setState = function(state) { util.extend(this.state, state); }; util.CustomEvents.mixin(View); module.exports = View; /***/ }), /***/ "./src/js/view/week/dayGrid.js": /*!*************************************!*\ !*** ./src/js/view/week/dayGrid.js ***! \*************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview DayGrid in weekly view * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"), common = __webpack_require__(/*! ../../common/common */ "./src/js/common/common.js"), datetime = __webpack_require__(/*! ../../common/datetime */ "./src/js/common/datetime.js"), domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"), TZDate = __webpack_require__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date, View = __webpack_require__(/*! ../../view/view */ "./src/js/view/view.js"), DayGridSchedule = __webpack_require__(/*! ./dayGridSchedule */ "./src/js/view/week/dayGridSchedule.js"), baseTmpl = __webpack_require__(/*! ../template/week/dayGrid.hbs */ "./src/js/view/template/week/dayGrid.hbs"), reqAnimFrame = __webpack_require__(/*! ../../common/reqAnimFrame */ "./src/js/common/reqAnimFrame.js"); var mmax = Math.max, mmin = Math.min; /** * @constructor * @extends {Weekday} * @param {string} name - view name * @param {object} options - options for DayGridSchedule view * @param {number} [options.heightPercent] - height percent of view * @param {number} [options.containerButtonGutter=8] - free space at bottom to * make create easy. * @param {number} [options.scheduleHeight=18] - height of each schedule block. * @param {number} [options.scheduleGutter=2] - gutter height of each schedule block. * @param {HTMLDIVElement} container - DOM element to use container for this * view. * @param {Theme} theme - theme instance */ function DayGrid(name, options, container, theme) { container = domutil.appendHTMLElement( 'div', container, config.classname('daygrid-layout') ); View.call(this, container); name = name || 'daygrid'; this.options = util.extend({ viewName: name, daynames: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], renderStartDate: '', renderEndDate: '', containerBottomGutter: 18, scheduleHeight: parseInt(theme.week.dayGridSchedule.height, 10), scheduleGutter: parseInt(theme.week.dayGridSchedule.marginTop, 10), scheduleContainerTop: 1, timezones: options.timezones, isReadOnly: options.isReadOnly, getViewModelFunc: function(viewModel) { return viewModel.schedulesInDateRange[name]; }, setViewModelFunc: function(viewModel, matrices) { viewModel.schedulesInDateRange[name] = matrices; } }, options.week); this.handler = {}; this.vPanel = null; this.state.collapsed = true; } util.inherit(DayGrid, View); /** * @override * @param {object} viewModel - schedules view models */ DayGrid.prototype.getBaseViewModel = function(viewModel) { var opt = this.options, daynames = opt.daynames, range = viewModel.range, grids = viewModel.grids, matrices = opt.getViewModelFunc(viewModel), exceedDate = {}, panel = getPanel(opt.panels, opt.viewName), panelHeight = this.getViewBound().height, collapsed = this.state.collapsed, heightForcedSet = this.vPanel ? this.vPanel.getHeightForcedSet() : false, timezonesCollapsed = viewModel.state.timezonesCollapsed, styles = this._getStyles(viewModel.theme, timezonesCollapsed); var baseViewModel, visibleScheduleCount; if (panel.showExpandableButton) { if (!heightForcedSet) { if (collapsed) { panelHeight = mmax(panelHeight, panel.maxHeight); } else { panelHeight = mmin(panelHeight, panel.maxExpandableHeight); } } visibleScheduleCount = Math.floor(panelHeight / (opt.scheduleHeight + opt.scheduleGutter)); if (collapsed) { exceedDate = this.parent.controller.getExceedDate(visibleScheduleCount, matrices, viewModel.range ); matrices = this.parent.controller.excludeExceedSchedules(matrices, visibleScheduleCount); opt.setViewModelFunc(viewModel, matrices); } } baseViewModel = { viewName: opt.viewName, range: range, grids: grids, days: util.map(viewModel.range, function(d, index) { var day = d.getDay(); var ymd = datetime.format(d, 'YYYYMMDD'); var isToday = datetime.isSameDate(d, new TZDate()); return { day: day, dayName: daynames[day], isToday: isToday, date: d.getDate(), renderDate: datetime.format(d, 'YYYY-MM-DD'), hiddenSchedules: exceedDate[ymd] || 0, width: grids[index] ? grids[index].width : 0, left: grids[index] ? grids[index].left : 0, backgroundColor: viewModel.range.length > 1 ? getWeekBackgroundColor(day, isToday, styles) : styles.backgroundColor }; }), exceedDate: exceedDate, showExpandableButton: panel.showExpandableButton, collapsed: collapsed, collapseBtnIndex: this.state.clickedExpandBtnIndex, styles: styles }; return baseViewModel; }; /** * @override * @param {object} viewModel - schedules view models */ DayGrid.prototype.render = function(viewModel) { var opt = this.options, container = this.container, baseViewModel = this.getBaseViewModel(viewModel), scheduleContainerTop = this.options.scheduleContainerTop; var dayGridSchedule; container.innerHTML = baseTmpl(baseViewModel); this.children.clear(); dayGridSchedule = new DayGridSchedule( opt, domutil.find(config.classname('.container'), container) ); this.addChild(dayGridSchedule); dayGridSchedule.on('afterRender', function(weekdayViewModel) { baseViewModel.height = weekdayViewModel.minHeight + scheduleContainerTop; }); this.children.each(function(childView) { childView.render(viewModel); }, this); this.fire('afterRender', baseViewModel); }; DayGrid.prototype._beforeDestroy = function() { }; DayGrid.prototype.addHandler = function(type, handler, vPanel) { var self = this; this.handler[type] = handler; this.vPanel = vPanel; if (type === 'click') { handler.on('expand', function() { self.setState({ collapsed: false }); }, this); handler.on('collapse', function() { self.setState({ collapsed: true }); }, this); } }; DayGrid.prototype._expand = function() { reqAnimFrame.requestAnimFrame(function() { var vPanel = this.vPanel; var opt = this.options; var panel = getPanel(opt.panels, opt.viewName); vPanel.setMaxHeight(panel.maxExpandableHeight); vPanel.setHeightForcedSet(false); vPanel.setHeight(null, panel.maxExpandableHeight); if (this.parent) { this.parent.render(); } }, this); }; DayGrid.prototype._collapse = function() { reqAnimFrame.requestAnimFrame(function() { var vPanel = this.vPanel; var opt = this.options; var panel = getPanel(opt.panels, opt.viewName); vPanel.setMaxHeight(panel.maxHeight); vPanel.setHeightForcedSet(false); vPanel.setHeight(null, panel.minHeight); if (this.parent) { this.parent.render(); } }, this); }; /** * set state * @param {object} state - state */ DayGrid.prototype.setState = function(state) { var collapsed = this.state.collapsed; View.prototype.setState.call(this, state); if (this.state.collapsed === collapsed) { return; } if (this.state.collapsed) { this._collapse(); } else { this._expand(); } }; /** * Get the styles from theme * @param {Theme} theme - theme instance * @param {boolean} timezonesCollapsed - multiple timezones are collapsed. * @returns {object} styles - styles object */ DayGrid.prototype._getStyles = function(theme, timezonesCollapsed) { var styles = {}; var timezonesLength = this.options.timezones.length; var collapsed = timezonesCollapsed; var numberAndUnit; if (theme) { styles.borderRight = theme.week.daygrid.borderRight || theme.common.border; styles.todayBackgroundColor = theme.week.today.backgroundColor; styles.weekendBackgroundColor = theme.week.weekend.backgroundColor; styles.backgroundColor = theme.week.daygrid.backgroundColor; styles.leftWidth = theme.week.daygridLeft.width; styles.leftBackgroundColor = theme.week.daygridLeft.backgroundColor; styles.leftPaddingRight = theme.week.daygridLeft.paddingRight; styles.leftBorderRight = theme.week.daygridLeft.borderRight; if (!collapsed && timezonesLength > 1) { numberAndUnit = common.parseUnit(styles.leftWidth); styles.leftWidth = (numberAndUnit[0] * timezonesLength) + numberAndUnit[1]; } } return styles; }; /** * Get a background color based on day. * @param {number} day - day number * @param {boolean} isToday - today flag * @param {object} styles - style object * @returns {string} backgroundColor */ function getWeekBackgroundColor(day, isToday, styles) { var backgroundColor = ''; if (day === 0 || day === 6) { backgroundColor = styles.weekendBackgroundColor; } else if (isToday) { backgroundColor = styles.todayBackgroundColor; } else { backgroundColor = styles.backgroundColor; } return backgroundColor; } /** * get a panel infomation * @param {Array.<object[]>} panels - panel infomations * @param {string} name - panel name * @returns {object} panel information */ function getPanel(panels, name) { var found; util.forEach(panels, function(panel) { if (panel.name === name) { found = panel; } }); return found; } module.exports = DayGrid; /***/ }), /***/ "./src/js/view/week/dayGridSchedule.js": /*!*********************************************!*\ !*** ./src/js/view/week/dayGridSchedule.js ***! \*********************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Weekday view for week * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var Weekday = __webpack_require__(/*! ../weekday */ "./src/js/view/weekday.js"), tmpl = __webpack_require__(/*! ../template/week/dayGridSchedule.hbs */ "./src/js/view/template/week/dayGridSchedule.hbs"); var mmax = Math.max; /** * @constructor * @extends {Weekday} * @param {object} options - options for DayGridSchedule view * @param {number} [options.containerButtonGutter=8] - free space at bottom to * make create easy. * @param {number} [options.scheduleHeight=18] - height of each schedule block. * @param {number} [options.scheduleGutter=2] - gutter height of each schedule block. * @param {HTMLDIVElement} container - DOM element to use container for this * view. */ function DayGridSchedule(options, container) { Weekday.call(this, options, container); this.collapsed = true; } util.inherit(DayGridSchedule, Weekday); /** * Render Weekday view * @override */ DayGridSchedule.prototype.render = function(viewModel) { var container = this.container; var baseViewModel; baseViewModel = this.getBaseViewModel(viewModel); container.innerHTML = tmpl(baseViewModel); this.fire('afterRender', baseViewModel); }; /** * returns maximum schedule count in day * @param {array} matrices - The matrices for schedule placing. * @returns {number} maximum schedule count in day */ DayGridSchedule.prototype._getMaxScheduleInDay = function(matrices) { return mmax.apply( null, util.map(matrices, function(matrix) { return Math.max.apply(null, util.map(matrix, function(row) { return row.length; })); }) ); }; /** * returns minimum height for container. * @param {number} maxScheduleInDay - max schedule blocks in one day * @returns {number} */ DayGridSchedule.prototype._getMinHeight = function(maxScheduleInDay) { var opt = this.options; var contentHeight = (maxScheduleInDay * opt.scheduleHeight) + ((maxScheduleInDay - 1) * opt.scheduleGutter); // if (this.collapsed && this.aboutMe.maxHeight >= contentHeight + opt.containerBottomGutter) { // contentHeight += opt.containerBottomGutter; // } return contentHeight; }; /** * @override * @param {object} viewModel - schedules view models */ DayGridSchedule.prototype.getBaseViewModel = function(viewModel) { var opt = this.options; var matrices = opt.getViewModelFunc(viewModel); var maxScheduleInDay = this._getMaxScheduleInDay(matrices); var baseViewModel; var styles = this._getStyles(viewModel.theme); baseViewModel = Weekday.prototype.getBaseViewModel.call(this, viewModel); baseViewModel = util.extend({ minHeight: this._getMinHeight(maxScheduleInDay), matrices: matrices, scheduleContainerTop: this.options.scheduleContainerTop, maxScheduleInDay: maxScheduleInDay, isReadOnly: opt.isReadOnly, styles: styles }, baseViewModel); return baseViewModel; }; /** * Get the styles from theme * @param {Theme} theme - theme instance * @returns {object} styles - styles object */ DayGridSchedule.prototype._getStyles = function(theme) { var styles = {}; if (theme) { styles.borderRadius = theme.week.dayGridSchedule.borderRadius; } return styles; }; module.exports = DayGridSchedule; /***/ }), /***/ "./src/js/view/week/dayname.js": /*!*************************************!*\ !*** ./src/js/view/week/dayname.js ***! \*************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview View for rendering daynames * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"); var common = __webpack_require__(/*! ../../common/common */ "./src/js/common/common.js"); var datetime = __webpack_require__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); var TZDate = __webpack_require__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date; var domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); var View = __webpack_require__(/*! ../view */ "./src/js/view/view.js"); var daynameTmpl = __webpack_require__(/*! ../template/week/daynames.hbs */ "./src/js/view/template/week/daynames.hbs"); /** * @constructor * @param {object} options - options for dayname view * @param {HTMLElement} container Container element to use. * @param {Theme} theme - theme instance * @extends {View} */ function DayName(options, container, theme) { container = domutil.appendHTMLElement( 'div', container, config.classname('dayname-container') ); this.options = util.extend({ daynames: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], timezones: options.timezones }, options.week); /** * @type {Theme} */ this.theme = theme; View.call(this, container); this.applyTheme(); } util.inherit(DayName, View); /** * Get default viewmodels. * @param {Date} start The date of start render * @param {Date} end The end of end render * @param {object} grids grid data(width, left, day) * @returns {array} viewmodel. */ DayName.prototype._getBaseViewModel = function(start, end, grids) { var daynames = this.options.daynames, theme = this.theme, now = new TZDate(), viewModel; viewModel = util.map(datetime.range( datetime.start(start), datetime.end(end), datetime.MILLISECONDS_PER_DAY ), function(d, i) { var day = d.getDay(); var isToday = datetime.isSameDate(d, now); var isPastDay = d < now && !isToday; return { day: day, dayName: daynames[day], isToday: isToday, date: d.getDate(), left: grids[i] ? grids[i].left : 0, width: grids[i] ? grids[i].width : 0, renderDate: datetime.format(d, 'YYYY-MM-DD'), color: this._getDayNameColor(theme, day, isToday, isPastDay) }; }, this); return viewModel; }; /** * @override * @param {object} viewModel View model from parent (WeekView) */ DayName.prototype.render = function(viewModel) { var dayNames = this._getBaseViewModel( viewModel.renderStartDate, viewModel.renderEndDate, viewModel.grids ); var timezonesCollapsed = viewModel.state.timezonesCollapsed; var styles = this._getStyles(this.theme, timezonesCollapsed); var baseViewModel = util.extend({}, { dayNames: dayNames, styles: styles }); this.container.innerHTML = daynameTmpl(baseViewModel); }; /** * Get a day name color * @param {Theme} theme - theme instance * @param {number} day - day number * @param {boolean} isToday - today flag * @param {boolean} isPastDay - is past day flag * @returns {string} style - color style */ DayName.prototype._getDayNameColor = function(theme, day, isToday, isPastDay) { var color = ''; if (theme) { if (day === 0) { color = theme.common.holiday.color; } else if (isPastDay) { color = theme.week.pastDay.color || theme.common.dayname.color; } else if (day === 6) { color = theme.common.saturday.color; } else if (isToday) { color = theme.week.today.color || theme.common.today.color; } else { color = theme.common.dayname.color; } } return color; }; /** * Get the styles from theme * @param {Theme} theme - theme instance * @param {boolean} timezonesCollapsed - multiple timezones are collapsed. * @returns {object} styles - styles object */ DayName.prototype._getStyles = function(theme, timezonesCollapsed) { var styles = {}; var timezonesLength = this.options.timezones.length; var collapsed = timezonesCollapsed; var numberAndUnit; if (theme) { styles.borderTop = theme.week.dayname.borderTop || theme.common.border; styles.borderBottom = theme.week.dayname.borderBottom || theme.common.border; styles.borderLeft = theme.week.dayname.borderLeft || theme.common.border; styles.paddingLeft = theme.week.dayname.paddingLeft; styles.backgroundColor = theme.week.dayname.backgroundColor; styles.height = theme.week.dayname.height; styles.textAlign = theme.week.dayname.textAlign; styles.marginLeft = theme.week.daygridLeft.width; if (!collapsed && timezonesLength > 1) { numberAndUnit = common.parseUnit(styles.marginLeft); styles.marginLeft = (numberAndUnit[0] * timezonesLength) + numberAndUnit[1]; } } return styles; }; DayName.prototype.applyTheme = function() { var styles = this._getStyles(this.theme); var style = this.container.style; style.borderTop = styles.borderTop; style.borderBottom = styles.borderBottom; style.height = styles.height; style.backgroundColor = styles.backgroundColor; style.textAlign = styles.textAlign; return style; }; module.exports = DayName; /***/ }), /***/ "./src/js/view/week/time.js": /*!**********************************!*\ !*** ./src/js/view/week/time.js ***! \**********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview View of time. * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"); var datetime = __webpack_require__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); var domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); var View = __webpack_require__(/*! ../view */ "./src/js/view/view.js"); var timeTmpl = __webpack_require__(/*! ../template/week/time.hbs */ "./src/js/view/template/week/time.hbs"); var forEachArr = util.forEachArray; var SCHEDULE_MIN_DURATION = datetime.MILLISECONDS_SCHEDULE_MIN_DURATION; /** * @constructor * @extends {View} * @param {object} options Options * @param {number} options.index Date index in week view. * @param {number} options.width Date element width (percent) * @param {string} options.ymd YYYMMDD string for this view * @param {boolean} options.isToday when set true then assign today design class to container. * @param {number} options.hourStart Can limit of render hour start. * @param {number} options.hourEnd Can limit of render hour end. * @param {HTMLElement} container Element to use container for this view. * @param {Theme} theme - theme instance */ function Time(options, container, theme) { View.call(this, container); this.options = util.extend({ index: 0, width: 0, ymd: '', isToday: false, pending: false, hourStart: 0, hourEnd: 24, defaultMarginBottom: 2, minHeight: 18.5, isReadOnly: false }, options); this.timeTmpl = timeTmpl; /** * @type {Theme} */ this.theme = theme; container.style.width = options.width + '%'; container.style.left = options.left + '%'; if (this.options.isToday) { domutil.addClass(this.container, config.classname('today')); } this.applyTheme(); } util.inherit(Time, View); /** * Convert YYYYMMDD formatted string date to Date. * @param {string} str formatted string. * @returns {Date} start of date. */ Time.prototype._parseDateGroup = function(str) { var y = parseInt(str.substr(0, 4), 10), m = parseInt(str.substr(4, 2), 10), d = parseInt(str.substr(6, 2), 10); var date = datetime.start(); date.setFullYear(y, m - 1, d); return datetime.start(date); }; /** * calculate left and width * @param {ScheduleViewModel} viewModel - view model instance to calculate bound. * @param {object} options - options for calculating schedule element's bound. * @returns {object} - left and width */ Time.prototype._getScheduleViewBoundX = function(viewModel, options) { var width = options.baseWidth * (viewModel.extraSpace + 1); // set width auto when has no collisions. if (!viewModel.hasCollide) { width = null; } return { left: options.baseLeft[options.columnIndex], width: width }; }; /** * calculate top, height, croppedStart and croppedEnd * @param {ScheduleViewModel} viewModel - view model instance to calculate bound. * @param {object} options - options for calculating schedule element's bound. * @returns {object} - left and width */ Time.prototype._getScheduleViewBoundY = function(viewModel, options) { var baseMS = options.baseMS; var baseHeight = options.baseHeight; var croppedStart = false; var croppedEnd = false; var goingDuration = datetime.millisecondsFrom('minutes', viewModel.valueOf().goingDuration); var comingDuration = datetime.millisecondsFrom('minutes', viewModel.valueOf().comingDuration); var offsetStart = viewModel.valueOf().start - goingDuration - options.todayStart; // containerHeight : milliseconds in day = x : schedule's milliseconds var top = (baseHeight * offsetStart) / baseMS; var modelDuration = viewModel.duration(); var height; var duration; var goingDurationHeight; var modelDurationHeight; var comingDurationHeight; modelDuration = modelDuration > SCHEDULE_MIN_DURATION ? modelDuration : SCHEDULE_MIN_DURATION; duration = modelDuration + goingDuration + comingDuration; height = (baseHeight * duration) / baseMS; goingDurationHeight = (baseHeight * goingDuration) / baseMS; // common.ratio(duration, goingDuration, 100); modelDurationHeight = (baseHeight * modelDuration) / baseMS; // common.ratio(duration, modelDuration, 100); comingDurationHeight = (baseHeight * comingDuration) / baseMS; // common.ratio(duration, comingDuration, 100); if (offsetStart < 0) { top = 0; height += ((baseHeight * offsetStart) / baseMS); croppedStart = true; } if (height + top > baseHeight) { height = baseHeight - top; croppedEnd = true; } return { top: top, height: Math.max(height, this.options.minHeight) - this.options.defaultMarginBottom, modelDurationHeight: modelDurationHeight, goingDurationHeight: goingDurationHeight, comingDurationHeight: comingDurationHeight, hasGoingDuration: goingDuration > 0, hasComingDuration: comingDuration > 0, croppedStart: croppedStart, croppedEnd: croppedEnd }; }; /** * @param {ScheduleViewModel} viewModel - view model instance to calculate bound. * @param {object} options - options for calculating schedule element's bound. * @param {Date} options.todayStart - date object represent schedule date's start (00:00:00) * @param {number} options.baseMS - the number of milliseconds to render schedule blocks. * @param {number} options.baseHeight - pixel value related with baseMS options. * @param {number[]} options.baseLeft - left position percents for each columns. * @param {number} options.baseWidth - the unit of schedule blocks width percent. * @param {number} options.columnIndex - the number index of schedule blocks. * it represent rendering index from left sides in view. * @returns {object} bound object for supplied view model. */ Time.prototype.getScheduleViewBound = function(viewModel, options) { var boundX = this._getScheduleViewBoundX(viewModel, options); var boundY = this._getScheduleViewBoundY(viewModel, options); var schedule = viewModel.model; var isReadOnly = util.pick(schedule, 'isReadOnly') || false; var travelBorderColor = schedule.isFocused ? '#ffffff' : schedule.borderColor; if (travelBorderColor === schedule.bgColor) { travelBorderColor = null; // follow text color } return util.extend({ isReadOnly: isReadOnly, travelBorderColor: travelBorderColor }, boundX, boundY); }; /** * Set viewmodels for rendering. * @param {string} ymd The date of schedules. YYYYMMDD format. * @param {array} matrices The matrices for schedule placing. * @param {number} containerHeight - container's height */ Time.prototype._getBaseViewModel = function(ymd, matrices, containerHeight) { var self = this, options = this.options, hourStart = options.hourStart, hourEnd = options.hourEnd, isReadOnly = options.isReadOnly, todayStart, baseMS; /** * Calculate each schedule element bounds relative with rendered hour milliseconds and * wrap each schedule model to viewmodels. */ containerHeight = containerHeight || this.getViewBound().height; todayStart = this._parseDateGroup(ymd); todayStart.setHours(hourStart); baseMS = datetime.millisecondsFrom('hour', (hourEnd - hourStart)); forEachArr(matrices, function(matrix) { var maxRowLength, widthPercent, leftPercents, i; maxRowLength = Math.max.apply(null, util.map(matrix, function(row) { return row.length; })); widthPercent = 100 / maxRowLength; leftPercents = []; for (i = 0; i < maxRowLength; i += 1) { leftPercents[i] = widthPercent * i; } forEachArr(matrix, function(row) { forEachArr(row, function(viewModel, col) { var viewBound; if (!viewModel) { return; } viewBound = self.getScheduleViewBound(viewModel, { todayStart: todayStart, baseMS: baseMS, baseLeft: leftPercents, baseWidth: widthPercent, baseHeight: containerHeight, columnIndex: col, isReadOnly: isReadOnly }); util.extend(viewModel, viewBound); }); }); }); }; /** * @returns {Date} - Date of this view. */ Time.prototype.getDate = function() { return this._parseDateGroup(this.options.ymd); }; /** * @override * @param {string} ymd The date of schedules. YYYYMMDD format * @param {array} matrices Matrices for placing schedules * @param {number} containerHeight - container's height */ Time.prototype.render = function(ymd, matrices, containerHeight) { this._getBaseViewModel(ymd, matrices, containerHeight); this.container.innerHTML = this.timeTmpl({ matrices: matrices, styles: this._getStyles(this.theme) }); }; /** * Get the styles from theme * @param {Theme} theme - theme instance * @returns {object} styles - styles object */ Time.prototype._getStyles = function(theme) { var styles = {}; var options = this.options; if (theme) { styles.borderRight = theme.week.timegrid.borderRight || theme.common.border; styles.marginRight = theme.week.timegrid.paddingRight; styles.borderRadius = theme.week.timegridSchedule.borderRadius; styles.paddingLeft = theme.week.timegridSchedule.paddingLeft; styles.backgroundColor = options.isToday ? theme.week.today.backgroundColor : 'inherit'; } return styles; }; Time.prototype.applyTheme = function() { var style = this.container.style; var styles = this._getStyles(this.theme); style.borderRight = styles.borderRight; style.backgroundColor = styles.backgroundColor; }; module.exports = Time; /***/ }), /***/ "./src/js/view/week/timeGrid.js": /*!**************************************!*\ !*** ./src/js/view/week/timeGrid.js ***! \**************************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview View for rendered schedules by times. * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"); var common = __webpack_require__(/*! ../../common/common */ "./src/js/common/common.js"); var domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); var domevent = __webpack_require__(/*! ../../common/domevent */ "./src/js/common/domevent.js"); var datetime = __webpack_require__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); var Timezone = __webpack_require__(/*! ../../common/timezone */ "./src/js/common/timezone.js"); var reqAnimFrame = __webpack_require__(/*! ../../common/reqAnimFrame */ "./src/js/common/reqAnimFrame.js"); var View = __webpack_require__(/*! ../view */ "./src/js/view/view.js"); var Time = __webpack_require__(/*! ./time */ "./src/js/view/week/time.js"); var AutoScroll = __webpack_require__(/*! ../../common/autoScroll */ "./src/js/common/autoScroll.js"); var mainTmpl = __webpack_require__(/*! ../template/week/timeGrid.hbs */ "./src/js/view/template/week/timeGrid.hbs"); var timezoneStickyTmpl = __webpack_require__(/*! ../template/week/timezoneSticky.hbs */ "./src/js/view/template/week/timezoneSticky.hbs"); var timegridCurrentTimeTmpl = __webpack_require__(/*! ../template/week/timeGridCurrentTime.hbs */ "./src/js/view/template/week/timeGridCurrentTime.hbs"); var TZDate = Timezone.Date; var HOURMARKER_REFRESH_INTERVAL = 1000 * 60; var SIXTY_SECONDS = 60; var SIXTY_MINUTES = 60; /** * Returns a list of time labels from start to end. * For hidden labels near the current time, set to hidden: true. * @param {object} opt - TimeGrid.options * @param {boolean} hasHourMarker - Whether the current time is displayed * @param {number} timezoneOffset - timezone offset * @param {object} styles - styles * @returns {Array.<Object>} */ function getHoursLabels(opt, hasHourMarker, timezoneOffset, styles) { var hourStart = opt.hourStart; var hourEnd = opt.hourEnd; var renderEndDate = new TZDate(opt.renderEndDate); var shiftByOffset = parseInt(timezoneOffset / SIXTY_MINUTES, 10); var shiftMinutes = Math.abs(timezoneOffset % SIXTY_MINUTES); var now = new TZDate().toLocalTime(); var nowMinutes = now.getMinutes(); var hoursRange = util.range(0, 24); var nowAroundHours = null; var nowHours, nowHoursIndex; if (shiftByOffset < 0 && shiftMinutes > 0) { shiftByOffset -= 1; } // shift the array and take elements between start and end common.shiftArray(hoursRange, shiftByOffset); common.takeArray(hoursRange, hourStart, hourEnd); nowHours = common.shiftHours(now.getHours(), shiftByOffset) % 24; nowHoursIndex = util.inArray(nowHours, hoursRange); if (hasHourMarker) { if (nowMinutes < 20) { nowAroundHours = nowHours; } else if (nowMinutes > 40) { nowAroundHours = nowHours + 1; } if (util.isNumber(nowAroundHours)) { nowAroundHours %= 24; } } return util.map(hoursRange, function(hour, index) { var color; var fontWeight; var isPast = (hasHourMarker && index <= nowHoursIndex) || (renderEndDate < now && !datetime.isSameDate(renderEndDate, now)); if (isPast) { // past color = styles.pastTimeColor; fontWeight = styles.pastTimeFontWeight; } else { // future color = styles.futureTimeColor; fontWeight = styles.futureTimeFontWeight; } return { hour: hour, minutes: shiftMinutes, hidden: nowAroundHours === hour || index === 0, color: color || '', fontWeight: fontWeight || '' }; }); } /** * @constructor * @extends {View} * @param {string} name - view name * @param {object} options The object for view customization. * @param {string} options.renderStartDate - render start date. YYYY-MM-DD * @param {string} options.renderEndDate - render end date. YYYY-MM-DD * @param {number} [options.hourStart=0] You can change view's start hours. * @param {number} [options.hourEnd=0] You can change view's end hours. * @param {HTMLElement} panelElement panel element. */ function TimeGrid(name, options, panelElement) { var container = domutil.appendHTMLElement( 'div', panelElement, config.classname('timegrid-container') ); var stickyContainer = domutil.appendHTMLElement( 'div', panelElement, config.classname('timegrid-sticky-container') ); panelElement.style.position = 'relative'; // for stickyContainer name = name || 'time'; View.call(this, container); if (!util.browser.safari) { /** * @type {AutoScroll} */ this._autoScroll = new AutoScroll(container); } this.stickyContainer = stickyContainer; /** * Time view options. * @type {object} */ this.options = util.extend({ viewName: name, renderStartDate: '', renderEndDate: '', hourStart: 0, hourEnd: 24, timezones: options.timezones, isReadOnly: options.isReadOnly, showTimezoneCollapseButton: false }, options.week); if (this.options.timezones.length < 1) { this.options.timezones = [{ timezoneOffset: Timezone.getOffset() }]; } /** * Interval id for hourmarker animation. * @type {number} */ this.intervalID = 0; /** * timer id for hourmarker initial state * @type {number} */ this.timerID = 0; /** * @type {boolean} */ this._scrolled = false; /** * cache parent's view model * @type {object} */ this._cacheParentViewModel = null; /** * cache hoursLabels view model to render again TimeGrid * @type {object} */ this._cacheHoursLabels = null; this.attachEvent(); } util.inherit(TimeGrid, View); /********** * Prototype props **********/ /** * @type {string} */ TimeGrid.prototype.viewName = 'timegrid'; /** * Destroy view. * @override */ TimeGrid.prototype._beforeDestroy = function() { clearInterval(this.intervalID); clearTimeout(this.timerID); if (this._autoScroll) { this._autoScroll.destroy(); } domevent.off(this.stickyContainer, 'click', this._onClickStickyContainer, this); this._autoScroll = this.hourmarkers = this.intervalID = this.timerID = this._cacheParentViewModel = this.stickyContainer = null; }; /** * @param {Date} [time] - date object to convert pixel in grids. * use **Date.now()** when not supplied. * @returns {number} The pixel value represent current time in grids. */ TimeGrid.prototype._getTopPercentByTime = function(time) { var opt = this.options, raw = datetime.raw(time || new TZDate()), hourLength = util.range(opt.hourStart, opt.hourEnd).length, maxMilliseconds = hourLength * datetime.MILLISECONDS_PER_HOUR, hmsMilliseconds = datetime.millisecondsFrom('hour', raw.h) + datetime.millisecondsFrom('minutes', raw.m) + datetime.millisecondsFrom('seconds', raw.s) + raw.ms, topPercent; topPercent = common.ratio(maxMilliseconds, 100, hmsMilliseconds); topPercent -= common.ratio(maxMilliseconds, 100, datetime.millisecondsFrom('hour', opt.hourStart)); return common.limit(topPercent, [0], [100]); }; /** * Get Hourmarker viewmodel. * @param {TZDate} now - now * @param {object} grids grid information(width, left, day) * @param {Array.<TZDate>} range render range * @returns {object} ViewModel of hourmarker. */ TimeGrid.prototype._getHourmarkerViewModel = function(now, grids, range) { var todaymarkerLeft = -1; var todaymarkerWidth = -1; var hourmarkerTimzones = []; var opt = this.options; var primaryOffset = Timezone.getOffset(); var timezones = opt.timezones; var viewModel; util.forEach(range, function(date, index) { if (datetime.isSameDate(now, date)) { todaymarkerLeft = grids[index] ? grids[index].left : 0; todaymarkerWidth = grids[index] ? grids[index].width : 0; } }); util.forEach(timezones, function(timezone) { var timezoneDifference = timezone.timezoneOffset + primaryOffset; var hourmarker = new TZDate(now); var dateDifference; hourmarker.setMinutes(hourmarker.getMinutes() + timezoneDifference); dateDifference = hourmarker.getDate() - now.getDate(); hourmarkerTimzones.push({ hourmarker: hourmarker, dateDifferenceSign: (dateDifference < 0) ? '-' : '+', dateDifference: Math.abs(dateDifference) }); }); viewModel = { currentHours: now.getHours(), hourmarkerTop: this._getTopPercentByTime(now), hourmarkerTimzones: hourmarkerTimzones, todaymarkerLeft: todaymarkerLeft, todaymarkerWidth: todaymarkerWidth, todaymarkerRight: todaymarkerLeft + todaymarkerWidth }; return viewModel; }; /** * Get timezone view model * @param {number} currentHours - current hour * @param {boolean} timezonesCollapsed - multiple timezones are collapsed. * @param {object} styles - styles * @returns {object} ViewModel */ TimeGrid.prototype._getTimezoneViewModel = function(currentHours, timezonesCollapsed, styles) { var opt = this.options; var primaryOffset = Timezone.getOffset(); var timezones = opt.timezones; var timezonesLength = timezones.length; var timezoneViewModel = []; var collapsed = timezonesCollapsed; var width = collapsed ? 100 : 100 / timezonesLength; var now = new TZDate().toLocalTime(); var backgroundColor = styles.displayTimezoneLabelBackgroundColor; util.forEach(timezones, function(timezone, index) { var hourmarker = new TZDate(now); var timezoneDifference; var timeSlots; var dateDifference; timezoneDifference = timezone.timezoneOffset + primaryOffset; timeSlots = getHoursLabels(opt, currentHours >= 0, timezoneDifference, styles); hourmarker.setMinutes(hourmarker.getMinutes() + timezoneDifference); dateDifference = hourmarker.getDate() - now.getDate(); if (index > 0) { backgroundColor = styles.additionalTimezoneBackgroundColor; } timezoneViewModel.push({ timeSlots: timeSlots, displayLabel: timezone.displayLabel, timezoneOffset: timezone.timezoneOffset, tooltip: timezone.tooltip || '', width: width, left: collapsed ? 0 : (timezones.length - index - 1) * width, isPrimary: index === 0, backgroundColor: backgroundColor || '', hidden: index !== 0 && collapsed, hourmarker: hourmarker, dateDifferenceSign: (dateDifference < 0) ? '-' : '+', dateDifference: Math.abs(dateDifference) }); }); return timezoneViewModel; }; /** * Get base viewModel. * @param {object} viewModel - view model * @returns {object} ViewModel */ TimeGrid.prototype._getBaseViewModel = function(viewModel) { var grids = viewModel.grids; var range = viewModel.range; var opt = this.options; var baseViewModel = this._getHourmarkerViewModel(new TZDate().toLocalTime(), grids, range); var timezonesCollapsed = util.pick(viewModel, 'state', 'timezonesCollapsed'); var styles = this._getStyles(viewModel.theme, timezonesCollapsed); return util.extend(baseViewModel, { timezones: this._getTimezoneViewModel(baseViewModel.todaymarkerLeft, timezonesCollapsed, styles), hoursLabels: getHoursLabels(opt, baseViewModel.todaymarkerLeft >= 0, 0, styles), styles: styles, showTimezoneCollapseButton: util.pick(opt, 'showTimezoneCollapseButton'), timezonesCollapsed: timezonesCollapsed }); }; /** * Reconcilation child views and render. * @param {object} viewModels Viewmodel * @param {object} grids grid information(width, left, day) * @param {HTMLElement} container Container element for each time view. * @param {Theme} theme - theme instance */ TimeGrid.prototype._renderChildren = function(viewModels, grids, container, theme) { var self = this, options = this.options, childOption, child, isToday, containerHeight, today = datetime.format(new TZDate(), 'YYYYMMDD'), i = 0; // clear contents container.innerHTML = ''; this.children.clear(); containerHeight = domutil.getSize(container.parentElement)[1]; // reconcilation of child views util.forEach(viewModels, function(schedules, ymd) { isToday = ymd === today; childOption = { index: i, left: grids[i] ? grids[i].left : 0, width: grids[i] ? grids[i].width : 0, ymd: ymd, isToday: isToday, isPending: options.isPending, isFocused: options.isFocused, isReadOnly: options.isReadOnly, hourStart: options.hourStart, hourEnd: options.hourEnd }; child = new Time( childOption, domutil.appendHTMLElement('div', container, config.classname('time-date')), theme ); child.render(ymd, schedules, containerHeight); self.addChild(child); i += 1; }); }; /** * @override * @param {object} viewModel ViewModel list from Week view. */ TimeGrid.prototype.render = function(viewModel) { var opt = this.options, timeViewModel = viewModel.schedulesInDateRange[opt.viewName], container = this.container, grids = viewModel.grids, baseViewModel = this._getBaseViewModel(viewModel), scheduleLen = util.keys(timeViewModel).length; this._cacheParentViewModel = viewModel; this._cacheHoursLabels = baseViewModel.hoursLabels; if (!scheduleLen) { return; } baseViewModel.showHourMarker = baseViewModel.todaymarkerLeft >= 0; container.innerHTML = mainTmpl(baseViewModel); /********** * Render sticky container for timezone display label **********/ this.renderStickyContainer(baseViewModel); /********** * Render children **********/ this._renderChildren( timeViewModel, grids, domutil.find(config.classname('.timegrid-schedules-container'), container), viewModel.theme ); this._hourLabels = domutil.find('ul', container); /********** * Render hourmarker **********/ this.hourmarkers = domutil.find(config.classname('.timegrid-hourmarker'), container, true); if (!this._scrolled) { this._scrolled = true; this.scrollToNow(); } }; TimeGrid.prototype.renderStickyContainer = function(baseViewModel) { var stickyContainer = this.stickyContainer; stickyContainer.innerHTML = timezoneStickyTmpl(baseViewModel); stickyContainer.style.display = baseViewModel.timezones.length > 1 ? 'block' : 'none'; stickyContainer.style.width = baseViewModel.styles.leftWidth; stickyContainer.style.height = baseViewModel.styles.displayTimezoneLabelHeight; stickyContainer.style.borderBottom = baseViewModel.styles.leftBorderRight; }; /** * Refresh hourmarker element. */ TimeGrid.prototype.refreshHourmarker = function() { var hourmarkers = this.hourmarkers; var viewModel = this._cacheParentViewModel; var hoursLabels = this._cacheHoursLabels; var baseViewModel; if (!hourmarkers || !viewModel) { return; } baseViewModel = this._getBaseViewModel(viewModel); reqAnimFrame.requestAnimFrame(function() { var needsRender = false; util.forEach(hoursLabels, function(hoursLabel, index) { if (hoursLabel.hidden !== baseViewModel.hoursLabels[index].hidden) { needsRender = true; return false; } return true; }); if (needsRender) { this.render(viewModel); } else { util.forEach(hourmarkers, function(hourmarker) { var todaymarker = domutil.find(config.classname('.timegrid-todaymarker'), hourmarker); var hourmarkerContainer = domutil.find(config.classname('.timegrid-hourmarker-time'), hourmarker); var timezone = domutil.closest(hourmarker, config.classname('.timegrid-timezone')); var timezoneIndex = timezone ? domutil.getData(timezone, 'timezoneIndex') : 0; hourmarker.style.top = baseViewModel.hourmarkerTop + '%'; if (todaymarker) { todaymarker.style.display = (baseViewModel.todaymarkerLeft >= 0) ? 'block' : 'none'; } if (hourmarkerContainer) { hourmarkerContainer.innerHTML = timegridCurrentTimeTmpl( baseViewModel.hourmarkerTimzones[timezoneIndex] ); } }); } }, this); }; /** * Attach events */ TimeGrid.prototype.attachEvent = function() { clearInterval(this.intervalID); clearTimeout(this.timerID); this.intervalID = this.timerID = null; this.timerID = setTimeout(util.bind(this.onTick, this), (SIXTY_SECONDS - new TZDate().getSeconds()) * 1000); domevent.on(this.stickyContainer, 'click', this._onClickStickyContainer, this); }; /** * Scroll time grid to current hourmarker. */ TimeGrid.prototype.scrollToNow = function() { var container = this.container; var offsetTop, viewBound, scrollTop, scrollAmount, scrollBy, scrollFn; if (!this.hourmarkers || !this.hourmarkers.length) { return; } offsetTop = this.hourmarkers[0].offsetTop; viewBound = this.getViewBound(); scrollTop = offsetTop; scrollAmount = viewBound.height / 4; scrollBy = 10; scrollFn = function() { if (scrollTop > offsetTop - scrollAmount) { scrollTop -= scrollBy; container.scrollTop = scrollTop; reqAnimFrame.requestAnimFrame(scrollFn); } else { container.scrollTop = offsetTop - scrollAmount; } }; reqAnimFrame.requestAnimFrame(scrollFn); }; /********** * Schedule handlers **********/ /** * Interval tick handler */ TimeGrid.prototype.onTick = function() { if (this.timerID) { clearTimeout(this.timerID); this.timerID = null; } if (!this.intervalID) { this.intervalID = setInterval(util.bind(this.onTick, this), HOURMARKER_REFRESH_INTERVAL); } this.refreshHourmarker(); }; /** * Get the styles from theme * @param {Theme} theme - theme instance * @param {boolean} timezonesCollapsed - multiple timezones are collapsed. * @returns {object} styles - styles object */ TimeGrid.prototype._getStyles = function(theme, timezonesCollapsed) { var styles = {}; var timezonesLength = this.options.timezones.length; var collapsed = timezonesCollapsed; var numberAndUnit; if (theme) { styles.borderBottom = theme.week.timegridHorizontalLine.borderBottom || theme.common.border; styles.halfHourBorderBottom = theme.week.timegridHalfHour.borderBottom || theme.common.border; styles.todayBackgroundColor = theme.week.today.backgroundColor; styles.weekendBackgroundColor = theme.week.weekend.backgroundColor; styles.backgroundColor = theme.week.daygrid.backgroundColor; styles.leftWidth = theme.week.timegridLeft.width; styles.leftBackgroundColor = theme.week.timegridLeft.backgroundColor; styles.leftBorderRight = theme.week.timegridLeft.borderRight || theme.common.border; styles.leftFontSize = theme.week.timegridLeft.fontSize; styles.timezoneWidth = theme.week.timegridLeft.width; styles.additionalTimezoneBackgroundColor = theme.week.timegridLeftAdditionalTimezone.backgroundColor || styles.leftBackgroundColor; styles.displayTimezoneLabelHeight = theme.week.timegridLeftTimezoneLabel.height; styles.displayTimezoneLabelBackgroundColor = theme.week.timegridLeft.backgroundColor === 'inherit' ? 'white' : theme.week.timegridLeft.backgroundColor; styles.oneHourHeight = theme.week.timegridOneHour.height; styles.halfHourHeight = theme.week.timegridHalfHour.height; styles.quaterHourHeight = (parseInt(styles.halfHourHeight, 10) / 2) + 'px'; styles.currentTimeColor = theme.week.currentTime.color; styles.currentTimeFontSize = theme.week.currentTime.fontSize; styles.currentTimeFontWeight = theme.week.currentTime.fontWeight; styles.pastTimeColor = theme.week.pastTime.color; styles.pastTimeFontWeight = theme.week.pastTime.fontWeight; styles.futureTimeColor = theme.week.futureTime.color; styles.futureTimeFontWeight = theme.week.futureTime.fontWeight; styles.currentTimeLeftBorderTop = theme.week.currentTimeLinePast.border; styles.currentTimeBulletBackgroundColor = theme.week.currentTimeLineBullet.backgroundColor; styles.currentTimeTodayBorderTop = theme.week.currentTimeLineToday.border; styles.currentTimeRightBorderTop = theme.week.currentTimeLineFuture.border; if (!collapsed && timezonesLength > 1) { numberAndUnit = common.parseUnit(styles.leftWidth); styles.leftWidth = (numberAndUnit[0] * timezonesLength) + numberAndUnit[1]; } } return styles; }; /** * @param {MouseEvent} event - mouse event object */ TimeGrid.prototype._onClickStickyContainer = function(event) { var target = event.target || event.srcElement; var closeBtn = domutil.closest(target, config.classname('.timegrid-timezone-close-btn')); if (!closeBtn) { return; } this.fire('clickTimezonesCollapsedBtn'); }; module.exports = TimeGrid; /***/ }), /***/ "./src/js/view/week/week.js": /*!**********************************!*\ !*** ./src/js/view/week/week.js ***! \**********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview View of days UI. * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../../config */ "./src/js/config.js"); var domutil = __webpack_require__(/*! ../../common/domutil */ "./src/js/common/domutil.js"); var datetime = __webpack_require__(/*! ../../common/datetime */ "./src/js/common/datetime.js"); var TZDate = __webpack_require__(/*! ../../common/timezone */ "./src/js/common/timezone.js").Date; var View = __webpack_require__(/*! ../view */ "./src/js/view/view.js"); /** * @constructor * @param {Base.Week} controller The controller mixin part. * @param {object} options View options * @param {string} [options.renderStartDate] Start date of render. * if not supplied then use -3d from today. YYYY-MM-DD format. * @param {string} [options.renderEndDate] End date of render. * if not supplied then use +3d from today. YYYY-MM-DD format. * @param {string} [options.cssPrefix] - CSS classname prefix * @param {HTMLElement} container The element to use container for this view. * @param {object} panels - schedule panels like 'milestone', 'task', 'allday', 'time' * @extends {View} */ function Week(controller, options, container, panels) { var range; container = domutil.appendHTMLElement('div', container); View.call(this, container); domutil.addClass(container, config.classname('week-container')); range = this._getRenderDateRange(new TZDate()); /** * @type {object} Options for view. */ this.options = util.extend({ scheduleFilter: [function(schedule) { return Boolean(schedule.isVisible); }], renderStartDate: datetime.format(range.start, 'YYYY-MM-DD'), renderEndDate: datetime.format(range.end, 'YYYY-MM-DD'), narrowWeekend: false, startDayOfWeek: 0, workweek: false, showTimezoneCollapseButton: false, timezonesCollapsed: false, hourStart: 0, hourEnd: 24 }, options); /** * Week controller mixin. * @type {Base.Week} */ this.controller = controller; /** * Schedule Panels * @type {Array.<object>} */ this.panels = panels; /** * Week view states * @type {object} */ this.state = { timezonesCollapsed: this.options.timezonesCollapsed }; } util.inherit(Week, View); /********** * Override props **********/ /** * Render each child view with schedules in ranges. * @fires Week#afterRender * @override */ Week.prototype.render = function() { var self = this, options = this.options, scheduleFilter = options.scheduleFilter, narrowWeekend = options.narrowWeekend, startDayOfWeek = options.startDayOfWeek, workweek = options.workweek, theme = this.controller.theme || {}, state = this.state; var renderStartDate, renderEndDate, schedulesInDateRange, viewModel, grids, range; renderStartDate = new TZDate(options.renderStartDate); renderEndDate = new TZDate(options.renderEndDate); range = datetime.range( datetime.start(renderStartDate), datetime.end(renderEndDate), datetime.MILLISECONDS_PER_DAY ); if (options.workweek && datetime.compare(renderStartDate, renderEndDate)) { range = util.filter(range, function(date) { return !datetime.isWeekend(date.getDay()); }); renderStartDate = range[0]; renderEndDate = range[range.length - 1]; } schedulesInDateRange = this.controller.findByDateRange( datetime.start(renderStartDate), datetime.end(renderEndDate), this.panels, scheduleFilter, this.options ); grids = datetime.getGridLeftAndWidth( range.length, narrowWeekend, startDayOfWeek, workweek ); viewModel = { schedulesInDateRange: schedulesInDateRange, renderStartDate: renderStartDate, renderEndDate: renderEndDate, grids: grids, range: range, theme: theme, state: state }; this.children.each(function(childView) { var matrices; var viewName = util.pick(childView.options, 'viewName'); childView.render(viewModel); if (viewName) { matrices = viewModel.schedulesInDateRange[viewName]; // DayGrid limits schedule count by visibleScheduleCount after rendering it. if (util.isArray(matrices)) { self._invokeAfterRenderSchedule(matrices); } else { util.forEach(matrices, function(matricesOfDay) { self._invokeAfterRenderSchedule(matricesOfDay); }); } } }); /** * @event Week#afterRender */ this.fire('afterRender'); }; /** * Fire 'afterRenderSchedule' event * @param {Array} matrices - schedule matrices from view model * @fires Week#afterRenderSchedule */ Week.prototype._invokeAfterRenderSchedule = function(matrices) { var self = this; util.forEachArray(matrices, function(matrix) { util.forEachArray(matrix, function(column) { util.forEachArray(column, function(scheduleViewModel) { if (scheduleViewModel) { /** * @event Week#afterRenderSchedule */ self.fire('afterRenderSchedule', {schedule: scheduleViewModel.model}); } }); }); }); }; /********** * Prototype props **********/ Week.prototype.viewName = 'week'; /** * Calculate default render date range from supplied date. * @param {Date} baseDate base date. * @returns {object} date range. */ Week.prototype._getRenderDateRange = function(baseDate) { var base = datetime.start(baseDate), start = new TZDate(Number(base)), end = new TZDate(Number(base)); start.setDate(start.getDate() - 3); end.setDate(end.getDate() + 3); return { start: start, end: end }; }; util.CustomEvents.mixin(Week); module.exports = Week; /***/ }), /***/ "./src/js/view/weekday.js": /*!********************************!*\ !*** ./src/js/view/weekday.js ***! \********************************/ /*! no static exports found */ /***/ (function(module, exports, __webpack_require__) { "use strict"; /** * @fileoverview Weekday view * @author NHN FE Development Lab <dl_javascript@nhn.com> */ var util = __webpack_require__(/*! tui-code-snippet */ "tui-code-snippet"); var config = __webpack_require__(/*! ../config */ "./src/js/config.js"), domutil = __webpack_require__(/*! ../common/domutil */ "./src/js/common/domutil.js"), datetime = __webpack_require__(/*! ../common/datetime */ "./src/js/common/datetime.js"), TZDate = __webpack_require__(/*! ../common/timezone */ "./src/js/common/timezone.js").Date, View = __webpack_require__(/*! ./view */ "./src/js/view/view.js"); /** * @constructor * @extends {View} * @param {object} options - view options. * @param {number} [options.containerButtonGutter=8] - free space at bottom to * make create easy. * @param {number} [options.scheduleHeight=18] - height of each schedule block. * @param {number} [options.scheduleGutter=2] - gutter height of each schedule block. * @param {HTMLDIVElement} container - DOM element to use container for this * view. */ function Weekday(options, container) { container = domutil.appendHTMLElement( 'div', container, config.classname('weekday') ); /** * @type {object} */ this.options = util.extend({ containerBottomGutter: 8, scheduleHeight: 18, scheduleGutter: 2, narrowWeekend: false, startDayOfWeek: 0, workweek: false }, options); /* * cache parent's view model * @type {object} */ this._cacheParentViewModel = null; View.call(this, container); } util.inherit(Weekday, View); /** * Get render date range * @returns {Date[]} rendered date range */ Weekday.prototype.getRenderDateRange = function() { return this._cacheParentViewModel.range; }; /** * Get render date grids information * @returns {Date[]} rendered date grids information */ Weekday.prototype.getRenderDateGrids = function() { return this._cacheParentViewModel.grids; }; /** * Get default view model. * @param {object} viewModel parent's view model * @returns {object} viewModel to rendering. */ Weekday.prototype.getBaseViewModel = function(viewModel) { var opt = this.options; var range = viewModel.range; var today = datetime.format(new TZDate(), 'YYYYMMDD'); var gridWidth = (100 / range.length); var grids = viewModel.grids; var exceedDate = viewModel.exceedDate || {}; var theme = viewModel.theme; this._cacheParentViewModel = viewModel; return { width: gridWidth, scheduleHeight: opt.scheduleHeight, scheduleBlockHeight: (opt.scheduleHeight + opt.scheduleGutter), scheduleBlockGutter: opt.scheduleGutter, dates: util.map(range, function(date, index) { var day = date.getDay(); var ymd = datetime.format(date, 'YYYYMMDD'); var isToday = ymd === today; return { date: datetime.format(date, 'YYYY-MM-DD'), month: date.getMonth() + 1, day: day, isToday: isToday, ymd: ymd, hiddenSchedules: exceedDate[ymd] || 0, width: grids[index] ? grids[index].width : 0, left: grids[index] ? grids[index].left : 0, color: this._getDayNameColor(theme, day, isToday), backgroundColor: this._getDayBackgroundColor(theme, day) }; }, this) }; }; /* eslint max-nested-callbacks: 0 */ /** * Make exceed date information * @param {number} maxCount - exceed schedule count * @param {Array} eventsInDateRange - matrix of ScheduleViewModel * @param {Array.<TZDate>} range - date range of one week * @returns {object} exceedDate */ Weekday.prototype.getExceedDate = function(maxCount, eventsInDateRange, range) { var exceedDate = this._initExceedDate(range); util.forEach(eventsInDateRange, function(matrix) { util.forEach(matrix, function(column) { util.forEach(column, function(viewModel) { var period; if (!viewModel || viewModel.top < maxCount) { return; } // check that this schedule block is not visible after rendered. viewModel.hidden = true; period = datetime.range( viewModel.getStarts(), viewModel.getEnds(), datetime.MILLISECONDS_PER_DAY ); util.forEach(period, function(date) { var ymd = datetime.format(date, 'YYYYMMDD'); exceedDate[ymd] += 1; }); }); }); }); return exceedDate; }; /** * Initiate exceed date information * @param {Array.<TZDate>} range - date range of one week * @returns {Object} - initiated exceed date */ Weekday.prototype._initExceedDate = function(range) { var exceedDate = {}; util.forEach(range, function(date) { var ymd = datetime.format(date, 'YYYYMMDD'); exceedDate[ymd] = 0; }); return exceedDate; }; /** * Get a day name color * @param {Theme} theme - theme instance * @param {number} day - day number * @param {boolean} isToday - today flag * @param {boolean} isOtherMonth - not this month flag * @returns {string} style - color style */ Weekday.prototype._getDayNameColor = function(theme, day, isToday, isOtherMonth) { var color = ''; if (theme) { if (day === 0) { color = isOtherMonth ? theme.month.holidayExceptThisMonth.color : theme.common.holiday.color; } else if (day === 6) { color = isOtherMonth ? theme.month.dayExceptThisMonth.color : theme.common.saturday.color; } else if (isToday) { color = theme.common.today.color; } else { color = isOtherMonth ? theme.month.dayExceptThisMonth.color : theme.common.dayname.color; } } return color; }; /** * Get a day background color * @param {Theme} theme - theme instance * @param {number} day - day number * @returns {string} style - color style */ Weekday.prototype._getDayBackgroundColor = function(theme, day) { var color = ''; if (theme) { if (day === 0 || day === 6) { color = theme.month.weekend.backgroundColor; } else { color = 'inherit'; } } return color; }; module.exports = Weekday; /***/ }), /***/ "tui-code-snippet": /*!******************************************************************************************************************************!*\ !*** external {"commonjs":"tui-code-snippet","commonjs2":"tui-code-snippet","amd":"tui-code-snippet","root":["tui","util"]} ***! \******************************************************************************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = __WEBPACK_EXTERNAL_MODULE_tui_code_snippet__; /***/ }), /***/ "tui-date-picker": /*!*********************************************************************************************************************************!*\ !*** external {"commonjs":"tui-date-picker","commonjs2":"tui-date-picker","amd":"tui-date-picker","root":["tui","DatePicker"]} ***! \*********************************************************************************************************************************/ /*! no static exports found */ /***/ (function(module, exports) { module.exports = __WEBPACK_EXTERNAL_MODULE_tui_date_picker__; /***/ }) /******/ }); }); //# sourceMappingURL=tui-calendar.js.map