/*! * DevExtreme (dx.viz-web.debug.js) * Version: 17.1.5 * Build date: Tue Aug 01 2017 * * Copyright (c) 2012 - 2017 Developer Express Inc. ALL RIGHTS RESERVED * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/ */ "use strict"; ! function(modules) { var installedModules = {}; function __webpack_require__(moduleId) { if (installedModules[moduleId]) { return installedModules[moduleId].exports } var module = installedModules[moduleId] = { exports: {}, id: moduleId, loaded: false }; modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); module.loaded = true; return module.exports } __webpack_require__.m = modules; __webpack_require__.c = installedModules; __webpack_require__.p = ""; return __webpack_require__(0) }([ /*!******************************!*\ !*** multi dx.viz-web.debug ***! \******************************/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__( /*! c:\Projects\DevExtreme\17.1\BuildLabel\Temp\DevExtreme.v17.1\repo\GitHub\js\bundles\dx.viz-web.js */ 658) }, , , , /*!**************************************************!*\ !*** ./js/bundles/modules/parts/widgets-base.js ***! \**************************************************/ function(module, exports, __webpack_require__) { var DevExpress = __webpack_require__( /*! ./core */ 5); __webpack_require__( /*! ./data */ 185); var ui = DevExpress.ui = __webpack_require__( /*! ../../../bundles/modules/ui */ 197); ui.themes = __webpack_require__( /*! ../../../ui/themes */ 143); ui.setTemplateEngine = __webpack_require__( /*! ../../../ui/set_template_engine */ 198); ui.dialog = __webpack_require__( /*! ../../../ui/dialog */ 199); ui.notify = __webpack_require__( /*! ../../../ui/notify */ 204); ui.dxActionSheet = __webpack_require__( /*! ../../../ui/action_sheet */ 206); ui.dxAutocomplete = __webpack_require__( /*! ../../../ui/autocomplete */ 208); ui.dxBox = __webpack_require__( /*! ../../../ui/box */ 252); ui.dxButton = __webpack_require__( /*! ../../../ui/button */ 201); ui.dxCalendar = __webpack_require__( /*! ../../../ui/calendar */ 253); ui.dxCheckBox = __webpack_require__( /*! ../../../ui/check_box */ 248); ui.dxColorBox = __webpack_require__( /*! ../../../ui/color_box */ 260); ui.dxDateBox = __webpack_require__( /*! ../../../ui/date_box */ 267); ui.dxDeferRendering = __webpack_require__( /*! ../../../ui/defer_rendering */ 279); ui.dxDropDownBox = __webpack_require__( /*! ../../../ui/drop_down_box */ 280); ui.dxDropDownMenu = __webpack_require__( /*! ../../../ui/drop_down_menu */ 281); ui.dxFileUploader = __webpack_require__( /*! ../../../ui/file_uploader */ 282); ui.dxForm = __webpack_require__( /*! ../../../ui/form */ 285); ui.dxGallery = __webpack_require__( /*! ../../../ui/gallery */ 297); ui.dxList = __webpack_require__( /*! ../../../ui/list */ 218); ui.dxLoadIndicator = __webpack_require__( /*! ../../../ui/load_indicator */ 238); ui.dxLoadPanel = __webpack_require__( /*! ../../../ui/load_panel */ 246); ui.dxLookup = __webpack_require__( /*! ../../../ui/lookup */ 298); ui.dxMap = __webpack_require__( /*! ../../../ui/map */ 299); ui.dxMultiView = __webpack_require__( /*! ../../../ui/multi_view */ 292); ui.dxNavBar = __webpack_require__( /*! ../../../ui/nav_bar */ 306); ui.dxNumberBox = __webpack_require__( /*! ../../../ui/number_box */ 263); ui.dxOverlay = __webpack_require__( /*! ../../../ui/overlay */ 109); ui.dxPopover = __webpack_require__( /*! ../../../ui/popover */ 207); ui.dxPopup = __webpack_require__( /*! ../../../ui/popup */ 200); ui.dxProgressBar = __webpack_require__( /*! ../../../ui/progress_bar */ 283); ui.dxRadioGroup = __webpack_require__( /*! ../../../ui/radio_group */ 308); ui.dxRangeSlider = __webpack_require__( /*! ../../../ui/range_slider */ 310); ui.dxResizable = __webpack_require__( /*! ../../../ui/resizable */ 111); ui.dxResponsiveBox = __webpack_require__( /*! ../../../ui/responsive_box */ 290); ui.dxScrollView = __webpack_require__( /*! ../../../ui/scroll_view */ 233); ui.dxSelectBox = __webpack_require__( /*! ../../../ui/select_box */ 317); ui.dxSlider = __webpack_require__( /*! ../../../ui/slider */ 311); ui.dxSwitch = __webpack_require__( /*! ../../../ui/switch */ 318); ui.dxTabPanel = __webpack_require__( /*! ../../../ui/tab_panel */ 291); ui.dxTabs = __webpack_require__( /*! ../../../ui/tabs */ 293); ui.dxTagBox = __webpack_require__( /*! ../../../ui/tag_box */ 319); ui.dxTextArea = __webpack_require__( /*! ../../../ui/text_area */ 320); ui.dxTextBox = __webpack_require__( /*! ../../../ui/text_box */ 211); ui.dxTileView = __webpack_require__( /*! ../../../ui/tile_view */ 321); ui.dxToast = __webpack_require__( /*! ../../../ui/toast */ 205); ui.dxToolbar = __webpack_require__( /*! ../../../ui/toolbar */ 322); ui.dxTooltip = __webpack_require__( /*! ../../../ui/tooltip */ 314); ui.dxTrackBar = __webpack_require__( /*! ../../../ui/track_bar */ 284); DevExpress.validationEngine = __webpack_require__( /*! ../../../ui/validation_engine */ 117); ui.dxValidationSummary = __webpack_require__( /*! ../../../ui/validation_summary */ 295); ui.dxValidationGroup = __webpack_require__( /*! ../../../ui/validation_group */ 296); ui.dxValidator = __webpack_require__( /*! ../../../ui/validator */ 288); ui.CollectionWidget = __webpack_require__( /*! ../../../ui/collection/ui.collection_widget.edit */ 149); ui.dxDropDownEditor = __webpack_require__( /*! ../../../ui/drop_down_editor/ui.drop_down_editor */ 210); module.exports = ui }, /*!******************************************!*\ !*** ./js/bundles/modules/parts/core.js ***! \******************************************/ function(module, exports, __webpack_require__) { var DevExpress = __webpack_require__( /*! ../../../bundles/modules/core */ 6); DevExpress.framework = __webpack_require__( /*! ../../../bundles/modules/framework */ 91); __webpack_require__( /*! ../../../integration/angular */ 144); __webpack_require__( /*! ../../../integration/knockout */ 92); __webpack_require__( /*! ../../../localization/globalize/core */ 176); __webpack_require__( /*! ../../../localization/globalize/message */ 178); __webpack_require__( /*! ../../../localization/globalize/number */ 179); __webpack_require__( /*! ../../../localization/globalize/date */ 180); __webpack_require__( /*! ../../../localization/globalize/currency */ 181); __webpack_require__( /*! ../../../events/click */ 75); __webpack_require__( /*! ../../../events/contextmenu */ 165); __webpack_require__( /*! ../../../events/double_click */ 182); __webpack_require__( /*! ../../../events/drag */ 110); __webpack_require__( /*! ../../../events/hold */ 164); __webpack_require__( /*! ../../../events/hover */ 103); __webpack_require__( /*! ../../../events/pointer */ 76); __webpack_require__( /*! ../../../events/swipe */ 183); __webpack_require__( /*! ../../../events/transform */ 184); module.exports = DevExpress }, /*!************************************!*\ !*** ./js/bundles/modules/core.js ***! \************************************/ function(module, exports, __webpack_require__) { var DevExpress = window.DevExpress = window.DevExpress || {}; var errors = DevExpress.errors = __webpack_require__( /*! ../../core/errors */ 7); if (DevExpress._DEVEXTREME_BUNDLE_INITIALIZED) { throw errors.Error("E0024") } DevExpress._DEVEXTREME_BUNDLE_INITIALIZED = true; DevExpress.clientExporter = __webpack_require__( /*! ../../client_exporter */ 20); DevExpress.VERSION = __webpack_require__( /*! ../../core/version */ 19); DevExpress.Class = __webpack_require__( /*! ../../core/class */ 25); DevExpress.DOMComponent = __webpack_require__( /*! ../../core/dom_component */ 43); DevExpress.Component = __webpack_require__( /*! ../../core/component */ 48); DevExpress.registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57); DevExpress.devices = __webpack_require__( /*! ../../core/devices */ 53); DevExpress.Color = __webpack_require__( /*! ../../color */ 38); var $ = __webpack_require__( /*! ../../core/renderer */ 9); var compareVersions = __webpack_require__( /*! ../../core/utils/version */ 17).compare; if (compareVersions($.fn.jquery, [1, 10]) < 0) { throw errors.Error("E0012") } var animationFrame = __webpack_require__( /*! ../../animation/frame */ 59); DevExpress.requestAnimationFrame = function() { errors.log("W0000", "DevExpress.requestAnimationFrame", "15.2", "Use the 'DevExpress.utils.requestAnimationFrame' method instead."); return animationFrame.requestAnimationFrame.apply(animationFrame, arguments) }; DevExpress.cancelAnimationFrame = function() { errors.log("W0000", "DevExpress.cancelAnimationFrame", "15.2", "Use the 'DevExpress.utils.cancelAnimationFrame' method instead."); return animationFrame.cancelAnimationFrame.apply(animationFrame, arguments) }; DevExpress.EventsMixin = __webpack_require__( /*! ../../core/events_mixin */ 51); DevExpress.utils = {}; DevExpress.utils.requestAnimationFrame = animationFrame.requestAnimationFrame; DevExpress.utils.cancelAnimationFrame = animationFrame.cancelAnimationFrame; DevExpress.utils.initMobileViewport = __webpack_require__( /*! ../../mobile/init_mobile_viewport/init_mobile_viewport */ 60).initMobileViewport; DevExpress.utils.extendFromObject = __webpack_require__( /*! ../../core/utils/extend */ 11).extendFromObject; DevExpress.utils.createComponents = __webpack_require__( /*! ../../core/utils/dom */ 56).createComponents; DevExpress.utils.triggerShownEvent = __webpack_require__( /*! ../../core/utils/dom */ 56).triggerShownEvent; DevExpress.utils.triggerHidingEvent = __webpack_require__( /*! ../../core/utils/dom */ 56).triggerHidingEvent; DevExpress.utils.resetActiveElement = __webpack_require__( /*! ../../core/utils/dom */ 56).resetActiveElement; DevExpress.utils.findBestMatches = __webpack_require__( /*! ../../core/utils/common */ 14).findBestMatches; DevExpress.createQueue = __webpack_require__( /*! ../../core/utils/queue */ 62).create; DevExpress.utils.dom = __webpack_require__( /*! ../../core/utils/dom */ 56); DevExpress.utils.common = __webpack_require__( /*! ../../core/utils/common */ 14); DevExpress.utils.date = __webpack_require__( /*! ../../core/utils/date */ 63); DevExpress.utils.browser = __webpack_require__( /*! ../../core/utils/browser */ 23); DevExpress.utils.inflector = __webpack_require__( /*! ../../core/utils/inflector */ 39); DevExpress.utils.resizeCallbacks = __webpack_require__( /*! ../../core/utils/window */ 44).resizeCallbacks; DevExpress.utils.console = __webpack_require__( /*! ../../core/utils/console */ 13); DevExpress.utils.string = __webpack_require__( /*! ../../core/utils/string */ 18); DevExpress.utils.support = __webpack_require__( /*! ../../core/utils/support */ 61); DevExpress.processHardwareBackButton = __webpack_require__( /*! ../../mobile/process_hardware_back_button */ 64); DevExpress.viewPort = __webpack_require__( /*! ../../core/utils/view_port */ 55).value; DevExpress.hideTopOverlay = __webpack_require__( /*! ../../mobile/hide_top_overlay */ 65); DevExpress.formatHelper = __webpack_require__( /*! ../../format_helper */ 66); var config = DevExpress.config = __webpack_require__( /*! ../../core/config */ 15); Object.defineProperty(DevExpress, "rtlEnabled", { get: function() { errors.log("W0003", "DevExpress", "rtlEnabled", "16.1", "Use the 'DevExpress.config' method instead"); return config().rtlEnabled }, set: function(value) { errors.log("W0003", "DevExpress", "rtlEnabled", "16.1", "Use the 'DevExpress.config' method instead"); config({ rtlEnabled: value }) } }); Object.defineProperty(DevExpress, "designMode", { get: function() { return config().designMode }, set: function(value) { config({ designMode: value }) } }); DevExpress.animationPresets = __webpack_require__( /*! ../../animation/presets/presets */ 67).presets; DevExpress.fx = __webpack_require__( /*! ../../animation/fx */ 68); DevExpress.TransitionExecutor = __webpack_require__( /*! ../../animation/transition_executor/transition_executor */ 74).TransitionExecutor; DevExpress.AnimationPresetCollection = __webpack_require__( /*! ../../animation/presets/presets */ 67).PresetCollection; module.exports = DevExpress.events = {}; DevExpress.events.click = __webpack_require__( /*! ../../events/click */ 75); DevExpress.events.utils = __webpack_require__( /*! ../../events/utils */ 71); DevExpress.events.GestureEmitter = __webpack_require__( /*! ../../events/gesture/emitter.gesture */ 86); DevExpress.localization = __webpack_require__( /*! ../../localization */ 88); module.exports = DevExpress }, /*!***************************!*\ !*** ./js/core/errors.js ***! \***************************/ function(module, exports, __webpack_require__) { var errorUtils = __webpack_require__( /*! ./utils/error */ 8); module.exports = errorUtils({ E0001: "Method is not implemented", E0002: "Member name collision: {0}", E0003: "A class must be instantiated using the 'new' keyword", E0004: "The NAME property of the component is not specified", E0005: "Unknown device", E0006: "Unknown endpoint key is requested", E0007: "'Invalidate' method is called outside the update transaction", E0008: "Type of the option name is not appropriate to create an action", E0009: "Component '{0}' has not been initialized for an element", E0010: "Animation configuration with the '{0}' type requires '{1}' configuration as {2}", E0011: "Unknown animation type '{0}'", E0012: "jQuery version is too old. Please upgrade jQuery to 1.10.0 or later", E0013: "KnockoutJS version is too old. Please upgrade KnockoutJS to 2.3.0 or later", E0014: "The 'release' method shouldn't be called for an unlocked Lock object", E0015: "Queued task returned an unexpected result", E0017: "Event namespace is not defined", E0018: "DevExpress.ui.DevExpressPopup widget is required", E0020: "Template engine '{0}' is not supported", E0021: "Unknown theme is set: {0}", E0022: "LINK[rel=DevExpress-theme] tags must go before DevExpress included scripts", E0023: "Template name is not specified", E0024: "DevExtreme bundle already included", E0100: "Unknown validation type is detected", E0101: "Misconfigured range validation rule is detected", E0102: "Misconfigured comparison validation rule is detected", E0110: "Unknown validation group is detected", E0120: "Adapter for a DevExpressValidator component cannot be configured", E0121: "The onCustomItemCreating action should return an item or Promise of jQuery Deferred object resolved when an item is created", E4016: "The compileSetter(expr) method is called with 'self' passed as a parameter", W0000: "'{0}' is deprecated in {1}. {2}", W0001: "{0} - '{1}' option is deprecated in {2}. {3}", W0002: "{0} - '{1}' method is deprecated in {2}. {3}", W0003: "{0} - '{1}' property is deprecated in {2}. {3}", W0004: "Timeout for theme loading is over: {0}", W0005: "'{0}' event is deprecated in {1}. {2}", W0006: "Invalid recurrence rule: '{0}'", W0007: "'{0}' Globalize culture is not defined", W0008: "Invalid view name: '{0}'", W0009: "Invalid time zone name: '{0}'", W0010: "{0} is deprecated in {1}. {2}", W0011: "Number parsing is invoked while the parser is not defined", W0012: "Date parsing is invoked while the parser is not defined", W0013: "'{0}' file is deprecated in {1}. {2}" }) }, /*!********************************!*\ !*** ./js/core/utils/error.js ***! \********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), extend = __webpack_require__( /*! ./extend */ 11).extend, consoleUtils = __webpack_require__( /*! ./console */ 13), stringUtils = __webpack_require__( /*! ./string */ 18), version = __webpack_require__( /*! ../version */ 19); var ERROR_URL = "http://js.devexpress.com/error/" + version.split(".").slice(0, 2).join("_") + "/"; module.exports = function(baseErrors, errors) { var exports = { ERROR_MESSAGES: extend(errors, baseErrors), Error: function() { return makeError($.makeArray(arguments)) }, log: function(id) { var method = "log"; if (/^E\d+$/.test(id)) { method = "error" } else { if (/^W\d+$/.test(id)) { method = "warn" } } consoleUtils.logger[method]("log" === method ? id : combineMessage($.makeArray(arguments))) } }; var combineMessage = function(args) { var id = args[0]; args = args.slice(1); return formatMessage(id, formatDetails(id, args)) }; var formatDetails = function(id, args) { args = [exports.ERROR_MESSAGES[id]].concat(args); return stringUtils.format.apply(this, args).replace(/\.*\s*?$/, "") }; var formatMessage = function(id, details) { return stringUtils.format.apply(this, ["{0} - {1}. See:\n{2}", id, details, ERROR_URL + id]) }; var makeError = function(args) { var id, details, message; id = args[0]; args = args.slice(1); details = formatDetails(id, args); message = formatMessage(id, details); return extend(new Error(message), { __id: id, __details: details }) }; return exports } }, /*!*****************************!*\ !*** ./js/core/renderer.js ***! \*****************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! jquery */ 10); module.exports = $ }, /*!*************************!*\ !*** external "jQuery" ***! \*************************/ function(module, exports) { module.exports = jQuery }, /*!*********************************!*\ !*** ./js/core/utils/extend.js ***! \*********************************/ function(module, exports, __webpack_require__) { var isPlainObject = __webpack_require__( /*! ./type */ 12).isPlainObject; var extendFromObject = function(target, source, overrideExistingValues) { target = target || {}; for (var prop in source) { if (source.hasOwnProperty(prop)) { var value = source[prop]; if (!(prop in target) || overrideExistingValues) { target[prop] = value } } } return target }; var extend = function(target) { target = target || {}; var i = 1, deep = false; if ("boolean" === typeof target) { deep = target; target = arguments[1] || {}; i++ } for (; i < arguments.length; i++) { var source = arguments[i]; if (null == source) { continue } for (var key in source) { var clone, targetValue = target[key], sourceValue = source[key], sourceValueIsArray = false; if (target === sourceValue) { continue } if (deep && sourceValue && (isPlainObject(sourceValue) || (sourceValueIsArray = Array.isArray(sourceValue)))) { if (sourceValueIsArray) { clone = targetValue && Array.isArray(targetValue) ? targetValue : [] } else { clone = targetValue && isPlainObject(targetValue) ? targetValue : {} } target[key] = extend(deep, clone, sourceValue) } else { if (void 0 !== sourceValue) { target[key] = sourceValue } } } } return target }; exports.extend = extend; exports.extendFromObject = extendFromObject }, /*!*******************************!*\ !*** ./js/core/utils/type.js ***! \*******************************/ function(module, exports) { var isEmptyObject = function(object) { var property; for (property in object) { return false } return true }; var isPlainObject = function(object) { if (!object || "[object Object]" !== Object.prototype.toString.call(object)) { return false } var proto = Object.getPrototypeOf(object), ctor = Object.hasOwnProperty.call(proto, "constructor") && proto.constructor; return "function" === typeof ctor && Object.toString.call(ctor) === Object.toString.call(Object) }; exports.isEmptyObject = isEmptyObject; exports.isPlainObject = isPlainObject }, /*!**********************************!*\ !*** ./js/core/utils/console.js ***! \**********************************/ function(module, exports, __webpack_require__) { var isFunction = __webpack_require__( /*! ./common */ 14).isFunction; var logger = function() { var console = window.console; function info(text) { if (!console || !isFunction(console.info)) { return } console.info(text) } function warn(text) { if (!console || !isFunction(console.warn)) { return } console.warn(text) } function error(text) { if (!console || !isFunction(console.error)) { return } console.error(text) } return { info: info, warn: warn, error: error } }(); var debug = function() { function assert(condition, message) { if (!condition) { throw new Error(message) } } function assertParam(parameter, message) { assert(null !== parameter && void 0 !== parameter, message) } return { assert: assert, assertParam: assertParam } }(); exports.logger = logger; exports.debug = debug }, /*!*********************************!*\ !*** ./js/core/utils/common.js ***! \*********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), config = __webpack_require__( /*! ../config */ 15), deferredUtils = __webpack_require__( /*! ../../integration/jquery/deferred */ 16); var type = function(object) { var types = { "[object Array]": "array", "[object Date]": "date", "[object Object]": "object", "[object Null]": "null" }, typeOfObject = Object.prototype.toString.call(object); return "object" === typeof object ? types[typeOfObject] || "object" : typeof object }; var isDefined = function(object) { return null !== object && void 0 !== object }; var isString = function(object) { return "string" === typeof object }; var isNumeric = function(object) { return "number" === typeof object && isFinite(object) || !isNaN(object - parseFloat(object)) }; var isObject = function(object) { return "object" === type(object) }; var isDate = function(object) { return "date" === type(object) }; var isBoolean = function(object) { return "boolean" === typeof object }; var isFunction = function(object) { return "function" === typeof object }; var isPrimitive = function(value) { return ["object", "array", "function"].indexOf(type(value)) === -1 }; var isExponential = function(value) { return isNumeric(value) && value.toString().indexOf("e") !== -1 }; var isWindow = function(object) { return null != object && object === object.window }; var ensureDefined = function(value, defaultValue) { return isDefined(value) ? value : defaultValue }; var executeAsync = function(action, context) { var timerId, deferred = $.Deferred(), normalizedContext = context || this, task = { promise: deferred.promise(), abort: function() { clearTimeout(timerId); deferred.rejectWith(normalizedContext) } }, callback = function() { var result = action.call(normalizedContext); if (result && result.done && isFunction(result.done)) { result.done(function() { deferred.resolveWith(normalizedContext) }) } else { deferred.resolveWith(normalizedContext) } }; timerId = (arguments[2] || setTimeout)(callback, "number" === typeof context ? context : 0); return task }; var delayedFuncs = []; var delayedNames = []; var delayedDeferreds = []; var executingName; var deferExecute = function(name, func, deferred) { if (executingName && executingName !== name) { delayedFuncs.push(func); delayedNames.push(name); deferred = deferred || $.Deferred(); delayedDeferreds.push(deferred); return deferred } else { var oldExecutingName = executingName, currentDelayedCount = delayedDeferreds.length; executingName = name; var result = func(); if (!result) { if (delayedDeferreds.length > currentDelayedCount) { result = deferredUtils.when.apply($, delayedDeferreds.slice(currentDelayedCount)) } else { if (deferred) { deferred.resolve() } } } executingName = oldExecutingName; if (deferred && result && result.done) { result.done(deferred.resolve).fail(deferred.reject) } if (!executingName && delayedFuncs.length) { ("render" === delayedNames.shift() ? deferRender : deferUpdate)(delayedFuncs.shift(), delayedDeferreds.shift()) } return result } }; var deferRender = function(func, deferred) { return deferExecute("render", func, deferred) }; var deferUpdate = function(func, deferred) { return deferExecute("update", func, deferred) }; var deferRenderer = function(func) { return function() { var that = this; return deferExecute("render", function() { return func.call(that) }) } }; var deferUpdater = function(func) { return function() { var that = this; return deferExecute("update", function() { return func.call(that) }) } }; var findBestMatches = function(targetFilter, items, mapFn) { var bestMatches = [], maxMatchCount = 0; $.each(items, function(index, itemSrc) { var matchCount = 0, item = mapFn ? mapFn(itemSrc) : itemSrc; $.each(targetFilter, function(paramName, targetValue) { var value = item[paramName]; if (void 0 === value) { return } if (match(value, targetValue)) { matchCount++; return } matchCount = -1; return false }); if (matchCount < maxMatchCount) { return } if (matchCount > maxMatchCount) { bestMatches.length = 0; maxMatchCount = matchCount } bestMatches.push(itemSrc) }); return bestMatches }; var match = function(value, targetValue) { if (Array.isArray(value) && Array.isArray(targetValue)) { var mismatch = false; $.each(value, function(index, valueItem) { if (valueItem !== targetValue[index]) { mismatch = true; return false } }); if (mismatch) { return false } return true } if (value === targetValue) { return true } return false }; var splitPair = function(raw) { switch (typeof raw) { case "string": return raw.split(/\s+/, 2); case "object": return [raw.x || raw.h, raw.y || raw.v]; case "number": return [raw]; default: return raw } }; var splitQuad = function(raw) { switch (typeof raw) { case "string": return raw.split(/\s+/, 4); case "object": return [raw.x || raw.h || raw.left, raw.y || raw.v || raw.top, raw.x || raw.h || raw.right, raw.y || raw.v || raw.bottom]; case "number": return [raw]; default: return raw } }; var normalizeKey = function(id) { var key = isString(id) ? id : id.toString(), arr = key.match(/[^a-zA-Z0-9_]/g); arr && $.each(arr, function(_, sign) { key = key.replace(sign, "__" + sign.charCodeAt() + "__") }); return key }; var denormalizeKey = function(key) { var arr = key.match(/__\d+__/g); arr && arr.forEach(function(char) { var charCode = parseInt(char.replace("__", "")); key = key.replace(char, String.fromCharCode(charCode)) }); return key }; var isArraysEqualByValue = function(array1, array2, deep) { if (array1.length !== array2.length) { return false } for (var i = 0; i < array1.length; i++) { if (!equalByValue(array1[i], array2[i], deep + 1)) { return false } } return true }; var isObjectsEqualByValue = function(object1, object2, deep) { for (var propertyName in object1) { if (object1.hasOwnProperty(propertyName) && !equalByValue(object1[propertyName], object2[propertyName], deep + 1)) { return false } } for (propertyName in object2) { if (!(propertyName in object1)) { return false } } return true }; var equalByValue = function(object1, object2, deep) { if (object1 === object2) { return true } var maxDeep = 3; deep = deep || 0; if (deep >= maxDeep) { return true } if (isObject(object1) && isObject(object2)) { return isObjectsEqualByValue(object1, object2, deep) } else { if (Array.isArray(object1) && Array.isArray(object2)) { return isArraysEqualByValue(object1, object2, deep) } else { if (isDate(object1) && isDate(object2)) { return object1.getTime() === object2.getTime() } } } return false }; var getKeyHash = function(key) { if (isObject(key) || Array.isArray(key)) { try { var keyHash = JSON.stringify(key); return "{}" === keyHash ? key : keyHash } catch (e) { return key } } return key }; var escapeRegExp = function(string) { return string.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&") }; var applyServerDecimalSeparator = function(value) { var separator = config().serverDecimalSeparator; if (isDefined(value)) { value = value.toString().replace(".", separator) } return value }; var noop = function() {}; var grep = function(elements, checkFunction, invert) { var check, result = [], expectedCheck = !invert; for (var i = 0; i < elements.length; i++) { check = !!checkFunction(elements[i], i); if (check === expectedCheck) { result.push(elements[i]) } } return result }; exports.type = type; exports.isDefined = isDefined; exports.isString = isString; exports.isNumeric = isNumeric; exports.isObject = isObject; exports.isDate = isDate; exports.isBoolean = isBoolean; exports.isFunction = isFunction; exports.isPrimitive = isPrimitive; exports.isExponential = isExponential; exports.isWindow = isWindow; exports.ensureDefined = ensureDefined; exports.executeAsync = executeAsync; exports.deferRender = deferRender; exports.deferRenderer = deferRenderer; exports.deferUpdate = deferUpdate; exports.deferUpdater = deferUpdater; exports.splitPair = splitPair; exports.splitQuad = splitQuad; exports.findBestMatches = findBestMatches; exports.normalizeKey = normalizeKey; exports.denormalizeKey = denormalizeKey; exports.equalByValue = equalByValue; exports.getKeyHash = getKeyHash; exports.escapeRegExp = escapeRegExp; exports.applyServerDecimalSeparator = applyServerDecimalSeparator; exports.noop = noop; exports.grep = grep }, /*!***************************!*\ !*** ./js/core/config.js ***! \***************************/ function(module, exports, __webpack_require__) { var extendUtils = __webpack_require__( /*! ./utils/extend */ 11), config = { rtlEnabled: false, defaultCurrency: "USD", designMode: false, serverDecimalSeparator: ".", forceIsoDateParsing: true, wrapActionsBeforeExecute: false }; module.exports = function() { if (!arguments.length) { return config } extendUtils.extend(config, arguments[0]) } }, /*!*******************************************!*\ !*** ./js/integration/jquery/deferred.js ***! \*******************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), compareVersion = __webpack_require__( /*! ../../core/utils/version */ 17).compare; exports.fromPromise = function(promise, context) { var isDeferred = promise && commonUtils.isFunction(promise.done) && commonUtils.isFunction(promise.fail); if (isDeferred) { return promise } var d = $.Deferred(); promise.then(function() { d.resolveWith.apply(d, [context].concat([$.makeArray(arguments)])) }, function() { d.rejectWith.apply(d, [context].concat([$.makeArray(arguments)])) }); return d }; exports.when = compareVersion($.fn.jquery, [3]) < 0 ? $.when : function(singleArg) { if (0 === arguments.length) { return $.Deferred().resolve() } else { if (1 === arguments.length) { return singleArg && singleArg.then ? singleArg : $.Deferred().resolve(singleArg) } else { return $.when.apply($, arguments) } } } }, /*!**********************************!*\ !*** ./js/core/utils/version.js ***! \**********************************/ function(module, exports) { exports.compare = function(x, y, maxLevel) { function normalizeArg(value) { if ("string" === typeof value) { return value.split(".") } if ("number" === typeof value) { return [value] } return value } x = normalizeArg(x); y = normalizeArg(y); var length = Math.max(x.length, y.length); if (isFinite(maxLevel)) { length = Math.min(length, maxLevel) } for (var i = 0; i < length; i++) { var xItem = parseInt(x[i] || 0, 10), yItem = parseInt(y[i] || 0, 10); if (xItem < yItem) { return -1 } if (xItem > yItem) { return 1 } } return 0 } }, /*!*********************************!*\ !*** ./js/core/utils/string.js ***! \*********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ./common */ 14); var encodeHtml = function() { var encodeRegExp = [new RegExp("&", "g"), new RegExp('"', "g"), new RegExp("'", "g"), new RegExp("<", "g"), new RegExp(">", "g")]; return function(str) { return String(str).replace(encodeRegExp[0], "&").replace(encodeRegExp[1], """).replace(encodeRegExp[2], "'").replace(encodeRegExp[3], "<").replace(encodeRegExp[4], ">") } }(); var pairToObject = function(raw) { var pair = commonUtils.splitPair(raw), h = parseInt(pair && pair[0], 10), v = parseInt(pair && pair[1], 10); if (!isFinite(h)) { h = 0 } if (!isFinite(v)) { v = h } return { h: h, v: v } }; var quadToObject = function(raw) { var quad = commonUtils.splitQuad(raw), left = parseInt(quad && quad[0], 10), top = parseInt(quad && quad[1], 10), right = parseInt(quad && quad[2], 10), bottom = parseInt(quad && quad[3], 10); if (!isFinite(left)) { left = 0 } if (!isFinite(top)) { top = left } if (!isFinite(right)) { right = left } if (!isFinite(bottom)) { bottom = top } return { top: top, right: right, bottom: bottom, left: left } }; var stringFormat = function() { var replaceDollarCount, reg, value, s = arguments[0], values = $.makeArray(arguments).slice(1); if (commonUtils.isFunction(s)) { return s.apply(this, values) } for (var i = 0; i < values.length; i++) { reg = new RegExp("\\{" + i + "\\}", "gm"); value = values[i]; if ("string" === commonUtils.type(value) && value.indexOf("$") >= 0) { replaceDollarCount = "$".replace("$", "$$").length; value = value.replace("$", 1 === replaceDollarCount ? "$$$$" : "$$") } s = s.replace(reg, value) } return s }; var replaceAll = function() { var quote = function(str) { return (str + "").replace(/([\+\*\?\\\.\[\^\]\$\(\)\{\}\><\|\=\!\:])/g, "\\$1") }; return function(text, searchToken, replacementToken) { return text.replace(new RegExp("(" + quote(searchToken) + ")", "gi"), replacementToken) } }(); var isEmpty = function() { var SPACE_REGEXP = /\s/g; return function(text) { return !text || !text.replace(SPACE_REGEXP, "") } }(); exports.encodeHtml = encodeHtml; exports.pairToObject = pairToObject; exports.quadToObject = quadToObject; exports.format = stringFormat; exports.replaceAll = replaceAll; exports.isEmpty = isEmpty }, /*!****************************!*\ !*** ./js/core/version.js ***! \****************************/ function(module, exports) { module.exports = "17.1.5" }, /*!*******************************!*\ !*** ./js/client_exporter.js ***! \*******************************/ function(module, exports, __webpack_require__) { var fileSaver = __webpack_require__( /*! ./client_exporter/file_saver */ 21).fileSaver, _isFunction = __webpack_require__( /*! ./core/utils/common */ 14).isFunction; exports.export = function(data, options, getData) { if (!data) { return } var exportingAction = options.exportingAction, exportedAction = options.exportedAction, fileSavingAction = options.fileSavingAction, eventArgs = { fileName: options.fileName, format: options.format, cancel: false }; _isFunction(exportingAction) && exportingAction(eventArgs); if (!eventArgs.cancel) { getData(data, options, function(blob) { _isFunction(exportedAction) && exportedAction(); if (_isFunction(fileSavingAction)) { eventArgs.data = blob; fileSavingAction(eventArgs) } if (!eventArgs.cancel) { fileSaver.saveAs(eventArgs.fileName, options.format, blob, options.proxyUrl) } }) } }; exports.fileSaver = fileSaver; exports.excel = { creator: __webpack_require__( /*! ./client_exporter/excel_creator */ 24).ExcelCreator, getData: __webpack_require__( /*! ./client_exporter/excel_creator */ 24).getData, formatConverter: __webpack_require__( /*! ./client_exporter/excel_format_converter */ 31) }; exports.excel.__internals = __webpack_require__( /*! ./client_exporter/excel_creator */ 24).__internals; exports.image = { creator: __webpack_require__( /*! ./client_exporter/image_creator */ 37).imageCreator, getData: __webpack_require__( /*! ./client_exporter/image_creator */ 37).getData }; exports.pdf = { getData: __webpack_require__( /*! ./client_exporter/pdf_creator */ 40).getData }; exports.svg = { creator: __webpack_require__( /*! ./client_exporter/svg_creator */ 41).svgCreator, getData: __webpack_require__( /*! ./client_exporter/svg_creator */ 41).getData } }, /*!******************************************!*\ !*** ./js/client_exporter/file_saver.js ***! \******************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), errors = __webpack_require__( /*! ../ui/widget/ui.errors */ 22), browser = __webpack_require__( /*! ../core/utils/browser */ 23), commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), FILE_EXTESIONS = { EXCEL: "xlsx", CSS: "css", PNG: "png", JPEG: "jpeg", GIF: "gif", SVG: "svg", PDF: "pdf" }; var MIME_TYPES = exports.MIME_TYPES = { CSS: "text/css", EXCEL: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", PNG: "image/png", JPEG: "image/jpeg", GIF: "image/gif", SVG: "image/svg+xml", PDF: "application/pdf" }; exports.fileSaver = { _getDataUri: function(format, data) { return "data:" + MIME_TYPES[format] + ";base64," + data }, _linkDownloader: function(fileName, href, callback) { var exportLinkElement = document.createElement("a"), attributes = { download: fileName, href: href }; if (commonUtils.isDefined(callback)) { attributes.onclick = callback } document.body.appendChild(exportLinkElement); $(exportLinkElement).css({ display: "none" }).text("load").attr(attributes)[0].click(); return exportLinkElement }, _formDownloader: function(proxyUrl, fileName, contentType, data, callback) { var formAttributes = { method: "post", action: proxyUrl, enctype: "multipart/form-data" }, exportForm = $("<form>").css({ display: "none" }).attr(formAttributes); if (commonUtils.isDefined(callback)) { exportForm.submit(callback) } exportForm.append('<input type="hidden" name="fileName" value="' + fileName + '" />'); exportForm.append('<input type="hidden" name="contentType" value="' + contentType + '" />'); exportForm.append('<input type="hidden" name="data" value="' + data + '" />'); exportForm.appendTo("body"); exportForm.submit(); if (exportForm.submit()) { exportForm.remove() } return exportForm }, _saveByProxy: function(proxyUrl, fileName, format, data, callback) { return this._formDownloader(proxyUrl, fileName, MIME_TYPES[format], data, callback) }, _winJSBlobSave: function(blob, fileName, format) { var savePicker = new Windows.Storage.Pickers.FileSavePicker; savePicker.suggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.documentsLibrary; savePicker.fileTypeChoices.insert(MIME_TYPES[format], ["." + FILE_EXTESIONS[format]]); savePicker.suggestedFileName = fileName; savePicker.pickSaveFileAsync().then(function(file) { if (file) { file.openAsync(Windows.Storage.FileAccessMode.readWrite).then(function(outputStream) { var inputStream = blob.msDetachStream(); Windows.Storage.Streams.RandomAccessStream.copyAsync(inputStream, outputStream).then(function() { outputStream.flushAsync().done(function() { inputStream.close(); outputStream.close() }) }) }) } }) }, _saveBlobAs: function(fileName, format, data, linkClick) { this._blobSaved = false; if (commonUtils.isDefined(navigator.msSaveOrOpenBlob)) { navigator.msSaveOrOpenBlob(data, fileName); this._blobSaved = true } else { if (commonUtils.isDefined(window.WinJS)) { this._winJSBlobSave(data, fileName, format); this._blobSaved = true } else { var URL = window.URL || window.webkitURL || window.mozURL || window.msURL || window.oURL; linkClick = commonUtils.isDefined(linkClick) ? linkClick : function() { var link = $("#dxExportLink"); URL.revokeObjectURL(link.attr("href")); link.remove() }; if (commonUtils.isDefined(URL)) { return this._linkDownloader(fileName, URL.createObjectURL(data), linkClick) } } } }, saveAs: function(fileName, format, data, proxyURL, linkClick) { fileName += "." + FILE_EXTESIONS[format]; if (commonUtils.isFunction(window.Blob)) { this._saveBlobAs(fileName, format, data) } else { if (commonUtils.isDefined(proxyURL) && !commonUtils.isDefined(navigator.userAgent.match(/iPad/i))) { this._saveByProxy(proxyURL, fileName, format, data) } else { if (!commonUtils.isDefined(navigator.userAgent.match(/iPad/i))) { errors.log("E1034") } if (browser.msie && parseInt(browser.version) < 10) { return } this._linkDownloader(fileName, this._getDataUri(format, data), linkClick) } } } } }, /*!***********************************!*\ !*** ./js/ui/widget/ui.errors.js ***! \***********************************/ function(module, exports, __webpack_require__) { var errorUtils = __webpack_require__( /*! ../../core/utils/error */ 8), errors = __webpack_require__( /*! ../../core/errors */ 7); module.exports = errorUtils(errors.ERROR_MESSAGES, { E1001: "Module '{0}'. Controller '{1}' is already registered", E1002: "Module '{0}'. Controller '{1}' does not inherit from DevExpress.ui.dxDataGrid.Controller", E1003: "Module '{0}'. View '{1}' is already registered", E1004: "Module '{0}'. View '{1}' does not inherit from DevExpress.ui.dxDataGrid.View", E1005: "Public method '{0}' is already registered", E1006: "Public method '{0}.{1}' does not exist", E1007: "State storing cannot be provided due to the restrictions of the browser", E1010: "The template does not contain the TextBox widget", E1011: 'Items cannot be deleted from the List. Implement the "remove" function in the data store', E1012: "Editing type '{0}' with the name '{1}' is unsupported", E1016: "Unexpected type of data source is provided for a lookup column", E1018: "The 'collapseAll' method cannot be called if you use a remote data source", E1019: "Search mode '{0}' is unavailable", E1020: "The type cannot be changed after initialization", E1021: "{0} '{1}' you are trying to remove does not exist", E1022: 'The "markers" option is given an invalid value. Assign an array instead', E1023: 'The "routes" option is given an invalid value. Assign an array instead', E1025: "This layout is too complex to render", E1026: 'The "calculateCustomSummary" function is missing from a field whose "summaryType" option is set to "custom"', E1030: "Unknown ScrollView refresh strategy: '{0}'", E1031: "Unknown subscription in the Scheduler widget: '{0}'", E1032: "Unknown start date in an appointment: '{0}'", E1033: "Unknown step in the date navigator: '{0}'", E1034: "The browser does not implement an API for saving files", E1035: "The editor cannot be created because of an internal error: {0}", E1036: "Validation rules are not defined for any form item", E1037: "Invalid structure of grouped data", E1038: "The browser does not support local storages for local web pages", E1039: "A cell's position cannot be calculated", E1040: "The '{0}' key value is not unique within the data array", E1041: "The JSZip script is referenced after DevExtreme scripts", E1042: 'Deferred selection cannot be performed. Set the "key" field for the data store', E1043: "Changes cannot be processed due to the incorrectly set key", E1044: "The key field specified by the keyExpr option does not match the key field specified in the data store", E1045: "Editing requires the key field to be specified in the data store", E1046: "The '{0}' key field is not found in data objects", W1001: 'The "key" option cannot be modified after initialization', W1002: "An item with the key '{0}' does not exist", W1003: "A group with the key '{0}' in which you are trying to select items does not exist", W1004: "The item '{0}' you are trying to select in the group '{1}' does not exist", W1005: "Due to column data types being unspecified, data has been loaded twice in order to apply initial filter settings. To resolve this issue, specify data types for all grid columns.", W1006: "The map service returned the '{0}' error", W1007: "No item with key {0} was found in the data source, but this key was used as the parent key for item {1}", W1008: "Cannot scroll to the '{0}' date because it does not exist on the current view" }) }, /*!**********************************!*\ !*** ./js/core/utils/browser.js ***! \**********************************/ function(module, exports, __webpack_require__) { var extend = __webpack_require__( /*! ./extend */ 11).extend; var webkitRegExp = /(webkit)[ \/]([\w.]+)/, ieRegExp = /(msie) (\d{1,2}\.\d)/, ie11RegExp = /(trident).*rv:(\d{1,2}\.\d)/, msEdge = /(edge)\/((\d+)?[\w\.]+)/, safari = /(safari)/i, mozillaRegExp = /(mozilla)(?:.*? rv:([\w.]+))/; var browserFromUA = function(ua) { ua = ua.toLowerCase(); var result = {}, matches = ieRegExp.exec(ua) || ie11RegExp.exec(ua) || msEdge.exec(ua) || ua.indexOf("compatible") < 0 && mozillaRegExp.exec(ua) || webkitRegExp.exec(ua) || [], browserName = matches[1], browserVersion = matches[2]; if ("webkit" === browserName && ua.indexOf("chrome") < 0 && safari.exec(ua)) { browserName = "safari"; result.webkit = true; browserVersion = /Version\/([0-9.]+)/i.exec(ua); browserVersion = browserVersion && browserVersion[1] } if ("trident" === browserName || "edge" === browserName) { browserName = "msie" } if (browserName) { result[browserName] = true; result.version = browserVersion } return result }; module.exports = extend({ _fromUA: browserFromUA }, browserFromUA(navigator.userAgent)) }, /*!*********************************************!*\ !*** ./js/client_exporter/excel_creator.js ***! \*********************************************/ function(module, exports, __webpack_require__) { var Class = __webpack_require__( /*! ../core/class */ 25), commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../core/utils/array */ 26).inArray, errors = __webpack_require__( /*! ../ui/widget/ui.errors */ 22), stringUtils = __webpack_require__( /*! ../core/utils/string */ 18), JSZip = __webpack_require__( /*! jszip */ 30), fileSaver = __webpack_require__( /*! ./file_saver */ 21), excelFormatConverter = __webpack_require__( /*! ./excel_format_converter */ 31), XML_TAG = '<?xml version="1.0" encoding="utf-8"?>', GROUP_SHEET_PR_XML = '<sheetPr><outlinePr summaryBelow="0"/></sheetPr>', SINGLE_SHEET_PR_XML = "<sheetPr/>", BASE_STYLE_XML = '<fonts count="2"><font><sz val="11"/><color theme="1"/><name val="Calibri"/><family val="2"/><scheme val="minor"/></font><font><b/><sz val="11"/><color theme="1"/><name val="Calibri"/><family val="2"/><scheme val="minor"/></font></fonts><fills count="1"><fill><patternFill patternType="none"/></fill></fills><borders count="1"><border><left style="thin"><color rgb="FFD3D3D3"/></left><right style="thin"><color rgb="FFD3D3D3"/></right><top style="thin"><color rgb="FFD3D3D3"/></top><bottom style="thin"><color rgb="FFD3D3D3"/></bottom></border></borders><cellStyleXfs count="1"><xf numFmtId="0" fontId="0" fillId="0" borderId="0"/></cellStyleXfs>', OPEN_XML_FORMAT_URL = "http://schemas.openxmlformats.org", RELATIONSHIP_PART_NAME = "rels", XL_FOLDER_NAME = "xl", WORKBOOK_FILE_NAME = "workbook.xml", CONTENTTYPES_FILE_NAME = "[Content_Types].xml", SHAREDSTRING_FILE_NAME = "sharedStrings.xml", STYLE_FILE_NAME = "styles.xml", WORKSHEETS_FOLDER = "worksheets", WORKSHEET_FILE_NAME = "sheet1.xml", VALID_TYPES = { "boolean": "b", date: "d", number: "n", string: "s" }, EXCEL_START_TIME = Date.UTC(1899, 11, 30), DAYS_COUNT_BEFORE_29_FEB_1900 = 60, BOLD_STYLES_COUNT = 4, MAX_DIGIT_WIDTH_IN_PIXELS = 7, CUSTOM_FORMAT_START_INDEX = 165; exports.ExcelCreator = Class.inherit({ _getXMLTag: function(tagName, attributes, content) { var i, attr, result = "<" + tagName, length = attributes.length; for (i = 0; i < length; i++) { attr = attributes[i]; result = result + " " + attr.name + '="' + attr.value + '"' } return commonUtils.isDefined(content) ? result + ">" + content + "</" + tagName + ">" : result + " />" }, _getCellIndex: function(rowIndex, cellIndex) { var charCode, sheetIndex = "", max = 26; if (this._maxIndex[0] < Number(rowIndex)) { this._maxIndex[0] = Number(rowIndex) } if (this._maxIndex[1] < Number(cellIndex)) { this._maxIndex[1] = Number(cellIndex) } while (true) { charCode = 65 + (cellIndex >= max ? cellIndex % max : Math.ceil(cellIndex)); sheetIndex = String.fromCharCode(charCode) + sheetIndex; if (cellIndex >= max) { cellIndex = Math.floor(cellIndex / max) - 1 } else { break } } return sheetIndex + rowIndex }, _getDataType: function(dataType) { return VALID_TYPES[dataType] || "s" }, _formatObjectConverter: function(format, precision, dataType) { var result = { format: format, precision: precision, dataType: dataType }; if (commonUtils.isObject(format)) { return extend(result, format, { format: format.type, currency: format.currency }) } return result }, _appendFormat: function(format, precision, dataType) { var currency, newFormat = this._formatObjectConverter(format, precision, dataType); format = newFormat.format; precision = newFormat.precision; currency = newFormat.currency; dataType = newFormat.dataType; format = excelFormatConverter.convertFormat(format, precision, dataType, currency); if (format) { if (inArray(format, this._styleFormat) === -1) { this._styleFormat.push(format) } return inArray(format, this._styleFormat) + 1 } }, _appendString: function(value) { if (commonUtils.isDefined(value)) { value = String(value); if (value.length) { value = stringUtils.encodeHtml(value); if (void 0 === this._stringHash[value]) { this._stringHash[value] = this._stringArray.length; this._stringArray.push(value) } return this._stringHash[value] } } }, _getExcelDateValue: function(date) { var days, totalTime; if (commonUtils.isDate(date)) { days = Math.floor((Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()) - EXCEL_START_TIME) / 864e5); if (days < DAYS_COUNT_BEFORE_29_FEB_1900) { days-- } totalTime = (3600 * date.getHours() + 60 * date.getMinutes() + date.getSeconds()) / 86400; return days + totalTime } }, _prepareValue: function(rowIndex, cellIndex) { var dataProvider = this._dataProvider, value = dataProvider.getCellValue(rowIndex, cellIndex), type = this._getDataType(dataProvider.getCellType(rowIndex, cellIndex)), formatID = this._styleArray[this._dataProvider.getStyleId(rowIndex, cellIndex)].formatID, format = commonUtils.isNumeric(formatID) ? this._styleFormat[formatID - 1] : null; if ("d" === type && !commonUtils.isDate(value)) { type = "s" } switch (type) { case "s": value = this._appendString(value); break; case "d": value = this._getExcelDateValue(value, format); type = "n" } return { value: value, type: type } }, _getDataArray: function() { var rowIndex, cellIndex, cellsArray, cellData, cellsLength, that = this, result = [], dataProvider = that._dataProvider, rowsLength = dataProvider.getRowsCount(), columns = dataProvider.getColumns(); for (rowIndex = 0; rowIndex < rowsLength; rowIndex++) { cellsArray = []; cellsLength = columns.length; for (cellIndex = 0; cellIndex !== cellsLength; cellIndex++) { cellData = that._prepareValue(rowIndex, cellIndex); cellsArray.push({ style: dataProvider.getStyleId(rowIndex, cellIndex), value: cellData.value, type: cellData.type }) } if (!that._needSheetPr && dataProvider.getGroupLevel(rowIndex) > 0) { that._needSheetPr = true } result.push(cellsArray) } return result }, _getBoldStyleID: function(alignment) { for (var i = 0; i < BOLD_STYLES_COUNT - 1; i++) { if (this._styleArray[i].alignment === alignment) { return i } } }, _calculateWidth: function(pixelsWidth) { pixelsWidth = parseInt(pixelsWidth, 10); if (!pixelsWidth || pixelsWidth < 5) { pixelsWidth = 100 } return Math.min(255, Math.floor((pixelsWidth - 5) / MAX_DIGIT_WIDTH_IN_PIXELS * 100 + .5) / 100) }, _prepareStyleData: function() { var that = this, styles = that._dataProvider.getStyles(); that._dataProvider.getColumns().forEach(function(column) { that._colsArray.push(that._calculateWidth(column.width)) }); styles.forEach(function(style) { that._styleArray.push({ bold: !!style.bold, alignment: style.alignment || "left", formatID: that._appendFormat(style.format, style.precision, style.dataType), wrapText: style.wrapText }) }) }, _prepareCellData: function() { this._cellsArray = this._getDataArray() }, _createXMLRelationships: function(xmlRelationships) { return this._getXMLTag("Relationships", [{ name: "xmlns", value: OPEN_XML_FORMAT_URL + "/package/2006/relationships" }], xmlRelationships) }, _createXMLRelationship: function(id, type, target) { return this._getXMLTag("Relationship", [{ name: "Id", value: "rId" + id }, { name: "Type", value: OPEN_XML_FORMAT_URL + "/officeDocument/2006/relationships/" + type }, { name: "Target", value: target }]) }, _getWorkbookContent: function() { var content = '<bookViews><workbookView xWindow="0" yWindow="0" windowWidth="0" windowHeight="0"/></bookViews><sheets><sheet name="Sheet" sheetId="1" r:id="rId1" /></sheets><definedNames><definedName name="_xlnm.Print_Titles" localSheetId="0">Sheet!$1:$1</definedName><definedName name="_xlnm._FilterDatabase" hidden="0" localSheetId="0">Sheet!$A$1:$F$6332</definedName></definedNames>'; return XML_TAG + this._getXMLTag("workbook", [{ name: "xmlns:r", value: OPEN_XML_FORMAT_URL + "/officeDocument/2006/relationships" }, { name: "xmlns", value: OPEN_XML_FORMAT_URL + "/spreadsheetml/2006/main" }], content) }, _getContentTypesContent: function() { return XML_TAG + '<Types xmlns="' + OPEN_XML_FORMAT_URL + '/package/2006/content-types"><Default Extension="rels" ContentType="application/vnd.openxmlformats-package.relationships+xml" /><Default Extension="xml" ContentType="application/xml" /><Override PartName="/xl/worksheets/sheet1.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml" /><Override PartName="/xl/styles.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml" /><Override PartName="/xl/sharedStrings.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml" /><Override PartName="/xl/workbook.xml" ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml" /></Types>' }, _generateStylesXML: function() { var formatIndex, that = this, folder = that._zip.folder(XL_FOLDER_NAME), xmlStyles = [], XML = ""; for (formatIndex = 0; formatIndex < that._styleFormat.length; formatIndex++) { that._styleFormat[formatIndex] = that._getXMLTag("numFmt", [{ name: "numFmtId", value: Number(formatIndex) + CUSTOM_FORMAT_START_INDEX }, { name: "formatCode", value: that._styleFormat[formatIndex] }]) } XML = XML + that._getXMLTag("numFmts", [{ name: "count", value: that._styleFormat.length }], that._styleFormat.join("")) + BASE_STYLE_XML; this._styleArray.forEach(function(style) { xmlStyles.push(that._getXMLTag("xf", [{ name: "xfId", value: 0 }, { name: "applyAlignment", value: 1 }, { name: "fontId", value: Number(!!style.bold) }, { name: "applyNumberFormat", value: commonUtils.isDefined(style.formatID) ? 1 : 0 }, { name: "numFmtId", value: commonUtils.isDefined(style.formatID) ? Number(style.formatID) + CUSTOM_FORMAT_START_INDEX - 1 : 0 }], that._getXMLTag("alignment", [{ name: "vertical", value: "top" }, { name: "wrapText", value: Number(!!style.wrapText) }, { name: "horizontal", value: style.alignment }]))) }); XML += that._getXMLTag("cellXfs", [{ name: "count", value: xmlStyles.length }], xmlStyles.join("")); XML += that._getXMLTag("cellStyles", [{ name: "count", value: 1 }], that._getXMLTag("cellStyle", [{ name: "name", value: "Normal" }, { name: "xfId", value: 0 }, { name: "builtinId", value: 0 }])); XML = XML_TAG + that._getXMLTag("styleSheet", [{ name: "xmlns", value: OPEN_XML_FORMAT_URL + "/spreadsheetml/2006/main" }], XML); folder.file(STYLE_FILE_NAME, XML); that._styleArray = [] }, _generateStringsXML: function() { var stringIndex, folder = this._zip.folder(XL_FOLDER_NAME), stringsLength = this._stringArray.length, sharedStringXml = XML_TAG; for (stringIndex = 0; stringIndex < stringsLength; stringIndex++) { this._stringArray[stringIndex] = this._getXMLTag("si", [], this._getXMLTag("t", [], this._stringArray[stringIndex])) } sharedStringXml += this._getXMLTag("sst", [{ name: "xmlns", value: OPEN_XML_FORMAT_URL + "/spreadsheetml/2006/main" }, { name: "count", value: this._stringArray.length }, { name: "uniqueCount", value: this._stringArray.length }], this._stringArray.join("")); folder.file(SHAREDSTRING_FILE_NAME, sharedStringXml); this._stringArray = [] }, _getPaneXML: function() { var attributes = [{ name: "activePane", value: "bottomLeft" }, { name: "state", value: "frozen" }], frozenArea = this._dataProvider.getFrozenArea(); if (!(frozenArea.x || frozenArea.y)) { return "" } if (frozenArea.x) { attributes.push({ name: "xSplit", value: frozenArea.x }) } if (frozenArea.y) { attributes.push({ name: "ySplit", value: frozenArea.y }) } attributes.push({ name: "topLeftCell", value: this._getCellIndex(frozenArea.y + 1, frozenArea.x) }); return this._getXMLTag("pane", attributes) }, _generateWorksheetXML: function() { var colIndex, rowIndex, cellData, xmlCells, maxCellIndex, cellsLength, counter = 0, xmlRows = [], rowsLength = this._cellsArray.length, colsLength = this._colsArray.length, rSpans = "1:" + colsLength, headerRowCount = this._dataProvider.getHeaderRowCount ? this._dataProvider.getHeaderRowCount() : 1, xmlResult = [ ['<?xml version="1.0" encoding="UTF-8" standalone="yes"?><worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac">', this._needSheetPr ? GROUP_SHEET_PR_XML : SINGLE_SHEET_PR_XML, '<dimension ref="A1:', this._getCellIndex(this._maxIndex[0], this._maxIndex[1]) + '"/><sheetViews><sheetView ' + (this._rtlEnabled ? 'rightToLeft="1" ' : "") + 'tabSelected="1" workbookViewId="0">' + this._getPaneXML() + '</sheetView></sheetViews><sheetFormatPr defaultRowHeight="15" outlineLevelRow="', this._dataProvider.getRowsCount() > 0 ? this._dataProvider.getGroupLevel(0) : 0, '" x14ac:dyDescent="0.25"/>'].join("") ]; for (colIndex = 0; colIndex < colsLength; colIndex++) { this._colsArray[colIndex] = this._getXMLTag("col", [{ name: "width", value: this._colsArray[colIndex] }, { name: "min", value: Number(colIndex) + 1 }, { name: "max", value: Number(colIndex) + 1 }]) } xmlResult.push(this._getXMLTag("cols", [], this._colsArray.join("")) + "<sheetData>"); for (rowIndex = 0; rowIndex < rowsLength; rowIndex++) { xmlCells = []; cellsLength = this._cellsArray[rowIndex].length; for (colIndex = 0; colIndex < cellsLength; colIndex++) { rowIndex = Number(rowIndex); cellData = this._cellsArray[rowIndex][colIndex]; xmlCells.push(this._getXMLTag("c", [{ name: "r", value: this._getCellIndex(rowIndex + 1, colIndex) }, { name: "s", value: cellData.style }, { name: "t", value: cellData.type }], commonUtils.isDefined(cellData.value) ? this._getXMLTag("v", [], cellData.value) : null)) } xmlRows.push(this._getXMLTag("row", [{ name: "r", value: Number(rowIndex) + 1 }, { name: "spans", value: rSpans }, { name: "outlineLevel", value: rowIndex >= headerRowCount ? this._dataProvider.getGroupLevel(rowIndex) : 0 }, { name: "x14ac:dyDescent", value: "0.25" }], xmlCells.join(""))); this._cellsArray[rowIndex] = null; if (counter++ > 1e4) { xmlResult.push(xmlRows.join("")); xmlRows = []; counter = 0 } } xmlResult.push(xmlRows.join("")); xmlRows = []; maxCellIndex = this._getCellIndex(this._maxIndex[0], this._maxIndex[1]); xmlResult.push("</sheetData>" + (this._options.autoFilterEnabled ? '<autoFilter ref="A' + this._dataProvider.getHeaderRowCount() + ":" + maxCellIndex + '" />' : "") + this._generateMergingXML() + '<ignoredErrors><ignoredError sqref="A1:' + maxCellIndex + '" numberStoredAsText="1" /></ignoredErrors></worksheet>'); this._zip.folder(XL_FOLDER_NAME).folder(WORKSHEETS_FOLDER).file(WORKSHEET_FILE_NAME, xmlResult.join("")); this._colsArray = []; this._cellsArray = []; xmlResult = [] }, _generateMergingXML: function() { var k, l, cellIndex, rowIndex, mergeArrayLength, mergeIndex, rowsLength = commonUtils.isDefined(this._dataProvider.getHeaderRowCount) ? this._dataProvider.getHeaderRowCount() : this._dataProvider.getRowsCount(), columnsLength = this._dataProvider.getColumns().length, usedArea = [], mergeArray = [], mergeXML = ""; for (rowIndex = 0; rowIndex < rowsLength; rowIndex++) { for (cellIndex = 0; cellIndex !== columnsLength; cellIndex++) { if (!commonUtils.isDefined(usedArea[rowIndex]) || !commonUtils.isDefined(usedArea[rowIndex][cellIndex])) { var cellMerge = this._dataProvider.getCellMerging(rowIndex, cellIndex); if (cellMerge.colspan || cellMerge.rowspan) { mergeArray.push({ start: this._getCellIndex(rowIndex + 1, cellIndex), end: this._getCellIndex(rowIndex + 1 + (cellMerge.rowspan || 0), cellIndex + (cellMerge.colspan || 0)) }); for (k = rowIndex; k <= rowIndex + cellMerge.rowspan || 0; k++) { for (l = cellIndex; l <= cellIndex + cellMerge.colspan || 0; l++) { if (!commonUtils.isDefined(usedArea[k])) { usedArea[k] = [] } usedArea[k][l] = true } } } } } } mergeArrayLength = mergeArray.length; for (mergeIndex = 0; mergeIndex < mergeArrayLength; mergeIndex++) { mergeXML += this._getXMLTag("mergeCell", [{ name: "ref", value: mergeArray[mergeIndex].start + ":" + mergeArray[mergeIndex].end }]) } return mergeXML.length ? this._getXMLTag("mergeCells", [{ name: "count", value: mergeArrayLength }], mergeXML) : "" }, _generateCommonXML: function() { var xmlRelationships, relsFileContent = XML_TAG + this._createXMLRelationships(this._createXMLRelationship(1, "officeDocument", "xl/" + WORKBOOK_FILE_NAME)), folder = this._zip.folder(XL_FOLDER_NAME), relsXML = XML_TAG; this._zip.folder("_" + RELATIONSHIP_PART_NAME).file("." + RELATIONSHIP_PART_NAME, relsFileContent); xmlRelationships = this._createXMLRelationship(1, "worksheet", "worksheets/" + WORKSHEET_FILE_NAME) + this._createXMLRelationship(2, "styles", STYLE_FILE_NAME) + this._createXMLRelationship(3, "sharedStrings", SHAREDSTRING_FILE_NAME); relsXML += this._createXMLRelationships(xmlRelationships); folder.folder("_" + RELATIONSHIP_PART_NAME).file(WORKBOOK_FILE_NAME + ".rels", relsXML); folder.file(WORKBOOK_FILE_NAME, this._getWorkbookContent()); this._zip.file(CONTENTTYPES_FILE_NAME, this._getContentTypesContent()) }, _generateContent: function() { this._prepareStyleData(); this._prepareCellData(); this._generateWorkXML(); this._generateCommonXML() }, _generateWorkXML: function() { this._generateStylesXML(); this._generateStringsXML(); this._generateWorksheetXML() }, ctor: function(dataProvider, options) { this._rtlEnabled = options && !!options.rtlEnabled; this._options = options; this._maxIndex = [1, 2]; this._stringArray = []; this._stringHash = {}; this._styleArray = []; this._colsArray = []; this._cellsArray = []; this._styleFormat = []; this._needSheetPr = false; this._dataProvider = dataProvider; if (commonUtils.isDefined(JSZip)) { this._zip = new JSZip } else { this._zip = null } }, _checkZipState: function() { if (!this._zip) { throw errors.Error("E1041") } }, ready: function() { return this._dataProvider.ready() }, getData: function(isBlob) { var options = { type: isBlob ? "blob" : "base64", compression: "DEFLATE", mimeType: fileSaver.MIME_TYPES.EXCEL }; this._checkZipState(); this._generateContent(); return this._zip.generateAsync ? this._zip.generateAsync(options) : this._zip.generate(options) } }); exports.getData = function(data, options, callback) { var excelCreator = new exports.ExcelCreator(data, options); excelCreator._checkZipState(); excelCreator.ready().done(function() { if (excelCreator._zip.generateAsync) { excelCreator.getData(commonUtils.isFunction(window.Blob)).then(callback) } else { callback(excelCreator.getData(commonUtils.isFunction(window.Blob))) } }) }; exports.__internals = { CONTENTTYPES_FILE_NAME: CONTENTTYPES_FILE_NAME, RELATIONSHIP_PART_NAME: RELATIONSHIP_PART_NAME, XL_FOLDER_NAME: XL_FOLDER_NAME, WORKBOOK_FILE_NAME: WORKBOOK_FILE_NAME, STYLE_FILE_NAME: STYLE_FILE_NAME, WORKSHEET_FILE_NAME: WORKSHEET_FILE_NAME, WORKSHEETS_FOLDER: WORKSHEETS_FOLDER, SHAREDSTRING_FILE_NAME: SHAREDSTRING_FILE_NAME, GROUP_SHEET_PR_XML: GROUP_SHEET_PR_XML, SINGLE_SHEET_PR_XML: SINGLE_SHEET_PR_XML } }, /*!**************************!*\ !*** ./js/core/class.js ***! \**************************/ function(module, exports, __webpack_require__) { var errors = __webpack_require__( /*! ./errors */ 7); var wrapOverridden = function(baseProto, methodName, method) { return function() { var prevCallBase = this.callBase; this.callBase = baseProto[methodName]; try { return method.apply(this, arguments) } finally { this.callBase = prevCallBase } } }; var clonePrototype = function(obj) { var func = function() {}; func.prototype = obj.prototype; return new func }; var redefine = function(members) { var overridden, memberName, member, that = this; if (!members) { return that } for (memberName in members) { member = members[memberName]; overridden = "function" === typeof that.prototype[memberName] && "function" === typeof member; that.prototype[memberName] = overridden ? wrapOverridden(that.parent.prototype, memberName, member) : member } return that }; var include = function() { var argument, name, i, classObj = this; for (i = 0; i < arguments.length; i++) { argument = arguments[i]; if (argument.ctor) { classObj._includedCtors.push(argument.ctor) } if (argument.postCtor) { classObj._includedPostCtors.push(argument.postCtor) } for (name in argument) { if ("ctor" === name || "postCtor" === name) { continue } if (name in classObj.prototype) { throw errors.Error("E0002", name) } classObj.prototype[name] = argument[name] } } return classObj }; var subclassOf = function(parentClass) { if (this.parent === parentClass) { return true } if (!this.parent || !this.parent.subclassOf) { return false } return this.parent.subclassOf(parentClass) }; var abstract = function() { throw errors.Error("E0001") }; var copyStatic = function() { var hasOwn = Object.prototype.hasOwnProperty; return function(source, destination) { for (var key in source) { if (!hasOwn.call(source, key)) { return } destination[key] = source[key] } } }(); var classImpl = function() {}; classImpl.inherit = function(members) { var inheritor = function() { if (!this || this === window || "function" !== typeof this.constructor) { throw errors.Error("E0003") } var i, instance = this, ctor = instance.ctor, includedCtors = instance.constructor._includedCtors, includedPostCtors = instance.constructor._includedPostCtors; for (i = 0; i < includedCtors.length; i++) { includedCtors[i].call(instance) } if (ctor) { ctor.apply(instance, arguments) } for (i = 0; i < includedPostCtors.length; i++) { includedPostCtors[i].call(instance) } }; inheritor.prototype = clonePrototype(this); copyStatic(this, inheritor); inheritor.inherit = this.inherit; inheritor.abstract = abstract; inheritor.redefine = redefine; inheritor.include = include; inheritor.subclassOf = subclassOf; inheritor.parent = this; inheritor._includedCtors = this._includedCtors ? this._includedCtors.slice(0) : []; inheritor._includedPostCtors = this._includedPostCtors ? this._includedPostCtors.slice(0) : []; inheritor.prototype.constructor = inheritor; inheritor.redefine(members); return inheritor }; classImpl.abstract = abstract; module.exports = classImpl }, /*!********************************!*\ !*** ./js/core/utils/array.js ***! \********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ./common */ 14), objectUtils = __webpack_require__( /*! ./object */ 27); var isEmpty = function(entity) { return Array.isArray(entity) && !entity.length }; var wrapToArray = function(entity) { return Array.isArray(entity) ? entity : [entity] }; var intersection = function(a, b) { if (!Array.isArray(a) || 0 === a.length || !Array.isArray(b) || 0 === b.length) { return [] } var result = []; $.each(a, function(_, value) { var index = inArray(value, b); if (index !== -1) { result.push(value) } }); return result }; var removeDuplicates = function(from, what) { if (!Array.isArray(from) || 0 === from.length) { return [] } if (!Array.isArray(what) || 0 === what.length) { return from.slice() } var result = []; $.each(from, function(_, value) { var index = inArray(value, what); if (index === -1) { result.push(value) } }); return result }; var normalizeIndexes = function(items, indexParameterName, currentItem, needIndexCallback) { var indexedItems = {}, parameterIndex = 0; $.each(items, function(index, item) { index = item[indexParameterName]; if (commonUtils.isDefined(index)) { indexedItems[index] = indexedItems[index] || []; if (item === currentItem) { indexedItems[index].unshift(item) } else { indexedItems[index].push(item) } delete item[indexParameterName] } }); objectUtils.orderEach(indexedItems, function(index, items) { $.each(items, function() { if (index >= 0) { this[indexParameterName] = parameterIndex++ } }) }); $.each(items, function() { if (!commonUtils.isDefined(this[indexParameterName]) && (!needIndexCallback || needIndexCallback(this))) { this[indexParameterName] = parameterIndex++ } }); return parameterIndex }; var inArray = function(value, object) { if (!object) { return -1 } var array = Array.isArray(object) ? object : object.toArray(); return array.indexOf(value) }; exports.isEmpty = isEmpty; exports.wrapToArray = wrapToArray; exports.intersection = intersection; exports.removeDuplicates = removeDuplicates; exports.normalizeIndexes = normalizeIndexes; exports.inArray = inArray }, /*!*********************************!*\ !*** ./js/core/utils/object.js ***! \*********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ./common */ 14), typeUtils = __webpack_require__( /*! ./type */ 12), variableWrapper = __webpack_require__( /*! ./variable_wrapper */ 28); var clone = function() { function Clone() {} return function(obj) { Clone.prototype = obj; return new Clone } }(); var orderEach = function(map, func) { var key, i, keys = []; for (key in map) { if (map.hasOwnProperty(key)) { keys.push(key) } } keys.sort(function(x, y) { var isNumberX = commonUtils.isNumeric(x), isNumberY = commonUtils.isNumeric(y); if (isNumberX && isNumberY) { return x - y } if (isNumberX && !isNumberY) { return -1 } if (!isNumberX && isNumberY) { return 1 } if (x < y) { return -1 } if (x > y) { return 1 } return 0 }); for (i = 0; i < keys.length; i++) { key = keys[i]; func(key, map[key]) } }; var assignValueToProperty = function(target, property, value, assignByReference) { if (!assignByReference && variableWrapper.isWrapped(target[property])) { variableWrapper.assign(target[property], value) } else { target[property] = value } }; var deepExtendArraySafe = function(target, changes, extendComplexObject, assignByReference) { var prevValue, newValue; for (var name in changes) { prevValue = target[name]; newValue = changes[name]; if (target === newValue) { continue } if (typeUtils.isPlainObject(newValue) && !(newValue instanceof $.Event)) { var goDeeper = extendComplexObject ? commonUtils.isObject(prevValue) : typeUtils.isPlainObject(prevValue); newValue = deepExtendArraySafe(goDeeper ? prevValue : {}, newValue, extendComplexObject, assignByReference) } if (void 0 !== newValue) { assignValueToProperty(target, name, newValue, assignByReference) } } return target }; exports.clone = clone; exports.orderEach = orderEach; exports.deepExtendArraySafe = deepExtendArraySafe }, /*!*******************************************!*\ !*** ./js/core/utils/variable_wrapper.js ***! \*******************************************/ function(module, exports, __webpack_require__) { var logger = __webpack_require__( /*! ./console */ 13).logger, dependencyInjector = __webpack_require__( /*! ./dependency_injector */ 29); module.exports = dependencyInjector({ isWrapped: function() { return false }, isWritableWrapped: function() { return false }, wrap: function(value) { return value }, unwrap: function(value) { return value }, assign: function() { logger.error("Method 'assign' should not be used for not wrapped variables. Use 'isWrapped' method for ensuring.") } }) }, /*!**********************************************!*\ !*** ./js/core/utils/dependency_injector.js ***! \**********************************************/ function(module, exports, __webpack_require__) { module.exports = function(object) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), extend = __webpack_require__( /*! ./extend */ 11).extend, isFunction = __webpack_require__( /*! ./common */ 14).isFunction, Class = __webpack_require__( /*! ../class */ 25); var BaseClass = Class.inherit(object), InjectedClass = BaseClass, instance = new InjectedClass(object), initialFields = {}; var injectFields = function(injectionObject, initial) { $.each(injectionObject, function(key) { if (isFunction(instance[key])) { if (initial || !object[key]) { object[key] = function() { return instance[key].apply(object, arguments) } } } else { if (initial) { initialFields[key] = object[key] } object[key] = instance[key] } }) }; injectFields(object, true); object.inject = function(injectionObject) { InjectedClass = InjectedClass.inherit(injectionObject); instance = new InjectedClass; injectFields(injectionObject) }; object.resetInjection = function() { extend(object, initialFields); InjectedClass = BaseClass; instance = new BaseClass }; return object } }, /*!*******************************!*\ !*** external "window.JSZip" ***! \*******************************/ function(module, exports) { module.exports = window.JSZip }, /*!******************************************************!*\ !*** ./js/client_exporter/excel_format_converter.js ***! \******************************************************/ function(module, exports, __webpack_require__) { var commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), stringUtils = __webpack_require__( /*! ../core/utils/string */ 18), numberFormatter = __webpack_require__( /*! ../localization/number */ 32), dateLocalization = __webpack_require__( /*! ../localization/date */ 33), getLanguageID = __webpack_require__( /*! ../localization/language_codes */ 35).getLanguageId, UNSUPPORTED_FORMAT_MAPPING = { quarter: "shortDate", quarterAndYear: "shortDate", minute: "longTime", millisecond: "longTime" }, FORMAT_SEPARATORS = " .,:;/\\<>()-", ARABIC_ZERO_CODE = 1632, DEFINED_NUMBER_FORMTATS = { thousands: "#,##0{0},"K"", millions: "#,##0{0},,"M"", billions: "#,##0{0},,,"B"", trillions: "#,##0{0},,,,"T"", percent: "0{0}%", decimal: "#{0}", fixedpoint: "#,##0{0}", exponential: "0{0}E+00", currency: " " }; __webpack_require__( /*! ../localization/currency */ 36); var excelFormatConverter = module.exports = { _applyPrecision: function(format, precision) { var result, i; if (precision > 0) { result = "decimal" !== format ? "." : ""; for (i = 0; i < precision; i++) { result += "0" } return result } return "" }, _getCurrencyFormat: function(currency) { return numberFormatter.getOpenXmlCurrencyFormat(currency) }, _isDigit: function(char) { var code = char && char.charCodeAt(0); return char >= "0" && char <= "9" || code >= ARABIC_ZERO_CODE && code < ARABIC_ZERO_CODE + 10 }, _getDifference: function(defaultPattern, patterns, processedIndexes) { var isDigit, i = 0, that = this, result = []; var patternsFilter = function(pattern) { return defaultPattern[i] !== pattern[i] }; if (!Array.isArray(patterns)) { patterns = [patterns] } for (i = 0; i < defaultPattern.length; i++) { if (processedIndexes.indexOf(i) < 0 && patterns.filter(patternsFilter).length) { do { isDigit = that._isDigit(defaultPattern[i]); if (!result.length && !isDigit && that._isDigit(patterns[0][i])) { break } result.push(i); processedIndexes.unshift(i); i++ } while (defaultPattern[i] && FORMAT_SEPARATORS.indexOf(defaultPattern[i]) < 0 && isDigit === that._isDigit(defaultPattern[i])); break } } if (1 === result.length && ("0" === defaultPattern[processedIndexes[0] - 1] || "Ù " === defaultPattern[processedIndexes[0] - 1])) { processedIndexes.unshift(processedIndexes[0] - 1) } return result }, _replaceCharsCore: function(pattern, indexes, char, patternPositions) { var baseCharIndex = indexes[0]; var patternIndex = baseCharIndex < patternPositions.length ? patternPositions[baseCharIndex] : baseCharIndex; indexes.forEach(function(_, index) { pattern = pattern.substr(0, patternIndex + index) + (char.length > 1 ? char[index] : char) + pattern.substr(patternIndex + index + 1) }); if (1 === indexes.length) { pattern = pattern.replace("0" + char, char + char); pattern = pattern.replace("Ù " + char, char + char) } return pattern }, _replaceChars: function(pattern, indexes, char, patternPositions) { var i, index, patternIndex; if (!this._isDigit(pattern[indexes[0]] || "0")) { var letterCount = Math.max(indexes.length <= 3 ? 3 : 4, char.length); while (indexes.length > letterCount) { index = indexes.pop(); patternIndex = patternPositions[index]; patternPositions[index] = -1; for (i = index + 1; i < patternPositions.length; i++) { patternPositions[i]-- } pattern = pattern.substr(0, patternIndex) + pattern.substr(patternIndex + 1) } index = indexes[indexes.length - 1] + 1, patternIndex = index < patternPositions.length ? patternPositions[index] : index; while (indexes.length < letterCount) { indexes.push(indexes[indexes.length - 1] + 1); for (i = index; i < patternPositions.length; i++) { patternPositions[i]++ } pattern = pattern.substr(0, patternIndex) + " " + pattern.substr(patternIndex) } } pattern = this._replaceCharsCore(pattern, indexes, char, patternPositions); return pattern }, _format: function(value, format) { if (Array.isArray(value)) { return value.map(function(value) { return (dateLocalization.format(value, format) || "").toString() }) } return (dateLocalization.format(value, format) || "").toString() }, _escapeChars: function(pattern, defaultPattern, processedIndexes, patternPositions) { var escapeIndexes = defaultPattern.split("").map(function(char, index) { if (processedIndexes.indexOf(index) < 0 && (FORMAT_SEPARATORS.indexOf(char) < 0 || "/" === char)) { return patternPositions[index] } return -1 }); pattern = pattern.split("").map(function(char, index) { if (escapeIndexes.indexOf(index) >= 0) { return "\\" + char } return char }).join(""); pattern = pattern.replace("AM\\/PM", "AM/PM"); return pattern }, _hasArabicDigits: function(text) { var code; for (var i = 0; i < text.length; i++) { code = text.charCodeAt(i); if (code >= ARABIC_ZERO_CODE && code < ARABIC_ZERO_CODE + 10) { return true } } return false }, _convertDateFormat: function(format) { format = UNSUPPORTED_FORMAT_MAPPING[format && format.type || format] || format; var that = this, processedIndexes = [], defaultPattern = that._format(new Date(2009, 8, 8, 6, 5, 4), format), patternPositions = defaultPattern.split("").map(function(_, index) { return index }), result = defaultPattern, datePatterns = [{ date: new Date(2009, 8, 8, 6, 5, 2), pattern: "s" }, { date: new Date(2009, 8, 8, 6, 2, 4), pattern: "m" }, { date: new Date(2009, 8, 8, 2, 5, 4), pattern: "H" }, { date: new Date(2009, 8, 8, 18, 5, 4), pattern: "AM/PM" }, { date: new Date(2009, 8, 1, 6, 5, 4), pattern: "d" }, { date: [new Date(2009, 8, 2, 6, 5, 4), new Date(2009, 8, 3, 6, 5, 4), new Date(2009, 8, 4, 6, 5, 4)], pattern: "d" }, { date: new Date(2009, 9, 6, 6, 5, 4), pattern: "M" }, { date: new Date(1998, 8, 8, 6, 5, 4), pattern: "y" }]; if (!result) { return } datePatterns.forEach(function(test) { var diff = that._getDifference(defaultPattern, that._format(test.date, format), processedIndexes); result = that._replaceChars(result, diff, test.pattern, patternPositions) }); result = that._escapeChars(result, defaultPattern, processedIndexes, patternPositions); result = that._getLanguageInfo(defaultPattern) + result; return result }, _getLanguageInfo: function(defaultPattern) { var languageID = getLanguageID(), languageIDStr = languageID ? languageID.toString(16) : "", languageInfo = ""; if (this._hasArabicDigits(defaultPattern)) { while (languageIDStr.length < 3) { languageIDStr = "0" + languageIDStr } languageInfo = "[$-2010" + languageIDStr + "]" } else { if (languageIDStr) { languageInfo = "[$-" + languageIDStr + "]" } } return languageInfo }, _convertNumberFormat: function(format, precision, currency) { var result, excelFormat = "currency" === format ? this._getCurrencyFormat(currency) : DEFINED_NUMBER_FORMTATS[format.toLowerCase()]; if (excelFormat) { result = stringUtils.format(excelFormat, this._applyPrecision(format, precision)) } return result }, convertFormat: function(format, precision, type, currency) { if (commonUtils.isDefined(format)) { if ("date" === type) { return excelFormatConverter._convertDateFormat(format) } else { if (commonUtils.isString(format) && DEFINED_NUMBER_FORMTATS[format.toLowerCase()]) { return excelFormatConverter._convertNumberFormat(format, precision, currency) } } } } } }, /*!***********************************!*\ !*** ./js/localization/number.js ***! \***********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), dependencyInjector = __webpack_require__( /*! ../core/utils/dependency_injector */ 29), inArray = __webpack_require__( /*! ../core/utils/array */ 26).inArray, isPlainObject = __webpack_require__( /*! ../core/utils/type */ 12).isPlainObject, errors = __webpack_require__( /*! ../core/errors */ 7); var MAX_LARGE_NUMBER_POWER = 4, DECIMAL_BASE = 10; var NUMERIC_FORMATS = ["currency", "fixedpoint", "exponential", "percent", "decimal"]; var LargeNumberFormatPostfixes = { 1: "K", 2: "M", 3: "B", 4: "T" }; var LargeNumberFormatPowers = { largenumber: "auto", thousands: 1, millions: 2, billions: 3, trillions: 4 }; var numberLocalization = dependencyInjector({ numericFormats: NUMERIC_FORMATS, defaultLargeNumberFormatPostfixes: LargeNumberFormatPostfixes, _parseNumberFormatString: function(formatType) { var formatList, formatObject = {}; if (!formatType || "string" !== typeof formatType) { return } formatList = formatType.split(" "); $.each(formatList, function(index, value) { if (inArray(value, NUMERIC_FORMATS) > -1) { formatObject.formatType = value } else { if (value in LargeNumberFormatPowers) { formatObject.power = LargeNumberFormatPowers[value] } } }); if (formatObject.power && !formatObject.formatType) { formatObject.formatType = "fixedpoint" } if (formatObject.formatType) { return formatObject } }, _calculateNumberPower: function(value, base, minPower, maxPower) { var number = Math.abs(value), power = 0; if (number > 1) { while (number && number >= base && (void 0 === maxPower || power < maxPower)) { power++; number /= base } } else { if (number > 0 && number < 1) { while (number < 1 && (void 0 === minPower || power > minPower)) { power--; number *= base } } } return power }, _getNumberByPower: function(number, power, base) { var result = number; while (power > 0) { result /= base; power-- } while (power < 0) { result *= base; power++ } return result }, _formatNumber: function(value, formatObject, formatConfig) { var powerPostfix; var result; if ("auto" === formatObject.power) { formatObject.power = this._calculateNumberPower(value, 1e3, 0, MAX_LARGE_NUMBER_POWER) } if (formatObject.power) { value = this._getNumberByPower(value, formatObject.power, 1e3) } powerPostfix = this.defaultLargeNumberFormatPostfixes[formatObject.power] || ""; result = this._formatNumberCore(value, formatObject.formatType, formatConfig); result = result.replace(/(\d|.$)(\D*)$/, "$1" + powerPostfix + "$2"); return result }, _formatNumberExponential: function(value, formatConfig) { var powString, power = this._calculateNumberPower(value, DECIMAL_BASE), number = this._getNumberByPower(value, power, DECIMAL_BASE); if (void 0 === formatConfig.precision) { formatConfig.precision = 1 } if (number.toFixed(formatConfig.precision || 0) >= DECIMAL_BASE) { power++; number /= DECIMAL_BASE } powString = (power >= 0 ? "+" : "") + power.toString(); return this._formatNumberCore(number, "fixedpoint", formatConfig) + "E" + powString }, _addZeroes: function(value, precision) { var multiplier = Math.pow(10, precision); value = (value * multiplier >>> 0) / multiplier; var result = value.toString(); while (result.length < precision) { result = "0" + result } return result }, _addGroupSeparators: function(value) { var parts = value.toString().split("."); return parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",") + (parts[1] ? "." + parts[1] : "") }, _formatNumberCore: function(value, format, formatConfig) { if ("exponential" === format) { return this._formatNumberExponential(value, formatConfig) } if ("decimal" !== format && null !== formatConfig.precision) { formatConfig.precision = formatConfig.precision || 0 } if ("percent" === format) { value = 100 * value } if (void 0 !== formatConfig.precision) { if ("decimal" === format) { value = this._addZeroes(value, formatConfig.precision) } else { value = null === formatConfig.precision ? value.toPrecision() : value.toFixed(formatConfig.precision) } } if ("decimal" !== format) { value = this._addGroupSeparators(value) } if ("percent" === format) { value += "%" } return value.toString() }, _normalizeFormat: function(format) { if (!format) { return {} } if ("function" === typeof format) { return format } if (!isPlainObject(format)) { format = { type: format } } if (format.type) { format.type = format.type.toLowerCase() } return format }, format: function(value, format) { if ("number" !== typeof value) { return value } if ("number" === typeof format) { return value } format = format && format.formatter || format; if ("function" === typeof format) { return format(value) } format = this._normalizeFormat(format); if (!format.type) { format.type = "decimal" } var numberConfig = this._parseNumberFormatString(format.type); if (!numberConfig) { return } return this._formatNumber(value, numberConfig, format) }, parse: function(text, format) { if (!text) { return } if (format && format.parser) { return format.parser(text) } if (format) { errors.log("W0011") } return parseFloat(text.replace(/^\D+|,+/g, "")) } }); module.exports = numberLocalization }, /*!*********************************!*\ !*** ./js/localization/date.js ***! \*********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), numberLocalization = __webpack_require__( /*! ./number */ 32), dependencyInjector = __webpack_require__( /*! ../core/utils/dependency_injector */ 29), isString = __webpack_require__( /*! ../core/utils/common */ 14).isString, inArray = __webpack_require__( /*! ../core/utils/array */ 26).inArray, errors = __webpack_require__( /*! ../core/errors */ 7); __webpack_require__( /*! ./core */ 34); var FORMATS_TO_PATTERN_MAP = { shortdate: "M/d/y", shorttime: "h:mm a", longdate: "EEEE, MMMM d, y", longtime: "h:mm:ss a", monthandday: "MMMM d", monthandyear: "MMMM y", quarterandyear: "QQQ y", day: "d", year: "y", shortdateshorttime: "M/d/y, h:mm a", mediumdatemediumtime: "MMMM d, h:mm a", longdatelongtime: "EEEE, MMMM d, y, h:mm:ss a", month: "LLLL", shortyear: "yy", dayofweek: "EEEE", quarter: "QQQ", hour: "HH", minute: "mm", second: "ss", millisecond: "SSS", "datetime-local": "yyyy-MM-ddTHH':'mm':'ss" }; var parseTime = function(text) { var now = new Date, parts = text.split(" "), time = parts[0].split(":"), hours = Number(time[0]), minutes = Number(time[1]), second = Number(time[2]) || 0, pm = /^pm$/i.test(parts[1]), isValid = second < 60 && minutes < 60 && hours > 0 && hours < 13; if (!isValid) { return null } if (!pm && 12 === hours) { hours = 0 } if (pm && 12 !== hours) { hours += 12 } return new Date(now.getFullYear(), now.getMonth(), now.getDate(), hours, minutes, second) }; var removeTimezoneOffset = function(date) { return new Date(date.valueOf() + 60 * date.getTimezoneOffset() * 1e3) }; var months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; var amPm = function(date) { return date.getHours() >= 12 ? "PM" : "AM" }; var getTwelveHourTimeFormat = function(hours) { return hours % 12 || 12 }; var formatNumber = function(number, precision) { return numberLocalization.format(number, { type: "decimal", precision: precision }) }; var FORMATTERS = { millisecond: function(date) { return formatNumber(date.getMilliseconds(date), 3) }, second: function(date) { return formatNumber(date.getSeconds(), 2) }, minute: function(date) { return formatNumber(date.getMinutes(), 2) }, h: function(date) { return formatNumber(getTwelveHourTimeFormat(date.getHours()), 1) }, hh: function(date) { return formatNumber(getTwelveHourTimeFormat(date.getHours()), 2) }, hour: function(date) { return formatNumber(date.getHours(), 2) }, day: function(date) { return String(date.getDate()) }, dayofweek: function(date) { return days[date.getDay()] }, M: function(date) { return date.getMonth() + 1 }, MM: function(date) { return formatNumber(date.getMonth() + 1, 2) }, month: function(date) { return months[date.getMonth()] }, year: function(date) { return String(date.getFullYear()) }, shortyear: function(date) { return String(date.getFullYear()).substr(2, 2) }, shorttime: function(date) { return FORMATTERS.h(date) + ":" + FORMATTERS.minute(date) + " " + amPm(date) }, shortdate: function(date) { return [FORMATTERS.M(date), FORMATTERS.day(date), FORMATTERS.year(date)].join("/") }, shortdateshorttime: function(date) { return [FORMATTERS.shortdate(date), FORMATTERS.shorttime(date)].join(", ") }, mediumdatemediumtime: function(date) { return [FORMATTERS.monthandday(date), FORMATTERS.shorttime(date)].join(", ") }, monthandyear: function(date) { return [FORMATTERS.month(date), FORMATTERS.year(date)].join(" ") }, monthandday: function(date) { return [FORMATTERS.month(date), FORMATTERS.day(date)].join(" ") }, longdate: function(date) { return FORMATTERS.dayofweek(date) + ", " + FORMATTERS.month(date) + " " + FORMATTERS.day(date) + ", " + FORMATTERS.year(date) }, longtime: function(date) { return [FORMATTERS.h(date), FORMATTERS.minute(date), FORMATTERS.second(date)].join(":") + " " + amPm(date) }, longdatelongtime: function(date) { return [FORMATTERS.longdate(date), FORMATTERS.longtime(date)].join(", ") }, d: function(date) { return formatNumber(date.getDate(), 1) }, dd: function(date) { return formatNumber(date.getDate(), 2) }, "d MMMM": function(date) { return FORMATTERS.day(date) + " " + FORMATTERS.month(date) }, "yyyy/M/d": function(date) { return [FORMATTERS.year(date), FORMATTERS.M(date), FORMATTERS.day(date)].join("/") }, "yyyy/MM/dd": function(date) { return [FORMATTERS.year(date), FORMATTERS.MM(date), FORMATTERS.dd(date)].join("/") }, "dd.MM.yyyy": function(date) { return [FORMATTERS.dd(date), FORMATTERS.MM(date), FORMATTERS.year(date)].join(".") }, "HH:mm": function(date) { return [FORMATTERS.hour(date), FORMATTERS.minute(date)].join(":") }, "HH:mm:ss": function(date) { return [FORMATTERS["HH:mm"](date), FORMATTERS.second(date)].join(":") }, "h:mm:ss": function(date) { return [FORMATTERS.h(date), FORMATTERS.minute(date), FORMATTERS.second(date)].join(":") }, "h:mm:ss:SSS": function(date) { return [FORMATTERS.h(date), FORMATTERS.minute(date), FORMATTERS.second(date), FORMATTERS.SSS(date)].join(":") }, "yyyy/MM/dd HH:mm:ss": function(date) { return [FORMATTERS["yyyy/MM/dd"](date), FORMATTERS["HH:mm:ss"](date)].join(" ") }, "yyyy-MM-dd hh:mm:ss.SSS a": function(date) { return [ [FORMATTERS.year(date), FORMATTERS.MM(date), FORMATTERS.dd(date)].join("-"), [FORMATTERS.hh(date), FORMATTERS.minute(date), FORMATTERS.second(date)].join(":") + "." + FORMATTERS.SSS(date), amPm(date) ].join(" ") }, "yyyy-MM-dd": function(date) { return [FORMATTERS.year(date), FORMATTERS.MM(date), FORMATTERS.dd(date)].join("-") }, yyyyMMddTHHmmss: function(date) { return [FORMATTERS.year(date), FORMATTERS.MM(date), FORMATTERS.dd(date), "T", FORMATTERS.hour(date), FORMATTERS.minute(date), FORMATTERS.second(date)].join("") }, "datetime-local": function(date) { return FORMATTERS["yyyy-MM-dd"](date) + "T" + FORMATTERS["HH:mm:ss"](date) }, "yyyy-MM-ddTHH:mm:ssZ": function(date) { return FORMATTERS["datetime-local"](date) + "Z" }, "yyyy-MM-ddTHH:mmZ": function(date) { return FORMATTERS["yyyy-MM-dd"](date) + "T" + FORMATTERS.hour(date) + ":" + FORMATTERS.minute(date) + "Z" }, "dd/MM/yyyy": function(date) { return [FORMATTERS.dd(date), FORMATTERS.MM(date), FORMATTERS.year(date)].join("/") }, "yyyy MMMM d": function(date) { return [FORMATTERS.year(date), FORMATTERS.month(date), FORMATTERS.day(date)].join(" ") }, "EEEE, d": function(date) { return [FORMATTERS.dayofweek(date), FORMATTERS.d(date)].join(", ") }, "EEEE MM yy": function(date) { return [FORMATTERS.dayofweek(date), FORMATTERS.MM(date), FORMATTERS.shortyear(date)].join(" ") }, "d MMMM yyyy": function(date) { return [FORMATTERS.day(date), FORMATTERS.month(date), FORMATTERS.year(date)].join(" ") }, E: function(date) { return cutCaptions([FORMATTERS.dayofweek(date)], "abbreviated")[0] }, EEE: function(date) { return FORMATTERS.E(date) }, "EEE hh": function(date) { return [FORMATTERS.EEE(date), FORMATTERS.hh(date)].join(" ") }, "ss SSS": function(date) { return [FORMATTERS.second(date), FORMATTERS.SSS(date)].join(" ") }, quarter: function(date) { var month = date.getMonth(); if (month >= 0 && month < 3) { return "Q1" } if (month > 2 && month < 6) { return "Q2" } if (month > 5 && month < 9) { return "Q3" } return "Q4" }, quarterandyear: function(date) { return FORMATTERS.quarter(date) + " " + FORMATTERS.year(date) } }; var parseWithoutTimezone = function(text) { if ("Z" !== text.slice(-1)) { text += "Z" } return removeTimezoneOffset(new Date(text)) }; var PARSERS = { day: function(text) { var now = new Date; return new Date(now.getFullYear(), now.getMonth(), Number(text)) }, hour: function(text) { var now = new Date; return new Date(now.getFullYear(), now.getMonth(), now.getDate(), Number(text)) }, minute: function(text) { var now = new Date; return new Date(now.getFullYear(), now.getMonth(), now.getDate(), now.getHours(), Number(text)) }, month: function(text) { return new Date((new Date).getFullYear(), inArray(text, months)) }, monthandday: function(text) { var parts = text.split(" "), result = PARSERS.month(parts[0]); result.setDate(Number(parts[1])); return result }, monthandyear: function(text) { var parts = text.split(" "), result = PARSERS.month(parts[0]); result.setYear(Number(parts[1])); return result }, year: function(text) { var date = new Date(new Date(0)); date.setUTCFullYear(Number(text)); return removeTimezoneOffset(date) }, second: function(text) { var now = new Date; return new Date(now.getFullYear(), now.getMonth(), now.getDate(), now.getHours(), now.getMinutes(), Number(text)) }, shortyear: function(text) { var MAX_YEAR_IN_XXI_CENTURY = 36; var year = Number(text); if (year > MAX_YEAR_IN_XXI_CENTURY) { year += 1900 } else { year += 2e3 } return PARSERS.year(year) }, shortdate: function(text) { if (!/^(0?[1-9]|1[012])\/(0?[1-9]|[12][0-9]|3[01])\/\d{1,4}/.test(text)) { return } var parts = text.split("/"); var date = new Date(Number(parts[2]), Number(parts[0]) - 1, Number(parts[1])); if (parts[2].length < 3) { date.setFullYear(Number(parts[2]), Number(parts[0]) - 1, Number(parts[1])) } return date }, longtime: function(text) { return parseTime(text) }, shorttime: function(text) { return parseTime(text) }, millisecond: function(text) { return new Date(Number(text)) }, "yyyy MMMM d": function(text) { var parts = text.split(" "); if (3 !== parts.length) { return } return new Date(Number(parts[0]), inArray(parts[1], months), Number(parts[2])) }, "HH:mm": function(text) { var parts = text.split(":"); return new Date(0, 0, 0, Number(parts[0]), Number(parts[1]), 0, 0) }, "yyyy-MM-ddTHH:mm:ssZ": parseWithoutTimezone, "yyyy-MM-ddTHH:mmZ": parseWithoutTimezone, "datetime-local": parseWithoutTimezone, mediumdatemediumtime: function(text) { var parts = text.split(", "), dateParts = parts[0].split(" "), timeParts = parts[1].split(" "); var amPm = 2 === timeParts.length ? timeParts.pop() : void 0; var result = PARSERS.month(dateParts[0]); result.setDate(Number(dateParts[1])); timeParts = timeParts[0].split(":"); var hours = Number(timeParts[0]); switch (String(amPm).toLowerCase()) { case "am": hours = 12 === hours ? 0 : hours; break; case "pm": hours = 12 === hours ? 12 : hours + 12 } result.setHours(hours); result.setMinutes(Number(timeParts[1])); return result } }; $.each(FORMATS_TO_PATTERN_MAP, function(key, value) { value = value.replace(/'/g, ""); FORMATTERS[value] = FORMATTERS[key]; PARSERS[value] = PARSERS[key] }); var getByFormat = function(obj, format) { return isString(format) && (obj[format.toLowerCase()] || obj[format.replace(/'/g, "")]) }; var cutCaptions = function(captions, format) { var lengthByFormat = { abbreviated: 3, "short": 2, narrow: 1 }; return $.map(captions, function(caption) { return caption.substr(0, lengthByFormat[format]) }) }; var possiblePartPatterns = { year: ["y", "yy", "yyyy"], day: ["d", "dd"], month: ["M", "MM", "MMM", "MMMM"], hours: ["H", "HH", "h", "hh", "ah"], minutes: ["m", "mm"], seconds: ["s", "ss"], milliseconds: ["S", "SS", "SSS"] }; var dateLocalization = dependencyInjector({ _getPatternByFormat: function(format) { return FORMATS_TO_PATTERN_MAP[format.toLowerCase()] }, _expandPattern: function(pattern) { return this._getPatternByFormat(pattern) || pattern }, formatUsesMonthName: function(format) { return this._expandPattern(format).indexOf("MMMM") !== -1 }, formatUsesDayName: function(format) { return this._expandPattern(format).indexOf("EEEE") !== -1 }, getFormatParts: function(format) { var pattern = this._getPatternByFormat(format) || format, result = []; $.each(pattern.split(/\W+/), function(_, formatPart) { $.each(possiblePartPatterns, function(partName, possiblePatterns) { if (inArray(formatPart, possiblePatterns) > -1) { result.push(partName) } }) }); return result }, getMonthNames: function(format) { return cutCaptions(months, format) }, getDayNames: function(format) { return cutCaptions(days, format) }, getTimeSeparator: function() { return ":" }, format: function(date, format) { if (!date) { return } if (!format) { return date } var formatter; if ("function" === typeof format) { formatter = format } else { if (format.formatter) { formatter = format.formatter } else { format = format.type || format; formatter = getByFormat(FORMATTERS, format) } } if (!formatter) { return } return formatter(date) }, parse: function(text, format) { var result, parser; if (!text) { return } if (!format) { return new Date(text) } if (format.parser) { return format.parser(text) } if (format.type || format.formatter) { format = format.type } if (format && "function" !== typeof format) { parser = getByFormat(PARSERS, format) } if (parser) { result = parser(text) } else { errors.log("W0012"); result = new Date(text) } if (!result || isNaN(result.getTime())) { return } return result }, firstDayOfWeekIndex: function() { return 0 } }); module.exports = dateLocalization }, /*!*********************************!*\ !*** ./js/localization/core.js ***! \*********************************/ function(module, exports, __webpack_require__) { var dependencyInjector = __webpack_require__( /*! ../core/utils/dependency_injector */ 29); module.exports = dependencyInjector({ locale: function() { var currentLocale = "en"; return function(locale) { if (!locale) { return currentLocale } currentLocale = locale } }() }) }, /*!*******************************************!*\ !*** ./js/localization/language_codes.js ***! \*******************************************/ function(module, exports, __webpack_require__) { var locale = __webpack_require__( /*! ./core */ 34).locale, LANGUAGE_CODES = { ar: 1, bg: 2, ca: 3, "zh-Hans": 4, cs: 5, da: 6, de: 7, el: 8, en: 9, es: 10, fi: 11, fr: 12, he: 13, hu: 14, is: 15, it: 16, ja: 17, ko: 18, nl: 19, no: 20, pl: 21, pt: 22, rm: 23, ro: 24, ru: 25, hr: 26, sk: 27, sq: 28, sv: 29, th: 30, tr: 31, ur: 32, id: 33, uk: 34, be: 35, sl: 36, et: 37, lv: 38, lt: 39, tg: 40, fa: 41, vi: 42, hy: 43, az: 44, eu: 45, hsb: 46, mk: 47, tn: 50, xh: 52, zu: 53, af: 54, ka: 55, fo: 56, hi: 57, mt: 58, se: 59, ga: 60, ms: 62, kk: 63, ky: 64, sw: 65, tk: 66, uz: 67, tt: 68, bn: 69, pa: 70, gu: 71, or: 72, ta: 73, te: 74, kn: 75, ml: 76, as: 77, mr: 78, sa: 79, mn: 80, bo: 81, cy: 82, km: 83, lo: 84, gl: 86, kok: 87, syr: 90, si: 91, iu: 93, am: 94, tzm: 95, ne: 97, fy: 98, ps: 99, fil: 100, dv: 101, ha: 104, yo: 106, quz: 107, nso: 108, ba: 109, lb: 110, kl: 111, ig: 112, ii: 120, arn: 122, moh: 124, br: 126, ug: 128, mi: 129, oc: 130, co: 131, gsw: 132, sah: 133, qut: 134, rw: 135, wo: 136, prs: 140, gd: 145, "ar-SA": 1025, "bg-BG": 1026, "ca-ES": 1027, "zh-TW": 1028, "cs-CZ": 1029, "da-DK": 1030, "de-DE": 1031, "el-GR": 1032, "en-US": 1033, "fi-FI": 1035, "fr-FR": 1036, "he-IL": 1037, "hu-HU": 1038, "is-IS": 1039, "it-IT": 1040, "ja-JP": 1041, "ko-KR": 1042, "nl-NL": 1043, "nb-NO": 1044, "pl-PL": 1045, "pt-BR": 1046, "rm-CH": 1047, "ro-RO": 1048, "ru-RU": 1049, "hr-HR": 1050, "sk-SK": 1051, "sq-AL": 1052, "sv-SE": 1053, "th-TH": 1054, "tr-TR": 1055, "ur-PK": 1056, "id-ID": 1057, "uk-UA": 1058, "be-BY": 1059, "sl-SI": 1060, "et-EE": 1061, "lv-LV": 1062, "lt-LT": 1063, "tg-Cyrl-TJ": 1064, "fa-IR": 1065, "vi-VN": 1066, "hy-AM": 1067, "az-Latn-AZ": 1068, "eu-ES": 1069, "hsb-DE": 1070, "mk-MK": 1071, "tn-ZA": 1074, "xh-ZA": 1076, "zu-ZA": 1077, "af-ZA": 1078, "ka-GE": 1079, "fo-FO": 1080, "hi-IN": 1081, "mt-MT": 1082, "se-NO": 1083, "ms-MY": 1086, "kk-KZ": 1087, "ky-KG": 1088, "sw-KE": 1089, "tk-TM": 1090, "uz-Latn-UZ": 1091, "tt-RU": 1092, "bn-IN": 1093, "pa-IN": 1094, "gu-IN": 1095, "or-IN": 1096, "ta-IN": 1097, "te-IN": 1098, "kn-IN": 1099, "ml-IN": 1100, "as-IN": 1101, "mr-IN": 1102, "sa-IN": 1103, "mn-MN": 1104, "bo-CN": 1105, "cy-GB": 1106, "km-KH": 1107, "lo-LA": 1108, "gl-ES": 1110, "kok-IN": 1111, "syr-SY": 1114, "si-LK": 1115, "iu-Cans-CA": 1117, "am-ET": 1118, "ne-NP": 1121, "fy-NL": 1122, "ps-AF": 1123, "fil-PH": 1124, "dv-MV": 1125, "ha-Latn-NG": 1128, "yo-NG": 1130, "quz-BO": 1131, "nso-ZA": 1132, "ba-RU": 1133, "lb-LU": 1134, "kl-GL": 1135, "ig-NG": 1136, "ii-CN": 1144, "arn-CL": 1146, "moh-CA": 1148, "br-FR": 1150, "ug-CN": 1152, "mi-NZ": 1153, "oc-FR": 1154, "co-FR": 1155, "gsw-FR": 1156, "sah-RU": 1157, "qut-GT": 1158, "rw-RW": 1159, "wo-SN": 1160, "prs-AF": 1164, "gd-GB": 1169, "ar-IQ": 2049, "zh-CN": 2052, "de-CH": 2055, "en-GB": 2057, "es-MX": 2058, "fr-BE": 2060, "it-CH": 2064, "nl-BE": 2067, "nn-NO": 2068, "pt-PT": 2070, "sr-Latn-CS": 2074, "sv-FI": 2077, "az-Cyrl-AZ": 2092, "dsb-DE": 2094, "se-SE": 2107, "ga-IE": 2108, "ms-BN": 2110, "uz-Cyrl-UZ": 2115, "bn-BD": 2117, "mn-Mong-CN": 2128, "iu-Latn-CA": 2141, "tzm-Latn-DZ": 2143, "quz-EC": 2155, "ar-EG": 3073, "zh-HK": 3076, "de-AT": 3079, "en-AU": 3081, "es-ES": 3082, "fr-CA": 3084, "sr-Cyrl-CS": 3098, "se-FI": 3131, "quz-PE": 3179, "ar-LY": 4097, "zh-SG": 4100, "de-LU": 4103, "en-CA": 4105, "es-GT": 4106, "fr-CH": 4108, "hr-BA": 4122, "smj-NO": 4155, "ar-DZ": 5121, "zh-MO": 5124, "de-LI": 5127, "en-NZ": 5129, "es-CR": 5130, "fr-LU": 5132, "bs-Latn-BA": 5146, "smj-SE": 5179, "ar-MA": 6145, "en-IE": 6153, "es-PA": 6154, "fr-MC": 6156, "sr-Latn-BA": 6170, "sma-NO": 6203, "ar-TN": 7169, "en-ZA": 7177, "es-DO": 7178, "sr-Cyrl-BA": 7194, "sma-SE": 7227, "ar-OM": 8193, "en-JM": 8201, "es-VE": 8202, "bs-Cyrl-BA": 8218, "sms-FI": 8251, "ar-YE": 9217, "en-029": 9225, "es-CO": 9226, "sr-Latn-RS": 9242, "smn-FI": 9275, "ar-SY": 10241, "en-BZ": 10249, "es-PE": 10250, "sr-Cyrl-RS": 10266, "ar-JO": 11265, "en-TT": 11273, "es-AR": 11274, "sr-Latn-ME": 11290, "ar-LB": 12289, "en-ZW": 12297, "es-EC": 12298, "sr-Cyrl-ME": 12314, "ar-KW": 13313, "en-PH": 13321, "es-CL": 13322, "ar-AE": 14337, "es-UY": 14346, "ar-BH": 15361, "es-PY": 15370, "ar-QA": 16385, "en-IN": 16393, "es-BO": 16394, "en-MY": 17417, "es-SV": 17418, "en-SG": 18441, "es-HN": 18442, "es-NI": 19466, "es-PR": 20490, "es-US": 21514, "bs-Cyrl": 25626, "bs-Latn": 26650, "sr-Cyrl": 27674, "sr-Latn": 28698, smn: 28731, "az-Cyrl": 29740, sms: 29755, zh: 30724, nn: 30740, bs: 30746, "az-Latn": 30764, sma: 30779, "uz-Cyrl": 30787, "mn-Cyrl": 30800, "iu-Cans": 30813, "zh-Hant": 31748, nb: 31764, sr: 31770, "tg-Cyrl": 31784, dsb: 31790, smj: 31803, "uz-Latn": 31811, "mn-Mong": 31824, "iu-Latn": 31837, "tzm-Latn": 31839, "ha-Latn": 31848 }; exports.getLanguageId = function() { return LANGUAGE_CODES[locale()] } }, /*!*************************************!*\ !*** ./js/localization/currency.js ***! \*************************************/ function(module, exports, __webpack_require__) { var extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, numberLocalization = __webpack_require__( /*! ./number */ 32); numberLocalization.inject({ _formatNumberCore: function(value, format, formatConfig) { if ("currency" === format) { formatConfig.precision = formatConfig.precision || 0; return this.getCurrencySymbol().symbol + this.format(value, extend({}, formatConfig, { type: "fixedpoint" })) } return this.callBase.apply(this, arguments) }, getCurrencySymbol: function() { return { symbol: "$" } }, getOpenXmlCurrencyFormat: function() { return "$#,##0{0}_);\\($#,##0{0}\\)" } }) }, /*!*********************************************!*\ !*** ./js/client_exporter/image_creator.js ***! \*********************************************/ function(module, exports, __webpack_require__) { var clipPaths, imageDeferreds, patterns, filters, $ = __webpack_require__( /*! ../core/renderer */ 9), Color = __webpack_require__( /*! ../color */ 38), commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, camelize = __webpack_require__( /*! ../core/utils/inflector */ 39).camelize, when = __webpack_require__( /*! ../integration/jquery/deferred */ 16).when, _math = Math, PI = _math.PI, _min = _math.min, _abs = _math.abs, _sqrt = _math.sqrt, _pow = _math.pow, _atan2 = _math.atan2, _cos = _math.cos, _sin = _math.sin, _each = $.each, _extend = extend, _number = Number, IMAGE_QUALITY = 1, TEXT_DECORATION_LINE_WIDTH_COEFF = .05, DEFAULT_MARGIN_SIZE = { x: 30, y: 20 }, DEFAULT_FONT_SIZE = "10px", DEFAULT_FONT_FAMILY = "sans-serif", DEFAULT_TEXT_COLOR = "#000"; function createCanvas(width, height, withoutMargins) { var canvas = $("<canvas>")[0]; canvas.width = width + (withoutMargins ? 0 : 2 * DEFAULT_MARGIN_SIZE.x); canvas.height = height + (withoutMargins ? 0 : 2 * DEFAULT_MARGIN_SIZE.y); return canvas } function getStringFromCanvas(canvas, mimeType) { var dataURL = canvas.toDataURL(mimeType, IMAGE_QUALITY), imageData = atob(dataURL.substring(("data:" + mimeType + ";base64,").length)); return imageData } function arcTo(x1, y1, x2, y2, radius, largeArcFlag, clockwise, context) { var opSide, adjSide, centerX, centerY, startAngle, endAngle, cBx = (x1 + x2) / 2, cBy = (y1 + y2) / 2, aB = _atan2(y1 - y2, x1 - x2), k = largeArcFlag ? 1 : -1; aB += 90 * (PI / 180) * (clockwise ? 1 : -1); opSide = _sqrt(_pow(x2 - x1, 2) + _pow(y2 - y1, 2)) / 2; adjSide = _sqrt(_abs(_pow(radius, 2) - _pow(opSide, 2))); centerX = cBx + k * (adjSide * _cos(aB)); centerY = cBy + k * (adjSide * _sin(aB)); startAngle = _atan2(y1 - centerY, x1 - centerX); endAngle = _atan2(y2 - centerY, x2 - centerX); context.arc(centerX, centerY, radius, startAngle, endAngle, !clockwise) } function getElementOptions(element) { var coords, attr = parseAttributes(element.attributes || {}), style = element.style || {}, options = _extend({}, attr, { text: element.textContent.replace(/\s+/g, " "), textAlign: "middle" === attr["text-anchor"] ? "center" : attr["text-anchor"] }), transform = attr.transform; if (transform) { coords = transform.match(/translate\(-*\d+([.]\d+)*(,*\s*-*\d+([.]\d+)*)*/); if (coords) { coords = coords[0].match(/-*\d+([.]\d+)*/g); options.translateX = _number(coords[0]); options.translateY = coords[1] ? _number(coords[1]) : 0 } coords = transform.match(/rotate\(-*\d+([.]\d+)*(,*\s*-*\d+([.]\d+)*,*\s*-*\d+([.]\d+)*)*/); if (coords) { coords = coords[0].match(/-*\d+([.]\d+)*/g); options.rotationAngle = _number(coords[0]); options.rotationX = coords[1] && _number(coords[1]); options.rotationY = coords[2] && _number(coords[2]) } } parseStyles(style, options); return options } function drawRect(context, options) { var x = options.x, y = options.y, width = options.width, height = options.height, cornerRadius = options.rx; if (!cornerRadius) { context.rect(options.x, options.y, options.width, options.height) } else { cornerRadius = _min(cornerRadius, width / 2, height / 2); context.save(); context.translate(x, y); context.moveTo(width / 2, 0); context.arcTo(width, 0, width, height, cornerRadius); context.arcTo(width, height, 0, height, cornerRadius); context.arcTo(0, height, 0, 0, cornerRadius); context.arcTo(0, 0, cornerRadius, 0, cornerRadius); context.lineTo(width / 2, 0); context.restore() } } function drawImage(context, options) { var d = $.Deferred(), image = new Image; image.onload = function() { context.save(); context.globalAlpha = options.globalAlpha; transformElement(context, options); clipElement(context, options); context.drawImage(image, options.x, options.y, options.width, options.height); context.restore(); d.resolve() }; image.onerror = function() { d.resolve() }; imageDeferreds.push(d); image.setAttribute("crossOrigin", "anonymous"); image.src = options["xlink:href"] } function drawPath(context, dAttr) { var param1, param2, dArray = dAttr.split(" "), i = 0; do { param1 = _number(dArray[i + 1]); param2 = _number(dArray[i + 2]); switch (dArray[i]) { case "M": context.moveTo(param1, param2); i += 3; break; case "L": context.lineTo(param1, param2); i += 3; break; case "C": context.bezierCurveTo(param1, param2, _number(dArray[i + 3]), _number(dArray[i + 4]), _number(dArray[i + 5]), _number(dArray[i + 6])); i += 7; break; case "A": arcTo(_number(dArray[i - 2]), _number(dArray[i - 1]), _number(dArray[i + 6]), _number(dArray[i + 7]), param1, _number(dArray[i + 4]), _number(dArray[i + 5]), context); i += 8; break; case "Z": context.closePath(); i += 1 } } while (i < dArray.length) } function parseStyles(style, options) { _each(style, function(_, field) { if ("" !== style[field]) { options[camelize(field)] = style[field] } }); options.textDecoration = options.textDecoration || options.textDecorationLine; options.globalAlpha = options.opacity || options.globalAlpha } function parseUrl(urlString) { var matches = urlString && urlString.match(/url\(.*\#(.*?)["']?\)/i); return matches && matches[1] } function setFontStyle(context, options) { var fontParams = []; options.fontSize = options.fontSize || DEFAULT_FONT_SIZE; options.fontFamily || DEFAULT_FONT_FAMILY; options.fill = options.fill || DEFAULT_TEXT_COLOR; options.fontStyle && fontParams.push(options.fontStyle); options.fontWeight && fontParams.push(options.fontWeight); fontParams.push(options.fontSize); fontParams.push(options.fontFamily); context.font = fontParams.join(" "); context.textAlign = options.textAlign; context.fillStyle = options.fill; context.globalAlpha = options.globalAlpha } function drawText(context, options) { setFontStyle(context, options); options.text && context.fillText(options.text, options.x || 0, options.y || 0); strokeElement(context, options, true); drawTextDecoration(context, options) } function drawTextDecoration(context, options) { if (!options.textDecoration || "none" === options.textDecoration) { return } var x = options.x, textWidth = context.measureText(options.text).width, textHeight = parseInt(options.fontSize, 10), lineHeight = textHeight * TEXT_DECORATION_LINE_WIDTH_COEFF < 1 ? 1 : textHeight * TEXT_DECORATION_LINE_WIDTH_COEFF, y = options.y; switch (options.textDecoration) { case "line-through": y -= textHeight / 3 + lineHeight / 2; break; case "overline": y -= textHeight - lineHeight; break; case "underline": y += lineHeight } context.rect(x, y, textWidth, lineHeight); fillElement(context, options); strokeElement(context, options) } function createClipPath(element) { clipPaths[element.attributes.id.textContent] = element.childNodes[0] } function createPattern(element) { patterns[element.attributes.id.textContent] = element } function aggregateOpacity(options) { options.strokeOpacity = void 0 !== options["stroke-opacity"] ? options["stroke-opacity"] : 1; options.fillOpacity = void 0 !== options["fill-opacity"] ? options["fill-opacity"] : 1; if (void 0 !== options.opacity) { options.strokeOpacity *= options.opacity; options.fillOpacity *= options.opacity } } function hasTspan(element) { var nodes = element.childNodes; for (var i = 0; i < nodes.length; i++) { if ("tspan" === nodes[i].tagName) { return true } } return false } function drawTextElement(childNodes, context, options) { var line, lines = [], offset = 0; for (var i = 0; i < childNodes.length; i++) { var element = childNodes[i]; if (void 0 === element.tagName) { drawElement(element, context, options) } else { if ("tspan" === element.tagName || "text" === element.tagName) { var elementOptions = getElementOptions(element), mergedOptions = _extend({}, options, elementOptions); if ("tspan" === element.tagName && hasTspan(element)) { drawTextElement(element.childNodes, context, mergedOptions); return } mergedOptions.textAlign = "start"; if (!line || void 0 !== elementOptions.x) { line = { elements: [], options: [], widths: [], offsets: [] }; lines.push(line) } if (void 0 !== elementOptions.dy) { offset += Number(elementOptions.dy) } line.elements.push(element); line.options.push(mergedOptions); line.offsets.push(offset); setFontStyle(context, mergedOptions); line.widths.push(context.measureText(mergedOptions.text).width) } } } lines.forEach(function(line) { var commonWidth = line.widths.reduce(function(commonWidth, width) { return commonWidth + width }, 0), xDiff = 0, currentOffset = 0; if ("center" === options.textAlign) { xDiff = commonWidth / 2 } if ("end" === options.textAlign) { xDiff = commonWidth } line.options.forEach(function(o, index) { var width = line.widths[index]; o.x = o.x - xDiff + currentOffset; o.y += line.offsets[index]; currentOffset += width }); line.elements.forEach(function(element, index) { drawTextElement(element.childNodes, context, line.options[index]) }) }) } function drawElement(element, context, parentOptions) { var tagName = element.tagName, isText = "text" === tagName || "tspan" === tagName || void 0 === tagName, isImage = "image" === tagName, options = _extend({}, parentOptions, getElementOptions(element)); if ("hidden" === options.visibility) { return } context.save(); !isImage && transformElement(context, options); clipElement(context, options); aggregateOpacity(options); context.beginPath(); switch (element.tagName) { case void 0: drawText(context, options); break; case "text": case "tspan": drawTextElement(element.childNodes, context, options); break; case "image": drawImage(context, options); break; case "path": drawPath(context, options.d); break; case "rect": drawRect(context, options); context.closePath(); break; case "circle": context.arc(options.cx, options.cy, options.r, 0, 2 * PI, 1) } applyFilter(context, options); if (!isText) { fillElement(context, options); strokeElement(context, options) } context.restore() } function applyFilter(context, options) { var filterOptions, id = parseUrl(options.filter); if (id) { filterOptions = filters && filters[id]; if (!filterOptions) { filterOptions = { offsetX: 0, offsetY: 0, blur: 0, color: "#000" } } context.shadowOffsetX = filterOptions.offsetX; context.shadowOffsetY = filterOptions.offsetY; context.shadowColor = filterOptions.color; context.shadowBlur = filterOptions.blur } } function transformElement(context, options) { context.translate(options.translateX || 0, options.translateY || 0); delete options.translateX; delete options.translateY; if (options.rotationAngle) { context.translate(options.rotationX || 0, options.rotationY || 0); context.rotate(options.rotationAngle * PI / 180); context.translate(-(options.rotationX || 0), -(options.rotationY || 0)); delete options.rotationAngle; delete options.rotationX; delete options.rotationY } } function clipElement(context, options) { if (options["clip-path"]) { drawElement(clipPaths[parseUrl(options["clip-path"])], context, {}); context.clip(); delete options["clip-path"] } } function hex2rgba(hexColor, alpha) { var color = new Color(hexColor); return "rgba(" + color.r + "," + color.g + "," + color.b + "," + alpha + ")" } function createFilter(element) { var color, opacity, filterOptions = {}; _each(element.childNodes, function(_, node) { var attr = node.attributes; if (!attr.result) { return } switch (attr.result.value) { case "gaussianBlurResult": if (attr.stdDeviation) { filterOptions.blur = _number(attr.stdDeviation.value) } break; case "offsetResult": filterOptions.offsetX = _number(attr.dx.value); filterOptions.offsetY = _number(attr.dy.value); break; case "floodResult": color = attr["flood-color"] ? attr["flood-color"].value : "#000"; opacity = attr["flood-opacity"] ? attr["flood-opacity"].value : 1; filterOptions.color = hex2rgba(color, opacity) } }); filters[element.id] = filterOptions } function drawCanvasElements(elements, context, parentOptions) { var options; _each(elements, function(_, element) { switch (element.tagName && element.tagName.toLowerCase()) { case "g": options = _extend({}, parentOptions, getElementOptions(element)); context.save(); transformElement(context, options); clipElement(context, options); drawCanvasElements(element.childNodes, context, options); context.restore(); break; case "defs": clipPaths = {}; patterns = {}; filters = {}; drawCanvasElements(element.childNodes, context); break; case "clippath": createClipPath(element); break; case "pattern": createPattern(element); break; case "filter": createFilter(element); break; default: drawElement(element, context, parentOptions) } }) } function setLineDash(context, options) { var matches = options["stroke-dasharray"] && options["stroke-dasharray"].match(/(\d+)/g); if (matches && matches.length && context.setLineDash) { matches = $.map(matches, function(item) { return _number(item) }); context.setLineDash(matches) } } function strokeElement(context, options, isText) { var stroke = options.stroke; if (stroke && "none" !== stroke && 0 !== options["stroke-width"]) { setLineDash(context, options); context.lineJoin = options["stroke-linejoin"]; context.lineWidth = options["stroke-width"]; context.globalAlpha = options.strokeOpacity; context.strokeStyle = stroke; isText ? context.strokeText(options.text, options.x, options.y) : context.stroke() } } function getPattern(context, fill) { var pattern = patterns[parseUrl(fill)], options = getElementOptions(pattern), patternCanvas = createCanvas(options.width, options.height, true), patternContext = patternCanvas.getContext("2d"); drawCanvasElements(pattern.childNodes, patternContext, options); return context.createPattern(patternCanvas, "repeat") } function fillElement(context, options) { var fill = options.fill; if (fill && "none" !== fill) { context.fillStyle = fill.search(/url/) === -1 ? fill : getPattern(context, fill); context.globalAlpha = options.fillOpacity; context.fill() } } var parseAttributes = function(attributes) { var attr, newAttributes = {}; $.each(attributes, function(index, item) { attr = item.textContent; if (isFinite(attr)) { attr = _number(attr) } newAttributes[item.name.toLowerCase()] = attr }); return newAttributes }; function drawBackground(context, width, height, backgroundColor) { context.fillStyle = backgroundColor || "#ffffff"; context.fillRect(-DEFAULT_MARGIN_SIZE.x, -DEFAULT_MARGIN_SIZE.y, width + 2 * DEFAULT_MARGIN_SIZE.x, height + 2 * DEFAULT_MARGIN_SIZE.y) } function getCanvasFromSvg(markup, width, height, backgroundColor) { var canvas = createCanvas(width, height), context = canvas.getContext("2d"), parser = new DOMParser, elem = parser.parseFromString(markup, "image/svg+xml"), svgElem = elem.childNodes[0]; context.translate(DEFAULT_MARGIN_SIZE.x, DEFAULT_MARGIN_SIZE.y); imageDeferreds = []; document.body.appendChild(canvas); if (svgElem.attributes.direction) { canvas.dir = svgElem.attributes.direction.textContent } drawBackground(context, width, height, backgroundColor); drawCanvasElements(svgElem.childNodes, context, {}); document.body.removeChild(canvas); return canvas } function resolveString(string, canvas, mimeType) { when.apply($, imageDeferreds).done(function() { var resultString = getStringFromCanvas(canvas, mimeType); string.resolve(resultString) }) } exports.imageCreator = { getImageData: function(markup, options) { var mimeType = "image/" + options.format, string = $.Deferred(), width = options.width, height = options.height, backgroundColor = options.backgroundColor; if (commonUtils.isFunction(options.__parseAttributesFn)) { parseAttributes = options.__parseAttributesFn } resolveString(string, getCanvasFromSvg(markup, width, height, backgroundColor), mimeType); return string }, getData: function(markup, options) { var that = this, imageData = exports.imageCreator.getImageData(markup, options), mimeType = "image/" + options.format, data = $.Deferred(); when(imageData).done(function(binaryData) { imageData = commonUtils.isFunction(window.Blob) ? that._getBlob(binaryData, mimeType) : that._getBase64(binaryData); data.resolve(imageData) }); return data }, _getBlob: function(binaryData, mimeType) { var i, dataArray = new Uint8Array(binaryData.length); for (i = 0; i < binaryData.length; i++) { dataArray[i] = binaryData.charCodeAt(i) } return new Blob([dataArray.buffer], { type: mimeType }) }, _getBase64: function(binaryData) { return window.btoa(binaryData) } }; exports.getData = function(data, options, callback) { exports.imageCreator.getData(data, options).done(callback) } }, /*!*********************!*\ !*** ./js/color.js ***! \*********************/ function(module, exports) { var standardColorNames = { aliceblue: "f0f8ff", antiquewhite: "faebd7", aqua: "00ffff", aquamarine: "7fffd4", azure: "f0ffff", beige: "f5f5dc", bisque: "ffe4c4", black: "000000", blanchedalmond: "ffebcd", blue: "0000ff", blueviolet: "8a2be2", brown: "a52a2a", burlywood: "deb887", cadetblue: "5f9ea0", chartreuse: "7fff00", chocolate: "d2691e", coral: "ff7f50", cornflowerblue: "6495ed", cornsilk: "fff8dc", crimson: "dc143c", cyan: "00ffff", darkblue: "00008b", darkcyan: "008b8b", darkgoldenrod: "b8860b", darkgray: "a9a9a9", darkgreen: "006400", darkkhaki: "bdb76b", darkmagenta: "8b008b", darkolivegreen: "556b2f", darkorange: "ff8c00", darkorchid: "9932cc", darkred: "8b0000", darksalmon: "e9967a", darkseagreen: "8fbc8f", darkslateblue: "483d8b", darkslategray: "2f4f4f", darkturquoise: "00ced1", darkviolet: "9400d3", deeppink: "ff1493", deepskyblue: "00bfff", dimgray: "696969", dodgerblue: "1e90ff", feldspar: "d19275", firebrick: "b22222", floralwhite: "fffaf0", forestgreen: "228b22", fuchsia: "ff00ff", gainsboro: "dcdcdc", ghostwhite: "f8f8ff", gold: "ffd700", goldenrod: "daa520", gray: "808080", green: "008000", greenyellow: "adff2f", honeydew: "f0fff0", hotpink: "ff69b4", indianred: "cd5c5c", indigo: "4b0082", ivory: "fffff0", khaki: "f0e68c", lavender: "e6e6fa", lavenderblush: "fff0f5", lawngreen: "7cfc00", lemonchiffon: "fffacd", lightblue: "add8e6", lightcoral: "f08080", lightcyan: "e0ffff", lightgoldenrodyellow: "fafad2", lightgrey: "d3d3d3", lightgreen: "90ee90", lightpink: "ffb6c1", lightsalmon: "ffa07a", lightseagreen: "20b2aa", lightskyblue: "87cefa", lightslateblue: "8470ff", lightslategray: "778899", lightsteelblue: "b0c4de", lightyellow: "ffffe0", lime: "00ff00", limegreen: "32cd32", linen: "faf0e6", magenta: "ff00ff", maroon: "800000", mediumaquamarine: "66cdaa", mediumblue: "0000cd", mediumorchid: "ba55d3", mediumpurple: "9370d8", mediumseagreen: "3cb371", mediumslateblue: "7b68ee", mediumspringgreen: "00fa9a", mediumturquoise: "48d1cc", mediumvioletred: "c71585", midnightblue: "191970", mintcream: "f5fffa", mistyrose: "ffe4e1", moccasin: "ffe4b5", navajowhite: "ffdead", navy: "000080", oldlace: "fdf5e6", olive: "808000", olivedrab: "6b8e23", orange: "ffa500", orangered: "ff4500", orchid: "da70d6", palegoldenrod: "eee8aa", palegreen: "98fb98", paleturquoise: "afeeee", palevioletred: "d87093", papayawhip: "ffefd5", peachpuff: "ffdab9", peru: "cd853f", pink: "ffc0cb", plum: "dda0dd", powderblue: "b0e0e6", purple: "800080", rebeccapurple: "663399", red: "ff0000", rosybrown: "bc8f8f", royalblue: "4169e1", saddlebrown: "8b4513", salmon: "fa8072", sandybrown: "f4a460", seagreen: "2e8b57", seashell: "fff5ee", sienna: "a0522d", silver: "c0c0c0", skyblue: "87ceeb", slateblue: "6a5acd", slategray: "708090", snow: "fffafa", springgreen: "00ff7f", steelblue: "4682b4", tan: "d2b48c", teal: "008080", thistle: "d8bfd8", tomato: "ff6347", turquoise: "40e0d0", violet: "ee82ee", violetred: "d02090", wheat: "f5deb3", white: "ffffff", whitesmoke: "f5f5f5", yellow: "ffff00", yellowgreen: "9acd32" }; var standardColorTypes = [{ re: /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/, process: function(colorString) { return [parseInt(colorString[1], 10), parseInt(colorString[2], 10), parseInt(colorString[3], 10)] } }, { re: /^rgba\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3}),\s*(\d*\.*\d+)\)$/, process: function(colorString) { return [parseInt(colorString[1], 10), parseInt(colorString[2], 10), parseInt(colorString[3], 10), parseFloat(colorString[4])] } }, { re: /^#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})$/, process: function(colorString) { return [parseInt(colorString[1], 16), parseInt(colorString[2], 16), parseInt(colorString[3], 16)] } }, { re: /^#([a-f0-9]{1})([a-f0-9]{1})([a-f0-9]{1})$/, process: function(colorString) { return [parseInt(colorString[1] + colorString[1], 16), parseInt(colorString[2] + colorString[2], 16), parseInt(colorString[3] + colorString[3], 16)] } }, { re: /^hsv\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/, process: function(colorString) { var h = parseInt(colorString[1], 10), s = parseInt(colorString[2], 10), v = parseInt(colorString[3], 10), rgb = hsvToRgb(h, s, v); return [rgb[0], rgb[1], rgb[2], 1, [h, s, v]] } }, { re: /^hsl\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/, process: function(colorString) { var h = parseInt(colorString[1], 10), s = parseInt(colorString[2], 10), l = parseInt(colorString[3], 10), rgb = hslToRgb(h, s, l); return [rgb[0], rgb[1], rgb[2], 1, null, [h, s, l]] } }]; function Color(value) { this.baseColor = value; var color; if (value) { color = String(value).toLowerCase().replace(/ /g, ""); color = standardColorNames[color] ? "#" + standardColorNames[color] : color; color = parseColor(color) } if (!color) { this.colorIsInvalid = true } color = color || {}; this.r = normalize(color[0]); this.g = normalize(color[1]); this.b = normalize(color[2]); this.a = normalize(color[3], 1, 1); if (color[4]) { this.hsv = { h: color[4][0], s: color[4][1], v: color[4][2] } } else { this.hsv = toHsvFromRgb(this.r, this.g, this.b) } if (color[5]) { this.hsl = { h: color[5][0], s: color[5][1], l: color[5][2] } } else { this.hsl = toHslFromRgb(this.r, this.g, this.b) } } function parseColor(color) { if ("transparent" === color) { return [0, 0, 0, 0] } var str, i = 0, ii = standardColorTypes.length; for (; i < ii; ++i) { str = standardColorTypes[i].re.exec(color); if (str) { return standardColorTypes[i].process(str) } } return null } function normalize(colorComponent, def, max) { def = def || 0; max = max || 255; return colorComponent < 0 || isNaN(colorComponent) ? def : colorComponent > max ? max : colorComponent } function toHexFromRgb(r, g, b) { return "#" + (16777216 | r << 16 | g << 8 | b).toString(16).slice(1) } function toHsvFromRgb(r, g, b) { var H, S, V, max = Math.max(r, g, b), min = Math.min(r, g, b), delta = max - min; V = max; S = 0 === max ? 0 : 1 - min / max; if (max === min) { H = 0 } else { switch (max) { case r: H = 60 * ((g - b) / delta); if (g < b) { H += 360 } break; case g: H = 60 * ((b - r) / delta) + 120; break; case b: H = 60 * ((r - g) / delta) + 240 } } S *= 100; V *= 100 / 255; return { h: Math.round(H), s: Math.round(S), v: Math.round(V) } } function hsvToRgb(h, s, v) { var vDec, vInc, vMin, index, a, r, g, b; index = Math.floor(h % 360 / 60); vMin = (100 - s) * v / 100; a = (v - vMin) * (h % 60 / 60); vInc = vMin + a; vDec = v - a; switch (index) { case 0: r = v; g = vInc; b = vMin; break; case 1: r = vDec; g = v; b = vMin; break; case 2: r = vMin; g = v; b = vInc; break; case 3: r = vMin; g = vDec; b = v; break; case 4: r = vInc; g = vMin; b = v; break; case 5: r = v; g = vMin; b = vDec } return [Math.round(2.55 * r), Math.round(2.55 * g), Math.round(2.55 * b)] } function calculateHue(r, g, b, delta) { var max = Math.max(r, g, b); switch (max) { case r: return (g - b) / delta + (g < b ? 6 : 0); case g: return (b - r) / delta + 2; case b: return (r - g) / delta + 4 } } function toHslFromRgb(r, g, b) { r = convertTo01Bounds(r, 255); g = convertTo01Bounds(g, 255); b = convertTo01Bounds(b, 255); var h, s, max = Math.max(r, g, b), min = Math.min(r, g, b), maxMinSum = max + min, l = maxMinSum / 2; if (max === min) { h = s = 0 } else { var delta = max - min; if (l > .5) { s = delta / (2 - maxMinSum) } else { s = delta / maxMinSum } h = calculateHue(r, g, b, delta); h /= 6 } return { h: _round(360 * h), s: _round(100 * s), l: _round(100 * l) } } function makeColorTint(colorPart, h) { var colorTint = h; if ("r" === colorPart) { colorTint = h + 1 / 3 } if ("b" === colorPart) { colorTint = h - 1 / 3 } return colorTint } function modifyColorTint(colorTint) { if (colorTint < 0) { colorTint += 1 } if (colorTint > 1) { colorTint -= 1 } return colorTint } function hueToRgb(p, q, colorTint) { colorTint = modifyColorTint(colorTint); if (colorTint < 1 / 6) { return p + 6 * (q - p) * colorTint } if (colorTint < .5) { return q } if (colorTint < 2 / 3) { return p + (q - p) * (2 / 3 - colorTint) * 6 } return p } function hslToRgb(h, s, l) { var r, g, b; h = convertTo01Bounds(h, 360); s = convertTo01Bounds(s, 100); l = convertTo01Bounds(l, 100); if (0 === s) { r = g = b = l } else { var q = l < .5 ? l * (1 + s) : l + s - l * s, p = 2 * l - q; r = hueToRgb(p, q, makeColorTint("r", h)); g = hueToRgb(p, q, makeColorTint("g", h)); b = hueToRgb(p, q, makeColorTint("b", h)) } return [_round(255 * r), _round(255 * g), _round(255 * b)] } function convertTo01Bounds(n, max) { n = Math.min(max, Math.max(0, parseFloat(n))); if (Math.abs(n - max) < 1e-6) { return 1 } return n % max / parseFloat(max) } function isIntegerBetweenMinAndMax(number, min, max) { min = min || 0; max = max || 255; if (number % 1 !== 0 || number < min || number > max || "number" !== typeof number || isNaN(number)) { return false } return true } var _round = Math.round; Color.prototype = { constructor: Color, highlight: function(step) { step = step || 10; return this.alter(step).toHex() }, darken: function(step) { step = step || 10; return this.alter(-step).toHex() }, alter: function(step) { var result = new Color; result.r = normalize(this.r + step); result.g = normalize(this.g + step); result.b = normalize(this.b + step); return result }, blend: function(blendColor, opacity) { var other = blendColor instanceof Color ? blendColor : new Color(blendColor), result = new Color; result.r = normalize(_round(this.r * (1 - opacity) + other.r * opacity)); result.g = normalize(_round(this.g * (1 - opacity) + other.g * opacity)); result.b = normalize(_round(this.b * (1 - opacity) + other.b * opacity)); return result }, toHex: function() { return toHexFromRgb(this.r, this.g, this.b) }, getPureColor: function() { var rgb = hsvToRgb(this.hsv.h, 100, 100); return new Color("rgb(" + rgb.join(",") + ")") }, isValidHex: function(hex) { return /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(hex) }, isValidRGB: function(r, g, b) { if (!isIntegerBetweenMinAndMax(r) || !isIntegerBetweenMinAndMax(g) || !isIntegerBetweenMinAndMax(b)) { return false } return true }, isValidAlpha: function(a) { if (isNaN(a) || a < 0 || a > 1 || "number" !== typeof a) { return false } return true }, colorIsInvalid: false }; module.exports = Color }, /*!************************************!*\ !*** ./js/core/utils/inflector.js ***! \************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9); var _normalize = function(text) { if (void 0 === text || null === text) { return "" } return String(text) }; var _upperCaseFirst = function(text) { return _normalize(text).charAt(0).toUpperCase() + text.substr(1) }; var _chop = function(text) { return _normalize(text).replace(/([a-z\d])([A-Z])/g, "$1 $2").split(/[\s_-]+/) }; var dasherize = function(text) { return $.map(_chop(text), function(p) { return p.toLowerCase() }).join("-") }; var underscore = function(text) { return dasherize(text).replace(/-/g, "_") }; var camelize = function(text, upperFirst) { return $.map(_chop(text), function(p, i) { p = p.toLowerCase(); if (upperFirst || i > 0) { p = _upperCaseFirst(p) } return p }).join("") }; var humanize = function(text) { return _upperCaseFirst(dasherize(text).replace(/-/g, " ")) }; var titleize = function(text) { return $.map(_chop(text), function(p) { return _upperCaseFirst(p.toLowerCase()) }).join(" ") }; var captionize = function(name) { var i, char, captionList = [], isPrevCharNewWord = false, isNewWord = false; for (i = 0; i < name.length; i++) { char = name.charAt(i); isNewWord = char === char.toUpperCase() || char in ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; if ("_" === char || "." === char) { char = " "; isNewWord = true } else { if (0 === i) { char = char.toUpperCase(); isNewWord = true } else { if (!isPrevCharNewWord && isNewWord) { if (captionList.length > 0) { captionList.push(" ") } } } } captionList.push(char); isPrevCharNewWord = isNewWord } return captionList.join("") }; exports.dasherize = dasherize; exports.camelize = camelize; exports.humanize = humanize; exports.titleize = titleize; exports.underscore = underscore; exports.captionize = captionize }, /*!*******************************************!*\ !*** ./js/client_exporter/pdf_creator.js ***! \*******************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), VERSION = __webpack_require__( /*! ../core/version */ 19), imageCreator = __webpack_require__( /*! ./image_creator */ 37).imageCreator, isFunction = __webpack_require__( /*! ../core/utils/common */ 14).isFunction, extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, when = __webpack_require__( /*! ../integration/jquery/deferred */ 16).when, mainPageTemplate = "%PDF-1.3\r\n2 0 obj\r\n<</ProcSet[/PDF/ImageB/ImageC/ImageI]/XObject<</I0 5 0 R>>>>\r\nendobj\r\n4 0 obj\r\n<</Type/Pages/Kids[1 0 R]/Count 1>>\r\nendobj\r\n7 0 obj\r\n<</OpenAction[1 0 R /FitH null]/Type/Catalog/Pages 4 0 R/PageLayout/OneColumn>>\r\nendobj\r\n1 0 obj\r\n<</Type/Page/Resources 2 0 R/MediaBox[0 0 _width_ _height_]/Contents 3 0 R/Parent 4 0 R>>\r\nendobj\r\n", contentTemplate = "3 0 obj\r\n<</Length 52>>stream\r\n0.20 w\n0 G\nq _width_ 0 0 _height_ 0.00 0.00 cm /I0 Do Q\r\nendstream\r\nendobj\r\n", infoTemplate = "6 0 obj\r\n<</CreationDate _date_/Producer(DevExtreme _version_)>>\r\nendobj\r\n", imageStartTemplate = "5 0 obj\r\n<</Type/XObject/Subtype/Image/Width _width_/Height _height_/ColorSpace/DeviceRGB/BitsPerComponent 8/Filter/DCTDecode/Length _length_>>stream\r\n", imageEndTemplate = "\r\nendstream\r\nendobj\r\n", trailerTemplate = "trailer\r\n<<\r\n/Size 8\r\n/Root 7 0 R\r\n/Info 6 0 R\r\n>>\r\nstartxref\r\n_length_\r\n%%EOF", xrefTemplate = "xref\r\n0 8\r\n0000000000 65535 f\r\n0000000241 00000 n\r\n0000000010 00000 n\r\n_main_ 00000 n\r\n0000000089 00000 n\r\n_image_ 00000 n\r\n_info_ 00000 n\r\n0000000143 00000 n\r\n", DEFAULT_MARGIN_X = 60, DEFAULT_MARGIN_Y = 40; var pad = function(str, len) { return str.length < len ? pad("0" + str, len) : str }; var composePdfString = function(imageString, options, curDate) { var width = options.width + DEFAULT_MARGIN_X, height = options.height + DEFAULT_MARGIN_Y, widthPt = (.75 * width).toFixed(2), heightPt = (.75 * height).toFixed(2); var mainPage = mainPageTemplate.replace("_width_", widthPt).replace("_height_", heightPt), content = contentTemplate.replace("_width_", widthPt).replace("_height_", heightPt), info = infoTemplate.replace("_date_", curDate).replace("_version_", VERSION), image = imageStartTemplate.replace("_width_", width).replace("_height_", height).replace("_length_", imageString.length) + imageString + imageEndTemplate, xref = getXref(mainPage.length, content.length, info.length); var mainContent = mainPage + content + info + image, trailer = trailerTemplate.replace("_length_", mainContent.length); return mainContent + xref + trailer }; var getXref = function(mainPageLength, contentLength, infoLength) { return xrefTemplate.replace("_main_", pad(mainPageLength + "", 10)).replace("_info_", pad(mainPageLength + contentLength + "", 10)).replace("_image_", pad(mainPageLength + contentLength + infoLength + "", 10)) }; var getCurDate = function() { return new Date }; var getBlob = function(binaryData) { var i = 0, dataArray = new Uint8Array(binaryData.length); for (; i < binaryData.length; i++) { dataArray[i] = binaryData.charCodeAt(i) } return new Blob([dataArray.buffer], { type: "application/pdf" }) }; var getBase64 = function(binaryData) { return window.btoa(binaryData) }; exports.getData = function(data, options, callback) { var imageData = imageCreator.getImageData(data, extend({}, options, { format: "jpeg" })), blob = $.Deferred(); blob.done(callback); when(imageData).done(function(imageString) { var binaryData = composePdfString(imageString, options, getCurDate()), pdfData = isFunction(window.Blob) ? getBlob(binaryData) : getBase64(binaryData); blob.resolve(pdfData) }) }; exports.__tests = { set_composePdfString: function(func) { exports.__tests.composePdfString = composePdfString; composePdfString = func }, restore_composePdfString: function(func) { if (exports.__tests.composePdfString) { composePdfString = exports.__tests.composePdfString; exports.__tests.composePdfString = null } }, set_getCurDate: function(func) { exports.__tests.getCurDate = getCurDate; getCurDate = func }, restore_getCurDate: function(func) { if (exports.__tests.getCurDate) { getCurDate = exports.__tests.getCurDate; exports.__tests.getCurDate = null } }, set_getBlob: function(func) { exports.__tests.getBlob = getBlob; getBlob = func }, restore_getBlob: function(func) { if (exports.__tests.getBlob) { getBlob = exports.__tests.getBlob; exports.__tests.getBlob = null } }, set_getBase64: function(func) { exports.__tests.getBase64 = getBase64; getBase64 = func }, restore_getBase64: function(func) { if (exports.__tests.getBase64) { getBase64 = exports.__tests.getBase64; exports.__tests.getBase64 = null } } } }, /*!*******************************************!*\ !*** ./js/client_exporter/svg_creator.js ***! \*******************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), getSvgMarkup = __webpack_require__( /*! ../core/utils/svg */ 42).getSvgMarkup, when = __webpack_require__( /*! ../integration/jquery/deferred */ 16).when; exports.svgCreator = { _markup: "", _imageArray: {}, _imageDeferreds: [], _getBinaryFile: function(src, callback) { var xhr = new XMLHttpRequest; xhr.onreadystatechange = function() { if (xhr.readyState === xhr.DONE) { if (200 === xhr.status && xhr.response) { callback(xhr.response) } else { callback(false) } } }; xhr.open("GET", src, true); xhr.responseType = "arraybuffer"; xhr.send() }, _loadImages: function() { var that = this; $.each(that._imageArray, function(src) { var deferred = new $.Deferred; that._imageDeferreds.push(deferred); that._getBinaryFile(src, function(response) { if (!response) { delete that._imageArray[src]; deferred.resolve(); return } var i, binary = "", bytes = new Uint8Array(response), length = bytes.byteLength; for (i = 0; i < length; i++) { binary += String.fromCharCode(bytes[i]) } that._imageArray[src] = "data:image/png;base64," + btoa(binary); deferred.resolve() }) }) }, _parseImages: function(element) { var href, that = this; if ("image" === element.tagName) { href = $(element).attr("xlink:href"); if (!that._imageArray[href]) { that._imageArray[href] = "" } } $.each(element.childNodes, function(_, element) { that._parseImages(element) }) }, _prepareImages: function(svgElem) { this._parseImages(svgElem); this._loadImages(); return when.apply($, this._imageDeferreds) }, getData: function(data, options) { var markup, that = this, xmlVersion = '<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>', blob = $.Deferred(), parser = new DOMParser, elem = parser.parseFromString(data, "image/svg+xml"), svgElem = elem.childNodes[0], $svgObject = $(svgElem); $svgObject.css("background-color", options.backgroundColor); markup = xmlVersion + getSvgMarkup($svgObject.get(0)); that._prepareImages(svgElem).done(function() { $.each(that._imageArray, function(href, dataURI) { markup = markup.split(href).join(dataURI) }); blob.resolve(commonUtils.isFunction(window.Blob) ? that._getBlob(markup) : that._getBase64(markup)) }); return blob }, _getBlob: function(markup) { return new Blob([markup], { type: "image/svg+xml" }) }, _getBase64: function(markup) { return window.btoa(markup) } }; exports.getData = function(data, options, callback) { exports.svgCreator.getData(data, options).done(callback) } }, /*!******************************!*\ !*** ./js/core/utils/svg.js ***! \******************************/ function(module, exports) { function getMarkup(element) { var temp = document.createElement("div"); temp.appendChild(element.cloneNode(true)); return temp.innerHTML } function fixIENamespaces(markup) { var first = true; markup = markup.replace(/xmlns="[\s\S]*?"/gi, function(match) { if (!first) { return "" } first = false; return match }); return markup.replace(/xmlns:NS1="[\s\S]*?"/gi, "").replace(/NS1:xmlns:xlink="([\s\S]*?)"/gi, 'xmlns:xlink="$1"') } function decodeHtmlEntities(markup) { return markup.replace(/"/gi, """).replace(/&/gi, "&").replace(/'/gi, "'").replace(/</gi, "<").replace(/>/gi, ">").replace(/ /gi, " ").replace(/­/gi, "­") } exports.getSvgMarkup = function(element) { return fixIENamespaces(decodeHtmlEntities(getMarkup(element))) } }, /*!**********************************!*\ !*** ./js/core/dom_component.js ***! \**********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), extend = __webpack_require__( /*! ./utils/extend */ 11).extend, config = __webpack_require__( /*! ./config */ 15), errors = __webpack_require__( /*! ./errors */ 7), windowResizeCallbacks = __webpack_require__( /*! ./utils/window */ 44).resizeCallbacks, commonUtils = __webpack_require__( /*! ./utils/common */ 14), inArray = __webpack_require__( /*! ./utils/array */ 26).inArray, publicComponentUtils = __webpack_require__( /*! ./utils/public_component */ 45), Component = __webpack_require__( /*! ./component */ 48), abstract = Component.abstract; var RTL_DIRECTION_CLASS = "dx-rtl", VISIBILITY_CHANGE_CLASS = "dx-visibility-change-handler", VISIBILITY_CHANGE_EVENTNAMESPACE = "VisibilityChange"; var DOMComponent = Component.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { width: void 0, height: void 0, rtlEnabled: config().rtlEnabled, elementAttr: {}, disabled: false, integrationOptions: {} }) }, ctor: function(element, options) { this._$element = $(element); publicComponentUtils.attachInstanceToElement(this._$element, this, this._dispose); this.callBase(options) }, _visibilityChanged: abstract, _dimensionChanged: abstract, _init: function() { this.callBase(); this._attachWindowResizeCallback() }, _setOptionsByDevice: function(instanceCustomRules) { this.callBase([].concat(this.constructor._classCustomRules || [], instanceCustomRules || [])) }, _isInitialOptionValue: function(name) { var isCustomOption = this.constructor._classCustomRules && this._convertRulesToOptions(this.constructor._classCustomRules).hasOwnProperty(name); return !isCustomOption && this.callBase(name) }, _attachWindowResizeCallback: function() { if (this._isDimensionChangeSupported()) { var windowResizeCallBack = this._windowResizeCallBack = this._dimensionChanged.bind(this); windowResizeCallbacks.add(windowResizeCallBack) } }, _isDimensionChangeSupported: function() { return this._dimensionChanged !== abstract }, _render: function() { this._renderElementAttributes(); this._toggleRTLDirection(this.option("rtlEnabled")); this._renderVisibilityChange(); this._renderDimensions() }, _renderElementAttributes: function() { var attributes = extend({}, this.option("elementAttr")), classNames = attributes.class; delete attributes.class; this.element().attr(attributes).addClass(classNames) }, _renderVisibilityChange: function() { if (this._isDimensionChangeSupported()) { this._attachDimensionChangeHandlers() } if (!this._isVisibilityChangeSupported()) { return } this.element().addClass(VISIBILITY_CHANGE_CLASS); this._attachVisibilityChangeHandlers() }, _renderDimensions: function() { var width = this.option("width"), height = this.option("height"), $element = this.element(); $element.outerWidth(width); $element.outerHeight(height) }, _attachDimensionChangeHandlers: function() { var that = this; var resizeEventName = "dxresize." + this.NAME + VISIBILITY_CHANGE_EVENTNAMESPACE; that.element().off(resizeEventName).on(resizeEventName, function() { that._dimensionChanged() }) }, _attachVisibilityChangeHandlers: function() { var that = this; var hidingEventName = "dxhiding." + this.NAME + VISIBILITY_CHANGE_EVENTNAMESPACE; var shownEventName = "dxshown." + this.NAME + VISIBILITY_CHANGE_EVENTNAMESPACE; that._isHidden = !that._isVisible(); that.element().off(hidingEventName).on(hidingEventName, function() { that._checkVisibilityChanged("hiding") }).off(shownEventName).on(shownEventName, function() { that._checkVisibilityChanged("shown") }) }, _isVisible: function() { return this.element().is(":visible") }, _checkVisibilityChanged: function(event) { if ("hiding" === event && this._isVisible() && !this._isHidden) { this._visibilityChanged(false); this._isHidden = true } else { if ("shown" === event && this._isVisible() && this._isHidden) { this._isHidden = false; this._visibilityChanged(true) } } }, _isVisibilityChangeSupported: function() { return this._visibilityChanged !== abstract }, _clean: commonUtils.noop, _modelByElement: function() { var modelByElement = this.option("modelByElement") || commonUtils.noop; return modelByElement(this.element()) }, _invalidate: function() { if (!this._updateLockCount) { throw errors.Error("E0007") } this._requireRefresh = true }, _refresh: function() { this._clean(); this._render() }, _dispose: function() { this.callBase(); this._clean(); this._detachWindowResizeCallback() }, _detachWindowResizeCallback: function() { if (this._isDimensionChangeSupported()) { windowResizeCallbacks.remove(this._windowResizeCallBack) } }, _toggleRTLDirection: function(rtl) { this.element().toggleClass(RTL_DIRECTION_CLASS, rtl) }, _createComponent: function(element, component, config) { var that = this; config = config || {}; var synchronizableOptions = commonUtils.grep(["rtlEnabled", "disabled"], function(value) { return !(value in config) }); var nestedComponentOptions = that.option("nestedComponentOptions") || commonUtils.noop; that._extendConfig(config, extend({ integrationOptions: this.option("integrationOptions"), rtlEnabled: this.option("rtlEnabled"), disabled: this.option("disabled") }, nestedComponentOptions(this))); var instance; if (commonUtils.isString(component)) { var $element = $(element)[component](config); instance = $element[component]("instance") } else { if (element) { instance = component.getInstance(element); if (instance) { instance.option(config) } else { instance = new component(element, config) } } } if (instance) { var optionChangedHandler = function(args) { if (inArray(args.name, synchronizableOptions) >= 0) { instance.option(args.name, args.value) } }; that.on("optionChanged", optionChangedHandler); instance.on("disposing", function() { that.off("optionChanged", optionChangedHandler) }) } return instance }, _extendConfig: function(config, extendConfig) { $.each(extendConfig, function(key, value) { config[key] = config.hasOwnProperty(key) ? config[key] : value }) }, _defaultActionConfig: function() { return extend(this.callBase(), { context: this._modelByElement(this.element()) }) }, _defaultActionArgs: function() { var element = this.element(), model = this._modelByElement(this.element()); return extend(this.callBase(), { element: element, model: model }) }, _optionChanged: function(args) { switch (args.name) { case "width": case "height": this._renderDimensions(); break; case "rtlEnabled": case "elementAttr": this._invalidate(); break; case "disabled": case "integrationOptions": break; default: this.callBase(args) } }, endUpdate: function() { var requireRender = !this._initializing && !this._initialized; this.callBase.apply(this, arguments); if (!this._updateLockCount) { if (requireRender) { this._render() } else { if (this._requireRefresh) { this._requireRefresh = false; this._refresh() } } } }, element: function() { return this._$element } }); DOMComponent.getInstance = function($element) { return publicComponentUtils.getInstanceByElement($($element), this) }; DOMComponent.defaultOptions = function(rule) { this._classCustomRules = this._classCustomRules || []; this._classCustomRules.push(rule) }; module.exports = DOMComponent }, /*!*********************************!*\ !*** ./js/core/utils/window.js ***! \*********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9); var resizeCallbacks = function() { var prevSize, callbacks = $.Callbacks(), jqWindow = $(window), resizeEventHandlerAttached = false, originalCallbacksAdd = callbacks.add, originalCallbacksRemove = callbacks.remove; var formatSize = function() { return { width: jqWindow.width(), height: jqWindow.height() } }; var handleResize = function() { var now = formatSize(); if (now.width === prevSize.width && now.height === prevSize.height) { return } var changedDimension; if (now.width === prevSize.width) { changedDimension = "height" } if (now.height === prevSize.height) { changedDimension = "width" } prevSize = now; setTimeout(function() { callbacks.fire(changedDimension) }) }; prevSize = formatSize(); callbacks.add = function() { var result = originalCallbacksAdd.apply(callbacks, arguments); if (!resizeEventHandlerAttached && callbacks.has()) { jqWindow.on("resize", handleResize); resizeEventHandlerAttached = true } return result }; callbacks.remove = function() { var result = originalCallbacksRemove.apply(callbacks, arguments); if (!callbacks.has() && resizeEventHandlerAttached) { jqWindow.off("resize", handleResize); resizeEventHandlerAttached = false } return result }; return callbacks }(); var defaultScreenFactorFunc = function(width) { if (width < 768) { return "xs" } else { if (width < 992) { return "sm" } else { if (width < 1200) { return "md" } else { return "lg" } } } }; var getCurrentScreenFactor = function(screenFactorCallback) { var screenFactorFunc = screenFactorCallback || defaultScreenFactorFunc; return screenFactorFunc($(window).width()) }; exports.resizeCallbacks = resizeCallbacks; exports.defaultScreenFactorFunc = defaultScreenFactorFunc; exports.getCurrentScreenFactor = getCurrentScreenFactor }, /*!*******************************************!*\ !*** ./js/core/utils/public_component.js ***! \*******************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), WeakMap = __webpack_require__( /*! ../polyfills/weak_map */ 46), commonUtils = __webpack_require__( /*! ./common */ 14), removeEvent = __webpack_require__( /*! ../remove_event */ 47); var COMPONENT_NAMES_DATA_KEY = "dxComponents", ANONYMOUS_COMPONENT_DATA_KEY = "dxPrivateComponent"; var componentNames = new WeakMap, nextAnonymousComponent = 0; var getName = exports.name = function(componentClass, newName) { if (commonUtils.isDefined(newName)) { componentNames.set(componentClass, newName); return } if (!componentNames.has(componentClass)) { var generatedName = ANONYMOUS_COMPONENT_DATA_KEY + nextAnonymousComponent++; componentNames.set(componentClass, generatedName); return generatedName } return componentNames.get(componentClass) }; exports.attachInstanceToElement = function($element, componentInstance, disposeFn) { var data = $.data($element.get(0)), name = getName(componentInstance.constructor); data[name] = componentInstance; if (disposeFn) { $element.one(removeEvent, function() { disposeFn.call(componentInstance) }) } if (!data[COMPONENT_NAMES_DATA_KEY]) { data[COMPONENT_NAMES_DATA_KEY] = [] } data[COMPONENT_NAMES_DATA_KEY].push(name) }; exports.getInstanceByElement = function($element, componentClass) { var name = getName(componentClass); return $.data($element.get(0), name) } }, /*!***************************************!*\ !*** ./js/core/polyfills/weak_map.js ***! \***************************************/ function(module, exports, __webpack_require__) { var inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, WeakMap = window.WeakMap; if (!WeakMap) { WeakMap = function() { var keys = [], values = []; this.set = function(key, value) { var index = inArray(key, keys); if (index === -1) { keys.push(key); values.push(value) } else { values[index] = value } }; this.get = function(key) { var index = inArray(key, keys); if (index === -1) { return } return values[index] }; this.has = function(key) { var index = inArray(key, keys); if (index === -1) { return false } return true } } } module.exports = WeakMap }, /*!*********************************!*\ !*** ./js/core/remove_event.js ***! \*********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), jQuery = __webpack_require__( /*! jquery */ 10), cleanData = jQuery.cleanData, specialEvents = $.event.special; var eventName = "dxremove", eventPropName = "dxRemoveEvent"; jQuery.cleanData = function(elements) { elements = [].slice.call(elements); for (var i = 0; i < elements.length; i++) { var $element = $(elements[i]); if ($element.prop(eventPropName)) { $element.removeProp(eventPropName); $element.triggerHandler(eventName) } } return cleanData(elements) }; specialEvents[eventName] = { noBubble: true, setup: function() { $(this).prop(eventPropName, true) } }; module.exports = eventName }, /*!******************************!*\ !*** ./js/core/component.js ***! \******************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), Config = __webpack_require__( /*! ./config */ 15), extend = __webpack_require__( /*! ./utils/extend */ 11).extend, Class = __webpack_require__( /*! ./class */ 25), Action = __webpack_require__( /*! ./action */ 49), errors = __webpack_require__( /*! ./errors */ 7), coreDataUtils = __webpack_require__( /*! ./utils/data */ 50), commonUtils = __webpack_require__( /*! ./utils/common */ 14), typeUtils = __webpack_require__( /*! ./utils/type */ 12), EventsMixin = __webpack_require__( /*! ./events_mixin */ 51), publicComponentUtils = __webpack_require__( /*! ./utils/public_component */ 45), devices = __webpack_require__( /*! ./devices */ 53), isFunction = commonUtils.isFunction, noop = commonUtils.noop; var cachedGetters = {}; var cachedSetters = {}; var Component = Class.inherit({ _setDeprecatedOptions: function() { this._deprecatedOptions = {} }, _getDeprecatedOptions: function() { return this._deprecatedOptions }, _getOptionAliasesByName: function(optionName) { return $.map(this._deprecatedOptions, function(deprecate, aliasName) { return optionName === deprecate.alias ? aliasName : void 0 }) }, _getDefaultOptions: function() { return { onInitialized: null, onOptionChanged: null, onDisposing: null, defaultOptionsRules: null } }, _setDefaultOptions: function() { this._options = this._getDefaultOptions() }, _defaultOptionsRules: function() { return [] }, _setOptionsByDevice: function(customRules) { var rules = this._defaultOptionsRules(); if (Array.isArray(customRules)) { rules = rules.concat(customRules) } var rulesOptions = this._convertRulesToOptions(rules); extend(true, this._options, rulesOptions); for (var fieldName in this._optionsByReference) { if (rulesOptions.hasOwnProperty(fieldName)) { this._options[fieldName] = rulesOptions[fieldName] } } }, _convertRulesToOptions: function(rules) { var options = {}; var currentDevice = devices.current(); var deviceMatch = function(device, filter) { filter = $.makeArray(filter); return 1 === filter.length && typeUtils.isEmptyObject(filter[0]) || commonUtils.findBestMatches(device, filter).length > 0 }; for (var i = 0; i < rules.length; i++) { var match, rule = rules[i], deviceFilter = rule.device || {}; if (isFunction(deviceFilter)) { match = deviceFilter(currentDevice) } else { match = deviceMatch(currentDevice, deviceFilter) } if (match) { extend(options, rule.options) } } return options }, _isInitialOptionValue: function(name) { var optionValue = this.option(name), initialOptionValue = this.initialOption(name), isInitialOption = isFunction(optionValue) && isFunction(initialOptionValue) ? optionValue.toString() === initialOptionValue.toString() : commonUtils.equalByValue(optionValue, initialOptionValue); return isInitialOption }, _setOptionsByReference: function() { this._optionsByReference = {} }, _getOptionsByReference: function() { return this._optionsByReference }, ctor: function(options) { this.NAME = publicComponentUtils.name(this.constructor); options = options || {}; if (options.eventsStrategy) { this.setEventsStrategy(options.eventsStrategy) } this._options = {}; this._updateLockCount = 0; this._optionChangedCallbacks = options._optionChangedCallbacks || $.Callbacks(); this._disposingCallbacks = options._disposingCallbacks || $.Callbacks(); this.beginUpdate(); try { this._suppressDeprecatedWarnings(); this._setOptionsByReference(); this._setDeprecatedOptions(); this._setDefaultOptions(); if (options && options.onInitializing) { options.onInitializing.apply(this, [options]) } this._setOptionsByDevice(options.defaultOptionsRules); this._resumeDeprecatedWarnings(); this._initOptions(options) } finally { this.endUpdate() } }, _initOptions: function(options) { this.option(options) }, _optionValuesEqual: function(name, oldValue, newValue) { oldValue = coreDataUtils.toComparable(oldValue, true); newValue = coreDataUtils.toComparable(newValue, true); if (oldValue && newValue && oldValue.jquery && newValue.jquery) { return newValue.is(oldValue) } var oldValueIsNaN = oldValue !== oldValue, newValueIsNaN = newValue !== newValue; if (oldValueIsNaN && newValueIsNaN) { return true } if (null === oldValue || "object" !== typeof oldValue) { return oldValue === newValue } return false }, _init: function() { this._createOptionChangedAction(); this.on("disposing", function(args) { this._disposingCallbacks.fireWith(this, [args]) }.bind(this)) }, _createOptionChangedAction: function() { this._optionChangedAction = this._createActionByOption("onOptionChanged", { excludeValidators: ["disabled", "readOnly", "designMode"] }) }, _createDisposingAction: function() { this._disposingAction = this._createActionByOption("onDisposing", { excludeValidators: ["disabled", "readOnly", "designMode"] }) }, _optionChanged: function(args) { switch (args.name) { case "onDisposing": case "onInitialized": break; case "onOptionChanged": this._createOptionChangedAction(); break; case "defaultOptionsRules": } }, _dispose: function() { this._optionChangedCallbacks.empty(); this._createDisposingAction(); this._disposingAction(); this._disposeEvents(); this._disposed = true }, instance: function() { return this }, beginUpdate: function() { this._updateLockCount++ }, endUpdate: function() { this._updateLockCount = Math.max(this._updateLockCount - 1, 0); if (!this._updateLockCount) { if (!this._initializing && !this._initialized) { this._initializing = true; try { this._init() } finally { this._initializing = false; this._updateLockCount++; this._createActionByOption("onInitialized", { excludeValidators: ["disabled", "readOnly", "designMode"] })(); this._updateLockCount--; this._initialized = true } } } }, _logWarningIfDeprecated: function(option) { var info = this._deprecatedOptions[option]; if (info && !this._deprecatedOptionsSuppressed) { this._logDeprecatedWarning(option, info) } }, _logDeprecatedWarningCount: 0, _logDeprecatedWarning: function(option, info) { var message = info.message || "Use the '" + info.alias + "' option instead"; errors.log("W0001", this.NAME, option, info.since, message); ++this._logDeprecatedWarningCount }, _suppressDeprecatedWarnings: function() { this._deprecatedOptionsSuppressed = true }, _resumeDeprecatedWarnings: function() { this._deprecatedOptionsSuppressed = false }, _optionChanging: noop, _notifyOptionChanged: function(option, value, previousValue) { var that = this; if (this._initialized) { var optionNames = [option].concat(that._getOptionAliasesByName(option)); for (var i = 0; i < optionNames.length; i++) { var name = optionNames[i], args = { name: name.split(/[.\[]/)[0], fullName: name, value: value, previousValue: previousValue }; that._optionChangedCallbacks.fireWith(that, [extend(that._defaultActionArgs(), args)]); that._optionChangedAction(extend({}, args)); if (!that._disposed) { that._optionChanged(args) } } } }, initialOption: function(optionName) { var currentOptions, currentInitialized = this._initialized; if (!this._initialOptions) { currentOptions = this._options; this._options = {}; this._initialized = false; this._setDefaultOptions(); this._setOptionsByDevice(currentOptions.defaultOptionsRules); this._initialOptions = this._options; this._options = currentOptions; this._initialized = currentInitialized } return this._initialOptions[optionName] }, _defaultActionConfig: function() { return { context: this, component: this } }, _defaultActionArgs: function() { return { component: this } }, _createAction: function(actionSource, config) { var action, that = this; return function(e) { if (!arguments.length) { e = {} } if (e instanceof $.Event) { throw Error("Action must be executed with jQuery.Event like action({ jQueryEvent: event })") } if (!typeUtils.isPlainObject(e)) { e = { actionValue: e } } action = action || new Action(actionSource, extend(config, that._defaultActionConfig())); return action.execute.call(action, extend(e, that._defaultActionArgs())) } }, _createActionByOption: function(optionName, config) { var action, eventName, actionFunc, that = this; var result = function() { if (!eventName) { config = config || {}; if ("string" !== typeof optionName) { throw errors.Error("E0008") } if (0 === optionName.indexOf("on")) { eventName = that._getEventName(optionName) } if (0 !== optionName.indexOf("on")) { throw Error("The '" + optionName + "' option name should start with 'on' prefix") } actionFunc = that.option(optionName) } if (!action && !actionFunc && !config.beforeExecute && !config.afterExecute && !that.hasEvent(eventName)) { return } if (!action) { var beforeExecute = config.beforeExecute; config.beforeExecute = function(args) { that.fireEvent(eventName, args.args); beforeExecute && beforeExecute.apply(that, arguments) }; that._suppressDeprecatedWarnings(); action = that._createAction(actionFunc, config); that._resumeDeprecatedWarnings() } if (Config().wrapActionsBeforeExecute) { var beforeActionExecute = that.option("beforeActionExecute") || noop; action = beforeActionExecute(that, action, config) || action } return action.apply(that, arguments) }; if (!Config().wrapActionsBeforeExecute) { var onActionCreated = that.option("onActionCreated") || noop; result = onActionCreated(that, result, config) || result } return result }, _getEventName: function(actionName) { return actionName.charAt(2).toLowerCase() + actionName.substr(3) }, hasActionSubscription: function(actionName) { return !!this.option(actionName) || this.hasEvent(this._getEventName(actionName)) }, isOptionDeprecated: function(name) { var deprecatedOptions = this._getDeprecatedOptions(); return deprecatedOptions.hasOwnProperty(name) }, option: function() { var normalizeOptionName = function(that, name) { var deprecate; if (name) { if (!that._cachedDeprecateNames) { that._cachedDeprecateNames = []; for (var optionName in that._deprecatedOptions) { that._cachedDeprecateNames.push(optionName) } } for (var i = 0; i < that._cachedDeprecateNames.length; i++) { if (that._cachedDeprecateNames[i] === name) { deprecate = that._deprecatedOptions[name]; break } } if (deprecate) { that._logWarningIfDeprecated(name); var alias = deprecate.alias; if (alias) { name = alias } } } return name }; var getPreviousName = function(fullName) { var splitNames = fullName.split("."); splitNames.pop(); return splitNames.join(".") }; var getFieldName = function(fullName) { var splitNames = fullName.split("."); return splitNames[splitNames.length - 1] }; var getOptionValue = function(options, name, unwrapObservables) { var getter = cachedGetters[name]; if (!getter) { getter = cachedGetters[name] = coreDataUtils.compileGetter(name) } return getter(options, { functionsAsIs: true, unwrapObservables: unwrapObservables }) }; var clearOptionsField = function(options, name) { delete options[name]; var previousFieldName = getPreviousName(name), fieldName = getFieldName(name), fieldObject = previousFieldName ? getOptionValue(options, previousFieldName, false) : options; if (fieldObject) { delete fieldObject[fieldName] } }; var setOptionsField = function(options, fullName, value) { var fieldObject, fieldName = ""; do { if (fieldName) { fieldName = "." + fieldName } fieldName = getFieldName(fullName) + fieldName; fullName = getPreviousName(fullName); fieldObject = fullName ? getOptionValue(options, fullName, false) : options } while (!fieldObject); fieldObject[fieldName] = value }; var normalizeOptionValue = function(that, options, name, value) { if (name) { var alias = normalizeOptionName(that, name); if (alias && alias !== name) { setOptionsField(options, alias, value); clearOptionsField(options, name) } } }; var prepareOption = function(that, options, name, value) { if (typeUtils.isPlainObject(value)) { for (var valueName in value) { prepareOption(that, options, name + "." + valueName, value[valueName]) } } normalizeOptionValue(that, options, name, value) }; var setOptionValue = function(that, name, value) { if (!cachedSetters[name]) { cachedSetters[name] = coreDataUtils.compileSetter(name) } var path = name.split(/[.\[]/); cachedSetters[name](that._options, value, { functionsAsIs: true, merge: !that._getOptionsByReference()[name], unwrapObservables: path.length > 1 && !!that._getOptionsByReference()[path[0]] }) }; var setOption = function(that, name, value) { var previousValue = getOptionValue(that._options, name, false); if (that._optionValuesEqual(name, previousValue, value)) { return } if (that._initialized) { that._optionChanging(name, previousValue, value) } setOptionValue(that, name, value); that._notifyOptionChanged(name, value, previousValue) }; return function(options, value) { var that = this, name = options; if (arguments.length < 2 && "object" !== commonUtils.type(name)) { name = normalizeOptionName(that, name); return getOptionValue(that._options, name) } if ("string" === typeof name) { options = {}; options[name] = value } that.beginUpdate(); try { var optionName; for (optionName in options) { prepareOption(that, options, optionName, options[optionName]) } for (optionName in options) { setOption(that, optionName, options[optionName]) } } finally { that.endUpdate() } } }() }).include(EventsMixin); module.exports = Component }, /*!***************************!*\ !*** ./js/core/action.js ***! \***************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), config = __webpack_require__( /*! ./config */ 15), commonUtils = __webpack_require__( /*! ./utils/common */ 14), typeUtils = __webpack_require__( /*! ./utils/type */ 12), Class = __webpack_require__( /*! ./class */ 25); var Action = Class.inherit({ ctor: function(action, config) { config = config || {}; this._action = action; this._context = config.context || window; this._beforeExecute = config.beforeExecute; this._afterExecute = config.afterExecute; this._component = config.component; this._validatingTargetName = config.validatingTargetName; var excludeValidators = this._excludeValidators = {}; if (config.excludeValidators) { for (var i = 0; i < config.excludeValidators.length; i++) { excludeValidators[config.excludeValidators[i]] = true } } }, execute: function() { var e = { action: this._action, args: Array.prototype.slice.call(arguments), context: this._context, component: this._component, validatingTargetName: this._validatingTargetName, cancel: false, handled: false }; var beforeExecute = this._beforeExecute, afterExecute = this._afterExecute; if (!this._validateAction(e)) { return } beforeExecute && beforeExecute.call(this._context, e); if (e.cancel) { return } var result = this._executeAction(e); var argsBag = e.args[0]; if (argsBag && argsBag.cancel) { return } afterExecute && afterExecute.call(this._context, e); return result }, _validateAction: function(e) { var excludeValidators = this._excludeValidators, executors = Action.executors; for (var name in executors) { if (!excludeValidators[name]) { var executor = executors[name]; if (executor.validate) { executor.validate(e) } if (e.cancel) { return false } } } return true }, _executeAction: function(e) { var result, executors = Action.executors; for (var name in executors) { var executor = executors[name]; if (executor.execute) { executor.execute(e) } if (e.handled) { result = e.result; break } } return result } }); Action.executors = {}; Action.registerExecutor = function(name, executor) { if (typeUtils.isPlainObject(name)) { $.each(name, Action.registerExecutor); return } Action.executors[name] = executor }; Action.unregisterExecutor = function() { var args = $.makeArray(arguments); $.each(args, function() { delete Action.executors[this] }) }; Action.registerExecutor({ undefined: { execute: function(e) { if (!e.action) { e.result = void 0; e.handled = true } } }, func: { execute: function(e) { if (commonUtils.isFunction(e.action)) { e.result = e.action.call(e.context, e.args[0]); e.handled = true } } } }); var createValidatorByTargetElement = function(condition) { return function(e) { if (!e.args.length) { return } var args = e.args[0], element = args[e.validatingTargetName] || args.element; if (element && condition(element)) { e.cancel = true } } }; Action.registerExecutor({ designMode: { validate: function(e) { if (config().designMode) { e.cancel = true } } }, disabled: { validate: createValidatorByTargetElement(function($target) { return $target.is(".dx-state-disabled, .dx-state-disabled *") }) }, readOnly: { validate: createValidatorByTargetElement(function($target) { return $target.is(".dx-state-readonly, .dx-state-readonly *") }) } }); module.exports = Action }, /*!*******************************!*\ !*** ./js/core/utils/data.js ***! \*******************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), errors = __webpack_require__( /*! ../errors */ 7), Class = __webpack_require__( /*! ../class */ 25), objectUtils = __webpack_require__( /*! ./object */ 27), commonUtils = __webpack_require__( /*! ./common */ 14), typeUtils = __webpack_require__( /*! ./type */ 12), variableWrapper = __webpack_require__( /*! ./variable_wrapper */ 28), unwrapVariable = variableWrapper.unwrap, isWrapped = variableWrapper.isWrapped, assign = variableWrapper.assign; var bracketsToDots = function(expr) { return expr.replace(/\[/g, ".").replace(/\]/g, "") }; var readPropValue = function(obj, propName) { if ("this" === propName) { return obj } return obj[propName] }; var assignPropValue = function(obj, propName, value, options) { if ("this" === propName) { throw new errors.Error("E4016") } var propValue = obj[propName]; if (options.unwrapObservables && isWrapped(propValue)) { assign(propValue, value) } else { obj[propName] = value } }; var prepareOptions = function(options) { options = options || {}; options.unwrapObservables = void 0 !== options.unwrapObservables ? options.unwrapObservables : true; return options }; var unwrap = function(value, options) { return options.unwrapObservables ? unwrapVariable(value) : value }; var compileGetter = function(expr) { if (arguments.length > 1) { expr = $.makeArray(arguments) } if (!expr || "this" === expr) { return function(obj) { return obj } } if ("string" === typeof expr) { expr = bracketsToDots(expr); var path = expr.split("."); return function(obj, options) { options = prepareOptions(options); var functionAsIs = options.functionsAsIs, current = unwrap(obj, options); for (var i = 0; i < path.length; i++) { if (!current) { break } var next = unwrap(current[path[i]], options); if (!functionAsIs && commonUtils.isFunction(next)) { next = next.call(current) } current = next } return current } } if (Array.isArray(expr)) { return combineGetters(expr) } if (commonUtils.isFunction(expr)) { return expr } }; var combineGetters = function(getters) { var compiledGetters = {}; for (var i = 0, l = getters.length; i < l; i++) { var getter = getters[i]; compiledGetters[getter] = compileGetter(getter) } return function(obj, options) { var result; $.each(compiledGetters, function(name) { var current, path, last, i, value = this(obj, options); if (void 0 === value) { return } current = result || (result = {}); path = name.split("."); last = path.length - 1; for (i = 0; i < last; i++) { current = current[path[i]] = {} } current[path[i]] = value }); return result } }; var compileSetter = function(expr) { expr = expr || "this"; expr = bracketsToDots(expr); var pos = expr.lastIndexOf("."), targetGetter = compileGetter(expr.substr(0, pos)), targetPropName = expr.substr(1 + pos); return function(obj, value, options) { options = prepareOptions(options); var target = targetGetter(obj, { functionsAsIs: options.functionsAsIs, unwrapObservables: options.unwrapObservables }), prevTargetValue = readPropValue(target, targetPropName); if (!options.functionsAsIs && commonUtils.isFunction(prevTargetValue) && !isWrapped(prevTargetValue)) { target[targetPropName](value) } else { prevTargetValue = unwrap(prevTargetValue, options); if (options.merge && typeUtils.isPlainObject(value) && (void 0 === prevTargetValue || typeUtils.isPlainObject(prevTargetValue)) && !(value instanceof $.Event)) { if (!prevTargetValue) { assignPropValue(target, targetPropName, {}, options) } target = unwrap(readPropValue(target, targetPropName), options); objectUtils.deepExtendArraySafe(target, value, false, true) } else { assignPropValue(target, targetPropName, value, options) } } } }; var toComparable = function(value, caseSensitive) { if (value instanceof Date) { return value.getTime() } if (value && value instanceof Class && value.valueOf) { return value.valueOf() } if (!caseSensitive && "string" === typeof value) { return value.toLowerCase() } return value }; exports.compileGetter = compileGetter; exports.compileSetter = compileSetter; exports.toComparable = toComparable }, /*!*********************************!*\ !*** ./js/core/events_mixin.js ***! \*********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), DefaultEventsStrategy = __webpack_require__( /*! ./events_strategy */ 52), isPlainObject = __webpack_require__( /*! ./utils/type */ 12).isPlainObject; module.exports = { ctor: function() { this._events = {}; this.setEventsStrategy(new DefaultEventsStrategy(this)) }, setEventsStrategy: function(strategy) { this._eventsStrategy = strategy }, hasEvent: function(eventName) { return this._eventsStrategy.hasEvent(eventName) }, fireEvent: function(eventName, eventArgs) { this._eventsStrategy.fireEvent(eventName, eventArgs); return this }, on: function(eventName, eventHandler) { if (isPlainObject(eventName)) { $.each(eventName, function(e, h) { this.on(e, h) }.bind(this)) } else { this._eventsStrategy.on(eventName, eventHandler) } return this }, off: function(eventName, eventHandler) { this._eventsStrategy.off(eventName, eventHandler); return this }, _disposeEvents: function() { this._eventsStrategy.dispose() } } }, /*!************************************!*\ !*** ./js/core/events_strategy.js ***! \************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), isFunction = __webpack_require__( /*! ./utils/common */ 14).isFunction, Class = __webpack_require__( /*! ./class */ 25); module.exports = Class.inherit({ ctor: function(owner) { this._events = {}; this._owner = owner }, hasEvent: function(eventName) { var callbacks = this._events[eventName]; if (callbacks) { return callbacks.has() } return false }, fireEvent: function(eventName, eventArgs) { var callbacks = this._events[eventName]; if (callbacks) { callbacks.fireWith(this._owner, eventArgs) } }, on: function(eventName, eventHandler) { var addFn, callbacks = this._events[eventName]; if (!callbacks) { callbacks = $.Callbacks(); this._events[eventName] = callbacks } addFn = callbacks.originalAdd || callbacks.add; addFn.call(callbacks, eventHandler) }, off: function(eventName, eventHandler) { var callbacks = this._events[eventName]; if (callbacks) { if (isFunction(eventHandler)) { callbacks.remove(eventHandler) } else { callbacks.empty() } } }, dispose: function() { $.each(this._events, function() { this.empty() }) } }) }, /*!****************************!*\ !*** ./js/core/devices.js ***! \****************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), extend = __webpack_require__( /*! ./utils/extend */ 11).extend, isPlainObject = __webpack_require__( /*! ./utils/type */ 12).isPlainObject, Class = __webpack_require__( /*! ./class */ 25), errors = __webpack_require__( /*! ./errors */ 7), resizeCallbacks = __webpack_require__( /*! ./utils/window */ 44).resizeCallbacks, EventsMixin = __webpack_require__( /*! ./events_mixin */ 51), SessionStorage = __webpack_require__( /*! ./utils/storage */ 54).sessionStorage, viewPort = __webpack_require__( /*! ./utils/view_port */ 55), Config = __webpack_require__( /*! ./config */ 15); var KNOWN_UA_TABLE = { iPhone: "iPhone", iPhone5: "iPhone", iPhone6: "iPhone", iPhone6plus: "iPhone", iPad: "iPad", iPadMini: "iPad Mini", androidPhone: "Android Mobile", androidTablet: "Android", win8: "MSAppHost", win8Phone: "Windows Phone 8.0", msSurface: "Windows ARM Tablet PC", desktop: "desktop", win10Phone: "Windows Phone 10.0", win10: "MSAppHost/3.0" }; var DEFAULT_DEVICE = { deviceType: "desktop", platform: "generic", version: [], phone: false, tablet: false, android: false, ios: false, win: false, generic: true, grade: "A", mac: false }; var uaParsers = { win: function(userAgent) { var isPhone = /windows phone/i.test(userAgent) || userAgent.match(/WPDesktop/), isTablet = !isPhone && /Windows(.*)arm(.*)Tablet PC/i.test(userAgent), isDesktop = !isPhone && !isTablet && /msapphost/i.test(userAgent); if (!(isPhone || isTablet || isDesktop)) { return } var matches = userAgent.match(/windows phone (\d+).(\d+)/i) || userAgent.match(/windows nt (\d+).(\d+)/i), version = []; if (matches) { version.push(parseInt(matches[1], 10), parseInt(matches[2], 10)) } else { matches = userAgent.match(/msapphost(\/(\d+).(\d+))?/i); matches && version.push(3 === parseInt(matches[2], 10) ? 10 : 8) } return { deviceType: isPhone ? "phone" : isTablet ? "tablet" : "desktop", platform: "win", version: version, grade: "A" } }, ios: function(userAgent) { if (!/ip(hone|od|ad)/i.test(userAgent)) { return } var isPhone = /ip(hone|od)/i.test(userAgent), matches = userAgent.match(/os (\d+)_(\d+)_?(\d+)?/i), version = matches ? [parseInt(matches[1], 10), parseInt(matches[2], 10), parseInt(matches[3] || 0, 10)] : [], isIPhone4 = 480 === window.screen.height, grade = isIPhone4 ? "B" : "A"; return { deviceType: isPhone ? "phone" : "tablet", platform: "ios", version: version, grade: grade } }, android: function(userAgent) { if (!/android|htc_|silk/i.test(userAgent)) { return } var isPhone = /mobile/i.test(userAgent), matches = userAgent.match(/android (\d+)\.(\d+)\.?(\d+)?/i), version = matches ? [parseInt(matches[1], 10), parseInt(matches[2], 10), parseInt(matches[3] || 0, 10)] : [], worseThan4_4 = version.length > 1 && (version[0] < 4 || 4 === version[0] && version[1] < 4), grade = worseThan4_4 ? "B" : "A"; return { deviceType: isPhone ? "phone" : "tablet", platform: "android", version: version, grade: grade } } }; var Devices = Class.inherit({ ctor: function(options) { this._window = options && options.window || window; this._realDevice = this._getDevice(); this._currentDevice = void 0; this._currentOrientation = void 0; this.changed = $.Callbacks(); this._recalculateOrientation(); resizeCallbacks.add(this._recalculateOrientation.bind(this)) }, current: function(deviceOrName) { if (deviceOrName) { this._currentDevice = this._getDevice(deviceOrName); this._forced = true; this.changed.fire(); if ("win" === this._currentDevice.platform && 8 === this._currentDevice.version[0]) { errors.log("W0010", "the 'win8' theme", "16.1", "Use the 'win10' theme instead.") } return } if (!this._currentDevice) { deviceOrName = void 0; try { deviceOrName = this._getDeviceOrNameFromWindowScope() } catch (e) { deviceOrName = this._getDeviceNameFromSessionStorage() } finally { if (!deviceOrName) { deviceOrName = this._getDeviceNameFromSessionStorage() } if (deviceOrName) { this._forced = true } } this._currentDevice = this._getDevice(deviceOrName) } return this._currentDevice }, real: function() { var forceDevice = arguments[0]; if (isPlainObject(forceDevice)) { extend(this._realDevice, forceDevice); return } return extend({}, this._realDevice) }, orientation: function() { return this._currentOrientation }, isForced: function() { return this._forced }, isRippleEmulator: function() { return !!this._window.tinyHippos }, _getCssClasses: function(device) { var result = []; var realDevice = this._realDevice; device = device || this.current(); if (device.deviceType) { result.push("dx-device-" + device.deviceType); if ("desktop" !== device.deviceType) { result.push("dx-device-mobile") } } result.push("dx-device-" + realDevice.platform); if (realDevice.version && realDevice.version.length) { result.push("dx-device-" + realDevice.platform + "-" + realDevice.version[0]) } if (devices.isSimulator()) { result.push("dx-simulator") } if (Config().rtlEnabled) { result.push("dx-rtl") } return result }, attachCssClasses: function(element, device) { this._deviceClasses = this._getCssClasses(device).join(" "); $(element).addClass(this._deviceClasses) }, detachCssClasses: function(element) { $(element).removeClass(this._deviceClasses) }, isSimulator: function() { try { return this._isSimulator || this._window.top !== this._window.self && this._window.top["dx-force-device"] || this.isRippleEmulator() } catch (e) { return false } }, forceSimulator: function() { this._isSimulator = true }, _getDevice: function(deviceName) { if ("genericPhone" === deviceName) { deviceName = { deviceType: "phone", platform: "generic", generic: true } } if (isPlainObject(deviceName)) { return this._fromConfig(deviceName) } else { var ua; if (deviceName) { ua = KNOWN_UA_TABLE[deviceName]; if (!ua) { throw errors.Error("E0005") } } else { ua = navigator.userAgent } return this._fromUA(ua) } }, _getDeviceOrNameFromWindowScope: function() { var result; if (this._window.top["dx-force-device-object"] || this._window.top["dx-force-device"]) { result = this._window.top["dx-force-device-object"] || this._window.top["dx-force-device"] } return result }, _getDeviceNameFromSessionStorage: function() { var sessionStorage = SessionStorage(); if (!sessionStorage) { return } var deviceOrName = sessionStorage.getItem("dx-force-device"); try { return JSON.parse(deviceOrName) } catch (ex) { return deviceOrName } }, _fromConfig: function(config) { var result = extend({}, DEFAULT_DEVICE, this._currentDevice, config), shortcuts = { phone: "phone" === result.deviceType, tablet: "tablet" === result.deviceType, android: "android" === result.platform, ios: "ios" === result.platform, win: "win" === result.platform, generic: "generic" === result.platform }; return extend(result, shortcuts) }, _fromUA: function(ua) { var config; $.each(uaParsers, function(platform, parser) { config = parser(ua); return !config }); if (config) { return this._fromConfig(config) } var isMac = /(mac os)/.test(ua.toLowerCase()), deviceWithOS = DEFAULT_DEVICE; deviceWithOS.mac = isMac; return deviceWithOS }, _changeOrientation: function() { var $window = $(this._window), orientation = $window.height() > $window.width() ? "portrait" : "landscape"; if (this._currentOrientation === orientation) { return } this._currentOrientation = orientation; this.fireEvent("orientationChanged", [{ orientation: orientation }]) }, _recalculateOrientation: function() { var windowWidth = $(this._window).width(); if (this._currentWidth === windowWidth) { return } this._currentWidth = windowWidth; this._changeOrientation() } }).include(EventsMixin); var devices = new Devices; viewPort.changeCallback.add(function(viewPort, prevViewport) { devices.detachCssClasses(prevViewport); devices.attachCssClasses(viewPort) }); if (!devices.isForced() && "win" === devices.current().platform) { devices.current({ version: [10] }) } module.exports = devices }, /*!**********************************!*\ !*** ./js/core/utils/storage.js ***! \**********************************/ function(module, exports) { var getSessionStorage = function() { var sessionStorage; try { sessionStorage = window.sessionStorage } catch (e) {} return sessionStorage }; exports.sessionStorage = getSessionStorage }, /*!************************************!*\ !*** ./js/core/utils/view_port.js ***! \************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), ready = __webpack_require__( /*! ./dom */ 56).ready, changeCallback = $.Callbacks(), $originalViewPort = $(); var value = function() { var $current; return function(element) { if (!arguments.length) { return $current } var $element = $(element); $originalViewPort = $element; var isNewViewportFound = !!$element.length; var prevViewPort = value(); $current = isNewViewportFound ? $element : $("body"); changeCallback.fire(isNewViewportFound ? value() : $(), prevViewPort) } }(); ready(function() { value(".dx-viewport") }); exports.value = value; exports.changeCallback = changeCallback; exports.originalViewPort = function() { return $originalViewPort } }, /*!******************************!*\ !*** ./js/core/utils/dom.js ***! \******************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), errors = __webpack_require__( /*! ../errors */ 7), inArray = __webpack_require__( /*! ./array */ 26).inArray, commonUtils = __webpack_require__( /*! ./common */ 14); var resetActiveElement = function() { var activeElement = document.activeElement; if (activeElement && activeElement !== document.body && activeElement.blur) { activeElement.blur() } }; var clearSelection = function() { var selection = window.getSelection(); if (!selection) { return } if ("Caret" === selection.type) { return } if (selection.empty) { selection.empty() } else { if (selection.removeAllRanges) { try { selection.removeAllRanges() } catch (e) {} } } }; var closestCommonParent = function(startTarget, endTarget) { var $startTarget = $(startTarget), $endTarget = $(endTarget); if ($startTarget[0] === $endTarget[0]) { return $startTarget[0] } var $startParents = $startTarget.parents(), $endParents = $endTarget.parents(), startingParent = Math.min($startParents.length, $endParents.length); for (var i = -startingParent; i < 0; i++) { if ($startParents.get(i) === $endParents.get(i)) { return $startParents.get(i) } } }; var triggerVisibilityChangeEvent = function(eventName) { var VISIBILITY_CHANGE_SELECTOR = ".dx-visibility-change-handler"; return function(element) { var $element = $(element || "body"); var changeHandlers = $element.filter(VISIBILITY_CHANGE_SELECTOR).add($element.find(VISIBILITY_CHANGE_SELECTOR)); for (var i = 0; i < changeHandlers.length; i++) { $(changeHandlers[i]).triggerHandler(eventName) } } }; var uniqueId = function() { var counter = 0; return function(prefix) { return (prefix || "") + counter++ } }(); var dataOptionsAttributeName = "data-options"; var getElementOptions = function(element) { var result, optionsString = $(element).attr(dataOptionsAttributeName); if ("{" !== $.trim(optionsString).charAt(0)) { optionsString = "{" + optionsString + "}" } try { result = new Function("return " + optionsString)() } catch (ex) { throw errors.Error("E3018", ex, optionsString) } return result }; var createComponents = function(elements, componentTypes) { var result = [], selector = "[" + dataOptionsAttributeName + "]"; var $items = elements.find(selector).add(elements.filter(selector)); $items.each(function(index, element) { var $element = $(element), options = getElementOptions(element); for (var componentName in options) { if (!componentTypes || inArray(componentName, componentTypes) > -1) { if ($element[componentName]) { $element[componentName](options[componentName]); result.push($element[componentName]("instance")) } } } }); return result }; var createMarkupFromString = function(str) { if (!window.WinJS) { return $(str) } var tempElement = $("<div />"); window.WinJS.Utilities.setInnerHTMLUnsafe(tempElement.get(0), str); return tempElement.contents() }; var normalizeTemplateElement = function(element) { var $element = commonUtils.isDefined(element) && (element.nodeType || element.jquery) ? $(element) : $("<div>").html(element).contents(); if (1 === $element.length) { if ($element.is("script")) { $element = normalizeTemplateElement($element.html()) } else { if ($element.is("table")) { $element = $element.children("tbody").contents() } } } return $element }; var toggleAttr = function($target, attr, value) { value ? $target.attr(attr, value) : $target.removeAttr(attr) }; var clipboardText = function(event, text) { var clipboard = event.originalEvent && event.originalEvent.clipboardData || window.clipboardData; if (1 === arguments.length) { return clipboard && clipboard.getData("Text") } clipboard && clipboard.setData("Text", text) }; exports.ready = function(callback) { if ("complete" === document.readyState || "loading" !== document.readyState && !document.documentElement.doScroll) { callback(); return } var loadedCallback = function() { callback(); document.removeEventListener("DOMContentLoaded", loadedCallback) }; document.addEventListener("DOMContentLoaded", loadedCallback) }; exports.resetActiveElement = resetActiveElement; exports.createMarkupFromString = createMarkupFromString; exports.triggerShownEvent = triggerVisibilityChangeEvent("dxshown"); exports.triggerHidingEvent = triggerVisibilityChangeEvent("dxhiding"); exports.triggerResizeEvent = triggerVisibilityChangeEvent("dxresize"); exports.getElementOptions = getElementOptions; exports.createComponents = createComponents; exports.normalizeTemplateElement = normalizeTemplateElement; exports.clearSelection = clearSelection; exports.uniqueId = uniqueId; exports.closestCommonParent = closestCommonParent; exports.clipboardText = clipboardText; exports.toggleAttr = toggleAttr }, /*!******************************************!*\ !*** ./js/core/component_registrator.js ***! \******************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), jQuery = __webpack_require__( /*! jquery */ 10), errors = __webpack_require__( /*! ./errors */ 7), MemorizedCallbacks = __webpack_require__( /*! ./memorized_callbacks */ 58), publicComponentUtils = __webpack_require__( /*! ./utils/public_component */ 45); var callbacks = new MemorizedCallbacks; var registerComponent = function(name, namespace, componentClass) { if (!componentClass) { componentClass = namespace } else { namespace[name] = componentClass } publicComponentUtils.name(componentClass, name); callbacks.fire(name, componentClass) }; registerComponent.callbacks = callbacks; var registerJQueryComponent = function(name, componentClass) { $.fn[name] = jQuery.fn[name] = function(options) { var result, isMemberInvoke = "string" === typeof options; if (isMemberInvoke) { var memberName = options, memberArgs = $.makeArray(arguments).slice(1); this.each(function() { var instance = componentClass.getInstance(this); if (!instance) { throw errors.Error("E0009", name) } var member = instance[memberName], memberValue = member.apply(instance, memberArgs); if (void 0 === result) { result = memberValue } }) } else { this.each(function() { var instance = componentClass.getInstance(this); if (instance) { instance.option(options) } else { new componentClass(this, options) } }); result = this } return result } }; callbacks.add(registerJQueryComponent); module.exports = registerComponent }, /*!****************************************!*\ !*** ./js/core/memorized_callbacks.js ***! \****************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9); var MemorizedCallbacks = function() { var memory = []; var callbacks = $.Callbacks(); this.add = function(fn) { $.each(memory, function(_, item) { fn.apply(fn, item) }); callbacks.add(fn) }; this.remove = function(fn) { callbacks.remove(fn) }; this.fire = function() { memory.push(arguments); callbacks.fire.apply(callbacks, arguments) } }; module.exports = MemorizedCallbacks }, /*!*******************************!*\ !*** ./js/animation/frame.js ***! \*******************************/ function(module, exports) { var FRAME_ANIMATION_STEP_TIME = 1e3 / 60, request = function(callback) { return this.setTimeout(callback, FRAME_ANIMATION_STEP_TIME) }, cancel = function(requestID) { this.clearTimeout(requestID) }, nativeRequest = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame, nativeCancel = window.cancelAnimationFrame || window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || window.oCancelAnimationFrame || window.msCancelAnimationFrame; if (nativeRequest && nativeCancel) { request = nativeRequest; cancel = nativeCancel } if (nativeRequest && !nativeCancel) { var canceledRequests = {}; request = function(callback) { var requestId = nativeRequest.call(window, function() { try { if (requestId in canceledRequests) { return } callback.apply(this, arguments) } finally { delete canceledRequests[requestId] } }); return requestId }; cancel = function(requestId) { canceledRequests[requestId] = true } } exports.requestAnimationFrame = request.bind(window); exports.cancelAnimationFrame = cancel.bind(window) }, /*!****************************************************************!*\ !*** ./js/mobile/init_mobile_viewport/init_mobile_viewport.js ***! \****************************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, resizeCallbacks = __webpack_require__( /*! ../../core/utils/window */ 44).resizeCallbacks, support = __webpack_require__( /*! ../../core/utils/support */ 61), devices = __webpack_require__( /*! ../../core/devices */ 53); var initMobileViewport = function(options) { options = extend({}, options); var realDevice = devices.real(); var allowZoom = options.allowZoom; var allowPan = options.allowPan; var allowSelection = "allowSelection" in options ? options.allowSelection : "generic" === realDevice.platform; var metaSelector = "meta[name=viewport]"; if (!$(metaSelector).length) { $("<meta />").attr("name", "viewport").appendTo("head") } var metaVerbs = ["width=device-width"], msTouchVerbs = []; if (allowZoom) { msTouchVerbs.push("pinch-zoom") } else { metaVerbs.push("initial-scale=1.0", "maximum-scale=1.0, user-scalable=no") } if (allowPan) { msTouchVerbs.push("pan-x", "pan-y") } if (!allowPan && !allowZoom) { $("html, body").css({ "-ms-content-zooming": "none", "-ms-user-select": "none", overflow: "hidden" }) } else { $("html").css("-ms-overflow-style", "-ms-autohiding-scrollbar") } if (!allowSelection && support.supportProp("user-select")) { $(".dx-viewport").css(support.styleProp("user-select"), "none") } $(metaSelector).attr("content", metaVerbs.join()); $("html").css("-ms-touch-action", msTouchVerbs.join(" ") || "none"); realDevice = devices.real(); if (support.touch && !("win" === realDevice.platform && 10 === realDevice.version[0])) { $(document).off(".dxInitMobileViewport").on("dxpointermove.dxInitMobileViewport", function(e) { var count = e.pointers.length, isTouchEvent = "touch" === e.pointerType, zoomDisabled = !allowZoom && count > 1, panDisabled = !allowPan && 1 === count && !e.isScrollingEvent; if (isTouchEvent && (zoomDisabled || panDisabled)) { e.preventDefault() } }) } if (realDevice.ios) { var isPhoneGap = "file:" === document.location.protocol; if (!isPhoneGap) { resizeCallbacks.add(function() { var windowWidth = $(window).width(); $("body").width(windowWidth) }) } } if (realDevice.android) { resizeCallbacks.add(function() { setTimeout(function() { document.activeElement.scrollIntoViewIfNeeded() }) }) } }; exports.initMobileViewport = initMobileViewport }, /*!**********************************!*\ !*** ./js/core/utils/support.js ***! \**********************************/ function(module, exports, __webpack_require__) { var inflector = __webpack_require__( /*! ./inflector */ 39), inArray = __webpack_require__( /*! ./array */ 26).inArray, devices = __webpack_require__( /*! ../devices */ 53); var camelize = inflector.camelize; var jsPrefixes = ["", "Webkit", "Moz", "O", "Ms"], cssPrefixes = { "": "", Webkit: "-webkit-", Moz: "-moz-", O: "-o-", ms: "-ms-" }, styles = document.createElement("dx").style; var transitionEndEventNames = { webkitTransition: "webkitTransitionEnd", MozTransition: "transitionend", OTransition: "oTransitionEnd", msTransition: "MsTransitionEnd", transition: "transitionend" }; var forEachPrefixes = function(prop, callBack) { prop = camelize(prop, true); var result; for (var i = 0, cssPrefixesCount = jsPrefixes.length; i < cssPrefixesCount; i++) { var jsPrefix = jsPrefixes[i]; var prefixedProp = jsPrefix + prop; var lowerPrefixedProp = camelize(prefixedProp); result = callBack(lowerPrefixedProp, jsPrefix); if (void 0 === result) { result = callBack(prefixedProp, jsPrefix) } if (void 0 !== result) { break } } return result }; var styleProp = function(prop) { return forEachPrefixes(prop, function(specific) { if (specific in styles) { return specific } }) }; var stylePropPrefix = function(prop) { return forEachPrefixes(prop, function(specific, jsPrefix) { if (specific in styles) { return cssPrefixes[jsPrefix] } }) }; var supportProp = function(prop) { return !!styleProp(prop) }; var isNativeScrollingSupported = function() { var realDevice = devices.real(), realPlatform = realDevice.platform, realVersion = realDevice.version, isObsoleteAndroid = realVersion && realVersion[0] < 4 && "android" === realPlatform, isNativeScrollDevice = !isObsoleteAndroid && inArray(realPlatform, ["ios", "android", "win"]) > -1 || realDevice.mac; return isNativeScrollDevice }; var inputType = function(type) { if ("text" === type) { return true } var input = document.createElement("input"); try { input.setAttribute("type", type); input.value = "wrongValue"; return !input.value } catch (e) { return false } }; var touchEvents = "ontouchstart" in window && !("callPhantom" in window), pointerEvents = !!window.navigator.pointerEnabled || !!window.navigator.msPointerEnabled, touchPointersPresent = !!window.navigator.maxTouchPoints || !!window.navigator.msMaxTouchPoints; exports.touchEvents = touchEvents; exports.pointerEvents = pointerEvents; exports.touch = touchEvents || pointerEvents && touchPointersPresent; exports.transition = supportProp("transition"); exports.transitionEndEventName = transitionEndEventNames[styleProp("transition")]; exports.animation = supportProp("animation"); exports.nativeScrolling = isNativeScrollingSupported(); exports.styleProp = styleProp; exports.stylePropPrefix = stylePropPrefix; exports.supportProp = supportProp; exports.hasKo = !!window.ko; exports.inputType = inputType }, /*!********************************!*\ !*** ./js/core/utils/queue.js ***! \********************************/ function(module, exports, __webpack_require__) { var errors = __webpack_require__( /*! ../errors */ 7), when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when; function createQueue(discardPendingTasks) { var _tasks = [], _busy = false; function exec() { while (_tasks.length) { _busy = true; var task = _tasks.shift(), result = task(); if (void 0 === result) { continue } if (result.then) { when(result).always(exec); return } throw errors.Error("E0015") } _busy = false } function add(task, removeTaskCallback) { if (!discardPendingTasks) { _tasks.push(task) } else { if (_tasks[0] && removeTaskCallback) { removeTaskCallback(_tasks[0]) } _tasks = [task] } if (!_busy) { exec() } } function busy() { return _busy } return { add: add, busy: busy } } exports.create = createQueue; exports.enqueue = createQueue().add }, /*!*******************************!*\ !*** ./js/core/utils/date.js ***! \*******************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ./common */ 14), camelize = __webpack_require__( /*! ./inflector */ 39).camelize, isObject = commonUtils.isObject, isString = commonUtils.isString, isDate = commonUtils.isDate, isDefined = commonUtils.isDefined; var dateUnitIntervals = ["millisecond", "second", "minute", "hour", "day", "week", "month", "quarter", "year"]; var toMilliseconds = function(value) { switch (value) { case "millisecond": return 1; case "second": return 1e3 * toMilliseconds("millisecond"); case "minute": return 60 * toMilliseconds("second"); case "hour": return 60 * toMilliseconds("minute"); case "day": return 24 * toMilliseconds("hour"); case "week": return 7 * toMilliseconds("day"); case "month": return 30 * toMilliseconds("day"); case "quarter": return 3 * toMilliseconds("month"); case "year": return 365 * toMilliseconds("day"); default: return 0 } }; var getDatesInterval = function(startDate, endDate, intervalUnit) { var delta = endDate.getTime() - startDate.getTime(), millisecondCount = toMilliseconds(intervalUnit) || 1; return Math.floor(delta / millisecondCount) }; var getNextDateUnit = function(unit, withWeeks) { var interval = getDateUnitInterval(unit); switch (interval) { case "millisecond": return "second"; case "second": return "minute"; case "minute": return "hour"; case "hour": return "day"; case "day": return withWeeks ? "week" : "month"; case "week": return "month"; case "month": return "quarter"; case "quarter": return "year"; case "year": return "year"; default: return 0 } }; var convertMillisecondsToDateUnits = function(value) { var i, dateUnitCount, dateUnitInterval, dateUnitIntervals = ["millisecond", "second", "minute", "hour", "day", "month", "year"], result = {}; for (i = dateUnitIntervals.length - 1; i >= 0; i--) { dateUnitInterval = dateUnitIntervals[i]; dateUnitCount = Math.floor(value / toMilliseconds(dateUnitInterval)); if (dateUnitCount > 0) { result[dateUnitInterval + "s"] = dateUnitCount; value -= convertDateUnitToMilliseconds(dateUnitInterval, dateUnitCount) } } return result }; var dateToMilliseconds = function(tickInterval) { var milliseconds = 0; if (isObject(tickInterval)) { $.each(tickInterval, function(key, value) { milliseconds += convertDateUnitToMilliseconds(key.substr(0, key.length - 1), value) }) } if (isString(tickInterval)) { milliseconds = convertDateUnitToMilliseconds(tickInterval, 1) } return milliseconds }; var convertDateUnitToMilliseconds = function(dateUnit, count) { return toMilliseconds(dateUnit) * count }; var getDateUnitInterval = function(tickInterval) { var i, maxInterval = -1; if (isString(tickInterval)) { return tickInterval } if (isObject(tickInterval)) { $.each(tickInterval, function(key, value) { for (i = 0; i < dateUnitIntervals.length; i++) { if (value && (key === dateUnitIntervals[i] + "s" || key === dateUnitIntervals[i]) && maxInterval < i) { maxInterval = i } } }); return dateUnitIntervals[maxInterval] } return "" }; var tickIntervalToFormatMap = { millisecond: "millisecond", second: "longtime", minute: "shorttime", hour: "shorttime", day: "day", week: "day", month: "month", quarter: "quarter", year: "year" }; function getDateFormatByTickInterval(tickInterval) { return tickIntervalToFormatMap[getDateUnitInterval(tickInterval)] || "" } var getQuarter = function(month) { return Math.floor(month / 3) }; var getFirstQuarterMonth = function(month) { return 3 * getQuarter(month) }; var correctDateWithUnitBeginning = function(date, dateInterval, withCorrection) { date = new Date(date.getTime()); var firstQuarterMonth, oldDate = new Date(date.getTime()), dateUnitInterval = getDateUnitInterval(dateInterval); switch (dateUnitInterval) { case "second": date.setMilliseconds(0); break; case "minute": date.setSeconds(0, 0); break; case "hour": date.setMinutes(0, 0, 0); break; case "year": date.setMonth(0); case "month": date.setDate(1); case "day": date.setHours(0, 0, 0, 0); break; case "week": date.setDate(date.getDate() - date.getDay()); date.setHours(0, 0, 0, 0); break; case "quarter": firstQuarterMonth = getFirstQuarterMonth(date.getMonth()); if (date.getMonth() !== firstQuarterMonth) { date.setMonth(firstQuarterMonth) } date.setDate(1); date.setHours(0, 0, 0, 0) } if (withCorrection && "hour" !== dateUnitInterval && "minute" !== dateUnitInterval && "second" !== dateUnitInterval) { fixTimezoneGap(oldDate, date) } return date }; var trimTime = function(date) { return dateUtils.correctDateWithUnitBeginning(date, "day") }; var getDatesDifferences = function(date1, date2) { var differences, counter = 0; differences = { year: date1.getFullYear() !== date2.getFullYear(), month: date1.getMonth() !== date2.getMonth(), day: date1.getDate() !== date2.getDate(), hour: date1.getHours() !== date2.getHours(), minute: date1.getMinutes() !== date2.getMinutes(), second: date1.getSeconds() !== date2.getSeconds(), millisecond: date1.getMilliseconds() !== date2.getMilliseconds() }; $.each(differences, function(key, value) { if (value) { counter++ } }); differences.count = counter; return differences }; function addDateInterval(value, interval, dir) { var result = new Date(value.getTime()), intervalObject = isString(interval) ? getDateIntervalByString(interval.toLowerCase()) : interval; if (intervalObject.years) { result.setFullYear(result.getFullYear() + intervalObject.years * dir) } if (intervalObject.quarters) { result.setMonth(result.getMonth() + 3 * intervalObject.quarters * dir) } if (intervalObject.months) { result.setMonth(result.getMonth() + intervalObject.months * dir) } if (intervalObject.weeks) { result.setDate(result.getDate() + 7 * intervalObject.weeks * dir) } if (intervalObject.days) { result.setDate(result.getDate() + intervalObject.days * dir) } if (intervalObject.hours) { result.setHours(result.getHours() + intervalObject.hours * dir) } if (intervalObject.minutes) { result.setMinutes(result.getMinutes() + intervalObject.minutes * dir) } if (intervalObject.seconds) { result.setSeconds(result.getSeconds() + intervalObject.seconds * dir) } if (intervalObject.milliseconds) { result.setMilliseconds(value.getMilliseconds() + intervalObject.milliseconds * dir) } return result } var addInterval = function(value, interval, isNegative) { var dir = isNegative ? -1 : 1; return isDate(value) ? addDateInterval(value, interval, dir) : value + interval * dir }; var getSequenceByInterval = function(min, max, interval) { var cur, intervals = []; intervals.push(isDate(min) ? new Date(min.getTime()) : min); cur = min; while (cur < max) { cur = addInterval(cur, interval); intervals.push(cur) } return intervals }; var getViewFirstCellDate = function(viewType, date) { if ("month" === viewType) { return new Date(date.getFullYear(), date.getMonth(), 1) } if ("year" === viewType) { return new Date(date.getFullYear(), 0, date.getDate()) } if ("decade" === viewType) { return new Date(getFirstYearInDecade(date), date.getMonth(), date.getDate()) } if ("century" === viewType) { return new Date(getFirstDecadeInCentury(date), date.getMonth(), date.getDate()) } }; var getViewLastCellDate = function(viewType, date) { if ("month" === viewType) { return new Date(date.getFullYear(), date.getMonth(), getLastMonthDay(date)) } if ("year" === viewType) { return new Date(date.getFullYear(), 11, date.getDate()) } if ("decade" === viewType) { return new Date(getFirstYearInDecade(date) + 9, date.getMonth(), date.getDate()) } if ("century" === viewType) { return new Date(getFirstDecadeInCentury(date) + 90, date.getMonth(), date.getDate()) } }; var getViewMinBoundaryDate = function(viewType, date) { var resultDate = new Date(date.getFullYear(), date.getMonth(), 1); if ("month" === viewType) { return resultDate } resultDate.setMonth(0); if ("year" === viewType) { return resultDate } if ("decade" === viewType) { resultDate.setFullYear(getFirstYearInDecade(date)) } if ("century" === viewType) { resultDate.setFullYear(getFirstDecadeInCentury(date)) } return resultDate }; var getViewMaxBoundaryDate = function(viewType, date) { var resultDate = new Date(date.getFullYear(), date.getMonth(), getLastMonthDay(date)); if ("month" === viewType) { return resultDate } resultDate.setMonth(11); resultDate.setDate(getLastMonthDay(resultDate)); if ("year" === viewType) { return resultDate } if ("decade" === viewType) { resultDate.setFullYear(getFirstYearInDecade(date) + 9) } if ("century" === viewType) { resultDate.setFullYear(getFirstDecadeInCentury(date) + 99) } return resultDate }; var getLastMonthDay = function(date) { var resultDate = new Date(date.getFullYear(), date.getMonth() + 1, 0); return resultDate.getDate() }; var sameView = function(view, date1, date2) { return dateUtils[camelize("same " + view)](date1, date2) }; var getViewUp = function(typeView) { switch (typeView) { case "month": return "year"; case "year": return "decade"; case "decade": return "century" } }; var getViewDown = function(typeView) { switch (typeView) { case "century": return "decade"; case "decade": return "year"; case "year": return "month" } }; var getDifferenceInMonth = function(typeView) { var difference = 1; if ("year" === typeView) { difference = 12 } if ("decade" === typeView) { difference = 120 } if ("century" === typeView) { difference = 1200 } return difference }; var getDifferenceInMonthForCells = function(typeView) { var difference = 1; if ("decade" === typeView) { difference = 12 } if ("century" === typeView) { difference = 120 } return difference }; var getDateIntervalByString = function(intervalString) { var result = {}; switch (intervalString) { case "year": result.years = 1; break; case "month": result.months = 1; break; case "quarter": result.months = 3; break; case "week": result.days = 7; break; case "day": result.days = 1; break; case "hour": result.hours = 1; break; case "minute": result.minutes = 1; break; case "second": result.seconds = 1; break; case "millisecond": result.milliseconds = 1 } return result }; var sameDate = function(date1, date2) { return sameMonthAndYear(date1, date2) && date1.getDate() === date2.getDate() }; var sameMonthAndYear = function(date1, date2) { return sameYear(date1, date2) && date1.getMonth() === date2.getMonth() }; var sameYear = function(date1, date2) { return date1 && date2 && date1.getFullYear() === date2.getFullYear() }; var sameDecade = function(date1, date2) { if (!isDefined(date1) || !isDefined(date2)) { return } var startDecadeDate1 = date1.getFullYear() - date1.getFullYear() % 10, startDecadeDate2 = date2.getFullYear() - date2.getFullYear() % 10; return date1 && date2 && startDecadeDate1 === startDecadeDate2 }; var sameCentury = function(date1, date2) { if (!isDefined(date1) || !isDefined(date2)) { return } var startCenturyDate1 = date1.getFullYear() - date1.getFullYear() % 100, startCenturyDate2 = date2.getFullYear() - date2.getFullYear() % 100; return date1 && date2 && startCenturyDate1 === startCenturyDate2 }; var getFirstDecadeInCentury = function(date) { return date && date.getFullYear() - date.getFullYear() % 100 }; var getFirstYearInDecade = function(date) { return date && date.getFullYear() - date.getFullYear() % 10 }; var getShortDateFormat = function() { return "yyyy/MM/dd" }; var getFirstMonthDate = function(date) { if (!isDefined(date)) { return } var newDate = new Date(date.getFullYear(), date.getMonth(), 1); return newDate }; var getLastMonthDate = function(date) { if (!isDefined(date)) { return } var newDate = new Date(date.getFullYear(), date.getMonth() + 1, 0); return newDate }; var getFirstWeekDate = function(date, firstDayOfWeek) { var delta = (date.getDay() - firstDayOfWeek + 7) % 7; var result = new Date(date); result.setDate(date.getDate() - delta); return result }; var normalizeDateByWeek = function(date, currentDate) { var differenceInDays = dateUtils.getDatesInterval(date, currentDate, "day"), resultDate = new Date(date); if (differenceInDays >= 6) { resultDate = new Date(resultDate.setDate(resultDate.getDate() + 7)) } return resultDate }; var dateInRange = function(date, min, max, format) { if ("date" === format) { min = min && dateUtils.correctDateWithUnitBeginning(min, "day"); max = max && dateUtils.correctDateWithUnitBeginning(max, "day"); date = date && dateUtils.correctDateWithUnitBeginning(date, "day") } return normalizeDate(date, min, max) === date }; var normalizeDate = function(date, min, max) { var normalizedDate = date; if (!isDefined(date)) { return date } if (isDefined(min) && date < min) { normalizedDate = min } if (isDefined(max) && date > max) { normalizedDate = max } return normalizedDate }; var fixTimezoneGap = function(oldDate, newDate) { if (!isDefined(oldDate)) { return } var sign, trial, diff = newDate.getHours() - oldDate.getHours(); if (0 === diff) { return } sign = 1 === diff || diff === -23 ? -1 : 1; trial = new Date(newDate.getTime() + 36e5 * sign); if (sign > 0 || trial.getDate() === newDate.getDate()) { newDate.setTime(trial.getTime()) } }; var roundToHour = function(date) { date.setHours(date.getHours() + 1); date.setMinutes(0); return date }; var getTimezonesDifference = function(min, max) { return 60 * (max.getTimezoneOffset() - min.getTimezoneOffset()) * 1e3 }; var makeDate = function(date) { return new Date(date) }; var dateUtils = { dateUnitIntervals: dateUnitIntervals, convertMillisecondsToDateUnits: convertMillisecondsToDateUnits, dateToMilliseconds: dateToMilliseconds, getNextDateUnit: getNextDateUnit, convertDateUnitToMilliseconds: convertDateUnitToMilliseconds, getDateUnitInterval: getDateUnitInterval, getDateFormatByTickInterval: getDateFormatByTickInterval, getDatesDifferences: getDatesDifferences, correctDateWithUnitBeginning: correctDateWithUnitBeginning, trimTime: trimTime, addDateInterval: addDateInterval, addInterval: addInterval, getSequenceByInterval: getSequenceByInterval, getDateIntervalByString: getDateIntervalByString, sameDate: sameDate, sameMonthAndYear: sameMonthAndYear, sameMonth: sameMonthAndYear, sameYear: sameYear, sameDecade: sameDecade, sameCentury: sameCentury, sameView: sameView, getDifferenceInMonth: getDifferenceInMonth, getDifferenceInMonthForCells: getDifferenceInMonthForCells, getFirstYearInDecade: getFirstYearInDecade, getFirstDecadeInCentury: getFirstDecadeInCentury, getShortDateFormat: getShortDateFormat, getViewFirstCellDate: getViewFirstCellDate, getViewLastCellDate: getViewLastCellDate, getViewDown: getViewDown, getViewUp: getViewUp, getLastMonthDay: getLastMonthDay, getLastMonthDate: getLastMonthDate, getFirstMonthDate: getFirstMonthDate, getFirstWeekDate: getFirstWeekDate, normalizeDateByWeek: normalizeDateByWeek, getQuarter: getQuarter, getFirstQuarterMonth: getFirstQuarterMonth, dateInRange: dateInRange, roundToHour: roundToHour, normalizeDate: normalizeDate, getViewMinBoundaryDate: getViewMinBoundaryDate, getViewMaxBoundaryDate: getViewMaxBoundaryDate, fixTimezoneGap: fixTimezoneGap, getTimezonesDifference: getTimezonesDifference, makeDate: makeDate, getDatesInterval: getDatesInterval }; module.exports = dateUtils }, /*!***************************************************!*\ !*** ./js/mobile/process_hardware_back_button.js ***! \***************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), hardwareBack = $.Callbacks(); module.exports = function() { hardwareBack.fire() }; module.exports.processCallback = hardwareBack }, /*!***************************************!*\ !*** ./js/mobile/hide_top_overlay.js ***! \***************************************/ function(module, exports, __webpack_require__) { var inArray = __webpack_require__( /*! ../core/utils/array */ 26).inArray; var hideCallback = function() { var callbacks = []; return { add: function(callback) { var indexOfCallback = inArray(callback, callbacks); if (indexOfCallback === -1) { callbacks.push(callback) } }, remove: function(callback) { var indexOfCallback = inArray(callback, callbacks); if (indexOfCallback !== -1) { callbacks.splice(indexOfCallback, 1) } }, fire: function() { var callback = callbacks.pop(), result = !!callback; if (result) { callback() } return result }, hasCallback: function() { return callbacks.length > 0 }, reset: function() { callbacks = [] } } }(); module.exports = function() { return hideCallback.fire() }; module.exports.hideCallback = hideCallback }, /*!*****************************!*\ !*** ./js/format_helper.js ***! \*****************************/ function(module, exports, __webpack_require__) { var commonUtils = __webpack_require__( /*! ./core/utils/common */ 14), typeUtils = __webpack_require__( /*! ./core/utils/type */ 12), dateUtils = __webpack_require__( /*! ./core/utils/date */ 63), numberLocalization = __webpack_require__( /*! ./localization/number */ 32), dateLocalization = __webpack_require__( /*! ./localization/date */ 33), dependencyInjector = __webpack_require__( /*! ./core/utils/dependency_injector */ 29), logger = __webpack_require__( /*! ./core/utils/console */ 13).logger; __webpack_require__( /*! ./localization/currency */ 36); module.exports = dependencyInjector({ format: function(value, format, precision) { var formatIsValid = commonUtils.isString(format) && "" !== format || typeUtils.isPlainObject(format) || commonUtils.isFunction(format), valueIsValid = commonUtils.isNumeric(value) || commonUtils.isDate(value); if (!formatIsValid || !valueIsValid) { return commonUtils.isDefined(value) ? value.toString() : "" } if (commonUtils.isFunction(format)) { return format(value) } if (void 0 !== precision) { logger.warn("Option 'precision' is deprecated. Use field 'precision' of a format object instead.") } if (commonUtils.isString(format)) { format = { type: format, precision: precision } } if (commonUtils.isNumeric(value)) { return numberLocalization.format(value, format) } if (commonUtils.isDate(value)) { return dateLocalization.format(value, format) } }, getTimeFormat: function(showSecond) { return showSecond ? "longtime" : "shorttime" }, _normalizeFormat: function(format) { if (!Array.isArray(format)) { return format } if (1 === format.length) { return format[0] } return function(date) { return format.map(function(formatPart) { return dateLocalization.format(date, formatPart) }).join(" ") } }, getDateFormatByDifferences: function(dateDifferences) { var resultFormat = []; if (dateDifferences.millisecond) { resultFormat.push("millisecond") } if (dateDifferences.hour || dateDifferences.minute || dateDifferences.second) { resultFormat.unshift(this.getTimeFormat(dateDifferences.second)) } if (dateDifferences.year && dateDifferences.month && dateDifferences.day) { resultFormat.unshift("shortdate"); return this._normalizeFormat(resultFormat) } if (dateDifferences.year && dateDifferences.month) { return "monthandyear" } if (dateDifferences.year && dateDifferences.quarter) { return "quarterandyear" } if (dateDifferences.year) { return "year" } if (dateDifferences.quarter) { return "quarter" } if (dateDifferences.month && dateDifferences.day) { resultFormat.unshift("monthandday"); return this._normalizeFormat(resultFormat) } if (dateDifferences.month) { return "month" } if (dateDifferences.day) { var dayFormatter = function(date) { return dateLocalization.format(date, "dayofweek") + ", " + dateLocalization.format(date, "day") }; resultFormat.unshift(dayFormatter); return this._normalizeFormat(resultFormat) } return this._normalizeFormat(resultFormat) }, getDateFormatByTicks: function(ticks) { var resultFormat, maxDiff, currentDiff, i; if (ticks.length > 1) { maxDiff = dateUtils.getDatesDifferences(ticks[0], ticks[1]); for (i = 1; i < ticks.length - 1; i++) { currentDiff = dateUtils.getDatesDifferences(ticks[i], ticks[i + 1]); if (maxDiff.count < currentDiff.count) { maxDiff = currentDiff } } } else { maxDiff = { year: true, month: true, day: true, hour: ticks[0].getHours() > 0, minute: ticks[0].getMinutes() > 0, second: ticks[0].getSeconds() > 0, millisecond: ticks[0].getMilliseconds() > 0 } } resultFormat = this.getDateFormatByDifferences(maxDiff); return resultFormat }, getDateFormatByTickInterval: function(startValue, endValue, tickInterval) { var resultFormat, dateDifferences, dateUnitInterval, dateDifferencesConverter = { week: "day" }, correctDateDifferences = function(dateDifferences, tickInterval, value) { switch (tickInterval) { case "year": case "quarter": dateDifferences.month = value; case "month": dateDifferences.day = value; case "week": case "day": dateDifferences.hour = value; case "hour": dateDifferences.minute = value; case "minute": dateDifferences.second = value; case "second": dateDifferences.millisecond = value } }, correctDifferencesByMaxDate = function(differences, minDate, maxDate) { if (!maxDate.getMilliseconds() && maxDate.getSeconds()) { if (maxDate.getSeconds() - minDate.getSeconds() === 1) { differences.millisecond = true; differences.second = false } } else { if (!maxDate.getSeconds() && maxDate.getMinutes()) { if (maxDate.getMinutes() - minDate.getMinutes() === 1) { differences.second = true; differences.minute = false } } else { if (!maxDate.getMinutes() && maxDate.getHours()) { if (maxDate.getHours() - minDate.getHours() === 1) { differences.minute = true; differences.hour = false } } else { if (!maxDate.getHours() && maxDate.getDate() > 1) { if (maxDate.getDate() - minDate.getDate() === 1) { differences.hour = true; differences.day = false } } else { if (1 === maxDate.getDate() && maxDate.getMonth()) { if (maxDate.getMonth() - minDate.getMonth() === 1) { differences.day = true; differences.month = false } } else { if (!maxDate.getMonth() && maxDate.getFullYear()) { if (maxDate.getFullYear() - minDate.getFullYear() === 1) { differences.month = true; differences.year = false } } } } } } } }; tickInterval = commonUtils.isString(tickInterval) ? tickInterval.toLowerCase() : tickInterval; dateDifferences = dateUtils.getDatesDifferences(startValue, endValue); if (startValue !== endValue) { correctDifferencesByMaxDate(dateDifferences, startValue > endValue ? endValue : startValue, startValue > endValue ? startValue : endValue) } dateUnitInterval = dateUtils.getDateUnitInterval(dateDifferences); correctDateDifferences(dateDifferences, dateUnitInterval, true); dateUnitInterval = dateUtils.getDateUnitInterval(tickInterval || "second"); correctDateDifferences(dateDifferences, dateUnitInterval, false); dateDifferences[dateDifferencesConverter[dateUnitInterval] || dateUnitInterval] = true; resultFormat = this.getDateFormatByDifferences(dateDifferences); return resultFormat } }) }, /*!*****************************************!*\ !*** ./js/animation/presets/presets.js ***! \*****************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Component = __webpack_require__( /*! ../../core/component */ 48), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, devices = __webpack_require__( /*! ../../core/devices */ 53), fx = __webpack_require__( /*! ../fx */ 68); var directionPostfixes = { forward: " dx-forward", backward: " dx-backward", none: " dx-no-direction", undefined: " dx-no-direction" }; var optionPrefix = "preset_"; var AnimationPresetCollection = Component.inherit({ ctor: function() { this.callBase.apply(this, arguments); this._registeredPresets = []; this.resetToDefaults() }, _getDefaultOptions: function() { return extend(this.callBase(), { defaultAnimationDuration: 400, defaultAnimationDelay: 0, defaultStaggerAnimationDuration: 300, defaultStaggerAnimationDelay: 40, defaultStaggerAnimationStartDelay: 500 }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function(device) { return device.phone }, options: { defaultStaggerAnimationDuration: 350, defaultStaggerAnimationDelay: 50, defaultStaggerAnimationStartDelay: 0 } }, { device: function() { return devices.current().android || devices.real.android }, options: { defaultAnimationDelay: 100 } }]) }, _getPresetOptionName: function(animationName) { return optionPrefix + animationName }, _createAndroidSlideAnimationConfig: function(throughOpacity, widthMultiplier) { var that = this; var createBaseConfig = function(configModifier) { return { type: "slide", delay: void 0 === configModifier.delay ? that.option("defaultAnimationDelay") : configModifier.delay, duration: void 0 === configModifier.duration ? that.option("defaultAnimationDuration") : configModifier.duration } }; return { enter: function($element, configModifier) { var width = $element.parent().width() * widthMultiplier, direction = configModifier.direction, config = createBaseConfig(configModifier); config.to = { left: 0, opacity: 1 }; if ("forward" === direction) { config.from = { left: width, opacity: throughOpacity } } else { if ("backward" === direction) { config.from = { left: -width, opacity: throughOpacity } } else { config.from = { left: 0, opacity: 0 } } } return fx.createAnimation($element, config) }, leave: function($element, configModifier) { var width = $element.parent().width() * widthMultiplier, direction = configModifier.direction, config = createBaseConfig(configModifier); config.from = { left: 0, opacity: 1 }; if ("forward" === direction) { config.to = { left: -width, opacity: throughOpacity } } else { if ("backward" === direction) { config.to = { left: width, opacity: throughOpacity } } else { config.to = { left: 0, opacity: 0 } } } return fx.createAnimation($element, config) } } }, _createOpenDoorConfig: function() { var that = this; var createBaseConfig = function(configModifier) { return { type: "css", extraCssClasses: "dx-opendoor-animation", delay: void 0 === configModifier.delay ? that.option("defaultAnimationDelay") : configModifier.delay, duration: void 0 === configModifier.duration ? that.option("defaultAnimationDuration") : configModifier.duration } }; return { enter: function($element, configModifier) { var direction = configModifier.direction, config = createBaseConfig(configModifier); config.delay = "none" === direction ? config.delay : config.duration; config.from = "dx-enter dx-opendoor-animation" + directionPostfixes[direction]; config.to = "dx-enter-active"; return fx.createAnimation($element, config) }, leave: function($element, configModifier) { var direction = configModifier.direction, config = createBaseConfig(configModifier); config.from = "dx-leave dx-opendoor-animation" + directionPostfixes[direction]; config.to = "dx-leave-active"; return fx.createAnimation($element, config) } } }, _createWinPopConfig: function() { var that = this, baseConfig = { type: "css", extraCssClasses: "dx-win-pop-animation", duration: that.option("defaultAnimationDuration") }; return { enter: function($element, configModifier) { var config = baseConfig, direction = configModifier.direction; config.delay = "none" === direction ? that.option("defaultAnimationDelay") : that.option("defaultAnimationDuration") / 2; config.from = "dx-enter dx-win-pop-animation" + directionPostfixes[direction]; config.to = "dx-enter-active"; return fx.createAnimation($element, config) }, leave: function($element, configModifier) { var config = baseConfig, direction = configModifier.direction; config.delay = that.option("defaultAnimationDelay"); config.from = "dx-leave dx-win-pop-animation" + directionPostfixes[direction]; config.to = "dx-leave-active"; return fx.createAnimation($element, config) } } }, resetToDefaults: function() { this.clear(); this.registerDefaultPresets(); this.applyChanges() }, clear: function(name) { var that = this, newRegisteredPresets = []; $.each(this._registeredPresets, function(index, preset) { if (!name || name === preset.name) { that.option(that._getPresetOptionName(preset.name), void 0) } else { newRegisteredPresets.push(preset) } }); this._registeredPresets = newRegisteredPresets; this.applyChanges() }, registerPreset: function(name, config) { this._registeredPresets.push({ name: name, config: config }) }, applyChanges: function() { var that = this; var customRules = []; $.each(this._registeredPresets, function(index, preset) { var rule = { device: preset.config.device, options: {} }; rule.options[that._getPresetOptionName(preset.name)] = preset.config.animation; customRules.push(rule) }); this._setOptionsByDevice(customRules) }, getPreset: function(name) { var result = name; while ("string" === typeof result) { result = this.option(this._getPresetOptionName(result)) } return result }, registerDefaultPresets: function() { this.registerPreset("pop", { animation: { extraCssClasses: "dx-android-pop-animation", delay: this.option("defaultAnimationDelay"), duration: this.option("defaultAnimationDuration") } }); this.registerPreset("openDoor", { animation: this._createOpenDoorConfig() }); this.registerPreset("win-pop", { animation: this._createWinPopConfig() }); this.registerPreset("fade", { animation: { extraCssClasses: "dx-fade-animation", delay: this.option("defaultAnimationDelay"), duration: this.option("defaultAnimationDuration") } }); this.registerPreset("slide", { device: function() { return devices.current().android || devices.real.android }, animation: this._createAndroidSlideAnimationConfig(1, 1) }); this.registerPreset("slide", { device: function() { return !devices.current().android && !devices.real.android }, animation: { extraCssClasses: "dx-slide-animation", delay: this.option("defaultAnimationDelay"), duration: this.option("defaultAnimationDuration") } }); this.registerPreset("ios7-slide", { animation: { extraCssClasses: "dx-ios7-slide-animation", delay: this.option("defaultAnimationDelay"), duration: this.option("defaultAnimationDuration") } }); this.registerPreset("overflow", { animation: { extraCssClasses: "dx-overflow-animation", delay: this.option("defaultAnimationDelay"), duration: this.option("defaultAnimationDuration") } }); this.registerPreset("ios7-toolbar", { device: function() { return !devices.current().android && !devices.real.android }, animation: { extraCssClasses: "dx-ios7-toolbar-animation", delay: this.option("defaultAnimationDelay"), duration: this.option("defaultAnimationDuration") } }); this.registerPreset("ios7-toolbar", { device: function() { return devices.current().android || devices.real.android }, animation: this._createAndroidSlideAnimationConfig(0, .4) }); this.registerPreset("stagger-fade", { animation: { extraCssClasses: "dx-fade-animation", staggerDelay: this.option("defaultStaggerAnimationDelay"), duration: this.option("defaultStaggerAnimationDuration"), delay: this.option("defaultStaggerAnimationStartDelay") } }); this.registerPreset("stagger-slide", { animation: { extraCssClasses: "dx-slide-animation", staggerDelay: this.option("defaultStaggerAnimationDelay"), duration: this.option("defaultStaggerAnimationDuration"), delay: this.option("defaultStaggerAnimationStartDelay") } }); this.registerPreset("stagger-fade-slide", { animation: { extraCssClasses: "dx-fade-slide-animation", staggerDelay: this.option("defaultStaggerAnimationDelay"), duration: this.option("defaultStaggerAnimationDuration"), delay: this.option("defaultStaggerAnimationStartDelay") } }); this.registerPreset("stagger-drop", { animation: { extraCssClasses: "dx-drop-animation", staggerDelay: this.option("defaultStaggerAnimationDelay"), duration: this.option("defaultStaggerAnimationDuration"), delay: this.option("defaultStaggerAnimationStartDelay") } }); this.registerPreset("stagger-fade-drop", { animation: { extraCssClasses: "dx-fade-drop-animation", staggerDelay: this.option("defaultStaggerAnimationDelay"), duration: this.option("defaultStaggerAnimationDuration"), delay: this.option("defaultStaggerAnimationStartDelay") } }); this.registerPreset("stagger-fade-rise", { animation: { extraCssClasses: "dx-fade-rise-animation", staggerDelay: this.option("defaultStaggerAnimationDelay"), duration: this.option("defaultStaggerAnimationDuration"), delay: this.option("defaultStaggerAnimationStartDelay") } }); this.registerPreset("stagger-3d-drop", { animation: { extraCssClasses: "dx-3d-drop-animation", staggerDelay: this.option("defaultStaggerAnimationDelay"), duration: this.option("defaultStaggerAnimationDuration"), delay: this.option("defaultStaggerAnimationStartDelay") } }); this.registerPreset("stagger-fade-zoom", { animation: { extraCssClasses: "dx-fade-zoom-animation", staggerDelay: this.option("defaultStaggerAnimationDelay"), duration: this.option("defaultStaggerAnimationDuration"), delay: this.option("defaultStaggerAnimationStartDelay") } }) } }); exports.PresetCollection = AnimationPresetCollection; var animationPresets = new AnimationPresetCollection; exports.presets = animationPresets }, /*!****************************!*\ !*** ./js/animation/fx.js ***! \****************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), errors = __webpack_require__( /*! ../core/errors */ 7), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), typeUtils = __webpack_require__( /*! ../core/utils/type */ 12), translator = __webpack_require__( /*! ./translator */ 69), animationFrame = __webpack_require__( /*! ./frame */ 59), support = __webpack_require__( /*! ../core/utils/support */ 61), positionUtils = __webpack_require__( /*! ./position */ 70), removeEvent = __webpack_require__( /*! ../core/remove_event */ 47), eventUtils = __webpack_require__( /*! ../events/utils */ 71), when = __webpack_require__( /*! ../integration/jquery/deferred */ 16).when, transitionEndEventName = support.transitionEndEventName + ".dxFX", removeEventName = eventUtils.addNamespace(removeEvent, "dxFX"), isFunction = commonUtils.isFunction, isPlainObject = typeUtils.isPlainObject, noop = commonUtils.noop; var CSS_TRANSITION_EASING_REGEX = /cubic-bezier\((\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\)/, RELATIVE_VALUE_REGEX = /^([+-])=(.*)/i, ANIM_DATA_KEY = "dxAnimData", ANIM_QUEUE_KEY = "dxAnimQueue", TRANSFORM_PROP = "transform"; var TransitionAnimationStrategy = { initAnimation: function($element, config) { $element.css({ transitionProperty: "none" }); if ("string" === typeof config.from) { $element.addClass(config.from) } else { setProps($element, config.from) } var that = this, deferred = $.Deferred(), cleanupWhen = config.cleanupWhen; config.transitionAnimation = { deferred: deferred, finish: function() { that._finishTransition($element); if (cleanupWhen) { when(deferred, cleanupWhen).always(function() { that._cleanup($element, config) }) } else { that._cleanup($element, config) } deferred.resolveWith($element, [config, $element]) } }; this._completeAnimationCallback($element, config).done(function() { config.transitionAnimation.finish() }).fail(function() { deferred.rejectWith($element, [config, $element]) }); if (!config.duration) { config.transitionAnimation.finish() } $element.css("transform") }, animate: function($element, config) { this._startAnimation($element, config); return config.transitionAnimation.deferred.promise() }, _completeAnimationCallback: function($element, config) { var simulatedEndEventTimer, waitForJSCompleteTimer, that = this, startTime = $.now() + config.delay, deferred = $.Deferred(), transitionEndFired = $.Deferred(), simulatedTransitionEndFired = $.Deferred(); config.transitionAnimation.cleanup = function() { clearTimeout(simulatedEndEventTimer); clearTimeout(waitForJSCompleteTimer); $element.off(transitionEndEventName); $element.off(removeEventName) }; $element.one(transitionEndEventName, function() { if ($.now() - startTime >= config.duration) { transitionEndFired.reject() } }).off(removeEventName).on(removeEventName, function() { that.stop($element, config); deferred.reject() }); waitForJSCompleteTimer = setTimeout(function() { simulatedEndEventTimer = setTimeout(function() { simulatedTransitionEndFired.reject() }, config.duration + config.delay + fx._simulatedTransitionEndDelay); when(transitionEndFired, simulatedTransitionEndFired).fail(function() { deferred.resolve() }.bind(this)) }); return deferred.promise() }, _startAnimation: function($element, config) { $element.css({ transitionProperty: "all", transitionDelay: config.delay + "ms", transitionDuration: config.duration + "ms", transitionTimingFunction: config.easing }); if ("string" === typeof config.to) { $element[0].className += " " + config.to } else { if (config.to) { setProps($element, config.to) } } }, _finishTransition: function($element) { $element.css("transition", "none") }, _cleanup: function($element, config) { config.transitionAnimation.cleanup(); if ("string" === typeof config.from) { $element.removeClass(config.from); $element.removeClass(config.to) } }, stop: function($element, config, jumpToEnd) { if (!config) { return } if (jumpToEnd) { config.transitionAnimation.finish() } else { if (isPlainObject(config.to)) { $.each(config.to, function(key) { $element.css(key, $element.css(key)) }) } this._finishTransition($element); this._cleanup($element, config) } } }; var FrameAnimationStrategy = { initAnimation: function($element, config) { setProps($element, config.from) }, animate: function($element, config) { var deferred = $.Deferred(), that = this; if (!config) { return deferred.reject().promise() } $.each(config.to, function(prop) { if (void 0 === config.from[prop]) { config.from[prop] = that._normalizeValue($element.css(prop)) } }); if (config.to[TRANSFORM_PROP]) { config.from[TRANSFORM_PROP] = that._parseTransform(config.from[TRANSFORM_PROP]); config.to[TRANSFORM_PROP] = that._parseTransform(config.to[TRANSFORM_PROP]) } config.frameAnimation = { to: config.to, from: config.from, currentValue: config.from, easing: convertTransitionTimingFuncToJQueryEasing(config.easing), duration: config.duration, startTime: (new Date).valueOf(), finish: function() { this.currentValue = this.to; this.draw(); animationFrame.cancelAnimationFrame(config.frameAnimation.animationFrameId); deferred.resolve() }, draw: function() { if (config.draw) { config.draw(this.currentValue); return } var currentValue = extend({}, this.currentValue); if (currentValue[TRANSFORM_PROP]) { currentValue[TRANSFORM_PROP] = $.map(currentValue[TRANSFORM_PROP], function(value, prop) { if ("translate" === prop) { return translator.getTranslateCss(value) } else { if ("scale" === prop) { return "scale(" + value + ")" } else { if ("rotate" === prop.substr(0, prop.length - 1)) { return prop + "(" + value + "deg)" } } } }).join(" ") } $element.css(currentValue) } }; if (config.delay) { config.frameAnimation.startTime += config.delay; config.frameAnimation.delayTimeout = setTimeout(function() { that._startAnimation($element, config) }, config.delay) } else { that._startAnimation($element, config) } return deferred.promise() }, _startAnimation: function($element, config) { $element.off(removeEventName).on(removeEventName, function() { if (config.frameAnimation) { animationFrame.cancelAnimationFrame(config.frameAnimation.animationFrameId) } }); this._animationStep($element, config) }, _parseTransform: function(transformString) { var result = {}; $.each(transformString.match(/(\w|\d)+\([^\)]*\)\s*/g), function(i, part) { var translateData = translator.parseTranslate(part), scaleData = part.match(/scale\((.+?)\)/), rotateData = part.match(/(rotate.)\((.+)deg\)/); if (translateData) { result.translate = translateData } if (scaleData && scaleData[1]) { result.scale = parseFloat(scaleData[1]) } if (rotateData && rotateData[1]) { result[rotateData[1]] = parseFloat(rotateData[2]) } }); return result }, stop: function($element, config, jumpToEnd) { var frameAnimation = config && config.frameAnimation; if (!frameAnimation) { return } animationFrame.cancelAnimationFrame(frameAnimation.animationFrameId); clearTimeout(frameAnimation.delayTimeout); if (jumpToEnd) { frameAnimation.finish() } delete config.frameAnimation }, _animationStep: function($element, config) { var frameAnimation = config && config.frameAnimation; if (!frameAnimation) { return } var now = (new Date).valueOf(); if (now >= frameAnimation.startTime + frameAnimation.duration) { frameAnimation.finish(); return } frameAnimation.currentValue = this._calcStepValue(frameAnimation, now - frameAnimation.startTime); frameAnimation.draw(); var that = this; frameAnimation.animationFrameId = animationFrame.requestAnimationFrame(function() { that._animationStep($element, config) }) }, _calcStepValue: function(frameAnimation, currentDuration) { var calcValueRecursively = function(from, to) { var result = Array.isArray(to) ? [] : {}; var calcEasedValue = function(propName) { var x = currentDuration / frameAnimation.duration, t = currentDuration, b = 1 * from[propName], c = to[propName] - from[propName], d = frameAnimation.duration; return $.easing[frameAnimation.easing](x, t, b, c, d) }; $.each(to, function(propName, endPropValue) { if ("string" === typeof endPropValue && false === parseFloat(endPropValue, 10)) { return true } result[propName] = "object" === typeof endPropValue ? calcValueRecursively(from[propName], endPropValue) : calcEasedValue(propName) }); return result }; return calcValueRecursively(frameAnimation.from, frameAnimation.to) }, _normalizeValue: function(value) { var numericValue = parseFloat(value, 10); if (false === numericValue) { return value } return numericValue } }; var FallbackToNoAnimationStrategy = { initAnimation: function() {}, animate: function() { return $.Deferred().resolve().promise() }, stop: noop, isSynchronous: true }; var animationStrategies = { transition: support.transition ? TransitionAnimationStrategy : FrameAnimationStrategy, frame: FrameAnimationStrategy, noAnimation: FallbackToNoAnimationStrategy }; var getAnimationStrategy = function(config) { config = config || {}; var strategy = config.strategy || "transition"; if ("css" === config.type && !support.transition) { strategy = "noAnimation" } return animationStrategies[strategy] }; var TransitionTimingFuncMap = { linear: "cubic-bezier(0, 0, 1, 1)", ease: "cubic-bezier(0.25, 0.1, 0.25, 1)", "ease-in": "cubic-bezier(0.42, 0, 1, 1)", "ease-out": "cubic-bezier(0, 0, 0.58, 1)", "ease-in-out": "cubic-bezier(0.42, 0, 0.58, 1)" }; var convertTransitionTimingFuncToJQueryEasing = function(cssTransitionEasing) { cssTransitionEasing = TransitionTimingFuncMap[cssTransitionEasing] || cssTransitionEasing; var coeffs = cssTransitionEasing.match(CSS_TRANSITION_EASING_REGEX); if (!coeffs) { return "linear" } coeffs = coeffs.slice(1, 5); $.each(coeffs, function(index, value) { coeffs[index] = parseFloat(value) }); var easingName = "cubicbezier_" + coeffs.join("_").replace(/\./g, "p"); if (!isFunction($.easing[easingName])) { var polynomBezier = function(x1, y1, x2, y2) { var Cx = 3 * x1, Bx = 3 * (x2 - x1) - Cx, Ax = 1 - Cx - Bx, Cy = 3 * y1, By = 3 * (y2 - y1) - Cy, Ay = 1 - Cy - By; var bezierX = function(t) { return t * (Cx + t * (Bx + t * Ax)) }; var bezierY = function(t) { return t * (Cy + t * (By + t * Ay)) }; var findXFor = function(t) { var z, x = t, i = 0; while (i < 14) { z = bezierX(x) - t; if (Math.abs(z) < .001) { break } x -= z / derivativeX(x); i++ } return x }; var derivativeX = function(t) { return Cx + t * (2 * Bx + 3 * t * Ax) }; return function(t) { return bezierY(findXFor(t)) } }; $.easing[easingName] = function(x, t, b, c, d) { return c * polynomBezier(coeffs[0], coeffs[1], coeffs[2], coeffs[3])(t / d) + b } } return easingName }; var baseConfigValidator = function(config, animationType, validate, typeMessage) { $.each(["from", "to"], function() { if (!validate(config[this])) { throw errors.Error("E0010", animationType, this, typeMessage) } }) }; var isObjectConfigValidator = function(config, animationType) { return baseConfigValidator(config, animationType, function(target) { return isPlainObject(target) }, "a plain object") }; var isStringConfigValidator = function(config, animationType) { return baseConfigValidator(config, animationType, function(target) { return "string" === typeof target }, "a string") }; var CustomAnimationConfigurator = { setup: function() {} }; var CssAnimationConfigurator = { validateConfig: function(config) { isStringConfigValidator(config, "css") }, setup: function() {} }; var positionAliases = { top: { my: "bottom center", at: "top center" }, bottom: { my: "top center", at: "bottom center" }, right: { my: "left center", at: "right center" }, left: { my: "right center", at: "left center" } }; var SlideAnimationConfigurator = { validateConfig: function(config) { isObjectConfigValidator(config, "slide") }, setup: function($element, config) { var location = translator.locate($element); if ("slide" !== config.type) { var positioningConfig = "slideIn" === config.type ? config.from : config.to; positioningConfig.position = extend({ of: window }, positionAliases[config.direction]); setupPosition($element, positioningConfig) } this._setUpConfig(location, config.from); this._setUpConfig(location, config.to); translator.clearCache($element) }, _setUpConfig: function(location, config) { config.left = "left" in config ? config.left : "+=0"; config.top = "top" in config ? config.top : "+=0"; this._initNewPosition(location, config) }, _initNewPosition: function(location, config) { var position = { left: config.left, top: config.top }; delete config.left; delete config.top; var relativeValue = this._getRelativeValue(position.left); if (void 0 !== relativeValue) { position.left = relativeValue + location.left } else { config.left = 0 } relativeValue = this._getRelativeValue(position.top); if (void 0 !== relativeValue) { position.top = relativeValue + location.top } else { config.top = 0 } config[TRANSFORM_PROP] = translator.getTranslateCss({ x: position.left, y: position.top }) }, _getRelativeValue: function(value) { var relativeValue; if ("string" === typeof value && (relativeValue = RELATIVE_VALUE_REGEX.exec(value))) { return parseInt(relativeValue[1] + "1") * relativeValue[2] } } }; var FadeAnimationConfigurator = { setup: function($element, config) { var toOpacity, from = config.from, fromOpacity = isPlainObject(from) ? config.skipElementInitialStyles ? 0 : $element.css("opacity") : String(from); switch (config.type) { case "fadeIn": toOpacity = 1; break; case "fadeOut": toOpacity = 0; break; default: toOpacity = String(config.to) } config.from = { visibility: "visible", opacity: fromOpacity }; config.to = { opacity: toOpacity } } }; var PopAnimationConfigurator = { validateConfig: function(config) { isObjectConfigValidator(config, "pop") }, setup: function($element, config) { var from = config.from, to = config.to, fromOpacity = "opacity" in from ? from.opacity : $element.css("opacity"), toOpacity = "opacity" in to ? to.opacity : 1, fromScale = "scale" in from ? from.scale : 0, toScale = "scale" in to ? to.scale : 1; config.from = { opacity: fromOpacity }; var translate = translator.getTranslate($element); config.from[TRANSFORM_PROP] = this._getCssTransform(translate, fromScale); config.to = { opacity: toOpacity }; config.to[TRANSFORM_PROP] = this._getCssTransform(translate, toScale) }, _getCssTransform: function(translate, scale) { return translator.getTranslateCss(translate) + "scale(" + scale + ")" } }; var animationConfigurators = { custom: CustomAnimationConfigurator, slide: SlideAnimationConfigurator, slideIn: SlideAnimationConfigurator, slideOut: SlideAnimationConfigurator, fade: FadeAnimationConfigurator, fadeIn: FadeAnimationConfigurator, fadeOut: FadeAnimationConfigurator, pop: PopAnimationConfigurator, css: CssAnimationConfigurator }; var getAnimationConfigurator = function(config) { var result = animationConfigurators[config.type]; if (!result) { throw errors.Error("E0011", config.type) } return result }; var defaultJSConfig = { type: "custom", from: {}, to: {}, duration: 400, start: noop, complete: noop, easing: "ease", delay: 0 }, defaultCssConfig = { duration: 400, easing: "ease", delay: 0 }; var setupAnimationOnElement = function() { var animation = this, $element = animation.element, config = animation.config; setupPosition($element, config.from); setupPosition($element, config.to); animation.configurator.setup($element, config); $element.data(ANIM_DATA_KEY, animation); if (fx.off) { config.duration = 0; config.delay = 0 } animation.strategy.initAnimation($element, config); if (config.start) { config.start.apply(this, [$element, config]) } }; var onElementAnimationComplete = function(animation) { var $element = animation.element, config = animation.config; $element.removeData(ANIM_DATA_KEY); if (config.complete) { config.complete.apply(this, [$element, config]) } animation.deferred.resolveWith(this, [$element, config]) }; var startAnimationOnElement = function() { var animation = this, $element = animation.element, config = animation.config; animation.isStarted = true; return animation.strategy.animate($element, config).done(function() { onElementAnimationComplete(animation) }).fail(function() { animation.deferred.rejectWith(this, [$element, config]) }) }; var stopAnimationOnElement = function(jumpToEnd) { var animation = this, $element = animation.element, config = animation.config; clearTimeout(animation.startTimeout); if (!animation.isStarted) { animation.start() } animation.strategy.stop($element, config, jumpToEnd) }; var scopedRemoveEvent = eventUtils.addNamespace(removeEvent, "dxFXStartAnimation"); var subscribeToRemoveEvent = function(animation) { animation.element.off(scopedRemoveEvent).on(scopedRemoveEvent, function() { fx.stop(animation.element) }); animation.deferred.always(function() { animation.element.off(scopedRemoveEvent) }) }; var createAnimation = function(element, initialConfig) { var defaultConfig = "css" === initialConfig.type ? defaultCssConfig : defaultJSConfig, config = extend(true, {}, defaultConfig, initialConfig), configurator = getAnimationConfigurator(config), strategy = getAnimationStrategy(config), animation = { element: $(element), config: config, configurator: configurator, strategy: strategy, isSynchronous: strategy.isSynchronous, setup: setupAnimationOnElement, start: startAnimationOnElement, stop: stopAnimationOnElement, deferred: $.Deferred() }; if (isFunction(configurator.validateConfig)) { configurator.validateConfig(config) } subscribeToRemoveEvent(animation); return animation }; var animate = function(element, config) { var $element = $(element); if (!$element.length) { return $.Deferred().resolve().promise() } var animation = createAnimation($element, config); pushInAnimationQueue($element, animation); return animation.deferred.promise() }; var pushInAnimationQueue = function($element, animation) { var queueData = getAnimQueueData($element); writeAnimQueueData($element, queueData); queueData.push(animation); if (!isAnimating($element)) { shiftFromAnimationQueue($element, queueData) } }; var getAnimQueueData = function($element) { return $element.data(ANIM_QUEUE_KEY) || [] }; var writeAnimQueueData = function($element, queueData) { $element.data(ANIM_QUEUE_KEY, queueData) }; var destroyAnimQueueData = function($element) { $element.removeData(ANIM_QUEUE_KEY) }; var isAnimating = function($element) { return !!$element.data(ANIM_DATA_KEY) }; var shiftFromAnimationQueue = function($element, queueData) { queueData = getAnimQueueData($element); if (!queueData.length) { return } var animation = queueData.shift(); if (0 === queueData.length) { destroyAnimQueueData($element) } executeAnimation(animation).done(function() { if (!isAnimating($element)) { shiftFromAnimationQueue($element) } }) }; var executeAnimation = function(animation) { animation.setup(); if (fx.off || animation.isSynchronous) { animation.start() } else { animation.startTimeout = setTimeout(function() { animation.start() }) } return animation.deferred.promise() }; var setupPosition = function($element, config) { if (!config || !config.position) { return } var position = positionUtils.calculate($element, config.position), offset = $element.offset(), currentPosition = $element.position(); extend(config, { left: position.h.location - offset.left + currentPosition.left, top: position.v.location - offset.top + currentPosition.top }); delete config.position }; var setProps = function($element, props) { $.each(props, function(key, value) { try { $element.css(key, value) } catch (e) {} }) }; var stop = function(element, jumpToEnd) { var $element = $(element), queueData = getAnimQueueData($element); $.each(queueData, function(_, animation) { animation.config.delay = 0; animation.config.duration = 0; animation.isSynchronous = true }); if (!isAnimating($element)) { shiftFromAnimationQueue($element, queueData) } var animation = $element.data(ANIM_DATA_KEY); if (animation) { animation.stop(jumpToEnd) } $element.removeData(ANIM_DATA_KEY); destroyAnimQueueData($element) }; var fx = { off: false, animationTypes: animationConfigurators, animate: animate, createAnimation: createAnimation, isAnimating: isAnimating, stop: stop, _simulatedTransitionEndDelay: 100 }; fx.__internals = { convertTransitionTimingFuncToJQueryEasing: convertTransitionTimingFuncToJQueryEasing }; module.exports = fx }, /*!************************************!*\ !*** ./js/animation/translator.js ***! \************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), type = __webpack_require__( /*! ../core/utils/common */ 14).type; var TRANSLATOR_DATA_KEY = "dxTranslator", TRANSFORM_MATRIX_REGEX = /matrix(3d)?\((.+?)\)/, TRANSLATE_REGEX = /translate(?:3d)?\((.+?)\)/; var locate = function($element) { var translate = getTranslate($element); return { left: translate.x, top: translate.y } }; var move = function($element, position) { var translate, left = position.left, top = position.top; if (void 0 === left) { translate = getTranslate($element); translate.y = top || 0 } else { if (void 0 === top) { translate = getTranslate($element); translate.x = left || 0 } else { translate = { x: left || 0, y: top || 0, z: 0 }; cacheTranslate($element, translate) } } $element.css({ transform: getTranslateCss(translate) }); if (isPercentValue(left) || isPercentValue(top)) { clearCache($element) } }; var isPercentValue = function(value) { return "string" === type(value) && "%" === value[value.length - 1] }; var getTranslate = function($element) { var result = $element.length ? $.data($element.get(0), TRANSLATOR_DATA_KEY) : null; if (!result) { var transformValue = $element.css("transform") || getTranslateCss({ x: 0, y: 0 }), matrix = transformValue.match(TRANSFORM_MATRIX_REGEX), is3D = matrix && matrix[1]; if (matrix) { matrix = matrix[2].split(","); if ("3d" === is3D) { matrix = matrix.slice(12, 15) } else { matrix.push(0); matrix = matrix.slice(4, 7) } } else { matrix = [0, 0, 0] } result = { x: parseFloat(matrix[0]), y: parseFloat(matrix[1]), z: parseFloat(matrix[2]) }; cacheTranslate($element, result) } return result }; var cacheTranslate = function($element, translate) { if ($element.length) { $.data($element.get(0), TRANSLATOR_DATA_KEY, translate) } }; var clearCache = function($element) { if ($element.length) { $.removeData($element.get(0), TRANSLATOR_DATA_KEY) } }; var resetPosition = function($element) { $element.css({ left: 0, top: 0, transform: "none" }); clearCache($element) }; var parseTranslate = function(translateString) { var result = translateString.match(TRANSLATE_REGEX); if (!result || !result[1]) { return } result = result[1].split(","); result = { x: parseFloat(result[0]), y: parseFloat(result[1]), z: parseFloat(result[2]) }; return result }; var getTranslateCss = function(translate) { translate.x = translate.x || 0; translate.y = translate.y || 0; var xValueString = isPercentValue(translate.x) ? translate.x : translate.x + "px"; var yValueString = isPercentValue(translate.y) ? translate.y : translate.y + "px"; return "translate(" + xValueString + ", " + yValueString + ")" }; exports.move = move; exports.locate = locate; exports.clearCache = clearCache; exports.parseTranslate = parseTranslate; exports.getTranslate = getTranslate; exports.getTranslateCss = getTranslateCss; exports.resetPosition = resetPosition }, /*!**********************************!*\ !*** ./js/animation/position.js ***! \**********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), stringUtils = __webpack_require__( /*! ../core/utils/string */ 18), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, translator = __webpack_require__( /*! ./translator */ 69), support = __webpack_require__( /*! ../core/utils/support */ 61); var horzRe = /left|right/, vertRe = /top|bottom/, collisionRe = /fit|flip|none/; var normalizeAlign = function(raw) { var result = { h: "center", v: "center" }; var pair = commonUtils.splitPair(raw); if (pair) { $.each(pair, function() { var w = String(this).toLowerCase(); if (horzRe.test(w)) { result.h = w } else { if (vertRe.test(w)) { result.v = w } } }) } return result }; var normalizeOffset = function(raw) { return stringUtils.pairToObject(raw) }; var normalizeCollision = function(raw) { var pair = commonUtils.splitPair(raw), h = String(pair && pair[0]).toLowerCase(), v = String(pair && pair[1]).toLowerCase(); if (!collisionRe.test(h)) { h = "none" } if (!collisionRe.test(v)) { v = h } return { h: h, v: v } }; var getAlignFactor = function(align) { switch (align) { case "center": return .5; case "right": case "bottom": return 1; default: return 0 } }; var inverseAlign = function(align) { switch (align) { case "left": return "right"; case "right": return "left"; case "top": return "bottom"; case "bottom": return "top"; default: return align } }; var calculateOversize = function(data, bounds) { var oversize = 0; if (data.myLocation < bounds.min) { oversize += bounds.min - data.myLocation } if (data.myLocation > bounds.max) { oversize += data.myLocation - bounds.max } return oversize }; var collisionSide = function(direction, data, bounds) { if (data.myLocation < bounds.min) { return "h" === direction ? "left" : "top" } if (data.myLocation > bounds.max) { return "h" === direction ? "right" : "bottom" } return "none" }; var initMyLocation = function(data) { data.myLocation = data.atLocation + getAlignFactor(data.atAlign) * data.atSize - getAlignFactor(data.myAlign) * data.mySize + data.offset }; var collisionResolvers = { fit: function(data, bounds) { var result = false; if (data.myLocation > bounds.max) { data.myLocation = bounds.max; result = true } if (data.myLocation < bounds.min) { data.myLocation = bounds.min; result = true } data.fit = result }, flip: function(data, bounds) { data.flip = false; if ("center" === data.myAlign && "center" === data.atAlign) { return } if (data.myLocation < bounds.min || data.myLocation > bounds.max) { var inverseData = extend({}, data, { myAlign: inverseAlign(data.myAlign), atAlign: inverseAlign(data.atAlign), offset: -data.offset }); initMyLocation(inverseData); inverseData.oversize = calculateOversize(inverseData, bounds); if (inverseData.myLocation >= bounds.min && inverseData.myLocation <= bounds.max || data.oversize > inverseData.oversize) { data.myLocation = inverseData.myLocation; data.oversize = inverseData.oversize; data.flip = true } } }, flipfit: function(data, bounds) { this.flip(data, bounds); this.fit(data, bounds) }, none: function(data) { data.oversize = 0 } }; var scrollbarWidth; var calculateScrollbarWidth = function() { var $scrollDiv = $("<div>").css({ width: 100, height: 100, overflow: "scroll", position: "absolute", top: -9999 }).appendTo($("body")), result = $scrollDiv.get(0).offsetWidth - $scrollDiv.get(0).clientWidth; $scrollDiv.remove(); scrollbarWidth = result }; var defaultPositionResult = { h: { location: 0, flip: false, fit: false, oversize: 0 }, v: { location: 0, flip: false, fit: false, oversize: 0 } }; var calculatePosition = function(what, options) { var $what = $(what), currentOffset = $what.offset(), result = extend(true, {}, defaultPositionResult, { h: { location: currentOffset.left }, v: { location: currentOffset.top } }); if (!options) { return result } var my = normalizeAlign(options.my), at = normalizeAlign(options.at), of = options.of || window, offset = normalizeOffset(options.offset), collision = normalizeCollision(options.collision), boundary = options.boundary, boundaryOffset = normalizeOffset(options.boundaryOffset); var h = { mySize: $what.outerWidth(), myAlign: my.h, atAlign: at.h, offset: offset.h, collision: collision.h, boundaryOffset: boundaryOffset.h }; var v = { mySize: $what.outerHeight(), myAlign: my.v, atAlign: at.v, offset: offset.v, collision: collision.v, boundaryOffset: boundaryOffset.v }; if ( of .preventDefault) { h.atLocation = of .pageX; v.atLocation = of .pageY; h.atSize = 0; v.atSize = 0 } else { of = $( of ); if (commonUtils.isWindow( of [0])) { h.atLocation = of .scrollLeft(); v.atLocation = of .scrollTop(); h.atSize = of [0].innerWidth > of [0].outerWidth ? of [0].innerWidth : of .width(); v.atSize = of [0].innerHeight > of [0].outerHeight ? of [0].innerHeight : of .height() } else { if (9 === of [0].nodeType) { h.atLocation = 0; v.atLocation = 0; h.atSize = of .width(); v.atSize = of .height() } else { var o = of .offset(); h.atLocation = o.left; v.atLocation = o.top; h.atSize = of .outerWidth(); v.atSize = of .outerHeight() } } } initMyLocation(h); initMyLocation(v); var bounds = function() { var win = $(window), windowWidth = win.width(), windowHeight = win.height(), left = win.scrollLeft(), top = win.scrollTop(), hScrollbar = document.width > document.documentElement.clientWidth, vScrollbar = document.height > document.documentElement.clientHeight, hZoomLevel = support.touch ? document.documentElement.clientWidth / (vScrollbar ? windowWidth - scrollbarWidth : windowWidth) : 1, vZoomLevel = support.touch ? document.documentElement.clientHeight / (hScrollbar ? windowHeight - scrollbarWidth : windowHeight) : 1; if (void 0 === scrollbarWidth) { calculateScrollbarWidth() } var boundaryWidth = windowWidth, boundaryHeight = windowHeight; if (boundary) { var $boundary = $(boundary), boundaryPosition = $boundary.offset(); left = boundaryPosition.left; top = boundaryPosition.top; boundaryWidth = $boundary.width(); boundaryHeight = $boundary.height() } return { h: { min: left + h.boundaryOffset, max: left + boundaryWidth / hZoomLevel - h.mySize - h.boundaryOffset }, v: { min: top + v.boundaryOffset, max: top + boundaryHeight / vZoomLevel - v.mySize - v.boundaryOffset } } }(); h.oversize = calculateOversize(h, bounds.h); v.oversize = calculateOversize(v, bounds.v); h.collisionSide = collisionSide("h", h, bounds.h); v.collisionSide = collisionSide("v", v, bounds.v); if (collisionResolvers[h.collision]) { collisionResolvers[h.collision](h, bounds.h) } if (collisionResolvers[v.collision]) { collisionResolvers[v.collision](v, bounds.v) } var preciser = function(number) { return options.precise ? number : Math.round(number) }; extend(true, result, { h: { location: preciser(h.myLocation), oversize: preciser(h.oversize), fit: h.fit, flip: h.flip, collisionSide: h.collisionSide }, v: { location: preciser(v.myLocation), oversize: preciser(v.oversize), fit: v.fit, flip: v.flip, collisionSide: v.collisionSide }, precise: options.precise }); return result }; var position = function(what, options) { var $what = $(what); if (!options) { return $what.offset() } translator.resetPosition($what); var offset = $what.offset(), targetPosition = options.h && options.v ? options : calculatePosition($what, options); var preciser = function(number) { return options.precise ? number : Math.round(number) }; translator.move($what, { left: targetPosition.h.location - preciser(offset.left), top: targetPosition.v.location - preciser(offset.top) }); return targetPosition }; var offset = function(element) { element = $(element).get(0); if (commonUtils.isWindow(element)) { return null } else { if (element instanceof $.Event) { return { top: element.pageY, left: element.pageX } } } return $(element).offset() }; if (!position.inverseAlign) { position.inverseAlign = inverseAlign } if (!position.normalizeAlign) { position.normalizeAlign = normalizeAlign } module.exports = { calculateScrollbarWidth: calculateScrollbarWidth, calculate: calculatePosition, setup: position, offset: offset } }, /*!****************************!*\ !*** ./js/events/utils.js ***! \****************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), errors = __webpack_require__( /*! ../core/errors */ 7), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, copyEvent = __webpack_require__( /*! ./core/hooks */ 72).copy; var eventSource = function() { var EVENT_SOURCES_REGEX = { dx: /^dx/i, mouse: /(mouse|wheel)/i, touch: /^touch/i, keyboard: /^key/i, pointer: /^(ms)?pointer/i }; return function(e) { var result = "other"; $.each(EVENT_SOURCES_REGEX, function(key) { if (this.test(e.type)) { result = key; return false } }); return result } }(); var isDxEvent = function(e) { return "dx" === eventSource(e) }; var isNativeMouseEvent = function(e) { return "mouse" === eventSource(e) }; var isNativeTouchEvent = function(e) { return "touch" === eventSource(e) }; var isPointerEvent = function(e) { return "pointer" === eventSource(e) }; var isMouseEvent = function(e) { return isNativeMouseEvent(e) || (isPointerEvent(e) || isDxEvent(e)) && "mouse" === e.pointerType }; var isTouchEvent = function(e) { return isNativeTouchEvent(e) || (isPointerEvent(e) || isDxEvent(e)) && "touch" === e.pointerType }; var isKeyboardEvent = function(e) { return "keyboard" === eventSource(e) }; var isFakeClickEvent = function(e) { return 0 === e.screenX && !e.offsetX && 0 === e.pageX }; var eventData = function(e) { return { x: e.pageX, y: e.pageY, time: e.timeStamp } }; var eventDelta = function(from, to) { return { x: to.x - from.x, y: to.y - from.y, time: to.time - from.time || 1 } }; var hasTouches = function(e) { if (isNativeTouchEvent(e)) { return (e.originalEvent.touches || []).length } if (isDxEvent(e)) { return (e.pointers || []).length } return 0 }; var needSkipEvent = function(e) { var $target = $(e.target), touchInInput = $target.is("input, textarea, select"); if ($target.is(".dx-skip-gesture-event *, .dx-skip-gesture-event")) { return true } if ("dxmousewheel" === e.type) { return $target.is("input[type='number'], textarea, select") && $target.is(":focus") } if (isMouseEvent(e)) { return touchInInput || e.which > 1 } if (isTouchEvent(e)) { return touchInInput && $target.is(":focus") } }; var createEvent = function(originalEvent, args) { var event = copyEvent(originalEvent); if (args) { extend(event, args) } return event }; var fireEvent = function(props) { var event = createEvent(props.originalEvent, props); $.event.trigger(event, null, props.delegateTarget || event.target); return event }; var addNamespace = function(eventNames, namespace) { if (!namespace) { throw errors.Error("E0017") } if ("string" === typeof eventNames) { if (eventNames.indexOf(" ") === -1) { return eventNames + "." + namespace } return addNamespace(eventNames.split(/\s+/g), namespace) } $.each(eventNames, function(index, eventName) { eventNames[index] = eventName + "." + namespace }); return eventNames.join(" ") }; module.exports = { eventSource: eventSource, isPointerEvent: isPointerEvent, isMouseEvent: isMouseEvent, isTouchEvent: isTouchEvent, isKeyboardEvent: isKeyboardEvent, isFakeClickEvent: isFakeClickEvent, hasTouches: hasTouches, eventData: eventData, eventDelta: eventDelta, needSkipEvent: needSkipEvent, createEvent: createEvent, fireEvent: fireEvent, addNamespace: addNamespace } }, /*!*********************************!*\ !*** ./js/events/core/hooks.js ***! \*********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), compareVersion = __webpack_require__( /*! ../../core/utils/version */ 17).compare, isNumeric = __webpack_require__( /*! ../../core/utils/common */ 14).isNumeric, registerEvent = __webpack_require__( /*! ./event_registrator */ 73); var touchPropsToHook = ["pageX", "pageY", "screenX", "screenY", "clientX", "clientY"]; var touchPropHook = function(name, event) { if (event[name] || !event.touches) { return event[name] } var touches = event.touches.length ? event.touches : event.changedTouches; if (!touches.length) { return } return touches[0][name] }; if (compareVersion($.fn.jquery, [3]) < 0) { var POINTER_TYPE_MAP = { 2: "touch", 3: "pen", 4: "mouse" }; $.each(["MSPointerDown", "MSPointerMove", "MSPointerUp", "MSPointerCancel", "MSPointerOver", "MSPointerOut", "mouseenter", "mouseleave", "pointerdown", "pointermove", "pointerup", "pointercancel", "pointerover", "pointerout", "pointerenter", "pointerleave"], function() { $.event.fixHooks[this] = { filter: function(event, originalEvent) { var pointerType = originalEvent.pointerType; if (isNumeric(pointerType)) { event.pointerType = POINTER_TYPE_MAP[pointerType] } return event }, props: $.event.mouseHooks.props.concat(["pointerId", "pointerType", "originalTarget", "width", "height", "pressure", "result", "tiltX", "charCode", "tiltY", "detail", "isPrimary", "prevValue"]) } }); $.each(["touchstart", "touchmove", "touchend", "touchcancel"], function() { $.event.fixHooks[this] = { filter: function(event, originalEvent) { $.each(touchPropsToHook, function(_, name) { event[name] = touchPropHook(name, originalEvent) }); return event }, props: $.event.mouseHooks.props.concat(["touches", "changedTouches", "targetTouches", "detail", "result", "originalTarget", "charCode", "prevValue"]) } }); $.event.fixHooks.wheel = $.event.mouseHooks; var DX_EVENT_HOOKS = { props: $.event.mouseHooks.props.concat(["pointerType", "pointerId", "pointers"]) }; registerEvent.callbacks.add(function(name) { $.event.fixHooks[name] = DX_EVENT_HOOKS }); var fix = function(event) { var originalEvent = event.originalEvent; var fixHook = $.event.fixHooks[originalEvent.type] || $.event.mouseHooks; var props = fixHook.props ? $.event.props.concat(fixHook.props) : $.event.props, propIndex = props.length; while (propIndex--) { var prop = props[propIndex]; event[prop] = originalEvent[prop] } return fixHook.filter ? fixHook.filter(event, originalEvent) : event }; exports.copy = function(originalEvent) { return fix($.Event(originalEvent)) } } else { $.each(touchPropsToHook, function(_, name) { $.event.addProp(name, function(event) { return touchPropHook(name, event) }) }); exports.copy = function(originalEvent) { return $.Event(originalEvent, originalEvent) } } }, /*!*********************************************!*\ !*** ./js/events/core/event_registrator.js ***! \*********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), MemorizedCallbacks = __webpack_require__( /*! ../../core/memorized_callbacks */ 58); var callbacks = new MemorizedCallbacks; var registerEvent = function(name, eventObject) { var strategy = {}; if ("noBubble" in eventObject) { strategy.noBubble = eventObject.noBubble } if ("bindType" in eventObject) { strategy.bindType = eventObject.bindType } if ("delegateType" in eventObject) { strategy.delegateType = eventObject.delegateType } $.each(["setup", "teardown", "add", "remove", "trigger", "handle", "_default", "dispose"], function(_, methodName) { if (!eventObject[methodName]) { return } strategy[methodName] = function() { var args = $.makeArray(arguments); args.unshift(this); return eventObject[methodName].apply(eventObject, args) } }); callbacks.fire(name, strategy) }; registerEvent.callbacks = callbacks; var registerJQueryEvent = function(name, eventObject) { $.event.special[name] = eventObject }; callbacks.add(registerJQueryEvent); module.exports = registerEvent }, /*!*****************************************************************!*\ !*** ./js/animation/transition_executor/transition_executor.js ***! \*****************************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), typeUtils = __webpack_require__( /*! ../../core/utils/type */ 12), fx = __webpack_require__( /*! ../fx */ 68), animationPresetsModule = __webpack_require__( /*! ../presets/presets */ 67), when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when; var directionPostfixes = { forward: " dx-forward", backward: " dx-backward", none: " dx-no-direction", undefined: " dx-no-direction" }, DX_ANIMATING_CLASS = "dx-animating"; var TransitionExecutor = Class.inherit({ ctor: function() { this._accumulatedDelays = { enter: 0, leave: 0 }; this._animations = []; this.reset() }, _createAnimations: function($elements, initialConfig, configModifier, type) { var animationConfig, that = this, result = []; configModifier = configModifier || {}; animationConfig = this._prepareElementAnimationConfig(initialConfig, configModifier, type); if (animationConfig) { $elements.each(function() { var animation = that._createAnimation($(this), animationConfig, configModifier); if (animation) { animation.element.addClass(DX_ANIMATING_CLASS); animation.setup(); result.push(animation) } }) } return result }, _prepareElementAnimationConfig: function(config, configModifier, type) { var result; if ("string" === typeof config) { var presetName = config; config = animationPresetsModule.presets.getPreset(presetName) } if (!config) { result = void 0 } else { if (commonUtils.isFunction(config[type])) { result = config[type] } else { result = extend({ skipElementInitialStyles: true, cleanupWhen: this._completePromise }, config, configModifier); if (!result.type || "css" === result.type) { var cssClass = "dx-" + type, extraCssClasses = (result.extraCssClasses ? " " + result.extraCssClasses : "") + directionPostfixes[result.direction]; result.type = "css"; result.from = (result.from || cssClass) + extraCssClasses; result.to = result.to || cssClass + "-active" } result.staggerDelay = result.staggerDelay || 0; result.delay = result.delay || 0; if (result.staggerDelay) { result.delay += this._accumulatedDelays[type]; this._accumulatedDelays[type] += result.staggerDelay } } } return result }, _createAnimation: function($element, animationConfig, configModifier) { var result; if (typeUtils.isPlainObject(animationConfig)) { result = fx.createAnimation($element, animationConfig) } else { if (commonUtils.isFunction(animationConfig)) { result = animationConfig($element, configModifier) } } return result }, _startAnimations: function() { var animations = this._animations; for (var i = 0; i < animations.length; i++) { animations[i].start() } }, _stopAnimations: function(jumpToEnd) { var animations = this._animations; for (var i = 0; i < animations.length; i++) { animations[i].stop(jumpToEnd) } }, _clearAnimations: function() { var animations = this._animations; for (var i = 0; i < animations.length; i++) { animations[i].element.removeClass(DX_ANIMATING_CLASS) } this._animations.length = 0 }, reset: function() { this._accumulatedDelays.enter = 0; this._accumulatedDelays.leave = 0; this._clearAnimations(); this._completeDeferred = $.Deferred(); this._completePromise = this._completeDeferred.promise() }, enter: function($elements, animationConfig, configModifier) { var animations = this._createAnimations($elements, animationConfig, configModifier, "enter"); this._animations.push.apply(this._animations, animations) }, leave: function($elements, animationConfig, configModifier) { var animations = this._createAnimations($elements, animationConfig, configModifier, "leave"); this._animations.push.apply(this._animations, animations) }, start: function() { var result, that = this; if (!this._animations.length) { that.reset(); result = $.Deferred().resolve().promise() } else { var animationDeferreds = $.map(this._animations, function(animation) { var result = $.Deferred(); animation.deferred.always(function() { result.resolve() }); return result.promise() }); result = when.apply($, animationDeferreds).always(function() { that._completeDeferred.resolve(); that.reset() }); commonUtils.executeAsync(function() { that._startAnimations() }) } return result }, stop: function(jumpToEnd) { this._stopAnimations(jumpToEnd) } }); exports.TransitionExecutor = TransitionExecutor }, /*!****************************!*\ !*** ./js/events/click.js ***! \****************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), devices = __webpack_require__( /*! ../core/devices */ 53), domUtils = __webpack_require__( /*! ../core/utils/dom */ 56), animationFrame = __webpack_require__( /*! ../animation/frame */ 59), eventUtils = __webpack_require__( /*! ./utils */ 71), pointerEvents = __webpack_require__( /*! ./pointer */ 76), Emitter = __webpack_require__( /*! ./core/emitter */ 83), registerEmitter = __webpack_require__( /*! ./core/emitter_registrator */ 84), compareVersions = __webpack_require__( /*! ../core/utils/version */ 17).compare; var CLICK_EVENT_NAME = "dxclick", TOUCH_BOUNDARY = 10, abs = Math.abs; var isInput = function(element) { return $(element).is("input, textarea, select, button ,:focus, :focus *") }; var misc = { requestAnimationFrame: animationFrame.requestAnimationFrame, cancelAnimationFrame: animationFrame.cancelAnimationFrame }; var ClickEmitter = Emitter.inherit({ ctor: function(element) { this.callBase(element); this._makeElementClickable($(element)) }, _makeElementClickable: function($element) { if (!$element.attr("onclick")) { $element.attr("onclick", "void(0)") } }, start: function(e) { this._blurPrevented = e.isDefaultPrevented(); this._startTarget = e.target; this._startEventData = eventUtils.eventData(e) }, end: function(e) { if (this._eventOutOfElement(e, this.getElement().get(0)) || e.type === pointerEvents.cancel) { this._cancel(e); return } if (!isInput(e.target) && !this._blurPrevented) { domUtils.resetActiveElement() } this._accept(e); this._clickAnimationFrame = misc.requestAnimationFrame(function() { this._fireClickEvent(e) }.bind(this)) }, _eventOutOfElement: function(e, element) { var target = e.target, targetChanged = !$.contains(element, target) && element !== target, gestureDelta = eventUtils.eventDelta(eventUtils.eventData(e), this._startEventData), boundsExceeded = abs(gestureDelta.x) > TOUCH_BOUNDARY || abs(gestureDelta.y) > TOUCH_BOUNDARY; return targetChanged || boundsExceeded }, _fireClickEvent: function(e) { this._fireEvent(CLICK_EVENT_NAME, e, { target: domUtils.closestCommonParent(this._startTarget, e.target) }) }, dispose: function() { misc.cancelAnimationFrame(this._clickAnimationFrame) } }); ! function() { var NATIVE_CLICK_CLASS = "dx-native-click"; var realDevice = devices.real(), useNativeClick = realDevice.generic || realDevice.ios && compareVersions(realDevice.version, [9, 3]) >= 0 || realDevice.android && compareVersions(realDevice.version, [5]) >= 0; var isNativeClickEvent = function(target) { return useNativeClick || $(target).closest("." + NATIVE_CLICK_CLASS).length }; var prevented = null, lastFiredEvent = null; var clickHandler = function(e) { var originalEvent = e.originalEvent, eventAlreadyFired = lastFiredEvent !== originalEvent, leftButton = !e.which || 1 === e.which; if (leftButton && !prevented && isNativeClickEvent(e.target) && eventAlreadyFired) { lastFiredEvent = originalEvent; eventUtils.fireEvent({ type: CLICK_EVENT_NAME, originalEvent: e }) } }; ClickEmitter = ClickEmitter.inherit({ _makeElementClickable: function($element) { if (!isNativeClickEvent($element)) { this.callBase($element) } $element.on("click", clickHandler) }, configure: function(data) { this.callBase(data); if (data.useNative) { this.getElement().addClass(NATIVE_CLICK_CLASS) } }, start: function(e) { prevented = null; if (!isNativeClickEvent(e.target)) { this.callBase(e) } }, end: function(e) { if (!isNativeClickEvent(e.target)) { this.callBase(e) } }, cancel: function() { prevented = true }, dispose: function() { this.callBase(); this.getElement().off("click", clickHandler) } }); exports.useNativeClick = useNativeClick }(); ! function() { var desktopDevice = devices.real().generic; if (!desktopDevice) { var startTarget = null, blurPrevented = false; var pointerDownHandler = function(e) { startTarget = e.target; blurPrevented = e.isDefaultPrevented() }; var clickHandler = function(e) { var $target = $(e.target); if (!blurPrevented && startTarget && !$target.is(startTarget) && !$(startTarget).is("label") && isInput($target)) { domUtils.resetActiveElement() } startTarget = null; blurPrevented = false }; var NATIVE_CLICK_FIXER_NAMESPACE = "NATIVE_CLICK_FIXER"; $(document).on(eventUtils.addNamespace(pointerEvents.down, NATIVE_CLICK_FIXER_NAMESPACE), pointerDownHandler).on(eventUtils.addNamespace("click", NATIVE_CLICK_FIXER_NAMESPACE), clickHandler) } }(); registerEmitter({ emitter: ClickEmitter, bubble: true, events: [CLICK_EVENT_NAME] }); exports.name = CLICK_EVENT_NAME; exports.misc = misc }, /*!******************************!*\ !*** ./js/events/pointer.js ***! \******************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), support = __webpack_require__( /*! ../core/utils/support */ 61), devices = __webpack_require__( /*! ../core/devices */ 53), registerEvent = __webpack_require__( /*! ./core/event_registrator */ 73), TouchStrategy = __webpack_require__( /*! ./pointer/touch */ 77), MsPointerStrategy = __webpack_require__( /*! ./pointer/mspointer */ 79), MouseStrategy = __webpack_require__( /*! ./pointer/mouse */ 81), MouseAndTouchStrategy = __webpack_require__( /*! ./pointer/mouse_and_touch */ 82); var EventStrategy = function() { if (support.pointerEvents) { return MsPointerStrategy } var device = devices.real(); if (support.touch && !(device.tablet || device.phone)) { return MouseAndTouchStrategy } if (support.touch) { return TouchStrategy } return MouseStrategy }(); $.each(EventStrategy.map, function(pointerEvent, originalEvents) { registerEvent(pointerEvent, new EventStrategy(pointerEvent, originalEvents)) }); module.exports = { down: "dxpointerdown", up: "dxpointerup", move: "dxpointermove", cancel: "dxpointercancel", enter: "dxpointerenter", leave: "dxpointerleave", over: "dxpointerover", out: "dxpointerout" } }, /*!************************************!*\ !*** ./js/events/pointer/touch.js ***! \************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), devices = __webpack_require__( /*! ../../core/devices */ 53), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, BaseStrategy = __webpack_require__( /*! ./base */ 78); var eventMap = { dxpointerdown: "touchstart", dxpointermove: "touchmove", dxpointerup: "touchend", dxpointercancel: "touchcancel", dxpointerover: "", dxpointerout: "", dxpointerenter: "", dxpointerleave: "" }; var normalizeTouchEvent = function(e) { var pointers = []; $.each(e.touches, function(_, touch) { pointers.push(extend({ pointerId: touch.identifier }, touch)) }); return { pointers: pointers, pointerId: e.changedTouches[0].identifier } }; var skipTouchWithSameIdentifier = function(pointerEvent) { return "ios" === devices.real().platform && ("dxpointerdown" === pointerEvent || "dxpointerup" === pointerEvent) }; var TouchStrategy = BaseStrategy.inherit({ ctor: function() { this.callBase.apply(this, arguments); this._pointerId = 0 }, _handler: function(e) { if (skipTouchWithSameIdentifier(this._eventName)) { var touch = e.changedTouches[0]; if (this._pointerId === touch.identifier && 0 !== this._pointerId) { return } this._pointerId = touch.identifier } return this.callBase.apply(this, arguments) }, _fireEvent: function(args) { return this.callBase(extend(normalizeTouchEvent(args.originalEvent), args)) } }); TouchStrategy.map = eventMap; TouchStrategy.normalize = normalizeTouchEvent; module.exports = TouchStrategy }, /*!***********************************!*\ !*** ./js/events/pointer/base.js ***! \***********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), browser = __webpack_require__( /*! ../../core/utils/browser */ 23), Class = __webpack_require__( /*! ../../core/class */ 25), eventUtils = __webpack_require__( /*! ../utils */ 71); var POINTER_EVENTS_NAMESPACE = "dxPointerEvents"; var BaseStrategy = Class.inherit({ ctor: function(eventName, originalEvents) { this._eventName = eventName; this._originalEvents = eventUtils.addNamespace(originalEvents, POINTER_EVENTS_NAMESPACE); this._handlerCount = 0; this.noBubble = this._isNoBubble() }, _isNoBubble: function() { var eventName = this._eventName; return "dxpointerenter" === eventName || "dxpointerleave" === eventName }, _handler: function(e) { var delegateTarget = this._getDelegateTarget(e); return this._fireEvent({ type: this._eventName, pointerType: e.pointerType || eventUtils.eventSource(e), originalEvent: e, delegateTarget: delegateTarget, timeStamp: browser.mozilla ? (new Date).getTime() : e.timeStamp }) }, _getDelegateTarget: function(e) { var delegateTarget; if (this.noBubble) { delegateTarget = e.delegateTarget } return delegateTarget }, _fireEvent: function(args) { return eventUtils.fireEvent(args) }, setup: function() { return true }, add: function(element, handleObj) { if (this._handlerCount <= 0 || this.noBubble) { this._selector = handleObj.selector; element = this.noBubble ? element : document; var that = this; $(element).on(this._originalEvents, this._selector, function(e) { that._handler(e) }) } if (!this.noBubble) { this._handlerCount++ } }, remove: function() { if (!this.noBubble) { this._handlerCount-- } }, teardown: function(element) { if (this._handlerCount && !this.noBubble) { return } element = this.noBubble ? element : document; if (this._originalEvents !== "." + POINTER_EVENTS_NAMESPACE) { $(element).off(this._originalEvents, this._selector) } }, dispose: function(element) { element = this.noBubble ? element : document; $(element).off(this._originalEvents) } }); module.exports = BaseStrategy }, /*!****************************************!*\ !*** ./js/events/pointer/mspointer.js ***! \****************************************/ function(module, exports, __webpack_require__) { var BaseStrategy = __webpack_require__( /*! ./base */ 78), Observer = __webpack_require__( /*! ./observer */ 80), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, onlyMSPointerSupport = !window.PointerEvent && window.MSPointerEvent; var eventMap = { dxpointerdown: onlyMSPointerSupport ? "MSPointerDown" : "pointerdown", dxpointermove: onlyMSPointerSupport ? "MSPointerMove" : "pointermove", dxpointerup: onlyMSPointerSupport ? "MSPointerUp" : "pointerup", dxpointercancel: onlyMSPointerSupport ? "MSPointerCancel" : "pointercancel", dxpointerover: onlyMSPointerSupport ? "MSPointerOver" : "pointerover", dxpointerout: onlyMSPointerSupport ? "MSPointerOut" : "pointerout", dxpointerenter: onlyMSPointerSupport ? "mouseenter" : "pointerenter", dxpointerleave: onlyMSPointerSupport ? "mouseleave" : "pointerleave" }; var observer; var activated = false; var activateStrategy = function() { if (activated) { return } observer = new Observer(eventMap, function(a, b) { return a.pointerId === b.pointerId }, function(e) { if (e.isPrimary) { observer.reset() } }); activated = true }; var MsPointerStrategy = BaseStrategy.inherit({ ctor: function() { this.callBase.apply(this, arguments); activateStrategy() }, _fireEvent: function(args) { return this.callBase(extend({ pointers: observer.pointers(), pointerId: args.originalEvent.pointerId }, args)) } }); MsPointerStrategy.map = eventMap; MsPointerStrategy.resetObserver = function() { observer.reset() }; module.exports = MsPointerStrategy }, /*!***************************************!*\ !*** ./js/events/pointer/observer.js ***! \***************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9); var addEventsListener = function(events, handler) { events.split(" ").forEach(function(event) { document.addEventListener(event, handler, true) }) }; var Observer = function(eventMap, pointerEquals, onPointerAdding) { onPointerAdding = onPointerAdding || function() {}; var pointers = []; var getPointerIndex = function(e) { var index = -1; $.each(pointers, function(i, pointer) { if (!pointerEquals(e, pointer)) { return true } index = i; return false }); return index }; var addPointer = function(e) { if (getPointerIndex(e) === -1) { onPointerAdding(e); pointers.push(e) } }; var removePointer = function(e) { var index = getPointerIndex(e); if (index > -1) { pointers.splice(index, 1) } }; var updatePointer = function(e) { pointers[getPointerIndex(e)] = e }; addEventsListener(eventMap.dxpointerdown, addPointer); addEventsListener(eventMap.dxpointermove, updatePointer); addEventsListener(eventMap.dxpointerup, removePointer); addEventsListener(eventMap.dxpointercancel, removePointer); this.pointers = function() { return pointers }; this.reset = function() { pointers = [] } }; module.exports = Observer }, /*!************************************!*\ !*** ./js/events/pointer/mouse.js ***! \************************************/ function(module, exports, __webpack_require__) { var extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, BaseStrategy = __webpack_require__( /*! ./base */ 78), Observer = __webpack_require__( /*! ./observer */ 80); var eventMap = { dxpointerdown: "mousedown", dxpointermove: "mousemove", dxpointerup: "mouseup", dxpointercancel: "", dxpointerover: "mouseover", dxpointerout: "mouseout", dxpointerenter: "mouseenter", dxpointerleave: "mouseleave" }; var normalizeMouseEvent = function(e) { e.pointerId = 1; return { pointers: observer.pointers(), pointerId: 1 } }; var observer; var activated = false; var activateStrategy = function() { if (activated) { return } observer = new Observer(eventMap, function() { return true }); activated = true }; var MouseStrategy = BaseStrategy.inherit({ ctor: function() { this.callBase.apply(this, arguments); activateStrategy() }, _fireEvent: function(args) { return this.callBase(extend(normalizeMouseEvent(args.originalEvent), args)) } }); MouseStrategy.map = eventMap; MouseStrategy.normalize = normalizeMouseEvent; MouseStrategy.activate = activateStrategy; MouseStrategy.resetObserver = function() { observer.reset() }; module.exports = MouseStrategy }, /*!**********************************************!*\ !*** ./js/events/pointer/mouse_and_touch.js ***! \**********************************************/ function(module, exports, __webpack_require__) { var extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, BaseStrategy = __webpack_require__( /*! ./base */ 78), MouseStrategy = __webpack_require__( /*! ./mouse */ 81), TouchStrategy = __webpack_require__( /*! ./touch */ 77), eventUtils = __webpack_require__( /*! ../utils */ 71); var eventMap = { dxpointerdown: "touchstart mousedown", dxpointermove: "touchmove mousemove", dxpointerup: "touchend mouseup", dxpointercancel: "touchcancel", dxpointerover: "mouseover", dxpointerout: "mouseout", dxpointerenter: "mouseenter", dxpointerleave: "mouseleave" }; var activated = false; var activateStrategy = function() { if (activated) { return } MouseStrategy.activate(); activated = true }; var MouseAndTouchStrategy = BaseStrategy.inherit({ EVENT_LOCK_TIMEOUT: 100, ctor: function() { this.callBase.apply(this, arguments); activateStrategy() }, _handler: function(e) { var isMouseEvent = eventUtils.isMouseEvent(e); if (!isMouseEvent) { this._skipNextEvents = true } if (isMouseEvent && this._mouseLocked) { return } if (isMouseEvent && this._skipNextEvents) { this._skipNextEvents = false; this._mouseLocked = true; clearTimeout(this._unlockMouseTimer); var that = this; this._unlockMouseTimer = setTimeout(function() { that._mouseLocked = false }, this.EVENT_LOCK_TIMEOUT); return } return this.callBase(e) }, _fireEvent: function(args) { var isMouseEvent = eventUtils.isMouseEvent(args.originalEvent), normalizer = isMouseEvent ? MouseStrategy.normalize : TouchStrategy.normalize; return this.callBase(extend(normalizer(args.originalEvent), args)) }, dispose: function() { this.callBase(); this._skipNextEvents = false; this._mouseLocked = false; clearTimeout(this._unlockMouseTimer) } }); MouseAndTouchStrategy.map = eventMap; MouseAndTouchStrategy.resetObserver = MouseStrategy.resetObserver; module.exports = MouseAndTouchStrategy }, /*!***********************************!*\ !*** ./js/events/core/emitter.js ***! \***********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, Class = __webpack_require__( /*! ../../core/class */ 25), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, eventUtils = __webpack_require__( /*! ../utils */ 71); var Emitter = Class.inherit({ ctor: function(element) { this._$element = $(element); this._cancelCallback = $.Callbacks(); this._acceptCallback = $.Callbacks() }, getElement: function() { return this._$element }, validate: function(e) { return "dxmousewheel" !== e.type }, validatePointers: function(e) { return 1 === eventUtils.hasTouches(e) }, allowInterruptionByMouseWheel: function() { return true }, configure: function(data) { extend(this, data) }, addCancelCallback: function(callback) { this._cancelCallback.add(callback) }, removeCancelCallback: function() { this._cancelCallback.empty() }, _cancel: function(e) { this._cancelCallback.fire(this, e) }, addAcceptCallback: function(callback) { this._acceptCallback.add(callback) }, removeAcceptCallback: function() { this._acceptCallback.empty() }, _accept: function(e) { this._acceptCallback.fire(this, e) }, _requestAccept: function(e) { this._acceptRequestEvent = e }, _forgetAccept: function() { this._accept(this._acceptRequestEvent); this._acceptRequestEvent = null }, start: noop, move: noop, end: noop, cancel: noop, reset: function() { if (this._acceptRequestEvent) { this._accept(this._acceptRequestEvent) } }, _fireEvent: function(eventName, e, params) { var eventData = extend({ type: eventName, originalEvent: e, target: this._getEmitterTarget(e), delegateTarget: this.getElement().get(0) }, params); e = eventUtils.fireEvent(eventData); if (e.cancel) { this._cancel(e) } return e }, _getEmitterTarget: function(e) { return (this.delegateSelector ? $(e.target).closest(this.delegateSelector) : this.getElement()).get(0) }, dispose: noop }); module.exports = Emitter }, /*!***********************************************!*\ !*** ./js/events/core/emitter_registrator.js ***! \***********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, registerEvent = __webpack_require__( /*! ./event_registrator */ 73), eventUtils = __webpack_require__( /*! ../utils */ 71), pointerEvents = __webpack_require__( /*! ../pointer */ 76), wheelEvent = __webpack_require__( /*! ./wheel */ 85); var MANAGER_EVENT = "dxEventManager", EMITTER_DATA = "dxEmitter"; var EventManager = Class.inherit({ ctor: function() { this._attachHandlers(); this.reset(); this._proxiedCancelHandler = this._cancelHandler.bind(this); this._proxiedAcceptHandler = this._acceptHandler.bind(this) }, _attachHandlers: function() { $(document).on(eventUtils.addNamespace(pointerEvents.down, MANAGER_EVENT), this._pointerDownHandler.bind(this)).on(eventUtils.addNamespace(pointerEvents.move, MANAGER_EVENT), this._pointerMoveHandler.bind(this)).on(eventUtils.addNamespace([pointerEvents.up, pointerEvents.cancel].join(" "), MANAGER_EVENT), this._pointerUpHandler.bind(this)).on(eventUtils.addNamespace(wheelEvent.name, MANAGER_EVENT), this._mouseWheelHandler.bind(this)) }, _eachEmitter: function(callback) { var activeEmitters = this._activeEmitters || []; var i = 0; while (activeEmitters.length > i) { var emitter = activeEmitters[i]; if (false === callback(emitter)) { break } if (activeEmitters[i] === emitter) { i++ } } }, _applyToEmitters: function(method, arg) { this._eachEmitter(function(emitter) { emitter[method].call(emitter, arg) }) }, reset: function() { this._eachEmitter(this._proxiedCancelHandler); this._activeEmitters = [] }, resetEmitter: function(emitter) { this._proxiedCancelHandler(emitter) }, _pointerDownHandler: function(e) { if (eventUtils.isMouseEvent(e) && e.which > 1) { return } this._updateEmitters(e) }, _updateEmitters: function(e) { if (!this._isSetChanged(e)) { return } this._cleanEmitters(e); this._fetchEmitters(e) }, _isSetChanged: function(e) { var currentSet = this._closestEmitter(e); var previousSet = this._emittersSet || []; var setChanged = currentSet.length !== previousSet.length; $.each(currentSet, function(index, emitter) { setChanged = setChanged || previousSet[index] !== emitter; return !setChanged }); this._emittersSet = currentSet; return setChanged }, _closestEmitter: function(e) { var that = this, result = [], $element = $(e.target); function handleEmitter(_, emitter) { if (!!emitter && emitter.validatePointers(e) && emitter.validate(e)) { emitter.addCancelCallback(that._proxiedCancelHandler); emitter.addAcceptCallback(that._proxiedAcceptHandler); result.push(emitter) } } while ($element.length) { var emitters = $.data($element.get(0), EMITTER_DATA) || []; $.each(emitters, handleEmitter); $element = $element.parent() } return result }, _acceptHandler: function(acceptedEmitter, e) { var that = this; this._eachEmitter(function(emitter) { if (emitter !== acceptedEmitter) { that._cancelEmitter(emitter, e) } }) }, _cancelHandler: function(canceledEmitter, e) { this._cancelEmitter(canceledEmitter, e) }, _cancelEmitter: function(emitter, e) { var activeEmitters = this._activeEmitters; if (e) { emitter.cancel(e) } else { emitter.reset() } emitter.removeCancelCallback(); emitter.removeAcceptCallback(); var emitterIndex = inArray(emitter, activeEmitters); if (emitterIndex > -1) { activeEmitters.splice(emitterIndex, 1) } }, _cleanEmitters: function(e) { this._applyToEmitters("end", e); this.reset(e) }, _fetchEmitters: function(e) { this._activeEmitters = this._emittersSet.slice(); this._applyToEmitters("start", e) }, _pointerMoveHandler: function(e) { this._applyToEmitters("move", e) }, _pointerUpHandler: function(e) { this._updateEmitters(e) }, _mouseWheelHandler: function(e) { if (!this._allowInterruptionByMouseWheel()) { return } e.pointers = [null]; this._pointerDownHandler(e); this._adjustWheelEvent(e); this._pointerMoveHandler(e); e.pointers = []; this._pointerUpHandler(e) }, _allowInterruptionByMouseWheel: function() { var allowInterruption = true; this._eachEmitter(function(emitter) { allowInterruption = emitter.allowInterruptionByMouseWheel() && allowInterruption; return allowInterruption }); return allowInterruption }, _adjustWheelEvent: function(e) { var closestGestureEmitter = null; this._eachEmitter(function(emitter) { if (!emitter.gesture) { return } var direction = emitter.getDirection(e); if ("horizontal" !== direction && !e.shiftKey || "vertical" !== direction && e.shiftKey) { closestGestureEmitter = emitter; return false } }); if (!closestGestureEmitter) { return } var direction = closestGestureEmitter.getDirection(e), verticalGestureDirection = "both" === direction && !e.shiftKey || "vertical" === direction, prop = verticalGestureDirection ? "pageY" : "pageX"; e[prop] += e.delta }, isActive: function(element) { var result = false; this._eachEmitter(function(emitter) { result = result || emitter.getElement().is(element) }); return result } }); var eventManager = new EventManager; var EMITTER_SUBSCRIPTION_DATA = "dxEmitterSubscription"; var registerEmitter = function(emitterConfig) { var emitterClass = emitterConfig.emitter, emitterName = emitterConfig.events[0], emitterEvents = emitterConfig.events; $.each(emitterEvents, function(_, eventName) { registerEvent(eventName, { noBubble: !emitterConfig.bubble, setup: function(element) { var subscriptions = $.data(element, EMITTER_SUBSCRIPTION_DATA) || {}, emitters = $.data(element, EMITTER_DATA) || {}, emitter = emitters[emitterName] || new emitterClass(element); subscriptions[eventName] = true; emitters[emitterName] = emitter; $.data(element, EMITTER_DATA, emitters); $.data(element, EMITTER_SUBSCRIPTION_DATA, subscriptions) }, add: function(element, handleObj) { var emitters = $.data(element, EMITTER_DATA), emitter = emitters[emitterName]; emitter.configure(extend({ delegateSelector: handleObj.selector }, handleObj.data), handleObj.type) }, teardown: function(element) { var subscriptions = $.data(element, EMITTER_SUBSCRIPTION_DATA), emitters = $.data(element, EMITTER_DATA), emitter = emitters[emitterName]; delete subscriptions[eventName]; var disposeEmitter = true; $.each(emitterEvents, function(_, eventName) { disposeEmitter = disposeEmitter && !subscriptions[eventName]; return disposeEmitter }); if (disposeEmitter) { if (eventManager.isActive(element)) { eventManager.resetEmitter(emitter) } emitter && emitter.dispose(); delete emitters[emitterName] } } }) }) }; module.exports = registerEmitter }, /*!*********************************!*\ !*** ./js/events/core/wheel.js ***! \*********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), registerEvent = __webpack_require__( /*! ./event_registrator */ 73), eventUtils = __webpack_require__( /*! ../utils */ 71); var EVENT_NAME = "dxmousewheel", EVENT_NAMESPACE = "dxWheel"; var wheelEvent = void 0 !== document.onwheel ? "wheel" : "mousewheel"; var wheel = { setup: function(element) { var $element = $(element); $element.on(eventUtils.addNamespace(wheelEvent, EVENT_NAMESPACE), wheel._wheelHandler.bind(wheel)) }, teardown: function(element) { var $element = $(element); $element.off("." + EVENT_NAMESPACE) }, _wheelHandler: function(e) { var delta = this._getWheelDelta(e.originalEvent); eventUtils.fireEvent({ type: EVENT_NAME, originalEvent: e, delta: delta, pointerType: "mouse" }); e.stopPropagation() }, _getWheelDelta: function(event) { return event.wheelDelta ? event.wheelDelta : 30 * -event.deltaY } }; registerEvent(EVENT_NAME, wheel); exports.name = EVENT_NAME }, /*!**********************************************!*\ !*** ./js/events/gesture/emitter.gesture.js ***! \**********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), devices = __webpack_require__( /*! ../../core/devices */ 53), support = __webpack_require__( /*! ../../core/utils/support */ 61), browser = __webpack_require__( /*! ../../core/utils/browser */ 23), domUtils = __webpack_require__( /*! ../../core/utils/dom */ 56), mathUtils = __webpack_require__( /*! ../../core/utils/math */ 87), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), eventUtils = __webpack_require__( /*! ../utils */ 71), Emitter = __webpack_require__( /*! ../core/emitter */ 83), sign = mathUtils.sign, abs = Math.abs; var SLEEP = 0, INITED = 1, STARTED = 2, TOUCH_BOUNDARY = 10, IMMEDIATE_TOUCH_BOUNDARY = 0, IMMEDIATE_TIMEOUT = 180; var isMouseWheelEvent = function(e) { return e && "dxmousewheel" === e.type }; var supportPointerEvents = function() { var cssSupport = support.styleProp("pointer-events"); var msieLess11 = browser.msie && parseInt(browser.version, 10) < 11; return cssSupport && !msieLess11 }; var gestureCover = function() { var GESTURE_COVER_CLASS = "dx-gesture-cover"; var isDesktop = "generic" === devices.real().platform; if (!supportPointerEvents() || !isDesktop) { return commonUtils.noop } var $cover = $("<div>").addClass(GESTURE_COVER_CLASS).css("pointerEvents", "none"); $cover.on("dxmousewheel", function(e) { e.preventDefault() }); domUtils.ready(function() { $cover.appendTo("body") }); return function(toggle, cursor) { $cover.css("pointerEvents", toggle ? "all" : "none"); toggle && $cover.css("cursor", cursor) } }(); var GestureEmitter = Emitter.inherit({ gesture: true, configure: function(data) { this.getElement().css("msTouchAction", data.immediate ? "pinch-zoom" : ""); this.callBase(data) }, allowInterruptionByMouseWheel: function() { return this._stage !== STARTED }, getDirection: function() { return this.direction }, _cancel: function() { this.callBase.apply(this, arguments); this._toggleGestureCover(false); this._stage = SLEEP }, start: function(e) { if (eventUtils.needSkipEvent(e)) { this._cancel(e); return } this._startEvent = eventUtils.createEvent(e); this._startEventData = eventUtils.eventData(e); this._stage = INITED; this._init(e); this._setupImmediateTimer() }, _setupImmediateTimer: function() { clearTimeout(this._immediateTimer); this._immediateAccepted = false; if (!this.immediate) { return } this._immediateTimer = setTimeout(function() { this._immediateAccepted = true }.bind(this), IMMEDIATE_TIMEOUT) }, move: function(e) { if (this._stage === INITED && this._directionConfirmed(e)) { this._stage = STARTED; this._resetActiveElement(); this._toggleGestureCover(true); this._clearSelection(e); this._adjustStartEvent(e); this._start(this._startEvent); if (this._stage === SLEEP) { return } this._requestAccept(e); this._move(e); this._forgetAccept() } else { if (this._stage === STARTED) { this._clearSelection(e); this._move(e) } } }, _directionConfirmed: function(e) { var touchBoundary = this._getTouchBoundary(e), delta = eventUtils.eventDelta(this._startEventData, eventUtils.eventData(e)), deltaX = abs(delta.x), deltaY = abs(delta.y); var horizontalMove = this._validateMove(touchBoundary, deltaX, deltaY), verticalMove = this._validateMove(touchBoundary, deltaY, deltaX); var direction = this.getDirection(e), bothAccepted = "both" === direction && (horizontalMove || verticalMove), horizontalAccepted = "horizontal" === direction && horizontalMove, verticalAccepted = "vertical" === direction && verticalMove; return bothAccepted || horizontalAccepted || verticalAccepted || this._immediateAccepted }, _validateMove: function(touchBoundary, mainAxis, crossAxis) { return mainAxis && mainAxis >= touchBoundary && (this.immediate ? mainAxis >= crossAxis : true) }, _getTouchBoundary: function(e) { return this.immediate || isMouseWheelEvent(e) ? IMMEDIATE_TOUCH_BOUNDARY : TOUCH_BOUNDARY }, _adjustStartEvent: function(e) { var touchBoundary = this._getTouchBoundary(e), delta = eventUtils.eventDelta(this._startEventData, eventUtils.eventData(e)); this._startEvent.pageX += sign(delta.x) * touchBoundary; this._startEvent.pageY += sign(delta.y) * touchBoundary }, _resetActiveElement: function() { if ("ios" === devices.real().platform && $(":focus", this.getElement()).length) { domUtils.resetActiveElement() } }, _toggleGestureCover: function(toggle) { var isStarted = this._stage === STARTED; if (isStarted) { gestureCover(toggle, this.getElement().css("cursor")) } }, _clearSelection: function(e) { if (isMouseWheelEvent(e) || eventUtils.isTouchEvent(e)) { return } domUtils.clearSelection() }, end: function(e) { this._toggleGestureCover(false); if (this._stage === STARTED) { this._end(e) } else { if (this._stage === INITED) { this._stop(e) } } this._stage = SLEEP }, dispose: function() { clearTimeout(this._immediateTimer); this.callBase.apply(this, arguments); this._toggleGestureCover(false) }, _init: commonUtils.noop, _start: commonUtils.noop, _move: commonUtils.noop, _stop: commonUtils.noop, _end: commonUtils.noop }); GestureEmitter.initialTouchBoundary = TOUCH_BOUNDARY; GestureEmitter.touchBoundary = function(newBoundary) { if (commonUtils.isDefined(newBoundary)) { TOUCH_BOUNDARY = newBoundary; return } return TOUCH_BOUNDARY }; module.exports = GestureEmitter }, /*!*******************************!*\ !*** ./js/core/utils/math.js ***! \*******************************/ function(module, exports) { var sign = function(value) { if (0 === value) { return 0 } return value / Math.abs(value) }; var fitIntoRange = function(value, minValue, maxValue) { var isMinValueUndefined = !minValue && 0 !== minValue, isMaxValueUndefined = !maxValue && 0 !== maxValue; isMinValueUndefined && (minValue = !isMaxValueUndefined ? Math.min(value, maxValue) : value); isMaxValueUndefined && (maxValue = !isMinValueUndefined ? Math.max(value, minValue) : value); return Math.min(Math.max(value, minValue), maxValue) }; var inRange = function(value, minValue, maxValue) { return value >= minValue && value <= maxValue }; exports.sign = sign; exports.fitIntoRange = fitIntoRange; exports.inRange = inRange }, /*!****************************!*\ !*** ./js/localization.js ***! \****************************/ function(module, exports, __webpack_require__) { exports.locale = __webpack_require__( /*! ./localization/core */ 34).locale; exports.loadMessages = __webpack_require__( /*! ./localization/message */ 89).load; exports.message = __webpack_require__( /*! ./localization/message */ 89); exports.number = __webpack_require__( /*! ./localization/number */ 32); exports.date = __webpack_require__( /*! ./localization/date */ 33); exports.currency = __webpack_require__( /*! ./localization/currency */ 36) }, /*!************************************!*\ !*** ./js/localization/message.js ***! \************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), dependencyInjector = __webpack_require__( /*! ../core/utils/dependency_injector */ 29), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, stringFormat = __webpack_require__( /*! ../core/utils/string */ 18).format, humanize = __webpack_require__( /*! ../core/utils/inflector */ 39).humanize, coreLocalization = __webpack_require__( /*! ./core */ 34); __webpack_require__( /*! ./core */ 34); var baseDictionary = extend(true, {}, __webpack_require__( /*! ./default_messages */ 90)); var newMessages = {}; var messageLocalization = dependencyInjector({ _dictionary: baseDictionary, load: function(messages) { extend(true, this._dictionary, messages) }, _localizablePrefix: "@", setup: function(localizablePrefix) { this._localizablePrefix = localizablePrefix }, localizeString: function(text) { var that = this, regex = new RegExp("(^|[^a-zA-Z_0-9" + that._localizablePrefix + "-]+)(" + that._localizablePrefix + "{1,2})([a-zA-Z_0-9-]+)", "g"), escapeString = that._localizablePrefix + that._localizablePrefix; return text.replace(regex, function(str, prefix, escape, localizationKey) { var result, defaultResult = that._localizablePrefix + localizationKey; if (escape !== escapeString) { result = that.format(localizationKey) } if (!result) { newMessages[localizationKey] = humanize(localizationKey) } return prefix + (result || defaultResult) }) }, _messageLoaded: function(key, locale) { return void 0 !== this._dictionary[locale || coreLocalization.locale()][key] }, localizeNode: function(node) { var that = this; $(node).each(function(index, nodeItem) { if (!nodeItem.nodeType) { return } if (3 === nodeItem.nodeType) { nodeItem.nodeValue = that.localizeString(nodeItem.nodeValue) } else { if (!$(nodeItem).is("iframe")) { $.each(nodeItem.attributes || [], function(index, attr) { if ("string" === typeof attr.value) { var localizedValue = that.localizeString(attr.value); if (attr.value !== localizedValue) { attr.value = localizedValue } } }); $(nodeItem).contents().each(function(index, node) { that.localizeNode(node) }) } } }) }, getMessagesByLocales: function() { return this._dictionary }, getDictionary: function(onlyNew) { if (onlyNew) { return newMessages } return extend({}, newMessages, this.getMessagesByLocales()[coreLocalization.locale()]) }, getFormatter: function(key) { return this._getFormatterBase(key) || this._getFormatterBase(key, "en") }, _getFormatterBase: function(key, locale) { var localeMessages = this._dictionary[locale || coreLocalization.locale()], message = localeMessages && localeMessages[key]; if (message) { return function() { var args = 1 === arguments.length && Array.isArray(arguments[0]) ? arguments[0].slice(0) : Array.prototype.slice.call(arguments, 0); args.unshift(message); return stringFormat.apply(this, args) } } }, format: function(key) { var formatter = this.getFormatter(key); return formatter && formatter() || "" } }); module.exports = messageLocalization }, /*!*********************************************!*\ !*** ./js/localization/default_messages.js ***! \*********************************************/ function(module, exports) { module.exports = { en: { Yes: "Yes", No: "No", Cancel: "Cancel", Clear: "Clear", Done: "Done", Loading: "Loading...", Select: "Select...", Search: "Search", Back: "Back", OK: "OK", "dxCollectionWidget-noDataText": "No data to display", "validation-required": "Required", "validation-required-formatted": "{0} is required", "validation-numeric": "Value must be a number", "validation-numeric-formatted": "{0} must be a number", "validation-range": "Value is out of range", "validation-range-formatted": "{0} is out of range", "validation-stringLength": "The length of the value is not correct", "validation-stringLength-formatted": "The length of {0} is not correct", "validation-custom": "Value is invalid", "validation-custom-formatted": "{0} is invalid", "validation-compare": "Values do not match", "validation-compare-formatted": "{0} does not match", "validation-pattern": "Value does not match pattern", "validation-pattern-formatted": "{0} does not match pattern", "validation-email": "Email is invalid", "validation-email-formatted": "{0} is invalid", "validation-mask": "Value is invalid", "dxLookup-searchPlaceholder": "Minimum character number: {0}", "dxList-pullingDownText": "Pull down to refresh...", "dxList-pulledDownText": "Release to refresh...", "dxList-refreshingText": "Refreshing...", "dxList-pageLoadingText": "Loading...", "dxList-nextButtonText": "More", "dxList-selectAll": "Select All", "dxListEditDecorator-delete": "Delete", "dxListEditDecorator-more": "More", "dxScrollView-pullingDownText": "Pull down to refresh...", "dxScrollView-pulledDownText": "Release to refresh...", "dxScrollView-refreshingText": "Refreshing...", "dxScrollView-reachBottomText": "Loading...", "dxDateBox-simulatedDataPickerTitleTime": "Select time", "dxDateBox-simulatedDataPickerTitleDate": "Select date", "dxDateBox-simulatedDataPickerTitleDateTime": "Select date and time", "dxDateBox-validation-datetime": "Value must be a date or time", "dxFileUploader-selectFile": "Select file", "dxFileUploader-dropFile": "or Drop file here", "dxFileUploader-bytes": "bytes", "dxFileUploader-kb": "kb", "dxFileUploader-Mb": "Mb", "dxFileUploader-Gb": "Gb", "dxFileUploader-upload": "Upload", "dxFileUploader-uploaded": "Uploaded", "dxFileUploader-readyToUpload": "Ready to upload", "dxFileUploader-uploadFailedMessage": "Upload failed", "dxRangeSlider-ariaFrom": "From", "dxRangeSlider-ariaTill": "Till", "dxSwitch-onText": "ON", "dxSwitch-offText": "OFF", "dxForm-optionalMark": "optional", "dxForm-requiredMessage": "{0} is required", "dxNumberBox-invalidValueMessage": "Value must be a number", "dxDataGrid-columnChooserTitle": "Column Chooser", "dxDataGrid-columnChooserEmptyText": "Drag a column here to hide it", "dxDataGrid-groupContinuesMessage": "Continues on the next page", "dxDataGrid-groupContinuedMessage": "Continued from the previous page", "dxDataGrid-groupHeaderText": "Group by This Column", "dxDataGrid-ungroupHeaderText": "Ungroup", "dxDataGrid-ungroupAllText": "Ungroup All", "dxDataGrid-editingEditRow": "Edit", "dxDataGrid-editingSaveRowChanges": "Save", "dxDataGrid-editingCancelRowChanges": "Cancel", "dxDataGrid-editingDeleteRow": "Delete", "dxDataGrid-editingUndeleteRow": "Undelete", "dxDataGrid-editingConfirmDeleteMessage": "Are you sure you want to delete this record?", "dxDataGrid-validationCancelChanges": "Cancel changes", "dxDataGrid-groupPanelEmptyText": "Drag a column header here to group by that column", "dxDataGrid-noDataText": "No data", "dxDataGrid-searchPanelPlaceholder": "Search...", "dxDataGrid-filterRowShowAllText": "(All)", "dxDataGrid-filterRowResetOperationText": "Reset", "dxDataGrid-filterRowOperationEquals": "Equals", "dxDataGrid-filterRowOperationNotEquals": "Does not equal", "dxDataGrid-filterRowOperationLess": "Less than", "dxDataGrid-filterRowOperationLessOrEquals": "Less than or equal to", "dxDataGrid-filterRowOperationGreater": "Greater than", "dxDataGrid-filterRowOperationGreaterOrEquals": "Greater than or equal to", "dxDataGrid-filterRowOperationStartsWith": "Starts with", "dxDataGrid-filterRowOperationContains": "Contains", "dxDataGrid-filterRowOperationNotContains": "Does not contain", "dxDataGrid-filterRowOperationEndsWith": "Ends with", "dxDataGrid-filterRowOperationBetween": "Between", "dxDataGrid-filterRowOperationBetweenStartText": "Start", "dxDataGrid-filterRowOperationBetweenEndText": "End", "dxDataGrid-applyFilterText": "Apply filter", "dxDataGrid-trueText": "true", "dxDataGrid-falseText": "false", "dxDataGrid-sortingAscendingText": "Sort Ascending", "dxDataGrid-sortingDescendingText": "Sort Descending", "dxDataGrid-sortingClearText": "Clear Sorting", "dxDataGrid-editingSaveAllChanges": "Save changes", "dxDataGrid-editingCancelAllChanges": "Discard changes", "dxDataGrid-editingAddRow": "Add a row", "dxDataGrid-summaryMin": "Min: {0}", "dxDataGrid-summaryMinOtherColumn": "Min of {1} is {0}", "dxDataGrid-summaryMax": "Max: {0}", "dxDataGrid-summaryMaxOtherColumn": "Max of {1} is {0}", "dxDataGrid-summaryAvg": "Avg: {0}", "dxDataGrid-summaryAvgOtherColumn": "Avg of {1} is {0}", "dxDataGrid-summarySum": "Sum: {0}", "dxDataGrid-summarySumOtherColumn": "Sum of {1} is {0}", "dxDataGrid-summaryCount": "Count: {0}", "dxDataGrid-columnFixingFix": "Fix", "dxDataGrid-columnFixingUnfix": "Unfix", "dxDataGrid-columnFixingLeftPosition": "To the left", "dxDataGrid-columnFixingRightPosition": "To the right", "dxDataGrid-exportTo": "Export", "dxDataGrid-exportToExcel": "Export to Excel file", "dxDataGrid-excelFormat": "Excel file", "dxDataGrid-selectedRows": "Selected rows", "dxDataGrid-exportSelectedRows": "Export selected rows", "dxDataGrid-exportAll": "Export all data", "dxDataGrid-headerFilterEmptyValue": "(Blanks)", "dxDataGrid-headerFilterOK": "OK", "dxDataGrid-headerFilterCancel": "Cancel", "dxDataGrid-ariaColumn": "Column", "dxDataGrid-ariaValue": "Value", "dxDataGrid-ariaFilterCell": "Filter cell", "dxDataGrid-ariaCollapse": "Collapse", "dxDataGrid-ariaExpand": "Expand", "dxDataGrid-ariaDataGrid": "Data grid", "dxDataGrid-ariaSearchInGrid": "Search in data grid", "dxDataGrid-ariaSelectAll": "Select all", "dxDataGrid-ariaSelectRow": "Select row", "dxTreeList-ariaTreeList": "Tree list", "dxTreeList-editingAddRowToNode": "Add", "dxPager-infoText": "Page {0} of {1} ({2} items)", "dxPager-pagesCountText": "of", "dxPivotGrid-grandTotal": "Grand Total", "dxPivotGrid-total": "{0} Total", "dxPivotGrid-fieldChooserTitle": "Field Chooser", "dxPivotGrid-showFieldChooser": "Show Field Chooser", "dxPivotGrid-expandAll": "Expand All", "dxPivotGrid-collapseAll": "Collapse All", "dxPivotGrid-sortColumnBySummary": 'Sort "{0}" by This Column', "dxPivotGrid-sortRowBySummary": 'Sort "{0}" by This Row', "dxPivotGrid-removeAllSorting": "Remove All Sorting", "dxPivotGrid-dataNotAvailable": "N/A", "dxPivotGrid-rowFields": "Row Fields", "dxPivotGrid-columnFields": "Column Fields", "dxPivotGrid-dataFields": "Data Fields", "dxPivotGrid-filterFields": "Filter Fields", "dxPivotGrid-allFields": "All Fields", "dxPivotGrid-columnFieldArea": "Drop Column Fields Here", "dxPivotGrid-dataFieldArea": "Drop Data Fields Here", "dxPivotGrid-rowFieldArea": "Drop Row Fields Here", "dxPivotGrid-filterFieldArea": "Drop Filter Fields Here", "dxScheduler-editorLabelTitle": "Subject", "dxScheduler-editorLabelStartDate": "Start Date", "dxScheduler-editorLabelEndDate": "End Date", "dxScheduler-editorLabelDescription": "Description", "dxScheduler-editorLabelRecurrence": "Repeat", "dxScheduler-openAppointment": "Open appointment", "dxScheduler-recurrenceNever": "Never", "dxScheduler-recurrenceDaily": "Daily", "dxScheduler-recurrenceWeekly": "Weekly", "dxScheduler-recurrenceMonthly": "Monthly", "dxScheduler-recurrenceYearly": "Yearly", "dxScheduler-recurrenceEvery": "Every", "dxScheduler-recurrenceEnd": "End repeat", "dxScheduler-recurrenceAfter": "After", "dxScheduler-recurrenceOn": "On", "dxScheduler-recurrenceRepeatDaily": "day(s)", "dxScheduler-recurrenceRepeatWeekly": "week(s)", "dxScheduler-recurrenceRepeatMonthly": "month(s)", "dxScheduler-recurrenceRepeatYearly": "year(s)", "dxScheduler-switcherDay": "Day", "dxScheduler-switcherWeek": "Week", "dxScheduler-switcherWorkWeek": "Work Week", "dxScheduler-switcherMonth": "Month", "dxScheduler-switcherAgenda": "Agenda", "dxScheduler-switcherTimelineDay": "Timeline Day", "dxScheduler-switcherTimelineWeek": "Timeline Week", "dxScheduler-switcherTimelineWorkWeek": "Timeline Work Week", "dxScheduler-switcherTimelineMonth": "Timeline Month", "dxScheduler-recurrenceRepeatOnDate": "on date", "dxScheduler-recurrenceRepeatCount": "occurrence(s)", "dxScheduler-allDay": "All day", "dxScheduler-confirmRecurrenceEditMessage": "Do you want to edit only this appointment or the whole series?", "dxScheduler-confirmRecurrenceDeleteMessage": "Do you want to delete only this appointment or the whole series?", "dxScheduler-confirmRecurrenceEditSeries": "Edit series", "dxScheduler-confirmRecurrenceDeleteSeries": "Delete series", "dxScheduler-confirmRecurrenceEditOccurrence": "Edit appointment", "dxScheduler-confirmRecurrenceDeleteOccurrence": "Delete appointment", "dxScheduler-noTimezoneTitle": "No timezone", "dxCalendar-todayButtonText": "Today", "dxCalendar-ariaWidgetName": "Calendar", "dxColorView-ariaRed": "Red", "dxColorView-ariaGreen": "Green", "dxColorView-ariaBlue": "Blue", "dxColorView-ariaAlpha": "Transparency", "dxColorView-ariaHex": "Color code", "vizExport-printingButtonText": "Print", "vizExport-titleMenuText": "Exporting/Printing", "vizExport-exportButtonText": "{0} file" } } }, /*!*****************************************!*\ !*** ./js/bundles/modules/framework.js ***! \*****************************************/ function(module, exports, __webpack_require__) { __webpack_require__( /*! ./core */ 6); __webpack_require__( /*! ../../integration/knockout */ 92); module.exports = DevExpress.framework = {}; DevExpress.framework.dxCommand = __webpack_require__( /*! ../../framework/command */ 121); DevExpress.framework.Router = __webpack_require__( /*! ../../framework/router */ 123); DevExpress.framework.StateManager = __webpack_require__( /*! ../../framework/state_manager */ 124); DevExpress.framework.ViewCache = __webpack_require__( /*! ../../framework/view_cache */ 125); DevExpress.framework.NullViewCache = __webpack_require__( /*! ../../framework/view_cache */ 125).NullViewCache; DevExpress.framework.ConditionalViewCacheDecorator = __webpack_require__( /*! ../../framework/view_cache */ 125).ConditionalViewCacheDecorator; DevExpress.framework.CapacityViewCacheDecorator = __webpack_require__( /*! ../../framework/view_cache */ 125).CapacityViewCacheDecorator; DevExpress.framework.HistoryDependentViewCacheDecorator = __webpack_require__( /*! ../../framework/view_cache */ 125).HistoryDependentViewCacheDecorator; DevExpress.framework.dxCommandContainer = __webpack_require__( /*! ../../framework/html/command_container */ 126); DevExpress.framework.dxView = __webpack_require__( /*! ../../framework/html/view_engine_components */ 128).dxView; DevExpress.framework.dxLayout = __webpack_require__( /*! ../../framework/html/view_engine_components */ 128).dxLayout; DevExpress.framework.dxViewPlaceholder = __webpack_require__( /*! ../../framework/html/view_engine_components */ 128).dxViewPlaceholder; DevExpress.framework.dxContentPlaceholder = __webpack_require__( /*! ../../framework/html/view_engine_components */ 128).dxContentPlaceholder; DevExpress.framework.dxTransition = __webpack_require__( /*! ../../framework/html/view_engine_components */ 128).dxTransition; DevExpress.framework.dxContent = __webpack_require__( /*! ../../framework/html/view_engine_components */ 128).dxContent; DevExpress.framework.html = {}; DevExpress.framework.html.HtmlApplication = __webpack_require__( /*! ../../framework/html/html_application */ 129); DevExpress.framework.Route = __webpack_require__( /*! ../../framework/router */ 123).Route; DevExpress.framework.MemoryKeyValueStorage = __webpack_require__( /*! ../../framework/state_manager */ 124).MemoryKeyValueStorage; DevExpress.framework.NavigationDevices = __webpack_require__( /*! ../../framework/navigation_devices */ 134); DevExpress.framework.NavigationManager = __webpack_require__( /*! ../../framework/navigation_manager */ 133); DevExpress.framework.createActionExecutors = __webpack_require__( /*! ../../framework/action_executors */ 132).createActionExecutors; DevExpress.framework.Application = __webpack_require__( /*! ../../framework/application */ 130).Application; var browserAdapters = __webpack_require__( /*! ../../framework/browser_adapters */ 135); DevExpress.framework.DefaultBrowserAdapter = browserAdapters.DefaultBrowserAdapter; DevExpress.framework.OldBrowserAdapter = browserAdapters.OldBrowserAdapter; DevExpress.framework.BuggyAndroidBrowserAdapter = browserAdapters.BuggyAndroidBrowserAdapter; DevExpress.framework.HistorylessBrowserAdapter = browserAdapters.HistorylessBrowserAdapter; DevExpress.framework.BuggyCordovaWP81BrowserAdapter = browserAdapters.BuggyCordovaWP81BrowserAdapter; DevExpress.framework.CommandMapping = __webpack_require__( /*! ../../framework/command_mapping */ 136); DevExpress.framework.HistoryBasedNavigationDevice = __webpack_require__( /*! ../../framework/navigation_devices */ 134).HistoryBasedNavigationDevice; DevExpress.framework.StackBasedNavigationDevice = __webpack_require__( /*! ../../framework/navigation_devices */ 134).StackBasedNavigationDevice; DevExpress.framework.HistoryBasedNavigationManager = __webpack_require__( /*! ../../framework/navigation_manager */ 133).HistoryBasedNavigationManager; DevExpress.framework.StackBasedNavigationManager = __webpack_require__( /*! ../../framework/navigation_manager */ 133).StackBasedNavigationManager; DevExpress.framework.NavigationStack = __webpack_require__( /*! ../../framework/navigation_manager */ 133).NavigationStack; DevExpress.framework.utils = __webpack_require__( /*! ../../framework/utils */ 131).utils; DevExpress.framework.templateProvider = __webpack_require__( /*! ../../framework/utils */ 131).templateProvider; DevExpress.framework.html.CommandManager = __webpack_require__( /*! ../../framework/html/command_manager */ 139); DevExpress.framework.html.HtmlApplication = __webpack_require__( /*! ../../framework/html/html_application */ 129); DevExpress.framework.html.layoutSets = __webpack_require__( /*! ../../framework/html/presets */ 138).layoutSets; DevExpress.framework.html.animationSets = __webpack_require__( /*! ../../framework/html/presets */ 138).animationSets; DevExpress.framework.html.DefaultLayoutController = __webpack_require__( /*! ../../framework/html/layout_controller */ 142).DefaultLayoutController; DevExpress.framework.html.layoutSets = __webpack_require__( /*! ../../framework/html/layout_controller */ 142).layoutSets; DevExpress.framework.html.MarkupComponent = __webpack_require__( /*! ../../framework/html/markup_component */ 127).MarkupComponent; DevExpress.framework.html.ViewEngine = __webpack_require__( /*! ../../framework/html/view_engine */ 141).ViewEngine; DevExpress.framework.html.ViewEngineComponents = __webpack_require__( /*! ../../framework/html/view_engine_components */ 128); var widgetCommandAdaptersModule = __webpack_require__( /*! ../../framework/html/widget_command_adapters */ 140); DevExpress.framework.html.commandToDXWidgetAdapters = { dxToolbar: widgetCommandAdaptersModule.dxToolbar, dxList: widgetCommandAdaptersModule.dxList, dxNavBar: widgetCommandAdaptersModule.dxNavBar, dxPivot: widgetCommandAdaptersModule.dxPivot, dxSlideOut: widgetCommandAdaptersModule.dxSlideOut } }, /*!************************************!*\ !*** ./js/integration/knockout.js ***! \************************************/ function(module, exports, __webpack_require__) { var ko = __webpack_require__( /*! knockout */ 93); if (ko) { var errors = __webpack_require__( /*! ../core/errors */ 7), compareVersion = __webpack_require__( /*! ../core/utils/version */ 17).compare; if (compareVersion(ko.version, [2, 3]) < 0) { throw errors.Error("E0013") } __webpack_require__( /*! ./knockout/component_registrator */ 94); __webpack_require__( /*! ./knockout/event_registrator */ 113); __webpack_require__( /*! ./knockout/components */ 114); __webpack_require__( /*! ./knockout/validation */ 116); __webpack_require__( /*! ./knockout/variable_wrapper_utils */ 118); __webpack_require__( /*! ./knockout/clean_node */ 119); __webpack_require__( /*! ./knockout/clean_node_old */ 120) } }, /*!****************************!*\ !*** external "window.ko" ***! \****************************/ function(module, exports) { module.exports = window.ko }, /*!**********************************************************!*\ !*** ./js/integration/knockout/component_registrator.js ***! \**********************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), ko = __webpack_require__( /*! knockout */ 93), errors = __webpack_require__( /*! ../../core/errors */ 7), inflector = __webpack_require__( /*! ../../core/utils/inflector */ 39), isPlainObject = __webpack_require__( /*! ../../core/utils/type */ 12).isPlainObject, registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), Widget = __webpack_require__( /*! ../../ui/widget/ui.widget */ 95), KoTemplate = __webpack_require__( /*! ./template */ 105), Editor = __webpack_require__( /*! ../../ui/editor/editor */ 106), Locker = __webpack_require__( /*! ../../core/utils/locker */ 112), config = __webpack_require__( /*! ../../core/config */ 15); var LOCKS_DATA_KEY = "dxKoLocks", CREATED_WITH_KO_DATA_KEY = "dxKoCreation"; var editorsBindingHandlers = []; var registerComponentKoBinding = function(componentName, componentClass) { if (componentClass.subclassOf(Editor)) { editorsBindingHandlers.push(componentName) } ko.bindingHandlers[componentName] = { init: function(domNode, valueAccessor) { var component, isBindingPropertyPredicate, $element = $(domNode), optionChangedCallbacks = $.Callbacks(), optionsByReference = {}, knockoutConfig = config().knockout, isBindingPropertyPredicateName = knockoutConfig && knockoutConfig.isBindingPropertyPredicateName, ctorOptions = { onInitializing: function() { optionsByReference = this._getOptionsByReference(); ko.computed(function() { var model = ko.unwrap(valueAccessor()); if (component) { component.beginUpdate() } isBindingPropertyPredicate = isBindingPropertyPredicateName && model && model[isBindingPropertyPredicateName]; unwrapModel(model); if (component) { component.endUpdate() } }, null, { disposeWhenNodeIsRemoved: domNode }); component = this }, modelByElement: function($element) { if ($element.length) { return ko.dataFor($element.get(0)) } }, nestedComponentOptions: function(component) { return { modelByElement: component.option("modelByElement"), nestedComponentOptions: component.option("nestedComponentOptions") } }, _optionChangedCallbacks: optionChangedCallbacks, integrationOptions: { watchMethod: function(fn, callback, options) { options = options || {}; var skipCallback = options.skipImmediate; var watcher = ko.computed(function() { var newValue = ko.unwrap(fn()); if (!skipCallback) { callback(newValue) } skipCallback = false }); return function() { watcher.dispose() } }, templates: { "dx-polymorph-widget": { render: function(options) { var widgetName = ko.utils.unwrapObservable(options.model.widget); if (!widgetName) { return } if ("button" === widgetName || "tabs" === widgetName || "dropDownMenu" === widgetName) { var deprecatedName = widgetName; widgetName = inflector.camelize("dx-" + widgetName); errors.log("W0001", "dxToolbar - 'widget' item field", deprecatedName, "16.1", "Use: '" + widgetName + "' instead") } var markup = $('<div data-bind="' + widgetName + ': options">').get(0); options.container.append(markup); ko.applyBindings(options.model, markup) } } }, createTemplate: function(element) { return new KoTemplate(element) } } }, optionNameToModelMap = {}; var applyModelValueToOption = function(optionName, modelValue, unwrap) { var locks = $element.data(LOCKS_DATA_KEY), optionValue = unwrap ? ko.unwrap(modelValue) : modelValue; if (ko.isWriteableObservable(modelValue)) { optionNameToModelMap[optionName] = modelValue } if (component) { if (locks.locked(optionName)) { return } locks.obtain(optionName); try { if (ko.ignoreDependencies) { ko.ignoreDependencies(component.option, component, [optionName, optionValue]) } else { component.option(optionName, optionValue) } } finally { locks.release(optionName) } } else { ctorOptions[optionName] = optionValue } }; var handleOptionChanged = function(args) { var optionName = args.fullName, optionValue = args.value; if (!(optionName in optionNameToModelMap)) { return } var $element = this._$element, locks = $element.data(LOCKS_DATA_KEY); if (locks.locked(optionName)) { return } locks.obtain(optionName); try { optionNameToModelMap[optionName](optionValue) } finally { locks.release(optionName) } }; var createComponent = function() { optionChangedCallbacks.add(handleOptionChanged); $element.data(CREATED_WITH_KO_DATA_KEY, true).data(LOCKS_DATA_KEY, new Locker)[componentName](ctorOptions); ctorOptions = null }; var unwrapModelValue = function(currentModel, propertyName, propertyPath) { if (propertyPath === isBindingPropertyPredicateName) { return } if (!isBindingPropertyPredicate || isBindingPropertyPredicate(propertyPath, propertyName, currentModel)) { var unwrappedPropertyValue; ko.computed(function() { var propertyValue = currentModel[propertyName]; applyModelValueToOption(propertyPath, propertyValue, true); unwrappedPropertyValue = ko.unwrap(propertyValue) }, null, { disposeWhenNodeIsRemoved: domNode }); if (isPlainObject(unwrappedPropertyValue)) { if (!optionsByReference[propertyPath]) { unwrapModel(unwrappedPropertyValue, propertyPath) } } } else { applyModelValueToOption(propertyPath, currentModel[propertyName], false) } }; var unwrapModel = function(model, propertyPath) { for (var propertyName in model) { if (model.hasOwnProperty(propertyName)) { unwrapModelValue(model, propertyName, propertyPath ? [propertyPath, propertyName].join(".") : propertyName) } } }; createComponent(); return { controlsDescendantBindings: componentClass.subclassOf(Widget) } } }; if ("dxValidator" === componentName) { ko.bindingHandlers.dxValidator.after = editorsBindingHandlers } }; registerComponent.callbacks.add(function(name, componentClass) { registerComponentKoBinding(name, componentClass) }) }, /*!***********************************!*\ !*** ./js/ui/widget/ui.widget.js ***! \***********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), errors = __webpack_require__( /*! ./ui.errors */ 22), Action = __webpack_require__( /*! ../../core/action */ 49), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), typeUtils = __webpack_require__( /*! ../../core/utils/type */ 12), domUtils = __webpack_require__( /*! ../../core/utils/dom */ 56), devices = __webpack_require__( /*! ../../core/devices */ 53), DOMComponent = __webpack_require__( /*! ../../core/dom_component */ 43), Template = __webpack_require__( /*! ./jquery.template */ 96), FunctionTemplate = __webpack_require__( /*! ./function_template */ 98), EmptyTemplate = __webpack_require__( /*! ./empty_template */ 99), ChildDefaultTemplate = __webpack_require__( /*! ./child_default_template */ 100), KeyboardProcessor = __webpack_require__( /*! ./ui.keyboard_processor */ 101), selectors = __webpack_require__( /*! ./jquery.selectors */ 102), eventUtils = __webpack_require__( /*! ../../events/utils */ 71), hoverEvents = __webpack_require__( /*! ../../events/hover */ 103), feedbackEvents = __webpack_require__( /*! ../../events/core/emitter.feedback */ 104), clickEvent = __webpack_require__( /*! ../../events/click */ 75), inflector = __webpack_require__( /*! ../../core/utils/inflector */ 39); var UI_FEEDBACK = "UIFeedback", WIDGET_CLASS = "dx-widget", ACTIVE_STATE_CLASS = "dx-state-active", DISABLED_STATE_CLASS = "dx-state-disabled", INVISIBLE_STATE_CLASS = "dx-state-invisible", HOVER_STATE_CLASS = "dx-state-hover", FOCUSED_STATE_CLASS = "dx-state-focused", FEEDBACK_SHOW_TIMEOUT = 30, FEEDBACK_HIDE_TIMEOUT = 400, FOCUS_NAMESPACE = "Focus", ANONYMOUS_TEMPLATE_NAME = "template", TEXT_NODE = 3, TEMPLATE_SELECTOR = "[data-options*='dxTemplate']", TEMPLATE_WRAPPER_CLASS = "dx-template-wrapper"; var DX_POLYMORPH_WIDGET_TEMPLATE = new FunctionTemplate(function(options) { var widgetName = options.model.widget; if (widgetName) { var widgetElement = $("<div>"), widgetOptions = options.model.options || {}; if ("button" === widgetName || "tabs" === widgetName || "dropDownMenu" === widgetName) { var deprecatedName = widgetName; widgetName = inflector.camelize("dx-" + widgetName); errors.log("W0001", "dxToolbar - 'widget' item field", deprecatedName, "16.1", "Use: '" + widgetName + "' instead") } widgetElement[widgetName](widgetOptions); return widgetElement } return $() }); var beforeActivateExists = void 0 !== document.onbeforeactivate; var Widget = DOMComponent.inherit({ _supportedKeys: function() { return {} }, _getDefaultOptions: function() { return extend(this.callBase(), { disabled: false, visible: true, hint: void 0, activeStateEnabled: false, onContentReady: null, hoverStateEnabled: false, focusStateEnabled: false, tabIndex: 0, accessKey: null, onFocusIn: null, onFocusOut: null, integrationOptions: { watchMethod: function(fn, callback, options) { options = options || {}; if (!options.skipImmediate) { callback(fn()) } return commonUtils.noop }, templates: { "dx-polymorph-widget": DX_POLYMORPH_WIDGET_TEMPLATE }, createTemplate: function(element) { return new Template(element) } }, _keyboardProcessor: void 0 }) }, _feedbackShowTimeout: FEEDBACK_SHOW_TIMEOUT, _feedbackHideTimeout: FEEDBACK_HIDE_TIMEOUT, _init: function() { this.callBase(); this._tempTemplates = []; this._defaultTemplates = {}; this._initTemplates(); this._initContentReadyAction() }, _initTemplates: function() { this._extractTemplates(); this._extractAnonymousTemplate() }, _extractTemplates: function() { var templates = this.option("integrationOptions.templates"), templateElements = this.element().contents().filter(TEMPLATE_SELECTOR); var templatesMap = {}; templateElements.each(function(_, template) { var templateOptions = domUtils.getElementOptions(template).dxTemplate; if (!templateOptions) { return } if (!templateOptions.name) { throw errors.Error("E0023") } $(template).addClass(TEMPLATE_WRAPPER_CLASS).detach(); templatesMap[templateOptions.name] = templatesMap[templateOptions.name] || []; templatesMap[templateOptions.name].push(template) }); $.each(templatesMap, function(templateName, value) { var deviceTemplate = this._findTemplateByDevice(value); if (deviceTemplate) { templates[templateName] = this._createTemplate(deviceTemplate) } }.bind(this)) }, _findTemplateByDevice: function(templates) { var suitableTemplate = commonUtils.findBestMatches(devices.current(), templates, function(template) { return domUtils.getElementOptions(template).dxTemplate })[0]; $.each(templates, function(index, template) { if (template !== suitableTemplate) { $(template).remove() } }); return suitableTemplate }, _extractAnonymousTemplate: function() { var templates = this.option("integrationOptions.templates"), anonymousTemplateName = this._getAnonymousTemplateName(), $anonymousTemplate = this.element().contents().detach(); var $notJunkTemplateContent = $anonymousTemplate.filter(function(_, element) { var isTextNode = element.nodeType === TEXT_NODE, isEmptyText = $.trim($(element).text()).length < 1; return !(isTextNode && isEmptyText) }), onlyJunkTemplateContent = $notJunkTemplateContent.length < 1; if (!templates[anonymousTemplateName] && !onlyJunkTemplateContent) { templates[anonymousTemplateName] = this._createTemplate($anonymousTemplate) } }, _getAriaTarget: function() { return this._focusTarget() }, _getAnonymousTemplateName: function() { return ANONYMOUS_TEMPLATE_NAME }, _getTemplateByOption: function(optionName) { return this._getTemplate(this.option(optionName)) }, _getTemplate: function(templateSource) { if (commonUtils.isFunction(templateSource)) { return new FunctionTemplate(function(options) { var templateSourceResult = templateSource.apply(this, this._getNormalizedTemplateArgs(options)); if (!commonUtils.isDefined(templateSourceResult)) { return new EmptyTemplate } var dispose = false; var template = this._acquireTemplate(templateSourceResult, function(templateSource) { if (templateSource.nodeType || templateSource.jquery && !$(templateSource).is("script")) { return new FunctionTemplate(function() { return templateSource }) } dispose = true; return this._createTemplate(templateSource) }.bind(this)); var result = template.render(options); dispose && template.dispose && template.dispose(); return result }.bind(this)) } return this._acquireTemplate(templateSource, this._createTemplateIfNeeded.bind(this)) }, _acquireTemplate: function(templateSource, createTemplate) { if (null == templateSource) { return new EmptyTemplate } if (templateSource instanceof ChildDefaultTemplate) { return this._defaultTemplates[templateSource.name] } if (commonUtils.isFunction(templateSource.render) && !templateSource.jquery) { return templateSource } if (templateSource.nodeType || templateSource.jquery) { templateSource = $(templateSource); return createTemplate(templateSource) } if ("string" === typeof templateSource) { var userTemplate = this.option("integrationOptions.templates")[templateSource]; if (userTemplate) { return userTemplate } var dynamicTemplate = this._defaultTemplates[templateSource]; if (dynamicTemplate) { return dynamicTemplate } return createTemplate(templateSource) } return this._acquireTemplate(templateSource.toString(), createTemplate) }, _createTemplateIfNeeded: function(templateSource) { var templateKey = function(templateSource) { return templateSource.jquery && templateSource[0] || templateSource }; var cachedTemplate = this._tempTemplates.filter(function(t) { templateSource = templateKey(templateSource); return t.source === templateSource })[0]; if (cachedTemplate) { return cachedTemplate.template } var template = this._createTemplate(templateSource); this._tempTemplates.push({ template: template, source: templateKey(templateSource) }); return template }, _createTemplate: function(templateSource) { templateSource = "string" === typeof templateSource ? domUtils.normalizeTemplateElement(templateSource) : templateSource; return this.option("integrationOptions.createTemplate")(templateSource) }, _getNormalizedTemplateArgs: function(options) { var args = []; if ("model" in options) { args.push(options.model) } if ("index" in options) { args.push(options.index) } args.push(options.container); return args }, _cleanTemplates: function() { this._tempTemplates.forEach(function(t) { t.template.dispose && t.template.dispose() }); this._tempTemplates = [] }, _initContentReadyAction: function() { this._contentReadyAction = this._createActionByOption("onContentReady", { excludeValidators: ["designMode", "disabled", "readOnly"] }) }, _render: function() { this.element().addClass(WIDGET_CLASS); this.callBase(); this._toggleDisabledState(this.option("disabled")); this._toggleVisibility(this.option("visible")); this._renderHint(); this._renderContent(); this._renderFocusState(); this._attachFeedbackEvents(); this._attachHoverEvents() }, _renderHint: function() { domUtils.toggleAttr(this.element(), "title", this.option("hint")) }, _renderContent: function() { var that = this; commonUtils.deferRender(function() { that._renderContentImpl() }); that._fireContentReadyAction() }, _renderContentImpl: commonUtils.noop, _fireContentReadyAction: function() { this._contentReadyAction() }, _dispose: function() { this._cleanTemplates(); this._contentReadyAction = null; this.callBase() }, _clean: function() { this._cleanFocusState(); this.callBase(); this.element().empty() }, _toggleVisibility: function(visible) { this.element().toggleClass(INVISIBLE_STATE_CLASS, !visible); this.setAria("hidden", !visible || void 0) }, _renderFocusState: function() { if (!this.option("focusStateEnabled") || this.option("disabled")) { return } this._renderFocusTarget(); this._attachFocusEvents(); this._attachKeyboardEvents(); this._renderAccessKey() }, _renderAccessKey: function() { var focusTarget = this._focusTarget(); focusTarget.attr("accesskey", this.option("accessKey")); var clickNamespace = eventUtils.addNamespace(clickEvent.name, UI_FEEDBACK); focusTarget.off(clickNamespace); this.option("accessKey") && focusTarget.on(clickNamespace, function(e) { if (eventUtils.isFakeClickEvent(e)) { e.stopImmediatePropagation(); this.focus() } }.bind(this)) }, _eventBindingTarget: function() { return this.element() }, _focusTarget: function() { return this._getActiveElement() }, _getActiveElement: function() { var activeElement = this._eventBindingTarget(); if (this._activeStateUnit) { activeElement = activeElement.find(this._activeStateUnit).not("." + DISABLED_STATE_CLASS) } return activeElement }, _renderFocusTarget: function() { this._focusTarget().attr("tabindex", this.option("tabIndex")) }, _keyboardEventBindingTarget: function() { return this._eventBindingTarget() }, _detachFocusEvents: function() { var $element = this._focusTarget(), namespace = this.NAME + FOCUS_NAMESPACE, focusEvents = eventUtils.addNamespace("focusin", namespace); focusEvents = focusEvents + " " + eventUtils.addNamespace("focusout", namespace); if (beforeActivateExists) { focusEvents = focusEvents + " " + eventUtils.addNamespace("beforeactivate", namespace) } $element.off(focusEvents) }, _attachFocusEvents: function() { var namespace = this.NAME + FOCUS_NAMESPACE, focusInEvent = eventUtils.addNamespace("focusin", namespace), focusOutEvent = eventUtils.addNamespace("focusout", namespace); this._focusTarget().on(focusInEvent, this._focusInHandler.bind(this)).on(focusOutEvent, this._focusOutHandler.bind(this)); if (beforeActivateExists) { var beforeActivateEvent = eventUtils.addNamespace("beforeactivate", namespace); this._focusTarget().on(beforeActivateEvent, function(e) { if (!$(e.target).is(selectors.focusable)) { e.preventDefault() } }) } }, _refreshFocusEvent: function() { this._detachFocusEvents(); this._attachFocusEvents() }, _focusInHandler: function(e) { var that = this; that._createActionByOption("onFocusIn", { beforeExecute: function() { that._updateFocusState(e, true) }, excludeValidators: ["readOnly"] })({ jQueryEvent: e }) }, _focusOutHandler: function(e) { var that = this; that._createActionByOption("onFocusOut", { beforeExecute: function() { that._updateFocusState(e, false) }, excludeValidators: ["readOnly", "disabled"] })({ jQueryEvent: e }) }, _updateFocusState: function(e, isFocused) { var target = e.target; if (inArray(target, this._focusTarget()) !== -1) { this._toggleFocusClass(isFocused, $(target)) } }, _toggleFocusClass: function(isFocused, $element) { var $focusTarget = $element && $element.length ? $element : this._focusTarget(); $focusTarget.toggleClass(FOCUSED_STATE_CLASS, isFocused) }, _hasFocusClass: function(element) { var $focusTarget = $(element || this._focusTarget()); return $focusTarget.hasClass(FOCUSED_STATE_CLASS) }, _attachKeyboardEvents: function() { var processor = this.option("_keyboardProcessor") || new KeyboardProcessor({ element: this._keyboardEventBindingTarget(), focusTarget: this._focusTarget() }); this._keyboardProcessor = processor.reinitialize(this._keyboardHandler, this) }, _keyboardHandler: function(options) { var e = options.originalEvent, key = options.key; var keys = this._supportedKeys(), func = keys[key]; if (void 0 !== func) { var handler = func.bind(this); return handler(e) || false } else { return true } }, _refreshFocusState: function() { this._cleanFocusState(); this._renderFocusState() }, _cleanFocusState: function() { var $element = this._focusTarget(); this._detachFocusEvents(); this._toggleFocusClass(false); $element.removeAttr("tabindex"); if (this._keyboardProcessor) { this._keyboardProcessor.dispose() } }, _attachHoverEvents: function() { var that = this, hoverableSelector = that._activeStateUnit, nameStart = eventUtils.addNamespace(hoverEvents.start, UI_FEEDBACK), nameEnd = eventUtils.addNamespace(hoverEvents.end, UI_FEEDBACK); that._eventBindingTarget().off(nameStart, hoverableSelector).off(nameEnd, hoverableSelector); if (that.option("hoverStateEnabled")) { var startAction = new Action(function(args) { that._hoverStartHandler(args.event); var $target = args.element; that._refreshHoveredElement($target) }, { excludeValidators: ["readOnly"] }); that._eventBindingTarget().on(nameStart, hoverableSelector, function(e) { startAction.execute({ element: $(e.target), event: e }) }).on(nameEnd, hoverableSelector, function(e) { that._hoverEndHandler(e); that._forgetHoveredElement() }) } else { that._toggleHoverClass(false) } }, _hoverStartHandler: commonUtils.noop, _hoverEndHandler: commonUtils.noop, _attachFeedbackEvents: function() { var feedbackAction, feedbackActionDisabled, that = this, feedbackSelector = that._activeStateUnit, activeEventName = eventUtils.addNamespace(feedbackEvents.active, UI_FEEDBACK), inactiveEventName = eventUtils.addNamespace(feedbackEvents.inactive, UI_FEEDBACK); that._eventBindingTarget().off(activeEventName, feedbackSelector).off(inactiveEventName, feedbackSelector); if (that.option("activeStateEnabled")) { var feedbackActionHandler = function(args) { var $element = args.element, value = args.value, jQueryEvent = args.jQueryEvent; that._toggleActiveState($element, value, jQueryEvent) }; that._eventBindingTarget().on(activeEventName, feedbackSelector, { timeout: that._feedbackShowTimeout }, function(e) { feedbackAction = feedbackAction || new Action(feedbackActionHandler); feedbackAction.execute({ element: $(e.currentTarget), value: true, jQueryEvent: e }) }).on(inactiveEventName, feedbackSelector, { timeout: that._feedbackHideTimeout }, function(e) { feedbackActionDisabled = feedbackActionDisabled || new Action(feedbackActionHandler, { excludeValidators: ["disabled", "readOnly"] }); feedbackActionDisabled.execute({ element: $(e.currentTarget), value: false, jQueryEvent: e }) }) } }, _toggleActiveState: function($element, value) { this._toggleHoverClass(!value); $element.toggleClass(ACTIVE_STATE_CLASS, value) }, _refreshHoveredElement: function(hoveredElement) { var selector = this._activeStateUnit || this._eventBindingTarget(); this._forgetHoveredElement(); this._hoveredElement = hoveredElement.closest(selector); this._toggleHoverClass(true) }, _forgetHoveredElement: function() { this._toggleHoverClass(false); delete this._hoveredElement }, _toggleHoverClass: function(value) { if (this._hoveredElement) { this._hoveredElement.toggleClass(HOVER_STATE_CLASS, value && this.option("hoverStateEnabled")) } }, _toggleDisabledState: function(value) { this.element().toggleClass(DISABLED_STATE_CLASS, Boolean(value)); this._toggleHoverClass(!value); this.setAria("disabled", value || void 0) }, _setWidgetOption: function(widgetName, args) { if (!this[widgetName]) { return } if (typeUtils.isPlainObject(args[0])) { $.each(args[0], function(option, value) { this._setWidgetOption(widgetName, [option, value]) }.bind(this)); return } var optionName = args[0]; var value = args[1]; if (1 === args.length) { value = this.option(optionName) } var widgetOptionMap = this[widgetName + "OptionMap"]; this[widgetName].option(widgetOptionMap ? widgetOptionMap(optionName) : optionName, value) }, _optionChanged: function(args) { switch (args.name) { case "disabled": this._toggleDisabledState(args.value); this._refreshFocusState(); break; case "hint": this._renderHint(); break; case "activeStateEnabled": this._attachFeedbackEvents(); break; case "hoverStateEnabled": this._attachHoverEvents(); break; case "tabIndex": case "_keyboardProcessor": case "focusStateEnabled": this._refreshFocusState(); break; case "onFocusIn": case "onFocusOut": break; case "accessKey": this._renderAccessKey(); break; case "visible": var visible = args.value; this._toggleVisibility(visible); if (this._isVisibilityChangeSupported()) { this._checkVisibilityChanged(args.value ? "shown" : "hiding") } break; case "onContentReady": this._initContentReadyAction(); break; default: this.callBase(args) } }, _isVisible: function() { return this.callBase() && this.option("visible") }, beginUpdate: function() { this._ready(false); this.callBase() }, endUpdate: function() { this.callBase(); if (this._initialized) { this._ready(true) } }, _ready: function(value) { if (0 === arguments.length) { return this._isReady } this._isReady = value }, setAria: function() { var setAttribute = function(option) { var attrName = "role" === option.name || "id" === option.name ? option.name : "aria-" + option.name, attrValue = option.value; if (null === attrValue || void 0 === attrValue) { attrValue = void 0 } else { attrValue = attrValue.toString() } domUtils.toggleAttr(option.target, attrName, attrValue) }; if (!typeUtils.isPlainObject(arguments[0])) { setAttribute({ name: arguments[0], value: arguments[1], target: arguments[2] || this._getAriaTarget() }) } else { var $target = arguments[1] || this._getAriaTarget(); $.each(arguments[0], function(key, value) { setAttribute({ name: key, value: value, target: $target }) }) } }, isReady: function() { return this._ready() }, repaint: function() { this._refresh() }, focus: function() { this._focusTarget().focus() }, registerKeyHandler: function(key, handler) { var currentKeys = this._supportedKeys(), addingKeys = {}; addingKeys[key] = handler; this._supportedKeys = function() { return extend(currentKeys, addingKeys) } } }); module.exports = Widget }, /*!*****************************************!*\ !*** ./js/ui/widget/jquery.template.js ***! \*****************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), errors = __webpack_require__( /*! ../../core/errors */ 7), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), TemplateBase = __webpack_require__( /*! ./ui.template_base */ 97), domUtils = __webpack_require__( /*! ../../core/utils/dom */ 56); var templateEngines = {}; var registerTemplateEngine = function(name, templateEngine) { templateEngines[name] = templateEngine }; var outerHtml = function(element) { element = $(element); var templateTag = element.length && element[0].nodeName.toLowerCase(); if ("script" === templateTag) { return element.html() } else { element = $("<div>").append(element); return element.html() } }; registerTemplateEngine("default", { compile: function(element) { return domUtils.normalizeTemplateElement(element) }, render: function(template) { return template.clone() } }); registerTemplateEngine("jquery-tmpl", { compile: function(element) { return outerHtml(element) }, render: function(template, data) { return $.tmpl(template, data) } }); registerTemplateEngine("jsrender", { compile: function(element) { return $.templates(outerHtml(element)) }, render: function(template, data) { return template.render(data) } }); registerTemplateEngine("mustache", { compile: function(element) { return outerHtml(element) }, render: function(template, data) { return Mustache.render(template, data) } }); registerTemplateEngine("hogan", { compile: function(element) { return Hogan.compile(outerHtml(element)) }, render: function(template, data) { return template.render(data) } }); registerTemplateEngine("underscore", { compile: function(element) { return _.template(outerHtml(element)) }, render: function(template, data) { return template(data) } }); registerTemplateEngine("handlebars", { compile: function(element) { return Handlebars.compile(outerHtml(element)) }, render: function(template, data) { return template(data) } }); registerTemplateEngine("doT", { compile: function(element) { return doT.template(outerHtml(element)) }, render: function(template, data) { return template(data) } }); var currentTemplateEngine; var setTemplateEngine = function(templateEngine) { if (commonUtils.isString(templateEngine)) { currentTemplateEngine = templateEngines[templateEngine]; if (!currentTemplateEngine) { throw errors.Error("E0020", templateEngine) } } else { currentTemplateEngine = templateEngine } }; setTemplateEngine("default"); var Template = TemplateBase.inherit({ ctor: function(element) { this._element = element; this._compiledTemplate = currentTemplateEngine.compile(element) }, _renderCore: function(options) { return $("<div>").append(currentTemplateEngine.render(this._compiledTemplate, options.model)).contents() }, source: function() { return $(this._element).clone() } }); module.exports = Template; module.exports.setTemplateEngine = setTemplateEngine }, /*!******************************************!*\ !*** ./js/ui/widget/ui.template_base.js ***! \******************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), triggerShownEvent = __webpack_require__( /*! ../../core/utils/dom */ 56).triggerShownEvent, Class = __webpack_require__( /*! ../../core/class */ 25), abstract = Class.abstract; var renderedCallbacks = $.Callbacks(); var TemplateBase = Class.inherit({ render: function(options) { options = options || {}; var $result = this._renderCore(options); this._ensureResultInContainer($result, options.container); renderedCallbacks.fire($result, options.container); return $result }, _ensureResultInContainer: function($result, $container) { if (!$container) { return } var resultInContainer = $.contains($container.get(0), $result.get(0)); $container.append($result); if (resultInContainer) { return } var resultInBody = $.contains(document.body, $container.get(0)); if (!resultInBody) { return } triggerShownEvent($result) }, _renderCore: abstract }); module.exports = TemplateBase; module.exports.renderedCallbacks = renderedCallbacks }, /*!*******************************************!*\ !*** ./js/ui/widget/function_template.js ***! \*******************************************/ function(module, exports, __webpack_require__) { var TemplateBase = __webpack_require__( /*! ./ui.template_base */ 97), domUtils = __webpack_require__( /*! ../../core/utils/dom */ 56); var FunctionTemplate = TemplateBase.inherit({ ctor: function(render) { this._render = render }, _renderCore: function(options) { return domUtils.normalizeTemplateElement(this._render(options)) } }); module.exports = FunctionTemplate }, /*!****************************************!*\ !*** ./js/ui/widget/empty_template.js ***! \****************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), TemplateBase = __webpack_require__( /*! ./ui.template_base */ 97); var EmptyTemplate = TemplateBase.inherit({ _renderCore: function() { return $() } }); module.exports = EmptyTemplate }, /*!************************************************!*\ !*** ./js/ui/widget/child_default_template.js ***! \************************************************/ function(module, exports, __webpack_require__) { var TemplateBase = __webpack_require__( /*! ./ui.template_base */ 97); module.exports = TemplateBase.inherit({ ctor: function(name) { this.name = name } }) }, /*!***********************************************!*\ !*** ./js/ui/widget/ui.keyboard_processor.js ***! \***********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, eventUtils = __webpack_require__( /*! ../../events/utils */ 71); var KeyboardProcessor = Class.inherit({ _keydown: eventUtils.addNamespace("keydown", "KeyboardProcessor"), codes: { 8: "backspace", 9: "tab", 13: "enter", 27: "escape", 33: "pageUp", 34: "pageDown", 35: "end", 36: "home", 37: "leftArrow", 38: "upArrow", 39: "rightArrow", 40: "downArrow", 46: "del", 32: "space", 70: "F", 65: "A", 106: "asterisk", 109: "minus" }, ctor: function(options) { var _this = this; options = options || {}; if (options.element) { this._element = $(options.element) } if (options.focusTarget) { this._focusTarget = options.focusTarget } this._handler = options.handler; this._context = options.context; this._childProcessors = []; if (this._element) { this._processFunction = function(e) { _this.process(e) }; this._element.on(this._keydown, this._processFunction) } }, dispose: function() { if (this._element) { this._element.off(this._keydown, this._processFunction) } this._element = void 0; this._handler = void 0; this._context = void 0; this._childProcessors = void 0 }, clearChildren: function() { this._childProcessors = [] }, push: function(child) { if (!this._childProcessors) { this.clearChildren() } this._childProcessors.push(child); return child }, attachChildProcessor: function() { var childProcessor = new KeyboardProcessor; this._childProcessors.push(childProcessor); return childProcessor }, reinitialize: function(childHandler, childContext) { this._context = childContext; this._handler = childHandler; return this }, process: function(e) { if (this._focusTarget && this._focusTarget !== e.target && inArray(e.target, this._focusTarget) < 0) { return false } var args = { key: this.codes[e.which] || e.which, ctrl: e.ctrlKey, shift: e.shiftKey, alt: e.altKey, originalEvent: e }; var handlerResult = this._handler && this._handler.call(this._context, args); if (handlerResult && this._childProcessors) { $.each(this._childProcessors, function(index, childProcessor) { childProcessor.process(e) }) } } }); module.exports = KeyboardProcessor }, /*!******************************************!*\ !*** ./js/ui/widget/jquery.selectors.js ***! \******************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9); var focusable = function(element, tabIndex) { if (!visible(element)) { return false } var nodeName = element.nodeName.toLowerCase(), isTabIndexNotNaN = !isNaN(tabIndex), isDisabled = element.disabled, isDefaultFocus = /^(input|select|textarea|button|object|iframe)$/.test(nodeName), isHyperlink = "a" === nodeName, isFocusable = true; if (isDefaultFocus) { isFocusable = !isDisabled } else { if (isHyperlink) { isFocusable = element.href || isTabIndexNotNaN } else { isFocusable = isTabIndexNotNaN } } return isFocusable }; var visible = function(element) { var $element = $(element); return $element.is(":visible") && "hidden" !== $element.css("visibility") && "hidden" !== $element.parents().css("visibility") }; module.exports = { focusable: function(index, element) { return focusable(element, $(element).attr("tabindex")) }, tabbable: function(index, element) { var tabIndex = $(element).attr("tabindex"); return (isNaN(tabIndex) || tabIndex >= 0) && focusable(element, tabIndex) } } }, /*!****************************!*\ !*** ./js/events/hover.js ***! \****************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), Class = __webpack_require__( /*! ../core/class */ 25), devices = __webpack_require__( /*! ../core/devices */ 53), registerEvent = __webpack_require__( /*! ./core/event_registrator */ 73), eventUtils = __webpack_require__( /*! ./utils */ 71), pointerEvents = __webpack_require__( /*! ./pointer */ 76); var HOVERSTART_NAMESPACE = "dxHoverStart", HOVERSTART = "dxhoverstart", POINTERENTER_NAMESPACED_EVENT_NAME = eventUtils.addNamespace(pointerEvents.enter, HOVERSTART_NAMESPACE), HOVEREND_NAMESPACE = "dxHoverEnd", HOVEREND = "dxhoverend", POINTERLEAVE_NAMESPACED_EVENT_NAME = eventUtils.addNamespace(pointerEvents.leave, HOVEREND_NAMESPACE); var Hover = Class.inherit({ noBubble: true, ctor: function() { this._handlerArrayKeyPath = this._eventNamespace + "_HandlerStore" }, setup: function(element) { $.data(element, this._handlerArrayKeyPath, {}) }, add: function(element, handleObj) { var that = this, $element = $(element), handler = function(e) { that._handler(e) }; $element.on(this._originalEventName, handleObj.selector, handler); $.data(element, this._handlerArrayKeyPath)[handleObj.guid] = handler }, _handler: function(e) { if (eventUtils.isTouchEvent(e) || devices.isSimulator()) { return } eventUtils.fireEvent({ type: this._eventName, originalEvent: e, delegateTarget: e.delegateTarget }) }, remove: function(element, handleObj) { var handler = $.data(element, this._handlerArrayKeyPath)[handleObj.guid]; $(element).off(this._originalEventName, handleObj.selector, handler) }, teardown: function(element) { $.removeData(element, this._handlerArrayKeyPath) } }); var HoverStart = Hover.inherit({ ctor: function() { this._eventNamespace = HOVERSTART_NAMESPACE; this._eventName = HOVERSTART; this._originalEventName = POINTERENTER_NAMESPACED_EVENT_NAME; this.callBase() }, _handler: function(e) { var pointers = e.pointers || []; if (!pointers.length) { this.callBase(e) } } }); var HoverEnd = Hover.inherit({ ctor: function() { this._eventNamespace = HOVEREND_NAMESPACE; this._eventName = HOVEREND; this._originalEventName = POINTERLEAVE_NAMESPACED_EVENT_NAME; this.callBase() } }); registerEvent(HOVERSTART, new HoverStart); registerEvent(HOVEREND, new HoverEnd); exports.start = HOVERSTART; exports.end = HOVEREND }, /*!********************************************!*\ !*** ./js/events/core/emitter.feedback.js ***! \********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), devices = __webpack_require__( /*! ../../core/devices */ 53), eventUtils = __webpack_require__( /*! ../utils */ 71), pointerEvents = __webpack_require__( /*! ../pointer */ 76), Emitter = __webpack_require__( /*! ./emitter */ 83), registerEmitter = __webpack_require__( /*! ./emitter_registrator */ 84); var ACTIVE_EVENT_NAME = "dxactive", INACTIVE_EVENT_NAME = "dxinactive", ACTIVE_TIMEOUT = 30, INACTIVE_TIMEOUT = 400; var FeedbackEvent = Class.inherit({ ctor: function(timeout, fire) { this._timeout = timeout; this._fire = fire }, start: function() { var that = this; this._schedule(function() { that.force() }) }, _schedule: function(fn) { this.stop(); this._timer = window.setTimeout(fn, this._timeout) }, stop: function() { clearTimeout(this._timer) }, force: function() { if (this._fired) { return } this.stop(); this._fire(); this._fired = true }, fired: function() { return this._fired } }); var activeFeedback; var FeedbackEmitter = Emitter.inherit({ ctor: function() { this.callBase.apply(this, arguments); this._active = new FeedbackEvent(0, commonUtils.noop); this._inactive = new FeedbackEvent(0, commonUtils.noop) }, configure: function(data, eventName) { switch (eventName) { case ACTIVE_EVENT_NAME: data.activeTimeout = data.timeout; break; case INACTIVE_EVENT_NAME: data.inactiveTimeout = data.timeout } this.callBase(data) }, start: function(e) { if (activeFeedback) { var activeChildExists = $.contains(this.getElement().get(0), activeFeedback.getElement().get(0)); var childJustActivated = !activeFeedback._active.fired(); if (activeChildExists && childJustActivated) { this._cancel(); return } activeFeedback._inactive.force() } activeFeedback = this; this._initEvents(e); this._active.start() }, _initEvents: function(e) { var that = this, eventTarget = this._getEmitterTarget(e), mouseEvent = eventUtils.isMouseEvent(e), isSimulator = devices.isSimulator(), deferFeedback = isSimulator || !mouseEvent, activeTimeout = commonUtils.ensureDefined(this.activeTimeout, ACTIVE_TIMEOUT), inactiveTimeout = commonUtils.ensureDefined(this.inactiveTimeout, INACTIVE_TIMEOUT); this._active = new FeedbackEvent(deferFeedback ? activeTimeout : 0, function() { that._fireEvent(ACTIVE_EVENT_NAME, e, { target: eventTarget }) }); this._inactive = new FeedbackEvent(deferFeedback ? inactiveTimeout : 0, function() { that._fireEvent(INACTIVE_EVENT_NAME, e, { target: eventTarget }); activeFeedback = null }) }, cancel: function(e) { this.end(e) }, end: function(e) { var skipTimers = e.type !== pointerEvents.up; if (skipTimers) { this._active.stop() } else { this._active.force() } this._inactive.start(); if (skipTimers) { this._inactive.force() } }, dispose: function() { this._active.stop(); this._inactive.stop(); this.callBase() }, lockInactive: function() { this._active.force(); this._inactive.stop(); activeFeedback = null; this._cancel(); return this._inactive.force.bind(this._inactive) } }); FeedbackEmitter.lock = function(deferred) { var lockInactive = activeFeedback ? activeFeedback.lockInactive() : commonUtils.noop; deferred.done(lockInactive) }; registerEmitter({ emitter: FeedbackEmitter, events: [ACTIVE_EVENT_NAME, INACTIVE_EVENT_NAME] }); exports.lock = FeedbackEmitter.lock; exports.active = ACTIVE_EVENT_NAME; exports.inactive = INACTIVE_EVENT_NAME }, /*!*********************************************!*\ !*** ./js/integration/knockout/template.js ***! \*********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), ko = __webpack_require__( /*! knockout */ 93), TemplateBase = __webpack_require__( /*! ../../ui/widget/ui.template_base */ 97), domUtils = __webpack_require__( /*! ../../core/utils/dom */ 56); var KoTemplate = TemplateBase.inherit({ ctor: function(element) { this._element = element; this._template = $("<div>").append(domUtils.normalizeTemplateElement(element)); this._registerKoTemplate() }, _registerKoTemplate: function() { var template = this._template.get(0); new ko.templateSources.anonymousTemplate(template).nodes(template) }, _prepareDataForContainer: function(data, container) { var containerElement, containerContext, result = data; if (container.length) { containerElement = container.get(0); data = void 0 !== data ? data : ko.dataFor(containerElement) || {}; containerContext = ko.contextFor(containerElement); if (containerContext) { result = data === containerContext.$data ? containerContext : containerContext.createChildContext(data) } else { result = data } } return result }, _renderCore: function(options) { var model = options.model; if (options.container) { model = this._prepareDataForContainer(model, options.container) } var $placeholder = $("<div>").appendTo(options.container); var $result; ko.renderTemplate(this._template.get(0), model, { afterRender: function(nodes) { $result = $(nodes) } }, $placeholder.get(0), "replaceNode"); return $result }, source: function() { return $(this._element).clone() }, dispose: function() { this._template.remove() } }); module.exports = KoTemplate }, /*!********************************!*\ !*** ./js/ui/editor/editor.js ***! \********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), getDefaultAlignment = __webpack_require__( /*! ../../core/utils/position */ 107).getDefaultAlignment, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, Widget = __webpack_require__( /*! ../widget/ui.widget */ 95), ValidationMixin = __webpack_require__( /*! ../validation/validation_mixin */ 108), Overlay = __webpack_require__( /*! ../overlay */ 109); var READONLY_STATE_CLASS = "dx-state-readonly", INVALID_CLASS = "dx-invalid", INVALID_MESSAGE = "dx-invalid-message", INVALID_MESSAGE_AUTO = "dx-invalid-message-auto", INVALID_MESSAGE_ALWAYS = "dx-invalid-message-always", VALIDATION_TARGET = "dx-validation-target", VALIDATION_MESSAGE_MIN_WIDTH = 100; var Editor = Widget.inherit({ _init: function() { this.callBase(); this.validationRequest = $.Callbacks(); var $element = this.element(); if ($element) { $.data($element[0], VALIDATION_TARGET, this) } }, _getDefaultOptions: function() { return extend(this.callBase(), { value: null, name: "", onValueChanged: null, readOnly: false, isValid: true, validationError: null, validationMessageMode: "auto", validationBoundary: void 0, validationMessageOffset: { h: 0, v: 0 } }) }, _attachKeyboardEvents: function() { if (this.option("readOnly")) { return } this.callBase(); this._attachChildKeyboardEvents() }, _attachChildKeyboardEvents: commonUtils.noop, _setOptionsByReference: function() { this.callBase(); extend(this._optionsByReference, { validationError: true }) }, _createValueChangeAction: function() { this._valueChangeAction = this._createActionByOption("onValueChanged", { excludeValidators: ["disabled", "readOnly"] }) }, _suppressValueChangeAction: function() { this._valueChangeActionSuppressed = true }, _resumeValueChangeAction: function() { this._valueChangeActionSuppressed = false }, _render: function() { this.callBase(); this._renderValidationState(); this._toggleReadOnlyState(); this._setSubmitElementName(this.option("name")) }, _raiseValueChangeAction: function(value, previousValue) { if (!this._valueChangeAction) { this._createValueChangeAction() } this._valueChangeAction(this._valueChangeArgs(value, previousValue)) }, _valueChangeArgs: function(value, previousValue) { return { value: value, previousValue: previousValue, jQueryEvent: this._valueChangeEventInstance } }, _saveValueChangeEvent: function(e) { this._valueChangeEventInstance = e }, _renderValidationState: function() { var isValid = this.option("isValid"), validationError = this.option("validationError"), validationMessageMode = this.option("validationMessageMode"), $element = this.element(); $element.toggleClass(INVALID_CLASS, !isValid); this.setAria("invalid", !isValid || void 0); if (this._$validationMessage) { this._$validationMessage.remove(); this._$validationMessage = null } if (!isValid && validationError && validationError.message) { this._$validationMessage = $("<div/>", { "class": INVALID_MESSAGE }).html(validationError.message).appendTo($element); this._validationMessage = this._createComponent(this._$validationMessage, Overlay, { integrationOptions: {}, templatesRenderAsynchronously: false, target: this._getValidationMessageTarget(), shading: false, width: "auto", height: "auto", container: $element, position: this._getValidationMessagePosition("below"), closeOnOutsideClick: false, closeOnTargetScroll: false, animation: null, visible: true, propagateOutsideClick: true, _checkParentVisibility: false }); this._$validationMessage.toggleClass(INVALID_MESSAGE_AUTO, "auto" === validationMessageMode).toggleClass(INVALID_MESSAGE_ALWAYS, "always" === validationMessageMode); this._setValidationMessageMaxWidth() } }, _setValidationMessageMaxWidth: function() { if (!this._validationMessage) { return } if (0 === this._getValidationMessageTarget().outerWidth()) { this._validationMessage.option("maxWidth", "100%"); return } var validationMessageMaxWidth = Math.max(VALIDATION_MESSAGE_MIN_WIDTH, this._getValidationMessageTarget().outerWidth()); this._validationMessage.option("maxWidth", validationMessageMaxWidth) }, _getValidationMessageTarget: function() { return this.element() }, _getValidationMessagePosition: function(positionRequest) { var rtlEnabled = this.option("rtlEnabled"), messagePositionSide = getDefaultAlignment(rtlEnabled), messageOriginalOffset = this.option("validationMessageOffset"), messageOffset = { h: messageOriginalOffset.h, v: messageOriginalOffset.v }, verticalPositions = "below" === positionRequest ? [" top", " bottom"] : [" bottom", " top"]; if (rtlEnabled) { messageOffset.h = -messageOffset.h } if ("below" !== positionRequest) { messageOffset.v = -messageOffset.v } return { offset: messageOffset, boundary: this.option("validationBoundary"), my: messagePositionSide + verticalPositions[0], at: messagePositionSide + verticalPositions[1], collision: "none flip" } }, _toggleReadOnlyState: function() { this.element().toggleClass(READONLY_STATE_CLASS, !!this.option("readOnly")); this.setAria("readonly", this.option("readOnly") || void 0) }, _dispose: function() { var element = this.element()[0]; $.data(element, VALIDATION_TARGET, null); this.callBase() }, _setSubmitElementName: function(name) { var $submitElement = this._getSubmitElement(); if (!$submitElement) { return } if (name.length > 0) { $submitElement.attr("name", name) } else { $submitElement.removeAttr("name") } }, _getSubmitElement: function() { return null }, _optionChanged: function(args) { switch (args.name) { case "onValueChanged": this._createValueChangeAction(); break; case "isValid": case "validationError": case "validationBoundary": case "validationMessageMode": this._renderValidationState(); break; case "readOnly": this._toggleReadOnlyState(); this._refreshFocusState(); break; case "value": if (!this._valueChangeActionSuppressed) { this._raiseValueChangeAction(args.value, args.previousValue); this._saveValueChangeEvent(void 0) } if (args.value != args.previousValue) { this.validationRequest.fire({ value: args.value, editor: this }) } break; case "width": this.callBase(args); this._setValidationMessageMaxWidth(); break; case "name": this._setSubmitElementName(args.value); break; default: this.callBase(args) } }, reset: function() { this.option("value", null) } }).include(ValidationMixin); module.exports = Editor }, /*!***********************************!*\ !*** ./js/core/utils/position.js ***! \***********************************/ function(module, exports, __webpack_require__) { var config = __webpack_require__( /*! ../config */ 15); var getDefaultAlignment = function(isRtlEnabled) { var rtlEnabled = isRtlEnabled || config().rtlEnabled; return rtlEnabled ? "right" : "left" }; exports.getDefaultAlignment = getDefaultAlignment }, /*!**********************************************!*\ !*** ./js/ui/validation/validation_mixin.js ***! \**********************************************/ function(module, exports) { var ValidationMixin = { _findGroup: function() { var $dxGroup, group = this.option("validationGroup"); if (!group) { $dxGroup = this.element().parents(".dx-validationgroup").first(); if ($dxGroup.length) { group = $dxGroup.dxValidationGroup("instance") } else { group = this._modelByElement(this.element()) } } return group } }; module.exports = ValidationMixin }, /*!**************************!*\ !*** ./js/ui/overlay.js ***! \**************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), fx = __webpack_require__( /*! ../animation/fx */ 68), translator = __webpack_require__( /*! ../animation/translator */ 69), compareVersions = __webpack_require__( /*! ../core/utils/version */ 17).compare, viewPortUtils = __webpack_require__( /*! ../core/utils/view_port */ 55), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../core/utils/array */ 26).inArray, viewPortChanged = viewPortUtils.changeCallback, hideTopOverlayCallback = __webpack_require__( /*! ../mobile/hide_top_overlay */ 65).hideCallback, positionUtils = __webpack_require__( /*! ../animation/position */ 70), fitIntoRange = __webpack_require__( /*! ../core/utils/math */ 87).fitIntoRange, domUtils = __webpack_require__( /*! ../core/utils/dom */ 56), commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), typeUtils = __webpack_require__( /*! ../core/utils/type */ 12), devices = __webpack_require__( /*! ../core/devices */ 53), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), Widget = __webpack_require__( /*! ./widget/ui.widget */ 95), KeyboardProcessor = __webpack_require__( /*! ./widget/ui.keyboard_processor */ 101), selectors = __webpack_require__( /*! ./widget/jquery.selectors */ 102), dragEvents = __webpack_require__( /*! ../events/drag */ 110), eventUtils = __webpack_require__( /*! ../events/utils */ 71), pointerEvents = __webpack_require__( /*! ../events/pointer */ 76), Resizable = __webpack_require__( /*! ./resizable */ 111), EmptyTemplate = __webpack_require__( /*! ./widget/empty_template */ 99); var OVERLAY_CLASS = "dx-overlay", OVERLAY_WRAPPER_CLASS = "dx-overlay-wrapper", OVERLAY_CONTENT_CLASS = "dx-overlay-content", OVERLAY_SHADER_CLASS = "dx-overlay-shader", OVERLAY_MODAL_CLASS = "dx-overlay-modal", INVISIBLE_STATE_CLASS = "dx-state-invisible", ANONYMOUS_TEMPLATE_NAME = "content", RTL_DIRECTION_CLASS = "dx-rtl", ACTIONS = ["onShowing", "onShown", "onHiding", "onHidden", "onPositioning", "onPositioned", "onResizeStart", "onResize", "onResizeEnd"], FIRST_Z_INDEX = 1500, OVERLAY_STACK = [], DISABLED_STATE_CLASS = "dx-state-disabled", TAB_KEY = 9; var realDevice = devices.real(), realVersion = realDevice.version, iOS = "ios" === realDevice.platform, iOS7_0andBelow = iOS && compareVersions(realVersion, [7, 1]) < 0, android4_0nativeBrowser = "android" === realDevice.platform && 0 === compareVersions(realVersion, [4, 0], 2) && navigator.userAgent.indexOf("Chrome") === -1; var forceRepaint = function($element) { if (iOS7_0andBelow) { $element.width() } if (android4_0nativeBrowser) { var $parents = $element.parents(), inScrollView = $parents.is(".dx-scrollable-native"); if (!inScrollView) { $parents.css("backface-visibility", "hidden"); $parents.css("backface-visibility"); $parents.css("backface-visibility", "visible") } } }; var getElement = function(value) { return value && $(value instanceof $.Event ? value.target : value) }; $(document).on(pointerEvents.down, function(e) { for (var i = OVERLAY_STACK.length - 1; i >= 0; i--) { if (!OVERLAY_STACK[i]._proxiedDocumentDownHandler(e)) { return } } }); var Overlay = Widget.inherit({ _supportedKeys: function() { var offsetSize = 5, move = function(top, left, e) { if (!this.option("dragEnabled")) { return } e.preventDefault(); e.stopPropagation(); var allowedOffsets = this._allowedOffsets(); var offset = { top: fitIntoRange(top, -allowedOffsets.top, allowedOffsets.bottom), left: fitIntoRange(left, -allowedOffsets.left, allowedOffsets.right) }; this._changePosition(offset) }; return extend(this.callBase(), { escape: function() { this.hide() }, upArrow: move.bind(this, -offsetSize, 0), downArrow: move.bind(this, offsetSize, 0), leftArrow: move.bind(this, 0, -offsetSize), rightArrow: move.bind(this, 0, offsetSize) }) }, _getDefaultOptions: function() { return extend(this.callBase(), { activeStateEnabled: false, visible: false, deferRendering: true, shading: true, shadingColor: "", position: { my: "center", at: "center" }, width: function() { return .8 * $(window).width() }, minWidth: null, maxWidth: null, height: function() { return .8 * $(window).height() }, minHeight: null, maxHeight: null, animation: { show: { type: "pop", duration: 300, from: { scale: .55 } }, hide: { type: "pop", duration: 300, to: { opacity: 0, scale: .55 }, from: { opacity: 1, scale: 1 } } }, closeOnOutsideClick: false, closeOnBackButton: true, onShowing: null, onShown: null, onHiding: null, onHidden: null, contentTemplate: "content", dragEnabled: false, resizeEnabled: false, onResizeStart: null, onResize: null, onResizeEnd: null, onContentReady: null, target: void 0, container: void 0, hideTopOverlayHandler: void 0, closeOnTargetScroll: false, onPositioned: null, boundaryOffset: { h: 0, v: 0 }, propagateOutsideClick: false, _checkParentVisibility: true }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function() { var realDevice = devices.real(), realPlatform = realDevice.platform, realVersion = realDevice.version; return "android" === realPlatform && compareVersions(realVersion, [4, 2]) < 0 }, options: { animation: { show: { type: "fade", duration: 400 }, hide: { type: "fade", duration: 400, to: { opacity: 0 }, from: { opacity: 1 } } } } }]) }, _setOptionsByReference: function() { this.callBase(); extend(this._optionsByReference, { animation: true }) }, _getAnonymousTemplateName: function() { return ANONYMOUS_TEMPLATE_NAME }, _wrapper: function() { return this._$wrapper }, _container: function() { return this._$content }, _eventBindingTarget: function() { return this._$content }, _init: function() { this.callBase(); this._initActions(); this._initCloseOnOutsideClickHandler(); this._initTabTerminatorHandler(); this._$wrapper = $("<div>").addClass(OVERLAY_WRAPPER_CLASS); this._$content = $("<div>").addClass(OVERLAY_CONTENT_CLASS); var $element = this.element(); this._$wrapper.addClass($element.attr("class")); $element.addClass(OVERLAY_CLASS); this._$wrapper.attr("data-bind", "dxControlsDescendantBindings: true"); this._$wrapper.on("MSPointerDown", commonUtils.noop); this._$wrapper.on("focusin", function(e) { e.stopPropagation() }); this._toggleViewPortSubscription(true) }, _initOptions: function(options) { this._initTarget(options.target); this._initContainer(options.container); this._initHideTopOverlayHandler(options.hideTopOverlayHandler); this.callBase(options) }, _initTarget: function(target) { if (!commonUtils.isDefined(target)) { return } var options = this.option(); $.each(["position.of", "animation.show.from.position.of", "animation.show.to.position.of", "animation.hide.from.position.of", "animation.hide.to.position.of"], function(_, path) { var pathParts = path.split("."); var option = options; while (option) { if (1 === pathParts.length) { if (typeUtils.isPlainObject(option)) { option[pathParts.shift()] = target } break } else { option = option[pathParts.shift()] } } }) }, _initContainer: function(container) { container = void 0 === container ? viewPortUtils.value() : container; var $element = this.element(), $container = $element.closest(container); if (!$container.length) { $container = $(container).first() } this._$container = $container.length ? $container : $element.parent() }, _initHideTopOverlayHandler: function(handler) { this._hideTopOverlayHandler = void 0 !== handler ? handler : this._defaultHideTopOverlayHandler.bind(this) }, _defaultHideTopOverlayHandler: function() { this.hide() }, _initActions: function() { this._actions = {}; $.each(ACTIONS, function(_, action) { this._actions[action] = this._createActionByOption(action, { excludeValidators: ["disabled", "readOnly"] }) || commonUtils.noop }.bind(this)) }, _initCloseOnOutsideClickHandler: function() { var that = this; this._proxiedDocumentDownHandler = function() { return that._documentDownHandler.apply(that, arguments) } }, _documentDownHandler: function(e) { if (this._showAnimationProcessing) { this._stopAnimation() } var closeOnOutsideClick = this.option("closeOnOutsideClick"); if (commonUtils.isFunction(closeOnOutsideClick)) { closeOnOutsideClick = closeOnOutsideClick(e) } if (closeOnOutsideClick) { var $container = this._$content, outsideClick = !$container.is(e.target) && !$.contains($container.get(0), e.target) && $(e.target).closest(document).length; if (outsideClick) { if (this.option("shading")) { e.preventDefault() } this.hide() } } return this.option("propagateOutsideClick") }, _initTemplates: function() { this.callBase(); this._defaultTemplates.content = new EmptyTemplate(this) }, _isTopOverlay: function() { var overlayStack = this._overlayStack(); return overlayStack[overlayStack.length - 1] === this }, _overlayStack: function() { return OVERLAY_STACK }, _zIndexInitValue: function() { return FIRST_Z_INDEX }, _toggleViewPortSubscription: function(toggle) { viewPortChanged.remove(this._viewPortChangeHandle); if (toggle) { this._viewPortChangeHandle = this._viewPortChangeHandler.bind(this); viewPortChanged.add(this._viewPortChangeHandle) } }, _viewPortChangeHandler: function() { this._initContainer(this.option("container")); this._refresh() }, _renderVisibilityAnimate: function(visible) { this._stopAnimation(); return visible ? this._show() : this._hide() }, _normalizePosition: function() { this._position = this.option("position") }, _getAnimationConfig: function() { var animation = this.option("animation"); if (commonUtils.isFunction(animation)) { animation = animation.call(this) } return animation }, _show: function() { var that = this, deferred = $.Deferred(); this._parentHidden = this._isParentHidden(); deferred.done(function() { delete that._parentHidden }); if (this._parentHidden) { return deferred.resolve() } if (this._currentVisible) { return $.Deferred().resolve().promise() } this._currentVisible = true; this._normalizePosition(); var animation = that._getAnimationConfig() || {}, showAnimation = this._normalizeAnimation(animation.show, "to"), startShowAnimation = showAnimation && showAnimation.start || commonUtils.noop, completeShowAnimation = showAnimation && showAnimation.complete || commonUtils.noop; if (this._isHidingActionCanceled) { delete this._isHidingActionCanceled; deferred.resolve() } else { var show = function() { this._renderVisibility(true); this._animate(showAnimation, function() { if (that.option("focusStateEnabled")) { that._focusTarget().focus() } completeShowAnimation.apply(this, arguments); that._showAnimationProcessing = false; that._actions.onShown(); deferred.resolve() }, function() { startShowAnimation.apply(this, arguments); that._showAnimationProcessing = true }) }.bind(this); if (this.option("templatesRenderAsynchronously")) { this._asyncShowTimeout = setTimeout(show) } else { show() } } return deferred.promise() }, _normalizeAnimation: function(animation, prop) { if (animation) { animation = extend({ type: "slide" }, animation); if (animation[prop] && "object" === typeof animation[prop]) { extend(animation[prop], { position: this._position }) } } return animation }, _hide: function() { if (!this._currentVisible) { return $.Deferred().resolve().promise() } this._currentVisible = false; var that = this, deferred = $.Deferred(), animation = that._getAnimationConfig() || {}, hideAnimation = this._normalizeAnimation(animation.hide, "from"), startHideAnimation = hideAnimation && hideAnimation.start || commonUtils.noop, completeHideAnimation = hideAnimation && hideAnimation.complete || commonUtils.noop, hidingArgs = { cancel: false }; this._actions.onHiding(hidingArgs); if (hidingArgs.cancel) { this._isHidingActionCanceled = true; this.option("visible", true); deferred.resolve() } else { this._forceFocusLost(); this._toggleShading(false); this._toggleSubscriptions(false); this._animate(hideAnimation, function() { that._$content.css("pointer-events", ""); that._renderVisibility(false); completeHideAnimation.apply(this, arguments); that._actions.onHidden(); deferred.resolve() }, function() { that._$content.css("pointer-events", "none"); startHideAnimation.apply(this, arguments) }) } return deferred.promise() }, _forceFocusLost: function() { document.activeElement && this._$content.find(document.activeElement).length && document.activeElement.blur() }, _animate: function(animation, completeCallback, startCallback) { if (animation) { startCallback = startCallback || animation.start || commonUtils.noop; fx.animate(this._$content, extend({}, animation, { start: startCallback, complete: completeCallback })) } else { completeCallback() } }, _stopAnimation: function() { fx.stop(this._$content, true) }, _renderVisibility: function(visible) { if (visible && this._isParentHidden()) { return } this._currentVisible = visible; this._stopAnimation(); clearTimeout(this._asyncShowTimeout); if (!visible) { domUtils.triggerHidingEvent(this._$content) } this._toggleVisibility(visible); this._$content.toggleClass(INVISIBLE_STATE_CLASS, !visible); this._updateZIndexStackPosition(visible); if (visible) { this._renderContent(); this._actions.onShowing(); this._moveToContainer(); this._renderGeometry(); domUtils.triggerShownEvent(this._$content); domUtils.triggerResizeEvent(this._$content) } else { this._moveFromContainer() } this._toggleShading(visible); this._toggleSubscriptions(visible) }, _updateZIndexStackPosition: function(pushToStack) { var overlayStack = this._overlayStack(), index = inArray(this, overlayStack); if (pushToStack) { if (index === -1) { var length = overlayStack.length; this._zIndex = (length ? overlayStack[length - 1]._zIndex : this._zIndexInitValue()) + 1; overlayStack.push(this) } this._$wrapper.css("z-index", this._zIndex); this._$content.css("z-index", this._zIndex) } else { if (index !== -1) { overlayStack.splice(index, 1) } } }, _toggleShading: function(visible) { this._$wrapper.toggleClass(OVERLAY_MODAL_CLASS, this.option("shading") && !this.option("container")); this._$wrapper.toggleClass(OVERLAY_SHADER_CLASS, visible && this.option("shading")); this._$wrapper.css("background-color", this.option("shading") ? this.option("shadingColor") : ""); this._toggleTabTerminator(visible && this.option("shading")) }, _initTabTerminatorHandler: function() { var that = this; this._proxiedTabTerminatorHandler = function() { that._tabKeyHandler.apply(that, arguments) } }, _toggleTabTerminator: function(enabled) { var eventName = eventUtils.addNamespace("keydown", this.NAME); if (enabled) { $(document).on(eventName, this._proxiedTabTerminatorHandler) } else { $(document).off(eventName, this._proxiedTabTerminatorHandler) } }, _tabKeyHandler: function(e) { if (e.keyCode !== TAB_KEY || !this._isTopOverlay()) { return } var tabbableElements = this._$wrapper.find("*").filter(selectors.tabbable), $firstTabbable = tabbableElements.first(), $lastTabbable = tabbableElements.last(), isTabOnLast = !e.shiftKey && e.target === $lastTabbable.get(0), isShiftTabOnFirst = e.shiftKey && e.target === $firstTabbable.get(0), isEmptyTabList = 0 === tabbableElements.length, isOutsideTarget = inArray(e.target, tabbableElements) === -1; if (isTabOnLast || isShiftTabOnFirst || isEmptyTabList || isOutsideTarget) { e.preventDefault(); (e.shiftKey ? $lastTabbable : $firstTabbable).focusin().focus() } }, _toggleSubscriptions: function(enabled) { this._toggleHideTopOverlayCallback(enabled); this._toggleParentsScrollSubscription(enabled) }, _toggleHideTopOverlayCallback: function(subscribe) { if (!this._hideTopOverlayHandler) { return } if (subscribe && this.option("closeOnBackButton")) { hideTopOverlayCallback.add(this._hideTopOverlayHandler) } else { hideTopOverlayCallback.remove(this._hideTopOverlayHandler) } }, _toggleParentsScrollSubscription: function(subscribe) { if (!this._position) { return } var target = this._position.of || $(), closeOnScroll = this.option("closeOnTargetScroll"), $parents = getElement(target).parents(), scrollEvent = eventUtils.addNamespace("scroll", this.NAME); if ("generic" === devices.real().platform) { $parents = $parents.add(window) } this._proxiedTargetParentsScrollHandler = this._proxiedTargetParentsScrollHandler || function(e) { this._targetParentsScrollHandler(e) }.bind(this); $().add(this._$prevTargetParents).off(scrollEvent, this._proxiedTargetParentsScrollHandler); if (subscribe && closeOnScroll) { $parents.on(scrollEvent, this._proxiedTargetParentsScrollHandler); this._$prevTargetParents = $parents } }, _targetParentsScrollHandler: function(e) { var closeHandled = false, closeOnScroll = this.option("closeOnTargetScroll"); if (commonUtils.isFunction(closeOnScroll)) { closeHandled = closeOnScroll(e) } if (!closeHandled && !this._showAnimationProcessing) { this.hide() } }, _render: function() { this.callBase(); this._$content.appendTo(this.element()); this._renderVisibilityAnimate(this.option("visible")) }, _renderContent: function() { var shouldDeferRendering = !this._currentVisible && this.option("deferRendering"); var isParentHidden = this.option("visible") && this._isParentHidden(); if (isParentHidden) { this._isHidden = true; return } if (this._contentAlreadyRendered || shouldDeferRendering) { return } this._contentAlreadyRendered = true; this.callBase() }, _isParentHidden: function() { if (!this.option("_checkParentVisibility")) { return false } if (void 0 !== this._parentHidden) { return this._parentHidden } var $parent = this.element().parent(); if ($parent.is(":visible")) { return false } var isHidden = false; $parent.add($parent.parents()).each(function() { var $element = $(this); if ("none" === $element.css("display")) { isHidden = true; return false } }); return isHidden || !$.contains(document, $parent.get(0)) }, _renderContentImpl: function() { var $element = this.element(); this._$content.appendTo($element); var contentTemplate = this._getTemplate(this.option("contentTemplate")); contentTemplate && contentTemplate.render({ container: this.content(), noModel: true }); this._renderDrag(); this._renderResize(); this._renderScrollTerminator() }, _renderDrag: function() { var $dragTarget = this._getDragTarget(); if (!$dragTarget) { return } var startEventName = eventUtils.addNamespace(dragEvents.start, this.NAME), updateEventName = eventUtils.addNamespace(dragEvents.move, this.NAME); $dragTarget.off(startEventName).off(updateEventName); if (!this.option("dragEnabled")) { return } $dragTarget.on(startEventName, this._dragStartHandler.bind(this)).on(updateEventName, this._dragUpdateHandler.bind(this)) }, _renderResize: function() { this._resizable = this._createComponent(this._$content, Resizable, { handles: this.option("resizeEnabled") ? "all" : "none", onResizeEnd: this._resizeEndHandler.bind(this), onResize: this._actions.onResize.bind(this), onResizeStart: this._actions.onResizeStart.bind(this), minHeight: 100, minWidth: 100, area: this._getDragResizeContainer() }) }, _resizeEndHandler: function() { this._positionChangeHandled = true; var width = this._resizable.option("width"), height = this._resizable.option("height"); width && this.option("width", width); height && this.option("height", height); this._actions.onResizeEnd() }, _renderScrollTerminator: function() { var $scrollTerminator = this._wrapper(); var terminatorEventName = eventUtils.addNamespace(dragEvents.move, this.NAME); $scrollTerminator.off(terminatorEventName).on(terminatorEventName, { validate: function() { return true }, getDirection: function() { return "both" }, _toggleGestureCover: commonUtils.noop, _clearSelection: commonUtils.noop, isNative: true }, function(e) { var originalEvent = e.originalEvent.originalEvent; e._cancelPreventDefault = true; if (originalEvent && "mousemove" !== originalEvent.type) { e.preventDefault() } }) }, _getDragTarget: function() { return this.content() }, _dragStartHandler: function(e) { e.targetElements = []; this._prevOffset = { x: 0, y: 0 }; var allowedOffsets = this._allowedOffsets(); e.maxTopOffset = allowedOffsets.top; e.maxBottomOffset = allowedOffsets.bottom; e.maxLeftOffset = allowedOffsets.left; e.maxRightOffset = allowedOffsets.right }, _getDragResizeContainer: function() { var isContainerDefined = viewPortUtils.originalViewPort().get(0) || this.option("container"), $container = !isContainerDefined ? $(window) : this._$container; return $container }, _deltaSize: function() { var $content = this._$content, $container = this._getDragResizeContainer(); var contentWidth = $content.outerWidth(), contentHeight = $content.outerHeight(), containerWidth = $container.outerWidth(), containerHeight = $container.outerHeight(); return { width: containerWidth - contentWidth, height: containerHeight - contentHeight } }, _dragUpdateHandler: function(e) { var offset = e.offset, prevOffset = this._prevOffset, targetOffset = { top: offset.y - prevOffset.y, left: offset.x - prevOffset.x }; this._changePosition(targetOffset); this._prevOffset = offset }, _changePosition: function(offset) { var position = translator.locate(this._$content); translator.move(this._$content, { left: position.left + offset.left, top: position.top + offset.top }); this._positionChangeHandled = true }, _allowedOffsets: function() { var position = translator.locate(this._$content), deltaSize = this._deltaSize(), isAllowedDrag = deltaSize.height >= 0 && deltaSize.width >= 0, shaderOffset = this.option("shading") && !this.option("container") && !this._isWindow(this._getContainer()) ? translator.locate(this._$wrapper) : { top: 0, left: 0 }, boundaryOffset = this.option("boundaryOffset"); return { top: isAllowedDrag ? position.top + shaderOffset.top + boundaryOffset.v : 0, bottom: isAllowedDrag ? -position.top - shaderOffset.top + deltaSize.height - boundaryOffset.v : 0, left: isAllowedDrag ? position.left + shaderOffset.left + boundaryOffset.h : 0, right: isAllowedDrag ? -position.left - shaderOffset.left + deltaSize.width - boundaryOffset.h : 0 } }, _fireContentReadyAction: function() { if (this.option("visible")) { this._moveToContainer() } this.callBase.apply(this, arguments) }, _moveFromContainer: function() { this._$content.appendTo(this.element()); this._detachWrapperToContainer() }, _detachWrapperToContainer: function() { this._$wrapper.detach() }, _moveToContainer: function() { this._attachWrapperToContainer(); this._$content.appendTo(this._$wrapper) }, _attachWrapperToContainer: function() { var $element = this.element(); if (this._$container && this._$container[0] !== $element.parent()[0]) { this._$wrapper.appendTo(this._$container) } else { this._$wrapper.appendTo($element) } }, _renderGeometry: function() { if (this.option("visible")) { this._renderGeometryImpl() } }, _renderGeometryImpl: function() { this._stopAnimation(); this._normalizePosition(); this._renderShading(); this._renderDimensions(); var resultPosition = this._renderPosition(); this._actions.onPositioned({ position: resultPosition }) }, _renderShading: function() { var $wrapper = this._$wrapper, $container = this._getContainer(); $wrapper.css("position", this._isWindow($container) && !iOS ? "fixed" : "absolute"); this._renderShadingDimensions(); this._renderShadingPosition() }, _renderShadingPosition: function() { if (this.option("shading")) { var $container = this._getContainer(); positionUtils.setup(this._$wrapper, { my: "top left", at: "top left", of: $container }) } }, _renderShadingDimensions: function() { var wrapperWidth, wrapperHeight; if (this.option("shading")) { var $container = this._getContainer(); wrapperWidth = this._isWindow($container) ? "100%" : $container.outerWidth(), wrapperHeight = this._isWindow($container) ? "100%" : $container.outerHeight() } else { wrapperWidth = ""; wrapperHeight = "" } this._$wrapper.css({ width: wrapperWidth, height: wrapperHeight }) }, _isWindow: function($element) { return !!$element && commonUtils.isWindow($element.get(0)) }, _getContainer: function() { var position = this._position, container = this.option("container"), positionOf = position ? position.of || window : null; return getElement(container || positionOf) }, _renderDimensions: function() { this._$content.css({ minWidth: this.option("minWidth"), maxWidth: this.option("maxWidth"), minHeight: this.option("minHeight"), maxHeight: this.option("maxHeight") }); this._$content.outerWidth(this.option("width")).outerHeight(this.option("height")) }, _renderPosition: function() { if (this._positionChangeHandled) { var allowedOffsets = this._allowedOffsets(); this._changePosition({ top: fitIntoRange(0, -allowedOffsets.top, allowedOffsets.bottom), left: fitIntoRange(0, -allowedOffsets.left, allowedOffsets.right) }) } else { this._renderOverlayBoundaryOffset(); translator.resetPosition(this._$content); var resultPosition = positionUtils.setup(this._$content, this._position); forceRepaint(this._$content); this._actions.onPositioning(); return resultPosition } }, _renderOverlayBoundaryOffset: function() { var boundaryOffset = this.option("boundaryOffset"); this._$content.css("margin", boundaryOffset.v + "px " + boundaryOffset.h + "px") }, _focusTarget: function() { return this._$content }, _attachKeyboardEvents: function() { this._keyboardProcessor = new KeyboardProcessor({ element: this._$content, handler: this._keyboardHandler, context: this }) }, _keyboardHandler: function(options) { var e = options.originalEvent, $target = $(e.target); if ($target.is(this._$content)) { this.callBase.apply(this, arguments) } }, _isVisible: function() { return this.option("visible") }, _visibilityChanged: function(visible) { if (visible) { if (this.option("visible")) { this._renderVisibilityAnimate(visible) } } else { this._renderVisibilityAnimate(visible) } }, _dimensionChanged: function() { this._renderGeometry() }, _clean: function() { if (!this._contentAlreadyRendered) { this.content().empty() } this._renderVisibility(false); this._cleanFocusState() }, _dispose: function() { fx.stop(this._$content, false); clearTimeout(this._deferShowTimer); this._toggleViewPortSubscription(false); this._toggleSubscriptions(false); this._updateZIndexStackPosition(false); this._toggleTabTerminator(false); this._actions = null; this.callBase(); this._$wrapper.remove(); this._$content.remove() }, _toggleDisabledState: function(value) { this.callBase.apply(this, arguments); this._$content.toggleClass(DISABLED_STATE_CLASS, Boolean(value)) }, _toggleRTLDirection: function(rtl) { this._$content.toggleClass(RTL_DIRECTION_CLASS, rtl) }, _optionChanged: function(args) { var value = args.value; if (inArray(args.name, ACTIONS) > -1) { this._initActions(); return } switch (args.name) { case "dragEnabled": this._renderDrag(); this._renderGeometry(); break; case "resizeEnabled": this._renderResize(); this._renderGeometry(); break; case "shading": case "shadingColor": this._toggleShading(this.option("visible")); break; case "width": case "height": case "minWidth": case "maxWidth": case "minHeight": case "maxHeight": case "position": case "boundaryOffset": this._renderGeometry(); break; case "visible": this._renderVisibilityAnimate(value).done(function() { if (!this._animateDeferred) { return } this._animateDeferred.resolveWith(this) }.bind(this)); break; case "target": this._initTarget(value); this._invalidate(); break; case "container": this._initContainer(value); this._invalidate(); break; case "deferRendering": case "contentTemplate": this._contentAlreadyRendered = false; this._invalidate(); break; case "closeOnBackButton": this._toggleHideTopOverlayCallback(this.option("visible")); break; case "closeOnTargetScroll": this._toggleParentsScrollSubscription(this.option("visible")); break; case "closeOnOutsideClick": case "animation": case "propagateOutsideClick": break; default: this.callBase(args) } }, toggle: function(showing) { showing = void 0 === showing ? !this.option("visible") : showing; if (showing === this.option("visible")) { return $.Deferred().resolve().promise() } var animateDeferred = $.Deferred(); this._animateDeferred = animateDeferred; this.option("visible", showing); return animateDeferred.promise().done(function() { delete this._animateDeferred }.bind(this)) }, show: function() { return this.toggle(true) }, hide: function() { return this.toggle(false) }, content: function() { return this._$content }, repaint: function() { this._renderGeometry() } }); Overlay.baseZIndex = function(zIndex) { FIRST_Z_INDEX = zIndex }; registerComponent("dxOverlay", Overlay); module.exports = Overlay }, /*!***************************!*\ !*** ./js/events/drag.js ***! \***************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), wrapToArray = __webpack_require__( /*! ../core/utils/array */ 26).wrapToArray, inArray = __webpack_require__( /*! ../core/utils/array */ 26).inArray, registerEvent = __webpack_require__( /*! ./core/event_registrator */ 73), eventUtils = __webpack_require__( /*! ./utils */ 71), GestureEmitter = __webpack_require__( /*! ./gesture/emitter.gesture */ 86), registerEmitter = __webpack_require__( /*! ./core/emitter_registrator */ 84); var DRAG_START_EVENT = "dxdragstart", DRAG_EVENT = "dxdrag", DRAG_END_EVENT = "dxdragend", DRAG_ENTER_EVENT = "dxdragenter", DRAG_LEAVE_EVENT = "dxdragleave", DROP_EVENT = "dxdrop"; var knownDropTargets = [], knownDropTargetSelectors = [], knownDropTargetConfigs = []; var dropTargetRegistration = { setup: function(element, data) { var knownDropTarget = inArray(element, knownDropTargets) !== -1; if (!knownDropTarget) { knownDropTargets.push(element); knownDropTargetSelectors.push([]); knownDropTargetConfigs.push(data || {}) } }, add: function(element, handleObj) { var index = inArray(element, knownDropTargets); var selector = handleObj.selector; if (inArray(selector, knownDropTargetSelectors[index]) === -1) { knownDropTargetSelectors[index].push(selector) } }, teardown: function(element) { var elementEvents = $._data(element, "events"), handlersCount = 0; $.each([DRAG_ENTER_EVENT, DRAG_LEAVE_EVENT, DROP_EVENT], function(_, eventName) { var eventHandlers = elementEvents[eventName]; if (eventHandlers) { handlersCount += eventHandlers.length } }); if (!handlersCount) { var index = inArray(element, knownDropTargets); knownDropTargets.splice(index, 1); knownDropTargetSelectors.splice(index, 1); knownDropTargetConfigs.splice(index, 1) } } }; registerEvent(DRAG_ENTER_EVENT, dropTargetRegistration); registerEvent(DRAG_LEAVE_EVENT, dropTargetRegistration); registerEvent(DROP_EVENT, dropTargetRegistration); var getItemDelegatedTargets = function($element) { var dropTargetIndex = inArray($element.get(0), knownDropTargets), dropTargetSelectors = knownDropTargetSelectors[dropTargetIndex]; var $delegatedTargets = $element.find(dropTargetSelectors.join(", ")); if (inArray(void 0, dropTargetSelectors) !== -1) { $delegatedTargets = $delegatedTargets.add($element) } return $delegatedTargets }; var getItemConfig = function($element) { var dropTargetIndex = inArray($element.get(0), knownDropTargets); return knownDropTargetConfigs[dropTargetIndex] }; var getItemPosition = function(dropTargetConfig, $element) { if (dropTargetConfig.itemPositionFunc) { return dropTargetConfig.itemPositionFunc($element) } else { return $element.offset() } }; var getItemSize = function(dropTargetConfig, $element) { if (dropTargetConfig.itemSizeFunc) { return dropTargetConfig.itemSizeFunc($element) } return { width: $element.width(), height: $element.height() } }; var DragEmitter = GestureEmitter.inherit({ ctor: function(element) { this.callBase(element); this.direction = "both" }, _init: function(e) { this._initEvent = e }, _start: function(e) { e = this._fireEvent(DRAG_START_EVENT, this._initEvent); this._maxLeftOffset = e.maxLeftOffset; this._maxRightOffset = e.maxRightOffset; this._maxTopOffset = e.maxTopOffset; this._maxBottomOffset = e.maxBottomOffset; var dropTargets = wrapToArray(e.targetElements || (null === e.targetElements ? [] : knownDropTargets)); this._dropTargets = $.map(dropTargets, function(element) { return $(element).get(0) }) }, _move: function(e) { var eventData = eventUtils.eventData(e), dragOffset = this._calculateOffset(eventData); e = this._fireEvent(DRAG_EVENT, e, { offset: dragOffset }); this._processDropTargets(e); if (!e._cancelPreventDefault) { e.preventDefault() } }, _calculateOffset: function(eventData) { return { x: this._calculateXOffset(eventData), y: this._calculateYOffset(eventData) } }, _calculateXOffset: function(eventData) { if ("vertical" !== this.direction) { var offset = eventData.x - this._startEventData.x; return this._fitOffset(offset, this._maxLeftOffset, this._maxRightOffset) } return 0 }, _calculateYOffset: function(eventData) { if ("horizontal" !== this.direction) { var offset = eventData.y - this._startEventData.y; return this._fitOffset(offset, this._maxTopOffset, this._maxBottomOffset) } return 0 }, _fitOffset: function(offset, minOffset, maxOffset) { if (null != minOffset) { offset = Math.max(offset, -minOffset) } if (null != maxOffset) { offset = Math.min(offset, maxOffset) } return offset }, _processDropTargets: function(e) { var target = this._findDropTarget(e), sameTarget = target === this._currentDropTarget; if (!sameTarget) { this._fireDropTargetEvent(e, DRAG_LEAVE_EVENT); this._currentDropTarget = target; this._fireDropTargetEvent(e, DRAG_ENTER_EVENT) } }, _fireDropTargetEvent: function(event, eventName) { if (!this._currentDropTarget) { return } var eventData = { type: eventName, originalEvent: event, draggingElement: this._$element.get(0), target: this._currentDropTarget }; eventUtils.fireEvent(eventData) }, _findDropTarget: function(e) { var result, that = this; $.each(knownDropTargets, function(_, target) { if (!that._checkDropTargetActive(target)) { return } var $target = $(target); $.each(getItemDelegatedTargets($target), function(_, delegatedTarget) { var $delegatedTarget = $(delegatedTarget); if (that._checkDropTarget(getItemConfig($target), $delegatedTarget, e)) { result = delegatedTarget } }) }); return result }, _checkDropTargetActive: function(target) { var active = false; $.each(this._dropTargets, function(_, activeTarget) { active = active || activeTarget === target || $.contains(activeTarget, target); return !active }); return active }, _checkDropTarget: function(config, $target, e) { var isDraggingElement = $target.get(0) === this._$element.get(0); if (isDraggingElement) { return false } var targetPosition = getItemPosition(config, $target); if (e.pageX < targetPosition.left) { return false } if (e.pageY < targetPosition.top) { return false } var targetSize = getItemSize(config, $target); if (e.pageX > targetPosition.left + targetSize.width) { return false } if (e.pageY > targetPosition.top + targetSize.height) { return false } return $target }, _end: function(e) { var eventData = eventUtils.eventData(e); this._fireEvent(DRAG_END_EVENT, e, { offset: this._calculateOffset(eventData) }); this._fireDropTargetEvent(e, DROP_EVENT); delete this._currentDropTarget } }); registerEmitter({ emitter: DragEmitter, events: [DRAG_START_EVENT, DRAG_EVENT, DRAG_END_EVENT] }); exports.dropTargets = knownDropTargets; exports.move = DRAG_EVENT; exports.start = DRAG_START_EVENT; exports.end = DRAG_END_EVENT; exports.enter = DRAG_ENTER_EVENT; exports.leave = DRAG_LEAVE_EVENT; exports.drop = DROP_EVENT }, /*!****************************!*\ !*** ./js/ui/resizable.js ***! \****************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), stringUtils = __webpack_require__( /*! ../core/utils/string */ 18), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../core/utils/array */ 26).inArray, commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), typeUtils = __webpack_require__( /*! ../core/utils/type */ 12), translator = __webpack_require__( /*! ../animation/translator */ 69), fitIntoRange = __webpack_require__( /*! ../core/utils/math */ 87).fitIntoRange, DOMComponent = __webpack_require__( /*! ../core/dom_component */ 43), eventUtils = __webpack_require__( /*! ../events/utils */ 71), dragEvents = __webpack_require__( /*! ../events/drag */ 110), isPlainObject = typeUtils.isPlainObject, isFunction = commonUtils.isFunction; var RESIZABLE = "dxResizable", RESIZABLE_CLASS = "dx-resizable", RESIZABLE_RESIZING_CLASS = "dx-resizable-resizing", RESIZABLE_HANDLE_CLASS = "dx-resizable-handle", RESIZABLE_HANDLE_TOP_CLASS = "dx-resizable-handle-top", RESIZABLE_HANDLE_BOTTOM_CLASS = "dx-resizable-handle-bottom", RESIZABLE_HANDLE_LEFT_CLASS = "dx-resizable-handle-left", RESIZABLE_HANDLE_RIGHT_CLASS = "dx-resizable-handle-right", RESIZABLE_HANDLE_CORNER_CLASS = "dx-resizable-handle-corner", DRAGSTART_START_EVENT_NAME = eventUtils.addNamespace(dragEvents.start, RESIZABLE), DRAGSTART_EVENT_NAME = eventUtils.addNamespace(dragEvents.move, RESIZABLE), DRAGSTART_END_EVENT_NAME = eventUtils.addNamespace(dragEvents.end, RESIZABLE); var Resizable = DOMComponent.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { handles: "all", step: "1", stepPrecision: "simple", area: void 0, minWidth: 30, maxWidth: 1 / 0, minHeight: 30, maxHeight: 1 / 0, onResizeStart: null, onResize: null, onResizeEnd: null }) }, _init: function() { this.callBase(); this.element().addClass(RESIZABLE_CLASS) }, _render: function() { this.callBase(); this._renderActions(); this._renderHandles() }, _renderActions: function() { this._resizeStartAction = this._createActionByOption("onResizeStart"); this._resizeEndAction = this._createActionByOption("onResizeEnd"); this._resizeAction = this._createActionByOption("onResize") }, _renderHandles: function() { var handles = this.option("handles"); if ("none" === handles) { return } var directions = "all" === handles ? ["top", "bottom", "left", "right"] : handles.split(" "); $.each(directions, function(index, handleName) { this._renderHandle(handleName) }.bind(this)); inArray("bottom", directions) + 1 && inArray("right", directions) + 1 && this._renderHandle("corner-bottom-right"); inArray("bottom", directions) + 1 && inArray("left", directions) + 1 && this._renderHandle("corner-bottom-left"); inArray("top", directions) + 1 && inArray("right", directions) + 1 && this._renderHandle("corner-top-right"); inArray("top", directions) + 1 && inArray("left", directions) + 1 && this._renderHandle("corner-top-left") }, _renderHandle: function(handleName) { var $element = this.element(), $handle = $("<div>"); $handle.addClass(RESIZABLE_HANDLE_CLASS).addClass(RESIZABLE_HANDLE_CLASS + "-" + handleName).appendTo($element); this._attachEventHandlers($handle) }, _attachEventHandlers: function($handle) { if (this.option("disabled")) { return } var handlers = {}; handlers[DRAGSTART_START_EVENT_NAME] = this._dragStartHandler.bind(this); handlers[DRAGSTART_EVENT_NAME] = this._dragHandler.bind(this); handlers[DRAGSTART_END_EVENT_NAME] = this._dragEndHandler.bind(this); $handle.on(handlers, { direction: "both", immediate: true }) }, _dragStartHandler: function(e) { var $element = this.element(); if ($element.is(".dx-state-disabled, .dx-state-disabled *")) { e.cancel = true; return } this._toggleResizingClass(true); this._movingSides = this._getMovingSides(e); this._elementLocation = translator.locate($element); this._elementSize = { width: $element.outerWidth(), height: $element.outerHeight() }; this._renderDragOffsets(e); this._resizeStartAction({ jQueryEvent: e, width: this._elementSize.width, height: this._elementSize.height, handles: this._movingSides }); e.targetElements = null }, _toggleResizingClass: function(value) { this.element().toggleClass(RESIZABLE_RESIZING_CLASS, value) }, _renderDragOffsets: function(e) { var area = this._getArea(); if (!area) { return } var $handle = $(e.target).closest("." + RESIZABLE_HANDLE_CLASS), handleWidth = $handle.outerWidth(), handleHeight = $handle.outerHeight(), handleOffset = $handle.offset(), areaOffset = area.offset; e.maxLeftOffset = handleOffset.left - areaOffset.left; e.maxRightOffset = areaOffset.left + area.width - handleOffset.left - handleWidth; e.maxTopOffset = handleOffset.top - areaOffset.top; e.maxBottomOffset = areaOffset.top + area.height - handleOffset.top - handleHeight }, _getBorderWidth: function($element, direction) { if (commonUtils.isWindow($element.get(0))) { return 0 } var borderWidth = $element.css("border-" + direction + "-width"); return parseInt(borderWidth) || 0 }, _dragHandler: function(e) { var $element = this.element(), sides = this._movingSides; var location = this._elementLocation, size = this._elementSize, offset = this._getOffset(e); var width = size.width + offset.x * (sides.left ? -1 : 1), height = size.height + offset.y * (sides.top ? -1 : 1); if (offset.x || "strict" === this.option("stepPrecision")) { this._renderWidth(width) } if (offset.y || "strict" === this.option("stepPrecision")) { this._renderHeight(height) } var offsetTop = offset.y - ((this.element().outerHeight() || height) - height), offsetLeft = offset.x - ((this.element().outerWidth() || width) - width); translator.move($element, { top: location.top + (sides.top ? offsetTop : 0), left: location.left + (sides.left ? offsetLeft : 0) }); this._resizeAction({ jQueryEvent: e, width: this.option("width") || width, height: this.option("height") || height, handles: this._movingSides }) }, _getOffset: function(e) { var offset = e.offset, steps = stringUtils.pairToObject(this.option("step")), sides = this._getMovingSides(e), strictPrecision = "strict" === this.option("stepPrecision"); if (!sides.left && !sides.right) { offset.x = 0 } if (!sides.top && !sides.bottom) { offset.y = 0 } return strictPrecision ? this._getStrictOffset(offset, steps, sides) : this._getSimpleOffset(offset, steps) }, _getSimpleOffset: function(offset, steps) { return { x: offset.x - offset.x % steps.h, y: offset.y - offset.y % steps.v } }, _getStrictOffset: function(offset, steps, sides) { var location = this._elementLocation, size = this._elementSize, xPos = sides.left ? location.left : location.left + size.width, yPos = sides.top ? location.top : location.top + size.height, newXShift = (xPos + offset.x) % steps.h, newYShift = (yPos + offset.y) % steps.v, sign = Math.sign || function(x) { x = +x; if (0 === x || isNaN(x)) { return x } return x > 0 ? 1 : -1 }, separatorOffset = function(steps, offset) { return (1 + .2 * sign(offset)) % 1 * steps }, isSmallOffset = function(offset, steps) { return Math.abs(offset) < .2 * steps }; var newOffsetX = offset.x - newXShift, newOffsetY = offset.y - newYShift; if (newXShift > separatorOffset(steps.h, offset.x)) { newOffsetX += steps.h } if (newYShift > separatorOffset(steps.v, offset.y)) { newOffsetY += steps.v } return { x: (sides.left || sides.right) && !isSmallOffset(offset.x, steps.h) ? newOffsetX : 0, y: (sides.top || sides.bottom) && !isSmallOffset(offset.y, steps.v) ? newOffsetY : 0 } }, _getMovingSides: function(e) { var $target = $(e.target), hasCornerTopLeftClass = $target.hasClass(RESIZABLE_HANDLE_CORNER_CLASS + "-top-left"), hasCornerTopRightClass = $target.hasClass(RESIZABLE_HANDLE_CORNER_CLASS + "-top-right"), hasCornerBottomLeftClass = $target.hasClass(RESIZABLE_HANDLE_CORNER_CLASS + "-bottom-left"), hasCornerBottomRightClass = $target.hasClass(RESIZABLE_HANDLE_CORNER_CLASS + "-bottom-right"); return { top: $target.hasClass(RESIZABLE_HANDLE_TOP_CLASS) || hasCornerTopLeftClass || hasCornerTopRightClass, left: $target.hasClass(RESIZABLE_HANDLE_LEFT_CLASS) || hasCornerTopLeftClass || hasCornerBottomLeftClass, bottom: $target.hasClass(RESIZABLE_HANDLE_BOTTOM_CLASS) || hasCornerBottomLeftClass || hasCornerBottomRightClass, right: $target.hasClass(RESIZABLE_HANDLE_RIGHT_CLASS) || hasCornerTopRightClass || hasCornerBottomRightClass } }, _getArea: function() { var area = this.option("area"); if (isFunction(area)) { area = area.call(this) } if (isPlainObject(area)) { return this._getAreaFromObject(area) } return this._getAreaFromElement(area) }, _getAreaFromObject: function(area) { var result = { width: area.right - area.left, height: area.bottom - area.top, offset: { left: area.left, top: area.top } }; this._correctAreaGeometry(result); return result }, _getAreaFromElement: function(area) { var result, $area = $(area); if ($area.length) { result = { width: $area.innerWidth(), height: $area.innerHeight(), offset: extend({ top: 0, left: 0 }, commonUtils.isWindow($area[0]) ? {} : $area.offset()) }; this._correctAreaGeometry(result, $area) } return result }, _correctAreaGeometry: function(result, $area) { var areaBorderLeft = $area ? this._getBorderWidth($area, "left") : 0, areaBorderTop = $area ? this._getBorderWidth($area, "top") : 0; result.offset.left += areaBorderLeft + this._getBorderWidth(this.element(), "left"); result.offset.top += areaBorderTop + this._getBorderWidth(this.element(), "top"); result.width -= this.element().outerWidth() - this.element().innerWidth(); result.height -= this.element().outerHeight() - this.element().innerHeight() }, _dragEndHandler: function(e) { var $element = this.element(); this._resizeEndAction({ jQueryEvent: e, width: $element.outerWidth(), height: $element.outerHeight(), handles: this._movingSides }); this._toggleResizingClass(false) }, _renderWidth: function(width) { this.option("width", fitIntoRange(width, this.option("minWidth"), this.option("maxWidth"))) }, _renderHeight: function(height) { this.option("height", fitIntoRange(height, this.option("minHeight"), this.option("maxHeight"))) }, _optionChanged: function(args) { switch (args.name) { case "disabled": case "handles": this._invalidate(); break; case "minWidth": case "maxWidth": this._renderWidth(this.element().outerWidth()); break; case "minHeight": case "maxHeight": this._renderHeight(this.element().outerHeight()); break; case "onResize": case "onResizeStart": case "onResizeEnd": this._renderActions(); break; case "area": case "stepPrecision": case "step": break; default: this.callBase(args) } }, _clean: function() { this.element().find("." + RESIZABLE_HANDLE_CLASS).remove() } }); registerComponent(RESIZABLE, Resizable); module.exports = Resizable }, /*!*********************************!*\ !*** ./js/core/utils/locker.js ***! \*********************************/ function(module, exports, __webpack_require__) { var errors = __webpack_require__( /*! ../errors */ 7); var Locker = function() { var info = {}; var currentCount = function(lockName) { return info[lockName] || 0 }; return { obtain: function(lockName) { info[lockName] = currentCount(lockName) + 1 }, release: function(lockName) { var count = currentCount(lockName); if (count < 1) { throw errors.Error("E0014") } if (1 === count) { delete info[lockName] } else { info[lockName] = count - 1 } }, locked: function(lockName) { return currentCount(lockName) > 0 } } }; module.exports = Locker }, /*!******************************************************!*\ !*** ./js/integration/knockout/event_registrator.js ***! \******************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), ko = __webpack_require__( /*! knockout */ 93), isPlainObject = __webpack_require__( /*! ../../core/utils/type */ 12).isPlainObject, eventRegistrator = __webpack_require__( /*! ../../events/core/event_registrator */ 73), eventUtils = __webpack_require__( /*! ../../events/utils */ 71); eventRegistrator.callbacks.add(function(name) { var koBindingEventName = eventUtils.addNamespace(name, name + "Binding"); ko.bindingHandlers[name] = { update: function(element, valueAccessor, allBindingsAccessor, viewModel) { var $element = $(element), unwrappedValue = ko.utils.unwrapObservable(valueAccessor()), eventSource = unwrappedValue.execute ? unwrappedValue.execute : unwrappedValue; $element.off(koBindingEventName).on(koBindingEventName, isPlainObject(unwrappedValue) ? unwrappedValue : {}, function(e) { eventSource.call(viewModel, viewModel, e) }) } } }) }, /*!***********************************************!*\ !*** ./js/integration/knockout/components.js ***! \***********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Action = __webpack_require__( /*! ../../core/action */ 49), compileGetter = __webpack_require__( /*! ../../core/utils/data */ 50).compileGetter, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, ko = __webpack_require__( /*! knockout */ 93), iconUtils = __webpack_require__( /*! ../../core/utils/icon */ 115), clickEvent = __webpack_require__( /*! ../../events/click */ 75); ko.bindingHandlers.dxAction = { update: function(element, valueAccessor, allBindingsAccessor, viewModel) { var $element = $(element); var unwrappedValue = ko.utils.unwrapObservable(valueAccessor()), actionSource = unwrappedValue, actionOptions = { context: element }; if (unwrappedValue.execute) { actionSource = unwrappedValue.execute; extend(actionOptions, unwrappedValue) } var action = new Action(actionSource, actionOptions); $element.off(".dxActionBinding").on(clickEvent.name + ".dxActionBinding", function(e) { action.execute({ element: $element, model: viewModel, evaluate: function(expression) { var context = viewModel; if (expression.length > 0 && "$" === expression[0]) { context = ko.contextFor(element) } var getter = compileGetter(expression); return getter(context) }, jQueryEvent: e }); if (!actionOptions.bubbling) { e.stopPropagation() } }) } }; ko.bindingHandlers.dxControlsDescendantBindings = { init: function(_, valueAccessor) { return { controlsDescendantBindings: ko.unwrap(valueAccessor()) } } }; ko.bindingHandlers.dxIcon = { init: function(element, valueAccessor) { var options = ko.utils.unwrapObservable(valueAccessor()) || {}, iconElement = iconUtils.getImageContainer(options); ko.virtualElements.emptyNode(element); if (iconElement) { ko.virtualElements.prepend(element, iconElement.get(0)) } }, update: function(element, valueAccessor) { var options = ko.utils.unwrapObservable(valueAccessor()) || {}, iconElement = iconUtils.getImageContainer(options); ko.virtualElements.emptyNode(element); if (iconElement) { ko.virtualElements.prepend(element, iconElement.get(0)) } } }; ko.virtualElements.allowedBindings.dxIcon = true }, /*!*******************************!*\ !*** ./js/core/utils/icon.js ***! \*******************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9); var getImageSourceType = function(source) { if (!source || "string" !== typeof source) { return false } if (/data:.*base64|\.|\//.test(source)) { return "image" } if (/^[\w-_]+$/.test(source)) { return "dxIcon" } return "fontIcon" }; var getImageContainer = function(source) { var imageType = getImageSourceType(source), ICON_CLASS = "dx-icon"; switch (imageType) { case "image": return $("<img>", { src: source }).addClass(ICON_CLASS); case "fontIcon": return $("<i>", { "class": ICON_CLASS + " " + source }); case "dxIcon": return $("<i>", { "class": ICON_CLASS + " " + ICON_CLASS + "-" + source }); default: return null } }; exports.getImageSourceType = getImageSourceType; exports.getImageContainer = getImageContainer }, /*!***********************************************!*\ !*** ./js/integration/knockout/validation.js ***! \***********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), EventsMixin = __webpack_require__( /*! ../../core/events_mixin */ 51), ValidationEngine = __webpack_require__( /*! ../../ui/validation_engine */ 117), ko = __webpack_require__( /*! knockout */ 93); var koDxValidator = Class.inherit({ ctor: function(target, option) { var that = this; that.target = target; that.validationRules = option.validationRules; that.name = option.name; that.isValid = ko.observable(true); that.validationError = ko.observable(); $.each(this.validationRules, function(_, rule) { rule.validator = that }) }, validate: function() { var result = ValidationEngine.validate(this.target(), this.validationRules, this.name); this._applyValidationResult(result); return result }, reset: function() { this.target(null); var result = { isValid: true, brokenRule: null }; this._applyValidationResult(result); return result }, _applyValidationResult: function(result) { result.validator = this; this.target.dxValidator.isValid(result.isValid); this.target.dxValidator.validationError(result.brokenRule); this.fireEvent("validated", [result]) } }).include(EventsMixin); ko.extenders.dxValidator = function(target, option) { target.dxValidator = new koDxValidator(target, option); target.subscribe(target.dxValidator.validate.bind(target.dxValidator)); return target }; ValidationEngine.registerModelForValidation = function(model) { $.each(model, function(name, member) { if (ko.isObservable(member) && member.dxValidator) { ValidationEngine.registerValidatorInGroup(model, member.dxValidator) } }) }; ValidationEngine.unregisterModelForValidation = function(model) { $.each(model, function(name, member) { if (ko.isObservable(member) && member.dxValidator) { ValidationEngine.removeRegisteredValidator(model, member.dxValidator) } }) }; ValidationEngine.validateModel = ValidationEngine.validateGroup }, /*!************************************!*\ !*** ./js/ui/validation_engine.js ***! \************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), Class = __webpack_require__( /*! ../core/class */ 25), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../core/utils/array */ 26).inArray, EventsMixin = __webpack_require__( /*! ../core/events_mixin */ 51), errors = __webpack_require__( /*! ../core/errors */ 7), commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), numberLocalization = __webpack_require__( /*! ../localization/number */ 32), messageLocalization = __webpack_require__( /*! ../localization/message */ 89); var BaseRuleValidator = Class.inherit({ NAME: "base", defaultMessage: function(value) { return messageLocalization.getFormatter("validation-" + this.NAME)(value) }, defaultFormattedMessage: function(value) { return messageLocalization.getFormatter("validation-" + this.NAME + "-formatted")(value) }, validate: function(value, rule) { var valueArray = Array.isArray(value) ? value : [value], result = true; valueArray.every(function(itemValue) { result = this._validate(itemValue, rule); return result }, this); return result } }); var RequiredRuleValidator = BaseRuleValidator.inherit({ NAME: "required", _validate: function(value, rule) { if (!commonUtils.isDefined(value)) { return false } if (false === value) { return false } value = String(value); if (rule.trim || !commonUtils.isDefined(rule.trim)) { value = $.trim(value) } return "" !== value } }); var NumericRuleValidator = BaseRuleValidator.inherit({ NAME: "numeric", _validate: function(value, rule) { if (!rulesValidators.required.validate(value, {})) { return true } if (rule.useCultureSettings && commonUtils.isString(value)) { return !isNaN(numberLocalization.parse(value)) } else { return commonUtils.isNumeric(value) } } }); var RangeRuleValidator = BaseRuleValidator.inherit({ NAME: "range", _validate: function(value, rule) { if (!rulesValidators.required.validate(value, {})) { return true } var validNumber = rulesValidators.numeric.validate(value, rule), validValue = commonUtils.isDefined(value), number = validNumber ? parseFloat(value) : validValue && value.valueOf(), min = rule.min, max = rule.max; if (!(validNumber || commonUtils.isDate(value)) && !validValue) { return false } if (commonUtils.isDefined(min)) { if (commonUtils.isDefined(max)) { return number >= min && number <= max } return number >= min } else { if (commonUtils.isDefined(max)) { return number <= max } else { throw errors.Error("E0101") } } } }); var StringLengthRuleValidator = BaseRuleValidator.inherit({ NAME: "stringLength", _validate: function(value, rule) { value = commonUtils.isDefined(value) ? String(value) : ""; if (rule.trim || !commonUtils.isDefined(rule.trim)) { value = $.trim(value) } return rulesValidators.range.validate(value.length, extend({}, rule)) } }); var CustomRuleValidator = BaseRuleValidator.inherit({ NAME: "custom", validate: function(value, rule) { return rule.validationCallback({ value: value, validator: rule.validator, rule: rule }) } }); var CompareRuleValidator = BaseRuleValidator.inherit({ NAME: "compare", _validate: function(value, rule) { if (!rule.comparisonTarget) { throw errors.Error("E0102") } extend(rule, { reevaluate: true }); var otherValue = rule.comparisonTarget(), type = rule.comparisonType || "=="; switch (type) { case "==": return value == otherValue; case "!=": return value != otherValue; case "===": return value === otherValue; case "!==": return value !== otherValue; case ">": return value > otherValue; case ">=": return value >= otherValue; case "<": return value < otherValue; case "<=": return value <= otherValue } } }); var PatternRuleValidator = BaseRuleValidator.inherit({ NAME: "pattern", _validate: function(value, rule) { if (!rulesValidators.required.validate(value, {})) { return true } var pattern = rule.pattern; if (commonUtils.isString(pattern)) { pattern = new RegExp(pattern) } return pattern.test(value) } }); var EmailRuleValidator = BaseRuleValidator.inherit({ NAME: "email", _validate: function(value, rule) { if (!rulesValidators.required.validate(value, {})) { return true } return rulesValidators.pattern.validate(value, extend({}, rule, { pattern: /^[\d\w\._\-]+@([\d\w\._\-]+\.)+[\w]+$/i })) } }); var rulesValidators = { required: new RequiredRuleValidator, numeric: new NumericRuleValidator, range: new RangeRuleValidator, stringLength: new StringLengthRuleValidator, custom: new CustomRuleValidator, compare: new CompareRuleValidator, pattern: new PatternRuleValidator, email: new EmailRuleValidator }; var GroupConfig = Class.inherit({ ctor: function(group) { this.group = group; this.validators = [] }, validate: function() { var result = { isValid: true, brokenRules: [], validators: [] }; $.each(this.validators, function(_, validator) { var validatorResult = validator.validate(); result.isValid = result.isValid && validatorResult.isValid; if (validatorResult.brokenRule) { result.brokenRules.push(validatorResult.brokenRule) } result.validators.push(validator) }); this.fireEvent("validated", [{ validators: result.validators, brokenRules: result.brokenRules, isValid: result.isValid }]); return result }, reset: function() { $.each(this.validators, function(_, validator) { validator.reset() }) } }).include(EventsMixin); var ValidationEngine = { groups: [], getGroupConfig: function(group) { var result = commonUtils.grep(this.groups, function(config) { return config.group === group }); if (result.length) { return result[0] } }, initGroups: function() { this.groups = []; this.addGroup() }, addGroup: function(group) { var config = this.getGroupConfig(group); if (!config) { config = new GroupConfig(group); this.groups.push(config) } return config }, removeGroup: function(group) { var config = this.getGroupConfig(group), index = inArray(config, this.groups); if (index > -1) { this.groups.splice(index, 1) } return config }, _setDefaultMessage: function(rule, validator, name) { if (!commonUtils.isDefined(rule.message)) { if (validator.defaultFormattedMessage && commonUtils.isDefined(name)) { rule.message = validator.defaultFormattedMessage(name) } else { rule.message = validator.defaultMessage() } } }, validate: function(value, rules, name) { var result = { name: name, value: value, brokenRule: null, isValid: true, validationRules: rules }, that = this; $.each(rules || [], function(_, rule) { var ruleValidationResult, ruleValidator = rulesValidators[rule.type]; if (ruleValidator) { if (commonUtils.isDefined(rule.isValid) && rule.value === value && !rule.reevaluate) { if (!rule.isValid) { result.isValid = false; result.brokenRule = rule; return false } return true } rule.value = value; ruleValidationResult = ruleValidator.validate(value, rule); rule.isValid = ruleValidationResult; if (!ruleValidationResult) { result.isValid = false; that._setDefaultMessage(rule, ruleValidator, name); result.brokenRule = rule } if (!rule.isValid) { return false } } else { throw errors.Error("E0100") } }); return result }, registerValidatorInGroup: function(group, validator) { var groupConfig = ValidationEngine.addGroup(group); if (inArray(validator, groupConfig.validators) < 0) { groupConfig.validators.push(validator) } }, _shouldRemoveGroup: function(group, validatorsInGroup) { var isDefaultGroup = void 0 === group, isValidationGroupInstance = group && "dxValidationGroup" === group.NAME; return !isDefaultGroup && !isValidationGroupInstance && !validatorsInGroup.length }, removeRegisteredValidator: function(group, validator) { var config = ValidationEngine.getGroupConfig(group), validatorsInGroup = config && config.validators; var index = inArray(validator, validatorsInGroup); if (index > -1) { validatorsInGroup.splice(index, 1); if (this._shouldRemoveGroup(group, validatorsInGroup)) { this.removeGroup(group) } } }, validateGroup: function(group) { var groupConfig = ValidationEngine.getGroupConfig(group); if (!groupConfig) { throw errors.Error("E0110") } return groupConfig.validate() }, resetGroup: function(group) { var groupConfig = ValidationEngine.getGroupConfig(group); if (!groupConfig) { throw errors.Error("E0110") } return groupConfig.reset() } }; ValidationEngine.initGroups(); module.exports = ValidationEngine }, /*!***********************************************************!*\ !*** ./js/integration/knockout/variable_wrapper_utils.js ***! \***********************************************************/ function(module, exports, __webpack_require__) { var ko = __webpack_require__( /*! knockout */ 93), variableWrapper = __webpack_require__( /*! ../../core/utils/variable_wrapper */ 28); variableWrapper.inject({ isWrapped: ko.isObservable, isWritableWrapped: ko.isWritableObservable, wrap: ko.observable, unwrap: function(value) { if (ko.isObservable(value)) { return ko.utils.unwrapObservable(value) } return this.callBase(value) }, assign: function(variable, value) { if (ko.isObservable(variable)) { variable(value) } else { this.callBase(variable, value) } } }) }, /*!***********************************************!*\ !*** ./js/integration/knockout/clean_node.js ***! \***********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! jquery */ 10), ko = __webpack_require__( /*! knockout */ 93), cleanData = $.cleanData, compareVersion = __webpack_require__( /*! ../../core/utils/version */ 17).compare; if (compareVersion($.fn.jquery, [2, 0]) >= 0) { $.cleanData = function(nodes) { var result = cleanData(nodes); for (var i = 0; i < nodes.length; i++) { nodes[i].cleanedByJquery = true } for (i = 0; i < nodes.length; i++) { if (!nodes[i].cleanedByKo) { ko.cleanNode(nodes[i]) } delete nodes[i].cleanedByKo } for (i = 0; i < nodes.length; i++) { delete nodes[i].cleanedByJquery } return result }; ko.utils.domNodeDisposal.cleanExternalData = function(node) { node.cleanedByKo = true; if (!node.cleanedByJquery) { $.cleanData([node]) } } } }, /*!***************************************************!*\ !*** ./js/integration/knockout/clean_node_old.js ***! \***************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), ko = __webpack_require__( /*! knockout */ 93), compareVersion = __webpack_require__( /*! ../../core/utils/version */ 17).compare; if (compareVersion($.fn.jquery, [2, 0]) < 0) { var cleanKoData = function(element, andSelf) { var cleanNode = function() { ko.cleanNode(this) }; if (andSelf) { element.each(cleanNode) } else { element.find("*").each(cleanNode) } }; var originalEmpty = $.fn.empty; $.fn.empty = function() { cleanKoData(this, false); return originalEmpty.apply(this, arguments) }; var originalRemove = $.fn.remove; $.fn.remove = function(selector, keepData) { if (!keepData) { var subject = this; if (selector) { subject = subject.filter(selector) } cleanKoData(subject, true) } return originalRemove.call(this, selector, keepData) }; var originalHtml = $.fn.html; $.fn.html = function(value) { if ("string" === typeof value) { cleanKoData(this, false) } return originalHtml.apply(this, arguments) }; var originalReplaceWith = $.fn.replaceWith; $.fn.replaceWith = function() { var result = originalReplaceWith.apply(this, arguments); if (!this.parent().length) { cleanKoData(this, true) } return result } } }, /*!*********************************!*\ !*** ./js/framework/command.js ***! \*********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), errors = __webpack_require__( /*! ./errors */ 122), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), typeUtils = __webpack_require__( /*! ../core/utils/type */ 12), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), DOMComponent = __webpack_require__( /*! ../core/dom_component */ 43), isFunction = commonUtils.isFunction, isPlainObject = typeUtils.isPlainObject, noop = commonUtils.noop; __webpack_require__( /*! ../integration/knockout */ 92); var Command = DOMComponent.inherit({ ctor: function(element, options) { if (isPlainObject(element)) { options = element; element = $("<div />") } this.callBase(element, options) }, _setDeprecatedOptions: function() { this.callBase(); extend(this._deprecatedOptions, { iconSrc: { since: "15.1", alias: "icon" } }) }, _getDefaultOptions: function() { return extend(this.callBase(), { onExecute: null, id: null, title: "", icon: "", visible: true, disabled: false, renderStage: "onViewShown" }) }, execute: function() { var isDisabled = this._options.disabled; if (isFunction(isDisabled)) { isDisabled = !!isDisabled.apply(this, arguments) } if (isDisabled) { throw errors.Error("E3004", this._options.id) } this.fireEvent("beforeExecute", arguments); this._createActionByOption("onExecute").apply(this, arguments); this.fireEvent("afterExecute", arguments) }, _render: function() { this.callBase(); this.element().addClass("dx-command") }, _renderDisabledState: noop, _dispose: function() { this.callBase(); this.element().removeData(this.NAME) } }); registerComponent("dxCommand", Command); module.exports = Command }, /*!********************************!*\ !*** ./js/framework/errors.js ***! \********************************/ function(module, exports, __webpack_require__) { var errorUtils = __webpack_require__( /*! ../core/utils/error */ 8), errors = __webpack_require__( /*! ../core/errors */ 7); module.exports = errorUtils(errors.ERROR_MESSAGES, { E3001: "Routing rule is not found for the '{0}' URI.", E3002: "The passed object cannot be formatted into a URI string by the application's router. An appropriate route should be registered.", E3003: "Unable to navigate. Application is being initialized.", E3004: "Cannot execute the command: {0}.", E3005: "The '{0}' command {1} is not registered in the application's command mapping. Go to http://dxpr.es/1bTjfj1 for more details.", E3006: "Unknown navigation target: '{0}'. Use the 'current', 'back' or 'blank' values.", E3007: "Error while restoring the application state. The state has been cleared. Refresh the page.", E3008: "Unable to go back.", E3009: "Unable to go forward.", E3010: "The command's 'id' option should be specified.\r\nProcessed markup: {0}\n", E3011: "Layout controller cannot be resolved. There are no appropriate layout controllers for the current context. Check browser console for details.", E3012: "Layout controller cannot be resolved. Two or more layout controllers suit the current context. Check browser console for details.", E3013: "The '{0}' template with the '{1}' name is not found. Make sure the case is correct in the specified view name and the template fits the current context.", E3014: "All the children of the dxView element should be either of the dxCommand or dxContent type.\r\nProcessed markup: {0}", E3015: "The 'exec' method should be called before the 'finalize' method.", E3016: "Unknown transition type '{0}'.", E3018: "Unable to parse options.\nMessage: {0};\nOptions value: {1}.", E3019: "View templates should be updated according to the 13.1 changes. Go to http://dxpr.es/15ikrJA for more details.", E3020: "Concurrent templates are found:\r\n{0}Target device:\r\n{1}.", E3021: "Remote template cannot be loaded.\r\nUrl:{0}\r\nError:{1}.", E3022: "Cannot initialize the HtmlApplication component.", E3023: "Navigation item is not found", E3024: "Layout controller is not initialized", W3001: "A view with the '{0}' key doesn't exist.", W3002: "A view with the '{0}' key has already been released.", W3003: "Layout resolving context:\n{0}\nAvailable layout controller registrations:\n{1}\n", W3004: "Layout resolving context:\n{0}\nConcurent layout controller registrations for the context:\n{1}\n", W3005: 'Direct hash-based navigation is detected in a mobile application. Use data-bind="dxAction: url" instead of href="#url" to avoid navigation issues.\nFound markup:\n{0}\n' }) }, /*!********************************!*\ !*** ./js/framework/router.js ***! \********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, typeUtils = __webpack_require__( /*! ../core/utils/type */ 12), inArray = __webpack_require__( /*! ../core/utils/array */ 26).inArray, Class = __webpack_require__( /*! ../core/class */ 25); var JSON_URI_PREFIX = encodeURIComponent("json:"); var Route = Class.inherit({ _trimSeparators: function(str) { return str.replace(/^[\/.]+|\/+$/g, "") }, _escapeRe: function(str) { return str.replace(/[^-\w]/g, "\\$1") }, _checkConstraint: function(param, constraint) { param = String(param); if ("string" === typeof constraint) { constraint = new RegExp(constraint) } var match = constraint.exec(param); if (!match || match[0] !== param) { return false } return true }, _ensureReady: function() { var that = this; if (this._patternRe) { return false } this._pattern = this._trimSeparators(this._pattern); this._patternRe = ""; this._params = []; this._segments = []; this._separators = []; this._pattern.replace(/[^\/]+/g, function(segment, index) { that._segments.push(segment); if (index) { that._separators.push(that._pattern.substr(index - 1, 1)) } }); $.each(this._segments, function(index) { var segment = this, separator = index ? that._separators[index - 1] : ""; if (":" === segment.charAt(0)) { segment = segment.substr(1); that._params.push(segment); that._patternRe += "(?:" + separator + "([^/]*))"; if (segment in that._defaults) { that._patternRe += "?" } } else { that._patternRe += separator + that._escapeRe(segment) } }); this._patternRe = new RegExp("^" + this._patternRe + "$") }, ctor: function(pattern, defaults, constraints) { this._pattern = pattern || ""; this._defaults = defaults || {}; this._constraints = constraints || {} }, parse: function(uri) { var that = this; this._ensureReady(); var matches = this._patternRe.exec(uri); if (!matches) { return false } var result = extend({}, this._defaults); $.each(this._params, function(i) { var index = i + 1; if (matches.length >= index && matches[index]) { result[this] = that.parseSegment(matches[index]) } }); $.each(this._constraints, function(key) { if (!that._checkConstraint(result[key], that._constraints[key])) { result = false; return false } }); return result }, format: function(routeValues) { var that = this, query = ""; this._ensureReady(); var mergeValues = extend({}, this._defaults), useStatic = 0, result = [], dels = [], unusedRouteValues = {}; $.each(routeValues, function(paramName, paramValue) { routeValues[paramName] = that.formatSegment(paramValue); if (!(paramName in mergeValues)) { unusedRouteValues[paramName] = true } }); $.each(this._segments, function(index, segment) { result[index] = index ? that._separators[index - 1] : ""; if (":" === segment.charAt(0)) { var paramName = segment.substr(1); if (!(paramName in routeValues) && !(paramName in that._defaults)) { result = null; return false } if (paramName in that._constraints && !that._checkConstraint(routeValues[paramName], that._constraints[paramName])) { result = null; return false } if (paramName in routeValues) { if (void 0 !== routeValues[paramName]) { mergeValues[paramName] = routeValues[paramName]; result[index] += routeValues[paramName]; useStatic = index } delete unusedRouteValues[paramName] } else { if (paramName in mergeValues) { result[index] += mergeValues[paramName]; dels.push(index) } } } else { result[index] += segment; useStatic = index } }); $.each(mergeValues, function(key, value) { if (!!value && inArray(":" + key, that._segments) === -1 && routeValues[key] !== value) { result = null; return false } }); var unusedCount = 0; if (!typeUtils.isEmptyObject(unusedRouteValues)) { query = "?"; $.each(unusedRouteValues, function(key) { query += key + "=" + routeValues[key] + "&"; unusedCount++ }); query = query.substr(0, query.length - 1) } if (null === result) { return false } if (dels.length) { $.map(dels, function(i) { if (i >= useStatic) { result[i] = "" } }) } var path = result.join(""); path = path.replace(/\/+$/, ""); return { uri: path + query, unusedCount: unusedCount } }, formatSegment: function(value) { if (Array.isArray(value) || typeUtils.isPlainObject(value)) { return JSON_URI_PREFIX + encodeURIComponent(JSON.stringify(value)) } return encodeURIComponent(value) }, parseSegment: function(value) { if (value.substr(0, JSON_URI_PREFIX.length) === JSON_URI_PREFIX) { try { return JSON.parse(decodeURIComponent(value.substr(JSON_URI_PREFIX.length))) } catch (x) {} } return decodeURIComponent(value) } }); var Router = Class.inherit({ ctor: function() { this._registry = [] }, _trimSeparators: function(str) { return str.replace(/^[\/.]+|\/+$/g, "") }, _createRoute: function(pattern, defaults, constraints) { return new Route(pattern, defaults, constraints) }, register: function(pattern, defaults, constraints) { this._registry.push(this._createRoute(pattern, defaults, constraints)) }, _parseQuery: function(query) { var result = {}, values = query.split("&"); $.each(values, function(index, value) { var keyValuePair = value.split("="); result[keyValuePair[0]] = decodeURIComponent(keyValuePair[1]) }); return result }, parse: function(uri) { var result, that = this; uri = this._trimSeparators(uri); var parts = uri.split("?", 2), path = parts[0], query = parts[1]; $.each(this._registry, function() { var parseResult = this.parse(path); if (false !== parseResult) { result = parseResult; if (query) { result = extend(result, that._parseQuery(query)) } return false } }); return result ? result : false }, format: function(obj) { var result = false, minUnusedCount = 99999; obj = obj || {}; $.each(this._registry, function() { var toFormat = extend(true, {}, obj); var formatResult = this.format(toFormat); if (false !== formatResult) { if (minUnusedCount > formatResult.unusedCount) { minUnusedCount = formatResult.unusedCount; result = formatResult.uri } } }); return result } }); Route.__internals = { JSON_URI_PREFIX: JSON_URI_PREFIX }; module.exports = Router; module.exports.Route = Route }, /*!***************************************!*\ !*** ./js/framework/state_manager.js ***! \***************************************/ function(module, exports, __webpack_require__) { var Class = __webpack_require__( /*! ../core/class */ 25), inArray = __webpack_require__( /*! ../core/utils/array */ 26).inArray, $ = __webpack_require__( /*! ../core/renderer */ 9); var MemoryKeyValueStorage = Class.inherit({ ctor: function() { this.storage = {} }, getItem: function(key) { return this.storage[key] }, setItem: function(key, value) { this.storage[key] = value }, removeItem: function(key) { delete this.storage[key] } }); var StateManager = Class.inherit({ ctor: function(options) { options = options || {}; this.storage = options.storage || new MemoryKeyValueStorage; this.stateSources = options.stateSources || [] }, addStateSource: function(stateSource) { this.stateSources.push(stateSource) }, removeStateSource: function(stateSource) { var index = inArray(stateSource, this.stateSources); if (index > -1) { this.stateSources.splice(index, 1); stateSource.removeState(this.storage) } }, saveState: function() { var that = this; $.each(this.stateSources, function(index, stateSource) { stateSource.saveState(that.storage) }) }, restoreState: function() { var that = this; $.each(this.stateSources, function(index, stateSource) { stateSource.restoreState(that.storage) }) }, clearState: function() { var that = this; $.each(this.stateSources, function(index, stateSource) { stateSource.removeState(that.storage) }) } }); module.exports = StateManager; module.exports.MemoryKeyValueStorage = MemoryKeyValueStorage }, /*!************************************!*\ !*** ./js/framework/view_cache.js ***! \************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), inArray = __webpack_require__( /*! ../core/utils/array */ 26).inArray, Class = __webpack_require__( /*! ../core/class */ 25), EventsMixin = __webpack_require__( /*! ../core/events_mixin */ 51); var ViewCache = Class.inherit({ ctor: function() { this._cache = {} }, setView: function(key, viewInfo) { this._cache[key] = viewInfo }, getView: function(key) { return this._cache[key] }, removeView: function(key) { var result = this._cache[key]; if (result) { delete this._cache[key]; this.fireEvent("viewRemoved", [{ viewInfo: result }]) } return result }, clear: function() { var that = this; $.each(this._cache, function(key) { that.removeView(key) }) }, hasView: function(key) { return key in this._cache } }).include(EventsMixin); var NullViewCache = ViewCache.inherit({ setView: function(key, viewInfo) { this.callBase(key, viewInfo); this.removeView(key) } }); function delegateEvent(eventName, source, target) { source.on(eventName, function() { target.fireEvent(eventName, arguments) }) } var ConditionalViewCacheDecorator = Class.inherit({ ctor: function(options) { this._filter = options.filter; this._viewCache = options.viewCache; this.viewRemoved = this._viewCache.viewRemoved; delegateEvent("viewRemoved", this._viewCache, this) }, setView: function(key, viewInfo) { this._viewCache.setView(key, viewInfo); if (!this._filter(key, viewInfo)) { this._viewCache.removeView(key) } }, getView: function(key) { return this._viewCache.getView(key) }, removeView: function(key) { return this._viewCache.removeView(key) }, clear: function() { return this._viewCache.clear() }, hasView: function(key) { return this._viewCache.hasView(key) } }).include(EventsMixin); var DEFAULT_VIEW_CACHE_CAPACITY = 5; var CapacityViewCacheDecorator = Class.inherit({ ctor: function(options) { this._keys = []; this._size = options.size || DEFAULT_VIEW_CACHE_CAPACITY; this._viewCache = options.viewCache; this.viewRemoved = this._viewCache.viewRemoved; delegateEvent("viewRemoved", this._viewCache, this) }, setView: function(key, viewInfo) { if (!this.hasView(key)) { if (this._keys.length === this._size) { this.removeView(this._keys[0]) } this._keys.push(key) } this._viewCache.setView(key, viewInfo) }, getView: function(key) { var index = inArray(key, this._keys); if (index < 0) { return null } this._keys.push(key); this._keys.splice(index, 1); return this._viewCache.getView(key) }, removeView: function(key) { var index = inArray(key, this._keys); if (index > -1) { this._keys.splice(index, 1) } return this._viewCache.removeView(key) }, clear: function() { this._keys = []; return this._viewCache.clear() }, hasView: function(key) { return this._viewCache.hasView(key) } }).include(EventsMixin); var HistoryDependentViewCacheDecorator = Class.inherit({ ctor: function(options) { this._viewCache = options.viewCache || new ViewCache; this._navigationManager = options.navigationManager; this._navigationManager.on("itemRemoved", this._onNavigationItemRemoved.bind(this)); this.viewRemoved = this._viewCache.viewRemoved; delegateEvent("viewRemoved", this._viewCache, this) }, _onNavigationItemRemoved: function(item) { this.removeView(item.key) }, setView: function(key, viewInfo) { this._viewCache.setView(key, viewInfo) }, getView: function(key) { return this._viewCache.getView(key) }, removeView: function(key) { return this._viewCache.removeView(key) }, clear: function() { return this._viewCache.clear() }, hasView: function(key) { return this._viewCache.hasView(key) } }).include(EventsMixin); module.exports = ViewCache; module.exports.NullViewCache = NullViewCache; module.exports.ConditionalViewCacheDecorator = ConditionalViewCacheDecorator; module.exports.CapacityViewCacheDecorator = CapacityViewCacheDecorator; module.exports.HistoryDependentViewCacheDecorator = HistoryDependentViewCacheDecorator }, /*!************************************************!*\ !*** ./js/framework/html/command_container.js ***! \************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), MarkupComponent = __webpack_require__( /*! ./markup_component */ 127).MarkupComponent, isPlainObject = __webpack_require__( /*! ../../core/utils/type */ 12).isPlainObject, registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57); __webpack_require__( /*! ../../integration/knockout */ 92); var CommandContainer = MarkupComponent.inherit({ ctor: function(element, options) { if (isPlainObject(element)) { options = element; element = $("<div />") } this.callBase(element, options) }, _setDefaultOptions: function() { this.callBase(); this.option({ id: null }) }, _render: function() { this.callBase(); this.element().addClass("dx-command-container") } }); registerComponent("dxCommandContainer", CommandContainer); module.exports = CommandContainer }, /*!***********************************************!*\ !*** ./js/framework/html/markup_component.js ***! \***********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, publicComponentUtils = __webpack_require__( /*! ../../core/utils/public_component */ 45); var MarkupComponent = Class.inherit({ ctor: function(element, options) { this.NAME = publicComponentUtils.name(this.constructor); options = options || {}; this._$element = $(element); publicComponentUtils.attachInstanceToElement(this._$element, this, this._dispose); if (options.fromCache) { this._options = options } else { this._options = {}; this._setDefaultOptions(); if (options) { this.option(options) } this._render() } }, _setDefaultOptions: noop, _render: noop, _dispose: noop, element: function() { return this._$element }, option: function(name, value) { if (0 === arguments.length) { return this._options } else { if (1 === arguments.length) { if ("string" === typeof name) { return this._options[name] } else { value = name; extend(this._options, value) } } else { this._options[name] = value } } }, instance: function() { return this } }); MarkupComponent.getInstance = function($element) { return publicComponentUtils.getInstanceByElement($($element), this) }; exports.MarkupComponent = MarkupComponent }, /*!*****************************************************!*\ !*** ./js/framework/html/view_engine_components.js ***! \*****************************************************/ function(module, exports, __webpack_require__) { var errors = __webpack_require__( /*! ../errors */ 122), domUtils = __webpack_require__( /*! ../../core/utils/dom */ 56), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), MarkupComponent = __webpack_require__( /*! ./markup_component */ 127).MarkupComponent; __webpack_require__( /*! ../../integration/knockout */ 92); var View = MarkupComponent.inherit({ _setDefaultOptions: function() { this.callBase(); this.option({ name: null, title: null }) }, ctor: function() { this._id = domUtils.uniqueId(); this.callBase.apply(this, arguments) }, _render: function() { this.callBase(); this.element().addClass("dx-view"); this.element().attr("dx-data-template-id", this._id) }, getId: function() { return this._id } }); var Layout = MarkupComponent.inherit({ _setDefaultOptions: function() { this.callBase(); this.option({ name: null }) }, _render: function() { this.callBase(); this.element().addClass("dx-layout") } }); var ViewPlaceholder = MarkupComponent.inherit({ _setDefaultOptions: function() { this.callBase(); this.option({ viewName: null }) }, _render: function() { this.callBase(); this.element().addClass("dx-view-placeholder") } }); var setupTransitionElement = function($element, transitionType, transitionName, contentCssPosition) { if ("absolute" === contentCssPosition) { $element.addClass("dx-transition-absolute") } else { $element.addClass("dx-transition-static") } $element.addClass("dx-transition").addClass("dx-transition-" + transitionName).addClass("dx-transition-" + transitionType).attr("data-dx-transition-type", transitionType).attr("data-dx-transition-name", transitionName) }; var setupTransitionInnerElement = function($element) { $element.addClass("dx-transition-inner-wrapper") }; var Transition = MarkupComponent.inherit({ _setDefaultOptions: function() { this.callBase(); this.option({ name: null, type: void 0, animation: "slide" }) }, _render: function() { this.callBase(); var element = this.element(); setupTransitionElement(element, this.option("type") || this.option("animation"), this.option("name"), "absolute"); element.wrapInner("<div/>"); setupTransitionInnerElement(element.children()); if (this.option("type")) { errors.log("W0003", "dxTransition", "type", "15.1", "Use the 'animation' property instead") } }, _clean: function() { this.callBase(); this.element().empty() } }); var ContentPlaceholder = MarkupComponent.inherit({ _setDefaultOptions: function() { this.callBase(); this.option({ name: null, transition: void 0, animation: "none", contentCssPosition: "absolute" }) }, _render: function() { this.callBase(); var $element = this.element(); $element.addClass("dx-content-placeholder").addClass("dx-content-placeholder-" + this.option("name")); $element.attr("data-dx-content-placeholder-name", this.option("name")); setupTransitionElement($element, this.option("transition") || this.option("animation"), this.option("name"), this.option("contentCssPosition")); if (this.option("transition")) { errors.log("W0003", "dxContentPlaceholder", "transition", "15.1", "Use the 'animation' property instead") } } }); var Content = MarkupComponent.inherit({ _setDefaultOptions: function() { this.callBase(); this.option({ targetPlaceholder: null }) }, _optionChanged: function() { this._refresh() }, _clean: function() { this.callBase(); this.element().removeClass(this._currentClass) }, _render: function() { this.callBase(); var element = this.element(); element.addClass("dx-content"); this._currentClass = "dx-content-" + this.option("targetPlaceholder"); element.attr("data-dx-target-placeholder-id", this.option("targetPlaceholder")); element.addClass(this._currentClass); setupTransitionInnerElement(element) } }); registerComponent("dxView", View); registerComponent("dxLayout", Layout); registerComponent("dxViewPlaceholder", ViewPlaceholder); registerComponent("dxContentPlaceholder", ContentPlaceholder); registerComponent("dxTransition", Transition); registerComponent("dxContent", Content); exports.dxView = View; exports.dxLayout = Layout; exports.dxViewPlaceholder = ViewPlaceholder; exports.dxContentPlaceholder = ContentPlaceholder; exports.dxTransition = Transition; exports.dxContent = Content }, /*!***********************************************!*\ !*** ./js/framework/html/html_application.js ***! \***********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), Component = __webpack_require__( /*! ../../core/component */ 48), extendUtils = __webpack_require__( /*! ../../core/utils/extend */ 11), errors = __webpack_require__( /*! ../errors */ 122), Application = __webpack_require__( /*! ../application */ 130).Application, ConditionalViewCacheDecorator = __webpack_require__( /*! ../view_cache */ 125).ConditionalViewCacheDecorator, html = __webpack_require__( /*! ./presets */ 138), CommandManager = __webpack_require__( /*! ./command_manager */ 139), ViewEngine = __webpack_require__( /*! ./view_engine */ 141).ViewEngine, messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), viewPort = __webpack_require__( /*! ../../core/utils/view_port */ 55).value, initMobileViewportModule = __webpack_require__( /*! ../../mobile/init_mobile_viewport/init_mobile_viewport */ 60), devices = __webpack_require__( /*! ../../core/devices */ 53), feedbackEvents = __webpack_require__( /*! ../../events/core/emitter.feedback */ 104), TransitionExecutorModule = __webpack_require__( /*! ../../animation/transition_executor/transition_executor */ 74), animationPresetsModule = __webpack_require__( /*! ../../animation/presets/presets */ 67), when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when; __webpack_require__( /*! ./layout_controller */ 142); __webpack_require__( /*! ../../ui/themes */ 143); var VIEW_PORT_CLASSNAME = "dx-viewport", LAYOUT_CHANGE_ANIMATION_NAME = "layout-change"; var HtmlApplication = Application.inherit({ ctor: function(options) { options = options || {}; this.callBase(options); this._$root = $(options.rootNode || document.body); this._initViewport(options.viewPort); if ("mobileApp" === this._applicationMode) { initMobileViewportModule.initMobileViewport(options.viewPort) } this.device = options.device || devices.current(); this.commandManager = options.commandManager || new CommandManager({ commandMapping: this.commandMapping }); this._initTemplateContext(); this.viewEngine = options.viewEngine || new ViewEngine({ $root: this._$root, device: this.device, templateCacheStorage: options.templateCacheStorage || window.localStorage, templatesVersion: options.templatesVersion, templateContext: this._templateContext }); this.components.push(this.viewEngine); this._initMarkupFilters(this.viewEngine); this._layoutSet = options.layoutSet || html.layoutSets.default; this._animationSet = options.animationSet || html.animationSets.default; this._availableLayoutControllers = []; this._activeLayoutControllersStack = []; this.transitionExecutor = new TransitionExecutorModule.TransitionExecutor; this._initAnimations(this._animationSet) }, _initAnimations: function(animationSet) { if (!animationSet) { return } $.each(animationSet, function(name, configs) { $.each(configs, function(index, config) { animationPresetsModule.presets.registerPreset(name, config) }) }); animationPresetsModule.presets.applyChanges() }, _localizeMarkup: function($markup) { messageLocalization.localizeNode($markup) }, _notifyIfBadMarkup: function($markup) { $markup.each(function() { var html = $(this).html(); if (/href="#/.test(html)) { errors.log("W3005", html) } }) }, _initMarkupFilters: function(viewEngine) { var filters = []; filters.push(this._localizeMarkup); if ("mobileApp" === this._applicationMode) { filters.push(this._notifyIfBadMarkup) } if (viewEngine.markupLoaded) { viewEngine.markupLoaded.add(function(args) { $.each(filters, function(_, filter) { filter(args.markup) }) }) } }, _createViewCache: function(options) { var result = this.callBase(options); if (!options.viewCache) { result = new ConditionalViewCacheDecorator({ filter: function(key, viewInfo) { return !viewInfo.viewTemplateInfo.disableCache }, viewCache: result }) } return result }, _initViewport: function() { this._$viewPort = this._getViewPort(); viewPort(this._$viewPort) }, _getViewPort: function() { var $viewPort = $("." + VIEW_PORT_CLASSNAME); if (!$viewPort.length) { $viewPort = $("<div>").addClass(VIEW_PORT_CLASSNAME).appendTo(this._$root) } return $viewPort }, _initTemplateContext: function() { this._templateContext = new Component({ orientation: devices.orientation() }); devices.on("orientationChanged", function(args) { this._templateContext.option("orientation", args.orientation) }.bind(this)) }, _showViewImpl: function(viewInfo, direction) { var that = this, deferred = $.Deferred(), result = deferred.promise(), layoutController = viewInfo.layoutController; that._obtainViewLink(viewInfo); layoutController.showView(viewInfo, direction).done(function() { that._activateLayoutController(layoutController, that._getTargetNode(viewInfo), direction).done(function() { deferred.resolve() }) }); feedbackEvents.lock(result); return result }, _resolveLayoutController: function(viewInfo) { var args = { viewInfo: viewInfo, layoutController: null, availableLayoutControllers: this._availableLayoutControllers }; this._processEvent("resolveLayoutController", args, viewInfo.model); this._checkLayoutControllerIsInitialized(args.layoutController); return args.layoutController || this._resolveLayoutControllerImpl(viewInfo) }, _checkLayoutControllerIsInitialized: function(layoutController) { if (layoutController) { var isControllerInited = false; $.each(this._layoutSet, function(_, controllerInfo) { if (controllerInfo.controller === layoutController) { isControllerInited = true; return false } }); if (!isControllerInited) { throw errors.Error("E3024") } } }, _ensureOneLayoutControllerFound: function(target, matches) { var toJSONInterceptor = function(key, value) { if ("controller" === key) { return "[controller]: { name:" + value.name + " }" } return value }; if (!matches.length) { errors.log("W3003", JSON.stringify(target, null, 4), JSON.stringify(this._availableLayoutControllers, toJSONInterceptor, 4)); throw errors.Error("E3011") } if (matches.length > 1) { errors.log("W3004", JSON.stringify(target, null, 4), JSON.stringify(matches, toJSONInterceptor, 4)); throw errors.Error("E3012") } }, _resolveLayoutControllerImpl: function(viewInfo) { var templateInfo = viewInfo.viewTemplateInfo || {}, navigateOptions = viewInfo.navigateOptions || {}, target = extendUtils.extend({ root: !viewInfo.canBack, customResolveRequired: false, pane: templateInfo.pane, modal: void 0 !== navigateOptions.modal ? navigateOptions.modal : templateInfo.modal || false }, devices.current()); var matches = commonUtils.findBestMatches(target, this._availableLayoutControllers); this._ensureOneLayoutControllerFound(target, matches); return matches[0].controller }, _onNavigatingBack: function(args) { this.callBase.apply(this, arguments); if (!args.cancel && !this.canBack() && this._activeLayoutControllersStack.length > 1) { var previousActiveLayoutController = this._activeLayoutControllersStack[this._activeLayoutControllersStack.length - 2], previousViewInfo = previousActiveLayoutController.activeViewInfo(); args.cancel = true; this._activateLayoutController(previousActiveLayoutController, void 0, "backward"); this.navigationManager.currentItem(previousViewInfo.key) } }, _activeLayoutController: function() { return this._activeLayoutControllersStack.length ? this._activeLayoutControllersStack[this._activeLayoutControllersStack.length - 1] : void 0 }, _getTargetNode: function(viewInfo) { var jQueryEvent = (viewInfo.navigateOptions || {}).jQueryEvent; return jQueryEvent ? $(jQueryEvent.target) : void 0 }, _activateLayoutController: function(layoutController, targetNode, direction) { var that = this, previousLayoutController = that._activeLayoutController(); if (previousLayoutController === layoutController) { return $.Deferred().resolve().promise() } var d = $.Deferred(); layoutController.ensureActive(targetNode).done(function(result) { that._deactivatePreviousLayoutControllers(layoutController, direction, result).done(function() { that._activeLayoutControllersStack.push(layoutController); d.resolve() }) }); return d.promise() }, _deactivatePreviousLayoutControllers: function(layoutController, direction) { var that = this, tasks = [], controllerToDeactivate = that._activeLayoutControllersStack.pop(); if (!controllerToDeactivate) { return $.Deferred().resolve().promise() } if (layoutController.isOverlay) { that._activeLayoutControllersStack.push(controllerToDeactivate); tasks.push(controllerToDeactivate.disable()) } else { var transitionDeferred = $.Deferred(), skipAnimation = false; var getControllerDeactivator = function(controllerToDeactivate, d) { return function() { controllerToDeactivate.deactivate().done(function() { d.resolve() }) } }; while (controllerToDeactivate && controllerToDeactivate !== layoutController) { var d = $.Deferred(); if (controllerToDeactivate.isOverlay) { skipAnimation = true } else { that.transitionExecutor.leave(controllerToDeactivate.element(), LAYOUT_CHANGE_ANIMATION_NAME, { direction: direction }) } transitionDeferred.promise().done(getControllerDeactivator(controllerToDeactivate, d)); tasks.push(d.promise()); controllerToDeactivate = that._activeLayoutControllersStack.pop() } if (skipAnimation) { transitionDeferred.resolve() } else { that.transitionExecutor.enter(layoutController.element(), LAYOUT_CHANGE_ANIMATION_NAME, { direction: direction }); that.transitionExecutor.start().done(function() { transitionDeferred.resolve() }) } } return when.apply($, tasks) }, init: function() { var that = this, result = this.callBase(); result.done(function() { that._initLayoutControllers(); that.renderNavigation() }); return result }, _disposeView: function(viewInfo) { if (viewInfo.layoutController.disposeView) { viewInfo.layoutController.disposeView(viewInfo) } this.callBase(viewInfo) }, viewPort: function() { return this._$viewPort }, _createViewInfo: function() { var viewInfo = this.callBase.apply(this, arguments), templateInfo = this.getViewTemplateInfo(viewInfo.viewName); if (!templateInfo) { throw errors.Error("E3013", "dxView", viewInfo.viewName) } viewInfo.viewTemplateInfo = templateInfo; viewInfo.layoutController = this._resolveLayoutController(viewInfo); return viewInfo }, _createViewModel: function(viewInfo) { this.callBase(viewInfo); extendUtils.extendFromObject(viewInfo.model, viewInfo.viewTemplateInfo) }, _initLayoutControllers: function() { var that = this; $.each(that._layoutSet, function(index, controllerInfo) { var controller = controllerInfo.controller, target = devices.current(); if (commonUtils.findBestMatches(target, [controllerInfo]).length) { that._availableLayoutControllers.push(controllerInfo); if (controller.init) { controller.init({ app: that, $viewPort: that._$viewPort, navigationManager: that.navigationManager, viewEngine: that.viewEngine, templateContext: that._templateContext, commandManager: that.commandManager }) } if (controller.on) { controller.on("viewReleased", function(viewInfo) { that._onViewReleased(viewInfo) }); controller.on("viewHidden", function(viewInfo) { that._onViewHidden(viewInfo) }); controller.on("viewRendered", function(viewInfo) { that._processEvent("viewRendered", { viewInfo: viewInfo }, viewInfo.model) }); controller.on("viewShowing", function(viewInfo, direction) { that._processEvent("viewShowing", { viewInfo: viewInfo, direction: direction, params: viewInfo.routeData }, viewInfo.model) }); controller.on("viewShown", function(viewInfo, direction) { that._processEvent("viewShown", { viewInfo: viewInfo, direction: direction, params: viewInfo.routeData }, viewInfo.model) }) } } }) }, _onViewReleased: function(viewInfo) { this._releaseViewLink(viewInfo) }, renderNavigation: function() { var that = this; $.each(that._availableLayoutControllers, function(index, controllerInfo) { var controller = controllerInfo.controller; if (controller.renderNavigation) { controller.renderNavigation(that.navigation) } }) }, getViewTemplate: function(viewName) { return this.viewEngine.getViewTemplate(viewName) }, getViewTemplateInfo: function(viewName) { var viewComponent = this.viewEngine.getViewTemplateInfo(viewName); return viewComponent && viewComponent.option() }, loadTemplates: function(source) { return this.viewEngine.loadTemplates(source) }, templateContext: function() { return this._templateContext } }); module.exports = HtmlApplication }, /*!*************************************!*\ !*** ./js/framework/application.js ***! \*************************************/ function(module, exports, __webpack_require__) { var BACK_COMMAND_TITLE, $ = __webpack_require__( /*! ../core/renderer */ 9), Class = __webpack_require__( /*! ../core/class */ 25), abstract = Class.abstract, Action = __webpack_require__( /*! ../core/action */ 49), commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), typeUtils = __webpack_require__( /*! ../core/utils/type */ 12), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, mergeCommands = __webpack_require__( /*! ./utils */ 131).utils.mergeCommands, createActionExecutors = __webpack_require__( /*! ./action_executors */ 132).createActionExecutors, Router = __webpack_require__( /*! ./router */ 123), NavigationManager = __webpack_require__( /*! ./navigation_manager */ 133), StateManager = __webpack_require__( /*! ./state_manager */ 124), dxCommand = __webpack_require__( /*! ./command */ 121), messageLocalization = __webpack_require__( /*! ../localization/message */ 89), CommandMapping = __webpack_require__( /*! ./command_mapping */ 136), ViewCache = __webpack_require__( /*! ./view_cache */ 125), EventsMixin = __webpack_require__( /*! ../core/events_mixin */ 51), sessionStorage = __webpack_require__( /*! ../core/utils/storage */ 54).sessionStorage, dataUtils = __webpack_require__( /*! ../data/utils */ 137), errors = __webpack_require__( /*! ./errors */ 122), when = __webpack_require__( /*! ../integration/jquery/deferred */ 16).when, INIT_IN_PROGRESS = "InProgress", INIT_COMPLETE = "Inited"; var Application = Class.inherit({ ctor: function(options) { options = options || {}; this._options = options; this.namespace = options.namespace || window; this._applicationMode = options.mode ? options.mode : "mobileApp"; this.components = []; BACK_COMMAND_TITLE = messageLocalization.localizeString("@Back"); this.router = options.router || new Router; var navigationManagers = { mobileApp: NavigationManager.StackBasedNavigationManager, webSite: NavigationManager.HistoryBasedNavigationManager }; this.navigationManager = options.navigationManager || new navigationManagers[this._applicationMode]({ keepPositionInStack: "keepHistory" === options.navigateToRootViewMode }); this.navigationManager.on("navigating", this._onNavigating.bind(this)); this.navigationManager.on("navigatingBack", this._onNavigatingBack.bind(this)); this.navigationManager.on("navigated", this._onNavigated.bind(this)); this.navigationManager.on("navigationCanceled", this._onNavigationCanceled.bind(this)); this.stateManager = options.stateManager || new StateManager({ storage: options.stateStorage || sessionStorage() }); this.stateManager.addStateSource(this.navigationManager); this.viewCache = this._createViewCache(options); this.commandMapping = this._createCommandMapping(options.commandMapping); this.createNavigation(options.navigation); this._isNavigating = false; this._viewLinksHash = {}; Action.registerExecutor(createActionExecutors(this)); this.components.push(this.router); this.components.push(this.navigationManager) }, _createViewCache: function(options) { var result; if (options.viewCache) { result = options.viewCache } else { if (options.disableViewCache) { result = new ViewCache.NullViewCache } else { result = new ViewCache.CapacityViewCacheDecorator({ size: options.viewCacheSize, viewCache: new ViewCache }) } } result.on("viewRemoved", function(e) { this._releaseViewLink(e.viewInfo) }.bind(this)); return result }, _createCommandMapping: function(commandMapping) { var result = commandMapping; if (!(commandMapping instanceof CommandMapping)) { result = new CommandMapping; result.load(CommandMapping.defaultMapping || {}).load(commandMapping || {}) } return result }, createNavigation: function(navigationConfig) { this.navigation = this._createNavigationCommands(navigationConfig); this._mapNavigationCommands(this.navigation, this.commandMapping) }, _createNavigationCommands: function(commandConfig) { if (!commandConfig) { return [] } var generatedIdCount = 0; return $.map(commandConfig, function(item) { var command; if (item instanceof dxCommand) { command = item } else { command = new dxCommand(extend({ root: true }, item)) } if (!command.option("id")) { command.option("id", "navigation_" + generatedIdCount++) } return command }) }, _mapNavigationCommands: function(navigationCommands, commandMapping) { var navigationCommandIds = $.map(navigationCommands, function(command) { return command.option("id") }); commandMapping.mapCommands("global-navigation", navigationCommandIds) }, _callComponentMethod: function(methodName, args) { var tasks = []; $.each(this.components, function(index, component) { if (component[methodName] && commonUtils.isFunction(component[methodName])) { var result = component[methodName](args); if (result && result.done) { tasks.push(result) } } }); return when.apply($, tasks) }, init: function() { var that = this; that._initState = INIT_IN_PROGRESS; return that._callComponentMethod("init").done(function() { that._initState = INIT_COMPLETE; that._processEvent("initialized") }).fail(function(error) { throw error || errors.Error("E3022") }) }, _onNavigatingBack: function(args) { this._processEvent("navigatingBack", args) }, _onNavigating: function(args) { var that = this; if (that._isNavigating) { that._pendingNavigationArgs = args; args.cancel = true; return } else { that._isNavigating = true; delete that._pendingNavigationArgs } var routeData = this.router.parse(args.uri); if (!routeData) { throw errors.Error("E3001", args.uri) } var uri = this.router.format(routeData); if (args.uri !== uri && uri) { args.cancel = true; args.cancelReason = "redirect"; commonUtils.executeAsync(function() { that.navigate(uri, args.options) }) } else { that._processEvent("navigating", args) } }, _onNavigated: function(args) { var resultDeferred, that = this, direction = args.options.direction, viewInfo = that._acquireViewInfo(args.item, args.options); if (!viewInfo.model) { this._processEvent("beforeViewSetup", { viewInfo: viewInfo }); that._createViewModel(viewInfo); that._createViewCommands(viewInfo); this._processEvent("afterViewSetup", { viewInfo: viewInfo }) } that._highlightCurrentNavigationCommand(viewInfo); resultDeferred = that._showView(viewInfo, direction).always(function() { that._isNavigating = false; var pendingArgs = that._pendingNavigationArgs; if (pendingArgs) { commonUtils.executeAsync(function() { that.navigate(pendingArgs.uri, pendingArgs.options) }) } }); return resultDeferred }, _isViewReadyToShow: function(viewInfo) { return !!viewInfo.model }, _onNavigationCanceled: function(args) { var that = this; if (!that._pendingNavigationArgs || that._pendingNavigationArgs.uri !== args.uri) { var currentItem = that.navigationManager.currentItem(); if (currentItem) { commonUtils.executeAsync(function() { var viewInfo = that._acquireViewInfo(currentItem, args.options); that._highlightCurrentNavigationCommand(viewInfo, true) }) } that._isNavigating = false } }, _disposeRemovedViews: function() { var args, that = this; $.each(that._viewLinksHash, function(key, link) { if (!link.linkCount) { args = { viewInfo: link.viewInfo }; that._processEvent("viewDisposing", args, args.viewInfo.model); that._disposeView(link.viewInfo); that._processEvent("viewDisposed", args, args.viewInfo.model); delete that._viewLinksHash[key] } }) }, _onViewHidden: function(viewInfo) { var args = { viewInfo: viewInfo }; this._processEvent("viewHidden", args, args.viewInfo.model) }, _disposeView: function(viewInfo) { var commands = viewInfo.commands || []; $.each(commands, function(index, command) { command._dispose() }) }, _acquireViewInfo: function(navigationItem, navigateOptions) { var routeData = this.router.parse(navigationItem.uri), viewInfoKey = this._getViewInfoKey(navigationItem, routeData), viewInfo = this.viewCache.getView(viewInfoKey); if (!viewInfo) { viewInfo = this._createViewInfo(navigationItem, navigateOptions); this._obtainViewLink(viewInfo); this.viewCache.setView(viewInfoKey, viewInfo) } else { this._updateViewInfo(viewInfo, navigationItem, navigateOptions) } return viewInfo }, _getViewInfoKey: function(navigationItem, routeData) { var args = { key: navigationItem.key, navigationItem: navigationItem, routeData: routeData }; this._processEvent("resolveViewCacheKey", args); return args.key }, _processEvent: function(eventName, args, model) { this._callComponentMethod(eventName, args); this.fireEvent(eventName, args && [args]); var modelMethod = (model || {})[eventName]; if (modelMethod) { modelMethod.call(model, args) } }, _updateViewInfo: function(viewInfo, navigationItem, navigateOptions) { var uri = navigationItem.uri, routeData = this.router.parse(uri); viewInfo.viewName = routeData.view; viewInfo.routeData = routeData; viewInfo.uri = uri; viewInfo.navigateOptions = navigateOptions; viewInfo.canBack = this.canBack(navigateOptions.stack); viewInfo.previousViewInfo = this._getPreviousViewInfo(navigateOptions) }, _createViewInfo: function(navigationItem, navigateOptions) { var uri = navigationItem.uri, routeData = this.router.parse(uri), viewInfo = { key: this._getViewInfoKey(navigationItem, routeData) }; this._updateViewInfo(viewInfo, navigationItem, navigateOptions); return viewInfo }, _createViewModel: function(viewInfo) { viewInfo.model = viewInfo.model || this._callViewCodeBehind(viewInfo) }, _createViewCommands: function(viewInfo) { viewInfo.commands = viewInfo.model.commands || []; if (viewInfo.canBack && "webSite" !== this._applicationMode) { this._appendBackCommand(viewInfo) } }, _callViewCodeBehind: function(viewInfo) { var setupFunc = commonUtils.noop, routeData = viewInfo.routeData; if (routeData.view in this.namespace) { setupFunc = this.namespace[routeData.view] } return setupFunc.call(this.namespace, routeData, viewInfo) || {} }, _appendBackCommand: function(viewInfo) { var commands = viewInfo.commands, that = this, backTitle = BACK_COMMAND_TITLE; if (that._options.useViewTitleAsBackText) { backTitle = ((viewInfo.previousViewInfo || {}).model || {}).title || backTitle } var toMergeTo = [new dxCommand({ id: "back", title: backTitle, behavior: "back", onExecute: function() { that.back({ stack: viewInfo.navigateOptions.stack }) }, icon: "arrowleft", type: "back", renderStage: that._options.useViewTitleAsBackText ? "onViewRendering" : "onViewShown" })]; var result = mergeCommands(toMergeTo, commands); commands.length = 0; commands.push.apply(commands, result) }, _showView: function(viewInfo, direction) { var that = this; var eventArgs = { viewInfo: viewInfo, direction: direction, params: viewInfo.routeData }; dataUtils.processRequestResultLock.obtain(); return that._showViewImpl(eventArgs.viewInfo, eventArgs.direction).done(function() { commonUtils.executeAsync(function() { dataUtils.processRequestResultLock.release(); that._processEvent("viewShown", eventArgs, viewInfo.model); that._disposeRemovedViews() }) }) }, _highlightCurrentNavigationCommand: function(viewInfo, forceUpdate) { var selectedCommand, that = this, currentNavigationItemId = viewInfo.model && viewInfo.model.currentNavigationItemId; if (void 0 !== currentNavigationItemId) { $.each(this.navigation, function(index, command) { if (command.option("id") === currentNavigationItemId) { selectedCommand = command; return false } }) } if (!selectedCommand) { $.each(this.navigation, function(index, command) { var commandUri = command.option("onExecute"); if (commonUtils.isString(commandUri)) { commandUri = commandUri.replace(/^#+/, ""); if (commandUri === that.navigationManager.rootUri()) { selectedCommand = command; return false } } }) } $.each(this.navigation, function(index, command) { if (forceUpdate && command === selectedCommand && command.option("highlighted")) { command.fireEvent("optionChanged", [{ name: "highlighted", value: true, previousValue: true }]) } command.option("highlighted", command === selectedCommand) }) }, _showViewImpl: abstract, _obtainViewLink: function(viewInfo) { var key = viewInfo.key; if (!this._viewLinksHash[key]) { this._viewLinksHash[key] = { viewInfo: viewInfo, linkCount: 1 } } else { this._viewLinksHash[key].linkCount++ } }, _releaseViewLink: function(viewInfo) { if (void 0 === this._viewLinksHash[viewInfo.key]) { errors.log("W3001", viewInfo.key) } if (0 === this._viewLinksHash[viewInfo.key].linkCount) { errors.log("W3002", viewInfo.key) } this._viewLinksHash[viewInfo.key].linkCount-- }, navigate: function(uri, options) { var that = this; if (typeUtils.isPlainObject(uri)) { uri = that.router.format(uri); if (false === uri) { throw errors.Error("E3002") } } if (!that._initState) { that.init().done(function() { that.restoreState(); that.navigate(uri, options) }) } else { if (that._initState === INIT_COMPLETE) { if (!that._isNavigating || uri) { that.navigationManager.navigate(uri, options) } } else { throw errors.Error("E3003") } } }, canBack: function(stackKey) { return this.navigationManager.canBack(stackKey) }, _getPreviousViewInfo: function(navigateOptions) { var result, previousNavigationItem = this.navigationManager.previousItem(navigateOptions.stack); if (previousNavigationItem) { var routeData = this.router.parse(previousNavigationItem.uri); result = this.viewCache.getView(this._getViewInfoKey(previousNavigationItem, routeData)) } return result }, back: function(options) { this.navigationManager.back(options) }, saveState: function() { this.stateManager.saveState() }, restoreState: function() { this.stateManager.restoreState() }, clearState: function() { this.stateManager.clearState() } }).include(EventsMixin); exports.Application = Application }, /*!*******************************!*\ !*** ./js/framework/utils.js ***! \*******************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), ko = __webpack_require__( /*! knockout */ 93), KoTemplate = __webpack_require__( /*! ../integration/knockout/template */ 105); var mergeWithReplace = function(targetArray, arrayToMerge, needReplaceFn) { var result = []; for (var i = 0, length = targetArray.length; i < length; i++) { if (!needReplaceFn(targetArray[i], arrayToMerge)) { result.push(targetArray[i]) } } result.push.apply(result, arrayToMerge); return result }; var prepareCommandToReplace = function(targetCommand, commandsToMerge) { var needToReplace = false; $.each(commandsToMerge, function(_, commandToMerge) { var idEqual = targetCommand.option("id") === commandToMerge.option("id") && commandToMerge.option("id"), behaviorEqual = targetCommand.option("behavior") === commandToMerge.option("behavior") && targetCommand.option("behavior"); needToReplace = idEqual || behaviorEqual; if (behaviorEqual && null === commandToMerge.option("onExecute")) { commandToMerge.option("onExecute", targetCommand.option("onExecute")) } if (needToReplace) { targetCommand.element().remove(); return false } }); return needToReplace }; var mergeCommands = function(targetCommands, commandsToMerge) { return mergeWithReplace(targetCommands, commandsToMerge, prepareCommandToReplace) }; var resolvePropertyValue = function(command, containerOptions, propertyName, defaultValue) { var containerOption = containerOptions ? containerOptions[propertyName] : void 0, defaultOption = void 0 === containerOption ? defaultValue : containerOption, commandOption = command.option(propertyName); return void 0 === commandOption || commandOption === defaultValue ? defaultOption : commandOption }; var resolveTextValue = function(command, containerOptions) { var showText = resolvePropertyValue(command, containerOptions, "showText"), hasIcon = !!command.option("icon"), titleValue = resolvePropertyValue(command, containerOptions, "title", ""); return showText || !hasIcon ? titleValue : "" }; var resolveIconValue = function(command, containerOptions) { var showIcon = resolvePropertyValue(command, containerOptions, "showIcon"), hasText = !!command.option("title"), iconValue = resolvePropertyValue(command, containerOptions, "icon", ""); return showIcon || !hasText ? iconValue : "" }; exports.utils = { mergeCommands: mergeCommands, commandToContainer: { resolveIconValue: resolveIconValue, resolveTextValue: resolveTextValue, resolvePropertyValue: resolvePropertyValue } }; exports.templateProvider = { createTemplate: function(element) { return new KoTemplate(element) }, applyTemplate: function(element, model) { ko.applyBindings(model, element) } } }, /*!******************************************!*\ !*** ./js/framework/action_executors.js ***! \******************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), dataCoreUtils = __webpack_require__( /*! ../core/utils/data */ 50), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, isPlainObject = __webpack_require__( /*! ../core/utils/type */ 12).isPlainObject, Route = __webpack_require__( /*! ./router */ 123).Route; function prepareNavigateOptions(options, actionArguments) { if (actionArguments.args) { var sourceEventArguments = actionArguments.args[0]; options.jQueryEvent = sourceEventArguments.jQueryEvent } if ("dxCommand" === (actionArguments.component || {}).NAME) { extend(options, actionArguments.component.option()) } } function preventDefaultLinkBehavior(e) { if (!e) { return } var $targetElement = $(e.target); if ($targetElement.attr("href")) { e.preventDefault() } } var createActionExecutors = function(app) { return { routing: { execute: function(e) { var routeValues, uri, action = e.action, options = {}; if (isPlainObject(action)) { routeValues = action.routeValues; if (routeValues && isPlainObject(routeValues)) { options = action.options } else { routeValues = action } uri = app.router.format(routeValues); prepareNavigateOptions(options, e); preventDefaultLinkBehavior(options.jQueryEvent); app.navigate(uri, options); e.handled = true } } }, hash: { execute: function(e) { if ("string" !== typeof e.action || "#" !== e.action.charAt(0)) { return } var uriTemplate = e.action.substr(1), args = e.args[0], uri = uriTemplate; var defaultEvaluate = function(expr) { var getter = dataCoreUtils.compileGetter(expr), model = e.args[0].model; return getter(model) }; var evaluate = args.evaluate || defaultEvaluate; uri = uriTemplate.replace(/\{([^}]+)\}/g, function(entry, expr) { expr = $.trim(expr); if (expr.indexOf(",") > -1) { expr = $.map(expr.split(","), $.trim) } var value = evaluate(expr); if (void 0 === value) { value = "" } value = Route.prototype.formatSegment(value); return value }); var options = {}; prepareNavigateOptions(options, e); preventDefaultLinkBehavior(options.jQueryEvent); app.navigate(uri, options); e.handled = true } }, url: { execute: function(e) { if ("string" === typeof e.action && "#" !== e.action.charAt(0)) { document.location = e.action } } } } }; exports.createActionExecutors = createActionExecutors }, /*!********************************************!*\ !*** ./js/framework/navigation_manager.js ***! \********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), Class = __webpack_require__( /*! ../core/class */ 25), commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), isPlainObject = __webpack_require__( /*! ../core/utils/type */ 12).isPlainObject, extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, navigationDevices = __webpack_require__( /*! ./navigation_devices */ 134), EventsMixin = __webpack_require__( /*! ../core/events_mixin */ 51), errors = __webpack_require__( /*! ./errors */ 122), hardwareBackButton = __webpack_require__( /*! ../mobile/process_hardware_back_button */ 64).processCallback, hideTopOverlay = __webpack_require__( /*! ../mobile/hide_top_overlay */ 65), when = __webpack_require__( /*! ../integration/jquery/deferred */ 16).when; var NAVIGATION_TARGETS = { current: "current", blank: "blank", back: "back" }, STORAGE_HISTORY_KEY = "__history"; var HistoryBasedNavigationManager = Class.inherit({ ctor: function(options) { options = options || {}; this._currentItem = void 0; this._previousItem = void 0; this._createNavigationDevice(options) }, _createNavigationDevice: function(options) { this._navigationDevice = options.navigationDevice || new navigationDevices.HistoryBasedNavigationDevice; this._navigationDevice.uriChanged.add(this._uriChangedHandler.bind(this)) }, _uriChangedHandler: function(uri) { while (hideTopOverlay()) {} this.navigate(uri) }, _syncUriWithCurrentNavigationItem: function() { var currentUri = this._currentItem && this._currentItem.uri; this._navigationDevice.setUri(currentUri, true) }, _cancelNavigation: function(args) { this._syncUriWithCurrentNavigationItem(); this.fireEvent("navigationCanceled", [args]) }, _getDefaultOptions: function() { return { direction: "none", target: NAVIGATION_TARGETS.blank } }, _updateHistory: function(uri, options) { this._previousItem = this._currentItem; this._currentItem = { uri: uri, key: uri }; this._navigationDevice.setUri(uri, options.target === NAVIGATION_TARGETS.current) }, _setCurrentItem: function(item) { this._currentItem = item }, navigate: function(uri, options) { options = options || {}; var args, that = this, isFirstNavigate = !that._currentItem, currentItem = that._currentItem || {}, targetItem = options.item || {}, currentUri = currentItem.uri, currentKey = currentItem.key, targetKey = targetItem.key; if (void 0 === uri) { uri = that._navigationDevice.getUri() } if (/^_back$/.test(uri)) { that.back(); return } options = extend(that._getDefaultOptions(), options || {}); if (isFirstNavigate) { options.target = NAVIGATION_TARGETS.current } args = { currentUri: currentUri, uri: uri, cancel: false, navigateWhen: [], options: options }; that.fireEvent("navigating", [args]); uri = args.uri; if (args.cancel || currentUri === uri && (void 0 === targetKey || targetKey === currentKey) && !that._forceNavigate) { that._cancelNavigation(args) } else { that._forceNavigate = false; when.apply($, args.navigateWhen).done(function() { commonUtils.executeAsync(function() { that._updateHistory(uri, options); that.fireEvent("navigated", [{ uri: uri, previousUri: currentUri, options: options, item: that._currentItem }]) }) }) } }, back: function() { return this._navigationDevice.back() }, previousItem: function() { return this._previousItem }, currentItem: function(item) { if (arguments.length > 0) { if (!item) { throw errors.Error("E3023") } this._setCurrentItem(item) } else { return this._currentItem } }, rootUri: function() { return this._currentItem && this._currentItem.uri }, canBack: function() { return true }, saveState: commonUtils.noop, restoreState: commonUtils.noop, removeState: commonUtils.noop }).include(EventsMixin); var StackBasedNavigationManager = HistoryBasedNavigationManager.inherit({ ctor: function(options) { options = options || {}; this.callBase(options); this._createNavigationStacks(options); hardwareBackButton.add(this._deviceBackInitiated.bind(this)); this._stateStorageKey = options.stateStorageKey || STORAGE_HISTORY_KEY }, init: function() { return this._navigationDevice.init() }, _createNavigationDevice: function(options) { if (!options.navigationDevice) { options.navigationDevice = new navigationDevices.StackBasedNavigationDevice } this.callBase(options); this._navigationDevice.backInitiated.add(this._deviceBackInitiated.bind(this)) }, _uriChangedHandler: function(uri) { this.navigate(uri) }, _createNavigationStacks: function(options) { this.navigationStacks = {}; this._keepPositionInStack = options.keepPositionInStack; this.currentStack = new NavigationStack }, _deviceBackInitiated: function() { if (!hideTopOverlay()) { this.back({ isHardwareButton: true }) } else { this._syncUriWithCurrentNavigationItem() } }, _getDefaultOptions: function() { return { target: NAVIGATION_TARGETS.blank } }, _createNavigationStack: function() { var result = new NavigationStack; result.itemsRemoved.add(this._removeItems.bind(this)); return result }, _setCurrentItem: function(item) { this._setCurrentStack(item.stack); this.currentStack.currentItem(item); this.callBase(item); this._syncUriWithCurrentNavigationItem() }, _setCurrentStack: function(stackOrStackKey) { var stack, stackKey; if ("string" === typeof stackOrStackKey) { stackKey = stackOrStackKey; if (!(stackKey in this.navigationStacks)) { this.navigationStacks[stackKey] = this._createNavigationStack() } stack = this.navigationStacks[stackKey] } else { stack = stackOrStackKey; stackKey = $.map(this.navigationStacks, function(stack, key) { if (stack === stackOrStackKey) { return key } return null })[0] } this.currentStack = stack; this.currentStackKey = stackKey }, _getViewTargetStackKey: function(uri, isRoot) { var result; if (isRoot) { if (void 0 !== this.navigationStacks[uri]) { result = uri } else { for (var stackKey in this.navigationStacks) { if (this.navigationStacks[stackKey].items[0].uri === uri) { result = stackKey; break } } result = result || uri } } else { result = this.currentStackKey || uri } return result }, _updateHistory: function(uri, options) { var isRoot = options.root, forceIsRoot = isRoot, forceToRoot = false, previousStack = this.currentStack, keepPositionInStack = void 0 !== options.keepPositionInStack ? options.keepPositionInStack : this._keepPositionInStack; options.stack = options.stack || this._getViewTargetStackKey(uri, isRoot); this._setCurrentStack(options.stack); if (isRoot || !this.currentStack.items.length) { forceToRoot = this.currentStack === previousStack; forceIsRoot = true } if (isRoot && this.currentStack.items.length) { if (!keepPositionInStack || forceToRoot) { this.currentStack.currentIndex = 0; if (this.currentItem().uri !== uri) { this.currentStack.navigate(uri, true) } } options.direction = options.direction || "none" } else { var prevIndex = this.currentStack.currentIndex, prevItem = this.currentItem() || {}; switch (options.target) { case NAVIGATION_TARGETS.blank: this.currentStack.navigate(uri); break; case NAVIGATION_TARGETS.current: this.currentStack.navigate(uri, true); break; case NAVIGATION_TARGETS.back: if (this.currentStack.currentIndex > 0) { this.currentStack.back(uri) } else { this.currentStack.navigate(uri, true) } break; default: throw errors.Error("E3006", options.target) } if (void 0 === options.direction) { var indexDelta = this.currentStack.currentIndex - prevIndex; if (indexDelta < 0) { options.direction = this.currentStack.currentItem().backDirection || "backward" } else { if (indexDelta > 0 && this.currentStack.currentIndex > 0) { options.direction = "forward" } else { options.direction = "none" } } } prevItem.backDirection = "forward" === options.direction ? "backward" : "none" } options.root = forceIsRoot; this._currentItem = this.currentStack.currentItem(); this._syncUriWithCurrentNavigationItem() }, _removeItems: function(items) { var that = this; $.each(items, function(index, item) { that.fireEvent("itemRemoved", [item]) }) }, back: function(options) { options = options || {}; var navigatingBackArgs = extend({ cancel: false }, options); this.fireEvent("navigatingBack", [navigatingBackArgs]); if (navigatingBackArgs.cancel) { this._syncUriWithCurrentNavigationItem(); return } var item = this.previousItem(navigatingBackArgs.stack); if (item) { this.navigate(item.uri, { stack: navigatingBackArgs.stack, target: NAVIGATION_TARGETS.back, item: item }) } else { this.callBase() } }, rootUri: function() { return this.currentStack.items.length ? this.currentStack.items[0].uri : this.callBase() }, canBack: function(stackKey) { var stack = stackKey ? this.navigationStacks[stackKey] : this.currentStack; return stack ? stack.canBack() : false }, saveState: function(storage) { if (this.currentStack.items.length) { var state = { navigationStacks: {}, currentStackKey: this.currentStackKey }; $.each(this.navigationStacks, function(stackKey, stack) { var stackState = {}; state.navigationStacks[stackKey] = stackState; stackState.currentIndex = stack.currentIndex; stackState.items = $.map(stack.items, function(item) { return { key: item.key, uri: item.uri } }) }); var json = JSON.stringify(state); storage.setItem(this._stateStorageKey, json) } else { this.removeState(storage) } }, restoreState: function(storage) { if (this.disableRestoreState) { return } var json = storage.getItem(this._stateStorageKey); if (json) { try { var that = this, state = JSON.parse(json); $.each(state.navigationStacks, function(stackKey, stackState) { var stack = that._createNavigationStack(); that.navigationStacks[stackKey] = stack; stack.currentIndex = stackState.currentIndex; stack.items = $.map(stackState.items, function(item) { item.stack = stack; return item }) }); this.currentStackKey = state.currentStackKey; this.currentStack = this.navigationStacks[this.currentStackKey]; this._currentItem = this.currentStack.currentItem(); this._navigationDevice.setUri(this.currentItem().uri); this._forceNavigate = true } catch (e) { this.removeState(storage); throw errors.Error("E3007") } } }, removeState: function(storage) { storage.removeItem(this._stateStorageKey) }, currentIndex: function() { return this.currentStack.currentIndex }, previousItem: function(stackKey) { var stack = this.navigationStacks[stackKey] || this.currentStack; return stack.previousItem() }, getItemByIndex: function(index) { return this.currentStack.items[index] }, clearHistory: function() { this._createNavigationStacks({ keepPositionInStack: this._keepPositionInStack }) }, itemByKey: function(itemKey) { var result; $.each(this.navigationStacks, function(stackKey, stack) { var item = stack.itemByKey(itemKey); if (item) { result = item; return false } }); return result }, currentItem: function(itemOrItemKey) { var item; if (arguments.length > 0) { if ("string" === typeof itemOrItemKey) { item = this.itemByKey(itemOrItemKey) } else { if (isPlainObject(itemOrItemKey)) { item = itemOrItemKey } } this.callBase(item) } else { return this.callBase() } } }); var NavigationStack = Class.inherit({ ctor: function(options) { options = options || {}; this.itemsRemoved = $.Callbacks(); this.clear() }, currentItem: function(item) { if (item) { for (var i = 0; i < this.items.length; i++) { if (item === this.items[i]) { this.currentIndex = i; break } } } else { return this.items[this.currentIndex] } }, previousItem: function() { return this.items.length > 1 ? this.items[this.currentIndex - 1] : void 0 }, canBack: function() { return this.currentIndex > 0 }, clear: function() { this._deleteItems(this.items); this.items = []; this.currentIndex = -1 }, back: function(uri) { this.currentIndex--; if (this.currentIndex < 0) { throw errors.Error("E3008") } var currentItem = this.currentItem(); if (currentItem.uri !== uri) { this._updateItem(this.currentIndex, uri) } }, forward: function() { this.currentIndex++; if (this.currentIndex >= this.items.length) { throw errors.Error("E3009") } }, navigate: function(uri, replaceCurrent) { if (this.currentIndex < this.items.length && this.currentIndex > -1 && this.items[this.currentIndex].uri === uri) { return } if (replaceCurrent && this.currentIndex > -1) { this.currentIndex-- } if (this.currentIndex + 1 < this.items.length && this.items[this.currentIndex + 1].uri === uri) { this.currentIndex++ } else { var toDelete = this.items.splice(this.currentIndex + 1, this.items.length - this.currentIndex - 1); this.items.push({ stack: this }); this.currentIndex++; this._updateItem(this.currentIndex, uri); this._deleteItems(toDelete) } return this.currentItem() }, itemByKey: function(key) { for (var i = 0; i < this.items.length; i++) { var item = this.items[i]; if (item.key === key) { return item } } }, _updateItem: function(index, uri) { var item = this.items[index]; item.uri = uri; item.key = this.items[0].uri + "_" + index + "_" + uri }, _deleteItems: function(items) { if (items) { this.itemsRemoved.fire(items) } } }); HistoryBasedNavigationManager.NAVIGATION_TARGETS = NAVIGATION_TARGETS; exports.HistoryBasedNavigationManager = HistoryBasedNavigationManager; exports.StackBasedNavigationManager = StackBasedNavigationManager; exports.NavigationStack = NavigationStack }, /*!********************************************!*\ !*** ./js/framework/navigation_devices.js ***! \********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), noop = __webpack_require__( /*! ../core/utils/common */ 14).noop, Class = __webpack_require__( /*! ../core/class */ 25), browserAdapters = __webpack_require__( /*! ./browser_adapters */ 135), SessionStorage = __webpack_require__( /*! ../core/utils/storage */ 54).sessionStorage, devices = __webpack_require__( /*! ../core/devices */ 53); var SESSION_KEY = "dxPhoneJSApplication"; var HistoryBasedNavigationDevice = Class.inherit({ ctor: function(options) { options = options || {}; this._browserAdapter = options.browserAdapter || this._createBrowserAdapter(options); this.uriChanged = $.Callbacks(); this._browserAdapter.popState.add(this._onPopState.bind(this)) }, init: noop, getUri: function() { return this._browserAdapter.getHash() }, setUri: function(uri, replaceCurrent) { if (replaceCurrent) { return this._browserAdapter.replaceState(uri) } else { if (uri !== this.getUri()) { return this._browserAdapter.pushState(uri) } else { return $.Deferred().resolve().promise() } } }, back: function() { return this._browserAdapter.back() }, _onPopState: function() { this.uriChanged.fire(this.getUri()) }, _isBuggyAndroid2: function() { var realDevice = devices.real(); var version = realDevice.version; return "android" === realDevice.platform && version.length > 1 && (2 === version[0] && version[1] < 4 || version[0] < 2) }, _isBuggyAndroid4: function() { var realDevice = devices.real(); var version = realDevice.version; return "android" === realDevice.platform && version.length > 1 && 4 === version[0] && 0 === version[1] }, _isWindowsPhone8: function() { var realDevice = devices.real(); return "win" === realDevice.platform && realDevice.phone }, _createBrowserAdapter: function(options) { var result, sourceWindow = options.window || window, supportPushReplace = sourceWindow.history.replaceState && sourceWindow.history.pushState; if (this._isWindowsPhone8()) { result = new browserAdapters.BuggyCordovaWP81BrowserAdapter(options) } else { if (sourceWindow !== sourceWindow.top) { result = new browserAdapters.HistorylessBrowserAdapter(options) } else { if (this._isBuggyAndroid4()) { result = new browserAdapters.BuggyAndroidBrowserAdapter(options) } else { if (this._isBuggyAndroid2() || !supportPushReplace) { result = new browserAdapters.OldBrowserAdapter(options) } else { result = new browserAdapters.DefaultBrowserAdapter(options) } } } } return result } }); var StackBasedNavigationDevice = HistoryBasedNavigationDevice.inherit({ ctor: function(options) { this.callBase(options); this.backInitiated = $.Callbacks(); this._rootStateHandler = null; $(window).on("unload", this._saveBrowserState) }, init: function() { var that = this; if (that._browserAdapter.canWorkInPureBrowser) { return that._initRootPage().done(function() { if (that._browserAdapter.isRootPage()) { that._browserAdapter.pushState("") } }) } else { return $.Deferred().resolve().promise() } }, setUri: function(uri) { return this.callBase(uri, !this._browserAdapter.isRootPage()) }, _saveBrowserState: function() { var sessionStorage = SessionStorage(); if (sessionStorage) { sessionStorage.setItem(SESSION_KEY, true) } }, _initRootPage: function() { var hash = this.getUri(), sessionStorage = SessionStorage(); if (!sessionStorage || sessionStorage.getItem(SESSION_KEY)) { return $.Deferred().resolve().promise() } sessionStorage.removeItem(SESSION_KEY); this._browserAdapter.createRootPage(); return this._browserAdapter.pushState(hash) }, _onPopState: function() { if (this._browserAdapter.isRootPage()) { if (this._rootStateHandler) { this._rootStateHandler() } else { this.backInitiated.fire() } } else { if (!this._rootStateHandler) { this._createRootStateHandler() } this.back() } }, _createRootStateHandler: function() { var uri = this.getUri(); this._rootStateHandler = function() { this.uriChanged.fire(uri); this._rootStateHandler = null } } }); exports.HistoryBasedNavigationDevice = HistoryBasedNavigationDevice; exports.StackBasedNavigationDevice = StackBasedNavigationDevice }, /*!******************************************!*\ !*** ./js/framework/browser_adapters.js ***! \******************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), Class = __webpack_require__( /*! ../core/class */ 25), queue = __webpack_require__( /*! ../core/utils/queue */ 62); var ROOT_PAGE_URL = "__root__", BUGGY_ANDROID_BUFFER_PAGE_URL = "__buffer__"; var DefaultBrowserAdapter = Class.inherit({ ctor: function(options) { options = options || {}; this._window = options.window || window; this.popState = $.Callbacks(); $(this._window).on("hashchange", this._onHashChange.bind(this)); this._tasks = queue.create(); this.canWorkInPureBrowser = true }, replaceState: function(uri) { var that = this; return this._addTask(function() { uri = that._normalizeUri(uri); that._window.history.replaceState(null, null, "#" + uri); that._currentTask.resolve() }) }, pushState: function(uri) { var that = this; return this._addTask(function() { uri = that._normalizeUri(uri); that._window.history.pushState(null, null, "#" + uri); that._currentTask.resolve() }) }, createRootPage: function() { return this.replaceState(ROOT_PAGE_URL) }, _onHashChange: function() { if (this._currentTask) { this._currentTask.resolve() } this.popState.fire() }, back: function() { var that = this; return this._addTask(function() { that._window.history.back() }) }, getHash: function() { return this._normalizeUri(this._window.location.hash) }, isRootPage: function() { return this.getHash() === ROOT_PAGE_URL }, _normalizeUri: function(uri) { return (uri || "").replace(/^#+/, "") }, _addTask: function(task) { var that = this, d = $.Deferred(); this._tasks.add(function() { that._currentTask = d; task(); return d }); return d.promise() } }); var OldBrowserAdapter = DefaultBrowserAdapter.inherit({ ctor: function() { this._innerEventCount = 0; this.callBase.apply(this, arguments); this._skipNextEvent = false }, replaceState: function(uri) { var that = this; uri = that._normalizeUri(uri); if (that.getHash() !== uri) { that._addTask(function() { that._skipNextEvent = true; that._window.history.back() }); return that._addTask(function() { that._skipNextEvent = true; that._window.location.hash = uri }) } return $.Deferred().resolve().promise() }, pushState: function(uri) { var that = this; uri = this._normalizeUri(uri); if (this.getHash() !== uri) { return that._addTask(function() { that._skipNextEvent = true; that._window.location.hash = uri }) } return $.Deferred().resolve().promise() }, createRootPage: function() { return this.pushState(ROOT_PAGE_URL) }, _onHashChange: function() { var currentTask = this._currentTask; this._currentTask = null; if (this._skipNextEvent) { this._skipNextEvent = false } else { this.popState.fire() } if (currentTask) { currentTask.resolve() } } }); var BuggyAndroidBrowserAdapter = OldBrowserAdapter.inherit({ createRootPage: function() { this.pushState(BUGGY_ANDROID_BUFFER_PAGE_URL); return this.callBase() } }); var HistorylessBrowserAdapter = DefaultBrowserAdapter.inherit({ ctor: function(options) { options = options || {}; this._window = options.window || window; this.popState = $.Callbacks(); $(this._window).on("dxback", this._onHashChange.bind(this)); this._currentHash = this._window.location.hash }, replaceState: function(uri) { this._currentHash = this._normalizeUri(uri); return $.Deferred().resolve().promise() }, pushState: function(uri) { return this.replaceState(uri) }, createRootPage: function() { return this.replaceState(ROOT_PAGE_URL) }, getHash: function() { return this._normalizeUri(this._currentHash) }, back: function() { return this.replaceState(ROOT_PAGE_URL) }, _onHashChange: function() { var promise = this.back(); this.popState.fire(); return promise } }); var BuggyCordovaWP81BrowserAdapter = DefaultBrowserAdapter.inherit({ ctor: function(options) { this.callBase(options); this.canWorkInPureBrowser = false } }); exports.DefaultBrowserAdapter = DefaultBrowserAdapter; exports.OldBrowserAdapter = OldBrowserAdapter; exports.BuggyAndroidBrowserAdapter = BuggyAndroidBrowserAdapter; exports.HistorylessBrowserAdapter = HistorylessBrowserAdapter; exports.BuggyCordovaWP81BrowserAdapter = BuggyCordovaWP81BrowserAdapter }, /*!*****************************************!*\ !*** ./js/framework/command_mapping.js ***! \*****************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), Class = __webpack_require__( /*! ../core/class */ 25), grep = __webpack_require__( /*! ../core/utils/common */ 14).grep, extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../core/utils/array */ 26).inArray, errors = __webpack_require__( /*! ./errors */ 122); var CommandMapping = Class.inherit({ ctor: function() { this._commandMappings = {}; this._containerDefaults = {} }, setDefaults: function(containerId, defaults) { this._containerDefaults[containerId] = defaults; return this }, mapCommands: function(containerId, commandMappings) { var that = this; $.each(commandMappings, function(index, commandMapping) { if ("string" === typeof commandMapping) { commandMapping = { id: commandMapping } } var commandId = commandMapping.id; var mappings = that._commandMappings[containerId] || {}; mappings[commandId] = extend({ showIcon: true, showText: true }, that._containerDefaults[containerId] || {}, commandMapping); that._commandMappings[containerId] = mappings }); this._initExistingCommands(); return this }, unmapCommands: function(containerId, commandIds) { var that = this; $.each(commandIds, function(index, commandId) { var mappings = that._commandMappings[containerId] || {}; if (mappings) { delete mappings[commandId] } }); this._initExistingCommands() }, getCommandMappingForContainer: function(commandId, containerId) { return (this._commandMappings[containerId] || {})[commandId] }, checkCommandsExist: function(commands) { var that = this, result = grep(commands, function(commandName, index) { return inArray(commandName, that._existingCommands) < 0 && inArray(commandName, commands) === index }); if (0 !== result.length) { throw errors.Error("E3005", result.join("', '"), 1 === result.length ? " is" : "s are") } }, load: function(config) { if (!config) { return } var that = this; $.each(config, function(name, container) { that.setDefaults(name, container.defaults); that.mapCommands(name, container.commands) }); return this }, _initExistingCommands: function() { var that = this; this._existingCommands = []; $.each(that._commandMappings, function(name, _commands) { $.each(_commands, function(index, command) { if (inArray(command.id, that._existingCommands) < 0) { that._existingCommands.push(command.id) } }) }) } }); CommandMapping.defaultMapping = { "global-navigation": { defaults: { showIcon: true, showText: true }, commands: [] }, "ios-header-toolbar": { defaults: { showIcon: false, showText: true, location: "after" }, commands: ["edit", "save", { id: "back", location: "before" }, { id: "cancel", location: "before" }, { id: "create", showIcon: true, showText: false }] }, "ios-action-sheet": { defaults: { showIcon: false, showText: true }, commands: [] }, "ios-view-footer": { defaults: { showIcon: false, showText: true }, commands: [{ id: "delete", type: "danger" }] }, "android-header-toolbar": { defaults: { showIcon: true, showText: false, location: "after" }, commands: [{ id: "back", showIcon: false, location: "before" }, "create", { id: "save", showText: true, showIcon: false, location: "after" }, { id: "edit", showText: false, location: "after" }, { id: "cancel", showText: false, location: "before" }, { id: "delete", showText: false, location: "after" }] }, "android-simple-toolbar": { defaults: { showIcon: true, showText: false, location: "after" }, commands: [{ id: "back", showIcon: false, location: "before" }, { id: "create" }, { id: "save", showText: true, showIcon: false, location: "after" }, { id: "edit", showText: false, location: "after" }, { id: "cancel", showText: false, location: "before" }, { id: "delete", showText: false, location: "after" }] }, "android-footer-toolbar": { defaults: { location: "after" }, commands: [{ id: "create", showText: false, location: "center" }, { id: "edit", showText: false, location: "before" }, { id: "delete", locateInMenu: "always" }, { id: "save", showIcon: false, location: "before" }] }, "generic-header-toolbar": { defaults: { showIcon: false, showText: true, location: "after" }, commands: ["edit", "save", { id: "back", location: "before" }, { id: "cancel", location: "before" }, { id: "create", showIcon: true, showText: false }] }, "generic-view-footer": { defaults: { showIcon: false, showText: true }, commands: [{ id: "delete", type: "danger" }] }, "win8-appbar": { defaults: { location: "after" }, commands: ["edit", "cancel", "save", "delete", { id: "create", location: "before" }, { id: "refresh", location: "before" }] }, "win8-toolbar": { defaults: { showText: false, location: "before" }, commands: [{ id: "previousPage" }] }, "win8-phone-appbar": { defaults: { location: "center" }, commands: ["create", "edit", "cancel", "save", "refresh", { id: "delete", locateInMenu: "always" }] }, "win8-split-toolbar": { defaults: { showIcon: true, showText: false, location: "after" }, commands: [{ id: "back", showIcon: false, location: "before" }, { id: "create" }, { id: "save", showText: true, location: "before" }, { id: "edit", showText: true, locateInMenu: "always" }, { id: "cancel", showText: true, locateInMenu: "always" }, { id: "delete", showText: true, locateInMenu: "always" }] }, "win8-master-detail-toolbar": { defaults: { showText: false, location: "before" }, commands: ["back"] }, "win10-appbar": { defaults: { showText: false, location: "after" }, commands: [{ id: "back", location: "before" }, "edit", "cancel", "save", "delete", "create", "refresh"] }, "win10-phone-appbar": { defaults: { location: "after" }, commands: ["create", "edit", "cancel", "save", "refresh", { id: "delete", locateInMenu: "always" }] }, "desktop-toolbar": { defaults: { showIcon: false, showText: true, location: "after" }, commands: ["cancel", "create", "edit", "save", { id: "delete", type: "danger" }] } }; module.exports = CommandMapping }, /*!**************************!*\ !*** ./js/data/utils.js ***! \**************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), isFunction = __webpack_require__( /*! ../core/utils/common */ 14).isFunction, toComparable = __webpack_require__( /*! ../core/utils/data */ 50).toComparable; var normalizeBinaryCriterion = function(crit) { return [crit[0], crit.length < 3 ? "=" : String(crit[1]).toLowerCase(), crit.length < 2 ? true : crit[crit.length - 1]] }; var normalizeSortingInfo = function(info) { if (!Array.isArray(info)) { info = [info] } return $.map(info, function(i) { return { selector: isFunction(i) || "string" === typeof i ? i : i.getter || i.field || i.selector, desc: !!(i.desc || "d" === String(i.dir).charAt(0).toLowerCase()) } }) }; var errorMessageFromXhr = function() { var textStatusMessages = { timeout: "Network connection timeout", error: "Unspecified network error", parsererror: "Unexpected server response" }; var textStatusDetails = { timeout: "possible causes: the remote host is not accessible, overloaded or is not included into the domain white-list when being run in the native container", error: "if the remote host is located on another domain, make sure it properly supports cross-origin resource sharing (CORS), or use the JSONP approach instead", parsererror: "the remote host did not respond with valid JSON data" }; var explainTextStatus = function(textStatus) { var result = textStatusMessages[textStatus]; if (!result) { return textStatus } result += " (" + textStatusDetails[textStatus] + ")"; return result }; return function(xhr, textStatus) { if (xhr.status < 400) { return explainTextStatus(textStatus) } return xhr.statusText } }(); var aggregators = { count: { seed: 0, step: function(count) { return 1 + count } }, sum: { seed: 0, step: function(sum, item) { return sum + item } }, min: { step: function(min, item) { return item < min ? item : min } }, max: { step: function(max, item) { return item > max ? item : max } }, avg: { seed: [0, 0], step: function(pair, value) { return [pair[0] + value, pair[1] + 1] }, finalize: function(pair) { return pair[1] ? pair[0] / pair[1] : NaN } } }; var processRequestResultLock = function() { var lockDeferred, lockCount = 0; var obtain = function() { if (0 === lockCount) { lockDeferred = $.Deferred() } lockCount++ }; var release = function() { lockCount--; if (lockCount < 1) { lockDeferred.resolve() } }; var promise = function() { var deferred = 0 === lockCount ? $.Deferred().resolve() : lockDeferred; return deferred.promise() }; var reset = function() { lockCount = 0; if (lockDeferred) { lockDeferred.resolve() } }; return { obtain: obtain, release: release, promise: promise, reset: reset } }(); function isDisjunctiveOperator(condition) { return /^(or|\|\||\|)$/i.test(condition) } function isConjunctiveOperator(condition) { return /^(and|\&\&|\&)$/i.test(condition) } var keysEqual = function(keyExpr, key1, key2) { if (Array.isArray(keyExpr)) { var name, names = $.map(key1, function(v, k) { return k }); for (var i = 0; i < names.length; i++) { name = names[i]; if (toComparable(key1[name], true) != toComparable(key2[name], true)) { return false } } return true } return toComparable(key1, true) == toComparable(key2, true) }; var BASE64_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; var base64_encode = function(input) { if (!Array.isArray(input)) { input = stringToByteArray(String(input)) } var result = ""; function getBase64Char(index) { return BASE64_CHARS.charAt(index) } for (var i = 0; i < input.length; i += 3) { var octet1 = input[i], octet2 = input[i + 1], octet3 = input[i + 2]; result += $.map([octet1 >> 2, (3 & octet1) << 4 | octet2 >> 4, isNaN(octet2) ? 64 : (15 & octet2) << 2 | octet3 >> 6, isNaN(octet3) ? 64 : 63 & octet3], getBase64Char).join("") } return result }; var stringToByteArray = function(str) { var code, i, bytes = []; for (i = 0; i < str.length; i++) { code = str.charCodeAt(i); if (code < 128) { bytes.push(code) } else { if (code < 2048) { bytes.push(192 + (code >> 6), 128 + (63 & code)) } else { if (code < 65536) { bytes.push(224 + (code >> 12), 128 + (code >> 6 & 63), 128 + (63 & code)) } else { if (code < 2097152) { bytes.push(240 + (code >> 18), 128 + (code >> 12 & 63), 128 + (code >> 6 & 63), 128 + (63 & code)) } } } } } return bytes }; var isUnaryOperation = function(crit) { return "!" === crit[0] && Array.isArray(crit[1]) }; var utils = { normalizeBinaryCriterion: normalizeBinaryCriterion, normalizeSortingInfo: normalizeSortingInfo, errorMessageFromXhr: errorMessageFromXhr, aggregators: aggregators, keysEqual: keysEqual, isDisjunctiveOperator: isDisjunctiveOperator, isConjunctiveOperator: isConjunctiveOperator, processRequestResultLock: processRequestResultLock, isUnaryOperation: isUnaryOperation, base64_encode: base64_encode }; module.exports = utils }, /*!**************************************!*\ !*** ./js/framework/html/presets.js ***! \**************************************/ function(module, exports) { exports.layoutSets = {}; exports.animationSets = { "native": { "view-content-change": [{ animation: "slide" }, { animation: "ios7-slide", device: { platform: "ios" } }, { animation: "none", device: { deviceType: "desktop", platform: "generic" } }, { animation: "none", device: { grade: "C" } }], "view-header-toolbar": [{ animation: "ios7-toolbar" }, { animation: "slide", device: { grade: "B" } }, { animation: "none", device: { grade: "C" } }] }, "default": { "layout-change": [{ animation: "none" }, { animation: "ios7-slide", device: { platform: "ios" } }, { animation: "pop", device: { platform: "android" } }, { animation: "openDoor", device: { deviceType: "phone", platform: "win", version: [8] } }, { animation: "win-pop", device: { deviceType: "phone", platform: "win" } }], "view-content-change": [{ animation: "slide" }, { animation: "ios7-slide", device: { platform: "ios" } }, { animation: "fade", device: { deviceType: "desktop", platform: "generic" } }, { animation: "none", device: { grade: "C" } }], "view-content-rendered": [{ animation: "fade" }, { animation: "none", device: { grade: "C" } }], "view-header-toolbar": [{ animation: "ios7-toolbar" }, { animation: "slide", device: { grade: "B" } }, { animation: "none", device: { grade: "C" } }], "command-rendered-top": [{ animation: "stagger-fade-drop" }, { animation: "fade", device: { grade: "B" } }, { animation: "fade", device: { deviceType: "desktop" } }, { animation: "none", device: { grade: "C" } }, { animation: "none", device: { platform: "win", version: [10] } }], "command-rendered-bottom": [{ animation: "stagger-fade-rise" }, { animation: "fade", device: { grade: "B" } }, { animation: "fade", device: { deviceType: "desktop" } }, { animation: "none", device: { grade: "C" } }, { animation: "none", device: { platform: "win", version: [10] } }], "list-item-rendered": [{ animation: "stagger-3d-drop", device: { grade: "A" } }, { animation: "fade", device: { deviceType: "desktop" } }, { animation: "none", device: { grade: "C" } }], "detail-item-rendered": [{ animation: "stagger-3d-drop", device: { grade: "A" } }, { animation: "fade", device: { deviceType: "desktop" } }, { animation: "none", device: { grade: "C" } }], "edit-item-rendered": [{ animation: "stagger-3d-drop", device: { grade: "A" } }, { animation: "fade", device: { deviceType: "desktop" } }, { animation: "none", device: { grade: "C" } }] }, slide: { "view-content-change": [{ animation: "slide" }, { animation: "ios7-slide", device: { platform: "ios" } }, { animation: "fade", device: { deviceType: "desktop", platform: "generic" } }, { animation: "none", device: { grade: "C" } }], "view-content-rendered": [{ animation: "fade" }, { animation: "none", device: { grade: "C" } }], "view-header-toolbar": [{ animation: "ios7-toolbar" }, { animation: "slide", device: { grade: "B" } }, { animation: "none", device: { grade: "C" } }], "command-rendered-top": [{ animation: "stagger-fade-drop" }, { animation: "fade", device: { grade: "B" } }, { animation: "fade", device: { deviceType: "desktop" } }, { animation: "none", device: { grade: "C" } }], "command-rendered-bottom": [{ animation: "stagger-fade-rise" }, { animation: "fade", device: { grade: "B" } }, { animation: "fade", device: { deviceType: "desktop" } }, { animation: "none", device: { grade: "C" } }], "list-item-rendered": [{ animation: "stagger-fade-slide", device: { grade: "A" } }, { animation: "fade", device: { deviceType: "desktop" } }, { animation: "none", device: { grade: "C" } }], "detail-item-rendered": [{ animation: "stagger-fade-slide", device: { grade: "A" } }, { animation: "fade", device: { deviceType: "desktop" } }, { animation: "none", device: { grade: "C" } }], "edit-item-rendered": [{ animation: "stagger-fade-slide", device: { grade: "A" } }, { animation: "fade", device: { deviceType: "desktop" } }, { animation: "none", device: { grade: "C" } }] }, zoom: { "view-content-change": [{ animation: "slide" }, { animation: "ios7-slide", device: { platform: "ios" } }, { animation: "fade", device: { deviceType: "desktop", platform: "generic" } }, { animation: "none", device: { grade: "C" } }], "view-content-rendered": [{ animation: "fade" }, { animation: "none", device: { grade: "C" } }], "view-header-toolbar": [{ animation: "ios7-toolbar" }, { animation: "slide", device: { grade: "B" } }, { animation: "fade", device: { deviceType: "desktop" } }, { animation: "none", device: { grade: "C" } }], "command-rendered-top": [{ animation: "stagger-fade-zoom" }, { animation: "fade", device: { grade: "B" } }, { animation: "fade", device: { deviceType: "desktop" } }, { animation: "none", device: { grade: "C" } }], "command-rendered-bottom": [{ animation: "stagger-fade-zoom" }, { animation: "fade", device: { grade: "B" } }, { animation: "fade", device: { deviceType: "desktop" } }, { animation: "none", device: { grade: "C" } }], "list-item-rendered": [{ animation: "stagger-fade-zoom", device: { grade: "A" } }, { animation: "fade", device: { deviceType: "desktop" } }, { animation: "none", device: { grade: "C" } }], "detail-item-rendered": [{ animation: "stagger-fade-zoom", device: { grade: "A" } }, { animation: "fade", device: { deviceType: "desktop" } }, { animation: "none", device: { grade: "C" } }], "edit-item-rendered": [{ animation: "stagger-fade-zoom", device: { grade: "A" } }, { animation: "fade", device: { deviceType: "desktop" } }, { animation: "none", device: { grade: "C" } }] } } }, /*!**********************************************!*\ !*** ./js/framework/html/command_manager.js ***! \**********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, errors = __webpack_require__( /*! ../errors */ 122), CommandMapping = __webpack_require__( /*! ../command_mapping */ 136), commandToDXWidgetAdapters = __webpack_require__( /*! ./widget_command_adapters */ 140), when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when; __webpack_require__( /*! ../command */ 121); __webpack_require__( /*! ./command_container */ 126); var CommandManager = Class.inherit({ ctor: function(options) { options = options || {}; this.defaultWidgetAdapter = options.defaultWidgetAdapter || this._getDefaultWidgetAdapter(); this.commandMapping = options.commandMapping || new CommandMapping }, _getDefaultWidgetAdapter: function() { return { addCommand: noop, clearContainer: noop } }, _getContainerAdapter: function($container) { var componentNames = $container.data("dxComponents"), adapters = commandToDXWidgetAdapters; if (componentNames) { for (var index in componentNames) { var widgetName = componentNames[index]; if (widgetName in adapters) { return adapters[widgetName] } } } return this.defaultWidgetAdapter }, findCommands: function($items) { var items = $items.find(".dx-command").add($items.filter(".dx-command")); var result = $.map(items, function(element) { return $(element).dxCommand("instance") }); return result }, findCommandContainers: function($markup) { var result = $.map($markup.find(".dx-command-container"), function(element) { return $(element).dxCommandContainer("instance") }); return result }, _checkCommandId: function(id, command) { if (null === id) { throw errors.Error("E3010", command.element().get(0).outerHTML) } }, renderCommandsToContainers: function(commands, containers) { var that = this, commandHash = {}, commandIds = [], deferreds = []; $.each(commands, function(i, command) { var id = command.option("id"); that._checkCommandId(id, command); commandIds.push(id); commandHash[id] = command }); that.commandMapping.checkCommandsExist(commandIds); $.each(containers, function(k, container) { var commandInfos = []; $.each(commandHash, function(id, command) { var commandId = id; var commandOptions = that.commandMapping.getCommandMappingForContainer(commandId, container.option("id")); if (commandOptions) { commandInfos.push({ command: command, options: commandOptions }) } }); if (commandInfos.length) { var deferred = that._attachCommandsToContainer(container.element(), commandInfos); if (deferred) { deferreds.push(deferred) } } }); return when.apply($, deferreds) }, clearContainer: function(container) { var $container = container.element(), adapter = this._getContainerAdapter($container); adapter.clearContainer($container) }, _arrangeCommandsToContainers: function(commands, containers) { errors.log("W0002", "CommandManager", "_arrangeCommandsToContainers", "14.1", "Use the 'renderCommandsToContainers' method instead."); this.renderCommandsToContainers(commands, containers) }, _attachCommandsToContainer: function($container, commandInfos) { var result, adapter = this._getContainerAdapter($container); if (adapter.beginUpdate) { adapter.beginUpdate($container) } $.each(commandInfos, function(index, commandInfo) { adapter.addCommand($container, commandInfo.command, commandInfo.options) }); if (adapter.endUpdate) { result = adapter.endUpdate($container) } return result } }); module.exports = CommandManager }, /*!******************************************************!*\ !*** ./js/framework/html/widget_command_adapters.js ***! \******************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, commandToContainer = __webpack_require__( /*! ../utils */ 131).utils.commandToContainer, fx = __webpack_require__( /*! ../../animation/fx */ 68), TransitionExecutorModule = __webpack_require__( /*! ../../animation/transition_executor/transition_executor */ 74), DX_COMMAND_TO_WIDGET_ADAPTER = "dxCommandToWidgetAdapter"; var WidgetItemWrapperBase = Class.inherit({ ctor: function(command, containerOptions) { this.command = command; this.widgetItem = this._createWidgetItem(command, containerOptions) }, _createWidgetItem: function(command, containerOptions) { var result, itemOptions = extend({}, containerOptions, command.option()), executeCommandCallback = function(e) { command.execute(e) }; itemOptions.text = commandToContainer.resolveTextValue(command, containerOptions); itemOptions.icon = commandToContainer.resolveIconValue(command, containerOptions); itemOptions.type = commandToContainer.resolvePropertyValue(command, containerOptions, "type"); itemOptions.location = commandToContainer.resolvePropertyValue(command, containerOptions, "location"); itemOptions.locateInMenu = commandToContainer.resolvePropertyValue(command, containerOptions, "locateInMenu"); itemOptions.showText = commandToContainer.resolvePropertyValue(command, containerOptions, "showText"); result = this._createWidgetItemCore(itemOptions, executeCommandCallback); result.command = command; return result }, _createWidgetItemCore: function(itemOptions, executeCommandCallback) { return itemOptions }, dispose: function() { delete this.command; delete this.widgetItem } }); var WidgetAdapterBase = Class.inherit({ ctor: function($widgetElement) { this._commandToWidgetItemOptionNames = {}; this.$widgetElement = $widgetElement; this.$widgetElement.data(DX_COMMAND_TO_WIDGET_ADAPTER, this); this.widget = this._getWidgetByElement($widgetElement); this._widgetWidgetContentReadyHandler = this._onWidgetContentReady.bind(this); this._widgetWidgetItemRenderedHandler = this._onWidgetItemRendered.bind(this); this._widgetDisposingHandler = this._onWidgetDisposing.bind(this); this.widget.on("itemRendered", this._widgetWidgetItemRenderedHandler); this.widget.on("contentReady", this._widgetWidgetContentReadyHandler); this.widget.on("disposing", this._widgetDisposingHandler); this.itemWrappers = []; this._transitionExecutor = new TransitionExecutorModule.TransitionExecutor }, addCommand: function(command, containerOptions) { var itemWrapper = this._createItemWrapper(command, containerOptions); this.itemWrappers.push(itemWrapper); this._addItemToWidget(itemWrapper); this._commandChangedHandler = this._onCommandChanged.bind(this); itemWrapper.command.on("optionChanged", this._commandChangedHandler) }, beginUpdate: function() { this.widget.beginUpdate() }, endUpdate: function() { this.widget.endUpdate(); return this.animationDeferred }, _onWidgetItemRendered: function(e) { if (e.itemData.isJustAdded && e.itemData.command && e.itemData.command.option("visible") && this._commandRenderedAnimation) { this._transitionExecutor.enter(e.itemElement, this._commandRenderedAnimation); delete e.itemData.isJustAdded } }, _onWidgetContentReady: function(e) { this.animationDeferred = this._transitionExecutor.start() }, _onWidgetDisposing: function() { this.dispose(true) }, _setWidgetItemOption: function(optionName, optionValue, itemCommand) { var items = this.widget.option("items"), itemIndex = inArray(itemCommand, $.map(items, function(item) { return item.command || {} })); if (itemIndex > -1) { var optionPath = "items[" + itemIndex + "]."; if (!this._requireWidgetRefresh(optionName) && this.widget.option("items[" + itemIndex + "]").options) { optionPath += "options." } optionPath += this._commandToWidgetItemOptionNames[optionName] || optionName; this.widget.option(optionPath, optionValue) } }, _requireWidgetRefresh: function(optionName) { return "visible" === optionName || "locateInMenu" === optionName || "location" === optionName }, _onCommandChanged: function(args) { if ("highlighted" === args.name || args.component.isOptionDeprecated(args.name)) { return } this._setWidgetItemOption(args.name, args.value, args.component) }, _addItemToWidget: function(itemWrapper) { var items = this.widget.option("items"); items.push(itemWrapper.widgetItem); if (this.widget.element().is(":visible")) { itemWrapper.widgetItem.isJustAdded = true } this.widget.option("items", items) }, refresh: function() { var items = this.widget.option("items"); this.widget.option("items", items) }, clear: function(widgetDisposing) { var that = this; $.each(that.itemWrappers, function(index, itemWrapper) { itemWrapper.command.off("optionChanged", that._commandChangedHandler); itemWrapper.dispose() }); this.itemWrappers.length = 0; if (!widgetDisposing) { this._clearWidgetItems() } }, _clearWidgetItems: function() { this.widget.option("items", []) }, dispose: function(widgetDisposing) { this.clear(widgetDisposing); if (this.widget) { this.widget.off("itemRendered", this._widgetWidgetItemRenderedHandler); this.widget.off("contentReady", this._widgetContentReadyHandler); this.widget.off("disposing", this._widgetDisposingHandler); this.$widgetElement.removeData(DX_COMMAND_TO_WIDGET_ADAPTER); delete this.widget; delete this.$widgetElement } } }); var CommandToWidgetAdapter = Class.inherit({ ctor: function(createAdapter) { this.createAdapter = createAdapter }, _getWidgetAdapter: function($container) { var widgetAdapter = $container.data(DX_COMMAND_TO_WIDGET_ADAPTER); if (!widgetAdapter) { widgetAdapter = this.createAdapter($container) } return widgetAdapter }, addCommand: function($container, command, containerOptions) { var widgetAdapter = this._getWidgetAdapter($container); widgetAdapter.addCommand(command, containerOptions) }, clearContainer: function($container) { var widgetAdapter = this._getWidgetAdapter($container); widgetAdapter.clear() }, beginUpdate: function($container) { var widgetAdapter = this._getWidgetAdapter($container); widgetAdapter.beginUpdate() }, endUpdate: function($container) { var widgetAdapter = this._getWidgetAdapter($container); return widgetAdapter.endUpdate() } }); var dxToolbarItemWrapper = WidgetItemWrapperBase.inherit({ _createWidgetItemCore: function(itemOptions, executeCommandCallback) { var widgetItem; itemOptions.onClick = executeCommandCallback; if ("menu" === itemOptions.location || "always" === itemOptions.locateInMenu) { widgetItem = itemOptions; widgetItem.isAction = true } else { widgetItem = { locateInMenu: itemOptions.locateInMenu, location: itemOptions.location, visible: itemOptions.visible, options: itemOptions, widget: "dxButton" }; if ("inMenu" === itemOptions.showText) { widgetItem.showText = itemOptions.showText } itemOptions.visible = true; delete itemOptions.location } return widgetItem } }); var dxToolbarAdapter = WidgetAdapterBase.inherit({ ctor: function($widgetElement) { this.callBase($widgetElement); this._commandToWidgetItemOptionNames = { title: "text" }; if ("topToolbar" === this.widget.option("renderAs")) { this._commandRenderedAnimation = "command-rendered-top" } else { this._commandRenderedAnimation = "command-rendered-bottom" } }, _getWidgetByElement: function($element) { return $element.dxToolbar("instance") }, _createItemWrapper: function(command, containerOptions) { return new dxToolbarItemWrapper(command, containerOptions) }, addCommand: function(command, containerOptions) { this.widget.option("visible", true); this.callBase(command, containerOptions) } }); var dxListItemWrapper = WidgetItemWrapperBase.inherit({ _createWidgetItemCore: function(itemOptions, executeCommandCallback) { itemOptions.title = itemOptions.text; itemOptions.onClick = executeCommandCallback; return itemOptions } }); var dxListAdapter = WidgetAdapterBase.inherit({ _createItemWrapper: function(command, containerOptions) { return new dxListItemWrapper(command, containerOptions) }, _getWidgetByElement: function($element) { return $element.dxList("instance") } }); var dxNavBarItemWrapper = WidgetItemWrapperBase.inherit({}); var dxNavBarAdapter = WidgetAdapterBase.inherit({ ctor: function($widgetElement) { this.callBase($widgetElement); this._commandToWidgetItemOptionNames = { title: "text" }; this.widget.option("onItemClick", this._onNavBarItemClick.bind(this)) }, _onNavBarItemClick: function(e) { var items = this.widget.option("items"); for (var i = items.length; --i;) { items[i].command.option("highlighted", false) } e.itemData.command.execute(e) }, _getWidgetByElement: function($element) { return $element.dxNavBar("instance") }, _createItemWrapper: function(command, containerOptions) { return new dxNavBarItemWrapper(command, containerOptions) }, addCommand: function(command, containerOptions) { this.callBase(command, containerOptions); this._updateSelectedIndex() }, _onCommandChanged: function(args) { var optionName = args.name, newValue = args.value; if ("highlighted" === optionName && newValue) { this._updateSelectedIndex() } this.callBase(args) }, _updateSelectedIndex: function() { var items = this.widget.option("items"); for (var i = 0, itemsCount = items.length; i < itemsCount; i++) { var command = items[i].command; if (command && command.option("highlighted")) { this.widget.option("selectedIndex", i); break } } } }); var dxPivotItemWrapper = WidgetItemWrapperBase.inherit({ _createWidgetItemCore: function(itemOptions, executeCommandCallback) { itemOptions.title = itemOptions.text; return itemOptions } }); var dxPivotAdapter = WidgetAdapterBase.inherit({ ctor: function($widgetElement) { this.callBase($widgetElement); this.widget.option("onSelectionChanged", this._onPivotSelectionChange.bind(this)) }, _onPivotSelectionChange: function(e) { if (e.addedItems.length && e.removedItems.length && e.addedItems[0] && e.addedItems[0].command) { e.addedItems[0].command.execute(e) } }, _getWidgetByElement: function($element) { return $element.dxPivot("instance") }, _createItemWrapper: function(command, containerOptions) { return new dxPivotItemWrapper(command, containerOptions) }, addCommand: function(command, containerOptions) { this.callBase(command, containerOptions); this._updateSelectedIndex() }, _onCommandChanged: function(args) { var optionName = args.name, newValue = args.value; if ("visible" === optionName) { this._reRenderPivot() } else { if ("highlighted" === optionName && newValue) { this._updateSelectedIndex() } } this.callBase(args) }, _addItemToWidget: function(itemWrapper) { if (itemWrapper.command.option("visible")) { this.callBase(itemWrapper) } }, _updateSelectedIndex: function() { var pivot = this.widget, items = pivot.option("items") || []; fx.off = true; for (var i = 0, itemsCount = items.length; i < itemsCount; i++) { var command = items[i].command; if (command && command.option("highlighted")) { pivot.option("selectedIndex", i); break } } fx.off = false }, _reRenderPivot: function() { var that = this; that.widget.option("items", []); $.each(that.itemWrappers, function(index, itemWrapper) { if (itemWrapper.command.option("visible")) { that._addItemToWidget(itemWrapper) } }); that.refresh(); that._updateSelectedIndex() } }); var dxSlideOutItemWrapper = WidgetItemWrapperBase.inherit({}); var dxSlideOutAdapter = WidgetAdapterBase.inherit({ ctor: function($widgetElement) { this.callBase($widgetElement); this._commandToWidgetItemOptionNames = { title: "text" }; this.widget.option("onItemClick", this._onSlideOutItemClick.bind(this)) }, _onSlideOutItemClick: function(e) { e.itemData.command.execute(e) }, _getWidgetByElement: function($element) { return $element.dxSlideOut("instance") }, _createItemWrapper: function(command, containerOptions) { return new dxSlideOutItemWrapper(command, containerOptions) }, _updateSelectedIndex: function() { var items = this.widget.option("items") || []; for (var i = 0, itemsCount = items.length; i < itemsCount; i++) { var command = items[i].command; if (command && command.option("highlighted")) { this.widget.option("selectedIndex", i); break } } }, addCommand: function(command, containerOptions) { this.callBase(command, containerOptions); this._updateSelectedIndex() }, _onCommandChanged: function(args) { var optionName = args.name, newValue = args.value; if ("highlighted" === optionName && newValue) { this._updateSelectedIndex() } this.callBase(args) } }); exports.dxToolbar = new CommandToWidgetAdapter(function($widgetElement) { return new dxToolbarAdapter($widgetElement) }); exports.dxList = new CommandToWidgetAdapter(function($widgetElement) { return new dxListAdapter($widgetElement) }); exports.dxNavBar = new CommandToWidgetAdapter(function($widgetElement) { return new dxNavBarAdapter($widgetElement) }); exports.dxPivot = new CommandToWidgetAdapter(function($widgetElement) { return new dxPivotAdapter($widgetElement) }); exports.dxSlideOut = new CommandToWidgetAdapter(function($widgetElement) { return new dxSlideOutAdapter($widgetElement) }); exports.WidgetItemWrapperBase = WidgetItemWrapperBase; exports.WidgetAdapterBase = WidgetAdapterBase }, /*!******************************************!*\ !*** ./js/framework/html/view_engine.js ***! \******************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), version = __webpack_require__( /*! ../../core/version */ 19), Class = __webpack_require__( /*! ../../core/class */ 25), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, errors = __webpack_require__( /*! ../errors */ 122), domUtils = __webpack_require__( /*! ../../core/utils/dom */ 56), when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when, _VIEW_ROLE = "dxView", _LAYOUT_ROLE = "dxLayout", MARKUP_TEMPLATE_MARKER = "MarkupTemplate:"; __webpack_require__( /*! ./view_engine_components */ 128); var ViewEngine = Class.inherit({ ctor: function(options) { options = options || {}; this.$root = options.$root; this.device = options.device || {}; this.dataOptionsAttributeName = options.dataOptionsAttributeName || "data-options"; this._templateMap = {}; this._pendingViewContainer = null; this.markupLoaded = $.Callbacks(); this._templateContext = options.templateContext; this._$skippedMarkup = $(); if (void 0 !== options.templatesVersion && options.templateCacheStorage && this._isReleaseVersion()) { this._templateCacheEnabled = true; this._templatesVersion = "v_" + options.templatesVersion; this._templateCacheStorage = options.templateCacheStorage; this._templateCacheKey = "dxTemplateCache_" + version + "_" + JSON.stringify(this.device) } }, _isReleaseVersion: function() { return !/http:\/\/localhost/.test(location.href) }, _enumerateTemplates: function(processFn) { var that = this; $.each(that._templateMap, function(name, templatesByRoleMap) { $.each(templatesByRoleMap, function(role, templates) { $.each(templates, function(index, template) { processFn(template) }) }) }) }, _findComponent: function(name, role) { var components = (this._templateMap[name] || {})[role] || [], filter = this._templateContext && this._templateContext.option() || {}; components = this._filterTemplates(filter, components); this._checkMatchedTemplates(components); return components[0] }, _findTemplate: function(name, role) { var component = this._findComponent(name, role); if (!component) { this._clearCache(); throw errors.Error("E3013", role, name) } var $result, $template = component.element(); if (!component._isStaticComponentsCreated) { domUtils.createComponents($template, ["dxContent", "dxContentPlaceholder", "dxTransition"]); component._isStaticComponentsCreated = true } $result = $template.clone().removeClass("dx-hidden"); return $result }, _clearCache: function() { if (this._templateCacheEnabled) { this._templateCacheStorage.removeItem(this._templateCacheKey) } }, _loadTemplatesFromMarkupCore: function($markup) { var that = this; if ($markup.find("[data-dx-role]").length) { throw errors.Error("E3019") } that.markupLoaded.fire({ markup: $markup }); var components = domUtils.createComponents($markup, [_VIEW_ROLE, _LAYOUT_ROLE]); $.each(components, function(index, component) { var $element = component.element(); $element.addClass("dx-hidden"); that._registerTemplateComponent(component); component.element().detach() }); var $skipped = $markup.filter("script"); $skipped.appendTo(that.$root); that._$skippedMarkup = that._$skippedMarkup.add($skipped) }, _registerTemplateComponent: function(component) { var role = component.NAME, options = component.option(), templateName = options.name, componentsByRoleMap = this._templateMap[templateName] || {}; componentsByRoleMap[role] = componentsByRoleMap[role] || []; componentsByRoleMap[role].push(component); this._templateMap[templateName] = componentsByRoleMap }, _applyPartialViews: function($render) { var that = this; domUtils.createComponents($render, ["dxViewPlaceholder"]); $.each($render.find(".dx-view-placeholder"), function() { var $partialPlaceholder = $(this); if ($partialPlaceholder.children().length) { return } var viewName = $partialPlaceholder.data("dxViewPlaceholder").option("viewName"), $view = that._findTemplate(viewName, _VIEW_ROLE); that._applyPartialViews($view); $partialPlaceholder.append($view); $view.removeClass("dx-hidden") }) }, _ajaxImpl: function() { return $.ajax.apply($, arguments) }, _loadTemplatesFromURL: function(url) { var that = this, options = this._getLoadOptions(), deferred = $.Deferred(); url = options.winPhonePrefix + url; this._ajaxImpl({ url: url, isLocal: options.isLocal, dataType: "html" }).done(function(data) { that._loadTemplatesFromMarkupCore(domUtils.createMarkupFromString(data)); deferred.resolve() }).fail(function(jqXHR, textStatus, errorThrown) { var error = errors.Error("E3021", url, errorThrown); deferred.reject(error) }); return deferred.promise() }, _getLoadOptions: function() { if (location.protocol.indexOf("wmapp") >= 0) { return { winPhonePrefix: location.protocol + "www/", isLocal: true } } return { winPhonePrefix: "", isLocal: void 0 } }, _loadExternalTemplates: function() { var tasks = [], that = this; $("head").find("link[rel='dx-template']").each(function(index, link) { var task = that._loadTemplatesFromURL($(link).attr("href")); tasks.push(task) }); return when.apply($, tasks) }, _processTemplates: function() { var that = this; $.each(that._templateMap, function(name, templatesByRoleMap) { $.each(templatesByRoleMap, function(role, templates) { that._filterTemplatesByDevice(templates) }) }); that._enumerateTemplates(function(template) { that._applyPartialViews(template.element()) }) }, _filterTemplatesByDevice: function(components) { var filteredComponents = this._filterTemplates(this.device, components); $.each(components, function(index, component) { if (inArray(component, filteredComponents) < 0) { component.element().remove() } }); components.length = 0; components.push.apply(components, filteredComponents) }, _filterTemplates: function(filter, components) { return commonUtils.findBestMatches(filter, components, function(component) { return component.option() }) }, _checkMatchedTemplates: function(bestMatches) { if (bestMatches.length > 1) { var message = ""; $.each(bestMatches, function(index, match) { message += match.element().attr("data-options") + "\r\n" }); throw errors.Error("E3020", message, JSON.stringify(this.device)) } }, _wrapViewDefaultContent: function($viewTemplate) { $viewTemplate.wrapInner('<div class="dx-full-height"></div>'); $viewTemplate.children().eq(0).dxContent({ targetPlaceholder: "content" }) }, _initDefaultLayout: function() { this._$defaultLayoutTemplate = $('<div class="dx-full-height" data-options="dxLayout : { name: \'default\' } "> \n <div class="dx-full-height" data-options="dxContentPlaceholder : { name: \'content\' } " ></div> \n</div>'); domUtils.createComponents(this._$defaultLayoutTemplate) }, _getDefaultLayoutTemplate: function() { return this._$defaultLayoutTemplate.clone() }, applyLayout: function($view, $layout) { if (void 0 === $layout || 0 === $layout.length) { $layout = this._getDefaultLayoutTemplate() } if (0 === $view.children(".dx-content").length) { this._wrapViewDefaultContent($view) } var $toMerge = $().add($layout).add($view); var $placeholderContents = $toMerge.find(".dx-content"); $.each($placeholderContents, function() { var $placeholderContent = $(this); var placeholderId = $placeholderContent.attr("data-dx-target-placeholder-id"); var $placeholder = $toMerge.find(".dx-content-placeholder-" + placeholderId); $placeholder.empty(); $placeholder.append($placeholderContent) }); for (var i = $placeholderContents.length; i >= 0; i--) { var $item = $placeholderContents.eq(i); if (!$item.is(".dx-content-placeholder .dx-content")) { $item.remove() } } return $layout }, _loadTemplatesFromCache: function() { if (!this._templateCacheEnabled) { return } var cache; var fromJSONInterceptor = function(key, value) { if ("string" === typeof value && 0 === value.indexOf(MARKUP_TEMPLATE_MARKER)) { var data = JSON.parse(value.substr(MARKUP_TEMPLATE_MARKER.length)), type = data.type, options = data.options, $markup = domUtils.createMarkupFromString(data.markup); options.fromCache = true; return $markup[type](options)[type]("instance") } else { if ("skippedMarkup" === key) { return $("<div>").append(domUtils.createMarkupFromString(value)).contents() } } return value }; var toParse = this._templateCacheStorage.getItem(this._templateCacheKey); if (toParse) { try { var cacheContainer = JSON.parse(toParse, fromJSONInterceptor); cache = cacheContainer[this._templatesVersion] } catch (e) { this._clearCache() } } if (!cache) { return } this._templateMap = cache.templates; this.$root.append(cache.skippedMarkup); return true }, _putTemplatesToCache: function() { if (!this._templateCacheEnabled) { return } var toJSONInterceptor = function(key, value) { if (value && value.element) { return MARKUP_TEMPLATE_MARKER + JSON.stringify({ markup: value.element().prop("outerHTML"), options: value.option(), type: value.NAME }) } else { if ("skippedMarkup" === key) { return $("<div>").append(value.clone()).html() } } return value }; var cacheContainer = {}; cacheContainer[this._templatesVersion] = { templates: this._templateMap, skippedMarkup: this._$skippedMarkup }; this._templateCacheStorage.setItem(this._templateCacheKey, JSON.stringify(cacheContainer, toJSONInterceptor, 4)) }, init: function() { var that = this; this._initDefaultLayout(); if (!this._loadTemplatesFromCache()) { that._loadTemplatesFromMarkupCore(that.$root.children()); return this._loadExternalTemplates().done(function() { that._processTemplates(); that._putTemplatesToCache() }) } else { return $.Deferred().resolve().promise() } }, getViewTemplate: function(viewName) { return this._findTemplate(viewName, _VIEW_ROLE) }, getViewTemplateInfo: function(name) { return this._findComponent(name, _VIEW_ROLE) }, getLayoutTemplate: function(layoutName) { if (!layoutName) { return this._getDefaultLayoutTemplate() } return this._findTemplate(layoutName, _LAYOUT_ROLE) }, getLayoutTemplateInfo: function(name) { return this._findComponent(name, _LAYOUT_ROLE) }, loadTemplates: function(source) { var result; if ("string" === typeof source) { result = this._loadTemplatesFromURL(source) } else { this._loadTemplatesFromMarkupCore(source); result = $.Deferred().resolve().promise() } return result.done(this._processTemplates.bind(this)) } }); exports.ViewEngine = ViewEngine }, /*!************************************************!*\ !*** ./js/framework/html/layout_controller.js ***! \************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), frameworkUtils = __webpack_require__( /*! ../utils */ 131), layoutSets = __webpack_require__( /*! ./presets */ 138).layoutSets, EventsMixin = __webpack_require__( /*! ../../core/events_mixin */ 51), errors = __webpack_require__( /*! ../errors */ 122), domUtils = __webpack_require__( /*! ../../core/utils/dom */ 56), when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when, HIDDEN_BAG_ID = "__hidden-bag", TRANSITION_SELECTOR = ".dx-transition", CONTENT_SELECTOR = ".dx-content", DEFAULT_COMMAND_RENDER_STAGE = "onViewShown", CONTENT_RENDERED_EVENT_NAME = "dxcontentrendered.layoutController", PENDING_RENDERING_SELECTOR = ".dx-pending-rendering", PENDING_RENDERING_MANUAL_SELECTOR = ".dx-pending-rendering-manual", TransitionExecutorModule = __webpack_require__( /*! ../../animation/transition_executor/transition_executor */ 74); __webpack_require__( /*! ./command_container */ 126); __webpack_require__( /*! ./view_engine_components */ 128); var transitionSelector = function(transitionName) { return ".dx-transition-" + transitionName }; var DefaultLayoutController = Class.inherit({ ctor: function(options) { options = options || {}; this.name = options.name || ""; this._layoutModel = options.layoutModel || {}; this._defaultPaneName = options.defaultPaneName || "content"; this._transitionDuration = void 0 === options.transitionDuration ? 400 : options.transitionDuration; this._showViewFired = false }, init: function(options) { options = options || {}; this._visibleViews = {}; this._$viewPort = options.$viewPort || $("body"); this._commandManager = options.commandManager; this._viewEngine = options.viewEngine; this.transitionExecutor = new TransitionExecutorModule.TransitionExecutor; this._prepareTemplates(); this._$viewPort.append(this.element()); this._hideElements(this.element()); if (options.templateContext) { this._templateContext = options.templateContext; this._proxiedTemplateContextChangedHandler = this._templateContextChangedHandler.bind(this) } }, ensureActive: function(targetNode) { if (this._disabledState) { return this.enable() } else { return this.activate(targetNode) } }, activate: function() { this._showViewFired = false; var $rootElement = this.element(); this._showElements($rootElement); this._attachRefreshViewRequiredHandler(); return $.Deferred().resolve().promise() }, deactivate: function() { this._disabledState = false; this._showViewFired = false; this._releaseVisibleViews(); this._hideElements(this.element()); this._detachRefreshViewRequiredHandler(); return $.Deferred().resolve().promise() }, enable: function() { this._disabledState = false; if (!this._showViewFired) { this._notifyShowing() } this._showViewFired = false; return $.Deferred().resolve().promise() }, disable: function() { this._disabledState = true; this._showViewFired = false; this._notifyHidden() }, activeViewInfo: function() { return this._visibleViews[this._defaultPaneName] }, _fireViewEvents: function(eventName, views) { var that = this; views = views || this._visibleViews; $.each(views, function(index, viewInfo) { that.fireEvent(eventName, [viewInfo]) }) }, _notifyShowing: function(views) { this._fireViewEvents("viewShowing", views) }, _notifyShown: function(views) { this._fireViewEvents("viewShown", views) }, _notifyHidden: function(views) { this._fireViewEvents("viewHidden", views) }, _applyTemplate: function($elements, model) { $elements.each(function(i, element) { frameworkUtils.templateProvider.applyTemplate(element, model) }) }, _releaseVisibleViews: function() { var that = this; $.each(this._visibleViews, function(index, viewInfo) { that._hideView(viewInfo); that._releaseView(viewInfo) }); this._visibleViews = {} }, _templateContextChangedHandler: function() { var that = this, viewsToShow = []; $.each(that._visibleViews, function(index, viewInfo) { if (viewInfo.currentViewTemplateId !== that._getViewTemplateId(viewInfo)) { viewsToShow.push(viewInfo) } }); when.apply($, $.map(viewsToShow, function(viewInfo) { return that.showView(viewInfo) })).done(function() { that._notifyShown(viewsToShow) }) }, _attachRefreshViewRequiredHandler: function() { if (this._templateContext) { this._templateContext.on("optionChanged", this._proxiedTemplateContextChangedHandler) } }, _detachRefreshViewRequiredHandler: function() { if (this._templateContextChanged) { this._templateContext.off("optionChanged", this._proxiedTemplateContextChangedHandler) } }, _getPreviousViewInfo: function(viewInfo) { return this._visibleViews[this._getViewPaneName(viewInfo.viewTemplateInfo)] }, _prepareTemplates: function() { var that = this; var $layoutTemplate = that._viewEngine.getLayoutTemplate(this._getLayoutTemplateName()); that._$layoutTemplate = $layoutTemplate; that._$mainLayout = that._createEmptyLayout(); that._showElements(that._$mainLayout); that._applyTemplate(that._$mainLayout, that._layoutModel); that._$navigationWidget = that._createNavigationWidget() }, renderNavigation: function(navigationCommands) { this._clearNavigationWidget(); this._renderNavigationImpl(navigationCommands) }, _renderNavigationImpl: function(navigationCommands) { this._renderCommands(this._$mainLayout, navigationCommands) }, _createNavigationWidget: function() { var result, containers = this._findCommandContainers(this._$mainLayout); $.each(containers, function(k, container) { if ("global-navigation" === container.option("id")) { result = container.element(); return false } }); return result }, _clearNavigationWidget: function() { if (this._$navigationWidget) { this._commandManager.clearContainer(this._$navigationWidget.dxCommandContainer("instance")) } }, element: function() { return this._$mainLayout }, _getViewFrame: function(viewInfo) { return this._$mainLayout }, _getLayoutTemplateName: function() { return this.name }, _applyModelToTransitionElements: function($markup, model) { var that = this; this._getTransitionElements($markup).each(function(i, item) { that._applyTemplate($(item).children(), model) }) }, _createViewLayoutTemplate: function() { var that = this; var $viewLayoutTemplate = that._$layoutTemplate.clone(); this._hideElements($viewLayoutTemplate); return $viewLayoutTemplate }, _createEmptyLayout: function() { var that = this; var $result = that._$layoutTemplate.clone(); this._hideElements($result); this._getTransitionElements($result).empty(); $result.children(CONTENT_SELECTOR).remove(); return $result }, _getTransitionElements: function($markup) { var $items = $markup.find(TRANSITION_SELECTOR).add($markup.filter(TRANSITION_SELECTOR)), result = []; for (var i = 0; i < $items.length; i++) { var $item = $items.eq(i); if (0 === $item.parents(TRANSITION_SELECTOR).length) { result.push($item.get(0)) } } return $(result) }, showView: function(viewInfo, direction) { direction = direction || "forward"; var result, that = this, previousViewInfo = that._getPreviousViewInfo(viewInfo), previousViewTemplateId = previousViewInfo === viewInfo ? previousViewInfo.currentViewTemplateId : void 0; this._showViewFired = true; this._updateCurrentViewTemplateId(viewInfo); if (previousViewTemplateId && previousViewTemplateId === viewInfo.currentViewTemplateId && viewInfo === previousViewInfo) { that.fireEvent("viewShowing", [viewInfo, direction]); result = $.Deferred().resolve().promise() } else { that._ensureViewRendered(viewInfo); that.fireEvent("viewShowing", [viewInfo, direction]); result = this._showViewImpl(viewInfo, direction, previousViewTemplateId).done(function() { that._onViewShown(viewInfo) }) } return result }, disposeView: function(viewInfo) { this._clearRenderResult(viewInfo) }, _clearRenderResult: function(viewInfo) { if (viewInfo.renderResult) { viewInfo.renderResult.$markup.remove(); viewInfo.renderResult.$viewItems.remove(); delete viewInfo.renderResult } }, _renderViewImpl: function($viewTemplate, viewInfo) { var $viewItems, that = this, allowedChildrenSelector = ".dx-command,.dx-content,script", $layout = this._createViewLayoutTemplate(), isSimplifiedMarkup = true, outOfContentItems = $(); if (0 === $viewTemplate.children(allowedChildrenSelector).length) { this._viewEngine._wrapViewDefaultContent($viewTemplate) } $viewItems = $viewTemplate.children(); this._applyModelToTransitionElements($layout, viewInfo.model); this._viewEngine.applyLayout($viewTemplate, $layout); $viewItems.each(function(i, item) { var $item = $(item); that._applyTemplate($item, viewInfo.model); if ($item.is(allowedChildrenSelector)) { isSimplifiedMarkup = false } else { outOfContentItems = outOfContentItems.add($item) } }); if (outOfContentItems.length && !isSimplifiedMarkup) { throw errors.Error("E3014", outOfContentItems[0].outerHTML) } viewInfo.renderResult = viewInfo.renderResult || {}; viewInfo.renderResult.$viewItems = $viewItems; viewInfo.renderResult.$markup = $layout }, _renderCommands: function($markup, commands) { var commandContainers = this._findCommandContainers($markup); return this._commandManager.renderCommandsToContainers(commands, commandContainers) }, _prepareViewCommands: function(viewInfo) { var $viewItems = viewInfo.renderResult.$viewItems, viewCommands = this._commandManager.findCommands($viewItems), commandsToRenderMap = {}; viewInfo.commands = frameworkUtils.utils.mergeCommands(viewInfo.commands || [], viewCommands); viewInfo.commandsToRenderMap = commandsToRenderMap; $.each(viewInfo.commands, function(index, command) { var renderStage = command.option("renderStage") || DEFAULT_COMMAND_RENDER_STAGE, targetArray = commandsToRenderMap[renderStage] = commandsToRenderMap[renderStage] || []; targetArray.push(command) }) }, _applyViewCommands: function(viewInfo, renderStage) { renderStage = renderStage || DEFAULT_COMMAND_RENDER_STAGE; var result, commandsToRender = viewInfo.commandsToRenderMap[renderStage], $markup = viewInfo.renderResult.$markup; if (commandsToRender) { result = this._renderCommands($markup, commandsToRender); delete viewInfo.commandsToRenderMap[renderStage] } else { result = $.Deferred().resolve().promise() } return result }, _findCommandContainers: function($markup) { return domUtils.createComponents($markup, ["dxCommandContainer"]) }, _getViewTemplateId: function(viewInfo) { var viewTemplateInstance = viewInfo.$viewTemplate ? viewInfo.$viewTemplate.dxView("instance") : this._viewEngine.getViewTemplateInfo(viewInfo.viewName); return viewTemplateInstance.getId() }, _updateCurrentViewTemplateId: function(viewInfo) { viewInfo.currentViewTemplateId = this._getViewTemplateId(viewInfo) }, _ensureViewRendered: function(viewInfo) { var $cachedMarkup = viewInfo.renderResult && viewInfo.renderResult.markupCache[viewInfo.currentViewTemplateId]; if ($cachedMarkup) { viewInfo.renderResult.$markup = $cachedMarkup } else { this._renderView(viewInfo); viewInfo.renderResult.markupCache = viewInfo.renderResult.markupCache || {}; viewInfo.renderResult.markupCache[viewInfo.currentViewTemplateId] = viewInfo.renderResult.$markup } }, _renderView: function(viewInfo) { var $viewTemplate = viewInfo.$viewTemplate || this._viewEngine.getViewTemplate(viewInfo.viewName); this._renderViewImpl($viewTemplate, viewInfo); this._prepareViewCommands(viewInfo); this._applyViewCommands(viewInfo, "onViewRendering"); this._appendViewToLayout(viewInfo); $viewTemplate.remove(); this._onRenderComplete(viewInfo); this.fireEvent("viewRendered", [viewInfo]) }, _prepareTransition: function($element, targetPlaceholderName) { if (0 === $element.children(".dx-content").length) { $element.wrapInner("<div>"); $element.children().dxContent({ targetPlaceholder: targetPlaceholderName }) } }, _appendViewToLayout: function(viewInfo) { var that = this, $viewFrame = that._getViewFrame(viewInfo), $markup = viewInfo.renderResult.$markup, $transitionContentElements = $(), animationItems = []; $.each($markup.find(".dx-content-placeholder"), function(index, el) { that._prepareTransition($(el), $(el).attr("data-dx-content-placeholder-name")) }); $.each(that._getTransitionElements($viewFrame), function(index, transitionElement) { var $transition = $(transitionElement), $viewElement = $markup.find(transitionSelector($transition.attr("data-dx-transition-name"))).children(), animationItem = { $element: $viewElement, animation: $transition.attr("data-dx-transition-type") }; animationItems.push(animationItem); $transition.append($viewElement); that._showViewElements($viewElement); domUtils.triggerShownEvent($viewElement); $transitionContentElements = $transitionContentElements.add($viewElement) }); that._$mainLayout.append(viewInfo.renderResult.$viewItems.filter(".dx-command")); $markup.remove(); viewInfo.renderResult.$markup = $transitionContentElements; viewInfo.renderResult.animationItems = animationItems }, _onRenderComplete: function(viewInfo) {}, _onViewShown: function(viewInfo) { $(document).trigger("dx.viewchanged") }, _enter: function(animationItems, animationModifier) { var transitionExecutor = this.transitionExecutor; $.each(animationItems, function(index, item) { transitionExecutor.enter(item.$element, item.animation, animationModifier) }) }, _leave: function(animationItems, animationModifier) { var transitionExecutor = this.transitionExecutor; $.each(animationItems, function(index, item) { transitionExecutor.leave(item.$element, item.animation, animationModifier) }) }, _doTransition: function(oldViewInfo, newViewInfo, animationModifier) { if (oldViewInfo) { this._leave(oldViewInfo.renderResult.animationItems, animationModifier) } this._enter(newViewInfo.renderResult.animationItems, animationModifier); this._showView(newViewInfo); return this.transitionExecutor.start() }, _showViewImpl: function(viewInfo, direction, previousViewTemplateId) { var that = this, previousViewInfo = this._getPreviousViewInfo(viewInfo), animationModifier = { direction: direction }; if (previousViewInfo === viewInfo) { previousViewInfo = void 0 } if (!previousViewInfo) { animationModifier.duration = 0; animationModifier.delay = 0 } var d = $.Deferred(); that._doTransition(previousViewInfo, viewInfo, animationModifier).done(function() { that._changeView(viewInfo, previousViewTemplateId).done(function(result) { d.resolve(result) }) }); return d.promise() }, _releaseView: function(viewInfo) { this.fireEvent("viewReleased", [viewInfo]) }, _getReadyForRenderDeferredItems: function(viewInfo) { return $.Deferred().resolve().promise() }, _changeView: function(viewInfo, previousViewTemplateId) { var that = this; if (previousViewTemplateId) { that._hideView(viewInfo, previousViewTemplateId) } else { var previousViewInfo = that._getPreviousViewInfo(viewInfo); if (previousViewInfo && previousViewInfo !== viewInfo) { that._hideView(previousViewInfo); that._releaseView(previousViewInfo) } this._visibleViews[this._getViewPaneName(viewInfo.viewTemplateInfo)] = viewInfo } this._subscribeToDeferredItems(viewInfo); var d = $.Deferred(); this._getReadyForRenderDeferredItems(viewInfo).done(function() { that._applyViewCommands(viewInfo).done(function() { that._renderDeferredItems(viewInfo.renderResult.$markup).done(function() { d.resolve() }) }) }); return d.promise() }, _subscribeToDeferredItems: function(viewInfo) { var that = this, $markup = viewInfo.renderResult.$markup; $markup.find(PENDING_RENDERING_SELECTOR).add($markup.filter(PENDING_RENDERING_SELECTOR)).each(function() { var eventData = { viewInfo: viewInfo, context: that }; $(this).on(CONTENT_RENDERED_EVENT_NAME, eventData, that._onDeferredContentRendered) }) }, _onDeferredContentRendered: function(event) { var $element = $(event.target), viewInfo = event.data.viewInfo, that = event.data.context; $element.off(CONTENT_RENDERED_EVENT_NAME, that._onDeferredContentRendered); that._renderCommands($element, viewInfo.commands) }, _renderDeferredItems: function($items) { var that = this, result = $.Deferred(); var $pendingItem = $items.find(PENDING_RENDERING_MANUAL_SELECTOR).add($items.filter(PENDING_RENDERING_MANUAL_SELECTOR)).first(); if ($pendingItem.length) { var render = $pendingItem.data("dx-render-delegate"); commonUtils.executeAsync(function() { render().done(function() { that._renderDeferredItems($items).done(function() { result.resolve() }) }) }) } else { result.resolve() } return result.promise() }, _getViewPaneName: function(viewTemplateInfo) { return this._defaultPaneName }, _hideElements: function($elements) { $elements.addClass("dx-fast-hidden") }, _showElements: function($elements) { $elements.removeClass("dx-fast-hidden") }, _hideViewElements: function($elements) { this._patchIds($elements); this._disableInputs($elements); $elements.removeClass("dx-active-view").addClass("dx-inactive-view") }, _hideView: function(viewInfo, templateId) { if (viewInfo.renderResult) { var $markupToHide = void 0 === templateId ? viewInfo.renderResult.$markup : viewInfo.renderResult.markupCache[templateId]; this._hideViewElements($markupToHide); this.fireEvent("viewHidden", [viewInfo]) } }, _showViewElements: function($elements) { this._unPatchIds($elements); this._enableInputs($elements); $elements.removeClass("dx-inactive-view").addClass("dx-active-view"); this._skipAnimation($elements) }, _showView: function(viewInfo) { if (viewInfo.renderResult) { this._showViewElements(viewInfo.renderResult.$markup) } }, _skipAnimation: function($elements) { $elements.addClass("dx-skip-animation"); for (var i = 0; i < $elements.length; i++) { $elements.eq(i).css("transform") } $elements.removeClass("dx-skip-animation") }, _patchIds: function($markup) { this._processIds($markup, function(id) { var result = id; if (id.indexOf(HIDDEN_BAG_ID) === -1) { result = HIDDEN_BAG_ID + "-" + id } return result }) }, _unPatchIds: function($markup) { this._processIds($markup, function(id) { var result = id; if (0 === id.indexOf(HIDDEN_BAG_ID)) { result = id.substr(HIDDEN_BAG_ID.length + 1) } return result }) }, _processIds: function($markup, process) { var elementsWithIds = $markup.find("[id]"); $.each(elementsWithIds, function(index, element) { var $el = $(element), id = $el.attr("id"); $el.attr("id", process(id)) }) }, _enableInputs: function($markup) { var $inputs = this._getInputs($markup).filter("[data-disabled='true']"); $.each($inputs, function(index, input) { $(input).removeAttr("disabled").removeAttr("data-disabled") }) }, _disableInputs: function($markup) { var $inputs = this._getInputs($markup); $inputs = $inputs.filter(":not([disabled])").add($inputs.filter("[disabled=true]")); $.each($inputs, function(index, input) { $(input).attr({ disabled: true, "data-disabled": true }) }) }, _getInputs: function($markup) { return $markup.find("input, button, select, textarea") } }).include(EventsMixin); layoutSets.default = layoutSets.default || []; layoutSets.default.push({ controller: new DefaultLayoutController }); exports.DefaultLayoutController = DefaultLayoutController; exports.layoutSets = layoutSets }, /*!*************************!*\ !*** ./js/ui/themes.js ***! \*************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), errors = __webpack_require__( /*! ./widget/ui.errors */ 22), domUtils = __webpack_require__( /*! ../core/utils/dom */ 56), devices = __webpack_require__( /*! ../core/devices */ 53), viewPortUtils = __webpack_require__( /*! ../core/utils/view_port */ 55), viewPort = viewPortUtils.value, viewPortChanged = viewPortUtils.changeCallback, holdReady = $.holdReady || $.fn.holdReady; var DX_LINK_SELECTOR = "link[rel=dx-theme]", THEME_ATTR = "data-theme", ACTIVE_ATTR = "data-active", DX_HAIRLINES_CLASS = "dx-hairlines"; var context, $activeThemeLink, knownThemes, currentThemeName, pendingThemeName; var THEME_MARKER_PREFIX = "dx."; function readThemeMarker() { var result, element = $("<div></div>", context).addClass("dx-theme-marker").appendTo(context.documentElement); try { result = element.css("font-family"); if (!result) { return null } result = result.replace(/["']/g, ""); if (result.substr(0, THEME_MARKER_PREFIX.length) !== THEME_MARKER_PREFIX) { return null } return result.substr(THEME_MARKER_PREFIX.length) } finally { element.remove() } } function waitForThemeLoad(themeName, callback) { var timerId, waitStartTime; pendingThemeName = themeName; function handleLoaded() { pendingThemeName = null; callback() } if (isPendingThemeLoaded()) { handleLoaded() } else { waitStartTime = $.now(); timerId = setInterval(function() { var isLoaded = isPendingThemeLoaded(), isTimeout = !isLoaded && $.now() - waitStartTime > 15e3; if (isTimeout) { errors.log("W0004", pendingThemeName) } if (isLoaded || isTimeout) { clearInterval(timerId); handleLoaded() } }, 10) } } function isPendingThemeLoaded() { return !pendingThemeName || readThemeMarker() === pendingThemeName } function processMarkup() { var $allThemeLinks = $(DX_LINK_SELECTOR, context); if (!$allThemeLinks.length) { return } knownThemes = {}; $activeThemeLink = $(domUtils.createMarkupFromString("<link rel=stylesheet>"), context); $allThemeLinks.each(function() { var link = $(this, context), fullThemeName = link.attr(THEME_ATTR), url = link.attr("href"), isActive = "true" === link.attr(ACTIVE_ATTR); knownThemes[fullThemeName] = { url: url, isActive: isActive } }); $allThemeLinks.last().after($activeThemeLink); $allThemeLinks.remove() } function resolveFullThemeName(desiredThemeName) { var desiredThemeParts = desiredThemeName.split("."), result = null; if (knownThemes) { if (desiredThemeName in knownThemes) { return desiredThemeName } $.each(knownThemes, function(knownThemeName, themeData) { var knownThemeParts = knownThemeName.split("."); if (knownThemeParts[0] !== desiredThemeParts[0]) { return } if (desiredThemeParts[1] && desiredThemeParts[1] !== knownThemeParts[1]) { return } if (desiredThemeParts[2] && desiredThemeParts[2] !== knownThemeParts[2]) { return } if (!result || themeData.isActive) { result = knownThemeName } if (themeData.isActive) { return false } }) } return result } function initContext(newContext) { try { if (newContext !== context) { knownThemes = null } } catch (x) { knownThemes = null } context = newContext } function init(options) { options = options || {}; initContext(options.context || document); processMarkup(); currentThemeName = void 0; current(options) } function current(options) { if (!arguments.length) { currentThemeName = currentThemeName || readThemeMarker(); return currentThemeName } detachCssClasses(viewPort()); options = options || {}; if ("string" === typeof options) { options = { theme: options } } var currentThemeData, isAutoInit = options._autoInit, loadCallback = options.loadCallback; currentThemeName = options.theme || currentThemeName; if (isAutoInit && !currentThemeName) { currentThemeName = themeNameFromDevice(devices.current()) } currentThemeName = resolveFullThemeName(currentThemeName); if (currentThemeName) { currentThemeData = knownThemes[currentThemeName] } if (currentThemeData) { $activeThemeLink.attr("href", knownThemes[currentThemeName].url); if (loadCallback) { waitForThemeLoad(currentThemeName, loadCallback) } else { if (pendingThemeName) { pendingThemeName = currentThemeName } } } else { if (isAutoInit) { if (loadCallback) { loadCallback() } } else { throw errors.Error("E0021", currentThemeName) } } attachCssClasses(viewPortUtils.originalViewPort(), currentThemeName) } function themeNameFromDevice(device) { var themeName = device.platform; var majorVersion = device.version && device.version[0]; switch (themeName) { case "ios": themeName += "7"; break; case "android": themeName += "5"; break; case "win": themeName += majorVersion && 8 === majorVersion ? "8" : "10" } return themeName } function getCssClasses(themeName) { themeName = themeName || current(); var result = [], themeNameParts = themeName && themeName.split("."); if (themeNameParts) { result.push("dx-theme-" + themeNameParts[0], "dx-theme-" + themeNameParts[0] + "-typography"); if (themeNameParts.length > 1) { result.push("dx-color-scheme-" + themeNameParts[1]) } } return result } var themeClasses; function attachCssClasses(element, themeName) { themeClasses = getCssClasses(themeName).join(" "); $(element).addClass(themeClasses); var activateHairlines = function() { var pixelRatio = window.devicePixelRatio; if (!pixelRatio || pixelRatio < 2) { return } var $tester = $("<div>"); $tester.css("border", ".5px solid transparent"); $("body").append($tester); if (1 === $tester.outerHeight()) { $(element).addClass(DX_HAIRLINES_CLASS); themeClasses += " " + DX_HAIRLINES_CLASS } $tester.remove() }; activateHairlines() } function detachCssClasses(element) { $(element).removeClass(themeClasses) } holdReady(true); init({ _autoInit: true, loadCallback: function() { holdReady(false) } }); domUtils.ready(function() { if ($(DX_LINK_SELECTOR, context).length) { throw errors.Error("E0022") } }); viewPortChanged.add(function(viewPort, prevViewPort) { detachCssClasses(prevViewPort); attachCssClasses(viewPort) }); devices.changed.add(function() { init({ _autoInit: true }) }); exports.current = current; exports.init = init; exports.attachCssClasses = attachCssClasses; exports.detachCssClasses = detachCssClasses; exports.themeNameFromDevice = themeNameFromDevice; exports.waitForThemeLoad = waitForThemeLoad; exports.resetTheme = function() { $activeThemeLink && $activeThemeLink.attr("href", "about:blank"); currentThemeName = null; pendingThemeName = null } }, /*!***********************************!*\ !*** ./js/integration/angular.js ***! \***********************************/ function(module, exports, __webpack_require__) { var angular = __webpack_require__( /*! angular */ 145); if (angular) { __webpack_require__( /*! ./angular/component_registrator */ 146); __webpack_require__( /*! ./angular/event_registrator */ 173); __webpack_require__( /*! ./angular/components */ 174); __webpack_require__( /*! ./angular/action_executors */ 175) } }, /*!*********************************!*\ !*** external "window.angular" ***! \*********************************/ function(module, exports) { module.exports = window.angular }, /*!*********************************************************!*\ !*** ./js/integration/angular/component_registrator.js ***! \*********************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Config = __webpack_require__( /*! ../../core/config */ 15), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), Class = __webpack_require__( /*! ../../core/class */ 25), type = __webpack_require__( /*! ../../core/utils/common */ 14).type, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, Locker = __webpack_require__( /*! ../../core/utils/locker */ 112), Widget = __webpack_require__( /*! ../../ui/widget/ui.widget */ 95), Editor = __webpack_require__( /*! ../../ui/editor/editor */ 106), NgTemplate = __webpack_require__( /*! ./template */ 147), ngModule = __webpack_require__( /*! ./module */ 148), CollectionWidget = __webpack_require__( /*! ../../ui/collection/ui.collection_widget.edit */ 149), compileSetter = __webpack_require__( /*! ../../core/utils/data */ 50).compileSetter, compileGetter = __webpack_require__( /*! ../../core/utils/data */ 50).compileGetter, extendFromObject = __webpack_require__( /*! ../../core/utils/extend */ 11).extendFromObject, isNumeric = __webpack_require__( /*! ../../core/utils/common */ 14).isNumeric, inflector = __webpack_require__( /*! ../../core/utils/inflector */ 39), errors = __webpack_require__( /*! ../../core/errors */ 7); var ITEM_ALIAS_ATTRIBUTE_NAME = "dxItemAlias", SKIP_APPLY_ACTION_CATEGORIES = ["rendering"]; var safeApply = function(func, scope) { if (scope.$root.$$phase) { return func(scope) } else { return scope.$apply(function() { return func(scope) }) } }; var ComponentBuilder = Class.inherit({ ctor: function(options) { this._componentDisposing = $.Callbacks(); this._optionChangedCallbacks = $.Callbacks(); this._ngLocker = new Locker; this._scope = options.scope; this._$element = options.$element; this._$templates = options.$templates; this._componentClass = options.componentClass; this._parse = options.parse; this._compile = options.compile; this._itemAlias = options.itemAlias; this._transcludeFn = options.transcludeFn; this._digestCallbacks = options.dxDigestCallbacks; this._normalizeOptions(options.ngOptions); this._initComponentBindings(); this._initComponent(this._scope); if (!options.ngOptions) { this._addOptionsStringWatcher(options.ngOptionsString) } }, _addOptionsStringWatcher: function(optionsString) { var that = this; var clearOptionsStringWatcher = that._scope.$watch(optionsString, function(newOptions) { if (!newOptions) { return } clearOptionsStringWatcher(); that._normalizeOptions(newOptions); that._initComponentBindings(); that._component.option(that._evalOptions(that._scope)) }); that._componentDisposing.add(clearOptionsStringWatcher) }, _normalizeOptions: function(options) { var that = this; that._ngOptions = extendFromObject({}, options); if (!options) { return } if (!options.hasOwnProperty("bindingOptions") && options.bindingOptions) { that._ngOptions.bindingOptions = options.bindingOptions } if (options.bindingOptions) { $.each(options.bindingOptions, function(key, value) { if ("string" === type(value)) { that._ngOptions.bindingOptions[key] = { dataPath: value } } }) } }, _initComponent: function(scope) { this._component = new this._componentClass(this._$element, this._evalOptions(scope)); this._component._isHidden = true; this._handleDigestPhase() }, _handleDigestPhase: function() { var that = this, beginUpdate = function() { that._component.beginUpdate() }, endUpdate = function() { that._component.endUpdate() }; that._digestCallbacks.begin.add(beginUpdate); that._digestCallbacks.end.add(endUpdate); that._componentDisposing.add(function() { that._digestCallbacks.begin.remove(beginUpdate); that._digestCallbacks.end.remove(endUpdate) }) }, _initComponentBindings: function() { var that = this, optionDependencies = {}; if (!that._ngOptions.bindingOptions) { return } $.each(that._ngOptions.bindingOptions, function(optionPath, value) { var prevWatchMethod, clearWatcher, separatorIndex = optionPath.search(/\[|\./), optionForSubscribe = separatorIndex > -1 ? optionPath.substring(0, separatorIndex) : optionPath, valuePath = value.dataPath, deepWatch = true, forcePlainWatchMethod = false; if (void 0 !== value.deep) { forcePlainWatchMethod = deepWatch = !!value.deep } if (!optionDependencies[optionForSubscribe]) { optionDependencies[optionForSubscribe] = {} } optionDependencies[optionForSubscribe][optionPath] = valuePath; var watchCallback = function(newValue, oldValue) { if (that._ngLocker.locked(optionPath)) { return } that._ngLocker.obtain(optionPath); that._component.option(optionPath, newValue); updateWatcher(); if (that._component._optionValuesEqual(optionPath, oldValue, newValue) && that._ngLocker.locked(optionPath)) { that._ngLocker.release(optionPath) } }; var updateWatcher = function() { var watchMethod = Array.isArray(that._scope.$eval(valuePath)) && !forcePlainWatchMethod ? "$watchCollection" : "$watch"; if (prevWatchMethod !== watchMethod) { if (clearWatcher) { clearWatcher() } clearWatcher = that._scope[watchMethod](valuePath, watchCallback, deepWatch); prevWatchMethod = watchMethod } }; updateWatcher(); that._componentDisposing.add(clearWatcher) }); that._optionChangedCallbacks.add(function(args) { var optionName = args.name, fullName = args.fullName, component = args.component; if (that._ngLocker.locked(fullName)) { that._ngLocker.release(fullName); return } if (!optionDependencies || !optionDependencies[optionName]) { return } that._ngLocker.obtain(fullName); safeApply(function() { $.each(optionDependencies[optionName], function(optionPath, valuePath) { if (!that._optionsAreLinked(fullName, optionPath)) { return } var value = component.option(optionPath); that._parse(valuePath).assign(that._scope, value); var scopeValue = that._parse(valuePath)(that._scope); if (scopeValue !== value) { args.component.option(optionPath, scopeValue) } }) }, that._scope); var releaseOption = function() { if (that._ngLocker.locked(fullName)) { that._ngLocker.release(fullName) } that._digestCallbacks.end.remove(releaseOption) }; releaseOption(); that._digestCallbacks.end.add(releaseOption) }) }, _optionsAreNested: function(optionPath1, optionPath2) { var parentSeparator = optionPath1[optionPath2.length]; return 0 === optionPath1.indexOf(optionPath2) && ("." === parentSeparator || "[" === parentSeparator) }, _optionsAreLinked: function(optionPath1, optionPath2) { if (optionPath1 === optionPath2) { return true } return optionPath1.length > optionPath2.length ? this._optionsAreNested(optionPath1, optionPath2) : this._optionsAreNested(optionPath2, optionPath1) }, _compilerByTemplate: function(template) { var that = this, scopeItemsPath = this._getScopeItemsPath(); return function(options) { var $resultMarkup = $(template).clone(), dataIsScope = options.model && options.model.constructor === that._scope.$root.constructor, templateScope = dataIsScope ? options.model : options.noModel ? that._scope : that._createScopeWithData(options.model); if (scopeItemsPath) { that._synchronizeScopes(templateScope, scopeItemsPath, options.index) } $resultMarkup.appendTo(options.container); if (!options.noModel) { $resultMarkup.on("$destroy", function() { var destroyAlreadyCalled = !templateScope.$parent; if (destroyAlreadyCalled) { return } templateScope.$destroy() }) } that._applyAsync(that._compile($resultMarkup, that._transcludeFn), templateScope); return $resultMarkup } }, _applyAsync: function(func, scope) { var that = this; func(scope); if (!scope.$root.$$phase) { if (!that._renderingTimer) { that._renderingTimer = setTimeout(function() { scope.$apply(); that._renderingTimer = null }) } that._componentDisposing.add(function() { clearTimeout(that._renderingTimer) }) } }, _getScopeItemsPath: function() { if (this._componentClass.subclassOf(CollectionWidget) && this._ngOptions.bindingOptions && this._ngOptions.bindingOptions.items) { return this._ngOptions.bindingOptions.items.dataPath } }, _createScopeWithData: function(data) { var newScope = this._scope.$new(); if (this._itemAlias) { newScope[this._itemAlias] = data } return newScope }, _synchronizeScopes: function(itemScope, parentPrefix, itemIndex) { if (this._itemAlias && "object" !== typeof itemScope[this._itemAlias]) { this._synchronizeScopeField({ parentScope: this._scope, childScope: itemScope, fieldPath: this._itemAlias, parentPrefix: parentPrefix, itemIndex: itemIndex }) } }, _synchronizeScopeField: function(args) { var parentScope = args.parentScope, childScope = args.childScope, fieldPath = args.fieldPath, parentPrefix = args.parentPrefix, itemIndex = args.itemIndex; var optionOuterPath, innerPathSuffix = fieldPath === this._itemAlias ? "" : "." + fieldPath, collectionField = void 0 !== itemIndex, optionOuterBag = [parentPrefix]; if (collectionField) { if (!isNumeric(itemIndex)) { return } optionOuterBag.push("[", itemIndex, "]") } optionOuterBag.push(innerPathSuffix); optionOuterPath = optionOuterBag.join(""); var clearParentWatcher = parentScope.$watch(optionOuterPath, function(newValue, oldValue) { if (newValue !== oldValue) { compileSetter(fieldPath)(childScope, newValue) } }); var clearItemWatcher = childScope.$watch(fieldPath, function(newValue, oldValue) { if (newValue !== oldValue) { if (collectionField && !compileGetter(parentPrefix)(parentScope)[itemIndex]) { clearItemWatcher(); return } compileSetter(optionOuterPath)(parentScope, newValue) } }); this._componentDisposing.add([clearParentWatcher, clearItemWatcher]) }, _evalOptions: function(scope) { var result = extendFromObject({}, this._ngOptions); delete result.bindingOptions; if (this._ngOptions.bindingOptions) { $.each(this._ngOptions.bindingOptions, function(key, value) { result[key] = scope.$eval(value.dataPath) }) } result._optionChangedCallbacks = this._optionChangedCallbacks; result._disposingCallbacks = this._componentDisposing; result.onActionCreated = function(component, action, config) { if (config && inArray(config.category, SKIP_APPLY_ACTION_CATEGORIES) > -1) { return action } var wrappedAction = function() { var that = this, args = arguments; if (!scope || !scope.$root || scope.$root.$$phase) { return action.apply(that, args) } return safeApply(function() { return action.apply(that, args) }, scope) }; return wrappedAction }; result.beforeActionExecute = result.onActionCreated; result.nestedComponentOptions = function(component) { return { templatesRenderAsynchronously: component.option("templatesRenderAsynchronously"), forceApplyBindings: component.option("forceApplyBindings"), modelByElement: component.option("modelByElement"), onActionCreated: component.option("onActionCreated"), beforeActionExecute: component.option("beforeActionExecute"), nestedComponentOptions: component.option("nestedComponentOptions") } }; result.templatesRenderAsynchronously = true; if (Config().wrapActionsBeforeExecute) { result.forceApplyBindings = function() { safeApply(function() {}, scope) } } result.integrationOptions = { createTemplate: function(element) { return new NgTemplate(element, this._compilerByTemplate.bind(this)) }.bind(this), watchMethod: function(fn, callback, options) { options = options || {}; var immediateValue; var skipCallback = options.skipImmediate; var disposeWatcher = scope.$watch(function() { var value = fn(); if (value instanceof Date) { value = value.valueOf() } return value }, function(newValue) { var isSameValue = immediateValue === newValue; if (!skipCallback && (!isSameValue || isSameValue && options.deep)) { callback(newValue) } skipCallback = false }, options.deep); if (!skipCallback) { immediateValue = fn(); callback(immediateValue) } if (Config().wrapActionsBeforeExecute) { safeApply(function() {}, scope) } return disposeWatcher }, templates: { "dx-polymorph-widget": { render: function(options) { var widgetName = options.model.widget; if (!widgetName) { return } if ("button" === widgetName || "tabs" === widgetName || "dropDownMenu" === widgetName) { var deprecatedName = widgetName; widgetName = inflector.camelize("dx-" + widgetName); errors.log("W0001", "dxToolbar - 'widget' item field", deprecatedName, "16.1", "Use: '" + widgetName + "' instead") } var markup = $("<div " + inflector.dasherize(widgetName) + '="options">').get(0); var newScope = this._scope.$new(); newScope.options = options.model.options; options.container.append(markup); this._compile(markup)(newScope) }.bind(this) } } }; result.modelByElement = function() { return scope }; return result } }); ComponentBuilder = ComponentBuilder.inherit({ ctor: function(options) { this._componentName = options.componentName; this._ngModel = options.ngModel; this._ngModelController = options.ngModelController; this.callBase.apply(this, arguments) }, _isNgModelRequired: function() { return this._componentClass.subclassOf(Editor) && this._ngModel }, _initComponentBindings: function() { this.callBase.apply(this, arguments); this._initNgModelBinding() }, _initNgModelBinding: function() { if (!this._isNgModelRequired()) { return } var that = this; var clearNgModelWatcher = this._scope.$watch(this._ngModel, function(newValue, oldValue) { if (that._ngLocker.locked(that._ngModelOption())) { return } if (newValue === oldValue) { return } that._component.option(that._ngModelOption(), newValue) }); that._optionChangedCallbacks.add(function(args) { that._ngLocker.obtain(that._ngModelOption()); try { if (args.name !== that._ngModelOption()) { return } that._ngModelController.$setViewValue(args.value) } finally { that._ngLocker.release(that._ngModelOption()) } }); this._componentDisposing.add(clearNgModelWatcher) }, _ngModelOption: function() { if (inArray(this._componentName, ["dxFileUploader", "dxTagBox"]) > -1) { return "values" } return "value" }, _evalOptions: function() { if (!this._isNgModelRequired()) { return this.callBase.apply(this, arguments) } var result = this.callBase.apply(this, arguments); result[this._ngModelOption()] = this._parse(this._ngModel)(this._scope); return result } }); var registeredComponents = {}; var registerComponentDirective = function(name) { var priority = "dxValidator" !== name ? 1 : 10; ngModule.directive(name, ["$compile", "$parse", "dxDigestCallbacks", function($compile, $parse, dxDigestCallbacks) { return { restrict: "A", require: "^?ngModel", priority: priority, compile: function($element) { var componentClass = registeredComponents[name], $content = componentClass.subclassOf(Widget) ? $element.contents().detach() : null; return function(scope, $element, attrs, ngModelController, transcludeFn) { $element.append($content); safeApply(function() { new ComponentBuilder({ componentClass: componentClass, componentName: name, compile: $compile, parse: $parse, $element: $element, scope: scope, ngOptionsString: attrs[name], ngOptions: attrs[name] ? scope.$eval(attrs[name]) : {}, ngModel: attrs.ngModel, ngModelController: ngModelController, transcludeFn: transcludeFn, itemAlias: attrs[ITEM_ALIAS_ATTRIBUTE_NAME], dxDigestCallbacks: dxDigestCallbacks }) }, scope) } } } }]) }; registerComponent.callbacks.add(function(name, componentClass) { if (!registeredComponents[name]) { registerComponentDirective(name) } registeredComponents[name] = componentClass }) }, /*!********************************************!*\ !*** ./js/integration/angular/template.js ***! \********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), TemplateBase = __webpack_require__( /*! ../../ui/widget/ui.template_base */ 97), isFunction = __webpack_require__( /*! ../../core/utils/common */ 14).isFunction, domUtils = __webpack_require__( /*! ../../core/utils/dom */ 56); var NgTemplate = TemplateBase.inherit({ ctor: function(element, templateCompiler) { this._element = element; this._compiledTemplate = templateCompiler(domUtils.normalizeTemplateElement(this._element)) }, _renderCore: function(options) { var compiledTemplate = this._compiledTemplate, result = isFunction(compiledTemplate) ? compiledTemplate(options) : compiledTemplate; return result }, source: function() { return $(this._element).clone() } }); module.exports = NgTemplate }, /*!******************************************!*\ !*** ./js/integration/angular/module.js ***! \******************************************/ function(module, exports, __webpack_require__) { var angular = __webpack_require__( /*! angular */ 145); module.exports = angular.module("dx", []) }, /*!*******************************************************!*\ !*** ./js/ui/collection/ui.collection_widget.edit.js ***! \*******************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), BaseCollectionWidget = __webpack_require__( /*! ./ui.collection_widget.base */ 150), errors = __webpack_require__( /*! ../widget/ui.errors */ 22), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), PlainEditStrategy = __webpack_require__( /*! ./ui.collection_widget.edit.strategy.plain */ 167), compileGetter = __webpack_require__( /*! ../../core/utils/data */ 50).compileGetter, DataSource = __webpack_require__( /*! ../../data/data_source/data_source */ 153).DataSource, Selection = __webpack_require__( /*! ../selection/selection */ 169), when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when; var ITEM_DELETING_DATA_KEY = "dxItemDeleting", NOT_EXISTING_INDEX = -1; var indexExists = function(index) { return index !== NOT_EXISTING_INDEX }; var CollectionWidget = BaseCollectionWidget.inherit({ _setOptionsByReference: function() { this.callBase(); extend(this._optionsByReference, { selectedItem: true }) }, _getDefaultOptions: function() { return extend(this.callBase(), { selectionMode: "none", selectionRequired: false, selectionByClick: true, selectedItems: [], selectedItemKeys: [], maxFilterLengthInRequest: 1500, keyExpr: null, selectedIndex: NOT_EXISTING_INDEX, selectedItem: null, onSelectionChanged: null, onItemReordered: null, onItemDeleting: null, onItemDeleted: null }) }, ctor: function(element, options) { this._userOptions = options || {}; this.callBase(element, options) }, _init: function() { this._initEditStrategy(); this.callBase(); this._initKeyGetter(); this._initSelectionModule(); if ("multi" === this.option("selectionMode")) { this._showDeprecatedSelectionMode() } }, _initKeyGetter: function() { this._keyGetter = compileGetter(this.option("keyExpr")) }, _getKeysByItems: function(selectedItems) { return this._editStrategy.getKeysByItems(selectedItems) }, _getItemsByKeys: function(selectedItemKeys, selectedItems) { return this._editStrategy.getItemsByKeys(selectedItemKeys, selectedItems) }, _getKeyByIndex: function(index) { return this._editStrategy.getKeyByIndex(index) }, _getIndexByKey: function(key) { return this._editStrategy.getIndexByKey(key) }, _getIndexByItemData: function(itemData) { return this._editStrategy.getIndexByItemData(itemData) }, _isKeySpecified: function() { return !!(this._dataSource && this._dataSource.key()) }, keyOf: function(item) { var key = item, store = this._dataSource && this._dataSource.store(); if (this.option("keyExpr")) { key = this._keyGetter(item) } else { if (store) { key = store.keyOf(item) } } return key }, _initSelectionModule: function() { var that = this, itemsGetter = that._editStrategy.itemsGetter; this._selection = new Selection({ mode: this.option("selectionMode"), maxFilterLengthInRequest: this.option("maxFilterLengthInRequest"), equalByReference: !this._isKeySpecified(), onSelectionChanged: function(args) { if (args.addedItemKeys.length || args.removedItemKeys.length) { that.option("selectedItems", that._getItemsByKeys(args.selectedItemKeys, args.selectedItems)); that._updateSelectedItems(args.addedItems, args.removedItems) } }, filter: function() { return that._dataSource && that._dataSource.filter() }, totalCount: function() { var items = that.option("items"); var dataSource = that._dataSource; return dataSource && dataSource.totalCount() >= 0 ? dataSource.totalCount() : items.length }, key: function() { if (that.option("keyExpr")) { return that.option("keyExpr") } return that._dataSource && that._dataSource.key() }, keyOf: that.keyOf.bind(that), load: function(options) { if (that._dataSource) { var loadOptions = that._dataSource.loadOptions(); options.customQueryParams = loadOptions.customQueryParams; options.userData = that._dataSource._userData } var store = that._dataSource && that._dataSource.store(); return store ? store.load(options) : $.Deferred().resolve([]) }, dataFields: function() { return that._dataSource && that._dataSource.select() }, plainItems: itemsGetter.bind(that._editStrategy) }) }, _initEditStrategy: function() { var Strategy = PlainEditStrategy; this._editStrategy = new Strategy(this) }, _forgetNextPageLoading: function() { this.callBase() }, _getSelectedItemIndices: function(keys) { var that = this, indices = []; keys = keys || this._selection.getSelectedItemKeys(); $.each(keys, function(_, key) { var selectedIndex = that._getIndexByKey(key); if (indexExists(selectedIndex)) { indices.push(selectedIndex) } }); return indices }, _render: function() { this._rendering = true; if (!this._dataSource || !this._dataSource.isLoading()) { this._syncSelectionOptions(); this._normalizeSelectedItems() } this.callBase(); var selectedItemIndices = this._getSelectedItemIndices(); this._renderSelection(selectedItemIndices, []); this._rendering = false }, _fireContentReadyAction: function() { this._rendering = false; this._rendered = true; this.callBase.apply(this, arguments) }, _syncSelectionOptions: function(byOption) { byOption = byOption || this._chooseSelectOption(); var selectedItem, selectedItems, selectedIndex; switch (byOption) { case "selectedIndex": selectedItem = this._editStrategy.getItemDataByIndex(this.option("selectedIndex")); if (commonUtils.isDefined(selectedItem)) { this._setOptionSilent("selectedItems", [selectedItem]); this._setOptionSilent("selectedItem", selectedItem); this._setOptionSilent("selectedItemKeys", this._editStrategy.getKeysByItems([selectedItem])) } else { this._setOptionSilent("selectedItems", []); this._setOptionSilent("selectedItemKeys", []); this._setOptionSilent("selectedItem", null) } break; case "selectedItems": selectedItems = this.option("selectedItems") || []; selectedIndex = this._editStrategy.getIndexByItemData(selectedItems[0]); if (this.option("selectionRequired") && !indexExists(selectedIndex)) { this._syncSelectionOptions("selectedIndex"); return } this._setOptionSilent("selectedItem", selectedItems[0]); this._setOptionSilent("selectedIndex", selectedIndex); this._setOptionSilent("selectedItemKeys", this._editStrategy.getKeysByItems(selectedItems)); break; case "selectedItem": selectedItem = this.option("selectedItem"); selectedIndex = this._editStrategy.getIndexByItemData(selectedItem); if (this.option("selectionRequired") && !indexExists(selectedIndex)) { this._syncSelectionOptions("selectedIndex"); return } if (commonUtils.isDefined(selectedItem)) { this._setOptionSilent("selectedItems", [selectedItem]); this._setOptionSilent("selectedIndex", selectedIndex); this._setOptionSilent("selectedItemKeys", this._editStrategy.getKeysByItems([selectedItem])) } else { this._setOptionSilent("selectedItems", []); this._setOptionSilent("selectedItemKeys", []); this._setOptionSilent("selectedIndex", NOT_EXISTING_INDEX) } break; case "selectedItemKeys": var selectedItemKeys = this.option("selectedItemKeys"); if (this.option("selectionRequired") && !indexExists(this._getIndexByKey(selectedItemKeys[0]))) { this._syncSelectionOptions("selectedIndex"); return } this._selection.setSelection(selectedItemKeys) } }, _chooseSelectOption: function() { var optionName = "selectedIndex"; var arrayOptionsDefined = function(optionName) { var length = this.option(optionName).length; return length || !length && optionName in this._userOptions }.bind(this); if (arrayOptionsDefined("selectedItems")) { optionName = "selectedItems" } else { if (commonUtils.isDefined(this.option("selectedItem"))) { optionName = "selectedItem" } else { if (arrayOptionsDefined("selectedItemKeys")) { optionName = "selectedItemKeys" } } } return optionName }, _compareKeys: function(oldKeys, newKeys) { if (oldKeys.length !== newKeys.length) { return false } for (var i = 0; i < newKeys.length; i++) { if (oldKeys[i] !== newKeys[i]) { return false } } return true }, _normalizeSelectedItems: function() { if ("none" === this.option("selectionMode")) { this._setOptionSilent("selectedItems", []); this._syncSelectionOptions("selectedItems") } else { if ("single" === this.option("selectionMode")) { var newSelection = this.option("selectedItems"); if (newSelection.length > 1 || !newSelection.length && this.option("selectionRequired") && this.option("items") && this.option("items").length) { var currentSelection = this._selection.getSelectedItems(); var normalizedSelection = void 0 === newSelection[0] ? currentSelection[0] : newSelection[0]; if (void 0 === normalizedSelection) { normalizedSelection = this._editStrategy.itemsGetter()[0] } if (this.option("grouped") && normalizedSelection && normalizedSelection.items) { normalizedSelection.items = [normalizedSelection.items[0]] } this._selection.setSelection(this._getKeysByItems([normalizedSelection])); this._setOptionSilent("selectedItems", [normalizedSelection]); this._syncSelectionOptions("selectedItems") } else { this._selection.setSelection(this._getKeysByItems(newSelection)) } } else { var newKeys = this._getKeysByItems(this.option("selectedItems")); var oldKeys = this._selection.getSelectedItemKeys(); if (!this._compareKeys(oldKeys, newKeys)) { this._selection.setSelection(newKeys) } } } }, _renderSelection: commonUtils.noop, _itemClickHandler: function(e) { this._createAction(function(e) { this._itemSelectHandler(e.jQueryEvent) }.bind(this), { validatingTargetName: "itemElement" })({ itemElement: $(e.currentTarget), jQueryEvent: e }); this.callBase.apply(this, arguments) }, _itemSelectHandler: function(e) { if (!this.option("selectionByClick")) { return } var $itemElement = e.currentTarget; if (this.isItemSelected($itemElement)) { this.unselectItem(e.currentTarget) } else { this.selectItem(e.currentTarget) } }, _selectedItemElement: function(index) { return this._itemElements().eq(index) }, _postprocessRenderItem: function(args) { if ("none" === this.option("selectionMode")) { return } var $itemElement = $(args.itemElement); if (this._isItemSelected(this._editStrategy.getNormalizedIndex($itemElement))) { $itemElement.addClass(this._selectedItemClass()); this._setAriaSelected($itemElement, "true") } else { this._setAriaSelected($itemElement, "false") } }, _updateSelectedItems: function(addedItems, removedItems) { var that = this; if (that._rendered && (addedItems.length || removedItems.length)) { var selectionChangePromise = that._selectionChangePromise; if (!that._rendering) { var normalizedIndex, i, addedSelection = [], removedSelection = []; for (i = 0; i < addedItems.length; i++) { normalizedIndex = that._getIndexByItemData(addedItems[i]); addedSelection.push(normalizedIndex); that._addSelection(normalizedIndex) } for (i = 0; i < removedItems.length; i++) { normalizedIndex = that._getIndexByItemData(removedItems[i]); removedSelection.push(normalizedIndex); that._removeSelection(normalizedIndex) } that._updateSelection(addedSelection, removedSelection) } when(selectionChangePromise).done(function() { that._fireSelectionChangeEvent(addedItems, removedItems) }) } }, _fireSelectionChangeEvent: function(addedItems, removedItems) { this._createActionByOption("onSelectionChanged", { excludeValidators: ["disabled", "readOnly"] })({ addedItems: addedItems, removedItems: removedItems }) }, _updateSelection: function() { this._renderSelection.apply(this, arguments) }, _setAriaSelected: function($target, value) { this.setAria("selected", value, $target) }, _removeSelection: function(normalizedIndex) { var $itemElement = this._editStrategy.getItemElement(normalizedIndex); if (indexExists(normalizedIndex)) { $itemElement.removeClass(this._selectedItemClass()); this._setAriaSelected($itemElement, "false"); $itemElement.triggerHandler("stateChanged", false) } }, _showDeprecatedSelectionMode: function() { errors.log("W0001", this.NAME, "selectionMode: 'multi'", "16.1", "Use selectionMode: 'multiple' instead"); this.option("selectionMode", "multiple") }, _addSelection: function(normalizedIndex) { var $itemElement = this._editStrategy.getItemElement(normalizedIndex); if (indexExists(normalizedIndex)) { $itemElement.addClass(this._selectedItemClass()); this._setAriaSelected($itemElement, "true"); $itemElement.triggerHandler("stateChanged", true) } }, _isItemSelected: function(index) { var key = this._getKeyByIndex(index); return this._selection.isItemSelected(key) }, _optionChanged: function(args) { if (this._cancelOptionChange === args.name) { return } switch (args.name) { case "selectionMode": if ("multi" === args.value) { this._showDeprecatedSelectionMode() } else { this._invalidate() } break; case "selectedIndex": case "selectedItem": case "selectedItems": case "selectedItemKeys": this._syncSelectionOptions(args.name); this._normalizeSelectedItems(); break; case "keyExpr": this._initKeyGetter(); break; case "selectionRequired": this._normalizeSelectedItems(); break; case "selectionByClick": case "onSelectionChanged": case "onItemDeleting": case "onItemDeleted": case "onItemReordered": case "maxFilterLengthInRequest": break; default: this.callBase(args) } }, _clearSelectedItems: function() { this._setOptionSilent("selectedItems", []); this._syncSelectionOptions("selectedItems") }, _setOptionSilent: function(name, value) { this._cancelOptionChange = name; this.option(name, value); this._cancelOptionChange = false }, _waitDeletingPrepare: function($itemElement) { if ($itemElement.data(ITEM_DELETING_DATA_KEY)) { return $.Deferred().resolve().promise() } $itemElement.data(ITEM_DELETING_DATA_KEY, true); var deferred = $.Deferred(), deletingActionArgs = { cancel: false }, deletePromise = this._itemEventHandler($itemElement, "onItemDeleting", deletingActionArgs, { excludeValidators: ["disabled", "readOnly"] }); when(deletePromise).always(function(value) { var deletePromiseExists = !deletePromise, deletePromiseResolved = !deletePromiseExists && "resolved" === deletePromise.state(), argumentsSpecified = !!arguments.length, shouldDelete = deletePromiseExists || deletePromiseResolved && !argumentsSpecified || deletePromiseResolved && value; when(deletingActionArgs.cancel).always(function() { $itemElement.data(ITEM_DELETING_DATA_KEY, false) }).done(function(cancel) { shouldDelete && !cancel ? deferred.resolve() : deferred.reject() }).fail(deferred.reject) }.bind(this)); return deferred.promise() }, _deleteItemFromDS: function($item) { if (!this._dataSource) { return $.Deferred().resolve().promise() } var deferred = $.Deferred(), disabledState = this.option("disabled"), dataStore = this._dataSource.store(); this.option("disabled", true); if (!dataStore.remove) { throw errors.Error("E1011") } dataStore.remove(dataStore.keyOf(this._getItemData($item))).done(function(key) { if (void 0 !== key) { deferred.resolve() } else { deferred.reject() } }).fail(function() { deferred.reject() }); deferred.always(function() { this.option("disabled", disabledState) }.bind(this)); return deferred }, _tryRefreshLastPage: function() { var deferred = $.Deferred(); if (this._isLastPage() || this.option("grouped")) { deferred.resolve() } else { this._refreshLastPage().done(function() { deferred.resolve() }) } return deferred.promise() }, _refreshLastPage: function() { this._expectLastItemLoading(); return this._dataSource.load() }, _updateSelectionAfterDelete: function(index) { var key = this._getKeyByIndex(index); this._selection.deselect([key]) }, _simulateOptionChange: function(optionName) { var optionValue = this.option(optionName); if (optionValue instanceof DataSource) { return } this._optionChangedAction({ name: optionName, fullName: optionName, value: optionValue }) }, isItemSelected: function(itemElement) { return this._isItemSelected(this._editStrategy.getNormalizedIndex(itemElement)) }, selectItem: function(itemElement) { if ("none" === this.option("selectionMode")) { return } var itemIndex = this._editStrategy.getNormalizedIndex(itemElement); if (!indexExists(itemIndex)) { return } var key = this._getKeyByIndex(itemIndex); if (this._selection.isItemSelected(key)) { return } if ("single" === this.option("selectionMode")) { this._selection.setSelection([key]) } else { var selectedItemKeys = this.option("selectedItemKeys"); selectedItemKeys.push(key); this._selection.setSelection(selectedItemKeys) } }, unselectItem: function(itemElement) { var itemIndex = this._editStrategy.getNormalizedIndex(itemElement); if (!indexExists(itemIndex)) { return } var selectedItemKeys = this._selection.getSelectedItemKeys(); if (this.option("selectionRequired") && selectedItemKeys.length <= 1) { return } var key = this._getKeyByIndex(itemIndex); this._selection.deselect([key]) }, deleteItem: function(itemElement) { var that = this, deferred = $.Deferred(), $item = this._editStrategy.getItemElement(itemElement), index = this._editStrategy.getNormalizedIndex(itemElement), changingOption = this._dataSource ? "dataSource" : "items", itemResponseWaitClass = this._itemResponseWaitClass(); if (indexExists(index)) { this._waitDeletingPrepare($item).done(function() { $item.addClass(itemResponseWaitClass); var deletedActionArgs = that._extendActionArgs($item); that._deleteItemFromDS($item).done(function() { that._updateSelectionAfterDelete(index); that._editStrategy.deleteItemAtIndex(index); that._simulateOptionChange(changingOption); that._itemEventHandler($item, "onItemDeleted", deletedActionArgs, { beforeExecute: function() { $item.detach() }, excludeValidators: ["disabled", "readOnly"] }); that._renderEmptyMessage(); that._tryRefreshLastPage().done(function() { deferred.resolveWith(that) }) }).fail(function() { $item.removeClass(itemResponseWaitClass); deferred.rejectWith(that) }) }).fail(function() { deferred.rejectWith(that) }) } else { deferred.rejectWith(that) } return deferred.promise() }, reorderItem: function(itemElement, toItemElement) { var deferred = $.Deferred(), that = this, strategy = this._editStrategy, $movingItem = strategy.getItemElement(itemElement), $destinationItem = strategy.getItemElement(toItemElement), movingIndex = strategy.getNormalizedIndex(itemElement), destinationIndex = strategy.getNormalizedIndex(toItemElement), changingOption = this._dataSource ? "dataSource" : "items"; var canMoveItems = indexExists(movingIndex) && indexExists(destinationIndex) && movingIndex !== destinationIndex; if (canMoveItems) { deferred.resolveWith(this) } else { deferred.rejectWith(this) } return deferred.promise().done(function() { $destinationItem[strategy.itemPlacementFunc(movingIndex, destinationIndex)]($movingItem); strategy.moveItemAtIndexToIndex(movingIndex, destinationIndex); that.option("selectedItems", that._getItemsByKeys(that._selection.getSelectedItemKeys(), that._selection.getSelectedItems())); if ("items" === changingOption) { that._simulateOptionChange(changingOption) } that._itemEventHandler($movingItem, "onItemReordered", { fromIndex: strategy.getIndex(movingIndex), toIndex: strategy.getIndex(destinationIndex) }, { excludeValidators: ["disabled", "readOnly"] }) }) } }); module.exports = CollectionWidget }, /*!*******************************************************!*\ !*** ./js/ui/collection/ui.collection_widget.base.js ***! \*******************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), isPlainObject = __webpack_require__( /*! ../../core/utils/type */ 12).isPlainObject, when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, Action = __webpack_require__( /*! ../../core/action */ 49), Guid = __webpack_require__( /*! ../../core/guid */ 151), domUtils = __webpack_require__( /*! ../../core/utils/dom */ 56), dataUtils = __webpack_require__( /*! ../../core/utils/data */ 50), Widget = __webpack_require__( /*! ../widget/ui.widget */ 95), eventUtils = __webpack_require__( /*! ../../events/utils */ 71), pointerEvents = __webpack_require__( /*! ../../events/pointer */ 76), DataHelperMixin = __webpack_require__( /*! ../../data_helper */ 152), CollectionWidgetItem = __webpack_require__( /*! ./item */ 163), selectors = __webpack_require__( /*! ../widget/jquery.selectors */ 102), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), holdEvent = __webpack_require__( /*! ../../events/hold */ 164), clickEvent = __webpack_require__( /*! ../../events/click */ 75), contextMenuEvent = __webpack_require__( /*! ../../events/contextmenu */ 165), BindableTemplate = __webpack_require__( /*! ../widget/bindable_template */ 166); var COLLECTION_CLASS = "dx-collection", ITEM_CLASS = "dx-item", CONTENT_CLASS_POSTFIX = "-content", ITEM_CONTENT_PLACEHOLDER_CLASS = "dx-item-content-placeholder", ITEM_DATA_KEY = "dxItemData", ITEM_INDEX_KEY = "dxItemIndex", ITEM_TEMPLATE_ID_PREFIX = "tmpl-", ITEMS_SELECTOR = "[data-options*='dxItem']", SELECTED_ITEM_CLASS = "dx-item-selected", ITEM_RESPONSE_WAIT_CLASS = "dx-item-response-wait", EMPTY_COLLECTION = "dx-empty-collection", TEMPLATE_WRAPPER_CLASS = "dx-template-wrapper", ITEM_PATH_REGEX = /^([^.]+\[\d+\]\.)+([\w\.]+)$/; var FOCUS_UP = "up", FOCUS_DOWN = "down", FOCUS_LEFT = "left", FOCUS_RIGHT = "right", FOCUS_PAGE_UP = "pageup", FOCUS_PAGE_DOWN = "pagedown", FOCUS_LAST = "last", FOCUS_FIRST = "first"; var CollectionWidget = Widget.inherit({ _activeStateUnit: "." + ITEM_CLASS, _supportedKeys: function() { var enter = function(e) { var $itemElement = this.option("focusedElement"); if (!$itemElement) { return } e.target = $itemElement; e.currentTarget = $itemElement; this._itemClickHandler(e) }, space = function(e) { e.preventDefault(); enter.call(this, e) }, move = function(location, e) { e.preventDefault(); e.stopPropagation(); this._moveFocus(location, e) }; return extend(this.callBase(), { space: space, enter: enter, leftArrow: move.bind(this, FOCUS_LEFT), rightArrow: move.bind(this, FOCUS_RIGHT), upArrow: move.bind(this, FOCUS_UP), downArrow: move.bind(this, FOCUS_DOWN), pageUp: move.bind(this, FOCUS_UP), pageDown: move.bind(this, FOCUS_DOWN), home: move.bind(this, FOCUS_FIRST), end: move.bind(this, FOCUS_LAST) }) }, _getDefaultOptions: function() { return extend(this.callBase(), { selectOnFocus: false, loopItemFocus: true, items: [], itemTemplate: "item", onItemRendered: null, onItemClick: null, onItemHold: null, itemHoldTimeout: 750, onItemContextMenu: null, onFocusedItemChanged: null, noDataText: messageLocalization.format("dxCollectionWidget-noDataText"), dataSource: null, _itemAttributes: {}, itemTemplateProperty: "template", focusOnSelectedItem: true, focusedElement: null, disabledExpr: function(data) { return data ? data.disabled : void 0 }, visibleExpr: function(data) { return data ? data.visible : void 0 } }) }, _getAnonymousTemplateName: function() { return "item" }, _init: function() { this.callBase(); this._cleanRenderedItems(); this._refreshDataSource() }, _initTemplates: function() { this._initItemsFromMarkup(); this.callBase(); this._defaultTemplates.item = new BindableTemplate(function($container, data) { if (isPlainObject(data)) { if (data.text) { $container.text(data.text) } if (data.html) { $container.html(data.html) } } else { $container.text(String(data)) } }, ["text", "html"], this.option("integrationOptions.watchMethod")) }, _initItemsFromMarkup: function() { var $items = this.element().contents().filter(ITEMS_SELECTOR); if (!$items.length || this.option("items").length) { return } var items = $.map($items, function(item) { var $item = $(item); var result = domUtils.getElementOptions(item).dxItem; var isTemplateRequired = $.trim($item.html()) && !result.template; if (isTemplateRequired) { result.template = this._prepareItemTemplate($item) } else { $item.remove() } return result }.bind(this)); this.option("items", items) }, _prepareItemTemplate: function($item) { var templateId = ITEM_TEMPLATE_ID_PREFIX + new Guid; var templateOptions = 'dxTemplate: { name: "' + templateId + '" }'; $item.detach().clone().attr("data-options", templateOptions).data("options", templateOptions).appendTo(this.element()); return templateId }, _dataSourceOptions: function() { return { paginate: false } }, _cleanRenderedItems: function() { this._renderedItemsCount = 0 }, _focusTarget: function() { return this.element() }, _focusInHandler: function(e) { this.callBase.apply(this, arguments); if (inArray(e.target, this._focusTarget()) === -1) { return } var $focusedElement = this.option("focusedElement"); if ($focusedElement && $focusedElement.length) { this._setFocusedItem($focusedElement) } else { var $activeItem = this._getActiveItem(); if ($activeItem.length) { this.option("focusedElement", $activeItem) } } }, _focusOutHandler: function() { this.callBase.apply(this, arguments); var $target = this.option("focusedElement"); if ($target) { this._toggleFocusClass(false, $target) } }, _getActiveItem: function(last) { var $focusedElement = this.option("focusedElement"); if ($focusedElement && $focusedElement.length) { return $focusedElement } var index = this.option("focusOnSelectedItem") ? this.option("selectedIndex") : 0, activeElements = this._getActiveElement(), lastIndex = activeElements.length - 1; if (index < 0) { index = last ? lastIndex : 0 } return activeElements.eq(index) }, _renderFocusTarget: function() { this.callBase.apply(this, arguments); this._refreshActiveDescendant() }, _moveFocus: function(location) { var $newTarget, $items = this._getAvailableItems(); switch (location) { case FOCUS_PAGE_UP: case FOCUS_UP: $newTarget = this._prevItem($items); break; case FOCUS_PAGE_DOWN: case FOCUS_DOWN: $newTarget = this._nextItem($items); break; case FOCUS_RIGHT: $newTarget = this.option("rtlEnabled") ? this._prevItem($items) : this._nextItem($items); break; case FOCUS_LEFT: $newTarget = this.option("rtlEnabled") ? this._nextItem($items) : this._prevItem($items); break; case FOCUS_FIRST: $newTarget = $items.first(); break; case FOCUS_LAST: $newTarget = $items.last(); break; default: return false } if (0 !== $newTarget.length) { this.option("focusedElement", $newTarget) } }, _getAvailableItems: function($itemElements) { $itemElements = $itemElements || this._itemElements(); return $itemElements.filter(":visible").not(".dx-state-disabled") }, _prevItem: function($items) { var $target = this._getActiveItem(), targetIndex = $items.index($target), $last = $items.last(), $item = $($items[targetIndex - 1]), loop = this.option("loopItemFocus"); if (0 === $item.length && loop) { $item = $last } return $item }, _nextItem: function($items) { var $target = this._getActiveItem(true), targetIndex = $items.index($target), $first = $items.first(), $item = $($items[targetIndex + 1]), loop = this.option("loopItemFocus"); if (0 === $item.length && loop) { $item = $first } return $item }, _selectFocusedItem: function($target) { this.selectItem($target) }, _removeFocusedItem: function($target) { if ($target && $target.length) { this._toggleFocusClass(false, $target); $target.removeAttr("id") } }, _refreshActiveDescendant: function() { this.setAria("activedescendant", ""); this.setAria("activedescendant", this.getFocusedItemId()) }, _setFocusedItem: function($target) { if (!$target || !$target.length) { return } $target.attr("id", this.getFocusedItemId()); this._toggleFocusClass(true, $target); this.onFocusedItemChanged(this.getFocusedItemId()); this._refreshActiveDescendant(); if (this.option("selectOnFocus")) { this._selectFocusedItem($target) } }, _findItemElementByItem: function(item) { var result = $(), that = this; this.itemElements().each(function() { var $item = $(this); if ($item.data(that._itemDataKey()) === item) { result = $item; return false } }); return result }, _getIndexByItem: function(item) { return this.option("items").indexOf(item) }, _itemOptionChanged: function(item, property, value, oldValue) { var $item = this._findItemElementByItem(item); if (!$item.length) { return } if (!this.constructor.ItemClass.getInstance($item).setDataField(property, value)) { var itemData = this._getItemData($item), index = $item.data(this._itemIndexKey()); this._renderItem(index, itemData, null, $item) } }, _optionChanged: function(args) { if ("items" === args.name) { var matches = args.fullName.match(ITEM_PATH_REGEX); if (matches && matches.length) { var property = matches[matches.length - 1], itemPath = args.fullName.replace("." + property, ""), item = this.option(itemPath); this._itemOptionChanged(item, property, args.value, args.previousValue); return } } switch (args.name) { case "items": case "_itemAttributes": case "itemTemplateProperty": this._cleanRenderedItems(); this._invalidate(); break; case "dataSource": this.option("items", []); this._refreshDataSource(); this._renderEmptyMessage(); break; case "noDataText": this._renderEmptyMessage(); break; case "itemTemplate": this._invalidate(); break; case "onItemRendered": this._createItemRenderAction(); break; case "onItemClick": break; case "onItemHold": case "itemHoldTimeout": this._attachHoldEvent(); break; case "onItemContextMenu": this._attachContextMenuEvent(); break; case "onFocusedItemChanged": this.onFocusedItemChanged = this._createActionByOption("onFocusedItemChanged"); break; case "selectOnFocus": case "loopItemFocus": case "focusOnSelectedItem": break; case "focusedElement": this._removeFocusedItem(args.previousValue); this._setFocusedItem(args.value); break; case "visibleExpr": case "disabledExpr": this._invalidate(); break; default: this.callBase(args) } }, _loadNextPage: function() { var dataSource = this._dataSource; this._expectNextPageLoading(); dataSource.pageIndex(1 + dataSource.pageIndex()); return dataSource.load() }, _expectNextPageLoading: function() { this._startIndexForAppendedItems = 0 }, _expectLastItemLoading: function() { this._startIndexForAppendedItems = -1 }, _forgetNextPageLoading: function() { this._startIndexForAppendedItems = null }, _dataSourceChangedHandler: function(newItems) { var items = this.option("items"); if (this._initialized && items && this._shouldAppendItems()) { this._renderedItemsCount = items.length; if (!this._isLastPage() || this._startIndexForAppendedItems !== -1) { this.option().items = items.concat(newItems.slice(this._startIndexForAppendedItems)) } this._forgetNextPageLoading(); this._renderContent(); this._renderFocusTarget() } else { this.option("items", newItems) } }, _dataSourceLoadErrorHandler: function() { this._forgetNextPageLoading(); this.option("items", this.option("items")) }, _shouldAppendItems: function() { return null != this._startIndexForAppendedItems && this._allowDynamicItemsAppend() }, _allowDynamicItemsAppend: function() { return false }, _clean: function() { this._cleanFocusState(); this._cleanItemContainer() }, _cleanItemContainer: function() { this._itemContainer().empty() }, _dispose: function() { this.callBase(); clearTimeout(this._itemFocusTimeout) }, _refresh: function() { this._cleanRenderedItems(); this.callBase.apply(this, arguments) }, _itemContainer: function() { return this.element() }, _itemClass: function() { return ITEM_CLASS }, _itemContentClass: function() { return this._itemClass() + CONTENT_CLASS_POSTFIX }, _selectedItemClass: function() { return SELECTED_ITEM_CLASS }, _itemResponseWaitClass: function() { return ITEM_RESPONSE_WAIT_CLASS }, _itemSelector: function() { return "." + this._itemClass() }, _itemDataKey: function() { return ITEM_DATA_KEY }, _itemIndexKey: function() { return ITEM_INDEX_KEY }, _itemElements: function() { return this._itemContainer().find(this._itemSelector()) }, _render: function() { this.onFocusedItemChanged = this._createActionByOption("onFocusedItemChanged"); this.callBase(); this.element().addClass(COLLECTION_CLASS); this._attachClickEvent(); this._attachHoldEvent(); this._attachContextMenuEvent() }, _attachClickEvent: function() { var itemSelector = this._itemSelector(), clickEventNamespace = eventUtils.addNamespace(clickEvent.name, this.NAME), pointerDownEventNamespace = eventUtils.addNamespace(pointerEvents.down, this.NAME), that = this; var pointerDownAction = new Action(function(args) { var event = args.event; that._itemPointerDownHandler(event) }); this._itemContainer().off(clickEventNamespace, itemSelector).off(pointerDownEventNamespace, itemSelector).on(clickEventNamespace, itemSelector, function(e) { this._itemClickHandler(e) }.bind(this)).on(pointerDownEventNamespace, itemSelector, function(e) { pointerDownAction.execute({ element: $(e.target), event: e }) }) }, _itemClickHandler: function(e, args, config) { this._itemJQueryEventHandler(e, "onItemClick", args, config) }, _itemPointerDownHandler: function(e) { if (!this.option("focusStateEnabled")) { return } this._itemFocusHandler = function() { clearTimeout(this._itemFocusTimeout); this._itemFocusHandler = null; if (e.isDefaultPrevented()) { return } var $target = $(e.target), $closestItem = $target.closest(this._itemElements()), $closestFocusable = this._closestFocusable($target); if ($closestItem.length && inArray($closestFocusable.get(0), this._focusTarget()) !== -1) { this.option("focusedElement", $closestItem) } }.bind(this); this._itemFocusTimeout = setTimeout(this._forcePointerDownFocus.bind(this)) }, _closestFocusable: function($target) { if ($target.is(selectors.focusable)) { return $target } else { $target = $target.parent(); while ($target.length) { if ($target.is(selectors.focusable)) { return $target } $target = $target.parent() } } }, _forcePointerDownFocus: function() { this._itemFocusHandler && this._itemFocusHandler() }, _updateFocusState: function() { this.callBase.apply(this, arguments); this._forcePointerDownFocus() }, _attachHoldEvent: function() { var $itemContainer = this._itemContainer(), itemSelector = this._itemSelector(), eventName = eventUtils.addNamespace(holdEvent.name, this.NAME); $itemContainer.off(eventName, itemSelector); $itemContainer.on(eventName, itemSelector, { timeout: this._getHoldTimeout() }, this._itemHoldHandler.bind(this)) }, _getHoldTimeout: function() { return this.option("itemHoldTimeout") }, _shouldFireHoldEvent: function() { return this.hasActionSubscription("onItemHold") }, _itemHoldHandler: function(e) { if (this._shouldFireHoldEvent()) { this._itemJQueryEventHandler(e, "onItemHold") } else { e.cancel = true } }, _attachContextMenuEvent: function() { var $itemContainer = this._itemContainer(), itemSelector = this._itemSelector(), eventName = eventUtils.addNamespace(contextMenuEvent.name, this.NAME); $itemContainer.off(eventName, itemSelector); $itemContainer.on(eventName, itemSelector, this._itemContextMenuHandler.bind(this)) }, _shouldFireContextMenuEvent: function() { return this.hasActionSubscription("onItemContextMenu") }, _itemContextMenuHandler: function(e) { if (this._shouldFireContextMenuEvent()) { this._itemJQueryEventHandler(e, "onItemContextMenu") } else { e.cancel = true } }, _renderContentImpl: function() { var items = this.option("items") || []; if (this._renderedItemsCount) { this._renderItems(items.slice(this._renderedItemsCount)) } else { this._renderItems(items) } }, _renderItems: function(items) { if (items.length) { $.each(items, this._renderItem.bind(this)) } this._renderEmptyMessage() }, _renderItem: function(index, itemData, $container, $itemToReplace) { $container = $container || this._itemContainer(); var $itemFrame = this._renderItemFrame(index, itemData, $container, $itemToReplace); this._setElementData($itemFrame, itemData, index); $itemFrame.attr(this.option("_itemAttributes")); this._attachItemClickEvent(itemData, $itemFrame); var $itemContent = $itemFrame.find("." + ITEM_CONTENT_PLACEHOLDER_CLASS); $itemContent.removeClass(ITEM_CONTENT_PLACEHOLDER_CLASS); var renderContentPromise = this._renderItemContent({ index: index, itemData: itemData, container: $itemContent, contentClass: this._itemContentClass(), defaultTemplateName: this.option("itemTemplate") }); var that = this; when(renderContentPromise).done(function($itemContent) { that._postprocessRenderItem({ itemElement: $itemFrame, itemContent: $itemContent, itemData: itemData, itemIndex: index }); that._executeItemRenderAction(index, itemData, $itemFrame) }); return $itemFrame }, _attachItemClickEvent: function(itemData, $itemElement) { if (!itemData || !itemData.onClick) { return } $itemElement.on(clickEvent.name, function(e) { this._itemEventHandlerByHandler($itemElement, itemData.onClick, { jQueryEvent: e }) }.bind(this)) }, _renderItemContent: function(args) { var itemTemplateName = this._getItemTemplateName(args); var itemTemplate = this._getTemplate(itemTemplateName); this._addItemContentClasses(args); var $templateResult = this._createItemByTemplate(itemTemplate, args); if (!$templateResult.hasClass(TEMPLATE_WRAPPER_CLASS)) { return args.container } return this._renderItemContentByNode(args, $templateResult) }, _renderItemContentByNode: function(args, $node) { args.container.replaceWith($node); args.container = $node; this._addItemContentClasses(args); return $node }, _addItemContentClasses: function(args) { var classes = [ITEM_CLASS + CONTENT_CLASS_POSTFIX, args.contentClass]; args.container.addClass(classes.join(" ")) }, _renderItemFrame: function(index, itemData, $container, $itemToReplace) { var $itemFrame = $("<div>"); new this.constructor.ItemClass($itemFrame, this._itemOptions(), itemData || {}); if ($itemToReplace && $itemToReplace.length) { $itemToReplace.replaceWith($itemFrame) } else { $itemFrame.appendTo($container) } return $itemFrame }, _itemOptions: function() { var that = this; return { watchMethod: function() { return that.option("integrationOptions.watchMethod") }, fieldGetter: function(field) { var expr = that.option(field + "Expr"), getter = dataUtils.compileGetter(expr); return getter } } }, _postprocessRenderItem: commonUtils.noop, _executeItemRenderAction: function(index, itemData, itemElement) { this._getItemRenderAction()({ itemElement: itemElement, itemIndex: index, itemData: itemData }) }, _setElementData: function(element, data, index) { element.addClass([ITEM_CLASS, this._itemClass()].join(" ")).data(this._itemDataKey(), data).data(this._itemIndexKey(), index) }, _createItemRenderAction: function() { return this._itemRenderAction = this._createActionByOption("onItemRendered", { element: this.element(), excludeValidators: ["designMode", "disabled", "readOnly"], category: "rendering" }) }, _getItemRenderAction: function() { return this._itemRenderAction || this._createItemRenderAction() }, _getItemTemplateName: function(args) { var data = args.itemData, templateProperty = args.templateProperty || this.option("itemTemplateProperty"), template = data && data[templateProperty]; return template || args.defaultTemplateName }, _createItemByTemplate: function(itemTemplate, renderArgs) { return itemTemplate.render({ model: renderArgs.itemData, container: renderArgs.container, index: renderArgs.index }) }, _emptyMessageContainer: function() { return this._itemContainer() }, _renderEmptyMessage: function() { var noDataText = this.option("noDataText"), items = this.option("items"), hideNoData = !noDataText || items && items.length || this._isDataSourceLoading(); if (hideNoData && this._$noData) { this._$noData.remove(); this._$noData = null; this.setAria("label", void 0) } if (!hideNoData) { this._$noData = this._$noData || $("<div>").addClass("dx-empty-message"); this._$noData.appendTo(this._emptyMessageContainer()).html(noDataText); this.setAria("label", noDataText) } this.element().toggleClass(EMPTY_COLLECTION, !hideNoData) }, _itemJQueryEventHandler: function(jQueryEvent, handlerOptionName, actionArgs, actionConfig) { this._itemEventHandler(jQueryEvent.target, handlerOptionName, extend(actionArgs, { jQueryEvent: jQueryEvent }), actionConfig) }, _itemEventHandler: function(initiator, handlerOptionName, actionArgs, actionConfig) { var action = this._createActionByOption(handlerOptionName, extend({ validatingTargetName: "itemElement" }, actionConfig)); return this._itemEventHandlerImpl(initiator, action, actionArgs) }, _itemEventHandlerByHandler: function(initiator, handler, actionArgs, actionConfig) { var action = this._createAction(handler, extend({ validatingTargetName: "itemElement" }, actionConfig)); return this._itemEventHandlerImpl(initiator, action, actionArgs) }, _itemEventHandlerImpl: function(initiator, action, actionArgs) { var $itemElement = this._closestItemElement($(initiator)), args = extend({}, actionArgs); return action(extend(actionArgs, this._extendActionArgs($itemElement), args)) }, _extendActionArgs: function($itemElement) { return { itemElement: $itemElement, itemIndex: this._itemElements().index($itemElement), itemData: this._getItemData($itemElement) } }, _closestItemElement: function($element) { return $($element).closest(this._itemSelector()) }, _getItemData: function(itemElement) { return $(itemElement).data(this._itemDataKey()) }, getFocusedItemId: function() { if (!this._focusedItemId) { this._focusedItemId = "dx-" + new Guid } return this._focusedItemId }, itemElements: function() { return this._itemElements() }, itemsContainer: function() { return this._itemContainer() } }).include(DataHelperMixin); CollectionWidget.ItemClass = CollectionWidgetItem; module.exports = CollectionWidget }, /*!*************************!*\ !*** ./js/core/guid.js ***! \*************************/ function(module, exports, __webpack_require__) { var Class = __webpack_require__( /*! ./class */ 25); var Guid = Class.inherit({ ctor: function(value) { if (value) { value = String(value) } this._value = this._normalize(value || this._generate()) }, _normalize: function(value) { value = value.replace(/[^a-f0-9]/gi, "").toLowerCase(); while (value.length < 32) { value += "0" } return [value.substr(0, 8), value.substr(8, 4), value.substr(12, 4), value.substr(16, 4), value.substr(20, 12)].join("-") }, _generate: function() { var value = ""; for (var i = 0; i < 32; i++) { value += Math.round(15 * Math.random()).toString(16) } return value }, toString: function() { return this._value }, valueOf: function() { return this._value }, toJSON: function() { return this._value } }); module.exports = Guid }, /*!***************************!*\ !*** ./js/data_helper.js ***! \***************************/ function(module, exports, __webpack_require__) { var DataSource = __webpack_require__( /*! ./data/data_source/data_source */ 153).DataSource, extend = __webpack_require__( /*! ./core/utils/extend */ 11).extend, normalizeDataSourceOptions = __webpack_require__( /*! ./data/data_source/data_source */ 153).normalizeDataSourceOptions; var DATA_SOURCE_OPTIONS_METHOD = "_dataSourceOptions", DATA_SOURCE_CHANGED_METHOD = "_dataSourceChangedHandler", DATA_SOURCE_LOAD_ERROR_METHOD = "_dataSourceLoadErrorHandler", DATA_SOURCE_LOADING_CHANGED_METHOD = "_dataSourceLoadingChangedHandler", DATA_SOURCE_FROM_URL_LOAD_MODE_METHOD = "_dataSourceFromUrlLoadMode", SPECIFIC_DATA_SOURCE_OPTION = "_getSpecificDataSourceOption"; var DataHelperMixin = { postCtor: function() { this.on("disposing", function() { this._disposeDataSource() }.bind(this)) }, _refreshDataSource: function() { this._initDataSource(); this._loadDataSource() }, _initDataSource: function() { var widgetDataSourceOptions, dataSourceType, dataSourceOptions = SPECIFIC_DATA_SOURCE_OPTION in this ? this[SPECIFIC_DATA_SOURCE_OPTION]() : this.option("dataSource"); this._disposeDataSource(); if (dataSourceOptions) { if (dataSourceOptions instanceof DataSource) { this._isSharedDataSource = true; this._dataSource = dataSourceOptions } else { widgetDataSourceOptions = DATA_SOURCE_OPTIONS_METHOD in this ? this[DATA_SOURCE_OPTIONS_METHOD]() : {}; dataSourceType = this._dataSourceType ? this._dataSourceType() : DataSource; dataSourceOptions = normalizeDataSourceOptions(dataSourceOptions, { fromUrlLoadMode: DATA_SOURCE_FROM_URL_LOAD_MODE_METHOD in this && this[DATA_SOURCE_FROM_URL_LOAD_MODE_METHOD]() }); this._dataSource = new dataSourceType(extend(true, {}, widgetDataSourceOptions, dataSourceOptions)) } this._addDataSourceHandlers() } }, _addDataSourceHandlers: function() { if (DATA_SOURCE_CHANGED_METHOD in this) { this._addDataSourceChangeHandler() } if (DATA_SOURCE_LOAD_ERROR_METHOD in this) { this._addDataSourceLoadErrorHandler() } if (DATA_SOURCE_LOADING_CHANGED_METHOD in this) { this._addDataSourceLoadingChangedHandler() } this._addReadyWatcher() }, _addReadyWatcher: function() { this._dataSource.on("loadingChanged", function(isLoading) { this._ready && this._ready(!isLoading) }.bind(this)) }, _addDataSourceChangeHandler: function() { var dataSource = this._dataSource; this._proxiedDataSourceChangedHandler = function() { this[DATA_SOURCE_CHANGED_METHOD](dataSource.items()) }.bind(this); dataSource.on("changed", this._proxiedDataSourceChangedHandler) }, _addDataSourceLoadErrorHandler: function() { this._proxiedDataSourceLoadErrorHandler = this[DATA_SOURCE_LOAD_ERROR_METHOD].bind(this); this._dataSource.on("loadError", this._proxiedDataSourceLoadErrorHandler) }, _addDataSourceLoadingChangedHandler: function() { this._proxiedDataSourceLoadingChangedHandler = this[DATA_SOURCE_LOADING_CHANGED_METHOD].bind(this); this._dataSource.on("loadingChanged", this._proxiedDataSourceLoadingChangedHandler) }, _loadDataSource: function() { if (this._dataSource) { var dataSource = this._dataSource; if (dataSource.isLoaded()) { this._proxiedDataSourceChangedHandler && this._proxiedDataSourceChangedHandler() } else { dataSource.load() } } }, _loadSingle: function(key, value) { key = "this" === key ? this._dataSource.key() || "this" : key; return this._dataSource.loadSingle(key, value) }, _isLastPage: function() { return !this._dataSource || this._dataSource.isLastPage() || !this._dataSource._pageSize }, _isDataSourceLoading: function() { return this._dataSource && this._dataSource.isLoading() }, _disposeDataSource: function() { if (this._dataSource) { if (this._isSharedDataSource) { delete this._isSharedDataSource; this._proxiedDataSourceChangedHandler && this._dataSource.off("changed", this._proxiedDataSourceChangedHandler); this._proxiedDataSourceLoadErrorHandler && this._dataSource.off("loadError", this._proxiedDataSourceLoadErrorHandler); this._proxiedDataSourceLoadingChangedHandler && this._dataSource.off("loadingChanged", this._proxiedDataSourceLoadingChangedHandler) } else { this._dataSource.dispose() } delete this._dataSource; delete this._proxiedDataSourceChangedHandler; delete this._proxiedDataSourceLoadErrorHandler; delete this._proxiedDataSourceLoadingChangedHandler } }, getDataSource: function() { return this._dataSource || null } }; module.exports = DataHelperMixin }, /*!********************************************!*\ !*** ./js/data/data_source/data_source.js ***! \********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), typeUtils = __webpack_require__( /*! ../../core/utils/type */ 12), dataUtils = __webpack_require__( /*! ../utils */ 137), Store = __webpack_require__( /*! ../abstract_store */ 154), ArrayStore = __webpack_require__( /*! ../array_store */ 158), CustomStore = __webpack_require__( /*! ../custom_store */ 162), EventsMixin = __webpack_require__( /*! ../../core/events_mixin */ 51), errors = __webpack_require__( /*! ../errors */ 155).errors, array = __webpack_require__( /*! ../../core/utils/array */ 26), queue = __webpack_require__( /*! ../../core/utils/queue */ 62), when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when, __isString = commonUtils.isString, __isNumber = commonUtils.isNumeric, __isBoolean = commonUtils.isBoolean, __isDefined = commonUtils.isDefined; var CANCELED_TOKEN = "canceled"; function OperationManager() { this._counter = -1; this._deferreds = {} } OperationManager.prototype.constructor = OperationManager; OperationManager.prototype.add = function(deferred) { this._counter += 1; this._deferreds[this._counter] = deferred; return this._counter }; OperationManager.prototype.remove = function(operationId) { return delete this._deferreds[operationId] }; OperationManager.prototype.cancel = function(operationId) { if (operationId in this._deferreds) { this._deferreds[operationId].reject(CANCELED_TOKEN); return true } return false }; var operationManager = new OperationManager; function isPending(deferred) { return "pending" === deferred.state() } function normalizeDataSourceOptions(options, normalizationOptions) { var store; function createCustomStoreFromLoadFunc() { var storeConfig = {}; $.each(["useDefaultSearch", "key", "load", "loadMode", "cacheRawData", "byKey", "lookup", "totalCount", "insert", "update", "remove"], function() { storeConfig[this] = options[this]; delete options[this] }); return new CustomStore(storeConfig) } function createStoreFromConfig(storeConfig) { var alias = storeConfig.type; delete storeConfig.type; return Store.create(alias, storeConfig) } function createCustomStoreFromUrl(url) { return new CustomStore({ load: function() { return $.getJSON(url) }, loadMode: normalizationOptions && normalizationOptions.fromUrlLoadMode }) } if ("string" === typeof options) { options = { paginate: false, store: createCustomStoreFromUrl(options) } } if (void 0 === options) { options = [] } if (Array.isArray(options) || options instanceof Store) { options = { store: options } } else { options = extend({}, options) } if (void 0 === options.store) { options.store = [] } store = options.store; if ("load" in options) { store = createCustomStoreFromLoadFunc() } else { if (Array.isArray(store)) { store = new ArrayStore(store) } else { if (typeUtils.isPlainObject(store)) { store = createStoreFromConfig(extend({}, store)) } } } options.store = store; return options } function normalizeStoreLoadOptionAccessorArguments(originalArguments) { switch (originalArguments.length) { case 0: return; case 1: return originalArguments[0] } return $.makeArray(originalArguments) } function generateStoreLoadOptionAccessor(optionName) { return function() { var args = normalizeStoreLoadOptionAccessorArguments(arguments); if (void 0 === args) { return this._storeLoadOptions[optionName] } this._storeLoadOptions[optionName] = args } } function mapDataRespectingGrouping(items, mapper, groupInfo) { function mapRecursive(items, level) { if (!Array.isArray(items)) { return items } return level ? mapGroup(items, level) : $.map(items, mapper) } function mapGroup(group, level) { return $.map(group, function(item) { var result = { key: item.key, items: mapRecursive(item.items, level - 1) }; if ("aggregates" in item) { result.aggregates = item.aggregates } return result }) } return mapRecursive(items, groupInfo ? dataUtils.normalizeSortingInfo(groupInfo).length : 0) } var DataSource = Class.inherit({ ctor: function(options) { var that = this; options = normalizeDataSourceOptions(options); this._store = options.store; this._storeLoadOptions = this._extractLoadOptions(options); this._mapFunc = options.map; this._postProcessFunc = options.postProcess; this._pageIndex = void 0 !== options.pageIndex ? options.pageIndex : 0; this._pageSize = void 0 !== options.pageSize ? options.pageSize : 20; this._loadingCount = 0; this._loadQueue = this._createLoadQueue(); this._searchValue = "searchValue" in options ? options.searchValue : null; this._searchOperation = options.searchOperation || "contains"; this._searchExpr = options.searchExpr; this._paginate = options.paginate; $.each(["onChanged", "onLoadError", "onLoadingChanged", "onCustomizeLoadResult", "onCustomizeStoreLoadOptions"], function(_, optionName) { if (optionName in options) { that.on(optionName.substr(2, 1).toLowerCase() + optionName.substr(3), options[optionName]) } }); this._init() }, _init: function() { this._items = []; this._userData = {}; this._totalCount = -1; this._isLoaded = false; if (!__isDefined(this._paginate)) { this._paginate = !this.group() } this._isLastPage = !this._paginate }, dispose: function() { this._disposeEvents(); delete this._store; if (this._delayedLoadTask) { this._delayedLoadTask.abort() } this._disposed = true }, _extractLoadOptions: function(options) { var result = {}, names = ["sort", "filter", "select", "group", "requireTotalCount"], customNames = this._store._customLoadOptions(); if (customNames) { names = names.concat(customNames) } $.each(names, function() { result[this] = options[this] }); return result }, loadOptions: function() { return this._storeLoadOptions }, items: function() { return this._items }, pageIndex: function(newIndex) { if (!__isNumber(newIndex)) { return this._pageIndex } this._pageIndex = newIndex; this._isLastPage = !this._paginate }, paginate: function(value) { if (!__isBoolean(value)) { return this._paginate } if (this._paginate !== value) { this._paginate = value; this.pageIndex(0) } }, pageSize: function(value) { if (!__isNumber(value)) { return this._pageSize } this._pageSize = value }, isLastPage: function() { return this._isLastPage }, sort: generateStoreLoadOptionAccessor("sort"), filter: function() { var newFilter = normalizeStoreLoadOptionAccessorArguments(arguments); if (void 0 === newFilter) { return this._storeLoadOptions.filter } this._storeLoadOptions.filter = newFilter; this.pageIndex(0) }, group: generateStoreLoadOptionAccessor("group"), select: generateStoreLoadOptionAccessor("select"), requireTotalCount: function(value) { if (!__isBoolean(value)) { return this._storeLoadOptions.requireTotalCount } this._storeLoadOptions.requireTotalCount = value }, searchValue: function(value) { if (arguments.length < 1) { return this._searchValue } this._searchValue = value; this.pageIndex(0) }, searchOperation: function(op) { if (!__isString(op)) { return this._searchOperation } this._searchOperation = op; this.pageIndex(0) }, searchExpr: function(expr) { var argc = arguments.length; if (0 === argc) { return this._searchExpr } if (argc > 1) { expr = $.makeArray(arguments) } this._searchExpr = expr; this.pageIndex(0) }, store: function() { return this._store }, key: function() { return this._store && this._store.key() }, totalCount: function() { return this._totalCount }, isLoaded: function() { return this._isLoaded }, isLoading: function() { return this._loadingCount > 0 }, _createLoadQueue: function() { return queue.create() }, _changeLoadingCount: function(increment) { var newLoading, oldLoading = this.isLoading(); this._loadingCount += increment; newLoading = this.isLoading(); if (oldLoading ^ newLoading) { this.fireEvent("loadingChanged", [newLoading]) } }, _scheduleLoadCallbacks: function(deferred) { var that = this; that._changeLoadingCount(1); deferred.always(function() { that._changeLoadingCount(-1) }) }, _scheduleFailCallbacks: function(deferred) { var that = this; deferred.fail(function() { if (arguments[0] === CANCELED_TOKEN) { return } that.fireEvent("loadError", arguments) }) }, _scheduleChangedCallbacks: function(deferred) { var that = this; deferred.done(function() { that.fireEvent("changed") }) }, loadSingle: function(propName, propValue) { var that = this; var d = $.Deferred(), key = this.key(), store = this._store, options = this._createStoreLoadOptions(), handleDone = function(data) { if (!__isDefined(data) || array.isEmpty(data)) { d.reject(new errors.Error("E4009")) } else { d.resolve(that._applyMapFunction($.makeArray(data))[0]) } }; this._scheduleFailCallbacks(d); if (arguments.length < 2) { propValue = propName; propName = key } delete options.skip; delete options.group; delete options.refresh; delete options.pageIndex; delete options.searchString; function shouldForceByKey() { return store instanceof CustomStore && !store._byKeyViaLoad() }(function() { if (propName === key || shouldForceByKey()) { return store.byKey(propValue, options) } options.take = 1; options.filter = options.filter ? [options.filter, [propName, propValue]] : [propName, propValue]; return store.load(options) })().fail(d.reject).done(handleDone); return d.promise() }, load: function() { var loadOperation, that = this, d = $.Deferred(); function loadTask() { if (that._disposed) { return } if (!isPending(d)) { return } return that._loadFromStore(loadOperation, d) } this._scheduleLoadCallbacks(d); this._scheduleFailCallbacks(d); this._scheduleChangedCallbacks(d); loadOperation = this._createLoadOperation(d); this.fireEvent("customizeStoreLoadOptions", [loadOperation]); this._loadQueue.add(function() { if ("number" === typeof loadOperation.delay) { that._delayedLoadTask = commonUtils.executeAsync(loadTask, loadOperation.delay) } else { loadTask() } return d.promise() }); return d.promise({ operationId: loadOperation.operationId }) }, _createLoadOperation: function(deferred) { var id = operationManager.add(deferred), options = this._createStoreLoadOptions(); deferred.always(function() { operationManager.remove(id) }); return { operationId: id, storeLoadOptions: options } }, reload: function() { var store = this.store(); if (store instanceof CustomStore) { store.clearRawDataCache() } this._init(); return this.load() }, cancel: function(operationId) { return operationManager.cancel(operationId) }, _addSearchOptions: function(storeLoadOptions) { if (this._disposed) { return } if (this.store()._useDefaultSearch) { this._addSearchFilter(storeLoadOptions) } else { storeLoadOptions.searchOperation = this._searchOperation; storeLoadOptions.searchValue = this._searchValue; storeLoadOptions.searchExpr = this._searchExpr } }, _createStoreLoadOptions: function() { var result = extend({}, this._storeLoadOptions); this._addSearchOptions(result); if (this._paginate) { if (this._pageSize) { result.skip = this._pageIndex * this._pageSize; result.take = this._pageSize } } result.userData = this._userData; return result }, _addSearchFilter: function(storeLoadOptions) { var value = this._searchValue, op = this._searchOperation, selector = this._searchExpr, searchFilter = []; if (!value) { return } if (!selector) { selector = "this" } if (!Array.isArray(selector)) { selector = [selector] } $.each(selector, function(i, item) { if (searchFilter.length) { searchFilter.push("or") } searchFilter.push([item, op, value]) }); if (storeLoadOptions.filter) { storeLoadOptions.filter = [searchFilter, storeLoadOptions.filter] } else { storeLoadOptions.filter = searchFilter } }, _loadFromStore: function(loadOptions, pendingDeferred) { var that = this; function handleSuccess(data, extra) { function processResult() { var loadResult; if (data && !Array.isArray(data) && data.data) { extra = data; data = data.data } if (!Array.isArray(data)) { data = $.makeArray(data) } loadResult = extend({ data: data, extra: extra }, loadOptions); that.fireEvent("customizeLoadResult", [loadResult]); when(loadResult.data).done(function(data) { loadResult.data = data; that._processStoreLoadResult(loadResult, pendingDeferred) }).fail(pendingDeferred.reject) } if (that._disposed) { return } if (!isPending(pendingDeferred)) { return } processResult() } if (loadOptions.data) { return $.Deferred().resolve(loadOptions.data).done(handleSuccess) } return this.store().load(loadOptions.storeLoadOptions).done(handleSuccess).fail(pendingDeferred.reject) }, _processStoreLoadResult: function(loadResult, pendingDeferred) { var that = this, data = loadResult.data, extra = loadResult.extra, storeLoadOptions = loadResult.storeLoadOptions; function resolvePendingDeferred() { that._isLoaded = true; that._totalCount = isFinite(extra.totalCount) ? extra.totalCount : -1; return pendingDeferred.resolve(data, extra) } function proceedLoadingTotalCount() { that.store().totalCount(storeLoadOptions).done(function(count) { extra.totalCount = count; resolvePendingDeferred() }).fail(pendingDeferred.reject) } if (that._disposed) { return } data = that._applyPostProcessFunction(that._applyMapFunction(data)); if (!typeUtils.isPlainObject(extra)) { extra = {} } that._items = data; if (!data.length || !that._paginate || that._pageSize && data.length < that._pageSize) { that._isLastPage = true } if (storeLoadOptions.requireTotalCount && !isFinite(extra.totalCount)) { proceedLoadingTotalCount() } else { resolvePendingDeferred() } }, _applyMapFunction: function(data) { if (this._mapFunc) { return mapDataRespectingGrouping(data, this._mapFunc, this.group()) } return data }, _applyPostProcessFunction: function(data) { if (this._postProcessFunc) { return this._postProcessFunc(data) } return data } }).include(EventsMixin); exports.DataSource = DataSource; exports.normalizeDataSourceOptions = normalizeDataSourceOptions }, /*!***********************************!*\ !*** ./js/data/abstract_store.js ***! \***********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), Class = __webpack_require__( /*! ../core/class */ 25), abstract = Class.abstract, EventsMixin = __webpack_require__( /*! ../core/events_mixin */ 51), errorsModule = __webpack_require__( /*! ./errors */ 155), dataUtils = __webpack_require__( /*! ./utils */ 137), compileGetter = __webpack_require__( /*! ../core/utils/data */ 50).compileGetter, storeHelper = __webpack_require__( /*! ./store_helper */ 156), queryByOptions = storeHelper.queryByOptions, storeImpl = {}; var Store = Class.inherit({ ctor: function(options) { var that = this; options = options || {}; $.each(["onLoaded", "onLoading", "onInserted", "onInserting", "onUpdated", "onUpdating", "onRemoved", "onRemoving", "onModified", "onModifying"], function(_, optionName) { if (optionName in options) { that.on(optionName.slice(2).toLowerCase(), options[optionName]) } }); this._key = options.key; this._errorHandler = options.errorHandler; this._useDefaultSearch = true }, _customLoadOptions: function() { return null }, key: function() { return this._key }, keyOf: function(obj) { if (!this._keyGetter) { this._keyGetter = compileGetter(this.key()) } return this._keyGetter(obj) }, _requireKey: function() { if (!this.key()) { throw errorsModule.errors.Error("E4005") } }, load: function(options) { var that = this; options = options || {}; this.fireEvent("loading", [options]); return this._withLock(this._loadImpl(options)).done(function(result) { that.fireEvent("loaded", [result, options]) }) }, _loadImpl: function(options) { return queryByOptions(this.createQuery(options), options).enumerate() }, _withLock: function(task) { var result = $.Deferred(); task.done(function() { var that = this, args = arguments; dataUtils.processRequestResultLock.promise().done(function() { result.resolveWith(that, args) }) }).fail(function() { result.rejectWith(this, arguments) }); return result }, createQuery: abstract, totalCount: function(options) { return this._totalCountImpl(options) }, _totalCountImpl: function(options) { return queryByOptions(this.createQuery(options), options, true).count() }, byKey: function(key, extraOptions) { return this._addFailHandlers(this._withLock(this._byKeyImpl(key, extraOptions))) }, _byKeyImpl: abstract, insert: function(values) { var that = this; that.fireEvent("modifying"); that.fireEvent("inserting", [values]); return that._addFailHandlers(that._insertImpl(values).done(function(callbackValues, callbackKey) { that.fireEvent("inserted", [callbackValues, callbackKey]); that.fireEvent("modified") })) }, _insertImpl: abstract, update: function(key, values) { var that = this; that.fireEvent("modifying"); that.fireEvent("updating", [key, values]); return that._addFailHandlers(that._updateImpl(key, values).done(function(callbackKey, callbackValues) { that.fireEvent("updated", [callbackKey, callbackValues]); that.fireEvent("modified") })) }, _updateImpl: abstract, remove: function(key) { var that = this; that.fireEvent("modifying"); that.fireEvent("removing", [key]); return that._addFailHandlers(that._removeImpl(key).done(function(callbackKey) { that.fireEvent("removed", [callbackKey]); that.fireEvent("modified") })) }, _removeImpl: abstract, _addFailHandlers: function(deferred) { return deferred.fail(this._errorHandler, errorsModule._errorHandler) } }).include(EventsMixin); Store.create = function(alias, options) { if (!(alias in storeImpl)) { throw errorsModule.errors.Error("E4020", alias) } return new storeImpl[alias](options) }; Store.inherit = function(inheritor) { return function(members, alias) { var type = inheritor.apply(this, [members]); if (alias) { storeImpl[alias] = type } return type } }(Store.inherit); module.exports = Store }, /*!***************************!*\ !*** ./js/data/errors.js ***! \***************************/ function(module, exports, __webpack_require__) { var errorUtils = __webpack_require__( /*! ../core/utils/error */ 8), coreErrors = __webpack_require__( /*! ../core/errors */ 7), handlers = {}; var errors = errorUtils(coreErrors.ERROR_MESSAGES, { E4000: "[DevExpress.data]: {0}", E4001: "Unknown aggregating function is detected: '{0}'", E4002: "Unsupported OData protocol version is used", E4003: "Unknown filter operation is used: {0}", E4004: "The thenby() method is called before the sortby() method", E4005: "Store requires a key expression for this operation", E4006: "ArrayStore 'data' option must be an array", E4007: "Compound keys cannot be auto-generated", E4008: "Attempt to insert an item with the a duplicated key", E4009: "Data item cannot be found", E4010: "CustomStore does not support creating queries", E4011: "Custom Store method is not implemented or is not a function: {0}", E4012: "Custom Store method returns an invalid value: {0}", E4013: "Local Store requires the 'name' configuration option is specified", E4014: "Unknown data type is specified for ODataStore: {0}", E4015: "Unknown entity name or alias is used: {0}", E4017: "Keys cannot be modified", E4018: "The server has returned a non-numeric value in a response to an item count request", E4019: "Mixing of group operators inside a single group of filter expression is not allowed", E4020: "Unknown store type is detected: {0}", E4021: "The server response does not provide the totalCount value", E4022: "The server response does not provide the groupCount value", W4000: "Data returned from the server has an incorrect structure", W4001: 'The {0} field is listed in both "keyType" and "fieldTypes". The value of "fieldTypes" is used.', W4002: "Data loading has failed for some cells due to the following error: {0}" }); function handleError(error) { var id = "E4000"; if (error && "__id" in error) { id = error.__id } errors.log(id, error) } var errorHandler = null; var _errorHandler = function(error) { handleError(error); if (handlers.errorHandler) { handlers.errorHandler(error) } }; handlers = { errors: errors, errorHandler: errorHandler, _errorHandler: _errorHandler }; module.exports = handlers }, /*!*********************************!*\ !*** ./js/data/store_helper.js ***! \*********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), grep = __webpack_require__( /*! ../core/utils/common */ 14).grep, extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, arrayQuery = __webpack_require__( /*! ./array_query */ 157), normalizeSortingInfo = __webpack_require__( /*! ./utils */ 137).normalizeSortingInfo; function multiLevelGroup(query, groupInfo) { query = query.groupBy(groupInfo[0].selector); if (groupInfo.length > 1) { query = query.select(function(g) { return extend({}, g, { items: multiLevelGroup(arrayQuery(g.items), groupInfo.slice(1)).toArray() }) }) } return query } function arrangeSortingInfo(groupInfo, sortInfo) { var filteredGroup = []; $.each(groupInfo, function(_, group) { var collision = grep(sortInfo, function(sort) { return group.selector === sort.selector }); if (collision.length < 1) { filteredGroup.push(group) } }); return filteredGroup.concat(sortInfo) } function queryByOptions(query, options, isCountQuery) { options = options || {}; var filter = options.filter, sort = options.sort, select = options.select, group = options.group, skip = options.skip, take = options.take; if (filter) { query = query.filter(filter) } if (group) { group = normalizeSortingInfo(group) } if (!isCountQuery) { if (sort || group) { sort = normalizeSortingInfo(sort || []); if (group) { sort = arrangeSortingInfo(group, sort) } $.each(sort, function(index) { query = query[index ? "thenBy" : "sortBy"](this.selector, this.desc) }) } if (select) { query = query.select(select) } } if (group) { query = multiLevelGroup(query, group) } if (!isCountQuery) { if (take || skip) { query = query.slice(skip || 0, take) } } return query } module.exports = { multiLevelGroup: multiLevelGroup, arrangeSortingInfo: arrangeSortingInfo, queryByOptions: queryByOptions } }, /*!********************************!*\ !*** ./js/data/array_query.js ***! \********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), Class = __webpack_require__( /*! ../core/class */ 25), commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), compileGetter = __webpack_require__( /*! ../core/utils/data */ 50).compileGetter, toComparable = __webpack_require__( /*! ../core/utils/data */ 50).toComparable, errorsModule = __webpack_require__( /*! ./errors */ 155), dataUtils = __webpack_require__( /*! ./utils */ 137); var Iterator = Class.inherit({ toArray: function() { var result = []; this.reset(); while (this.next()) { result.push(this.current()) } return result }, countable: function() { return false } }); var ArrayIterator = Iterator.inherit({ ctor: function(array) { this.array = array; this.index = -1 }, next: function() { if (this.index + 1 < this.array.length) { this.index++; return true } return false }, current: function() { return this.array[this.index] }, reset: function() { this.index = -1 }, toArray: function() { return this.array.slice(0) }, countable: function() { return true }, count: function() { return this.array.length } }); var WrappedIterator = Iterator.inherit({ ctor: function(iter) { this.iter = iter }, next: function() { return this.iter.next() }, current: function() { return this.iter.current() }, reset: function() { return this.iter.reset() } }); var MapIterator = WrappedIterator.inherit({ ctor: function(iter, mapper) { this.callBase(iter); this.index = -1; this.mapper = mapper }, current: function() { return this.mapper(this.callBase(), this.index) }, next: function() { var hasNext = this.callBase(); if (hasNext) { this.index++ } return hasNext } }); var SortIterator = Iterator.inherit({ ctor: function(iter, getter, desc) { if (!(iter instanceof MapIterator)) { iter = new MapIterator(iter, this._wrap) } this.iter = iter; this.rules = [{ getter: getter, desc: desc }] }, thenBy: function(getter, desc) { var result = new SortIterator(this.sortedIter || this.iter, getter, desc); if (!this.sortedIter) { result.rules = this.rules.concat(result.rules) } return result }, next: function() { this._ensureSorted(); return this.sortedIter.next() }, current: function() { this._ensureSorted(); return this.sortedIter.current() }, reset: function() { delete this.sortedIter }, countable: function() { return this.sortedIter || this.iter.countable() }, count: function() { if (this.sortedIter) { return this.sortedIter.count() } return this.iter.count() }, _ensureSorted: function() { var that = this; if (that.sortedIter) { return } $.each(that.rules, function() { this.getter = compileGetter(this.getter) }); that.sortedIter = new MapIterator(new ArrayIterator(this.iter.toArray().sort(function(x, y) { return that._compare(x, y) })), that._unwrap) }, _wrap: function(record, index) { return { index: index, value: record } }, _unwrap: function(wrappedItem) { return wrappedItem.value }, _compare: function(x, y) { var xIndex = x.index, yIndex = y.index; x = x.value; y = y.value; if (x === y) { return xIndex - yIndex } for (var i = 0, rulesCount = this.rules.length; i < rulesCount; i++) { var rule = this.rules[i], xValue = toComparable(rule.getter(x)), yValue = toComparable(rule.getter(y)), factor = rule.desc ? -1 : 1; if (null === xValue && null !== yValue) { return -factor } if (null !== xValue && null === yValue) { return factor } if (void 0 === xValue && void 0 !== yValue) { return factor } if (void 0 !== xValue && void 0 === yValue) { return -factor } if (xValue < yValue) { return -factor } if (xValue > yValue) { return factor } } return xIndex - yIndex } }); var compileCriteria = function() { var compileGroup = function(crit) { var groupOperator, nextGroupOperator, idx = 0, bag = [], ops = []; $.each(crit, function() { if (Array.isArray(this) || commonUtils.isFunction(this)) { if (bag.length > 1 && groupOperator !== nextGroupOperator) { throw new errorsModule.errors.Error("E4019") } ops.push(compileCriteria(this)); bag.push("op[" + idx + "](d)"); idx++; groupOperator = nextGroupOperator; nextGroupOperator = "&&" } else { nextGroupOperator = dataUtils.isConjunctiveOperator(this) ? "&&" : "||" } }); return new Function("op", "return function(d) { return " + bag.join(" " + groupOperator + " ") + " }")(ops) }; var toString = function(value) { return commonUtils.isDefined(value) ? value.toString() : "" }; var compileBinary = function(crit) { crit = dataUtils.normalizeBinaryCriterion(crit); var getter = compileGetter(crit[0]), op = crit[1], value = crit[2]; value = toComparable(value); switch (op.toLowerCase()) { case "=": return compileEquals(getter, value); case "<>": return compileEquals(getter, value, true); case ">": return function(obj) { return toComparable(getter(obj)) > value }; case "<": return function(obj) { return toComparable(getter(obj)) < value }; case ">=": return function(obj) { return toComparable(getter(obj)) >= value }; case "<=": return function(obj) { return toComparable(getter(obj)) <= value }; case "startswith": return function(obj) { return 0 === toComparable(toString(getter(obj))).indexOf(value) }; case "endswith": return function(obj) { var getterValue = toComparable(toString(getter(obj))), searchValue = toString(value); if (getterValue.length < searchValue.length) { return false } return getterValue.lastIndexOf(value) === getterValue.length - value.length }; case "contains": return function(obj) { return toComparable(toString(getter(obj))).indexOf(value) > -1 }; case "notcontains": return function(obj) { return toComparable(toString(getter(obj))).indexOf(value) === -1 } } throw errorsModule.errors.Error("E4003", op) }; function compileEquals(getter, value, negate) { return function(obj) { obj = toComparable(getter(obj)); var result = useStrictComparison(value) ? obj === value : obj == value; if (negate) { result = !result } return result } } function useStrictComparison(value) { return "" === value || 0 === value || false === value } function compileUnary(crit) { var op = crit[0], criteria = compileCriteria(crit[1]); if ("!" === op) { return function(obj) { return !criteria(obj) } } throw errorsModule.errors.Error("E4003", op) } return function(crit) { if (commonUtils.isFunction(crit)) { return crit } if (Array.isArray(crit[0])) { return compileGroup(crit) } if (dataUtils.isUnaryOperation(crit)) { return compileUnary(crit) } return compileBinary(crit) } }(); var FilterIterator = WrappedIterator.inherit({ ctor: function(iter, criteria) { this.callBase(iter); this.criteria = compileCriteria(criteria) }, next: function() { while (this.iter.next()) { if (this.criteria(this.current())) { return true } } return false } }); var GroupIterator = Iterator.inherit({ ctor: function(iter, getter) { this.iter = iter; this.getter = getter }, next: function() { this._ensureGrouped(); return this.groupedIter.next() }, current: function() { this._ensureGrouped(); return this.groupedIter.current() }, reset: function() { delete this.groupedIter }, countable: function() { return !!this.groupedIter }, count: function() { return this.groupedIter.count() }, _ensureGrouped: function() { if (this.groupedIter) { return } var hash = {}, keys = [], iter = this.iter, getter = compileGetter(this.getter); iter.reset(); while (iter.next()) { var current = iter.current(), key = getter(current); if (key in hash) { hash[key].push(current) } else { hash[key] = [current]; keys.push(key) } } this.groupedIter = new ArrayIterator($.map(keys, function(key) { return { key: key, items: hash[key] } })) } }); var SelectIterator = WrappedIterator.inherit({ ctor: function(iter, getter) { this.callBase(iter); this.getter = compileGetter(getter) }, current: function() { return this.getter(this.callBase()) }, countable: function() { return this.iter.countable() }, count: function() { return this.iter.count() } }); var SliceIterator = WrappedIterator.inherit({ ctor: function(iter, skip, take) { this.callBase(iter); this.skip = Math.max(0, skip); this.take = Math.max(0, take); this.pos = 0 }, next: function() { if (this.pos >= this.skip + this.take) { return false } while (this.pos < this.skip && this.iter.next()) { this.pos++ } this.pos++; return this.iter.next() }, reset: function() { this.callBase(); this.pos = 0 }, countable: function() { return this.iter.countable() }, count: function() { return Math.min(this.iter.count() - this.skip, this.take) } }); var arrayQueryImpl = function(iter, queryOptions) { queryOptions = queryOptions || {}; if (!(iter instanceof Iterator)) { iter = new ArrayIterator(iter) } var handleError = function(error) { var handler = queryOptions.errorHandler; if (handler) { handler(error) } errorsModule._errorHandler(error) }; var aggregateCore = function(aggregator) { var seed, d = $.Deferred().fail(handleError), step = aggregator.step, finalize = aggregator.finalize; try { iter.reset(); if ("seed" in aggregator) { seed = aggregator.seed } else { seed = iter.next() ? iter.current() : NaN } var accumulator = seed; while (iter.next()) { accumulator = step(accumulator, iter.current()) } d.resolve(finalize ? finalize(accumulator) : accumulator) } catch (x) { d.reject(x) } return d.promise() }; var aggregate = function(seed, step, finalize) { if (arguments.length < 2) { return aggregateCore({ step: arguments[0] }) } return aggregateCore({ seed: seed, step: step, finalize: finalize }) }; var standardAggregate = function(name) { return aggregateCore(dataUtils.aggregators[name]) }; var select = function(getter) { if (!commonUtils.isFunction(getter) && !Array.isArray(getter)) { getter = $.makeArray(arguments) } return chainQuery(new SelectIterator(iter, getter)) }; var selectProp = function(name) { return select(compileGetter(name)) }; var chainQuery = function(iter) { return arrayQueryImpl(iter, queryOptions) }; return { toArray: function() { return iter.toArray() }, enumerate: function() { var d = $.Deferred().fail(handleError); try { d.resolve(iter.toArray()) } catch (x) { d.reject(x) } return d.promise() }, sortBy: function(getter, desc) { return chainQuery(new SortIterator(iter, getter, desc)) }, thenBy: function(getter, desc) { if (iter instanceof SortIterator) { return chainQuery(iter.thenBy(getter, desc)) } throw errorsModule.errors.Error("E4004") }, filter: function(criteria) { if (!Array.isArray(criteria)) { criteria = $.makeArray(arguments) } return chainQuery(new FilterIterator(iter, criteria)) }, slice: function(skip, take) { if (void 0 === take) { take = Number.MAX_VALUE } return chainQuery(new SliceIterator(iter, skip, take)) }, select: select, groupBy: function(getter) { return chainQuery(new GroupIterator(iter, getter)) }, aggregate: aggregate, count: function() { if (iter.countable()) { var d = $.Deferred().fail(handleError); try { d.resolve(iter.count()) } catch (x) { d.reject(x) } return d.promise() } return standardAggregate("count") }, sum: function(getter) { if (getter) { return selectProp(getter).sum() } return standardAggregate("sum") }, min: function(getter) { if (getter) { return selectProp(getter).min() } return standardAggregate("min") }, max: function(getter) { if (getter) { return selectProp(getter).max() } return standardAggregate("max") }, avg: function(getter) { if (getter) { return selectProp(getter).avg() } return standardAggregate("avg") } } }; module.exports = arrayQueryImpl }, /*!********************************!*\ !*** ./js/data/array_store.js ***! \********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, typeUtils = __webpack_require__( /*! ../core/utils/type */ 12), Guid = __webpack_require__( /*! ../core/guid */ 151), objectUtils = __webpack_require__( /*! ../core/utils/object */ 27), keysEqual = __webpack_require__( /*! ./utils */ 137).keysEqual, Query = __webpack_require__( /*! ./query */ 159), errors = __webpack_require__( /*! ./errors */ 155).errors, Store = __webpack_require__( /*! ./abstract_store */ 154); var hasKey = function(target, keyOrKeys) { var key, keys = $.makeArray(keyOrKeys); while (keys.length) { key = keys.shift(); if (key in target) { return true } } return false }; var trivialPromise = function() { var d = $.Deferred(); return d.resolve.apply(d, arguments).promise() }; var rejectedPromise = function() { var d = $.Deferred(); return d.reject.apply(d, arguments).promise() }; var ArrayStore = Store.inherit({ ctor: function(options) { if (Array.isArray(options)) { options = { data: options } } else { options = options || {} } this.callBase(options); var initialArray = options.data; if (initialArray && !Array.isArray(initialArray)) { throw errors.Error("E4006") } this._array = initialArray || [] }, createQuery: function() { return Query(this._array, { errorHandler: this._errorHandler }) }, _byKeyImpl: function(key) { var index = this._indexByKey(key); if (index === -1) { return rejectedPromise(errors.Error("E4009")) } return trivialPromise(this._array[index]) }, _insertImpl: function(values) { var keyValue, obj, keyExpr = this.key(); if (typeUtils.isPlainObject(values)) { obj = extend({}, values) } else { obj = values } if (keyExpr) { keyValue = this.keyOf(obj); if (void 0 === keyValue || "object" === typeof keyValue && typeUtils.isEmptyObject(keyValue)) { if (Array.isArray(keyExpr)) { throw errors.Error("E4007") } keyValue = obj[keyExpr] = String(new Guid) } else { if (void 0 !== this._array[this._indexByKey(keyValue)]) { return rejectedPromise(errors.Error("E4008")) } } } else { keyValue = obj } this._array.push(obj); return trivialPromise(values, keyValue) }, _updateImpl: function(key, values) { var index, target, keyExpr = this.key(), extendComplexObject = true; if (keyExpr) { if (hasKey(values, keyExpr) && !keysEqual(keyExpr, key, this.keyOf(values))) { return rejectedPromise(errors.Error("E4017")) } index = this._indexByKey(key); if (index < 0) { return rejectedPromise(errors.Error("E4009")) } target = this._array[index] } else { target = key } objectUtils.deepExtendArraySafe(target, values, extendComplexObject); return trivialPromise(key, values) }, _removeImpl: function(key) { var index = this._indexByKey(key); if (index > -1) { this._array.splice(index, 1) } return trivialPromise(key) }, _indexByKey: function(key) { for (var i = 0, arrayLength = this._array.length; i < arrayLength; i++) { if (keysEqual(this.key(), this.keyOf(this._array[i]), key)) { return i } } return -1 }, clear: function() { this.fireEvent("modifying"); this._array = []; this.fireEvent("modified") } }, "array"); module.exports = ArrayStore }, /*!**************************!*\ !*** ./js/data/query.js ***! \**************************/ function(module, exports, __webpack_require__) { var arrayQueryImpl = __webpack_require__( /*! ./array_query */ 157), remoteQueryImpl = __webpack_require__( /*! ./remote_query */ 160); var queryImpl = { array: arrayQueryImpl, remote: remoteQueryImpl }; var query = function() { var impl = Array.isArray(arguments[0]) ? "array" : "remote"; return queryImpl[impl].apply(this, arguments) }; module.exports = query; module.exports.queryImpl = queryImpl }, /*!*********************************!*\ !*** ./js/data/remote_query.js ***! \*********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), queryAdapters = __webpack_require__( /*! ./query_adapters */ 161), errorsModule = __webpack_require__( /*! ./errors */ 155), isFunction = __webpack_require__( /*! ../core/utils/common */ 14).isFunction, arrayQueryImpl = __webpack_require__( /*! ./array_query */ 157); var remoteQueryImpl = function(url, queryOptions, tasks) { tasks = tasks || []; queryOptions = queryOptions || {}; var createTask = function(name, args) { return { name: name, args: args } }; var exec = function(executorTask) { var _adapterFactory, _adapter, _taskQueue, _currentTask, _mergedSortArgs, d = $.Deferred(); var rejectWithNotify = function(error) { var handler = queryOptions.errorHandler; if (handler) { handler(error) } errorsModule._errorHandler(error); d.reject(error) }; function mergeSortTask(task) { switch (task.name) { case "sortBy": _mergedSortArgs = [task.args]; return true; case "thenBy": if (!_mergedSortArgs) { throw errorsModule.errors.Error("E4004") } _mergedSortArgs.push(task.args); return true } return false } function unmergeSortTasks() { var head = _taskQueue[0], unmergedTasks = []; if (head && "multiSort" === head.name) { _taskQueue.shift(); $.each(head.args[0], function() { unmergedTasks.push(createTask(unmergedTasks.length ? "thenBy" : "sortBy", this)) }) } _taskQueue = unmergedTasks.concat(_taskQueue) } try { _adapterFactory = queryOptions.adapter; if (!isFunction(_adapterFactory)) { _adapterFactory = queryAdapters[_adapterFactory] } _adapter = _adapterFactory(queryOptions); _taskQueue = [].concat(tasks).concat(executorTask); while (_taskQueue.length) { _currentTask = _taskQueue[0]; if (!mergeSortTask(_currentTask)) { if (_mergedSortArgs) { _taskQueue.unshift(createTask("multiSort", [_mergedSortArgs])); _mergedSortArgs = null; continue } if ("enumerate" !== String(_currentTask.name)) { if (!_adapter[_currentTask.name] || false === _adapter[_currentTask.name].apply(_adapter, _currentTask.args)) { break } } } _taskQueue.shift() } unmergeSortTasks(); _adapter.exec(url).done(function(result, extra) { if (!_taskQueue.length) { d.resolve(result, extra) } else { var clientChain = arrayQueryImpl(result, { errorHandler: queryOptions.errorHandler }); $.each(_taskQueue, function() { clientChain = clientChain[this.name].apply(clientChain, this.args) }); clientChain.done(d.resolve).fail(d.reject) } }).fail(rejectWithNotify) } catch (x) { rejectWithNotify(x) } return d.promise() }; var query = {}; $.each(["sortBy", "thenBy", "filter", "slice", "select", "groupBy"], function() { var name = String(this); query[name] = function() { return remoteQueryImpl(url, queryOptions, tasks.concat(createTask(name, arguments))) } }); $.each(["count", "min", "max", "sum", "avg", "aggregate", "enumerate"], function() { var name = String(this); query[name] = function() { return exec.call(this, createTask(name, arguments)) } }); return query }; module.exports = remoteQueryImpl }, /*!***********************************!*\ !*** ./js/data/query_adapters.js ***! \***********************************/ function(module, exports) { module.exports = {} }, /*!*********************************!*\ !*** ./js/data/custom_store.js ***! \*********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), deferredUtils = __webpack_require__( /*! ../integration/jquery/deferred */ 16), dataUtils = __webpack_require__( /*! ./utils */ 137), isFunction = __webpack_require__( /*! ../core/utils/common */ 14).isFunction, errors = __webpack_require__( /*! ./errors */ 155).errors, Store = __webpack_require__( /*! ./abstract_store */ 154), arrayQuery = __webpack_require__( /*! ./array_query */ 157), queryByOptions = __webpack_require__( /*! ./store_helper */ 156).queryByOptions; var TOTAL_COUNT = "totalCount", LOAD = "load", BY_KEY = "byKey", INSERT = "insert", UPDATE = "update", REMOVE = "remove"; function isPromise(obj) { return obj && isFunction(obj.then) } function trivialPromise(value) { return $.Deferred().resolve(value).promise() } function ensureRequiredFuncOption(name, obj) { if (!isFunction(obj)) { throw errors.Error("E4011", name) } } function throwInvalidUserFuncResult(name) { throw errors.Error("E4012", name) } function createUserFuncFailureHandler(pendingDeferred) { function errorMessageFromXhr(promiseArguments) { var xhr = promiseArguments[0], textStatus = promiseArguments[1]; if (!xhr || !xhr.getResponseHeader) { return null } return dataUtils.errorMessageFromXhr(xhr, textStatus) } return function(arg) { var error; if (arg instanceof Error) { error = arg } else { error = new Error(errorMessageFromXhr(arguments) || arg && String(arg) || "Unknown error") } pendingDeferred.reject(error) } } function invokeUserLoad(store, options) { var userResult, userFunc = store._loadFunc; ensureRequiredFuncOption(LOAD, userFunc); userResult = userFunc.apply(store, [options]); if (Array.isArray(userResult)) { userResult = trivialPromise(userResult) } else { if (null === userResult || void 0 === userResult) { userResult = trivialPromise([]) } else { if (!isPromise(userResult)) { throwInvalidUserFuncResult(LOAD) } } } return deferredUtils.fromPromise(userResult) } function invokeUserTotalCountFunc(store, options) { var userResult, userFunc = store._totalCountFunc; if (!isFunction(userFunc)) { throw errors.Error("E4021") } userResult = userFunc.apply(store, [options]); if (!isPromise(userResult)) { userResult = Number(userResult); if (!isFinite(userResult)) { throwInvalidUserFuncResult(TOTAL_COUNT) } userResult = trivialPromise(userResult) } return deferredUtils.fromPromise(userResult) } function invokeUserByKeyFunc(store, key, extraOptions) { var userResult, userFunc = store._byKeyFunc; ensureRequiredFuncOption(BY_KEY, userFunc); userResult = userFunc.apply(store, [key, extraOptions]); if (!isPromise(userResult)) { userResult = trivialPromise(userResult) } return deferredUtils.fromPromise(userResult) } function runRawLoad(pendingDeferred, store, userFuncOptions, continuation) { if (store.__rawData) { continuation(store.__rawData) } else { invokeUserLoad(store, userFuncOptions).done(function(rawData) { if (store._cacheRawData) { store.__rawData = rawData } continuation(rawData) }).fail(createUserFuncFailureHandler(pendingDeferred)) } } function runRawLoadWithQuery(pendingDeferred, store, options, countOnly) { options = options || {}; var userFuncOptions = {}; if ("userData" in options) { userFuncOptions.userData = options.userData } runRawLoad(pendingDeferred, store, userFuncOptions, function(rawData) { var itemsQuery, totalCountQuery, rawDataQuery = arrayQuery(rawData, { errorHandler: store._errorHandler }), waitList = []; var items, totalCount; if (!countOnly) { itemsQuery = queryByOptions(rawDataQuery, options); if (itemsQuery === rawDataQuery) { items = rawData.slice(0) } else { waitList.push(itemsQuery.enumerate().done(function(asyncResult) { items = asyncResult })) } } if (options.requireTotalCount || countOnly) { totalCountQuery = queryByOptions(rawDataQuery, options, true); if (totalCountQuery === rawDataQuery) { totalCount = rawData.length } else { waitList.push(totalCountQuery.count().done(function(asyncResult) { totalCount = asyncResult })) } } $.when.apply($, waitList).done(function() { if (countOnly) { pendingDeferred.resolve(totalCount) } else { if (options.requireTotalCount) { pendingDeferred.resolve(items, { totalCount: totalCount }) } else { pendingDeferred.resolve(items) } } }).fail(function(x) { pendingDeferred.reject(x) }) }) } function runRawLoadWithKey(pendingDeferred, store, key) { runRawLoad(pendingDeferred, store, {}, function(rawData) { var item, keyExpr = store.key(); for (var i = 0, len = rawData.length; i < len; i++) { item = rawData[i]; if (dataUtils.keysEqual(keyExpr, store.keyOf(rawData[i]), key)) { pendingDeferred.resolve(item); return } } pendingDeferred.reject(errors.Error("E4009")) }) } var CustomStore = Store.inherit({ ctor: function(options) { options = options || {}; this.callBase(options); this._useDefaultSearch = !!options.useDefaultSearch || "raw" === options.loadMode; this._loadMode = options.loadMode; this._cacheRawData = false !== options.cacheRawData; this._loadFunc = options[LOAD]; this._totalCountFunc = options[TOTAL_COUNT]; this._byKeyFunc = options[BY_KEY]; this._insertFunc = options[INSERT]; this._updateFunc = options[UPDATE]; this._removeFunc = options[REMOVE] }, createQuery: function() { throw errors.Error("E4010") }, clearRawDataCache: function() { delete this.__rawData }, _totalCountImpl: function(options) { var d = $.Deferred(); if ("raw" === this._loadMode && !this._totalCountFunc) { runRawLoadWithQuery(d, this, options, true) } else { invokeUserTotalCountFunc(this, options).done(function(count) { d.resolve(Number(count)) }).fail(createUserFuncFailureHandler(d)); d = this._addFailHandlers(d) } return d.promise() }, _loadImpl: function(options) { var d = $.Deferred(); if ("raw" === this._loadMode) { runRawLoadWithQuery(d, this, options, false) } else { invokeUserLoad(this, options).done(function(data, extra) { d.resolve(data, extra) }).fail(createUserFuncFailureHandler(d)); d = this._addFailHandlers(d) } return d.promise() }, _byKeyImpl: function(key, extraOptions) { var d = $.Deferred(); if (this._byKeyViaLoad()) { this._requireKey(); runRawLoadWithKey(d, this, key) } else { invokeUserByKeyFunc(this, key, extraOptions).done(function(obj) { d.resolve(obj) }).fail(createUserFuncFailureHandler(d)) } return d.promise() }, _byKeyViaLoad: function() { return "raw" === this._loadMode && !this._byKeyFunc }, _insertImpl: function(values) { var userResult, userFunc = this._insertFunc, d = $.Deferred(); ensureRequiredFuncOption(INSERT, userFunc); userResult = userFunc.apply(this, [values]); if (!isPromise(userResult)) { userResult = trivialPromise(userResult) } deferredUtils.fromPromise(userResult).done(function(newKey) { d.resolve(values, newKey) }).fail(createUserFuncFailureHandler(d)); return d.promise() }, _updateImpl: function(key, values) { var userResult, userFunc = this._updateFunc, d = $.Deferred(); ensureRequiredFuncOption(UPDATE, userFunc); userResult = userFunc.apply(this, [key, values]); if (!isPromise(userResult)) { userResult = trivialPromise() } deferredUtils.fromPromise(userResult).done(function() { d.resolve(key, values) }).fail(createUserFuncFailureHandler(d)); return d.promise() }, _removeImpl: function(key) { var userResult, userFunc = this._removeFunc, d = $.Deferred(); ensureRequiredFuncOption(REMOVE, userFunc); userResult = userFunc.apply(this, [key]); if (!isPromise(userResult)) { userResult = trivialPromise() } deferredUtils.fromPromise(userResult).done(function() { d.resolve(key) }).fail(createUserFuncFailureHandler(d)); return d.promise() } }); module.exports = CustomStore }, /*!**********************************!*\ !*** ./js/ui/collection/item.js ***! \**********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), publicComponentUtils = __webpack_require__( /*! ../../core/utils/public_component */ 45); var INVISIBLE_STATE_CLASS = "dx-state-invisible", DISABLED_STATE_CLASS = "dx-state-disabled", ITEM_CONTENT_PLACEHOLDER_CLASS = "dx-item-content-placeholder"; var forcibleWatcher = function(watchMethod, fn, callback) { var filteredCallback = function() { var oldValue; return function(value) { if (oldValue !== value) { callback(value, oldValue); oldValue = value } } }(); return { dispose: watchMethod(fn, filteredCallback), force: function() { filteredCallback(fn()) } } }; var CollectionItem = Class.inherit({ ctor: function($element, options, rawData) { this._$element = $element; this._options = options; this._rawData = rawData; publicComponentUtils.attachInstanceToElement($element, this, this._dispose); this._render() }, _render: function() { var $placeholder = $("<div>").addClass(ITEM_CONTENT_PLACEHOLDER_CLASS); this._$element.append($placeholder); this._watchers = []; this._renderWatchers() }, _renderWatchers: function() { this._startWatcher("disabled", this._renderDisabled.bind(this)); this._startWatcher("visible", this._renderVisible.bind(this)) }, _startWatcher: function(field, render) { var rawData = this._rawData, exprGetter = this._options.fieldGetter(field); var watcher = forcibleWatcher(this._options.watchMethod(), function() { return exprGetter(rawData) }, function(value, oldValue) { this._dirty = true; render(value, oldValue) }.bind(this)); this._watchers.push(watcher) }, setDataField: function() { this._dirty = false; $.each(this._watchers, function(_, watcher) { watcher.force() }); if (this._dirty) { return true } }, _renderDisabled: function(value, oldValue) { this._$element.toggleClass(DISABLED_STATE_CLASS, !!value) }, _renderVisible: function(value, oldValue) { this._$element.toggleClass(INVISIBLE_STATE_CLASS, void 0 !== value && !value) }, _dispose: function() { $.each(this._watchers, function(_, watcher) { watcher.dispose() }) } }); CollectionItem.getInstance = function($element) { return publicComponentUtils.getInstanceByElement($element, this) }; module.exports = CollectionItem }, /*!***************************!*\ !*** ./js/events/hold.js ***! \***************************/ function(module, exports, __webpack_require__) { var eventUtils = __webpack_require__( /*! ./utils */ 71), Emitter = __webpack_require__( /*! ./core/emitter */ 83), registerEmitter = __webpack_require__( /*! ./core/emitter_registrator */ 84), abs = Math.abs; var HOLD_EVENT_NAME = "dxhold", HOLD_TIMEOUT = 750, TOUCH_BOUNDARY = 5; var HoldEmitter = Emitter.inherit({ start: function(e) { this._startEventData = eventUtils.eventData(e); this._startTimer(e) }, _startTimer: function(e) { var holdTimeout = "timeout" in this ? this.timeout : HOLD_TIMEOUT; this._holdTimer = setTimeout(function() { this._requestAccept(e); this._fireEvent(HOLD_EVENT_NAME, e, { target: e.target }); this._forgetAccept() }.bind(this), holdTimeout) }, move: function(e) { if (this._touchWasMoved(e)) { this._cancel(e) } }, _touchWasMoved: function(e) { var delta = eventUtils.eventDelta(this._startEventData, eventUtils.eventData(e)); return abs(delta.x) > TOUCH_BOUNDARY || abs(delta.y) > TOUCH_BOUNDARY }, end: function() { this._stopTimer() }, _stopTimer: function() { clearTimeout(this._holdTimer) }, cancel: function() { this._stopTimer() }, dispose: function() { this._stopTimer() } }); registerEmitter({ emitter: HoldEmitter, bubble: true, events: [HOLD_EVENT_NAME] }); module.exports = { name: HOLD_EVENT_NAME } }, /*!**********************************!*\ !*** ./js/events/contextmenu.js ***! \**********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), support = __webpack_require__( /*! ../core/utils/support */ 61), devices = __webpack_require__( /*! ../core/devices */ 53), Class = __webpack_require__( /*! ../core/class */ 25), registerEvent = __webpack_require__( /*! ./core/event_registrator */ 73), eventUtils = __webpack_require__( /*! ./utils */ 71), holdEvent = __webpack_require__( /*! ./hold */ 164); var CONTEXTMENU_NAMESPACE = "dxContexMenu", CONTEXTMENU_NAMESPACED_EVENT_NAME = eventUtils.addNamespace("contextmenu", CONTEXTMENU_NAMESPACE), HOLD_NAMESPACED_EVENT_NAME = eventUtils.addNamespace(holdEvent.name, CONTEXTMENU_NAMESPACE), CONTEXTMENU_EVENT_NAME = "dxcontextmenu"; var ContextMenu = Class.inherit({ setup: function(element) { var $element = $(element); $element.on(CONTEXTMENU_NAMESPACED_EVENT_NAME, this._contextMenuHandler.bind(this)); if (support.touch || devices.isSimulator()) { $element.on(HOLD_NAMESPACED_EVENT_NAME, this._holdHandler.bind(this)) } }, _holdHandler: function(e) { if (eventUtils.isMouseEvent(e) && !devices.isSimulator()) { return } this._fireContextMenu(e) }, _contextMenuHandler: function(e) { this._fireContextMenu(e) }, _fireContextMenu: function(e) { return eventUtils.fireEvent({ type: CONTEXTMENU_EVENT_NAME, originalEvent: e }) }, teardown: function(element) { $(element).off("." + CONTEXTMENU_NAMESPACE) } }); registerEvent(CONTEXTMENU_EVENT_NAME, new ContextMenu); exports.name = CONTEXTMENU_EVENT_NAME }, /*!*******************************************!*\ !*** ./js/ui/widget/bindable_template.js ***! \*******************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), TemplateBase = __webpack_require__( /*! ./ui.template_base */ 97), removeEvent = __webpack_require__( /*! ../../core/remove_event */ 47), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14); var watchChanges = function() { var start = function(rawData, watchMethod, fields, fieldsMap, callback) { var globalDispose, fieldsDispose; globalDispose = globalWatch(rawData, watchMethod, function(dataWithRawFields) { fieldsDispose && fieldsDispose(); if (commonUtils.isPrimitive(dataWithRawFields)) { callback(dataWithRawFields); return } fieldsDispose = fieldsWatch(dataWithRawFields, watchMethod, fields, fieldsMap, function(data) { callback(data) }) }); return function() { fieldsDispose && fieldsDispose(); globalDispose && globalDispose() } }; var globalWatch = function(data, watchMethod, callback) { return watchMethod(function() { return data }, callback) }; var fieldsWatch = function(data, watchMethod, fields, fieldsMap, callback) { var resolvedData = {}, missedFields = fields.slice(); var watchHandlers = $.map(fields, function(name) { var fieldGetter = fieldsMap[name]; return watchMethod(fieldGetter ? function() { return fieldGetter(data) } : function() { return data[name] }, function(value) { resolvedData[name] = value; if (missedFields.length) { var index = missedFields.indexOf(name); if (index >= 0) { missedFields.splice(index, 1) } } if (!missedFields.length) { callback(resolvedData) } }) }); return function() { $.each(watchHandlers, function(_, dispose) { dispose() }) } }; return start }(); module.exports = TemplateBase.inherit({ ctor: function(render, fields, watchMethod, fieldsMap) { this._render = render; this._fields = fields; this._fieldsMap = fieldsMap || {}; this._watchMethod = watchMethod }, _renderCore: function(options) { var $container = options.container; var dispose = watchChanges(options.model, this._watchMethod, this._fields, this._fieldsMap, function(data) { $container.empty(); this._render($container, data, options.model) }.bind(this)); $container.on(removeEvent, dispose); return $container.contents() } }) }, /*!**********************************************************************!*\ !*** ./js/ui/collection/ui.collection_widget.edit.strategy.plain.js ***! \**********************************************************************/ function(module, exports, __webpack_require__) { var inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, EditStrategy = __webpack_require__( /*! ./ui.collection_widget.edit.strategy */ 168); var PlainEditStrategy = EditStrategy.inherit({ _getPlainItems: function() { return this._collectionWidget.option("items") || [] }, getIndexByItemData: function(itemData) { var keyOf = this._collectionWidget.keyOf.bind(this._collectionWidget); if (keyOf) { return this.getIndexByKey(keyOf(itemData)) } else { return inArray(itemData, this._getPlainItems()) } }, getItemDataByIndex: function(index) { return this._getPlainItems()[index] }, deleteItemAtIndex: function(index) { this._getPlainItems().splice(index, 1) }, itemsGetter: function() { return this._getPlainItems() }, getKeysByItems: function(items) { var keyOf = this._collectionWidget.keyOf.bind(this._collectionWidget); var result = items; if (keyOf) { result = []; for (var i = 0; i < items.length; i++) { result.push(keyOf(items[i])) } } return result }, getIndexByKey: function(key) { var keys = this.getKeysByItems(this._getPlainItems()); for (var i = 0, length = keys.length; i < length; i++) { if (this._equalKeys(key, keys[i])) { return i } } return -1 }, getItemsByKeys: function(keys, items) { return items || keys }, moveItemAtIndexToIndex: function(movingIndex, destinationIndex) { var items = this._getPlainItems(), movedItemData = items[movingIndex]; items.splice(movingIndex, 1); items.splice(destinationIndex, 0, movedItemData) }, _isItemIndex: function(index) { return "number" === typeof index && Math.round(index) === index }, _getNormalizedItemIndex: function(itemElement) { return this._collectionWidget._itemElements().index(itemElement) }, _normalizeItemIndex: function(index) { return index }, _denormalizeItemIndex: function(index) { return index }, _getItemByNormalizedIndex: function(index) { return index > -1 ? this._collectionWidget._itemElements().eq(index) : null }, _itemsFromSameParent: function() { return true } }); module.exports = PlainEditStrategy }, /*!****************************************************************!*\ !*** ./js/ui/collection/ui.collection_widget.edit.strategy.js ***! \****************************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), abstract = Class.abstract; var EditStrategy = Class.inherit({ ctor: function(collectionWidget) { this._collectionWidget = collectionWidget }, getIndexByItemData: abstract, getItemDataByIndex: abstract, getKeysByItems: abstract, getItemsByKeys: abstract, itemsGetter: abstract, getKeyByIndex: function(index) { var resultIndex = this._denormalizeItemIndex(index); return this.getKeysByItems([this.getItemDataByIndex(resultIndex)])[0] }, _equalKeys: function(key1, key2) { if (this._collectionWidget._isKeySpecified()) { return commonUtils.equalByValue(key1, key2) } else { return key1 === key2 } }, getIndexByKey: abstract, getNormalizedIndex: function(value) { if (this._isNormalizedItemIndex(value)) { return value } if (this._isItemIndex(value)) { return this._normalizeItemIndex(value) } if (this._isDOMNode(value)) { return this._getNormalizedItemIndex(value) } return this._normalizeItemIndex(this.getIndexByItemData(value)) }, getIndex: function(value) { if (this._isNormalizedItemIndex(value)) { return this._denormalizeItemIndex(value) } if (this._isItemIndex(value)) { return value } if (this._isDOMNode(value)) { return this._denormalizeItemIndex(this._getNormalizedItemIndex(value)) } return this.getIndexByItemData(value) }, getItemElement: function(value) { if (this._isNormalizedItemIndex(value)) { return this._getItemByNormalizedIndex(value) } if (this._isItemIndex(value)) { return this._getItemByNormalizedIndex(this._normalizeItemIndex(value)) } if (this._isDOMNode(value)) { return $(value) } return this._getItemByNormalizedIndex(this.getIndexByItemData(value)) }, deleteItemAtIndex: abstract, itemPlacementFunc: function(movingIndex, destinationIndex) { return this._itemsFromSameParent(movingIndex, destinationIndex) && movingIndex < destinationIndex ? "after" : "before" }, moveItemAtIndexToIndex: abstract, _isNormalizedItemIndex: function(index) { return "number" === typeof index && Math.round(index) === index }, _isDOMNode: function(value) { var $value; try { $value = $(value) } catch (error) { return false } return $value && $value.length && $value.get(0).nodeType }, _isItemIndex: abstract, _getNormalizedItemIndex: abstract, _normalizeItemIndex: abstract, _denormalizeItemIndex: abstract, _getItemByNormalizedIndex: abstract, _itemsFromSameParent: abstract }); module.exports = EditStrategy }, /*!**************************************!*\ !*** ./js/ui/selection/selection.js ***! \**************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), deferredStrategy = __webpack_require__( /*! ./selection.strategy.deferred */ 170), standardStrategy = __webpack_require__( /*! ./selection.strategy.standard */ 172), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14); module.exports = Class.inherit({ ctor: function(options) { this.options = extend(this._getDefaultOptions(), options, { selectedItemKeys: options.selectedKeys || [] }); this._selectionStrategy = this.options.deferred ? new deferredStrategy(this.options) : new standardStrategy(this.options); this._focusedItemIndex = -1; if (!this.options.equalByReference) { this._selectionStrategy.updateSelectedItemKeyHash(this.options.selectedItemKeys) } }, _getDefaultOptions: function() { return { deferred: false, equalByReference: false, mode: "multiple", selectedItems: [], selectionFilter: [], maxFilterLengthInRequest: 0, onSelectionChanged: commonUtils.noop, key: commonUtils.noop, keyOf: function(item) { return item }, load: function() { return $.Deferred().resolve([]) }, totalCount: function() { return -1 }, isSelectableItem: function() { return true }, isItemSelected: function() { return false }, getItemData: function(item) { return item }, dataFields: commonUtils.noop, filter: commonUtils.noop } }, validate: function() { this._selectionStrategy.validate() }, getSelectedItemKeys: function() { return this._selectionStrategy.getSelectedItemKeys() }, getSelectedItems: function() { return this._selectionStrategy.getSelectedItems() }, selectionFilter: function(value) { if (void 0 === value) { return this.options.selectionFilter } var filterIsChanged = this.options.selectionFilter !== value && JSON.stringify(this.options.selectionFilter) !== JSON.stringify(value); this.options.selectionFilter = value; filterIsChanged && this.onSelectionChanged() }, setSelection: function(keys) { return this.selectedItemKeys(keys) }, select: function(keys) { return this.selectedItemKeys(keys, true) }, deselect: function(keys) { return this.selectedItemKeys(keys, true, true) }, selectedItemKeys: function(keys, preserve, isDeselect, isSelectAll) { var that = this; keys = keys || []; keys = Array.isArray(keys) ? keys : [keys]; that.validate(); return this._selectionStrategy.selectedItemKeys(keys, preserve, isDeselect, isSelectAll) }, clearSelection: function() { return this.selectedItemKeys([]) }, _addSelectedItem: function(itemData, key) { this._selectionStrategy.addSelectedItem(key, itemData) }, _removeSelectedItem: function(key) { this._selectionStrategy.removeSelectedItem(key) }, _setSelectedItems: function(keys, items) { this._selectionStrategy.setSelectedItems(keys, items) }, onSelectionChanged: function() { this._selectionStrategy.onSelectionChanged() }, changeItemSelection: function(itemIndex, keys) { var isSelectedItemsChanged, items = this.options.plainItems(), item = items[itemIndex]; if (!this.isSelectable() || !this.isDataItem(item)) { return false } var itemData = this.options.getItemData(item), itemKey = this.options.keyOf(itemData); keys = keys || {}; if (keys.shift && "multiple" === this.options.mode && this._focusedItemIndex >= 0) { isSelectedItemsChanged = this.changeItemSelectionWhenShiftKeyPressed(itemIndex, items) } else { if (keys.control) { this._resetItemSelectionWhenShiftKeyPressed(); var isSelected = this._selectionStrategy.isItemDataSelected(itemData); if ("single" === this.options.mode) { this.clearSelectedItems() } if (isSelected) { this._removeSelectedItem(itemKey) } else { this._addSelectedItem(itemData, itemKey) } isSelectedItemsChanged = true } else { this._resetItemSelectionWhenShiftKeyPressed(); var isKeysEqual = this._selectionStrategy.equalKeys(this.options.selectedItemKeys[0], itemKey); if (1 !== this.options.selectedItemKeys.length || !isKeysEqual) { this._setSelectedItems([itemKey], [itemData]); isSelectedItemsChanged = true } } } if (isSelectedItemsChanged) { this._focusedItemIndex = itemIndex; this.onSelectionChanged(); return true } }, isDataItem: function(item) { return this.options.isSelectableItem(item) }, isSelectable: function() { return "single" === this.options.mode || "multiple" === this.options.mode }, isItemSelected: function(arg) { return this._selectionStrategy.isItemKeySelected(arg) }, _resetItemSelectionWhenShiftKeyPressed: function() { delete this._shiftFocusedItemIndex }, changeItemSelectionWhenShiftKeyPressed: function(itemIndex, items) { var itemIndexStep, index, isSelectedItemsChanged = false, keyOf = this.options.keyOf, key = keyOf(items[this._focusedItemIndex].data), isFocusedItemSelected = items[this._focusedItemIndex] && this.isItemSelected(key); if (!commonUtils.isDefined(this._shiftFocusedItemIndex)) { this._shiftFocusedItemIndex = this._focusedItemIndex } var data, itemKey; if (this._shiftFocusedItemIndex !== this._focusedItemIndex) { itemIndexStep = this._focusedItemIndex < this._shiftFocusedItemIndex ? 1 : -1; for (index = this._focusedItemIndex; index !== this._shiftFocusedItemIndex; index += itemIndexStep) { if (this.isDataItem(items[index])) { itemKey = keyOf(this.options.getItemData(items[index])); this._removeSelectedItem(itemKey); isSelectedItemsChanged = true } } } if (itemIndex !== this._shiftFocusedItemIndex) { itemIndexStep = itemIndex < this._shiftFocusedItemIndex ? 1 : -1; for (index = itemIndex; index !== this._shiftFocusedItemIndex; index += itemIndexStep) { if (this.isDataItem(items[index])) { data = this.options.getItemData(items[index]); itemKey = keyOf(data); this._addSelectedItem(data, itemKey); isSelectedItemsChanged = true } } } if (this.isDataItem(items[this._focusedItemIndex]) && !isFocusedItemSelected) { data = this.options.getItemData(items[index]); itemKey = keyOf(data); this._addSelectedItem(data, itemKey); isSelectedItemsChanged = true } return isSelectedItemsChanged }, clearSelectedItems: function() { this._setSelectedItems([], []) }, selectAll: function(isOnePage) { if (isOnePage) { return this._onePageSelectAll(false) } else { return this.selectedItemKeys([], true, false, true) } }, deselectAll: function(isOnePage) { if (isOnePage) { return this._onePageSelectAll(true) } else { return this.selectedItemKeys([], true, true, true) } }, _onePageSelectAll: function(isDeselect) { var items = this.options.plainItems(); for (var i = 0; i < items.length; i++) { var item = items[i]; if (this.isDataItem(item)) { var itemData = this.options.getItemData(item), itemKey = this.options.keyOf(itemData), isSelected = this.isItemSelected(itemKey); if (!isSelected && !isDeselect) { this._addSelectedItem(itemData, itemKey) } if (isSelected && isDeselect) { this._removeSelectedItem(itemKey) } } } this.onSelectionChanged(); return $.Deferred().resolve() }, getSelectAllState: function(visibleOnly) { return this._selectionStrategy.getSelectAllState(visibleOnly) } }) }, /*!********************************************************!*\ !*** ./js/ui/selection/selection.strategy.deferred.js ***! \********************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), SelectionStrategy = __webpack_require__( /*! ./selection.strategy */ 171), errors = __webpack_require__( /*! ../widget/ui.errors */ 22), dataQuery = __webpack_require__( /*! ../../data/query */ 159); module.exports = SelectionStrategy.inherit({ getSelectedItems: function() { return this._loadFilteredData(this.options.selectionFilter) }, getSelectedItemKeys: function() { var d = $.Deferred(), that = this, key = this.options.key(), select = commonUtils.isString(key) ? [key] : key; this._loadFilteredData(this.options.selectionFilter, null, select).done(function(items) { var keys = items.map(function(item) { return that.options.keyOf(item) }); d.resolve(keys) }).fail(d.reject); return d.promise() }, selectedItemKeys: function(keys, preserve, isDeselect, isSelectAll) { if (isSelectAll) { var filter = this.options.filter(); if (!filter) { this._setOption("selectionFilter", isDeselect ? [] : null) } else { this._addSelectionFilter(isDeselect, filter, false) } } else { if (!preserve) { this._setOption("selectionFilter", []) } for (var i = 0; i < keys.length; i++) { if (isDeselect) { this.removeSelectedItem(keys[i]) } else { this.addSelectedItem(keys[i]) } } } this.onSelectionChanged(); return $.Deferred().resolve() }, setSelectedItems: function(keys) { this._setOption("selectionFilter", null); for (var i = 0; i < keys.length; i++) { this.addSelectedItem(keys[i]) } }, isItemDataSelected: function(itemData) { return this.isItemKeySelected(itemData) }, isItemKeySelected: function(itemData) { var selectionFilter = this.options.selectionFilter; if (!selectionFilter) { return true } return !!dataQuery([itemData]).filter(selectionFilter).toArray().length }, _processSelectedItem: function(key) { var keyField = this.options.key(), filter = [keyField, "=", key]; if (Array.isArray(keyField)) { filter = []; for (var i = 0; i < keyField.length; i++) { filter.push([keyField[i], "=", key[keyField[i]]]); if (i !== keyField.length - 1) { filter.push("and") } } } return filter }, addSelectedItem: function(key) { var filter = this._processSelectedItem(key); this._addSelectionFilter(false, filter, true) }, removeSelectedItem: function(key) { var filter = this._processSelectedItem(key); this._addSelectionFilter(true, filter, true) }, validate: function() { var key = this.options.key; if (key && void 0 === key()) { throw errors.Error("E1042") } }, _hasSameFilter: function(selectionFilter, currentFilter) { return this._findSubFilter(selectionFilter, currentFilter) >= 0 }, _findSubFilter: function(selectionFilter, filter) { if (!selectionFilter) { return -1 } var filterString = JSON.stringify(filter); for (var index = 0; index < selectionFilter.length; index++) { var subFilter = selectionFilter[index]; if (subFilter && JSON.stringify(subFilter) === filterString) { return index } } return -1 }, _isLastSubFilter: function(selectionFilter, filter) { if (selectionFilter && filter) { return this._findSubFilter(selectionFilter, filter) === selectionFilter.length - 1 } return false }, _addFilterOperator: function(selectionFilter, filterOperator) { if (selectionFilter.length > 1 && commonUtils.isString(selectionFilter[1]) && selectionFilter[1] !== filterOperator) { selectionFilter = [selectionFilter] } if (selectionFilter.length) { selectionFilter.push(filterOperator) } return selectionFilter }, _denormalizeFilter: function(filter) { if (filter && commonUtils.isString(filter[0])) { filter = [filter] } return filter }, _addSelectionFilter: function(isDeselect, filter, isUnique) { var that = this, needAddFilter = true, currentFilter = isDeselect ? ["!", filter] : filter, selectionFilter = that.options.selectionFilter || []; selectionFilter = that._denormalizeFilter(selectionFilter); if (selectionFilter && selectionFilter.length) { if (that._hasSameFilter(selectionFilter, currentFilter)) { return } if (that._removeInvertedFilter(selectionFilter, isDeselect, filter)) { needAddFilter = !isUnique } if (needAddFilter) { selectionFilter = that._addFilterOperator(selectionFilter, isDeselect ? "and" : "or") } } if (needAddFilter) { selectionFilter.push(currentFilter) } selectionFilter = that._normalizeFilter(selectionFilter); that._setOption("selectionFilter", !isDeselect && !selectionFilter.length ? null : selectionFilter) }, _normalizeFilter: function(filter) { if (filter && 1 === filter.length) { filter = filter[0] } return filter }, _removeInvertedFilter: function(selectionFilter, isDeselect, filter) { filter = isDeselect ? filter : ["!", filter]; var filterIndex = this._findSubFilter(selectionFilter, filter); if (JSON.stringify(filter) === JSON.stringify(selectionFilter)) { selectionFilter.splice(0, selectionFilter.length); return true } if (filterIndex >= 0) { if (filterIndex > 0) { selectionFilter.splice(filterIndex - 1, 2) } else { selectionFilter.splice(filterIndex, 2) } return true } return false }, getSelectAllState: function() { var filter = this.options.filter(), selectionFilter = this.options.selectionFilter; if (!selectionFilter) { return true } if (!selectionFilter.length) { return false } if (!filter || !filter.length) { return } selectionFilter = this._denormalizeFilter(selectionFilter); if (this._isLastSubFilter(selectionFilter, filter)) { return true } if (this._isLastSubFilter(selectionFilter, ["!", filter])) { return false } return } }) }, /*!***********************************************!*\ !*** ./js/ui/selection/selection.strategy.js ***! \***********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), dataQuery = __webpack_require__( /*! ../../data/query */ 159), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), typeUtils = __webpack_require__( /*! ../../core/utils/type */ 12), getKeyHash = commonUtils.getKeyHash, Class = __webpack_require__( /*! ../../core/class */ 25); module.exports = Class.inherit({ ctor: function(options) { this.options = options; this._clearItemKeys() }, _clearItemKeys: function() { this._setOption("addedItemKeys", []); this._setOption("removedItemKeys", []); this._setOption("removedItems", []); this._setOption("addedItems", []) }, validate: commonUtils.noop, _setOption: function(name, value) { this.options[name] = value }, onSelectionChanged: function() { var addedItemKeys = this.options.addedItemKeys, removedItemKeys = this.options.removedItemKeys, addedItems = this.options.addedItems, removedItems = this.options.removedItems, selectedItems = this.options.selectedItems, selectedItemKeys = this.options.selectedItemKeys, onSelectionChanged = this.options.onSelectionChanged || commonUtils.noop; this._clearItemKeys(); onSelectionChanged({ selectedItems: selectedItems, selectedItemKeys: selectedItemKeys, addedItemKeys: addedItemKeys, removedItemKeys: removedItemKeys, addedItems: addedItems, removedItems: removedItems }) }, equalKeys: function(key1, key2) { if (this.options.equalByReference) { if (commonUtils.isObject(key1) && commonUtils.isObject(key2)) { return key1 === key2 } } return commonUtils.equalByValue(key1, key2) }, _clearSelection: function(keys, preserve, isDeselect, isSelectAll) { keys = keys || []; keys = Array.isArray(keys) ? keys : [keys]; this.validate(); return this.selectedItemKeys(keys, preserve, isDeselect, isSelectAll) }, _loadFilteredData: function(remoteFilter, localFilter, select) { var filterLength = encodeURI(JSON.stringify(remoteFilter)).length, needLoadAllData = this.options.maxFilterLengthInRequest && filterLength > this.options.maxFilterLengthInRequest, deferred = $.Deferred(), loadOptions = { filter: needLoadAllData ? void 0 : remoteFilter, select: needLoadAllData ? this.options.dataFields() : select || this.options.dataFields() }; if (remoteFilter && 0 === remoteFilter.length) { deferred.resolve([]) } else { this.options.load(loadOptions).done(function(items) { var filteredItems = typeUtils.isPlainObject(items) ? items.data : items; if (localFilter) { filteredItems = filteredItems.filter(localFilter) } else { if (needLoadAllData) { filteredItems = dataQuery(filteredItems).filter(remoteFilter).toArray() } } deferred.resolve(filteredItems) }).fail(deferred.reject.bind(deferred)) } return deferred }, updateSelectedItemKeyHash: function(keys) { for (var i = 0; i < keys.length; i++) { var keyHash = getKeyHash(keys[i]); if (!commonUtils.isObject(keyHash)) { this.options.keyHashIndices[keyHash] = this.options.keyHashIndices[keyHash] || []; var keyIndices = this.options.keyHashIndices[keyHash]; keyIndices.push(i) } } }, _isAnyItemSelected: function(items) { for (var i = 0; i < items.length; i++) { if (this.options.isItemSelected(items[i])) { return } } return false }, _getFullSelectAllState: function() { var items = this.options.plainItems(), dataFilter = this.options.filter(), selectedItems = this.options.selectedItems; if (dataFilter) { selectedItems = dataQuery(selectedItems).filter(dataFilter).toArray() } var selectedItemsLength = selectedItems.length; if (!selectedItemsLength) { return this._isAnyItemSelected(items) } if (selectedItemsLength >= this.options.totalCount()) { return true } return }, _getVisibleSelectAllState: function() { var items = this.options.plainItems(), hasSelectedItems = false, hasUnselectedItems = false; for (var i = 0; i < items.length; i++) { var item = items[i], itemData = this.options.getItemData(item), key = this.options.keyOf(itemData); if (this.options.isSelectableItem(item)) { if (this.isItemKeySelected(key)) { hasSelectedItems = true } else { hasUnselectedItems = true } } } if (hasSelectedItems) { return !hasUnselectedItems ? true : void 0 } else { return false } } }) }, /*!********************************************************!*\ !*** ./js/ui/selection/selection.strategy.standard.js ***! \********************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), getKeyHash = commonUtils.getKeyHash, dataQuery = __webpack_require__( /*! ../../data/query */ 159), when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when, errors = __webpack_require__( /*! ../widget/ui.errors */ 22), SelectionStrategy = __webpack_require__( /*! ./selection.strategy */ 171); function SelectionFilterCreator(keyExpr, selectedItemKeys, isSelectAll, equalKeys, keyOf, equalByReference) { this.getLocalFilter = function() { return functionFilter }; this.getExpr = function() { if (!keyExpr) { return } var filterExpr; for (var i = 0, length = selectedItemKeys.length; i < length; i++) { filterExpr = filterExpr || []; var filterExprPart, itemKeyValue = selectedItemKeys[i]; if (i > 0) { filterExpr.push(isSelectAll ? "and" : "or") } if (commonUtils.isString(keyExpr)) { filterExprPart = getFilterForPlainKey(itemKeyValue) } else { filterExprPart = getFilterForCompositeKey(itemKeyValue) } filterExpr.push(filterExprPart) } if (filterExpr && 1 === filterExpr.length) { filterExpr = filterExpr[0] } this._filter = filterExpr; return filterExpr }; this.getCombinedFilter = function(dataSourceFilter) { var filterExpr = this.getExpr(), combinedFilter = filterExpr; if (isSelectAll && dataSourceFilter) { if (filterExpr) { combinedFilter = []; combinedFilter.push(filterExpr); combinedFilter.push(dataSourceFilter) } else { combinedFilter = dataSourceFilter } } return combinedFilter }; var selectedItemKeyHashesMap; var getSelectedItemKeyHashesMap = function(selectedItemKeys) { if (!selectedItemKeyHashesMap) { selectedItemKeyHashesMap = {}; for (var i = 0; i < selectedItemKeys.length; i++) { selectedItemKeyHashesMap[getKeyHash(selectedItemKeys[i])] = true } } return selectedItemKeyHashesMap }; var functionFilter = function(item) { var keyHash, i, key = keyOf(item); if (!equalByReference) { keyHash = getKeyHash(key); if (!commonUtils.isObject(keyHash)) { var selectedKeyHashesMap = getSelectedItemKeyHashesMap(selectedItemKeys); if (selectedKeyHashesMap[keyHash]) { return !isSelectAll } return !!isSelectAll } } for (i = 0; i < selectedItemKeys.length; i++) { if (equalKeys(selectedItemKeys[i], key)) { return !isSelectAll } } return !!isSelectAll }; var getFilterForPlainKey = function(keyValue, key) { return [key || keyExpr, isSelectAll ? "<>" : "=", keyValue] }; var getFilterForCompositeKey = function(itemKeyValue) { var filterExpr = []; for (var i = 0, length = keyExpr.length; i < length; i++) { if (i > 0) { filterExpr.push(isSelectAll ? "or" : "and") } var currentKeyExpr = keyExpr[i], currentKeyValue = itemKeyValue && itemKeyValue[currentKeyExpr], filterExprPart = getFilterForPlainKey(currentKeyValue, currentKeyExpr); filterExpr.push(filterExprPart) } return filterExpr } } module.exports = SelectionStrategy.inherit({ ctor: function(options) { this.callBase(options); this._initSelectedItemKeyHash() }, _initSelectedItemKeyHash: function() { this._setOption("keyHashIndices", this.options.equalByReference ? null : {}) }, getSelectedItemKeys: function() { return this.options.selectedItemKeys.slice(0) }, getSelectedItems: function() { return this.options.selectedItems.slice(0) }, _preserveSelectionUpdate: function(items, isDeselect) { var keyIndicesToRemoveMap, keyIndex, i, keyOf = this.options.keyOf; if (!keyOf) { return } var isBatchDeselect = isDeselect && items.length > 1 && !this.options.equalByReference; if (isBatchDeselect) { keyIndicesToRemoveMap = {} } for (i = 0; i < items.length; i++) { var item = items[i], key = keyOf(item); if (isDeselect) { keyIndex = this.removeSelectedItem(key, keyIndicesToRemoveMap); if (keyIndicesToRemoveMap && keyIndex >= 0) { keyIndicesToRemoveMap[keyIndex] = true } } else { this.addSelectedItem(key, item) } } if (isBatchDeselect) { this._batchRemoveSelectedItems(keyIndicesToRemoveMap) } }, _batchRemoveSelectedItems: function(keyIndicesToRemoveMap) { var selectedItemKeys = this.options.selectedItemKeys.slice(0); var selectedItems = this.options.selectedItems.slice(0); this.options.selectedItemKeys.length = 0; this.options.selectedItems.length = 0; for (var i = 0; i < selectedItemKeys.length; i++) { if (!keyIndicesToRemoveMap[i]) { this.options.selectedItemKeys.push(selectedItemKeys[i]); this.options.selectedItems.push(selectedItems[i]) } } this._initSelectedItemKeyHash(); this.updateSelectedItemKeyHash(this.options.selectedItemKeys) }, _loadSelectedItemsCore: function(keys, isDeselect, isSelectAll) { var deferred = $.Deferred(), key = this.options.key; if (!keys.length && !isSelectAll) { deferred.resolve([]); return deferred } var filter = this.options.filter(); if (isSelectAll && isDeselect && !filter) { deferred.resolve(this.getSelectedItems()); return deferred } var selectionFilterCreator = new SelectionFilterCreator(key(), keys, isSelectAll, this.equalKeys.bind(this), this.options.keyOf, this.options.equalByReference), combinedFilter = selectionFilterCreator.getCombinedFilter(filter); var deselectedItems = []; if (isDeselect) { deselectedItems = combinedFilter ? dataQuery(this.options.selectedItems).filter(combinedFilter).toArray() : this.options.selectedItems.slice(0) } var filteredItems = deselectedItems.length ? deselectedItems : this.options.plainItems().filter(this.options.isSelectableItem).map(this.options.getItemData); var localFilter = selectionFilterCreator.getLocalFilter(); filteredItems = filteredItems.filter(localFilter); if (deselectedItems.length || !isSelectAll && filteredItems.length === keys.length) { deferred.resolve(filteredItems) } else { deferred = this._loadFilteredData(combinedFilter, localFilter) } return deferred }, _replaceSelectionUpdate: function(items) { var internalKeys = [], keyOf = this.options.keyOf; if (!keyOf) { return } for (var i = 0; i < items.length; i++) { var item = items[i], key = keyOf(item); internalKeys.push(key) } this.setSelectedItems(internalKeys, items) }, _warnOnIncorrectKeys: function(keys) { for (var i = 0; i < keys.length; i++) { if (!this.isItemKeySelected(keys[i])) { errors.log("W1002", keys[i]) } } }, _loadSelectedItems: function(keys, isDeselect, isSelectAll) { var that = this, deferred = $.Deferred(); when(that._lastLoadDeferred).always(function() { that._loadSelectedItemsCore(keys, isDeselect, isSelectAll).done(deferred.resolve).fail(deferred.reject) }); that._lastLoadDeferred = deferred; return deferred }, selectedItemKeys: function(keys, preserve, isDeselect, isSelectAll) { var that = this, deferred = that._loadSelectedItems(keys, isDeselect, isSelectAll); deferred.done(function(items) { if (preserve) { that._preserveSelectionUpdate(items, isDeselect) } else { that._replaceSelectionUpdate(items) } if (!isSelectAll && !isDeselect) { that._warnOnIncorrectKeys(keys) } that.onSelectionChanged() }); return deferred }, addSelectedItem: function(key, itemData) { var keyHash = this._getKeyHash(key); if (this._indexOfSelectedItemKey(keyHash) === -1) { if (!commonUtils.isObject(keyHash) && this.options.keyHashIndices) { this.options.keyHashIndices[keyHash] = [this.options.selectedItemKeys.length] } this.options.selectedItemKeys.push(key); this.options.addedItemKeys.push(key); this.options.addedItems.push(itemData); this.options.selectedItems.push(itemData) } }, _getSelectedIndexByKey: function(key, ignoreIndicesMap) { var selectedItemKeys = this.options.selectedItemKeys; for (var index = 0; index < selectedItemKeys.length; index++) { if ((!ignoreIndicesMap || !ignoreIndicesMap[index]) && this.equalKeys(selectedItemKeys[index], key)) { return index } } return -1 }, _getSelectedIndexByHash: function(key, ignoreIndicesMap) { var indices = this.options.keyHashIndices[key]; if (indices && indices.length > 1 && ignoreIndicesMap) { indices = indices.filter(function(index) { return !ignoreIndicesMap[index] }) } return indices && indices[0] >= 0 ? indices[0] : -1 }, _indexOfSelectedItemKey: function(key, ignoreIndicesMap) { var selectedIndex; if (this.options.equalByReference) { selectedIndex = this.options.selectedItemKeys.indexOf(key) } else { if (commonUtils.isObject(key)) { selectedIndex = this._getSelectedIndexByKey(key, ignoreIndicesMap) } else { selectedIndex = this._getSelectedIndexByHash(key, ignoreIndicesMap) } } return selectedIndex }, _shiftSelectedKeyIndices: function(keyIndex) { for (var currentKeyIndex = keyIndex; currentKeyIndex < this.options.selectedItemKeys.length; currentKeyIndex++) { var currentKey = this.options.selectedItemKeys[currentKeyIndex], currentKeyHash = getKeyHash(currentKey), currentKeyIndices = this.options.keyHashIndices[currentKeyHash]; if (!currentKeyIndices) { continue } for (var i = 0; i < currentKeyIndices.length; i++) { if (currentKeyIndices[i] > keyIndex) { currentKeyIndices[i]-- } } } }, removeSelectedItem: function(key, keyIndicesToRemoveMap) { var keyHash = this._getKeyHash(key), isBatchDeselect = !!keyIndicesToRemoveMap, keyIndex = this._indexOfSelectedItemKey(keyHash, keyIndicesToRemoveMap); if (keyIndex < 0) { return keyIndex } this.options.removedItemKeys.push(key); this.options.removedItems.push(this.options.selectedItems[keyIndex]); if (isBatchDeselect) { return keyIndex } this.options.selectedItemKeys.splice(keyIndex, 1); this.options.selectedItems.splice(keyIndex, 1); if (commonUtils.isObject(keyHash) || !this.options.keyHashIndices) { return keyIndex } var keyIndices = this.options.keyHashIndices[keyHash]; if (!keyIndices) { return keyIndex } keyIndices.shift(); if (!keyIndices.length) { delete this.options.keyHashIndices[keyHash] } this._shiftSelectedKeyIndices(keyIndex); return keyIndex }, _needRemoveItemKey: function(keys, key) { var hashIndices = this.options.keyHashIndices; if (!hashIndices) { return keys.indexOf(key) < 0 } var hash = this._getKeyHash(key); for (var i = 0; i < keys.length; i++) { var keyHash = this._getKeyHash(keys[i]); if (this.equalKeys(hash, keyHash)) { return false } } return true }, _updateAddedItemKeys: function(keys, items) { for (var i = 0; i < keys.length; i++) { if (this._indexOfSelectedItemKey(keys[i]) < 0) { this.options.addedItemKeys.push(keys[i]); this.options.addedItems.push(items[i]) } } }, _updateRemovedItemKeys: function(keys) { var oldSelectedKeys = this.options.selectedItemKeys, oldSelectedItems = this.options.selectedItems; for (var i = 0; i < oldSelectedKeys.length; i++) { if (this._needRemoveItemKey(keys, oldSelectedKeys[i])) { this.options.removedItemKeys.push(oldSelectedKeys[i]); this.options.removedItems.push(oldSelectedItems[i]) } } }, _getKeyHash: function(key) { return this.options.equalByReference ? key : getKeyHash(key) }, setSelectedItems: function(keys, items) { this._updateRemovedItemKeys(keys, items); this._updateAddedItemKeys(keys, items); if (!this.options.equalByReference) { this._initSelectedItemKeyHash(); this.updateSelectedItemKeyHash(keys) } this._setOption("selectedItemKeys", keys); this._setOption("selectedItems", items) }, isItemDataSelected: function(itemData) { var key = this.options.keyOf(itemData); return this.isItemKeySelected(key) }, isItemKeySelected: function(key) { var keyHash = this._getKeyHash(key); var index = this._indexOfSelectedItemKey(keyHash); return index !== -1 }, getSelectAllState: function(visibleOnly) { if (visibleOnly) { return this._getVisibleSelectAllState() } else { return this._getFullSelectAllState() } } }) }, /*!*****************************************************!*\ !*** ./js/integration/angular/event_registrator.js ***! \*****************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), eventRegistrator = __webpack_require__( /*! ../../events/core/event_registrator */ 73), ngModule = __webpack_require__( /*! ./module */ 148); eventRegistrator.callbacks.add(function(name) { var ngEventName = name.slice(0, 2) + name.charAt(2).toUpperCase() + name.slice(3); ngModule.directive(ngEventName, ["$parse", function($parse) { return function(scope, element, attr) { var handler, attrValue = $.trim(attr[ngEventName]), eventOptions = {}; if ("{" === attrValue.charAt(0)) { eventOptions = scope.$eval(attrValue); handler = $parse(eventOptions.execute) } else { handler = $parse(attr[ngEventName]) } element.on(name, eventOptions, function(e) { scope.$apply(function() { handler(scope, { $event: e }) }) }) } }]) }) }, /*!**********************************************!*\ !*** ./js/integration/angular/components.js ***! \**********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), ngModule = __webpack_require__( /*! ./module */ 148); ngModule.service("dxDigestCallbacks", ["$rootScope", function($rootScope) { var begin = $.Callbacks(), end = $.Callbacks(); var digestPhase = false; $rootScope.$watch(function() { if (digestPhase) { return } digestPhase = true; begin.fire(); $rootScope.$$postDigest(function() { digestPhase = false; end.fire() }) }); return { begin: { add: function(callback) { if (digestPhase) { callback() } begin.add(callback) }, remove: begin.remove }, end: end } }]) }, /*!****************************************************!*\ !*** ./js/integration/angular/action_executors.js ***! \****************************************************/ function(module, exports, __webpack_require__) { var Action = __webpack_require__( /*! ../../core/action */ 49); Action.registerExecutor({ ngExpression: { execute: function(e) { if ("string" === typeof e.action) { e.context.$eval(e.action) } } } }) }, /*!*******************************************!*\ !*** ./js/localization/globalize/core.js ***! \*******************************************/ function(module, exports, __webpack_require__) { var Globalize = __webpack_require__( /*! globalize */ 177), coreLocalization = __webpack_require__( /*! ../core */ 34); if (Globalize && Globalize.load) { var likelySubtags = { supplemental: { version: { _cldrVersion: "28", _unicodeVersion: "8.0.0", _number: "$Revision: 11965 $" }, likelySubtags: { en: "en-Latn-US", de: "de-Latn-DE", ru: "ru-Cyrl-RU", ja: "ja-Jpan-JP" } } }; if (!Globalize.locale()) { Globalize.load(likelySubtags); Globalize.locale("en") } coreLocalization.inject({ locale: function(locale) { if (!locale) { return Globalize.locale().locale } Globalize.locale(locale) } }) } }, /*!***********************************!*\ !*** external "window.Globalize" ***! \***********************************/ function(module, exports) { module.exports = window.Globalize }, /*!**********************************************!*\ !*** ./js/localization/globalize/message.js ***! \**********************************************/ function(module, exports, __webpack_require__) { __webpack_require__( /*! ./core */ 176); var Globalize = __webpack_require__( /*! globalize */ 177), messageLocalization = __webpack_require__( /*! ../message */ 89), coreLocalization = __webpack_require__( /*! ../core */ 34); __webpack_require__( /*! globalize/message */ 177); if (Globalize && Globalize.formatMessage) { var DEFAULT_LOCALE = "en"; var originalLoadMessages = Globalize.loadMessages; Globalize.loadMessages = function(messages) { messageLocalization.load(messages) }; var globalizeMessageLocalization = { ctor: function() { this.load(this._dictionary) }, load: function(messages) { this.callBase(messages); originalLoadMessages(messages) }, getMessagesByLocales: function() { return Globalize.cldr.get("globalize-messages") }, getFormatter: function(key, locale) { var currentLocale = locale || coreLocalization.locale(), formatter = this._getFormatterBase(key, locale); if (!formatter) { formatter = this._formatterByGlobalize(key, locale) } if (!formatter && currentLocale !== DEFAULT_LOCALE) { formatter = this.getFormatter(key, DEFAULT_LOCALE) } return formatter }, _formatterByGlobalize: function(key, locale) { var result, currentGlobalize = !locale || locale === coreLocalization.locale() ? Globalize : new Globalize(locale); if (this._messageLoaded(key, locale)) { result = currentGlobalize.messageFormatter(key) } return result }, _messageLoaded: function(key, locale) { var currentCldr = locale ? new Globalize(locale).cldr : Globalize.locale(), value = currentCldr.get(["globalize-messages/{bundle}", key]); return void 0 !== value }, _loadSingle: function(key, value, locale) { var data = {}; data[locale] = {}; data[locale][key] = value; this.load(data) } }; messageLocalization.inject(globalizeMessageLocalization) } }, /*!*********************************************!*\ !*** ./js/localization/globalize/number.js ***! \*********************************************/ function(module, exports, __webpack_require__) { __webpack_require__( /*! ./core */ 176); var Globalize = __webpack_require__( /*! globalize */ 177), numberLocalization = __webpack_require__( /*! ../number */ 32), errors = __webpack_require__( /*! ../../core/errors */ 7); __webpack_require__( /*! globalize/number */ 177); if (Globalize && Globalize.formatNumber) { var enNumbers = { main: { en: { identity: { version: { _cldrVersion: "28", _number: "$Revision: 11972 $" }, language: "en" }, numbers: { defaultNumberingSystem: "latn", otherNumberingSystems: { "native": "latn" }, minimumGroupingDigits: "1", "symbols-numberSystem-latn": { decimal: ".", group: ",", list: ";", percentSign: "%", plusSign: "+", minusSign: "-", exponential: "E", superscriptingExponent: "×", perMille: "‰", infinity: "∞", nan: "NaN", timeSeparator: ":" }, "decimalFormats-numberSystem-latn": { standard: "#,##0.###", "long": { decimalFormat: { "1000-count-one": "0 thousand", "1000-count-other": "0 thousand", "10000-count-one": "00 thousand", "10000-count-other": "00 thousand", "100000-count-one": "000 thousand", "100000-count-other": "000 thousand", "1000000-count-one": "0 million", "1000000-count-other": "0 million", "10000000-count-one": "00 million", "10000000-count-other": "00 million", "100000000-count-one": "000 million", "100000000-count-other": "000 million", "1000000000-count-one": "0 billion", "1000000000-count-other": "0 billion", "10000000000-count-one": "00 billion", "10000000000-count-other": "00 billion", "100000000000-count-one": "000 billion", "100000000000-count-other": "000 billion", "1000000000000-count-one": "0 trillion", "1000000000000-count-other": "0 trillion", "10000000000000-count-one": "00 trillion", "10000000000000-count-other": "00 trillion", "100000000000000-count-one": "000 trillion", "100000000000000-count-other": "000 trillion" } }, "short": { decimalFormat: { "1000-count-one": "0K", "1000-count-other": "0K", "10000-count-one": "00K", "10000-count-other": "00K", "100000-count-one": "000K", "100000-count-other": "000K", "1000000-count-one": "0M", "1000000-count-other": "0M", "10000000-count-one": "00M", "10000000-count-other": "00M", "100000000-count-one": "000M", "100000000-count-other": "000M", "1000000000-count-one": "0B", "1000000000-count-other": "0B", "10000000000-count-one": "00B", "10000000000-count-other": "00B", "100000000000-count-one": "000B", "100000000000-count-other": "000B", "1000000000000-count-one": "0T", "1000000000000-count-other": "0T", "10000000000000-count-one": "00T", "10000000000000-count-other": "00T", "100000000000000-count-one": "000T", "100000000000000-count-other": "000T" } } }, "scientificFormats-numberSystem-latn": { standard: "#E0" }, "percentFormats-numberSystem-latn": { standard: "#,##0%" }, "currencyFormats-numberSystem-latn": { currencySpacing: { beforeCurrency: { currencyMatch: "[:^S:]", surroundingMatch: "[:digit:]", insertBetween: " " }, afterCurrency: { currencyMatch: "[:^S:]", surroundingMatch: "[:digit:]", insertBetween: " " } }, standard: "¤#,##0.00", accounting: "¤#,##0.00;(¤#,##0.00)", "short": { standard: { "1000-count-one": "¤0K", "1000-count-other": "¤0K", "10000-count-one": "¤00K", "10000-count-other": "¤00K", "100000-count-one": "¤000K", "100000-count-other": "¤000K", "1000000-count-one": "¤0M", "1000000-count-other": "¤0M", "10000000-count-one": "¤00M", "10000000-count-other": "¤00M", "100000000-count-one": "¤000M", "100000000-count-other": "¤000M", "1000000000-count-one": "¤0B", "1000000000-count-other": "¤0B", "10000000000-count-one": "¤00B", "10000000000-count-other": "¤00B", "100000000000-count-one": "¤000B", "100000000000-count-other": "¤000B", "1000000000000-count-one": "¤0T", "1000000000000-count-other": "¤0T", "10000000000000-count-one": "¤00T", "10000000000000-count-other": "¤00T", "100000000000000-count-one": "¤000T", "100000000000000-count-other": "¤000T" } }, "unitPattern-count-one": "{0} {1}", "unitPattern-count-other": "{0} {1}" }, "miscPatterns-numberSystem-latn": { atLeast: "{0}+", range: "{0}–{1}" } } } } }; if ("en" === Globalize.locale().locale) { Globalize.load(enNumbers); Globalize.locale("en") } var formattersCache = {}; var getFormatter = function(format) { var formatter, formatCacheKey; if ("object" === typeof format) { formatCacheKey = Globalize.locale().locale + ":" + JSON.stringify(format) } else { formatCacheKey = Globalize.locale().locale + ":" + format } formatter = formattersCache[formatCacheKey]; if (!formatter) { formatter = formattersCache[formatCacheKey] = Globalize.numberFormatter(format) } return formatter }; var globalizeNumberLocalization = { _formatNumberCore: function(value, format, formatConfig) { if ("exponential" === format) { return this.callBase.apply(this, arguments) } return getFormatter(this._normalizeFormatConfig(format, formatConfig, value))(value) }, _normalizeFormatConfig: function(format, formatConfig, value) { var config; if ("decimal" === format) { config = { minimumIntegerDigits: formatConfig.precision || 1, useGrouping: false, maximumFractionDigits: 0, round: value < 0 ? "ceil" : "floor" } } else { config = this._getPrecisionConfig(formatConfig.precision) } if ("percent" === format) { config.style = "percent" } return config }, _getPrecisionConfig: function(precision) { var config; if (null === precision) { config = { minimumFractionDigits: 0, maximumFractionDigits: 20 } } else { config = { minimumFractionDigits: precision || 0, maximumFractionDigits: precision || 0 } } return config }, format: function(value, format) { if ("number" !== typeof value) { return value } format = this._normalizeFormat(format); if (!format || "function" !== typeof format && !format.type && !format.formatter) { return getFormatter(format)(value) } return this.callBase.apply(this, arguments) }, parse: function(text, format) { if (!text) { return } if (format && format.parser) { return format.parser(text) } if (format) { errors.log("W0011") } return Globalize.parseNumber(text) } }; numberLocalization.inject(globalizeNumberLocalization) } }, /*!*******************************************!*\ !*** ./js/localization/globalize/date.js ***! \*******************************************/ function(module, exports, __webpack_require__) { __webpack_require__( /*! ./core */ 176); __webpack_require__( /*! ./number */ 179); __webpack_require__( /*! globalize/date */ 177); var timeData = { supplemental: { version: { _cldrVersion: "28", _unicodeVersion: "8.0.0", _number: "$Revision: 11969 $" }, timeData: { "001": { _allowed: "H h", _preferred: "H" }, DE: { _allowed: "H", _preferred: "H" }, JP: { _allowed: "H K h", _preferred: "H" }, RU: { _allowed: "H", _preferred: "H" }, US: { _allowed: "H h", _preferred: "h" } } } }; var enCaGregorian = { main: { en: { identity: { version: { _cldrVersion: "28", _number: "$Revision: 11972 $" }, language: "en" }, dates: { calendars: { gregorian: { months: { format: { abbreviated: { 1: "Jan", 2: "Feb", 3: "Mar", 4: "Apr", 5: "May", 6: "Jun", 7: "Jul", 8: "Aug", 9: "Sep", 10: "Oct", 11: "Nov", 12: "Dec" }, narrow: { 1: "J", 2: "F", 3: "M", 4: "A", 5: "M", 6: "J", 7: "J", 8: "A", 9: "S", 10: "O", 11: "N", 12: "D" }, wide: { 1: "January", 2: "February", 3: "March", 4: "April", 5: "May", 6: "June", 7: "July", 8: "August", 9: "September", 10: "October", 11: "November", 12: "December" } }, "stand-alone": { abbreviated: { 1: "Jan", 2: "Feb", 3: "Mar", 4: "Apr", 5: "May", 6: "Jun", 7: "Jul", 8: "Aug", 9: "Sep", 10: "Oct", 11: "Nov", 12: "Dec" }, narrow: { 1: "J", 2: "F", 3: "M", 4: "A", 5: "M", 6: "J", 7: "J", 8: "A", 9: "S", 10: "O", 11: "N", 12: "D" }, wide: { 1: "January", 2: "February", 3: "March", 4: "April", 5: "May", 6: "June", 7: "July", 8: "August", 9: "September", 10: "October", 11: "November", 12: "December" } } }, days: { format: { abbreviated: { sun: "Sun", mon: "Mon", tue: "Tue", wed: "Wed", thu: "Thu", fri: "Fri", sat: "Sat" }, narrow: { sun: "S", mon: "M", tue: "T", wed: "W", thu: "T", fri: "F", sat: "S" }, "short": { sun: "Su", mon: "Mo", tue: "Tu", wed: "We", thu: "Th", fri: "Fr", sat: "Sa" }, wide: { sun: "Sunday", mon: "Monday", tue: "Tuesday", wed: "Wednesday", thu: "Thursday", fri: "Friday", sat: "Saturday" } }, "stand-alone": { abbreviated: { sun: "Sun", mon: "Mon", tue: "Tue", wed: "Wed", thu: "Thu", fri: "Fri", sat: "Sat" }, narrow: { sun: "S", mon: "M", tue: "T", wed: "W", thu: "T", fri: "F", sat: "S" }, "short": { sun: "Su", mon: "Mo", tue: "Tu", wed: "We", thu: "Th", fri: "Fr", sat: "Sa" }, wide: { sun: "Sunday", mon: "Monday", tue: "Tuesday", wed: "Wednesday", thu: "Thursday", fri: "Friday", sat: "Saturday" } } }, quarters: { format: { abbreviated: { 1: "Q1", 2: "Q2", 3: "Q3", 4: "Q4" }, narrow: { 1: "1", 2: "2", 3: "3", 4: "4" }, wide: { 1: "1st quarter", 2: "2nd quarter", 3: "3rd quarter", 4: "4th quarter" } }, "stand-alone": { abbreviated: { 1: "Q1", 2: "Q2", 3: "Q3", 4: "Q4" }, narrow: { 1: "1", 2: "2", 3: "3", 4: "4" }, wide: { 1: "1st quarter", 2: "2nd quarter", 3: "3rd quarter", 4: "4th quarter" } } }, dayPeriods: { format: { abbreviated: { midnight: "midnight", am: "AM", "am-alt-variant": "am", noon: "noon", pm: "PM", "pm-alt-variant": "pm", morning1: "in the morning", afternoon1: "in the afternoon", evening1: "in the evening", night1: "at night" }, narrow: { midnight: "mi", am: "a", "am-alt-variant": "am", noon: "n", pm: "p", "pm-alt-variant": "pm", morning1: "in the morning", afternoon1: "in the afternoon", evening1: "in the evening", night1: "at night" }, wide: { midnight: "midnight", am: "AM", "am-alt-variant": "am", noon: "noon", pm: "PM", "pm-alt-variant": "pm", morning1: "in the morning", afternoon1: "in the afternoon", evening1: "in the evening", night1: "at night" } }, "stand-alone": { abbreviated: { midnight: "midnight", am: "AM", "am-alt-variant": "am", noon: "noon", pm: "PM", "pm-alt-variant": "pm", morning1: "in the morning", afternoon1: "in the afternoon", evening1: "in the evening", night1: "at night" }, narrow: { midnight: "midnight", am: "AM", "am-alt-variant": "am", noon: "noon", pm: "PM", "pm-alt-variant": "pm", morning1: "in the morning", afternoon1: "in the afternoon", evening1: "in the evening", night1: "at night" }, wide: { midnight: "midnight", am: "AM", "am-alt-variant": "am", noon: "noon", pm: "PM", "pm-alt-variant": "pm", morning1: "morning", afternoon1: "afternoon", evening1: "evening", night1: "night" } } }, eras: { eraNames: { 0: "Before Christ", "0-alt-variant": "Before Common Era", 1: "Anno Domini", "1-alt-variant": "Common Era" }, eraAbbr: { 0: "BC", "0-alt-variant": "BCE", 1: "AD", "1-alt-variant": "CE" }, eraNarrow: { 0: "B", "0-alt-variant": "BCE", 1: "A", "1-alt-variant": "CE" } }, dateFormats: { full: "EEEE, MMMM d, y", "long": "MMMM d, y", medium: "MMM d, y", "short": "M/d/yy" }, timeFormats: { full: "h:mm:ss a zzzz", "long": "h:mm:ss a z", medium: "h:mm:ss a", "short": "h:mm a" }, dateTimeFormats: { full: "{1} 'at' {0}", "long": "{1} 'at' {0}", medium: "{1}, {0}", "short": "{1}, {0}", availableFormats: { d: "d", E: "ccc", Ed: "d E", Ehm: "E h:mm a", EHm: "E HH:mm", Ehms: "E h:mm:ss a", EHms: "E HH:mm:ss", Gy: "y G", GyMMM: "MMM y G", GyMMMd: "MMM d, y G", GyMMMEd: "E, MMM d, y G", h: "h a", H: "HH", hm: "h:mm a", Hm: "HH:mm", hms: "h:mm:ss a", Hms: "HH:mm:ss", hmsv: "h:mm:ss a v", Hmsv: "HH:mm:ss v", hmv: "h:mm a v", Hmv: "HH:mm v", M: "L", Md: "M/d", MEd: "E, M/d", MMM: "LLL", MMMd: "MMM d", MMMEd: "E, MMM d", MMMMd: "MMMM d", ms: "mm:ss", y: "y", yM: "M/y", yMd: "M/d/y", yMEd: "E, M/d/y", yMMM: "MMM y", yMMMd: "MMM d, y", yMMMEd: "E, MMM d, y", yMMMM: "MMMM y", yQQQ: "QQQ y", yQQQQ: "QQQQ y" }, appendItems: { Day: "{0} ({2}: {1})", "Day-Of-Week": "{0} {1}", Era: "{0} {1}", Hour: "{0} ({2}: {1})", Minute: "{0} ({2}: {1})", Month: "{0} ({2}: {1})", Quarter: "{0} ({2}: {1})", Second: "{0} ({2}: {1})", Timezone: "{0} {1}", Week: "{0} ({2}: {1})", Year: "{0} {1}" }, intervalFormats: { intervalFormatFallback: "{0} – {1}", d: { d: "d – d" }, h: { a: "h a – h a", h: "h – h a" }, H: { H: "HH – HH" }, hm: { a: "h:mm a – h:mm a", h: "h:mm – h:mm a", m: "h:mm – h:mm a" }, Hm: { H: "HH:mm – HH:mm", m: "HH:mm – HH:mm" }, hmv: { a: "h:mm a – h:mm a v", h: "h:mm – h:mm a v", m: "h:mm – h:mm a v" }, Hmv: { H: "HH:mm – HH:mm v", m: "HH:mm – HH:mm v" }, hv: { a: "h a – h a v", h: "h – h a v" }, Hv: { H: "HH – HH v" }, M: { M: "M – M" }, Md: { d: "M/d – M/d", M: "M/d – M/d" }, MEd: { d: "E, M/d – E, M/d", M: "E, M/d – E, M/d" }, MMM: { M: "MMM – MMM" }, MMMd: { d: "MMM d – d", M: "MMM d – MMM d" }, MMMEd: { d: "E, MMM d – E, MMM d", M: "E, MMM d – E, MMM d" }, y: { y: "y – y" }, yM: { M: "M/y – M/y", y: "M/y – M/y" }, yMd: { d: "M/d/y – M/d/y", M: "M/d/y – M/d/y", y: "M/d/y – M/d/y" }, yMEd: { d: "E, M/d/y – E, M/d/y", M: "E, M/d/y – E, M/d/y", y: "E, M/d/y – E, M/d/y" }, yMMM: { M: "MMM – MMM y", y: "MMM y – MMM y" }, yMMMd: { d: "MMM d – d, y", M: "MMM d – MMM d, y", y: "MMM d, y – MMM d, y" }, yMMMEd: { d: "E, MMM d – E, MMM d, y", M: "E, MMM d – E, MMM d, y", y: "E, MMM d, y – E, MMM d, y" }, yMMMM: { M: "MMMM – MMMM y", y: "MMMM y – MMMM y" } } } } } } } } }; var weekData = { supplemental: { version: { _cldrVersion: "28", _unicodeVersion: "8.0.0", _number: "$Revision: 11969 $" }, weekData: { minDays: { "001": "1", US: "1", DE: "4" }, firstDay: { "001": "mon", DE: "mon", RU: "mon", JP: "sun", US: "sun" }, weekendStart: { "001": "sat" }, weekendEnd: { "001": "sun" } } } }; var ACCEPTABLE_JSON_FORMAT_PROPERTIES = ["skeleton", "date", "time", "datetime", "raw"]; var $ = __webpack_require__( /*! ../../core/renderer */ 9), Globalize = __webpack_require__( /*! globalize */ 177), dateLocalization = __webpack_require__( /*! ../date */ 33), isObject = __webpack_require__( /*! ../../core/utils/common */ 14).isObject, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, errors = __webpack_require__( /*! ../../core/errors */ 7); if (Globalize && Globalize.formatDate) { if ("en" === Globalize.locale().locale) { Globalize.load(weekData, timeData, enCaGregorian); Globalize.locale("en") } var formattersCache = {}; var FORMATS_TO_GLOBALIZE_MAP = { shortdate: { path: "dateTimeFormats/availableFormats/yMd" }, shorttime: { path: "timeFormats/short" }, longdate: { path: "dateFormats/full" }, longtime: { path: "timeFormats/medium" }, monthandday: { path: "dateTimeFormats/availableFormats/MMMMd" }, monthandyear: { path: "dateTimeFormats/availableFormats/yMMMM" }, quarterandyear: { path: "dateTimeFormats/availableFormats/yQQQ" }, day: { path: "dateTimeFormats/availableFormats/d" }, year: { path: "dateTimeFormats/availableFormats/y" }, shortdateshorttime: { path: "dateTimeFormats/short", parts: ["shorttime", "shortdate"] }, mediumdatemediumtime: { path: "dateTimeFormats/medium", parts: ["shorttime", "monthandday"] }, longdatelongtime: { path: "dateTimeFormats/medium", parts: ["longtime", "longdate"] }, month: { pattern: "LLLL" }, shortyear: { pattern: "yy" }, dayofweek: { pattern: "EEEE" }, quarter: { pattern: "QQQ" }, millisecond: { pattern: "SSS" }, hour: { pattern: "HH" }, minute: { pattern: "mm" }, second: { pattern: "ss" } }; var globalizeDateLocalization = { _getPatternByFormat: function(format) { var that = this, lowerFormat = format.toLowerCase(), globalizeFormat = FORMATS_TO_GLOBALIZE_MAP[lowerFormat]; if ("datetime-local" === lowerFormat) { return "yyyy-MM-ddTHH':'mm':'ss" } if (!globalizeFormat) { return } var result = globalizeFormat.path && that._getFormatStringByPath(globalizeFormat.path) || globalizeFormat.pattern; if (globalizeFormat.parts) { $.each(globalizeFormat.parts, function(index, part) { result = result.replace("{" + index + "}", that._getPatternByFormat(part)) }) } return result }, _getFormatStringByPath: function(path) { return Globalize.locale().main("dates/calendars/gregorian/" + path) }, getMonthNames: function(format) { var months = Globalize.locale().main("dates/calendars/gregorian/months/stand-alone/" + (format || "wide")); return $.map(months, function(month) { return month }) }, getDayNames: function(format) { var days = Globalize.locale().main("dates/calendars/gregorian/days/stand-alone/" + (format || "wide")); return $.map(days, function(day) { return day }) }, getTimeSeparator: function() { return Globalize.locale().main("numbers/symbols-numberSystem-latn/timeSeparator") }, format: function(date, format) { if (!date) { return } if (!format) { return date } var formatter, formatCacheKey; if ("function" === typeof format) { return format(date) } if (format.formatter) { return format.formatter(date) } format = format.type || format; if ("string" === typeof format) { formatCacheKey = Globalize.locale().locale + ":" + format; formatter = formattersCache[formatCacheKey]; if (!formatter) { format = { raw: this._getPatternByFormat(format) || format }; formatter = formattersCache[formatCacheKey] = Globalize.dateFormatter(format) } } else { formatter = Globalize.dateFormatter(format) } return formatter(date) }, parse: function(text, format) { if (!text) { return } if (!format || "function" === typeof format || isObject(format) && !this._isAcceptableFormat(format)) { if (format) { errors.log("W0012") } return Globalize.parseDate(text) } if (format.parser) { return format.parser(text) } if ("string" === typeof format) { format = { raw: this._getPatternByFormat(format) || format } } return Globalize.parseDate(text, format) }, _isAcceptableFormat: function(format) { if (format.parser) { return true } for (var i = 0; i < ACCEPTABLE_JSON_FORMAT_PROPERTIES.length; i++) { if (format.hasOwnProperty(ACCEPTABLE_JSON_FORMAT_PROPERTIES[i])) { return true } } }, firstDayOfWeekIndex: function() { var firstDay = Globalize.locale().supplemental.weekData.firstDay(); return inArray(firstDay, this._getDayKeys()) }, _getDayKeys: function() { var days = Globalize.locale().main("dates/calendars/gregorian/days/format/short"); return $.map(days, function(day, key) { return key }) } }; dateLocalization.inject(globalizeDateLocalization) } }, /*!***********************************************!*\ !*** ./js/localization/globalize/currency.js ***! \***********************************************/ function(module, exports, __webpack_require__) { __webpack_require__( /*! ./core */ 176); __webpack_require__( /*! ./number */ 179); __webpack_require__( /*! ../currency */ 36); __webpack_require__( /*! globalize/currency */ 177); var enCurrencyUSD = { main: { en: { identity: { version: { _cldrVersion: "28", _number: "$Revision: 11972 $" }, language: "en" }, numbers: { currencies: { USD: { displayName: "US Dollar", "displayName-count-one": "US dollar", "displayName-count-other": "US dollars", symbol: "$", "symbol-alt-narrow": "$" } } } } } }; var currencyData = { supplemental: { version: { _cldrVersion: "28", _unicodeVersion: "8.0.0", _number: "$Revision: 11969 $" }, currencyData: { fractions: { DEFAULT: { _rounding: "0", _digits: "2" } } } } }; var Globalize = __webpack_require__( /*! globalize */ 177), config = __webpack_require__( /*! ../../core/config */ 15), numberLocalization = __webpack_require__( /*! ../number */ 32); if (Globalize && Globalize.formatCurrency) { if ("en" === Globalize.locale().locale) { Globalize.load(enCurrencyUSD, currencyData); Globalize.locale("en") } var formattersCache = {}; var getFormatter = function(currency, format) { var formatter, formatCacheKey; if ("object" === typeof format) { formatCacheKey = Globalize.locale().locale + ":" + currency + ":" + JSON.stringify(format) } else { formatCacheKey = Globalize.locale().locale + ":" + currency + ":" + format } formatter = formattersCache[formatCacheKey]; if (!formatter) { formatter = formattersCache[formatCacheKey] = Globalize.currencyFormatter(currency, format) } return formatter }; var globalizeCurrencyLocalization = { _formatNumberCore: function(value, format, formatConfig) { if ("currency" === format) { var currency = formatConfig && formatConfig.currency || config().defaultCurrency; return getFormatter(currency, this._normalizeFormatConfig(format, formatConfig, value))(value) } return this.callBase.apply(this, arguments) }, _normalizeFormatConfig: function(format, formatConfig, value) { var config = this.callBase(format, formatConfig, value); if ("currency" === format) { config.style = "accounting" } return config }, format: function(value, format) { if ("number" !== typeof value) { return value } format = this._normalizeFormat(format); if (format) { if ("default" === format.currency) { format.currency = config().defaultCurrency } if ("currency" === format.type) { return this._formatNumber(value, this._parseNumberFormatString("currency"), format) } else { if (!format.type && format.currency) { return getFormatter(format.currency, format)(value) } } } return this.callBase.apply(this, arguments) }, getCurrencySymbol: function(currency) { if (!currency) { currency = config().defaultCurrency } return Globalize.cldr.main("numbers/currencies/" + currency) }, getOpenXmlCurrencyFormat: function(currency) { var i, result, symbol, encodeSymbols, currencySymbol = this.getCurrencySymbol(currency).symbol, currencyFormat = Globalize.cldr.main("numbers/currencyFormats-numberSystem-latn"); if (currencyFormat.accounting) { encodeSymbols = { ".00": "{0}", "'": "\\'", "\\(": "\\(", "\\)": "\\)", " ": "\\ ", '"': """, "\\¤": currencySymbol }; result = currencyFormat.accounting.split(";"); for (i = 0; i < result.length; i++) { for (symbol in encodeSymbols) { if (encodeSymbols.hasOwnProperty(symbol)) { result[i] = result[i].replace(new RegExp(symbol, "g"), encodeSymbols[symbol]) } } } return 2 === result.length ? result[0] + "_);" + result[1] : result[0] } } }; numberLocalization.inject(globalizeCurrencyLocalization) } }, /*!***********************************!*\ !*** ./js/events/double_click.js ***! \***********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), domUtils = __webpack_require__( /*! ../core/utils/dom */ 56), Class = __webpack_require__( /*! ../core/class */ 25), registerEvent = __webpack_require__( /*! ./core/event_registrator */ 73), clickEvent = __webpack_require__( /*! ./click */ 75), eventUtils = __webpack_require__( /*! ./utils */ 71); var DBLCLICK_EVENT_NAME = "dxdblclick", DBLCLICK_NAMESPACE = "dxDblClick", NAMESPACED_CLICK_EVENT = eventUtils.addNamespace(clickEvent.name, DBLCLICK_NAMESPACE), DBLCLICK_TIMEOUT = 300; var DblClick = Class.inherit({ ctor: function() { this._handlerCount = 0; this._forgetLastClick() }, _forgetLastClick: function() { this._firstClickTarget = null; this._lastClickTimeStamp = -DBLCLICK_TIMEOUT }, add: function() { if (this._handlerCount <= 0) { $(document).on(NAMESPACED_CLICK_EVENT, this._clickHandler.bind(this)) } this._handlerCount++ }, _clickHandler: function(e) { var timeStamp = e.timeStamp || $.now(); if (timeStamp - this._lastClickTimeStamp < DBLCLICK_TIMEOUT) { eventUtils.fireEvent({ type: DBLCLICK_EVENT_NAME, target: domUtils.closestCommonParent(this._firstClickTarget, e.target), originalEvent: e }); this._forgetLastClick() } else { this._firstClickTarget = e.target; this._lastClickTimeStamp = timeStamp } }, remove: function() { this._handlerCount--; if (this._handlerCount <= 0) { this._forgetLastClick(); $(document).off(NAMESPACED_CLICK_EVENT) } } }); registerEvent(DBLCLICK_EVENT_NAME, new DblClick); exports.name = DBLCLICK_EVENT_NAME }, /*!****************************!*\ !*** ./js/events/swipe.js ***! \****************************/ function(module, exports, __webpack_require__) { var eventUtils = __webpack_require__( /*! ./utils */ 71), GestureEmitter = __webpack_require__( /*! ./gesture/emitter.gesture */ 86), registerEmitter = __webpack_require__( /*! ./core/emitter_registrator */ 84); var SWIPE_START_EVENT = "dxswipestart", SWIPE_EVENT = "dxswipe", SWIPE_END_EVENT = "dxswipeend"; var HorizontalStrategy = { defaultItemSizeFunc: function() { return this.getElement().width() }, getBounds: function() { return [this._maxLeftOffset, this._maxRightOffset] }, calcOffsetRatio: function(e) { var endEventData = eventUtils.eventData(e); return (endEventData.x - (this._savedEventData && this._savedEventData.x || 0)) / this._itemSizeFunc().call(this, e) }, isFastSwipe: function(e) { var endEventData = eventUtils.eventData(e); return this.FAST_SWIPE_SPEED_LIMIT * Math.abs(endEventData.x - this._tickData.x) >= endEventData.time - this._tickData.time } }; var VerticalStrategy = { defaultItemSizeFunc: function() { return this.getElement().height() }, getBounds: function() { return [this._maxTopOffset, this._maxBottomOffset] }, calcOffsetRatio: function(e) { var endEventData = eventUtils.eventData(e); return (endEventData.y - (this._savedEventData && this._savedEventData.y || 0)) / this._itemSizeFunc().call(this, e) }, isFastSwipe: function(e) { var endEventData = eventUtils.eventData(e); return this.FAST_SWIPE_SPEED_LIMIT * Math.abs(endEventData.y - this._tickData.y) >= endEventData.time - this._tickData.time } }; var STRATEGIES = { horizontal: HorizontalStrategy, vertical: VerticalStrategy }; var SwipeEmitter = GestureEmitter.inherit({ TICK_INTERVAL: 300, FAST_SWIPE_SPEED_LIMIT: 10, ctor: function(element) { this.callBase(element); this.direction = "horizontal"; this.elastic = true }, _getStrategy: function() { return STRATEGIES[this.direction] }, _defaultItemSizeFunc: function() { return this._getStrategy().defaultItemSizeFunc.call(this) }, _itemSizeFunc: function() { return this.itemSizeFunc || this._defaultItemSizeFunc }, _init: function(e) { this._tickData = eventUtils.eventData(e) }, _start: function(e) { this._savedEventData = eventUtils.eventData(e); e = this._fireEvent(SWIPE_START_EVENT, e); if (!e.cancel) { this._maxLeftOffset = e.maxLeftOffset; this._maxRightOffset = e.maxRightOffset; this._maxTopOffset = e.maxTopOffset; this._maxBottomOffset = e.maxBottomOffset } }, _move: function(e) { var strategy = this._getStrategy(), moveEventData = eventUtils.eventData(e), offset = strategy.calcOffsetRatio.call(this, e); offset = this._fitOffset(offset, this.elastic); if (moveEventData.time - this._tickData.time > this.TICK_INTERVAL) { this._tickData = moveEventData } this._fireEvent(SWIPE_EVENT, e, { offset: offset }); e.preventDefault() }, _end: function(e) { var strategy = this._getStrategy(), offsetRatio = strategy.calcOffsetRatio.call(this, e), isFast = strategy.isFastSwipe.call(this, e), startOffset = offsetRatio, targetOffset = this._calcTargetOffset(offsetRatio, isFast); startOffset = this._fitOffset(startOffset, this.elastic); targetOffset = this._fitOffset(targetOffset, false); this._fireEvent(SWIPE_END_EVENT, e, { offset: startOffset, targetOffset: targetOffset }) }, _fitOffset: function(offset, elastic) { var strategy = this._getStrategy(), bounds = strategy.getBounds.call(this); if (offset < -bounds[0]) { return elastic ? (-2 * bounds[0] + offset) / 3 : -bounds[0] } if (offset > bounds[1]) { return elastic ? (2 * bounds[1] + offset) / 3 : bounds[1] } return offset }, _calcTargetOffset: function(offsetRatio, isFast) { var result; if (isFast) { result = Math.ceil(Math.abs(offsetRatio)); if (offsetRatio < 0) { result = -result } } else { result = Math.round(offsetRatio) } return result } }); registerEmitter({ emitter: SwipeEmitter, events: [SWIPE_START_EVENT, SWIPE_EVENT, SWIPE_END_EVENT] }); exports.swipe = SWIPE_EVENT; exports.start = SWIPE_START_EVENT; exports.end = SWIPE_END_EVENT }, /*!********************************!*\ !*** ./js/events/transform.js ***! \********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), mathUtils = __webpack_require__( /*! ../core/utils/math */ 87), errors = __webpack_require__( /*! ../core/errors */ 7), eventUtils = __webpack_require__( /*! ./utils */ 71), Emitter = __webpack_require__( /*! ./core/emitter */ 83), registerEmitter = __webpack_require__( /*! ./core/emitter_registrator */ 84); var DX_PREFIX = "dx", TRANSFORM = "transform", TRANSLATE = "translate", ZOOM = "zoom", PINCH = "pinch", ROTATE = "rotate", START_POSTFIX = "start", UPDATE_POSTFIX = "", END_POSTFIX = "end"; var eventAliases = []; var addAlias = function(eventName, eventArgs) { eventAliases.push({ name: eventName, args: eventArgs }) }; addAlias(TRANSFORM, { scale: true, deltaScale: true, rotation: true, deltaRotation: true, translation: true, deltaTranslation: true }); addAlias(TRANSLATE, { translation: true, deltaTranslation: true }); addAlias(ZOOM, { scale: true, deltaScale: true }); addAlias(PINCH, { scale: true, deltaScale: true }); addAlias(ROTATE, { rotation: true, deltaRotation: true }); var getVector = function(first, second) { return { x: second.pageX - first.pageX, y: -second.pageY + first.pageY, centerX: .5 * (second.pageX + first.pageX), centerY: .5 * (second.pageY + first.pageY) } }; var getEventVector = function(e) { var pointers = e.pointers; return getVector(pointers[0], pointers[1]) }; var getDistance = function(vector) { return Math.sqrt(vector.x * vector.x + vector.y * vector.y) }; var getScale = function(firstVector, secondVector) { return getDistance(firstVector) / getDistance(secondVector) }; var getRotation = function(firstVector, secondVector) { var scalarProduct = firstVector.x * secondVector.x + firstVector.y * secondVector.y; var distanceProduct = getDistance(firstVector) * getDistance(secondVector); if (0 === distanceProduct) { return 0 } var sign = mathUtils.sign(firstVector.x * secondVector.y - secondVector.x * firstVector.y); var angle = Math.acos(mathUtils.fitIntoRange(scalarProduct / distanceProduct, -1, 1)); return sign * angle }; var getTranslation = function(firstVector, secondVector) { return { x: firstVector.centerX - secondVector.centerX, y: firstVector.centerY - secondVector.centerY } }; var TransformEmitter = Emitter.inherit({ configure: function(data, eventName) { if (eventName.indexOf(ZOOM) > -1) { errors.log("W0005", eventName, "15.1", "Use '" + eventName.replace(ZOOM, PINCH) + "' event instead") } this.callBase(data) }, validatePointers: function(e) { return eventUtils.hasTouches(e) > 1 }, start: function(e) { this._accept(e); var startVector = getEventVector(e); this._startVector = startVector; this._prevVector = startVector; this._fireEventAliases(START_POSTFIX, e) }, move: function(e) { var currentVector = getEventVector(e), eventArgs = this._getEventArgs(currentVector); this._fireEventAliases(UPDATE_POSTFIX, e, eventArgs); this._prevVector = currentVector }, end: function(e) { var eventArgs = this._getEventArgs(this._prevVector); this._fireEventAliases(END_POSTFIX, e, eventArgs) }, _getEventArgs: function(vector) { return { scale: getScale(vector, this._startVector), deltaScale: getScale(vector, this._prevVector), rotation: getRotation(vector, this._startVector), deltaRotation: getRotation(vector, this._prevVector), translation: getTranslation(vector, this._startVector), deltaTranslation: getTranslation(vector, this._prevVector) } }, _fireEventAliases: function(eventPostfix, originalEvent, eventArgs) { eventArgs = eventArgs || {}; $.each(eventAliases, function(_, eventAlias) { var args = {}; $.each(eventAlias.args, function(name) { if (name in eventArgs) { args[name] = eventArgs[name] } }); this._fireEvent(DX_PREFIX + eventAlias.name + eventPostfix, originalEvent, args) }.bind(this)) } }); var eventNames = $.map(eventAliases, function(eventAlias) { var eventNames = []; $.each([START_POSTFIX, UPDATE_POSTFIX, END_POSTFIX], function(_, eventPostfix) { eventNames.push(DX_PREFIX + eventAlias.name + eventPostfix) }); return eventNames }); registerEmitter({ emitter: TransformEmitter, events: eventNames }); $.each(eventNames, function(_, eventName) { exports[eventName.substring(DX_PREFIX.length)] = eventName }) }, /*!******************************************!*\ !*** ./js/bundles/modules/parts/data.js ***! \******************************************/ function(module, exports, __webpack_require__) { var DevExpress = __webpack_require__( /*! ./core */ 5); var data = DevExpress.data = __webpack_require__( /*! ../../../bundles/modules/data */ 186); data.odata = __webpack_require__( /*! ../../../bundles/modules/data.odata */ 191); module.exports = data }, /*!************************************!*\ !*** ./js/bundles/modules/data.js ***! \************************************/ function(module, exports, __webpack_require__) { var DevExpress = __webpack_require__( /*! ./core */ 6); module.exports = DevExpress.data = DevExpress.data || {}; Object.defineProperty(DevExpress.data, "errorHandler", { get: function() { /*! ../../data/errors */ return __webpack_require__(155).errorHandler }, set: function(value) { __webpack_require__( /*! ../../data/errors */ 155).errorHandler = value } }); Object.defineProperty(DevExpress.data, "_errorHandler", { get: function() { /*! ../../data/errors */ return __webpack_require__(155)._errorHandler }, set: function(value) { __webpack_require__( /*! ../../data/errors */ 155)._errorHandler = value } }); DevExpress.data.DataSource = __webpack_require__( /*! ../../data/data_source */ 187); DevExpress.data.query = __webpack_require__( /*! ../../data/query */ 159); DevExpress.data.Store = __webpack_require__( /*! ../../data/abstract_store */ 154); DevExpress.data.ArrayStore = __webpack_require__( /*! ../../data/array_store */ 158); DevExpress.data.CustomStore = __webpack_require__( /*! ../../data/custom_store */ 162); DevExpress.data.LocalStore = __webpack_require__( /*! ../../data/local_store */ 188); DevExpress.data.base64_encode = __webpack_require__( /*! ../../data/utils */ 137).base64_encode; DevExpress.data.Guid = __webpack_require__( /*! ../../core/guid */ 151); DevExpress.data.utils = {}; DevExpress.data.utils.compileGetter = __webpack_require__( /*! ../../core/utils/data */ 50).compileGetter; DevExpress.data.utils.compileSetter = __webpack_require__( /*! ../../core/utils/data */ 50).compileSetter; DevExpress.EndpointSelector = __webpack_require__( /*! ../../data/endpoint_selector */ 189); DevExpress.data.queryImpl = __webpack_require__( /*! ../../data/query */ 159).queryImpl; DevExpress.data.queryAdapters = __webpack_require__( /*! ../../data/query_adapters */ 161); var dataUtils = __webpack_require__( /*! ../../data/utils */ 137); DevExpress.data.utils.normalizeBinaryCriterion = dataUtils.normalizeBinaryCriterion; DevExpress.data.utils.normalizeSortingInfo = dataUtils.normalizeSortingInfo; DevExpress.data.utils.errorMessageFromXhr = dataUtils.errorMessageFromXhr; DevExpress.data.utils.aggregators = dataUtils.aggregators; DevExpress.data.utils.keysEqual = dataUtils.keysEqual; DevExpress.data.utils.isDisjunctiveOperator = dataUtils.isDisjunctiveOperator; DevExpress.data.utils.isConjunctiveOperator = dataUtils.isConjunctiveOperator; DevExpress.data.utils.processRequestResultLock = dataUtils.processRequestResultLock; DevExpress.data.utils.toComparable = __webpack_require__( /*! ../../core/utils/data */ 50).toComparable; DevExpress.data.utils.multiLevelGroup = __webpack_require__( /*! ../../data/store_helper */ 156).multiLevelGroup; DevExpress.data.utils.arrangeSortingInfo = __webpack_require__( /*! ../../data/store_helper */ 156).arrangeSortingInfo; DevExpress.data.utils.normalizeDataSourceOptions = __webpack_require__( /*! ../../data/data_source/data_source */ 153).normalizeDataSourceOptions }, /*!********************************!*\ !*** ./js/data/data_source.js ***! \********************************/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__( /*! ./data_source/data_source */ 153).DataSource }, /*!********************************!*\ !*** ./js/data/local_store.js ***! \********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), Class = __webpack_require__( /*! ../core/class */ 25), abstract = Class.abstract, errors = __webpack_require__( /*! ./errors */ 155).errors, ArrayStore = __webpack_require__( /*! ./array_store */ 158); var LocalStoreBackend = Class.inherit({ ctor: function(store, storeOptions) { this._store = store; this._dirty = !!storeOptions.data; this.save(); var immediate = this._immediate = storeOptions.immediate; var flushInterval = Math.max(100, storeOptions.flushInterval || 1e4); if (!immediate) { var saveProxy = this.save.bind(this); setInterval(saveProxy, flushInterval); $(window).on("beforeunload", saveProxy); if (window.cordova) { document.addEventListener("pause", saveProxy, false) } } }, notifyChanged: function() { this._dirty = true; if (this._immediate) { this.save() } }, load: function() { this._store._array = this._loadImpl(); this._dirty = false }, save: function() { if (!this._dirty) { return } this._saveImpl(this._store._array); this._dirty = false }, _loadImpl: abstract, _saveImpl: abstract }); var DomLocalStoreBackend = LocalStoreBackend.inherit({ ctor: function(store, storeOptions) { var name = storeOptions.name; if (!name) { throw errors.Error("E4013") } this._key = "dx-data-localStore-" + name; this.callBase(store, storeOptions) }, _loadImpl: function() { var raw = localStorage.getItem(this._key); if (raw) { return JSON.parse(raw) } return [] }, _saveImpl: function(array) { if (!array.length) { localStorage.removeItem(this._key) } else { localStorage.setItem(this._key, JSON.stringify(array)) } } }); var localStoreBackends = { dom: DomLocalStoreBackend }; var LocalStore = ArrayStore.inherit({ ctor: function(options) { if ("string" === typeof options) { options = { name: options } } else { options = options || {} } this.callBase(options); this._backend = new localStoreBackends[options.backend || "dom"](this, options); this._backend.load() }, clear: function() { this.callBase(); this._backend.notifyChanged() }, _insertImpl: function(values) { var b = this._backend; return this.callBase(values).done(b.notifyChanged.bind(b)) }, _updateImpl: function(key, values) { var b = this._backend; return this.callBase(key, values).done(b.notifyChanged.bind(b)) }, _removeImpl: function(key) { var b = this._backend; return this.callBase(key).done(b.notifyChanged.bind(b)) } }, "local"); module.exports = LocalStore }, /*!**************************************!*\ !*** ./js/data/endpoint_selector.js ***! \**************************************/ function(module, exports, __webpack_require__) { var errors = __webpack_require__( /*! ../core/errors */ 7), proxyUrlFormatter = __webpack_require__( /*! ./proxy_url_formatter */ 190); var location = window.location, IS_WINJS_ORIGIN = "ms-appx:" === location.protocol, IS_LOCAL_ORIGIN = isLocalHostName(location.hostname); function isLocalHostName(url) { return /^(localhost$|127\.)/i.test(url) } var EndpointSelector = function(config) { this.config = config }; EndpointSelector.prototype = { urlFor: function(key) { var bag = this.config[key]; if (!bag) { throw errors.Error("E0006") } if (proxyUrlFormatter.isProxyUsed()) { return proxyUrlFormatter.formatProxyUrl(bag.local) } if (bag.production) { if (IS_WINJS_ORIGIN && !Debug.debuggerEnabled || !IS_WINJS_ORIGIN && !IS_LOCAL_ORIGIN) { return bag.production } } return bag.local } }; module.exports = EndpointSelector }, /*!****************************************!*\ !*** ./js/data/proxy_url_formatter.js ***! \****************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), location = window.location, DXPROXY_HOST = "dxproxy.devexpress.com:8000", IS_DXPROXY_ORIGIN = location.host === DXPROXY_HOST, urlMapping = {}; var parseUrl = function() { var a = document.createElement("a"), props = ["protocol", "hostname", "port", "pathname", "search", "hash"]; var normalizePath = function(value) { if ("/" !== value.charAt(0)) { value = "/" + value } return value }; return function(url) { a.href = url; var result = {}; $.each(props, function() { result[this] = a[this] }); result.pathname = normalizePath(result.pathname); return result } }(); var extractProxyAppId = function() { return location.pathname.split("/")[1] }; module.exports = { parseUrl: parseUrl, isProxyUsed: function() { return IS_DXPROXY_ORIGIN }, formatProxyUrl: function(localUrl) { var urlData = parseUrl(localUrl); if (!/^(localhost$|127\.)/i.test(urlData.hostname)) { return localUrl } var proxyUrlPart = DXPROXY_HOST + "/" + extractProxyAppId() + "_" + urlData.port; urlMapping[proxyUrlPart] = urlData.hostname + ":" + urlData.port; var resultUrl = "http://" + proxyUrlPart + urlData.pathname + urlData.search; return resultUrl }, formatLocalUrl: function(proxyUrl) { if (proxyUrl.indexOf(DXPROXY_HOST) < 0) { return proxyUrl } var resultUrl = proxyUrl; for (var proxyUrlPart in urlMapping) { if (urlMapping.hasOwnProperty(proxyUrlPart)) { if (proxyUrl.indexOf(proxyUrlPart) >= 0) { resultUrl = proxyUrl.replace(proxyUrlPart, urlMapping[proxyUrlPart]); break } } } return resultUrl } } }, /*!******************************************!*\ !*** ./js/bundles/modules/data.odata.js ***! \******************************************/ function(module, exports, __webpack_require__) { __webpack_require__( /*! ./data */ 186); DevExpress.data.ODataStore = __webpack_require__( /*! ../../data/odata/store */ 192); DevExpress.data.ODataContext = __webpack_require__( /*! ../../data/odata/context */ 196); DevExpress.data.utils = DevExpress.data.utils || {}; DevExpress.data.utils.odata = {}; DevExpress.data.utils.odata.keyConverters = __webpack_require__( /*! ../../data/odata/utils */ 193).keyConverters; DevExpress.data.EdmLiteral = __webpack_require__( /*! ../../data/odata/utils */ 193).EdmLiteral; var ODataUtilsModule = __webpack_require__( /*! ../../data/odata/utils */ 193); DevExpress.data.utils.odata.serializePropName = ODataUtilsModule.serializePropName; DevExpress.data.utils.odata.serializeValue = ODataUtilsModule.serializeValue; DevExpress.data.utils.odata.serializeKey = ODataUtilsModule.serializeKey; DevExpress.data.utils.odata.sendRequest = ODataUtilsModule.sendRequest; DevExpress.data.OData__internals = ODataUtilsModule.OData__internals; DevExpress.data.queryAdapters = DevExpress.data.queryAdapters || {}; DevExpress.data.queryAdapters.odata = __webpack_require__( /*! ../../data/odata/query_adapter */ 195).odata }, /*!********************************!*\ !*** ./js/data/odata/store.js ***! \********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), odataUtils = __webpack_require__( /*! ./utils */ 193), proxyUrlFormatter = __webpack_require__( /*! ../proxy_url_formatter */ 190), errors = __webpack_require__( /*! ../errors */ 155).errors, query = __webpack_require__( /*! ../query */ 159), Store = __webpack_require__( /*! ../abstract_store */ 154), mixins = __webpack_require__( /*! ./mixins */ 194), when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when; __webpack_require__( /*! ./query_adapter */ 195); var ANONYMOUS_KEY_NAME = "5d46402c-7899-4ea9-bd81-8b73c47c7683"; function expandKeyType(key, keyType) { var result = {}; result[key] = keyType; return result } function mergeFieldTypesWithKeyType(fieldTypes, keyType) { var result = {}; for (var field in fieldTypes) { result[field] = fieldTypes[field] } for (var keyName in keyType) { if (keyName in result) { if (result[keyName] !== keyType[keyName]) { errors.log("W4001", keyName) } } else { result[keyName] = keyType[keyName] } } return result } var ODataStore = Store.inherit({ ctor: function(options) { this.callBase(options); this._extractServiceOptions(options); var key = this.key(), fieldTypes = options.fieldTypes, keyType = options.keyType; if (keyType) { var keyTypeIsString = "string" === typeof keyType; if (!key) { key = keyTypeIsString ? ANONYMOUS_KEY_NAME : Object.keys(keyType); this._legacyAnonymousKey = key } if (keyTypeIsString) { keyType = expandKeyType(key, keyType) } fieldTypes = mergeFieldTypesWithKeyType(fieldTypes, keyType) } this._fieldTypes = fieldTypes || {}; if (2 === this.version()) { this._updateMethod = "MERGE" } else { this._updateMethod = "PATCH" } }, _customLoadOptions: function() { return ["expand", "customQueryParams"] }, _byKeyImpl: function(key, extraOptions) { var params = {}; if (extraOptions) { if (extraOptions.expand) { params.$expand = $.map($.makeArray(extraOptions.expand), odataUtils.serializePropName).join() } } return this._sendRequest(this._byKeyUrl(key), "GET", params) }, createQuery: function(loadOptions) { var url, queryOptions; loadOptions = loadOptions || {}; queryOptions = { adapter: "odata", beforeSend: this._beforeSend, errorHandler: this._errorHandler, jsonp: this._jsonp, version: this._version, withCredentials: this._withCredentials, expand: loadOptions.expand, requireTotalCount: loadOptions.requireTotalCount, deserializeDates: this._deserializeDates, fieldTypes: this._fieldTypes }; if (commonUtils.isDefined(loadOptions.urlOverride)) { url = loadOptions.urlOverride } else { url = this._url } if (loadOptions.customQueryParams) { var params = mixins.escapeServiceOperationParams(loadOptions.customQueryParams, this.version()); if (4 === this.version()) { url = mixins.formatFunctionInvocationUrl(url, params) } else { queryOptions.params = params } } return query(url, queryOptions) }, _insertImpl: function(values) { this._requireKey(); var that = this, d = $.Deferred(); when(this._sendRequest(this._url, "POST", null, values)).done(function(serverResponse) { d.resolve(values, that.keyOf(serverResponse)) }).fail(d.reject); return d.promise() }, _updateImpl: function(key, values) { var d = $.Deferred(); when(this._sendRequest(this._byKeyUrl(key), this._updateMethod, null, values)).done(function() { d.resolve(key, values) }).fail(d.reject); return d.promise() }, _removeImpl: function(key) { var d = $.Deferred(); when(this._sendRequest(this._byKeyUrl(key), "DELETE")).done(function() { d.resolve(key) }).fail(d.reject); return d.promise() }, _convertKey: function(value) { var result = value, fieldTypes = this._fieldTypes, key = this.key() || this._legacyAnonymousKey; if (Array.isArray(key)) { result = {}; for (var keyIndex in key) { var keyName = key[keyIndex]; result[keyName] = odataUtils.convertPrimitiveValue(fieldTypes[keyName], value[keyName]) } } else { if (fieldTypes[key]) { result = odataUtils.convertPrimitiveValue(fieldTypes[key], value) } } return result }, _byKeyUrl: function(value, useOriginalHost) { var baseUrl = useOriginalHost ? proxyUrlFormatter.formatLocalUrl(this._url) : this._url; var convertedKey = this._convertKey(value); return baseUrl + "(" + encodeURIComponent(odataUtils.serializeKey(convertedKey, this._version)) + ")" } }, "odata").include(mixins.SharedMethods); module.exports = ODataStore }, /*!********************************!*\ !*** ./js/data/odata/utils.js ***! \********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), typeUtils = __webpack_require__( /*! ../../core/utils/type */ 12), Guid = __webpack_require__( /*! ../../core/guid */ 151), isDefined = commonUtils.isDefined, errors = __webpack_require__( /*! ../errors */ 155).errors, dataUtils = __webpack_require__( /*! ../utils */ 137); var GUID_REGEX = /^(\{{0,1}([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}\}{0,1})$/; var VERBOSE_DATE_REGEX = /^\/Date\((-?\d+)((\+|-)?(\d+)?)\)\/$/; var ISO8601_DATE_REGEX = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[-+]{1}\d{2}(:?)(\d{2})?)?$/; var JSON_VERBOSE_MIME_TYPE = "application/json;odata=verbose"; function formatISO8601(date, skipZeroTime, skipTimezone) { var bag = []; var pad = function(n) { if (n < 10) { return "0".concat(n) } return String(n) }; var isZeroTime = function() { return date.getHours() + date.getMinutes() + date.getSeconds() + date.getMilliseconds() < 1 }; bag.push(date.getFullYear()); bag.push("-"); bag.push(pad(date.getMonth() + 1)); bag.push("-"); bag.push(pad(date.getDate())); if (!(skipZeroTime && isZeroTime())) { bag.push("T"); bag.push(pad(date.getHours())); bag.push(":"); bag.push(pad(date.getMinutes())); bag.push(":"); bag.push(pad(date.getSeconds())); if (date.getMilliseconds()) { bag.push("."); bag.push(date.getMilliseconds()) } if (!skipTimezone) { bag.push("Z") } } return bag.join("") } function parseISO8601(isoString) { var result = new Date(60 * new Date(0).getTimezoneOffset() * 1e3), chunks = isoString.replace("Z", "").split("T"), date = /(\d{4})-(\d{2})-(\d{2})/.exec(chunks[0]), time = /(\d{2}):(\d{2}):(\d{2})\.?(\d{0,7})?/.exec(chunks[1]); result.setFullYear(Number(date[1])); result.setMonth(Number(date[2]) - 1); result.setDate(Number(date[3])); if (Array.isArray(time) && time.length) { result.setHours(Number(time[1])); result.setMinutes(Number(time[2])); result.setSeconds(Number(time[3])); result.setMilliseconds(Number(String(time[4]).substr(0, 3)) || 0) } return result } function isAbsoluteUrl(url) { return /^(?:[a-z]+:)?\/\//i.test(url) } function toAbsoluteUrl(basePath, relativePath) { var part; var baseParts = stripParams(basePath).split("/"); var relativeParts = relativePath.split("/"); function stripParams(url) { var index = url.indexOf("?"); if (index > -1) { return url.substr(0, index) } return url } baseParts.pop(); while (relativeParts.length) { part = relativeParts.shift(); if (".." === part) { baseParts.pop() } else { baseParts.push(part) } } return baseParts.join("/") } var ajaxOptionsForRequest = function(protocolVersion, request, options) { request = extend({ async: true, method: "get", url: "", params: {}, payload: null, headers: {}, timeout: 3e4 }, request); options = options || {}; var beforeSend = options.beforeSend; if (beforeSend) { beforeSend(request) } var method = (request.method || "get").toLowerCase(), isGet = "get" === method, useJsonp = isGet && options.jsonp, params = extend({}, request.params), ajaxData = isGet ? params : formatPayload(request.payload), qs = !isGet && $.param(params), url = request.url, contentType = !isGet && JSON_VERBOSE_MIME_TYPE; if (qs) { url += (url.indexOf("?") > -1 ? "&" : "?") + qs } if (useJsonp) { ajaxData.$format = "json" } return { url: url, data: ajaxData, dataType: useJsonp ? "jsonp" : "json", jsonp: useJsonp && "$callback", type: method, async: request.async, timeout: request.timeout, headers: request.headers, contentType: contentType, accepts: { json: [JSON_VERBOSE_MIME_TYPE, "text/plain"].join() }, xhrFields: { withCredentials: options.withCredentials } }; function formatPayload(payload) { return JSON.stringify(payload, function(key, value) { if (!(this[key] instanceof Date)) { return value } value = formatISO8601(this[key]); switch (protocolVersion) { case 2: return value.substr(0, value.length - 1); case 3: case 4: return value; default: throw errors.Error("E4002") } }) } }; var sendRequest = function(protocolVersion, request, options) { var d = $.Deferred(); var ajaxOptions = ajaxOptionsForRequest(protocolVersion, request, options); $.ajax(ajaxOptions).always(function(obj, textStatus) { var extra, transformOptions = { deserializeDates: options.deserializeDates, fieldTypes: options.fieldTypes }, tuple = interpretJsonFormat(obj, textStatus, transformOptions), error = tuple.error, data = tuple.data, nextUrl = tuple.nextUrl; if (error) { d.reject(error) } else { if (options.countOnly) { if (isFinite(tuple.count)) { d.resolve(tuple.count) } else { d.reject(new errors.Error("E4018")) } } else { if (nextUrl) { if (!isAbsoluteUrl(nextUrl)) { nextUrl = toAbsoluteUrl(ajaxOptions.url, nextUrl) } sendRequest(protocolVersion, { url: nextUrl }, options).fail(d.reject).done(function(nextData) { d.resolve(data.concat(nextData)) }) } else { if (isFinite(tuple.count)) { extra = { totalCount: tuple.count } } d.resolve(data, extra) } } } }); return d.promise() }; var formatDotNetError = function(errorObj) { var message, currentError = errorObj; if ("message" in errorObj) { if (errorObj.message.value) { message = errorObj.message.value } else { message = errorObj.message } } while (currentError = currentError.innererror || currentError.internalexception) { message = currentError.message; if (currentError.internalexception && message.indexOf("inner exception") === -1) { break } } return message }; var errorFromResponse = function(obj, textStatus) { if ("nocontent" === textStatus) { return null } var httpStatus = 200, message = "Unknown error", response = obj; if ("success" !== textStatus) { httpStatus = obj.status; message = dataUtils.errorMessageFromXhr(obj, textStatus); try { response = JSON.parse(obj.responseText) } catch (x) {} } var errorObj = response && (response.then && response || response.error || response["odata.error"] || response["@odata.error"]); if (errorObj) { message = formatDotNetError(errorObj) || message; if (200 === httpStatus) { httpStatus = 500 } if (errorObj.code) { httpStatus = Number(errorObj.code) } return extend(Error(message), { httpStatus: httpStatus, errorDetails: errorObj }) } else { if (200 !== httpStatus) { return extend(Error(message), { httpStatus: httpStatus }) } } }; var interpretJsonFormat = function(obj, textStatus, transformOptions) { var value, error = errorFromResponse(obj, textStatus); if (error) { return { error: error } } if (!typeUtils.isPlainObject(obj)) { return { data: obj } } if ("d" in obj && (Array.isArray(obj.d) || commonUtils.isObject(obj.d))) { value = interpretVerboseJsonFormat(obj, textStatus) } else { value = interpretLightJsonFormat(obj, textStatus) } transformTypes(value, transformOptions); return value }; var interpretVerboseJsonFormat = function(obj) { var data = obj.d; if (!isDefined(data)) { return { error: Error("Malformed or unsupported JSON response received") } } data = data; if (isDefined(data.results)) { data = data.results } return { data: data, nextUrl: obj.d.__next, count: parseInt(obj.d.__count, 10) } }; var interpretLightJsonFormat = function(obj) { var data = obj; if (isDefined(data.value)) { data = data.value } return { data: data, nextUrl: obj["@odata.nextLink"], count: parseInt(obj["@odata.count"], 10) } }; var EdmLiteral = Class.inherit({ ctor: function(value) { this._value = value }, valueOf: function() { return this._value } }); var transformTypes = function(obj, options) { options = options || {}; $.each(obj, function(key, value) { if (null !== value && "object" === typeof value) { if ("results" in value) { obj[key] = value.results } transformTypes(obj[key], options) } else { if ("string" === typeof value) { var fieldTypes = options.fieldTypes, canBeGuid = !fieldTypes || "String" !== fieldTypes[key]; if (canBeGuid && GUID_REGEX.test(value)) { obj[key] = new Guid(value) } if (false !== options.deserializeDates) { if (value.match(VERBOSE_DATE_REGEX)) { var date = new Date(Number(RegExp.$1) + 60 * RegExp.$2 * 1e3); obj[key] = new Date(date.valueOf() + 60 * date.getTimezoneOffset() * 1e3) } else { if (ISO8601_DATE_REGEX.test(value)) { obj[key] = new Date(parseISO8601(obj[key]).valueOf()) } } } } } }) }; var serializeDate = function(date) { return "datetime'" + formatISO8601(date, true, true) + "'" }; var serializeString = function(value) { return "'" + value.replace(/'/g, "''") + "'" }; var serializePropName = function(propName) { if (propName instanceof EdmLiteral) { return propName.valueOf() } return propName.replace(/\./g, "/") }; var serializeValueV4 = function(value) { if (value instanceof Date) { return formatISO8601(value, false, false) } if (value instanceof Guid) { return value.valueOf() } if (Array.isArray(value)) { return "[" + value.map(function(item) { return serializeValueV4(item) }).join(",") + "]" } return serializeValueV2(value) }; var serializeValueV2 = function(value) { if (value instanceof Date) { return serializeDate(value) } if (value instanceof Guid) { return "guid'" + value + "'" } if (value instanceof EdmLiteral) { return value.valueOf() } if ("string" === typeof value) { return serializeString(value) } return String(value) }; var serializeValue = function(value, protocolVersion) { switch (protocolVersion) { case 2: case 3: return serializeValueV2(value); case 4: return serializeValueV4(value); default: throw errors.Error("E4002") } }; var serializeKey = function(key, protocolVersion) { if (typeUtils.isPlainObject(key)) { var parts = []; $.each(key, function(k, v) { parts.push(serializePropName(k) + "=" + serializeValue(v, protocolVersion)) }); return parts.join() } return serializeValue(key, protocolVersion) }; var keyConverters = { String: function(value) { return value + "" }, Int32: function(value) { return Math.floor(value) }, Int64: function(value) { if (value instanceof EdmLiteral) { return value } return new EdmLiteral(value + "L") }, Guid: function(value) { if (value instanceof Guid) { return value } return new Guid(value) }, Boolean: function(value) { return !!value }, Single: function(value) { if (value instanceof EdmLiteral) { return value } return new EdmLiteral(value + "f") }, Decimal: function(value) { if (value instanceof EdmLiteral) { return value } return new EdmLiteral(value + "m") } }; var convertPrimitiveValue = function(type, value) { var converter = keyConverters[type]; if (!converter) { throw errors.Error("E4014", type) } return converter(value) }; exports.sendRequest = sendRequest; exports.serializePropName = serializePropName; exports.serializeValue = serializeValue; exports.serializeKey = serializeKey; exports.keyConverters = keyConverters; exports.convertPrimitiveValue = convertPrimitiveValue; exports.EdmLiteral = EdmLiteral; exports.OData__internals = { interpretJsonFormat: interpretJsonFormat } }, /*!*********************************!*\ !*** ./js/data/odata/mixins.js ***! \*********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), stringUtils = __webpack_require__( /*! ../../core/utils/string */ 18), odataUtils = __webpack_require__( /*! ./utils */ 193); __webpack_require__( /*! ./query_adapter */ 195); var DEFAULT_PROTOCOL_VERSION = 2; var formatFunctionInvocationUrl = function(baseUrl, args) { return stringUtils.format("{0}({1})", baseUrl, $.map(args || {}, function(value, key) { return stringUtils.format("{0}={1}", key, value) }).join(",")) }; var escapeServiceOperationParams = function(params, version) { if (!params) { return params } var result = {}; $.each(params, function(k, v) { result[k] = odataUtils.serializeValue(v, version) }); return result }; var SharedMethods = { _extractServiceOptions: function(options) { options = options || {}; this._url = String(options.url).replace(/\/+$/, ""); this._beforeSend = options.beforeSend; this._jsonp = options.jsonp; this._version = options.version || DEFAULT_PROTOCOL_VERSION; this._withCredentials = options.withCredentials; this._deserializeDates = options.deserializeDates }, _sendRequest: function(url, method, params, payload) { return odataUtils.sendRequest(this.version(), { url: url, method: method, params: params || {}, payload: payload }, { beforeSend: this._beforeSend, jsonp: this._jsonp, withCredentials: this._withCredentials, deserializeDates: this._deserializeDates }) }, version: function() { return this._version } }; exports.SharedMethods = SharedMethods; exports.escapeServiceOperationParams = escapeServiceOperationParams; exports.formatFunctionInvocationUrl = formatFunctionInvocationUrl }, /*!****************************************!*\ !*** ./js/data/odata/query_adapter.js ***! \****************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), typeUtils = __webpack_require__( /*! ../../core/utils/type */ 12), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, queryAdapters = __webpack_require__( /*! ../query_adapters */ 161), odataUtils = __webpack_require__( /*! ./utils */ 193), serializePropName = odataUtils.serializePropName, errors = __webpack_require__( /*! ../errors */ 155).errors, dataUtils = __webpack_require__( /*! ../utils */ 137), isFunction = commonUtils.isFunction, isPlainObject = typeUtils.isPlainObject, grep = commonUtils.grep; var DEFAULT_PROTOCOL_VERSION = 2; var compileCriteria = function() { var protocolVersion, fieldTypes; var createBinaryOperationFormatter = function(op) { return function(prop, val) { return prop + " " + op + " " + val } }; var createStringFuncFormatter = function(op, reverse) { return function(prop, val) { var bag = [op, "("]; if (reverse) { bag.push(val, ",", prop) } else { bag.push(prop, ",", val) } bag.push(")"); return bag.join("") } }; var formatters = { "=": createBinaryOperationFormatter("eq"), "<>": createBinaryOperationFormatter("ne"), ">": createBinaryOperationFormatter("gt"), ">=": createBinaryOperationFormatter("ge"), "<": createBinaryOperationFormatter("lt"), "<=": createBinaryOperationFormatter("le"), startswith: createStringFuncFormatter("startswith"), endswith: createStringFuncFormatter("endswith") }; var formattersV2 = extend({}, formatters, { contains: createStringFuncFormatter("substringof", true), notcontains: createStringFuncFormatter("not substringof", true) }); var formattersV4 = extend({}, formatters, { contains: createStringFuncFormatter("contains"), notcontains: createStringFuncFormatter("not contains") }); var compileBinary = function(criteria) { criteria = dataUtils.normalizeBinaryCriterion(criteria); var op = criteria[1], formatters = 4 === protocolVersion ? formattersV4 : formattersV2, formatter = formatters[op.toLowerCase()]; if (!formatter) { throw errors.Error("E4003", op) } var fieldName = criteria[0], value = criteria[2]; if (fieldTypes && fieldTypes[fieldName]) { value = odataUtils.convertPrimitiveValue(fieldTypes[fieldName], value) } return formatter(serializePropName(fieldName), odataUtils.serializeValue(value, protocolVersion)) }; var compileUnary = function(criteria) { var op = criteria[0], crit = compileCore(criteria[1]); if ("!" === op) { return "not (" + crit + ")" } throw errors.Error("E4003", op) }; var compileGroup = function(criteria) { var groupOperator, nextGroupOperator, bag = []; $.each(criteria, function(index, criterion) { if (Array.isArray(criterion)) { if (bag.length > 1 && groupOperator !== nextGroupOperator) { throw new errors.Error("E4019") } bag.push("(" + compileCore(criterion) + ")"); groupOperator = nextGroupOperator; nextGroupOperator = "and" } else { nextGroupOperator = dataUtils.isConjunctiveOperator(this) ? "and" : "or" } }); return bag.join(" " + groupOperator + " ") }; var compileCore = function(criteria) { if (Array.isArray(criteria[0])) { return compileGroup(criteria) } if (dataUtils.isUnaryOperation(criteria)) { return compileUnary(criteria) } return compileBinary(criteria) }; return function(criteria, version, types) { fieldTypes = types; protocolVersion = version; return compileCore(criteria) } }(); var createODataQueryAdapter = function(queryOptions) { var _select, _skip, _take, _countQuery, _sorting = [], _criteria = [], _expand = queryOptions.expand, _oDataVersion = queryOptions.version || DEFAULT_PROTOCOL_VERSION; var hasSlice = function() { return _skip || void 0 !== _take }; var hasFunction = function(criterion) { for (var i = 0; i < criterion.length; i++) { if (isFunction(criterion[i])) { return true } if (Array.isArray(criterion[i]) && hasFunction(criterion[i])) { return true } } return false }; var generateSelectExpand = function() { var hasDot = function(x) { return /\./.test(x) }; var generateSelect = function() { if (!_select) { return } if (_oDataVersion < 4) { return serializePropName(_select.join()) } return grep(_select, hasDot, true).join() }; var generateExpand = function() { var generatorV2 = function() { var hash = {}; if (_expand) { $.each($.makeArray(_expand), function() { hash[serializePropName(this)] = 1 }) } if (_select) { $.each($.makeArray(_select), function() { var path = this.split("."); if (path.length < 2) { return } path.pop(); hash[serializePropName(path.join("."))] = 1 }) } return $.map(hash, function(k, v) { return v }).join() }; var generatorV4 = function() { var format = function(hash) { var formatCore = function(hash) { var result = "", select = [], expand = []; $.each(hash, function(key, value) { if (Array.isArray(value)) { [].push.apply(select, value) } if (isPlainObject(value)) { expand.push(key + formatCore(value)) } }); if (select.length || expand.length) { result += "("; if (select.length) { result += "$select=" + $.map(select, serializePropName).join() } if (expand.length) { if (select.length) { result += ";" } result += "$expand=" + $.map(expand, serializePropName).join() } result += ")" } return result }; var result = []; $.each(hash, function(key, value) { result.push(key + formatCore(value)) }); return result.join() }; var parseTree = function(exprs, root, stepper) { var parseCore = function(exprParts, root, stepper) { var result = stepper(root, exprParts.shift(), exprParts); if (false === result) { return } parseCore(exprParts, result, stepper) }; $.each(exprs, function(_, x) { parseCore(x.split("."), root, stepper) }) }; var hash = {}; if (_expand || _select) { if (_expand) { parseTree($.makeArray(_expand), hash, function(node, key, path) { node[key] = node[key] || {}; if (!path.length) { return false } return node[key] }) } if (_select) { parseTree(grep($.makeArray(_select), hasDot), hash, function(node, key, path) { if (!path.length) { node[key] = node[key] || []; node[key].push(key); return false } return node[key] = node[key] || {} }) } return format(hash) } }; if (_oDataVersion < 4) { return generatorV2() } return generatorV4() }; var tuple = { $select: generateSelect() || void 0, $expand: generateExpand() || void 0 }; return tuple }; var requestData = function() { var result = {}; if (!_countQuery) { if (_sorting.length) { result.$orderby = _sorting.join(",") } if (_skip) { result.$skip = _skip } if (void 0 !== _take) { result.$top = _take } var tuple = generateSelectExpand(); result.$select = tuple.$select; result.$expand = tuple.$expand } if (_criteria.length) { var criteria = _criteria.length < 2 ? _criteria[0] : _criteria, fieldTypes = queryOptions && queryOptions.fieldTypes; result.$filter = compileCriteria(criteria, _oDataVersion, fieldTypes) } if (_countQuery) { result.$top = 0 } if (queryOptions.requireTotalCount || _countQuery) { if (4 !== _oDataVersion) { result.$inlinecount = "allpages" } else { result.$count = "true" } } return result }; return { exec: function(url) { return odataUtils.sendRequest(_oDataVersion, { url: url, params: extend(requestData(), queryOptions && queryOptions.params) }, { beforeSend: queryOptions.beforeSend, jsonp: queryOptions.jsonp, withCredentials: queryOptions.withCredentials, countOnly: _countQuery, deserializeDates: queryOptions.deserializeDates, fieldTypes: queryOptions.fieldTypes }) }, multiSort: function(args) { var rules; if (hasSlice()) { return false } for (var i = 0; i < args.length; i++) { var rule, getter = args[i][0], desc = !!args[i][1]; if ("string" !== typeof getter) { return false } rule = serializePropName(getter); if (desc) { rule += " desc" } rules = rules || []; rules.push(rule) } _sorting = rules }, slice: function(skipCount, takeCount) { if (hasSlice()) { return false } _skip = skipCount; _take = takeCount }, filter: function(criterion) { if (hasSlice()) { return false } if (!Array.isArray(criterion)) { criterion = $.makeArray(arguments) } if (hasFunction(criterion)) { return false } if (_criteria.length) { _criteria.push("and") } _criteria.push(criterion) }, select: function(expr) { if (_select || isFunction(expr)) { return false } if (!Array.isArray(expr)) { expr = $.makeArray(arguments) } _select = expr }, count: function() { _countQuery = true } } }; queryAdapters.odata = createODataQueryAdapter; exports.odata = createODataQueryAdapter }, /*!**********************************!*\ !*** ./js/data/odata/context.js ***! \**********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), typeUtils = __webpack_require__( /*! ../../core/utils/type */ 12), errorsModule = __webpack_require__( /*! ../errors */ 155), ODataStore = __webpack_require__( /*! ./store */ 192), mixins = __webpack_require__( /*! ./mixins */ 194), when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when; __webpack_require__( /*! ./query_adapter */ 195); var ODataContext = Class.inherit({ ctor: function(options) { var that = this; that._extractServiceOptions(options); that._errorHandler = options.errorHandler; $.each(options.entities || [], function(entityAlias, entityOptions) { that[entityAlias] = new ODataStore(extend({}, options, { url: that._url + "/" + encodeURIComponent(entityOptions.name || entityAlias) }, entityOptions)) }) }, get: function(operationName, params) { return this.invoke(operationName, params, "GET") }, invoke: function(operationName, params, httpMethod) { params = params || {}; httpMethod = (httpMethod || "POST").toLowerCase(); var payload, d = $.Deferred(), url = this._url + "/" + encodeURIComponent(operationName); if (4 === this.version()) { if ("get" === httpMethod) { url = mixins.formatFunctionInvocationUrl(url, mixins.escapeServiceOperationParams(params, this.version())); params = null } else { if ("post" === httpMethod) { payload = params; params = null } } } when(this._sendRequest(url, httpMethod, mixins.escapeServiceOperationParams(params, this.version()), payload)).done(function(r) { if (typeUtils.isPlainObject(r) && operationName in r) { r = r[operationName] } d.resolve(r) }).fail([this._errorHandler, errorsModule._errorHandler, d.reject]); return d.promise() }, objectLink: function(entityAlias, key) { var store = this[entityAlias]; if (!store) { throw errorsModule.errors.Error("E4015", entityAlias) } if (!commonUtils.isDefined(key)) { return null } return { __metadata: { uri: store._byKeyUrl(key, true) } } } }).include(mixins.SharedMethods); module.exports = ODataContext }, /*!**********************************!*\ !*** ./js/bundles/modules/ui.js ***! \**********************************/ function(module, exports, __webpack_require__) { __webpack_require__( /*! ./core */ 6); module.exports = DevExpress.ui = {}; DevExpress.ui.templateRendered = __webpack_require__( /*! ../../ui/widget/ui.template_base */ 97).renderedCallbacks }, /*!**************************************!*\ !*** ./js/ui/set_template_engine.js ***! \**************************************/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__( /*! ./widget/jquery.template */ 96).setTemplateEngine }, /*!*************************!*\ !*** ./js/ui/dialog.js ***! \*************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), Component = __webpack_require__( /*! ../core/component */ 48), isFunction = __webpack_require__( /*! ../core/utils/common */ 14).isFunction, Action = __webpack_require__( /*! ../core/action */ 49), domUtils = __webpack_require__( /*! ../core/utils/dom */ 56), viewPortUtils = __webpack_require__( /*! ../core/utils/view_port */ 55), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, isPlainObject = __webpack_require__( /*! ../core/utils/type */ 12).isPlainObject, devices = __webpack_require__( /*! ../core/devices */ 53), themes = __webpack_require__( /*! ./themes */ 143), errors = __webpack_require__( /*! ./widget/ui.errors */ 22), messageLocalization = __webpack_require__( /*! ../localization/message */ 89), Popup = __webpack_require__( /*! ./popup */ 200), config = __webpack_require__( /*! ../core/config */ 15); var DEFAULT_BUTTON = { text: "OK", onClick: function() { return true } }; var DX_DIALOG_CLASSNAME = "dx-dialog", DX_DIALOG_WRAPPER_CLASSNAME = DX_DIALOG_CLASSNAME + "-wrapper", DX_DIALOG_ROOT_CLASSNAME = DX_DIALOG_CLASSNAME + "-root", DX_DIALOG_CONTENT_CLASSNAME = DX_DIALOG_CLASSNAME + "-content", DX_DIALOG_MESSAGE_CLASSNAME = DX_DIALOG_CLASSNAME + "-message", DX_DIALOG_BUTTONS_CLASSNAME = DX_DIALOG_CLASSNAME + "-buttons", DX_DIALOG_BUTTON_CLASSNAME = DX_DIALOG_CLASSNAME + "-button"; var FakeDialogComponent = Component.inherit({ ctor: function(element, options) { this.callBase(options) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: { platform: "ios" }, options: { width: 276 } }, { device: { platform: "android" }, options: { lWidth: "60%", pWidth: "80%" } }, { device: function(device) { var currentTheme = (themes.current() || "").split(".")[0]; return !device.phone && "win8" === currentTheme }, options: { width: function() { return $(window).width() } } }, { device: function(device) { var currentTheme = (themes.current() || "").split(".")[0]; return device.phone && "win8" === currentTheme }, options: { position: { my: "top center", at: "top center", of: window, offset: "0 0" } } }]) } }); exports.FakeDialogComponent = FakeDialogComponent; exports.title = ""; exports.custom = function(options) { var deferred = $.Deferred(); var defaultOptions = (new FakeDialogComponent).option(); options = extend(defaultOptions, options); var $element = $("<div>").addClass(DX_DIALOG_CLASSNAME).appendTo(viewPortUtils.value()); var $message = $("<div>").addClass(DX_DIALOG_MESSAGE_CLASSNAME).html(String(options.message)); var popupToolbarItems = []; var toolbarItemsOption = options.toolbarItems; if (toolbarItemsOption) { errors.log("W0001", "DevExpress.ui.dialog", "toolbarItems", "16.2", "Use the 'buttons' option instead") } else { toolbarItemsOption = options.buttons } $.each(toolbarItemsOption || [DEFAULT_BUTTON], function() { var action = new Action(this.onClick, { context: popupInstance }); popupToolbarItems.push({ toolbar: "bottom", location: devices.current().android ? "after" : "center", widget: "dxButton", options: extend({}, this, { onClick: function() { var result = action.execute(arguments); hide(result) } }) }) }); var popupInstance = new Popup($element, { title: options.title || exports.title, showTitle: function() { var isTitle = void 0 === options.showTitle ? true : options.showTitle; return isTitle }(), height: "auto", width: function() { var isPortrait = $(window).height() > $(window).width(), key = (isPortrait ? "p" : "l") + "Width", widthOption = options.hasOwnProperty(key) ? options[key] : options.width; return isFunction(widthOption) ? widthOption() : widthOption }, showCloseButton: options.showCloseButton || false, focusStateEnabled: false, onContentReady: function(args) { args.component.content().addClass(DX_DIALOG_CONTENT_CLASSNAME).append($message) }, onShowing: function(e) { e.component.bottomToolbar().addClass(DX_DIALOG_BUTTONS_CLASSNAME).find(".dx-button").addClass(DX_DIALOG_BUTTON_CLASSNAME); domUtils.resetActiveElement() }, onShown: function(e) { e.component.bottomToolbar().find(".dx-button").first().focus() }, onHiding: function() { deferred.reject() }, toolbarItems: popupToolbarItems, animation: { show: { type: "pop", duration: 400 }, hide: { type: "pop", duration: 400, to: { opacity: 0, scale: 0 }, from: { opacity: 1, scale: 1 } } }, rtlEnabled: config().rtlEnabled, boundaryOffset: { h: 10, v: 0 } }); popupInstance._wrapper().addClass(DX_DIALOG_WRAPPER_CLASSNAME); if (options.position) { popupInstance.option("position", options.position) } popupInstance._wrapper().addClass(DX_DIALOG_ROOT_CLASSNAME); function show() { popupInstance.show(); return deferred.promise() } function hide(value) { deferred.resolve(value); popupInstance.hide().done(function() { popupInstance.element().remove() }) } return { show: show, hide: hide } }; exports.alert = function(message, title, showTitle) { var options = isPlainObject(message) ? message : { title: title, message: message, showTitle: showTitle }; return exports.custom(options).show() }; exports.confirm = function(message, title, showTitle) { var options = isPlainObject(message) ? message : { title: title, message: message, showTitle: showTitle, buttons: [{ text: messageLocalization.format("Yes"), onClick: function() { return true } }, { text: messageLocalization.format("No"), onClick: function() { return false } }] }; return exports.custom(options).show() } }, /*!************************!*\ !*** ./js/ui/popup.js ***! \************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), translator = __webpack_require__( /*! ../animation/translator */ 69), camelize = __webpack_require__( /*! ../core/utils/inflector */ 39).camelize, commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), inArray = __webpack_require__( /*! ../core/utils/array */ 26).inArray, extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, messageLocalization = __webpack_require__( /*! ../localization/message */ 89), devices = __webpack_require__( /*! ../core/devices */ 53), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), Button = __webpack_require__( /*! ./button */ 201), themes = __webpack_require__( /*! ./themes */ 143), Overlay = __webpack_require__( /*! ./overlay */ 109), EmptyTemplate = __webpack_require__( /*! ./widget/empty_template */ 99), domUtils = __webpack_require__( /*! ../core/utils/dom */ 56); __webpack_require__( /*! ./toolbar/ui.toolbar.base */ 203); var POPUP_CLASS = "dx-popup", POPUP_WRAPPER_CLASS = "dx-popup-wrapper", POPUP_FULL_SCREEN_CLASS = "dx-popup-fullscreen", POPUP_FULL_SCREEN_WIDTH_CLASS = "dx-popup-fullscreen-width", POPUP_NORMAL_CLASS = "dx-popup-normal", POPUP_CONTENT_CLASS = "dx-popup-content", POPUP_DRAGGABLE_CLASS = "dx-popup-draggable", POPUP_TITLE_CLASS = "dx-popup-title", POPUP_TITLE_CLOSEBUTTON_CLASS = "dx-closebutton", POPUP_BOTTOM_CLASS = "dx-popup-bottom", TEMPLATE_WRAPPER_CLASS = "dx-template-wrapper", ALLOWED_TOOLBAR_ITEM_ALIASES = ["cancel", "clear", "done"]; var getButtonPlace = function(name) { var device = devices.current(), platform = device.platform, toolbar = "bottom", location = "before"; if ("ios" === platform) { switch (name) { case "cancel": toolbar = "top"; break; case "clear": toolbar = "top"; location = "after"; break; case "done": location = "after" } } else { if ("win" === platform) { location = "after" } else { if ("android" === platform && device.version && parseInt(device.version[0]) > 4) { switch (name) { case "cancel": location = "after"; break; case "done": location = "after" } } else { if ("android" === platform) { location = "center" } } } } return { toolbar: toolbar, location: location } }; var Popup = Overlay.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { fullScreen: false, title: "", showTitle: true, titleTemplate: "title", onTitleRendered: null, dragEnabled: false, toolbarItems: [], showCloseButton: false, bottomTemplate: "bottom" }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function() { var currentTheme = (themes.current() || "").split(".")[0]; return "win8" === currentTheme }, options: { width: function() { return $(window).width() } } }, { device: function(device) { var currentTheme = (themes.current() || "").split(".")[0]; return device.phone && "win8" === currentTheme }, options: { position: { my: "top center", at: "top center", offset: "0 0" } } }, { device: { platform: "ios" }, options: { animation: this._iosAnimation } }, { device: { platform: "android" }, options: { animation: this._androidAnimation } }, { device: { platform: "generic" }, options: { showCloseButton: true } }, { device: function(device) { return "generic" === devices.real().platform && "generic" === device.platform }, options: { dragEnabled: true } }, { device: function() { return "desktop" === devices.real().deviceType && !devices.isSimulator() }, options: { focusStateEnabled: true } }]) }, _setDeprecatedOptions: function() { this.callBase(); extend(this._deprecatedOptions, { buttons: { since: "16.1", alias: "toolbarItems" } }) }, _iosAnimation: { show: { type: "slide", duration: 400, from: { position: { my: "top", at: "bottom" } }, to: { position: { my: "center", at: "center" } } }, hide: { type: "slide", duration: 400, from: { opacity: 1, position: { my: "center", at: "center" } }, to: { opacity: 1, position: { my: "top", at: "bottom" } } } }, _androidAnimation: function() { var fullScreenConfig = { show: { type: "slide", duration: 300, from: { top: "30%", opacity: 0 }, to: { top: 0, opacity: 1 } }, hide: { type: "slide", duration: 300, from: { top: 0, opacity: 1 }, to: { top: "30%", opacity: 0 } } }, defaultConfig = { show: { type: "fade", duration: 400, from: 0, to: 1 }, hide: { type: "fade", duration: 400, from: 1, to: 0 } }; return this.option("fullScreen") ? fullScreenConfig : defaultConfig }, _init: function() { this.callBase(); this.element().addClass(POPUP_CLASS); this._wrapper().addClass(POPUP_WRAPPER_CLASS); this._$popupContent = this._$content.wrapInner($("<div>").addClass(POPUP_CONTENT_CLASS)).children().eq(0) }, _render: function() { var isFullscreen = this.option("fullScreen"); this._toggleFullScreenClass(isFullscreen); this.callBase() }, _toggleFullScreenClass: function(value) { this._$content.toggleClass(POPUP_FULL_SCREEN_CLASS, value).toggleClass(POPUP_NORMAL_CLASS, !value) }, _initTemplates: function() { this.callBase(); this._defaultTemplates.title = new EmptyTemplate(this); this._defaultTemplates.bottom = new EmptyTemplate(this) }, _renderContentImpl: function() { this.callBase(); this._renderTitle(); this._renderBottom() }, _renderTitle: function() { var items = this._getToolbarItems("top"), titleText = this.option("title"), showTitle = this.option("showTitle"); if (showTitle && !!titleText) { items.unshift({ location: devices.current().ios ? "center" : "before", text: titleText }) } if (showTitle || items.length > 0) { this._$title && this._$title.remove(); var $title = $("<div>").addClass(POPUP_TITLE_CLASS).insertBefore(this.content()); this._$title = this._renderTemplateByType("titleTemplate", items, $title).addClass(POPUP_TITLE_CLASS); this._renderDrag(); this._executeTitleRenderAction(this._$title) } else { if (this._$title) { this._$title.detach() } } }, _renderTemplateByType: function(optionName, data, $container) { var template = this._getTemplateByOption(optionName), toolbarTemplate = template instanceof EmptyTemplate; if (toolbarTemplate) { this._getTemplate("dx-polymorph-widget").render({ container: $container, model: { widget: "dxToolbarBase", options: { items: data } } }); var $toolbar = $container.children("div"); $container.replaceWith($toolbar); return $toolbar } else { var $result = template.render({ container: $container }); if ($result.hasClass(TEMPLATE_WRAPPER_CLASS)) { $container.replaceWith($result); $container = $result } return $container } }, _executeTitleRenderAction: function(titleElement) { this._getTitleRenderAction()({ titleElement: titleElement }) }, _getTitleRenderAction: function() { return this._titleRenderAction || this._createTitleRenderAction() }, _createTitleRenderAction: function() { return this._titleRenderAction = this._createActionByOption("onTitleRendered", { element: this.element(), excludeValidators: ["designMode", "disabled", "readOnly"] }) }, _getCloseButton: function() { return { toolbar: "top", location: "after", template: this._getCloseButtonRenderer() } }, _getCloseButtonRenderer: function() { return function(_, __, $container) { var $button = $("<div>").addClass(POPUP_TITLE_CLOSEBUTTON_CLASS); this._createComponent($button, Button, { icon: "close", onClick: this._createToolbarItemAction(void 0), integrationOptions: {} }); $container.append($button) }.bind(this) }, _getToolbarItems: function(toolbar) { var toolbarItems = this.option("toolbarItems"); var toolbarsItems = []; this._toolbarItemClasses = []; var currentPlatform = devices.current().platform, index = 0; $.each(toolbarItems, function(_, data) { var isShortcut = commonUtils.isDefined(data.shortcut), item = isShortcut ? getButtonPlace(data.shortcut) : data; if (isShortcut && "ios" === currentPlatform && index < 2) { item.toolbar = "top"; index++ } item.toolbar = data.toolbar || item.toolbar || "top"; if (item && item.toolbar === toolbar) { if (isShortcut) { extend(item, { location: data.location }, this._getToolbarItemByAlias(data)) } var isLTROrder = "win" === currentPlatform || "generic" === currentPlatform; if ("done" === data.shortcut && isLTROrder || "cancel" === data.shortcut && !isLTROrder) { toolbarsItems.unshift(item) } else { toolbarsItems.push(item) } } }.bind(this)); if ("top" === toolbar && this.option("showCloseButton") && this.option("showTitle")) { toolbarsItems.push(this._getCloseButton()) } return toolbarsItems }, _getToolbarItemByAlias: function(data) { var that = this, itemType = data.shortcut; if (inArray(itemType, ALLOWED_TOOLBAR_ITEM_ALIASES) < 0) { return false } var itemConfig = extend({ text: messageLocalization.format(camelize(itemType, true)), onClick: this._createToolbarItemAction(data.onClick), integrationOptions: {} }, data.options || {}); var itemClass = POPUP_CLASS + "-" + itemType; this._toolbarItemClasses.push(itemClass); return { template: function(_, __, $container) { var $toolbarItem = $("<div>").addClass(itemClass).appendTo($container); that._createComponent($toolbarItem, Button, itemConfig) } } }, _createToolbarItemAction: function(clickAction) { return this._createAction(clickAction, { afterExecute: function(e) { e.component.hide() } }) }, _renderBottom: function() { var items = this._getToolbarItems("bottom"); if (items.length) { this._$bottom && this._$bottom.remove(); var $bottom = $("<div>").addClass(POPUP_BOTTOM_CLASS).insertAfter(this.content()); this._$bottom = this._renderTemplateByType("bottomTemplate", items, $bottom).addClass(POPUP_BOTTOM_CLASS); this._toggleClasses() } else { this._$bottom && this._$bottom.detach() } }, _toggleClasses: function() { var aliases = ALLOWED_TOOLBAR_ITEM_ALIASES; $.each(aliases, function(_, alias) { var className = POPUP_CLASS + "-" + alias; if (inArray(className, this._toolbarItemClasses) >= 0) { this._wrapper().addClass(className + "-visible"); this._$bottom.addClass(className) } else { this._wrapper().removeClass(className + "-visible"); this._$bottom.removeClass(className) } }.bind(this)) }, _getDragTarget: function() { return this._$title }, _renderGeometryImpl: function() { this._resetContentHeight(); this.callBase.apply(this, arguments); this._setContentHeight() }, _resetContentHeight: function() { this._$popupContent.css({ height: "auto" }) }, _renderDrag: function() { this.callBase(); this._$content.toggleClass(POPUP_DRAGGABLE_CLASS, this.option("dragEnabled")) }, _renderResize: function() { this.callBase(); this._$content.dxResizable("option", "onResize", function() { this._setContentHeight(); this._actions.onResize(arguments) }.bind(this)) }, _setContentHeight: function() { (this.option("forceApplyBindings") || $.noop)(); if (this._disallowUpdateContentHeight()) { return } var contentPaddings = this._$content.outerHeight() - this._$content.height(), contentHeight = this._$content.get(0).getBoundingClientRect().height - contentPaddings; if (this._$title && this._$title.is(":visible")) { contentHeight -= this._$title.get(0).getBoundingClientRect().height || 0 } if (this._$bottom && this._$bottom.is(":visible")) { contentHeight -= this._$bottom.get(0).getBoundingClientRect().height || 0 } this._$popupContent.css({ height: contentHeight }) }, _disallowUpdateContentHeight: function() { var isHeightAuto = "auto" === this._$content.get(0).style.height, maxHeightSpecified = "none" !== this._$content.css("maxHeight"), minHeightSpecified = parseInt(this._$content.css("minHeight")) > 0; return isHeightAuto && !(maxHeightSpecified || minHeightSpecified) }, _renderDimensions: function() { if (this.option("fullScreen")) { this._$content.css({ width: "100%", height: "100%" }) } else { this.callBase.apply(this, arguments) } this._renderFullscreenWidthClass() }, _renderFullscreenWidthClass: function() { this.overlayContent().toggleClass(POPUP_FULL_SCREEN_WIDTH_CLASS, this.overlayContent().outerWidth() === $(window).width()) }, _renderShadingDimensions: function() { if (this.option("fullScreen")) { this._wrapper().css({ width: "100%", height: "100%" }) } else { this.callBase.apply(this, arguments) } }, refreshPosition: function() { this._renderPosition() }, _renderPosition: function() { if (this.option("fullScreen")) { translator.move(this._$content, { top: 0, left: 0 }) } else { (this.option("forceApplyBindings") || $.noop)(); return this.callBase.apply(this, arguments) } }, _optionChanged: function(args) { switch (args.name) { case "showTitle": case "title": case "titleTemplate": this._renderTitle(); this._renderGeometry(); break; case "bottomTemplate": this._renderBottom(); this._renderGeometry(); break; case "onTitleRendered": this._createTitleRenderAction(args.value); break; case "toolbarItems": this._renderTitle(); this._renderBottom(); this._renderGeometry(); break; case "dragEnabled": this._renderDrag(); break; case "fullScreen": this._toggleFullScreenClass(args.value); this._renderGeometry(); domUtils.triggerResizeEvent(this._$content); break; case "showCloseButton": this._renderTitle(); break; default: this.callBase(args) } }, bottomToolbar: function() { return this._$bottom }, content: function() { return this._$popupContent }, overlayContent: function() { return this._$content } }); registerComponent("dxPopup", Popup); module.exports = Popup }, /*!*************************!*\ !*** ./js/ui/button.js ***! \*************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), iconUtils = __webpack_require__( /*! ../core/utils/icon */ 115), devices = __webpack_require__( /*! ../core/devices */ 53), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, ValidationMixin = __webpack_require__( /*! ./validation/validation_mixin */ 108), ValidationEngine = __webpack_require__( /*! ./validation_engine */ 117), Widget = __webpack_require__( /*! ./widget/ui.widget */ 95), inkRipple = __webpack_require__( /*! ./widget/utils.ink_ripple */ 202), eventUtils = __webpack_require__( /*! ../events/utils */ 71), themes = __webpack_require__( /*! ./themes */ 143), clickEvent = __webpack_require__( /*! ../events/click */ 75), FunctionTemplate = __webpack_require__( /*! ./widget/function_template */ 98); var BUTTON_CLASS = "dx-button", BUTTON_CONTENT_CLASS = "dx-button-content", BUTTON_HAS_TEXT_CLASS = "dx-button-has-text", BUTTON_HAS_ICON_CLASS = "dx-button-has-icon", TEMPLATE_WRAPPER_CLASS = "dx-template-wrapper", BUTTON_TEXT_CLASS = "dx-button-text", ANONYMOUS_TEMPLATE_NAME = "content", BUTTON_FEEDBACK_HIDE_TIMEOUT = 100; var Button = Widget.inherit({ _supportedKeys: function() { var that = this, click = function(e) { e.preventDefault(); that._executeClickAction(e) }; return extend(this.callBase(), { space: click, enter: click }) }, _setDeprecatedOptions: function() { this.callBase(); extend(this._deprecatedOptions, { iconSrc: { since: "15.1", alias: "icon" } }) }, _getDefaultOptions: function() { return extend(this.callBase(), { hoverStateEnabled: true, onClick: null, type: "normal", text: "", icon: "", validationGroup: void 0, activeStateEnabled: true, template: "content", useSubmitBehavior: false, useInkRipple: false }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function() { return "desktop" === devices.real().deviceType && !devices.isSimulator() }, options: { focusStateEnabled: true } }, { device: function() { return /android5/.test(themes.current()) }, options: { useInkRipple: true } }]) }, _getAnonymousTemplateName: function() { return ANONYMOUS_TEMPLATE_NAME }, _feedbackHideTimeout: BUTTON_FEEDBACK_HIDE_TIMEOUT, _initTemplates: function() { this.callBase(); this._defaultTemplates.content = new FunctionTemplate(function(options) { var data = options.model, $iconElement = iconUtils.getImageContainer(data && data.icon), $textContainer = data && data.text ? $("<span>").text(data.text).addClass(BUTTON_TEXT_CLASS) : void 0; options.container.append($iconElement).append($textContainer) }, this) }, _render: function() { this.element().addClass(BUTTON_CLASS); this._renderType(); this.option("useInkRipple") && this._renderInkRipple(); this._renderClick(); this.setAria("role", "button"); this._updateAriaLabel(); this.callBase() }, _renderInkRipple: function() { var isOnlyIconButton = !this.option("text") && this.option("icon") || "back" === this.option("type"), config = {}; if (isOnlyIconButton) { extend(config, { waveSizeCoefficient: 1, useHoldAnimation: false, isCentered: true }) } this._inkRipple = inkRipple.render(config) }, _toggleActiveState: function($element, value, e) { this.callBase.apply(this, arguments); if (!this._inkRipple) { return } var config = { element: this._$content, jQueryEvent: e }; if (value) { this._inkRipple.showWave(config) } else { this._inkRipple.hideWave(config) } }, _renderContentImpl: function() { var $element = this.element(), data = this._getContentData(); if (this._$content) { this._$content.empty() } else { this._$content = $("<div>").addClass(BUTTON_CONTENT_CLASS).appendTo($element) } $element.toggleClass(BUTTON_HAS_ICON_CLASS, !!data.icon).toggleClass(BUTTON_HAS_TEXT_CLASS, !!data.text); var template = this._getTemplateByOption("template"), $result = template.render({ model: data, container: this._$content }); if ($result.hasClass(TEMPLATE_WRAPPER_CLASS)) { this._$content.replaceWith($result); this._$content = $result; this._$content.addClass(BUTTON_CONTENT_CLASS) } if (this.option("useSubmitBehavior")) { this._renderSubmitInput() } }, _renderSubmitInput: function() { var submitAction = this._createAction(function(args) { var e = args.jQueryEvent, validationGroup = ValidationEngine.getGroupConfig(args.component._findGroup()); if (validationGroup && !validationGroup.validate().isValid) { e.preventDefault() } e.stopPropagation() }); this._$submitInput = $("<input>").attr("type", "submit").addClass("dx-button-submit-input").appendTo(this._$content).on("click", function(e) { submitAction({ jQueryEvent: e }) }) }, _getContentData: function() { var icon = this.option("icon"), text = this.option("text"), back = "back" === this.option("type"); if (back && !icon) { icon = "back" } return { icon: icon, text: text } }, _renderClick: function() { var that = this, eventName = eventUtils.addNamespace(clickEvent.name, this.NAME), actionConfig = {}; if (this.option("useSubmitBehavior")) { actionConfig.afterExecute = function(e) { setTimeout(function() { e.component._$submitInput.get(0).click() }) } } this._clickAction = this._createActionByOption("onClick", actionConfig); this.element().off(eventName).on(eventName, function(e) { that._executeClickAction(e) }) }, _executeClickAction: function(e) { this._clickAction({ jQueryEvent: e, validationGroup: ValidationEngine.getGroupConfig(this._findGroup()) }) }, _updateAriaLabel: function() { var icon = this.option("icon"), text = this.option("text"); if ("image" === iconUtils.getImageSourceType(icon)) { if (icon.indexOf("base64") === -1) { icon = icon.replace(/.+\/([^\.]+)\..+$/, "$1") } else { icon = "Base64" } } var ariaLabel = text || icon; this.setAria("label", $.trim(ariaLabel)) }, _renderType: function() { var type = this.option("type"); if (type) { this.element().addClass("dx-button-" + type) } }, _refreshType: function(prevType) { var type = this.option("type"); prevType && this.element().removeClass("dx-button-" + prevType).addClass("dx-button-" + type); if (!this.element().hasClass(BUTTON_HAS_ICON_CLASS) && "back" === type) { this._renderContentImpl() } }, _optionChanged: function(args) { switch (args.name) { case "onClick": this._renderClick(); break; case "icon": case "text": this._renderContentImpl(); this._updateAriaLabel(); break; case "type": this._refreshType(args.previousValue); this._renderContentImpl(); this._updateAriaLabel(); break; case "template": this._renderContentImpl(); break; case "useInkRipple": this._invalidate(); break; case "useSubmitBehavior": this._invalidate(); break; default: this.callBase(args) } }, _clean: function() { this.callBase(); delete this._$content; delete this._inkRipple } }).include(ValidationMixin); registerComponent("dxButton", Button); module.exports = Button }, /*!******************************************!*\ !*** ./js/ui/widget/utils.ink_ripple.js ***! \******************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9); var INKRIPPLE_CLASS = "dx-inkripple", INKRIPPLE_WAVE_CLASS = "dx-inkripple-wave", INKRIPPLE_SHOWING_CLASS = "dx-inkripple-showing", INKRIPPLE_HIDING_CLASS = "dx-inkripple-hiding"; var DEFAULT_WAVE_SIZE_COEFFICIENT = 2, MAX_WAVE_SIZE = 4e3, ANIMATION_DURATION = 300, HOLD_ANIMATION_DURATION = 1e3, DEFAULT_WAVE_INDEX = 0; var render = function(args) { args = args || {}; if (void 0 === args.useHoldAnimation) { args.useHoldAnimation = true } var config = { waveSizeCoefficient: args.waveSizeCoefficient || DEFAULT_WAVE_SIZE_COEFFICIENT, isCentered: args.isCentered || false, wavesNumber: args.wavesNumber || 1, durations: getDurations(args.useHoldAnimation) }; return { showWave: showWave.bind(this, config), hideWave: hideWave.bind(this, config) } }; var getInkRipple = function(element) { var result = element.children("." + INKRIPPLE_CLASS); if (0 === result.length) { result = $("<div>").addClass(INKRIPPLE_CLASS).appendTo(element) } return result }; var getWaves = function(element, wavesNumber) { var inkRipple = getInkRipple(element), result = inkRipple.children("." + INKRIPPLE_WAVE_CLASS).toArray(); for (var i = result.length; i < wavesNumber; i++) { var $currentWave = $("<div>").appendTo(inkRipple).addClass(INKRIPPLE_WAVE_CLASS); result.push($currentWave[0]) } return $(result) }; var getWaveStyleConfig = function(args, config) { var left, top, element = config.element, elementWidth = element.outerWidth(), elementHeight = element.outerHeight(), elementDiagonal = parseInt(Math.sqrt(elementWidth * elementWidth + elementHeight * elementHeight)), waveSize = Math.min(MAX_WAVE_SIZE, parseInt(elementDiagonal * args.waveSizeCoefficient)); if (args.isCentered) { left = (elementWidth - waveSize) / 2; top = (elementHeight - waveSize) / 2 } else { var event = config.jQueryEvent, position = config.element.offset(), x = event.pageX - position.left, y = event.pageY - position.top; left = x - waveSize / 2; top = y - waveSize / 2 } return { left: left, top: top, height: waveSize, width: waveSize } }; var showWave = function(args, config) { var $wave = getWaves(config.element, args.wavesNumber).eq(config.wave || DEFAULT_WAVE_INDEX); args.hidingTimeout && clearTimeout(args.hidingTimeout); hideSelectedWave($wave); $wave.css(getWaveStyleConfig(args, config)); setTimeout(showingWaveHandler.bind(this, args, $wave), 0) }; var showingWaveHandler = function(args, $wave) { var durationCss = args.durations.showingScale + "ms"; $wave.addClass(INKRIPPLE_SHOWING_CLASS).css("transition-duration", durationCss) }; var getDurations = function(useHoldAnimation) { return { showingScale: useHoldAnimation ? HOLD_ANIMATION_DURATION : ANIMATION_DURATION, hidingScale: ANIMATION_DURATION, hidingOpacity: ANIMATION_DURATION } }; var hideSelectedWave = function($wave) { $wave.removeClass(INKRIPPLE_HIDING_CLASS).css("transition-duration", "") }; var hideWave = function(args, config) { var $wave = getWaves(config.element, config.wavesNumber).eq(config.wave || DEFAULT_WAVE_INDEX), durations = args.durations, durationCss = durations.hidingScale + "ms, " + durations.hidingOpacity + "ms"; $wave.addClass(INKRIPPLE_HIDING_CLASS).removeClass(INKRIPPLE_SHOWING_CLASS).css("transition-duration", durationCss); var animationDuration = Math.max(durations.hidingScale, durations.hidingOpacity); args.hidingTimeout = setTimeout(hideSelectedWave.bind(this, $wave), animationDuration) }; module.exports = { render: render } }, /*!******************************************!*\ !*** ./js/ui/toolbar/ui.toolbar.base.js ***! \******************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), isPlainObject = __webpack_require__( /*! ../../core/utils/type */ 12).isPlainObject, registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, CollectionWidget = __webpack_require__( /*! ../collection/ui.collection_widget.edit */ 149), BindableTemplate = __webpack_require__( /*! ../widget/bindable_template */ 166); var TOOLBAR_CLASS = "dx-toolbar", TOOLBAR_BEFORE_CLASS = "dx-toolbar-before", TOOLBAR_CENTER_CLASS = "dx-toolbar-center", TOOLBAR_AFTER_CLASS = "dx-toolbar-after", TOOLBAR_BOTTOM_CLASS = "dx-toolbar-bottom", TOOLBAR_MINI_CLASS = "dx-toolbar-mini", TOOLBAR_ITEM_CLASS = "dx-toolbar-item", TOOLBAR_LABEL_CLASS = "dx-toolbar-label", TOOLBAR_BUTTON_CLASS = "dx-toolbar-button", TOOLBAR_ITEMS_CONTAINER_CLASS = "dx-toolbar-items-container", TOOLBAR_GROUP_CLASS = "dx-toolbar-group", TOOLBAR_LABEL_SELECTOR = "." + TOOLBAR_LABEL_CLASS, TOOLBAR_ITEM_DATA_KEY = "dxToolbarItemDataKey"; var ToolbarBase = CollectionWidget.inherit({ _initTemplates: function() { this.callBase(); var template = new BindableTemplate(function($container, data, rawModel) { if (isPlainObject(data)) { if (data.text) { $container.text(data.text).wrapInner("<div>") } if (data.html) { $container.html(data.html) } } else { $container.text(String(data)) } this._getTemplate("dx-polymorph-widget").render({ container: $container, model: rawModel }) }.bind(this), ["text", "html", "widget", "options"], this.option("integrationOptions.watchMethod")); this._defaultTemplates.item = template; this._defaultTemplates.menuItem = template }, _getDefaultOptions: function() { return extend(this.callBase(), { renderAs: "topToolbar" }) }, _itemContainer: function() { return this._$toolbarItemsContainer.find(["." + TOOLBAR_BEFORE_CLASS, "." + TOOLBAR_CENTER_CLASS, "." + TOOLBAR_AFTER_CLASS].join(",")) }, _itemClass: function() { return TOOLBAR_ITEM_CLASS }, _itemDataKey: function() { return TOOLBAR_ITEM_DATA_KEY }, _buttonClass: function() { return TOOLBAR_BUTTON_CLASS }, _dimensionChanged: function() { this._arrangeItems() }, _render: function() { this._renderToolbar(); this._renderSections(); this.setAria("role", "toolbar"); this.callBase(); this._arrangeItems() }, _renderToolbar: function() { this.element().addClass(TOOLBAR_CLASS).toggleClass(TOOLBAR_BOTTOM_CLASS, "bottomToolbar" === this.option("renderAs")); this._$toolbarItemsContainer = $("<div>").addClass(TOOLBAR_ITEMS_CONTAINER_CLASS).appendTo(this.element()) }, _renderSections: function() { var $container = this._$toolbarItemsContainer, that = this; $.each(["before", "center", "after"], function() { var sectionClass = "dx-toolbar-" + this, $section = $container.find("." + sectionClass); if (!$section.length) { that["_$" + this + "Section"] = $section = $("<div>").addClass(sectionClass).appendTo($container) } }) }, _arrangeItems: function(elementWidth) { elementWidth = elementWidth || this.element().width(); this._$centerSection.css({ margin: "0 auto", "float": "none" }); var beforeRect = this._$beforeSection.get(0).getBoundingClientRect(), afterRect = this._$afterSection.get(0).getBoundingClientRect(); this._alignCenterSection(beforeRect, afterRect); var $label = this._$toolbarItemsContainer.find(TOOLBAR_LABEL_SELECTOR).eq(0), $section = $label.parent(); if (!$label.length) { return } var labelOffset = beforeRect.width ? beforeRect.width : $label.position().left, widthBeforeSection = $section.hasClass(TOOLBAR_BEFORE_CLASS) ? 0 : labelOffset, widthAfterSection = $section.hasClass(TOOLBAR_AFTER_CLASS) ? 0 : afterRect.width, elemsAtSectionWidth = 0; $section.children().not(TOOLBAR_LABEL_SELECTOR).each(function() { elemsAtSectionWidth += $(this).outerWidth() }); var freeSpace = elementWidth - elemsAtSectionWidth, labelPaddings = $label.outerWidth() - $label.width(), labelMaxWidth = Math.max(freeSpace - widthBeforeSection - widthAfterSection - labelPaddings, 0); $label.css("max-width", labelMaxWidth) }, _alignCenterSection: function(beforeRect, afterRect) { var isRTL = this.option("rtlEnabled"), leftRect = isRTL ? afterRect : beforeRect, rightRect = isRTL ? beforeRect : afterRect, centerRect = this._$centerSection.get(0).getBoundingClientRect(); if (leftRect.right > centerRect.left || centerRect.right > rightRect.left) { this._$centerSection.css({ marginLeft: leftRect.width, marginRight: rightRect.width, "float": leftRect.width > rightRect.width ? "none" : "right" }) } }, _renderItem: function(index, item, itemContainer, $after) { var location = item.location || "center", container = itemContainer || this._$toolbarItemsContainer.find(".dx-toolbar-" + location), itemHasText = Boolean(item.text) || Boolean(item.html), itemElement = this.callBase(index, item, container, $after); itemElement.toggleClass(this._buttonClass(), !itemHasText).toggleClass(TOOLBAR_LABEL_CLASS, itemHasText); return itemElement }, _renderGroupedItems: function() { var that = this; $.each(this.option("items"), function(groupIndex, group) { var groupItems = group.items, $container = $("<div>", { "class": TOOLBAR_GROUP_CLASS }), location = group.location || "center"; if (!groupItems.length) { return } $.each(groupItems, function(itemIndex, item) { that._renderItem(itemIndex, item, $container, null) }); that._$toolbarItemsContainer.find(".dx-toolbar-" + location).append($container) }) }, _renderItems: function(items) { var grouped = items.length && items[0].items; grouped ? this._renderGroupedItems() : this.callBase(items) }, _getToolbarItems: function() { return this.option("items") || [] }, _renderContentImpl: function() { var items = this._getToolbarItems(); this.element().toggleClass(TOOLBAR_MINI_CLASS, 0 === items.length); if (this._renderedItemsCount) { this._renderItems(items.slice(this._renderedItemsCount)) } else { this._renderItems(items) } }, _renderEmptyMessage: commonUtils.noop, _clean: function() { this._$toolbarItemsContainer.children().empty(); this.element().empty() }, _visibilityChanged: function(visible) { if (visible) { this._arrangeItems() } }, _isVisible: function() { return this.element().width() > 0 && this.element().height() > 0 }, _getIndexByItem: function(item) { return inArray(item, this._getToolbarItems()) }, _itemOptionChanged: function(item, property, value) { this.callBase.apply(this, [item, property, value]); this._arrangeItems() }, _optionChanged: function(args) { var name = args.name; switch (name) { case "width": this.callBase.apply(this, arguments); this._dimensionChanged(); break; case "renderAs": this._invalidate(); break; default: this.callBase.apply(this, arguments) } } }); registerComponent("dxToolbarBase", ToolbarBase); module.exports = ToolbarBase }, /*!*************************!*\ !*** ./js/ui/notify.js ***! \*************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), Action = __webpack_require__( /*! ../core/action */ 49), viewPortUtils = __webpack_require__( /*! ../core/utils/view_port */ 55), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, isPlainObject = __webpack_require__( /*! ../core/utils/type */ 12).isPlainObject, Toast = __webpack_require__( /*! ./toast */ 205); var $notify = null; var notify = function(message, type, displayTime) { var options = isPlainObject(message) ? message : { message: message }; var userHiddenAction = options.onHidden; extend(options, { type: type, displayTime: displayTime, onHidden: function(args) { args.element.remove(); new Action(userHiddenAction, { context: args.model }).execute(arguments) } }); $notify = $("<div>").appendTo(viewPortUtils.value()); new Toast($notify, options).show() }; module.exports = notify }, /*!************************!*\ !*** ./js/ui/toast.js ***! \************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../core/utils/array */ 26).inArray, pointerEvents = __webpack_require__( /*! ../events/pointer */ 76), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), Overlay = __webpack_require__( /*! ./overlay */ 109); var TOAST_CLASS = "dx-toast", TOAST_CLASS_PREFIX = TOAST_CLASS + "-", TOAST_WRAPPER_CLASS = TOAST_CLASS_PREFIX + "wrapper", TOAST_CONTENT_CLASS = TOAST_CLASS_PREFIX + "content", TOAST_MESSAGE_CLASS = TOAST_CLASS_PREFIX + "message", TOAST_ICON_CLASS = TOAST_CLASS_PREFIX + "icon", WIDGET_NAME = "dxToast", toastTypes = ["info", "warning", "error", "success"], TOAST_STACK = [], FIRST_Z_INDEX_OFFSET = 8e3, visibleToastInstance = null, POSITION_ALIASES = { top: { my: "top", at: "top", of: null, offset: "0 0" }, bottom: { my: "bottom", at: "bottom", of: null, offset: "0 -20" }, center: { my: "center", at: "center", of: null, offset: "0 0" }, right: { my: "center right", at: "center right", of: null, offset: "0 0" }, left: { my: "center left", at: "center left", of: null, offset: "0 0" } }; $(document).on(pointerEvents.down, function(e) { for (var i = TOAST_STACK.length - 1; i >= 0; i--) { if (!TOAST_STACK[i]._proxiedDocumentDownHandler(e)) { return } } }); var Toast = Overlay.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { message: "", type: "info", displayTime: 2e3, position: "bottom center", animation: { show: { type: "fade", duration: 400, from: 0, to: 1 }, hide: { type: "fade", duration: 400, to: 0 } }, shading: false, height: "auto", closeOnBackButton: false, closeOnSwipe: true, closeOnClick: false, resizeEnabled: false }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function(device) { return "win" === device.platform && device.version && 8 === device.version[0] }, options: { position: "top center", width: function() { return $(window).width() } } }, { device: function(device) { return "win" === device.platform && device.version && 10 === device.version[0] }, options: { position: "bottom right", width: "auto" } }, { device: { platform: "android" }, options: { closeOnOutsideClick: true, width: "auto", position: { at: "bottom left", my: "bottom left", offset: "20 -20" }, animation: { show: { type: "slide", duration: 200, from: { top: $(window).height() } }, hide: { type: "slide", duration: 200, to: { top: $(window).height() } } } } }, { device: function(device) { var isPhone = "phone" === device.deviceType, isAndroid = "android" === device.platform, isWin10 = "win" === device.platform && device.version && 10 === device.version[0]; return isPhone && (isAndroid || isWin10) }, options: { width: function() { return $(window).width() }, position: { at: "bottom center", my: "bottom center", offset: "0 0" } } }]) }, _init: function() { this.callBase(); this._posStringToObject() }, _renderContentImpl: function() { if (this.option("message")) { this._message = $("<div>").addClass(TOAST_MESSAGE_CLASS).text(this.option("message")).appendTo(this.content()) } this.setAria("role", "alert", this._message); if (inArray(this.option("type").toLowerCase(), toastTypes) > -1) { this.content().prepend($("<div>").addClass(TOAST_ICON_CLASS)) } this.callBase() }, _render: function() { this.callBase(); this.element().addClass(TOAST_CLASS); this._wrapper().addClass(TOAST_WRAPPER_CLASS); this._$content.addClass(TOAST_CLASS_PREFIX + String(this.option("type")).toLowerCase()); this.content().addClass(TOAST_CONTENT_CLASS); this._toggleCloseEvents("Swipe"); this._toggleCloseEvents("Click") }, _renderScrollTerminator: commonUtils.noop, _toggleCloseEvents: function(event) { var dxEvent = "dx" + event.toLowerCase(); this._$content.off(dxEvent); this.option("closeOn" + event) && this._$content.on(dxEvent, this.hide.bind(this)) }, _posStringToObject: function() { if (!commonUtils.isString(this.option("position"))) { return } var verticalPosition = this.option("position").split(" ")[0], horizontalPosition = this.option("position").split(" ")[1]; this.option("position", extend({}, POSITION_ALIASES[verticalPosition])); switch (horizontalPosition) { case "center": case "left": case "right": this.option("position").at += " " + horizontalPosition; this.option("position").my += " " + horizontalPosition } }, _show: function() { if (visibleToastInstance) { clearTimeout(visibleToastInstance._hideTimeout); visibleToastInstance.hide() } visibleToastInstance = this; return this.callBase.apply(this, arguments).done(function() { clearTimeout(this._hideTimeout); this._hideTimeout = setTimeout(this.hide.bind(this), this.option("displayTime")) }.bind(this)) }, _hide: function() { visibleToastInstance = null; return this.callBase.apply(this, arguments) }, _overlayStack: function() { return TOAST_STACK }, _zIndexInitValue: function() { return this.callBase() + FIRST_Z_INDEX_OFFSET }, _dispose: function() { clearTimeout(this._hideTimeout); visibleToastInstance = null; this.callBase() }, _optionChanged: function(args) { switch (args.name) { case "type": this._$content.removeClass(TOAST_CLASS_PREFIX + args.previousValue); this._$content.addClass(TOAST_CLASS_PREFIX + String(args.value).toLowerCase()); break; case "message": if (this._message) { this._message.text(args.value) } break; case "closeOnSwipe": this._toggleCloseEvents("Swipe"); break; case "closeOnClick": this._toggleCloseEvents("Click"); break; case "displayTime": case "position": break; default: this.callBase(args) } } }); registerComponent(WIDGET_NAME, Toast); module.exports = Toast }, /*!*******************************!*\ !*** ./js/ui/action_sheet.js ***! \*******************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), noop = __webpack_require__( /*! ../core/utils/common */ 14).noop, messageLocalization = __webpack_require__( /*! ../localization/message */ 89), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, Button = __webpack_require__( /*! ./button */ 201), CollectionWidget = __webpack_require__( /*! ./collection/ui.collection_widget.edit */ 149), Popup = __webpack_require__( /*! ./popup */ 200), Popover = __webpack_require__( /*! ./popover */ 207), BindableTemplate = __webpack_require__( /*! ./widget/bindable_template */ 166); var ACTION_SHEET_CLASS = "dx-actionsheet", ACTION_SHEET_CONTAINER_CLASS = "dx-actionsheet-container", ACTION_SHEET_POPUP_WRAPPER_CLASS = "dx-actionsheet-popup-wrapper", ACTION_SHEET_POPOVER_WRAPPER_CLASS = "dx-actionsheet-popover-wrapper", ACTION_SHEET_CANCEL_BUTTON_CLASS = "dx-actionsheet-cancel", ACTION_SHEET_ITEM_CLASS = "dx-actionsheet-item", ACTION_SHEET_ITEM_DATA_KEY = "dxActionSheetItemData", ACTION_SHEET_WITHOUT_TITLE_CLASS = "dx-actionsheet-without-title"; var ActionSheet = CollectionWidget.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { usePopover: false, target: null, title: "", showTitle: true, showCancelButton: true, cancelText: messageLocalization.format("Cancel"), onCancelClick: null, visible: false, noDataText: "", focusStateEnabled: false, selectionByClick: false }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: { platform: "ios", tablet: true }, options: { usePopover: true } }]) }, _initTemplates: function() { this.callBase(); this._defaultTemplates.item = new BindableTemplate(function($container, data) { var button = new Button($("<div>"), extend({ onClick: data && data.click }, data)); $container.append(button.element()) }, ["disabled", "icon", "text", "type", "onClick", "click"], this.option("integrationOptions.watchMethod")) }, _itemContainer: function() { return this._$itemContainer }, _itemClass: function() { return ACTION_SHEET_ITEM_CLASS }, _itemDataKey: function() { return ACTION_SHEET_ITEM_DATA_KEY }, _toggleVisibility: noop, _renderDimensions: noop, _render: function() { this.element().addClass(ACTION_SHEET_CLASS); this._createItemContainer(); this._renderPopup() }, _createItemContainer: function() { this._$itemContainer = $("<div>").addClass(ACTION_SHEET_CONTAINER_CLASS); this._renderDisabled() }, _renderDisabled: function() { this._$itemContainer.toggleClass("dx-state-disabled", this.option("disabled")) }, _renderPopup: function() { this._$popup = $("<div>").appendTo(this.element()); this._isPopoverMode() ? this._createPopover() : this._createPopup(); this._renderPopupTitle(); this._mapPopupOption("visible") }, _mapPopupOption: function(optionName) { this._popup.option(optionName, this.option(optionName)) }, _isPopoverMode: function() { return this.option("usePopover") && this.option("target") }, _renderPopupTitle: function() { this._mapPopupOption("showTitle"); this._popup._wrapper().toggleClass(ACTION_SHEET_WITHOUT_TITLE_CLASS, !this.option("showTitle")) }, _clean: function() { if (this._$popup) { this._$popup.remove() } this.callBase() }, _overlayConfig: function() { return { onInitialized: function(args) { this._popup = args.component }.bind(this), disabled: false, showTitle: true, title: this.option("title"), deferRendering: !window.angular, onContentReady: this._popupContentReadyAction.bind(this), onHidden: this.hide.bind(this) } }, _createPopover: function() { this._createComponent(this._$popup, Popover, extend(this._overlayConfig(), { width: this.option("width") || 200, height: this.option("height") || "auto", target: this.option("target") })); this._popup._wrapper().addClass(ACTION_SHEET_POPOVER_WRAPPER_CLASS) }, _createPopup: function() { this._createComponent(this._$popup, Popup, extend(this._overlayConfig(), { dragEnabled: false, width: this.option("width") || "100%", height: this.option("height") || "auto", showCloseButton: false, position: { my: "bottom", at: "bottom", of: window }, animation: { show: { type: "slide", duration: 400, from: { position: { my: "top", at: "bottom", of: window } }, to: { position: { my: "bottom", at: "bottom", of: window } } }, hide: { type: "slide", duration: 400, from: { position: { my: "bottom", at: "bottom", of: window } }, to: { position: { my: "top", at: "bottom", of: window } } } } })); this._popup._wrapper().addClass(ACTION_SHEET_POPUP_WRAPPER_CLASS) }, _popupContentReadyAction: function() { this._popup.content().append(this._$itemContainer); this._attachClickEvent(); this._attachHoldEvent(); this._renderContent(); this._renderCancelButton() }, _renderCancelButton: function() { if (this._isPopoverMode()) { return } if (this._$cancelButton) { this._$cancelButton.remove() } if (this.option("showCancelButton")) { var cancelClickAction = this._createActionByOption("onCancelClick") || noop, that = this; this._$cancelButton = $("<div>").addClass(ACTION_SHEET_CANCEL_BUTTON_CLASS).appendTo(this._popup.content()); this._createComponent(this._$cancelButton, Button, { disabled: false, text: this.option("cancelText"), onClick: function(e) { var hidingArgs = { jQueryEvent: e, cancel: false }; cancelClickAction(hidingArgs); if (!hidingArgs.cancel) { that.hide() } }, integrationOptions: {} }) } }, _attachItemClickEvent: noop, _itemClickHandler: function(e) { this.callBase(e); if (!$(e.target).is(".dx-state-disabled, .dx-state-disabled *")) { this.hide() } }, _itemHoldHandler: function(e) { this.callBase(e); if (!$(e.target).is(".dx-state-disabled, .dx-state-disabled *")) { this.hide() } }, _optionChanged: function(args) { switch (args.name) { case "width": case "height": case "visible": case "title": this._mapPopupOption(args.name); break; case "disabled": this._renderDisabled(); break; case "showTitle": this._renderPopupTitle(); break; case "showCancelButton": case "onCancelClick": case "cancelText": this._renderCancelButton(); break; case "target": case "usePopover": case "items": this._invalidate(); break; default: this.callBase(args) } }, toggle: function(showing) { var that = this, d = $.Deferred(); that._popup.toggle(showing).done(function() { that.option("visible", showing); d.resolveWith(that) }); return d.promise() }, show: function() { return this.toggle(true) }, hide: function() { return this.toggle(false) } }); registerComponent("dxActionSheet", ActionSheet); module.exports = ActionSheet }, /*!**************************!*\ !*** ./js/ui/popover.js ***! \**************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), stringUtils = __webpack_require__( /*! ../core/utils/string */ 18), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, translator = __webpack_require__( /*! ../animation/translator */ 69), positionUtils = __webpack_require__( /*! ../animation/position */ 70), commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), mathUtils = __webpack_require__( /*! ../core/utils/math */ 87), eventUtils = __webpack_require__( /*! ../events/utils */ 71), Popup = __webpack_require__( /*! ./popup */ 200); var POPOVER_CLASS = "dx-popover", POPOVER_WRAPPER_CLASS = "dx-popover-wrapper", POPOVER_ARROW_CLASS = "dx-popover-arrow", POPOVER_WITHOUT_TITLE_CLASS = "dx-popover-without-title", POSITION_FLIP_MAP = { left: "right", top: "bottom", right: "left", bottom: "top", center: "center" }, WEIGHT_OF_SIDES = { left: -1, top: -1, center: 0, right: 1, bottom: 1 }, POSITION_ALIASES = { top: { my: "bottom center", at: "top center", collision: "fit flip" }, bottom: { my: "top center", at: "bottom center", collision: "fit flip" }, right: { my: "left center", at: "right center", collision: "flip fit" }, left: { my: "right center", at: "left center", collision: "flip fit" } }, getEventName = function(that, optionName) { var optionValue = that.option(optionName); return commonUtils.isObject(optionValue) ? optionValue.name : optionValue }, getEventDelay = function(that, optionName) { var optionValue = that.option(optionName); return commonUtils.isObject(optionValue) && optionValue.delay }, attachEvent = function(that, name) { var delay, action, handler, eventName, target = that.option("target"), event = getEventName(that, name + "Event"); if (!event || that.option("disabled")) { return } eventName = eventUtils.addNamespace(event, that.NAME); action = that._createAction(function() { delay = getEventDelay(that, name + "Event"); this._clearEventTimeout("hide" === name); if (delay) { this._timeouts[name] = setTimeout(function() { that[name]() }, delay) } else { that[name]() } }.bind(that), { validatingTargetName: "target" }); handler = function(e) { action({ jQueryEvent: e, target: $(e.currentTarget) }) }; if (target.jquery || target.nodeType || commonUtils.isWindow(target)) { that["_" + name + "EventHandler"] = void 0; $(target).on(eventName, handler) } else { that["_" + name + "EventHandler"] = handler; $(document).on(eventName, target, handler) } }, detachEvent = function(that, target, name) { var eventName, event = getEventName(that, name + "Event"); if (!event) { return } eventName = eventUtils.addNamespace(event, that.NAME); if (that["_" + name + "EventHandler"]) { $(document).off(eventName, target, that["_" + name + "EventHandler"]) } else { $(target).off(eventName) } }; var Popover = Popup.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { target: window, shading: false, position: "bottom", closeOnOutsideClick: true, animation: { show: { type: "fade", from: 0, to: 1 }, hide: { type: "fade", to: 0 } }, showTitle: false, width: "auto", height: "auto", dragEnabled: false, resizeEnabled: false, fullScreen: false, closeOnTargetScroll: true, arrowPosition: "", arrowOffset: 0, boundaryOffset: { h: 10, v: 10 } }) }, _defaultOptionsRules: function() { return [{ device: { platform: "ios" }, options: { arrowPosition: { boundaryOffset: { h: 20, v: -10 }, collision: "fit" } } }] }, _init: function() { this.callBase(); this._renderArrow(); this._timeouts = {}; this.element().addClass(POPOVER_CLASS); this._wrapper().addClass(POPOVER_WRAPPER_CLASS) }, _render: function() { this.callBase.apply(this, arguments); this._detachEvents(this.option("target")); this._attachEvents() }, _detachEvents: function(target) { detachEvent(this, target, "show"); detachEvent(this, target, "hide") }, _attachEvents: function() { attachEvent(this, "show"); attachEvent(this, "hide") }, _renderArrow: function() { this._$arrow = $("<div>").addClass(POPOVER_ARROW_CLASS).prependTo(this.overlayContent()) }, _documentDownHandler: function(e) { if (this._isOutsideClick(e)) { return this.callBase(e) } return true }, _isOutsideClick: function(e) { return !$(e.target).closest(this.option("target")).length }, _animate: function(animation) { if (animation && animation.to && "object" === typeof animation.to) { extend(animation.to, { position: this._getContainerPosition() }) } this.callBase.apply(this, arguments) }, _stopAnimation: function() { this.callBase.apply(this, arguments) }, _renderTitle: function() { this._wrapper().toggleClass(POPOVER_WITHOUT_TITLE_CLASS, !this.option("showTitle")); this.callBase() }, _renderPosition: function() { this.callBase(); this._renderOverlayPosition() }, _renderOverlayBoundaryOffset: commonUtils.noop, _renderOverlayPosition: function() { this._resetOverlayPosition(); this._updateContentSize(); var contentPosition = this._getContainerPosition(); var resultLocation = positionUtils.setup(this._$content, contentPosition); var positionSide = this._getSideByLocation(resultLocation); this._togglePositionClass("dx-position-" + positionSide); this._toggleFlippedClass(resultLocation.h.flip, resultLocation.v.flip); this._renderArrowPosition(positionSide) }, _resetOverlayPosition: function() { this._setContentHeight(true); this._togglePositionClass("dx-position-" + this._positionSide); translator.move(this._$content, { left: 0, top: 0 }); this._$arrow.css({ top: "auto", right: "auto", bottom: "auto", left: "auto" }) }, _updateContentSize: function() { if (!this._$popupContent) { return } var containerLocation = positionUtils.calculate(this._$content, this._getContainerPosition()); if (containerLocation.h.oversize > 0 && this._isHorizontalSide() && !containerLocation.h.fit) { var newContainerWidth = this._$content.width() - containerLocation.h.oversize; this._$content.width(newContainerWidth) } if (containerLocation.v.oversize > 0 && this._isVerticalSide() && !containerLocation.v.fit) { var newOverlayContentHeight = this._$content.height() - containerLocation.v.oversize, newPopupContentHeight = this._$popupContent.height() - containerLocation.v.oversize; this._$content.height(newOverlayContentHeight); this._$popupContent.height(newPopupContentHeight) } }, _getContainerPosition: function() { var offset = stringUtils.pairToObject(this._position.offset || ""); var hOffset = offset.h; var vOffset = offset.v; var isPopoverInside = this._isPopoverInside(); var sign = (isPopoverInside ? -1 : 1) * WEIGHT_OF_SIDES[this._positionSide]; var arrowSizeCorrection = this._getContentBorderWidth(this._positionSide); if (this._isVerticalSide()) { vOffset += sign * (this._$arrow.height() - arrowSizeCorrection) } else { if (this._isHorizontalSide()) { hOffset += sign * (this._$arrow.width() - arrowSizeCorrection) } } return extend({}, this._position, { offset: hOffset + " " + vOffset }) }, _getContentBorderWidth: function(side) { var borderWidth = this._$content.css("border-" + side + "-width"); return parseInt(borderWidth) || 0 }, _getSideByLocation: function(location) { var isFlippedByVertical = location.v.flip; var isFlippedByHorizontal = location.h.flip; return this._isVerticalSide() && isFlippedByVertical || this._isHorizontalSide() && isFlippedByHorizontal || this._isPopoverInside() ? POSITION_FLIP_MAP[this._positionSide] : this._positionSide }, _togglePositionClass: function(positionClass) { this._$wrapper.removeClass("dx-position-left dx-position-right dx-position-top dx-position-bottom").addClass(positionClass) }, _toggleFlippedClass: function(isFlippedHorizontal, isFlippedVertical) { this._$wrapper.toggleClass("dx-popover-flipped-horizontal", isFlippedHorizontal).toggleClass("dx-popover-flipped-vertical", isFlippedVertical) }, _renderArrowPosition: function(side) { this._$arrow.css(POSITION_FLIP_MAP[side], -(this._isVerticalSide(side) ? this._$arrow.height() : this._$arrow.width())); var axis = this._isVerticalSide(side) ? "left" : "top"; var sizeProperty = this._isVerticalSide(side) ? "outerWidth" : "outerHeight"; var $target = $(this._position.of); var targetOffset = positionUtils.offset($target) || { top: 0, left: 0 }; var contentOffset = positionUtils.offset(this._$content); var arrowSize = this._$arrow[sizeProperty](); var contentLocation = contentOffset[axis]; var contentSize = this._$content[sizeProperty](); var targetLocation = targetOffset[axis]; var targetSize = $target.get(0).preventDefault ? 0 : $target[sizeProperty](); var min = Math.max(contentLocation, targetLocation); var max = Math.min(contentLocation + contentSize, targetLocation + targetSize); var arrowLocation; if ("start" === this.option("arrowPosition")) { arrowLocation = min - contentLocation } else { if ("end" === this.option("arrowPosition")) { arrowLocation = max - contentLocation - arrowSize } else { arrowLocation = (min + max) / 2 - contentLocation - arrowSize / 2 } } var borderWidth = this._getContentBorderWidth(side); var finalArrowLocation = mathUtils.fitIntoRange(arrowLocation - borderWidth + this.option("arrowOffset"), borderWidth, contentSize - arrowSize - 2 * borderWidth); this._$arrow.css(axis, finalArrowLocation) }, _isPopoverInside: function() { var position = this._getPosition(); var my = positionUtils.setup.normalizeAlign(position.my); var at = positionUtils.setup.normalizeAlign(position.at); return my.h === at.h && my.v === at.v }, _getPosition: function() { var position = this.option("position"); if (commonUtils.isString(position)) { position = extend({}, POSITION_ALIASES[position]) } return position }, _setContentHeight: function(fullUpdate) { if (fullUpdate) { this.callBase() } }, _renderShadingPosition: function() { if (this.option("shading")) { this._$wrapper.css({ top: 0, left: 0 }) } }, _renderShadingDimensions: function() { if (this.option("shading")) { this._$wrapper.css({ width: "100%", height: "100%" }) } }, _normalizePosition: function() { var position = extend({}, this._getPosition()); if (!position.of) { position.of = this.option("target") } if (!position.collision) { position.collision = "flip" } if (!position.boundaryOffset) { position.boundaryOffset = this.option("boundaryOffset") } this._positionSide = this._getDisplaySide(position); this._position = position }, _getDisplaySide: function(position) { var my = positionUtils.setup.normalizeAlign(position.my), at = positionUtils.setup.normalizeAlign(position.at); var weightSign = WEIGHT_OF_SIDES[my.h] === WEIGHT_OF_SIDES[at.h] && WEIGHT_OF_SIDES[my.v] === WEIGHT_OF_SIDES[at.v] ? -1 : 1, horizontalWeight = Math.abs(WEIGHT_OF_SIDES[my.h] - weightSign * WEIGHT_OF_SIDES[at.h]), verticalWeight = Math.abs(WEIGHT_OF_SIDES[my.v] - weightSign * WEIGHT_OF_SIDES[at.v]); return horizontalWeight > verticalWeight ? at.h : at.v }, _isVerticalSide: function(side) { side = side || this._positionSide; return "top" === side || "bottom" === side }, _isHorizontalSide: function(side) { side = side || this._positionSide; return "left" === side || "right" === side }, _clearEventTimeout: function(visibility) { clearTimeout(this._timeouts[visibility ? "show" : "hide"]) }, _clean: function() { this._detachEvents(this.option("target")); this.callBase.apply(this, arguments) }, _optionChanged: function(args) { switch (args.name) { case "showTitle": case "title": case "titleTemplate": this.callBase(args); this._renderGeometry(); break; case "boundaryOffset": case "arrowPosition": case "arrowOffset": this._renderGeometry(); break; case "fullScreen": if (args.value) { this.option("fullScreen", false) } break; case "target": args.previousValue && this._detachEvents(args.previousValue); this.callBase(args); break; case "showEvent": case "hideEvent": this._invalidate(); break; case "visible": this._clearEventTimeout(args.value); this.callBase(args); break; default: this.callBase(args) } }, show: function(target) { if (target) { this.option("target", target) } return this.callBase() } }); registerComponent("dxPopover", Popover); module.exports = Popover }, /*!*******************************!*\ !*** ./js/ui/autocomplete.js ***! \*******************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), noop = __webpack_require__( /*! ../core/utils/common */ 14).noop, registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, DropDownList = __webpack_require__( /*! ./drop_down_editor/ui.drop_down_list */ 209), themes = __webpack_require__( /*! ./themes */ 143); var AUTOCOMPLETE_CLASS = "dx-autocomplete", AUTOCOMPLETE_POPUP_WRAPPER_CLASS = "dx-autocomplete-popup-wrapper"; var Autocomplete = DropDownList.inherit({ _supportedKeys: function() { var item = this._list ? this._list.option("focusedElement") : null, parent = this.callBase(); return extend({}, parent, { upArrow: function(e) { e.preventDefault(); e.stopPropagation(); if (item && !item.prev().length) { this._clearFocusedItem(); return false } return true }, downArrow: function(e) { e.preventDefault(); e.stopPropagation(); if (item && !item.next().length) { this._clearFocusedItem(); return false } return true }, enter: function() { if (!item) { this.close() } parent.enter.apply(this, arguments); return this.option("opened") } }) }, _setDeprecatedOptions: function() { this.callBase(); extend(this._deprecatedOptions, { displayExpr: { since: "15.2", alias: "valueExpr" } }) }, _getDefaultOptions: function() { return extend(this.callBase(), { minSearchLength: 1, maxItemCount: 10, noDataText: "", showDropDownButton: false, searchEnabled: true }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function() { return /android5/.test(themes.current()) }, options: { popupPosition: { offset: { h: -16, v: -8 } } } }]) }, _render: function() { this.callBase(); this.element().addClass(AUTOCOMPLETE_CLASS); this.setAria("autocomplete", "inline") }, _loadValue: function() { return $.Deferred().resolve(this.option("value")) }, _displayGetterExpr: function() { return this.option("valueExpr") }, _setSelectedItem: function(item) { this.callBase(item); this.option("displayValue", this.option("value")) }, _popupConfig: function() { return extend(this.callBase(), { closeOnOutsideClick: function(e) { return !$(e.target).closest(this.element()).length }.bind(this) }) }, _renderDimensions: function() { this.callBase(); this._setPopupOption("width") }, _popupWrapperClass: function() { return this.callBase() + " " + AUTOCOMPLETE_POPUP_WRAPPER_CLASS }, _listConfig: function() { return extend(this.callBase(), { pageLoadMode: "none", indicateLoading: false }) }, _listItemClickHandler: function(e) { var value = this._displayGetter(e.itemData); this.option("value", value); this.close() }, _setListDataSource: function() { if (!this._list) { return } this._list.option("selectedItems", []); this.callBase() }, _refreshSelected: noop, _searchCanceled: function() { this.callBase(); this.close() }, _dataSourceOptions: function() { return { paginate: true } }, _searchDataSource: function() { this._dataSource.pageSize(this.option("maxItemCount")); this.callBase(); this._clearFocusedItem() }, _clearFocusedItem: function() { if (this._list) { this._list.option("focusedElement", null); this._list.option("selectedIndex", -1) } }, _renderValueEventName: function() { return "input keyup" }, _searchHandler: function(e) { if (this._isControlKey(e.key)) { return } this.callBase(e) }, _optionChanged: function(args) { if ("maxItemCount" === args.name) { this._searchDataSource() } else { this.callBase(args) } }, reset: function() { this.callBase(); this.close() } }); registerComponent("dxAutocomplete", Autocomplete); module.exports = Autocomplete }, /*!*****************************************************!*\ !*** ./js/ui/drop_down_editor/ui.drop_down_list.js ***! \*****************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Guid = __webpack_require__( /*! ../../core/guid */ 151), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, DropDownEditor = __webpack_require__( /*! ./ui.drop_down_editor */ 210), List = __webpack_require__( /*! ../list */ 218), errors = __webpack_require__( /*! ../widget/ui.errors */ 22), eventUtils = __webpack_require__( /*! ../../events/utils */ 71), devices = __webpack_require__( /*! ../../core/devices */ 53), DataExpressionMixin = __webpack_require__( /*! ../editor/ui.data_expression */ 251), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), themes = __webpack_require__( /*! ../themes */ 143), ChildDefaultTemplate = __webpack_require__( /*! ../widget/child_default_template */ 100); var LIST_ITEM_SELECTOR = ".dx-list-item", LIST_ITEM_DATA_KEY = "dxListItemData", DROPDOWNLIST_POPUP_WRAPPER_CLASS = "dx-dropdownlist-popup-wrapper", SKIP_GESTURE_EVENT_CLASS = "dx-skip-gesture-event", SEARCH_MODES = ["startswith", "contains", "endwith", "notcontains"]; var DropDownList = DropDownEditor.inherit({ _supportedKeys: function() { var parent = this.callBase(); return extend({}, parent, { tab: function() { if (this.option("opened") && "instantly" === this.option("applyValueMode")) { var $focusedItem = this._list.option("focusedElement"); $focusedItem && this._setSelectedElement($focusedItem) } else { this._focusTarget().focusout() } parent.tab.apply(this, arguments) }, space: commonUtils.noop, home: commonUtils.noop, end: commonUtils.noop }) }, _setSelectedElement: function($element) { var value = this._valueGetter(this._list._getItemData($element)); this._setValue(value) }, _setValue: function(value) { this.option("value", value) }, _setDeprecatedOptions: function() { this.callBase(); extend(this._deprecatedOptions, { pagingEnabled: { since: "15.1", message: "Use the 'dataSource.paginate' option instead" } }) }, _getDefaultOptions: function() { return extend(this.callBase(), extend(DataExpressionMixin._dataExpressionDefaultOptions(), { displayValue: void 0, searchEnabled: false, searchMode: "contains", searchTimeout: 500, minSearchLength: 0, searchExpr: null, valueChangeEvent: "input change keyup", selectedItem: null, pagingEnabled: void 0, noDataText: messageLocalization.format("dxCollectionWidget-noDataText"), onSelectionChanged: null, onItemClick: commonUtils.noop, showDataBeforeSearch: false, grouped: false, groupTemplate: "group", popupPosition: { my: "left top", at: "left bottom", offset: { h: 0, v: 0 }, collision: "flip" }, popupWidthExtension: 0 })) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function(device) { return "win" === device.platform && device.version && 8 === device.version[0] }, options: { popupPosition: { offset: { v: -6 } } } }, { device: function() { return /android5/.test(themes.current()) }, options: { popupWidthExtension: 32 } }, { device: { platform: "ios" }, options: { popupPosition: { offset: { v: -1 } } } }, { device: { platform: "generic" }, options: { buttonsLocation: "bottom center" } }]) }, _setOptionsByReference: function() { this.callBase(); extend(this._optionsByReference, { value: true, selectedItem: true, displayValue: true }) }, _init: function() { this.callBase(); this._initDataExpressions(); this._initActions(); this._setListDataSource(); this._validateSearchMode(); this._clearSelectedItem() }, _initActions: function() { this._initContentReadyAction(); this._initSelectionChangedAction(); this._initItemClickAction() }, _initContentReadyAction: function() { this._contentReadyAction = this._createActionByOption("onContentReady", { excludeValidators: ["disabled", "readOnly"] }) }, _initSelectionChangedAction: function() { this._selectionChangedAction = this._createActionByOption("onSelectionChanged", { excludeValidators: ["disabled", "readOnly"] }) }, _initItemClickAction: function() { this._itemClickAction = this._createActionByOption("onItemClick") }, _initTemplates: function() { this.callBase(); this._defaultTemplates.item = new ChildDefaultTemplate("item", this) }, _renderField: function() { this.callBase(); this._input().on("input", this._setFocusPolicy.bind(this)) }, _preventFocusOnPopup: function(e) { if (this._list && this._list.initialOption("focusStateEnabled")) { e.preventDefault() } }, _createPopup: function() { this.callBase(); this._popup._wrapper().addClass(this._popupWrapperClass()); this._popup.content().off("mousedown").on("mousedown", this._preventFocusOnPopup.bind(this)) }, _popupWrapperClass: function() { return DROPDOWNLIST_POPUP_WRAPPER_CLASS }, _renderInputValue: function() { var value = this._getCurrentValue(); return this._loadInputValue(value, this._setSelectedItem.bind(this)).always(this.callBase.bind(this, value)) }, _loadInputValue: function(value, callback) { return this._loadItem(value).always(callback) }, _loadItem: function(value) { var selectedItem = commonUtils.grep(this._getPlainItems(this.option("items")) || [], function(item) { return this._isValueEquals(this._valueGetter(item), value) }.bind(this))[0]; return void 0 !== selectedItem ? $.Deferred().resolve(selectedItem).promise() : this._loadValue(value) }, _getPlainItems: function(items) { var plainItems = []; for (var i = 0; i < items.length; i++) { if (items[i] && items[i].items) { plainItems = plainItems.concat(items[i].items) } else { plainItems.push(items[i]) } } return plainItems }, _setSelectedItem: function(item) { var displayValue = this._displayValue(item); this.option("selectedItem", commonUtils.ensureDefined(item, null)); this.option("displayValue", displayValue) }, _displayValue: function(item) { return this._displayGetter(item) }, _refreshSelected: function() { this._listItemElements().each(function(_, itemElement) { var $itemElement = $(itemElement); var itemValue = this._valueGetter($itemElement.data(LIST_ITEM_DATA_KEY)); var isItemSelected = this._isSelectedValue(itemValue); if (isItemSelected) { this._list.selectItem($itemElement) } else { this._list.unselectItem($itemElement) } }.bind(this)) }, _popupShownHandler: function() { this.callBase(); this._setFocusPolicy() }, _setFocusPolicy: function() { if (!this.option("focusStateEnabled") || !this._list) { return } this._list.option("focusedElement", null) }, _isSelectedValue: function(value) { return this._isValueEquals(value, this.option("value")) }, _validateSearchMode: function() { var searchMode = this.option("searchMode"), normalizedSearchMode = searchMode.toLowerCase(); if (inArray(normalizedSearchMode, SEARCH_MODES) < 0) { throw errors.Error("E1019", searchMode) } }, _clearSelectedItem: function() { this.option("selectedItem", null) }, _processDataSourceChanging: function() { this._setListDataSource(); this._renderInputValue().fail(function() { if (this._isCustomValueAllowed()) { return } this._clearSelectedItem() }.bind(this)) }, _isCustomValueAllowed: function() { return this.option("displayCustomValue") }, reset: function() { this.callBase(); this._clearFilter(); this._clearSelectedItem() }, _listItemElements: function() { return this._$list ? this._$list.find(LIST_ITEM_SELECTOR) : $() }, _popupConfig: function() { var that = this; return extend(this.callBase(), { templatesRenderAsynchronously: false, width: this.option("width"), onShowing: function() { that.element().addClass(SKIP_GESTURE_EVENT_CLASS) }, onHidden: function() { that.element().removeClass(SKIP_GESTURE_EVENT_CLASS) }, height: "auto", maxHeight: this._getMaxHeight.bind(this) }) }, _renderPopupContent: function() { this._renderList() }, _attachChildKeyboardEvents: function() { this._childKeyboardProcessor = this._keyboardProcessor.attachChildProcessor(); this._setListOption("_keyboardProcessor", this._childKeyboardProcessor) }, _fireContentReadyAction: commonUtils.noop, _setAriaTargetForList: function() { this._list._getAriaTarget = this._getAriaTarget.bind(this); this._list.setAria("role", "combobox") }, _renderList: function() { this._listId = "dx-" + (new Guid)._value; var $list = this._$list = $("<div>", { id: this._listId }).appendTo(this._popup.content()); this._list = this._createComponent($list, List, this._listConfig()); this._refreshList(); this._setAriaTargetForList() }, _renderOpenedState: function() { this.callBase(); var opened = this.option("opened") || void 0; this.setAria({ activedescendant: opened && this._list.getFocusedItemId(), owns: opened && this._listId }) }, _refreshList: function() { if (this._list && this._shouldRefreshDataSource()) { this._setListDataSource() } }, _shouldRefreshDataSource: function() { var dataSourceProvided = !!this._list.option("dataSource"); return dataSourceProvided !== this._needPassDataSourceToList() }, _isDesktopDevice: function() { return "desktop" === devices.real().deviceType }, _getListKeyExpr: function() { var valueExpr = this.option("valueExpr"), isValueExprField = commonUtils.isString(valueExpr) && "this" !== valueExpr; return isValueExprField ? valueExpr : null }, _listConfig: function() { var options = { selectionMode: "single", _templates: this.option("_templates"), templateProvider: this.option("templateProvider"), noDataText: this.option("noDataText"), grouped: this.option("grouped"), onContentReady: this._listContentReadyHandler.bind(this), itemTemplate: this._getTemplateByOption("itemTemplate"), indicateLoading: false, keyExpr: this._getListKeyExpr(), groupTemplate: this.option("groupTemplate"), tabIndex: -1, onItemClick: this._listItemClickAction.bind(this), dataSource: this._getDataSource(), _keyboardProcessor: this._childKeyboardProcessor, hoverStateEnabled: this._isDesktopDevice() ? this.option("hoverStateEnabled") : false, focusStateEnabled: this._isDesktopDevice() ? this.option("focusStateEnabled") : false }; return options }, _getDataSource: function() { return this._needPassDataSourceToList() ? this._dataSource : null }, _dataSourceOptions: function() { this._suppressDeprecatedWarnings(); var pagingEnabled = this.option("pagingEnabled"); this._resumeDeprecatedWarnings(); return { paginate: commonUtils.ensureDefined(pagingEnabled, false) } }, _dataSourceFromUrlLoadMode: function() { return "raw" }, _listContentReadyHandler: function() { this._list = this._list || this._$list.dxList("instance"); this._dimensionChanged(); this._contentReadyAction() }, _setListOption: function(optionName, value) { this._setWidgetOption("_list", arguments) }, _listItemClickAction: function(e) { this._listItemClickHandler(e); this._itemClickAction(e) }, _listItemClickHandler: commonUtils.noop, _setListDataSource: function() { if (!this._list) { return } this._setListOption("dataSource", this._getDataSource()); if (!this._needPassDataSourceToList()) { this._setListOption("items", []) } }, _needPassDataSourceToList: function() { return this.option("showDataBeforeSearch") || this._isMinSearchLengthExceeded() }, _isMinSearchLengthExceeded: function() { return this._searchValue().toString().length >= this.option("minSearchLength") }, _searchValue: function() { return this._input().val() || "" }, _getSearchEvent: function() { return eventUtils.addNamespace("keyup", this.NAME + "Search") }, _renderEvents: function() { this.callBase(); if (this._shouldRenderSearchEvent()) { this._input().on(this._getSearchEvent(), this._searchHandler.bind(this)) } }, _shouldRenderSearchEvent: function() { return this.option("searchEnabled") }, _refreshEvents: function() { this._input().off(this._getSearchEvent()); this.callBase() }, _searchHandler: function() { if (!this._isMinSearchLengthExceeded()) { this._searchCanceled(); return } var searchTimeout = this.option("searchTimeout"); if (searchTimeout) { this._clearSearchTimer(); this._searchTimer = setTimeout(this._searchDataSource.bind(this), searchTimeout) } else { this._searchDataSource() } }, _searchCanceled: function() { this._clearSearchTimer(); if (this._needPassDataSourceToList()) { this._filterDataSource(null) } this._refreshList() }, _searchDataSource: function() { this._filterDataSource(this._searchValue()) }, _filterDataSource: function(searchValue) { this._clearSearchTimer(); var dataSource = this._dataSource; dataSource.searchExpr(this.option("searchExpr") || this._displayGetterExpr()); dataSource.searchOperation(this.option("searchMode")); dataSource.searchValue(searchValue); return dataSource.load().done(this._dataSourceFiltered.bind(this, searchValue)) }, _clearFilter: function() { var dataSource = this._dataSource; dataSource && dataSource.searchValue() && dataSource.searchValue(null) }, _dataSourceFiltered: function() { this._refreshList(); this._refreshPopupVisibility() }, _refreshPopupVisibility: function() { if (this.option("readOnly")) { return } this.option("opened", this._hasItemsToShow()); if (this.option("opened")) { this._dimensionChanged() } }, _dataSourceChangedHandler: function(newItems) { if (0 === this._dataSource.pageIndex()) { this.option().items = newItems } else { this.option().items = this.option().items.concat(newItems) } }, _hasItemsToShow: function() { var resultItems = this._dataSource && this._dataSource.items() || []; var resultAmount = resultItems.length; var isMinSearchLengthExceeded = this._needPassDataSourceToList(); return isMinSearchLengthExceeded && resultAmount && this._hasFocusClass() }, _clearSearchTimer: function() { clearTimeout(this._searchTimer); delete this._searchTimer }, _popupShowingHandler: function() { this._dimensionChanged() }, _dimensionChanged: function() { this._popup && this._updatePopupDimensions() }, _updatePopupDimensions: function() { this._updatePopupWidth(); this._updatePopupHeight() }, _updatePopupWidth: function() { this._setPopupOption("width", this.element().outerWidth() + this.option("popupWidthExtension")) }, _needPopupRepaint: function() { var currentPageIndex = this._dataSource.pageIndex(), needRepaint = commonUtils.isDefined(this._pageIndex) && currentPageIndex <= this._pageIndex; this._pageIndex = currentPageIndex; return needRepaint }, _updatePopupHeight: function() { if (this._needPopupRepaint()) { this._popup.repaint() } this._list && this._list.updateDimensions() }, _getMaxHeight: function() { var $element = this.element(), offset = $element.offset(), windowHeight = $(window).height(), maxHeight = Math.max(offset.top, windowHeight - offset.top - $element.outerHeight()); return Math.min(.5 * windowHeight, maxHeight) }, _clean: function() { if (this._list) { delete this._list } this.callBase() }, _dispose: function() { this._clearSearchTimer(); this.callBase() }, _setCollectionWidgetOption: function() { this._setListOption.apply(this, arguments) }, _optionChanged: function(args) { this._dataExpressionOptionChanged(args); switch (args.name) { case "hoverStateEnabled": case "focusStateEnabled": this._isDesktopDevice() && this._setListOption(args.name, args.value); this.callBase(args); break; case "items": if (!this.option("dataSource")) { this._processDataSourceChanging() } break; case "dataSource": this._processDataSourceChanging(); break; case "valueExpr": this._renderValue(); this._setListOption("keyExpr", this._getListKeyExpr()); break; case "displayExpr": this._renderValue(); break; case "searchMode": this._validateSearchMode(); break; case "minSearchLength": this._refreshList(); break; case "searchEnabled": case "showDataBeforeSearch": case "searchExpr": case "pagingEnabled": this._invalidate(); break; case "onContentReady": this._initContentReadyAction(); break; case "onSelectionChanged": this._initSelectionChangedAction(); break; case "onItemClick": this._initItemClickAction(); break; case "grouped": case "groupTemplate": case "noDataText": this._setListOption(args.name); break; case "displayValue": this.option("text", args.value); break; case "itemTemplate": case "searchTimeout": case "popupWidthExtension": break; case "selectedItem": this._selectionChangedAction({ selectedItem: args.value }); break; default: this.callBase(args) } } }).include(DataExpressionMixin); registerComponent("dxDropDownList", DropDownList); module.exports = DropDownList }, /*!*******************************************************!*\ !*** ./js/ui/drop_down_editor/ui.drop_down_editor.js ***! \*******************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Guid = __webpack_require__( /*! ../../core/guid */ 151), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), isDefined = commonUtils.isDefined, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, errors = __webpack_require__( /*! ../widget/ui.errors */ 22), positionUtils = __webpack_require__( /*! ../../animation/position */ 70), getDefaultAlignment = __webpack_require__( /*! ../../core/utils/position */ 107).getDefaultAlignment, messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), Button = __webpack_require__( /*! ../button */ 201), eventUtils = __webpack_require__( /*! ../../events/utils */ 71), TextBox = __webpack_require__( /*! ../text_box */ 211), clickEvent = __webpack_require__( /*! ../../events/click */ 75), FunctionTemplate = __webpack_require__( /*! ../widget/function_template */ 98), Popup = __webpack_require__( /*! ../popup */ 200); var DROP_DOWN_EDITOR_CLASS = "dx-dropdowneditor", DROP_DOWN_EDITOR_INPUT_WRAPPER_CLASS = "dx-dropdowneditor-input-wrapper", DROP_DOWN_EDITOR_BUTTON_CLASS = "dx-dropdowneditor-button", DROP_DOWN_EDITOR_BUTTON_ICON = "dx-dropdowneditor-icon", DROP_DOWN_EDITOR_OVERLAY = "dx-dropdowneditor-overlay", DROP_DOWN_EDITOR_OVERLAY_FLIPPED = "dx-dropdowneditor-overlay-flipped", DROP_DOWN_EDITOR_ACTIVE = "dx-dropdowneditor-active", DROP_DOWN_EDITOR_BUTTON_VISIBLE = "dx-dropdowneditor-button-visible", DROP_DOWN_EDITOR_FIELD_CLICKABLE = "dx-dropdowneditor-field-clickable"; var DropDownEditor = TextBox.inherit({ _supportedKeys: function() { return extend({}, this.callBase(), { tab: function(e) { if (!this.option("opened")) { return } if ("instantly" === this.option("applyValueMode")) { this.close(); return } var $focusableElement = e.shiftKey ? this._getLastPopupElement() : this._getFirstPopupElement(); $focusableElement && $focusableElement.focus(); e.preventDefault() }, escape: function(e) { if (this.option("opened")) { e.preventDefault() } this.close() }, upArrow: function(e) { e.preventDefault(); e.stopPropagation(); if (e.altKey) { this.close(); return false } return true }, downArrow: function(e) { e.preventDefault(); e.stopPropagation(); if (e.altKey) { this._validatedOpening(); return false } return true }, enter: function(e) { if (this.option("opened")) { e.preventDefault(); this._valueChangeEventHandler(e) } return true } }) }, _setDeprecatedOptions: function() { this.callBase(); extend(this._deprecatedOptions, { fieldEditEnabled: { since: "16.1", alias: "acceptCustomValue" }, showDropButton: { since: "17.1", alias: "showDropDownButton" } }) }, _getDefaultOptions: function() { return extend(this.callBase(), { value: null, onOpened: null, onClosed: null, opened: false, acceptCustomValue: true, applyValueMode: "instantly", deferRendering: true, activeStateEnabled: true, dropDownButtonTemplate: "dropDownButton", fieldTemplate: null, contentTemplate: null, openOnFieldClick: false, showDropDownButton: true, popupPosition: this._getDefaultPopupPosition(), onPopupInitialized: null, applyButtonText: messageLocalization.format("OK"), cancelButtonText: messageLocalization.format("Cancel"), buttonsLocation: "default", showPopupTitle: false }) }, _getDefaultPopupPosition: function() { var position = getDefaultAlignment(this.option("rtlEnabled")); return { offset: { h: 0, v: -1 }, my: position + " top", at: position + " bottom", collision: "flip flip" } }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function(device) { var isGeneric = "generic" === device.platform, isWin10 = "win" === device.platform && device.version && 10 === device.version[0]; return isGeneric || isWin10 }, options: { popupPosition: { offset: { v: 0 } } } }]) }, _inputWrapper: function() { return this.element().find("." + DROP_DOWN_EDITOR_INPUT_WRAPPER_CLASS) }, _init: function() { this.callBase(); this._initVisibilityActions(); this._initPopupInitializedAction() }, _initVisibilityActions: function() { this._openAction = this._createActionByOption("onOpened", { excludeValidators: ["disabled", "readOnly"] }); this._closeAction = this._createActionByOption("onClosed", { excludeValidators: ["disabled", "readOnly"] }) }, _initPopupInitializedAction: function() { this._popupInitializedAction = this._createActionByOption("onPopupInitialized", { excludeValidators: ["disabled", "readOnly", "designMode"] }) }, _render: function() { this.callBase(); this._renderOpenHandler(); this.element().addClass(DROP_DOWN_EDITOR_CLASS); this._renderOpenedState(); this.setAria("role", "combobox") }, _renderContentImpl: function() { if (!this.option("deferRendering")) { this._createPopup() } }, _renderInput: function() { this.callBase(); this.element().wrapInner($("<div>").addClass(DROP_DOWN_EDITOR_INPUT_WRAPPER_CLASS)); this._$container = this.element().children().eq(0); this.setAria({ haspopup: "true", autocomplete: "list" }) }, _readOnlyPropValue: function() { return !this.option("acceptCustomValue") || this.callBase() }, _cleanFocusState: function() { this.callBase(); if (this.option("fieldTemplate")) { this._input().off("focusin focusout beforeactivate") } }, _renderField: function() { var fieldTemplate = this._getTemplateByOption("fieldTemplate"); if (!(fieldTemplate && this.option("fieldTemplate"))) { return } this._renderTemplatedField(fieldTemplate, this._fieldRenderData()) }, _renderTemplatedField: function(fieldTemplate, data) { var isFocused = this._input().is(":focus"); this._resetFocus(isFocused); var $container = this._$container; $container.empty(); this._$dropDownButton = null; this._$clearButton = null; fieldTemplate.render({ model: data, container: $container }); if (!this._input().length) { throw errors.Error("E1010") } this._refreshEvents(); this._refreshValueChangeEvent(); isFocused && this._input().focus(); this._renderFocusState() }, _resetFocus: function(isFocused) { this._cleanFocusState(); isFocused && this._input().focusout() }, _fieldRenderData: function() { return this.option("value") }, _renderInputAddons: function() { this._renderField(); this.callBase(); this._renderDropDownButton() }, _renderDropDownButton: function() { if (this._$dropDownButton) { this._$dropDownButton.remove(); this._$dropDownButton = null } var showDropDownButton = this.option("showDropDownButton"); this.element().toggleClass(DROP_DOWN_EDITOR_BUTTON_VISIBLE, showDropDownButton); if (!showDropDownButton) { return } this._$dropDownButton = this._createDropDownButton(); this._attachDropDownButtonClickHandler() }, _attachDropDownButtonClickHandler: function() { if (this.option("showDropDownButton") && !this.option("openOnFieldClick")) { this._$dropDownButton.dxButton("option", "onClick", this._openHandler.bind(this)) } }, _initTemplates: function() { this.callBase(); this._defaultTemplates.dropDownButton = new FunctionTemplate(function(options) { var $icon = $("<div>").addClass(DROP_DOWN_EDITOR_BUTTON_ICON); options.container.append($icon) }, this) }, _createDropDownButton: function() { var $button = $("<div>").addClass(DROP_DOWN_EDITOR_BUTTON_CLASS).prependTo(this._buttonsContainer()); this._createComponent($button, Button, { focusStateEnabled: false, hoverStateEnabled: false, activeStateEnabled: false, disabled: this.option("readOnly"), useInkRipple: false, template: this._getTemplateByOption("dropDownButtonTemplate") }); $button.removeClass("dx-button"); $button.on("mousedown", function(e) { e.preventDefault() }); return $button }, _renderOpenHandler: function() { var that = this, $inputWrapper = that.element().find("." + DROP_DOWN_EDITOR_INPUT_WRAPPER_CLASS), eventName = eventUtils.addNamespace(clickEvent.name, that.NAME), openOnFieldClick = that.option("openOnFieldClick"); $inputWrapper.off(eventName).on(eventName, that._getInputClickHandler(openOnFieldClick)); that.element().toggleClass(DROP_DOWN_EDITOR_FIELD_CLICKABLE, openOnFieldClick); if (openOnFieldClick) { that._openOnFieldClickAction = that._createAction(that._openHandler.bind(that)) } }, _getInputClickHandler: function(openOnFieldClick) { var that = this; return openOnFieldClick ? function(e) { that._executeOpenAction(e) } : function(e) { that._focusInput() } }, _openHandler: function() { this._toggleOpenState() }, _executeOpenAction: function(e) { this._openOnFieldClickAction({ jQueryEvent: e }) }, _keyboardEventBindingTarget: function() { return this._input() }, _focusInput: function() { if (this.option("disabled")) { return false } this._input().focus(); return true }, _toggleOpenState: function(isVisible) { if (!this._focusInput()) { return } if (!this.option("readOnly")) { isVisible = arguments.length ? isVisible : !this.option("opened"); this.option("opened", isVisible) } }, _renderOpenedState: function() { var opened = this.option("opened"); if (opened) { this._createPopup() } this.element().toggleClass(DROP_DOWN_EDITOR_ACTIVE, opened); this._setPopupOption("visible", opened); this.setAria({ expanded: opened, owns: (opened || void 0) && this._popupContentId }) }, _createPopup: function() { if (this._$popup) { return } this._$popup = $("<div>").addClass(DROP_DOWN_EDITOR_OVERLAY).addClass(this.option("customOverlayCssClass")).appendTo(this.element()); this._renderPopup(); this._renderPopupContent() }, _renderPopup: function() { this._popup = this._createComponent(this._$popup, Popup, this._popupConfig()); this._popup.on({ showing: this._popupShowingHandler.bind(this), shown: this._popupShownHandler.bind(this), hiding: this._popupHidingHandler.bind(this), hidden: this._popupHiddenHandler.bind(this) }); this._popup.option("onContentReady", this._contentReadyHandler.bind(this)); this._contentReadyHandler(); this._popupContentId = "dx-" + new Guid; this.setAria("id", this._popupContentId, this._popup.content()) }, _contentReadyHandler: commonUtils.noop, _popupConfig: function() { return { onInitialized: this._popupInitializedHandler(), position: extend(this.option("popupPosition"), { of: this.element() }), showTitle: this.option("showPopupTitle"), width: "auto", height: "auto", shading: false, closeOnTargetScroll: true, closeOnOutsideClick: this._closeOutsideDropDownHandler.bind(this), animation: { show: { type: "fade", duration: 0, from: 0, to: 1 }, hide: { type: "fade", duration: 400, from: 1, to: 0 } }, deferRendering: false, focusStateEnabled: false, showCloseButton: false, toolbarItems: this._getPopupToolbarItems(), onPositioned: this._popupPositionedHandler.bind(this), fullScreen: false } }, _popupInitializedHandler: function() { if (!this.option("onPopupInitialized")) { return } return function(e) { this._popupInitializedAction({ popup: e.component }) }.bind(this) }, _popupPositionedHandler: function(e) { this._popup.overlayContent().toggleClass(DROP_DOWN_EDITOR_OVERLAY_FLIPPED, e.position.v.flip) }, _popupShowingHandler: commonUtils.noop, _popupHidingHandler: function() { this.option("opened", false) }, _popupShownHandler: function() { this._openAction(); if (this._$validationMessage) { this._$validationMessage.dxOverlay("option", "position", this._getValidationMessagePosition()) } }, _popupHiddenHandler: function() { this._closeAction(); if (this._$validationMessage) { this._$validationMessage.dxOverlay("option", "position", this._getValidationMessagePosition()) } }, _getValidationMessagePosition: function() { var positionRequest = "below"; if (this._popup && this._popup.option("visible")) { var myTop = positionUtils.setup(this.element()).top, popupTop = positionUtils.setup(this._popup.content()).top; positionRequest = myTop + this.option("popupPosition").offset.v > popupTop ? "below" : "above" } return this.callBase(positionRequest) }, _renderPopupContent: function() { var contentTemplate = this._getTemplateByOption("contentTemplate"); if (!(contentTemplate && this.option("contentTemplate"))) { return } var $popupContent = this._popup.content(), templateData = { value: this._fieldRenderData(), component: this }; $popupContent.empty(); contentTemplate.render({ container: $popupContent, model: templateData }) }, _closeOutsideDropDownHandler: function(e) { var $target = $(e.target); var isInputClicked = !!$target.closest(this.element()).length; var isDropDownButtonClicked = !!$target.closest(this._$dropDownButton).length; var isOutsideClick = !isInputClicked && !isDropDownButtonClicked; return isOutsideClick }, _clean: function() { delete this._$dropDownButton; delete this._openOnFieldClickAction; if (this._$popup) { this._$popup.remove(); delete this._$popup; delete this._popup } this.callBase() }, _setPopupOption: function(optionName, value) { this._setWidgetOption("_popup", arguments) }, _validatedOpening: function() { if (!this.option("readOnly")) { this._toggleOpenState(true) } }, _getPopupToolbarItems: function() { return "useButtons" === this.option("applyValueMode") ? this._popupToolbarItemsConfig() : [] }, _getFirstPopupElement: function() { return this._popup._wrapper().find(".dx-popup-done.dx-button") }, _getLastPopupElement: function() { return this._popup._wrapper().find(".dx-popup-cancel.dx-button") }, _popupElementTabHandler: function(e) { var $element = $(e.currentTarget); if (e.shiftKey && $element.is(this._getFirstPopupElement()) || !e.shiftKey && $element.is(this._getLastPopupElement())) { this._input().focus(); e.preventDefault() } }, _popupElementEscHandler: function() { this._input().focus(); this.close() }, _popupButtonInitializedHandler: function(e) { e.component.registerKeyHandler("tab", this._popupElementTabHandler.bind(this)); e.component.registerKeyHandler("escape", this._popupElementEscHandler.bind(this)) }, _popupToolbarItemsConfig: function() { var buttonsConfig = [{ shortcut: "done", options: { onClick: this._applyButtonHandler.bind(this), text: this.option("applyButtonText"), onInitialized: this._popupButtonInitializedHandler.bind(this) } }, { shortcut: "cancel", options: { onClick: this._cancelButtonHandler.bind(this), text: this.option("cancelButtonText"), onInitialized: this._popupButtonInitializedHandler.bind(this) } }]; return this._applyButtonsLocation(buttonsConfig) }, _applyButtonsLocation: function(buttonsConfig) { var buttonsLocation = this.option("buttonsLocation"), resultConfig = buttonsConfig; if ("default" !== buttonsLocation) { var position = commonUtils.splitPair(buttonsLocation); $.each(resultConfig, function(_, element) { extend(element, { toolbar: position[0], location: position[1] }) }) } return resultConfig }, _applyButtonHandler: function() { this.close(); this.option("focusStateEnabled") && this.focus() }, _cancelButtonHandler: function() { this.close(); this.option("focusStateEnabled") && this.focus() }, _toggleReadOnlyState: function() { this.callBase(); this._$dropDownButton && this._$dropDownButton.dxButton("option", "disabled", this.option("readOnly")) }, _optionChanged: function(args) { switch (args.name) { case "opened": this._renderOpenedState(); break; case "onOpened": case "onClosed": this._initVisibilityActions(); break; case "onPopupInitialized": this._initPopupInitializedAction(); break; case "fieldTemplate": if (isDefined(args.value)) { this._renderInputAddons() } else { this._invalidate() } break; case "showDropDownButton": case "contentTemplate": case "acceptCustomValue": case "openOnFieldClick": this._invalidate(); break; case "dropDownButtonTemplate": this._renderDropDownButton(); break; case "popupPosition": case "deferRendering": break; case "applyValueMode": case "applyButtonText": case "cancelButtonText": case "buttonsLocation": this._setPopupOption("toolbarItems", this._getPopupToolbarItems()); break; case "showPopupTitle": this._setPopupOption("showTitle", args.value); break; default: this.callBase(args) } }, open: function() { this.option("opened", true) }, close: function() { this.option("opened", false) }, reset: function() { this.option("value", null); this._input().val("") }, field: function() { return this._input() }, content: function() { return this._popup ? this._popup.content() : null } }); registerComponent("dxDropDownEditor", DropDownEditor); module.exports = DropDownEditor }, /*!***************************!*\ !*** ./js/ui/text_box.js ***! \***************************/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__( /*! ./text_box/text_box */ 212) }, /*!************************************!*\ !*** ./js/ui/text_box/text_box.js ***! \************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), devices = __webpack_require__( /*! ../../core/devices */ 53), inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), TextEditor = __webpack_require__( /*! ./ui.text_editor */ 213), eventUtils = __webpack_require__( /*! ../../events/utils */ 71); var ua = window.navigator.userAgent, ignoreCode = [8, 9, 13, 33, 34, 35, 36, 37, 38, 39, 40, 46], TEXTBOX_CLASS = "dx-textbox", SEARCHBOX_CLASS = "dx-searchbox", ICON_CLASS = "dx-icon", SEARCH_ICON_CLASS = "dx-icon-search"; var TextBox = TextEditor.inherit({ ctor: function(element, options) { if (options) { this._showClearButton = options.showClearButton } this.callBase.apply(this, arguments) }, _getDefaultOptions: function() { return extend(this.callBase(), { mode: "text", maxLength: null }) }, _render: function() { this.callBase(); this.element().addClass(TEXTBOX_CLASS); this.setAria("role", "textbox"); this._renderMaxLengthHandlers() }, _renderInputType: function() { this.callBase(); this._renderSearchMode() }, _renderMaxLengthHandlers: function() { if (this._isAndroid()) { this._input().on(eventUtils.addNamespace("keydown", this.NAME), this._onKeyDownAndroidHandler.bind(this)).on(eventUtils.addNamespace("change", this.NAME), this._onChangeAndroidHandler.bind(this)) } }, _renderProps: function() { this.callBase(); this._toggleMaxLengthProp() }, _toggleMaxLengthProp: function() { if (this._isAndroid()) { return } var maxLength = this.option("maxLength"); if (maxLength > 0) { this._input().attr("maxLength", maxLength) } else { this._input().removeAttr("maxLength") } }, _renderSearchMode: function() { var $element = this._$element; if ("search" === this.option("mode")) { $element.addClass(SEARCHBOX_CLASS); this._renderSearchIcon(); if (void 0 === this._showClearButton) { this._showClearButton = this.option("showClearButton"); this.option("showClearButton", true) } } else { $element.removeClass(SEARCHBOX_CLASS); this._$searchIcon && this._$searchIcon.remove(); this.option("showClearButton", void 0 === this._showClearButton ? this.option("showClearButton") : this._showClearButton); delete this._showClearButton } }, _renderSearchIcon: function() { var $searchIcon = $("<div>").addClass(ICON_CLASS).addClass(SEARCH_ICON_CLASS); $searchIcon.prependTo(this._input().parent()); this._$searchIcon = $searchIcon }, _optionChanged: function(args) { switch (args.name) { case "maxLength": this._toggleMaxLengthProp(); this._renderMaxLengthHandlers(); break; default: this.callBase(args) } }, _onKeyDownAndroidHandler: function(e) { var maxLength = this.option("maxLength"); if (maxLength) { var $input = $(e.target), code = e.keyCode; this._cutOffExtraChar($input); return $input.val().length < maxLength || inArray(code, ignoreCode) !== -1 || "" !== window.getSelection().toString() } else { return true } }, _onChangeAndroidHandler: function(e) { var $input = $(e.target); if (this.option("maxLength")) { this._cutOffExtraChar($input) } }, _cutOffExtraChar: function($input) { var maxLength = this.option("maxLength"), textInput = $input.val(); if (textInput.length > maxLength) { $input.val(textInput.substr(0, maxLength)) } }, _isAndroid: function() { var realDevice = devices.real(); var version = realDevice.version.join("."); return "android" === realDevice.platform && version && /^(2\.|4\.1)/.test(version) && !/chrome/i.test(ua) } }); TextBox.__internals = { uaAccessor: function(value) { if (!arguments.length) { return window.DevExpress.ui } ua = value }, SEARCHBOX_CLASS: SEARCHBOX_CLASS, SEARCH_ICON_CLASS: SEARCH_ICON_CLASS }; registerComponent("dxTextBox", TextBox); module.exports = TextBox }, /*!******************************************!*\ !*** ./js/ui/text_box/ui.text_editor.js ***! \******************************************/ function(module, exports, __webpack_require__) { var registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), TextEditorMask = __webpack_require__( /*! ./ui.text_editor.mask */ 214); registerComponent("dxTextEditor", TextEditorMask); module.exports = TextEditorMask }, /*!***********************************************!*\ !*** ./js/ui/text_box/ui.text_editor.mask.js ***! \***********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), caret = __webpack_require__( /*! ./utils.caret */ 215), domUtils = __webpack_require__( /*! ../../core/utils/dom */ 56), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), stringUtils = __webpack_require__( /*! ../../core/utils/string */ 18), inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), TextEditorBase = __webpack_require__( /*! ./ui.text_editor.base */ 216), MaskRules = __webpack_require__( /*! ./ui.text_editor.mask.rule */ 217), eventUtils = __webpack_require__( /*! ../../events/utils */ 71); var stubCaret = function() { return {} }; var EMPTY_CHAR = " "; var EMPTY_CHAR_CODE = 32; var ESCAPED_CHAR = "\\"; var TEXTEDITOR_MASKED_CLASS = "dx-texteditor-masked"; var MASK_EVENT_NAMESPACE = "dxMask"; var FORWARD_DIRECTION = "forward"; var BACKWARD_DIRECTION = "backward"; var BLUR_EVENT = "blur beforedeactivate"; var buildInMaskRules = { 0: /[0-9]/, 9: /[0-9\s]/, "#": /[-+0-9\s]/, L: function(char) { return isLiteralChar(char) }, l: function(char) { return isLiteralChar(char) || isSpaceChar(char) }, C: /\S/, c: /./, A: function(char) { return isLiteralChar(char) || isNumericChar(char) }, a: function(char) { return isLiteralChar(char) || isNumericChar(char) || isSpaceChar(char) } }; var isNumericChar = function(char) { return /[0-9]/.test(char) }; var isLiteralChar = function(char) { var code = char.charCodeAt(); return 64 < code && code < 91 || 96 < code && code < 123 || code > 127 }; var isSpaceChar = function(char) { return " " === char }; var TextEditorMask = TextEditorBase.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { mask: "", maskChar: "_", maskRules: {}, maskInvalidMessage: messageLocalization.format("validation-mask"), useMaskedValue: false }) }, _supportedKeys: function() { var that = this; var keyHandlerMap = { backspace: that._maskBackspaceHandler, del: that._maskDelHandler, enter: that._changeHandler }; var result = that.callBase(); $.each(keyHandlerMap, function(key, callback) { var parentHandler = result[key]; result[key] = function(e) { that.option("mask") && callback.call(that, e); parentHandler && parentHandler(e) } }); return result }, _getSubmitElement: function() { return !this.option("mask") ? this.callBase() : this._$hiddenElement }, _render: function() { this._renderHiddenElement(); this.callBase(); this._renderMask() }, _renderHiddenElement: function() { if (this.option("mask")) { this._$hiddenElement = $("<input>").attr("type", "hidden").appendTo(this._inputWrapper()) } }, _removeHiddenElement: function() { this._$hiddenElement && this._$hiddenElement.remove() }, _renderMask: function() { this.element().removeClass(TEXTEDITOR_MASKED_CLASS); this._maskRulesChain = null; this._detachMaskEventHandlers(); if (!this.option("mask")) { return } this.element().addClass(TEXTEDITOR_MASKED_CLASS); this._attachMaskEventHandlers(); this._parseMask(); this._renderMaskedValue(); this._changedValue = this._input().val() }, _attachMaskEventHandlers: function() { this._input().on(eventUtils.addNamespace("focus", MASK_EVENT_NAMESPACE), this._maskFocusHandler.bind(this)).on(eventUtils.addNamespace("keydown", MASK_EVENT_NAMESPACE), this._maskKeyDownHandler.bind(this)).on(eventUtils.addNamespace("keypress", MASK_EVENT_NAMESPACE), this._maskKeyPressHandler.bind(this)).on(eventUtils.addNamespace("input", MASK_EVENT_NAMESPACE), this._maskInputHandler.bind(this)).on(eventUtils.addNamespace("paste", MASK_EVENT_NAMESPACE), this._maskPasteHandler.bind(this)).on(eventUtils.addNamespace("cut", MASK_EVENT_NAMESPACE), this._maskCutHandler.bind(this)).on(eventUtils.addNamespace("drop", MASK_EVENT_NAMESPACE), this._maskDragHandler.bind(this)); this._attachChangeEventHandlers() }, _detachMaskEventHandlers: function() { this._input().off("." + MASK_EVENT_NAMESPACE) }, _attachChangeEventHandlers: function() { if (inArray("change", this.option("valueChangeEvent").split(" ")) === -1) { return } this._input().on(eventUtils.addNamespace(BLUR_EVENT, MASK_EVENT_NAMESPACE), function(e) { this._suppressCaretChanging(this._changeHandler, [e]); this._changeHandler(e) }.bind(this)) }, _suppressCaretChanging: function(callback, args) { var originalCaret = caret; caret = stubCaret; try { callback.apply(this, args) } finally { caret = originalCaret } }, _changeHandler: function(e) { var $input = this._input(), inputValue = $input.val(); if (inputValue === this._changedValue) { return } this._changedValue = inputValue; var changeEvent = eventUtils.createEvent(e, { type: "change" }); $input.trigger(changeEvent) }, _parseMask: function() { this._maskRules = extend({}, buildInMaskRules, this.option("maskRules")); this._maskRulesChain = this._parseMaskRule(0) }, _parseMaskRule: function(index) { var mask = this.option("mask"); if (index >= mask.length) { return new MaskRules.EmptyMaskRule } var currentMaskChar = mask[index]; var isEscapedChar = currentMaskChar === ESCAPED_CHAR; var result = isEscapedChar ? new MaskRules.StubMaskRule({ maskChar: mask[index + 1] }) : this._getMaskRule(currentMaskChar); result.next(this._parseMaskRule(index + 1 + isEscapedChar)); return result }, _getMaskRule: function(pattern) { var ruleConfig; $.each(this._maskRules, function(rulePattern, allowedChars) { if (rulePattern === pattern) { ruleConfig = { pattern: rulePattern, allowedChars: allowedChars }; return false } }); return commonUtils.isDefined(ruleConfig) ? new MaskRules.MaskRule(extend({ maskChar: this.option("maskChar") }, ruleConfig)) : new MaskRules.StubMaskRule({ maskChar: pattern }) }, _renderMaskedValue: function() { if (!this._maskRulesChain) { return } var value = this.option("value") || ""; this._maskRulesChain.clear(this._normalizeChainArguments()); var chainArgs = { length: value.length }; chainArgs[this._isMaskedValueMode() ? "text" : "value"] = value; this._handleChain(chainArgs); this._displayMask() }, _isMaskedValueMode: function() { return this.option("useMaskedValue") }, _displayMask: function(caret) { caret = caret || this._caret(); this._renderValue(); this._caret(caret) }, _renderValue: function() { if (this._maskRulesChain) { var text = this._maskRulesChain.text(); this.option("text", text); if (this._$hiddenElement) { var value = this._maskRulesChain.value(), hiddenElementValue = this._isMaskedValueMode() ? text : value; this._$hiddenElement.val(!stringUtils.isEmpty(value) ? hiddenElementValue : "") } } this.callBase() }, _valueChangeEventHandler: function(e) { if (!this._maskRulesChain) { this.callBase.apply(this, arguments); return } this._saveValueChangeEvent(e); var value = this._isMaskedValueMode() ? (this._textValue || "").replace(new RegExp("[" + this.option("maskChar") + "]", "g"), " ").replace(/\s+$/, "") : (this._value || "").replace(/\s+$/, ""); this.option("value", value) }, _maskFocusHandler: function() { this._direction(FORWARD_DIRECTION); this._adjustCaret() }, _maskKeyDownHandler: function() { this._keyPressHandled = false }, _maskKeyPressHandler: function(e) { if (this._keyPressHandled) { return } this._keyPressHandled = true; if (this._isControlKeyFired(e)) { return } this._maskKeyHandler(e, function() { this._handleKey(e.which); return true }) }, _maskInputHandler: function(e) { if (this._keyPressHandled) { return } this._keyPressHandled = true; var inputValue = this._input().val(); var caret = this._caret(); caret.start = caret.end - 1; var oldValue = inputValue.substring(0, caret.start) + inputValue.substring(caret.end); var char = inputValue[caret.start]; this._input().val(oldValue); this._inputHandlerTimer = setTimeout(function() { this._caret({ start: caret.start, end: caret.start }); this._maskKeyHandler(e, function() { this._handleKey(char.charCodeAt()); return true }) }.bind(this)) }, _isControlKeyFired: function(e) { return this._isControlKey(e.key) || e.ctrlKey || e.metaKey }, _maskBackspaceHandler: function(e) { var that = this; that._keyPressHandled = true; var afterBackspaceHandler = function(needAdjustCaret, callBack) { if (needAdjustCaret) { that._direction(FORWARD_DIRECTION); that._adjustCaret() } var currentCaret = that._caret(); clearTimeout(that._backspaceHandlerTimeout); that._backspaceHandlerTimeout = setTimeout(function() { callBack(currentCaret) }) }; that._maskKeyHandler(e, function() { if (that._hasSelection()) { afterBackspaceHandler(true, function(currentCaret) { that._displayMask(currentCaret); that._maskRulesChain.reset() }); return } if (that._tryMoveCaretBackward()) { afterBackspaceHandler(false, function(currentCaret) { that._caret(currentCaret) }); return } that._handleKey(EMPTY_CHAR_CODE, BACKWARD_DIRECTION); afterBackspaceHandler(true, function(currentCaret) { that._displayMask(currentCaret); that._maskRulesChain.reset() }) }) }, _maskDelHandler: function(e) { this._keyPressHandled = true; this._maskKeyHandler(e, function() { !this._hasSelection() && this._handleKey(EMPTY_CHAR_CODE); return true }) }, _maskPasteHandler: function(e) { this._keyPressHandled = true; var caret = this._caret(); this._maskKeyHandler(e, function() { var pastingText = domUtils.clipboardText(e); var restText = this._maskRulesChain.text().substring(caret.end); var accepted = this._handleChain({ text: pastingText, start: caret.start, length: pastingText.length }); var newCaret = caret.start + accepted; this._handleChain({ text: restText, start: newCaret, length: restText.length }); this._caret({ start: newCaret, end: newCaret }); return true }) }, _handleChain: function(args) { var handledCount = this._maskRulesChain.handle(this._normalizeChainArguments(args)); this._value = this._maskRulesChain.value(); this._textValue = this._maskRulesChain.text(); return handledCount }, _normalizeChainArguments: function(args) { args = args || {}; args.index = 0; args.fullText = this._maskRulesChain.text(); return args }, _maskCutHandler: function(e) { var caret = this._caret(); var selectedText = this._input().val().substring(caret.start, caret.end); this._maskKeyHandler(e, function() { domUtils.clipboardText(e, selectedText); return true }) }, _maskDragHandler: function() { this._clearDragTimer(); this._dragTimer = setTimeout(function() { this.option("value", this._convertToValue(this._input().val())) }.bind(this)) }, _convertToValue: function(text) { return text.replace(new RegExp(this.option("maskChar"), "g"), EMPTY_CHAR) }, _maskKeyHandler: function(e, tryHandleKeyCallback) { if (this.option("readOnly")) { return } this._direction(FORWARD_DIRECTION); e.preventDefault(); this._handleSelection(); if (!tryHandleKeyCallback.call(this)) { return } this._direction(FORWARD_DIRECTION); this._adjustCaret(); this._displayMask(); this._maskRulesChain.reset() }, _handleKey: function(keyCode, direction) { var char = String.fromCharCode(keyCode); this._direction(direction || FORWARD_DIRECTION); this._adjustCaret(char); this._handleKeyChain(char); this._moveCaret() }, _handleSelection: function() { if (!this._hasSelection()) { return } var caret = this._caret(); var emptyChars = new Array(caret.end - caret.start + 1).join(EMPTY_CHAR); this._handleKeyChain(emptyChars) }, _handleKeyChain: function(chars) { var caret = this._caret(); var start = this._isForwardDirection() ? caret.start : caret.start - 1; var end = this._isForwardDirection() ? caret.end : caret.end - 1; var length = start === end ? 1 : end - start; this._handleChain({ text: chars, start: start, length: length }) }, _tryMoveCaretBackward: function() { this._direction(BACKWARD_DIRECTION); var currentCaret = this._caret().start; this._adjustCaret(); return !currentCaret || currentCaret !== this._caret().start }, _adjustCaret: function(char) { var caret = this._maskRulesChain.adjustedCaret(this._caret().start, this._isForwardDirection(), char); this._caret({ start: caret, end: caret }) }, _moveCaret: function() { var currentCaret = this._caret().start; var maskRuleIndex = currentCaret + (this._isForwardDirection() ? 0 : -1); var caret = this._maskRulesChain.isAccepted(maskRuleIndex) ? currentCaret + (this._isForwardDirection() ? 1 : -1) : currentCaret; this._caret({ start: caret, end: caret }) }, _caret: function(position) { if (!arguments.length) { return caret(this._input()) } caret(this._input(), position) }, _hasSelection: function() { var caret = this._caret(); return caret.start !== caret.end }, _direction: function(direction) { if (!arguments.length) { return this._typingDirection } this._typingDirection = direction }, _isForwardDirection: function() { return this._direction() === FORWARD_DIRECTION }, _clearDragTimer: function() { clearTimeout(this._dragTimer) }, _clean: function() { this._clearDragTimer(); this.callBase() }, _validateMask: function() { if (!this._maskRulesChain) { return } var isValid = this._maskRulesChain.isValid(this._normalizeChainArguments()); this.option({ isValid: isValid, validationError: isValid ? null : { editorSpecific: true, message: this.option("maskInvalidMessage") } }) }, _dispose: function() { clearTimeout(this._inputHandlerTimer); clearTimeout(this._backspaceHandlerTimeout); this.callBase() }, _updateHiddenElement: function() { if (this.option("mask")) { this._input().attr("name", null); this._renderHiddenElement() } else { this._removeHiddenElement() } this._setSubmitElementName(this.option("name")) }, _updateMaskOption: function() { this._updateHiddenElement(); this._renderMask(); this._validateMask() }, _processEmptyMask: function(mask) { if (mask) { return } var value = this.option("value"); this.option({ text: value, isValid: true }); this.validationRequest.fire({ value: value, editor: this }); this._renderValue() }, _optionChanged: function(args) { switch (args.name) { case "mask": this._updateMaskOption(); this._processEmptyMask(args.value); break; case "maskChar": case "maskRules": case "useMaskedValue": this._updateMaskOption(); break; case "value": this._renderMaskedValue(); this._validateMask(); this.callBase(args); break; case "maskInvalidMessage": break; default: this.callBase(args) } } }); module.exports = TextEditorMask }, /*!***************************************!*\ !*** ./js/ui/text_box/utils.caret.js ***! \***************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), browser = __webpack_require__( /*! ../../core/utils/browser */ 23); var isFocusingOnCaretChange = browser.msie || browser.safari; var getCaret = function(input) { if (isObsoleteBrowser(input)) { return getCaretForObsoleteBrowser(input) } return { start: input.selectionStart, end: input.selectionEnd } }; var setCaret = function(input, position) { if (isObsoleteBrowser(input)) { setCaretForObsoleteBrowser(input, position); return } if (!$.contains(document, input)) { return } input.selectionStart = position.start; input.selectionEnd = position.end }; var isObsoleteBrowser = function(input) { return !input.setSelectionRange }; var getCaretForObsoleteBrowser = function(input) { var range = document.selection.createRange(); var rangeCopy = range.duplicate(); range.move("character", -input.value.length); range.setEndPoint("EndToStart", rangeCopy); return { start: range.text.length, end: range.text.length + rangeCopy.text.length } }; var setCaretForObsoleteBrowser = function(input, position) { if (!$.contains(document, input)) { return } var range = input.createTextRange(); range.collapse(true); range.moveStart("character", position.start); range.moveEnd("character", position.end - position.start); range.select() }; var caret = function(input, position) { input = $(input).get(0); if (!commonUtils.isDefined(position)) { return getCaret(input) } if (isFocusingOnCaretChange && document.activeElement !== input) { return } setCaret(input, position) }; module.exports = caret }, /*!***********************************************!*\ !*** ./js/ui/text_box/ui.text_editor.base.js ***! \***********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), domUtils = __webpack_require__( /*! ../../core/utils/dom */ 56), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, themes = __webpack_require__( /*! ../themes */ 143), Editor = __webpack_require__( /*! ../editor/editor */ 106), eventUtils = __webpack_require__( /*! ../../events/utils */ 71), pointerEvents = __webpack_require__( /*! ../../events/pointer */ 76), clickEvent = __webpack_require__( /*! ../../events/click */ 75); var TEXTEDITOR_CLASS = "dx-texteditor", TEXTEDITOR_INPUT_CLASS = "dx-texteditor-input", TEXTEDITOR_INPUT_SELECTOR = "." + TEXTEDITOR_INPUT_CLASS, TEXTEDITOR_CONTAINER_CLASS = "dx-texteditor-container", TEXTEDITOR_BUTTONS_CONTAINER_CLASS = "dx-texteditor-buttons-container", TEXTEDITOR_PLACEHOLDER_CLASS = "dx-placeholder", TEXTEDITOR_SHOW_CLEAR_BUTTON_CLASS = "dx-show-clear-button", TEXTEDITOR_ICON_CLASS = "dx-icon", TEXTEDITOR_CLEAR_ICON_CLASS = "dx-icon-clear", TEXTEDITOR_CLEAR_BUTTON_CLASS = "dx-clear-button-area", TEXTEDITOR_EMPTY_INPUT_CLASS = "dx-texteditor-empty"; var EVENTS_LIST = ["KeyDown", "KeyPress", "KeyUp", "Change", "Cut", "Copy", "Paste", "Input"]; var CONTROL_KEYS = ["Tab", "Enter", "Shift", "Control", "Alt", "Escape", "PageUp", "PageDown", "End", "Home", "ArrowLeft", "ArrowUp", "ArrowRight", "ArrowDown", "Esc", "Left", "Up", "Right", "Down"]; var TextEditorBase = Editor.inherit({ _supportedKeys: function() { var stop = function(e) { e.stopPropagation() }; return { space: stop, enter: stop, leftArrow: stop, rightArrow: stop } }, _setDeprecatedOptions: function() { this.callBase(); extend(this._deprecatedOptions, { attr: { since: "16.2", alias: "inputAttr" } }) }, _getDefaultOptions: function() { return extend(this.callBase(), { value: "", spellcheck: false, showClearButton: false, valueChangeEvent: "change", placeholder: "", inputAttr: {}, onFocusIn: null, onFocusOut: null, onKeyDown: null, onKeyPress: null, onKeyUp: null, onChange: null, onInput: null, onCut: null, onCopy: null, onPaste: null, onEnterKey: null, mode: "text", hoverStateEnabled: true, focusStateEnabled: true, text: void 0, valueFormat: function(value) { return value } }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function() { var currentTheme = (themes.current() || "").split(".")[0]; return "android5" === currentTheme }, options: { validationMessageOffset: { v: -8 } } }]) }, _input: function() { return this.element().find(TEXTEDITOR_INPUT_SELECTOR).first() }, _inputWrapper: function() { return this.element() }, _buttonsContainer: function() { return this._inputWrapper().find("." + TEXTEDITOR_BUTTONS_CONTAINER_CLASS) }, _isControlKey: function(key) { return CONTROL_KEYS.indexOf(key) !== -1 }, _render: function() { this.element().addClass(TEXTEDITOR_CLASS); this._renderInput(); this._renderInputType(); this._renderValue(); this._renderProps(); this._renderPlaceholder(); this.callBase(); this._refreshValueChangeEvent(); this._renderEvents(); this._renderEnterKeyAction(); this._renderEmptinessEvent() }, _renderInput: function() { $("<div>").addClass(TEXTEDITOR_CONTAINER_CLASS).append(this._createInput()).append($("<div>").addClass(TEXTEDITOR_BUTTONS_CONTAINER_CLASS)).appendTo(this.element()) }, _createInput: function() { var $input = $("<input>"); this._applyInputAttributes($input, this.option("inputAttr")); return $input }, _applyInputAttributes: function($input, customAttributes) { $input.attr("autocomplete", "off").attr(customAttributes).addClass(TEXTEDITOR_INPUT_CLASS).css("min-height", this.option("height") ? "0" : "") }, _renderValue: function() { this._renderInputValue(); this._renderInputAddons() }, _renderInputValue: function(value) { value = value || this.option("value"); var text = this.option("text"), displayValue = this.option("displayValue"), valueFormat = this.option("valueFormat"); if (void 0 !== displayValue && null !== value) { text = valueFormat(displayValue) } else { if (!commonUtils.isDefined(text)) { text = valueFormat(value) } } this.option("text", text); if (this._input().val() !== (commonUtils.isDefined(text) ? text : "")) { this._renderDisplayText(text) } else { this._toggleEmptinessEventHandler() } }, _renderDisplayText: function(text) { this._input().val(text); this._toggleEmptinessEventHandler() }, _isValueValid: function() { if (this._input().length) { var validity = this._input().get(0).validity; if (validity) { return validity.valid } } return true }, _toggleEmptiness: function(isEmpty) { this.element().toggleClass(TEXTEDITOR_EMPTY_INPUT_CLASS, isEmpty); this._togglePlaceholder(isEmpty) }, _togglePlaceholder: function(isEmpty) { if (!this._$placeholder) { return } this._$placeholder.toggleClass("dx-state-invisible", !isEmpty) }, _renderProps: function() { this._toggleDisabledState(this.option("disabled")); this._toggleReadOnlyState(); this._toggleSpellcheckState() }, _toggleDisabledState: function(value) { this.callBase.apply(this, arguments); var $input = this._input(); if (value) { $input.attr("disabled", true).attr("tabindex", -1) } else { $input.removeAttr("disabled").removeAttr("tabindex") } }, _toggleReadOnlyState: function() { this._input().prop("readOnly", this._readOnlyPropValue()); this.callBase() }, _readOnlyPropValue: function() { return this.option("readOnly") }, _toggleSpellcheckState: function() { this._input().prop("spellcheck", this.option("spellcheck")) }, _renderPlaceholder: function() { if (this._$placeholder) { this._$placeholder.remove(); this._$placeholder = null } var that = this, $input = that._input(), placeholderText = that.option("placeholder"), $placeholder = this._$placeholder = $("<div>").attr("data-dx_placeholder", placeholderText), startEvent = eventUtils.addNamespace(pointerEvents.up, this.NAME); $placeholder.on(startEvent, function() { $input.focus() }); $placeholder.insertAfter($input); $placeholder.addClass(TEXTEDITOR_PLACEHOLDER_CLASS); this._toggleEmptinessEventHandler() }, _placeholder: function() { return this._$placeholder || $() }, _renderInputAddons: function() { this._renderClearButton() }, _renderClearButton: function() { var clearButtonVisibility = this._clearButtonVisibility(); this.element().toggleClass(TEXTEDITOR_SHOW_CLEAR_BUTTON_CLASS, clearButtonVisibility); if (clearButtonVisibility) { if (!this._$clearButton || this._$clearButton && !this._$clearButton.closest(this.element()).length) { this._$clearButton = this._createClearButton() } this._$clearButton.prependTo(this._buttonsContainer()) } if (this._$clearButton) { this._$clearButton.toggleClass("dx-state-invisible", !clearButtonVisibility) } }, _clearButtonVisibility: function() { return this.option("showClearButton") && !this.option("readOnly") }, _createClearButton: function() { return $("<span>").addClass(TEXTEDITOR_CLEAR_BUTTON_CLASS).append($("<span>").addClass(TEXTEDITOR_ICON_CLASS).addClass(TEXTEDITOR_CLEAR_ICON_CLASS)).on(eventUtils.addNamespace(pointerEvents.down, this.NAME), function(e) { if ("mouse" === e.pointerType) { e.preventDefault() } }).on(eventUtils.addNamespace(clickEvent.name, this.NAME), this._clearValueHandler.bind(this)) }, _clearValueHandler: function(e) { var $input = this._input(); e.stopPropagation(); this._valueChangeEventHandler(e); this.reset(); !$input.is(":focus") && $input.focus(); $input.trigger("input") }, _renderEvents: function() { var that = this, $input = that._input(); $.each(EVENTS_LIST, function(_, event) { if (that.hasActionSubscription("on" + event)) { var action = that._createActionByOption("on" + event, { excludeValidators: ["readOnly"] }); $input.on(eventUtils.addNamespace(event.toLowerCase(), that.NAME), function(e) { if (that._disposed) { return } action({ jQueryEvent: e }) }) } }) }, _refreshEvents: function() { var that = this, $input = this._input(); $.each(EVENTS_LIST, function(_, event) { $input.off(eventUtils.addNamespace(event.toLowerCase(), that.NAME)) }); this._renderEvents() }, _keyPressHandler: function() { this.option("text", this._input().val()) }, _renderValueChangeEvent: function() { var keyPressEvent = eventUtils.addNamespace(this._renderValueEventName(), this.NAME + "TextChange"), valueChangeEvent = eventUtils.addNamespace(this.option("valueChangeEvent"), this.NAME + "ValueChange"); this._input().on(keyPressEvent, this._keyPressHandler.bind(this)).on(valueChangeEvent, this._valueChangeEventHandler.bind(this)) }, _cleanValueChangeEvent: function() { var eventNamespace = this.NAME + "ValueChange", keyPressEvent = eventUtils.addNamespace(this._renderValueEventName(), this.NAME + "TextChange"); this._input().off("." + eventNamespace).off(keyPressEvent) }, _refreshValueChangeEvent: function() { this._cleanValueChangeEvent(); this._renderValueChangeEvent() }, _renderValueEventName: function() { return "input change keypress" }, _focusTarget: function() { return this._input() }, _focusClassTarget: function() { return this.element() }, _toggleFocusClass: function(isFocused, $element) { this.callBase(isFocused, this._focusClassTarget($element)) }, _hasFocusClass: function(element) { return this.callBase($(element || this.element())) }, _renderEmptinessEvent: function() { var $input = this._input(); $input.on("input blur", this._toggleEmptinessEventHandler.bind(this)) }, _toggleEmptinessEventHandler: function() { var text = this._input().val(), isEmpty = ("" === text || null === text) && this._isValueValid(); this._toggleEmptiness(isEmpty) }, _valueChangeEventHandler: function(e, formattedValue) { this._saveValueChangeEvent(e); this.option("value", arguments.length > 1 ? formattedValue : this._input().val()) }, _renderEnterKeyAction: function() { this._enterKeyAction = this._createActionByOption("onEnterKey", { excludeValidators: ["readOnly"] }); this._input().off("keyup.onEnterKey.dxTextEditor").on("keyup.onEnterKey.dxTextEditor", this._enterKeyHandlerUp.bind(this)) }, _enterKeyHandlerUp: function(e) { if (this._disposed) { return } if (13 === e.which) { this._enterKeyAction({ jQueryEvent: e }) } }, _updateValue: function() { this.option("text", void 0); this._renderValue() }, _dispose: function() { this._enterKeyAction = void 0; this.callBase() }, _getSubmitElement: function() { return this._input() }, _optionChanged: function(args) { var name = args.name; if (inArray(name.replace("on", ""), EVENTS_LIST) > -1) { this._refreshEvents(); return } switch (name) { case "valueChangeEvent": this._refreshValueChangeEvent(); this._refreshFocusEvent(); this._refreshEvents(); break; case "onValueChanged": this._createValueChangeAction(); break; case "readOnly": this.callBase(args); this._renderInputAddons(); break; case "spellcheck": this._toggleSpellcheckState(); break; case "mode": this._renderInputType(); break; case "onEnterKey": this._renderEnterKeyAction(); break; case "placeholder": this._renderPlaceholder(); break; case "showClearButton": this._renderInputAddons(); break; case "text": break; case "value": this._updateValue(); this.callBase(args); break; case "inputAttr": this._applyInputAttributes(this._input(), args.value); break; case "valueFormat": this._invalidate(); break; default: this.callBase(args) } }, _renderInputType: function() { this._setInputType(this.option("mode")) }, _setInputType: function(type) { var input = this._input(); if ("search" === type) { type = "text" } try { input.prop("type", type) } catch (e) { input.prop("type", "text") } }, focus: function() { this._input().focus() }, blur: function() { if (this._input().is(document.activeElement)) { domUtils.resetActiveElement() } }, reset: function() { this.option("value", "") }, on: function(eventName, eventHandler) { var result = this.callBase(eventName, eventHandler), event = eventName.charAt(0).toUpperCase() + eventName.substr(1); if (EVENTS_LIST.indexOf(event) >= 0) { this._refreshEvents() } return result } }); module.exports = TextEditorBase }, /*!****************************************************!*\ !*** ./js/ui/text_box/ui.text_editor.mask.rule.js ***! \****************************************************/ function(module, exports, __webpack_require__) { var Class = __webpack_require__( /*! ../../core/class */ 25), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), noop = commonUtils.noop, isFunction = commonUtils.isFunction; var EMPTY_CHAR = " "; var BaseMaskRule = Class.inherit({ ctor: function(config) { this._value = EMPTY_CHAR; extend(this, config) }, next: function(rule) { if (!arguments.length) { return this._next } this._next = rule }, text: noop, value: noop, rawValue: noop, handle: noop, _prepareHandlingArgs: function(args, config) { config = config || {}; var handlingProperty = args.hasOwnProperty("value") ? "value" : "text"; args[handlingProperty] = commonUtils.isDefined(config.str) ? config.str : args[handlingProperty]; args.start = commonUtils.isDefined(config.start) ? config.start : args.start; args.length = commonUtils.isDefined(config.length) ? config.length : args.length; args.index = args.index + 1; return args }, reset: noop, clear: noop, isAccepted: function() { return false }, adjustedCaret: function(caret, isForwardDirection, char) { return isForwardDirection ? this._adjustedForward(caret, 0, char) : this._adjustedBackward(caret, 0, char) }, _adjustedForward: noop, _adjustedBackward: noop, isValid: noop }); var EmptyMaskRule = BaseMaskRule.inherit({ next: noop, handle: function() { return 0 }, text: function() { return "" }, value: function() { return "" }, rawValue: function() { return "" }, adjustedCaret: function() { return 0 }, isValid: function() { return true } }); var MaskRule = BaseMaskRule.inherit({ text: function() { return (this._value !== EMPTY_CHAR ? this._value : this.maskChar) + this.next().text() }, value: function() { return this._value + this.next().value() }, rawValue: function() { return this._value + this.next().rawValue() }, handle: function(args) { var str = args.hasOwnProperty("value") ? args.value : args.text; if (!str || !str.length || !args.length) { return 0 } if (args.start) { return this.next().handle(this._prepareHandlingArgs(args, { start: args.start - 1 })) } var char = str[0]; var rest = str.substring(1); this._tryAcceptChar(char, args); return this._accepted() ? this.next().handle(this._prepareHandlingArgs(args, { str: rest, length: args.length - 1 })) + 1 : this.handle(this._prepareHandlingArgs(args, { str: rest, length: args.length - 1 })) }, clear: function(args) { this._tryAcceptChar(EMPTY_CHAR, args); this.next().clear(this._prepareHandlingArgs(args)) }, reset: function() { this._accepted(false); this.next().reset() }, _tryAcceptChar: function(char, args) { this._accepted(false); if (!this._isAllowed(char, args)) { return } var acceptedChar = char === EMPTY_CHAR ? this.maskChar : char; args.fullText = args.fullText.substring(0, args.index) + acceptedChar + args.fullText.substring(args.index + 1); this._accepted(true); this._value = char }, _accepted: function(value) { if (!arguments.length) { return !!this._isAccepted } this._isAccepted = !!value }, _isAllowed: function(char, args) { if (char === EMPTY_CHAR) { return true } return this._isValid(char, args) }, _isValid: function(char, args) { var allowedChars = this.allowedChars; if (allowedChars instanceof RegExp) { return allowedChars.test(char) } if (isFunction(allowedChars)) { return allowedChars(char, args.index, args.fullText) } if (Array.isArray(allowedChars)) { return inArray(char, allowedChars) > -1 } return allowedChars === char }, isAccepted: function(caret) { return 0 === caret ? this._accepted() : this.next().isAccepted(caret - 1) }, _adjustedForward: function(caret, index, char) { if (index >= caret) { return index } return this.next()._adjustedForward(caret, index + 1, char) || index + 1 }, _adjustedBackward: function(caret, index) { if (index >= caret - 1) { return caret } return this.next()._adjustedBackward(caret, index + 1) || index + 1 }, isValid: function(args) { return this._isValid(this._value, args) && this.next().isValid(this._prepareHandlingArgs(args)) } }); var StubMaskRule = MaskRule.inherit({ value: function() { return this.next().value() }, handle: function(args) { var hasValueProperty = args.hasOwnProperty("value"); var str = hasValueProperty ? args.value : args.text; if (!str.length || !args.length) { return 0 } if (args.start || hasValueProperty) { return this.next().handle(this._prepareHandlingArgs(args, { start: args.start && args.start - 1 })) } var char = str[0]; var rest = str.substring(1); this._tryAcceptChar(char); var nextArgs = this._isAllowed(char) ? this._prepareHandlingArgs(args, { str: rest, length: args.length - 1 }) : args; return this.next().handle(nextArgs) + 1 }, clear: function(args) { this._accepted(false); this.next().clear(this._prepareHandlingArgs(args)) }, _tryAcceptChar: function(char) { this._accepted(this._isValid(char)) }, _isValid: function(char) { return char === this.maskChar }, _adjustedForward: function(caret, index, char) { if (index >= caret && char === this.maskChar) { return index } if (caret === index + 1 && this._accepted()) { return caret } return this.next()._adjustedForward(caret, index + 1, char) }, _adjustedBackward: function(caret, index) { if (index >= caret - 1) { return 0 } return this.next()._adjustedBackward(caret, index + 1) }, isValid: function(args) { return this.next().isValid(this._prepareHandlingArgs(args)) } }); module.exports.MaskRule = MaskRule; module.exports.StubMaskRule = StubMaskRule; module.exports.EmptyMaskRule = EmptyMaskRule }, /*!***********************!*\ !*** ./js/ui/list.js ***! \***********************/ function(module, exports, __webpack_require__) { var ListEdit = __webpack_require__( /*! ./list/ui.list.edit */ 219), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57); registerComponent("dxList", ListEdit); module.exports = ListEdit }, /*!************************************!*\ !*** ./js/ui/list/ui.list.edit.js ***! \************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), eventUtils = __webpack_require__( /*! ../../events/utils */ 71), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, GroupedEditStrategy = __webpack_require__( /*! ./ui.list.edit.strategy.grouped */ 220), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), EditProvider = __webpack_require__( /*! ./ui.list.edit.provider */ 221), ListBase = __webpack_require__( /*! ./ui.list.base */ 231); var LIST_ITEM_SELECTED_CLASS = "dx-list-item-selected", LIST_ITEM_RESPONSE_WAIT_CLASS = "dx-list-item-response-wait"; var ListEdit = ListBase.inherit({ _supportedKeys: function() { var that = this, parent = this.callBase(); var deleteFocusedItem = function(e) { if (that.option("allowItemDeleting")) { e.preventDefault(); that.deleteItem(that.option("focusedElement")) } }; var moveFocusedItemUp = function(e) { if (e.shiftKey && that.option("allowItemReordering")) { e.preventDefault(); var focusedItemIndex = that._editStrategy.getNormalizedIndex(that.option("focusedElement")), $prevItem = that._editStrategy.getItemElement(focusedItemIndex - 1); that.reorderItem(that.option("focusedElement"), $prevItem); that.scrollToItem(that.option("focusedElement")) } else { parent.upArrow(e) } }; var moveFocusedItemDown = function(e) { if (e.shiftKey && that.option("allowItemReordering")) { e.preventDefault(); var focusedItemIndex = that._editStrategy.getNormalizedIndex(that.option("focusedElement")), $nextItem = that._editStrategy.getItemElement(focusedItemIndex + 1); that.reorderItem(that.option("focusedElement"), $nextItem); that.scrollToItem(that.option("focusedElement")) } else { parent.downArrow(e) } }; return extend({}, parent, { del: deleteFocusedItem, upArrow: moveFocusedItemUp, downArrow: moveFocusedItemDown }) }, _updateSelection: function() { this._editProvider.afterItemsRendered(); this.callBase() }, _getDefaultOptions: function() { return extend(this.callBase(), { showSelectionControls: false, selectionMode: "none", selectAllMode: "page", onSelectAllValueChanged: null, selectAllText: messageLocalization.format("dxList-selectAll"), menuItems: [], menuMode: "context", allowItemDeleting: false, itemDeleteMode: "toggle", allowItemReordering: false }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function(device) { return "ios" === device.platform }, options: { menuMode: "slide", itemDeleteMode: "slideItem" } }, { device: { platform: "android" }, options: { itemDeleteMode: "swipe" } }, { device: { platform: "win" }, options: { itemDeleteMode: "context" } }, { device: { platform: "generic" }, options: { itemDeleteMode: "static" } }]) }, _init: function() { this.callBase(); this._initEditProvider() }, _initDataSource: function() { this.callBase(); if (!this._isPageSelectAll()) { this._dataSource && this._dataSource.requireTotalCount(true) } }, _isPageSelectAll: function() { return "page" === this.option("selectAllMode") }, _initEditProvider: function() { this._editProvider = new EditProvider(this) }, _disposeEditProvider: function() { if (this._editProvider) { this._editProvider.dispose() } }, _refreshEditProvider: function() { this._disposeEditProvider(); this._initEditProvider() }, _initEditStrategy: function() { if (this.option("grouped")) { this._editStrategy = new GroupedEditStrategy(this) } else { this.callBase() } }, _render: function() { this._refreshEditProvider(); this.callBase() }, _renderItems: function() { this.callBase.apply(this, arguments); this._editProvider.afterItemsRendered() }, _selectedItemClass: function() { return LIST_ITEM_SELECTED_CLASS }, _itemResponseWaitClass: function() { return LIST_ITEM_RESPONSE_WAIT_CLASS }, _itemClickHandler: function(e) { var $itemElement = $(e.currentTarget); if ($itemElement.is(".dx-state-disabled, .dx-state-disabled *")) { return } var handledByEditProvider = this._editProvider.handleClick($itemElement, e); if (handledByEditProvider) { return } this.callBase.apply(this, arguments) }, _shouldFireContextMenuEvent: function() { return this.callBase.apply(this, arguments) || this._editProvider.contextMenuHandlerExists() }, _itemHoldHandler: function(e) { var $itemElement = $(e.currentTarget); if ($itemElement.is(".dx-state-disabled, .dx-state-disabled *")) { return } var isTouchEvent = eventUtils.isTouchEvent(e), handledByEditProvider = isTouchEvent && this._editProvider.handleContextMenu($itemElement, e); if (handledByEditProvider) { e.handledByEditProvider = true; return } this.callBase.apply(this, arguments) }, _itemContextMenuHandler: function(e) { var $itemElement = $(e.currentTarget); if ($itemElement.is(".dx-state-disabled, .dx-state-disabled *")) { return } var handledByEditProvider = !e.handledByEditProvider && this._editProvider.handleContextMenu($itemElement, e); if (handledByEditProvider) { e.preventDefault(); return } this.callBase.apply(this, arguments) }, _postprocessRenderItem: function(args) { this.callBase.apply(this, arguments); this._editProvider.modifyItemElement(args) }, _clean: function() { this._disposeEditProvider(); this.callBase() }, _optionChanged: function(args) { switch (args.name) { case "selectAllMode": this._initDataSource(); this._dataSource.pageIndex(0); this._dataSource.load(); break; case "grouped": this._clearSelectedItems(); delete this._renderingGroupIndex; this._initEditStrategy(); this.callBase(args); break; case "showSelectionControls": case "menuItems": case "menuMode": case "allowItemDeleting": case "itemDeleteMode": case "allowItemReordering": case "selectAllText": this._invalidate(); break; case "onSelectAllValueChanged": break; default: this.callBase(args) } }, selectAll: function() { return this._selection.selectAll(this._isPageSelectAll()) }, unselectAll: function() { return this._selection.deselectAll(this._isPageSelectAll()) }, isSelectAll: function() { return this._selection.getSelectAllState(this._isPageSelectAll()) }, getFlatIndexByItemElement: function(itemElement) { return this._itemElements().index(itemElement) }, getItemElementByFlatIndex: function(flatIndex) { var $itemElements = this._itemElements(); if (flatIndex < 0 || flatIndex >= $itemElements.length) { return $() } return $itemElements.eq(flatIndex) }, getItemByIndex: function(index) { return this._editStrategy.getItemDataByIndex(index) } }); module.exports = ListEdit }, /*!*****************************************************!*\ !*** ./js/ui/list/ui.list.edit.strategy.grouped.js ***! \*****************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), isNumeric = __webpack_require__( /*! ../../core/utils/common */ 14).isNumeric, EditStrategy = __webpack_require__( /*! ../collection/ui.collection_widget.edit.strategy.plain */ 167); var LIST_ITEM_CLASS = "dx-list-item", LIST_GROUP_CLASS = "dx-list-group"; var SELECTION_SHIFT = 20, SELECTION_MASK = 2303; var combineIndex = function(indices) { return (indices.group << SELECTION_SHIFT) + indices.item }; var splitIndex = function(combinedIndex) { return { group: combinedIndex >> SELECTION_SHIFT, item: combinedIndex & SELECTION_MASK } }; var GroupedEditStrategy = EditStrategy.inherit({ _groupElements: function() { return this._collectionWidget._itemContainer().find("." + LIST_GROUP_CLASS) }, _groupItemElements: function($group) { return $group.find("." + LIST_ITEM_CLASS) }, getIndexByItemData: function(itemData) { var groups = this._collectionWidget.option("items"), index = false; if (!itemData) { return false } if (itemData.items && itemData.items.length) { itemData = itemData.items[0] } $.each(groups, function(groupIndex, group) { if (!group.items) { return false } $.each(group.items, function(itemIndex, item) { if (item !== itemData) { return true } index = { group: groupIndex, item: itemIndex }; return false }); if (index) { return false } }); return index }, getItemDataByIndex: function(index) { var items = this._collectionWidget.option("items"); if (isNumeric(index)) { return this.itemsGetter()[index] } return index && items[index.group] && items[index.group].items[index.item] || null }, itemsGetter: function() { var resultItems = [], items = this._collectionWidget.option("items"); for (var i = 0; i < items.length; i++) { if (items[i] && items[i].items) { resultItems = resultItems.concat(items[i].items) } else { resultItems.push(items[i]) } } return resultItems }, deleteItemAtIndex: function(index) { var indices = splitIndex(index), itemGroup = this._collectionWidget.option("items")[indices.group].items; itemGroup.splice(indices.item, 1) }, getKeysByItems: function(items) { var plainItems = []; for (var i = 0; i < items.length; i++) { if (items[i] && items[i].items) { plainItems = plainItems.concat(items[i].items) } else { plainItems.push(items[i]) } } var result = []; for (i = 0; i < plainItems.length; i++) { result.push(this._collectionWidget.keyOf(plainItems[i])) } return result }, getIndexByKey: function(key, items) { var groups = items || this._collectionWidget.option("items"), index = -1, that = this; $.each(groups, function(groupIndex, group) { if (!group.items) { return } var keys = that.getKeysByItems(group.items); $.each(keys, function(keyIndex, itemKey) { if (that._equalKeys(itemKey, key)) { index = { group: groupIndex, item: keyIndex }; return false } }); if (index !== -1) { return false } }); return index }, getItemsByKeys: function(keys) { var result = []; $.each(keys, function(_, key) { var getItemMeta = function(groups) { var index = this.getIndexByKey(key, groups); var group = index && groups[index.group]; if (!group) { return } return { groupKey: group.key, item: group.items[index.item] } }.bind(this); var itemMeta = getItemMeta(this._collectionWidget.option("items")) || getItemMeta(this._collectionWidget.option("selectedItems")); var groupKey = itemMeta.groupKey; var item = itemMeta.item; var selectedGroup; $.each(result, function(_, item) { if (item.key === groupKey) { selectedGroup = item; return false } }); if (!selectedGroup) { selectedGroup = { key: groupKey, items: [] }; result.push(selectedGroup) } selectedGroup.items.push(item) }.bind(this)); return result }, moveItemAtIndexToIndex: function(movingIndex, destinationIndex) { var items = this._collectionWidget.option("items"), movingIndices = splitIndex(movingIndex), destinationIndices = splitIndex(destinationIndex), movingItemGroup = items[movingIndices.group].items, destinationItemGroup = items[destinationIndices.group].items, movedItemData = movingItemGroup[movingIndices.item]; movingItemGroup.splice(movingIndices.item, 1); destinationItemGroup.splice(destinationIndices.item, 0, movedItemData) }, _isItemIndex: function(index) { return index && isNumeric(index.group) && isNumeric(index.item) }, _getNormalizedItemIndex: function(itemElement) { var $item = $(itemElement), $group = $item.closest("." + LIST_GROUP_CLASS); if (!$group.length) { return -1 } return combineIndex({ group: this._groupElements().index($group), item: this._groupItemElements($group).index($item) }) }, _normalizeItemIndex: function(index) { return combineIndex(index) }, _denormalizeItemIndex: function(index) { return splitIndex(index) }, _getItemByNormalizedIndex: function(index) { var indices = splitIndex(index), $group = this._groupElements().eq(indices.group); return this._groupItemElements($group).eq(indices.item) }, _itemsFromSameParent: function(firstIndex, secondIndex) { return splitIndex(firstIndex).group === splitIndex(secondIndex).group } }); module.exports = GroupedEditStrategy }, /*!*********************************************!*\ !*** ./js/ui/list/ui.list.edit.provider.js ***! \*********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, Class = __webpack_require__( /*! ../../core/class */ 25), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, errors = __webpack_require__( /*! ../widget/ui.errors */ 22), decoratorRegistry = __webpack_require__( /*! ./ui.list.edit.decorator_registry */ 222); __webpack_require__( /*! ./ui.list.edit.decorator.static */ 223); __webpack_require__( /*! ./ui.list.edit.decorator.switchable.button */ 225); __webpack_require__( /*! ./ui.list.edit.decorator.switchable.slide */ 227); __webpack_require__( /*! ./ui.list.edit.decorator.swipe */ 229); __webpack_require__( /*! ./ui.list.edit.decorator.context */ 230); __webpack_require__( /*! ./ui.list.edit.decorator.selection */ 247); __webpack_require__( /*! ./ui.list.edit.decorator.reorder */ 250); var editOptionsRegistry = []; var registerOption = function(enabledFunc, decoratorTypeFunc, decoratorSubTypeFunc) { editOptionsRegistry.push({ enabled: enabledFunc, decoratorType: decoratorTypeFunc, decoratorSubType: decoratorSubTypeFunc }) }; registerOption(function() { return this.option("menuItems").length }, function() { return "menu" }, function() { return this.option("menuMode") }); registerOption(function() { return !this.option("menuItems").length && this.option("allowItemDeleting") }, function() { var mode = this.option("itemDeleteMode"); return "toggle" === mode || "slideButton" === mode || "swipe" === mode || "static" === mode ? "delete" : "menu" }, function() { var mode = this.option("itemDeleteMode"); if ("slideItem" === mode) { mode = "slide" } if ("hold" === mode) { mode = "context" } return mode }); registerOption(function() { return "none" !== this.option("selectionMode") && this.option("showSelectionControls") }, function() { return "selection" }, function() { return "default" }); registerOption(function() { return this.option("allowItemReordering") }, function() { return "reorder" }, function() { return "default" }); var LIST_ITEM_BEFORE_BAG_CLASS = "dx-list-item-before-bag", LIST_ITEM_AFTER_BAG_CLASS = "dx-list-item-after-bag", DECORATOR_BEFORE_BAG_CREATE_METHOD = "beforeBag", DECORATOR_AFTER_BAG_CREATE_METHOD = "afterBag", DECORATOR_MODIFY_ELEMENT_METHOD = "modifyElement", DECORATOR_AFTER_RENDER_METHOD = "afterRender"; var EditProvider = Class.inherit({ ctor: function(list) { this._list = list; this._fetchRequiredDecorators() }, dispose: function() { if (this._decorators && this._decorators.length) { $.each(this._decorators, function(_, decorator) { decorator.dispose() }) } }, _fetchRequiredDecorators: function() { this._decorators = []; $.each(editOptionsRegistry, function(_, option) { var optionEnabled = option.enabled.call(this._list); if (optionEnabled) { var decoratorType = option.decoratorType.call(this._list), decoratorSubType = option.decoratorSubType.call(this._list), decorator = this._createDecorator(decoratorType, decoratorSubType); this._decorators.push(decorator) } }.bind(this)) }, _createDecorator: function(type, subType) { var decoratorClass = this._findDecorator(type, subType); return new decoratorClass(this._list) }, _findDecorator: function(type, subType) { var foundDecorator = decoratorRegistry.registry[type][subType]; if (!foundDecorator) { throw errors.Error("E1012", type, subType) } return foundDecorator }, modifyItemElement: function(args) { var $itemElement = $(args.itemElement); var config = { $itemElement: $itemElement }; this._prependBeforeBags($itemElement, config); this._appendAfterBags($itemElement, config); this._applyDecorators(DECORATOR_MODIFY_ELEMENT_METHOD, config) }, afterItemsRendered: function() { this._applyDecorators(DECORATOR_AFTER_RENDER_METHOD) }, _prependBeforeBags: function($itemElement, config) { var $beforeBags = this._collectDecoratorsMarkup(DECORATOR_BEFORE_BAG_CREATE_METHOD, config, LIST_ITEM_BEFORE_BAG_CLASS); $itemElement.prepend($beforeBags) }, _appendAfterBags: function($itemElement, config) { var $afterBags = this._collectDecoratorsMarkup(DECORATOR_AFTER_BAG_CREATE_METHOD, config, LIST_ITEM_AFTER_BAG_CLASS); $itemElement.append($afterBags) }, _collectDecoratorsMarkup: function(method, config, containerClass) { var $collector = $("<div />"); $.each(this._decorators, function() { var $container = $("<div />").addClass(containerClass); this[method](extend({ $container: $container }, config)); if ($container.children().length) { $collector.append($container) } }); return $collector.children() }, _applyDecorators: function(method, config) { $.each(this._decorators, function() { this[method](config) }) }, _handlerExists: function(name) { if (!this._decorators) { return false } var decorators = this._decorators, length = decorators.length; for (var i = 0; i < length; i++) { if (decorators[i][name] !== noop) { return true } } return false }, _eventHandler: function(name, $itemElement, e) { if (!this._decorators) { return false } var response = false, decorators = this._decorators, length = decorators.length; for (var i = 0; i < length; i++) { response = decorators[i][name]($itemElement, e); if (response) { break } } return response }, handleClick: function($itemElement, e) { return this._eventHandler("handleClick", $itemElement, e) }, contextMenuHandlerExists: function() { return this._handlerExists("handleContextMenu") }, handleContextMenu: function($itemElement, e) { return this._eventHandler("handleContextMenu", $itemElement, e) } }); module.exports = EditProvider }, /*!*******************************************************!*\ !*** ./js/ui/list/ui.list.edit.decorator_registry.js ***! \*******************************************************/ function(module, exports, __webpack_require__) { var extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend; exports.registry = {}; exports.register = function(option, type, decoratorClass) { var decoratorsRegistry = exports.registry; var decoratorConfig = {}; decoratorConfig[option] = decoratorsRegistry[option] ? decoratorsRegistry[option] : {}; decoratorConfig[option][type] = decoratorClass; decoratorsRegistry = extend(decoratorsRegistry, decoratorConfig) } }, /*!*****************************************************!*\ !*** ./js/ui/list/ui.list.edit.decorator.static.js ***! \*****************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Button = __webpack_require__( /*! ../button */ 201), registerDecorator = __webpack_require__( /*! ./ui.list.edit.decorator_registry */ 222).register, EditDecorator = __webpack_require__( /*! ./ui.list.edit.decorator */ 224); var STATIC_DELETE_BUTTON_CONTAINER_CLASS = "dx-list-static-delete-button-container", STATIC_DELETE_BUTTON_CLASS = "dx-list-static-delete-button"; registerDecorator("delete", "static", EditDecorator.inherit({ afterBag: function(config) { var $itemElement = config.$itemElement, $container = config.$container; var $button = $("<div>").addClass(STATIC_DELETE_BUTTON_CLASS); this._list._createComponent($button, Button, { icon: "remove", onClick: function(args) { args.jQueryEvent.stopPropagation(); this._deleteItem($itemElement) }.bind(this), integrationOptions: {} }); $container.addClass(STATIC_DELETE_BUTTON_CONTAINER_CLASS).append($button) }, _deleteItem: function($itemElement) { if ($itemElement.is(".dx-state-disabled, .dx-state-disabled *")) { return } this._list.deleteItem($itemElement) } })) }, /*!**********************************************!*\ !*** ./js/ui/list/ui.list.edit.decorator.js ***! \**********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, Class = __webpack_require__( /*! ../../core/class */ 25), swipeEvents = __webpack_require__( /*! ../../events/swipe */ 183), eventUtils = __webpack_require__( /*! ../../events/utils */ 71); var LIST_EDIT_DECORATOR = "dxListEditDecorator", SWIPE_START_EVENT_NAME = eventUtils.addNamespace(swipeEvents.start, LIST_EDIT_DECORATOR), SWIPE_UPDATE_EVENT_NAME = eventUtils.addNamespace(swipeEvents.swipe, LIST_EDIT_DECORATOR), SWIPE_END_EVENT_NAME = eventUtils.addNamespace(swipeEvents.end, LIST_EDIT_DECORATOR); var EditDecorator = Class.inherit({ ctor: function(list) { this._list = list; this._init() }, _init: noop, _shouldHandleSwipe: false, _attachSwipeEvent: function(config) { var swipeConfig = { itemSizeFunc: function() { if (this._clearSwipeCache) { this._itemWidthCache = this._list.element().width(); this._clearSwipeCache = false } return this._itemWidthCache }.bind(this) }; config.$itemElement.on(SWIPE_START_EVENT_NAME, swipeConfig, this._itemSwipeStartHandler.bind(this)).on(SWIPE_UPDATE_EVENT_NAME, this._itemSwipeUpdateHandler.bind(this)).on(SWIPE_END_EVENT_NAME, this._itemSwipeEndHandler.bind(this)) }, _itemSwipeStartHandler: function(e) { var $itemElement = $(e.currentTarget); if ($itemElement.is(".dx-state-disabled, .dx-state-disabled *")) { e.cancel = true; return } this._swipeStartHandler($itemElement, e) }, _itemSwipeUpdateHandler: function(e) { var $itemElement = $(e.currentTarget); this._swipeUpdateHandler($itemElement, e) }, _itemSwipeEndHandler: function(e) { var $itemElement = $(e.currentTarget); this._swipeEndHandler($itemElement, e); this._clearSwipeCache = true }, beforeBag: noop, afterBag: noop, _commonOptions: function() { return { activeStateEnabled: this._list.option("activeStateEnabled"), hoverStateEnabled: this._list.option("hoverStateEnabled"), focusStateEnabled: this._list.option("focusStateEnabled") } }, modifyElement: function(config) { if (this._shouldHandleSwipe) { this._attachSwipeEvent(config); this._clearSwipeCache = true } }, afterRender: noop, handleClick: noop, handleContextMenu: noop, _swipeStartHandler: noop, _swipeUpdateHandler: noop, _swipeEndHandler: noop, visibilityChange: noop, dispose: noop }); module.exports = EditDecorator }, /*!****************************************************************!*\ !*** ./js/ui/list/ui.list.edit.decorator.switchable.button.js ***! \****************************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), fx = __webpack_require__( /*! ../../animation/fx */ 68), Button = __webpack_require__( /*! ../button */ 201), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), registerDecorator = __webpack_require__( /*! ./ui.list.edit.decorator_registry */ 222).register, SwitchableEditDecorator = __webpack_require__( /*! ./ui.list.edit.decorator.switchable */ 226); var SWITCHABLE_DELETE_BUTTON_CONTAINER_CLASS = "dx-list-switchable-delete-button-container", SWITCHABLE_DELETE_BUTTON_WRAPPER_CLASS = "dx-list-switchable-delete-button-wrapper", SWITCHABLE_DELETE_BUTTON_INNER_WRAPPER_CLASS = "dx-list-switchable-delete-button-inner-wrapper", SWITCHABLE_DELETE_BUTTON_CLASS = "dx-list-switchable-delete-button", SWITCHABLE_DELETE_BUTTON_ANIMATION_DURATION = 200; var SwitchableButtonEditDecorator = SwitchableEditDecorator.inherit({ _init: function() { this.callBase.apply(this, arguments); var $buttonContainer = $("<div >").addClass(SWITCHABLE_DELETE_BUTTON_CONTAINER_CLASS), $buttonWrapper = $("<div />").addClass(SWITCHABLE_DELETE_BUTTON_WRAPPER_CLASS), $buttonInnerWrapper = $("<div />").addClass(SWITCHABLE_DELETE_BUTTON_INNER_WRAPPER_CLASS), $button = $("<div />").addClass(SWITCHABLE_DELETE_BUTTON_CLASS); this._list._createComponent($button, Button, { text: messageLocalization.format("dxListEditDecorator-delete"), type: "danger", onClick: function(e) { this._deleteItem(); e.jQueryEvent.stopPropagation() }.bind(this), integrationOptions: {} }); $buttonContainer.append($buttonWrapper); $buttonWrapper.append($buttonInnerWrapper); $buttonInnerWrapper.append($button); this._$buttonContainer = $buttonContainer }, _enablePositioning: function($itemElement) { this.callBase.apply(this, arguments); fx.stop(this._$buttonContainer, true); this._$buttonContainer.appendTo($itemElement) }, _disablePositioning: function() { this.callBase.apply(this, arguments); this._$buttonContainer.detach() }, _animatePrepareDeleteReady: function() { var rtl = this._isRtlEnabled(), listWidth = this._list.element().width(), buttonWidth = this._buttonWidth(), fromValue = rtl ? listWidth : -buttonWidth, toValue = rtl ? listWidth - buttonWidth : 0; return fx.animate(this._$buttonContainer, { type: "custom", duration: SWITCHABLE_DELETE_BUTTON_ANIMATION_DURATION, from: { right: fromValue }, to: { right: toValue } }) }, _animateForgetDeleteReady: function() { var rtl = this._isRtlEnabled(), listWidth = this._list.element().width(), buttonWidth = this._buttonWidth(), fromValue = rtl ? listWidth - buttonWidth : 0, toValue = rtl ? listWidth : -buttonWidth; return fx.animate(this._$buttonContainer, { type: "custom", duration: SWITCHABLE_DELETE_BUTTON_ANIMATION_DURATION, from: { right: fromValue }, to: { right: toValue } }) }, _buttonWidth: function() { if (!this._buttonContainerWidth) { this._buttonContainerWidth = this._$buttonContainer.outerWidth() } return this._buttonContainerWidth }, dispose: function() { if (this._$buttonContainer) { this._$buttonContainer.remove() } this.callBase.apply(this, arguments) } }); var TOGGLE_DELETE_SWITCH_CONTAINER_CLASS = "dx-list-toggle-delete-switch-container", TOGGLE_DELETE_SWITCH_CLASS = "dx-list-toggle-delete-switch"; registerDecorator("delete", "toggle", SwitchableButtonEditDecorator.inherit({ beforeBag: function(config) { var $itemElement = config.$itemElement, $container = config.$container; var $toggle = $("<div />").addClass(TOGGLE_DELETE_SWITCH_CLASS); this._list._createComponent($toggle, Button, { icon: "toggle-delete", onClick: function(e) { this._toggleDeleteReady($itemElement); e.jQueryEvent.stopPropagation() }.bind(this), integrationOptions: {} }); $container.addClass(TOGGLE_DELETE_SWITCH_CONTAINER_CLASS); $container.append($toggle) } })); registerDecorator("delete", "slideButton", SwitchableButtonEditDecorator.inherit({ _shouldHandleSwipe: true, _swipeEndHandler: function($itemElement, args) { if (0 !== args.targetOffset) { this._toggleDeleteReady($itemElement) } return true } })); module.exports = SwitchableButtonEditDecorator }, /*!*********************************************************!*\ !*** ./js/ui/list/ui.list.edit.decorator.switchable.js ***! \*********************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, EditDecorator = __webpack_require__( /*! ./ui.list.edit.decorator */ 224), abstract = EditDecorator.abstract, eventUtils = __webpack_require__( /*! ../../events/utils */ 71), pointerEvents = __webpack_require__( /*! ../../events/pointer */ 76), feedbackEvents = __webpack_require__( /*! ../../events/core/emitter.feedback */ 104); var LIST_EDIT_DECORATOR = "dxListEditDecorator", POINTER_DOWN_EVENT_NAME = eventUtils.addNamespace(pointerEvents.down, LIST_EDIT_DECORATOR), ACTIVE_EVENT_NAME = eventUtils.addNamespace(feedbackEvents.active, LIST_EDIT_DECORATOR), LIST_ITEM_CONTENT_CLASS = "dx-list-item-content", SWITCHABLE_DELETE_READY_CLASS = "dx-list-switchable-delete-ready", SWITCHABLE_MENU_SHIELD_POSITIONING_CLASS = "dx-list-switchable-menu-shield-positioning", SWITCHABLE_DELETE_TOP_SHIELD_CLASS = "dx-list-switchable-delete-top-shield", SWITCHABLE_DELETE_BOTTOM_SHIELD_CLASS = "dx-list-switchable-delete-bottom-shield", SWITCHABLE_MENU_ITEM_SHIELD_POSITIONING_CLASS = "dx-list-switchable-menu-item-shield-positioning", SWITCHABLE_DELETE_ITEM_CONTENT_SHIELD_CLASS = "dx-list-switchable-delete-item-content-shield"; var SwitchableEditDecorator = EditDecorator.inherit({ _init: function() { this._$topShield = $("<div />").addClass(SWITCHABLE_DELETE_TOP_SHIELD_CLASS); this._$bottomShield = $("<div />").addClass(SWITCHABLE_DELETE_BOTTOM_SHIELD_CLASS); this._$itemContentShield = $("<div />").addClass(SWITCHABLE_DELETE_ITEM_CONTENT_SHIELD_CLASS); this._$topShield.on(POINTER_DOWN_EVENT_NAME, this._cancelDeleteReadyItem.bind(this)); this._$bottomShield.on(POINTER_DOWN_EVENT_NAME, this._cancelDeleteReadyItem.bind(this)); this._list.element().append(this._$topShield.toggle(false)).append(this._$bottomShield.toggle(false)) }, handleClick: function() { return this._cancelDeleteReadyItem() }, _cancelDeleteReadyItem: function() { if (!this._$readyToDeleteItem) { return false } this._cancelDelete(this._$readyToDeleteItem); return true }, _cancelDelete: function($itemElement) { this._toggleDeleteReady($itemElement, false) }, _toggleDeleteReady: function($itemElement, readyToDelete) { if (void 0 === readyToDelete) { readyToDelete = !this._isReadyToDelete($itemElement) } this._toggleShields($itemElement, readyToDelete); this._toggleScrolling(readyToDelete); this._cacheReadyToDeleteItem($itemElement, readyToDelete); this._animateToggleDelete($itemElement, readyToDelete) }, _isReadyToDelete: function($itemElement) { return $itemElement.hasClass(SWITCHABLE_DELETE_READY_CLASS) }, _toggleShields: function($itemElement, enabled) { this._list.element().toggleClass(SWITCHABLE_MENU_SHIELD_POSITIONING_CLASS, enabled); this._$topShield.toggle(enabled); this._$bottomShield.toggle(enabled); if (enabled) { this._updateShieldsHeight($itemElement) } this._toggleContentShield($itemElement, enabled) }, _updateShieldsHeight: function($itemElement) { var $list = this._list.element(), listTopOffset = $list.offset().top, listHeight = $list.outerHeight(), itemTopOffset = $itemElement.offset().top, itemHeight = $itemElement.outerHeight(), dirtyTopShieldHeight = itemTopOffset - listTopOffset, dirtyBottomShieldHeight = listHeight - itemHeight - dirtyTopShieldHeight; this._$topShield.height(Math.max(dirtyTopShieldHeight, 0)); this._$bottomShield.height(Math.max(dirtyBottomShieldHeight, 0)) }, _toggleContentShield: function($itemElement, enabled) { if (enabled) { $itemElement.find("." + LIST_ITEM_CONTENT_CLASS).first().append(this._$itemContentShield) } else { this._$itemContentShield.detach() } }, _toggleScrolling: function(readyToDelete) { var scrollView = this._list.element().dxScrollView("instance"); if (readyToDelete) { scrollView.on("start", this._cancelScrolling) } else { scrollView.off("start", this._cancelScrolling) } }, _cancelScrolling: function(args) { args.jQueryEvent.cancel = true }, _cacheReadyToDeleteItem: function($itemElement, cache) { if (cache) { this._$readyToDeleteItem = $itemElement } else { delete this._$readyToDeleteItem } }, _animateToggleDelete: function($itemElement, readyToDelete) { if (readyToDelete) { this._enablePositioning($itemElement); this._prepareDeleteReady($itemElement); this._animatePrepareDeleteReady($itemElement) } else { this._forgetDeleteReady($itemElement); this._animateForgetDeleteReady($itemElement).done(this._disablePositioning.bind(this, $itemElement)) } }, _enablePositioning: function($itemElement) { $itemElement.addClass(SWITCHABLE_MENU_ITEM_SHIELD_POSITIONING_CLASS); $itemElement.on(ACTIVE_EVENT_NAME, noop) }, _disablePositioning: function($itemElement) { $itemElement.removeClass(SWITCHABLE_MENU_ITEM_SHIELD_POSITIONING_CLASS); $itemElement.off(ACTIVE_EVENT_NAME) }, _prepareDeleteReady: function($itemElement) { $itemElement.addClass(SWITCHABLE_DELETE_READY_CLASS) }, _forgetDeleteReady: function($itemElement) { $itemElement.removeClass(SWITCHABLE_DELETE_READY_CLASS) }, _animatePrepareDeleteReady: abstract, _animateForgetDeleteReady: abstract, _deleteItem: function($itemElement) { $itemElement = $itemElement || this._$readyToDeleteItem; if ($itemElement.is(".dx-state-disabled, .dx-state-disabled *")) { return } this._list.deleteItem($itemElement).always(this._cancelDelete.bind(this, $itemElement)) }, _isRtlEnabled: function() { return this._list.option("rtlEnabled") }, dispose: function() { if (this._$topShield) { this._$topShield.remove() } if (this._$bottomShield) { this._$bottomShield.remove() } this.callBase.apply(this, arguments) } }); module.exports = SwitchableEditDecorator }, /*!***************************************************************!*\ !*** ./js/ui/list/ui.list.edit.decorator.switchable.slide.js ***! \***************************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, clickEvent = __webpack_require__( /*! ../../events/click */ 75), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), translator = __webpack_require__( /*! ../../animation/translator */ 69), eventUtils = __webpack_require__( /*! ../../events/utils */ 71), feedbackEvents = __webpack_require__( /*! ../../events/core/emitter.feedback */ 104), EditDecoratorMenuHelperMixin = __webpack_require__( /*! ./ui.list.edit.decorator_menu_helper */ 228), registerDecorator = __webpack_require__( /*! ./ui.list.edit.decorator_registry */ 222).register, SwitchableEditDecorator = __webpack_require__( /*! ./ui.list.edit.decorator.switchable */ 226), fx = __webpack_require__( /*! ../../animation/fx */ 68), ActionSheet = __webpack_require__( /*! ../action_sheet */ 206); var LIST_EDIT_DECORATOR = "dxListEditDecorator", CLICK_EVENT_NAME = eventUtils.addNamespace(clickEvent.name, LIST_EDIT_DECORATOR), ACTIVE_EVENT_NAME = eventUtils.addNamespace(feedbackEvents.active, LIST_EDIT_DECORATOR), SLIDE_MENU_CLASS = "dx-list-slide-menu", SLIDE_MENU_WRAPPER_CLASS = "dx-list-slide-menu-wrapper", SLIDE_MENU_CONTENT_CLASS = "dx-list-slide-menu-content", SLIDE_MENU_BUTTONS_CONTAINER_CLASS = "dx-list-slide-menu-buttons-container", SLIDE_MENU_BUTTONS_CLASS = "dx-list-slide-menu-buttons", SLIDE_MENU_BUTTON_CLASS = "dx-list-slide-menu-button", SLIDE_MENU_BUTTON_MENU_CLASS = "dx-list-slide-menu-button-menu", SLIDE_MENU_BUTTON_DELETE_CLASS = "dx-list-slide-menu-button-delete", SLIDE_MENU_ANIMATION_DURATION = 400, SLIDE_MENU_ANIMATION_EASING = "cubic-bezier(0.075, 0.82, 0.165, 1)"; registerDecorator("menu", "slide", SwitchableEditDecorator.inherit({ _shouldHandleSwipe: true, _init: function() { this.callBase.apply(this, arguments); this._$buttonsContainer = $("<div/>").addClass(SLIDE_MENU_BUTTONS_CONTAINER_CLASS).on(ACTIVE_EVENT_NAME, noop); this._$buttons = $("<div/>").addClass(SLIDE_MENU_BUTTONS_CLASS).appendTo(this._$buttonsContainer); this._renderMenu(); this._renderDeleteButton() }, _renderMenu: function() { if (!this._menuEnabled()) { return } var menuItems = this._menuItems(); if (1 === menuItems.length) { var menuItem = menuItems[0]; this._renderMenuButton(menuItem.text, function(e) { e.stopPropagation(); this._fireAction(menuItem) }.bind(this)) } else { var $menu = $("<div />").addClass(SLIDE_MENU_CLASS); this._menu = this._list._createComponent($menu, ActionSheet, { showTitle: false, items: menuItems, onItemClick: function(args) { this._fireAction(args.itemData) }.bind(this), integrationOptions: {} }); $menu.appendTo(this._list.element()); var $menuButton = this._renderMenuButton(messageLocalization.format("dxListEditDecorator-more"), function(e) { e.stopPropagation(); this._menu.show() }.bind(this)); this._menu.option("target", $menuButton) } }, _renderMenuButton: function(text, action) { var $menuButton = $("<div/>").addClass(SLIDE_MENU_BUTTON_CLASS).addClass(SLIDE_MENU_BUTTON_MENU_CLASS).text(text); this._$buttons.append($menuButton); $menuButton.on(CLICK_EVENT_NAME, action); return $menuButton }, _renderDeleteButton: function() { if (!this._deleteEnabled()) { return } var $deleteButton = $("<div/>").addClass(SLIDE_MENU_BUTTON_CLASS).addClass(SLIDE_MENU_BUTTON_DELETE_CLASS).text(messageLocalization.format("dxListEditDecorator-delete")); $deleteButton.on(CLICK_EVENT_NAME, function(e) { e.stopPropagation(); this._deleteItem() }.bind(this)); this._$buttons.append($deleteButton) }, _fireAction: function(menuItem) { this._fireMenuAction($(this._cachedNode), menuItem.action); this._cancelDeleteReadyItem() }, modifyElement: function(config) { this.callBase.apply(this, arguments); var $itemElement = config.$itemElement; $itemElement.addClass(SLIDE_MENU_WRAPPER_CLASS); var $slideMenuContent = $("<div/>").addClass(SLIDE_MENU_CONTENT_CLASS); $itemElement.wrapInner($slideMenuContent) }, handleClick: function(_, e) { if ($(e.target).closest("." + SLIDE_MENU_CONTENT_CLASS).length) { return this.callBase.apply(this, arguments) } return false }, _swipeStartHandler: function($itemElement) { this._enablePositioning($itemElement); this._cacheItemData($itemElement); this._setPositions(this._getPositions(0)) }, _swipeUpdateHandler: function($itemElement, args) { var rtl = this._isRtlEnabled(), signCorrection = rtl ? -1 : 1, isItemReadyToDelete = this._isReadyToDelete($itemElement), moveJustStarted = this._getCurrentPositions().content === this._getStartPositions().content; if (moveJustStarted && !isItemReadyToDelete && args.offset * signCorrection > 0) { args.cancel = true; return } var offset = this._cachedItemWidth * args.offset, startOffset = isItemReadyToDelete ? -this._cachedButtonWidth * signCorrection : 0, correctedOffset = (offset + startOffset) * signCorrection, percent = correctedOffset < 0 ? Math.abs((offset + startOffset) / this._cachedButtonWidth) : 0; this._setPositions(this._getPositions(percent)); return true }, _getStartPositions: function() { var rtl = this._isRtlEnabled(), signCorrection = rtl ? -1 : 1; return { content: 0, buttonsContainer: rtl ? -this._cachedButtonWidth : this._cachedItemWidth, buttons: -this._cachedButtonWidth * signCorrection } }, _getPositions: function(percent) { var rtl = this._isRtlEnabled(), signCorrection = rtl ? -1 : 1, startPositions = this._getStartPositions(); return { content: startPositions.content - percent * this._cachedButtonWidth * signCorrection, buttonsContainer: startPositions.buttonsContainer - Math.min(percent, 1) * this._cachedButtonWidth * signCorrection, buttons: startPositions.buttons + Math.min(percent, 1) * this._cachedButtonWidth * signCorrection } }, _getCurrentPositions: function() { return { content: translator.locate(this._$cachedContent).left, buttonsContainer: translator.locate(this._$buttonsContainer).left, buttons: translator.locate(this._$buttons).left } }, _setPositions: function(positions) { translator.move(this._$cachedContent, { left: positions.content }); translator.move(this._$buttonsContainer, { left: positions.buttonsContainer }); translator.move(this._$buttons, { left: positions.buttons }) }, _cacheItemData: function($itemElement) { if ($itemElement[0] === this._cachedNode) { return } this._$cachedContent = $itemElement.find("." + SLIDE_MENU_CONTENT_CLASS); this._cachedItemWidth = $itemElement.outerWidth(); this._cachedButtonWidth = this._cachedButtonWidth || this._$buttons.outerWidth(); this._$buttonsContainer.width(this._cachedButtonWidth); if (this._$cachedContent.length) { this._cachedNode = $itemElement[0] } }, _minButtonContainerLeftOffset: function() { return this._cachedItemWidth - this._cachedButtonWidth }, _swipeEndHandler: function($itemElement, args) { this._cacheItemData($itemElement); var signCorrection = this._isRtlEnabled() ? 1 : -1, offset = this._cachedItemWidth * args.offset, endedAtReadyToDelete = !this._isReadyToDelete($itemElement) && offset * signCorrection > .2 * this._cachedButtonWidth, readyToDelete = args.targetOffset === signCorrection && endedAtReadyToDelete; this._toggleDeleteReady($itemElement, readyToDelete); return true }, _enablePositioning: function($itemElement) { fx.stop(this._$cachedContent, true); this.callBase.apply(this, arguments); this._$buttonsContainer.appendTo($itemElement) }, _disablePositioning: function() { this.callBase.apply(this, arguments); this._$buttonsContainer.detach() }, _animatePrepareDeleteReady: function() { return this._animateToPositions(this._getPositions(1)) }, _animateForgetDeleteReady: function($itemElement) { this._cacheItemData($itemElement); return this._animateToPositions(this._getPositions(0)) }, _animateToPositions: function(positions) { var that = this, currentPosition = this._getCurrentPositions(), durationTimePart = Math.min(Math.abs(currentPosition.content - positions.content) / this._cachedButtonWidth, 1); return fx.animate(this._$cachedContent, { from: currentPosition, to: positions, easing: SLIDE_MENU_ANIMATION_EASING, duration: SLIDE_MENU_ANIMATION_DURATION * durationTimePart, strategy: "frame", draw: function(positions) { that._setPositions(positions) } }) }, dispose: function() { if (this._menu) { this._menu.element().remove() } if (this._$buttonsContainer) { this._$buttonsContainer.remove() } this.callBase.apply(this, arguments) } }).include(EditDecoratorMenuHelperMixin)) }, /*!**********************************************************!*\ !*** ./js/ui/list/ui.list.edit.decorator_menu_helper.js ***! \**********************************************************/ function(module, exports) { var EditDecoratorMenuHelperMixin = { _menuEnabled: function() { return !!this._menuItems().length }, _menuItems: function() { return this._list.option("menuItems") }, _deleteEnabled: function() { return this._list.option("allowItemDeleting") }, _fireMenuAction: function($itemElement, action) { this._list._itemEventHandlerByHandler($itemElement, action, {}, { excludeValidators: ["disabled", "readOnly"] }) } }; module.exports = EditDecoratorMenuHelperMixin }, /*!****************************************************!*\ !*** ./js/ui/list/ui.list.edit.decorator.swipe.js ***! \****************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), translator = __webpack_require__( /*! ../../animation/translator */ 69), fx = __webpack_require__( /*! ../../animation/fx */ 68), registerDecorator = __webpack_require__( /*! ./ui.list.edit.decorator_registry */ 222).register, EditDecorator = __webpack_require__( /*! ./ui.list.edit.decorator */ 224); registerDecorator("delete", "swipe", EditDecorator.inherit({ _shouldHandleSwipe: true, _renderItemPosition: function($itemElement, offset, animate) { var deferred = $.Deferred(), itemOffset = offset * this._itemElementWidth; if (animate) { fx.animate($itemElement, { to: { left: itemOffset }, type: "slide", complete: function() { deferred.resolve($itemElement, offset) } }) } else { translator.move($itemElement, { left: itemOffset }); deferred.resolve() } return deferred.promise() }, _swipeStartHandler: function($itemElement) { this._itemElementWidth = $itemElement.width(); return true }, _swipeUpdateHandler: function($itemElement, args) { this._renderItemPosition($itemElement, args.offset); return true }, _swipeEndHandler: function($itemElement, args) { var offset = args.targetOffset; this._renderItemPosition($itemElement, offset, true).done(function($itemElement, offset) { if (Math.abs(offset)) { this._list.deleteItem($itemElement).fail(function() { this._renderItemPosition($itemElement, 0, true) }.bind(this)) } }.bind(this)); return true } })) }, /*!******************************************************!*\ !*** ./js/ui/list/ui.list.edit.decorator.context.js ***! \******************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), EditDecoratorMenuHelperMixin = __webpack_require__( /*! ./ui.list.edit.decorator_menu_helper */ 228), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), registerDecorator = __webpack_require__( /*! ./ui.list.edit.decorator_registry */ 222).register, EditDecorator = __webpack_require__( /*! ./ui.list.edit.decorator */ 224), Overlay = __webpack_require__( /*! ../overlay */ 109), ListBase = __webpack_require__( /*! ./ui.list.base */ 231); var CONTEXTMENU_CLASS = "dx-list-context-menu", CONTEXTMENU_MENUCONTENT_CLASS = "dx-list-context-menucontent"; registerDecorator("menu", "context", EditDecorator.inherit({ _init: function() { var $menu = $("<div/>").addClass(CONTEXTMENU_CLASS); this._list.element().append($menu); this._menu = this._renderOverlay($menu) }, _renderOverlay: function($element) { return this._list._createComponent($element, Overlay, { shading: false, deferRendering: true, closeOnTargetScroll: true, closeOnOutsideClick: function(e) { return !$(e.target).closest("." + CONTEXTMENU_CLASS).length }, animation: { show: { type: "slide", duration: 300, from: { height: 0, opacity: 1 }, to: { height: function() { return this._$menuList.outerHeight() }.bind(this), opacity: 1 } }, hide: { type: "slide", duration: 0, from: { opacity: 1 }, to: { opacity: 0 } } }, height: function() { return this._$menuList ? this._$menuList.outerHeight() : 0 }.bind(this), width: function() { return this._list.element().outerWidth() }.bind(this), onContentReady: this._renderMenuContent.bind(this) }) }, _renderMenuContent: function(e) { var $overlayContent = e.component.content(); var items = this._menuItems().slice(); if (this._deleteEnabled()) { items.push({ text: messageLocalization.format("dxListEditDecorator-delete"), action: this._deleteItem.bind(this) }) } this._$menuList = $("<div>"); this._list._createComponent(this._$menuList, ListBase, { items: items, onItemClick: this._menuItemClickHandler.bind(this), height: "auto", integrationOptions: {} }); $overlayContent.addClass(CONTEXTMENU_MENUCONTENT_CLASS); $overlayContent.append(this._$menuList) }, _menuItemClickHandler: function(args) { this._menu.hide(); this._fireMenuAction(this._$itemWithMenu, args.itemData.action) }, _deleteItem: function() { this._list.deleteItem(this._$itemWithMenu) }, handleContextMenu: function($itemElement) { this._$itemWithMenu = $itemElement; this._menu.option({ position: { my: "top", at: "bottom", of: $itemElement, collision: "flip" } }); this._menu.show(); return true }, dispose: function() { if (this._menu) { this._menu.element().remove() } this.callBase.apply(this, arguments) } }).include(EditDecoratorMenuHelperMixin)) }, /*!************************************!*\ !*** ./js/ui/list/ui.list.base.js ***! \************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), typeUtils = __webpack_require__( /*! ../../core/utils/type */ 12), compileGetter = __webpack_require__( /*! ../../core/utils/data */ 50).compileGetter, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, clickEvent = __webpack_require__( /*! ../../events/click */ 75), swipeEvents = __webpack_require__( /*! ../../events/swipe */ 183), support = __webpack_require__( /*! ../../core/utils/support */ 61), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), inkRipple = __webpack_require__( /*! ../widget/utils.ink_ripple */ 202), devices = __webpack_require__( /*! ../../core/devices */ 53), ListItem = __webpack_require__( /*! ./item */ 232), Button = __webpack_require__( /*! ../button */ 201), eventUtils = __webpack_require__( /*! ../../events/utils */ 71), themes = __webpack_require__( /*! ../themes */ 143), ScrollView = __webpack_require__( /*! ../scroll_view */ 233), deviceDependentOptions = __webpack_require__( /*! ../scroll_view/ui.scrollable */ 244).deviceDependentOptions, CollectionWidget = __webpack_require__( /*! ../collection/ui.collection_widget.edit */ 149), BindableTemplate = __webpack_require__( /*! ../widget/bindable_template */ 166); var LIST_CLASS = "dx-list", LIST_ITEM_CLASS = "dx-list-item", LIST_ITEM_SELECTOR = "." + LIST_ITEM_CLASS, LIST_GROUP_CLASS = "dx-list-group", LIST_GROUP_HEADER_CLASS = "dx-list-group-header", LIST_GROUP_BODY_CLASS = "dx-list-group-body", LIST_COLLAPSIBLE_GROUPS_CLASS = "dx-list-collapsible-groups", LIST_GROUP_COLLAPSED_CLASS = "dx-list-group-collapsed", LIST_HAS_NEXT_CLASS = "dx-has-next", LIST_NEXT_BUTTON_CLASS = "dx-list-next-button", SELECT_ALL_SELECTOR = ".dx-list-select-all", LIST_ITEM_DATA_KEY = "dxListItemData", LIST_FEEDBACK_SHOW_TIMEOUT = 70; var groupItemsGetter = compileGetter("items"); var ListBase = CollectionWidget.inherit({ _activeStateUnit: [LIST_ITEM_SELECTOR, SELECT_ALL_SELECTOR].join(","), _supportedKeys: function() { var that = this; var moveFocusPerPage = function(direction) { var $item = getEdgeVisibleItem(direction), isFocusedItem = $item.is(that.option("focusedElement")); if (isFocusedItem) { scrollListTo($item, direction); $item = getEdgeVisibleItem(direction) } that.option("focusedElement", $item); that.scrollToItem($item) }; var getEdgeVisibleItem = function(direction) { var scrollTop = that.scrollTop(), containerHeight = that.element().height(); var $item = that.option("focusedElement"), isItemVisible = true; if (!$item) { return $() } while (isItemVisible) { var $nextItem = $item[direction](); if (!$nextItem.length) { break } var nextItemLocation = $nextItem.position().top + $nextItem.outerHeight() / 2; isItemVisible = nextItemLocation < containerHeight + scrollTop && nextItemLocation > scrollTop; if (isItemVisible) { $item = $nextItem } } return $item }; var scrollListTo = function($item, direction) { var resultPosition = $item.position().top; if ("prev" === direction) { resultPosition = $item.position().top - that.element().height() + $item.outerHeight() } that.scrollTo(resultPosition) }; return extend(this.callBase(), { leftArrow: commonUtils.noop, rightArrow: commonUtils.noop, pageUp: function() { moveFocusPerPage("prev"); return false }, pageDown: function() { moveFocusPerPage("next"); return false } }) }, _setDeprecatedOptions: function() { this.callBase(); extend(this._deprecatedOptions, { autoPagingEnabled: { since: "15.1", message: "Use the 'pageLoadMode' option instead" }, showNextButton: { since: "15.1", message: "Use the 'pageLoadMode' option instead" } }) }, _getDefaultOptions: function() { return extend(this.callBase(), { hoverStateEnabled: true, pullRefreshEnabled: false, scrollingEnabled: true, showScrollbar: "onScroll", useNativeScrolling: true, bounceEnabled: true, scrollByContent: true, scrollByThumb: false, pullingDownText: messageLocalization.format("dxList-pullingDownText"), pulledDownText: messageLocalization.format("dxList-pulledDownText"), refreshingText: messageLocalization.format("dxList-refreshingText"), pageLoadingText: messageLocalization.format("dxList-pageLoadingText"), onScroll: null, onPullRefresh: null, onPageLoading: null, pageLoadMode: "scrollBottom", nextButtonText: messageLocalization.format("dxList-nextButtonText"), onItemSwipe: null, grouped: false, onGroupRendered: null, collapsibleGroups: false, groupTemplate: "group", indicateLoading: true, activeStateEnabled: true, _itemAttributes: { role: "option" }, useInkRipple: false, showChevronExpr: function(data) { return data ? data.showChevron : void 0 }, badgeExpr: function(data) { return data ? data.badge : void 0 } }) }, _defaultOptionsRules: function() { return this.callBase().concat(deviceDependentOptions(), [{ device: function() { return !support.nativeScrolling }, options: { useNativeScrolling: false } }, { device: function(device) { return !support.nativeScrolling && !devices.isSimulator() && "generic" === devices.real().platform && "generic" === device.platform }, options: { showScrollbar: "onHover", pageLoadMode: "nextButton" } }, { device: function() { return "desktop" === devices.real().deviceType && !devices.isSimulator() }, options: { focusStateEnabled: true } }, { device: function() { return /android5/.test(themes.current()) }, options: { useInkRipple: true } }, { device: function() { return "win" === devices.current().platform && devices.isSimulator() }, options: { bounceEnabled: false } }]) }, _visibilityChanged: function(visible) { if (visible) { this._updateLoadingState(true) } }, _itemClass: function() { return LIST_ITEM_CLASS }, _itemDataKey: function() { return LIST_ITEM_DATA_KEY }, _itemContainer: function() { return this._$container }, _refreshItemElements: function() { if (!this.option("grouped")) { this._itemElementsCache = this._itemContainer().children(this._itemSelector()) } else { this._itemElementsCache = this._itemContainer().children("." + LIST_GROUP_CLASS).children("." + LIST_GROUP_BODY_CLASS).children(this._itemSelector()) } }, _reorderItem: function(itemElement, toItemElement) { this.callBase(itemElement, toItemElement); this._refreshItemElements() }, _deleteItem: function(itemElement) { this.callBase(itemElement); this._refreshItemElements() }, _itemElements: function() { return this._itemElementsCache }, _itemSelectHandler: function(e) { if ("single" === this.option("selectionMode") && this.isItemSelected(e.currentTarget)) { return } this.callBase(e) }, _allowDynamicItemsAppend: function() { return true }, _init: function() { this.callBase(); this._$container = this.element(); this._initScrollView(); this._feedbackShowTimeout = LIST_FEEDBACK_SHOW_TIMEOUT; this._createGroupRenderAction(); this.setAria("role", "listbox") }, _dataSourceOptions: function() { this._suppressDeprecatedWarnings(); var pagingEnabled = this.option("autoPagingEnabled"); pagingEnabled = commonUtils.isDefined(this.option("showNextButton")) ? pagingEnabled || this.option("showNextButton") : pagingEnabled; this._resumeDeprecatedWarnings(); return extend(this.callBase(), { paginate: commonUtils.isDefined(pagingEnabled) ? pagingEnabled : true }) }, _dataSourceFromUrlLoadMode: function() { return "raw" }, _initScrollView: function() { this._suppressDeprecatedWarnings(); var scrollingEnabled = this.option("scrollingEnabled"), pullRefreshEnabled = scrollingEnabled && this.option("pullRefreshEnabled"), autoPagingEnabled = scrollingEnabled && commonUtils.ensureDefined(this.option("autoPagingEnabled"), "scrollBottom" === this.option("pageLoadMode")) && !!this._dataSource; this._resumeDeprecatedWarnings(); this._scrollView = this._createComponent(this.element(), ScrollView, { disabled: this.option("disabled") || !scrollingEnabled, onScroll: this._scrollHandler.bind(this), onPullDown: pullRefreshEnabled ? this._pullDownHandler.bind(this) : null, onReachBottom: autoPagingEnabled ? this._scrollBottomHandler.bind(this) : null, showScrollbar: this.option("showScrollbar"), useNative: this.option("useNativeScrolling"), bounceEnabled: this.option("bounceEnabled"), scrollByContent: this.option("scrollByContent"), scrollByThumb: this.option("scrollByThumb"), pullingDownText: this.option("pullingDownText"), pulledDownText: this.option("pulledDownText"), refreshingText: this.option("refreshingText"), reachBottomText: this.option("pageLoadingText"), useKeyboard: false }); this._$container = this._scrollView.content(); this._createScrollViewActions() }, _createScrollViewActions: function() { this._scrollAction = this._createActionByOption("onScroll"); this._pullRefreshAction = this._createActionByOption("onPullRefresh"); this._pageLoadingAction = this._createActionByOption("onPageLoading") }, _scrollHandler: function(e) { this._scrollAction && this._scrollAction(e) }, _initTemplates: function() { this.callBase(); this._defaultTemplates.group = new BindableTemplate(function($container, data) { if (typeUtils.isPlainObject(data)) { if (data.key) { $container.text(data.key) } } else { $container.html(String(data)) } }, ["key"], this.option("integrationOptions.watchMethod")) }, _updateLoadingState: function(tryLoadMore) { this._suppressDeprecatedWarnings(); var isDataLoaded = !tryLoadMore || this._isLastPage(), autoPagingEnabled = commonUtils.ensureDefined(this.option("autoPagingEnabled"), "scrollBottom" === this.option("pageLoadMode")), stopLoading = isDataLoaded || !autoPagingEnabled, hideLoadIndicator = stopLoading && !this._isDataSourceLoading(); this._resumeDeprecatedWarnings(); if (stopLoading || this._scrollViewIsFull()) { this._scrollView.release(hideLoadIndicator); this._toggleNextButton(this._shouldRenderNextButton() && !isDataLoaded); this._loadIndicationSuppressed(false) } else { this._infiniteDataLoading() } }, _shouldRenderNextButton: function() { this._suppressDeprecatedWarnings(); var result = commonUtils.ensureDefined(this.option("showNextButton"), "nextButton" === this.option("pageLoadMode")) && this._dataSource && this._dataSource.isLoaded(); this._resumeDeprecatedWarnings(); return result }, _dataSourceLoadingChangedHandler: function(isLoading) { if (this._loadIndicationSuppressed()) { return } if (isLoading && this.option("indicateLoading")) { this._showLoadingIndicatorTimer = setTimeout(function() { var isEmpty = !this._itemElements().length; if (this._scrollView && !isEmpty) { this._scrollView.startLoading() } }.bind(this)) } else { clearTimeout(this._showLoadingIndicatorTimer); this._scrollView && this._scrollView.finishLoading() } }, _dataSourceChangedHandler: function(newItems) { if (!this._shouldAppendItems()) { this._scrollView && this._scrollView.scrollTo(0) } this.callBase(newItems) }, _hideLoadingIfLoadIndicationOff: function() { if (!this.option("indicateLoading")) { this._dataSourceLoadingChangedHandler(false) } }, _loadIndicationSuppressed: function(value) { if (!arguments.length) { return this._isLoadIndicationSuppressed } this._isLoadIndicationSuppressed = value }, _scrollViewIsFull: function() { return !this._scrollView || this._scrollView.isFull() }, _pullDownHandler: function(e) { this._pullRefreshAction(e); if (this._dataSource && !this._isDataSourceLoading()) { this._clearSelectedItems(); this._dataSource.pageIndex(0); this._dataSource.reload() } else { this._updateLoadingState() } }, _infiniteDataLoading: function() { var isElementVisible = this.element().is(":visible"); if (isElementVisible && !this._scrollViewIsFull() && !this._isDataSourceLoading() && !this._isLastPage()) { clearTimeout(this._loadNextPageTimer); this._loadNextPageTimer = setTimeout(this._loadNextPage.bind(this)) } }, _scrollBottomHandler: function(e) { this._pageLoadingAction(e); if (!this._isDataSourceLoading() && !this._isLastPage()) { this._loadNextPage() } else { this._updateLoadingState() } }, _renderItems: function(items) { if (this.option("grouped")) { $.each(items, this._renderGroup.bind(this)); this._attachGroupCollapseEvent(); this._renderEmptyMessage() } else { this.callBase.apply(this, arguments) } this._refreshItemElements(); this._updateLoadingState(true) }, _attachGroupCollapseEvent: function() { var eventName = eventUtils.addNamespace(clickEvent.name, this.NAME), selector = "." + LIST_GROUP_HEADER_CLASS, $element = this.element(), collapsibleGroups = this.option("collapsibleGroups"); $element.toggleClass(LIST_COLLAPSIBLE_GROUPS_CLASS, collapsibleGroups); $element.off(eventName, selector); if (collapsibleGroups) { $element.on(eventName, selector, function(e) { this._createAction(function(e) { var $group = $(e.jQueryEvent.currentTarget).parent(); this._collapseGroupHandler($group); if (this.option("focusStateEnabled")) { this.option("focusedElement", $group.find("." + LIST_ITEM_CLASS).eq(0)) } }.bind(this), { validatingTargetName: "element" })({ jQueryEvent: e }) }.bind(this)) } }, _collapseGroupHandler: function($group, toggle) { var deferred = $.Deferred(), $groupBody = $group.children("." + LIST_GROUP_BODY_CLASS); $group.toggleClass(LIST_GROUP_COLLAPSED_CLASS, toggle); var slideMethod = "slideToggle"; if (true === toggle) { slideMethod = "slideUp" } if (false === toggle) { slideMethod = "slideDown" } $groupBody[slideMethod]({ duration: 200, complete: function() { this.updateDimensions(); this._updateLoadingState(); deferred.resolve() }.bind(this) }); return deferred.promise() }, _dataSourceLoadErrorHandler: function() { this._forgetNextPageLoading(); if (this._initialized) { this._renderEmptyMessage(); this._updateLoadingState() } }, _render: function() { this._itemElementsCache = $(); this.element().addClass(LIST_CLASS); this.callBase(); this.option("useInkRipple") && this._renderInkRipple() }, _renderInkRipple: function() { this._inkRipple = inkRipple.render() }, _toggleActiveState: function($element, value, e) { this.callBase.apply(this, arguments); if (!this._inkRipple) { return } var config = { element: $element, jQueryEvent: e }; if (value) { this._inkRipple.showWave(config) } else { this._inkRipple.hideWave(config) } }, _postprocessRenderItem: function(args) { this._refreshItemElements(); this.callBase.apply(this, arguments); if (this.option("onItemSwipe")) { this._attachSwipeEvent($(args.itemElement)) } }, _attachSwipeEvent: function($itemElement) { var endEventName = eventUtils.addNamespace(swipeEvents.end, this.NAME); $itemElement.on(endEventName, this._itemSwipeEndHandler.bind(this)) }, _itemSwipeEndHandler: function(e) { this._itemJQueryEventHandler(e, "onItemSwipe", { direction: e.offset < 0 ? "left" : "right" }) }, _nextButtonHandler: function() { var source = this._dataSource; if (source && !source.isLoading()) { this._scrollView.toggleLoading(true); this._$nextButton.detach(); this._loadIndicationSuppressed(true); this._loadNextPage() } }, _renderGroup: function(index, group) { var $groupElement = $("<div>").addClass(LIST_GROUP_CLASS).appendTo(this._itemContainer()); var $groupHeaderElement = $("<div>").addClass(LIST_GROUP_HEADER_CLASS).appendTo($groupElement); var groupTemplateName = this.option("groupTemplate"), groupTemplate = this._getTemplate(group.template || groupTemplateName, group, index, $groupHeaderElement), renderArgs = { index: index, itemData: group, container: $groupHeaderElement }; this._createItemByTemplate(groupTemplate, renderArgs); this._renderingGroupIndex = index; var $groupBody = $("<div>").addClass(LIST_GROUP_BODY_CLASS).appendTo($groupElement); $.each(groupItemsGetter(group) || [], function(index, item) { this._renderItem(index, item, $groupBody) }.bind(this)); this._groupRenderAction({ groupElement: $groupElement, groupIndex: index, groupData: group }) }, _createGroupRenderAction: function() { this._groupRenderAction = this._createActionByOption("onGroupRendered") }, _clean: function() { if (this._$nextButton) { this._$nextButton.remove(); this._$nextButton = null } this.callBase.apply(this, arguments) }, _dispose: function() { clearTimeout(this._holdTimer); clearTimeout(this._loadNextPageTimer); clearTimeout(this._showLoadingIndicatorTimer); this.callBase() }, _toggleDisabledState: function(value) { this.callBase(value); this._scrollView.option("disabled", value || !this.option("scrollingEnabled")) }, _toggleNextButton: function(value) { var dataSource = this._dataSource, $nextButton = this._getNextButton(); this.element().toggleClass(LIST_HAS_NEXT_CLASS, value); if (value && dataSource && dataSource.isLoaded()) { $nextButton.appendTo(this._itemContainer()) } if (!value) { $nextButton.detach() } }, _getNextButton: function() { if (!this._$nextButton) { this._$nextButton = this._createNextButton() } return this._$nextButton }, _createNextButton: function() { var $result = $("<div>").addClass(LIST_NEXT_BUTTON_CLASS); var $button = $("<div>").appendTo($result); this._createComponent($button, Button, { text: this.option("nextButtonText"), onClick: this._nextButtonHandler.bind(this), integrationOptions: {} }); return $result }, _moveFocus: function() { this.callBase.apply(this, arguments); this.scrollToItem(this.option("focusedElement")) }, _refresh: function() { var scrollTop = this._scrollView.scrollTop(); this.callBase(); scrollTop && this._scrollView.scrollTo(scrollTop) }, _optionChanged: function(args) { switch (args.name) { case "pageLoadMode": this._toggleNextButton(args.value); this._initScrollView(); break; case "showNextButton": this._toggleNextButton(args.value); break; case "dataSource": this.callBase(args); this._initScrollView(); break; case "pullingDownText": case "pulledDownText": case "refreshingText": case "pageLoadingText": case "useNative": case "showScrollbar": case "bounceEnabled": case "scrollByContent": case "scrollByThumb": case "scrollingEnabled": case "pullRefreshEnabled": case "autoPagingEnabled": this._initScrollView(); this._updateLoadingState(); break; case "nextButtonText": case "onItemSwipe": case "useInkRipple": this._invalidate(); break; case "onScroll": case "onPullRefresh": case "onPageLoading": this._createScrollViewActions(); this._invalidate(); break; case "grouped": case "collapsibleGroups": case "groupTemplate": this._invalidate(); break; case "onGroupRendered": this._createGroupRenderAction(); break; case "width": case "height": this.callBase(args); this._scrollView.update(); break; case "indicateLoading": this._hideLoadingIfLoadIndicationOff(); break; case "visible": this.callBase(args); this._scrollView.update(); break; case "rtlEnabled": this._initScrollView(); this.callBase(args); break; case "showChevronExpr": case "badgeExpr": this._invalidate(); break; default: this.callBase(args) } }, _extendActionArgs: function($itemElement) { if (!this.option("grouped")) { return this.callBase($itemElement) } var $group = $itemElement.closest("." + LIST_GROUP_CLASS); var $item = $group.find("." + LIST_ITEM_CLASS); return extend(this.callBase($itemElement), { itemIndex: { group: $group.index(), item: $item.index($itemElement) } }) }, expandGroup: function(groupIndex) { var deferred = $.Deferred(), $group = this._itemContainer().find("." + LIST_GROUP_CLASS).eq(groupIndex); this._collapseGroupHandler($group, false).done(function() { deferred.resolveWith(this) }.bind(this)); return deferred.promise() }, collapseGroup: function(groupIndex) { var deferred = $.Deferred(), $group = this._itemContainer().find("." + LIST_GROUP_CLASS).eq(groupIndex); this._collapseGroupHandler($group, true).done(function() { deferred.resolveWith(this) }.bind(this)); return deferred }, updateDimensions: function() { var that = this, deferred = $.Deferred(); if (that._scrollView) { that._scrollView.update().done(function() { !that._scrollViewIsFull() && that._updateLoadingState(true); deferred.resolveWith(that) }) } else { deferred.resolveWith(that) } return deferred.promise() }, reload: function() { this.scrollTo(0); this._pullDownHandler() }, repaint: function() { this.scrollTo(0); this.callBase() }, scrollTop: function() { return this._scrollView.scrollOffset().top }, clientHeight: function() { return this._scrollView.clientHeight() }, scrollHeight: function() { return this._scrollView.scrollHeight() }, scrollBy: function(distance) { this._scrollView.scrollBy(distance) }, scrollTo: function(location) { this._scrollView.scrollTo(location) }, scrollToItem: function(itemElement) { var $item = this._editStrategy.getItemElement(itemElement); this._scrollView.scrollToElement($item) } }); ListBase.ItemClass = ListItem; module.exports = ListBase; module.exports.mockScrollView = function(Mock) { ScrollView = Mock } }, /*!****************************!*\ !*** ./js/ui/list/item.js ***! \****************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), CollectionWidgetItem = __webpack_require__( /*! ../collection/item */ 163); var LIST_ITEM_BADGE_CONTAINER_CLASS = "dx-list-item-badge-container", LIST_ITEM_BADGE_CLASS = "dx-list-item-badge", BADGE_CLASS = "dx-badge", LIST_ITEM_CHEVRON_CONTAINER_CLASS = "dx-list-item-chevron-container", LIST_ITEM_CHEVRON_CLASS = "dx-list-item-chevron"; var ListItem = CollectionWidgetItem.inherit({ _renderWatchers: function() { this.callBase(); this._startWatcher("badge", this._renderBadge.bind(this)); this._startWatcher("showChevron", this._renderShowChevron.bind(this)) }, _renderBadge: function(badge) { this._$element.children("." + LIST_ITEM_BADGE_CONTAINER_CLASS).remove(); if (!badge) { return } var $badge = $("<div>").addClass(LIST_ITEM_BADGE_CONTAINER_CLASS).append($("<div>").addClass(LIST_ITEM_BADGE_CLASS).addClass(BADGE_CLASS).text(badge)); var $chevron = this._$element.children("." + LIST_ITEM_CHEVRON_CONTAINER_CLASS).first(); $chevron.length > 0 ? $badge.insertBefore($chevron) : $badge.appendTo(this._$element) }, _renderShowChevron: function(showChevron) { this._$element.children("." + LIST_ITEM_CHEVRON_CONTAINER_CLASS).remove(); if (!showChevron) { return } var $chevronContainer = $("<div>").addClass(LIST_ITEM_CHEVRON_CONTAINER_CLASS), $chevron = $("<div>").addClass(LIST_ITEM_CHEVRON_CLASS); $chevronContainer.append($chevron).appendTo(this._$element) } }); module.exports = ListItem }, /*!******************************!*\ !*** ./js/ui/scroll_view.js ***! \******************************/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__( /*! ./scroll_view/ui.scroll_view */ 234) }, /*!*********************************************!*\ !*** ./js/ui/scroll_view/ui.scroll_view.js ***! \*********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), devices = __webpack_require__( /*! ../../core/devices */ 53), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, PullDownStrategy = __webpack_require__( /*! ./ui.scroll_view.native.pull_down */ 235), SwipeDownStrategy = __webpack_require__( /*! ./ui.scroll_view.native.swipe_down */ 239), SlideDownStrategy = __webpack_require__( /*! ./ui.scroll_view.native.slide_down */ 240), SimulatedStrategy = __webpack_require__( /*! ./ui.scroll_view.simulated */ 241), Scrollable = __webpack_require__( /*! ./ui.scrollable */ 244), LoadIndicator = __webpack_require__( /*! ../load_indicator */ 238), config = __webpack_require__( /*! ../../core/config */ 15), LoadPanel = __webpack_require__( /*! ../load_panel */ 246); var SCROLLVIEW_CLASS = "dx-scrollview", SCROLLVIEW_CONTENT_CLASS = SCROLLVIEW_CLASS + "-content", SCROLLVIEW_TOP_POCKET_CLASS = SCROLLVIEW_CLASS + "-top-pocket", SCROLLVIEW_BOTTOM_POCKET_CLASS = SCROLLVIEW_CLASS + "-bottom-pocket", SCROLLVIEW_PULLDOWN_CLASS = SCROLLVIEW_CLASS + "-pull-down", SCROLLVIEW_REACHBOTTOM_CLASS = SCROLLVIEW_CLASS + "-scrollbottom", SCROLLVIEW_REACHBOTTOM_INDICATOR_CLASS = SCROLLVIEW_REACHBOTTOM_CLASS + "-indicator", SCROLLVIEW_REACHBOTTOM_TEXT_CLASS = SCROLLVIEW_REACHBOTTOM_CLASS + "-text", SCROLLVIEW_LOADPANEL = SCROLLVIEW_CLASS + "-loadpanel"; var refreshStrategies = { pullDown: PullDownStrategy, swipeDown: SwipeDownStrategy, slideDown: SlideDownStrategy, simulated: SimulatedStrategy }; var ScrollView = Scrollable.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { pullingDownText: messageLocalization.format("dxScrollView-pullingDownText"), pulledDownText: messageLocalization.format("dxScrollView-pulledDownText"), refreshingText: messageLocalization.format("dxScrollView-refreshingText"), reachBottomText: messageLocalization.format("dxScrollView-reachBottomText"), onPullDown: null, onReachBottom: null, refreshStrategy: "pullDown" }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function() { var realDevice = devices.real(); return "android" === realDevice.platform }, options: { refreshStrategy: "swipeDown" } }, { device: function() { return "win" === devices.real().platform }, options: { refreshStrategy: "slideDown" } }]) }, _init: function() { this.callBase(); this._loadingIndicatorEnabled = true }, _initMarkup: function() { this.callBase(); this.element().addClass(SCROLLVIEW_CLASS); this._initContent(); this._initTopPocket(); this._initBottomPocket(); this._initLoadPanel() }, _initContent: function() { var $content = $("<div>").addClass(SCROLLVIEW_CONTENT_CLASS); this._$content.wrapInner($content) }, _initTopPocket: function() { var $topPocket = this._$topPocket = $("<div>").addClass(SCROLLVIEW_TOP_POCKET_CLASS), $pullDown = this._$pullDown = $("<div>").addClass(SCROLLVIEW_PULLDOWN_CLASS); $topPocket.append($pullDown); this._$content.prepend($topPocket) }, _initBottomPocket: function() { var $bottomPocket = this._$bottomPocket = $("<div>").addClass(SCROLLVIEW_BOTTOM_POCKET_CLASS), $reachBottom = this._$reachBottom = $("<div>").addClass(SCROLLVIEW_REACHBOTTOM_CLASS), $loadContainer = $("<div>").addClass(SCROLLVIEW_REACHBOTTOM_INDICATOR_CLASS), $loadIndicator = new LoadIndicator($("<div>")).element(), $text = this._$reachBottomText = $("<div>").addClass(SCROLLVIEW_REACHBOTTOM_TEXT_CLASS); this._updateReachBottomText(); $reachBottom.append($loadContainer.append($loadIndicator)).append($text); $bottomPocket.append($reachBottom); this._$content.append($bottomPocket) }, _initLoadPanel: function() { this._loadPanel = this._createComponent($("<div>").addClass(SCROLLVIEW_LOADPANEL).appendTo(this.element()), LoadPanel, { shading: false, delay: 400, message: this.option("refreshingText"), position: { of: this.element() } }) }, _updateReachBottomText: function() { this._$reachBottomText.text(this.option("reachBottomText")) }, _createStrategy: function() { var strategyName = this.option("useNative") ? this.option("refreshStrategy") : "simulated"; var strategyClass = refreshStrategies[strategyName]; if (!strategyClass) { throw Error("E1030", this.option("refreshStrategy")) } this._strategy = new strategyClass(this); this._strategy.pullDownCallbacks.add(this._pullDownHandler.bind(this)); this._strategy.releaseCallbacks.add(this._releaseHandler.bind(this)); this._strategy.reachBottomCallbacks.add(this._reachBottomHandler.bind(this)) }, _createActions: function() { this.callBase(); this._pullDownAction = this._createActionByOption("onPullDown"); this._reachBottomAction = this._createActionByOption("onReachBottom"); this._refreshPocketState() }, _refreshPocketState: function() { this._pullDownEnable(this.hasActionSubscription("onPullDown") && !config().designMode); this._reachBottomEnable(this.hasActionSubscription("onReachBottom") && !config().designMode) }, on: function(eventName) { var result = this.callBase.apply(this, arguments); if ("pullDown" === eventName || "reachBottom" === eventName) { this._refreshPocketState() } return result }, _pullDownEnable: function(enabled) { if (0 === arguments.length) { return this._pullDownEnabled } this._$pullDown.toggle(enabled); this._strategy.pullDownEnable(enabled); this._pullDownEnabled = enabled }, _reachBottomEnable: function(enabled) { if (0 === arguments.length) { return this._reachBottomEnabled } this._$reachBottom.toggle(enabled); this._strategy.reachBottomEnable(enabled); this._reachBottomEnabled = enabled }, _pullDownHandler: function() { this._loadingIndicator(false); this._pullDownLoading() }, _loadingIndicator: function(value) { if (arguments.length < 1) { return this._loadingIndicatorEnabled } this._loadingIndicatorEnabled = value }, _pullDownLoading: function() { this.startLoading(); this._pullDownAction() }, _reachBottomHandler: function() { this._loadingIndicator(false); this._reachBottomLoading() }, _reachBottomLoading: function() { this.startLoading(); this._reachBottomAction() }, _releaseHandler: function() { this.finishLoading(); this._loadingIndicator(true) }, _optionChanged: function(args) { switch (args.name) { case "onPullDown": case "onReachBottom": this._createActions(); break; case "pullingDownText": case "pulledDownText": case "refreshingText": case "refreshStrategy": this._invalidate(); break; case "reachBottomText": this._updateReachBottomText(); break; default: this.callBase(args) } }, isEmpty: function() { return !this.content().children().length }, content: function() { return this._$content.children().eq(1) }, release: function(preventReachBottom) { if (void 0 !== preventReachBottom) { this.toggleLoading(!preventReachBottom) } return this._strategy.release() }, toggleLoading: function(showOrHide) { this._reachBottomEnable(showOrHide) }, isFull: function() { return this.content().height() > this._$container.height() }, refresh: function() { if (!this.hasActionSubscription("onPullDown")) { return } this._strategy.pendingRelease(); this._pullDownLoading() }, startLoading: function() { if (this._loadingIndicator() && this.element().is(":visible")) { this._loadPanel.show() } this._lock() }, finishLoading: function() { this._loadPanel.hide(); this._unlock() }, _dispose: function() { this._strategy.dispose(); this.callBase(); if (this._loadPanel) { this._loadPanel.element().remove() } } }); registerComponent("dxScrollView", ScrollView); module.exports = ScrollView }, /*!**************************************************************!*\ !*** ./js/ui/scroll_view/ui.scroll_view.native.pull_down.js ***! \**************************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), translator = __webpack_require__( /*! ../../animation/translator */ 69), NativeStrategy = __webpack_require__( /*! ./ui.scrollable.native */ 236), LoadIndicator = __webpack_require__( /*! ../load_indicator */ 238); var SCROLLVIEW_PULLDOWN_REFRESHING_CLASS = "dx-scrollview-pull-down-loading", SCROLLVIEW_PULLDOWN_READY_CLASS = "dx-scrollview-pull-down-ready", SCROLLVIEW_PULLDOWN_IMAGE_CLASS = "dx-scrollview-pull-down-image", SCROLLVIEW_PULLDOWN_INDICATOR_CLASS = "dx-scrollview-pull-down-indicator", SCROLLVIEW_PULLDOWN_TEXT_CLASS = "dx-scrollview-pull-down-text", STATE_RELEASED = 0, STATE_READY = 1, STATE_REFRESHING = 2, STATE_LOADING = 3, PULLDOWN_RELEASE_TIME = 400; var PullDownNativeScrollViewStrategy = NativeStrategy.inherit({ _init: function(scrollView) { this.callBase(scrollView); this._$topPocket = scrollView._$topPocket; this._$pullDown = scrollView._$pullDown; this._$bottomPocket = scrollView._$bottomPocket; this._$refreshingText = scrollView._$refreshingText; this._$scrollViewContent = scrollView.content(); this._initCallbacks() }, _initCallbacks: function() { this.pullDownCallbacks = $.Callbacks(); this.releaseCallbacks = $.Callbacks(); this.reachBottomCallbacks = $.Callbacks() }, render: function() { this.callBase(); this._renderPullDown(); this._releaseState() }, _renderPullDown: function() { var $image = $("<div>").addClass(SCROLLVIEW_PULLDOWN_IMAGE_CLASS), $loadContainer = $("<div>").addClass(SCROLLVIEW_PULLDOWN_INDICATOR_CLASS), $loadIndicator = new LoadIndicator($("<div>")).element(), $text = this._$pullDownText = $("<div>").addClass(SCROLLVIEW_PULLDOWN_TEXT_CLASS); this._$pullingDownText = $("<div>").text(this.option("pullingDownText")).appendTo($text); this._$pulledDownText = $("<div>").text(this.option("pulledDownText")).appendTo($text); this._$refreshingText = $("<div>").text(this.option("refreshingText")).appendTo($text); this._$pullDown.empty().append($image).append($loadContainer.append($loadIndicator)).append($text) }, _releaseState: function() { this._state = STATE_RELEASED; this._refreshPullDownText() }, _pushBackFromBoundary: function() { if (!this._isLocked() && !this._component.isEmpty()) { this.callBase() } }, _refreshPullDownText: function() { this._$pullingDownText.css("opacity", this._state === STATE_RELEASED ? 1 : 0); this._$pulledDownText.css("opacity", this._state === STATE_READY ? 1 : 0); this._$refreshingText.css("opacity", this._state === STATE_REFRESHING ? 1 : 0) }, update: function() { this.callBase(); this._setTopPocketOffset() }, _updateDimensions: function() { this.callBase(); this._topPocketSize = this._$topPocket.height(); this._bottomPocketSize = this._$bottomPocket.height(); this._scrollOffset = this._$container.height() - this._$content.height() }, _allowedDirections: function() { var allowedDirections = this.callBase(); allowedDirections.vertical = allowedDirections.vertical || this._pullDownEnabled; return allowedDirections }, _setTopPocketOffset: function() { this._$topPocket.css({ top: -this._topPocketSize }) }, handleEnd: function() { this.callBase(); this._complete() }, handleStop: function() { this.callBase(); this._complete() }, _complete: function() { if (this._state === STATE_READY) { this._setPullDownOffset(this._topPocketSize); clearTimeout(this._pullDownRefreshTimeout); this._pullDownRefreshTimeout = setTimeout(function() { this._pullDownRefreshing() }.bind(this), 400) } }, _setPullDownOffset: function(offset) { translator.move(this._$topPocket, { top: offset }); translator.move(this._$scrollViewContent, { top: offset }) }, handleScroll: function(e) { this.callBase(e); if (this._state === STATE_REFRESHING) { return } var currentLocation = this.location().top, scrollDelta = (this._location || 0) - currentLocation; this._location = currentLocation; if (this._isPullDown()) { this._pullDownReady() } else { if (scrollDelta > 0 && this._isReachBottom()) { this._reachBottom() } else { this._stateReleased() } } }, _isPullDown: function() { return this._pullDownEnabled && this._location >= this._topPocketSize }, _isReachBottom: function() { return this._reachBottomEnabled && this._location <= this._scrollOffset + this._bottomPocketSize }, _reachBottom: function() { if (this._state === STATE_LOADING) { return } this._state = STATE_LOADING; this.reachBottomCallbacks.fire() }, _pullDownReady: function() { if (this._state === STATE_READY) { return } this._state = STATE_READY; this._$pullDown.addClass(SCROLLVIEW_PULLDOWN_READY_CLASS); this._refreshPullDownText() }, _stateReleased: function() { if (this._state === STATE_RELEASED) { return } this._$pullDown.removeClass(SCROLLVIEW_PULLDOWN_REFRESHING_CLASS).removeClass(SCROLLVIEW_PULLDOWN_READY_CLASS); this._releaseState() }, _pullDownRefreshing: function() { if (this._state === STATE_REFRESHING) { return } this._state = STATE_REFRESHING; this._$pullDown.addClass(SCROLLVIEW_PULLDOWN_REFRESHING_CLASS).removeClass(SCROLLVIEW_PULLDOWN_READY_CLASS); this._refreshPullDownText(); this.pullDownCallbacks.fire() }, pullDownEnable: function(enabled) { if (enabled) { this._updateDimensions(); this._setTopPocketOffset() } this._pullDownEnabled = enabled }, reachBottomEnable: function(enabled) { this._reachBottomEnabled = enabled }, pendingRelease: function() { this._state = STATE_READY }, release: function() { var deferred = $.Deferred(); this._updateDimensions(); clearTimeout(this._releaseTimeout); if (this._state === STATE_LOADING) { this._state = STATE_RELEASED } this._releaseTimeout = setTimeout(function() { this._setPullDownOffset(0); this._stateReleased(); this.releaseCallbacks.fire(); this._updateAction(); deferred.resolve() }.bind(this), PULLDOWN_RELEASE_TIME); return deferred.promise() }, dispose: function() { clearTimeout(this._pullDownRefreshTimeout); clearTimeout(this._releaseTimeout); this.callBase() } }); module.exports = PullDownNativeScrollViewStrategy }, /*!***************************************************!*\ !*** ./js/ui/scroll_view/ui.scrollable.native.js ***! \***************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, devices = __webpack_require__( /*! ../../core/devices */ 53), Class = __webpack_require__( /*! ../../core/class */ 25), Scrollbar = __webpack_require__( /*! ./ui.scrollbar */ 237); var SCROLLABLE_NATIVE = "dxNativeScrollable", SCROLLABLE_NATIVE_CLASS = "dx-scrollable-native", SCROLLABLE_SCROLLBAR_SIMULATED = "dx-scrollable-scrollbar-simulated", SCROLLABLE_SCROLLBARS_HIDDEN = "dx-scrollable-scrollbars-hidden", VERTICAL = "vertical", HORIZONTAL = "horizontal", HIDE_SCROLLBAR_TIMEOUT = 500; var NativeStrategy = Class.inherit({ ctor: function(scrollable) { this._init(scrollable) }, _init: function(scrollable) { this._component = scrollable; this._$element = scrollable.element(); this._$container = scrollable._$container; this._$content = scrollable._$content; this._direction = scrollable.option("direction"); this._useSimulatedScrollbar = scrollable.option("useSimulatedScrollbar"); this._showScrollbar = scrollable.option("showScrollbar"); this.option = scrollable.option.bind(scrollable); this._createActionByOption = scrollable._createActionByOption.bind(scrollable); this._isLocked = scrollable._isLocked.bind(scrollable); this._isDirection = scrollable._isDirection.bind(scrollable); this._allowedDirection = scrollable._allowedDirection.bind(scrollable) }, render: function() { this._renderPushBackOffset(); var device = devices.real(), deviceType = device.platform; this._$element.addClass(SCROLLABLE_NATIVE_CLASS).addClass(SCROLLABLE_NATIVE_CLASS + "-" + deviceType).toggleClass(SCROLLABLE_SCROLLBARS_HIDDEN, !this._showScrollbar); if (this._showScrollbar && this._useSimulatedScrollbar) { this._renderScrollbars() } }, _renderPushBackOffset: function() { var pushBackValue = this.option("pushBackValue"); if (!pushBackValue && !this._component._lastPushBackValue) { return } this._$content.css({ paddingTop: pushBackValue, paddingBottom: pushBackValue }); this._component._lastPushBackValue = pushBackValue }, _renderScrollbars: function() { this._scrollbars = {}; this._hideScrollbarTimeout = 0; this._$element.addClass(SCROLLABLE_SCROLLBAR_SIMULATED); this._renderScrollbar(VERTICAL); this._renderScrollbar(HORIZONTAL) }, _renderScrollbar: function(direction) { if (!this._isDirection(direction)) { return } this._scrollbars[direction] = new Scrollbar($("<div>").appendTo(this._$element), { direction: direction, expandable: this._component.option("scrollByThumb") }) }, handleInit: noop, handleStart: function() { this._disablePushBack = true }, handleMove: function(e) { if (this._isLocked()) { e.cancel = true; return } if (this._allowedDirection()) { e.originalEvent.isScrollingEvent = true } }, handleEnd: function() { this._disablePushBack = false }, handleCancel: noop, handleStop: noop, _eachScrollbar: function(callback) { callback = callback.bind(this); $.each(this._scrollbars || {}, function(direction, scrollbar) { callback(scrollbar, direction) }) }, createActions: function() { this._scrollAction = this._createActionByOption("onScroll"); this._updateAction = this._createActionByOption("onUpdated") }, _createActionArgs: function() { var location = this.location(); return { jQueryEvent: this._eventForUserAction, scrollOffset: { top: -location.top, left: -location.left }, reachedLeft: this._isDirection(HORIZONTAL) ? location.left >= 0 : void 0, reachedRight: this._isDirection(HORIZONTAL) ? location.left <= this._containerSize.width - this._componentContentSize.width : void 0, reachedTop: this._isDirection(VERTICAL) ? location.top >= 0 : void 0, reachedBottom: this._isDirection(VERTICAL) ? location.top <= this._containerSize.height - this._componentContentSize.height : void 0 } }, handleScroll: function(e) { if (!this._isScrollLocationChanged()) { e.stopImmediatePropagation(); return } this._eventForUserAction = e; this._moveScrollbars(); this._scrollAction(this._createActionArgs()); this._lastLocation = this.location(); this._pushBackFromBoundary() }, _pushBackFromBoundary: function() { var pushBackValue = this.option("pushBackValue"); if (!pushBackValue || this._disablePushBack) { return } var scrollOffset = this._containerSize.height - this._contentSize.height, scrollTopPos = this._$container.scrollTop(), scrollBottomPos = scrollOffset + scrollTopPos - 2 * pushBackValue; if (!scrollTopPos) { this._$container.scrollTop(pushBackValue) } else { if (!scrollBottomPos) { this._$container.scrollTop(pushBackValue - scrollOffset) } } }, _isScrollLocationChanged: function() { var currentLocation = this.location(), lastLocation = this._lastLocation || {}, isTopChanged = lastLocation.top !== currentLocation.top, isLeftChanged = lastLocation.left !== currentLocation.left; return isTopChanged || isLeftChanged }, _moveScrollbars: function() { this._eachScrollbar(function(scrollbar) { scrollbar.moveTo(this.location()); scrollbar.option("visible", true) }); this._hideScrollbars() }, _hideScrollbars: function() { clearTimeout(this._hideScrollbarTimeout); this._hideScrollbarTimeout = setTimeout(function() { this._eachScrollbar(function(scrollbar) { scrollbar.option("visible", false) }) }.bind(this), HIDE_SCROLLBAR_TIMEOUT) }, location: function() { return { left: -this._$container.scrollLeft(), top: this.option("pushBackValue") - this._$container.scrollTop() } }, disabledChanged: noop, update: function() { this._update(); this._updateAction(this._createActionArgs()) }, _update: function() { this._updateDimensions(); this._updateScrollbars() }, _updateDimensions: function() { this._containerSize = { height: this._$container.height(), width: this._$container.width() }; this._componentContentSize = { height: this._component.content().height(), width: this._component.content().width() }; this._contentSize = { height: this._$content.height(), width: this._$content.width() }; this._pushBackFromBoundary() }, _updateScrollbars: function() { this._eachScrollbar(function(scrollbar, direction) { var dimension = direction === VERTICAL ? "height" : "width"; scrollbar.option({ containerSize: this._containerSize[dimension], contentSize: this._componentContentSize[dimension] }); scrollbar.update() }) }, _allowedDirections: function() { return { vertical: this._isDirection(VERTICAL) && this._contentSize.height > this._containerSize.height, horizontal: this._isDirection(HORIZONTAL) && this._contentSize.width > this._containerSize.width } }, dispose: function() { var className = this._$element.get(0).className; var scrollableNativeRegexp = new RegExp(SCROLLABLE_NATIVE_CLASS + "\\S*", "g"); if (scrollableNativeRegexp.test(className)) { this._$element.removeClass(className.match(scrollableNativeRegexp).join(" ")) } this._$element.off("." + SCROLLABLE_NATIVE); this._$container.off("." + SCROLLABLE_NATIVE); this._removeScrollbars(); clearTimeout(this._gestureEndTimer); clearTimeout(this._hideScrollbarTimeout) }, _removeScrollbars: function() { this._eachScrollbar(function(scrollbar) { scrollbar.element().remove() }) }, scrollBy: function(distance) { var location = this.location(); this._$container.scrollTop(-location.top - distance.top + this.option("pushBackValue")); this._$container.scrollLeft(-location.left - distance.left) }, validate: function() { return !this.option("disabled") && this._allowedDirection() }, getDirection: function() { return this._allowedDirection() }, verticalOffset: function() { return this.option("pushBackValue") } }); module.exports = NativeStrategy }, /*!*******************************************!*\ !*** ./js/ui/scroll_view/ui.scrollbar.js ***! \*******************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), translator = __webpack_require__( /*! ../../animation/translator */ 69), Widget = __webpack_require__( /*! ../widget/ui.widget */ 95), eventUtils = __webpack_require__( /*! ../../events/utils */ 71), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), isPlainObject = __webpack_require__( /*! ../../core/utils/type */ 12).isPlainObject, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, pointerEvents = __webpack_require__( /*! ../../events/pointer */ 76); var SCROLLBAR = "dxScrollbar", SCROLLABLE_SCROLLBAR_CLASS = "dx-scrollable-scrollbar", SCROLLABLE_SCROLLBAR_ACTIVE_CLASS = SCROLLABLE_SCROLLBAR_CLASS + "-active", SCROLLABLE_SCROLL_CLASS = "dx-scrollable-scroll", SCROLLABLE_SCROLL_CONTENT_CLASS = "dx-scrollable-scroll-content", HOVER_ENABLED_STATE = "dx-scrollbar-hoverable", HORIZONTAL = "horizontal", THUMB_MIN_SIZE = 15; var SCROLLBAR_VISIBLE = { onScroll: "onScroll", onHover: "onHover", always: "always", never: "never" }; var Scrollbar = Widget.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { direction: null, visible: false, activeStateEnabled: false, visibilityMode: SCROLLBAR_VISIBLE.onScroll, containerSize: 0, contentSize: 0, expandable: true }) }, _init: function() { this.callBase(); this._isHovered = false }, _render: function() { this._renderThumb(); this.callBase(); this._renderDirection(); this._update(); this._attachPointerDownHandler(); this.option("hoverStateEnabled", this._isHoverMode()); this.element().toggleClass(HOVER_ENABLED_STATE, this.option("hoverStateEnabled")) }, _renderThumb: function() { this._$thumb = $("<div>").addClass(SCROLLABLE_SCROLL_CLASS); $("<div>").addClass(SCROLLABLE_SCROLL_CONTENT_CLASS).appendTo(this._$thumb); this.element().addClass(SCROLLABLE_SCROLLBAR_CLASS).append(this._$thumb) }, isThumb: function($element) { return !!this.element().find($element).length }, _isHoverMode: function() { var visibilityMode = this.option("visibilityMode"); return (visibilityMode === SCROLLBAR_VISIBLE.onHover || visibilityMode === SCROLLBAR_VISIBLE.always) && this.option("expandable") }, _renderDirection: function() { var direction = this.option("direction"); this.element().addClass("dx-scrollbar-" + direction); this._dimension = direction === HORIZONTAL ? "width" : "height"; this._prop = direction === HORIZONTAL ? "left" : "top" }, _attachPointerDownHandler: function() { this._$thumb.on(eventUtils.addNamespace(pointerEvents.down, SCROLLBAR), this.feedbackOn.bind(this)) }, feedbackOn: function() { this.element().addClass(SCROLLABLE_SCROLLBAR_ACTIVE_CLASS); activeScrollbar = this }, feedbackOff: function() { this.element().removeClass(SCROLLABLE_SCROLLBAR_ACTIVE_CLASS); activeScrollbar = null }, cursorEnter: function() { this._isHovered = true; this.option("visible", true) }, cursorLeave: function() { this._isHovered = false; this.option("visible", false) }, _renderDimensions: function() { this._$thumb.css({ width: this.option("width"), height: this.option("height") }) }, _toggleVisibility: function(visible) { if (this.option("visibilityMode") === SCROLLBAR_VISIBLE.onScroll) { this._$thumb.css("opacity") } visible = this._adjustVisibility(visible); this.option().visible = visible; this._$thumb.toggleClass("dx-state-invisible", !visible) }, _adjustVisibility: function(visible) { if (this.containerToContentRatio() && !this._needScrollbar()) { return false } switch (this.option("visibilityMode")) { case SCROLLBAR_VISIBLE.onScroll: break; case SCROLLBAR_VISIBLE.onHover: visible = visible || !!this._isHovered; break; case SCROLLBAR_VISIBLE.never: visible = false; break; case SCROLLBAR_VISIBLE.always: visible = true } return visible }, moveTo: function(location) { if (this._isHidden()) { return } if (isPlainObject(location)) { location = location[this._prop] || 0 } var scrollBarLocation = {}; scrollBarLocation[this._prop] = this._calculateScrollBarPosition(location); translator.move(this._$thumb, scrollBarLocation) }, _calculateScrollBarPosition: function(location) { return -location * this._thumbRatio }, _update: function() { var containerSize = Math.round(this.option("containerSize")), contentSize = Math.round(this.option("contentSize")); this._containerToContentRatio = contentSize ? containerSize / contentSize : containerSize; var thumbSize = Math.round(Math.max(Math.round(containerSize * this._containerToContentRatio), THUMB_MIN_SIZE)); this._thumbRatio = (containerSize - thumbSize) / (contentSize - containerSize); this.option(this._dimension, thumbSize); this.element().css("display", this._needScrollbar() ? "" : "none") }, _isHidden: function() { return this.option("visibilityMode") === SCROLLBAR_VISIBLE.never }, _needScrollbar: function() { return !this._isHidden() && this._containerToContentRatio < 1 }, containerToContentRatio: function() { return this._containerToContentRatio }, _normalizeSize: function(size) { return isPlainObject(size) ? size[this._dimension] || 0 : size }, _clean: function() { this.callBase(); if (this === activeScrollbar) { activeScrollbar = null } this._$thumb.off("." + SCROLLBAR) }, _optionChanged: function(args) { if (this._isHidden()) { return } switch (args.name) { case "containerSize": case "contentSize": this.option()[args.name] = this._normalizeSize(args.value); this._update(); break; case "visibilityMode": case "direction": this._invalidate(); break; default: this.callBase.apply(this, arguments) } }, update: commonUtils.deferRenderer(function() { this._adjustVisibility() && this.option("visible", true) }) }); var activeScrollbar = null; $(document).on(eventUtils.addNamespace(pointerEvents.up, SCROLLBAR), function() { if (activeScrollbar) { activeScrollbar.feedbackOff() } }); module.exports = Scrollbar }, /*!*********************************!*\ !*** ./js/ui/load_indicator.js ***! \*********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), support = __webpack_require__( /*! ../core/utils/support */ 61), themes = __webpack_require__( /*! ./themes */ 143), browser = __webpack_require__( /*! ../core/utils/browser */ 23), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, devices = __webpack_require__( /*! ../core/devices */ 53), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), Widget = __webpack_require__( /*! ./widget/ui.widget */ 95); var LOADINDICATOR_CLASS = "dx-loadindicator", LOADINDICATOR_WRAPPER_CLASS = "dx-loadindicator-wrapper", LOADINDICATOR_CONTENT_CLASS = "dx-loadindicator-content", LOADINDICATOR_ICON_CLASS = "dx-loadindicator-icon", LOADINDICATOR_SEGMENT_CLASS = "dx-loadindicator-segment", LOADINDICATOR_SEGMENT_INNER_CLASS = "dx-loadindicator-segment-inner", LOADINDICATOR_IMAGE_CLASS = "dx-loadindicator-image"; var LoadIndicator = Widget.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { indicatorSrc: "", activeStateEnabled: false, hoverStateEnabled: false, _animatingSegmentCount: 1, _animatingSegmentInner: false }) }, _defaultOptionsRules: function() { var themeName = function() { var currentTheme = themes.current(); return currentTheme && currentTheme.split(".")[0] }; return this.callBase().concat([{ device: function() { var realDevice = devices.real(), obsoleteAndroid = "android" === realDevice.platform && !/chrome/i.test(navigator.userAgent); return browser.msie && browser.version < 10 || obsoleteAndroid }, options: { viaImage: true } }, { device: function() { return "win8" === themeName() || "win10" === themeName() }, options: { _animatingSegmentCount: 5 } }, { device: function() { return "ios7" === themeName() }, options: { _animatingSegmentCount: 11 } }, { device: function() { return "android5" === themeName() }, options: { _animatingSegmentCount: 2, _animatingSegmentInner: true } }, { device: function() { return "generic" === themeName() }, options: { _animatingSegmentCount: 7 } }]) }, _init: function() { this.callBase(); this.element().addClass(LOADINDICATOR_CLASS) }, _render: function() { this._renderWrapper(); this._renderIndicatorContent(); this._renderMarkup(); this.callBase() }, _renderWrapper: function() { this._$wrapper = $("<div>").addClass(LOADINDICATOR_WRAPPER_CLASS); this.element().append(this._$wrapper) }, _renderIndicatorContent: function() { this._$content = $("<div>").addClass(LOADINDICATOR_CONTENT_CLASS); this._$wrapper.append(this._$content) }, _renderMarkup: function() { if (support.animation && !this.option("viaImage") && !this.option("indicatorSrc")) { this._renderMarkupForAnimation() } else { this._renderMarkupForImage() } }, _renderMarkupForAnimation: function() { var animatingSegmentInner = this.option("_animatingSegmentInner"); this._$indicator = $("<div>").addClass(LOADINDICATOR_ICON_CLASS); this._$content.append(this._$indicator); for (var i = this.option("_animatingSegmentCount"); i >= 0; --i) { var $segment = $("<div>").addClass(LOADINDICATOR_SEGMENT_CLASS).addClass(LOADINDICATOR_SEGMENT_CLASS + i); if (animatingSegmentInner) { $segment.append($("<div>").addClass(LOADINDICATOR_SEGMENT_INNER_CLASS)) } this._$indicator.append($segment) } }, _renderMarkupForImage: function() { var indicatorSrc = this.option("indicatorSrc"); this._$wrapper.addClass(LOADINDICATOR_IMAGE_CLASS); if (indicatorSrc) { this._$wrapper.css("background-image", "url(" + indicatorSrc + ")") } }, _renderDimensions: function() { this.callBase(); this._updateContentSizeForAnimation() }, _updateContentSizeForAnimation: function() { if (!this._$indicator) { return } var width = this.option("width"), height = this.option("height"); if (width || height) { width = this.element().width(); height = this.element().height(); var minDimension = Math.min(height, width); this._$wrapper.css({ height: minDimension, width: minDimension, "font-size": minDimension }) } }, _clean: function() { this.callBase(); this._removeMarkupForAnimation(); this._removeMarkupForImage() }, _removeMarkupForAnimation: function() { if (!this._$indicator) { return } this._$indicator.remove(); delete this._$indicator }, _removeMarkupForImage: function() { this._$wrapper.css("background-image", "none") }, _optionChanged: function(args) { switch (args.name) { case "_animatingSegmentCount": case "_animatingSegmentInner": case "indicatorSrc": this._invalidate(); break; default: this.callBase(args) } } }); registerComponent("dxLoadIndicator", LoadIndicator); module.exports = LoadIndicator }, /*!***************************************************************!*\ !*** ./js/ui/scroll_view/ui.scroll_view.native.swipe_down.js ***! \***************************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), translator = __webpack_require__( /*! ../../animation/translator */ 69), eventUtils = __webpack_require__( /*! ../../events/utils */ 71), NativeStrategy = __webpack_require__( /*! ./ui.scrollable.native */ 236), LoadIndicator = __webpack_require__( /*! ../load_indicator */ 238); var SCROLLVIEW_PULLDOWN_DOWN_LOADING_CLASS = "dx-scrollview-pull-down-loading", SCROLLVIEW_PULLDOWN_INDICATOR_CLASS = "dx-scrollview-pull-down-indicator", SCROLLVIEW_PULLDOWN_REFRESHING_CLASS = "dx-scrollview-pull-down-refreshing", PULLDOWN_ICON_CLASS = "dx-icon-pulldown", STATE_RELEASED = 0, STATE_READY = 1, STATE_REFRESHING = 2, STATE_TOUCHED = 4, STATE_PULLED = 5; var SwipeDownNativeScrollViewStrategy = NativeStrategy.inherit({ _init: function(scrollView) { this.callBase(scrollView); this._$topPocket = scrollView._$topPocket; this._$bottomPocket = scrollView._$bottomPocket; this._$pullDown = scrollView._$pullDown; this._$scrollViewContent = scrollView.content(); this._initCallbacks(); this._location = 0 }, _initCallbacks: function() { this.pullDownCallbacks = $.Callbacks(); this.releaseCallbacks = $.Callbacks(); this.reachBottomCallbacks = $.Callbacks() }, render: function() { this.callBase(); this._renderPullDown(); this._releaseState() }, _renderPullDown: function() { var $loadContainer = $("<div>").addClass(SCROLLVIEW_PULLDOWN_INDICATOR_CLASS), $loadIndicator = new LoadIndicator($("<div>")).element(); this._$icon = $("<div>").addClass(PULLDOWN_ICON_CLASS); this._$pullDown.empty().append(this._$icon).append($loadContainer.append($loadIndicator)) }, _releaseState: function() { this._state = STATE_RELEASED; this._releasePullDown(); this._updateDimensions() }, _releasePullDown: function() { this._$pullDown.css({ opacity: 0 }) }, _updateDimensions: function() { this.callBase(); this._topPocketSize = this._$topPocket.height(); this._bottomPocketSize = this._$bottomPocket.height(); this._scrollOffset = this._$container.height() - this._$content.height() }, _allowedDirections: function() { var allowedDirections = this.callBase(); allowedDirections.vertical = allowedDirections.vertical || this._pullDownEnabled; return allowedDirections }, handleInit: function(e) { this.callBase(e); if (this._state === STATE_RELEASED && 0 === this._location) { this._startClientY = eventUtils.eventData(e.originalEvent).y; this._state = STATE_TOUCHED } }, handleMove: function(e) { this.callBase(e); this._deltaY = eventUtils.eventData(e.originalEvent).y - this._startClientY; if (this._state === STATE_TOUCHED) { if (this._pullDownEnabled && this._deltaY > 0) { this._state = STATE_PULLED } else { this._complete() } } if (this._state === STATE_PULLED) { e.preventDefault(); this._movePullDown() } }, _movePullDown: function() { var pullDownHeight = this._getPullDownHeight(), top = Math.min(3 * pullDownHeight, this._deltaY + this._getPullDownStartPosition()), angle = 180 * top / pullDownHeight / 3; this._$pullDown.css({ opacity: 1 }).toggleClass(SCROLLVIEW_PULLDOWN_REFRESHING_CLASS, top < pullDownHeight); translator.move(this._$pullDown, { top: top }); this._$icon.css({ transform: "rotate(" + angle + "deg)" }) }, _isPullDown: function() { return this._pullDownEnabled && this._state === STATE_PULLED && this._deltaY >= this._getPullDownHeight() - this._getPullDownStartPosition() }, _getPullDownHeight: function() { return Math.round(.05 * this._$element.outerHeight()) }, _getPullDownStartPosition: function() { return -Math.round(1.5 * this._$pullDown.outerHeight()) }, handleEnd: function() { if (this._isPullDown()) { this._pullDownRefreshing() } this._complete() }, handleStop: function() { this._complete() }, _complete: function() { if (this._state === STATE_TOUCHED || this._state === STATE_PULLED) { this._releaseState() } }, handleScroll: function(e) { this.callBase(e); if (this._state === STATE_REFRESHING) { return } var currentLocation = this.location().top, scrollDelta = this._location - currentLocation; this._location = currentLocation; if (scrollDelta > 0 && this._isReachBottom()) { this._reachBottom() } else { this._stateReleased() } }, _isReachBottom: function() { return this._reachBottomEnabled && this._location <= this._scrollOffset + this._bottomPocketSize }, _reachBottom: function() { this.reachBottomCallbacks.fire() }, _stateReleased: function() { if (this._state === STATE_RELEASED) { return } this._$pullDown.removeClass(SCROLLVIEW_PULLDOWN_DOWN_LOADING_CLASS); this._releaseState() }, _pullDownRefreshing: function() { this._state = STATE_REFRESHING; this._pullDownRefreshHandler() }, _pullDownRefreshHandler: function() { this._refreshPullDown(); this.pullDownCallbacks.fire() }, _refreshPullDown: function() { this._$pullDown.addClass(SCROLLVIEW_PULLDOWN_DOWN_LOADING_CLASS); translator.move(this._$pullDown, { top: this._getPullDownHeight() }) }, pullDownEnable: function(enabled) { this._$topPocket.toggle(enabled); this._pullDownEnabled = enabled }, reachBottomEnable: function(enabled) { this._reachBottomEnabled = enabled }, pendingRelease: function() { this._state = STATE_READY }, release: function() { var deferred = $.Deferred(); this._updateDimensions(); clearTimeout(this._releaseTimeout); this._releaseTimeout = setTimeout(function() { this._stateReleased(); this.releaseCallbacks.fire(); this._updateAction(); deferred.resolve() }.bind(this), 800); return deferred.promise() }, dispose: function() { clearTimeout(this._pullDownRefreshTimeout); clearTimeout(this._releaseTimeout); this.callBase() } }); module.exports = SwipeDownNativeScrollViewStrategy }, /*!***************************************************************!*\ !*** ./js/ui/scroll_view/ui.scroll_view.native.slide_down.js ***! \***************************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), NativeStrategy = __webpack_require__( /*! ./ui.scrollable.native */ 236); var STATE_RELEASED = 0, STATE_READY = 1, STATE_LOADING = 2, LOADING_HEIGHT = 80; var SlideDownNativeScrollViewStrategy = NativeStrategy.inherit({ _init: function(scrollView) { this.callBase(scrollView); this._$topPocket = scrollView._$topPocket; this._$bottomPocket = scrollView._$bottomPocket; this._initCallbacks() }, _initCallbacks: function() { this.pullDownCallbacks = $.Callbacks(); this.releaseCallbacks = $.Callbacks(); this.reachBottomCallbacks = $.Callbacks() }, render: function() { this.callBase(); this._renderPullDown(); this._renderBottom(); this._releaseState(); this._updateDimensions() }, _renderPullDown: function() { this._$topPocket.empty() }, _renderBottom: function() { this._$bottomPocket.empty().append("<progress>") }, _releaseState: function() { if (this._state === STATE_RELEASED) { return } this._state = STATE_RELEASED }, _updateDimensions: function() { this._scrollOffset = this._$container.prop("scrollHeight") - this._$container.prop("clientHeight"); this._containerSize = { height: this._$container.prop("clientHeight"), width: this._$container.prop("clientWidth") }; this._contentSize = this._componentContentSize = { height: this._$container.prop("scrollHeight"), width: this._$container.prop("scrollWidth") } }, handleScroll: function(e) { this.callBase(e); if (this._isReachBottom(this._lastLocation.top)) { this._reachBottom() } }, _isReachBottom: function(location) { this._scrollContent = this._$container.prop("scrollHeight") - this._$container.prop("clientHeight"); return this._reachBottomEnabled && location < -this._scrollContent + LOADING_HEIGHT }, _reachBottom: function() { if (this._state === STATE_LOADING) { return } this._state = STATE_LOADING; this.reachBottomCallbacks.fire() }, pullDownEnable: function(enabled) { this._pullDownEnabled = enabled }, reachBottomEnable: function(enabled) { this._reachBottomEnabled = enabled; this._$bottomPocket.toggle(enabled) }, pendingRelease: function() { this._state = STATE_READY }, release: function() { var deferred = $.Deferred(); this._state = STATE_RELEASED; this.releaseCallbacks.fire(); this.update(); return deferred.resolve().promise() } }); module.exports = SlideDownNativeScrollViewStrategy }, /*!*******************************************************!*\ !*** ./js/ui/scroll_view/ui.scroll_view.simulated.js ***! \*******************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, math = Math, simulatedStrategy = __webpack_require__( /*! ./ui.scrollable.simulated */ 242), LoadIndicator = __webpack_require__( /*! ../load_indicator */ 238); var SCROLLVIEW_PULLDOWN_REFRESHING_CLASS = "dx-scrollview-pull-down-loading", SCROLLVIEW_PULLDOWN_READY_CLASS = "dx-scrollview-pull-down-ready", SCROLLVIEW_PULLDOWN_IMAGE_CLASS = "dx-scrollview-pull-down-image", SCROLLVIEW_PULLDOWN_INDICATOR_CLASS = "dx-scrollview-pull-down-indicator", SCROLLVIEW_PULLDOWN_TEXT_CLASS = "dx-scrollview-pull-down-text", STATE_RELEASED = 0, STATE_READY = 1, STATE_REFRESHING = 2, STATE_LOADING = 3; var ScrollViewScroller = simulatedStrategy.Scroller.inherit({ ctor: function() { this._topPocketSize = 0; this.callBase.apply(this, arguments); this._initCallbacks(); this._releaseState() }, _releaseState: function() { this._state = STATE_RELEASED; this._refreshPullDownText() }, _refreshPullDownText: function() { this._$pullingDownText.css("opacity", this._state === STATE_RELEASED ? 1 : 0); this._$pulledDownText.css("opacity", this._state === STATE_READY ? 1 : 0); this._$refreshingText.css("opacity", this._state === STATE_REFRESHING ? 1 : 0) }, _initCallbacks: function() { this.pullDownCallbacks = $.Callbacks(); this.releaseCallbacks = $.Callbacks(); this.reachBottomCallbacks = $.Callbacks() }, _updateBounds: function() { var considerPockets = "horizontal" !== this._direction; this._topPocketSize = considerPockets ? this._$topPocket[this._dimension]() : 0; this._bottomPocketSize = considerPockets ? this._$bottomPocket[this._dimension]() : 0; this.callBase(); this._bottomBound = this._minOffset + this._bottomPocketSize }, _updateScrollbar: function() { this._scrollbar.option({ containerSize: this._containerSize(), contentSize: this._contentSize() - this._topPocketSize - this._bottomPocketSize }) }, _moveContent: function() { this.callBase(); if (this._isPullDown()) { this._pullDownReady() } else { if (this._isReachBottom()) { this._reachBottomReady() } else { if (this._state !== STATE_RELEASED) { this._stateReleased() } } } }, _moveScrollbar: function() { this._scrollbar.moveTo(this._topPocketSize + this._location) }, _isPullDown: function() { return this._pullDownEnabled && this._location >= 0 }, _isReachBottom: function() { return this._reachBottomEnabled && this._location <= this._bottomBound }, _scrollComplete: function() { if (this._inBounds() && this._state === STATE_READY) { this._pullDownRefreshing() } else { if (this._inBounds() && this._state === STATE_LOADING) { this._reachBottomLoading() } else { this.callBase() } } }, _reachBottomReady: function() { if (this._state === STATE_LOADING) { return } this._state = STATE_LOADING; this._minOffset = this._getMinOffset() }, _getMaxOffset: function() { return -this._topPocketSize }, _getMinOffset: function() { return math.min(this.callBase(), -this._topPocketSize) }, _reachBottomLoading: function() { this.reachBottomCallbacks.fire() }, _pullDownReady: function() { if (this._state === STATE_READY) { return } this._state = STATE_READY; this._maxOffset = 0; this._$pullDown.addClass(SCROLLVIEW_PULLDOWN_READY_CLASS); this._refreshPullDownText() }, _stateReleased: function() { if (this._state === STATE_RELEASED) { return } this._releaseState(); this._updateBounds(); this._$pullDown.removeClass(SCROLLVIEW_PULLDOWN_REFRESHING_CLASS).removeClass(SCROLLVIEW_PULLDOWN_READY_CLASS); this.releaseCallbacks.fire() }, _pullDownRefreshing: function() { if (this._state === STATE_REFRESHING) { return } this._state = STATE_REFRESHING; this._$pullDown.addClass(SCROLLVIEW_PULLDOWN_REFRESHING_CLASS).removeClass(SCROLLVIEW_PULLDOWN_READY_CLASS); this._refreshPullDownText(); this.pullDownCallbacks.fire() }, _releaseHandler: function() { if (this._state === STATE_RELEASED) { this._moveToBounds() } this._update(); if (this._releaseTask) { this._releaseTask.abort() } this._releaseTask = commonUtils.executeAsync(this._release.bind(this)); return this._releaseTask.promise }, _release: function() { this._stateReleased(); this._scrollComplete() }, _reachBottomEnablingHandler: function(enabled) { if (this._reachBottomEnabled === enabled) { return } this._reachBottomEnabled = enabled; this._updateBounds() }, _pullDownEnablingHandler: function(enabled) { if (this._pullDownEnabled === enabled) { return } this._pullDownEnabled = enabled; this._considerTopPocketChange(); this._updateHandler() }, _considerTopPocketChange: function() { this._location -= this._$topPocket.height() || -this._topPocketSize; this._maxOffset = 0; this._move() }, _pendingReleaseHandler: function() { this._state = STATE_READY }, dispose: function() { if (this._releaseTask) { this._releaseTask.abort() } this.callBase() } }); var SimulatedScrollViewStrategy = simulatedStrategy.SimulatedStrategy.inherit({ _init: function(scrollView) { this.callBase(scrollView); this._$pullDown = scrollView._$pullDown; this._$topPocket = scrollView._$topPocket; this._$bottomPocket = scrollView._$bottomPocket; this._initCallbacks() }, _initCallbacks: function() { this.pullDownCallbacks = $.Callbacks(); this.releaseCallbacks = $.Callbacks(); this.reachBottomCallbacks = $.Callbacks() }, render: function() { this._renderPullDown(); this.callBase() }, _renderPullDown: function() { var $image = $("<div>").addClass(SCROLLVIEW_PULLDOWN_IMAGE_CLASS), $loadContainer = $("<div>").addClass(SCROLLVIEW_PULLDOWN_INDICATOR_CLASS), $loadIndicator = new LoadIndicator($("<div>")).element(), $text = this._$pullDownText = $("<div>").addClass(SCROLLVIEW_PULLDOWN_TEXT_CLASS); this._$pullingDownText = $("<div>").text(this.option("pullingDownText")).appendTo($text); this._$pulledDownText = $("<div>").text(this.option("pulledDownText")).appendTo($text); this._$refreshingText = $("<div>").text(this.option("refreshingText")).appendTo($text); this._$pullDown.empty().append($image).append($loadContainer.append($loadIndicator)).append($text) }, pullDownEnable: function(enabled) { this._eventHandler("pullDownEnabling", enabled) }, reachBottomEnable: function(enabled) { this._eventHandler("reachBottomEnabling", enabled) }, _createScroller: function(direction) { var that = this; var scroller = that._scrollers[direction] = new ScrollViewScroller(that._scrollerOptions(direction)); scroller.pullDownCallbacks.add(function() { that.pullDownCallbacks.fire() }); scroller.releaseCallbacks.add(function() { that.releaseCallbacks.fire() }); scroller.reachBottomCallbacks.add(function() { that.reachBottomCallbacks.fire() }) }, _scrollerOptions: function(direction) { return extend(this.callBase(direction), { $topPocket: this._$topPocket, $bottomPocket: this._$bottomPocket, $pullDown: this._$pullDown, $pullDownText: this._$pullDownText, $pullingDownText: this._$pullingDownText, $pulledDownText: this._$pulledDownText, $refreshingText: this._$refreshingText }) }, pendingRelease: function() { this._eventHandler("pendingRelease") }, release: function() { return this._eventHandler("release").done(this._updateAction) }, location: function() { var location = this.callBase(); location.top += this._$topPocket.height(); return location }, dispose: function() { $.each(this._scrollers, function() { this.dispose() }); this.callBase() } }); module.exports = SimulatedScrollViewStrategy }, /*!******************************************************!*\ !*** ./js/ui/scroll_view/ui.scrollable.simulated.js ***! \******************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), math = Math, titleize = __webpack_require__( /*! ../../core/utils/inflector */ 39).titleize, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, translator = __webpack_require__( /*! ../../animation/translator */ 69), Class = __webpack_require__( /*! ../../core/class */ 25), Animator = __webpack_require__( /*! ./animator */ 243), devices = __webpack_require__( /*! ../../core/devices */ 53), eventUtils = __webpack_require__( /*! ../../events/utils */ 71), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), Scrollbar = __webpack_require__( /*! ./ui.scrollbar */ 237), when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when; var realDevice = devices.real; var isSluggishPlatform = "win" === realDevice.platform || "android" === realDevice.platform; var SCROLLABLE_SIMULATED = "dxSimulatedScrollable", SCROLLABLE_STRATEGY = "dxScrollableStrategy", SCROLLABLE_SIMULATED_CURSOR = SCROLLABLE_SIMULATED + "Cursor", SCROLLABLE_SIMULATED_KEYBOARD = SCROLLABLE_SIMULATED + "Keyboard", SCROLLABLE_SIMULATED_CLASS = "dx-scrollable-simulated", SCROLLABLE_SCROLLBARS_HIDDEN = "dx-scrollable-scrollbars-hidden", SCROLLABLE_SCROLLBARS_ALWAYSVISIBLE = "dx-scrollable-scrollbars-alwaysvisible", SCROLLABLE_SCROLLBAR_CLASS = "dx-scrollable-scrollbar", VERTICAL = "vertical", HORIZONTAL = "horizontal", ACCELERATION = isSluggishPlatform ? .95 : .92, OUT_BOUNDS_ACCELERATION = .5, MIN_VELOCITY_LIMIT = 1, FRAME_DURATION = math.round(1e3 / 60), SCROLL_LINE_HEIGHT = 20, BOUNCE_MIN_VELOCITY_LIMIT = MIN_VELOCITY_LIMIT / 5, BOUNCE_DURATION = isSluggishPlatform ? 300 : 400, BOUNCE_FRAMES = BOUNCE_DURATION / FRAME_DURATION, BOUNCE_ACCELERATION_SUM = (1 - math.pow(ACCELERATION, BOUNCE_FRAMES)) / (1 - ACCELERATION); var KEY_CODES = { PAGE_UP: 33, PAGE_DOWN: 34, END: 35, HOME: 36, LEFT: 37, UP: 38, RIGHT: 39, DOWN: 40 }; var InertiaAnimator = Animator.inherit({ ctor: function(scroller) { this.callBase(); this.scroller = scroller }, VELOCITY_LIMIT: MIN_VELOCITY_LIMIT, _isFinished: function() { return math.abs(this.scroller._velocity) <= this.VELOCITY_LIMIT }, _step: function() { this.scroller._scrollStep(this.scroller._velocity); this.scroller._velocity *= this._acceleration() }, _acceleration: function() { return this.scroller._inBounds() ? ACCELERATION : OUT_BOUNDS_ACCELERATION }, _complete: function() { this.scroller._scrollComplete() }, _stop: function() { this.scroller._stopComplete() } }); var BounceAnimator = InertiaAnimator.inherit({ VELOCITY_LIMIT: BOUNCE_MIN_VELOCITY_LIMIT, _isFinished: function() { return this.scroller._crossBoundOnNextStep() || this.callBase() }, _acceleration: function() { return ACCELERATION }, _complete: function() { this.scroller._move(this.scroller._bounceLocation); this.callBase() } }); var isWheelEvent = function(e) { return "dxmousewheel" === e.type }; var Scroller = Class.inherit({ ctor: function(options) { this._initOptions(options); this._initAnimators(); this._initScrollbar() }, _initOptions: function(options) { this._location = 0; this._topReached = false; this._bottomReached = false; this._axis = options.direction === HORIZONTAL ? "x" : "y"; this._prop = options.direction === HORIZONTAL ? "left" : "top"; this._dimension = options.direction === HORIZONTAL ? "width" : "height"; this._scrollProp = options.direction === HORIZONTAL ? "scrollLeft" : "scrollTop"; $.each(options, function(optionName, optionValue) { this["_" + optionName] = optionValue }.bind(this)) }, _initAnimators: function() { this._inertiaAnimator = new InertiaAnimator(this); this._bounceAnimator = new BounceAnimator(this) }, _initScrollbar: function() { this._scrollbar = new Scrollbar($("<div>").appendTo(this._$container), { direction: this._direction, visible: this._scrollByThumb, visibilityMode: this._visibilityModeNormalize(this._scrollbarVisible), expandable: this._scrollByThumb }); this._$scrollbar = this._scrollbar.element() }, _visibilityModeNormalize: function(mode) { return true === mode ? "onScroll" : false === mode ? "never" : mode }, _scrollStep: function(delta) { var prevLocation = this._location; this._location += delta; this._suppressBounce(); this._move(); if (Math.abs(prevLocation - this._location) < 1) { return } this._$container.triggerHandler({ type: "scroll" }) }, _suppressBounce: function() { if (this._bounceEnabled || this._inBounds(this._location)) { return } this._velocity = 0; this._location = this._boundLocation() }, _boundLocation: function(location) { location = void 0 !== location ? location : this._location; return math.max(math.min(location, this._maxOffset), this._minOffset) }, _move: function(location) { this._location = void 0 !== location ? location : this._location; this._moveContent(); this._moveScrollbar() }, _moveContent: function() { var location = this._location; this._$container[this._scrollProp](-location); this._moveContentByTranslator(location) }, _moveContentByTranslator: function(location) { var translateOffset, minOffset = -this._maxScrollPropValue; if (location > 0) { translateOffset = location } else { if (location <= minOffset) { translateOffset = location - minOffset } else { translateOffset = location % 1 } } if (this._translateOffset === translateOffset) { return } var targetLocation = {}; targetLocation[this._prop] = translateOffset; this._translateOffset = translateOffset; if (0 === translateOffset) { translator.resetPosition(this._$content); return } translator.move(this._$content, targetLocation) }, _moveScrollbar: function() { this._scrollbar.moveTo(this._location) }, _scrollComplete: function() { if (this._inBounds()) { this._hideScrollbar(); this._correctLocation(); if (this._completeDeferred) { this._completeDeferred.resolve() } } this._scrollToBounds() }, _correctLocation: function() { this._location = math.round(this._location); this._move() }, _scrollToBounds: function() { if (this._inBounds()) { return } this._bounceAction(); this._setupBounce(); this._bounceAnimator.start() }, _setupBounce: function() { var boundLocation = this._bounceLocation = this._boundLocation(), bounceDistance = boundLocation - this._location; this._velocity = bounceDistance / BOUNCE_ACCELERATION_SUM }, _inBounds: function(location) { location = void 0 !== location ? location : this._location; return this._boundLocation(location) === location }, _crossBoundOnNextStep: function() { var location = this._location, nextLocation = location + this._velocity; return location < this._minOffset && nextLocation >= this._minOffset || location > this._maxOffset && nextLocation <= this._maxOffset }, _initHandler: function(e) { this._stopDeferred = $.Deferred(); this._stopScrolling(); this._prepareThumbScrolling(e); return this._stopDeferred.promise() }, _stopScrolling: commonUtils.deferRenderer(function() { this._hideScrollbar(); this._inertiaAnimator.stop(); this._bounceAnimator.stop() }), _prepareThumbScrolling: function(e) { if (isWheelEvent(e.originalEvent)) { return } var $target = $(e.originalEvent.target); var scrollbarClicked = this._isScrollbar($target); if (scrollbarClicked) { this._moveToMouseLocation(e) } this._thumbScrolling = scrollbarClicked || this._isThumb($target); this._crossThumbScrolling = !this._thumbScrolling && this._isAnyThumbScrolling($target); if (this._thumbScrolling) { this._scrollbar.feedbackOn() } }, _isThumbScrollingHandler: function($target) { return this._isThumb($target) }, _moveToMouseLocation: function(e) { var mouseLocation = e["page" + this._axis.toUpperCase()] - this._$element.offset()[this._prop]; var location = this._location + mouseLocation / this._containerToContentRatio() - this._$container.height() / 2; this._scrollStep(-Math.round(location)) }, _stopComplete: function() { if (this._stopDeferred) { this._stopDeferred.resolve() } }, _startHandler: function() { this._showScrollbar() }, _moveHandler: function(delta) { if (this._crossThumbScrolling) { return } if (this._thumbScrolling) { delta[this._axis] = -Math.round(delta[this._axis] / this._containerToContentRatio()) } this._scrollBy(delta) }, _scrollBy: function(delta) { delta = delta[this._axis]; if (!this._inBounds()) { delta *= OUT_BOUNDS_ACCELERATION } this._scrollStep(delta) }, _scrollByHandler: function(delta) { this._scrollBy(delta); this._scrollComplete() }, _containerToContentRatio: function() { return this._scrollbar.containerToContentRatio() }, _endHandler: function(velocity) { this._completeDeferred = $.Deferred(); this._velocity = velocity[this._axis]; this._inertiaHandler(); this._resetThumbScrolling(); return this._completeDeferred.promise() }, _inertiaHandler: function() { this._suppressInertia(); this._inertiaAnimator.start() }, _suppressInertia: function() { if (!this._inertiaEnabled || this._thumbScrolling) { this._velocity = 0 } }, _resetThumbScrolling: function() { this._thumbScrolling = false; this._crossThumbScrolling = false }, _stopHandler: function() { if (this._thumbScrolling) { this._scrollComplete() } this._resetThumbScrolling(); this._scrollToBounds() }, _disposeHandler: function() { this._stopScrolling(); this._$scrollbar.remove() }, _updateHandler: function() { this._update(); this._moveToBounds() }, _update: function() { var that = this; that._stopScrolling(); return commonUtils.deferUpdate(function() { that._updateLocation(); that._updateBounds(); that._updateScrollbar(); commonUtils.deferRender(function() { that._moveScrollbar(); that._scrollbar.update() }) }) }, _updateLocation: function() { this._location = translator.locate(this._$content)[this._prop] - this._$container[this._scrollProp]() }, _updateBounds: function() { this._maxOffset = Math.round(this._getMaxOffset()); this._minOffset = Math.round(this._getMinOffset()) }, _getMaxOffset: function() { return 0 }, _getMinOffset: function() { this._maxScrollPropValue = math.max(this._contentSize() - this._containerSize(), 0); return -this._maxScrollPropValue }, _updateScrollbar: commonUtils.deferUpdater(function() { var that = this, containerSize = that._containerSize(), contentSize = that._contentSize(); commonUtils.deferRender(function() { that._scrollbar.option({ containerSize: containerSize, contentSize: contentSize }) }) }), _moveToBounds: commonUtils.deferRenderer(commonUtils.deferUpdater(commonUtils.deferRenderer(function() { var location = this._boundLocation(); var locationChanged = location !== this._location; this._location = location; this._move(); if (locationChanged) { this._scrollAction() } }))), _createActionsHandler: function(actions) { this._scrollAction = actions.scroll; this._bounceAction = actions.bounce }, _showScrollbar: function() { this._scrollbar.option("visible", true) }, _hideScrollbar: function() { this._scrollbar.option("visible", false) }, _containerSize: function() { return this._$container[this._dimension]() }, _contentSize: function() { var isOverflowHidden = "hidden" === this._$content.css("overflow-" + this._axis), contentSize = this._$content[this._dimension](); if (!isOverflowHidden) { var containerScrollSize = this._$content[0]["scroll" + titleize(this._dimension)]; contentSize = math.max(containerScrollSize, contentSize) } return contentSize }, _validateEvent: function(e) { var $target = $(e.originalEvent.target); return this._isThumb($target) || this._isScrollbar($target) || this._isContent($target) }, _isThumb: function($element) { return this._scrollByThumb && this._scrollbar.isThumb($element) }, _isScrollbar: function($element) { return this._scrollByThumb && $element && $element.is(this._$scrollbar) }, _isContent: function($element) { return this._scrollByContent && !!$element.closest(this._$element).length }, _reachedMin: function() { return this._location <= this._minOffset }, _reachedMax: function() { return this._location >= this._maxOffset }, _cursorEnterHandler: function() { this._scrollbar.cursorEnter() }, _cursorLeaveHandler: function() { this._scrollbar.cursorLeave() }, dispose: commonUtils.noop }); var hoveredScrollable, activeScrollable; var SimulatedStrategy = Class.inherit({ ctor: function(scrollable) { this._init(scrollable) }, _init: function(scrollable) { this._component = scrollable; this._$element = scrollable.element(); this._$container = scrollable._$container; this._$wrapper = scrollable._$wrapper; this._$content = scrollable._$content; this.option = scrollable.option.bind(scrollable); this._createActionByOption = scrollable._createActionByOption.bind(scrollable); this._isLocked = scrollable._isLocked.bind(scrollable); this._isDirection = scrollable._isDirection.bind(scrollable); this._allowedDirection = scrollable._allowedDirection.bind(scrollable) }, render: function() { this._$element.addClass(SCROLLABLE_SIMULATED_CLASS); this._createScrollers(); if (this.option("useKeyboard")) { this._$container.prop("tabindex", 0) } this._attachKeyboardHandler(); this._attachCursorHandlers() }, _createScrollers: function() { this._scrollers = {}; if (this._isDirection(HORIZONTAL)) { this._createScroller(HORIZONTAL) } if (this._isDirection(VERTICAL)) { this._createScroller(VERTICAL) } this._$element.toggleClass(SCROLLABLE_SCROLLBARS_ALWAYSVISIBLE, "always" === this.option("showScrollbar")); this._$element.toggleClass(SCROLLABLE_SCROLLBARS_HIDDEN, !this.option("showScrollbar")) }, _createScroller: function(direction) { this._scrollers[direction] = new Scroller(this._scrollerOptions(direction)) }, _scrollerOptions: function(direction) { return { direction: direction, $content: this._$content, $container: this._$container, $wrapper: this._$wrapper, $element: this._$element, scrollByContent: this.option("scrollByContent"), scrollByThumb: this.option("scrollByThumb"), scrollbarVisible: this.option("showScrollbar"), bounceEnabled: this.option("bounceEnabled"), inertiaEnabled: this.option("inertiaEnabled"), isAnyThumbScrolling: this._isAnyThumbScrolling.bind(this) } }, _isAnyThumbScrolling: function($target) { var result = false; this._eventHandler("isThumbScrolling", $target).done(function(isThumbScrollingVertical, isThumbScrollingHorizontal) { result = isThumbScrollingVertical || isThumbScrollingHorizontal }); return result }, handleInit: function(e) { this._suppressDirections(e); this._eventForUserAction = e; this._eventHandler("init", e).done(this._stopAction) }, _suppressDirections: function(e) { if (isWheelEvent(e.originalEvent)) { this._prepareDirections(true); return } this._prepareDirections(); this._eachScroller(function(scroller, direction) { var isValid = scroller._validateEvent(e); this._validDirections[direction] = isValid }) }, _prepareDirections: function(value) { value = value || false; this._validDirections = {}; this._validDirections[HORIZONTAL] = value; this._validDirections[VERTICAL] = value }, _eachScroller: function(callback) { callback = callback.bind(this); $.each(this._scrollers, function(direction, scroller) { callback(scroller, direction) }) }, handleStart: function(e) { this._eventForUserAction = e; this._eventHandler("start").done(this._startAction) }, _saveActive: function() { activeScrollable = this }, _resetActive: function() { if (activeScrollable === this) { activeScrollable = null } }, handleMove: function(e) { if (this._isLocked()) { e.cancel = true; this._resetActive(); return } this._saveActive(); e.preventDefault && e.preventDefault(); this._adjustDistance(e.delta); this._eventForUserAction = e; this._eventHandler("move", e.delta) }, _adjustDistance: function(distance) { distance.x *= this._validDirections[HORIZONTAL]; distance.y *= this._validDirections[VERTICAL] }, handleEnd: function(e) { this._resetActive(); this._refreshCursorState(e.originalEvent && e.originalEvent.target); this._adjustDistance(e.velocity); this._eventForUserAction = e; return this._eventHandler("end", e.velocity).done(this._endAction) }, handleCancel: function(e) { this._resetActive(); this._eventForUserAction = e; return this._eventHandler("end", { x: 0, y: 0 }) }, handleStop: function() { this._resetActive(); this._eventHandler("stop") }, handleScroll: function() { this._scrollAction() }, _attachKeyboardHandler: function() { this._$element.off("." + SCROLLABLE_SIMULATED_KEYBOARD); if (!this.option("disabled") && this.option("useKeyboard")) { this._$element.on(eventUtils.addNamespace("keydown", SCROLLABLE_SIMULATED_KEYBOARD), this._keyDownHandler.bind(this)) } }, _keyDownHandler: function(e) { if (!this._$container.is(document.activeElement)) { return } var handled = true; switch (e.keyCode) { case KEY_CODES.DOWN: this._scrollByLine({ y: 1 }); break; case KEY_CODES.UP: this._scrollByLine({ y: -1 }); break; case KEY_CODES.RIGHT: this._scrollByLine({ x: 1 }); break; case KEY_CODES.LEFT: this._scrollByLine({ x: -1 }); break; case KEY_CODES.PAGE_DOWN: this._scrollByPage(1); break; case KEY_CODES.PAGE_UP: this._scrollByPage(-1); break; case KEY_CODES.HOME: this._scrollToHome(); break; case KEY_CODES.END: this._scrollToEnd(); break; default: handled = false } if (handled) { e.stopPropagation(); e.preventDefault() } }, _scrollByLine: function(lines) { this.scrollBy({ top: (lines.y || 0) * -SCROLL_LINE_HEIGHT, left: (lines.x || 0) * -SCROLL_LINE_HEIGHT }) }, _scrollByPage: function(page) { var prop = this._wheelProp(), dimension = this._dimensionByProp(prop); var distance = {}; distance[prop] = page * -this._$container[dimension](); this.scrollBy(distance) }, _dimensionByProp: function(prop) { return "left" === prop ? "width" : "height" }, _scrollToHome: function() { var prop = this._wheelProp(); var distance = {}; distance[prop] = 0; this._component.scrollTo(distance) }, _scrollToEnd: function() { var prop = this._wheelProp(), dimension = this._dimensionByProp(prop); var distance = {}; distance[prop] = this._$content[dimension]() - this._$container[dimension](); this._component.scrollTo(distance) }, createActions: function() { this._startAction = this._createActionHandler("onStart"); this._stopAction = this._createActionHandler("onStop"); this._endAction = this._createActionHandler("onEnd"); this._updateAction = this._createActionHandler("onUpdated"); this._createScrollerActions() }, _createScrollerActions: function() { this._scrollAction = this._createActionHandler("onScroll"); this._bounceAction = this._createActionHandler("onBounce"); this._eventHandler("createActions", { scroll: this._scrollAction, bounce: this._bounceAction }) }, _createActionHandler: function(optionName) { var that = this, actionHandler = that._createActionByOption(optionName); return function() { actionHandler(extend(that._createActionArgs(), arguments)) } }, _createActionArgs: function() { var scrollerX = this._scrollers[HORIZONTAL], scrollerY = this._scrollers[VERTICAL]; var location = this.location(); this._scrollOffset = { top: scrollerY && -location.top, left: scrollerX && -location.left }; return { jQueryEvent: this._eventForUserAction, scrollOffset: this._scrollOffset, reachedLeft: scrollerX && scrollerX._reachedMax(), reachedRight: scrollerX && scrollerX._reachedMin(), reachedTop: scrollerY && scrollerY._reachedMax(), reachedBottom: scrollerY && scrollerY._reachedMin() } }, _eventHandler: function(eventName) { var args = $.makeArray(arguments).slice(1), deferreds = $.map(this._scrollers, function(scroller) { return scroller["_" + eventName + "Handler"].apply(scroller, args) }); return when.apply($, deferreds).promise() }, location: function() { var location = translator.locate(this._$content); location.top -= this._$container.scrollTop(); location.left -= this._$container.scrollLeft(); return location }, disabledChanged: function() { this._attachCursorHandlers() }, _attachCursorHandlers: function() { this._$element.off("." + SCROLLABLE_SIMULATED_CURSOR); if (!this.option("disabled") && this._isHoverMode()) { this._$element.on(eventUtils.addNamespace("mouseenter", SCROLLABLE_SIMULATED_CURSOR), this._cursorEnterHandler.bind(this)).on(eventUtils.addNamespace("mouseleave", SCROLLABLE_SIMULATED_CURSOR), this._cursorLeaveHandler.bind(this)) } }, _isHoverMode: function() { return "onHover" === this.option("showScrollbar") }, _cursorEnterHandler: function(e) { e = e || {}; e.originalEvent = e.originalEvent || {}; if (activeScrollable || e.originalEvent._hoverHandled) { return } if (hoveredScrollable) { hoveredScrollable._cursorLeaveHandler() } hoveredScrollable = this; this._eventHandler("cursorEnter"); e.originalEvent._hoverHandled = true }, _cursorLeaveHandler: function(e) { if (hoveredScrollable !== this || activeScrollable === hoveredScrollable) { return } this._eventHandler("cursorLeave"); hoveredScrollable = null; this._refreshCursorState(e && e.relatedTarget) }, _refreshCursorState: function(target) { if (!this._isHoverMode() && (!target || activeScrollable)) { return } var $target = $(target); var $scrollable = $target.closest("." + SCROLLABLE_SIMULATED_CLASS + ":not(.dx-state-disabled)"); var targetScrollable = $scrollable.length && $scrollable.data(SCROLLABLE_STRATEGY); if (hoveredScrollable && hoveredScrollable !== targetScrollable) { hoveredScrollable._cursorLeaveHandler() } if (targetScrollable) { targetScrollable._cursorEnterHandler() } }, update: function() { var that = this; var result = this._eventHandler("update").done(this._updateAction); return when(result, commonUtils.deferUpdate(function() { var allowedDirections = that._allowedDirections(); commonUtils.deferRender(function() { var touchDirection = allowedDirections.vertical ? "pan-x" : ""; touchDirection = allowedDirections.horizontal ? "pan-y" : touchDirection; touchDirection = allowedDirections.vertical && allowedDirections.horizontal ? "none" : touchDirection; that._$container.css("touchAction", touchDirection) }); return when().promise() })) }, _allowedDirections: function() { var bounceEnabled = this.option("bounceEnabled"), verticalScroller = this._scrollers[VERTICAL], horizontalScroller = this._scrollers[HORIZONTAL]; return { vertical: verticalScroller && (verticalScroller._minOffset < 0 || bounceEnabled), horizontal: horizontalScroller && (horizontalScroller._minOffset < 0 || bounceEnabled) } }, scrollBy: function(distance) { var verticalScroller = this._scrollers[VERTICAL], horizontalScroller = this._scrollers[HORIZONTAL]; if (verticalScroller) { distance.top = verticalScroller._boundLocation(distance.top + verticalScroller._location) - verticalScroller._location } if (horizontalScroller) { distance.left = horizontalScroller._boundLocation(distance.left + horizontalScroller._location) - horizontalScroller._location } this._prepareDirections(true); this._startAction(); this._eventHandler("scrollBy", { x: distance.left, y: distance.top }); this._endAction() }, validate: function(e) { if (this.option("disabled")) { return false } if (this.option("bounceEnabled")) { return true } return isWheelEvent(e) ? this._validateWheel(e) : this._validateMove(e) }, _validateWheel: function(e) { var scroller = this._scrollers[this._wheelDirection(e)]; var reachedMin = scroller._reachedMin(); var reachedMax = scroller._reachedMax(); var contentGreaterThanContainer = !reachedMin || !reachedMax; var locatedNotAtBound = !reachedMin && !reachedMax; var scrollFromMin = reachedMin && e.delta > 0; var scrollFromMax = reachedMax && e.delta < 0; return contentGreaterThanContainer && (locatedNotAtBound || scrollFromMin || scrollFromMax) }, _validateMove: function(e) { if (!this.option("scrollByContent") && !$(e.target).closest("." + SCROLLABLE_SCROLLBAR_CLASS).length) { return false } return this._allowedDirection() }, getDirection: function(e) { return isWheelEvent(e) ? this._wheelDirection(e) : this._allowedDirection() }, _wheelProp: function() { return this._wheelDirection() === HORIZONTAL ? "left" : "top" }, _wheelDirection: function(e) { switch (this.option("direction")) { case HORIZONTAL: return HORIZONTAL; case VERTICAL: return VERTICAL; default: return e && e.shiftKey ? HORIZONTAL : VERTICAL } }, verticalOffset: function() { return 0 }, dispose: function() { this._resetActive(); if (hoveredScrollable === this) { hoveredScrollable = null } this._eventHandler("dispose"); this._detachEventHandlers(); this._$element.removeClass(SCROLLABLE_SIMULATED_CLASS); this._eventForUserAction = null; clearTimeout(this._gestureEndTimer) }, _detachEventHandlers: function() { this._$element.off("." + SCROLLABLE_SIMULATED_CURSOR); this._$container.off("." + SCROLLABLE_SIMULATED_KEYBOARD) } }); exports.SimulatedStrategy = SimulatedStrategy; exports.Scroller = Scroller; exports.ACCELERATION = ACCELERATION; exports.MIN_VELOCITY_LIMIT = MIN_VELOCITY_LIMIT; exports.FRAME_DURATION = FRAME_DURATION; exports.SCROLL_LINE_HEIGHT = SCROLL_LINE_HEIGHT }, /*!***************************************!*\ !*** ./js/ui/scroll_view/animator.js ***! \***************************************/ function(module, exports, __webpack_require__) { var noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, Class = __webpack_require__( /*! ../../core/class */ 25), abstract = Class.abstract, animationFrame = __webpack_require__( /*! ../../animation/frame */ 59); var Animator = Class.inherit({ ctor: function() { this._finished = true; this._stopped = false; this._proxiedStepCore = this._stepCore.bind(this) }, start: function() { this._stopped = false; this._finished = false; this._stepCore() }, stop: function() { this._stopped = true; animationFrame.cancelAnimationFrame(this._stepAnimationFrame) }, _stepCore: function() { if (this._isStopped()) { this._stop(); return } if (this._isFinished()) { this._finished = true; this._complete(); return } this._step(); this._stepAnimationFrame = animationFrame.requestAnimationFrame(this._proxiedStepCore) }, _step: abstract, _isFinished: noop, _stop: noop, _complete: noop, _isStopped: function() { return this._stopped }, inProgress: function() { return !(this._stopped || this._finished) } }); module.exports = Animator }, /*!********************************************!*\ !*** ./js/ui/scroll_view/ui.scrollable.js ***! \********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), support = __webpack_require__( /*! ../../core/utils/support */ 61), browser = __webpack_require__( /*! ../../core/utils/browser */ 23), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), typeUtils = __webpack_require__( /*! ../../core/utils/type */ 12), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, devices = __webpack_require__( /*! ../../core/devices */ 53), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), DOMComponent = __webpack_require__( /*! ../../core/dom_component */ 43), selectors = __webpack_require__( /*! ../widget/jquery.selectors */ 102), eventUtils = __webpack_require__( /*! ../../events/utils */ 71), scrollEvents = __webpack_require__( /*! ./ui.events.emitter.gesture.scroll */ 245), simulatedStrategy = __webpack_require__( /*! ./ui.scrollable.simulated */ 242), NativeStrategy = __webpack_require__( /*! ./ui.scrollable.native */ 236), when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when; var SCROLLABLE = "dxScrollable", SCROLLABLE_STRATEGY = "dxScrollableStrategy", SCROLLABLE_CLASS = "dx-scrollable", SCROLLABLE_DISABLED_CLASS = "dx-scrollable-disabled", SCROLLABLE_CONTAINER_CLASS = "dx-scrollable-container", SCROLLABLE_WRAPPER_CLASS = "dx-scrollable-wrapper", SCROLLABLE_CONTENT_CLASS = "dx-scrollable-content", VERTICAL = "vertical", HORIZONTAL = "horizontal", BOTH = "both"; var beforeActivateExists = void 0 !== document.onbeforeactivate; var deviceDependentOptions = function() { return [{ device: function() { return !support.nativeScrolling }, options: { useNative: false } }, { device: function(device) { return !devices.isSimulator() && "generic" === devices.real().platform && "generic" === device.platform }, options: { bounceEnabled: false, scrollByThumb: true, scrollByContent: support.touch, showScrollbar: "onHover" } }] }; var Scrollable = DOMComponent.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { disabled: false, onScroll: null, direction: VERTICAL, showScrollbar: "onScroll", useNative: true, bounceEnabled: true, scrollByContent: true, scrollByThumb: false, onUpdated: null, onStart: null, onEnd: null, onBounce: null, onStop: null, useSimulatedScrollbar: false, useKeyboard: true, inertiaEnabled: true, pushBackValue: 0, updateManually: false }) }, _defaultOptionsRules: function() { return this.callBase().concat(deviceDependentOptions(), [{ device: function() { return support.nativeScrolling && "android" === devices.real().platform }, options: { useSimulatedScrollbar: true } }, { device: function() { return "ios" === devices.real().platform }, options: { pushBackValue: 1 } }]) }, _initOptions: function(options) { this.callBase(options); if (!("useSimulatedScrollbar" in options)) { this._setUseSimulatedScrollbar() } }, _setUseSimulatedScrollbar: function() { if (!this.initialOption("useSimulatedScrollbar")) { this.option("useSimulatedScrollbar", !this.option("useNative")) } }, _init: function() { this.callBase(); this._initMarkup(); this._attachNativeScrollbarsCustomizationCss(); this._locked = false }, _visibilityChanged: function(visible) { if (visible) { this.update(); this._toggleRTLDirection(this.option("rtlEnabled")); this._savedScrollOffset && this.scrollTo(this._savedScrollOffset); delete this._savedScrollOffset } else { this._savedScrollOffset = this.scrollOffset() } }, _initMarkup: function() { var $element = this.element().addClass(SCROLLABLE_CLASS), $container = this._$container = $("<div>").addClass(SCROLLABLE_CONTAINER_CLASS), $wrapper = this._$wrapper = $("<div>").addClass(SCROLLABLE_WRAPPER_CLASS), $content = this._$content = $("<div>").addClass(SCROLLABLE_CONTENT_CLASS); if (beforeActivateExists) { $element.on(eventUtils.addNamespace("beforeactivate", SCROLLABLE), function(e) { if (!$(e.target).is(selectors.focusable)) { e.preventDefault() } }) } $content.append($element.contents()).appendTo($container); $container.appendTo($wrapper); $wrapper.appendTo($element) }, _dimensionChanged: function() { this.update() }, _attachNativeScrollbarsCustomizationCss: function() { if ("desktop" === devices.real().deviceType && !(navigator.platform.indexOf("Mac") > -1 && browser.webkit)) { this.element().addClass("dx-scrollable-customizable-scrollbars") } }, _render: function() { this._renderDirection(); this._renderStrategy(); this._attachEventHandlers(); this._renderDisabledState(); this._createActions(); this.update(); this.callBase() }, _toggleRTLDirection: function(rtl) { var that = this; this.callBase(rtl); if (rtl && this.option("direction") !== VERTICAL) { commonUtils.deferUpdate(function() { var left = that.scrollWidth() - that.clientWidth(); commonUtils.deferRender(function() { that.scrollTo({ left: left }) }) }) } }, _attachEventHandlers: function() { var strategy = this._strategy; var initEventData = { getDirection: strategy.getDirection.bind(strategy), validate: this._validate.bind(this), isNative: this.option("useNative"), scrollTarget: this._$container }; this._$wrapper.off("." + SCROLLABLE).on(eventUtils.addNamespace(scrollEvents.init, SCROLLABLE), initEventData, this._initHandler.bind(this)).on(eventUtils.addNamespace(scrollEvents.start, SCROLLABLE), strategy.handleStart.bind(strategy)).on(eventUtils.addNamespace(scrollEvents.move, SCROLLABLE), strategy.handleMove.bind(strategy)).on(eventUtils.addNamespace(scrollEvents.end, SCROLLABLE), strategy.handleEnd.bind(strategy)).on(eventUtils.addNamespace(scrollEvents.cancel, SCROLLABLE), strategy.handleCancel.bind(strategy)).on(eventUtils.addNamespace(scrollEvents.stop, SCROLLABLE), strategy.handleStop.bind(strategy)); this._$container.off("." + SCROLLABLE).on(eventUtils.addNamespace("scroll", SCROLLABLE), strategy.handleScroll.bind(strategy)) }, _validate: function(e) { if (this._isLocked()) { return false } this._updateIfNeed(); return this._strategy.validate(e) }, _initHandler: function() { var strategy = this._strategy; strategy.handleInit.apply(strategy, arguments) }, _renderDisabledState: function() { this.element().toggleClass(SCROLLABLE_DISABLED_CLASS, this.option("disabled")); if (this.option("disabled")) { this._lock() } else { this._unlock() } }, _renderDirection: function() { this.element().removeClass("dx-scrollable-" + HORIZONTAL).removeClass("dx-scrollable-" + VERTICAL).removeClass("dx-scrollable-" + BOTH).addClass("dx-scrollable-" + this.option("direction")) }, _renderStrategy: function() { this._createStrategy(); this._strategy.render(); this.element().data(SCROLLABLE_STRATEGY, this._strategy) }, _createStrategy: function() { this._strategy = this.option("useNative") ? new NativeStrategy(this) : new simulatedStrategy.SimulatedStrategy(this) }, _createActions: function() { this._strategy.createActions() }, _clean: function() { this._strategy.dispose() }, _optionChanged: function(args) { switch (args.name) { case "onStart": case "onEnd": case "onStop": case "onUpdated": case "onScroll": case "onBounce": this._createActions(); break; case "direction": this._resetInactiveDirection(); this._invalidate(); break; case "useNative": this._setUseSimulatedScrollbar(); this._invalidate(); break; case "inertiaEnabled": case "scrollByContent": case "scrollByThumb": case "bounceEnabled": case "useKeyboard": case "showScrollbar": case "useSimulatedScrollbar": case "pushBackValue": this._invalidate(); break; case "disabled": this._renderDisabledState(); break; case "updateManually": break; default: this.callBase(args) } }, _resetInactiveDirection: function() { var inactiveProp = this._getInactiveProp(); if (!inactiveProp) { return } var scrollOffset = this.scrollOffset(); scrollOffset[inactiveProp] = 0; this.scrollTo(scrollOffset) }, _getInactiveProp: function() { var direction = this.option("direction"); if (direction === VERTICAL) { return "left" } if (direction === HORIZONTAL) { return "top" } }, _location: function() { return this._strategy.location() }, _normalizeLocation: function(location) { if (typeUtils.isPlainObject(location)) { var left = commonUtils.ensureDefined(location.left, location.x); var top = commonUtils.ensureDefined(location.top, location.y); return { left: commonUtils.isDefined(left) ? -left : void 0, top: commonUtils.isDefined(top) ? -top : void 0 } } else { var direction = this.option("direction"); return { left: direction !== VERTICAL ? -location : void 0, top: direction !== HORIZONTAL ? -location : void 0 } } }, _isLocked: function() { return this._locked }, _lock: function() { this._locked = true }, _unlock: function() { if (!this.option("disabled")) { this._locked = false } }, _isDirection: function(direction) { var current = this.option("direction"); if (direction === VERTICAL) { return current !== HORIZONTAL } if (direction === HORIZONTAL) { return current !== VERTICAL } return current === direction }, _updateAllowedDirection: function() { var allowedDirections = this._strategy._allowedDirections(); if (this._isDirection(BOTH) && allowedDirections.vertical && allowedDirections.horizontal) { this._allowedDirectionValue = BOTH } else { if (this._isDirection(HORIZONTAL) && allowedDirections.horizontal) { this._allowedDirectionValue = HORIZONTAL } else { if (this._isDirection(VERTICAL) && allowedDirections.vertical) { this._allowedDirectionValue = VERTICAL } else { this._allowedDirectionValue = null } } } }, _allowedDirection: function() { return this._allowedDirectionValue }, _container: function() { return this._$container }, content: function() { return this._$content }, scrollOffset: function() { var location = this._location(); return { top: -location.top, left: -location.left } }, scrollTop: function() { return this.scrollOffset().top }, scrollLeft: function() { return this.scrollOffset().left }, clientHeight: function() { return this._$container.height() }, scrollHeight: function() { return this.content().outerHeight() - 2 * this._strategy.verticalOffset() }, clientWidth: function() { return this._$container.width() }, scrollWidth: function() { return this.content().outerWidth() }, update: function() { var that = this; return when(that._strategy.update()).done(function() { that._updateAllowedDirection() }) }, scrollBy: function(distance) { distance = this._normalizeLocation(distance); if (!distance.top && !distance.left) { return } this._updateIfNeed(); this._strategy.scrollBy(distance) }, scrollTo: function(targetLocation) { targetLocation = this._normalizeLocation(targetLocation); this._updateIfNeed(); var location = this._location(); var distance = this._normalizeLocation({ left: location.left - commonUtils.ensureDefined(targetLocation.left, location.left), top: location.top - commonUtils.ensureDefined(targetLocation.top, location.top) }); if (!distance.top && !distance.left) { return } this._strategy.scrollBy(distance) }, scrollToElement: function(element, offset) { offset = offset || {}; var $element = $(element); var elementInsideContent = this.content().find(element).length; var elementIsInsideContent = $element.parents("." + SCROLLABLE_CLASS).length - $element.parents("." + SCROLLABLE_CONTENT_CLASS).length === 0; if (!elementInsideContent || !elementIsInsideContent) { return } var scrollPosition = { top: 0, left: 0 }; var direction = this.option("direction"); if (direction !== VERTICAL) { scrollPosition.left = this._scrollToElementPosition($element, HORIZONTAL, offset) } if (direction !== HORIZONTAL) { scrollPosition.top = this._scrollToElementPosition($element, VERTICAL, offset) } this.scrollTo(scrollPosition) }, _scrollToElementPosition: function($element, direction, offset) { var isVertical = direction === VERTICAL; var startOffset = (isVertical ? offset.top : offset.left) || 0; var endOffset = (isVertical ? offset.bottom : offset.right) || 0; var pushBackOffset = isVertical ? this._strategy.verticalOffset() : 0; var elementPositionRelativeToContent = this._elementPositionRelativeToContent($element, isVertical ? "top" : "left"); var elementPosition = elementPositionRelativeToContent - pushBackOffset; var elementSize = $element[isVertical ? "outerHeight" : "outerWidth"](); var scrollLocation = isVertical ? this.scrollTop() : this.scrollLeft(); var clientSize = isVertical ? this.clientHeight() : this.clientWidth(); var startDistance = scrollLocation - elementPosition + startOffset; var endDistance = scrollLocation - elementPosition - elementSize + clientSize - endOffset; if (startDistance <= 0 && endDistance >= 0) { return scrollLocation } return scrollLocation - (Math.abs(startDistance) > Math.abs(endDistance) ? endDistance : startDistance) }, _elementPositionRelativeToContent: function($element, prop) { var result = 0; while (this._hasScrollContent($element)) { result += $element.position()[prop]; $element = $element.offsetParent() } return result }, _hasScrollContent: function($element) { var $content = this.content(); return $element.closest($content).length && !$element.is($content) }, _updateIfNeed: function() { if (!this.option("updateManually")) { this.update() } } }); registerComponent(SCROLLABLE, Scrollable); module.exports = Scrollable; module.exports.deviceDependentOptions = deviceDependentOptions }, /*!***************************************************************!*\ !*** ./js/ui/scroll_view/ui.events.emitter.gesture.scroll.js ***! \***************************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), abstract = Class.abstract, eventUtils = __webpack_require__( /*! ../../events/utils */ 71), GestureEmitter = __webpack_require__( /*! ../../events/gesture/emitter.gesture */ 86), registerEmitter = __webpack_require__( /*! ../../events/core/emitter_registrator */ 84), animationFrame = __webpack_require__( /*! ../../animation/frame */ 59), realDevice = __webpack_require__( /*! ../../core/devices */ 53).real(), compareVersions = __webpack_require__( /*! ../../core/utils/version */ 17).compare; var SCROLL_INIT_EVENT = "dxscrollinit", SCROLL_START_EVENT = "dxscrollstart", SCROLL_MOVE_EVENT = "dxscroll", SCROLL_END_EVENT = "dxscrollend", SCROLL_STOP_EVENT = "dxscrollstop", SCROLL_CANCEL_EVENT = "dxscrollcancel"; var isWheelEvent = function(e) { return "dxmousewheel" === e.type }; var Locker = Class.inherit(function() { var NAMESPACED_SCROLL_EVENT = eventUtils.addNamespace("scroll", "dxScrollEmitter"); return { ctor: function(element) { this._element = element; this._locked = false; var that = this; this._proxiedScroll = function(e) { that._scroll(e) }; $(this._element).on(NAMESPACED_SCROLL_EVENT, this._proxiedScroll) }, _scroll: abstract, check: function(e, callback) { if (this._locked) { callback() } }, dispose: function() { $(this._element).off(NAMESPACED_SCROLL_EVENT, this._proxiedScroll) } } }()); var TimeoutLocker = Locker.inherit(function() { return { ctor: function(element, timeout) { this.callBase(element); this._timeout = timeout }, _scroll: function() { this._prepare(); this._forget() }, _prepare: function() { if (this._timer) { this._clearTimer() } this._locked = true }, _clearTimer: function() { clearTimeout(this._timer); this._locked = false; this._timer = null }, _forget: function() { var that = this; this._timer = setTimeout(function() { that._clearTimer() }, this._timeout) }, dispose: function() { this.callBase(); this._clearTimer() } } }()); var WheelLocker = TimeoutLocker.inherit(function() { var WHEEL_UNLOCK_TIMEOUT = 400; return { ctor: function(element) { this.callBase(element, WHEEL_UNLOCK_TIMEOUT); this._lastWheelDirection = null }, check: function(e, callback) { this._checkDirectionChanged(e); this.callBase(e, callback) }, _checkDirectionChanged: function(e) { if (!isWheelEvent(e)) { this._lastWheelDirection = null; return } var direction = e.shiftKey || false, directionChange = null !== this._lastWheelDirection && direction !== this._lastWheelDirection; this._lastWheelDirection = direction; this._locked = this._locked && !directionChange } } }()); var PointerLocker = TimeoutLocker.inherit(function() { var POINTER_UNLOCK_TIMEOUT = 400; return { ctor: function(element) { this.callBase(element, POINTER_UNLOCK_TIMEOUT) } } }()); ! function() { var ios8_greater = realDevice.ios && compareVersions(realDevice.version, [8]) >= 0, android5_greater = realDevice.android && compareVersions(realDevice.version, [5]) >= 0; if (!(ios8_greater || android5_greater)) { return } PointerLocker = Locker.inherit(function() { return { _scroll: function() { this._locked = true; var that = this; animationFrame.cancelAnimationFrame(this._scrollFrame); this._scrollFrame = animationFrame.requestAnimationFrame(function() { that._locked = false }) }, check: function(e, callback) { animationFrame.cancelAnimationFrame(this._scrollFrame); animationFrame.cancelAnimationFrame(this._checkFrame); var that = this, callBase = this.callBase; this._checkFrame = animationFrame.requestAnimationFrame(function() { callBase.call(that, e, callback); that._locked = false }) }, dispose: function() { this.callBase(); animationFrame.cancelAnimationFrame(this._scrollFrame); animationFrame.cancelAnimationFrame(this._checkFrame) } } }()) }(); var ScrollEmitter = GestureEmitter.inherit(function() { var INERTIA_TIMEOUT = 100, VELOCITY_CALC_TIMEOUT = 200, FRAME_DURATION = Math.round(1e3 / 60); return { ctor: function(element) { this.callBase.apply(this, arguments); this.direction = "both"; this._pointerLocker = new PointerLocker(element); this._wheelLocker = new WheelLocker(element) }, validate: function() { return true }, configure: function(data) { if (data.scrollTarget) { this._pointerLocker.dispose(); this._wheelLocker.dispose(); this._pointerLocker = new PointerLocker(data.scrollTarget); this._wheelLocker = new WheelLocker(data.scrollTarget) } this.callBase(data) }, _init: function(e) { this._wheelLocker.check(e, function() { if (isWheelEvent(e)) { this._accept(e) } }.bind(this)); this._pointerLocker.check(e, function() { var skipCheck = this.isNative && eventUtils.isMouseEvent(e); if (!isWheelEvent(e) && !skipCheck) { this._accept(e) } }.bind(this)); this._fireEvent(SCROLL_INIT_EVENT, e); this._prevEventData = eventUtils.eventData(e) }, move: function(e) { this.callBase.apply(this, arguments); e.isScrollingEvent = this.isNative || e.isScrollingEvent }, _start: function(e) { this._savedEventData = eventUtils.eventData(e); this._fireEvent(SCROLL_START_EVENT, e); this._prevEventData = eventUtils.eventData(e) }, _move: function(e) { var currentEventData = eventUtils.eventData(e); this._fireEvent(SCROLL_MOVE_EVENT, e, { delta: eventUtils.eventDelta(this._prevEventData, currentEventData) }); var eventDelta = eventUtils.eventDelta(this._savedEventData, currentEventData); if (eventDelta.time > VELOCITY_CALC_TIMEOUT) { this._savedEventData = this._prevEventData } this._prevEventData = eventUtils.eventData(e) }, _end: function(e) { var endEventDelta = eventUtils.eventDelta(this._prevEventData, eventUtils.eventData(e)); var velocity = { x: 0, y: 0 }; if (!isWheelEvent(e) && endEventDelta.time < INERTIA_TIMEOUT) { var eventDelta = eventUtils.eventDelta(this._savedEventData, this._prevEventData), velocityMultiplier = FRAME_DURATION / eventDelta.time; velocity = { x: eventDelta.x * velocityMultiplier, y: eventDelta.y * velocityMultiplier } } this._fireEvent(SCROLL_END_EVENT, e, { velocity: velocity }) }, _stop: function(e) { this._fireEvent(SCROLL_STOP_EVENT, e) }, cancel: function(e) { this.callBase.apply(this, arguments); this._fireEvent(SCROLL_CANCEL_EVENT, e) }, dispose: function() { this.callBase.apply(this, arguments); this._pointerLocker.dispose(); this._wheelLocker.dispose() }, _clearSelection: function() { if (this.isNative) { return } return this.callBase.apply(this, arguments) }, _toggleGestureCover: function() { if (this.isNative) { return } return this.callBase.apply(this, arguments) } } }()); registerEmitter({ emitter: ScrollEmitter, events: [SCROLL_INIT_EVENT, SCROLL_START_EVENT, SCROLL_MOVE_EVENT, SCROLL_END_EVENT, SCROLL_STOP_EVENT, SCROLL_CANCEL_EVENT] }); module.exports = { init: SCROLL_INIT_EVENT, start: SCROLL_START_EVENT, move: SCROLL_MOVE_EVENT, end: SCROLL_END_EVENT, stop: SCROLL_STOP_EVENT, cancel: SCROLL_CANCEL_EVENT } }, /*!*****************************!*\ !*** ./js/ui/load_panel.js ***! \*****************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), noop = __webpack_require__( /*! ../core/utils/common */ 14).noop, messageLocalization = __webpack_require__( /*! ../localization/message */ 89), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, LoadIndicator = __webpack_require__( /*! ./load_indicator */ 238), Overlay = __webpack_require__( /*! ./overlay */ 109); var LOADPANEL_CLASS = "dx-loadpanel", LOADPANEL_WRAPPER_CLASS = "dx-loadpanel-wrapper", LOADPANEL_INDICATOR_CLASS = "dx-loadpanel-indicator", LOADPANEL_MESSAGE_CLASS = "dx-loadpanel-message", LOADPANEL_CONTENT_CLASS = "dx-loadpanel-content", LOADPANEL_CONTENT_WRAPPER_CLASS = "dx-loadpanel-content-wrapper", LOADPANEL_PANE_HIDDEN_CLASS = "dx-loadpanel-pane-hidden"; var LoadPanel = Overlay.inherit({ _supportedKeys: function() { return extend(this.callBase(), { escape: noop }) }, _getDefaultOptions: function() { return extend(this.callBase(), { message: messageLocalization.format("Loading"), width: 222, height: 90, animation: null, showIndicator: true, indicatorSrc: "", showPane: true, delay: 0, closeOnBackButton: false, resizeEnabled: false, focusStateEnabled: false }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: { platform: "generic" }, options: { shadingColor: "transparent" } }]) }, _init: function() { this.callBase.apply(this, arguments) }, _initOptions: function() { this.callBase.apply(this, arguments); this.option("templatesRenderAsynchronously", false) }, _render: function() { this.callBase(); this.element().addClass(LOADPANEL_CLASS); this._wrapper().addClass(LOADPANEL_WRAPPER_CLASS) }, _renderContentImpl: function() { this.callBase(); this.content().addClass(LOADPANEL_CONTENT_CLASS); this._$contentWrapper = $("<div>").addClass(LOADPANEL_CONTENT_WRAPPER_CLASS); this._$contentWrapper.appendTo(this._$content); this._togglePaneVisible(); this._cleanPreviousContent(); this._renderLoadIndicator(); this._renderMessage() }, _show: function() { var delay = this.option("delay"); if (!delay) { return this.callBase() } var deferred = $.Deferred(); var callBase = this.callBase.bind(this); this._clearShowTimeout(); this._showTimeout = setTimeout(function() { callBase().done(function() { deferred.resolve() }) }, delay); return deferred.promise() }, _hide: function() { this._clearShowTimeout(); return this.callBase() }, _clearShowTimeout: function() { clearTimeout(this._showTimeout) }, _renderMessage: function() { if (!this._$contentWrapper) { return } var message = this.option("message"); if (!message) { return } var $message = $("<div>").addClass(LOADPANEL_MESSAGE_CLASS).text(message); this._$contentWrapper.append($message) }, _renderLoadIndicator: function() { if (!this._$contentWrapper || !this.option("showIndicator")) { return } this._$indicator = $("<div>").addClass(LOADPANEL_INDICATOR_CLASS).appendTo(this._$contentWrapper); this._createComponent(this._$indicator, LoadIndicator, { indicatorSrc: this.option("indicatorSrc") }) }, _cleanPreviousContent: function() { this.content().find("." + LOADPANEL_MESSAGE_CLASS).remove(); this.content().find("." + LOADPANEL_INDICATOR_CLASS).remove() }, _togglePaneVisible: function() { this.content().toggleClass(LOADPANEL_PANE_HIDDEN_CLASS, !this.option("showPane")) }, _optionChanged: function(args) { switch (args.name) { case "delay": break; case "message": case "showIndicator": this._cleanPreviousContent(); this._renderLoadIndicator(); this._renderMessage(); break; case "showPane": this._togglePaneVisible(); break; case "indicatorSrc": if (this._$indicator) { this._createComponent(this._$indicator, LoadIndicator, { indicatorSrc: this.option("indicatorSrc") }) } break; default: this.callBase(args) } }, _dispose: function() { this._clearShowTimeout(); this.callBase() } }); registerComponent("dxLoadPanel", LoadPanel); module.exports = LoadPanel }, /*!********************************************************!*\ !*** ./js/ui/list/ui.list.edit.decorator.selection.js ***! \********************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), clickEvent = __webpack_require__( /*! ../../events/click */ 75), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, CheckBox = __webpack_require__( /*! ../check_box */ 248), RadioButton = __webpack_require__( /*! ../radio_group/radio_button */ 249), eventUtils = __webpack_require__( /*! ../../events/utils */ 71), registerDecorator = __webpack_require__( /*! ./ui.list.edit.decorator_registry */ 222).register, EditDecorator = __webpack_require__( /*! ./ui.list.edit.decorator */ 224); var SELECT_DECORATOR_ENABLED_CLASS = "dx-list-select-decorator-enabled", SELECT_DECORATOR_SELECT_ALL_CLASS = "dx-list-select-all", SELECT_DECORATOR_SELECT_ALL_CHECKBOX_CLASS = "dx-list-select-all-checkbox", SELECT_DECORATOR_SELECT_ALL_LABEL_CLASS = "dx-list-select-all-label", SELECT_CHECKBOX_CONTAINER_CLASS = "dx-list-select-checkbox-container", SELECT_CHECKBOX_CLASS = "dx-list-select-checkbox", SELECT_RADIO_BUTTON_CONTAINER_CLASS = "dx-list-select-radiobutton-container", SELECT_RADIO_BUTTON_CLASS = "dx-list-select-radiobutton"; var CLICK_EVENT_NAME = eventUtils.addNamespace(clickEvent.name, "dxListEditDecorator"); registerDecorator("selection", "default", EditDecorator.inherit({ _init: function() { this.callBase.apply(this, arguments); var selectionMode = this._list.option("selectionMode"); this._singleStrategy = "single" === selectionMode; this._containerClass = this._singleStrategy ? SELECT_RADIO_BUTTON_CONTAINER_CLASS : SELECT_CHECKBOX_CONTAINER_CLASS; this._controlClass = this._singleStrategy ? SELECT_RADIO_BUTTON_CLASS : SELECT_CHECKBOX_CLASS; this._controlWidget = this._singleStrategy ? RadioButton : CheckBox; this._list.element().addClass(SELECT_DECORATOR_ENABLED_CLASS) }, beforeBag: function(config) { var $itemElement = config.$itemElement, $container = config.$container; var $control = $("<div />").addClass(this._controlClass); new this._controlWidget($control, extend(this._commonOptions(), { value: this._isSelected($itemElement), focusStateEnabled: false, hoverStateEnabled: false, onValueChanged: function(e) { this._processCheckedState($itemElement, e.value); e.jQueryEvent && e.jQueryEvent.stopPropagation() }.bind(this) })); $container.addClass(this._containerClass); $container.append($control) }, modifyElement: function(config) { this.callBase.apply(this, arguments); var $itemElement = config.$itemElement, control = this._controlWidget.getInstance($itemElement.find("." + this._controlClass)); $itemElement.on("stateChanged", function(e, state) { control.option("value", state) }.bind(this)) }, _updateSelectAllState: function() { if (!this._$selectAll) { return } this._selectAllCheckBox.option("value", this._list.isSelectAll()) }, afterRender: function() { if ("all" !== this._list.option("selectionMode")) { return } if (!this._$selectAll) { this._renderSelectAll() } else { this._updateSelectAllState() } }, _renderSelectAll: function() { var $selectAll = this._$selectAll = $("<div>").addClass(SELECT_DECORATOR_SELECT_ALL_CLASS); this._selectAllCheckBox = this._list._createComponent($("<div>").addClass(SELECT_DECORATOR_SELECT_ALL_CHECKBOX_CLASS).appendTo($selectAll), CheckBox); $("<div>").addClass(SELECT_DECORATOR_SELECT_ALL_LABEL_CLASS).text(this._list.option("selectAllText")).appendTo($selectAll); this._list.itemsContainer().prepend($selectAll); this._updateSelectAllState(); this._attachSelectAllHandler() }, _attachSelectAllHandler: function() { this._selectAllCheckBox.option("onValueChanged", this._selectAllHandler.bind(this)); this._$selectAll.off(CLICK_EVENT_NAME).on(CLICK_EVENT_NAME, this._selectAllClickHandler.bind(this)) }, _selectAllHandler: function(e) { e.jQueryEvent && e.jQueryEvent.stopPropagation(); var isSelectedAll = this._selectAllCheckBox.option("value"); var result = this._list._createActionByOption("onSelectAllValueChanged")({ value: isSelectedAll }); if (false === result) { return } if (true === isSelectedAll) { this._selectAllItems() } else { if (false === isSelectedAll) { this._unselectAllItems() } } }, _selectAllItems: function() { this._list._selection.selectAll("page" === this._list.option("selectAllMode")) }, _unselectAllItems: function() { this._list._selection.deselectAll("page" === this._list.option("selectAllMode")) }, _selectAllClickHandler: function() { this._selectAllCheckBox.option("value", !this._selectAllCheckBox.option("value")) }, _isSelected: function($itemElement) { return this._list.isItemSelected($itemElement) }, _processCheckedState: function($itemElement, checked) { if (checked) { this._list.selectItem($itemElement) } else { this._list.unselectItem($itemElement) } }, dispose: function() { this._disposeSelectAll(); this._list.element().removeClass(SELECT_DECORATOR_ENABLED_CLASS); this.callBase.apply(this, arguments) }, _disposeSelectAll: function() { if (this._$selectAll) { this._$selectAll.remove(); this._$selectAll = null } } })) }, /*!****************************!*\ !*** ./js/ui/check_box.js ***! \****************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), devices = __webpack_require__( /*! ../core/devices */ 53), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, inkRipple = __webpack_require__( /*! ./widget/utils.ink_ripple */ 202), Editor = __webpack_require__( /*! ./editor/editor */ 106), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), eventUtils = __webpack_require__( /*! ../events/utils */ 71), themes = __webpack_require__( /*! ./themes */ 143), clickEvent = __webpack_require__( /*! ../events/click */ 75); var CHECKBOX_CLASS = "dx-checkbox", CHECKBOX_ICON_CLASS = "dx-checkbox-icon", CHECKBOX_CHECKED_CLASS = "dx-checkbox-checked", CHECKBOX_CONTAINER_CLASS = "dx-checkbox-container", CHECKBOX_TEXT_CLASS = "dx-checkbox-text", CHECKBOX_HAS_TEXT_CLASS = "dx-checkbox-has-text", CHECKBOX_INDETERMINATE_CLASS = "dx-checkbox-indeterminate", CHECKBOX_FEEDBACK_HIDE_TIMEOUT = 100; var CheckBox = Editor.inherit({ _supportedKeys: function() { var click = function(e) { e.preventDefault(); this._clickAction({ jQueryEvent: e }) }; return extend(this.callBase(), { space: click }) }, _getDefaultOptions: function() { return extend(this.callBase(), { hoverStateEnabled: true, activeStateEnabled: true, value: false, text: "", useInkRipple: false }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function() { return "desktop" === devices.real().deviceType && !devices.isSimulator() }, options: { focusStateEnabled: true } }, { device: function() { return /android5/.test(themes.current()) }, options: { useInkRipple: true } }]) }, _feedbackHideTimeout: CHECKBOX_FEEDBACK_HIDE_TIMEOUT, _render: function() { this._renderSubmitElement(); this.callBase(); this._$container = $("<div>").addClass(CHECKBOX_CONTAINER_CLASS); this.setAria("role", "checkbox"); this._renderClick(); this._renderValue(); this._renderIcon(); this._renderText(); this.option("useInkRipple") && this._renderInkRipple(); this.element().addClass(CHECKBOX_CLASS).append(this._$container) }, _renderSubmitElement: function() { this._$submitElement = $("<input>").attr("type", "hidden").appendTo(this.element()) }, _getSubmitElement: function() { return this._$submitElement }, _renderInkRipple: function() { this._inkRipple = inkRipple.render({ waveSizeCoefficient: 2.5, useHoldAnimation: false, wavesNumber: 2, isCentered: true }) }, _renderInkWave: function(element, jQueryEvent, doRender, waveIndex) { if (!this._inkRipple) { return } var config = { element: element, jQueryEvent: jQueryEvent, wave: waveIndex }; if (doRender) { this._inkRipple.showWave(config) } else { this._inkRipple.hideWave(config) } }, _updateFocusState: function(e, value) { this.callBase.apply(this, arguments); this._renderInkWave(this._$icon, e, value, 0) }, _toggleActiveState: function($element, value, e) { this.callBase.apply(this, arguments); this._renderInkWave(this._$icon, e, value, 1) }, _renderIcon: function() { this._$icon = $("<span>").addClass(CHECKBOX_ICON_CLASS).prependTo(this._$container) }, _renderText: function() { var textValue = this.option("text"); if (!textValue) { if (this._$text) { this._$text.remove(); this.element().removeClass(CHECKBOX_HAS_TEXT_CLASS) } return } if (!this._$text) { this._$text = $("<span>").addClass(CHECKBOX_TEXT_CLASS) } this._$text.text(textValue); this._$container.append(this._$text); this.element().addClass(CHECKBOX_HAS_TEXT_CLASS) }, _renderClick: function() { var that = this, eventName = eventUtils.addNamespace(clickEvent.name, that.NAME); that._clickAction = that._createAction(that._clickHandler); that.element().off(eventName).on(eventName, function(e) { that._clickAction({ jQueryEvent: e }) }) }, _clickHandler: function(args) { var that = args.component; that._saveValueChangeEvent(args.jQueryEvent); that.option("value", !that.option("value")) }, _renderValue: function() { var $element = this.element(), checked = this.option("value"), indeterminate = void 0 === checked; $element.toggleClass(CHECKBOX_CHECKED_CLASS, Boolean(checked)); $element.toggleClass(CHECKBOX_INDETERMINATE_CLASS, indeterminate); this._$submitElement.val(checked); this.setAria("checked", indeterminate ? "mixed" : checked || "false") }, _optionChanged: function(args) { switch (args.name) { case "useInkRipple": this._invalidate(); break; case "value": this._renderValue(); this.callBase(args); break; case "text": this._renderText(); this._renderDimensions(); break; default: this.callBase(args) } } }); registerComponent("dxCheckBox", CheckBox); module.exports = CheckBox }, /*!*******************************************!*\ !*** ./js/ui/radio_group/radio_button.js ***! \*******************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), devices = __webpack_require__( /*! ../../core/devices */ 53), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inkRipple = __webpack_require__( /*! ../widget/utils.ink_ripple */ 202), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), Editor = __webpack_require__( /*! ../editor/editor */ 106), eventUtils = __webpack_require__( /*! ../../events/utils */ 71), themes = __webpack_require__( /*! ../themes */ 143), clickEvent = __webpack_require__( /*! ../../events/click */ 75); var RADIO_BUTTON_CLASS = "dx-radiobutton", RADIO_BUTTON_ICON_CLASS = "dx-radiobutton-icon", RADIO_BUTTON_ICON_DOT_CLASS = "dx-radiobutton-icon-dot", RADIO_BUTTON_CHECKED_CLASS = "dx-radiobutton-checked"; var RadioButton = Editor.inherit({ _supportedKeys: function() { var click = function(e) { e.preventDefault(); this._clickAction({ jQueryEvent: e }) }; return extend(this.callBase(), { space: click }) }, _getDefaultOptions: function() { return extend(this.callBase(), { hoverStateEnabled: true, activeStateEnabled: true, value: false, useInkRipple: false }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function() { return "desktop" === devices.real().deviceType && !devices.isSimulator() }, options: { focusStateEnabled: true } }, { device: function() { return /android5/.test(themes.current()) }, options: { useInkRipple: true } }]) }, _init: function() { this.callBase(); this.element().addClass(RADIO_BUTTON_CLASS) }, _render: function() { this.callBase(); this._renderIcon(); this.option("useInkRipple") && this._renderInkRipple(); this._renderCheckedState(this.option("value")); this._renderClick(); this.setAria("role", "radio") }, _renderInkRipple: function() { this._inkRipple = inkRipple.render({ waveSizeCoefficient: 3.3, useHoldAnimation: false, wavesNumber: 2, isCentered: true }) }, _renderInkWave: function(element, jQueryEvent, doRender, waveIndex) { if (!this._inkRipple) { return } var config = { element: element, jQueryEvent: jQueryEvent, wave: waveIndex }; if (doRender) { this._inkRipple.showWave(config) } else { this._inkRipple.hideWave(config) } }, _updateFocusState: function(e, value) { this.callBase.apply(this, arguments); this._renderInkWave(this._$icon, e, value, 0) }, _toggleActiveState: function($element, value, e) { this.callBase.apply(this, arguments); this._renderInkWave(this._$icon, e, value, 1) }, _renderIcon: function() { this._$icon = $("<div>").addClass(RADIO_BUTTON_ICON_CLASS); $("<div>").addClass(RADIO_BUTTON_ICON_DOT_CLASS).appendTo(this._$icon); this.element().append(this._$icon) }, _renderCheckedState: function(checked) { this.element().toggleClass(RADIO_BUTTON_CHECKED_CLASS, checked); this.setAria("checked", checked) }, _renderClick: function() { var eventName = eventUtils.addNamespace(clickEvent.name, this.NAME); this._clickAction = this._createAction(function(args) { this._clickHandler(args.jQueryEvent) }.bind(this)); this.element().off(eventName).on(eventName, function(e) { this._clickAction({ jQueryEvent: e }) }.bind(this)) }, _clickHandler: function(e) { this._saveValueChangeEvent(e); this.option("value", true) }, _optionChanged: function(args) { switch (args.name) { case "useInkRipple": this._invalidate(); break; case "value": this._renderCheckedState(args.value); this.callBase(args); break; default: this.callBase(args) } } }); registerComponent("dxRadioButton", RadioButton); module.exports = RadioButton }, /*!******************************************************!*\ !*** ./js/ui/list/ui.list.edit.decorator.reorder.js ***! \******************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), translator = __webpack_require__( /*! ../../animation/translator */ 69), fx = __webpack_require__( /*! ../../animation/fx */ 68), dragEvents = __webpack_require__( /*! ../../events/drag */ 110), mathUtils = __webpack_require__( /*! ../../core/utils/math */ 87), Animator = __webpack_require__( /*! ../scroll_view/animator */ 243), eventUtils = __webpack_require__( /*! ../../events/utils */ 71), registerDecorator = __webpack_require__( /*! ./ui.list.edit.decorator_registry */ 222).register, EditDecorator = __webpack_require__( /*! ./ui.list.edit.decorator */ 224); var ReorderScrollAnimator = Animator.inherit({ ctor: function(strategy) { this.callBase(); this._strategy = strategy }, _isFinished: function() { return this._strategy.scrollFinished() }, _step: function() { this._strategy.scrollByStep() } }); var LIST_EDIT_DECORATOR = "dxListEditDecorator", DRAG_START_EVENT_NAME = eventUtils.addNamespace(dragEvents.start, LIST_EDIT_DECORATOR), DRAG_UPDATE_EVENT_NAME = eventUtils.addNamespace(dragEvents.move, LIST_EDIT_DECORATOR), DRAG_END_EVENT_NAME = eventUtils.addNamespace(dragEvents.end, LIST_EDIT_DECORATOR), REORDER_HANDLE_CONTAINER_CLASS = "dx-list-reorder-handle-container", REORDER_HANDLE_CLASS = "dx-list-reorder-handle", REOREDERING_ITEM_CLASS = "dx-list-item-reordering", REOREDERING_ITEM_GHOST_CLASS = "dx-list-item-ghost-reordering"; registerDecorator("reorder", "default", EditDecorator.inherit({ _init: function() { this._groupedEnabled = this._list.option("grouped"); this._initAnimator() }, _initAnimator: function() { this._scrollAnimator = new ReorderScrollAnimator(this) }, _startAnimator: function() { if (!this._scrollAnimator.inProgress()) { this._scrollAnimator.start() } }, _stopAnimator: function() { this._scrollAnimator.stop() }, afterBag: function(config) { var $itemElement = config.$itemElement, $container = config.$container; var $handle = $("<div>").addClass(REORDER_HANDLE_CLASS); var lockedDrag = false; $handle.on("dxpointerdown", function(e) { lockedDrag = !eventUtils.isMouseEvent(e) }); $handle.on("dxhold", { timeout: 30 }, function(e) { e.cancel = true; lockedDrag = false }); $handle.on(DRAG_START_EVENT_NAME, { direction: "vertical", immediate: true }, function(e) { if (lockedDrag) { e.cancel = true; return } this._dragStartHandler($itemElement, e) }.bind(this)); $handle.on(DRAG_UPDATE_EVENT_NAME, this._dragHandler.bind(this, $itemElement)); $handle.on(DRAG_END_EVENT_NAME, this._dragEndHandler.bind(this, $itemElement)); $container.addClass(REORDER_HANDLE_CONTAINER_CLASS); $container.append($handle) }, _dragStartHandler: function($itemElement, e) { if ($itemElement.is(".dx-state-disabled, .dx-state-disabled *")) { e.cancel = true; return } this._stopPreviousAnimation(); e.targetElements = []; this._cacheItemsPositions(); this._startPointerOffset = e.pageY - $itemElement.offset().top; this._elementHeight = $itemElement.outerHeight(); var itemIndex = this._list.getFlatIndexByItemElement($itemElement); this._startIndex = itemIndex; this._lastIndex = itemIndex; this._cacheScrollData(); var that = this; this._createGhostTimeout = setTimeout(function() { that._createGhost($itemElement); that._updateGhostPosition(); $itemElement.addClass(REOREDERING_ITEM_CLASS) }) }, _stopPreviousAnimation: function() { fx.stop(this._$ghostItem, true) }, _cacheItemsPositions: function() { var itemPositions = this._itemPositions = []; $.each(this._list.itemElements(), function(index, item) { var cachedPosition = null; itemPositions.push(function() { cachedPosition = null === cachedPosition ? $(item).position().top : cachedPosition; return cachedPosition }) }) }, _getDraggingElementPosition: function() { return this._itemPositions[this._startIndex]() }, _getLastElementPosition: function() { return this._itemPositions[this._lastIndex]() }, _cacheScrollData: function() { this._list.updateDimensions(); this._startScrollTop = this._list.scrollTop(); this._scrollOffset = 0; this._scrollHeight = this._list.scrollHeight(); this._clientHeight = this._list.clientHeight() }, _scrollTop: function() { return this._startScrollTop + this._scrollOffset }, _createGhost: function($itemElement) { this._$ghostItem = $itemElement.clone(); this._$ghostItem.addClass(REOREDERING_ITEM_GHOST_CLASS).appendTo(this._list.itemsContainer()); this._startGhostPosition = this._getDraggingElementPosition() - this._$ghostItem.position().top; translator.move(this._$ghostItem, { top: this._startGhostPosition }) }, _dragHandler: function($itemElement, e) { this._topOffset = e.offset.y; this._updateItemPositions(); var pointerPosition = this._getPointerPosition(); this._toggleScroll(pointerPosition) }, _getPointerPosition: function() { return this._getDraggingElementPosition() + this._startPointerOffset + this._scrollOffset + this._topOffset }, _toggleScroll: function(pointerPosition) { if (this._scrollHeight <= this._clientHeight) { return } var minOffset = .7 * this._elementHeight, topOffset = this._clientHeight - (pointerPosition - this._scrollTop()), topOffsetRatio = topOffset / minOffset, bottomOffset = pointerPosition - this._scrollTop(), bottomOffsetRatio = bottomOffset / minOffset; if (topOffsetRatio < 1) { this._stepSize = this._adjustRationIntoRange(topOffsetRatio); this._startAnimator() } else { if (bottomOffsetRatio < 1) { this._stepSize = -this._adjustRationIntoRange(bottomOffsetRatio); this._startAnimator() } else { this._stopAnimator() } } }, _adjustRationIntoRange: function(ratio) { return mathUtils.fitIntoRange(Math.round(7 * Math.abs(ratio - 1)), 1, 7) }, _updateItemPositions: function() { this._updateGhostPosition(); this._updateOthersPositions() }, _updateGhostPosition: function() { if (!this._$ghostItem) { return } translator.move(this._$ghostItem, { top: this._startGhostPosition + this._scrollOffset + this._topOffset }) }, _updateOthersPositions: function() { var currentIndex = this._findItemIndexByPosition(this._getPointerPosition()); if (this._lastIndex === currentIndex || this._groupedEnabled && !this._sameParent(currentIndex)) { return } var currentIndexOffset = currentIndex - this._startIndex, currentDirection = mathUtils.sign(currentIndexOffset), minIndex = Math.min(currentIndex, this._lastIndex), maxIndex = Math.max(currentIndex, this._lastIndex); for (var itemIndex = minIndex; itemIndex <= maxIndex; itemIndex++) { if (itemIndex === this._startIndex) { continue } var $item = this._list.getItemElementByFlatIndex(itemIndex), itemIndexOffset = itemIndex - this._startIndex, itemDirection = mathUtils.sign(itemIndexOffset), offsetsDifference = Math.abs(itemIndexOffset) <= Math.abs(currentIndexOffset), sameDirections = currentDirection === itemDirection, setupPosition = offsetsDifference && sameDirections, resetPosition = !offsetsDifference || !sameDirections; fx.stop($item); if (setupPosition) { fx.animate($item, { type: "slide", to: { top: this._elementHeight * -currentDirection }, duration: 300 }) } if (resetPosition) { fx.animate($item, { type: "slide", to: { top: 0 }, duration: 300 }) } } this._lastIndex = currentIndex }, _sameParent: function(index) { var $dragging = this._list.getItemElementByFlatIndex(this._startIndex), $over = this._list.getItemElementByFlatIndex(index); return $over.parent().get(0) === $dragging.parent().get(0) }, scrollByStep: function() { this._scrollOffset += this._stepSize; this._list.scrollBy(this._stepSize); this._updateItemPositions() }, scrollFinished: function() { var scrollTop = this._scrollTop(), rejectScrollTop = scrollTop <= 0 && this._stepSize < 0, rejectScrollBottom = scrollTop >= this._scrollHeight - this._clientHeight && this._stepSize > 0; return rejectScrollTop || rejectScrollBottom }, _dragEndHandler: function($itemElement) { this._scrollAnimator.stop(); fx.animate(this._$ghostItem, { type: "slide", to: { top: this._startGhostPosition + this._getLastElementPosition() - this._getDraggingElementPosition() }, duration: 300 }).done(function() { $itemElement.removeClass(REOREDERING_ITEM_CLASS); this._resetPositions(); this._list.reorderItem($itemElement, this._list.getItemElementByFlatIndex(this._lastIndex)); this._deleteGhost() }.bind(this)) }, _deleteGhost: function() { if (!this._$ghostItem) { return } this._$ghostItem.remove() }, _resetPositions: function() { var minIndex = Math.min(this._startIndex, this._lastIndex), maxIndex = Math.max(this._startIndex, this._lastIndex); for (var itemIndex = minIndex; itemIndex <= maxIndex; itemIndex++) { var $item = this._list.getItemElementByFlatIndex(itemIndex); translator.resetPosition($item) } }, _findItemIndexByPosition: function(position) { var minIndex = 0; var maxIndex = this._itemPositions.length - 1; var currentIndex; var currentPosition; while (minIndex <= maxIndex) { currentIndex = (minIndex + maxIndex) / 2 | 0; currentPosition = this._itemPositions[currentIndex](); if (currentPosition < position) { minIndex = currentIndex + 1 } else { if (currentPosition > position) { maxIndex = currentIndex - 1 } else { return currentIndex } } } return mathUtils.fitIntoRange(minIndex, 0, Math.max(maxIndex, 0)) }, dispose: function() { clearTimeout(this._createGhostTimeout); this.callBase.apply(this, arguments) } })) }, /*!********************************************!*\ !*** ./js/ui/editor/ui.data_expression.js ***! \********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), variableWrapper = __webpack_require__( /*! ../../core/utils/variable_wrapper */ 28), dataCoreUtils = __webpack_require__( /*! ../../core/utils/data */ 50), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, FunctionTemplate = __webpack_require__( /*! ../widget/function_template */ 98), DataHelperMixin = __webpack_require__( /*! ../../data_helper */ 152), DataSourceModule = __webpack_require__( /*! ../../data/data_source/data_source */ 153), ArrayStore = __webpack_require__( /*! ../../data/array_store */ 158); var DataExpressionMixin = extend(DataHelperMixin, { _dataExpressionDefaultOptions: function() { return { items: [], dataSource: null, itemTemplate: "item", value: null, valueExpr: "this", displayExpr: void 0 } }, _initDataExpressions: function() { this._compileValueGetter(); this._compileDisplayGetter(); this._initDynamicTemplates(); this._initDataSource(); this._itemsToDataSource() }, _itemsToDataSource: function() { if (!this.option("dataSource")) { this._dataSource = new DataSourceModule.DataSource({ store: new ArrayStore(this.option("items")), pageSize: 0 }) } }, _compileDisplayGetter: function() { this._displayGetter = dataCoreUtils.compileGetter(this._displayGetterExpr()) }, _displayGetterExpr: function() { return this.option("displayExpr") }, _compileValueGetter: function() { this._valueGetter = dataCoreUtils.compileGetter(this._valueGetterExpr()) }, _valueGetterExpr: function() { return this.option("valueExpr") || "this" }, _loadValue: function(value) { var deferred = $.Deferred(); value = this._unwrappedValue(value); if (!commonUtils.isDefined(value)) { return deferred.reject().promise() } this._loadSingle(this._valueGetterExpr(), value).done(function(item) { this._isValueEquals(this._valueGetter(item), value) ? deferred.resolve(item) : deferred.reject() }.bind(this)).fail(function() { deferred.reject() }); return deferred.promise() }, _getCurrentValue: function() { return this.option("value") }, _unwrappedValue: function(value) { value = commonUtils.isDefined(value) ? value : this._getCurrentValue(); if (value && this._dataSource && "this" === this._valueGetterExpr()) { value = this._getItemKey(value) } return variableWrapper.unwrap(value) }, _getItemKey: function(value) { var key = this._dataSource.key(); if (Array.isArray(key)) { var result = {}; for (var i = 0, n = key.length; i < n; i++) { result[key[i]] = value[key[i]] } return result } if (key && "object" === typeof value) { value = value[key] } return value }, _isValueEquals: function(value1, value2) { var dataSourceKey = this._dataSource && this._dataSource.key(); var isDefined = commonUtils.isDefined; var result = this._compareValues(value1, value2); if (!result && dataSourceKey && isDefined(value1) && isDefined(value2)) { if (Array.isArray(dataSourceKey)) { result = this._compareByCompositeKey(value1, value2, dataSourceKey) } else { result = this._compareByKey(value1, value2, dataSourceKey) } } return result }, _compareByCompositeKey: function(value1, value2, key) { var isObject = commonUtils.isObject; if (!isObject(value1) || !isObject(value2)) { return false } for (var i = 0, n = key.length; i < n; i++) { if (value1[key[i]] !== value2[key[i]]) { return false } } return true }, _compareByKey: function(value1, value2, key) { var ensureDefined = commonUtils.ensureDefined; var unwrapObservable = variableWrapper.unwrap; var valueKey1 = ensureDefined(unwrapObservable(value1[key]), value1); var valueKey2 = ensureDefined(unwrapObservable(value2[key]), value2); return this._compareValues(valueKey1, valueKey2) }, _compareValues: function(value1, value2) { return dataCoreUtils.toComparable(value1, true) === dataCoreUtils.toComparable(value2, true) }, _initDynamicTemplates: function() { if (this._displayGetterExpr()) { this._originalItemTemplate = this._defaultTemplates.item; this._defaultTemplates.item = new FunctionTemplate(function(options) { return $("<div/>").text(this._displayGetter(options.model)).html() }.bind(this)) } else { if (this._originalItemTemplate) { this._defaultTemplates.item = this._originalItemTemplate } } }, _setCollectionWidgetItemTemplate: function() { this._initDynamicTemplates(); this._setCollectionWidgetOption("itemTemplate", this._getTemplateByOption("itemTemplate")) }, _dataExpressionOptionChanged: function(args) { switch (args.name) { case "items": this._itemsToDataSource(); this._setCollectionWidgetOption("items"); break; case "dataSource": this._initDataSource(); break; case "itemTemplate": this._setCollectionWidgetItemTemplate(); break; case "valueExpr": this._compileValueGetter(); break; case "displayExpr": this._compileDisplayGetter(); this._setCollectionWidgetItemTemplate() } } }); module.exports = DataExpressionMixin }, /*!**********************!*\ !*** ./js/ui/box.js ***! \**********************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), Class = __webpack_require__( /*! ../core/class */ 25), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), support = __webpack_require__( /*! ../core/utils/support */ 61), browser = __webpack_require__( /*! ../core/utils/browser */ 23), CollectionWidgetItem = __webpack_require__( /*! ./collection/item */ 163), devices = __webpack_require__( /*! ../core/devices */ 53), CollectionWidget = __webpack_require__( /*! ./collection/ui.collection_widget.edit */ 149); var BOX_CLASS = "dx-box", BOX_SELECTOR = ".dx-box", BOX_ITEM_CLASS = "dx-box-item", BOX_ITEM_DATA_KEY = "dxBoxItemData"; var flexGrowProp = support.styleProp("flexGrow"); var flexShrinkProp = support.styleProp("flexShrink"); var flexPropPrefix = support.stylePropPrefix("flexDirection"); var MINSIZE_MAP = { row: "minWidth", col: "minHeight" }; var MAXSIZE_MAP = { row: "maxWidth", col: "maxHeight" }; var SHRINK = 1; var FLEX_JUSTIFY_CONTENT_MAP = { start: "flex-start", end: "flex-end", center: "center", "space-between": "space-between", "space-around": "space-around" }; var FLEX_ALIGN_ITEMS_MAP = { start: "flex-start", end: "flex-end", center: "center", stretch: "stretch" }; var FLEX_DIRECTION_MAP = { row: "row", col: "column" }; var BoxItem = CollectionWidgetItem.inherit({ _renderVisible: function(value, oldValue) { this.callBase(value); if (commonUtils.isDefined(oldValue)) { this._options.fireItemStateChangedAction({ name: "visible", state: value, oldState: oldValue }) } } }); var FlexLayoutStrategy = Class.inherit({ ctor: function($element, option) { this._$element = $element; this._option = option }, renderBox: function() { this._$element.css({ display: support.stylePropPrefix("flexDirection") + "flex", flexDirection: FLEX_DIRECTION_MAP[this._option("direction")] }) }, renderAlign: function() { this._$element.css({ justifyContent: this._normalizedAlign() }) }, _normalizedAlign: function() { var align = this._option("align"); return align in FLEX_JUSTIFY_CONTENT_MAP ? FLEX_JUSTIFY_CONTENT_MAP[align] : align }, renderCrossAlign: function() { this._$element.css({ alignItems: this._normalizedCrossAlign() }) }, _normalizedCrossAlign: function() { var crossAlign = this._option("crossAlign"); return crossAlign in FLEX_ALIGN_ITEMS_MAP ? FLEX_ALIGN_ITEMS_MAP[crossAlign] : crossAlign }, renderItems: function($items) { var direction = this._option("direction"); $.each($items, function() { var $item = $(this); var item = $item.data(BOX_ITEM_DATA_KEY); $item.css({ display: flexPropPrefix + "flex", flexBasis: item.baseSize || 0 }).css(MAXSIZE_MAP[direction], item.maxSize || "none").css(MINSIZE_MAP[direction], item.minSize || "0"); var itemStyle = $item.get(0).style; itemStyle[flexGrowProp] = item.ratio; itemStyle[flexShrinkProp] = commonUtils.isDefined(item.shrink) ? item.shrink : SHRINK; $item.children().each(function(_, itemContent) { $(itemContent).css({ width: "auto", height: "auto", display: support.stylePropPrefix("flexDirection") + "flex", flexDirection: $item.children().css("flexDirection") || "column", flexBasis: 0 }); itemContent.style[flexGrowProp] = 1 }) }) }, initSize: commonUtils.noop, update: commonUtils.noop }); var BOX_EVENTNAMESPACE = "dxBox", UPDATE_EVENT = "dxupdate." + BOX_EVENTNAMESPACE, FALLBACK_BOX_ITEM = "dx-box-fallback-item"; var FALLBACK_WRAP_MAP = { row: "nowrap", col: "normal" }; var FALLBACK_MAIN_SIZE_MAP = { row: "width", col: "height" }; var FALLBACK_CROSS_SIZE_MAP = { row: "height", col: "width" }; var FALLBACK_PRE_MARGIN_MAP = { row: "marginLeft", col: "marginTop" }; var FALLBACK_POST_MARGIN_MAP = { row: "marginRight", col: "marginBottom" }; var FALLBACK_CROSS_PRE_MARGIN_MAP = { row: "marginTop", col: "marginLeft" }; var FALLBACK_CROSS_POST_MARGIN_MAP = { row: "marginBottom", col: "marginRight" }; var MARGINS_RTL_FLIP_MAP = { marginLeft: "marginRight", marginRight: "marginLeft" }; var FallbackLayoutStrategy = Class.inherit({ ctor: function($element, option) { this._$element = $element; this._option = option }, renderBox: function() { this._$element.css({ fontSize: 0, whiteSpace: FALLBACK_WRAP_MAP[this._option("direction")], verticalAlign: "top" }); this._$element.off(UPDATE_EVENT).on(UPDATE_EVENT, this.update.bind(this)) }, renderAlign: function() { var $items = this._$items; if (!$items) { return } var align = this._option("align"), shift = 0, totalItemSize = this.totalItemSize, direction = this._option("direction"), boxSize = this._$element[FALLBACK_MAIN_SIZE_MAP[direction]](), freeSpace = boxSize - totalItemSize; this._setItemsMargins($items, direction, 0); switch (align) { case "start": break; case "end": shift = freeSpace; $items.first().css(this._chooseMarginSide(FALLBACK_PRE_MARGIN_MAP[direction]), shift); break; case "center": shift = .5 * freeSpace; $items.first().css(this._chooseMarginSide(FALLBACK_PRE_MARGIN_MAP[direction]), shift); $items.last().css(this._chooseMarginSide(FALLBACK_POST_MARGIN_MAP[direction]), shift); break; case "space-between": shift = .5 * freeSpace / ($items.length - 1); this._setItemsMargins($items, direction, shift); $items.first().css(this._chooseMarginSide(FALLBACK_PRE_MARGIN_MAP[direction]), 0); $items.last().css(this._chooseMarginSide(FALLBACK_POST_MARGIN_MAP[direction]), 0); break; case "space-around": shift = .5 * freeSpace / $items.length; this._setItemsMargins($items, direction, shift) } }, _setItemsMargins: function($items, direction, shift) { $items.css(this._chooseMarginSide(FALLBACK_PRE_MARGIN_MAP[direction]), shift).css(this._chooseMarginSide(FALLBACK_POST_MARGIN_MAP[direction]), shift) }, renderCrossAlign: function() { var $items = this._$items; if (!$items) { return } var crossAlign = this._option("crossAlign"), direction = this._option("direction"), size = this._$element[FALLBACK_CROSS_SIZE_MAP[direction]](); var that = this; switch (crossAlign) { case "start": break; case "end": $.each($items, function() { var $item = $(this), itemSize = $item[FALLBACK_CROSS_SIZE_MAP[direction]](), shift = size - itemSize; $item.css(that._chooseMarginSide(FALLBACK_CROSS_PRE_MARGIN_MAP[direction]), shift) }); break; case "center": $.each($items, function() { var $item = $(this), itemSize = $item[FALLBACK_CROSS_SIZE_MAP[direction]](), shift = .5 * (size - itemSize); $item.css(that._chooseMarginSide(FALLBACK_CROSS_PRE_MARGIN_MAP[direction]), shift).css(that._chooseMarginSide(FALLBACK_CROSS_POST_MARGIN_MAP[direction]), shift) }); break; case "stretch": $items.css(that._chooseMarginSide(FALLBACK_CROSS_PRE_MARGIN_MAP[direction]), 0).css(that._chooseMarginSide(FALLBACK_CROSS_POST_MARGIN_MAP[direction]), 0).css(FALLBACK_CROSS_SIZE_MAP[direction], "100%") } }, _chooseMarginSide: function(value) { if (!this._option("rtlEnabled")) { return value } return MARGINS_RTL_FLIP_MAP[value] || value }, renderItems: function($items) { this._$items = $items; var direction = this._option("direction"), totalRatio = 0, totalWeightedShrink = 0, totalBaseSize = 0; $.each($items, function(_, item) { var $item = $(item); $item.css({ display: "inline-block", verticalAlign: "top" }); $item[FALLBACK_MAIN_SIZE_MAP[direction]]("auto"); $item.removeClass(FALLBACK_BOX_ITEM); var itemData = $item.data(BOX_ITEM_DATA_KEY), ratio = itemData.ratio || 0, size = this._baseSize($item), shrink = commonUtils.isDefined(itemData.shrink) ? itemData.shrink : SHRINK; totalRatio += ratio; totalWeightedShrink += shrink * size; totalBaseSize += size }.bind(this)); var freeSpaceSize = this._boxSize() - totalBaseSize; var itemSize = function($item) { var itemData = $item.data(BOX_ITEM_DATA_KEY), size = this._baseSize($item), factor = freeSpaceSize >= 0 ? itemData.ratio || 0 : (commonUtils.isDefined(itemData.shrink) ? itemData.shrink : SHRINK) * size, totalFactor = freeSpaceSize >= 0 ? totalRatio : totalWeightedShrink, shift = totalFactor ? Math.round(freeSpaceSize * factor / totalFactor) : 0; return size + shift }.bind(this); var totalItemSize = 0; $.each($items, function(_, item) { var $item = $(item), itemData = $(item).data(BOX_ITEM_DATA_KEY), size = itemSize($item); totalItemSize += size; $item.css(MAXSIZE_MAP[direction], itemData.maxSize || "none").css(MINSIZE_MAP[direction], itemData.minSize || "0").css(FALLBACK_MAIN_SIZE_MAP[direction], size); $item.addClass(FALLBACK_BOX_ITEM) }); this.totalItemSize = totalItemSize }, _baseSize: function(item) { var itemData = $(item).data(BOX_ITEM_DATA_KEY); return null == itemData.baseSize ? 0 : "auto" === itemData.baseSize ? this._contentSize(item) : this._parseSize(itemData.baseSize) }, _contentSize: function(item) { return $(item)[FALLBACK_MAIN_SIZE_MAP[this._option("direction")]]() }, _parseSize: function(size) { return String(size).match(/.+%$/) ? .01 * parseFloat(size) * this._boxSizeValue : size }, _boxSize: function(value) { if (!arguments.length) { this._boxSizeValue = this._boxSizeValue || this._totalBaseSize(); return this._boxSizeValue } this._boxSizeValue = value }, _totalBaseSize: function() { var result = 0; $.each(this._$items, function(_, item) { result += this._baseSize(item) }.bind(this)); return result }, initSize: function() { this._boxSize(this._$element[FALLBACK_MAIN_SIZE_MAP[this._option("direction")]]()) }, update: function() { if (!this._$items || this._$element.is(":hidden")) { return } this._$items.detach(); this.initSize(); this._$element.append(this._$items); this.renderItems(this._$items); this.renderAlign(); this.renderCrossAlign(); var element = this._$element.get(0); this._$items.find(BOX_SELECTOR).each(function() { if (element === $(this).parent().closest(BOX_SELECTOR).get(0)) { $(this).triggerHandler(UPDATE_EVENT) } }) } }); var Box = CollectionWidget.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { direction: "row", align: "start", crossAlign: "stretch", activeStateEnabled: false, focusStateEnabled: false, onItemStateChanged: void 0, _layoutStrategy: "flex", _queue: void 0 }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function() { var device = devices.real(); var isOldAndroid = "android" === device.platform && (device.version[0] < 4 || 4 === device.version[0] && device.version[1] < 4), isOldIos = "ios" === device.platform && device.version[0] < 7; return "win" === device.platform || browser.msie || isOldAndroid || isOldIos }, options: { _layoutStrategy: "fallback" } }]) }, _itemClass: function() { return BOX_ITEM_CLASS }, _itemDataKey: function() { return BOX_ITEM_DATA_KEY }, _itemElements: function() { return this._itemContainer().children(this._itemSelector()) }, _init: function() { this.callBase(); this.element().addClass(BOX_CLASS + "-" + this.option("_layoutStrategy")); this._initLayout(); this._initBoxQueue() }, _initLayout: function() { this._layout = "fallback" === this.option("_layoutStrategy") ? new FallbackLayoutStrategy(this.element(), this.option.bind(this)) : new FlexLayoutStrategy(this.element(), this.option.bind(this)) }, _initBoxQueue: function() { this._queue = this.option("_queue") || [] }, _queueIsNotEmpty: function() { return this.option("_queue") ? false : !!this._queue.length }, _pushItemToQueue: function($item, config) { this._queue.push({ $item: $item, config: config }) }, _shiftItemFromQueue: function() { return this._queue.shift() }, _render: function() { this._renderActions(); this.callBase(); this.element().addClass(BOX_CLASS); this._renderBox() }, _renderActions: function() { this._onItemStateChanged = this._createActionByOption("onItemStateChanged") }, _renderBox: function() { this._layout.renderBox(); this._layout.renderAlign(); this._layout.renderCrossAlign() }, _renderItems: function(items) { this._layout.initSize(); this.callBase(items); while (this._queueIsNotEmpty()) { var item = this._shiftItemFromQueue(); this._createComponent(item.$item, Box, extend({ _layoutStrategy: this.option("_layoutStrategy"), itemTemplate: this.option("itemTemplate"), itemHoldTimeout: this.option("itemHoldTimeout"), onItemHold: this.option("onItemHold"), onItemClick: this.option("onItemClick"), onItemContextMenu: this.option("onItemContextMenu"), onItemRendered: this.option("onItemRendered"), _queue: this._queue }, item.config)) } this._layout.renderItems(this._itemElements()); clearTimeout(this._updateTimer); this._updateTimer = setTimeout(function() { if (!this._isUpdated) { this._layout.update() } this._isUpdated = false; this._updateTimer = null }.bind(this)) }, _renderItemContent: function(args) { var $itemNode = args.itemData && args.itemData.node; if ($itemNode) { return this._renderItemContentByNode(args, $itemNode) } return this.callBase(args) }, _postprocessRenderItem: function(args) { var boxConfig = args.itemData.box; if (!boxConfig) { return } this._pushItemToQueue(args.itemContent, boxConfig) }, _createItemByTemplate: function(itemTemplate, args) { if (args.itemData.box) { return itemTemplate.source ? itemTemplate.source() : $() } return this.callBase(itemTemplate, args) }, _visibilityChanged: function(visible) { if (visible) { this._dimensionChanged() } }, _dimensionChanged: function() { if (this._updateTimer) { return } this._isUpdated = true; this._layout.update() }, _dispose: function() { clearTimeout(this._updateTimer); this.callBase.apply(this, arguments) }, _itemOptionChanged: function(item, property, value, oldValue) { if ("visible" === property) { this._onItemStateChanged({ name: property, state: value, oldState: false !== oldValue }) } this.callBase(item, property, value) }, _optionChanged: function(args) { switch (args.name) { case "_layoutStrategy": case "_queue": case "direction": this._invalidate(); break; case "align": this._layout.renderAlign(); break; case "crossAlign": this._layout.renderCrossAlign(); break; default: this.callBase(args) } }, _itemOptions: function() { var that = this, options = this.callBase(); options.fireItemStateChangedAction = function(e) { that._onItemStateChanged(e) }; return options }, repaint: function() { this._dimensionChanged() } }); Box.ItemClass = BoxItem; registerComponent("dxBox", Box); module.exports = Box }, /*!***************************!*\ !*** ./js/ui/calendar.js ***! \***************************/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__( /*! ./calendar/ui.calendar */ 254) }, /*!***************************************!*\ !*** ./js/ui/calendar/ui.calendar.js ***! \***************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Guid = __webpack_require__( /*! ../../core/guid */ 151), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, Button = __webpack_require__( /*! ../button */ 201), Editor = __webpack_require__( /*! ../editor/editor */ 106), Swipeable = __webpack_require__( /*! ../../events/gesture/swipeable */ 255), Navigator = __webpack_require__( /*! ./ui.calendar.navigator */ 256), Views = __webpack_require__( /*! ./ui.calendar.views */ 257), translator = __webpack_require__( /*! ../../animation/translator */ 69), browser = __webpack_require__( /*! ../../core/utils/browser */ 23), dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63), dateSerialization = __webpack_require__( /*! ../../core/utils/date_serialization */ 259), devices = __webpack_require__( /*! ../../core/devices */ 53), config = __webpack_require__( /*! ../../core/config */ 15), fx = __webpack_require__( /*! ../../animation/fx */ 68), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), FunctionTemplate = __webpack_require__( /*! ../widget/function_template */ 98); var CALENDAR_CLASS = "dx-calendar", CALENDAR_BODY_CLASS = "dx-calendar-body", CALENDAR_CELL_CLASS = "dx-calendar-cell", CALENDAR_FOOTER_CLASS = "dx-calendar-footer", CALENDAR_TODAY_BUTTON_CLASS = "dx-calendar-today-button", CALENDAR_HAS_FOOTER_CLASS = "dx-calendar-with-footer", CALENDAR_VIEWS_WRAPPER_CLASS = "dx-calendar-views-wrapper", CALENDAR_VIEW_CLASS = "dx-calendar-view", FOCUSED_STATE_CLASS = "dx-state-focused", ANIMATION_DURATION_SHOW_VIEW = 250, POP_ANIMATION_FROM = .6, POP_ANIMATION_TO = 1, CALENDAR_INPUT_STANDARD_PATTERN = "yyyy-MM-dd", CALENDAR_DATE_VALUE_KEY = "dxDateValueKey", LEVEL_COMPARE_MAP = { month: 3, year: 2, decade: 1, century: 0 }; var Calendar = Editor.inherit({ _activeStateUnit: "." + CALENDAR_CELL_CLASS, _getDefaultOptions: function() { return extend(this.callBase(), { hoverStateEnabled: true, activeStateEnabled: true, currentDate: new Date, value: null, dateSerializationFormat: void 0, min: new Date(1e3, 0), max: new Date(3e3, 0), firstDayOfWeek: void 0, zoomLevel: "month", maxZoomLevel: "month", minZoomLevel: "century", showTodayButton: false, cellTemplate: "cell", onCellClick: null, onContouredChanged: null, hasFocus: function(element) { return element.hasClass(FOCUSED_STATE_CLASS) } }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function() { return "desktop" === devices.real().deviceType && !devices.isSimulator() }, options: { focusStateEnabled: true } }]) }, _supportedKeys: function() { return extend(this.callBase(), { rightArrow: function(e) { e.preventDefault(); if (e.ctrlKey) { this._waitRenderView(1) } else { this._moveCurrentDate(1 * this._getRtlCorrection()) } }, leftArrow: function(e) { e.preventDefault(); if (e.ctrlKey) { this._waitRenderView(-1) } else { this._moveCurrentDate(-1 * this._getRtlCorrection()) } }, upArrow: function(e) { e.preventDefault(); if (e.ctrlKey) { this._navigateUp() } else { if (fx.isAnimating(this._view.element())) { return } this._moveCurrentDate(-1 * this._view.option("colCount")) } }, downArrow: function(e) { e.preventDefault(); if (e.ctrlKey) { this._navigateDown() } else { if (fx.isAnimating(this._view.element())) { return } this._moveCurrentDate(1 * this._view.option("colCount")) } }, home: function(e) { e.preventDefault(); var zoomLevel = this.option("zoomLevel"); var currentDate = this.option("currentDate"); var min = this._dateOption("min"); var date = dateUtils.sameView(zoomLevel, currentDate, min) ? min : dateUtils.getViewFirstCellDate(zoomLevel, currentDate); this.option("currentDate", date) }, end: function(e) { e.preventDefault(); var zoomLevel = this.option("zoomLevel"); var currentDate = this.option("currentDate"); var max = this._dateOption("max"); var date = dateUtils.sameView(zoomLevel, currentDate, max) ? max : dateUtils.getViewLastCellDate(zoomLevel, currentDate); this.option("currentDate", date) }, pageUp: function(e) { e.preventDefault(); this._waitRenderView(-1) }, pageDown: function(e) { e.preventDefault(); this._waitRenderView(1) }, tab: commonUtils.noop, enter: function(e) { if (!this._isMaxZoomLevel()) { this._navigateDown() } else { var value = this._updateTimeComponent(this.option("currentDate")); this._dateValue(value, e) } } }) }, _getSerializationFormat: function(optionName) { var value = this.option(optionName || "value"); if (this.option("dateSerializationFormat")) { return this.option("dateSerializationFormat") } if (commonUtils.isNumeric(value)) { return "number" } if (!commonUtils.isString(value)) { return } return dateSerialization.getDateSerializationFormat(value) }, _convertToDate: function(value, optionName) { return dateSerialization.deserializeDate(value) }, _dateValue: function(value, jQueryEvent) { if (jQueryEvent) { this._saveValueChangeEvent(jQueryEvent) } this._dateOption("value", value) }, _dateOption: function(optionName, optionValue) { if (1 === arguments.length) { return this._convertToDate(this.option(optionName), optionName) } var serializationFormat = this._getSerializationFormat(optionName); this.option(optionName, dateSerialization.serializeDate(optionValue, serializationFormat)) }, _moveCurrentDate: function(offset) { var currentDate = new Date(this.option("currentDate")); var newDate = new Date(currentDate); var zoomLevel = this.option("zoomLevel"); switch (zoomLevel) { case "month": newDate.setDate(currentDate.getDate() + offset); break; case "year": newDate.setMonth(currentDate.getMonth() + offset); break; case "decade": newDate.setFullYear(currentDate.getFullYear() + offset); break; case "century": newDate.setFullYear(currentDate.getFullYear() + 10 * offset) } var offsetCorrection = 2 * offset / Math.abs(offset); if (Math.abs(offset) > 1 && !dateUtils.sameView(zoomLevel, currentDate, newDate)) { if ("decade" === zoomLevel) { newDate.setFullYear(currentDate.getFullYear() + offset - offsetCorrection) } if ("century" === zoomLevel) { newDate.setFullYear(currentDate.getFullYear() + 10 * (offset - offsetCorrection)) } } this.option("currentDate", newDate) }, _init: function() { this.callBase(); this._correctZoomLevel(); this._initCurrentDate(); this._initActions() }, _correctZoomLevel: function() { var minZoomLevel = this.option("minZoomLevel"), maxZoomLevel = this.option("maxZoomLevel"), zoomLevel = this.option("zoomLevel"); if (LEVEL_COMPARE_MAP[maxZoomLevel] < LEVEL_COMPARE_MAP[minZoomLevel]) { return } if (LEVEL_COMPARE_MAP[zoomLevel] > LEVEL_COMPARE_MAP[maxZoomLevel]) { this.option("zoomLevel", maxZoomLevel) } else { if (LEVEL_COMPARE_MAP[zoomLevel] < LEVEL_COMPARE_MAP[minZoomLevel]) { this.option("zoomLevel", minZoomLevel) } } }, _initCurrentDate: function() { var currentDate = this._getNormalizedDate(this._dateOption("value")) || this._getNormalizedDate(this.option("currentDate")); this.option("currentDate", currentDate) }, _getNormalizedDate: function(date) { date = dateUtils.normalizeDate(date, this._getMinDate(), this._getMaxDate()); return commonUtils.isDefined(date) ? new Date(date) : date }, _initActions: function() { this._cellClickAction = this._createActionByOption("onCellClick"); this._onContouredChanged = this._createActionByOption("onContouredChanged") }, _initTemplates: function() { this.callBase(); this._defaultTemplates.cell = new FunctionTemplate(function(options) { var data = options.model; options.container.append($("<span>").text(data && data.text || String(data))) }, this) }, _updateCurrentDate: function(date) { if (fx.isAnimating(this._$viewsWrapper)) { fx.stop(this._$viewsWrapper, true) } var min = this._getMinDate(), max = this._getMaxDate(); if (min > max) { this.option("currentDate", new Date); return } var normalizedDate = this._getNormalizedDate(date); if (date.getTime() !== normalizedDate.getTime()) { this.option("currentDate", new Date(normalizedDate)); return } var offset = this._getViewsOffset(this._view.option("date"), normalizedDate); if (0 !== offset && !this._isMaxZoomLevel() && this._isOtherViewCellClicked) { offset = 0 } if (this._view && 0 !== offset && !this._suppressNavigation) { this._navigate(offset, normalizedDate) } else { this._renderNavigator(); this._setViewContoured(normalizedDate); this._updateAriaId(normalizedDate) } }, _setViewContoured: function(date) { if (this.option("hasFocus")(this._focusTarget())) { this._view.option("contouredDate", date) } }, _getMinDate: function() { if (this.min) { return this.min } this.min = this._dateOption("min") || new Date(1e3, 0); return this.min }, _getMaxDate: function() { if (this.max) { return this.max } this.max = this._dateOption("max") || new Date(3e3, 0); return this.max }, _getViewsOffset: function(startDate, endDate) { var zoomLevel = this.option("zoomLevel"); if ("month" === zoomLevel) { return this._getMonthsOffset(startDate, endDate) } var zoomCorrection; switch (zoomLevel) { case "century": zoomCorrection = 100; break; case "decade": zoomCorrection = 10; break; default: zoomCorrection = 1 } return parseInt(endDate.getFullYear() / zoomCorrection) - parseInt(startDate.getFullYear() / zoomCorrection) }, _getMonthsOffset: function(startDate, endDate) { var yearOffset = endDate.getFullYear() - startDate.getFullYear(), monthOffset = endDate.getMonth() - startDate.getMonth(); return 12 * yearOffset + monthOffset }, _waitRenderView: function(offset) { if (this._alreadyViewRender) { return } this._alreadyViewRender = true; var date = this._getDateByOffset(offset * this._getRtlCorrection()); this.option("currentDate", date); setTimeout(function() { this._alreadyViewRender = false }.bind(this)) }, _getRtlCorrection: function() { return this.option("rtlEnabled") ? -1 : 1 }, _getDateByOffset: function(offset, date) { date = new Date(date || this.option("currentDate")); var currentDay = date.getDate(); var difference = dateUtils.getDifferenceInMonth(this.option("zoomLevel")) * offset; date.setDate(1); date.setMonth(date.getMonth() + difference); var lastDay = dateUtils.getLastMonthDate(date).getDate(); date.setDate(currentDay > lastDay ? lastDay : currentDay); return date }, _focusTarget: function() { return this.element() }, _render: function() { this._renderSubmitElement(); this.callBase(); var $element = this.element(); $element.addClass(CALENDAR_CLASS); this._renderBody(); $element.append(this.$body); this._renderViews(); this._renderNavigator(); this._renderSwipeable(); this._renderFooter(); this.setAria({ role: "listbox", label: messageLocalization.format("dxCalendar-ariaWidgetName") }); this._updateAriaSelected(); this._updateAriaId(); this._setViewContoured(this.option("currentDate")); $element.append(this._navigator.element()) }, _renderBody: function() { if (!this._$viewsWrapper) { this.$body = $("<div>").addClass(CALENDAR_BODY_CLASS); this._$viewsWrapper = $("<div>").addClass(CALENDAR_VIEWS_WRAPPER_CLASS); this.$body.append(this._$viewsWrapper) } }, _renderViews: function() { this.element().addClass(CALENDAR_VIEW_CLASS + "-" + this.option("zoomLevel")); var currentDate = this.option("currentDate"); this._view = this._renderSpecificView(currentDate); this._view.option("_keyboardProcessor", this._viewKeyboardProcessor); var beforeDate = this._getDateByOffset(-1, currentDate); this._beforeView = this._isViewAvailable(beforeDate) ? this._renderSpecificView(beforeDate) : null; var afterDate = this._getDateByOffset(1, currentDate); this._afterView = this._isViewAvailable(afterDate) ? this._renderSpecificView(afterDate) : null; this._translateViews() }, _renderSpecificView: function(date) { var specificView = Views[this.option("zoomLevel")], $view = $("<div>").appendTo(this._$viewsWrapper), config = this._viewConfig(date); return new specificView($view, config) }, _viewConfig: function(date) { return { date: date, min: this._getMinDate(), max: this._getMaxDate(), firstDayOfWeek: this.option("firstDayOfWeek"), value: this._dateOption("value"), rtl: this.option("rtlEnabled"), disabled: this.option("disabled") || config().designMode, tabIndex: void 0, focusStateEnabled: this.option("focusStateEnabled"), hoverStateEnabled: this.option("hoverStateEnabled"), onCellClick: this._cellClickHandler.bind(this), cellTemplate: this._getTemplateByOption("cellTemplate"), allowValueSelection: this._isMaxZoomLevel() } }, _isViewAvailable: function(date) { var zoomLevel = this.option("zoomLevel"); var min = dateUtils.getViewMinBoundaryDate(zoomLevel, this._getMinDate()); var max = dateUtils.getViewMaxBoundaryDate(zoomLevel, this._getMaxDate()); return dateUtils.dateInRange(date, min, max) }, _translateViews: function() { translator.move(this._view.element(), { left: 0, top: 0 }); this._beforeView && translator.move(this._beforeView.element(), { left: this._getViewPosition(-1), top: 0 }); this._afterView && translator.move(this._afterView.element(), { left: this._getViewPosition(1), top: 0 }) }, _getViewPosition: function(coefficient) { var rtlCorrection = this.option("rtlEnabled") && !browser.msie ? -1 : 1; return 100 * coefficient * rtlCorrection + "%" }, _cellClickHandler: function(e) { var zoomLevel = this.option("zoomLevel"), nextView = dateUtils.getViewDown(zoomLevel); var isMaxZoomLevel = this._isMaxZoomLevel(); if (nextView && !isMaxZoomLevel) { this._navigateDown(e.jQueryEvent.currentTarget) } else { var newValue = this._updateTimeComponent(e.value); this._dateValue(newValue, e.jQueryEvent); this._cellClickAction(e) } }, _updateTimeComponent: function(date) { var result = new Date(date); var currentValue = this._dateOption("value"); if (currentValue) { result.setHours(currentValue.getHours()); result.setMinutes(currentValue.getMinutes()); result.setSeconds(currentValue.getSeconds()); result.setMilliseconds(currentValue.getMilliseconds()) } return result }, _isMaxZoomLevel: function() { return this.option("zoomLevel") === this.option("maxZoomLevel") }, _navigateDown: function(cell) { var zoomLevel = this.option("zoomLevel"); if (this._isMaxZoomLevel()) { return } var nextView = dateUtils.getViewDown(zoomLevel); if (!nextView) { return } var newCurrentDate = this._view.option("contouredDate") || this._view.option("date"); if (cell) { newCurrentDate = $(cell).data(CALENDAR_DATE_VALUE_KEY) } this._isOtherViewCellClicked = true; this.option("currentDate", newCurrentDate); this.option("zoomLevel", nextView); this._isOtherViewCellClicked = false; this._renderNavigator(); this._animateShowView(); this._setViewContoured(this._getNormalizedDate(newCurrentDate)) }, _renderNavigator: function() { if (!this._navigator) { this._navigator = new Navigator($("<div>"), this._navigatorConfig()) } this._navigator.option("text", this._view.getNavigatorCaption()); this._updateButtonsVisibility() }, _navigatorConfig: function() { return { text: this._view.getNavigatorCaption(), onClick: this._navigatorClickHandler.bind(this), onCaptionClick: this._navigateUp.bind(this), rtlEnabled: this.option("rtlEnabled") } }, _navigatorClickHandler: function(e) { var currentDate = this._getDateByOffset(e.direction, this.option("currentDate")); this.option("currentDate", currentDate); this._updateNavigatorCaption(-e.direction * this._getRtlCorrection()) }, _navigateUp: function() { var zoomLevel = this.option("zoomLevel"), nextView = dateUtils.getViewUp(zoomLevel); if (!nextView || this._isMinZoomLevel(zoomLevel)) { return } var contouredDate = this._view.option("contouredDate"); this.option("zoomLevel", nextView); this.option("currentDate", contouredDate || this._view.option("date")); this._renderNavigator(); this._animateShowView().done(function() { this._setViewContoured(contouredDate) }.bind(this)) }, _isMinZoomLevel: function(zoomLevel) { var min = this._getMinDate(), max = this._getMaxDate(); return dateUtils.sameView(zoomLevel, min, max) || this.option("minZoomLevel") === zoomLevel }, _updateButtonsVisibility: function() { this._navigator.toggleButton("next", !commonUtils.isDefined(this._getRequiredView("next"))); this._navigator.toggleButton("prev", !commonUtils.isDefined(this._getRequiredView("prev"))) }, _renderSwipeable: function() { if (!this._swipeable) { this._swipeable = this._createComponent(this.element(), Swipeable, { onStart: this._swipeStartHandler.bind(this), onUpdated: this._swipeUpdateHandler.bind(this), onEnd: this._swipeEndHandler.bind(this), itemSizeFunc: this._viewWidth.bind(this) }) } }, _swipeStartHandler: function(e) { fx.stop(this._$viewsWrapper, true); e.jQueryEvent.maxLeftOffset = this._getRequiredView("next") ? 1 : 0; e.jQueryEvent.maxRightOffset = this._getRequiredView("prev") ? 1 : 0 }, _getRequiredView: function(name) { var view; var isRtl = this.option("rtlEnabled"); if ("next" === name) { view = isRtl ? this._beforeView : this._afterView } else { if ("prev" === name) { view = isRtl ? this._afterView : this._beforeView } } return view }, _swipeUpdateHandler: function(e) { var offset = e.jQueryEvent.offset; translator.move(this._$viewsWrapper, { left: offset * this._viewWidth(), top: 0 }); this._updateNavigatorCaption(offset) }, _swipeEndHandler: function(e) { var targetOffset = e.jQueryEvent.targetOffset, moveOffset = !targetOffset ? 0 : targetOffset / Math.abs(targetOffset); if (0 === moveOffset) { this._animateWrapper(0, ANIMATION_DURATION_SHOW_VIEW); return } var date = this._getDateByOffset(-moveOffset * this._getRtlCorrection()); if (this._isDateInInvalidRange(date)) { if (moveOffset >= 0) { date = new Date(this._getMinDate()) } else { date = new Date(this._getMaxDate()) } } this.option("currentDate", date) }, _viewWidth: function() { if (!this._viewWidthValue) { this._viewWidthValue = this.element().width() } return this._viewWidthValue }, _updateNavigatorCaption: function(offset) { offset *= this._getRtlCorrection(); var view = this._view; if (offset > .5 && this._beforeView) { view = this._beforeView } else { if (offset < -.5 && this._afterView) { view = this._afterView } } this._navigator.option("text", view.getNavigatorCaption()) }, _isDateInInvalidRange: function(date) { if (this._view.isBoundary(date)) { return } var min = this._getMinDate(), max = this._getMaxDate(), normalizedDate = dateUtils.normalizeDate(date, min, max); return normalizedDate === min || normalizedDate === max }, _renderFooter: function() { var showTodayButton = this.option("showTodayButton"); if (showTodayButton) { var $todayButton = this._createComponent($("<a>"), Button, { focusStateEnabled: false, text: messageLocalization.format("dxCalendar-todayButtonText"), onClick: function() { this._toTodayView() }.bind(this), integrationOptions: {} }).element().addClass(CALENDAR_TODAY_BUTTON_CLASS); this._$footer = $("<div>").addClass(CALENDAR_FOOTER_CLASS).append($todayButton); this.element().append(this._$footer) } this.element().toggleClass(CALENDAR_HAS_FOOTER_CLASS, showTodayButton) }, _renderSubmitElement: function() { this._$submitElement = $("<input>").attr("type", "hidden").appendTo(this.element()); this._setSubmitValue(this.option("value")) }, _setSubmitValue: function(value) { var dateValue = this._convertToDate(value); this._$submitElement.val(dateSerialization.serializeDate(dateValue, CALENDAR_INPUT_STANDARD_PATTERN)) }, _getSubmitElement: function() { return this._$submitElement }, _animateShowView: function() { fx.stop(this._view.element(), true); return this._popAnimationView(this._view, POP_ANIMATION_FROM, POP_ANIMATION_TO, ANIMATION_DURATION_SHOW_VIEW).promise() }, _popAnimationView: function(view, from, to, duration) { return fx.animate(view.element(), { type: "pop", from: { scale: from, opacity: from }, to: { scale: to, opacity: to }, duration: duration }) }, _navigate: function(offset, value) { if (0 !== offset && 1 !== Math.abs(offset) && this._isViewAvailable(value)) { var newView = this._renderSpecificView(value); if (offset > 0) { this._afterView && this._afterView.element().remove(); this._afterView = newView } else { this._beforeView && this._beforeView.element().remove(); this._beforeView = newView } this._translateViews() } var rtlCorrection = this._getRtlCorrection(), offsetSign = offset > 0 ? 1 : offset < 0 ? -1 : 0, endPosition = -rtlCorrection * offsetSign * this._viewWidth(); var viewsWrapperPosition = this._$viewsWrapper.position().left; if (viewsWrapperPosition !== endPosition) { if (this._preventViewChangeAnimation) { this._wrapperAnimationEndHandler(offset, value) } else { this._animateWrapper(endPosition, ANIMATION_DURATION_SHOW_VIEW).done(this._wrapperAnimationEndHandler.bind(this, offset, value)) } } }, _animateWrapper: function(to, duration) { return fx.animate(this._$viewsWrapper, { type: "slide", from: { left: this._$viewsWrapper.position().left }, to: { left: to }, duration: duration }) }, _toTodayView: function() { var today = new Date; if (this._isMaxZoomLevel()) { this._dateOption("value", today); return } this._preventViewChangeAnimation = true; this.option("zoomLevel", this.option("maxZoomLevel")); this._dateOption("value", today); this._animateShowView(); this._preventViewChangeAnimation = false }, _wrapperAnimationEndHandler: function(offset, newDate) { this._rearrangeViews(offset); this._translateViews(); this._resetLocation(); this._renderNavigator(); this._setViewContoured(newDate); this._updateAriaId(newDate) }, _rearrangeViews: function(offset) { if (0 === offset) { return } var viewOffset, viewToCreateKey, viewToRemoveKey; if (offset < 0) { viewOffset = 1; viewToCreateKey = "_beforeView"; viewToRemoveKey = "_afterView" } else { viewOffset = -1; viewToCreateKey = "_afterView"; viewToRemoveKey = "_beforeView" } if (!this[viewToCreateKey]) { return } var destinationDate = this[viewToCreateKey].option("date"); if (this[viewToRemoveKey]) { this[viewToRemoveKey].element().remove() } if (offset === viewOffset) { this[viewToRemoveKey] = this._view } else { this[viewToRemoveKey] = this._renderSpecificView(this._getDateByOffset(viewOffset, destinationDate)); this._view.element().remove() } this._view = this[viewToCreateKey]; var dateByOffset = this._getDateByOffset(-viewOffset, destinationDate); this[viewToCreateKey] = this._isViewAvailable(dateByOffset) ? this._renderSpecificView(dateByOffset) : null }, _resetLocation: function() { translator.move(this._$viewsWrapper, { left: 0, top: 0 }) }, _clean: function() { this.callBase(); this._clearViewWidthCache(); delete this._$viewsWrapper; delete this._navigator; delete this._$footer }, _clearViewWidthCache: function() { delete this._viewWidthValue }, _disposeViews: function() { this._view.element().remove(); this._beforeView && this._beforeView.element().remove(); this._afterView && this._afterView.element().remove(); delete this._view; delete this._beforeView; delete this._afterView }, _refreshViews: function() { this._disposeViews(); this._renderViews() }, _visibilityChanged: function() { this._translateViews() }, _focusInHandler: function() { this.callBase.apply(this, arguments); this._view.option("contouredDate", this.option("currentDate")) }, _focusOutHandler: function() { this.callBase.apply(this, arguments); this._view.option("contouredDate", null) }, _updateViewsValue: function(value) { var newValue = value ? new Date(value) : null; this._view.option("value", newValue); this._beforeView && this._beforeView.option("value", newValue); this._afterView && this._afterView.option("value", newValue) }, _updateAriaSelected: function(value, previousValue) { value = value || this._dateOption("value"); var $prevSelectedCell = this._view._getCellByDate(previousValue); var $selectedCell = this._view._getCellByDate(value); this.setAria("selected", void 0, $prevSelectedCell); this.setAria("selected", true, $selectedCell); if (value && this.option("currentDate").getTime() === value.getTime()) { this._updateAriaId(value) } }, _updateAriaId: function(value) { value = value || this.option("currentDate"); var ariaId = "dx-" + new Guid; var $newCell = this._view._getCellByDate(value); this.setAria("id", ariaId, $newCell); this.setAria("activedescendant", ariaId); this._onContouredChanged(ariaId) }, _suppressingNavigation: function(callback, args) { this._suppressNavigation = true; callback.apply(this, args); delete this._suppressNavigation }, _optionChanged: function(args) { var value = args.value; var previousValue = args.previousValue; switch (args.name) { case "width": this.callBase(args); this._clearViewWidthCache(); break; case "min": case "max": this.min = void 0; this.max = void 0; this._suppressingNavigation(this._updateCurrentDate, [this.option("currentDate")]); this._refreshViews(); this._renderNavigator(); break; case "firstDayOfWeek": this._refreshViews(); this._updateButtonsVisibility(); break; case "currentDate": this.setAria("id", void 0, this._view._getCellByDate(previousValue)); this._updateCurrentDate(value); break; case "zoomLevel": this.element().removeClass(CALENDAR_VIEW_CLASS + "-" + previousValue); this._correctZoomLevel(); this._refreshViews(); this._renderNavigator(); this._updateAriaId(); break; case "minZoomLevel": case "maxZoomLevel": this._correctZoomLevel(); this._updateButtonsVisibility(); break; case "value": value = this._convertToDate(value); previousValue = this._convertToDate(previousValue); this._updateAriaSelected(value, previousValue); this.option("currentDate", commonUtils.isDefined(value) ? new Date(value) : new Date); this._updateViewsValue(value); this._setSubmitValue(value); this.callBase(args); break; case "disabled": this._view.option("disabled", value); this.callBase(args); break; case "showTodayButton": this._invalidate(); break; case "onCellClick": this._view.option("onCellClick", value); break; case "onContouredChanged": this._onContouredChanged = this._createActionByOption("onContouredChanged"); break; case "dateSerializationFormat": case "cellTemplate": this._invalidate(); break; case "hasFocus": break; default: this.callBase(args) } } }); registerComponent("dxCalendar", Calendar); module.exports = Calendar }, /*!****************************************!*\ !*** ./js/events/gesture/swipeable.js ***! \****************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), swipeEvents = __webpack_require__( /*! ../swipe */ 183), DOMComponent = __webpack_require__( /*! ../../core/dom_component */ 43), eventUtils = __webpack_require__( /*! ../utils */ 71), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, publicComponentUtils = __webpack_require__( /*! ../../core/utils/public_component */ 45); var DX_SWIPEABLE = "dxSwipeable", SWIPEABLE_CLASS = "dx-swipeable", ACTION_TO_EVENT_MAP = { onStart: swipeEvents.start, onUpdated: swipeEvents.swipe, onEnd: swipeEvents.end, onCancel: "dxswipecancel" }; var Swipeable = DOMComponent.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { elastic: true, immediate: false, direction: "horizontal", itemSizeFunc: null, onStart: null, onUpdated: null, onEnd: null, onCancel: null }) }, _render: function() { this.callBase(); this.element().addClass(SWIPEABLE_CLASS); this._attachEventHandlers() }, _attachEventHandlers: function() { this._detachEventHandlers(); if (this.option("disabled")) { return } var NAME = this.NAME; this._createEventData(); $.each(ACTION_TO_EVENT_MAP, function(actionName, eventName) { var action = this._createActionByOption(actionName, { context: this }); eventName = eventUtils.addNamespace(eventName, NAME); this.element().on(eventName, this._eventData, function(e) { return action({ jQueryEvent: e }) }) }.bind(this)) }, _createEventData: function() { this._eventData = { elastic: this.option("elastic"), itemSizeFunc: this.option("itemSizeFunc"), direction: this.option("direction"), immediate: this.option("immediate") } }, _detachEventHandlers: function() { this.element().off("." + DX_SWIPEABLE) }, _optionChanged: function(args) { switch (args.name) { case "disabled": case "onStart": case "onUpdated": case "onEnd": case "onCancel": case "elastic": case "immediate": case "itemSizeFunc": case "direction": this._detachEventHandlers(); this._attachEventHandlers(); break; case "rtlEnabled": break; default: this.callBase(args) } } }); publicComponentUtils.name(Swipeable, DX_SWIPEABLE); module.exports = Swipeable }, /*!*************************************************!*\ !*** ./js/ui/calendar/ui.calendar.navigator.js ***! \*************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, Widget = __webpack_require__( /*! ../widget/ui.widget */ 95), Button = __webpack_require__( /*! ../button */ 201); var CALENDAR_NAVIGATOR_CLASS = "dx-calendar-navigator", CALENDAR_NAVIGATOR_PREVIOUS_MONTH_CLASS = "dx-calendar-navigator-previous-month", CALENDAR_NAVIGATOR_NEXT_MONTH_CLASS = "dx-calendar-navigator-next-month", CALENDAR_NAVIGATOR_PREVIOUS_VIEW_CLASS = "dx-calendar-navigator-previous-view", CALENDAR_NAVIGATOR_NEXT_VIEW_CLASS = "dx-calendar-navigator-next-view", CALENDAR_NAVIGATOR_DISABLED_LINK_CLASS = "dx-calendar-disabled-navigator-link", CALENDAR_NAVIGATOR_CAPTION_BUTTON_CLASS = "dx-calendar-caption-button"; var Navigator = Widget.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { onClick: null, onCaptionClick: null, text: "" }) }, _init: function() { this.callBase(); this._initActions() }, _initActions: function() { this._clickAction = this._createActionByOption("onClick"); this._captionClickAction = this._createActionByOption("onCaptionClick") }, _render: function() { this.callBase(); this.element().addClass(CALENDAR_NAVIGATOR_CLASS); this._renderButtons(); this._renderCaption() }, _renderButtons: function() { var that = this, direction = this.option("rtlEnabled") ? -1 : 1; this._prevButton = this._createComponent($("<a>"), Button, { focusStateEnabled: false, icon: "chevronleft", onClick: function(e) { that._clickAction({ direction: -direction, jQueryEvent: e }) }, integrationOptions: {} }); var $prevButton = this._prevButton.element().addClass(CALENDAR_NAVIGATOR_PREVIOUS_VIEW_CLASS).addClass(CALENDAR_NAVIGATOR_PREVIOUS_MONTH_CLASS); this._nextButton = this._createComponent($("<a>"), Button, { focusStateEnabled: false, icon: "chevronright", onClick: function(e) { that._clickAction({ direction: direction, jQueryEvent: e }) }, integrationOptions: {} }); var $nextButton = this._nextButton.element().addClass(CALENDAR_NAVIGATOR_NEXT_VIEW_CLASS).addClass(CALENDAR_NAVIGATOR_NEXT_MONTH_CLASS); this._caption = this._createComponent($("<a>").addClass(CALENDAR_NAVIGATOR_CAPTION_BUTTON_CLASS), Button, { focusStateEnabled: false, onClick: function(e) { that._captionClickAction({ jQueryEvent: e }) }, integrationOptions: {} }); var $caption = this._caption.element(); this.element().append($prevButton, $caption, $nextButton) }, _renderCaption: function() { this._caption.option("text", this.option("text")) }, toggleButton: function(buttonPrefix, value) { var buttonName = "_" + buttonPrefix + "Button", button = this[buttonName]; if (button) { button.option("disabled", value); button.element().toggleClass(CALENDAR_NAVIGATOR_DISABLED_LINK_CLASS, value) } }, _optionChanged: function(args) { switch (args.name) { case "text": this._renderCaption(); break; default: this.callBase(args) } } }); module.exports = Navigator }, /*!*********************************************!*\ !*** ./js/ui/calendar/ui.calendar.views.js ***! \*********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, BaseView = __webpack_require__( /*! ./ui.calendar.base_view */ 258), dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, dateLocalization = __webpack_require__( /*! ../../localization/date */ 33), dateSerialization = __webpack_require__( /*! ../../core/utils/date_serialization */ 259); var CALENDAR_OTHER_MONTH_CLASS = "dx-calendar-other-month", CALENDAR_OTHER_VIEW_CLASS = "dx-calendar-other-view"; var Views = { month: BaseView.inherit({ _getViewName: function() { return "month" }, _getDefaultOptions: function() { return extend(this.callBase(), { firstDayOfWeek: void 0, rowCount: 6, colCount: 7 }) }, _renderImpl: function() { this.callBase(); this._renderHeader() }, _renderBody: function() { this.callBase(); this._$table.find("." + CALENDAR_OTHER_VIEW_CLASS).addClass(CALENDAR_OTHER_MONTH_CLASS) }, _renderFocusTarget: noop, getCellAriaLabel: function(date) { return dateLocalization.format(date, "longdate") }, _renderHeader: function() { var that = this; var $header = $("<thead>"); this._$table.prepend($header); var $headerRow = $("<tr>"); $header.append($headerRow); var appendCell = this.option("rtl") ? function(row, cell) { row.prepend(cell) } : function(row, cell) { row.append(cell) }; this._iterateCells(this.option("colCount"), function(i) { var $cell = $("<th>").text(that._getDayCaption(that._getFirstDayOfWeek() + i)); appendCell($headerRow, $cell) }) }, getNavigatorCaption: function() { return dateLocalization.format(this.option("date"), "monthandyear") }, _isTodayCell: function(cellDate) { var today = new Date; return dateUtils.sameDate(cellDate, today) }, _isDateOutOfRange: function(cellDate) { var minDate = this.option("min"), maxDate = this.option("max"); return !dateUtils.dateInRange(cellDate, minDate, maxDate, "date") }, _isOtherView: function(cellDate) { return cellDate.getMonth() !== this.option("date").getMonth() }, _getCellText: function(cellDate) { return cellDate.getDate() }, _getDayCaption: function(day) { var daysInWeek = this.option("colCount"); return dateLocalization.getDayNames("abbreviated")[day % daysInWeek] }, _getFirstCellData: function() { var firstDay = dateUtils.getFirstMonthDate(this.option("date")), firstMonthDayOffset = this._getFirstDayOfWeek() - firstDay.getDay(), daysInWeek = this.option("colCount"); if (firstMonthDayOffset >= 0) { firstMonthDayOffset -= daysInWeek } firstDay.setDate(firstDay.getDate() + firstMonthDayOffset); return firstDay }, _getNextCellData: function(date) { date = new Date(date); date.setDate(date.getDate() + 1); return date }, _getFirstDayOfWeek: function() { return this.option("firstDayOfWeek") || dateLocalization.firstDayOfWeekIndex() }, _getCellByDate: function(date) { return this._$table.find("td[data-value='" + dateSerialization.serializeDate(date, dateUtils.getShortDateFormat()) + "']") }, isBoundary: function(date) { return dateUtils.sameMonthAndYear(date, this.option("min")) || dateUtils.sameMonthAndYear(date, this.option("max")) } }), year: BaseView.inherit({ _getViewName: function() { return "year" }, _isTodayCell: function(cellDate) { return dateUtils.sameMonthAndYear(cellDate, new Date) }, _isDateOutOfRange: function(cellDate) { return !dateUtils.dateInRange(cellDate, dateUtils.getFirstMonthDate(this.option("min")), dateUtils.getLastMonthDate(this.option("max"))) }, _isOtherView: function() { return false }, _getCellText: function(cellDate) { return dateLocalization.getMonthNames()[cellDate.getMonth()].slice(0, 3) }, _getFirstCellData: function() { var data = new Date(this.option("date")); data.setDate(1); data.setMonth(0); return data }, _getNextCellData: function(date) { date = new Date(date); date.setMonth(date.getMonth() + 1); return date }, _getCellByDate: function(date) { var foundDate = new Date(date); foundDate.setDate(1); return this._$table.find("td[data-value='" + dateSerialization.serializeDate(foundDate, dateUtils.getShortDateFormat()) + "']") }, getCellAriaLabel: function(date) { return dateLocalization.format(date, "monthandyear") }, getNavigatorCaption: function() { return this.option("date").getFullYear() }, isBoundary: function(date) { return dateUtils.sameYear(date, this.option("min")) || dateUtils.sameYear(date, this.option("max")) } }), decade: BaseView.inherit({ _getViewName: function() { return "decade" }, _isTodayCell: function(cellDate) { return dateUtils.sameYear(cellDate, new Date) }, _isDateOutOfRange: function(cellDate) { var min = this.option("min"), max = this.option("max"); return !dateUtils.dateInRange(cellDate.getFullYear(), min && min.getFullYear(), max && max.getFullYear()) }, _isOtherView: function(cellDate) { var date = new Date(cellDate); date.setMonth(1); return !dateUtils.sameDecade(date, this.option("date")) }, _getCellText: function(cellDate) { return cellDate.getFullYear() }, _getFirstCellData: function() { var year = dateUtils.getFirstYearInDecade(this.option("date")) - 1; return new Date(year, 0, 1) }, _getNextCellData: function(date) { date = new Date(date); date.setFullYear(date.getFullYear() + 1); return date }, getNavigatorCaption: function() { var year = dateUtils.getFirstYearInDecade(this.option("date")); return year + "-" + (year + 9) }, _isValueOnCurrentView: function(currentDate, value) { return dateUtils.sameDecade(currentDate, value) }, _getCellByDate: function(date) { var foundDate = new Date(date); foundDate.setDate(1); foundDate.setMonth(0); return this._$table.find("td[data-value='" + dateSerialization.serializeDate(foundDate, dateUtils.getShortDateFormat()) + "']") }, isBoundary: function(date) { return dateUtils.sameDecade(date, this.option("min")) || dateUtils.sameDecade(date, this.option("max")) } }), century: BaseView.inherit({ _getViewName: function() { return "century" }, _isTodayCell: function(cellDate) { return dateUtils.sameDecade(cellDate, new Date) }, _isDateOutOfRange: function(cellDate) { var decade = dateUtils.getFirstYearInDecade(cellDate), minDecade = dateUtils.getFirstYearInDecade(this.option("min")), maxDecade = dateUtils.getFirstYearInDecade(this.option("max")); return !dateUtils.dateInRange(decade, minDecade, maxDecade) }, _isOtherView: function(cellDate) { var date = new Date(cellDate); date.setMonth(1); return !dateUtils.sameCentury(date, this.option("date")) }, _getCellText: function(cellDate) { var decade = cellDate.getFullYear(); return decade + " - " + (decade + 9) }, _getFirstCellData: function() { var decade = dateUtils.getFirstDecadeInCentury(this.option("date")) - 10; return new Date(decade, 0, 1) }, _getNextCellData: function(date) { date = new Date(date); date.setFullYear(date.getFullYear() + 10); return date }, _getCellByDate: function(date) { var foundDate = new Date(date); foundDate.setDate(1); foundDate.setMonth(0); foundDate.setFullYear(dateUtils.getFirstYearInDecade(foundDate)); return this._$table.find("td[data-value='" + dateSerialization.serializeDate(foundDate, dateUtils.getShortDateFormat()) + "']") }, getNavigatorCaption: function() { var decade = dateUtils.getFirstDecadeInCentury(this.option("date")); return decade + "-" + (decade + 99) }, isBoundary: function(date) { return dateUtils.sameCentury(date, this.option("min")) || dateUtils.sameCentury(date, this.option("max")) } }) }; module.exports = Views }, /*!*************************************************!*\ !*** ./js/ui/calendar/ui.calendar.base_view.js ***! \*************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Widget = __webpack_require__( /*! ../widget/ui.widget */ 95), dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, dateSerialization = __webpack_require__( /*! ../../core/utils/date_serialization */ 259), eventUtils = __webpack_require__( /*! ../../events/utils */ 71), clickEvent = __webpack_require__( /*! ../../events/click */ 75); var abstract = Widget.abstract, CALENDAR_OTHER_VIEW_CLASS = "dx-calendar-other-view", CALENDAR_CELL_CLASS = "dx-calendar-cell", CALENDAR_EMPTY_CELL_CLASS = "dx-calendar-empty-cell", CALENDAR_TODAY_CLASS = "dx-calendar-today", CALENDAR_SELECTED_DATE_CLASS = "dx-calendar-selected-date", CALENDAR_CONTOURED_DATE_CLASS = "dx-calendar-contoured-date", CALENDAR_DXCLICK_EVENT_NAME = eventUtils.addNamespace(clickEvent.name, "dxCalendar"), CALENDAR_DATE_VALUE_KEY = "dxDateValueKey"; var BaseView = Widget.inherit({ _getViewName: function() { return "base" }, _getDefaultOptions: function() { return extend(this.callBase(), { date: new Date, focusStateEnabled: false, cellTemplate: null, onCellClick: null, rowCount: 3, colCount: 4, allowValueSelection: true }) }, _init: function() { this.callBase(); var value = this.option("value"); this.option("value", new Date(value)); if (!this.option("value").valueOf()) { this.option("value", new Date(0, 0, 0, 0, 0, 0)) } }, _render: function() { this.callBase(); this._renderImpl() }, _renderImpl: function() { this._$table = $("<table>"); this.element().append(this._$table); this._renderBody(); this._renderContouredDate(); this._renderValue(); this._renderEvents() }, _renderBody: function() { this.$body = $("<tbody>").appendTo(this._$table); var that = this, cellTemplate = this.option("cellTemplate"); var appendChild = this.option("rtl") ? function(row, cell) { row.insertBefore(cell, row.firstChild) } : function(row, cell) { row.appendChild(cell) }; function renderCell(cellIndex) { if (prevCellDate) { dateUtils.fixTimezoneGap(prevCellDate, cellDate) } prevCellDate = cellDate; var cell = document.createElement("td"), className = CALENDAR_CELL_CLASS; if (that._isTodayCell(cellDate)) { className = className + " " + CALENDAR_TODAY_CLASS } if (that._isDateOutOfRange(cellDate)) { className = className + " " + CALENDAR_EMPTY_CELL_CLASS } if (that._isOtherView(cellDate)) { className = className + " " + CALENDAR_OTHER_VIEW_CLASS } cell.className = className; cell.setAttribute("data-value", dateSerialization.serializeDate(cellDate, dateUtils.getShortDateFormat())); $.data(cell, CALENDAR_DATE_VALUE_KEY, cellDate); that.setAria({ role: "option", label: that.getCellAriaLabel(cellDate) }, $(cell)); appendChild(row, cell); if (cellTemplate) { cellTemplate.render({ model: { text: that._getCellText(cellDate), date: cellDate, view: that._getViewName() }, container: $(cell), index: cellIndex }) } else { cell.innerHTML = that._getCellText(cellDate) } cellDate = that._getNextCellData(cellDate) } var prevCellDate, cellDate = this._getFirstCellData(), colCount = this.option("colCount"); for (var indexRow = 0, len = this.option("rowCount"); indexRow < len; indexRow++) { var row = document.createElement("tr"); this.$body.get(0).appendChild(row); this._iterateCells(colCount, renderCell) } }, _iterateCells: function(colCount, delegate) { var i = 0; while (i < colCount) { delegate(i); ++i } }, _renderEvents: function() { this._createCellClickAction(); this._$table.off(CALENDAR_DXCLICK_EVENT_NAME).on(CALENDAR_DXCLICK_EVENT_NAME, "td", function(e) { if (!$(e.currentTarget).hasClass(CALENDAR_EMPTY_CELL_CLASS)) { this._cellClickAction({ jQueryEvent: e, value: $(e.currentTarget).data(CALENDAR_DATE_VALUE_KEY) }) } }.bind(this)) }, _createCellClickAction: function() { this._cellClickAction = this._createActionByOption("onCellClick") }, _isTodayCell: abstract, _isDateOutOfRange: abstract, _isOtherView: abstract, _getCellText: abstract, _getFirstCellData: abstract, _getNextCellData: abstract, _renderContouredDate: function(contouredDate) { if (!this.option("focusStateEnabled")) { return } contouredDate = contouredDate || this.option("contouredDate"); var $oldContouredCell = this._$table.find("." + CALENDAR_CONTOURED_DATE_CLASS); var $newContouredCell = this._getCellByDate(contouredDate); $oldContouredCell.removeClass(CALENDAR_CONTOURED_DATE_CLASS); $newContouredCell.addClass(CALENDAR_CONTOURED_DATE_CLASS) }, _dispose: function() { this._keyboardProcessor = void 0; this.callBase() }, _changeValue: function(cellDate) { if (cellDate) { var value = this.option("value"), newValue = value ? new Date(value) : new Date; newValue.setDate(cellDate.getDate()); newValue.setMonth(cellDate.getMonth()); newValue.setFullYear(cellDate.getFullYear()); newValue.setDate(cellDate.getDate()); this.option("value", newValue) } else { this.option("value", null) } }, _renderValue: function() { if (!this.option("allowValueSelection")) { return } var value = this.option("value"), selectedCell = this._getCellByDate(value); if (this._selectedCell) { this._selectedCell.removeClass(CALENDAR_SELECTED_DATE_CLASS) } selectedCell.addClass(CALENDAR_SELECTED_DATE_CLASS); this._selectedCell = selectedCell }, getCellAriaLabel: function(date) { return this._getCellText(date) }, _getFirstAvailableDate: function() { var date = this.option("date"), min = this.option("min"); date = dateUtils.getFirstDateView(this._getViewName(), date); return new Date(min && date < min ? min : date) }, _getCellByDate: abstract, isBoundary: abstract, _optionChanged: function(args) { var name = args.name; switch (name) { case "value": this._renderValue(); break; case "contouredDate": this._renderContouredDate(args.value); break; case "onCellClick": this._createCellClickAction(); break; case "cellTemplate": this._invalidate(); break; default: this.callBase(args) } } }); module.exports = BaseView }, /*!*********************************************!*\ !*** ./js/core/utils/date_serialization.js ***! \*********************************************/ function(module, exports, __webpack_require__) { var config = __webpack_require__( /*! ../config */ 15), commonUtils = __webpack_require__( /*! ./common */ 14), isString = commonUtils.isString, isDate = commonUtils.isDate, isNumber = commonUtils.isNumeric; var NUMBER_SERIALIZATION_FORMAT = "number", DATE_SERIALIZATION_FORMAT = "yyyy/MM/dd", DATETIME_SERIALIZATION_FORMAT = "yyyy/MM/dd HH:mm:ss"; var ISO8601_PATTERN = /^(\d{4,})(-)?(\d{2})(-)?(\d{2})(?:T(\d{2})(:)?(\d{2})?(:)?(\d{2}(?:\.(\d+))?)?)?(Z|([\+\-])(\d{2})(:)?(\d{2})?)?$/; var ISO8601_TIME_PATTERN = /^(\d{2}):(\d{2})(:(\d{2}))?$/; var ISO8601_PATTERN_PARTS = ["", "yyyy", "", "MM", "", "dd", "THH", "", "mm", "", "ss", ".SSS"]; function leftPad(text, length) { while (text.length < length) { text = "0" + text } return text } var LDML_FORMATTERS = { y: function(date, count, useUtc) { return leftPad(date[useUtc ? "getUTCFullYear" : "getFullYear"]().toString(), count) }, M: function(date, count, useUtc) { return leftPad((date[useUtc ? "getUTCMonth" : "getMonth"]() + 1).toString(), Math.min(count, 2)) }, d: function(date, count, useUtc) { return leftPad(date[useUtc ? "getUTCDate" : "getDate"]().toString(), Math.min(count, 2)) }, H: function(date, count, useUtc) { return leftPad(date[useUtc ? "getUTCHours" : "getHours"]().toString(), Math.min(count, 2)) }, m: function(date, count, useUtc) { return leftPad(date[useUtc ? "getUTCMinutes" : "getMinutes"]().toString(), Math.min(count, 2)) }, s: function(date, count, useUtc) { return leftPad(date[useUtc ? "getUTCSeconds" : "getSeconds"]().toString(), Math.min(count, 2)) }, S: function(date, count, useUtc) { return leftPad(date[useUtc ? "getUTCMilliseconds" : "getMilliseconds"]().toString(), 3).substr(0, count) }, x: function(date, count, useUtc) { var timezoneOffset = useUtc ? 0 : date.getTimezoneOffset(), signPart = timezoneOffset > 0 ? "-" : "+", timezoneOffsetAbs = Math.abs(timezoneOffset), hours = Math.floor(timezoneOffsetAbs / 60), minutes = timezoneOffsetAbs % 60, hoursPart = leftPad(hours.toString(), 2), minutesPart = leftPad(minutes.toString(), 2); return signPart + hoursPart + (count >= 3 ? ":" : "") + (count > 1 || minutes ? minutesPart : "") }, X: function(date, count, useUtc) { if (useUtc || !date.getTimezoneOffset()) { return "Z" } return LDML_FORMATTERS.x(date, count, useUtc) }, Z: function(date, count, useUtc) { return LDML_FORMATTERS.X(date, count >= 5 ? 3 : 2, useUtc) } }; var formatDate = function(date, format) { var charIndex, formatter, char, isCurrentCharEqualsNext, charCount = 0, separator = "'", isEscaping = false, result = ""; if (!date) { return null } if (!format) { return date } var useUtc = "Z" === format[format.length - 1] || "'Z'" === format.slice(-3); for (charIndex = 0; charIndex < format.length; charIndex++) { char = format[charIndex]; formatter = LDML_FORMATTERS[char]; isCurrentCharEqualsNext = char === format[charIndex + 1]; charCount++; if (!isCurrentCharEqualsNext) { if (formatter && !isEscaping) { result += formatter(date, charCount, useUtc) } charCount = 0 } if (char === separator && !isCurrentCharEqualsNext) { isEscaping = !isEscaping } else { if (isEscaping || !formatter) { result += char } } if (char === separator && isCurrentCharEqualsNext) { charIndex++ } } return result }; var dateParser = function(text, skipISO8601Parsing) { var result; var parsedValue; if (isString(text) && !skipISO8601Parsing) { result = parseISO8601String(text) } if (!result) { parsedValue = !isDate(text) && Date.parse(text); result = isNumber(parsedValue) ? new Date(parsedValue) : text } return result }; var parseISO8601String = function(text) { var parts = text.match(ISO8601_PATTERN); var timePart = function(part) { return +part || 0 }; if (!parts) { parts = text.match(ISO8601_TIME_PATTERN); if (parts) { return new Date(0, 0, 0, timePart(parts[1]), timePart(parts[2]), timePart(parts[4])) } return } var year = parts[1], month = --parts[3], day = parts[5], timeZoneHour = 0, timeZoneMinute = 0; timeZoneHour = timePart(parts[14]); timeZoneMinute = timePart(parts[16]); if ("-" === parts[13]) { timeZoneHour = -timeZoneHour; timeZoneMinute = -timeZoneMinute } var hour = timePart(parts[6]) - timeZoneHour, minute = timePart(parts[8]) - timeZoneMinute, second = timePart(parts[10]); if (!!parts[12]) { return new Date(Date.UTC(year, month, day, hour, minute, second)) } return new Date(year, month, day, hour, minute, second) }; var getIso8601Format = function(text, useUtc) { var parts = text.match(ISO8601_PATTERN), result = ""; if (!parts) { parts = text.match(ISO8601_TIME_PATTERN); if (parts) { return parts[3] ? "HH:mm:ss" : "HH:mm" } return } for (var i = 1; i < ISO8601_PATTERN_PARTS.length; i++) { if (parts[i]) { result += ISO8601_PATTERN_PARTS[i] || parts[i] } } if ("Z" === parts[12]) { result += "'Z'" } if (parts[14]) { if (parts[15]) { result += "xxx" } else { if (parts[16]) { result += "xx" } else { result += "x" } } } return result }; var deserializeDate = function(value) { if ("number" === typeof value) { return new Date(value) } return dateParser(value, !config().forceIsoDateParsing) }; var serializeDate = function(value, serializationFormat) { if (!serializationFormat) { return value } if (!isDate(value)) { return null } if (serializationFormat === NUMBER_SERIALIZATION_FORMAT) { return value && value.valueOf ? value.valueOf() : null } return formatDate(value, serializationFormat) }; var getDateSerializationFormat = function(value) { if ("number" === typeof value) { return NUMBER_SERIALIZATION_FORMAT } else { if (isString(value)) { var format; if (config().forceIsoDateParsing) { format = getIso8601Format(value) } if (format) { return format } else { if (value.indexOf(":") >= 0) { return DATETIME_SERIALIZATION_FORMAT } else { return DATE_SERIALIZATION_FORMAT } } } else { if (value) { return null } } } }; module.exports = { dateParser: dateParser, deserializeDate: deserializeDate, serializeDate: serializeDate, getDateSerializationFormat: getDateSerializationFormat } }, /*!****************************!*\ !*** ./js/ui/color_box.js ***! \****************************/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__( /*! ./color_box/color_box */ 261) }, /*!**************************************!*\ !*** ./js/ui/color_box/color_box.js ***! \**************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Color = __webpack_require__( /*! ../../color */ 38), ColorView = __webpack_require__( /*! ./color_view */ 262), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, isFunction = __webpack_require__( /*! ../../core/utils/common */ 14).isFunction, registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), DropDownEditor = __webpack_require__( /*! ../drop_down_editor/ui.drop_down_editor */ 210); var COLOR_BOX_CLASS = "dx-colorbox", COLOR_BOX_INPUT_CLASS = COLOR_BOX_CLASS + "-input", COLOR_BOX_INPUT_CONTAINER_CLASS = COLOR_BOX_INPUT_CLASS + "-container", COLOR_BOX_COLOR_RESULT_PREVIEW_CLASS = COLOR_BOX_CLASS + "-color-result-preview", COLOR_BOX_COLOR_IS_NOT_DEFINED = COLOR_BOX_CLASS + "-color-is-not-defined", COLOR_BOX_OVERLAY_CLASS = COLOR_BOX_CLASS + "-overlay", COLOR_BOX_CONTAINER_CELL_CLASS = "dx-colorview-container-cell", COLOR_BOX_BUTTON_CELL_CLASS = "dx-colorview-button-cell", COLOR_BOX_BUTTONS_CONTAINER_CLASS = "dx-colorview-buttons-container", COLOR_BOX_APPLY_BUTTON_CLASS = "dx-colorview-apply-button", COLOR_BOX_CANCEL_BUTTON_CLASS = "dx-colorview-cancel-button"; var colorEditorPrototype = ColorView.prototype, colorUtils = { makeTransparentBackground: colorEditorPrototype._makeTransparentBackground.bind(colorEditorPrototype), makeRgba: colorEditorPrototype._makeRgba.bind(colorEditorPrototype) }; var ColorBox = DropDownEditor.inherit({ _supportedKeys: function() { var arrowHandler = function(e) { e.stopPropagation(); if (this.option("opened")) { e.preventDefault(); return true } }; var upArrowHandler = function(e) { if (!this.option("opened")) { e.preventDefault(); return false } if (e.altKey) { this.close(); return false } return true }; var downArrowHandler = function(e) { if (!this.option("opened") && !e.altKey) { e.preventDefault(); return false } if (!this.option("opened") && e.altKey) { this._validatedOpening(); return false } return true }; return extend(this.callBase(), { tab: function(e) { if (this.option("opened")) { e.preventDefault(); this._colorView._rgbInputs[0].focus() } }, enter: this._enterKeyHandler, leftArrow: arrowHandler, rightArrow: arrowHandler, upArrow: upArrowHandler, downArrow: downArrowHandler }) }, _getDefaultOptions: function() { return extend(this.callBase(), { editAlphaChannel: false, applyValueMode: "useButtons", keyStep: 1, fieldTemplate: null, onApplyButtonClick: null, onCancelButtonClick: null, buttonsLocation: "bottom after" }) }, _popupConfig: function() { return extend(this.callBase(), { height: "auto", width: "" }) }, _contentReadyHandler: function() { this._createColorView(); this._addPopupBottomClasses() }, _addPopupBottomClasses: function() { var $popupBottom = this._popup.bottomToolbar(); if ($popupBottom) { $popupBottom.addClass(COLOR_BOX_CONTAINER_CELL_CLASS).addClass(COLOR_BOX_BUTTON_CELL_CLASS).find(".dx-toolbar-items-container").addClass(COLOR_BOX_BUTTONS_CONTAINER_CLASS); $popupBottom.find(".dx-popup-done").addClass(COLOR_BOX_APPLY_BUTTON_CLASS); $popupBottom.find(".dx-popup-cancel").addClass(COLOR_BOX_CANCEL_BUTTON_CLASS) } }, _createColorView: function() { this._popup.overlayContent().addClass(COLOR_BOX_OVERLAY_CLASS); var $colorView = $("<div>").appendTo(this._popup.content()); this._colorView = this._createComponent($colorView, ColorView, this._colorViewConfig()); $colorView.on("focus", function() { this.focus() }.bind(this)) }, _applyNewColor: function(value) { this.option("value", value); if (value) { colorUtils.makeTransparentBackground(this._$colorResultPreview, value) } if (this._colorViewEnterKeyPressed) { this.close(); this._colorViewEnterKeyPressed = false } }, _colorViewConfig: function() { var that = this; return { value: that.option("value"), editAlphaChannel: that.option("editAlphaChannel"), applyValueMode: that.option("applyValueMode"), focusStateEnabled: that.option("focusStateEnabled"), onEnterKeyPressed: function() { that._colorViewEnterKeyPressed = true; if (that._colorView.option("value") !== that.option("value")) { that._applyNewColor(that._colorView.option("value")); that.close() } }, onValueChanged: function(args) { var instantlyMode = "instantly" === that.option("applyValueMode"); if (!instantlyMode && !that._colorViewEnterKeyPressed) { return } that._applyNewColor(args.value) }, _keyboardProcessor: that._colorViewProcessor } }, _enterKeyHandler: function() { var newValue = this._input().val(), value = this.option("value"), oldValue = this.option("editAlphaChannel") ? colorUtils.makeRgba(value) : value; if (!newValue) { return false } var color = new Color(newValue); if (color.colorIsInvalid) { this._input().val(oldValue); return } if (newValue !== oldValue) { this._applyColorFromInput(newValue); this.option("value", this.option("editAlphaChannel") ? colorUtils.makeRgba(newValue) : newValue) } if (this._colorView) { var colorViewValue = this._colorView.option("value"); if (value !== colorViewValue) { this.option("value", colorViewValue) } } this.close(); return false }, _applyButtonHandler: function() { this._applyNewColor(this._colorView.option("value")); if (isFunction(this.option("onApplyButtonClick"))) { this.option("onApplyButtonClick")() } this.callBase() }, _cancelButtonHandler: function() { this._resetInputValue(); if (isFunction(this.option("onCancelButtonClick"))) { this.option("onCancelButtonClick")() } this.callBase() }, _attachChildKeyboardEvents: function() { this._colorViewProcessor = this._keyboardProcessor.attachChildProcessor(); if (this._colorView) { this._colorView.option("_keyboardProcessor", this._colorViewProcessor); return } }, _init: function() { this.callBase() }, _render: function() { this.callBase(); this.element().addClass(COLOR_BOX_CLASS) }, _renderInput: function() { this.callBase(); this._input().addClass(COLOR_BOX_INPUT_CLASS); this._renderColorPreview() }, _renderColorPreview: function() { this.element().wrapInner($("<div/>").addClass(COLOR_BOX_INPUT_CONTAINER_CLASS)); this._$colorBoxInputContainer = this.element().children().eq(0); this._$colorResultPreview = $("<div>", { "class": COLOR_BOX_COLOR_RESULT_PREVIEW_CLASS, appendTo: this._$colorBoxInputContainer }); if (!this.option("value")) { this._$colorBoxInputContainer.addClass(COLOR_BOX_COLOR_IS_NOT_DEFINED) } else { colorUtils.makeTransparentBackground(this._$colorResultPreview, this.option("value")) } }, _renderValue: function() { var value = this.option("value"); this.option("text", this.option("editAlphaChannel") ? colorUtils.makeRgba(value) : value); this.callBase() }, _resetInputValue: function() { var $input = this._input(), value = this.option("value"); $input.val(value); this._colorView && this._colorView.option("value", value) }, _valueChangeEventHandler: function(e) { var value = this._input().val(); if (value) { value = this._applyColorFromInput(value); this._colorView && this._colorView.option("value", value) } this.callBase(e, value) }, _applyColorFromInput: function(value) { var newColor = new Color(value); if (newColor.colorIsInvalid) { this._resetInputValue(); value = this.option("value") } return value }, _optionChanged: function(args) { var value = args.value, name = args.name; switch (name) { case "value": this._$colorBoxInputContainer.toggleClass(COLOR_BOX_COLOR_IS_NOT_DEFINED, !value); if (value) { colorUtils.makeTransparentBackground(this._$colorResultPreview, value) } else { this._$colorResultPreview.removeAttr("style") } if (this._colorView) { this._colorView.option("value", value) } this.callBase(args); break; case "applyButtonText": case "cancelButtonText": this.callBase(args); this._popup && this._addPopupBottomClasses(); break; case "editAlphaChannel": case "onCancelButtonClick": case "onApplyButtonClick": case "keyStep": if (this._colorView) { this._colorView.option(name, value) } break; case "applyValueMode": this.callBase(args); break; case "rtlEnabled": if (this._colorView) { this._colorView.option(name, value) } this.callBase(args); break; default: this.callBase(args) } } }); registerComponent("dxColorBox", ColorBox); module.exports = ColorBox }, /*!***************************************!*\ !*** ./js/ui/color_box/color_view.js ***! \***************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), translator = __webpack_require__( /*! ../../animation/translator */ 69), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, Color = __webpack_require__( /*! ../../color */ 38), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), devices = __webpack_require__( /*! ../../core/devices */ 53), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), Editor = __webpack_require__( /*! ../editor/editor */ 106), NumberBox = __webpack_require__( /*! ../number_box */ 263), TextBox = __webpack_require__( /*! ../text_box */ 211), Draggable = __webpack_require__( /*! ../draggable */ 266), clickEvent = __webpack_require__( /*! ../../events/click */ 75); var COLOR_VIEW_CLASS = "dx-colorview", COLOR_VIEW_CONTAINER_CLASS = "dx-colorview-container", COLOR_VIEW_ROW_CLASS = "dx-colorview-container-row", COLOR_VIEW_CELL_CLASS = "dx-colorview-container-cell", COLOR_VIEW_PALETTE_CLASS = "dx-colorview-palette", COLOR_VIEW_PALETTE_CELL_CLASS = "dx-colorview-palette-cell", COLOR_VIEW_PALETTE_HANDLE_CLASS = "dx-colorview-palette-handle", COLOR_VIEW_PALETTE_GRADIENT_CLASS = "dx-colorview-palette-gradient", COLOR_VIEW_PALETTE_GRADIENT_WHITE_CLASS = "dx-colorview-palette-gradient-white", COLOR_VIEW_PALETTE_GRADIENT_BLACK_CLASS = "dx-colorview-palette-gradient-black", COLOR_VIEW_HUE_SCALE_CLASS = "dx-colorview-hue-scale", COLOR_VIEW_HUE_SCALE_CELL_CLASS = "dx-colorview-hue-scale-cell", COLOR_VIEW_HUE_SCALE_HANDLE_CLASS = "dx-colorview-hue-scale-handle", COLOR_VIEW_HUE_SCALE_WRAPPER_CLASS = "dx-colorview-hue-scale-wrapper", COLOR_VIEW_CONTROLS_CONTAINER_CLASS = "dx-colorview-controls-container", COLOR_VIEW_RED_LABEL_CLASS = "dx-colorview-label-red", COLOR_VIEW_GREEN_LABEL_CLASS = "dx-colorview-label-green", COLOR_VIEW_BLUE_LABEL_CLASS = "dx-colorview-label-blue", COLOR_VIEW_HEX_LABEL_CLASS = "dx-colorview-label-hex", COLOR_VIEW_ALPHA_CHANNEL_SCALE_CLASS = "dx-colorview-alpha-channel-scale", COLOR_VIEW_APLHA_CHANNEL_ROW_CLASS = "dx-colorview-alpha-channel-row", COLOR_VIEW_ALPHA_CHANNEL_SCALE_WRAPPER_CLASS = "dx-colorview-alpha-channel-wrapper", COLOR_VIEW_ALPHA_CHANNEL_LABEL_CLASS = "dx-colorview-alpha-channel-label", COLOR_VIEW_ALPHA_CHANNEL_HANDLE_CLASS = "dx-colorview-alpha-channel-handle", COLOR_VIEW_ALPHA_CHANNEL_CELL_CLASS = "dx-colorview-alpha-channel-cell", COLOR_VIEW_ALPHA_CHANNEL_BORDER_CLASS = "dx-colorview-alpha-channel-border", COLOR_VIEW_COLOR_PREVIEW = "dx-colorview-color-preview", COLOR_VIEW_COLOR_PREVIEW_CONTAINER_CLASS = "dx-colorview-color-preview-container", COLOR_VIEW_COLOR_PREVIEW_CONTAINER_INNER_CLASS = "dx-colorview-color-preview-container-inner", COLOR_VIEW_COLOR_PREVIEW_COLOR_CURRENT = "dx-colorview-color-preview-color-current", COLOR_VIEW_COLOR_PREVIEW_COLOR_NEW = "dx-colorview-color-preview-color-new"; var ColorView = Editor.inherit({ _supportedKeys: function() { var isRTL = this.option("rtlEnabled"); var that = this, getHorizontalPaletteStep = function(e) { var step = 100 / that._paletteWidth; if (e.shiftKey) { step *= that.option("keyStep") } step = step > 1 ? step : 1; return Math.round(step) }, updateHorizontalPaletteValue = function(step) { var value = that._currentColor.hsv.s + step; if (value > 100) { value = 100 } else { if (value < 0) { value = 0 } } that._currentColor.hsv.s = value; updatePaletteValue() }, getVerticalPaletteStep = function(e) { var step = 100 / that._paletteHeight; if (e.shiftKey) { step *= that.option("keyStep") } step = step > 1 ? step : 1; return Math.round(step) }, updateVerticalPaletteValue = function(step) { var value = that._currentColor.hsv.v + step; if (value > 100) { value = 100 } else { if (value < 0) { value = 0 } } that._currentColor.hsv.v = value; updatePaletteValue() }, updatePaletteValue = function() { that._placePaletteHandle(); that._updateColorFromHsv(that._currentColor.hsv.h, that._currentColor.hsv.s, that._currentColor.hsv.v) }, getHueScaleStep = function(e) { var step = 360 / (that._hueScaleWrapperHeight - that._hueScaleHandleHeight); if (e.shiftKey) { step *= that.option("keyStep") } step = step > 1 ? step : 1; return step }, updateHueScaleValue = function(step) { that._currentColor.hsv.h += step; that._placeHueScaleHandle(); var handleLocation = translator.locate(that._$hueScaleHandle); that._updateColorHue(handleLocation.top + that._hueScaleHandleHeight / 2) }, getAlphaScaleStep = function(e) { var step = 1 / that._alphaChannelScaleWorkWidth; if (e.shiftKey) { step *= that.option("keyStep") } step = step > .01 ? step : .01; step = isRTL ? -step : step; return step }, updateAlphaScaleValue = function(step) { that._currentColor.a += step; that._placeAlphaChannelHandle(); var handleLocation = translator.locate(that._$alphaChannelHandle); that._calculateColorTransparencyByScaleWidth(handleLocation.left + that._alphaChannelHandleWidth / 2) }; return extend(this.callBase(), { upArrow: function(e) { e.preventDefault(); e.stopPropagation(); if (e.ctrlKey) { if (this._currentColor.hsv.h <= 360 && !this._isTopColorHue) { updateHueScaleValue(getHueScaleStep(e)) } } else { if (this._currentColor.hsv.v < 100) { updateVerticalPaletteValue(getVerticalPaletteStep(e)) } } }, downArrow: function(e) { e.preventDefault(); e.stopPropagation(); if (e.ctrlKey) { if (this._currentColor.hsv.h >= 0) { if (this._isTopColorHue) { this._currentColor.hsv.h = 360 } updateHueScaleValue(-getHueScaleStep(e)) } } else { if (this._currentColor.hsv.v > 0) { updateVerticalPaletteValue(-getVerticalPaletteStep(e)) } } }, rightArrow: function(e) { e.preventDefault(); e.stopPropagation(); if (e.ctrlKey) { if (isRTL ? this._currentColor.a < 1 : this._currentColor.a > 0 && this.option("editAlphaChannel")) { updateAlphaScaleValue(-getAlphaScaleStep(e)) } } else { if (this._currentColor.hsv.s < 100) { updateHorizontalPaletteValue(getHorizontalPaletteStep(e)) } } }, leftArrow: function(e) { e.preventDefault(); e.stopPropagation(); if (e.ctrlKey) { if (isRTL ? this._currentColor.a > 0 : this._currentColor.a < 1 && this.option("editAlphaChannel")) { updateAlphaScaleValue(getAlphaScaleStep(e)) } } else { if (this._currentColor.hsv.s > 0) { updateHorizontalPaletteValue(-getHorizontalPaletteStep(e)) } } }, enter: function(e) { this._fireEnterKeyPressed(e) } }) }, _getDefaultOptions: function() { return extend(this.callBase(), { value: null, onEnterKeyPressed: void 0, editAlphaChannel: false, keyStep: 1 }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function() { return "desktop" === devices.real().deviceType && !devices.isSimulator() }, options: { focusStateEnabled: true } }]) }, _init: function() { this.callBase(); this._initColorAndOpacity(); this._initEnterKeyPressedAction() }, _initEnterKeyPressedAction: function() { this._onEnterKeyPressedAction = this._createActionByOption("onEnterKeyPressed") }, _fireEnterKeyPressed: function(e) { if (!this._onEnterKeyPressedAction) { return } this._onEnterKeyPressedAction({ jQueryEvent: e }) }, _initColorAndOpacity: function() { this._setCurrentColor(this.option("value")) }, _setCurrentColor: function(value) { value = value || "#000000"; var newColor = new Color(value); if (!newColor.colorIsInvalid) { if (!this._currentColor || this._makeRgba(this._currentColor) !== this._makeRgba(newColor)) { this._currentColor = newColor; if (this._$currentColor) { this._makeTransparentBackground(this._$currentColor, newColor) } } } else { this.option("value", this._currentColor.baseColor) } }, _render: function() { this.callBase(); this.element().addClass(COLOR_VIEW_CLASS); this._renderColorPickerContainer() }, _makeTransparentBackground: function($el, color) { if (!(color instanceof Color)) { color = new Color(color) } $el.css("backgroundColor", this._makeRgba(color)) }, _makeRgba: function(color) { if (!(color instanceof Color)) { color = new Color(color) } return "rgba(" + [color.r, color.g, color.b, color.a].join(", ") + ")" }, _renderValue: function() { this.callBase(this.option("editAlphaChannel") ? this._makeRgba(this._currentColor) : this.option("value")) }, _renderColorPickerContainer: function() { var $parent = this.element(); this._$colorPickerContainer = $("<div>", { "class": COLOR_VIEW_CONTAINER_CLASS, appendTo: $parent }); this._renderHtmlRows(); this._renderPalette(); this._renderHueScale(); this._renderControlsContainer(); this._renderControls(); this._renderAlphaChannelElements() }, _renderHtmlRows: function(updatedOption) { var $renderedRows = this._$colorPickerContainer.find("." + COLOR_VIEW_ROW_CLASS), renderedRowsCount = $renderedRows.length, rowCount = this.option("editAlphaChannel") ? 2 : 1, delta = renderedRowsCount - rowCount; if (delta > 0) { $renderedRows.eq(-1).remove() } if (delta < 0) { delta = Math.abs(delta); var i, rows = []; for (i = 0; i < delta; i++) { rows.push($("<div>", { "class": COLOR_VIEW_ROW_CLASS })) } if (renderedRowsCount) { for (i = 0; i < rows.length; i++) { $renderedRows.eq(0).after(rows[i]) } } else { this._$colorPickerContainer.append(rows) } } }, _renderHtmlCellInsideRow: function(index, $rowParent, additionalClass) { return $("<div>", { "class": COLOR_VIEW_CELL_CLASS, addClass: additionalClass, appendTo: $rowParent.find("." + COLOR_VIEW_ROW_CLASS).eq(index) }) }, _renderPalette: function() { var $paletteCell = this._renderHtmlCellInsideRow(0, this._$colorPickerContainer, COLOR_VIEW_PALETTE_CELL_CLASS), $paletteGradientWhite = $("<div>", { "class": [COLOR_VIEW_PALETTE_GRADIENT_CLASS, COLOR_VIEW_PALETTE_GRADIENT_WHITE_CLASS].join(" ") }), $paletteGradientBlack = $("<div>", { "class": [COLOR_VIEW_PALETTE_GRADIENT_CLASS, COLOR_VIEW_PALETTE_GRADIENT_BLACK_CLASS].join(" ") }); this._$palette = $("<div>", { "class": COLOR_VIEW_PALETTE_CLASS, css: { backgroundColor: this._currentColor.getPureColor().toHex() }, appendTo: $paletteCell }); this._paletteHeight = this._$palette.height(); this._paletteWidth = this._$palette.width(); this._renderPaletteHandle(); this._$palette.append([$paletteGradientWhite, $paletteGradientBlack]) }, _renderPaletteHandle: function() { this._createComponent(this._$paletteHandle = $("<div>", { "class": COLOR_VIEW_PALETTE_HANDLE_CLASS, appendTo: this._$palette }), Draggable, { area: this._$palette, allowMoveByClick: true, boundOffset: function() { return -this._paletteHandleHeight / 2 }.bind(this), onDrag: function() { var paletteHandlePosition = translator.locate(this._$paletteHandle); this._updateByDrag = true; this._updateColorFromHsv(this._currentColor.hsv.h, this._calculateColorSaturation(paletteHandlePosition), this._calculateColorValue(paletteHandlePosition)) }.bind(this) }); this._paletteHandleWidth = this._$paletteHandle.width(); this._paletteHandleHeight = this._$paletteHandle.height(); this._placePaletteHandle() }, _placePaletteHandle: function() { translator.move(this._$paletteHandle, { left: Math.round(this._paletteWidth * this._currentColor.hsv.s / 100 - this._paletteHandleWidth / 2), top: Math.round(this._paletteHeight - this._paletteHeight * this._currentColor.hsv.v / 100 - this._paletteHandleHeight / 2) }) }, _calculateColorValue: function(paletteHandlePosition) { var value = Math.floor(paletteHandlePosition.top + this._paletteHandleHeight / 2); return 100 - Math.round(100 * value / this._paletteHeight) }, _calculateColorSaturation: function(paletteHandlePosition) { var saturation = Math.floor(paletteHandlePosition.left + this._paletteHandleWidth / 2); return Math.round(100 * saturation / this._paletteWidth) }, _updateColorFromHsv: function(hue, saturation, value) { var a = this._currentColor.a; this._currentColor = new Color("hsv(" + [hue, saturation, value].join(",") + ")"); this._currentColor.a = a; this._updateColorParamsAndColorPreview(); this.applyColor() }, _renderHueScale: function() { var $hueScaleCell = this._renderHtmlCellInsideRow(0, this._$colorPickerContainer, COLOR_VIEW_HUE_SCALE_CELL_CLASS); this._$hueScaleWrapper = $("<div>", { "class": COLOR_VIEW_HUE_SCALE_WRAPPER_CLASS, appendTo: $hueScaleCell }); this._$hueScale = $("<div>", { "class": COLOR_VIEW_HUE_SCALE_CLASS, appendTo: this._$hueScaleWrapper }); this._hueScaleHeight = this._$hueScale.height(); this._hueScaleWrapperHeight = this._$hueScaleWrapper.outerHeight(); this._renderHueScaleHandle() }, _renderHueScaleHandle: function() { this._createComponent(this._$hueScaleHandle = $("<div>", { "class": COLOR_VIEW_HUE_SCALE_HANDLE_CLASS, appendTo: this._$hueScaleWrapper }), Draggable, { area: this._$hueScaleWrapper, allowMoveByClick: true, direction: "vertical", onDrag: function() { this._updateByDrag = true; this._updateColorHue(translator.locate(this._$hueScaleHandle).top + this._hueScaleHandleHeight / 2) }.bind(this) }); this._hueScaleHandleHeight = this._$hueScaleHandle.height(); this._placeHueScaleHandle() }, _placeHueScaleHandle: function() { var hueScaleHeight = this._hueScaleWrapperHeight, handleHeight = this._hueScaleHandleHeight, top = (hueScaleHeight - handleHeight) * (360 - this._currentColor.hsv.h) / 360; if (hueScaleHeight < top + handleHeight) { top = hueScaleHeight - handleHeight } if (top < 0) { top = 0 } translator.move(this._$hueScaleHandle, { top: Math.round(top) }) }, _updateColorHue: function(handlePosition) { var hue = 360 - Math.round(360 * (handlePosition - this._hueScaleHandleHeight / 2) / (this._hueScaleWrapperHeight - this._hueScaleHandleHeight)), saturation = this._currentColor.hsv.s, value = this._currentColor.hsv.v; this._isTopColorHue = false; hue = hue < 0 ? 0 : hue; if (hue >= 360) { this._isTopColorHue = true; hue = 0 } this._updateColorFromHsv(hue, saturation, value); this._$palette.css("backgroundColor", this._currentColor.getPureColor().toHex()) }, _renderControlsContainer: function() { var $controlsContainerCell = this._renderHtmlCellInsideRow(0, this._$colorPickerContainer); this._$controlsContainer = $("<div>", { "class": COLOR_VIEW_CONTROLS_CONTAINER_CLASS, appendTo: $controlsContainerCell }) }, _renderControls: function() { this._renderColorsPreview(); this._renderRgbInputs(); this._renderHexInput() }, _renderColorsPreview: function() { var $colorsPreviewContainer = $("<div>", { "class": COLOR_VIEW_COLOR_PREVIEW_CONTAINER_CLASS, appendTo: this._$controlsContainer }), $colorsPreviewContainerInner = $("<div>", { "class": COLOR_VIEW_COLOR_PREVIEW_CONTAINER_INNER_CLASS, appendTo: $colorsPreviewContainer }); this._$currentColor = $("<div>", { "class": [COLOR_VIEW_COLOR_PREVIEW, COLOR_VIEW_COLOR_PREVIEW_COLOR_CURRENT].join(" ") }); this._$newColor = $("<div>", { "class": [COLOR_VIEW_COLOR_PREVIEW, COLOR_VIEW_COLOR_PREVIEW_COLOR_NEW].join(" ") }); this._makeTransparentBackground(this._$currentColor, this._currentColor); this._makeTransparentBackground(this._$newColor, this._currentColor); $colorsPreviewContainerInner.append([this._$currentColor, this._$newColor]) }, _renderAlphaChannelElements: function() { if (this.option("editAlphaChannel")) { this._$colorPickerContainer.find("." + COLOR_VIEW_ROW_CLASS).eq(1).addClass(COLOR_VIEW_APLHA_CHANNEL_ROW_CLASS); this._renderAlphaChannelScale(); this._renderAlphaChannelInput() } }, _renderRgbInputs: function() { this._rgbInputsWithLabels = [this._renderEditorWithLabel({ editorType: NumberBox, value: this._currentColor.r, onValueChanged: this._updateColor.bind(this, false), labelText: "R", labelAriaText: messageLocalization.format("dxColorView-ariaRed"), labelClass: COLOR_VIEW_RED_LABEL_CLASS }), this._renderEditorWithLabel({ editorType: NumberBox, value: this._currentColor.g, onValueChanged: this._updateColor.bind(this, false), labelText: "G", labelAriaText: messageLocalization.format("dxColorView-ariaGreen"), labelClass: COLOR_VIEW_GREEN_LABEL_CLASS }), this._renderEditorWithLabel({ editorType: NumberBox, value: this._currentColor.b, onValueChanged: this._updateColor.bind(this, false), labelText: "B", labelAriaText: messageLocalization.format("dxColorView-ariaBlue"), labelClass: COLOR_VIEW_BLUE_LABEL_CLASS })]; this._$controlsContainer.append(this._rgbInputsWithLabels); this._rgbInputs = [this._rgbInputsWithLabels[0].find(".dx-numberbox").dxNumberBox("instance"), this._rgbInputsWithLabels[1].find(".dx-numberbox").dxNumberBox("instance"), this._rgbInputsWithLabels[2].find(".dx-numberbox").dxNumberBox("instance")] }, _renderEditorWithLabel: function(options) { var $editor = $("<div>"), $label = $("<label>", { "class": options.labelClass, text: options.labelText + ":", append: $editor }).off(clickEvent.name).on(clickEvent.name, function(e) { e.preventDefault() }), editorType = options.editorType, editorOptions = { value: options.value, onValueChanged: options.onValueChanged }; if (editorType === NumberBox) { editorOptions.min = options.min || 0; editorOptions.max = options.max || 255; editorOptions.step = options.step || 1 } var editor = new editorType($editor, editorOptions); editor.registerKeyHandler("enter", function(e) { this._fireEnterKeyPressed(e) }.bind(this)); this.setAria("label", options.labelAriaText, $editor); return $label }, hexInputOptions: function() { return { editorType: TextBox, value: this._currentColor.toHex().replace("#", ""), onValueChanged: this._updateColor.bind(this, true), labelClass: COLOR_VIEW_HEX_LABEL_CLASS, labelText: "#", labelAriaText: messageLocalization.format("dxColorView-ariaHex") } }, _renderHexInput: function() { this._hexInput = TextBox.getInstance(this._renderEditorWithLabel(this.hexInputOptions()).appendTo(this._$controlsContainer).find(".dx-textbox")) }, _renderAlphaChannelScale: function() { var $alphaChannelScaleCell = this._renderHtmlCellInsideRow(1, this._$colorPickerContainer, COLOR_VIEW_ALPHA_CHANNEL_CELL_CLASS), $alphaChannelBorder = $("<div>", { "class": COLOR_VIEW_ALPHA_CHANNEL_BORDER_CLASS, appendTo: $alphaChannelScaleCell }), $alphaChannelScaleWrapper = $("<div>", { "class": COLOR_VIEW_ALPHA_CHANNEL_SCALE_WRAPPER_CLASS, appendTo: $alphaChannelBorder }); this._$alphaChannelScale = $("<div>", { "class": COLOR_VIEW_ALPHA_CHANNEL_SCALE_CLASS, appendTo: $alphaChannelScaleWrapper }); this._makeCSSLinearGradient(this._$alphaChannelScale); this._renderAlphaChannelHandle($alphaChannelScaleCell) }, _makeCSSLinearGradient: function($el) { var color = this._currentColor, colorAsRgb = [color.r, color.g, color.b].join(","), colorAsHex = color.toHex().replace("#", ""); var combineGradientString = function(colorAsRgb, colorAsHex) { var rtlEnabled = this.option("rtlEnabled"), startColor = "rgba(" + colorAsRgb + ", " + (rtlEnabled ? "1" : "0") + ")", finishColor = "rgba(" + colorAsRgb + ", " + (rtlEnabled ? "0" : "1") + ")", startColorIE = "'#" + (rtlEnabled ? "00" : "") + colorAsHex + "'", finishColorIE = "'#" + (rtlEnabled ? "" : "00") + colorAsHex + "'"; return ["background-image: -webkit-linear-gradient(180deg, " + startColor + ", " + finishColor + ")", "background-image: -moz-linear-gradient(-90deg, " + startColor + ", " + finishColor + ")", "background-image: -ms-linear-gradient(-90deg, " + startColor + ", " + finishColor + ")", "background-image: -o-linear-gradient(-90deg, " + startColor + ", " + finishColor + ")", "background-image: linear-gradient(-90deg, " + startColor + ", " + finishColor + ")", "filter: progid:DXImageTransform.Microsoft.gradient(GradientType=1,startColorstr=" + startColorIE + ", endColorstr=" + finishColorIE + ")"].join(";") }; $el.attr("style", combineGradientString.call(this, colorAsRgb, colorAsHex)) }, _renderAlphaChannelInput: function() { var that = this, $alphaChannelInputCell = this._renderHtmlCellInsideRow(1, this._$colorPickerContainer); that._alphaChannelInput = this._renderEditorWithLabel({ editorType: NumberBox, value: this._currentColor.a, max: 1, step: .1, onValueChanged: function(e) { var value = e.value; value = that._currentColor.isValidAlpha(value) ? value : that._currentColor.a; that._updateColorTransparency(value); that._placeAlphaChannelHandle() }, labelClass: COLOR_VIEW_ALPHA_CHANNEL_LABEL_CLASS, labelText: "Alpha", labelAriaText: messageLocalization.format("dxColorView-ariaAlpha") }).appendTo($alphaChannelInputCell).find(".dx-numberbox").dxNumberBox("instance") }, _updateColorTransparency: function(transparency) { this._currentColor.a = transparency; this._makeTransparentBackground(this._$newColor, this._currentColor); this.applyColor() }, _renderAlphaChannelHandle: function($parent) { this._createComponent(this._$alphaChannelHandle = $("<div>", { "class": COLOR_VIEW_ALPHA_CHANNEL_HANDLE_CLASS, appendTo: $parent }), Draggable, { area: $parent, allowMoveByClick: true, direction: "horizontal", onDrag: function() { this._updateByDrag = true; var $alphaChannelHandle = this._$alphaChannelHandle, alphaChannelHandlePosition = translator.locate($alphaChannelHandle).left + this._alphaChannelHandleWidth / 2; this._calculateColorTransparencyByScaleWidth(alphaChannelHandlePosition) }.bind(this) }); this._alphaChannelHandleWidth = this._$alphaChannelHandle.width(); this._alphaChannelScaleWorkWidth = $parent.width() - this._alphaChannelHandleWidth; this._placeAlphaChannelHandle() }, _calculateColorTransparencyByScaleWidth: function(handlePosition) { var transparency = (handlePosition - this._alphaChannelHandleWidth / 2) / this._alphaChannelScaleWorkWidth, rtlEnabled = this.option("rtlEnabled"); transparency = rtlEnabled ? transparency : 1 - transparency; if (handlePosition >= this._alphaChannelScaleWorkWidth + this._alphaChannelHandleWidth / 2) { transparency = rtlEnabled ? 1 : 0 } else { if (transparency < 1) { transparency = transparency.toFixed(2) } } transparency = Math.max(transparency, 0); transparency = Math.min(transparency, 1); this._alphaChannelInput.option("value", transparency) }, _placeAlphaChannelHandle: function() { var left = this._alphaChannelScaleWorkWidth * (1 - this._currentColor.a); if (left < 0) { left = 0 } if (this._alphaChannelScaleWorkWidth < left) { left = this._alphaChannelScaleWorkWidth } translator.move(this._$alphaChannelHandle, { left: this.option("rtlEnabled") ? this._alphaChannelScaleWorkWidth - left : left }) }, applyColor: function() { var colorValue = this.option("editAlphaChannel") ? this._makeRgba(this._currentColor) : this._currentColor.toHex(); this._makeTransparentBackground(this._$currentColor, this._currentColor); this.option("value", colorValue) }, cancelColor: function() { this._initColorAndOpacity(); this._refreshMarkup() }, _updateColor: function(isHex, e) { var rgba, newColor; if (isHex) { newColor = this._validateHex("#" + this._hexInput.option("value")) } else { rgba = this._validateRgb(); if (this._alphaChannelInput) { rgba.push(this._alphaChannelInput.option("value")); newColor = "rgba(" + rgba.join(", ") + ")" } else { newColor = "rgb(" + rgba.join(", ") + ")" } } if (!this._suppressEditorsValueUpdating) { this._currentColor = new Color(newColor); this.applyColor(); this._refreshMarkup() } }, _validateHex: function(hex) { return this._currentColor.isValidHex(hex) ? hex : this._currentColor.toHex() }, _validateRgb: function() { var r = this._rgbInputs[0].option("value"), g = this._rgbInputs[1].option("value"), b = this._rgbInputs[2].option("value"); if (!this._currentColor.isValidRGB(r, g, b)) { r = this._currentColor.r; g = this._currentColor.g; b = this._currentColor.b } return [r, g, b] }, _refreshMarkup: function() { this._placeHueScaleHandle(); this._placePaletteHandle(); this._updateColorParamsAndColorPreview(); this._$palette.css("backgroundColor", this._currentColor.getPureColor().toHex()); if (this._$alphaChannelHandle) { this._updateColorTransparency(this._currentColor.a); this._placeAlphaChannelHandle() } }, _updateColorParamsAndColorPreview: function() { this._suppressEditorsValueUpdating = true; this._hexInput.option("value", this._currentColor.toHex().replace("#", "")); this._rgbInputs[0].option("value", this._currentColor.r); this._rgbInputs[1].option("value", this._currentColor.g); this._rgbInputs[2].option("value", this._currentColor.b); this._suppressEditorsValueUpdating = false; this._makeTransparentBackground(this._$newColor, this._currentColor); if (this.option("editAlphaChannel")) { this._makeCSSLinearGradient.call(this, this._$alphaChannelScale); this._alphaChannelInput.option("value", this._currentColor.a) } }, _optionChanged: function(args) { var value = args.value; switch (args.name) { case "value": this._setCurrentColor(value); if (!this._updateByDrag) { this._refreshMarkup() } this._updateByDrag = false; this.callBase(args); break; case "onEnterKeyPressed": this._initEnterKeyPressedAction(); break; case "editAlphaChannel": if (this._$colorPickerContainer) { this._renderHtmlRows("editAlphaChannel"); this._renderAlphaChannelElements() } break; case "keyStep": break; default: this.callBase(args) } } }); registerComponent("dxColorView", ColorView); module.exports = ColorView }, /*!*****************************!*\ !*** ./js/ui/number_box.js ***! \*****************************/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__( /*! ./number_box/number_box */ 264) }, /*!****************************************!*\ !*** ./js/ui/number_box/number_box.js ***! \****************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), mathUtils = __webpack_require__( /*! ../../core/utils/math */ 87), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, devices = __webpack_require__( /*! ../../core/devices */ 53), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), TextEditor = __webpack_require__( /*! ../text_box/ui.text_editor */ 213), eventUtils = __webpack_require__( /*! ../../events/utils */ 71), pointerEvents = __webpack_require__( /*! ../../events/pointer */ 76), wheelEvent = __webpack_require__( /*! ../../events/core/wheel */ 85), SpinButton = __webpack_require__( /*! ./number_box.spin */ 265), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89); var math = Math; var WIDGET_CLASS = "dx-numberbox", SPIN_CLASS = "dx-numberbox-spin", SPIN_CONTAINER_CLASS = "dx-numberbox-spin-container", SPIN_TOUCH_FRIENDLY_CLASS = "dx-numberbox-spin-touch-friendly"; var FIREFOX_CONTROL_KEYS = ["Tab", "Del", "Delete", "Backspace", "Left", "ArrowLeft", "Right", "ArrowRight", "Home", "End", "Enter"]; var NumberBox = TextEditor.inherit({ _supportedKeys: function() { return extend(this.callBase(), { upArrow: function(e) { e.preventDefault(); e.stopPropagation(); this._spinUpChangeHandler(e) }, downArrow: function(e) { e.preventDefault(); e.stopPropagation(); this._spinDownChangeHandler(e) }, enter: function() {} }) }, _getDefaultOptions: function() { return extend(this.callBase(), { value: 0, min: void 0, max: void 0, step: 1, showSpinButtons: false, useLargeSpinButtons: true, mode: "text", invalidValueMessage: messageLocalization.format("dxNumberBox-invalidValueMessage") }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function() { return devices.real().generic && !devices.isSimulator() }, options: { useLargeSpinButtons: false } }, { device: function() { return "generic" !== devices.real().platform }, options: { mode: "number" } }]) }, _render: function() { this._renderSubmitElement(); this._setSubmitValue(this.option("value")); this.callBase(); this.option("isValid") && this._validateValue(this.option("value")); this.element().addClass(WIDGET_CLASS); this.setAria("role", "spinbutton"); this._renderMouseWheelHandler() }, _renderSubmitElement: function() { this._$submitElement = $("<input>").attr("type", "hidden").appendTo(this.element()) }, _setSubmitValue: function(value) { this._$submitElement.val(commonUtils.applyServerDecimalSeparator(value)) }, _getSubmitElement: function() { return this._$submitElement }, _keyPressHandler: function(e) { this.callBase(e); var ch = String.fromCharCode(e.which), validCharRegExp = /[\d.,eE\-+]/, isInputCharValid = validCharRegExp.test(ch); if (!isInputCharValid) { if (e.metaKey || e.ctrlKey || e.key && inArray(e.key, FIREFOX_CONTROL_KEYS) >= 0) { return } e.preventDefault(); return false } this._keyPressed = true }, _renderMouseWheelHandler: function() { var eventName = eventUtils.addNamespace(wheelEvent.name, this.NAME); var mouseWheelAction = this._createAction(function(e) { this._mouseWheelHandler(e.jQueryEvent) }.bind(this)); this._input().off(eventName).on(eventName, function(e) { mouseWheelAction({ jQueryEvent: e }) }) }, _mouseWheelHandler: function(jQueryEvent) { if (!this._input().is(":focus")) { return } jQueryEvent.delta > 0 ? this._spinValueChange(1, jQueryEvent) : this._spinValueChange(-1, jQueryEvent); jQueryEvent.preventDefault(); jQueryEvent.stopPropagation() }, _renderValue: function() { var inputValue = this._input().val(); if (!inputValue.length || Number(inputValue) !== this.option("value")) { this._forceValueRender(); this._toggleEmptinessEventHandler() } var value = this.option("value"); this._renderInputAddons(); this.setAria("valuenow", value) }, _renderValueEventName: function() { return this.callBase() + " keypress" }, _toggleDisabledState: function(value) { if (this._$spinUp) { SpinButton.getInstance(this._$spinUp).option("disabled", value) } if (this._$spinDown) { SpinButton.getInstance(this._$spinDown).option("disabled", value) } this.callBase.apply(this, arguments) }, _forceValueRender: function() { var value = this.option("value"), number = Number(value), valueFormat = this.option("valueFormat"), formattedValue = isNaN(number) ? "" : valueFormat(value); this._renderDisplayText(formattedValue) }, _renderProps: function() { this.callBase(); this._input().prop({ min: this.option("min"), max: this.option("max"), step: this.option("step") }); this.setAria({ valuemin: this.option("min") || "undefined", valuemax: this.option("max") || "undefined" }) }, _renderInputAddons: function() { this.callBase(); this._renderSpinButtons() }, _renderSpinButtons: function() { var spinButtonsVisible = this.option("showSpinButtons"); this.element().toggleClass(SPIN_CLASS, spinButtonsVisible); this._toggleTouchFriendlyClass(); if (!spinButtonsVisible) { this._$spinContainer && this._$spinContainer.remove(); this._$spinContainer = null; return } if (!this._$spinContainer) { this._$spinContainer = this._createSpinButtons() } this._$spinContainer.prependTo(this._buttonsContainer()) }, _toggleTouchFriendlyClass: function() { this.element().toggleClass(SPIN_TOUCH_FRIENDLY_CLASS, this.option("showSpinButtons") && this.option("useLargeSpinButtons")) }, _createSpinButtons: function() { var eventName = eventUtils.addNamespace(pointerEvents.down, this.NAME); var pointerDownAction = this._createAction(this._spinButtonsPointerDownHandler.bind(this)); var $spinContainer = $("<div>").addClass(SPIN_CONTAINER_CLASS).off(eventName).on(eventName, function(e) { pointerDownAction({ jQueryEvent: e }) }); this._$spinUp = $("<div>").appendTo($spinContainer); this._createComponent(this._$spinUp, SpinButton, { direction: "up", onChange: this._spinUpChangeHandler.bind(this) }); this._$spinDown = $("<div>").appendTo($spinContainer); this._createComponent(this._$spinDown, SpinButton, { direction: "down", onChange: this._spinDownChangeHandler.bind(this) }); return $spinContainer }, _spinButtonsPointerDownHandler: function() { var $input = this._input(); if (!this.option("useLargeSpinButtons") && document.activeElement !== $input[0]) { $input.trigger("focus") } }, _spinUpChangeHandler: function(e) { if (!this.option("readOnly")) { this._spinValueChange(1, e.jQueryEvent || e) } }, _spinDownChangeHandler: function(e) { if (!this.option("readOnly")) { this._spinValueChange(-1, e.jQueryEvent || e) } }, _spinValueChange: function(sign, jQueryEvent) { var value = parseFloat(this._normalizeInputValue()) || 0, step = parseFloat(this.option("step")); value = this._correctRounding(value, step * sign); var min = this.option("min"), max = this.option("max"); if (void 0 !== min) { value = Math.max(min, value) } if (void 0 !== max) { value = Math.min(max, value) } this._saveValueChangeEvent(jQueryEvent); this.option("value", value) }, _correctRounding: function(value, step) { var regex = /[,.](.*)/; var isFloatValue = regex.test(value), isFloatStep = regex.test(step); if (isFloatValue || isFloatStep) { var valueAccuracy = isFloatValue ? regex.exec(value)[0].length : 0, stepAccuracy = isFloatStep ? regex.exec(step)[0].length : 0, accuracy = math.max(valueAccuracy, stepAccuracy); value = this._round(value + step, accuracy); return value } return value + step }, _round: function(value, precision) { precision = precision || 0; var multiplier = Math.pow(10, precision); value *= multiplier; value = Math.round(value) / multiplier; return value }, _renderValueChangeEvent: function() { this.callBase(); this._input().focusout(this._forceRefreshInputValue.bind(this)) }, _forceRefreshInputValue: function() { if ("number" === this.option("mode")) { return } var $input = this._input(), valueFormat = this.option("valueFormat"); $input.val(null); $input.val(valueFormat(this.option("value"))) }, _valueChangeEventHandler: function(e) { var $input = this._input(), inputValue = this._normalizeText(), valueFormat = this.option("valueFormat"), value = this._parseValue(inputValue), valueHasDigits = "." !== inputValue && "-" !== inputValue, isValueIncomplete = this._isValueIncomplete(inputValue), isValueCorrect = this._isValueInRange(inputValue); if (this._isValueValid() && !this._validateValue(value)) { $input.val(valueFormat(value)); return } if (valueHasDigits) { this.callBase(e, isNaN(value) ? null : value) } if (!isValueIncomplete && !isValueCorrect && null !== value) { if (Number(inputValue) !== value) { $input.val(valueFormat(value)) } } this.validationRequest.fire({ value: value, editor: this }) }, _replaceCommaWithPoint: function(value) { return value.replace(",", ".") }, _inputIsInvalid: function() { var isNumberMode = "number" === this.option("mode"); var validityState = this._input().get(0).validity; return isNumberMode && validityState && validityState.badInput }, _renderDisplayText: function(text) { if (this._inputIsInvalid()) { return } this.callBase(text) }, _isValueIncomplete: function(value) { var incompleteRegex = /(^-$)|(^-?\d*\.$)|(\d+e-?$)/i; return incompleteRegex.test(value) }, _isValueInRange: function(value) { return mathUtils.inRange(value, this.option("min"), this.option("max")) }, _isNumber: function(value) { return null !== this._parseValue(value) }, _validateValue: function(value) { var inputValue = this._normalizeText(), isValueValid = this._isValueValid(), isValid = true, isNumber = this._isNumber(inputValue); if (isNaN(Number(value))) { isValid = false } if (!value && isValueValid) { isValid = true } else { if (!isNumber && !isValueValid) { isValid = false } } this.option({ isValid: isValid, validationError: isValid ? null : { editorSpecific: true, message: this.option("invalidValueMessage") } }); return isValid }, _normalizeInputValue: function() { return this._normalizeValue() }, _normalizeValue: function(value) { return this._parseValue(this._normalizeText(value)) }, _normalizeText: function(value) { value = $.trim(commonUtils.isDefined(value) ? value : this._input().val()); return this._replaceCommaWithPoint(value) }, _parseValue: function(value) { var number = parseFloat(value); if (isNaN(number)) { return null } return mathUtils.fitIntoRange(number, this.option("min"), this.option("max")) }, _clean: function() { delete this._$spinContainer; delete this._$spinUp; delete this._$spinDown; this.callBase() }, _optionChanged: function(args) { switch (args.name) { case "value": this._validateValue(args.value); this._setSubmitValue(args.value); this.callBase(args); this._resumeValueChangeAction(); break; case "step": case "min": case "max": this._renderProps(); break; case "showSpinButtons": this._renderInputAddons(); break; case "useLargeSpinButtons": this._toggleTouchFriendlyClass(); break; case "invalidValueMessage": break; default: this.callBase(args) } } }); registerComponent("dxNumberBox", NumberBox); module.exports = NumberBox }, /*!*********************************************!*\ !*** ./js/ui/number_box/number_box.spin.js ***! \*********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Widget = __webpack_require__( /*! ../widget/ui.widget */ 95), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, eventUtils = __webpack_require__( /*! ../../events/utils */ 71), pointerEvents = __webpack_require__( /*! ../../events/pointer */ 76), feedbackEvents = __webpack_require__( /*! ../../events/core/emitter.feedback */ 104), holdEvent = __webpack_require__( /*! ../../events/hold */ 164); var SPIN_CLASS = "dx-numberbox-spin", SPIN_BUTTON_CLASS = "dx-numberbox-spin-button", SPIN_HOLD_DELAY = 100, NUMBER_BOX = "dxNumberBox", POINTERUP_EVENT_NAME = eventUtils.addNamespace(pointerEvents.up, NUMBER_BOX), POINTERCANCEL_EVENT_NAME = eventUtils.addNamespace(pointerEvents.cancel, NUMBER_BOX); var SpinButton = Widget.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { direction: "up", onChange: null, activeStateEnabled: true, hoverStateEnabled: true }) }, _render: function() { this.callBase(); var $element = this.element(), direction = SPIN_CLASS + "-" + this.option("direction"); var eventName = eventUtils.addNamespace(pointerEvents.down, this.NAME); $element.addClass(SPIN_BUTTON_CLASS).addClass(direction).off(eventName).on(eventName, this._spinDownHandler.bind(this)); this._spinIcon = $("<div>").addClass(direction + "-icon").appendTo(this.element()); this._spinChangeHandler = this._createActionByOption("onChange") }, _spinDownHandler: function(e) { e.preventDefault(); this._clearTimer(); this.element().on(holdEvent.name, function() { this._feedBackDeferred = $.Deferred(); feedbackEvents.lock(this._feedBackDeferred); this._spinChangeHandler({ jQueryEvent: e }); this._holdTimer = setInterval(this._spinChangeHandler, SPIN_HOLD_DELAY, { jQueryEvent: e }) }.bind(this)); $(document).on(POINTERUP_EVENT_NAME, this._clearTimer.bind(this)).on(POINTERCANCEL_EVENT_NAME, this._clearTimer.bind(this)); this._spinChangeHandler({ jQueryEvent: e }) }, _dispose: function() { this._clearTimer(); this.callBase() }, _clearTimer: function() { this.element().off(holdEvent.name); $(document).off(POINTERUP_EVENT_NAME).off(POINTERCANCEL_EVENT_NAME); if (this._feedBackDeferred) { this._feedBackDeferred.resolve() } if (this._holdTimer) { clearInterval(this._holdTimer) } }, _optionChanged: function(args) { switch (args.name) { case "onChange": case "direction": this._invalidate(); break; default: this.callBase(args) } } }); module.exports = SpinButton }, /*!****************************!*\ !*** ./js/ui/draggable.js ***! \****************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), stringUtils = __webpack_require__( /*! ../core/utils/string */ 18), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), translator = __webpack_require__( /*! ../animation/translator */ 69), dasherize = __webpack_require__( /*! ../core/utils/inflector */ 39).dasherize, extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, DOMComponent = __webpack_require__( /*! ../core/dom_component */ 43), eventUtils = __webpack_require__( /*! ../events/utils */ 71), pointerEvents = __webpack_require__( /*! ../events/pointer */ 76), dragEvents = __webpack_require__( /*! ../events/drag */ 110), positionUtils = __webpack_require__( /*! ../animation/position */ 70), isFunction = commonUtils.isFunction, noop = commonUtils.noop; var DRAGGABLE = "dxDraggable", DRAGSTART_EVENT_NAME = eventUtils.addNamespace(dragEvents.start, DRAGGABLE), DRAG_EVENT_NAME = eventUtils.addNamespace(dragEvents.move, DRAGGABLE), DRAGEND_EVENT_NAME = eventUtils.addNamespace(dragEvents.end, DRAGGABLE), POINTERDOWN_EVENT_NAME = eventUtils.addNamespace(pointerEvents.down, DRAGGABLE), DRAGGABLE_CLASS = dasherize(DRAGGABLE), DRAGGABLE_DRAGGING_CLASS = DRAGGABLE_CLASS + "-dragging"; var Draggable = DOMComponent.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { onDragStart: noop, onDrag: noop, onDragEnd: noop, immediate: true, direction: "both", area: window, boundOffset: 0, allowMoveByClick: false }) }, _init: function() { this.callBase(); this._attachEventHandlers() }, _attachEventHandlers: function() { if (this.option("disabled")) { return } var $element = this.element().css("position", "absolute"), eventHandlers = {}, allowMoveByClick = this.option("allowMoveByClick"); eventHandlers[DRAGSTART_EVENT_NAME] = this._dragStartHandler.bind(this); eventHandlers[DRAG_EVENT_NAME] = this._dragHandler.bind(this); eventHandlers[DRAGEND_EVENT_NAME] = this._dragEndHandler.bind(this); if (allowMoveByClick) { eventHandlers[POINTERDOWN_EVENT_NAME] = this._pointerDownHandler.bind(this); $element = this._getArea() } $element.on(eventHandlers, { direction: this.option("direction"), immediate: this.option("immediate") }) }, _detachEventHandlers: function() { this.element().off("." + DRAGGABLE); this._getArea().off("." + DRAGGABLE) }, _move: function(position) { translator.move(this.element(), position) }, _pointerDownHandler: function(e) { if (eventUtils.needSkipEvent(e)) { return } var areaOffset = this._getAreaOffset($(e.currentTarget)), direction = this.option("direction"), position = {}; if ("horizontal" === direction || "both" === direction) { position.left = e.pageX - this.element().width() / 2 - areaOffset.left } if ("vertical" === direction || "both" === direction) { position.top = e.pageY - this.element().height() / 2 - areaOffset.top } this._move(position); this._getAction("onDrag")({ jQueryEvent: e }) }, _dragStartHandler: function(e) { var $element = this.element(); if ($element.is(".dx-state-disabled, .dx-state-disabled *")) { e.cancel = true; return } var $area = this._getArea(), areaOffset = this._getAreaOffset($area), boundOffset = this._getBoundOffset(), areaWidth = $area.outerWidth(), areaHeight = $area.outerHeight(), elementWidth = $element.width(), elementHeight = $element.height(); this._toggleDraggingClass(true); var startOffset = { left: $element.offset().left - areaOffset.left, top: $element.offset().top - areaOffset.top }; this._startPosition = translator.locate($element); e.maxLeftOffset = startOffset.left - boundOffset.left; e.maxRightOffset = areaWidth - startOffset.left - elementWidth - boundOffset.right; e.maxTopOffset = startOffset.top - boundOffset.top; e.maxBottomOffset = areaHeight - startOffset.top - elementHeight - boundOffset.bottom; this._getAction("onDragStart")({ jQueryEvent: e }) }, _getAreaOffset: function($area) { var offset = $area && positionUtils.offset($area); return offset ? offset : { left: 0, top: 0 } }, _toggleDraggingClass: function(value) { this.element().toggleClass(DRAGGABLE_DRAGGING_CLASS, value) }, _getBoundOffset: function() { var boundOffset = this.option("boundOffset"); if (isFunction(boundOffset)) { boundOffset = boundOffset.call(this) } return stringUtils.quadToObject(boundOffset) }, _getArea: function() { var area = this.option("area"); if (isFunction(area)) { area = area.call(this) } return $(area) }, _dragHandler: function(e) { var offset = e.offset, startPosition = this._startPosition; this._move({ left: startPosition.left + offset.x, top: startPosition.top + offset.y }); this._getAction("onDrag")({ jQueryEvent: e }) }, _dragEndHandler: function(e) { this._toggleDraggingClass(false); this._getAction("onDragEnd")({ jQueryEvent: e }) }, _getAction: function(name) { return this["_" + name + "Action"] || this._createActionByOption(name) }, _render: function() { this.callBase(); this.element().addClass(DRAGGABLE_CLASS) }, _optionChanged: function(args) { var name = args.name; switch (name) { case "onDragStart": case "onDrag": case "onDragEnd": this["_" + name + "Action"] = this._createActionByOption(name); break; case "allowMoveByClick": case "direction": case "disabled": this._detachEventHandlers(); this._attachEventHandlers(); break; case "boundOffset": case "area": break; default: this.callBase(args) } }, _dispose: function() { this.callBase(); this._detachEventHandlers() } }); registerComponent(DRAGGABLE, Draggable); module.exports = Draggable }, /*!***************************!*\ !*** ./js/ui/date_box.js ***! \***************************/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__( /*! ./date_box/ui.date_box */ 268) }, /*!***************************************!*\ !*** ./js/ui/date_box/ui.date_box.js ***! \***************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), compareVersions = __webpack_require__( /*! ../../core/utils/version */ 17).compare, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, support = __webpack_require__( /*! ../../core/utils/support */ 61), devices = __webpack_require__( /*! ../../core/devices */ 53), config = __webpack_require__( /*! ../../core/config */ 15), dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63), uiDateUtils = __webpack_require__( /*! ./ui.date_utils */ 269), dateSerialization = __webpack_require__( /*! ../../core/utils/date_serialization */ 259), DropDownEditor = __webpack_require__( /*! ../drop_down_editor/ui.drop_down_editor */ 210), dateLocalization = __webpack_require__( /*! ../../localization/date */ 33), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), DATEBOX_CLASS = "dx-datebox", DX_AUTO_WIDTH_CLASS = "dx-auto-width", DATEBOX_WRAPPER_CLASS = "dx-datebox-wrapper"; var PICKER_TYPE = { calendar: "calendar", rollers: "rollers", list: "list", "native": "native" }; var TYPE = { date: "date", datetime: "datetime", time: "time" }; var STRATEGY_NAME = { calendar: "Calendar", dateView: "DateView", "native": "Native", calendarWithTime: "CalendarWithTime", list: "List" }; var STRATEGY_CLASSES = { Calendar: __webpack_require__( /*! ./ui.date_box.strategy.calendar */ 270), DateView: __webpack_require__( /*! ./ui.date_box.strategy.date_view */ 272), Native: __webpack_require__( /*! ./ui.date_box.strategy.native */ 275), CalendarWithTime: __webpack_require__( /*! ./ui.date_box.strategy.calendar_with_time */ 276), List: __webpack_require__( /*! ./ui.date_box.strategy.list */ 278) }; var isRealWidthSet = function($element) { var explicitWidth = $element[0].style.width; if (explicitWidth && "auto" !== explicitWidth && "inherit" !== explicitWidth) { return true } return false }; var calculateWidth = function(value, $input, $element) { var IE_ROUNDING_ERROR = 10; var NATIVE_BUTTONS_WIDTH = 48; var $longestValueElement = $("<div>").text(value).css({ "font-style": $input.css("font-style"), "font-variant": $input.css("font-variant"), "font-weight": $input.css("font-weight"), "font-size": $input.css("font-size"), "font-family": $input.css("font-family"), "letter-spacing": $input.css("letter-spacing"), "padding-left": $input.css("padding-left"), "padding-right": $input.css("padding-right"), border: $input.css("border"), visibility: "hidden", "white-space": "nowrap", position: "absolute", "float": "left" }); $longestValueElement.appendTo($element); var width = $longestValueElement.outerWidth() + IE_ROUNDING_ERROR + ("text" !== $input.prop("type") ? NATIVE_BUTTONS_WIDTH : 0); $longestValueElement.remove(); return width }; var DateBox = DropDownEditor.inherit({ _supportedKeys: function() { return extend(this.callBase(), this._strategy.supportedKeys()) }, _setDeprecatedOptions: function() { this.callBase(); extend(this._deprecatedOptions, { format: { since: "16.1", alias: "type" }, formatString: { since: "16.1", alias: "displayFormat" }, useNative: { since: "15.1", message: "'useNative' option is deprecated in 15.1. Use the 'pickerType' option instead" }, useCalendar: { since: "15.1", message: "'useCalendar' option is deprecated in 15.1. Use the 'pickerType' option instead" } }) }, _getDefaultOptions: function() { return extend(this.callBase(), { type: "date", value: null, dateSerializationFormat: void 0, min: void 0, max: void 0, useCalendar: false, displayFormat: null, interval: 30, maxZoomLevel: "month", minZoomLevel: "century", useNative: true, pickerType: PICKER_TYPE.native, invalidDateMessage: messageLocalization.format("dxDateBox-validation-datetime"), dateOutOfRangeMessage: messageLocalization.format("validation-range"), applyButtonText: messageLocalization.format("Done"), adaptivityEnabled: false, onContentReady: null }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: { platform: "ios" }, options: { showPopupTitle: true } }, { device: function(device) { return "android" === device.platform }, options: { buttonsLocation: "bottom after" } }, { device: function(device) { return "win" === device.platform && device.version && 8 === device.version[0] }, options: { buttonsLocation: "bottom after" } }, { device: function(device) { return "win" === device.platform && device.version && 10 === device.version[0] }, options: { buttonsLocation: "bottom center" } }, { device: function() { var realDevice = devices.real(), platform = realDevice.platform, version = realDevice.version; return "generic" === platform || "win" === platform || "android" === platform && compareVersions(version, [4, 4]) < 0 }, options: { pickerType: PICKER_TYPE.rollers } }, { device: { platform: "generic", deviceType: "desktop" }, options: { pickerType: PICKER_TYPE.calendar, buttonsLocation: "bottom after" } }, { device: function() { var realDevice = devices.real(), platform = realDevice.platform, isPhone = realDevice.phone; return "win" === platform && !isPhone }, options: { pickerType: PICKER_TYPE.calendar } }]) }, _initOptions: function(options) { this._userOptions = extend({}, options); this.callBase(options); this._updatePickerOptions(this._userOptions) }, _updatePickerOptions: function(userOptions) { var pickerType = this._getPickerTypeByDeprecatedOptions(userOptions); var type = this.option("type"); if (pickerType === PICKER_TYPE.list && (type === TYPE.datetime || type === TYPE.date)) { pickerType = PICKER_TYPE.calendar } if (type === TYPE.time && pickerType === PICKER_TYPE.calendar) { pickerType = PICKER_TYPE.list } this.option("showDropDownButton", "generic" !== devices.real().platform || pickerType !== PICKER_TYPE.native); this._pickerType = pickerType }, _getPickerTypeByDeprecatedOptions: function(userOptions) { return userOptions.pickerType ? userOptions.pickerType : commonUtils.isDefined(userOptions.useCalendar) || commonUtils.isDefined(userOptions.useNative) ? this._getPickerType() : this._pickerType || this.option("pickerType") }, _getPickerType: function() { if (this.option().useCalendar) { return this.option("type") === TYPE.time ? PICKER_TYPE.list : PICKER_TYPE.calendar } if (this.option().useNative) { return PICKER_TYPE.native } return PICKER_TYPE.rollers }, _init: function() { this._initStrategy(); this.option(extend({}, this._strategy.getDefaultOptions(), this._userOptions)); delete this._userOptions; this.callBase() }, _toLowerCaseFirstLetter: function(string) { return string.charAt(0).toLowerCase() + string.substr(1) }, _initStrategy: function() { var strategyName = this._getStrategyName(this._getFormatType()), strategy = STRATEGY_CLASSES[strategyName]; if (!(this._strategy && this._strategy.NAME === strategyName)) { this._strategy = new strategy(this) } }, _getFormatType: function() { var currentType = this.option("type"); var isTime = /h|m|s/g.test(currentType), isDate = /d|M|Y/g.test(currentType); var type = ""; if (isDate) { type += TYPE.date } if (isTime) { type += TYPE.time } return type }, _getStrategyName: function(type) { var pickerType = this._pickerType; if (pickerType === PICKER_TYPE.rollers) { return this.option().useCalendar ? STRATEGY_NAME.calendar : STRATEGY_NAME.dateView } if (pickerType === PICKER_TYPE.native) { return STRATEGY_NAME.native } if (type === TYPE.date) { return STRATEGY_NAME.calendar } if (type === TYPE.datetime) { return STRATEGY_NAME.calendarWithTime } return STRATEGY_NAME.list }, _render: function() { this.element().addClass(DATEBOX_CLASS); this._refreshFormatClass(); this._refreshPickerTypeClass(); this._renderSubmitElement(); this.callBase(); this._updateSize(); this._strategy.renderInputMinMax(this._input()) }, _renderDimensions: function() { this.callBase(); this.element().toggleClass(DX_AUTO_WIDTH_CLASS, !this.option("width")) }, _refreshFormatClass: function() { var $element = this.element(); $.each(TYPE, function(_, item) { $element.removeClass(DATEBOX_CLASS + "-" + item) }); $element.addClass(DATEBOX_CLASS + "-" + this.option("type")) }, _refreshPickerTypeClass: function() { var $element = this.element(); $.each(PICKER_TYPE, function(_, item) { $element.removeClass(DATEBOX_CLASS + "-" + item) }); $element.addClass(DATEBOX_CLASS + "-" + this._pickerType) }, _renderSubmitElement: function() { this._$submitElement = $("<input>").attr("type", "hidden").appendTo(this.element()) }, _getSubmitElement: function() { return this._$submitElement }, _updateSize: function() { var $element = this.element(), widthOption = this.option("width"), isWidthSet = commonUtils.isDefined(widthOption) || isRealWidthSet($element) && !this._isSizeUpdatable, isElementVisible = $element.is(":visible"), pickerType = this._pickerType, shouldCalculateWidth = pickerType !== PICKER_TYPE.rollers && "generic" === devices.current().platform; if (isWidthSet || !(shouldCalculateWidth && isElementVisible)) { return } var $input = this._input(), format = this._strategy.getDisplayFormat(this.option("displayFormat")), longestValue = dateLocalization.format(uiDateUtils.getLongestDate(format, dateLocalization.getMonthNames(), dateLocalization.getDayNames()), format); $element.width(calculateWidth(longestValue, $input, this.element())); this._isSizeUpdatable = true }, _attachChildKeyboardEvents: function() { this._strategy.attachKeyboardEvents(this._keyboardProcessor) }, _renderPopup: function() { this.callBase(); this._popup._wrapper().addClass(DATEBOX_WRAPPER_CLASS); this._renderPopupWrapper() }, _popupConfig: function() { var popupConfig = this.callBase(); return extend(this._strategy.popupConfig(popupConfig), { title: this._getPopupTitle(), dragEnabled: false }) }, _renderPopupWrapper: function() { if (!this._popup) { return } var $element = this.element(); var classPostfixes = extend({}, TYPE, PICKER_TYPE); $.each(classPostfixes, function(_, item) { $element.removeClass(DATEBOX_WRAPPER_CLASS + "-" + item) }.bind(this)); this._popup._wrapper().addClass(DATEBOX_WRAPPER_CLASS + "-" + this.option("type")).addClass(DATEBOX_WRAPPER_CLASS + "-" + this._pickerType) }, _renderPopupContent: function() { this.callBase(); this._strategy.renderPopupContent() }, _getFirstPopupElement: function() { return this._strategy.getFirstPopupElement() || this.callBase() }, _getLastPopupElement: function() { return this._strategy.getLastPopupElement() || this.callBase() }, _popupShowingHandler: function() { this.callBase(); this._strategy.popupShowingHandler() }, _popupHiddenHandler: function() { this.callBase(); this._strategy.popupHiddenHandler() }, _visibilityChanged: function(visible) { if (visible) { this._updateSize() } }, _readOnlyPropValue: function() { return this.callBase() || this._pickerType === PICKER_TYPE.rollers }, _clearButtonVisibility: function() { return this.callBase() && !this._isNativeType() }, _renderValue: function() { var value = this.dateOption("value"); this.option("text", this._getDisplayedText(value)); var submitFormat = uiDateUtils.SUBMIT_FORMATS_MAP[this.option("type")]; this._$submitElement.val(uiDateUtils.toStandardDateFormat(value, submitFormat)); this._strategy.renderValue(); this.callBase() }, _getDisplayedText: function(value) { var displayedText, mode = this.option("mode"); if ("text" === mode) { var displayFormat = this._strategy.getDisplayFormat(this.option("displayFormat")); displayedText = dateLocalization.format(value, displayFormat) } else { var format = this._getFormatByMode(mode); if (format) { displayedText = dateLocalization.format(value, format) } else { displayedText = uiDateUtils.toStandardDateFormat(value, mode) } } return displayedText }, _getFormatByMode: function(mode) { return support.inputType(mode) ? null : uiDateUtils.FORMATS_MAP[mode] }, _valueChangeEventHandler: function(e) { var text = this.option("text"); var date = this._getParsedDate(text), value = this.dateOption("value"), type = this.option("type"), newValue = uiDateUtils.mergeDates(value, date, type); if (this._validateValue(date)) { var displayedText = this._getDisplayedText(newValue); if (value && newValue && value.getTime() === newValue.getTime() && displayedText !== text) { this._renderValue() } else { this.dateValue(newValue, e) } } this.validationRequest.fire({ value: newValue, editor: this }) }, _getParsedDate: function(text) { var displayFormat = this._strategy.getDisplayFormat(this.option("displayFormat")); var parsedText = this._strategy.getParsedText(text, displayFormat); return commonUtils.isDefined(parsedText) ? parsedText : void 0 }, _validateValue: function(value) { var text = this.option("text"), hasText = !!text && null !== value, isDate = !!value && commonUtils.isDate(value) && !isNaN(value.getTime()), isDateInRange = isDate && dateUtils.dateInRange(value, this.dateOption("min"), this.dateOption("max"), this.option("type")), isValid = !hasText || !hasText && !value || isDateInRange, validationMessage = ""; if (!isDate) { validationMessage = this.option("invalidDateMessage") } else { if (!isDateInRange) { validationMessage = this.option("dateOutOfRangeMessage") } } this.option({ isValid: isValid, validationError: isValid ? null : { editorSpecific: true, message: validationMessage } }); return isValid }, _isValueChanged: function(newValue) { var oldValue = this.dateOption("value"), oldTime = oldValue && oldValue.getTime(), newTime = newValue && newValue.getTime(); return oldTime !== newTime }, _renderProps: function() { this.callBase(); this._input().attr("autocomplete", "off") }, _renderOpenedState: function() { if (!this._isNativeType()) { this.callBase() } if (this._strategy.isAdaptivityChanged()) { this._refreshStrategy() } this._strategy.renderOpenedState() }, _getPopupTitle: function() { var placeholder = this.option("placeholder"); if (placeholder) { return placeholder } var type = this.option("type"); if (type === TYPE.time) { return messageLocalization.format("dxDateBox-simulatedDataPickerTitleTime") } if (type === TYPE.date || type === TYPE.datetime) { return messageLocalization.format("dxDateBox-simulatedDataPickerTitleDate") } return "" }, _renderPlaceholder: function() { this._popup && this._popup.option("title", this._getPopupTitle()); this.callBase() }, _refreshStrategy: function() { this._strategy.dispose(); this._initStrategy(); this.option(this._strategy.getDefaultOptions()); this._refresh() }, _applyButtonHandler: function() { this.dateValue(this._strategy.getValue()); this.callBase() }, _dispose: function() { this._strategy && this._strategy.dispose(); this.callBase() }, _isNativeType: function() { return this._pickerType === PICKER_TYPE.native }, _optionChanged: function(args) { switch (args.name) { case "useCalendar": this._updatePickerOptions({ useCalendar: args.value }); this._refreshStrategy(); break; case "useNative": this._updatePickerOptions({ useNative: args.value }); this._refreshStrategy(); break; case "showClearButton": this.callBase.apply(this, arguments); this._updateSize(); break; case "pickerType": this._updatePickerOptions({ pickerType: args.value }); this._refreshStrategy(); this._refreshPickerTypeClass(); this._invalidate(); break; case "type": this._updatePickerOptions({ format: args.value }); this._refreshStrategy(); this._refreshFormatClass(); this._renderPopupWrapper(); this._updateSize(); break; case "placeholder": this._renderPlaceholder(); break; case "dateSerializationFormat": case "readOnly": case "min": case "max": case "interval": case "minZoomLevel": case "maxZoomLevel": this._invalidate(); break; case "displayFormat": this._updateValue(); break; case "formatWidthCalculator": break; case "closeOnValueChange": var applyValueMode = args.value ? "instantly" : "useButtons"; this.option("applyValueMode", applyValueMode); break; case "applyValueMode": this._suppressDeprecatedWarnings(); this.option("closeOnValueChange", "instantly" === args.value); this._resumeDeprecatedWarnings(); this.callBase.apply(this, arguments); break; case "text": this._strategy.textChangedHandler(args.value); this.callBase.apply(this, arguments); break; case "isValid": this.callBase.apply(this, arguments); this._updateSize(); break; case "value": this._validateValue(dateSerialization.deserializeDate(this.option("value"))); this.callBase.apply(this, arguments); break; case "showDropDownButton": case "invalidDateMessage": case "dateOutOfRangeMessage": case "adaptivityEnabled": break; default: this.callBase.apply(this, arguments) } }, _getSerializationFormat: function() { var value = this.option("value"); if (this.option("dateSerializationFormat") && config().forceIsoDateParsing) { return this.option("dateSerializationFormat") } if (commonUtils.isNumeric(value)) { return "number" } if (!commonUtils.isString(value)) { return } return dateSerialization.getDateSerializationFormat(value) }, dateValue: function() { var jQueryEvent = arguments[1], value = arguments[0]; if (this._isValueChanged(value) && jQueryEvent) { this._saveValueChangeEvent(jQueryEvent) } return this.dateOption("value", value) }, dateOption: function(optionName, value) { if (1 === arguments.length) { return dateSerialization.deserializeDate(this.option(optionName)) } var serializationFormat = this._getSerializationFormat(); this.option(optionName, dateSerialization.serializeDate(value, serializationFormat)) }, reset: function() { this.callBase(); this._updateValue() } }); registerComponent("dxDateBox", DateBox); module.exports = DateBox }, /*!*****************************************!*\ !*** ./js/ui/date_box/ui.date_utils.js ***! \*****************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), dateSerialization = __webpack_require__( /*! ../../core/utils/date_serialization */ 259), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), dateLocalization = __webpack_require__( /*! ../../localization/date */ 33); var dateComponents = function() { return ["year", "day", "month", "day"] }; var ONE_MINUTE = 6e4; var ONE_DAY = 60 * ONE_MINUTE * 24; var ONE_YEAR = 365 * ONE_DAY; var getStringFormat = function(format) { var formatType = typeof format; if ("string" === formatType) { return "format" } if ("object" === formatType && void 0 !== format.type) { return format.type } return null }; var dateUtils = { SUPPORTED_FORMATS: ["date", "time", "datetime"], DEFAULT_FORMATTER: function(value) { return value }, DATE_COMPONENT_TEXT_FORMATTER: function(value, name) { var $container = $("<div>").addClass("dx-dateview-formatter-container"); $("<span>").text(value).addClass("dx-dateview-value-formatter").appendTo($container); $("<span>").text(name).addClass("dx-dateview-name-formatter").appendTo($container); return $container }, ONE_MINUTE: ONE_MINUTE, ONE_DAY: ONE_DAY, ONE_YEAR: ONE_YEAR, MIN_DATEVIEW_DEFAULT_DATE: new Date(1900, 0, 1), MAX_DATEVIEW_DEFAULT_DATE: function() { var newDate = new Date; return new Date(newDate.getFullYear() + 50, newDate.getMonth(), newDate.getDate(), 23, 59, 59) }(), FORMATS_INFO: { date: { getStandardPattern: function() { return "yyyy-MM-dd" }, components: dateComponents() }, time: { getStandardPattern: function() { return "HH:mm" }, components: ["hours", "minutes"] }, datetime: { getStandardPattern: function() { var standardPattern; ! function() { var androidFormatPattern = "yyyy-MM-ddTHH:mmZ", testDateString = "2000-01-01T01:01Z"; var $input = $("<input>").attr("type", "datetime"); $input.val(testDateString); if ($input.val()) { standardPattern = androidFormatPattern } }(); if (!standardPattern) { standardPattern = "yyyy-MM-ddTHH:mm:ssZ" } dateUtils.FORMATS_INFO.datetime.getStandardPattern = function() { return standardPattern }; return standardPattern }, components: dateComponents().concat(["hours", "minutes", "seconds", "milliseconds"]) }, "datetime-local": { getStandardPattern: function() { return "yyyy-MM-ddTHH:mm:ss" }, components: dateComponents().concat(["hours", "minutes", "seconds"]) } }, FORMATS_MAP: { date: "shortdate", time: "shorttime", datetime: "shortdateshorttime" }, SUBMIT_FORMATS_MAP: { date: "date", time: "time", datetime: "datetime-local" }, toStandardDateFormat: function(date, type) { var pattern = dateUtils.FORMATS_INFO[type].getStandardPattern(); return dateSerialization.serializeDate(date, pattern) }, fromStandardDateFormat: function(text) { var date = dateSerialization.dateParser(text); return commonUtils.isDate(date) ? date : void 0 }, getMaxMonthDay: function(year, month) { return new Date(year, month + 1, 0).getDate() }, mergeDates: function(oldValue, newValue, format) { if (!newValue) { return newValue || null } if (!oldValue || isNaN(oldValue.getTime())) { var now = new Date(null); oldValue = new Date(now.getFullYear(), now.getMonth(), now.getDate()) } var result = new Date(oldValue.valueOf()); var formatInfo = dateUtils.FORMATS_INFO[format]; $.each(formatInfo.components, function() { var componentInfo = dateUtils.DATE_COMPONENTS_INFO[this]; result[componentInfo.setter](newValue[componentInfo.getter]()) }); return result }, getLongestCaptionIndex: function(captionArray) { var i, longestIndex = 0, longestCaptionLength = 0; for (i = 0; i < captionArray.length; ++i) { if (captionArray[i].length > longestCaptionLength) { longestIndex = i; longestCaptionLength = captionArray[i].length } } return longestIndex }, formatUsesMonthName: function(format) { return dateLocalization.formatUsesMonthName(format) }, formatUsesDayName: function(format) { return dateLocalization.formatUsesDayName(format) }, getLongestDate: function(format, monthNames, dayNames) { var stringFormat = getStringFormat(format), month = 9; if (!stringFormat || dateUtils.formatUsesMonthName(stringFormat)) { month = dateUtils.getLongestCaptionIndex(monthNames) } var longestDate = new Date(1888, month, 21, 23, 59, 59, 999); if (!stringFormat || dateUtils.formatUsesDayName(stringFormat)) { var date = longestDate.getDate() - longestDate.getDay() + dateUtils.getLongestCaptionIndex(dayNames); longestDate.setDate(date) } return longestDate } }; dateUtils.DATE_COMPONENTS_INFO = { year: { getter: "getFullYear", setter: "setFullYear", formatter: dateUtils.DEFAULT_FORMATTER, startValue: void 0, endValue: void 0 }, day: { getter: "getDate", setter: "setDate", formatter: function(value, showNames, date) { if (!showNames) { return value } var formatDate = new Date(date.getTime()); formatDate.setDate(value); return dateUtils.DATE_COMPONENT_TEXT_FORMATTER(value, dateLocalization.getDayNames()[formatDate.getDay()]) }, startValue: 1, endValue: void 0 }, month: { getter: "getMonth", setter: "setMonth", formatter: function(value, showNames) { var monthName = dateLocalization.getMonthNames()[value]; return showNames ? dateUtils.DATE_COMPONENT_TEXT_FORMATTER(value + 1, monthName) : monthName }, startValue: 0, endValue: 11 }, hours: { getter: "getHours", setter: "setHours", formatter: function(value) { return dateLocalization.format(new Date(0, 0, 0, value), "hour") }, startValue: 0, endValue: 23 }, minutes: { getter: "getMinutes", setter: "setMinutes", formatter: function(value) { return dateLocalization.format(new Date(0, 0, 0, 0, value), "minute") }, startValue: 0, endValue: 59 }, seconds: { getter: "getSeconds", setter: "setSeconds", formatter: function(value) { return dateLocalization.format(new Date(0, 0, 0, 0, 0, value), "second") }, startValue: 0, endValue: 59 }, milliseconds: { getter: "getMilliseconds", setter: "setMilliseconds", formatter: function(value) { return dateLocalization.format(new Date(0, 0, 0, 0, 0, 0, value), "millisecond") }, startValue: 0, endValue: 999 } }; module.exports = dateUtils }, /*!*********************************************************!*\ !*** ./js/ui/date_box/ui.date_box.strategy.calendar.js ***! \*********************************************************/ function(module, exports, __webpack_require__) { var Calendar = __webpack_require__( /*! ../calendar */ 253), DateBoxStrategy = __webpack_require__( /*! ./ui.date_box.strategy */ 271), dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, messageLocalization = __webpack_require__( /*! ../../localization/message */ 89); var CalendarStrategy = DateBoxStrategy.inherit({ NAME: "Calendar", supportedKeys: function() { return { rightArrow: function() { if (this.option("opened")) { return true } }, leftArrow: function() { if (this.option("opened")) { return true } }, enter: function(e) { if (this.dateBox.option("opened")) { e.preventDefault(); if (this._widget.option("zoomLevel") === this._widget.option("maxZoomLevel")) { var contouredDate = this._widget._view.option("contouredDate"); contouredDate && this.dateBoxValue(contouredDate, e); this.dateBox.close(); this.dateBox._valueChangeEventHandler(e) } else { return true } } else { this.dateBox._valueChangeEventHandler(e) } }.bind(this) } }, getDisplayFormat: function(displayFormat) { return displayFormat || "shortdate" }, _getWidgetName: function() { return Calendar }, _getWidgetOptions: function() { return extend(this.dateBox.option("calendarOptions"), { value: this.dateBoxValue() || null, _keyboardProcessor: this._widgetKeyboardProcessor, min: this.dateBox.dateOption("min"), max: this.dateBox.dateOption("max"), onValueChanged: this._valueChangedHandler.bind(this), onCellClick: this._cellClickHandler.bind(this), tabIndex: null, maxZoomLevel: this.dateBox.option("maxZoomLevel"), minZoomLevel: this.dateBox.option("minZoomLevel"), onContouredChanged: this._refreshActiveDescendant.bind(this), hasFocus: function() { return true } }) }, _refreshActiveDescendant: function(e) { this.dateBox.setAria("activedescendant", e.actionValue) }, popupConfig: function(popupConfig) { var toolbarItems = popupConfig.toolbarItems, buttonsLocation = this.dateBox.option("buttonsLocation"); var position = []; if ("default" !== buttonsLocation) { position = commonUtils.splitPair(buttonsLocation) } else { position = ["bottom", "center"] } if ("useButtons" === this.dateBox.option("applyValueMode")) { toolbarItems.unshift({ widget: "dxButton", toolbar: position[0], location: "after" === position[1] ? "before" : position[1], options: { onClick: function() { this._widget._toTodayView() }.bind(this), text: messageLocalization.format("dxCalendar-todayButtonText"), type: "today" } }) } return extend(true, popupConfig, { toolbarItems: toolbarItems, position: { collision: "flipfit flip" } }) }, _valueChangedHandler: function(e) { var dateBox = this.dateBox, value = e.value, prevValue = e.previousValue; if (dateUtils.sameDate(value, prevValue)) { return } if ("instantly" === dateBox.option("applyValueMode")) { this.dateBoxValue(this.getValue(), e.jQueryEvent) } }, _updateValue: function() { if (!this._widget) { return } this._widget.option("value", this.dateBoxValue()) }, textChangedHandler: function() { if (this.dateBox.option("opened") && this._widget) { this._updateValue(true) } }, _cellClickHandler: function(e) { var dateBox = this.dateBox; if ("instantly" === dateBox.option("applyValueMode")) { dateBox.option("opened", false); this.dateBoxValue(this.getValue(), e.jQueryEvent) } }, dispose: function() { this.dateBox.off("optionChanged"); this.callBase() } }); module.exports = CalendarStrategy }, /*!************************************************!*\ !*** ./js/ui/date_box/ui.date_box.strategy.js ***! \************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, Class = __webpack_require__( /*! ../../core/class */ 25), dateLocalization = __webpack_require__( /*! ../../localization/date */ 33); var abstract = Class.abstract; var DateBoxStrategy = Class.inherit({ ctor: function(dateBox) { this.dateBox = dateBox }, widgetOption: function() { return this._widget && this._widget.option.apply(this._widget, arguments) }, _renderWidget: function(element) { element = element || $("<div>"); this._widget = this._createWidget(element); this._widget.element().appendTo(this._getWidgetContainer()) }, _createWidget: function(element) { var widgetName = this._getWidgetName(); var widgetOptions = this._getWidgetOptions(); return this.dateBox._createComponent(element, widgetName, widgetOptions) }, _getWidgetOptions: abstract, _getWidgetName: abstract, getDefaultOptions: function() { return { mode: "text" } }, getDisplayFormat: abstract, supportedKeys: noop, attachKeyboardEvents: function(keyboardProcessor) { this._widgetKeyboardProcessor = keyboardProcessor.attachChildProcessor() }, getParsedText: function(text, format) { return dateLocalization.parse(text, format) }, renderInputMinMax: noop, renderOpenedState: function() { if (this.dateBox.option("opened")) { this._updateValue() } }, popupConfig: abstract, renderPopupContent: function() { var popup = this._getPopup(); this._renderWidget(); popup.content().parent().off("mousedown").on("mousedown", this._preventFocusOnPopup.bind(this)) }, getFirstPopupElement: noop, getLastPopupElement: noop, _preventFocusOnPopup: function(e) { e.preventDefault() }, _getWidgetContainer: function() { return this._getPopup().content() }, _getPopup: function() { return this.dateBox._popup }, popupShowingHandler: noop, popupHiddenHandler: noop, _updateValue: function() { this._widget && this._widget.option("value", this.dateBoxValue()) }, _valueChangedHandler: function(args) { if (this.dateBox.option("opened") && "instantly" === this.dateBox.option("applyValueMode")) { this.dateBoxValue(args.value) } }, textChangedHandler: noop, renderValue: function() { if (this.dateBox.option("opened")) { this._updateValue() } }, getValue: function() { return this._widget.option("value") }, isAdaptivityChanged: function() { return false }, dispose: function() { var popup = this._getPopup(); if (popup) { popup.content().empty() } }, dateBoxValue: function() { if (arguments.length) { return this.dateBox.dateValue.apply(this.dateBox, arguments) } else { return this.dateBox.dateOption.apply(this.dateBox, ["value"]) } } }); module.exports = DateBoxStrategy }, /*!**********************************************************!*\ !*** ./js/ui/date_box/ui.date_box.strategy.date_view.js ***! \**********************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), DateView = __webpack_require__( /*! ./ui.date_view */ 273), DateBoxStrategy = __webpack_require__( /*! ./ui.date_box.strategy */ 271), support = __webpack_require__( /*! ../../core/utils/support */ 61), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, themes = __webpack_require__( /*! ../themes */ 143), dateUtils = __webpack_require__( /*! ./ui.date_utils */ 269), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89); var DateViewStrategy = DateBoxStrategy.inherit({ NAME: "DateView", getDefaultOptions: function() { return extend(this.callBase(), { openOnFieldClick: true, applyButtonText: messageLocalization.format("Done") }) }, getDisplayFormat: function(displayFormat) { return displayFormat || dateUtils.FORMATS_MAP[this.dateBox.option("type")] }, popupConfig: function() { return { showTitle: true, toolbarItems: this.dateBox._popupToolbarItemsConfig(), defaultOptionsRules: [{ device: function(device) { return "win" === device.platform && device.version && 8 === device.version[0] }, options: { showNames: true } }, { device: function(device) { return "win" === device.platform && device.phone && device.version && 8 === device.version[0] }, options: { animation: null } }, { device: function() { var currentTheme = (themes.current() || "").split(".")[0]; return "win8" === currentTheme }, options: { fullScreen: true } }, { device: { platform: "android" }, options: { width: 333, height: 331 } }, { device: function(device) { var platform = device.platform, version = device.version; return "generic" === platform || "ios" === platform || "win" === platform && version && 10 === version[0] }, options: { width: "auto", height: "auto" } }, { device: function(device) { var platform = device.platform, phone = device.phone; return "generic" === platform && phone }, options: { width: 333, height: "auto", position: { collision: "flipfit flip" } } }, { device: function(device) { var currentTheme = (themes.current() || "").split(".")[0]; return device.phone && "win10" === currentTheme }, options: { width: 333, height: "auto" } }, { device: { platform: "ios", phone: true }, options: { width: "100%", position: { my: "bottom", at: "bottom", of: window } } }] } }, _renderWidget: function() { if (support.inputType(this.dateBox.option("mode")) && this.dateBox._isNativeType() || this.dateBox.option("readOnly")) { if (this._widget) { this._widget.element().remove(); this._widget = null } return } var popup = this._getPopup(); if (this._widget) { this._widget.option(this._getWidgetOptions()) } else { var element = $("<div>").appendTo(popup.content()); this._widget = this._createWidget(element) } this._widget.element().appendTo(this._getWidgetContainer()) }, _getWidgetName: function() { return DateView }, _getWidgetOptions: function() { return { value: this.dateBoxValue() || new Date, type: this.dateBox.option("type"), minDate: this.dateBox.dateOption("min") || new Date(1900, 1, 1), maxDate: this.dateBox.dateOption("max") || new Date($.now() + 50 * dateUtils.ONE_YEAR), onDisposing: function() { this._widget = null }.bind(this) } }, _updateValue: function() { this._widget && this._widget.option("value", this.dateBoxValue()) } }); module.exports = DateViewStrategy }, /*!****************************************!*\ !*** ./js/ui/date_box/ui.date_view.js ***! \****************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Editor = __webpack_require__( /*! ../editor/editor */ 106), DateViewRoller = __webpack_require__( /*! ./ui.date_view_roller */ 274), dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, uiDateUtils = __webpack_require__( /*! ./ui.date_utils */ 269), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), dateLocalization = __webpack_require__( /*! ../../localization/date */ 33); var DATEVIEW_CLASS = "dx-dateview", DATEVIEW_WRAPPER_CLASS = "dx-dateview-wrapper", DATEVIEW_ROLLER_CONTAINER_CLASS = "dx-dateview-rollers", DATEVIEW_ROLLER_CLASS = "dx-dateviewroller"; var TYPE = { date: "date", datetime: "datetime", time: "time" }; var ROLLER_TYPE = { year: "year", month: "month", day: "day" }; var DateView = Editor.inherit({ _valueOption: function() { var value = this.option("value"), date = new Date(value); return !value || isNaN(date) ? this._getDefaultDate() : date }, _getDefaultDate: function() { var date = new Date; if (this.option("type") === TYPE.date) { return new Date(date.getFullYear(), date.getMonth(), date.getDate()) } return date }, _getDefaultOptions: function() { return extend(this.callBase(), { minDate: uiDateUtils.MIN_DATEVIEW_DEFAULT_DATE, maxDate: uiDateUtils.MAX_DATEVIEW_DEFAULT_DATE, type: TYPE.date, value: new Date, showNames: false }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function(device) { return "win" === device.platform && device.version && 8 === device.version[0] }, options: { showNames: true } }]) }, _render: function() { this.callBase(); this.element().addClass(DATEVIEW_CLASS); this._toggleFormatClasses(this.option("type")) }, _toggleFormatClasses: function(currentFormat, previousFormat) { this.element().addClass(DATEVIEW_CLASS + "-" + currentFormat); previousFormat && this.element().removeClass(DATEVIEW_CLASS + "-" + previousFormat) }, _wrapper: function() { return this._$wrapper }, _renderContentImpl: function() { this._$wrapper = $("<div>").addClass(DATEVIEW_WRAPPER_CLASS); this._renderRollers(); this._$wrapper.appendTo(this.element()) }, _renderRollers: function() { if (!this._$rollersContainer) { this._$rollersContainer = $("<div>").addClass(DATEVIEW_ROLLER_CONTAINER_CLASS) } this._$rollersContainer.empty(); this._createRollerConfigs(); this._rollers = {}; var that = this; $.each(that._rollerConfigs, function(name) { var $roller = $("<div>").appendTo(that._$rollersContainer).addClass(DATEVIEW_ROLLER_CLASS + "-" + that._rollerConfigs[name].type); that._rollers[that._rollerConfigs[name].type] = that._createComponent($roller, DateViewRoller, { items: that._rollerConfigs[name].displayItems, selectedIndex: that._rollerConfigs[name].selectedIndex, showScrollbar: false, onStart: function(e) { var roller = e.component; roller._toggleActive(true); that._setActiveRoller(that._rollerConfigs[name], roller.option("selectedIndex")) }, onEnd: function(e) { var roller = e.component; roller._toggleActive(false) }, onClick: function(e) { var roller = e.component; roller._toggleActive(true); that._setActiveRoller(that._rollerConfigs[name], roller.option("selectedIndex")); that._setRollerState(that._rollerConfigs[name], roller.option("selectedIndex")); roller._toggleActive(false) }, onSelectedIndexChanged: function(e) { var roller = e.component; that._setRollerState(that._rollerConfigs[name], roller.option("selectedIndex")) } }) }); that._$rollersContainer.appendTo(that._wrapper()) }, _createRollerConfigs: function(type) { var that = this; type = type || that.option("type"); that._rollerConfigs = {}; dateLocalization.getFormatParts(uiDateUtils.FORMATS_MAP[type]).forEach(function(partName) { that._createRollerConfig(partName) }) }, _createRollerConfig: function(componentName) { var componentInfo = uiDateUtils.DATE_COMPONENTS_INFO[componentName], valueRange = this._calculateRollerConfigValueRange(componentName), startValue = valueRange.startValue, endValue = valueRange.endValue, formatter = componentInfo.formatter, showNames = this.option("showNames"), curDate = this._getCurrentDate(); var config = { type: componentName, setValue: componentInfo.setter, valueItems: [], displayItems: [], getIndex: function(value) { return value[componentInfo.getter]() - startValue } }; for (var i = startValue; i <= endValue; i++) { config.valueItems.push(i); config.displayItems.push(formatter(i, showNames, curDate)) } config.selectedIndex = config.getIndex(curDate); this._rollerConfigs[componentName] = config }, _setActiveRoller: function(currentRoller) { var activeRoller = currentRoller && this._rollers[currentRoller.type]; $.each(this._rollers, function() { this.toggleActiveState(this === activeRoller) }) }, _updateRollersPosition: function() { var that = this; $.each(this._rollers, function(type) { var correctIndex = that._rollerConfigs[type].getIndex(that._getCurrentDate()); this.option("selectedIndex", correctIndex) }) }, _setRollerState: function(roller, selectedIndex) { if (selectedIndex !== roller.selectedIndex) { var rollerValue = roller.valueItems[selectedIndex], setValue = roller.setValue, currentValue = new Date(this._getCurrentDate()), currentDate = currentValue.getDate(); if (roller.type === ROLLER_TYPE.month) { currentDate = Math.min(currentDate, uiDateUtils.getMaxMonthDay(currentValue.getFullYear(), rollerValue)) } else { if (roller.type === ROLLER_TYPE.year) { currentDate = Math.min(currentDate, uiDateUtils.getMaxMonthDay(rollerValue, currentValue.getMonth())) } } currentValue.setDate(currentDate); currentValue[setValue](rollerValue); currentValue = dateUtils.normalizeDate(currentValue, this.option("minDate"), this.option("maxDate")); this.option("value", currentValue); roller.selectedIndex = selectedIndex } if (roller.type === ROLLER_TYPE.year) { this._refreshMonthRoller(); this._refreshDayRoller() } if (roller.type === ROLLER_TYPE.month) { this._refreshDayRoller() } }, _refreshMonthRoller: function() { var monthRoller = this._rollers[ROLLER_TYPE.month]; if (monthRoller) { this._createRollerConfig(ROLLER_TYPE.month); var monthRollerConfig = this._rollerConfigs[ROLLER_TYPE.month]; if (monthRollerConfig.displayItems.length !== monthRoller.option("items").length) { monthRoller.option({ items: monthRollerConfig.displayItems, selectedIndex: monthRollerConfig.selectedIndex }) } } }, _refreshDayRoller: function() { var dayRoller = this._rollers[ROLLER_TYPE.day]; if (dayRoller) { this._createRollerConfig(ROLLER_TYPE.day); var dayRollerConfig = this._rollerConfigs[ROLLER_TYPE.day]; dayRoller.option({ items: dayRollerConfig.displayItems, selectedIndex: dayRollerConfig.selectedIndex }) } }, _getCurrentDate: function() { var curDate = this._valueOption(), minDate = this.option("minDate"), maxDate = this.option("maxDate"); if (minDate && curDate.getTime() <= minDate.getTime()) { curDate = minDate } else { if (maxDate && curDate.getTime() >= maxDate.getTime()) { curDate = maxDate } } return curDate }, _calculateRollerConfigValueRange: function(componentName) { var curDate = this._getCurrentDate(), minDate = this.option("minDate"), maxDate = this.option("maxDate"), minYear = dateUtils.sameYear(curDate, minDate), minMonth = minYear && curDate.getMonth() === minDate.getMonth(), maxYear = dateUtils.sameYear(curDate, maxDate), maxMonth = maxYear && curDate.getMonth() === maxDate.getMonth(), componentInfo = uiDateUtils.DATE_COMPONENTS_INFO[componentName], startValue = componentInfo.startValue, endValue = componentInfo.endValue; if (componentName === ROLLER_TYPE.year) { startValue = minDate.getFullYear(); endValue = maxDate.getFullYear() } if (componentName === ROLLER_TYPE.month) { if (minYear) { startValue = minDate.getMonth() } if (maxYear) { endValue = maxDate.getMonth() } } if (componentName === ROLLER_TYPE.day) { endValue = uiDateUtils.getMaxMonthDay(curDate.getFullYear(), curDate.getMonth()); if (minYear && minMonth) { startValue = minDate.getDate() } if (maxYear && maxMonth) { endValue = maxDate.getDate() } } return { startValue: startValue, endValue: endValue } }, _refreshRollers: function() { this._refreshMonthRoller(); this._refreshDayRoller() }, _optionChanged: function(args) { switch (args.name) { case "showNames": case "minDate": case "maxDate": case "type": this._renderRollers(); this._toggleFormatClasses(args.value, args.previousValue); break; case "visible": this.callBase(args); if (args.value) { this._renderRollers() } break; case "value": this.option("value", this._valueOption()); this._refreshRollers(); this._updateRollersPosition(); break; default: this.callBase(args) } }, _clean: function() { this.callBase(); delete this._$rollersContainer }, _dispose: function() { clearTimeout(this._deferredRenderDayTimeout); clearTimeout(this._deferredRenderMonthTimeout); this.callBase() } }); registerComponent("dxDateView", DateView); module.exports = DateView }, /*!***********************************************!*\ !*** ./js/ui/date_box/ui.date_view_roller.js ***! \***********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, eventUtils = __webpack_require__( /*! ../../events/utils */ 71), clickEvent = __webpack_require__( /*! ../../events/click */ 75), Scrollable = __webpack_require__( /*! ../scroll_view/ui.scrollable */ 244), fx = __webpack_require__( /*! ../../animation/fx */ 68), translator = __webpack_require__( /*! ../../animation/translator */ 69); var DATEVIEW_ROLLER_CLASS = "dx-dateviewroller", DATEVIEW_ROLLER_ACTIVE_CLASS = "dx-state-active", DATEVIEW_ROLLER_CURRENT_CLASS = "dx-dateviewroller-current", DATEVIEW_ROLLER_ITEM_CLASS = "dx-dateview-item", DATEVIEW_ROLLER_ITEM_SELECTED_CLASS = "dx-dateview-item-selected", DATEVIEW_ROLLER_ITEM_SELECTED_FRAME_CLASS = "dx-dateview-item-selected-frame", DATEVIEW_ROLLER_ITEM_SELECTED_BORDER_CLASS = "dx-dateview-item-selected-border"; var DateViewRoller = Scrollable.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { showScrollbar: false, useNative: false, selectedIndex: 0, bounceEnabled: false, items: [], showOnClick: false, onClick: null, onSelectedIndexChanged: null }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function(device) { return "win" === device.platform && device.version && 8 === device.version[0] }, options: { showOnClick: true } }, { device: { platform: "generic" }, options: { scrollByContent: true } }]) }, _init: function() { this.callBase(); this._renderSelectedItemFrame() }, _render: function() { this.callBase(); $.each(this._strategy._scrollers, function(index, scroller) { scroller._correctLocation = noop }); this.element().addClass(DATEVIEW_ROLLER_CLASS); this._renderContainerClick(); this._renderItems(); this._renderSelectedValue(); this._renderItemsClick(); this._wrapAction("_endAction", this._endActionHandler.bind(this)); this._renderSelectedIndexChanged() }, _renderSelectedIndexChanged: function() { this._selectedIndexChanged = this._createActionByOption("onSelectedIndexChanged") }, _renderContainerClick: function() { if (!this.option("showOnClick")) { return } var eventName = eventUtils.addNamespace(clickEvent.name, this.NAME); var clickAction = this._createActionByOption("onClick"); this._$container.off(eventName).on(eventName, function(e) { clickAction({ jQueryEvent: e }) }) }, _wrapAction: function(actionName, callback) { var strategy = this._strategy, originalAction = strategy[actionName]; strategy[actionName] = function() { callback.apply(this, arguments); return originalAction.apply(this, arguments) } }, _renderItems: function() { var items = this.option("items") || [], $items = $(); this._$content.empty(); $.each(items, function() { $items = $items.add($("<div>").addClass(DATEVIEW_ROLLER_ITEM_CLASS).append(this)) }); this._$content.append($items); this._$items = $items; this.update() }, _renderSelectedItemFrame: function() { $("<div>").addClass(DATEVIEW_ROLLER_ITEM_SELECTED_FRAME_CLASS).append($("<div>").addClass(DATEVIEW_ROLLER_ITEM_SELECTED_BORDER_CLASS)).appendTo(this._$container) }, _renderSelectedValue: function(selectedIndex) { var index = this._fitIndex(selectedIndex || this.option("selectedIndex")); this._moveTo({ top: this._getItemPosition(index) }); this._renderActiveStateItem() }, _fitIndex: function(index) { var items = this.option("items") || [], itemCount = items.length; if (index >= itemCount) { return itemCount - 1 } if (index < 0) { return 0 } return index }, _getItemPosition: function(index) { return Math.round(this._itemHeight() * index) }, _renderItemsClick: function() { var itemSelector = this._getItemSelector(), eventName = eventUtils.addNamespace(clickEvent.name, this.NAME); this.element().off(eventName, itemSelector); this.element().on(eventName, itemSelector, this._itemClickHandler.bind(this)) }, _getItemSelector: function() { return "." + DATEVIEW_ROLLER_ITEM_CLASS }, _itemClickHandler: function(e) { this.option("selectedIndex", this._itemElementIndex(e.currentTarget)) }, _itemElementIndex: function(itemElement) { return this._itemElements().index(itemElement) }, _itemElements: function() { return this.element().find(this._getItemSelector()) }, _renderActiveStateItem: function() { var selectedIndex = this.option("selectedIndex"); $.each(this._$items, function(index) { $(this).toggleClass(DATEVIEW_ROLLER_ITEM_SELECTED_CLASS, selectedIndex === index) }) }, _moveTo: function(targetLocation) { targetLocation = this._normalizeLocation(targetLocation); var location = this._location(), delta = { x: -(location.left - targetLocation.left), y: -(location.top - targetLocation.top) }; if (this._isVisible() && (delta.x || delta.y)) { this._strategy._prepareDirections(true); if (this._animation) { var that = this; fx.stop(this._$content); fx.animate(this._$content, { duration: 200, type: "slide", to: { top: Math.floor(delta.y) }, complete: function() { translator.resetPosition(that._$content); that._strategy.handleMove({ delta: delta }) } }); delete this._animation } else { this._strategy.handleMove({ delta: delta }) } } }, _validate: function(e) { return this._strategy.validate(e) }, _endActionHandler: function() { var currentSelectedIndex = this.option("selectedIndex"), ratio = -this._location().top / this._itemHeight(), newSelectedIndex = Math.round(ratio); this._animation = true; if (newSelectedIndex === currentSelectedIndex) { this._renderSelectedValue(newSelectedIndex) } else { this.option("selectedIndex", newSelectedIndex) } }, _itemHeight: function() { var $item = this._$items.first(); return $item.get(0) && $item.get(0).getBoundingClientRect().height || 0 }, _toggleActive: function(state) { this.element().toggleClass(DATEVIEW_ROLLER_ACTIVE_CLASS, state) }, _isVisible: function() { return this._$container.is(":visible") }, _fireSelectedIndexChanged: function(value, previousValue) { this._selectedIndexChanged({ value: value, previousValue: previousValue, jQueryEvent: void 0 }) }, _visibilityChanged: function(visible) { this.callBase(visible); if (visible) { this._renderSelectedValue(this.option("selectedIndex")) } this.toggleActiveState(false) }, toggleActiveState: function(state) { this.element().toggleClass(DATEVIEW_ROLLER_CURRENT_CLASS, state) }, _refreshSelectedIndex: function() { var selectedIndex = this.option("selectedIndex"); var fitIndex = this._fitIndex(selectedIndex); fitIndex === selectedIndex ? this._renderActiveStateItem() : this.option("selectedIndex", fitIndex) }, _optionChanged: function(args) { switch (args.name) { case "selectedIndex": this._fireSelectedIndexChanged(args.value, args.previousValue); this._renderSelectedValue(args.value); break; case "items": this._renderItems(); this._refreshSelectedIndex(); break; case "onClick": case "showOnClick": this._renderContainerClick(); break; case "onSelectedIndexChanged": this._renderSelectedIndexChanged(); break; default: this.callBase(args) } } }); registerComponent("dxDateViewRoller", DateViewRoller); module.exports = DateViewRoller }, /*!*******************************************************!*\ !*** ./js/ui/date_box/ui.date_box.strategy.native.js ***! \*******************************************************/ function(module, exports, __webpack_require__) { var noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, DateBoxStrategy = __webpack_require__( /*! ./ui.date_box.strategy */ 271), support = __webpack_require__( /*! ../../core/utils/support */ 61), inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, dateUtils = __webpack_require__( /*! ./ui.date_utils */ 269), dateSerialization = __webpack_require__( /*! ../../core/utils/date_serialization */ 259); var NativeStrategy = DateBoxStrategy.inherit({ NAME: "Native", popupConfig: noop, getParsedText: function(text) { if (!text) { return null } if ("datetime" === this.dateBox.option("type")) { return new Date(text.replace(/-/g, "/").replace("T", " ").split(".")[0]) } return dateUtils.fromStandardDateFormat(text) }, renderPopupContent: noop, _getWidgetName: noop, _getWidgetOptions: noop, _getDateBoxType: function() { var type = this.dateBox.option("type"); if (inArray(type, dateUtils.SUPPORTED_FORMATS) === -1) { type = "date" } else { if ("datetime" === type && !support.inputType(type)) { type = "datetime-local" } } return type }, getDefaultOptions: function() { return { mode: this._getDateBoxType() } }, getDisplayFormat: function(displayFormat) { var type = this._getDateBoxType(); return displayFormat || dateUtils.FORMATS_MAP[type] }, renderInputMinMax: function($input) { $input.attr({ min: dateSerialization.serializeDate(this.dateBox.dateOption("min"), "yyyy-MM-dd"), max: dateSerialization.serializeDate(this.dateBox.dateOption("max"), "yyyy-MM-dd") }) } }); module.exports = NativeStrategy }, /*!*******************************************************************!*\ !*** ./js/ui/date_box/ui.date_box.strategy.calendar_with_time.js ***! \*******************************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), CalendarStrategy = __webpack_require__( /*! ./ui.date_box.strategy.calendar */ 270), TimeView = __webpack_require__( /*! ./ui.time_view */ 277), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, Box = __webpack_require__( /*! ../box */ 252); var SHRINK_VIEW_SCREEN_WIDTH = 573, DATEBOX_ADAPTIVITY_MODE_CLASS = "dx-datebox-adaptivity-mode"; var CalendarWithTimeStrategy = CalendarStrategy.inherit({ NAME: "CalendarWithTime", getDefaultOptions: function() { return extend(this.callBase(), { applyValueMode: "useButtons", buttonsLocation: "bottom after", showPopupTitle: false }) }, getDisplayFormat: function(displayFormat) { return displayFormat || "shortdateshorttime" }, _renderWidget: function() { this.callBase(); this._timeView = this.dateBox._createComponent($("<div>"), TimeView, { value: this.dateBoxValue(), _showClock: !this._isShrinkView(), onValueChanged: this._valueChangedHandler.bind(this) }) }, renderOpenedState: function() { this.callBase(); var popup = this._getPopup(); if (popup) { popup._wrapper().toggleClass(DATEBOX_ADAPTIVITY_MODE_CLASS, this._isSmallScreen()) } clearTimeout(this._repaintTimer); this._repaintTimer = setTimeout(function() { this._getPopup() && this._getPopup().repaint() }.bind(this), 0) }, isAdaptivityChanged: function() { var isAdaptiveMode = this._isShrinkView(); if (isAdaptiveMode !== this._currentAdaptiveMode) { this._currentAdaptiveMode = isAdaptiveMode; return true } return this.callBase() }, _updateValue: function(preventDefaultValue) { var date = this.dateBoxValue(); if (!date && !preventDefaultValue) { date = new Date } this.callBase(); if (this._timeView && date) { this._timeView.option("value", date) } }, _isSmallScreen: function() { return $(window).width() <= SHRINK_VIEW_SCREEN_WIDTH }, _isShrinkView: function() { return this.dateBox.option("adaptivityEnabled") && this._isSmallScreen() }, _getBoxItems: function() { var items = [{ ratio: 0, shrink: 0, baseSize: "auto", name: "calendar" }]; if (!this._isShrinkView()) { items.push({ ratio: 0, shrink: 0, baseSize: "auto", name: "time" }) } return items }, renderPopupContent: function() { this.callBase(); this._currentAdaptiveMode = this._isShrinkView(); var $popupContent = this._getPopup().content(); this._box = this.dateBox._createComponent($("<div>").appendTo($popupContent), Box, { direction: "row", crossAlign: "start", items: this._getBoxItems(), itemTemplate: function(data) { var $container = $("<div>"); switch (data.name) { case "calendar": $container.append(this._widget.element()); if (this._isShrinkView()) { $container.append(this._timeView.element()) } break; case "time": $container.append(this._timeView.element()) } return $container }.bind(this) }); this._attachTabHandler() }, popupConfig: function(popupConfig) { var calendarPopupConfig = this.callBase(popupConfig), result = extend(calendarPopupConfig, { onShowing: function() { if ("fallback" === this._box.option("_layoutStrategy")) { var clockMinWidth = this._getPopup().content().find(".dx-timeview-clock").css("minWidth"); this._timeView.element().css("width", clockMinWidth) } }.bind(this) }); return result }, getFirstPopupElement: function() { return this._timeView._hourBox.element().find("input") }, _attachTabHandler: function() { var dateBox = this.dateBox, handler = function(e) { if (e.shiftKey) { e.preventDefault(); dateBox.focus() } }; this._timeView._hourBox.registerKeyHandler("tab", handler) }, _preventFocusOnPopup: function(e) { if (!$(e.target).hasClass("dx-texteditor-input")) { this.callBase.apply(this, arguments); if (!this.dateBox._hasFocusClass()) { this.dateBox.focus() } } }, getValue: function() { var date = this._widget.option("value"), time = this._timeView.option("value"); date = date ? new Date(date) : new Date; date.setHours(time.getHours(), time.getMinutes(), time.getSeconds()); return date }, dispose: function() { clearTimeout(this._removeMinWidthTimer); clearTimeout(this._repaintTimer); this.callBase() } }); module.exports = CalendarWithTimeStrategy }, /*!****************************************!*\ !*** ./js/ui/date_box/ui.time_view.js ***! \****************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Editor = __webpack_require__( /*! ../editor/editor */ 106), NumberBox = __webpack_require__( /*! ../number_box */ 263), Box = __webpack_require__( /*! ../box */ 252), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), dateLocalization = __webpack_require__( /*! ../../localization/date */ 33); var TIMEVIEW_CLASS = "dx-timeview", TIMEVIEW_CLOCK_CLASS = "dx-timeview-clock", TIMEVIEW_FIELD_CLASS = "dx-timeview-field", TIMEVIEW_HOURARROW_CLASS = "dx-timeview-hourarrow", TIMEVIEW_TIME_SEPARATOR_CLASS = "dx-timeview-time-separator", TIMEVIEW_MINUTEARROW_CLASS = "dx-timeview-minutearrow"; var rotateArrow = function($arrow, angle, offset) { cssRotate($arrow, angle, offset) }; var cssRotate = function($arrow, angle, offset) { $arrow.css("transform", "rotate(" + angle + "deg) translate(0," + offset + "px)") }; var TimeView = Editor.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { value: new Date($.now()), _showClock: true, _arrowOffset: 0 }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: { platform: "android" }, options: { _arrowOffset: 15 } }, { device: { platform: "generic" }, options: { _arrowOffset: 5 } }]) }, _getValue: function() { return this.option("value") || new Date }, _init: function() { this.callBase(); this.element().addClass(TIMEVIEW_CLASS) }, _render: function() { this.callBase(); this._renderBox(); this._updateTime() }, _renderBox: function() { var $box = $("<div>").appendTo(this.element()), items = []; if (this.option("_showClock")) { items.push({ ratio: 1, shrink: 0, baseSize: "auto", template: this._renderClock.bind(this) }) } items.push({ ratio: 0, shrink: 0, baseSize: 50, template: this._renderField.bind(this) }); this._createComponent($box, Box, { height: "100%", width: "100%", direction: "col", items: items }) }, _renderClock: function(_, __, $container) { this._$hourArrow = $("<div>").addClass(TIMEVIEW_HOURARROW_CLASS); this._$minuteArrow = $("<div>").addClass(TIMEVIEW_MINUTEARROW_CLASS); $container.addClass(TIMEVIEW_CLOCK_CLASS).append(this._$hourArrow).append(this._$minuteArrow); this.setAria("role", "presentation", $container) }, _updateClock: function() { var time = this._getValue(), hourArrowAngle = time.getHours() / 12 * 360 + time.getMinutes() / 60 * 30, minuteArrowAngle = time.getMinutes() / 60 * 360; rotateArrow(this._$hourArrow, hourArrowAngle, this.option("_arrowOffset")); rotateArrow(this._$minuteArrow, minuteArrowAngle, this.option("_arrowOffset")) }, _renderField: function() { this._createHourBox(); this._createMinuteBox(); return this._createComponent($("<div>").addClass(TIMEVIEW_FIELD_CLASS), Box, { direction: "row", align: "center", crossAlign: "center", items: [{ ratio: 0, shrink: 0, baseSize: "auto", template: function() { return this._hourBox.element() }.bind(this) }, { ratio: 0, shrink: 0, baseSize: "auto", template: $("<div>", { "class": TIMEVIEW_TIME_SEPARATOR_CLASS }).text(dateLocalization.getTimeSeparator()) }, { ratio: 0, shrink: 0, baseSize: "auto", template: function() { return this._minuteBox.element() }.bind(this) }] }).element() }, _createHourBox: function() { this._hourBox = this._createComponent($("<div>"), NumberBox, extend({ min: -1, max: 24, value: this._getValue().getHours(), onValueChanged: function(args) { var newHours = (24 + args.value) % 24; this._hourBox.option("value", newHours); var time = new Date(this._getValue()); time.setHours(newHours); this.option("value", time) }.bind(this) }, this._getNumberBoxConfig())); this._hourBox.setAria("label", "hours") }, _createMinuteBox: function() { this._minuteBox = this._createComponent($("<div>"), NumberBox, extend({ min: -1, max: 60, value: this._getValue().getMinutes(), onValueChanged: function(args) { var newMinutes = (60 + args.value) % 60; this._minuteBox.option("value", newMinutes); var time = new Date(this._getValue()); time.setMinutes(newMinutes); this.option("value", time) }.bind(this) }, this._getNumberBoxConfig())); this._minuteBox.setAria("label", "minutes") }, _getNumberBoxConfig: function() { return { showSpinButtons: true, disabled: this.option("disabled"), valueFormat: function(value) { return (value < 10 ? "0" : "") + value } } }, _updateField: function() { this._hourBox && this._hourBox.option("value", this._getValue().getHours()); this._minuteBox && this._minuteBox.option("value", this._getValue().getMinutes()) }, _updateTime: function() { if (this.option("_showClock")) { this._updateClock() } this._updateField() }, _visibilityChanged: function(visible) { if (visible) { this._updateTime() } }, _toggleDisabledState: function(value) { this._hourBox && this._hourBox.option("disabled", value); this._minuteBox && this._minuteBox.option("disabled", value) }, _optionChanged: function(args) { switch (args.name) { case "value": this._updateTime(); this.callBase(args); break; case "_arrowOffset": break; case "_showClock": this._invalidate(); break; default: this.callBase(args) } } }); registerComponent("dxTimeView", TimeView); module.exports = TimeView }, /*!*****************************************************!*\ !*** ./js/ui/date_box/ui.date_box.strategy.list.js ***! \*****************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), List = __webpack_require__( /*! ../list */ 218), DateBoxStrategy = __webpack_require__( /*! ./ui.date_box.strategy */ 271), devices = __webpack_require__( /*! ../../core/devices */ 53), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, dateUtils = __webpack_require__( /*! ./ui.date_utils */ 269), dateLocalization = __webpack_require__( /*! ../../localization/date */ 33); var BOUNDARY_VALUES = { min: new Date(0, 0, 0, 0, 0), max: new Date(0, 0, 0, 23, 59) }; var ListStrategy = DateBoxStrategy.inherit({ NAME: "List", supportedKeys: function() { return { tab: function() { if (this.option("opened")) { this.close() } }, space: commonUtils.noop, home: commonUtils.noop, end: commonUtils.noop } }, getDefaultOptions: function() { return extend(this.callBase(), { applyValueMode: "instantly" }) }, getDisplayFormat: function(displayFormat) { return displayFormat || "shorttime" }, popupConfig: function(popupConfig) { var device = devices.current(), result = extend(popupConfig, { width: this._getPopupWidth() }); if ("android" === device.platform) { extend(result, { position: { offset: { h: -16, v: -10 } } }) } return result }, _getPopupWidth: function() { var device = devices.current(), result = this.dateBox.element().outerWidth(); if ("android" === device.platform) { result += 32 } return result }, popupShowingHandler: function() { this._dimensionChanged() }, _renderWidget: function() { this.callBase(); this._refreshItems() }, _getWidgetName: function() { return List }, _getWidgetOptions: function() { var keyboardProcessor = this.dateBox._keyboardProcessor; return { _keyboardProcessor: keyboardProcessor ? keyboardProcessor.attachChildProcessor() : null, itemTemplate: this._timeListItemTemplate.bind(this), onItemClick: this._listItemClickHandler.bind(this), tabIndex: -1, onFocusedItemChanged: this._refreshActiveDescendant.bind(this), selectionMode: "single" } }, _refreshActiveDescendant: function(e) { this.dateBox.setAria("activedescendant", ""); this.dateBox.setAria("activedescendant", e.actionValue) }, _refreshItems: function() { this._widgetItems = this._getTimeListItems(); this._widget.option("items", this._widgetItems) }, renderOpenedState: function() { if (!this._widget) { return } this._widget.option("focusedElement", null); this._setSelectedItemsByValue(); if (this._widget.option("templatesRenderAsynchronously")) { this._asyncScrollTimeout = setTimeout(this._scrollToSelectedItem.bind(this)) } else { this._scrollToSelectedItem() } }, dispose: function() { this.callBase(); clearTimeout(this._asyncScrollTimeout) }, _updateValue: function() { if (!this._widget) { return } this._refreshItems(); this._setSelectedItemsByValue(); this._scrollToSelectedItem() }, _setSelectedItemsByValue: function() { var value = this.dateBoxValue(); var dateIndex = this._getDateIndex(value); if (dateIndex === -1) { this._widget.option("selectedItems", []) } else { this._widget.option("selectedIndex", dateIndex) } }, _scrollToSelectedItem: function() { this._widget.scrollToItem(this._widget.option("selectedIndex")) }, _getDateIndex: function(date) { var result = -1; for (var i = 0, n = this._widgetItems.length; i < n; i++) { if (this._areDatesEqual(date, this._widgetItems[i])) { result = i; break } } return result }, _areDatesEqual: function(first, second) { return commonUtils.isDate(first) && commonUtils.isDate(second) && first.getHours() === second.getHours() && first.getMinutes() === second.getMinutes() }, _getTimeListItems: function() { var min = this.dateBox.dateOption("min") || this._getBoundaryDate("min"), max = this.dateBox.dateOption("max") || this._getBoundaryDate("max"), value = this.dateBox.dateOption("value") || null, delta = max - min, minutes = min.getMinutes() % this.dateBox.option("interval"); if (delta < 0) { return [] } if (delta > dateUtils.ONE_DAY) { delta = dateUtils.ONE_DAY } if (value - min < dateUtils.ONE_DAY) { return this._getRangeItems(min, new Date(min), delta) } min = this._getBoundaryDate("min"); min.setMinutes(minutes); if (value && Math.abs(value - max) < dateUtils.ONE_DAY) { delta = (60 * max.getHours() + Math.abs(max.getMinutes() - minutes)) * dateUtils.ONE_MINUTE } return this._getRangeItems(min, new Date(min), delta) }, _getRangeItems: function(startValue, currentValue, rangeDuration) { var rangeItems = []; var interval = this.dateBox.option("interval"); while (currentValue - startValue < rangeDuration) { rangeItems.push(new Date(currentValue)); currentValue.setMinutes(currentValue.getMinutes() + interval) } return rangeItems }, _getBoundaryDate: function(boundary) { var boundaryValue = BOUNDARY_VALUES[boundary], currentValue = this.dateBox.dateOption("value") || new Date; return new Date(currentValue.getFullYear(), currentValue.getMonth(), currentValue.getDate(), boundaryValue.getHours(), boundaryValue.getMinutes()) }, _timeListItemTemplate: function(itemData) { var displayFormat = this.dateBox.option("displayFormat"); return dateLocalization.format(itemData, this.getDisplayFormat(displayFormat)) }, _listItemClickHandler: function(e) { this.dateBox.option("opened", false); var date = this.dateBox.option("value"); date = date ? new Date(date) : new Date; date.setHours(e.itemData.getHours()); date.setMinutes(e.itemData.getMinutes()); date.setSeconds(e.itemData.getSeconds()); this.dateBoxValue(date) }, attachKeyboardEvents: function(keyboardProcessor) { var child = keyboardProcessor.attachChildProcessor(); if (this._widget) { this._widget.option("_keyboardProcessor", child) } }, _dimensionChanged: function() { this._getPopup() && this._updatePopupDimensions() }, _updatePopupDimensions: function() { this._updatePopupWidth(); this._updatePopupHeight() }, _updatePopupWidth: function() { this.dateBox._setPopupOption("width", this._getPopupWidth()) }, _updatePopupHeight: function() { this.dateBox._setPopupOption("height", "auto"); var popupHeight = this._widget.element().outerHeight(); var maxHeight = .45 * $(window).height(); this.dateBox._setPopupOption("height", Math.min(popupHeight, maxHeight)); this.dateBox._timeList && this.dateBox._timeList.updateDimensions() } }); module.exports = ListStrategy }, /*!**********************************!*\ !*** ./js/ui/defer_rendering.js ***! \**********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, domUtils = __webpack_require__( /*! ../core/utils/dom */ 56), TransitionExecutorModule = __webpack_require__( /*! ../animation/transition_executor/transition_executor */ 74), Widget = __webpack_require__( /*! ./widget/ui.widget */ 95), LoadIndicator = __webpack_require__( /*! ./load_indicator */ 238); var WIDGET_CLASS = "dx-widget", DEFER_RENDERING_CLASS = "dx-deferrendering", PENDING_RENDERING_CLASS = "dx-pending-rendering", PENDING_RENDERING_MANUAL_CLASS = "dx-pending-rendering-manual", PENDING_RENDERING_ACTIVE_CLASS = "dx-pending-rendering-active", VISIBLE_WHILE_PENDING_RENDERING_CLASS = "dx-visible-while-pending-rendering", INVISIBLE_WHILE_PENDING_RENDERING_CLASS = "dx-invisible-while-pending-rendering", LOADINDICATOR_CONTAINER_CLASS = "dx-loadindicator-container", DEFER_RENDERING_LOADINDICATOR_CONTAINER_CLASS = "dx-deferrendering-loadindicator-container", DEFER_DEFER_RENDERING_LOAD_INDICATOR = "dx-deferrendering-load-indicator", ANONYMOUS_TEMPLATE_NAME = "content", ACTIONS = ["onRendered", "onShown"]; var DeferRendering = Widget.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { showLoadIndicator: false, renderWhen: void 0, animation: void 0, staggerItemSelector: void 0, onRendered: null, onShown: null }) }, _getAnonymousTemplateName: function() { return ANONYMOUS_TEMPLATE_NAME }, _init: function() { this.transitionExecutor = new TransitionExecutorModule.TransitionExecutor; this._initElement(); this._initRender(); this._$initialContent = this.element().clone().contents(); this._initActions(); this.callBase() }, _initElement: function() { this.element().addClass(DEFER_RENDERING_CLASS) }, _initRender: function() { var that = this, $element = this.element(), renderWhen = this.option("renderWhen"); var doRender = function() { return that._renderDeferredContent() }; if (renderWhen && renderWhen.done) { renderWhen.done(doRender) } else { $element.data("dx-render-delegate", doRender); if (void 0 === renderWhen) { $element.addClass(PENDING_RENDERING_MANUAL_CLASS) } } }, _initActions: function() { this._actions = {}; $.each(ACTIONS, function(_, action) { this._actions[action] = this._createActionByOption(action) || commonUtils.noop }.bind(this)) }, _renderContentImpl: function() { this.element().removeClass(WIDGET_CLASS); this.element().append(this._$initialContent); this._setLoadingState() }, _renderDeferredContent: function() { var that = this, $element = this.element(), result = $.Deferred(); $element.removeClass(PENDING_RENDERING_MANUAL_CLASS); $element.addClass(PENDING_RENDERING_ACTIVE_CLASS); this._renderTask = commonUtils.executeAsync(function() { that._renderImpl().done(function() { var shownArgs = { element: $element }; that._actions.onShown([shownArgs]); result.resolve(shownArgs) }).fail(function() { result.rejectWith(result, arguments) }) }); return result.promise() }, _isElementInViewport: function(element) { var rect = element.getBoundingClientRect(); return rect.bottom >= 0 && rect.right >= 0 && rect.top <= (window.innerHeight || document.documentElement.clientHeight) && rect.left <= (window.innerWidth || document.documentElement.clientWidth) }, _animate: function() { var animatePromise, that = this, $element = this.element(), animation = this.option("animation"), staggerItemSelector = this.option("staggerItemSelector"); that.transitionExecutor.stop(); if (animation) { if (staggerItemSelector) { $element.find(staggerItemSelector).each(function() { if (that._isElementInViewport(this)) { that.transitionExecutor.enter($(this), animation) } }) } else { that.transitionExecutor.enter($element, animation) } animatePromise = that.transitionExecutor.start() } else { animatePromise = $.Deferred().resolve().promise() } return animatePromise }, _renderImpl: function() { var $element = this.element(), renderedArgs = { element: $element }; var contentTemplate = this._getTemplate(this._getAnonymousTemplateName()); if (contentTemplate) { contentTemplate.render({ container: $element.empty(), noModel: true }) } this._setRenderedState($element); $element.trigger("dxcontentrendered"); this._actions.onRendered([renderedArgs]); this._isRendered = true; return this._animate() }, _setLoadingState: function() { var $element = this.element(), hasCustomLoadIndicator = !!$element.find("." + VISIBLE_WHILE_PENDING_RENDERING_CLASS).length; $element.addClass(PENDING_RENDERING_CLASS); if (!hasCustomLoadIndicator) { $element.children().addClass(INVISIBLE_WHILE_PENDING_RENDERING_CLASS) } if (this.option("showLoadIndicator")) { this._showLoadIndicator($element) } }, _showLoadIndicator: function($container) { this._$loadIndicator = new LoadIndicator($("<div/>"), { visible: true }).element().addClass(DEFER_DEFER_RENDERING_LOAD_INDICATOR); $("<div/>").addClass(LOADINDICATOR_CONTAINER_CLASS).addClass(DEFER_RENDERING_LOADINDICATOR_CONTAINER_CLASS).append(this._$loadIndicator).appendTo($container) }, _setRenderedState: function() { var $element = this.element(); if (this._$loadIndicator) { this._$loadIndicator.remove() } $element.removeClass(PENDING_RENDERING_CLASS); $element.removeClass(PENDING_RENDERING_ACTIVE_CLASS); domUtils.triggerShownEvent($element.children()) }, _optionChanged: function(args) { var value = args.value, previousValue = args.previousValue; switch (args.name) { case "renderWhen": if (false === previousValue && true === value) { this._renderOrAnimate() } else { if (true === previousValue && false === value) { this._setLoadingState() } } break; case "showLoadIndicator": case "onRendered": case "onShown": break; default: this.callBase(args) } }, _renderOrAnimate: function() { var result; if (this._isRendered) { this._setRenderedState(); result = this._animate() } else { result = this._renderDeferredContent() } return result }, renderContent: function() { return this._renderOrAnimate() }, _dispose: function() { this.transitionExecutor.stop(true); if (this._renderTask) { this._renderTask.abort() } this._actions = null; this._$initialContent = null; this.callBase() } }); registerComponent("dxDeferRendering", DeferRendering); module.exports = DeferRendering }, /*!********************************!*\ !*** ./js/ui/drop_down_box.js ***! \********************************/ function(module, exports, __webpack_require__) { var DropDownEditor = __webpack_require__( /*! ./drop_down_editor/ui.drop_down_editor */ 210), DataExpressionMixin = __webpack_require__( /*! ./editor/ui.data_expression */ 251), commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), selectors = __webpack_require__( /*! ./widget/jquery.selectors */ 102), KeyboardProcessor = __webpack_require__( /*! ./widget/ui.keyboard_processor */ 101), when = __webpack_require__( /*! ../integration/jquery/deferred */ 16).when, $ = __webpack_require__( /*! ../core/renderer */ 9), grep = __webpack_require__( /*! ../core/utils/common */ 14).grep, extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57); var DROP_DOWN_BOX_CLASS = "dx-dropdownbox", DIMENSION_DEPENDENT_OPTIONS = ["width", "height", "maxWidth", "maxHeight", "minWidth", "minHeight"]; var DropDownBox = DropDownEditor.inherit({ _supportedKeys: function() { return extend({}, this.callBase(), { tab: function(e) { if (!this.option("opened")) { return } var $tabbableElements = this._getTabbableElements(), $focusableElement = e.shiftKey ? $tabbableElements.last() : $tabbableElements.first(); $focusableElement && $focusableElement.focus(); e.preventDefault() } }) }, _getTabbableElements: function() { return this._getElements().filter(selectors.tabbable) }, _getElements: function() { return this.content().find("*") }, _getDefaultOptions: function() { return extend(this.callBase(), { acceptCustomValue: false, contentTemplate: null, dropDownOptions: {}, openOnFieldClick: true, valueFormat: function(value) { return Array.isArray(value) ? value.join(", ") : value } }) }, _init: function() { this.callBase(); this._initDataExpressions() }, _render: function() { this._renderSubmitElement(); this.callBase(); this.element().addClass(DROP_DOWN_BOX_CLASS) }, _renderSubmitElement: function() { this._$submitElement = $("<input>").attr("type", "hidden").appendTo(this.element()) }, _renderValue: function() { this._setSubmitValue(); this.callBase() }, _setSubmitValue: function() { var value = this.option("value"), submitValue = "this" === this.option("valueExpr") ? this._displayGetter(value) : value; this._$submitElement.val(submitValue) }, _getSubmitElement: function() { return this._$submitElement }, _renderInputValue: function() { var callBase = this.callBase.bind(this), currentValue = this._getCurrentValue(), keys = commonUtils.ensureDefined(currentValue, []), values = []; keys = Array.isArray(keys) ? keys : [keys]; var itemLoadDeferreds = $.map(keys, function(key) { return this._loadItem(key).always(function(item) { var displayValue = this._displayGetter(item); if (commonUtils.isDefined(displayValue)) { values.push(displayValue) } }.bind(this)) }.bind(this)); when.apply(this, itemLoadDeferreds).done(function() { this.option("displayValue", values); callBase(values.length && values) }.bind(this)).fail(callBase); return itemLoadDeferreds }, _loadItem: function(value) { var selectedItem = grep(this.option("items") || [], function(item) { return this._isValueEquals(this._valueGetter(item), value) }.bind(this))[0]; return void 0 !== selectedItem ? $.Deferred().resolve(selectedItem).promise() : this._loadValue(value) }, _clearValueHandler: function(e) { e.stopPropagation(); this.reset() }, _updatePopupWidth: function() { this._setPopupOption("width", this.element().outerWidth()) }, _dimensionChanged: function() { this._popup && !this.option("dropDownOptions.width") && this._updatePopupWidth() }, _popupElementTabHandler: function(e) { if ("tab" !== e.key) { return } var $firstTabbable = this._getTabbableElements().first().get(0), $lastTabbable = this._getTabbableElements().last().get(0), $target = e.originalEvent.target, moveBackward = !!($target === $firstTabbable && e.shift), moveForward = !!($target === $lastTabbable && !e.shift); if (moveBackward || moveForward) { this.close(); this._input().focus(); if (moveBackward) { e.originalEvent.preventDefault() } } }, _renderPopup: function(e) { this.callBase(); if (this.option("focusStateEnabled")) { this._popup._keyboardProcessor.push(new KeyboardProcessor({ element: this.content(), handler: this._popupElementTabHandler, context: this })) } }, _popupConfig: function() { return extend(this.callBase(), { width: this.element().outerWidth(), height: "auto", tabIndex: -1, dragEnabled: false, focusStateEnabled: this.option("focusStateEnabled"), onPositioned: null, maxHeight: this._getMaxHeight.bind(this) }, this.option("dropDownOptions")) }, _getMaxHeight: function() { var $element = this.element(), offset = $element.offset(), windowHeight = $(window).height(), maxHeight = windowHeight - offset.top - $element.outerHeight(); return .9 * maxHeight }, _popupShownHandler: function() { this.callBase(); var $firstElement = this._getTabbableElements().first(); $firstElement.focus() }, _popupOptionChanged: function(args) { var options = {}; if (args.name === args.fullName) { options = args.value } else { var option = args.fullName.split(".").pop(); options[option] = args.value } this._setPopupOption(options); Object.keys(options).every(function(option) { if (DIMENSION_DEPENDENT_OPTIONS.indexOf(option) >= 0) { this._dimensionChanged(); return false } return true }, this) }, _setCollectionWidgetOption: commonUtils.noop, _optionChanged: function(args) { this._dataExpressionOptionChanged(args); switch (args.name) { case "width": this.callBase(args); this._dimensionChanged(); break; case "dropDownOptions": this._popupOptionChanged(args); break; case "dataSource": this._renderInputValue(); break; case "displayValue": this.option("text", args.value); break; case "displayExpr": this._renderValue(); break; default: this.callBase(args) } } }).include(DataExpressionMixin); registerComponent("dxDropDownBox", DropDownBox); module.exports = DropDownBox }, /*!*********************************!*\ !*** ./js/ui/drop_down_menu.js ***! \*********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), devices = __webpack_require__( /*! ../core/devices */ 53), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, Widget = __webpack_require__( /*! ./widget/ui.widget */ 95), Button = __webpack_require__( /*! ./button */ 201), Popover = __webpack_require__( /*! ./popover */ 207), DataHelperMixin = __webpack_require__( /*! ../data_helper */ 152), List = __webpack_require__( /*! ./list */ 218), ChildDefaultTemplate = __webpack_require__( /*! ./widget/child_default_template */ 100); var DROP_DOWN_MENU_CLASS = "dx-dropdownmenu", DROP_DOWN_MENU_POPUP_CLASS = "dx-dropdownmenu-popup", DROP_DOWN_MENU_POPUP_WRAPPER_CLASS = "dx-dropdownmenu-popup-wrapper", DROP_DOWN_MENU_LIST_CLASS = "dx-dropdownmenu-list", DROP_DOWN_MENU_BUTTON_CLASS = "dx-dropdownmenu-button"; var POPUP_OPTION_MAP = { popupWidth: "width", popupHeight: "height" }; var BUTTON_OPTION_MAP = { buttonIcon: "icon", buttonText: "text", buttonWidth: "width", buttonHeight: "height", buttonTemplate: "template" }; var DropDownMenu = Widget.inherit({ _supportedKeys: function() { var extension = {}; if (!this.option("opened") || !this._list.option("focusedElement")) { extension = this._button._supportedKeys() } return extend(this.callBase(), extension, { tab: function() { this._popup && this._popup.hide() } }) }, _setDeprecatedOptions: function() { this.callBase(); extend(this._deprecatedOptions, { buttonIconSrc: { since: "15.1", alias: "buttonIcon" } }) }, _getDefaultOptions: function() { return extend(this.callBase(), { items: [], onItemClick: null, dataSource: null, itemTemplate: "item", buttonText: "", buttonIcon: "overflow", buttonWidth: void 0, buttonHeight: void 0, buttonTemplate: "content", onButtonClick: null, usePopover: false, popupWidth: "auto", popupHeight: "auto", activeStateEnabled: true, hoverStateEnabled: true, opened: false, deferRendering: false, popupPosition: { my: "top center", at: "bottom center", collision: "fit flip", offset: { v: 1 } }, popupAnimation: void 0, onItemRendered: null, menuWidget: List }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: [{ platform: "ios" }], options: { usePopover: true } }, { device: [{ platform: "generic" }], options: { popupPosition: { offset: { v: 4 } } } }, { device: function() { return "desktop" === devices.real().deviceType && !devices.isSimulator() }, options: { focusStateEnabled: true } }, { device: [{ platform: "android" }], options: { popupPosition: { my: "top " + (this.option("rtlEnabled") ? "left" : "right"), at: "top " + (this.option("rtlEnabled") ? "left" : "right"), collision: "flipfit" }, popupAnimation: { show: { type: "pop", duration: 200, from: { scale: 0 }, to: { scale: 1 } }, hide: { type: "pop", duration: 200, from: { scale: 1 }, to: { scale: 0 } } } } }]) }, _initOptions: function(options) { if ("android" === devices.current().platform) { if (!options.popupPosition) { options.popupPosition = { at: (options.usePopover ? "bottom " : "top ") + (options.rtlEnabled ? "left" : "right") } } } this.callBase(options) }, _dataSourceOptions: function() { return { paginate: false } }, _init: function() { this.callBase(); this.element().addClass(DROP_DOWN_MENU_CLASS); this._initDataSource(); this._initItemClickAction(); this._initButtonClickAction() }, _initItemClickAction: function() { this._itemClickAction = this._createActionByOption("onItemClick") }, _initButtonClickAction: function() { this._buttonClickAction = this._createActionByOption("onButtonClick") }, _initTemplates: function() { this.callBase(); this._defaultTemplates.item = new ChildDefaultTemplate("item", this); this._defaultTemplates.content = new ChildDefaultTemplate("content", this) }, _render: function() { this._renderButton(); this.callBase(); this.setAria({ role: "menubar", haspopup: true, expanded: this.option("opened") }) }, _renderContentImpl: function() { if (this.option("opened")) { this._renderPopup() } }, _clean: function() { this._cleanFocusState(); if (this._popup) { this._popup.element().remove(); delete this._$popup } }, _renderButton: function() { var $button = this.element().addClass(DROP_DOWN_MENU_BUTTON_CLASS), config = this._buttonOptions(); this._button = this._createComponent($button, Button, config) }, _buttonOptions: function() { return { text: this.option("buttonText"), icon: this.option("buttonIcon"), width: this.option("buttonWidth"), height: this.option("buttonHeight"), template: this.option("buttonTemplate"), focusStateEnabled: false, onClick: function(e) { this.option("opened", !this.option("opened")); this._buttonClickAction(e) }.bind(this) } }, _toggleMenuVisibility: function(opened) { var state = void 0 === opened ? !this._popup.option("visible") : opened; if (opened) { this._renderPopup() } this._popup.toggle(state); this.setAria("expanded", state) }, _renderPopup: function() { if (this._$popup) { return } var $popup = this._$popup = $("<div>").appendTo(this.element()), config = this._popupOptions(); this._popup = this._createComponent($popup, Popover, config) }, _popupOptions: function() { var usePopup = !this.option("usePopover"); return { onInitialized: function(args) { args.component._wrapper().addClass(DROP_DOWN_MENU_POPUP_WRAPPER_CLASS).toggleClass(DROP_DOWN_MENU_POPUP_CLASS, usePopup) }, visible: this.option("opened"), onContentReady: this._popupContentReadyHandler.bind(this), deferRendering: false, position: this.option("popupPosition"), animation: this.option("popupAnimation"), onOptionChanged: function(args) { if ("visible" === args.name) { this.option("opened", args.value) } }.bind(this), target: this.element(), height: this.option("popupHeight"), width: this.option("popupWidth") } }, _popupContentReadyHandler: function() { var popup = Popover.getInstance(this._$popup); this._renderList(popup) }, _renderList: function(instance) { var $content = instance.content(), listConfig = this._listOptions(); $content.addClass(DROP_DOWN_MENU_LIST_CLASS); this._list = this._createComponent($content, this.option("menuWidget"), listConfig); this._list._getAriaTarget = function() { return this.element() }.bind(this); this._setListDataSource(); var listMaxHeight = .5 * $(window).height(); if ($content.height() > listMaxHeight) { $content.height(listMaxHeight) } }, _listOptions: function() { return { _keyboardProcessor: this._listProcessor, pageLoadMode: "scrollBottom", indicateLoading: false, noDataText: "", itemTemplate: this._getTemplateByOption("itemTemplate"), onItemClick: function(e) { this.option("opened", false); this._itemClickAction(e) }.bind(this), tabIndex: -1, focusStateEnabled: this.option("focusStateEnabled"), activeStateEnabled: this.option("activeStateEnabled"), onItemRendered: this.option("onItemRendered"), _itemAttributes: { role: "menuitem" } } }, _setListDataSource: function() { if (this._list) { this._list.option("dataSource", this._dataSource || this.option("items")) } delete this._deferRendering }, _attachKeyboardEvents: function() { this.callBase.apply(this, arguments); this._listProcessor = this._keyboardProcessor.attachChildProcessor(); if (this._list) { this._list.option("_keyboardProcessor", this._listProcessor) } }, _cleanFocusState: function() { this.callBase.apply(this, arguments); delete this._listProcessor }, _toggleVisibility: function(visible) { this.callBase(visible); this._button.option("visible", visible) }, _optionChanged: function(args) { var name = args.name; var value = args.value; switch (name) { case "items": case "dataSource": if (this.option("deferRendering") && !this.option("opened")) { this._deferRendering = true } else { this._refreshDataSource(); this._setListDataSource() } break; case "itemTemplate": if (this._list) { this._list.option(name, this._getTemplate(value)) } break; case "onItemClick": this._initItemClickAction(); break; case "onButtonClick": this._buttonClickAction(); break; case "buttonIcon": case "buttonText": case "buttonWidth": case "buttonHeight": case "buttonTemplate": this._button.option(BUTTON_OPTION_MAP[name], value); this._renderPopup(); break; case "popupWidth": case "popupHeight": this._popup.option(POPUP_OPTION_MAP[name], value); break; case "usePopover": case "menuWidget": this._invalidate(); break; case "focusStateEnabled": case "activeStateEnabled": if (this._list) { this._list.option(name, value) } this.callBase(args); break; case "onItemRendered": if (this._list) { this._list.option(name, value) } break; case "opened": if (this._deferRendering) { this._refreshDataSource(); this._setListDataSource() } this._toggleMenuVisibility(value); break; case "deferRendering": case "popupPosition": break; default: this.callBase(args) } }, open: function() { this.option("opened", true) }, close: function() { this.option("opened", false) } }).include(DataHelperMixin); registerComponent("dxDropDownMenu", DropDownMenu); module.exports = DropDownMenu }, /*!********************************!*\ !*** ./js/ui/file_uploader.js ***! \********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../core/utils/array */ 26).inArray, Editor = __webpack_require__( /*! ./editor/editor */ 106), Button = __webpack_require__( /*! ./button */ 201), ProgressBar = __webpack_require__( /*! ./progress_bar */ 283), browser = __webpack_require__( /*! ../core/utils/browser */ 23), devices = __webpack_require__( /*! ../core/devices */ 53), eventUtils = __webpack_require__( /*! ../events/utils */ 71), clickEvent = __webpack_require__( /*! ../events/click */ 75), messageLocalization = __webpack_require__( /*! ../localization/message */ 89); var FILEUPLOADER_CLASS = "dx-fileuploader", FILEUPLOADER_EMPTY_CLASS = "dx-fileuploader-empty", FILEUPLOADER_SHOW_FILE_LIST_CLASS = "dx-fileuploader-show-file-list", FILEUPLOADER_DRAGOVER_CLASS = "dx-fileuploader-dragover", FILEUPLOADER_FILEINPUT_TAG = "<input type='file'>", FILEUPLOADER_WRAPPER_CLASS = "dx-fileuploader-wrapper", FILEUPLOADER_CONTAINER_CLASS = "dx-fileuploader-container", FILEUPLOADER_CONTENT_CLASS = "dx-fileuploader-content", FILEUPLOADER_INPUT_WRAPPER_CLASS = "dx-fileuploader-input-wrapper", FILEUPLOADER_INPUT_CONTAINER_CLASS = "dx-fileuploader-input-container", FILEUPLOADER_INPUT_LABEL_CLASS = "dx-fileuploader-input-label", FILEUPLOADER_INPUT_CLASS = "dx-fileuploader-input", FILEUPLOADER_FILES_CONTAINER_CLASS = "dx-fileuploader-files-container", FILEUPLOADER_FILE_CONTAINER_CLASS = "dx-fileuploader-file-container", FILEUPLOADER_FILE_INFO_CLASS = "dx-fileuploader-file-info", FILEUPLOADER_FILE_STATUS_MESSAGE_CLASS = "dx-fileuploader-file-status-message", FILEUPLOADER_FILE_CLASS = "dx-fileuploader-file", FILEUPLOADER_FILE_NAME_CLASS = "dx-fileuploader-file-name", FILEUPLOADER_FILE_SIZE_CLASS = "dx-fileuploader-file-size", FILEUPLOADER_BUTTON_CLASS = "dx-fileuploader-button", FILEUPLOADER_BUTTON_CONTAINER_CLASS = "dx-fileuploader-button-container", FILEUPLOADER_CANCEL_BUTTON_CLASS = "dx-fileuploader-cancel-button", FILEUPLOADER_UPLOAD_BUTTON_CLASS = "dx-fileuploader-upload-button", FILEUPLOADER_AFTER_LOAD_DELAY = 400; var isFormDataSupported = function() { return !!window.FormData }; var FileUploader = Editor.inherit({ _supportedKeys: function() { var click = function(e) { e.preventDefault(); var $selectButton = this._selectButton.element(); $selectButton.trigger(clickEvent.name) }; return extend(this.callBase(), { space: click, enter: click }) }, _setOptionsByReference: function() { this.callBase(); extend(this._optionsByReference, { value: true }) }, _setDeprecatedOptions: function() { this.callBase(); extend(this._deprecatedOptions, { buttonText: { since: "15.1", alias: "selectButtonText" }, values: { since: "16.1", alias: "value" } }) }, _getDefaultOptions: function() { return extend(this.callBase(), { value: [], selectButtonText: messageLocalization.format("dxFileUploader-selectFile"), uploadButtonText: messageLocalization.format("dxFileUploader-upload"), labelText: messageLocalization.format("dxFileUploader-dropFile"), name: "files[]", multiple: false, accept: "", uploadUrl: "/", allowCanceling: true, showFileList: true, progress: 0, readyToUploadMessage: messageLocalization.format("dxFileUploader-readyToUpload"), uploadedMessage: messageLocalization.format("dxFileUploader-uploaded"), uploadFailedMessage: messageLocalization.format("dxFileUploader-uploadFailedMessage"), uploadMode: "instantly", uploadMethod: "POST", uploadHeaders: {}, onUploadStarted: null, onUploaded: null, onProgress: null, onUploadError: null, onUploadAborted: null, extendSelection: true, validationMessageMode: "always", validationMessageOffset: { h: 0, v: 0 }, useNativeInputClick: false, useDragOver: true, nativeDropSupported: true }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function() { return "desktop" === devices.real().deviceType && !devices.isSimulator() }, options: { focusStateEnabled: true } }, { device: [{ platform: "android" }, { platform: "win" }], options: { validationMessageOffset: { v: 0 } } }, { device: function() { return browser.msie && browser.version <= 10 }, options: { uploadMode: "useForm", useNativeInputClick: true } }, { device: function() { return "generic" !== devices.real().platform }, options: { useDragOver: false } }, { device: function() { return !isFormDataSupported() }, options: { uploadMode: "useForm" } }, { device: function() { return browser.msie || "generic" !== devices.real().platform }, options: { nativeDropSupported: false } }]) }, _init: function() { this.callBase.apply(this, arguments); this._initFileInput(); this._initLabel(); this._createFiles(); this._createUploadStartedAction(); this._createUploadedAction(); this._createProgressAction(); this._createUploadErrorAction(); this._createUploadAbortedAction() }, _initFileInput: function() { this._isCustomClickEvent = false; if (!this._$fileInput) { this._$fileInput = $(FILEUPLOADER_FILEINPUT_TAG); this._$fileInput.on("change", this._inputChangeHandler.bind(this)).on("click", function(e) { e.stopPropagation(); return this.option("useNativeInputClick") || this._isCustomClickEvent }.bind(this)) } this._$fileInput.prop({ multiple: this.option("multiple"), accept: this.option("accept"), tabindex: -1 }) }, _inputChangeHandler: function() { if (this._doPreventInputChange) { return } var fileName = this._$fileInput.val().replace(/^.*\\/, ""), files = this._$fileInput.prop("files"); if (files && !files.length) { return } var value = files ? this._getFiles(files) : [{ name: fileName }]; this._changeValue(value); if ("instantly" === this.option("uploadMode")) { this._uploadFiles() } }, _shouldFileListBeExtended: function() { return "useForm" !== this.option("uploadMode") && this.option("extendSelection") && this.option("multiple") }, _removeDuplicates: function(files, value) { var result = []; for (var i = 0; i < value.length; i++) { if (!this._isFileInArray(files, value[i])) { result.push(value[i]) } } return result }, _isFileInArray: function(files, file) { for (var i = 0; i < files.length; i++) { var item = files[i]; if (item.size === file.size && item.name === file.name) { return true } } return false }, _changeValue: function(value) { var files = this._shouldFileListBeExtended() ? this.option("value").slice() : []; if ("instantly" !== this.option("uploadMode")) { value = this._removeDuplicates(files, value) } this.option("value", files.concat(value)) }, _getFiles: function(fileList) { var values = []; $.each(fileList, function(_, value) { values.push(value) }); return values }, _initLabel: function() { if (!this._$inputLabel) { this._$inputLabel = $("<div>") } this._$inputLabel.text(this.option("labelText")) }, _focusTarget: function() { return this.element().find("." + FILEUPLOADER_BUTTON_CLASS) }, _getSubmitElement: function() { return this._$fileInput }, _render: function() { this.element().addClass(FILEUPLOADER_CLASS); this._renderWrapper(); this._renderInputWrapper(); this._renderDragEvents(); this._renderSelectButton(); this._renderInputContainer(); this._renderFiles(); this._renderUploadButton(); this.callBase.apply(this, arguments) }, _createFiles: function() { var value = this.option("value"); if (!this._files || 0 === value.length || !this._shouldFileListBeExtended()) { this._files = [] } $.each(value.slice(this._files.length), function(_, value) { this._files.push(this._createFile(value)) }.bind(this)) }, _createUploadStartedAction: function() { this._uploadStartedAction = this._createActionByOption("onUploadStarted") }, _createUploadedAction: function() { this._uploadedAction = this._createActionByOption("onUploaded") }, _createProgressAction: function() { this._progressAction = this._createActionByOption("onProgress") }, _createUploadAbortedAction: function() { this._uploadAbortedAction = this._createActionByOption("onUploadAborted") }, _createUploadErrorAction: function() { this._uploadErrorAction = this._createActionByOption("onUploadError") }, _createFile: function(value) { return { value: value, loadedSize: 0, onProgress: $.Callbacks(), onAbort: $.Callbacks(), onLoad: $.Callbacks(), onError: $.Callbacks(), onLoadStart: $.Callbacks() } }, _renderFiles: function() { var value = this.option("value"); if (!this._$filesContainer) { this._$filesContainer = $("<div>").addClass(FILEUPLOADER_FILES_CONTAINER_CLASS).appendTo(this._$content) } else { if (!this._shouldFileListBeExtended() || 0 === value.length) { this._$filesContainer.empty() } } var showFileList = this.option("showFileList"); if (showFileList) { var that = this; $.each(this._files, function(_, file) { if (!file.$file) { that._renderFile(file) } }) } this.element().toggleClass(FILEUPLOADER_SHOW_FILE_LIST_CLASS, showFileList); this.element().toggleClass(FILEUPLOADER_EMPTY_CLASS, !this._files.length); this._updateFileNameMaxWidth(); this._$validationMessage && this._$validationMessage.dxOverlay("instance").repaint() }, _renderFile: function(file) { var value = file.value; var $fileContainer = $("<div>").addClass(FILEUPLOADER_FILE_CONTAINER_CLASS).appendTo(this._$filesContainer); this._renderFileButtons(file, $fileContainer); file.$file = $("<div>").addClass(FILEUPLOADER_FILE_CLASS).appendTo($fileContainer); var $fileInfo = $("<div>").addClass(FILEUPLOADER_FILE_INFO_CLASS).appendTo(file.$file); file.$statusMessage = $("<div>").addClass(FILEUPLOADER_FILE_STATUS_MESSAGE_CLASS).text(this.option("readyToUploadMessage")).appendTo(file.$file); $("<div>").addClass(FILEUPLOADER_FILE_NAME_CLASS).text(value.name).appendTo($fileInfo); if (commonUtils.isDefined(value.size)) { $("<div>").addClass(FILEUPLOADER_FILE_SIZE_CLASS).text(this._getFileSize(value.size)).appendTo($fileInfo) } }, _updateFileNameMaxWidth: function() { var cancelButtonsCount = this.option("allowCanceling") && "useForm" !== this.option("uploadMode") ? 1 : 0, uploadButtonsCount = "useButtons" === this.option("uploadMode") ? 1 : 0, filesContainerWidth = this._$filesContainer.width(), $buttonContainer = this._$filesContainer.find("." + FILEUPLOADER_BUTTON_CONTAINER_CLASS).eq(0), buttonsWidth = $buttonContainer.width() * (cancelButtonsCount + uploadButtonsCount), $fileSize = this._$filesContainer.find("." + FILEUPLOADER_FILE_SIZE_CLASS).eq(0); var prevFileSize = $fileSize.text(); $fileSize.text("1000 Mb"); var fileSizeWidth = $fileSize.width(); $fileSize.text(prevFileSize); this._$filesContainer.find("." + FILEUPLOADER_FILE_NAME_CLASS).css("max-width", filesContainerWidth - buttonsWidth - fileSizeWidth) }, _renderFileButtons: function(file, $container) { var $cancelButton = this._getCancelButton(file); $cancelButton && $container.append($cancelButton); var $uploadButton = this._getUploadButton(file); $uploadButton && $container.append($uploadButton) }, _getCancelButton: function(file) { if ("useForm" === this.option("uploadMode")) { return null } file.cancelButton = this._createComponent($("<div>").addClass(FILEUPLOADER_BUTTON_CLASS + " " + FILEUPLOADER_CANCEL_BUTTON_CLASS), Button, { onClick: function() { this._removeFile(file) }.bind(this), icon: "close", visible: this.option("allowCanceling"), integrationOptions: {} }); return $("<div>").addClass(FILEUPLOADER_BUTTON_CONTAINER_CLASS).append(file.cancelButton.element()) }, _getUploadButton: function(file) { if ("useButtons" !== this.option("uploadMode")) { return null } file.uploadButton = this._createComponent($("<div>").addClass(FILEUPLOADER_BUTTON_CLASS + " " + FILEUPLOADER_UPLOAD_BUTTON_CLASS), Button, { onClick: function() { this._uploadFile(file) }.bind(this), icon: "upload" }); file.onLoadStart.add(function() { file.uploadButton.element().remove() }.bind(this)); return $("<div>").addClass(FILEUPLOADER_BUTTON_CONTAINER_CLASS).append(file.uploadButton.element()) }, _removeFile: function(file) { file.$file.parent().remove(); this._files.splice(inArray(file, this._files), 1); var value = this.option("value").slice(); value.splice(inArray(file.value, value), 1); this._doPreventRecreatingFiles = true; this.option("value", value); this._doPreventRecreatingFiles = false; this.element().toggleClass(FILEUPLOADER_EMPTY_CLASS, !this._files.length); this._doPreventInputChange = true; this._$fileInput.val(""); this._doPreventInputChange = false }, _getFileSize: function(size) { var i = 0, labels = [messageLocalization.format("dxFileUploader-bytes"), messageLocalization.format("dxFileUploader-kb"), messageLocalization.format("dxFileUploader-Mb"), messageLocalization.format("dxFileUploader-Gb")], count = labels.length - 1; while (i < count && size >= 1024) { size /= 1024; i++ } return Math.round(size) + " " + labels[i] }, _renderSelectButton: function() { var $button = $("<div>").addClass(FILEUPLOADER_BUTTON_CLASS).appendTo(this._$inputWrapper); this._selectButton = this._createComponent($button, Button, { text: this.option("selectButtonText"), focusStateEnabled: false, integrationOptions: {} }); if ("desktop" === devices.real().deviceType) { this._selectButton.option("onClick", this._selectButtonClickHandler.bind(this)) } else { $button.off("click").on("click", this._selectButtonClickHandler.bind(this)) } }, _selectButtonClickHandler: function() { var that = this; if (that.option("useNativeInputClick")) { return } if (that.option("disabled")) { return false } that._isCustomClickEvent = true; that._$fileInput.trigger("click"); that._isCustomClickEvent = false }, _renderUploadButton: function() { if ("useButtons" !== this.option("uploadMode")) { return } var $uploadButton = $("<div>").addClass(FILEUPLOADER_BUTTON_CLASS).addClass(FILEUPLOADER_UPLOAD_BUTTON_CLASS).appendTo(this._$content); this._uploadButton = this._createComponent($uploadButton, Button, { text: this.option("uploadButtonText"), onClick: this._uploadButtonClickHandler.bind(this), integrationOptions: {} }) }, _uploadButtonClickHandler: function() { this._uploadFiles() }, _shouldDragOverBeRendered: function() { return "useForm" !== this.option("uploadMode") || this.option("nativeDropSupported") }, _renderInputContainer: function() { this._$inputContainer = $("<div>").addClass(FILEUPLOADER_INPUT_CONTAINER_CLASS).appendTo(this._$inputWrapper); if (!this._shouldDragOverBeRendered()) { this._$inputContainer.css("display", "none") } this._$fileInput.addClass(FILEUPLOADER_INPUT_CLASS); this._renderInput(); this._$inputLabel.addClass(FILEUPLOADER_INPUT_LABEL_CLASS).appendTo(this._$inputContainer) }, _renderInput: function() { if (this.option("useNativeInputClick")) { this._selectButton.option("template", this._selectButtonInputTemplate.bind(this)) } else { this._$fileInput.appendTo(this._$inputContainer); this._selectButton.option("template", "content") } }, _selectButtonInputTemplate: function(data, $content) { var $text = $("<span>").addClass("dx-button-text").text(data.text); $content.append($text).append(this._$fileInput); return $content }, _renderInputWrapper: function() { this._$inputWrapper = $("<div>").addClass(FILEUPLOADER_INPUT_WRAPPER_CLASS).appendTo(this._$content) }, _renderDragEvents: function() { this._$inputWrapper.off("." + this.NAME); if (!this._shouldDragOverBeRendered()) { return } this._dragEventsCount = 0; this._$inputWrapper.on(eventUtils.addNamespace("dragenter", this.NAME), this._dragEnterHandler.bind(this)).on(eventUtils.addNamespace("dragover", this.NAME), this._dragOverHandler.bind(this)).on(eventUtils.addNamespace("dragleave", this.NAME), this._dragLeaveHandler.bind(this)).on(eventUtils.addNamespace("drop", this.NAME), this._dropHandler.bind(this)) }, _useInputForDrop: function() { return this.option("nativeDropSupported") && "useForm" === this.option("uploadMode") }, _dragEnterHandler: function(e) { if (this.option("disabled")) { return false } if (!this._useInputForDrop()) { e.preventDefault() } this._dragEventsCount++; this.element().addClass(FILEUPLOADER_DRAGOVER_CLASS) }, _dragOverHandler: function(e) { if (!this._useInputForDrop()) { e.preventDefault() } }, _dragLeaveHandler: function(e) { if (!this._useInputForDrop()) { e.preventDefault() } this._dragEventsCount--; if (this._dragEventsCount <= 0) { this.element().removeClass(FILEUPLOADER_DRAGOVER_CLASS) } }, _dropHandler: function(e) { this._dragEventsCount = 0; this.element().removeClass(FILEUPLOADER_DRAGOVER_CLASS); if (this._useInputForDrop()) { return } e.preventDefault(); var fileList = e.originalEvent.dataTransfer.files, files = this._getFiles(fileList); if (!this.option("multiple") && files.length > 1) { return } this._changeValue(this._filterFiles(files)); if ("instantly" === this.option("uploadMode")) { this._uploadFiles() } }, _filterFiles: function(files) { if (!files.length) { return files } var accept = this.option("accept"); if (!accept.length) { return files } var result = [], allowedTypes = this._getAllowedFileTypes(accept); for (var i = 0, n = files.length; i < n; i++) { if (this._isFileTypeAllowed(files[i], allowedTypes)) { result.push(files[i]) } } return result }, _getAllowedFileTypes: function(acceptSting) { if (!acceptSting.length) { return [] } return acceptSting.split(",").map(function(item) { return item.trim() }) }, _isFileTypeAllowed: function(file, allowedTypes) { for (var i = 0, n = allowedTypes.length; i < n; i++) { var allowedType = allowedTypes[i]; if ("." === allowedType[0]) { allowedType = allowedType.replace(".", "\\."); if (file.name.match(allowedType)) { return true } } else { allowedType = allowedType.replace("*", ""); if (file.type.match(allowedType)) { return true } } } return false }, _renderWrapper: function() { var $wrapper = $("<div>").addClass(FILEUPLOADER_WRAPPER_CLASS).appendTo(this.element()); var $container = $("<div>").addClass(FILEUPLOADER_CONTAINER_CLASS).appendTo($wrapper); this._$content = $("<div>").addClass(FILEUPLOADER_CONTENT_CLASS).appendTo($container) }, _clean: function() { this._$fileInput.detach(); delete this._$filesContainer; this.callBase.apply(this, arguments) }, _uploadFiles: function() { if (!isFormDataSupported()) { return } $.each(this._files, function(_, file) { this._uploadFile(file) }.bind(this)) }, _uploadFile: function(file) { if (file.uploadStarted) { return } var $file = file.$file, value = file.value; this._initUploadRequest(file); if ($file) { file.progressBar = this._createProgressBar(value.size); file.progressBar.element().appendTo($file); this._initStatusMessage(file); this._initCancelButton(file) } file.onLoadStart.add(this._onUploadStarted.bind(this, file)); file.onLoad.add(this._onLoadedHandler.bind(this, file)); file.onError.add(this._onErrorHandler.bind(this, file)); file.onAbort.add(this._onAbortHandler.bind(this, file)); file.onProgress.add(this._onProgressHandler.bind(this, file)); file.request.send(this._createFormData(this.option("name"), value)) }, _onUploadStarted: function(file, e) { file.uploadStarted = true; this._uploadStartedAction({ file: file.value, jQueryEvent: e, request: file.request }) }, _onErrorHandler: function(file, e) { var that = this; setTimeout(function() { if (that.option("showFileList")) { file.$statusMessage.text(that.option("uploadFailedMessage")); file.$statusMessage.css("display", ""); file.progressBar.element().remove() } }, FILEUPLOADER_AFTER_LOAD_DELAY); this._uploadErrorAction({ file: file.value, jQueryEvent: e, request: file.request }) }, _onAbortHandler: function(file, e) { this._uploadAbortedAction({ file: file.value, jQueryEvent: e, request: file.request }) }, _onLoadedHandler: function(file, e) { var that = this; setTimeout(function() { if (that.option("showFileList")) { file.$statusMessage.text(that.option("uploadedMessage")); file.$statusMessage.css("display", ""); file.progressBar.element().remove() } }, FILEUPLOADER_AFTER_LOAD_DELAY); this._uploadedAction({ file: file.value, jQueryEvent: e, request: file.request }) }, _onProgressHandler: function(file, e) { var totalSize = this._getTotalSize(), currentLoadedSize = 0, loadedSize = this._getLoadedSize(), progress = 0; if (file) { currentLoadedSize = Math.min(e.loaded, file.value.size); var segmentSize = currentLoadedSize - file.loadedSize; loadedSize += segmentSize; file.progressBar && file.progressBar.option({ value: currentLoadedSize, showStatus: true }); this._progressAction({ file: file.value, segmentSize: segmentSize, bytesLoaded: e.loaded, bytesTotal: e.total, jQueryEvent: e, request: file.request }); file.loadedSize = currentLoadedSize } if (totalSize) { progress = Math.round(loadedSize / totalSize * 100) } this.option("progress", progress); this._setLoadedSize(loadedSize) }, _initStatusMessage: function(file) { file.$statusMessage.css("display", "none") }, _initCancelButton: function(file) { var cancelClickHandler = function() { file.request.abort(); this._removeFile(file) }.bind(this); file.cancelButton.option("onClick", cancelClickHandler); var hideCancelButton = function() { setTimeout(function() { file.cancelButton.option({ visible: false }) }, FILEUPLOADER_AFTER_LOAD_DELAY) }; file.onLoad.add(hideCancelButton); file.onError.add(hideCancelButton) }, _initUploadRequest: function(file) { var that = this; file.request = this._createRequest(this.option("uploadUrl")); file.loadedSize = 0; this._initUploadHeaders(file.request); file.request.onreadystatechange = function(e) { if (4 === e.currentTarget.readyState) { var status = e.currentTarget.status; if (that._isStatusSuccess(status)) { this.onLoad.fire(e) } else { if (that._isStatusError(status) || !this._isProgressStarted) { this._isError = true; this.onError.fire(e) } } } }.bind(file); file.request.upload.onprogress = function(e) { if (this._isError) { return } this._isProgressStarted = true; this.onProgress.fire(e) }.bind(file); file.request.upload.onloadstart = function(e) { this.onLoadStart.fire(e) }.bind(file); file.request.upload.onabort = function(e) { this.onAbort.fire(e) }.bind(file) }, _initUploadHeaders: function(request) { var headers = this.option("uploadHeaders"); for (var name in headers) { if (headers.hasOwnProperty(name)) { request.setRequestHeader(name, headers[name]) } } }, _isStatusSuccess: function(status) { return 200 <= status && status < 300 }, _isStatusError: function(status) { return 400 <= status && status < 500 || 500 <= status && status < 600 }, _createRequest: function(url) { var request = new XMLHttpRequest; request.open(this.option("uploadMethod"), url, true); return request }, _createFormData: function(fieldName, fieldValue) { var formData = new FormData; formData.append(fieldName, fieldValue); return formData }, _createProgressBar: function(fileSize) { return this._createComponent($("<div>"), ProgressBar, { value: void 0, min: 0, max: fileSize, statusFormat: function(ratio) { return Math.round(100 * ratio) + "%" }, showStatus: false, statusPosition: "right" }) }, _getTotalSize: function() { if (!this._totalSize) { var value = this.option("value"), totalSize = 0; $.each(value, function(_, file) { totalSize += file.size }); this._totalSize = totalSize } return this._totalSize }, _getLoadedSize: function() { if (!this._loadedSize) { var loadedSize = 0; $.each(this._files, function(_, file) { loadedSize += file.loadedSize }); this._loadedSize = loadedSize } return this._loadedSize }, _setLoadedSize: function(value) { this._loadedSize = value }, _recalculateProgress: function() { delete this._totalSize; delete this._loadedSize; this._onProgressHandler() }, _getValidationMessageTarget: function() { return this._$inputWrapper }, _optionChanged: function(args) { var value = args.value; switch (args.name) { case "height": case "width": this._updateFileNameMaxWidth(); this.callBase(args); break; case "value": !value.length && this._$fileInput.val(""); if (!this._doPreventRecreatingFiles) { this._createFiles(); this._renderFiles() } this._recalculateProgress(); this.callBase(args); break; case "name": this._initFileInput(); this.callBase(args); break; case "accept": this._initFileInput(); break; case "multiple": this._initFileInput(); if (!args.value) { this.reset() } break; case "selectButtonText": this._selectButton.option("text", value); break; case "uploadButtonText": this._uploadButton && this._uploadButton.option("text", value); break; case "readyToUploadMessage": case "uploadedMessage": case "uploadFailedMessage": this._invalidate(); break; case "labelText": this._$inputLabel.text(value); break; case "showFileList": this._renderFiles(); break; case "uploadUrl": case "progress": case "uploadMethod": case "uploadHeaders": case "extendSelection": break; case "allowCanceling": case "uploadMode": this.reset(); this._invalidate(); break; case "onUploadStarted": this._createUploadStartedAction(); break; case "onUploaded": this._createUploadedAction(); break; case "onProgress": this._createProgressAction(); break; case "onUploadError": this._createUploadErrorAction(); break; case "onUploadAborted": this._createUploadAbortedAction(); break; case "useNativeInputClick": this._renderInput(); break; case "useDragOver": this._renderDragEvents(); break; case "nativeDropSupported": this._invalidate(); break; default: this.callBase(args) } }, reset: function() { this.option("value", []) } }); FileUploader.__internals = { changeFileInputTag: function(tag) { FILEUPLOADER_FILEINPUT_TAG = tag }, resetFileInputTag: function() { FILEUPLOADER_FILEINPUT_TAG = "<input type='file'>" } }; registerComponent("dxFileUploader", FileUploader); module.exports = FileUploader }, /*!*******************************!*\ !*** ./js/ui/progress_bar.js ***! \*******************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), TrackBar = __webpack_require__( /*! ./track_bar */ 284), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, isFunction = __webpack_require__( /*! ../core/utils/common */ 14).isFunction, registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57); var PROGRESSBAR_CLASS = "dx-progressbar", PROGRESSBAR_CONTAINER_CLASS = "dx-progressbar-container", PROGRESSBAR_RANGE_CONTAINER_CLASS = "dx-progressbar-range-container", PROGRESSBAR_RANGE_CLASS = "dx-progressbar-range", PROGRESSBAR_WRAPPER_CLASS = "dx-progressbar-wrapper", PROGRESSBAR_STATUS_CLASS = "dx-progressbar-status", PROGRESSBAR_INDETERMINATE_SEGMENT_CONTAINER = "dx-progressbar-animating-container", PROGRESSBAR_INDETERMINATE_SEGMENT = "dx-progressbar-animating-segment"; var ProgressBar = TrackBar.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { value: 0, statusFormat: function(ratio) { return "Progress: " + Math.round(100 * ratio) + "%" }, showStatus: true, onComplete: null, activeStateEnabled: false, statusPosition: "bottom left", _animatingSegmentCount: 0 }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: { platform: "win" }, options: { _animatingSegmentCount: 5 } }, { device: function(device) { return "android" === device.platform }, options: { _animatingSegmentCount: 2 } }]) }, _init: function() { this.callBase() }, _render: function() { this._createCompleteAction(); this._renderStatus(); this.callBase(); this.element().addClass(PROGRESSBAR_CLASS); this.setAria("role", "progressbar"); this._$wrapper.addClass(PROGRESSBAR_WRAPPER_CLASS); this._$bar.addClass(PROGRESSBAR_CONTAINER_CLASS); $("<div>").addClass(PROGRESSBAR_RANGE_CONTAINER_CLASS).appendTo(this._$wrapper).append(this._$bar); this._$range.addClass(PROGRESSBAR_RANGE_CLASS); this._toggleStatus(this.option("showStatus")) }, _createCompleteAction: function() { this._completeAction = this._createActionByOption("onComplete") }, _renderStatus: function() { this._$status = $("<div>").addClass(PROGRESSBAR_STATUS_CLASS) }, _renderIndeterminateState: function() { this._$segmentContainer = $("<div>").addClass(PROGRESSBAR_INDETERMINATE_SEGMENT_CONTAINER); var segments = this.option("_animatingSegmentCount"); for (var i = 0; i < segments; i++) { $("<div>").addClass(PROGRESSBAR_INDETERMINATE_SEGMENT).addClass(PROGRESSBAR_INDETERMINATE_SEGMENT + "-" + (i + 1)).appendTo(this._$segmentContainer) } this._$segmentContainer.appendTo(this._$wrapper) }, _toggleStatus: function(value) { var splitPosition = this.option("statusPosition").split(" "); if (value) { if ("top" === splitPosition[0] || "left" === splitPosition[0]) { this._$status.prependTo(this._$wrapper) } else { this._$status.appendTo(this._$wrapper) } } else { this._$status.detach() } this._togglePositionClass() }, _togglePositionClass: function() { var position = this.option("statusPosition"), splitPosition = position.split(" "); this._$wrapper.removeClass("dx-position-top-left dx-position-top-right dx-position-bottom-left dx-position-bottom-right dx-position-left dx-position-right"); var positionClass = "dx-position-" + splitPosition[0]; if (splitPosition[1]) { positionClass += "-" + splitPosition[1] } this._$wrapper.addClass(positionClass) }, _toggleIndeterminateState: function(value) { if (value) { this._renderIndeterminateState(); this._$bar.toggle(false) } else { this._$bar.toggle(true); this._$segmentContainer.remove(); delete this._$segmentContainer } }, _renderValue: function() { var val = this.option("value"), max = this.option("max"); if (!val && 0 !== val) { this._toggleIndeterminateState(true); return } if (this._$segmentContainer) { this._toggleIndeterminateState(false) } if (val === max) { this._completeAction() } this.callBase(); this._setStatus() }, _setStatus: function() { var format = this.option("statusFormat"); if (isFunction(format)) { format = format.bind(this) } else { format = function(value) { return value } } var statusText = format(this._currentRatio, this.option("value")); this._$status.text(statusText) }, _dispose: function() { this._$status.remove(); this.callBase() }, _optionChanged: function(args) { switch (args.name) { case "statusFormat": this._setStatus(); break; case "showStatus": this._toggleStatus(args.value); break; case "statusPosition": this._toggleStatus(this.option("showStatus")); break; case "onComplete": this._createCompleteAction(); break; case "_animatingSegmentCount": break; default: this.callBase(args) } } }); registerComponent("dxProgressBar", ProgressBar); module.exports = ProgressBar }, /*!****************************!*\ !*** ./js/ui/track_bar.js ***! \****************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), Editor = __webpack_require__( /*! ./editor/editor */ 106), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, fx = __webpack_require__( /*! ../animation/fx */ 68); var TRACKBAR_CLASS = "dx-trackbar", TRACKBAR_CONTAINER_CLASS = "dx-trackbar-container", TRACKBAR_RANGE_CLASS = "dx-trackbar-range", TRACKBAR_WRAPPER_CLASS = "dx-trackbar-wrapper"; var TrackBar = Editor.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { min: 0, max: 100, value: 0 }) }, _render: function() { this.element().addClass(TRACKBAR_CLASS); this._renderWrapper(); this._renderContainer(); this._renderRange(); this.callBase(); this._renderValue() }, _renderWrapper: function() { this._$wrapper = $("<div>").addClass(TRACKBAR_WRAPPER_CLASS).appendTo(this.element()) }, _renderContainer: function() { this._$bar = $("<div>").addClass(TRACKBAR_CONTAINER_CLASS).appendTo(this._$wrapper) }, _renderRange: function() { this._$range = $("<div>").addClass(TRACKBAR_RANGE_CLASS).appendTo(this._$bar) }, _renderValue: function() { var val = this.option("value"), min = this.option("min"), max = this.option("max"); if (min > max) { return } if (val < min) { this.option("value", min); this._currentRatio = 0; return } if (val > max) { this.option("value", max); this._currentRatio = 1; return } var ratio = min === max ? 0 : (val - min) / (max - min); !this._needPreventAnimation && this._setRangeStyles({ width: 100 * ratio + "%" }); this.setAria({ valuemin: this.option("min"), valuemax: max, valuenow: val }); this._currentRatio = ratio }, _setRangeStyles: function(options) { fx.stop(this._$range); if (!this._needPreventAnimation) { fx.animate(this._$range, { type: "custom", duration: 100, to: options }) } }, _optionChanged: function(args) { switch (args.name) { case "value": this._renderValue(); this.callBase(args); break; case "max": case "min": this._renderValue(); break; default: this.callBase(args) } }, _dispose: function() { fx.stop(this._$range); this.callBase() } }); registerComponent("dxTrackBar", TrackBar); module.exports = TrackBar }, /*!***********************!*\ !*** ./js/ui/form.js ***! \***********************/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__( /*! ./form/ui.form */ 286) }, /*!*******************************!*\ !*** ./js/ui/form/ui.form.js ***! \*******************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), Guid = __webpack_require__( /*! ../../core/guid */ 151), utils = __webpack_require__( /*! ../../core/utils/common */ 14), isEmptyObject = __webpack_require__( /*! ../../core/utils/type */ 12).isEmptyObject, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, stringUtils = __webpack_require__( /*! ../../core/utils/string */ 18), errors = __webpack_require__( /*! ../widget/ui.errors */ 22), browser = __webpack_require__( /*! ../../core/utils/browser */ 23), domUtils = __webpack_require__( /*! ../../core/utils/dom */ 56), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), Widget = __webpack_require__( /*! ../widget/ui.widget */ 95), windowUtils = __webpack_require__( /*! ../../core/utils/window */ 44), ValidationEngine = __webpack_require__( /*! ../validation_engine */ 117), LayoutManager = __webpack_require__( /*! ./ui.form.layout_manager */ 287), TabPanel = __webpack_require__( /*! ../tab_panel */ 291), Scrollable = __webpack_require__( /*! ../scroll_view/ui.scrollable */ 244); __webpack_require__( /*! ../validation_summary */ 295); __webpack_require__( /*! ../validation_group */ 296); var FORM_CLASS = "dx-form", FIELD_ITEM_CLASS = "dx-field-item", FIELD_ITEM_LABEL_TEXT_CLASS = "dx-field-item-label-text", FORM_GROUP_CLASS = "dx-form-group", FORM_GROUP_CONTENT_CLASS = "dx-form-group-content", FORM_GROUP_WITH_CAPTION_CLASS = "dx-form-group-with-caption", FORM_GROUP_CAPTION_CLASS = "dx-form-group-caption", HIDDEN_LABEL_CLASS = "dx-layout-manager-hidden-label", FIELD_ITEM_LABEL_CLASS = "dx-field-item-label", FIELD_ITEM_LABEL_CONTENT_CLASS = "dx-field-item-label-content", FIELD_ITEM_TAB_CLASS = "dx-field-item-tab", FORM_FIELD_ITEM_COL_CLASS = "dx-col-", GROUP_COL_COUNT_CLASS = "dx-group-colcount-", FIELD_ITEM_CONTENT_CLASS = "dx-field-item-content", FORM_VALIDATION_SUMMARY = "dx-form-validation-summary", WIDGET_CLASS = "dx-widget", FOCUSED_STATE_CLASS = "dx-state-focused"; var Form = Widget.inherit({ _init: function() { this.callBase(); this._cachedColCountOptions = []; this._groupsColCount = [] }, _initOptions: function(options) { if (!("screenByWidth" in options)) { options.screenByWidth = windowUtils.defaultScreenFactorFunc } this.callBase(options) }, _getDefaultOptions: function() { return extend(this.callBase(), { formID: "dx-" + new Guid, formData: {}, colCount: 1, screenByWidth: null, colCountByScreen: void 0, labelLocation: "left", readOnly: false, onFieldDataChanged: null, customizeItem: null, onEditorEnterKey: null, minColWidth: 200, alignItemLabels: true, alignItemLabelsInAllGroups: true, showColonAfterLabel: true, showRequiredMark: true, showOptionalMark: false, requiredMark: "*", optionalMark: messageLocalization.format("dxForm-optionalMark"), requiredMessage: messageLocalization.getFormatter("dxForm-requiredMessage"), showValidationSummary: false, items: void 0, scrollingEnabled: false, validationGroup: void 0 }) }, _setOptionsByReference: function() { this.callBase(); extend(this._optionsByReference, { formData: true, validationGroup: true }) }, _getColCount: function($element) { var $cols, index = 0, isColsExist = true; while (isColsExist) { $cols = $element.find("." + FORM_FIELD_ITEM_COL_CLASS + index); if (!$cols.length) { isColsExist = false } else { index++ } } return index }, _createHiddenElement: function(rootLayoutManager) { this._$hiddenElement = $("<div/>").addClass(WIDGET_CLASS).addClass(HIDDEN_LABEL_CLASS).appendTo(document.body); var $hiddenLabel = rootLayoutManager._renderLabel({ text: " ", location: this.option("labelLocation") }).appendTo(this._$hiddenElement); this._hiddenLabelText = $hiddenLabel.find("." + FIELD_ITEM_LABEL_TEXT_CLASS)[0] }, _removeHiddenElement: function() { this._$hiddenElement.remove(); this._hiddenLabelText = null }, _getLabelWidthByText: function(text) { this._hiddenLabelText.innerHTML = text; return this._hiddenLabelText.offsetWidth }, _getLabelsSelectorByCol: function(index, options) { options = options || {}; var fieldItemClass = options.inOneColumn ? FIELD_ITEM_CLASS : FORM_FIELD_ITEM_COL_CLASS + index, cssExcludeTabbedSelector = options.excludeTabbed ? ":not(." + FIELD_ITEM_TAB_CLASS + ")" : "", childLabelContentSelector = "> ." + FIELD_ITEM_LABEL_CLASS + " > ." + FIELD_ITEM_LABEL_CONTENT_CLASS; return "." + fieldItemClass + cssExcludeTabbedSelector + childLabelContentSelector }, _getLabelText: function(labelText) { var child, i, length = labelText.children.length, result = ""; for (i = 0; i < length; i++) { child = labelText.children[i]; result += !stringUtils.isEmpty(child.innerText) ? child.innerText : child.innerHTML } return result }, _applyLabelsWidthByCol: function($container, index, options) { var labelWidth, i, $labelTexts = $container.find(this._getLabelsSelectorByCol(index, options)), $labelTextsLength = $labelTexts.length, maxWidth = 0; for (i = 0; i < $labelTextsLength; i++) { labelWidth = this._getLabelWidthByText(this._getLabelText($labelTexts[i])); if (labelWidth > maxWidth) { maxWidth = labelWidth } } for (i = 0; i < $labelTextsLength; i++) { $labelTexts[i].style.width = maxWidth + "px" } }, _applyLabelsWidth: function($container, excludeTabbed, inOneColumn) { var i, colCount = inOneColumn ? 1 : this._getColCount($container), applyLabelsOptions = { excludeTabbed: excludeTabbed, inOneColumn: inOneColumn }; for (i = 0; i < colCount; i++) { this._applyLabelsWidthByCol($container, i, applyLabelsOptions) } }, _getGroupElementsInColumn: function($container, columnIndex, colCount) { var cssColCountSelector = utils.isDefined(colCount) ? "." + GROUP_COL_COUNT_CLASS + colCount : "", groupSelector = "." + FORM_FIELD_ITEM_COL_CLASS + columnIndex + " > ." + FIELD_ITEM_CONTENT_CLASS + " > ." + FORM_GROUP_CLASS + cssColCountSelector; return $container.find(groupSelector) }, _applyLabelsWidthWithGroups: function($container, colCount, excludeTabbed) { var alignItemLabelsInAllGroups = this.option("alignItemLabelsInAllGroups"); if (alignItemLabelsInAllGroups) { this._applyLabelsWidthWithNestedGroups($container, colCount, excludeTabbed) } else { var i, $groups = this.element().find("." + FORM_GROUP_CLASS); for (i = 0; i < $groups.length; i++) { this._applyLabelsWidth($groups.eq(i), excludeTabbed) } } }, _applyLabelsWidthWithNestedGroups: function($container, colCount, excludeTabbed) { var colIndex, groupsColIndex, groupColIndex, $groupsByCol, applyLabelsOptions = { excludeTabbed: excludeTabbed }; for (colIndex = 0; colIndex < colCount; colIndex++) { $groupsByCol = this._getGroupElementsInColumn($container, colIndex); this._applyLabelsWidthByCol($groupsByCol, 0, applyLabelsOptions); for (groupsColIndex = 0; groupsColIndex < this._groupsColCount.length; groupsColIndex++) { $groupsByCol = this._getGroupElementsInColumn($container, colIndex, this._groupsColCount[groupsColIndex]); var groupColCount = this._getColCount($groupsByCol); for (groupColIndex = 1; groupColIndex < groupColCount; groupColIndex++) { this._applyLabelsWidthByCol($groupsByCol, groupColIndex, applyLabelsOptions) } } } }, _alignLabelsInColumn: function(options) { this._createHiddenElement(options.layoutManager); if (options.inOneColumn) { this._applyLabelsWidth(options.$container, options.excludeTabbed, true) } else { if (this._checkGrouping(options.items)) { this._applyLabelsWidthWithGroups(options.$container, options.layoutManager._getColCount(), options.excludeTabbed) } else { this._applyLabelsWidth(options.$container, options.excludeTabbed) } } this._removeHiddenElement() }, _render: function() { this._clearCachedInstances(); this.callBase(); this.element().addClass(FORM_CLASS); this._attachSyncSubscriptions(); this._cachedScreenFactor = windowUtils.getCurrentScreenFactor(this.option("screenByWidth")) }, _clearCachedInstances: function() { this._editorInstancesByField = {}; this._cachedLayoutManagers = [] }, _alignLabels: function(layoutManager, inOneColumn) { this._alignLabelsInColumn({ $container: this.element(), layoutManager: layoutManager, excludeTabbed: true, items: this.option("items"), inOneColumn: inOneColumn }) }, _clean: function() { this.callBase(); this._groupsColCount = []; this._cachedColCountOptions = []; delete this._cachedScreenFactor }, _renderContentImpl: function() { this.callBase(); this.setAria("role", "form", this.element()); if (this.option("scrollingEnabled")) { this._renderScrollable() } this._renderLayout(); this._renderValidationSummary() }, _renderScrollable: function() { var useNativeScrolling = this.option("useNativeScrolling"); this._scrollable = new Scrollable(this.element(), { useNative: !!useNativeScrolling, useSimulatedScrollbar: !useNativeScrolling, useKeyboard: false, direction: "both", bounceEnabled: false }) }, _getContent: function() { return this.option("scrollingEnabled") ? this._scrollable.content() : this.element() }, _renderValidationSummary: function() { var $validationSummary = this.element().find("." + FORM_VALIDATION_SUMMARY); if ($validationSummary.length > 0) { $validationSummary.remove() } if (this.option("showValidationSummary")) { $("<div/>").addClass(FORM_VALIDATION_SUMMARY).dxValidationSummary({ validationGroup: this._getValidationGroup() }).appendTo(this._getContent()) } }, _prepareItems: function(items, isTabbed) { if (items) { var i, item, clonedItem, that = this, extendedItems = []; for (i = 0; i < items.length; i++) { item = items[i]; clonedItem = utils.isObject(item) ? extend({}, item) : item; that._prepareGroupItem(clonedItem); that._prepareTabbedItem(clonedItem); that._prepareItemTemplate(clonedItem); if (utils.isObject(clonedItem)) { if (isTabbed) { clonedItem.cssItemClass = FIELD_ITEM_TAB_CLASS } clonedItem.items = this._prepareItems(clonedItem.items, isTabbed) } extendedItems.push(clonedItem) } return extendedItems } }, _prepareGroupItem: function(item) { if ("group" === item.itemType) { item.alignItemLabels = utils.ensureDefined(item.alignItemLabels, true); if (item.template) { item.groupContentTemplate = this._getTemplate(item.template) } item.template = this._itemGroupTemplate.bind(this, item) } }, _prepareTabbedItem: function(item) { if ("tabbed" === item.itemType) { item.template = this._itemTabbedTemplate.bind(this, item); item.tabs = this._prepareItems(item.tabs, true) } }, _prepareItemTemplate: function(item) { if (item.template) { item.template = this._getTemplate(item.template) } }, _checkGrouping: function(items) { if (items) { for (var i = 0; i < items.length; i++) { var item = items[i]; if ("group" === item.itemType) { return true } } } }, _renderLayout: function() { var that = this, items = that.option("items"), $content = that._getContent(); items = that._prepareItems(items); that._testResultItems = items; that._rootLayoutManager = that._renderLayoutManager(items, $content, { colCount: that.option("colCount"), width: this.option("width"), alignItemLabels: that.option("alignItemLabels"), screenByWidth: this.option("screenByWidth"), colCountByScreen: this.option("colCountByScreen"), onLayoutChanged: function(inOneColumn) { that._alignLabels.bind(that)(that._rootLayoutManager, inOneColumn) }, onContentReady: function(e) { that._alignLabels(e.component, e.component.isLayoutChanged()) } }) }, _itemTabbedTemplate: function(item, e, $container) { var that = this, $tabPanel = $("<div/>").appendTo($container), tabPanelOptions = extend({}, item.tabPanelOptions, { dataSource: item.tabs, onItemRendered: function(args) { domUtils.triggerShownEvent(args.itemElement) }, itemTemplate: function(itemData, e, $container) { var layoutManager, alignItemLabels = utils.ensureDefined(itemData.alignItemLabels, true); layoutManager = that._renderLayoutManager(itemData.items, $container, { colCount: itemData.colCount, alignItemLabels: alignItemLabels, screenByWidth: this.option("screenByWidth"), colCountByScreen: itemData.colCountByScreen, cssItemClass: itemData.cssItemClass, onLayoutChanged: function(inOneColumn) { that._alignLabelsInColumn.bind(that)({ $container: $container, layoutManager: layoutManager, items: itemData.items, inOneColumn: inOneColumn }) } }); if (alignItemLabels) { that._alignLabelsInColumn.bind(that)({ $container: $container, layoutManager: layoutManager, items: itemData.items, inOneColumn: layoutManager.isLayoutChanged() }) } } }); that._createComponent($tabPanel, TabPanel, tabPanelOptions) }, _itemGroupTemplate: function(item, e, $container) { var $groupContent, colCount, layoutManager, $group = $("<div/>").toggleClass(FORM_GROUP_WITH_CAPTION_CLASS, utils.isDefined(item.caption) && item.caption.length).addClass(FORM_GROUP_CLASS).appendTo($container); if (item.caption) { $("<span/>").addClass(FORM_GROUP_CAPTION_CLASS).text(item.caption).appendTo($group) } $groupContent = $("<div/>").addClass(FORM_GROUP_CONTENT_CLASS).appendTo($group); if (item.groupContentTemplate) { var data = { formData: this.option("formData"), component: this }; item.groupContentTemplate.render({ model: data, container: $groupContent }) } else { layoutManager = this._renderLayoutManager(item.items, $groupContent, { colCount: item.colCount, colCountByScreen: item.colCountByScreen, alignItemLabels: item.alignItemLabels, cssItemClass: item.cssItemClass }); colCount = layoutManager._getColCount(); if (inArray(colCount, this._groupsColCount) === -1) { this._groupsColCount.push(colCount) } $group.addClass(GROUP_COL_COUNT_CLASS + colCount) } }, _renderLayoutManager: function(items, $rootElement, options) { var instance, $element = $("<div />"), that = this, config = that._getLayoutManagerConfig(items, options), baseColCountByScreen = { lg: options.colCount, md: options.colCount, sm: options.colCount, xs: 1 }; that._cachedColCountOptions.push({ colCountByScreen: extend(baseColCountByScreen, options.colCountByScreen) }); $element.appendTo($rootElement); instance = that._createComponent($element, "dxLayoutManager", config); instance.on("autoColCountChanged", function() { that._refresh() }); that._cachedLayoutManagers.push(instance); return instance }, _getValidationGroup: function() { return this.option("validationGroup") || this }, _getLayoutManagerConfig: function(items, options) { var that = this, baseConfig = { form: that, validationGroup: that._getValidationGroup(), showRequiredMark: that.option("showRequiredMark"), showOptionalMark: that.option("showOptionalMark"), requiredMark: that.option("requiredMark"), optionalMark: that.option("optionalMark"), requiredMessage: that.option("requiredMessage"), screenByWidth: that.option("screenByWidth"), layoutData: that.option("formData"), labelLocation: that.option("labelLocation"), customizeItem: that.option("customizeItem"), minColWidth: that.option("minColWidth"), showColonAfterLabel: that.option("showColonAfterLabel"), onEditorEnterKey: that.option("onEditorEnterKey"), onFieldDataChanged: function(args) { if (!that._isDataUpdating) { that._triggerOnFieldDataChanged(args) } }, validationBoundary: that.option("scrollingEnabled") ? that.element() : void 0 }; return extend(baseConfig, { items: items, onContentReady: function(args) { that._updateEditorInstancesFromLayoutManager(args.component._editorInstancesByField); options.onContentReady && options.onContentReady(args) }, colCount: options.colCount, alignItemLabels: options.alignItemLabels, cssItemClass: options.cssItemClass, colCountByScreen: options.colCountByScreen, onLayoutChanged: options.onLayoutChanged, width: options.width }) }, _updateEditorInstancesFromLayoutManager: function(instancesByDataFields) { extend(this._editorInstancesByField, instancesByDataFields) }, _createComponent: function($element, type, config) { var that = this; config = config || {}; that._extendConfig(config, { readOnly: that.option("readOnly") }); return that.callBase($element, type, config) }, _attachSyncSubscriptions: function() { var that = this; that.off("optionChanged").on("optionChanged", function(args) { var optionFullName = args.fullName; if ("formData" === optionFullName) { if (!utils.isDefined(args.value)) { that._options.formData = args.value = {} } that._triggerOnFieldDataChangedByDataSet(args.value) } if (that._cachedLayoutManagers.length) { $.each(that._cachedLayoutManagers, function(index, layoutManager) { if ("formData" === optionFullName) { that._isDataUpdating = true; layoutManager.option("layoutData", args.value); that._isDataUpdating = false } if ("readOnly" === args.name) { layoutManager.option(optionFullName, args.value) } }) } }) }, _optionChanged: function(args) { var rootNameOfComplexOption = this._getRootLevelOfExpectedComplexOption(args.fullName, ["formData", "items"]); if (rootNameOfComplexOption) { this._customHandlerOfComplexOption(args, rootNameOfComplexOption); return } switch (args.name) { case "formData": if (!this.option("items")) { this._invalidate() } else { if (isEmptyObject(args.value)) { this._resetValues() } } break; case "items": case "colCount": case "onFieldDataChanged": case "onEditorEnterKey": case "labelLocation": case "alignItemLabels": case "showColonAfterLabel": case "customizeItem": case "alignItemLabelsInAllGroups": case "showRequiredMark": case "showOptionalMark": case "requiredMark": case "optionalMark": case "requiredMessage": case "scrollingEnabled": case "formID": case "colCountByScreen": case "screenByWidth": this._invalidate(); break; case "showValidationSummary": this._renderValidationSummary(); break; case "minColWidth": if ("auto" === this.option("colCount")) { this._invalidate() } break; case "readOnly": break; case "width": this.callBase(args); this._rootLayoutManager.option(args.name, args.value); this._alignLabels(this._rootLayoutManager, this._rootLayoutManager.isLayoutChanged()); break; case "visible": this.callBase(args); if (args.value) { domUtils.triggerShownEvent(this.element()) } break; default: this.callBase(args) } }, _getRootLevelOfExpectedComplexOption: function(fullOptionName, expectedRootNames) { var result, splitFullName = fullOptionName.split("."); if (splitFullName.length > 1) { var i, rootOptionName = splitFullName[0]; for (i = 0; i < expectedRootNames.length; i++) { if (rootOptionName.search(expectedRootNames[i]) !== -1) { result = expectedRootNames[i] } } } return result }, _customHandlerOfComplexOption: function(args, rootOptionName) { var nameParts = args.fullName.split("."); switch (rootOptionName) { case "items": var instance, items, name, itemPath = this._getItemPath(nameParts), item = this.option(itemPath); if (args.fullName.search("editorOptions") !== -1) { instance = this.getEditor(item.dataField); instance && instance.option(item.editorOptions) } else { if (item) { name = args.fullName.replace(itemPath + ".", ""); this._changeItemOption(item, name, args.value); items = this._generateItemsFromData(this.option("items")); this.option("items", items) } } break; case "formData": var dataField = nameParts.slice(1).join("."), editor = this.getEditor(dataField); if (editor) { editor.option("value", args.value) } else { this._triggerOnFieldDataChanged({ dataField: dataField, value: args.value }) } } }, _getItemPath: function(nameParts) { var i, itemPath = nameParts[0]; for (i = 1; i < nameParts.length; i++) { if (nameParts[i].search("items|tabs") !== -1) { itemPath += "." + nameParts[i] } else { break } } return itemPath }, _triggerOnFieldDataChanged: function(args) { this._createActionByOption("onFieldDataChanged")(args) }, _triggerOnFieldDataChangedByDataSet: function(data) { var that = this; if (data && utils.isObject(data)) { $.each(data, function(dataField, value) { that._triggerOnFieldDataChanged({ dataField: dataField, value: value }) }) } }, _updateFieldValue: function(dataField, value) { if (utils.isDefined(this.option("formData"))) { var editor = this.getEditor(dataField); this.option("formData." + dataField, value); if (editor) { var editorValue = editor.option("value"); if (editorValue !== value) { editor.option("value", value) } } } }, _generateItemsFromData: function(items) { var formData = this.option("formData"), result = []; if (!items && utils.isDefined(formData)) { $.each(formData, function(dataField) { result.push({ dataField: dataField }) }) } if (items) { $.each(items, function(index, item) { if (utils.isObject(item)) { result.push(item) } else { result.push({ dataField: item }) } }) } return result }, _getItemByField: function(field, items) { var resultItem, that = this, fieldParts = utils.isObject(field) ? field : that._getFieldParts(field), fieldName = fieldParts.fieldName, fieldPath = fieldParts.fieldPath; if (items.length) { $.each(items, function(index, item) { var itemType = item.itemType; if (fieldPath.length) { var path = fieldPath.slice(); item = that._getItemByFieldPath(path, fieldName, item) } else { if ("group" === itemType && !item.caption || "tabbed" === itemType) { var subItemsField = that._getSubItemField(itemType); item.items = that._generateItemsFromData(item.items); item = that._getItemByField({ fieldName: fieldName, fieldPath: fieldPath }, item[subItemsField]) } } if (that._isExpectedItem(item, fieldName)) { resultItem = item; return false } }) } return resultItem }, _getFieldParts: function(field) { var fieldSeparator = ".", fieldName = field, separatorIndex = fieldName.indexOf(fieldSeparator), resultPath = []; while (separatorIndex !== -1) { resultPath.push(fieldName.substr(0, separatorIndex)); fieldName = fieldName.substr(separatorIndex + 1); separatorIndex = fieldName.indexOf(fieldSeparator) } return { fieldName: fieldName, fieldPath: resultPath.reverse() } }, _getItemByFieldPath: function(path, fieldName, item) { var result, that = this, itemType = item.itemType, subItemsField = that._getSubItemField(itemType), isItemWithSubItems = "group" === itemType || "tabbed" === itemType || item.title; do { if (isItemWithSubItems) { var pathNode, isGroupWithCaption = utils.isDefined(item.caption || item.title), captionWithoutSpaces = that._getTextWithoutSpaces(item.caption || item.title); item[subItemsField] = that._generateItemsFromData(item[subItemsField]); if (isGroupWithCaption) { pathNode = path.pop() } if (!path.length) { result = that._getItemByField(fieldName, item[subItemsField]); if (result) { break } } if (!isGroupWithCaption || isGroupWithCaption && captionWithoutSpaces === pathNode) { if (path.length) { result = that._searchItemInEverySubItem(path, fieldName, item[subItemsField]) } } } else { break } } while (path.length && false !== result); return result }, _getSubItemField: function(itemType) { return "tabbed" === itemType ? "tabs" : "items" }, _searchItemInEverySubItem: function(path, fieldName, items) { var result, that = this; $.each(items, function(index, groupItem) { result = that._getItemByFieldPath(path, fieldName, groupItem); if (result) { return false } }); if (!result) { result = false } return result }, _getTextWithoutSpaces: function(text) { return text ? text.replace(" ", "") : void 0 }, _isExpectedItem: function(item, fieldName) { return item && (item.dataField === fieldName || item.name === fieldName || this._getTextWithoutSpaces(item.title) === fieldName || "group" === item.itemType && this._getTextWithoutSpaces(item.caption) === fieldName) }, _changeItemOption: function(item, option, value) { if (utils.isObject(item)) { item[option] = value } }, _dimensionChanged: function() { var currentScreenFactor = windowUtils.getCurrentScreenFactor(this.option("screenByWidth")); if (this._cachedScreenFactor !== currentScreenFactor) { if (this._isColCountChanged(this._cachedScreenFactor, currentScreenFactor)) { this._refresh() } this._cachedScreenFactor = currentScreenFactor; return } }, _isColCountChanged: function(oldScreenSize, newScreenSize) { var isChanged = false; $.each(this._cachedColCountOptions, function(index, item) { if (item.colCountByScreen[oldScreenSize] !== item.colCountByScreen[newScreenSize]) { isChanged = true; return false } }); return isChanged }, _refresh: function() { var editorSelector = "." + FOCUSED_STATE_CLASS + " input, ." + FOCUSED_STATE_CLASS + " textarea"; this.element().find(editorSelector).trigger("change"); this.callBase() }, _resetValues: function() { var validationGroup = ValidationEngine.getGroupConfig(this); validationGroup && validationGroup.reset(); $.each(this._editorInstancesByField, function(dataField, editor) { editor.reset(); editor.option("isValid", true) }) }, _updateData: function(data, value, isComplexData) { var that = this, _data = isComplexData ? value : data; if (utils.isObject(_data)) { $.each(_data, function(dataField, fieldValue) { that._updateData(isComplexData ? data + "." + dataField : dataField, fieldValue, utils.isObject(fieldValue)) }) } else { if (utils.isString(data)) { that._updateFieldValue(data, value) } } }, registerKeyHandler: function(key, handler) { this.callBase(key, handler); $.each(this._editorInstancesByField, function(dataField, editor) { editor.registerKeyHandler(key, handler) }) }, _focusTarget: function() { return this.element().find("." + FIELD_ITEM_CONTENT_CLASS + " [tabindex]").first() }, _visibilityChanged: function(visible) { if (visible && browser.msie) { this._refresh() } }, resetValues: function() { this._resetValues() }, updateData: function(data, value) { this._updateData(data, value) }, getEditor: function(field) { return this._editorInstancesByField[field] }, updateDimensions: function() { var that = this, deferred = $.Deferred(); if (that._scrollable) { that._scrollable.update().done(function() { deferred.resolveWith(that) }) } else { deferred.resolveWith(that) } return deferred.promise() }, itemOption: function(field, option, value) { var that = this, argsCount = arguments.length, items = that._generateItemsFromData(that.option("items")), item = that._getItemByField(field, items); switch (argsCount) { case 1: return item; case 3: that._changeItemOption(item, option, value); break; default: if (utils.isObject(option)) { $.each(option, function(optionName, optionValue) { that._changeItemOption(item, optionName, optionValue) }) } } this.option("items", items) }, validate: function() { try { return ValidationEngine.validateGroup(this._getValidationGroup()) } catch (e) { errors.log("E1036", e.message) } }, getItemID: function(name) { return "dx_" + this.option("formID") + "_" + (name || new Guid) } }); registerComponent("dxForm", Form); module.exports = Form; module.exports.__internals = extend({ FORM_CLASS: FORM_CLASS, FORM_GROUP_CLASS: FORM_GROUP_CLASS, FORM_GROUP_CAPTION_CLASS: FORM_GROUP_CAPTION_CLASS, FORM_FIELD_ITEM_COL_CLASS: FORM_FIELD_ITEM_COL_CLASS }, LayoutManager.__internals) }, /*!**********************************************!*\ !*** ./js/ui/form/ui.form.layout_manager.js ***! \**********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Guid = __webpack_require__( /*! ../../core/guid */ 151), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), utils = __webpack_require__( /*! ../../core/utils/common */ 14), isEmptyObject = __webpack_require__( /*! ../../core/utils/type */ 12).isEmptyObject, isWrapped = __webpack_require__( /*! ../../core/utils/variable_wrapper */ 28).isWrapped, isWritableWrapped = __webpack_require__( /*! ../../core/utils/variable_wrapper */ 28).isWritableWrapped, unwrap = __webpack_require__( /*! ../../core/utils/variable_wrapper */ 28).unwrap, windowUtils = __webpack_require__( /*! ../../core/utils/window */ 44), stringUtils = __webpack_require__( /*! ../../core/utils/string */ 18), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, dataUtils = __webpack_require__( /*! ../../core/utils/data */ 50), removeEvent = __webpack_require__( /*! ../../core/remove_event */ 47), clickEvent = __webpack_require__( /*! ../../events/click */ 75), normalizeIndexes = __webpack_require__( /*! ../../core/utils/array */ 26).normalizeIndexes, errors = __webpack_require__( /*! ../widget/ui.errors */ 22), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), support = __webpack_require__( /*! ../../core/utils/support */ 61), inflector = __webpack_require__( /*! ../../core/utils/inflector */ 39), Widget = __webpack_require__( /*! ../widget/ui.widget */ 95), Validator = __webpack_require__( /*! ../validator */ 288), ResponsiveBox = __webpack_require__( /*! ../responsive_box */ 290); __webpack_require__( /*! ../text_box */ 211); __webpack_require__( /*! ../number_box */ 263); __webpack_require__( /*! ../check_box */ 248); __webpack_require__( /*! ../date_box */ 267); var FORM_EDITOR_BY_DEFAULT = "dxTextBox", FIELD_ITEM_CLASS = "dx-field-item", FIELD_EMPTY_ITEM_CLASS = "dx-field-empty-item", FIELD_ITEM_REQUIRED_CLASS = "dx-field-item-required", FIELD_ITEM_OPTIONAL_CLASS = "dx-field-item-optional", FIELD_ITEM_REQUIRED_MARK_CLASS = "dx-field-item-required-mark", FIELD_ITEM_OPTIONAL_MARK_CLASS = "dx-field-item-optional-mark", FIELD_ITEM_LABEL_CLASS = "dx-field-item-label", FIELD_ITEM_LABEL_ALIGN_CLASS = "dx-field-item-label-align", FIELD_ITEM_LABEL_CONTENT_CLASS = "dx-field-item-label-content", FIELD_ITEM_LABEL_TEXT_CLASS = "dx-field-item-label-text", FIELD_ITEM_LABEL_LOCATION_CLASS = "dx-field-item-label-location-", FIELD_ITEM_CONTENT_CLASS = "dx-field-item-content", FIELD_ITEM_CONTENT_LOCATION_CLASS = "dx-field-item-content-location-", FIELD_ITEM_CONTENT_WRAPPER_CLASS = "dx-field-item-content-wrapper", FIELD_ITEM_HELP_TEXT_CLASS = "dx-field-item-help-text", LABEL_HORIZONTAL_ALIGNMENT_CLASS = "dx-label-h-align", LABEL_VERTICAL_ALIGNMENT_CLASS = "dx-label-v-align", FORM_LAYOUT_MANAGER_CLASS = "dx-layout-manager", LAYOUT_MANAGER_FIRST_ROW_CLASS = "dx-first-row", LAYOUT_MANAGER_FIRST_COL_CLASS = "dx-first-col", LAYOUT_MANAGER_LAST_COL_CLASS = "dx-last-col", LAYOUT_MANAGER_ONE_COLUMN = "dx-layout-manager-one-col", FLEX_LAYOUT_CLASS = "dx-flex-layout", LAYOUT_STRATEGY_FLEX = "flex", LAYOUT_STRATEGY_FALLBACK = "fallback", SIMPLE_ITEM_TYPE = "simple", DATA_OPTIONS = ["dataSource", "items"]; var LayoutManager = Widget.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { layoutData: {}, readOnly: false, colCount: 1, colCountByScreen: void 0, labelLocation: "left", onFieldDataChanged: null, onEditorEnterKey: null, customizeItem: null, alignItemLabels: true, minColWidth: 200, showRequiredMark: true, screenByWidth: null, showOptionalMark: false, requiredMark: "*", optionalMark: messageLocalization.format("dxForm-optionalMark"), requiredMessage: messageLocalization.getFormatter("dxForm-requiredMessage") }) }, _setOptionsByReference: function() { this.callBase(); extend(this._optionsByReference, { layoutData: true, validationGroup: true }) }, _init: function() { this.callBase(); this._itemWatchers = []; this._initDataAndItems(this.option("layoutData")) }, _initDataAndItems: function(initialData) { this._syncDataWithItems(); this._updateItems(initialData) }, _syncDataWithItems: function() { var that = this, userItems = that.option("items"); if (utils.isDefined(userItems)) { $.each(userItems, function(index, item) { var value; if (item.dataField && void 0 === that._getDataByField(item.dataField)) { if (item.editorOptions) { value = item.editorOptions.value } that._updateFieldValue(item.dataField, value) } }) } }, _getDataByField: function(dataField) { return dataField ? this.option("layoutData." + dataField) : null }, _updateFieldValue: function(dataField, value) { var layoutData = this.option("layoutData"), newValue = value; if (!isWrapped(layoutData[dataField]) && utils.isDefined(dataField)) { this.option("layoutData." + dataField, newValue) } else { if (isWritableWrapped(layoutData[dataField])) { newValue = utils.isFunction(newValue) ? newValue() : newValue; layoutData[dataField](newValue) } } this._triggerOnFieldDataChanged({ dataField: dataField, value: newValue }) }, _triggerOnFieldDataChanged: function(args) { this._createActionByOption("onFieldDataChanged")(args) }, _updateItems: function(layoutData) { var items, processedItems, that = this, userItems = this.option("items"), isUserItemsExist = utils.isDefined(userItems), customizeItem = that.option("customizeItem"); items = isUserItemsExist ? userItems : this._generateItemsByData(layoutData); if (utils.isDefined(items)) { processedItems = []; $.each(items, function(index, item) { if (that._isAcceptableItem(item)) { item = that._processItem(item); customizeItem && customizeItem(item); if (utils.isObject(item) && false !== unwrap(item.visible)) { processedItems.push(item) } } }); if (!that._itemWatchers.length || !isUserItemsExist) { that._updateItemWatchers(items) } this._items = processedItems; this._sortItems() } }, _cleanItemWatchers: function() { this._itemWatchers.forEach(function(dispose) { dispose() }); this._itemWatchers = [] }, _updateItemWatchers: function(items) { var that = this, watch = that._getWatch(); items.forEach(function(item) { if (utils.isObject(item) && utils.isDefined(item.visible) && $.isFunction(watch)) { that._itemWatchers.push(watch(function() { return unwrap(item.visible) }, function() { that._updateItems(that.option("layoutData")); that.repaint() }, { skipImmediate: true })) } }) }, _generateItemsByData: function(layoutData) { var result = []; if (utils.isDefined(layoutData)) { $.each(layoutData, function(dataField) { result.push({ dataField: dataField }) }) } return result }, _isAcceptableItem: function(item) { var itemField = item.dataField || item, itemData = this._getDataByField(itemField); return !(utils.isFunction(itemData) && !isWrapped(itemData)) }, _processItem: function(item) { if ("string" === typeof item) { item = { dataField: item } } if ("object" === typeof item && !item.itemType) { item.itemType = SIMPLE_ITEM_TYPE } if (!utils.isDefined(item.editorType) && utils.isDefined(item.dataField)) { var value = this._getDataByField(item.dataField); item.editorType = utils.isDefined(value) ? this._getEditorTypeByDataType(utils.type(value)) : FORM_EDITOR_BY_DEFAULT } return item }, _getEditorTypeByDataType: function(dataType) { switch (dataType) { case "number": return "dxNumberBox"; case "date": return "dxDateBox"; case "boolean": return "dxCheckBox"; default: return "dxTextBox" } }, _sortItems: function() { normalizeIndexes(this._items, "visibleIndex"); this._sortIndexes() }, _sortIndexes: function() { this._items.sort(function(itemA, itemB) { var result, indexA = itemA.visibleIndex, indexB = itemB.visibleIndex; if (indexA > indexB) { result = 1 } else { if (indexA < indexB) { result = -1 } else { result = 0 } } return result }) }, _render: function() { this._clearEditorInstances(); this.element().addClass(FORM_LAYOUT_MANAGER_CLASS); this.callBase() }, _clearEditorInstances: function() { this._editorInstancesByField = {} }, _hasBrowserFlex: function() { return support.styleProp(LAYOUT_STRATEGY_FLEX) === LAYOUT_STRATEGY_FLEX }, _renderContentImpl: function() { this.callBase(); this._renderResponsiveBox() }, _renderResponsiveBox: function() { var that = this; if (that._items && that._items.length) { var layoutItems, colCount = that._getColCount(), $container = $("<div />").appendTo(that.element()); that._prepareItemsWithMerging(colCount); layoutItems = that._generateLayoutItems(); that._extendItemsWithDefaultTemplateOptions(layoutItems, that._items); that._responsiveBox = that._createComponent($container, ResponsiveBox, that._getResponsiveBoxConfig(layoutItems, colCount)) } }, _extendItemsWithDefaultTemplateOptions: function(targetItems, sourceItems) { sourceItems.forEach(function(item) { if (!item.merged) { if (utils.isDefined(item.disabled)) { targetItems[item.visibleIndex].disabled = item.disabled } if (utils.isDefined(item.visible)) { targetItems[item.visibleIndex].visible = item.visible } } }) }, _itemStateChangedHandler: function(e) { this._refresh() }, _getResponsiveBoxConfig: function(layoutItems, colCount) { var that = this, colCountByScreen = that.option("colCountByScreen"), xsColCount = colCountByScreen && colCountByScreen.xs; return { onItemStateChanged: this._itemStateChangedHandler.bind(this), _layoutStrategy: that._hasBrowserFlex() ? LAYOUT_STRATEGY_FLEX : LAYOUT_STRATEGY_FALLBACK, onLayoutChanged: function() { var onLayoutChanged = that.option("onLayoutChanged"), isLayoutChanged = that.isLayoutChanged(); if (onLayoutChanged) { that.element().toggleClass(LAYOUT_MANAGER_ONE_COLUMN, isLayoutChanged); onLayoutChanged(isLayoutChanged) } }, onContentReady: function(e) { if (that.option("onLayoutChanged")) { that.element().toggleClass(LAYOUT_MANAGER_ONE_COLUMN, that.isLayoutChanged(e.component)) } that._fireContentReadyAction() }, itemTemplate: function(e, itemData, $itemElement) { if (!e.location) { return } var itemRenderedCountInPreviousRows = e.location.row * colCount, item = that._items[e.location.col + itemRenderedCountInPreviousRows], $fieldItem = $("<div/>").addClass(item.cssClass).appendTo($itemElement); if (0 === e.location.row) { $fieldItem.addClass(LAYOUT_MANAGER_FIRST_ROW_CLASS) } if (0 === e.location.col) { $fieldItem.addClass(LAYOUT_MANAGER_FIRST_COL_CLASS) } if (e.location.col === colCount - 1 || e.location.col + e.location.colspan === colCount) { $fieldItem.addClass(LAYOUT_MANAGER_LAST_COL_CLASS) } "empty" === item.itemType ? that._renderEmptyItem($fieldItem) : that._renderFieldItem(item, $fieldItem) }, cols: that._generateRatio(colCount), rows: that._generateRatio(that._getRowsCount(), true), dataSource: layoutItems, screenByWidth: that.option("screenByWidth"), singleColumnScreen: xsColCount ? false : "xs" } }, _getColCount: function() { var colCount = this.option("colCount"), colCountByScreen = this.option("colCountByScreen"); if (colCountByScreen) { var currentColCount = colCountByScreen[windowUtils.getCurrentScreenFactor(this.option("screenByWidth"))]; colCount = currentColCount || colCount } if ("auto" === colCount) { if (!!this._cashedColCount) { return this._cashedColCount } this._cashedColCount = colCount = this._getMaxColCount() } return colCount < 1 ? 1 : colCount }, _getMaxColCount: function() { var minColWidth = this.option("minColWidth"), width = this.element().width(), itemsCount = this._items.length, maxColCount = Math.floor(width / minColWidth) || 1; return itemsCount < maxColCount ? itemsCount : maxColCount }, isCachedColCountObsolete: function() { return this._cashedColCount && this._getMaxColCount() !== this._cashedColCount }, _prepareItemsWithMerging: function(colCount) { var item, itemsMergedByCol, j, i, items = this._items.slice(0), result = []; for (i = 0; i < items.length; i++) { item = items[i]; result.push(item); if (this.option("alignItemLabels") || item.alignItemLabels || item.colSpan) { item.col = this._getColByIndex(result.length - 1, colCount) } if (item.colSpan > 1 && item.col + item.colSpan <= colCount) { itemsMergedByCol = []; for (j = 0; j < item.colSpan - 1; j++) { itemsMergedByCol.push({ merged: true }) } result = result.concat(itemsMergedByCol) } else { delete item.colSpan } } this._items = result }, _getColByIndex: function(index, colCount) { return index % colCount }, _generateLayoutItems: function() { var item, i, items = this._items, colCount = this._getColCount(), result = []; for (i = 0; i < items.length; i++) { item = items[i]; if (!item.merged) { var generatedItem = { location: { row: parseInt(i / colCount), col: this._getColByIndex(i, colCount) } }; if (utils.isDefined(item.colSpan)) { generatedItem.location.colspan = item.colSpan } if (utils.isDefined(item.rowSpan)) { generatedItem.location.rowspan = item.rowSpan } result.push(generatedItem) } } return result }, _renderEmptyItem: function($container) { return $container.addClass(FIELD_EMPTY_ITEM_CLASS).html(" ") }, _renderFieldItem: function(item, $container) { var $label, that = this, name = that._getName(item), id = that.getItemID(name), isRequired = utils.isDefined(item.isRequired) ? item.isRequired : !!that._hasRequiredRuleInSet(item.validationRules), labelOptions = that._getLabelOptions(item, id, isRequired), $editor = $("<div/>"), helpID = item.helpText ? "dx-" + new Guid : null; $container.addClass(FIELD_ITEM_CLASS).addClass(isRequired ? FIELD_ITEM_REQUIRED_CLASS : FIELD_ITEM_OPTIONAL_CLASS).addClass(that.option("cssItemClass")).addClass(utils.isDefined(item.col) ? "dx-col-" + item.col : ""); if (labelOptions.visible && labelOptions.text) { $label = that._renderLabel(labelOptions).appendTo($container) } if (item.itemType === SIMPLE_ITEM_TYPE) { if (that._isLabelNeedBaselineAlign(item) && "top" !== labelOptions.location) { $container.addClass(FIELD_ITEM_LABEL_ALIGN_CLASS) } that._hasBrowserFlex() && $container.addClass(FLEX_LAYOUT_CLASS) } $editor.data("dx-form-item", item); that._appendEditorToField({ $fieldItem: $container, $label: $label, $editor: $editor, labelOptions: labelOptions }); that._renderEditor({ $container: $editor, dataField: name, editorType: item.editorType, editorOptions: item.editorOptions, template: that._getTemplateByFieldItem(item), isRequired: isRequired, helpID: helpID, id: id, validationBoundary: that.option("validationBoundary") }); var $validationTarget = $editor.children().first(); if ($validationTarget && $validationTarget.data("dx-validation-target")) { that._renderValidator($validationTarget, item) } that._renderHelpText(item, $editor, helpID); that._attachClickHandler($label, $editor, item.editorType) }, _hasRequiredRuleInSet: function(rules) { var hasRequiredRule; if (rules && rules.length) { $.each(rules, function(index, rule) { if ("required" === rule.type) { hasRequiredRule = true; return false } }) } return hasRequiredRule }, _getName: function(item) { return item.dataField || item.name }, _isLabelNeedBaselineAlign: function(item) { var largeEditors = ["dxTextArea", "dxRadioGroup", "dxCalendar"]; return !!item.helpText && !this._hasBrowserFlex() || inArray(item.editorType, largeEditors) !== -1 }, _getLabelOptions: function(item, id, isRequired) { var labelOptions = extend({ showColon: this.option("showColonAfterLabel"), location: this.option("labelLocation"), id: id, visible: true, isRequired: isRequired }, item ? item.label : {}); if (!labelOptions.text && item.dataField) { labelOptions.text = inflector.captionize(item.dataField) } if (labelOptions.text) { labelOptions.text += labelOptions.showColon ? ":" : "" } return labelOptions }, _renderLabel: function(options) { if (utils.isDefined(options.text) && options.text.length > 0) { var labelClasses = FIELD_ITEM_LABEL_CLASS + " " + FIELD_ITEM_LABEL_LOCATION_CLASS + options.location, $label = $("<label />").addClass(labelClasses).attr("for", options.id), $labelContent = $("<span/>").addClass(FIELD_ITEM_LABEL_CONTENT_CLASS).appendTo($label); $("<span />").addClass(FIELD_ITEM_LABEL_TEXT_CLASS).text(options.text).appendTo($labelContent); if (options.alignment) { $label.css("text-align", options.alignment) } $labelContent.append(this._renderLabelMark(options.isRequired)); return $label } }, _renderLabelMark: function(isRequired) { var $mark, requiredMarksConfig = this._getRequiredMarksConfig(), isRequiredMark = requiredMarksConfig.showRequiredMark && isRequired, isOptionalMark = requiredMarksConfig.showOptionalMark && !isRequired; if (isRequiredMark || isOptionalMark) { var markClass = isRequiredMark ? FIELD_ITEM_REQUIRED_MARK_CLASS : FIELD_ITEM_OPTIONAL_MARK_CLASS, markText = isRequiredMark ? requiredMarksConfig.requiredMark : requiredMarksConfig.optionalMark; $mark = $("<span />").addClass(markClass).html(" " + markText) } return $mark }, _getRequiredMarksConfig: function() { if (!this._cashedRequiredConfig) { this._cashedRequiredConfig = { showRequiredMark: this.option("showRequiredMark"), showOptionalMark: this.option("showOptionalMark"), requiredMark: this.option("requiredMark"), optionalMark: this.option("optionalMark") } } return this._cashedRequiredConfig }, _renderEditor: function(options) { var editorOptions, dataValue = this._getDataByField(options.dataField), defaultEditorOptions = { value: dataValue }, isDeepExtend = true; if ("dxTagBox" === options.editorType) { defaultEditorOptions.value = defaultEditorOptions.value || [] } editorOptions = extend(isDeepExtend, defaultEditorOptions, options.editorOptions, { inputAttr: { id: options.id }, validationBoundary: options.validationBoundary }); this._replaceDataOptions(options.editorOptions, editorOptions); this._createEditor(options.$container, { editorType: options.editorType, dataField: options.dataField, template: options.template, name: options.name, helpID: options.helpID, isRequired: options.isRequired }, editorOptions) }, _replaceDataOptions: function(originalOptions, resultOptions) { if (originalOptions) { DATA_OPTIONS.forEach(function(item) { if (resultOptions[item]) { resultOptions[item] = originalOptions[item] } }) } }, _renderValidator: function($editor, item) { var fieldName = this._getFieldLabelName(item), validationRules = this._prepareValidationRules(item.validationRules, item.isRequired, item.itemType, fieldName); if (Array.isArray(validationRules)) { this._createComponent($editor, Validator, { validationRules: validationRules, validationGroup: this.option("validationGroup") }) } }, _getFieldLabelName: function(item) { var isItemHaveCustomLabel = item.label && item.label.text, itemName = isItemHaveCustomLabel ? null : this._getName(item); return isItemHaveCustomLabel ? item.label.text : itemName && inflector.captionize(itemName) }, _prepareValidationRules: function(userValidationRules, isItemRequired, itemType, itemName) { var validationRules, isSimpleItem = itemType === SIMPLE_ITEM_TYPE; if (isSimpleItem) { if (userValidationRules) { validationRules = userValidationRules } else { var requiredMessage = stringUtils.format(this.option("requiredMessage"), itemName || ""); validationRules = isItemRequired ? [{ type: "required", message: requiredMessage }] : null } } return validationRules }, _createEditor: function($container, renderOptions, editorOptions) { var editorInstance, that = this, template = renderOptions.template; if (renderOptions.dataField && !editorOptions.name) { editorOptions.name = renderOptions.dataField } that._addItemContentClasses($container); if (template) { var data = { dataField: renderOptions.dataField, editorType: renderOptions.editorType, editorOptions: editorOptions, component: that.option("form") || that }; template.render({ model: data, container: $container }) } else { var $editor = $("<div/>").appendTo($container); try { editorInstance = that._createComponent($editor, renderOptions.editorType, editorOptions); editorInstance.setAria("describedby", renderOptions.helpID); editorInstance.setAria("required", renderOptions.isRequired); if (renderOptions.dataField) { var componentOwner = that.option("form") || that; editorInstance.on("enterKey", function(args) { componentOwner._createActionByOption("onEditorEnterKey")(extend(args, { dataField: renderOptions.dataField })) }); that._registerEditorInstance(editorInstance, renderOptions.dataField); that._createWatcher(editorInstance, $container, renderOptions); that.linkEditorToDataField(editorInstance, renderOptions.dataField, renderOptions.editorType) } } catch (e) { errors.log("E1035", e.message) } } }, _createWatcher: function(editorInstance, $container, renderOptions) { var that = this, watch = that._getWatch(); if (!utils.isFunction(watch)) { return } var dispose = watch(function() { return that._getDataByField(renderOptions.dataField) }, function() { editorInstance.option("value", that._getDataByField(renderOptions.dataField)) }, { deep: true, skipImmediate: true }); $container.on(removeEvent, dispose) }, _getWatch: function() { if (!utils.isDefined(this._watch)) { var formInstance = this.option("form"); this._watch = formInstance && formInstance.option("integrationOptions.watchMethod") } return this._watch }, _addItemContentClasses: function($itemContent) { var locationSpecificClass = this._getItemContentLocationSpecificClass(); $itemContent.addClass([FIELD_ITEM_CONTENT_CLASS, locationSpecificClass].join(" ")) }, _getItemContentLocationSpecificClass: function() { var labelLocation = this.option("labelLocation"), oppositeClasses = { right: "left", left: "right", top: "bottom" }; return FIELD_ITEM_CONTENT_LOCATION_CLASS + oppositeClasses[labelLocation] }, _registerEditorInstance: function(instance, dataField) { this._editorInstancesByField[dataField] = instance }, _createComponent: function($editor, type, editorOptions) { var instance, that = this, readOnlyState = this.option("readOnly"); instance = that.callBase($editor, type, editorOptions); readOnlyState && instance.option("readOnly", readOnlyState); that.on("optionChanged", function(args) { if ("readOnly" === args.name) { instance.option(args.name, args.value) } }); return instance }, _getTemplateByFieldItem: function(fieldItem) { return fieldItem.template ? this._getTemplate(fieldItem.template) : null }, _appendEditorToField: function(params) { if (params.$label) { var location = params.labelOptions.location; if ("top" === location || "left" === location) { params.$fieldItem.append(params.$editor) } if ("right" === location) { params.$fieldItem.prepend(params.$editor) } this._addInnerItemAlignmentClass(params.$fieldItem, location) } else { params.$fieldItem.append(params.$editor) } }, _addInnerItemAlignmentClass: function($fieldItem, location) { if ("top" === location) { $fieldItem.addClass(LABEL_VERTICAL_ALIGNMENT_CLASS) } else { $fieldItem.addClass(LABEL_HORIZONTAL_ALIGNMENT_CLASS) } }, _renderHelpText: function(fieldItem, $editor, helpID) { var helpText = fieldItem.helpText, isSimpleItem = fieldItem.itemType === SIMPLE_ITEM_TYPE; if (helpText && isSimpleItem) { var $editorWrapper = $("<div>").addClass(FIELD_ITEM_CONTENT_WRAPPER_CLASS); $editor.wrap($editorWrapper); $("<div>").addClass(FIELD_ITEM_HELP_TEXT_CLASS).attr("id", helpID).text(helpText).appendTo($editor.parent()) } }, _attachClickHandler: function($label, $editor, editorType) { var isBooleanEditors = "dxCheckBox" === editorType || "dxSwitch" === editorType; if ($label && isBooleanEditors) { $label.on(clickEvent.name, function() { $editor.children().trigger(clickEvent.name) }) } }, _generateRatio: function(count, isAutoSize) { var ratio, i, result = []; for (i = 0; i < count; i++) { ratio = { ratio: 1 }; if (isAutoSize) { ratio.baseSize = "auto" } result.push(ratio) } return result }, _getRowsCount: function() { return Math.ceil(this._items.length / this._getColCount()) }, _optionChanged: function(args) { if (0 === args.fullName.search("layoutData.")) { return } switch (args.name) { case "showRequiredMark": case "showOptionalMark": case "requiredMark": case "optionalMark": this._cashedRequiredConfig = null; this._invalidate(); break; case "layoutData": if (this.option("items")) { if (!isEmptyObject(args.value)) { $.each(this._editorInstancesByField, function(name, editor) { var valueGetter = dataUtils.compileGetter(name), dataValue = valueGetter(args.value); if (utils.isDefined(dataValue)) { editor.option("value", dataValue) } else { editor.reset(); editor.option("isValid", true) } }) } } else { this._initDataAndItems(args.value); this._invalidate() } break; case "items": this._cleanItemWatchers(); this._initDataAndItems(args.value); this._invalidate(); break; case "alignItemLabels": case "labelLocation": case "requiredMessage": this._invalidate(); break; case "customizeItem": this._updateItems(this.option("layoutData")); this._invalidate(); break; case "colCount": this._resetColCount(); break; case "minColWidth": if ("auto" === this.option("colCount")) { this._resetColCount() } break; case "readOnly": break; case "width": this.callBase(args); if ("auto" === this.option("colCount")) { this._resetColCount() } break; case "onFieldDataChanged": break; default: this.callBase(args) } }, _resetColCount: function() { this._cashedColCount = null; this._invalidate() }, linkEditorToDataField: function(editorInstance, dataField, editorType) { var isDataUpdating, fullFieldName = "layoutData." + dataField, that = this; that.on("optionChanged", function(args) { if (args.fullName === fullFieldName) { isDataUpdating = true; if ("object" === typeof args.value) { that._managedUpdateEditorOption(editorInstance, "value", args.value) } else { editorInstance.option("value", args.value) } isDataUpdating = false } }); editorInstance.on("valueChanged", function(args) { var isObjectValue = "object" === typeof args.value, isSameObjectValue = isObjectValue && args.value === args.previousValue; if (!isDataUpdating && !isSameObjectValue) { if (isObjectValue) { that._managedUpdateFieldValue(dataField, args.value) } else { that._updateFieldValue(dataField, args.value) } } }) }, _managedUpdateEditorOption: function(editorInstance, optionName, value) { if (!this._isValueChangedCalled) { this._isFieldValueChanged = true; editorInstance.option(optionName, value); this._isFieldValueChanged = false } }, _managedUpdateFieldValue: function(dataField, value) { this._isValueChangedCalled = true; if (!this._isFieldValueChanged) { this._updateFieldValue(dataField, value) } this._isValueChangedCalled = false }, _dimensionChanged: function() { if ("auto" === this.option("colCount") && this.isCachedColCountObsolete()) { this.fireEvent("autoColCountChanged") } }, getItemID: function(name) { var formInstance = this.option("form"); return formInstance && formInstance.getItemID(name) }, updateData: function(data, value) { var that = this; if (utils.isObject(data)) { $.each(data, function(dataField, fieldValue) { that._updateFieldValue(dataField, fieldValue) }) } else { if ("string" === typeof data) { that._updateFieldValue(data, value) } } }, getEditor: function(field) { return this._editorInstancesByField[field] }, isLayoutChanged: function(component) { var responsiveBox = this._responsiveBox || component; if (responsiveBox) { return responsiveBox.option("currentScreenFactor") === responsiveBox.option("singleColumnScreen") } } }); registerComponent("dxLayoutManager", LayoutManager); module.exports = LayoutManager; module.exports.__internals = { FIELD_ITEM_CLASS: FIELD_ITEM_CLASS, FIELD_EMPTY_ITEM_CLASS: FIELD_EMPTY_ITEM_CLASS, FIELD_ITEM_CONTENT_CLASS: FIELD_ITEM_CONTENT_CLASS, FIELD_ITEM_CONTENT_LOCATION_CLASS: FIELD_ITEM_CONTENT_LOCATION_CLASS, FIELD_ITEM_LABEL_CLASS: FIELD_ITEM_LABEL_CLASS, FIELD_ITEM_LABEL_ALIGN_CLASS: FIELD_ITEM_LABEL_ALIGN_CLASS, FIELD_ITEM_LABEL_LOCATION_CLASS: FIELD_ITEM_LABEL_LOCATION_CLASS, LABEL_HORIZONTAL_ALIGNMENT_CLASS: LABEL_HORIZONTAL_ALIGNMENT_CLASS, LABEL_VERTICAL_ALIGNMENT_CLASS: LABEL_VERTICAL_ALIGNMENT_CLASS, FORM_LAYOUT_MANAGER_CLASS: FORM_LAYOUT_MANAGER_CLASS, FIELD_ITEM_CONTENT_WRAPPER_CLASS: FIELD_ITEM_CONTENT_WRAPPER_CLASS, FIELD_ITEM_HELP_TEXT_CLASS: FIELD_ITEM_HELP_TEXT_CLASS, FIELD_ITEM_LABEL_CONTENT_CLASS: FIELD_ITEM_LABEL_CONTENT_CLASS, FIELD_ITEM_LABEL_TEXT_CLASS: FIELD_ITEM_LABEL_TEXT_CLASS, FIELD_ITEM_REQUIRED_CLASS: FIELD_ITEM_REQUIRED_CLASS, FIELD_ITEM_OPTIONAL_CLASS: FIELD_ITEM_OPTIONAL_CLASS, FIELD_ITEM_REQUIRED_MARK_CLASS: FIELD_ITEM_REQUIRED_MARK_CLASS, FIELD_ITEM_OPTIONAL_MARK_CLASS: FIELD_ITEM_OPTIONAL_MARK_CLASS, LAYOUT_MANAGER_ONE_COLUMN: LAYOUT_MANAGER_ONE_COLUMN, FLEX_LAYOUT_CLASS: FLEX_LAYOUT_CLASS } }, /*!****************************!*\ !*** ./js/ui/validator.js ***! \****************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), errors = __webpack_require__( /*! ./widget/ui.errors */ 22), DOMComponent = __webpack_require__( /*! ../core/dom_component */ 43), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, ValidationMixin = __webpack_require__( /*! ./validation/validation_mixin */ 108), ValidationEngine = __webpack_require__( /*! ./validation_engine */ 117), DefaultAdapter = __webpack_require__( /*! ./validation/default_adapter */ 289), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57); var VALIDATOR_CLASS = "dx-validator"; var Validator = DOMComponent.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { validationRules: [] }) }, _init: function() { this.callBase(); this._initGroupRegistration(); this.focused = $.Callbacks(); this._initAdapter() }, _initGroupRegistration: function() { var group = this._findGroup(); if (!this._groupWasInit) { this.on("disposing", function(args) { ValidationEngine.removeRegisteredValidator(args.component._validationGroup, args.component) }) } if (!this._groupWasInit || this._validationGroup !== group) { ValidationEngine.removeRegisteredValidator(this._validationGroup, this); this._groupWasInit = true; this._validationGroup = group; ValidationEngine.registerValidatorInGroup(group, this) } }, _setOptionsByReference: function() { this.callBase(); extend(this._optionsByReference, { validationGroup: true }) }, _initAdapter: function() { var that = this, element = that.element()[0], dxStandardEditor = $.data(element, "dx-validation-target"), adapter = that.option("adapter"); if (!adapter) { if (dxStandardEditor) { adapter = new DefaultAdapter(dxStandardEditor, this); adapter.validationRequestsCallbacks.add(function() { that.validate() }); this.option("adapter", adapter); return } throw errors.Error("E0120") } if (adapter.validationRequestsCallbacks) { adapter.validationRequestsCallbacks.add(function() { that.validate() }) } }, _render: function() { this.element().addClass(VALIDATOR_CLASS); this.callBase() }, _visibilityChanged: function(visible) { if (visible) { this._initGroupRegistration() } }, _optionChanged: function(args) { switch (args.name) { case "validationGroup": this._initGroupRegistration(); return; case "validationRules": void 0 !== this.option("isValid") && this.validate(); return; case "adapter": this._initAdapter(); break; default: this.callBase(args) } }, validate: function() { var result, that = this, adapter = that.option("adapter"), name = that.option("name"), bypass = adapter.bypass && adapter.bypass(), value = adapter.getValue(), currentError = adapter.getCurrentValidationError && adapter.getCurrentValidationError(), rules = $.map(that.option("validationRules"), function(rule) { rule.validator = that; return rule }); if (bypass) { result = { isValid: true } } else { if (currentError && currentError.editorSpecific) { currentError.validator = this; result = { isValid: false, brokenRule: currentError } } else { result = ValidationEngine.validate(value, rules, name) } } this._applyValidationResult(result, adapter); return result }, reset: function() { var that = this, adapter = that.option("adapter"), result = { isValid: true, brokenRule: null }; adapter.reset(); this._applyValidationResult(result, adapter) }, _applyValidationResult: function(result, adapter) { var validatedAction = this._createActionByOption("onValidated"); result.validator = this; adapter.applyValidationResults && adapter.applyValidationResults(result); this.option({ isValid: result.isValid }); validatedAction(result) }, focus: function() { var adapter = this.option("adapter"); adapter && adapter.focus && adapter.focus() } }).include(ValidationMixin); registerComponent("dxValidator", Validator); module.exports = Validator }, /*!*********************************************!*\ !*** ./js/ui/validation/default_adapter.js ***! \*********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25); var DefaultAdapter = Class.inherit({ ctor: function(editor, validator) { var that = this; that.editor = editor; that.validator = validator; that.validationRequestsCallbacks = $.Callbacks(); var handler = function() { that.validationRequestsCallbacks.fire() }; editor.validationRequest.add(handler); editor.on("disposing", function() { editor.validationRequest.remove(handler) }) }, getValue: function() { return this.editor.option("value") }, getCurrentValidationError: function() { return this.editor.option("validationError") }, bypass: function() { return this.editor.option("disabled") }, applyValidationResults: function(params) { this.editor.option({ isValid: params.isValid, validationError: params.brokenRule }) }, reset: function() { this.editor.reset() }, focus: function() { this.editor.focus() } }); module.exports = DefaultAdapter }, /*!*********************************!*\ !*** ./js/ui/responsive_box.js ***! \*********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), typeUtils = __webpack_require__( /*! ../core/utils/type */ 12), errors = __webpack_require__( /*! ./widget/ui.errors */ 22), windowUtils = __webpack_require__( /*! ../core/utils/window */ 44), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), Box = __webpack_require__( /*! ./box */ 252), CollectionWidget = __webpack_require__( /*! ./collection/ui.collection_widget.edit */ 149); var RESPONSIVE_BOX_CLASS = "dx-responsivebox", SCREEN_SIZE_CLASS_PREFIX = RESPONSIVE_BOX_CLASS + "-screen-", BOX_ITEM_CLASS = "dx-box-item", BOX_ITEM_DATA_KEY = "dxBoxItemData"; var ResponsiveBox = CollectionWidget.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { rows: [], cols: [], screenByWidth: null, singleColumnScreen: "", height: "100%", width: "100%", activeStateEnabled: false, focusStateEnabled: false, onItemStateChanged: void 0, onLayoutChanged: null, currentScreenFactor: void 0, _layoutStrategy: void 0 }) }, _init: function() { if (!this.option("screenByWidth")) { this._options.screenByWidth = windowUtils.defaultScreenFactorFunc } this.callBase(); this._initLayoutChangedAction() }, _initLayoutChangedAction: function() { this._layoutChangedAction = this._createActionByOption("onLayoutChanged", { excludeValidators: ["disabled", "readonly"] }) }, _itemClass: function() { return BOX_ITEM_CLASS }, _itemDataKey: function() { return BOX_ITEM_DATA_KEY }, _render: function() { this.callBase(); this.element().addClass(RESPONSIVE_BOX_CLASS); this._updateRootBox() }, _updateRootBox: function() { clearTimeout(this._updateTimer); this._updateTimer = setTimeout(function() { if (this._$root) { this._$root.triggerHandler("dxupdate") } }.bind(this)) }, _renderItems: function() { this._setScreenSize(); this._screenItems = this._itemsByScreen(); this._prepareGrid(); this._spreadItems(); this._layoutItems(); this._linkNodeToItem() }, _setScreenSize: function() { var currentScreen = this._getCurrentScreen(); this._removeScreenSizeClass(); this.element().addClass(SCREEN_SIZE_CLASS_PREFIX + currentScreen); this.option("currentScreenFactor", currentScreen) }, _removeScreenSizeClass: function() { var currentScreenFactor = this.option("currentScreenFactor"); currentScreenFactor && this.element().removeClass(SCREEN_SIZE_CLASS_PREFIX + currentScreenFactor) }, _prepareGrid: function() { var grid = this._grid = []; this._prepareRowsAndCols(); $.each(this._rows, function() { var row = []; grid.push(row); $.each(this._cols, function() { row.push(this._createEmptyCell()) }.bind(this)) }.bind(this)) }, _prepareRowsAndCols: function() { if (this._isSingleColumnScreen()) { this._prepareSingleColumnScreenItems(); this._rows = this._defaultSizeConfig(this._screenItems.length); this._cols = this._defaultSizeConfig(1) } else { this._rows = this._sizesByScreen(this.option("rows")); this._cols = this._sizesByScreen(this.option("cols")) } }, _isSingleColumnScreen: function() { return this._screenRegExp().test(this.option("singleColumnScreen")) || !this.option("rows").length || !this.option("cols").length }, _prepareSingleColumnScreenItems: function() { this._screenItems.sort(function(item1, item2) { return item1.location.row - item2.location.row || item1.location.col - item2.location.col }); $.each(this._screenItems, function(index, item) { extend(item.location, { row: index, col: 0, rowspan: 1, colspan: 1 }) }) }, _sizesByScreen: function(sizeConfigs) { return $.map(this._filterByScreen(sizeConfigs), function(sizeConfig) { return extend(this._defaultSizeConfig(), sizeConfig) }.bind(this)) }, _defaultSizeConfig: function(size) { var defaultSizeConfig = { ratio: 1, baseSize: 0, minSize: 0, maxSize: 0 }; if (!arguments.length) { return defaultSizeConfig } var result = []; for (var i = 0; i < size; i++) { result.push(defaultSizeConfig) } return result }, _filterByScreen: function(items) { var screenRegExp = this._screenRegExp(); return commonUtils.grep(items, function(item) { return !item.screen || screenRegExp.test(item.screen) }) }, _screenRegExp: function() { var screen = this._getCurrentScreen(); return new RegExp("(^|\\s)" + screen + "($|\\s)", "i") }, _getCurrentScreen: function() { var width = this._screenWidth(); return this.option("screenByWidth")(width) }, _screenWidth: function() { return $(window).width() }, _createEmptyCell: function() { return { item: {}, location: { colspan: 1, rowspan: 1 } } }, _spreadItems: function() { $.each(this._screenItems, function(_, itemInfo) { var location = itemInfo.location || {}; var itemCol = location.col; var itemRow = location.row; var row = this._grid[itemRow]; var itemCell = row && row[itemCol]; this._occupyCells(itemCell, itemInfo) }.bind(this)) }, _itemsByScreen: function() { return $.map(this.option("items"), function(item) { var locations = item.location || {}; locations = typeUtils.isPlainObject(locations) ? [locations] : locations; return $.map(this._filterByScreen(locations), function(location) { return { item: item, location: extend({ rowspan: 1, colspan: 1 }, location) } }) }.bind(this)) }, _occupyCells: function(itemCell, itemInfo) { if (!itemCell || this._isItemCellOccupied(itemCell, itemInfo)) { return } extend(itemCell, itemInfo); this._markSpanningCell(itemCell) }, _isItemCellOccupied: function(itemCell, itemInfo) { if (!typeUtils.isEmptyObject(itemCell.item)) { return true } var result = false; this._loopOverSpanning(itemInfo.location, function(cell) { result = result || !typeUtils.isEmptyObject(cell.item) }); return result }, _loopOverSpanning: function(location, callback) { var rowEnd = location.row + location.rowspan - 1; var colEnd = location.col + location.colspan - 1; var boundRowEnd = Math.min(rowEnd, this._rows.length - 1); var boundColEnd = Math.min(colEnd, this._cols.length - 1); location.rowspan -= rowEnd - boundRowEnd; location.colspan -= colEnd - boundColEnd; for (var rowIndex = location.row; rowIndex <= boundRowEnd; rowIndex++) { for (var colIndex = location.col; colIndex <= boundColEnd; colIndex++) { if (rowIndex !== location.row || colIndex !== location.col) { callback(this._grid[rowIndex][colIndex]) } } } }, _markSpanningCell: function(itemCell) { this._loopOverSpanning(itemCell.location, function(cell) { extend(cell, { item: itemCell.item, spanningCell: itemCell }) }) }, _linkNodeToItem: function() { $.each(this._itemElements(), function(_, itemNode) { var $item = $(itemNode), item = $item.data(BOX_ITEM_DATA_KEY); if (!item.box) { item.node = $item.children() } }) }, _layoutItems: function() { var rowsCount = this._grid.length; var colsCount = rowsCount && this._grid[0].length; if (!rowsCount && !colsCount) { return } var result = this._layoutBlock({ direction: "col", row: { start: 0, end: rowsCount - 1 }, col: { start: 0, end: colsCount - 1 } }); var rootBox = this._prepareBoxConfig(result.box || { direction: "row", items: [extend(result, { ratio: 1 })] }); extend(rootBox, this._rootBoxConfig()); this._$root = $("<div>").appendTo(this._itemContainer()); this._createComponent(this._$root, Box, rootBox) }, _rootBoxConfig: function() { return extend({ width: "100%", height: "100%", itemTemplate: this.option("itemTemplate"), itemHoldTimeout: this.option("itemHoldTimeout"), onItemHold: this._createActionByOption("onItemHold"), onItemClick: this._createActionByOption("onItemClick"), onItemContextMenu: this._createActionByOption("onItemContextMenu"), onItemRendered: this._createActionByOption("onItemRendered") }, { _layoutStrategy: this.option("_layoutStrategy") }) }, _prepareBoxConfig: function(config) { return extend(config || {}, { crossAlign: "stretch", onItemStateChanged: this.option("onItemStateChanged") }) }, _layoutBlock: function(options) { if (this._isSingleItem(options)) { return this._itemByCell(options.row.start, options.col.start) } return this._layoutDirection(options) }, _isSingleItem: function(options) { var firstCellLocation = this._grid[options.row.start][options.col.start].location; var isItemRowSpanned = options.row.end - options.row.start === firstCellLocation.rowspan - 1; var isItemColSpanned = options.col.end - options.col.start === firstCellLocation.colspan - 1; return isItemRowSpanned && isItemColSpanned }, _itemByCell: function(rowIndex, colIndex) { var itemCell = this._grid[rowIndex][colIndex]; return itemCell.spanningCell ? null : itemCell.item }, _layoutDirection: function(options) { var items = []; var direction = options.direction; var crossDirection = this._crossDirection(direction); var block; while (block = this._nextBlock(options)) { if (this._isBlockIndivisible(options.prevBlockOptions, block)) { throw errors.Error("E1025") } var item = this._layoutBlock({ direction: crossDirection, row: block.row, col: block.col, prevBlockOptions: options }); if (item) { extend(item, this._blockSize(block, crossDirection)); items.push(item) } options[crossDirection].start = block[crossDirection].end + 1 } return { box: this._prepareBoxConfig({ direction: direction, items: items }) } }, _isBlockIndivisible: function(options, block) { return options && options.col.start === block.col.start && options.col.end === block.col.end && options.row.start === block.row.start && options.row.end === block.row.end }, _crossDirection: function(direction) { return "col" === direction ? "row" : "col" }, _nextBlock: function(options) { var direction = options.direction; var crossDirection = this._crossDirection(direction); var startIndex = options[direction].start; var endIndex = options[direction].end; var crossStartIndex = options[crossDirection].start; if (crossStartIndex > options[crossDirection].end) { return null } var crossSpan = 1; for (var crossIndex = crossStartIndex; crossIndex < crossStartIndex + crossSpan; crossIndex++) { var lineCrossSpan = 1; for (var index = startIndex; index <= endIndex; index++) { var cell = this._cellByDirection(direction, index, crossIndex); lineCrossSpan = Math.max(lineCrossSpan, cell.location[crossDirection + "span"]) } var lineCrossEndIndex = crossIndex + lineCrossSpan; var crossEndIndex = crossStartIndex + crossSpan; if (lineCrossEndIndex > crossEndIndex) { crossSpan += lineCrossEndIndex - crossEndIndex } } var result = {}; result[direction] = { start: startIndex, end: endIndex }; result[crossDirection] = { start: crossStartIndex, end: crossStartIndex + crossSpan - 1 }; return result }, _cellByDirection: function(direction, index, crossIndex) { return "col" === direction ? this._grid[crossIndex][index] : this._grid[index][crossIndex] }, _blockSize: function(block, direction) { var sizeConfigs = "row" === direction ? this._rows : this._cols; var result = { ratio: 0, baseSize: 0, minSize: 0, maxSize: 0 }; for (var index = block[direction].start; index <= block[direction].end; index++) { var sizeConfig = sizeConfigs[index]; result.ratio += sizeConfig.ratio; result.baseSize += sizeConfig.baseSize; result.minSize += sizeConfig.minSize; result.maxSize += sizeConfig.maxSize } result.minSize = result.minSize ? result.minSize : "auto"; result.maxSize = result.maxSize ? result.maxSize : "auto"; this._isSingleColumnScreen() && (result.baseSize = "auto"); return result }, _update: function() { var $existingRoot = this._$root; this._renderItems(); $existingRoot && $existingRoot.detach(); this._saveAssistantRoot($existingRoot); this._layoutChangedAction(); this._updateRootBox() }, _saveAssistantRoot: function($root) { this._assistantRoots = this._assistantRoots || []; this._assistantRoots.push($root) }, _dispose: function() { clearTimeout(this._updateTimer); this._cleanUnusedRoots(); this.callBase.apply(this, arguments) }, _cleanUnusedRoots: function() { if (!this._assistantRoots) { return } $.each(this._assistantRoots, function() { $(this).remove() }) }, _clearItemNodeTemplates: function() { $.each(this.option("items"), function() { delete this.node }) }, _toggleVisibility: function(visible) { this.callBase(visible); if (visible) { this._updateRootBox() } }, _attachClickEvent: commonUtils.noop, _optionChanged: function(args) { switch (args.name) { case "rows": case "cols": case "screenByWidth": case "_layoutStrategy": case "singleColumnScreen": this._clearItemNodeTemplates(); this._invalidate(); break; case "width": case "height": this.callBase(args); this._update(); break; case "onLayoutChanged": this._initLayoutChangedAction(); break; case "itemTemplate": this._clearItemNodeTemplates(); this.callBase(args); break; case "currentScreenFactor": break; default: this.callBase(args) } }, _dimensionChanged: function() { if (this._getCurrentScreen() !== this.option("currentScreenFactor")) { this._update() } }, repaint: function() { this._update() } }); registerComponent("dxResponsiveBox", ResponsiveBox); module.exports = ResponsiveBox }, /*!****************************!*\ !*** ./js/ui/tab_panel.js ***! \****************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), support = __webpack_require__( /*! ../core/utils/support */ 61), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, devices = __webpack_require__( /*! ../core/devices */ 53), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), MultiView = __webpack_require__( /*! ./multi_view */ 292), Tabs = __webpack_require__( /*! ./tabs */ 293), iconUtils = __webpack_require__( /*! ../core/utils/icon */ 115), BindableTemplate = __webpack_require__( /*! ./widget/bindable_template */ 166); var TABPANEL_CLASS = "dx-tabpanel", TABPANEL_TABS_CLASS = "dx-tabpanel-tabs", TABPANEL_CONTAINER_CLASS = "dx-tabpanel-container", TABS_ITEM_TEXT_CLASS = "dx-tab-text"; var TabPanel = MultiView.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { itemTitleTemplate: "title", hoverStateEnabled: true, showNavButtons: false, scrollByContent: true, scrollingEnabled: true, onTitleClick: null, onTitleHold: null, onTitleRendered: null }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function() { return "desktop" === devices.real().deviceType && !devices.isSimulator() }, options: { focusStateEnabled: true } }, { device: function() { return !support.touch }, options: { swipeEnabled: false } }, { device: { platform: "generic" }, options: { animationEnabled: false } }]) }, _init: function() { this.callBase(); this.element().addClass(TABPANEL_CLASS); this.setAria("role", "tabpanel"); this._renderLayout() }, _initTemplates: function() { this.callBase(); this._defaultTemplates.title = new BindableTemplate(function($container, data) { $container.text(data.title || String(data)); var icon = data.icon, iconSrc = data.iconSrc, $iconElement = iconUtils.getImageContainer(icon || iconSrc); $container.wrapInner($("<span>").addClass(TABS_ITEM_TEXT_CLASS)); $iconElement && $iconElement.prependTo($container) }, ["title", "html", "icon", "iconSrc"], this.option("integrationOptions.watchMethod")) }, _renderContent: function() { var that = this; this.callBase(); if (this.option("templatesRenderAsynchronously")) { this._resizeEventTimer = setTimeout(function() { that._updateLayout() }, 0) } }, _renderLayout: function() { var $element = this.element(); this._$tabContainer = $("<div>").addClass(TABPANEL_TABS_CLASS).appendTo($element); var $tabs = $("<div>").appendTo(this._$tabContainer); this._tabs = this._createComponent($tabs, Tabs, this._tabConfig()); this._$container = $("<div>").addClass(TABPANEL_CONTAINER_CLASS).appendTo($element); this._$container.append(this._$wrapper); this._updateLayout() }, _updateLayout: function() { var tabsHeight = this._$tabContainer.outerHeight(); this._$container.css({ "margin-top": -tabsHeight, "padding-top": tabsHeight }) }, _refreshActiveDescendant: function() { var tabs = this._tabs, tabItems = tabs.itemElements(), $activeTab = $(tabItems[tabs.option("selectedIndex")]), id = this.getFocusedItemId(); this.setAria("controls", void 0, $(tabItems)); this.setAria("controls", id, $activeTab) }, _tabConfig: function() { return { selectOnFocus: true, focusStateEnabled: this.option("focusStateEnabled"), hoverStateEnabled: this.option("hoverStateEnabled"), tabIndex: this.option("tabIndex"), selectedIndex: this.option("selectedIndex"), onItemClick: this.option("onTitleClick"), onItemHold: this.option("onTitleHold"), itemHoldTimeout: this.option("itemHoldTimeout"), onSelectionChanged: function(e) { this.option("selectedIndex", e.component.option("selectedIndex")); this._refreshActiveDescendant() }.bind(this), onItemRendered: this.option("onTitleRendered"), itemTemplate: this._getTemplateByOption("itemTitleTemplate"), items: this.option("items"), noDataText: null, scrollingEnabled: this.option("scrollingEnabled"), scrollByContent: this.option("scrollByContent"), showNavButtons: this.option("showNavButtons"), itemTemplateProperty: "tabTemplate", loopItemFocus: this.option("loop"), selectionRequired: true, onOptionChanged: function(args) { var name = args.name, value = args.value; if ("focusedElement" === name) { var id = value ? value.index() : value; var newItem = value ? this._itemElements().eq(id) : value; this.option("focusedElement", newItem) } }.bind(this), onFocusIn: function(args) { this._focusInHandler(args.jQueryEvent) }.bind(this), onFocusOut: function(args) { this._focusOutHandler(args.jQueryEvent) }.bind(this) } }, _renderFocusTarget: function() { this._focusTarget().attr("tabindex", -1); this._refreshActiveDescendant() }, _updateFocusState: function(e, isFocused) { this.callBase(e, isFocused); if (e.target === this._tabs._focusTarget().get(0)) { this._toggleFocusClass(isFocused, this._focusTarget()) } }, _setTabsOption: function(name, value) { if (this._tabs) { this._tabs.option(name, value) } }, _visibilityChanged: function(visible) { if (visible) { this._tabs._dimensionChanged(); this._updateLayout() } }, _optionChanged: function(args) { var name = args.name, value = args.value, fullName = args.fullName; switch (name) { case "dataSource": this.callBase(args); break; case "items": this._setTabsOption(fullName, value); this._updateLayout(); this._tabs.repaint(); this.callBase(args); break; case "selectedIndex": case "selectedItem": case "itemHoldTimeout": case "focusStateEnabled": case "hoverStateEnabled": this._setTabsOption(fullName, value); this.callBase(args); break; case "scrollingEnabled": case "scrollByContent": case "showNavButtons": this._setTabsOption(fullName, value); break; case "focusedElement": var id = value ? value.index() : value; var newItem = value ? this._tabs._itemElements().eq(id) : value; this._setTabsOption("focusedElement", newItem); this.callBase(args); this._tabs.focus(); break; case "itemTitleTemplate": this._setTabsOption("itemTemplate", this._getTemplateByOption("itemTitleTemplate")); break; case "onTitleClick": this._setTabsOption("onItemClick", value); break; case "onTitleHold": this._setTabsOption("onItemHold", value); break; case "onTitleRendered": this._setTabsOption("onItemRendered", value); break; case "loop": this._setTabsOption("loopItemFocus", value); break; default: this.callBase(args) } }, _clean: function() { clearTimeout(this._resizeEventTimer); this.callBase() } }); registerComponent("dxTabPanel", TabPanel); module.exports = TabPanel }, /*!*****************************!*\ !*** ./js/ui/multi_view.js ***! \*****************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), fx = __webpack_require__( /*! ../animation/fx */ 68), translator = __webpack_require__( /*! ../animation/translator */ 69), mathUtils = __webpack_require__( /*! ../core/utils/math */ 87), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), devices = __webpack_require__( /*! ../core/devices */ 53), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), CollectionWidget = __webpack_require__( /*! ./collection/ui.collection_widget.edit */ 149), Swipeable = __webpack_require__( /*! ../events/gesture/swipeable */ 255); var MULTIVIEW_CLASS = "dx-multiview", MULTIVIEW_WRAPPER_CLASS = "dx-multiview-wrapper", MULTIVIEW_ITEM_CONTAINER_CLASS = "dx-multiview-item-container", MULTIVIEW_ITEM_CLASS = "dx-multiview-item", MULTIVIEW_ITEM_HIDDEN_CLASS = "dx-multiview-item-hidden", MULTIVIEW_ITEM_DATA_KEY = "dxMultiViewItemData", MULTIVIEW_ANIMATION_DURATION = 200; var toNumber = function(value) { return +value }; var position = function($element) { return translator.locate($element).left }; var move = function($element, position) { translator.move($element, { left: position }) }; var animation = { moveTo: function($element, position, duration, completeAction) { fx.animate($element, { type: "slide", to: { left: position }, duration: duration, complete: completeAction }) }, complete: function($element) { fx.stop($element, true) } }; var MultiView = CollectionWidget.inherit({ _activeStateUnit: "." + MULTIVIEW_ITEM_CLASS, _supportedKeys: function() { return extend(this.callBase(), { pageUp: commonUtils.noop, pageDown: commonUtils.noop }) }, _getDefaultOptions: function() { return extend(this.callBase(), { selectedIndex: 0, swipeEnabled: true, animationEnabled: true, loop: false, deferRendering: true, _itemAttributes: { role: "tabpanel" }, loopItemFocus: false, selectOnFocus: true, selectionMode: "single", selectionRequired: true, selectionByClick: false }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function() { return "desktop" === devices.real().deviceType && !devices.isSimulator() }, options: { focusStateEnabled: true } }]) }, _itemClass: function() { return MULTIVIEW_ITEM_CLASS }, _itemDataKey: function() { return MULTIVIEW_ITEM_DATA_KEY }, _itemContainer: function() { return this._$itemContainer }, _itemElements: function() { return this._itemContainer().children(this._itemSelector()) }, _itemWidth: function() { if (!this._itemWidthValue) { this._itemWidthValue = this._$wrapper.width() } return this._itemWidthValue }, _clearItemWidthCache: function() { delete this._itemWidthValue }, _itemsCount: function() { return this.option("items").length }, _normalizeIndex: function(index) { var count = this._itemsCount(); if (index < 0) { index += count } if (index >= count) { index -= count } return index }, _getRTLSignCorrection: function() { return this.option("rtlEnabled") ? -1 : 1 }, _init: function() { this.callBase.apply(this, arguments); var $element = this.element(); $element.addClass(MULTIVIEW_CLASS); this._$wrapper = $("<div>").addClass(MULTIVIEW_WRAPPER_CLASS); this._$wrapper.appendTo($element); this._$itemContainer = $("<div>").addClass(MULTIVIEW_ITEM_CONTAINER_CLASS); this._$itemContainer.appendTo(this._$wrapper); this.option("loopItemFocus", this.option("loop")); this._initSwipeable() }, _render: function() { this._deferredItems = []; this.callBase() }, _renderItemContent: function(args) { var renderContentDeferred = $.Deferred(); var that = this, callBase = this.callBase; var deferred = $.Deferred(); deferred.done(function() { var $itemContent = callBase.call(that, args); renderContentDeferred.resolve($itemContent) }); this._deferredItems.push(deferred); this.option("deferRendering") || deferred.resolve(); return renderContentDeferred.promise() }, _renderSelection: function(addedSelection) { this._updateItems(addedSelection[0]) }, _updateItems: function(selectedIndex, newIndex) { this._updateItemsPosition(selectedIndex, newIndex); this._updateItemsVisibility(selectedIndex, newIndex) }, _updateItemsPosition: function(selectedIndex, newIndex) { var $itemElements = this._itemElements(), positionSign = -this._animationDirection(newIndex, selectedIndex), $selectedItem = $itemElements.eq(selectedIndex); move($selectedItem, 0); move($itemElements.eq(newIndex), 100 * positionSign + "%") }, _updateItemsVisibility: function(selectedIndex, newIndex) { var $itemElements = this._itemElements(); $itemElements.each(function(itemIndex, item) { var $item = $(item), isHidden = itemIndex !== selectedIndex && itemIndex !== newIndex; if (!isHidden) { this._renderSpecificItem(itemIndex) } $item.toggleClass(MULTIVIEW_ITEM_HIDDEN_CLASS, isHidden); this.setAria("hidden", isHidden || void 0, $item) }.bind(this)) }, _renderSpecificItem: function(index) { var hasItemContent = this._itemElements().eq(index).find(this._itemContentClass()).length > 0; if (commonUtils.isDefined(index) && !hasItemContent) { this._deferredItems[index].resolve() } }, _setAriaSelected: commonUtils.noop, _updateSelection: function(addedSelection, removedSelection) { var newIndex = addedSelection[0], prevIndex = removedSelection[0]; animation.complete(this._$itemContainer); this._updateItems(prevIndex, newIndex); var animationDirection = this._animationDirection(newIndex, prevIndex); this._animateItemContainer(animationDirection * this._itemWidth(), function() { move(this._$itemContainer, 0); this._updateItems(newIndex); this._$itemContainer.width() }.bind(this)) }, _animateItemContainer: function(position, completeCallback) { var duration = this.option("animationEnabled") ? MULTIVIEW_ANIMATION_DURATION : 0; animation.moveTo(this._$itemContainer, position, duration, completeCallback) }, _animationDirection: function(newIndex, prevIndex) { var containerPosition = position(this._$itemContainer), indexDifference = (prevIndex - newIndex) * this._getRTLSignCorrection() * this._getItemFocusLoopSignCorrection(), isSwipePresent = 0 !== containerPosition, directionSignVariable = isSwipePresent ? containerPosition : indexDifference; return mathUtils.sign(directionSignVariable) }, _initSwipeable: function() { this._createComponent(this.element(), Swipeable, { disabled: !this.option("swipeEnabled"), elastic: false, itemSizeFunc: this._itemWidth.bind(this), onStart: function(args) { this._swipeStartHandler(args.jQueryEvent) }.bind(this), onUpdated: function(args) { this._swipeUpdateHandler(args.jQueryEvent) }.bind(this), onEnd: function(args) { this._swipeEndHandler(args.jQueryEvent) }.bind(this) }) }, _swipeStartHandler: function(e) { animation.complete(this._$itemContainer); var selectedIndex = this.option("selectedIndex"), loop = this.option("loop"), lastIndex = this._itemsCount() - 1, rtl = this.option("rtlEnabled"); e.maxLeftOffset = toNumber(loop || (rtl ? selectedIndex > 0 : selectedIndex < lastIndex)); e.maxRightOffset = toNumber(loop || (rtl ? selectedIndex < lastIndex : selectedIndex > 0)); this._swipeDirection = null }, _swipeUpdateHandler: function(e) { var offset = e.offset, swipeDirection = mathUtils.sign(offset) * this._getRTLSignCorrection(); move(this._$itemContainer, offset * this._itemWidth()); if (swipeDirection !== this._swipeDirection) { this._swipeDirection = swipeDirection; var selectedIndex = this.option("selectedIndex"), newIndex = this._normalizeIndex(selectedIndex - swipeDirection); this._updateItems(selectedIndex, newIndex) } }, _swipeEndHandler: function(e) { var targetOffset = e.targetOffset * this._getRTLSignCorrection(); if (targetOffset) { this.option("selectedIndex", this._normalizeIndex(this.option("selectedIndex") - targetOffset)); var $selectedElement = this.itemElements().filter(".dx-item-selected"); this.option("focusStateEnabled") && this.option("focusedElement", $selectedElement) } else { this._animateItemContainer(0, commonUtils.noop) } }, _getItemFocusLoopSignCorrection: function() { return this._itemFocusLooped ? -1 : 1 }, _moveFocus: function() { this.callBase.apply(this, arguments); this._itemFocusLooped = false }, _prevItem: function($items) { var $result = this.callBase.apply(this, arguments); this._itemFocusLooped = $result.is($items.last()); return $result }, _nextItem: function($items) { var $result = this.callBase.apply(this, arguments); this._itemFocusLooped = $result.is($items.first()); return $result }, _dimensionChanged: function() { this._clearItemWidthCache() }, _visibilityChanged: function(visible) { if (visible) { this._dimensionChanged() } }, _optionChanged: function(args) { var value = args.value; switch (args.name) { case "loop": this.option("loopItemFocus", value); break; case "animationEnabled": break; case "swipeEnabled": Swipeable.getInstance(this.element()).option("disabled", !value); break; case "deferRendering": this._invalidate(); break; default: this.callBase(args) } } }); registerComponent("dxMultiView", MultiView); module.exports = MultiView; module.exports.animation = animation }, /*!***********************!*\ !*** ./js/ui/tabs.js ***! \***********************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), devices = __webpack_require__( /*! ../core/devices */ 53), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), Button = __webpack_require__( /*! ./button */ 201), inkRipple = __webpack_require__( /*! ./widget/utils.ink_ripple */ 202), eventUtils = __webpack_require__( /*! ../events/utils */ 71), domUtils = __webpack_require__( /*! ../core/utils/dom */ 56), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, isPlainObject = __webpack_require__( /*! ../core/utils/type */ 12).isPlainObject, pointerEvents = __webpack_require__( /*! ../events/pointer */ 76), TabsItem = __webpack_require__( /*! ./tabs/item */ 294), themes = __webpack_require__( /*! ./themes */ 143), holdEvent = __webpack_require__( /*! ../events/hold */ 164), Scrollable = __webpack_require__( /*! ./scroll_view/ui.scrollable */ 244), CollectionWidget = __webpack_require__( /*! ./collection/ui.collection_widget.edit */ 149), iconUtils = __webpack_require__( /*! ../core/utils/icon */ 115), BindableTemplate = __webpack_require__( /*! ./widget/bindable_template */ 166); var TABS_CLASS = "dx-tabs", TABS_WRAPPER_CLASS = "dx-tabs-wrapper", TABS_EXPANDED_CLASS = "dx-tabs-expanded", TABS_SCROLLABLE_CLASS = "dx-tabs-scrollable", TABS_NAV_BUTTONS_CLASS = "dx-tabs-nav-buttons", TABS_ITEM_CLASS = "dx-tab", TABS_ITEM_SELECTED_CLASS = "dx-tab-selected", TABS_NAV_BUTTON_CLASS = "dx-tabs-nav-button", TABS_LEFT_NAV_BUTTON_CLASS = "dx-tabs-nav-button-left", TABS_RIGHT_NAV_BUTTON_CLASS = "dx-tabs-nav-button-right", TABS_ITEM_TEXT_CLASS = "dx-tab-text", TABS_ITEM_DATA_KEY = "dxTabData", FEEDBACK_HIDE_TIMEOUT = 100, FEEDBACK_DURATION_INTERVAL = 5, FEEDBACK_SCROLL_TIMEOUT = 300, TAB_OFFSET = 30; var Tabs = CollectionWidget.inherit({ _activeStateUnit: "." + TABS_ITEM_CLASS, _getDefaultOptions: function() { return extend(this.callBase(), { hoverStateEnabled: true, showNavButtons: false, scrollByContent: true, scrollingEnabled: true, selectionMode: "single", activeStateEnabled: true, selectionRequired: false, selectOnFocus: true, loopItemFocus: false, useInkRipple: false, badgeExpr: function(data) { return data ? data.badge : void 0 } }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: { platform: "generic" }, options: { showNavButtons: true, scrollByContent: false } }, { device: function() { return "desktop" === devices.real().deviceType && !devices.isSimulator() }, options: { focusStateEnabled: true } }, { device: function() { return /android5/.test(themes.current()) }, options: { useInkRipple: true } }]) }, _init: function() { this.callBase(); this.setAria("role", "tablist"); this.element().addClass(TABS_CLASS); this._renderMultiple(); this._feedbackHideTimeout = FEEDBACK_HIDE_TIMEOUT }, _initTemplates: function() { this.callBase(); this._defaultTemplates.item = new BindableTemplate(function($container, data) { if (isPlainObject(data)) { if (data.text) { $container.text(data.text) } if (data.html) { $container.html(data.html) } } else { $container.text(String(data)) } var icon = data.icon, iconSrc = data.iconSrc, $iconElement = iconUtils.getImageContainer(icon || iconSrc); $container.wrapInner($("<span>").addClass(TABS_ITEM_TEXT_CLASS)); $iconElement && $iconElement.prependTo($container) }, ["text", "html", "icon", "iconSrc"], this.option("integrationOptions.watchMethod")) }, _itemClass: function() { return TABS_ITEM_CLASS }, _selectedItemClass: function() { return TABS_ITEM_SELECTED_CLASS }, _itemDataKey: function() { return TABS_ITEM_DATA_KEY }, _renderContent: function() { var that = this; this.callBase(); if (this.option("templatesRenderAsynchronously")) { this._resizeEventTimer = setTimeout(function() { domUtils.triggerResizeEvent(that.element()) }, 0) } }, _render: function() { this.callBase(); this._renderWrapper(); this._renderScrolling(); this.setAria("role", "tab", this.itemElements()); this.option("useInkRipple") && this._renderInkRipple() }, _renderScrolling: function() { this.element().removeClass(TABS_EXPANDED_CLASS); if (this._allowScrolling()) { if (!this._scrollable) { this._renderScrollable(); this._renderNavButtons() } this._scrollable.update(); this._updateNavButtonsVisibility(); if (this.option("rtlEnabled")) { this._scrollable.scrollTo({ left: this._scrollable.scrollWidth() - this._scrollable.clientWidth() }) } this._scrollToItem(this.option("selectedItem")) } if (!this._allowScrolling()) { this._cleanScrolling(); this.element().removeClass(TABS_NAV_BUTTONS_CLASS).addClass(TABS_EXPANDED_CLASS) } }, _cleanNavButtons: function() { if (!this._leftButton || !this._rightButton) { return } this._leftButton.element().remove(); this._rightButton.element().remove(); this._leftButton = null; this._rightButton = null }, _cleanScrolling: function() { if (!this._scrollable) { return } this._scrollable.content().children("." + TABS_WRAPPER_CLASS).appendTo(this._itemContainer()); this._scrollable.element().remove(); this._scrollable = null; this._cleanNavButtons() }, _renderInkRipple: function() { this._inkRipple = inkRipple.render() }, _toggleActiveState: function($element, value, e) { this.callBase.apply(this, arguments); if (!this._inkRipple) { return } var config = { element: $element, jQueryEvent: e }; if (value) { this._inkRipple.showWave(config) } else { this._inkRipple.hideWave(config) } }, _renderMultiple: function() { if ("multiple" === this.option("selectionMode")) { this.option("selectOnFocus", false) } }, _renderWrapper: function() { this.element().wrapInner($("<div>").addClass(TABS_WRAPPER_CLASS)) }, _renderScrollable: function() { var $itemContainer = this.element().wrapInner($("<div>").addClass(TABS_SCROLLABLE_CLASS)).children(); this._scrollable = this._createComponent($itemContainer, Scrollable, { direction: "horizontal", showScrollbar: false, useKeyboard: false, useNative: false, scrollByContent: this.option("scrollByContent"), onScroll: this._updateNavButtonsVisibility.bind(this) }); this.element().append(this._scrollable.element()) }, _scrollToItem: function(itemData) { if (!this._scrollable) { return } var $item = this._editStrategy.getItemElement(itemData); this._scrollable.scrollToElement($item) }, _allowScrolling: function() { if (!this.option("scrollingEnabled")) { return false } var tabItemsWidth = 0; this.itemElements().each(function(_, tabItem) { tabItemsWidth += $(tabItem).outerWidth(true) }); return tabItemsWidth - 1 > this.element().width() }, _renderNavButtons: function() { this.element().toggleClass(TABS_NAV_BUTTONS_CLASS, this.option("showNavButtons")); if (!this.option("showNavButtons")) { return } this._leftButton = this._createNavButton(-TAB_OFFSET, "chevronprev"); var $leftButton = this._leftButton.element(); $leftButton.addClass(TABS_LEFT_NAV_BUTTON_CLASS); this.element().prepend($leftButton); this._rightButton = this._createNavButton(TAB_OFFSET, "chevronnext"); var $rightButton = this._rightButton.element(); $rightButton.addClass(TABS_RIGHT_NAV_BUTTON_CLASS); this.element().append($rightButton) }, _updateNavButtonsVisibility: function() { this._leftButton && this._leftButton.option("disabled", this._scrollable.scrollLeft() <= 0); this._rightButton && this._rightButton.option("disabled", this._scrollable.scrollLeft() >= Math.round(this._scrollable.scrollWidth() - this._scrollable.clientWidth())) }, _updateScrollPosition: function(offset, duration) { this._scrollable.update(); this._scrollable.scrollBy(offset / duration) }, _createNavButton: function(offset, icon) { var that = this; var holdAction = that._createAction(function() { that._holdInterval = setInterval(function() { that._updateScrollPosition(offset, FEEDBACK_DURATION_INTERVAL) }, FEEDBACK_DURATION_INTERVAL) }), holdEventName = eventUtils.addNamespace(holdEvent.name, "dxNavButton"), pointerUpEventName = eventUtils.addNamespace(pointerEvents.up, "dxNavButton"), pointerOutEventName = eventUtils.addNamespace(pointerEvents.out, "dxNavButton"); var navButton = this._createComponent($("<div>").addClass(TABS_NAV_BUTTON_CLASS), Button, { focusStateEnabled: false, icon: icon, onClick: function() { that._updateScrollPosition(offset, 1) }, integrationOptions: {} }); navButton.element().on(holdEventName, { timeout: FEEDBACK_SCROLL_TIMEOUT }, function(e) { holdAction({ jQueryEvent: e }) }.bind(this)).on(pointerUpEventName, function() { that._clearInterval() }).on(pointerOutEventName, function() { that._clearInterval() }); return navButton }, _clearInterval: function() { if (this._holdInterval) { clearInterval(this._holdInterval) } }, _renderSelection: function(addedSelection) { this._scrollable && this._scrollable.scrollToElement(this.itemElements().eq(addedSelection[0]), { left: 1, right: 1 }) }, _visibilityChanged: function(visible) { if (visible) { this._dimensionChanged() } }, _dimensionChanged: function() { if (this.option("scrollingEnabled")) { this._renderScrolling() } }, _itemSelectHandler: function(e) { if ("single" === this.option("selectionMode") && this.isItemSelected(e.currentTarget)) { return } this.callBase(e) }, _clean: function() { this._scrollable = null; clearTimeout(this._resizeEventTimer); this.callBase() }, _optionChanged: function(args) { switch (args.name) { case "useInkRipple": case "scrollingEnabled": case "showNavButtons": this._invalidate(); break; case "scrollByContent": this._scrollable && this._scrollable.option(args.name, args.value); break; case "selectionMode": this._renderMultiple(); this.callBase(args); break; case "badgeExpr": this._invalidate(); break; default: this.callBase(args) } } }); Tabs.ItemClass = TabsItem; registerComponent("dxTabs", Tabs); module.exports = Tabs }, /*!****************************!*\ !*** ./js/ui/tabs/item.js ***! \****************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), CollectionWidgetItem = __webpack_require__( /*! ../collection/item */ 163); var TABS_ITEM_BADGE_CLASS = "dx-tabs-item-badge", BADGE_CLASS = "dx-badge"; var TabsItem = CollectionWidgetItem.inherit({ _renderWatchers: function() { this.callBase(); this._startWatcher("badge", this._renderBadge.bind(this)) }, _renderBadge: function(badge) { this._$element.children("." + BADGE_CLASS).remove(); if (!badge) { return } var $badge = $("<div>").addClass(TABS_ITEM_BADGE_CLASS).addClass(BADGE_CLASS).text(badge); this._$element.append($badge) } }); module.exports = TabsItem }, /*!*************************************!*\ !*** ./js/ui/validation_summary.js ***! \*************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), grep = __webpack_require__( /*! ../core/utils/common */ 14).grep, extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, ValidationMixin = __webpack_require__( /*! ./validation/validation_mixin */ 108), ValidationEngine = __webpack_require__( /*! ./validation_engine */ 117), CollectionWidget = __webpack_require__( /*! ./collection/ui.collection_widget.edit */ 149); var VALIDATION_SUMMARY_CLASS = "dx-validationsummary", ITEM_CLASS = VALIDATION_SUMMARY_CLASS + "-item", ITEM_DATA_KEY = VALIDATION_SUMMARY_CLASS + "-item-data"; var ValidationSummary = CollectionWidget.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { focusStateEnabled: false, noDataText: null }) }, _setOptionsByReference: function() { this.callBase(); extend(this._optionsByReference, { validationGroup: true }) }, _init: function() { this.callBase(); this._initGroupRegistration() }, _initGroupRegistration: function() { var group = this._findGroup(), groupConfig = ValidationEngine.addGroup(group); this._unsubscribeGroup(); this._groupWasInit = true; this._validationGroup = group; this.groupSubscription = this._groupValidationHandler.bind(this); groupConfig.on("validated", this.groupSubscription) }, _unsubscribeGroup: function() { var groupConfig = ValidationEngine.getGroupConfig(this._validationGroup); groupConfig && groupConfig.off("validated", this.groupSubscription) }, _getOrderedItems: function(validators, items) { var orderedItems = []; $.each(validators, function(_, validator) { var firstItem = grep(items, function(item) { if (item.validator === validator) { return true } })[0]; if (firstItem) { orderedItems.push(firstItem) } }); return orderedItems }, _groupValidationHandler: function(params) { var that = this, items = that._getOrderedItems(params.validators, $.map(params.brokenRules, function(rule) { return { text: rule.message, validator: rule.validator } })); that.validators = params.validators; $.each(that.validators, function(_, validator) { if (validator._validationSummary !== this) { var handler = that._itemValidationHandler.bind(that), disposingHandler = function() { validator.off("validated", handler); validator._validationSummary = null; handler = null }; validator.on("validated", handler); validator.on("disposing", disposingHandler); validator._validationSummary = this } }); that.option("items", items) }, _itemValidationHandler: function(itemValidationResult) { var elementIndex, items = this.option("items"), isValid = itemValidationResult.isValid, replacementFound = false, newMessage = itemValidationResult.brokenRule && itemValidationResult.brokenRule.message, validator = itemValidationResult.validator; $.each(items, function(index, item) { if (item.validator === validator) { if (isValid) { elementIndex = index } else { item.text = newMessage } replacementFound = true; return false } }); if (isValid ^ replacementFound) { return } if (isValid) { items.splice(elementIndex, 1) } else { items.push({ text: newMessage, validator: validator }) } items = this._getOrderedItems(this.validators, items); this.option("items", items) }, _render: function() { this.element().addClass(VALIDATION_SUMMARY_CLASS); this.callBase() }, _optionChanged: function(args) { switch (args.name) { case "validationGroup": this._initGroupRegistration(); break; default: this.callBase(args) } }, _itemClass: function() { return ITEM_CLASS }, _itemDataKey: function() { return ITEM_DATA_KEY }, _postprocessRenderItem: function(params) { params.itemElement.on("click", function() { params.itemData.validator && params.itemData.validator.focus && params.itemData.validator.focus() }) }, _dispose: function() { this.callBase(); this._unsubscribeGroup() } }).include(ValidationMixin); registerComponent("dxValidationSummary", ValidationSummary); module.exports = ValidationSummary }, /*!***********************************!*\ !*** ./js/ui/validation_group.js ***! \***********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), DOMComponent = __webpack_require__( /*! ../core/dom_component */ 43), ValidationSummary = __webpack_require__( /*! ./validation_summary */ 295), ValidationEngine = __webpack_require__( /*! ./validation_engine */ 117), Validator = __webpack_require__( /*! ./validator */ 288); var VALIDATION_ENGINE_CLASS = "dx-validationgroup"; var ValidationGroup = DOMComponent.inherit({ _getDefaultOptions: function() { return this.callBase() }, _init: function() { this.callBase() }, _render: function() { var $element = this.element(); $element.addClass(VALIDATION_ENGINE_CLASS); $element.find(".dx-validator").each(function(_, validatorContainer) { Validator.getInstance($(validatorContainer))._initGroupRegistration() }); $element.find(".dx-validationsummary").each(function(_, summaryContainer) { ValidationSummary.getInstance($(summaryContainer))._initGroupRegistration() }); this.callBase() }, validate: function() { return ValidationEngine.validateGroup(this) }, reset: function() { return ValidationEngine.resetGroup(this) }, _optionChanged: function(args) { switch (args.name) { default: this.callBase(args) } }, _dispose: function() { ValidationEngine.removeGroup(this); this.element().removeClass(VALIDATION_ENGINE_CLASS); this.callBase() } }); registerComponent("dxValidationGroup", ValidationGroup); module.exports = ValidationGroup }, /*!**************************!*\ !*** ./js/ui/gallery.js ***! \**************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), typeUtils = __webpack_require__( /*! ../core/utils/type */ 12), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, fx = __webpack_require__( /*! ../animation/fx */ 68), clickEvent = __webpack_require__( /*! ../events/click */ 75), translator = __webpack_require__( /*! ../animation/translator */ 69), devices = __webpack_require__( /*! ../core/devices */ 53), Widget = __webpack_require__( /*! ./widget/ui.widget */ 95), eventUtils = __webpack_require__( /*! ../events/utils */ 71), CollectionWidget = __webpack_require__( /*! ./collection/ui.collection_widget.edit */ 149), Swipeable = __webpack_require__( /*! ../events/gesture/swipeable */ 255), BindableTemplate = __webpack_require__( /*! ./widget/bindable_template */ 166); var GALLERY_CLASS = "dx-gallery", GALLERY_WRAPPER_CLASS = GALLERY_CLASS + "-wrapper", GALLERY_LOOP_CLASS = "dx-gallery-loop", GALLERY_ITEM_CONTAINER_CLASS = GALLERY_CLASS + "-container", GALLERY_ACTIVE_CLASS = GALLERY_CLASS + "-active", GALLERY_ITEM_CLASS = GALLERY_CLASS + "-item", GALLERY_LOOP_ITEM_CLASS = GALLERY_ITEM_CLASS + "-loop", GALLERY_ITEM_SELECTOR = "." + GALLERY_ITEM_CLASS, GALLERY_ITEM_SELECTED_CLASS = GALLERY_ITEM_CLASS + "-selected", GALLERY_INDICATOR_CLASS = GALLERY_CLASS + "-indicator", GALLERY_INDICATOR_ITEM_CLASS = GALLERY_INDICATOR_CLASS + "-item", GALLERY_INDICATOR_ITEM_SELECTOR = "." + GALLERY_INDICATOR_ITEM_CLASS, GALLERY_INDICATOR_ITEM_SELECTED_CLASS = GALLERY_INDICATOR_ITEM_CLASS + "-selected", GALLERY_IMAGE_CLASS = "dx-gallery-item-image", GALLERY_ITEM_DATA_KEY = "dxGalleryItemData", MAX_CALC_ERROR = 1; var GalleryNavButton = Widget.inherit({ _supportedKeys: function() { return extend(this.callBase(), { pageUp: commonUtils.noop, pageDown: commonUtils.noop }) }, _getDefaultOptions: function() { return extend(this.callBase(), { direction: "next", onClick: null, hoverStateEnabled: true, activeStateEnabled: true }) }, _render: function() { this.callBase(); var that = this, $element = this.element(), eventName = eventUtils.addNamespace(clickEvent.name, this.NAME); $element.addClass(GALLERY_CLASS + "-nav-button-" + this.option("direction")).off(eventName).on(eventName, function(e) { that._createActionByOption("onClick")({ jQueryEvent: e }) }) }, _optionChanged: function(args) { switch (args.name) { case "onClick": case "direction": this._invalidate(); break; default: this.callBase(args) } } }); var Gallery = CollectionWidget.inherit({ _activeStateUnit: GALLERY_ITEM_SELECTOR, _getDefaultOptions: function() { return extend(this.callBase(), { activeStateEnabled: false, animationDuration: 400, animationEnabled: true, loop: false, swipeEnabled: true, indicatorEnabled: true, showIndicator: true, selectedIndex: 0, slideshowDelay: 0, showNavButtons: false, wrapAround: false, initialItemWidth: void 0, stretchImages: false, _itemAttributes: { role: "option" }, loopItemFocus: false, selectOnFocus: true, selectionMode: "single", selectionRequired: true, selectionByClick: false }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function() { return "desktop" === devices.real().deviceType && !devices.isSimulator() }, options: { focusStateEnabled: true } }]) }, _init: function() { this.callBase(); this.option("loopItemFocus", this.option("loop")) }, _initTemplates: function() { this.callBase(); this._defaultTemplates.item = new BindableTemplate(function($container, data) { var $img = $("<img>").addClass(GALLERY_IMAGE_CLASS); if (typeUtils.isPlainObject(data)) { $img.attr({ src: data.imageSrc, alt: data.imageAlt }).appendTo($container) } else { $img.attr("src", String(data)).appendTo($container) } }, ["imageSrc", "imageAlt"], this.option("integrationOptions.watchMethod")) }, _dataSourceOptions: function() { return { paginate: false } }, _itemContainer: function() { return this._$container }, _itemClass: function() { return GALLERY_ITEM_CLASS }, _itemDataKey: function() { return GALLERY_ITEM_DATA_KEY }, _actualItemWidth: function() { var itemPerPage = this.option("wrapAround") ? this._itemsPerPage() + 1 : this._itemsPerPage(); if (this.option("stretchImages")) { return 1 / itemPerPage } if (this.option("wrapAround")) { return this._itemPercentWidth() * this._itemsPerPage() / (this._itemsPerPage() + 1) } return this._itemPercentWidth() }, _itemPercentWidth: function() { var percentWidth, elementWidth = this.element().outerWidth(), initialItemWidth = this.option("initialItemWidth"); if (initialItemWidth && initialItemWidth <= elementWidth) { percentWidth = this.option("initialItemWidth") / elementWidth } else { percentWidth = 1 } return percentWidth }, _itemsPerPage: function() { var itemsPerPage = Math.floor(1 / this._itemPercentWidth()); return Math.min(itemsPerPage, this._itemsCount()) }, _pagesCount: function() { return Math.ceil(this._itemsCount() / this._itemsPerPage()) }, _itemsCount: function() { return (this.option("items") || []).length }, _offsetDirection: function() { return this.option("rtlEnabled") ? -1 : 1 }, _render: function() { this.element().addClass(GALLERY_CLASS); this.element().toggleClass(GALLERY_LOOP_CLASS, this.option("loop")); this._renderDragHandler(); this._renderWrapper(); this._renderItemsContainer(); this.callBase(); this._renderContainerPosition(); this._renderItemSizes(); this._renderItemPositions(); this._renderNavButtons(); this._renderIndicator(); this._renderSelectedItem(); this._renderUserInteraction(); this._setupSlideShow(); this._reviseDimensions(); this.setAria({ role: "listbox", label: "gallery" }); this._fireContentReadyAction() }, _renderContent: function() { this._renderContentImpl() }, _dimensionChanged: function() { var selectedIndex = this.option("selectedIndex") || 0; this._stopItemAnimations(); this._clearCacheWidth(); this._renderDuplicateItems(); this._renderItemSizes(); this._renderItemPositions(); this._renderIndicator(); this._renderContainerPosition(this._calculateIndexOffset(selectedIndex)) }, _renderDragHandler: function() { var eventName = eventUtils.addNamespace("dragstart", this.NAME); this.element().off(eventName).on(eventName, "img", function() { return false }) }, _renderWrapper: function() { if (this._$wrapper) { return } this._$wrapper = $("<div />").addClass(GALLERY_WRAPPER_CLASS).appendTo(this.element()) }, _renderItems: function(items) { this.callBase(items); this._loadNextPageIfNeeded() }, _renderItemsContainer: function() { if (this._$container) { return } this._$container = $("<div>").addClass(GALLERY_ITEM_CONTAINER_CLASS).appendTo(this._$wrapper) }, _renderDuplicateItems: function() { if (!this.option("loop")) { return } var i, items = this.option("items") || [], itemsCount = items.length, lastItemIndex = itemsCount - 1; if (!itemsCount) { return } this.element().find("." + GALLERY_LOOP_ITEM_CLASS).remove(); var duplicateCount = Math.min(this._itemsPerPage(), itemsCount); for (i = 0; i < duplicateCount; i++) { this._renderItem(0, items[i]).addClass(GALLERY_LOOP_ITEM_CLASS) } for (i = 0; i < duplicateCount; i++) { this._renderItem(0, items[lastItemIndex - i]).addClass(GALLERY_LOOP_ITEM_CLASS) } }, _emptyMessageContainer: function() { return this._$wrapper }, _renderItemSizes: function(startIndex) { var $items = this._itemElements(), itemWidth = this._actualItemWidth(); if (void 0 !== startIndex) { $items = $items.slice(startIndex) } $items.each(function(index) { $($items[index]).outerWidth(100 * itemWidth + "%") }) }, _renderItemPositions: function() { var itemWidth = this._actualItemWidth(), itemsCount = this._itemsCount(), itemsPerPage = this._itemsPerPage(), loopItemsCount = this.element().find("." + GALLERY_LOOP_ITEM_CLASS).length, lastItemDuplicateIndex = itemsCount + loopItemsCount - 1, offsetRatio = this.option("wrapAround") ? .5 : 0, freeSpace = this._itemFreeSpace(), rtlEnabled = this.option("rtlEnabled"); this._itemElements().each(function(index) { var realIndex = index; if (index > itemsCount + itemsPerPage - 1) { realIndex = lastItemDuplicateIndex - realIndex - itemsPerPage } var itemPosition = itemWidth * (realIndex + offsetRatio) + freeSpace * (realIndex + 1 - offsetRatio); $(this).css(rtlEnabled ? "right" : "left", 100 * itemPosition + "%") }); this._relocateItems(this.option("selectedIndex"), this.option("selectedIndex"), true) }, _itemFreeSpace: function() { var itemsPerPage = this._itemsPerPage(); if (this.option("wrapAround")) { itemsPerPage += 1 } return (1 - this._actualItemWidth() * itemsPerPage) / (itemsPerPage + 1) }, _renderContainerPosition: function(offset, animate) { offset = offset || 0; var positionReady, that = this, itemWidth = this._actualItemWidth(), targetIndex = offset, targetPosition = this._offsetDirection() * targetIndex * (itemWidth + this._itemFreeSpace()); if (commonUtils.isDefined(this._animationOverride)) { animate = this._animationOverride; delete this._animationOverride } if (animate) { that._startSwipe(); positionReady = that._animate(targetPosition).done(that._endSwipe.bind(that)) } else { translator.move(this._$container, { left: targetPosition * this._elementWidth(), top: 0 }); positionReady = $.Deferred().resolveWith(that) } if (this._deferredAnimate) { positionReady.done(function() { that._deferredAnimate.resolveWith(that) }) } return positionReady.promise() }, _startSwipe: function() { this.element().addClass(GALLERY_ACTIVE_CLASS) }, _endSwipe: function() { this.element().removeClass(GALLERY_ACTIVE_CLASS) }, _animate: function(targetPosition, extraConfig) { var that = this, $container = this._$container, animationComplete = $.Deferred(); fx.animate(this._$container, extend({ type: "slide", to: { left: targetPosition * this._elementWidth() }, duration: that.option("animationDuration"), complete: function() { if (that._needMoveContainerForward()) { translator.move($container, { left: 0, top: 0 }) } if (that._needMoveContainerBack()) { translator.move($container, { left: that._maxContainerOffset() * that._elementWidth(), top: 0 }) } animationComplete.resolveWith(that) } }, extraConfig || {})); return animationComplete }, _needMoveContainerForward: function() { var expectedPosition = this._$container.position().left * this._offsetDirection(), actualPosition = -this._maxItemWidth() * this._elementWidth() * this._itemsCount(); return expectedPosition <= actualPosition + MAX_CALC_ERROR }, _needMoveContainerBack: function() { var expectedPosition = this._$container.position().left * this._offsetDirection(), actualPosition = this._actualItemWidth() * this._elementWidth(); return expectedPosition >= actualPosition - MAX_CALC_ERROR }, _maxContainerOffset: function() { return -this._maxItemWidth() * (this._itemsCount() - this._itemsPerPage()) * this._offsetDirection() }, _maxItemWidth: function() { return this._actualItemWidth() + this._itemFreeSpace() }, _reviseDimensions: function() { var that = this, $firstItem = that._itemElements().first().find(".dx-item-content"); if (!$firstItem || $firstItem.is(":hidden")) { return } if (!that.option("height")) { that.option("height", $firstItem.outerHeight()) } if (!that.option("width")) { that.option("width", $firstItem.outerWidth()) } this._dimensionChanged() }, _renderIndicator: function() { this._cleanIndicators(); if (!this.option("showIndicator")) { return } var indicator = this._$indicator = $("<div>").addClass(GALLERY_INDICATOR_CLASS).appendTo(this._$wrapper); for (var i = 0; i < this._pagesCount(); i++) { $("<div>").addClass(GALLERY_INDICATOR_ITEM_CLASS).appendTo(indicator) } this._renderSelectedPageIndicator() }, _cleanIndicators: function() { if (this._$indicator) { this._$indicator.remove() } }, _renderSelectedItem: function() { var selectedIndex = this.option("selectedIndex"); this._itemElements().removeClass(GALLERY_ITEM_SELECTED_CLASS).eq(selectedIndex).addClass(GALLERY_ITEM_SELECTED_CLASS) }, _renderSelectedPageIndicator: function() { if (!this._$indicator) { return } var itemIndex = this.option("selectedIndex"), lastIndex = this._pagesCount() - 1, pageIndex = Math.ceil(itemIndex / this._itemsPerPage()); pageIndex = Math.min(lastIndex, pageIndex); this._$indicator.find(GALLERY_INDICATOR_ITEM_SELECTOR).removeClass(GALLERY_INDICATOR_ITEM_SELECTED_CLASS).eq(pageIndex).addClass(GALLERY_INDICATOR_ITEM_SELECTED_CLASS) }, _renderUserInteraction: function() { var rootElement = this.element(), swipeEnabled = this.option("swipeEnabled") && this._itemsCount() > 1; this._createComponent(rootElement, Swipeable, { disabled: this.option("disabled") || !swipeEnabled, onStart: this._swipeStartHandler.bind(this), onUpdated: this._swipeUpdateHandler.bind(this), onEnd: this._swipeEndHandler.bind(this), itemSizeFunc: this._elementWidth.bind(this) }); var indicatorSelectAction = this._createAction(this._indicatorSelectHandler); rootElement.off(eventUtils.addNamespace(clickEvent.name, this.NAME), GALLERY_INDICATOR_ITEM_SELECTOR).on(eventUtils.addNamespace(clickEvent.name, this.NAME), GALLERY_INDICATOR_ITEM_SELECTOR, function(e) { indicatorSelectAction({ jQueryEvent: e }) }) }, _indicatorSelectHandler: function(args) { var e = args.jQueryEvent, instance = args.component; if (!instance.option("indicatorEnabled")) { return } var indicatorIndex = $(e.target).index(), itemIndex = instance._fitPaginatedIndex(indicatorIndex * instance._itemsPerPage()); instance._needLongMove = true; instance.option("selectedIndex", itemIndex); instance._loadNextPageIfNeeded(itemIndex) }, _renderNavButtons: function() { var that = this; if (!that.option("showNavButtons")) { that._cleanNavButtons(); return } that._prevNavButton = $("<div>").appendTo(this._$wrapper); that._createComponent(that._prevNavButton, GalleryNavButton, { direction: "prev", onClick: function() { that._prevPage() } }); that._nextNavButton = $("<div>").appendTo(this._$wrapper); that._createComponent(that._nextNavButton, GalleryNavButton, { direction: "next", onClick: function() { that._nextPage() } }); this._renderNavButtonsVisibility() }, _prevPage: function() { var visiblePageSize = this._itemsPerPage(), newSelectedIndex = this.option("selectedIndex") - visiblePageSize; if (newSelectedIndex === -visiblePageSize && visiblePageSize === this._itemsCount()) { return this._relocateItems(newSelectedIndex, 0) } else { return this.goToItem(this._fitPaginatedIndex(newSelectedIndex)) } }, _nextPage: function() { var visiblePageSize = this._itemsPerPage(), newSelectedIndex = this.option("selectedIndex") + visiblePageSize; if (newSelectedIndex === visiblePageSize && visiblePageSize === this._itemsCount()) { return this._relocateItems(newSelectedIndex, 0) } else { return this.goToItem(this._fitPaginatedIndex(newSelectedIndex)).done(this._loadNextPageIfNeeded) } }, _loadNextPageIfNeeded: function(selectedIndex) { selectedIndex = void 0 === selectedIndex ? this.option("selectedIndex") : selectedIndex; if (this._dataSource && this._dataSource.paginate() && this._shouldLoadNextPage(selectedIndex) && !this._isDataSourceLoading() && !this._isLastPage()) { this._loadNextPage().done(function() { this._renderIndicator(); this._renderItemPositions(); this._renderNavButtonsVisibility(); this._renderItemSizes(selectedIndex) }.bind(this)) } }, _shouldLoadNextPage: function(selectedIndex) { var visiblePageSize = this._itemsPerPage(); return selectedIndex + 2 * visiblePageSize > this.option("items").length }, _allowDynamicItemsAppend: function() { return true }, _fitPaginatedIndex: function(itemIndex) { var itemsPerPage = this._itemsPerPage(); var restItemsCount = itemIndex < 0 ? itemsPerPage + itemIndex : this._itemsCount() - itemIndex; if (itemIndex > this._itemsCount() - 1) { itemIndex = 0; this._goToGhostItem = true } else { if (restItemsCount < itemsPerPage && restItemsCount > 0) { if (itemIndex > 0) { itemIndex -= itemsPerPage - restItemsCount } else { itemIndex += itemsPerPage - restItemsCount } } } return itemIndex }, _cleanNavButtons: function() { if (this._prevNavButton) { this._prevNavButton.remove(); delete this._prevNavButton } if (this._nextNavButton) { this._nextNavButton.remove(); delete this._nextNavButton } }, _renderNavButtonsVisibility: function() { if (!this.option("showNavButtons") || !this._prevNavButton || !this._nextNavButton) { return } var selectedIndex = this.option("selectedIndex"), loop = this.option("loop"), itemsCount = this._itemsCount(); this._prevNavButton.show(); this._nextNavButton.show(); if (0 === itemsCount) { this._prevNavButton.hide(); this._nextNavButton.hide() } if (loop) { return } var nextHidden = selectedIndex === itemsCount - this._itemsPerPage(), prevHidden = itemsCount < 2 || 0 === selectedIndex; if (this._dataSource && this._dataSource.paginate()) { nextHidden = nextHidden && this._isLastPage() } else { nextHidden = nextHidden || itemsCount < 2 } if (prevHidden) { this._prevNavButton.hide() } if (nextHidden) { this._nextNavButton.hide() } }, _setupSlideShow: function() { var that = this, slideshowDelay = that.option("slideshowDelay"); clearTimeout(that._slideshowTimer); if (!slideshowDelay) { return } that._slideshowTimer = setTimeout(function() { if (that._userInteraction) { that._setupSlideShow(); return } that.nextItem(true).done(that._setupSlideShow) }, slideshowDelay) }, _elementWidth: function() { if (!this._cacheElementWidth) { this._cacheElementWidth = this.element().width() } return this._cacheElementWidth }, _clearCacheWidth: function() { delete this._cacheElementWidth }, _swipeStartHandler: function(e) { this._clearCacheWidth(); this._elementWidth(); var itemsCount = this._itemsCount(); if (!itemsCount) { e.jQueryEvent.cancel = true; return } this._stopItemAnimations(); this._startSwipe(); this._userInteraction = true; if (!this.option("loop")) { var selectedIndex = this.option("selectedIndex"), startOffset = itemsCount - selectedIndex - this._itemsPerPage(), endOffset = selectedIndex, rtlEnabled = this.option("rtlEnabled"); e.jQueryEvent.maxLeftOffset = rtlEnabled ? endOffset : startOffset; e.jQueryEvent.maxRightOffset = rtlEnabled ? startOffset : endOffset } }, _stopItemAnimations: function() { fx.stop(this._$container, true) }, _swipeUpdateHandler: function(e) { var wrapAroundRatio = this.option("wrapAround") ? 1 : 0; var offset = this._offsetDirection() * e.jQueryEvent.offset * (this._itemsPerPage() + wrapAroundRatio) - this.option("selectedIndex"); if (offset < 0) { this._loadNextPageIfNeeded(Math.ceil(Math.abs(offset))) } this._renderContainerPosition(offset) }, _swipeEndHandler: function(e) { var targetOffset = e.jQueryEvent.targetOffset * this._offsetDirection() * this._itemsPerPage(), selectedIndex = this.option("selectedIndex"), newIndex = this._fitIndex(selectedIndex - targetOffset), paginatedIndex = this._fitPaginatedIndex(newIndex); if (Math.abs(targetOffset) < this._itemsPerPage()) { this._relocateItems(selectedIndex); return } if (this._itemsPerPage() === this._itemsCount()) { if (targetOffset > 0) { this._relocateItems(-targetOffset) } else { this._relocateItems(0) } return } this.option("selectedIndex", paginatedIndex) }, _setFocusOnSelect: function() { this._userInteraction = true; var selectedItem = this.itemElements().filter("." + GALLERY_ITEM_SELECTED_CLASS); this.option("focusedElement", selectedItem); this._userInteraction = false }, _flipIndex: function(index) { var itemsCount = this._itemsCount(); index %= itemsCount; if (index > (itemsCount + 1) / 2) { index -= itemsCount } if (index < -(itemsCount - 1) / 2) { index += itemsCount } return index }, _fitIndex: function(index) { if (!this.option("loop")) { return index } var itemsCount = this._itemsCount(); if (index >= itemsCount || index < 0) { this._goToGhostItem = true } if (index >= itemsCount) { index = itemsCount - index } index %= itemsCount; if (index < 0) { index += itemsCount } return index }, _clean: function() { this.callBase(); this._cleanIndicators(); this._cleanNavButtons() }, _dispose: function() { clearTimeout(this._slideshowTimer); this.callBase() }, _updateSelection: function(addedSelection, removedSelection) { this._stopItemAnimations(); this._renderNavButtonsVisibility(); this._renderSelectedItem(); this._relocateItems(addedSelection[0], removedSelection[0]); this._renderSelectedPageIndicator() }, _relocateItems: function(newIndex, prevIndex, withoutAnimation) { if (void 0 === prevIndex) { prevIndex = newIndex } var indexOffset = this._calculateIndexOffset(newIndex, prevIndex); this._renderContainerPosition(indexOffset, this.option("animationEnabled") && !withoutAnimation).done(function() { this._setFocusOnSelect(); this._userInteraction = false; this._setupSlideShow() }) }, _focusInHandler: function() { if (fx.isAnimating(this._$container) || this._userInteraction) { return } this.callBase.apply(this, arguments) }, _focusOutHandler: function() { if (fx.isAnimating(this._$container) || this._userInteraction) { return } this.callBase.apply(this, arguments) }, _selectFocusedItem: commonUtils.noop, _moveFocus: function() { this._stopItemAnimations(); this.callBase.apply(this, arguments); var index = this.itemElements().index(this.option("focusedElement")); this.goToItem(index, this.option("animationEnabled")) }, _visibilityChanged: function(visible) { if (visible) { this._reviseDimensions() } }, _calculateIndexOffset: function(newIndex, lastIndex) { if (void 0 === lastIndex) { lastIndex = newIndex } var indexOffset = lastIndex - newIndex; if (this.option("loop") && !this._needLongMove && this._goToGhostItem) { if (this._isItemOnFirstPage(newIndex) && this._isItemOnLastPage(lastIndex)) { indexOffset = -this._itemsPerPage() } else { if (this._isItemOnLastPage(newIndex) && this._isItemOnFirstPage(lastIndex)) { indexOffset = this._itemsPerPage() } } this._goToGhostItem = false } this._needLongMove = false; indexOffset -= lastIndex; return indexOffset }, _isItemOnLastPage: function(itemIndex) { return itemIndex >= this._itemsCount() - this._itemsPerPage() }, _isItemOnFirstPage: function(itemIndex) { return itemIndex <= this._itemsPerPage() }, _optionChanged: function(args) { var value = args.value; switch (args.name) { case "width": case "initialItemWidth": this.callBase.apply(this, arguments); this._dimensionChanged(); break; case "animationDuration": this._renderNavButtonsVisibility(); break; case "animationEnabled": break; case "loop": this.option("loopItemFocus", value); this.element().toggleClass(GALLERY_LOOP_CLASS, value); this._renderDuplicateItems(); this._renderItemPositions(); this._renderNavButtonsVisibility(); return; case "showIndicator": this._renderIndicator(); return; case "showNavButtons": this._renderNavButtons(); return; case "slideshowDelay": this._setupSlideShow(); return; case "wrapAround": case "stretchImages": this._renderItemSizes(); this._renderItemPositions(); break; case "swipeEnabled": case "indicatorEnabled": this._renderUserInteraction(); return; default: this.callBase(args) } }, goToItem: function(itemIndex, animation) { var selectedIndex = this.option("selectedIndex"), itemsCount = this._itemsCount(); if (void 0 !== animation) { this._animationOverride = animation } itemIndex = this._fitIndex(itemIndex); this._deferredAnimate = $.Deferred(); if (itemIndex > itemsCount - 1 || itemIndex < 0 || selectedIndex === itemIndex) { return this._deferredAnimate.resolveWith(this).promise() } this.option("selectedIndex", itemIndex); return this._deferredAnimate.promise() }, prevItem: function(animation) { return this.goToItem(this.option("selectedIndex") - 1, animation) }, nextItem: function(animation) { return this.goToItem(this.option("selectedIndex") + 1, animation) } }); registerComponent("dxGallery", Gallery); module.exports = Gallery }, /*!*************************!*\ !*** ./js/ui/lookup.js ***! \*************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), support = __webpack_require__( /*! ../core/utils/support */ 61), commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, inkRipple = __webpack_require__( /*! ./widget/utils.ink_ripple */ 202), messageLocalization = __webpack_require__( /*! ../localization/message */ 89), devices = __webpack_require__( /*! ../core/devices */ 53), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), eventUtils = __webpack_require__( /*! ../events/utils */ 71), DropDownList = __webpack_require__( /*! ./drop_down_editor/ui.drop_down_list */ 209), themes = __webpack_require__( /*! ./themes */ 143), clickEvent = __webpack_require__( /*! ../events/click */ 75), Popover = __webpack_require__( /*! ./popover */ 207), TextBox = __webpack_require__( /*! ./text_box */ 211), ChildDefaultTemplate = __webpack_require__( /*! ./widget/child_default_template */ 100); var LOOKUP_CLASS = "dx-lookup", LOOKUP_SEARCH_CLASS = "dx-lookup-search", LOOKUP_SEARCH_WRAPPER_CLASS = "dx-lookup-search-wrapper", LOOKUP_FIELD_CLASS = "dx-lookup-field", LOOKUP_ARROW_CLASS = "dx-lookup-arrow", LOOKUP_FIELD_WRAPPER_CLASS = "dx-lookup-field-wrapper", LOOKUP_POPUP_CLASS = "dx-lookup-popup", LOOKUP_POPUP_WRAPPER_CLASS = "dx-lookup-popup-wrapper", LOOKUP_POPUP_SEARCH_CLASS = "dx-lookup-popup-search", LOOKUP_POPOVER_MODE = "dx-lookup-popover-mode", LOOKUP_EMPTY_CLASS = "dx-lookup-empty", LOOKUP_POPUP_VALIDATION_MESSAGE = "dx-lookup-validation-message", LOOKUP_POPUP_INVALID_CLASS = "dx-lookup-invalid"; var POPUP_OPTION_MAP = { popupWidth: "width", popupHeight: "height" }; var Lookup = DropDownList.inherit({ _supportedKeys: function() { return extend(this.callBase(), { space: function(e) { e.preventDefault(); this._validatedOpening() }, enter: function() { this._validatedOpening() } }) }, _setDeprecatedOptions: function() { this.callBase(); extend(this._deprecatedOptions, { showNextButton: { since: "15.1", message: "Use the 'pageLoadMode' option instead" }, pagingEnabled: { since: "15.1", message: "Use the 'dataSource.paginate' option instead" } }) }, _getDefaultOptions: function() { return extend(this.callBase(), { title: "", titleTemplate: "title", onTitleRendered: null, placeholder: messageLocalization.format("Select"), searchPlaceholder: messageLocalization.format("Search"), searchEnabled: true, cleanSearchOnOpening: true, fullScreen: false, showCancelButton: true, showClearButton: false, clearButtonText: messageLocalization.format("Clear"), applyButtonText: messageLocalization.format("Done"), popupWidth: function() { return .8 * $(window).width() }, popupHeight: function() { return .8 * $(window).height() }, shading: true, closeOnOutsideClick: false, position: void 0, animation: {}, pullRefreshEnabled: false, useNativeScrolling: true, pullingDownText: messageLocalization.format("dxList-pullingDownText"), pulledDownText: messageLocalization.format("dxList-pulledDownText"), refreshingText: messageLocalization.format("dxList-refreshingText"), pageLoadingText: messageLocalization.format("dxList-pageLoadingText"), onScroll: null, onPullRefresh: null, onPageLoading: null, pageLoadMode: "scrollBottom", showNextButton: void 0, nextButtonText: messageLocalization.format("dxList-nextButtonText"), grouped: false, groupTemplate: "group", usePopover: false, showDropDownButton: false, showPopupTitle: true, focusStateEnabled: false }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function() { return !support.nativeScrolling }, options: { useNativeScrolling: false } }, { device: function(device) { return !devices.isSimulator() && "generic" === devices.real().platform && "generic" === device.platform }, options: { usePopover: true, popupHeight: "auto" } }, { device: function(device) { return "win" === device.platform && device.phone && device.version && 8 === device.version[0] }, options: { showCancelButton: false, fullScreen: true } }, { device: function(device) { return "win" === device.platform && !device.phone && device.version && 8 === device.version[0] }, options: { popupWidth: function() { return $(window).width() } } }, { device: { platform: "ios", phone: true }, options: { fullScreen: true } }, { device: { platform: "ios", tablet: true }, options: { popupWidth: function() { return .4 * Math.min($(window).width(), $(window).height()) }, popupHeight: "auto", usePopover: true, useInkRipple: false } }, { device: function() { return "desktop" === devices.real().deviceType && !devices.isSimulator() }, options: { focusStateEnabled: true } }, { device: function() { return /android5/.test(themes.current()) }, options: { useInkRipple: true } }]) }, _dataSourceOptions: function() { this._suppressDeprecatedWarnings(); var pagingEnabled = commonUtils.ensureDefined(this.option("pagingEnabled"), true); pagingEnabled = commonUtils.isDefined(this.option("showNextButton")) ? pagingEnabled || this.option("showNextButton") : pagingEnabled; this._resumeDeprecatedWarnings(); return extend(this.callBase(), { paginate: pagingEnabled }) }, _initTemplates: function() { this.callBase(); this._defaultTemplates.group = new ChildDefaultTemplate("group", this); this._defaultTemplates.title = new ChildDefaultTemplate("title", this) }, _inputWrapper: function() { return this.element().find("." + LOOKUP_FIELD_WRAPPER_CLASS) }, _render: function() { this._renderSubmitElement(); this.callBase(); this.element().addClass(LOOKUP_CLASS).toggleClass(LOOKUP_POPOVER_MODE, this.option("usePopover")) }, _renderSubmitElement: function() { this._$submitElement = $("<input>").attr("type", "hidden").appendTo(this.element()) }, _getSubmitElement: function() { return this._$submitElement }, _fireContentReadyAction: commonUtils.noop, _popupWrapperClass: function() { return "" }, _renderInput: function() { var fieldClickAction = this._createAction(function() { this._validatedOpening() }.bind(this)); this._$field = $("<div>").addClass(LOOKUP_FIELD_CLASS).on(eventUtils.addNamespace(clickEvent.name, this.NAME), function(e) { fieldClickAction({ jQueryEvent: e }) }); var $arrow = $("<div>").addClass(LOOKUP_ARROW_CLASS); this._$fieldWrapper = $("<div>").addClass(LOOKUP_FIELD_WRAPPER_CLASS).append(this._$field).append($arrow).appendTo(this.element()); this.option("useInkRipple") && this._renderInkRipple() }, _renderInkRipple: function() { this._inkRipple = inkRipple.render() }, _toggleActiveState: function($element, value, e) { this.callBase.apply(this, arguments); if (!this._inkRipple) { return } var config = { element: this._inputWrapper(), jQueryEvent: e }; if (value) { this._inkRipple.showWave(config) } else { this._inkRipple.hideWave(config) } }, _renderField: function() { var fieldTemplate = this._getTemplateByOption("fieldTemplate"); if (fieldTemplate && this.option("fieldTemplate")) { this._renderFieldTemplate(fieldTemplate); return } this._$field.text(this.option("displayValue") || this.option("placeholder")); this.element().toggleClass(LOOKUP_EMPTY_CLASS, !this.option("selectedItem")) }, _renderFieldTemplate: function(template) { this._$field.empty(); var data = this._fieldRenderData(); template.render({ model: data, container: this._$field }) }, _fieldRenderData: function() { return this.option("selectedItem") }, _popupShowingHandler: function() { var validationError; if (this._$popupValidationMessage) { validationError = this.option("validationError"); if (validationError && validationError.message) { this._$popupValidationMessage.text(validationError.message); this._popup.content().addClass(LOOKUP_POPUP_INVALID_CLASS) } else { this._popup.content().removeClass(LOOKUP_POPUP_INVALID_CLASS) } } this.callBase.apply(this, arguments); if (this.option("cleanSearchOnOpening")) { if (this.option("searchEnabled") && this._searchBox.option("value")) { this._searchBox.option("value", ""); this._searchCanceled(); this._searchDataSource() } this._list && this._list.option("focusedElement", null) } this._attachSearchChildProcessor() }, _renderPopup: function() { if (this.option("usePopover") && !this.option("fullScreen")) { this._renderPopover() } else { this.callBase() } this._$popup.addClass(LOOKUP_POPUP_CLASS); this._popup._wrapper().addClass(LOOKUP_POPUP_WRAPPER_CLASS) }, _popupOptionMap: function(optionName) { return POPUP_OPTION_MAP[optionName] || optionName }, _renderPopover: function() { this._popup = this._createComponent(this._$popup, Popover, extend(this._popupConfig(), { showEvent: null, hideEvent: null, target: this.element(), fullScreen: false, shading: false, closeOnTargetScroll: true, closeOnOutsideClick: true, width: this._isInitialOptionValue("popupWidth") ? function() { return this.element().outerWidth() }.bind(this) : this._popupConfig().width })); this._popup.on({ showing: this._popupShowingHandler.bind(this), shown: this._popupShownHandler.bind(this), hiding: this._popupHidingHandler.bind(this), hidden: this._popupHiddenHandler.bind(this) }); this._popup.option("onContentReady", this._contentReadyHandler.bind(this)); this._contentReadyHandler() }, _popupHidingHandler: function() { this.callBase(); this.option("focusStateEnabled") && this.focus() }, _preventFocusOnPopup: commonUtils.noop, _popupConfig: function() { var result = extend(this.callBase(), { showTitle: this.option("showPopupTitle"), title: this.option("title"), titleTemplate: this._getTemplateByOption("titleTemplate"), onTitleRendered: this.option("onTitleRendered"), toolbarItems: this._getPopupToolbarItems(), fullScreen: this.option("fullScreen"), shading: this.option("shading"), closeOnTargetScroll: false, closeOnOutsideClick: this.option("closeOnOutsideClick"), onPositioned: null }); delete result.animation; delete result.position; result.maxHeight = function() { return $(window).height() }; $.each(["position", "animation", "popupWidth", "popupHeight"], function(_, optionName) { if (void 0 !== this.option(optionName)) { result[this._popupOptionMap(optionName)] = this.option(optionName) } }.bind(this)); return result }, _getPopupToolbarItems: function() { var buttonsConfig = "useButtons" === this.option("applyValueMode") ? this._popupToolbarItemsConfig() : []; var cancelButton = this._getCancelButtonConfig(); if (cancelButton) { buttonsConfig.push(cancelButton) } var clearButton = this._getClearButtonConfig(); if (clearButton) { buttonsConfig.push(clearButton) } return this._applyButtonsLocation(buttonsConfig) }, _popupToolbarItemsConfig: function() { return [{ shortcut: "done", options: { onClick: this._applyButtonHandler.bind(this), text: this.option("applyButtonText") } }] }, _getCancelButtonConfig: function() { return this.option("showCancelButton") ? { shortcut: "cancel", onClick: this._cancelButtonHandler.bind(this), options: { text: this.option("cancelButtonText") } } : null }, _getClearButtonConfig: function() { return this.option("showClearButton") ? { shortcut: "clear", onClick: this._resetValue.bind(this), options: { text: this.option("clearButtonText") } } : null }, _applyButtonHandler: function() { this.option("value", this._valueGetter(this._currentSelectedItem())); this.callBase() }, _cancelButtonHandler: function() { this._refreshSelected(); this.callBase() }, _refreshPopupVisibility: function() { if (this.option("opened")) { this._updatePopupHeight() } }, _dimensionChanged: function() { if (this.option("usePopover") && !this.option("popupWidth")) { this.option("popupWidth", this.element().width()) } this.callBase() }, _updatePopupDimensions: function() { this._updatePopupHeight() }, _input: function() { return this._$searchBox || this.callBase() }, _renderPopupContent: function() { if ("dxPopup" === this._popup.NAME) { this._$popupValidationMessage = $("<div>").addClass(LOOKUP_POPUP_VALIDATION_MESSAGE).appendTo(this._popup.content()) } this.callBase(); this._renderSearch(); this._attachSearchChildProcessor() }, _attachSearchChildProcessor: function() { if (this.option("searchEnabled") && this._searchBox) { this._listKeyboardProcessor = this._searchBox._keyboardProcessor.attachChildProcessor(); this._setListOption("_keyboardProcessor", this._listKeyboardProcessor) } else { this._setListOption("_keyboardProcessor", void 0) } }, _renderSearch: function() { this._$searchWrapper && this._$searchWrapper.remove(); delete this._$searchWrapper; this._$searchBox && this._$searchBox.remove(); delete this._$searchBox; delete this._searchBox; if (this.option("searchEnabled")) { var $searchWrapper = this._$searchWrapper = $("<div>").addClass(LOOKUP_SEARCH_WRAPPER_CLASS); var $searchBox = this._$searchBox = $("<div>").addClass(LOOKUP_SEARCH_CLASS).appendTo($searchWrapper); var currentDevice = devices.current(), searchMode = currentDevice.android && currentDevice.version[0] >= 5 ? "text" : "search"; this._searchBox = this._createComponent($searchBox, TextBox, { mode: searchMode, showClearButton: true, valueChangeEvent: this.option("valueChangeEvent"), onValueChanged: this._searchHandler.bind(this) }); this._registerSearchKeyHandlers(); $searchWrapper.insertBefore(this._$list) } this._renderSearchVisibility(); this._setSearchPlaceholder() }, _selectListItemHandler: function(e) { var $itemElement = this._list.option("focusedElement"); if (!$itemElement) { return } e.preventDefault(); this._selectListItem(e.itemData, $itemElement) }, _registerSearchKeyHandlers: function() { this._searchBox.registerKeyHandler("escape", this.close.bind(this)); this._searchBox.registerKeyHandler("enter", this._selectListItemHandler.bind(this)); this._searchBox.registerKeyHandler("space", this._selectListItemHandler.bind(this)); this._searchBox.registerKeyHandler("end", commonUtils.noop); this._searchBox.registerKeyHandler("home", commonUtils.noop) }, _renderSearchVisibility: function() { if (this._popup) { this._popup._wrapper().toggleClass(LOOKUP_POPUP_SEARCH_CLASS, this.option("searchEnabled")) } }, _setSearchPlaceholder: function() { if (!this._$searchBox) { return } var minSearchLength = this.option("minSearchLength"); var placeholder = this.option("searchPlaceholder"); if (minSearchLength && placeholder === messageLocalization.format("Search")) { placeholder = messageLocalization.getFormatter("dxLookup-searchPlaceholder")(minSearchLength) } this._searchBox.option("placeholder", placeholder) }, _setAriaTargetForList: commonUtils.noop, _renderList: function() { this.callBase(); this._list.registerKeyHandler("escape", function() { this.close() }.bind(this)) }, _listConfig: function() { return extend(this.callBase(), { tabIndex: 0, grouped: this.option("grouped"), groupTemplate: this._getTemplateByOption("groupTemplate"), pullRefreshEnabled: this.option("pullRefreshEnabled"), useNativeScrolling: this.option("useNativeScrolling"), pullingDownText: this.option("pullingDownText"), pulledDownText: this.option("pulledDownText"), refreshingText: this.option("refreshingText"), pageLoadingText: this.option("pageLoadingText"), onScroll: this.option("onScroll"), onPullRefresh: this.option("onPullRefresh"), onPageLoading: this.option("onPageLoading"), pageLoadMode: this._getPageLoadMode(), nextButtonText: this.option("nextButtonText"), _keyboardProcessor: this._listKeyboardProcessor, onFocusIn: this._onFocusInHandler.bind(this), onSelectionChanged: this._getSelectionChangedHandler() }) }, _getSelectionChangedHandler: function() { return this.option("showSelectionControls") ? this._selectionChangeHandler.bind(this) : commonUtils.noop }, _onFocusInHandler: function() { this._setListOption("_keyboardProcessor", void 0) }, _listContentReadyHandler: function() { this.callBase.apply(this, arguments); this._refreshSelected() }, _getPageLoadMode: function() { this._suppressDeprecatedWarnings(); var result = commonUtils.isDefined(this.option("showNextButton")) ? "nextButton" : this.option("pageLoadMode"); this._resumeDeprecatedWarnings(); return result }, _setFocusPolicy: function() { if (!this.option("focusStateEnabled")) { return } if (this.option("searchEnabled")) { this._searchBox.focus() } else { this._$list.focus() } }, _attachChildKeyboardEvents: commonUtils.noop, _focusTarget: function() { return this._$field }, _keyboardEventBindingTarget: function() { return this._$field }, _listItemClickHandler: function(e) { this._selectListItem(e.itemData, e.jQueryEvent.currentTarget) }, _selectListItem: function(itemData, target) { this._list.selectItem(target); if ("instantly" === this.option("applyValueMode")) { this._applyButtonHandler() } }, _currentSelectedItem: function() { return this.option("grouped") ? this._list.option("selectedItems[0]").items[0] : this._list.option("selectedItems[0]") }, _resetValue: function() { this.option("value", null); this.option("opened", false) }, _searchValue: function() { return this.option("searchEnabled") && this._searchBox ? this._searchBox.option("value") : "" }, _renderInputValue: function() { return this.callBase().always(function() { this._renderField(); this._refreshSelected(); this._setSubmitValue() }.bind(this)) }, _setSubmitValue: function() { var value = this.option("value"), submitValue = "this" === this.option("valueExpr") ? this._displayGetter(value) : value; this._$submitElement.val(submitValue) }, _renderPlaceholder: function() { if (0 === this.element().find("input").length) { return } this.callBase() }, _clean: function() { this._$fieldWrapper.remove(); this._$searchBox = null; this.callBase() }, _optionChanged: function(args) { var name = args.name; var value = args.value; switch (name) { case "searchEnabled": this._popup && this._renderSearch(); this._attachSearchChildProcessor(); break; case "searchPlaceholder": this._setSearchPlaceholder(); break; case "minSearchLength": this._setSearchPlaceholder(); this.callBase.apply(this, arguments); break; case "title": case "titleTemplate": case "onTitleRendered": case "shading": case "animation": case "position": case "closeOnOutsideClick": this._setPopupOption(name); break; case "fullScreen": case "usePopover": case "placeholder": this._invalidate(); break; case "clearButtonText": case "showClearButton": case "showCancelButton": this._setPopupOption("toolbarItems", this._getPopupToolbarItems()); break; case "applyValueMode": this.callBase.apply(this, arguments); break; case "popupWidth": this._setPopupOption("popupWidth", "auto" === value ? this.initialOption("popupWidth") : value); break; case "popupHeight": this._setPopupOption("popupHeight", "auto" === value ? this.initialOption("popupHeight") : value); break; case "pullRefreshEnabled": case "useNativeScrolling": case "pullingDownText": case "pulledDownText": case "refreshingText": case "pageLoadingText": case "onScroll": case "onPullRefresh": case "onPageLoading": case "nextButtonText": case "grouped": case "groupTemplate": this._setListOption(name); break; case "showNextButton": case "pageLoadMode": this._setListOption("pageLoadMode", this._getPageLoadMode()); break; case "cleanSearchOnOpening": break; default: this.callBase.apply(this, arguments) } }, focus: function() { this.option("opened") ? this._setFocusPolicy() : this._focusTarget().focus() }, field: function() { return this._$field } }); registerComponent("dxLookup", Lookup); module.exports = Lookup }, /*!**********************!*\ !*** ./js/ui/map.js ***! \**********************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), Promise = __webpack_require__( /*! ../core/polyfills/promise */ 300), deferredUtils = __webpack_require__( /*! ../integration/jquery/deferred */ 16), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), errors = __webpack_require__( /*! ./widget/ui.errors */ 22), devices = __webpack_require__( /*! ../core/devices */ 53), Widget = __webpack_require__( /*! ./widget/ui.widget */ 95), inflector = __webpack_require__( /*! ../core/utils/inflector */ 39), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../core/utils/array */ 26).inArray, isNumeric = __webpack_require__( /*! ../core/utils/common */ 14).isNumeric, eventUtils = __webpack_require__( /*! ../events/utils */ 71), pointerEvents = __webpack_require__( /*! ../events/pointer */ 76), config = __webpack_require__( /*! ../core/config */ 15), wrapToArray = __webpack_require__( /*! ../core/utils/array */ 26).wrapToArray; var PROVIDERS = { googleStatic: __webpack_require__( /*! ./map/provider.google_static */ 301), google: __webpack_require__( /*! ./map/provider.dynamic.google */ 303), bing: __webpack_require__( /*! ./map/provider.dynamic.bing */ 305) }; var MAP_CLASS = "dx-map", MAP_CONTAINER_CLASS = "dx-map-container", MAP_SHIELD_CLASS = "dx-map-shield", NATIVE_CLICK_CLASS = "dx-native-click"; var Map = Widget.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { bounds: { northEast: null, southWest: null }, center: { lat: 0, lng: 0 }, zoom: 1, width: 300, height: 300, type: "roadmap", provider: "google", autoAdjust: true, markers: [], markerIconSrc: null, onMarkerAdded: null, onMarkerRemoved: null, routes: [], onRouteAdded: null, onRouteRemoved: null, key: { bing: "", google: "", googleStatic: "" }, controls: false, onReady: null, onUpdated: null, onClick: null }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function() { return "desktop" === devices.real().deviceType && !devices.isSimulator() }, options: { focusStateEnabled: true } }]) }, _init: function() { this.callBase(); this.element().addClass(MAP_CLASS).addClass(NATIVE_CLICK_CLASS); this._lastAsyncAction = Promise.resolve(); this._checkOption("provider"); this._checkOption("markers"); this._checkOption("routes"); this._initContainer(); this._grabEvents(); this._rendered = {} }, _checkOption: function(option) { var value = this.option(option); if ("markers" === option && !Array.isArray(value)) { throw errors.Error("E1022") } if ("routes" === option && !Array.isArray(value)) { throw errors.Error("E1023") } }, _initContainer: function() { this._$container = $("<div />").addClass(MAP_CONTAINER_CLASS); this.element().append(this._$container) }, _grabEvents: function() { var eventName = eventUtils.addNamespace(pointerEvents.down, this.NAME); this.element().on(eventName, this._cancelEvent.bind(this)) }, _cancelEvent: function(e) { var cancelByProvider = this._provider && this._provider.cancelEvents && !this.option("disabled"); if (!config.designMode && cancelByProvider) { e.stopPropagation() } }, _saveRendered: function(option) { var value = this.option(option); this._rendered[option] = value.slice() }, _render: function() { this.callBase(); this._renderShield(); this._saveRendered("markers"); this._saveRendered("routes"); this._provider = new(PROVIDERS[this.option("provider")])(this, this._$container); this._queueAsyncAction("render", this._rendered.markers, this._rendered.routes) }, _renderShield: function() { var $shield, DevExpress = window.DevExpress; if (DevExpress && DevExpress.designMode || this.option("disabled")) { $shield = $("<div/>").addClass(MAP_SHIELD_CLASS); this.element().append($shield) } else { $shield = this.element().find("." + MAP_SHIELD_CLASS); $shield.remove() } }, _clean: function() { this._cleanFocusState(); if (this._provider) { this._provider.clean() } this._provider = null; this._lastAsyncAction = Promise.resolve(); this.setOptionSilent("bounds", { northEast: null, southWest: null }) }, _optionChanged: function(args) { var name = args.name; if (this._cancelOptionChange) { return } var changeBag = this._optionChangeBag; this._optionChangeBag = null; switch (name) { case "disabled": this._renderShield(); this.callBase(args); break; case "width": case "height": this.callBase(args); this._dimensionChanged(); break; case "provider": this._invalidate(); break; case "key": errors.log("W1001"); break; case "bounds": this._queueAsyncAction("updateBounds"); break; case "center": this._queueAsyncAction("updateCenter"); break; case "zoom": this._queueAsyncAction("updateZoom"); break; case "type": this._queueAsyncAction("updateMapType"); break; case "controls": this._queueAsyncAction("updateControls", this._rendered.markers, this._rendered.routes); break; case "autoAdjust": this._queueAsyncAction("adjustViewport"); break; case "markers": case "routes": this._checkOption(name); var prevValue = this._rendered[name]; this._saveRendered(name); this._queueAsyncAction("update" + inflector.titleize(name), changeBag ? changeBag.removed : prevValue, changeBag ? changeBag.added : this._rendered[name]).then(function(result) { if (changeBag) { changeBag.resolve(result) } }); break; case "markerIconSrc": this._queueAsyncAction("updateMarkers", this._rendered.markers, this._rendered.markers); break; case "onReady": case "onUpdated": case "onMarkerAdded": case "onMarkerRemoved": case "onRouteAdded": case "onRouteRemoved": case "onClick": break; default: this.callBase.apply(this, arguments) } }, _visibilityChanged: function(visible) { if (visible) { this._dimensionChanged() } }, _dimensionChanged: function() { this._queueAsyncAction("updateDimensions") }, _queueAsyncAction: function(name) { var options = $.makeArray(arguments).slice(1); this._lastAsyncAction = this._lastAsyncAction.then(function() { if (!this._provider) { return Promise.resolve() } return this._provider[name].apply(this._provider, options).then(function(result) { result = wrapToArray(result); var mapRefreshed = result[0]; if (mapRefreshed) { this._triggerReadyAction() } if (!mapRefreshed && "clean" !== name) { this._triggerUpdateAction() } return result[1] }.bind(this)) }.bind(this)); return this._lastAsyncAction }, _triggerReadyAction: function() { this._createActionByOption("onReady")({ originalMap: this._provider.map() }) }, _triggerUpdateAction: function() { this._createActionByOption("onUpdated")() }, setOptionSilent: function(name, value) { this._cancelOptionChange = true; this.option(name, value); this._cancelOptionChange = false }, addMarker: function(marker) { return this._addFunction("markers", marker) }, removeMarker: function(marker) { return this._removeFunction("markers", marker) }, addRoute: function(route) { return this._addFunction("routes", route) }, removeRoute: function(route) { return this._removeFunction("routes", route) }, _addFunction: function(optionName, addingValue) { var optionValue = this.option(optionName), addingValues = wrapToArray(addingValue); optionValue.push.apply(optionValue, addingValues); return this._partialArrayOptionChange(optionName, optionValue, addingValues, []) }, _removeFunction: function(optionName, removingValue) { var optionValue = this.option(optionName), removingValues = wrapToArray(removingValue); $.each(removingValues, function(removingIndex, removingValue) { var index = isNumeric(removingValue) ? removingValue : inArray(removingValue, optionValue); if (index !== -1) { var removing = optionValue.splice(index, 1)[0]; removingValues.splice(removingIndex, 1, removing) } else { throw errors.log("E1021", inflector.titleize(optionName.substring(0, optionName.length - 1)), removingValue) } }); return this._partialArrayOptionChange(optionName, optionValue, [], removingValues) }, _partialArrayOptionChange: function(optionName, optionValue, addingValues, removingValues) { return deferredUtils.fromPromise(new Promise(function(resolve) { this._optionChangeBag = { resolve: resolve, added: addingValues, removed: removingValues }; this.option(optionName, optionValue) }.bind(this)).then(function(result) { return result && 1 === result.length ? result[0] : result }), this) } }); registerComponent("dxMap", Map); module.exports = Map }, /*!**************************************!*\ !*** ./js/core/polyfills/promise.js ***! \**************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Promise = window.Promise; if (!Promise) { Promise = function(resolver) { var d = $.Deferred(); resolver(d.resolve.bind(this), d.reject.bind(this)); return d.promise() }; Promise.resolve = function(val) { return $.Deferred().resolve(val).promise() }; Promise.reject = function(val) { return $.Deferred().reject(val).promise() }; Promise.all = function(promises) { return $.when.apply($, promises).then(function() { return $.makeArray(arguments) }) } } module.exports = Promise }, /*!*********************************************!*\ !*** ./js/ui/map/provider.google_static.js ***! \*********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Promise = __webpack_require__( /*! ../../core/polyfills/promise */ 300), Provider = __webpack_require__( /*! ./provider */ 302), Color = __webpack_require__( /*! ../../color */ 38), clickEvent = __webpack_require__( /*! ../../events/click */ 75); var GOOGLE_STATIC_URL = "https://maps.google.com/maps/api/staticmap?"; var GoogleStaticProvider = Provider.inherit({ _locationToString: function(location) { var latLng = this._getLatLng(location); return latLng ? latLng.lat + "," + latLng.lng : location.toString().replace(/ /g, "+") }, _renderImpl: function() { return this._updateMap() }, updateDimensions: function() { return this._updateMap() }, updateMapType: function() { return this._updateMap() }, updateBounds: function() { return Promise.resolve() }, updateCenter: function() { return this._updateMap() }, updateZoom: function() { return this._updateMap() }, updateControls: function() { return Promise.resolve() }, addMarkers: function(options) { var that = this; return this._updateMap().then(function(result) { $.each(options, function(_, options) { that._fireMarkerAddedAction({ options: options }) }); return result }) }, removeMarkers: function(options) { var that = this; return this._updateMap().then(function(result) { $.each(options, function(_, options) { that._fireMarkerRemovedAction({ options: options }) }); return result }) }, adjustViewport: function() { return Promise.resolve() }, addRoutes: function(options) { var that = this; return this._updateMap().then(function(result) { $.each(options, function(_, options) { that._fireRouteAddedAction({ options: options }) }); return result }) }, removeRoutes: function(options) { var that = this; return this._updateMap().then(function(result) { $.each(options, function(_, options) { that._fireRouteRemovedAction({ options: options }) }); return result }) }, clean: function() { this._$container.css("background-image", "none"); this._$container.off(this._addEventNamespace(clickEvent.name)); return Promise.resolve() }, mapRendered: function() { return true }, _updateMap: function() { var key = this._keyOption("googleStatic"), $container = this._$container; var requestOptions = ["sensor=false", "size=" + Math.round($container.width()) + "x" + Math.round($container.height()), "maptype=" + this._option("type"), "center=" + this._locationToString(this._option("center")), "zoom=" + this._option("zoom"), this._markersSubstring()]; requestOptions.push.apply(requestOptions, this._routeSubstrings()); if (key) { requestOptions.push("key=" + key) } var request = GOOGLE_STATIC_URL + requestOptions.join("&"); this._$container.css("background", 'url("' + request + '") no-repeat 0 0'); this._attachClickEvent(); return Promise.resolve(true) }, _markersSubstring: function() { var that = this, markers = [], markerIcon = this._option("markerIconSrc"); if (markerIcon) { markers.push("icon:" + markerIcon) } $.each(this._option("markers"), function(_, marker) { markers.push(that._locationToString(marker.location)) }); return "markers=" + markers.join("|") }, _routeSubstrings: function() { var that = this, routes = []; $.each(this._option("routes"), function(_, route) { var color = new Color(route.color || that._defaultRouteColor()).toHex().replace("#", "0x"), opacity = Math.round(255 * (route.opacity || that._defaultRouteOpacity())).toString(16), width = route.weight || that._defaultRouteWeight(), locations = []; $.each(route.locations, function(_, routePoint) { locations.push(that._locationToString(routePoint)) }); routes.push("path=color:" + color + opacity + "|weight:" + width + "|" + locations.join("|")) }); return routes }, _attachClickEvent: function() { var that = this, eventName = this._addEventNamespace(clickEvent.name); this._$container.off(eventName).on(eventName, function(e) { that._fireClickAction({ jQueryEvent: e }) }) } }); GoogleStaticProvider.remapConstant = function(newValue) { GOOGLE_STATIC_URL = newValue }; module.exports = GoogleStaticProvider }, /*!*******************************!*\ !*** ./js/ui/map/provider.js ***! \*******************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Promise = __webpack_require__( /*! ../../core/polyfills/promise */ 300), Class = __webpack_require__( /*! ../../core/class */ 25), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), typeUtils = __webpack_require__( /*! ../../core/utils/type */ 12), eventUtils = __webpack_require__( /*! ../../events/utils */ 71), isPlainObject = typeUtils.isPlainObject, isNumeric = commonUtils.isNumeric; var abstract = Class.abstract; var Provider = Class.inherit({ _defaultRouteWeight: function() { return 5 }, _defaultRouteOpacity: function() { return .5 }, _defaultRouteColor: function() { return "#0000FF" }, cancelEvents: false, ctor: function(map, $container) { this._mapWidget = map; this._$container = $container }, render: function(markerOptions, routeOptions) { return this._renderImpl().then(function() { return Promise.all([this._applyFunctionIfNeeded("addMarkers", markerOptions), this._applyFunctionIfNeeded("addRoutes", routeOptions)]).then(function() { return true }) }.bind(this)) }, _renderImpl: abstract, updateDimensions: abstract, updateMapType: abstract, updateBounds: abstract, updateCenter: abstract, updateZoom: abstract, updateControls: abstract, updateMarkers: function(markerOptionsToRemove, markerOptionsToAdd) { return new Promise(function(resolve) { return this._applyFunctionIfNeeded("removeMarkers", markerOptionsToRemove).then(function(removeValue) { this._applyFunctionIfNeeded("addMarkers", markerOptionsToAdd).then(function(addValue) { resolve(addValue ? addValue : removeValue) }) }.bind(this)) }.bind(this)) }, addMarkers: abstract, removeMarkers: abstract, adjustViewport: abstract, updateRoutes: function(routeOptionsToRemove, routeOptionsToAdd) { return new Promise(function(resolve) { return this._applyFunctionIfNeeded("removeRoutes", routeOptionsToRemove).then(function(removeValue) { this._applyFunctionIfNeeded("addRoutes", routeOptionsToAdd).then(function(addValue) { resolve(addValue ? addValue : removeValue) }) }.bind(this)) }.bind(this)) }, addRoutes: abstract, removeRoutes: abstract, clean: abstract, map: function() { return this._map }, _option: function(name, value) { if (void 0 === value) { return this._mapWidget.option(name) } this._mapWidget.setOptionSilent(name, value) }, _keyOption: function(providerName) { var key = this._option("key"); return void 0 === key[providerName] ? key : key[providerName] }, _parseTooltipOptions: function(option) { return { text: option.text || option, visible: option.isShown || false } }, _getLatLng: function(location) { if ("string" === typeof location) { var coords = $.map(location.split(","), $.trim), numericRegex = /^[-+]?[0-9]*\.?[0-9]*$/; if (2 === coords.length && coords[0].match(numericRegex) && coords[1].match(numericRegex)) { return { lat: parseFloat(coords[0]), lng: parseFloat(coords[1]) } } } else { if (Array.isArray(location) && 2 === location.length) { return { lat: location[0], lng: location[1] } } else { if (isPlainObject(location) && isNumeric(location.lat) && isNumeric(location.lng)) { return location } } } return null }, _areBoundsSet: function() { return this._option("bounds.northEast") && this._option("bounds.southWest") }, _addEventNamespace: function(name) { return eventUtils.addNamespace(name, this._mapWidget.NAME) }, _applyFunctionIfNeeded: function(fnName, array) { if (!array.length) { return Promise.resolve() } return this[fnName](array) }, _fireAction: function(name, actionArguments) { this._mapWidget._createActionByOption(name)(actionArguments) }, _fireClickAction: function(actionArguments) { this._fireAction("onClick", actionArguments) }, _fireMarkerAddedAction: function(actionArguments) { this._fireAction("onMarkerAdded", actionArguments) }, _fireMarkerRemovedAction: function(actionArguments) { this._fireAction("onMarkerRemoved", actionArguments) }, _fireRouteAddedAction: function(actionArguments) { this._fireAction("onRouteAdded", actionArguments) }, _fireRouteRemovedAction: function(actionArguments) { this._fireAction("onRouteRemoved", actionArguments) } }); module.exports = Provider }, /*!**********************************************!*\ !*** ./js/ui/map/provider.dynamic.google.js ***! \**********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, Promise = __webpack_require__( /*! ../../core/polyfills/promise */ 300), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, DynamicProvider = __webpack_require__( /*! ./provider.dynamic */ 304), errors = __webpack_require__( /*! ../widget/ui.errors */ 22), Color = __webpack_require__( /*! ../../color */ 38); var GOOGLE_MAP_READY = "_googleScriptReady", GOOGLE_URL = "https://maps.google.com/maps/api/js?sensor=false&callback=" + GOOGLE_MAP_READY; var CustomMarker; var initCustomMarkerClass = function() { CustomMarker = function(options) { this._position = options.position; this._offset = options.offset; this._$overlayContainer = $("<div>").css({ position: "absolute", display: "none", cursor: "pointer" }).append(options.html); this.setMap(options.map) }; CustomMarker.prototype = new google.maps.OverlayView; CustomMarker.prototype.onAdd = function() { var $pane = $(this.getPanes().overlayMouseTarget); $pane.append(this._$overlayContainer); this._clickListener = google.maps.event.addDomListener(this._$overlayContainer.get(0), "click", function(e) { google.maps.event.trigger(this, "click"); e.preventDefault() }.bind(this)); this.draw() }; CustomMarker.prototype.onRemove = function() { google.maps.event.removeListener(this._clickListener); this._$overlayContainer.remove() }; CustomMarker.prototype.draw = function() { var position = this.getProjection().fromLatLngToDivPixel(this._position); this._$overlayContainer.css({ left: position.x + this._offset.left, top: position.y + this._offset.top, display: "block" }) } }; var googleMapsLoaded = function() { return window.google && window.google.maps }; var googleMapsLoader; var GoogleProvider = DynamicProvider.inherit({ _mapType: function(type) { var mapTypes = { hybrid: google.maps.MapTypeId.HYBRID, roadmap: google.maps.MapTypeId.ROADMAP, satellite: google.maps.MapTypeId.SATELLITE }; return mapTypes[type] || mapTypes.hybrid }, _movementMode: function(type) { var movementTypes = { driving: google.maps.TravelMode.DRIVING, walking: google.maps.TravelMode.WALKING }; return movementTypes[type] || movementTypes.driving }, _resolveLocation: function(location) { return new Promise(function(resolve) { var latLng = this._getLatLng(location); if (latLng) { resolve(new google.maps.LatLng(latLng.lat, latLng.lng)) } else { this._geocodeLocation(location).then(function(geocodedLocation) { resolve(geocodedLocation) }) } }.bind(this)) }, _geocodedLocations: {}, _geocodeLocationImpl: function(location) { return new Promise(function(resolve) { var geocoder = new google.maps.Geocoder; geocoder.geocode({ address: location }, function(results, status) { if (status === google.maps.GeocoderStatus.OK) { resolve(results[0].geometry.location) } else { errors.log("W1006", status); resolve(new google.maps.LatLng(0, 0)) } }) }) }, _normalizeLocation: function(location) { return { lat: location.lat(), lng: location.lng() } }, _normalizeLocationRect: function(locationRect) { return { northEast: this._normalizeLocation(locationRect.getNorthEast()), southWest: this._normalizeLocation(locationRect.getSouthWest()) } }, _loadImpl: function() { return new Promise(function(resolve) { if (googleMapsLoaded()) { resolve() } else { if (!googleMapsLoader) { googleMapsLoader = this._loadMapScript() } googleMapsLoader.then(function() { if (googleMapsLoaded()) { resolve(); return } this._loadMapScript().then(resolve) }.bind(this)) } }.bind(this)).then(function() { initCustomMarkerClass() }) }, _loadMapScript: function() { return new Promise(function(resolve) { var key = this._keyOption("google"); window[GOOGLE_MAP_READY] = resolve; $.getScript(GOOGLE_URL + (key ? "&key=" + key : "")) }.bind(this)).then(function() { try { delete window[GOOGLE_MAP_READY] } catch (e) { window[GOOGLE_MAP_READY] = void 0 } }) }, _init: function() { return new Promise(function(resolve) { var controls = this._option("controls"); this._map = new google.maps.Map(this._$container[0], { zoom: this._option("zoom"), panControl: controls, zoomControl: controls, mapTypeControl: controls, streetViewControl: controls }); var listener = google.maps.event.addListener(this._map, "idle", function() { resolve(listener) }) }.bind(this)).then(function(listener) { google.maps.event.removeListener(listener) }) }, _attachHandlers: function() { this._boundsChangeListener = google.maps.event.addListener(this._map, "bounds_changed", this._boundsChangeHandler.bind(this)); this._clickListener = google.maps.event.addListener(this._map, "click", this._clickActionHandler.bind(this)) }, _boundsChangeHandler: function() { var bounds = this._map.getBounds(); this._option("bounds", this._normalizeLocationRect(bounds)); var center = this._map.getCenter(); this._option("center", this._normalizeLocation(center)); if (!this._preventZoomChangeEvent) { this._option("zoom", this._map.getZoom()) } }, _clickActionHandler: function(e) { this._fireClickAction({ location: this._normalizeLocation(e.latLng) }) }, updateDimensions: function() { var center = this._option("center"); google.maps.event.trigger(this._map, "resize"); this._option("center", center); return this.updateCenter() }, updateMapType: function() { this._map.setMapTypeId(this._mapType(this._option("type"))); return Promise.resolve() }, updateBounds: function() { return Promise.all([this._resolveLocation(this._option("bounds.northEast")), this._resolveLocation(this._option("bounds.southWest"))]).then(function(result) { var bounds = new google.maps.LatLngBounds; bounds.extend(result[0]); bounds.extend(result[1]); this._map.fitBounds(bounds) }.bind(this)) }, updateCenter: function() { return this._resolveLocation(this._option("center")).then(function(center) { this._map.setCenter(center); this._option("center", this._normalizeLocation(center)) }.bind(this)) }, updateZoom: function() { this._map.setZoom(this._option("zoom")); return Promise.resolve() }, updateControls: function() { var controls = this._option("controls"); this._map.setOptions({ panControl: controls, zoomControl: controls, mapTypeControl: controls, streetViewControl: controls }); return Promise.resolve() }, _renderMarker: function(options) { return this._resolveLocation(options.location).then(function(location) { var marker; if (options.html) { marker = new CustomMarker({ map: this._map, position: location, html: options.html, offset: extend({ top: 0, left: 0 }, options.htmlOffset) }) } else { marker = new google.maps.Marker({ position: location, map: this._map, icon: options.iconSrc || this._option("markerIconSrc") }) } var infoWindow = this._renderTooltip(marker, options.tooltip); var listener; if (options.onClick || options.tooltip) { var markerClickAction = this._mapWidget._createAction(options.onClick || noop), markerNormalizedLocation = this._normalizeLocation(location); listener = google.maps.event.addListener(marker, "click", function() { markerClickAction({ location: markerNormalizedLocation }); if (infoWindow) { infoWindow.open(this._map, marker) } }.bind(this)) } return { location: location, marker: marker, listener: listener } }.bind(this)) }, _renderTooltip: function(marker, options) { if (!options) { return } options = this._parseTooltipOptions(options); var infoWindow = new google.maps.InfoWindow({ content: options.text }); if (options.visible) { infoWindow.open(this._map, marker) } return infoWindow }, _destroyMarker: function(marker) { marker.marker.setMap(null); if (marker.listener) { google.maps.event.removeListener(marker.listener) } }, _renderRoute: function(options) { return Promise.all($.map(options.locations, function(point) { return this._resolveLocation(point) }.bind(this))).then(function(locations) { return new Promise(function(resolve) { var origin = locations.shift(), destination = locations.pop(), waypoints = $.map(locations, function(location) { return { location: location, stopover: true } }); var request = { origin: origin, destination: destination, waypoints: waypoints, optimizeWaypoints: true, travelMode: this._movementMode(options.mode) }; (new google.maps.DirectionsService).route(request, function(response, status) { if (status === google.maps.DirectionsStatus.OK) { var color = new Color(options.color || this._defaultRouteColor()).toHex(), directionOptions = { directions: response, map: this._map, suppressMarkers: true, preserveViewport: true, polylineOptions: { strokeWeight: options.weight || this._defaultRouteWeight(), strokeOpacity: options.opacity || this._defaultRouteOpacity(), strokeColor: color } }; var route = new google.maps.DirectionsRenderer(directionOptions), bounds = response.routes[0].bounds; resolve({ instance: route, northEast: bounds.getNorthEast(), southWest: bounds.getSouthWest() }) } else { errors.log("W1006", status); resolve({ instance: new google.maps.DirectionsRenderer({}) }) } }.bind(this)) }.bind(this)) }.bind(this)) }, _destroyRoute: function(routeObject) { routeObject.instance.setMap(null) }, _fitBounds: function() { this._updateBounds(); if (this._bounds && this._option("autoAdjust")) { var zoomBeforeFitting = this._map.getZoom(); this._preventZoomChangeEvent = true; this._map.fitBounds(this._bounds); this._boundsChangeHandler(); var zoomAfterFitting = this._map.getZoom(); if (zoomBeforeFitting < zoomAfterFitting) { this._map.setZoom(zoomBeforeFitting) } else { this._option("zoom", zoomAfterFitting) } delete this._preventZoomChangeEvent } return Promise.resolve() }, _extendBounds: function(location) { if (this._bounds) { this._bounds.extend(location) } else { this._bounds = new google.maps.LatLngBounds; this._bounds.extend(location) } }, clean: function() { if (this._map) { google.maps.event.removeListener(this._boundsChangeListener); google.maps.event.removeListener(this._clickListener); this._clearMarkers(); this._clearRoutes(); delete this._map; this._$container.empty() } return Promise.resolve() } }); GoogleProvider.remapConstant = function(newValue) { GOOGLE_URL = newValue }; module.exports = GoogleProvider }, /*!***************************************!*\ !*** ./js/ui/map/provider.dynamic.js ***! \***************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Promise = __webpack_require__( /*! ../../core/polyfills/promise */ 300), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, Provider = __webpack_require__( /*! ./provider */ 302), abstract = Provider.abstract; var DynamicProvider = Provider.inherit({ cancelEvents: true, _geocodeLocation: function(location) { return new Promise(function(resolve) { var cache = this._geocodedLocations, cachedLocation = cache[location]; if (cachedLocation) { resolve(cachedLocation) } else { this._geocodeLocationImpl(location).then(function(geocodedLocation) { cache[location] = geocodedLocation; resolve(geocodedLocation) }) } }.bind(this)) }, _renderImpl: function() { return this._load().then(function() { return this._init() }.bind(this)).then(function() { return Promise.all([this.updateMapType(), this._areBoundsSet() ? this.updateBounds() : this.updateCenter()]) }.bind(this)).then(function() { this._attachHandlers(); return new Promise(function(resolve) { var timeout = setTimeout(function() { clearTimeout(timeout); resolve() }) }) }.bind(this)) }, _load: function() { if (!this._mapsLoader) { this._mapsLoader = this._loadImpl() } this._markers = []; this._routes = []; return this._mapsLoader }, _loadImpl: abstract, _init: abstract, _attachHandlers: abstract, addMarkers: function(options) { return Promise.all($.map(options, function(options) { return this._addMarker(options) }.bind(this))).then(function(markerObjects) { this._fitBounds(); return [false, $.map(markerObjects, function(markerObject) { return markerObject.marker })] }.bind(this)) }, _addMarker: function(options) { return this._renderMarker(options).then(function(markerObject) { this._markers.push(extend({ options: options }, markerObject)); this._fireMarkerAddedAction({ options: options, originalMarker: markerObject.marker }); return markerObject }.bind(this)) }, _renderMarker: abstract, removeMarkers: function(markersOptionsToRemove) { var that = this; $.each(markersOptionsToRemove, function(_, markerOptionToRemove) { that._removeMarker(markerOptionToRemove) }); return Promise.resolve() }, _removeMarker: function(markersOptionToRemove) { var that = this; $.each(this._markers, function(markerIndex, markerObject) { if (markerObject.options !== markersOptionToRemove) { return true } that._destroyMarker(markerObject); that._markers.splice(markerIndex, 1); that._fireMarkerRemovedAction({ options: markerObject.options }); return false }) }, _destroyMarker: abstract, _clearMarkers: function() { while (this._markers.length > 0) { this._removeMarker(this._markers[0].options) } }, addRoutes: function(options) { return Promise.all($.map(options, function(options) { return this._addRoute(options) }.bind(this))).then(function(routeObjects) { this._fitBounds(); return [false, $.map(routeObjects, function(routeObject) { return routeObject.instance })] }.bind(this)) }, _addRoute: function(options) { return this._renderRoute(options).then(function(routeObject) { this._routes.push(extend({ options: options }, routeObject)); this._fireRouteAddedAction({ options: options, originalRoute: routeObject.instance }); return routeObject }.bind(this)) }, _renderRoute: abstract, removeRoutes: function(options) { var that = this; $.each(options, function(routeIndex, options) { that._removeRoute(options) }); return Promise.resolve() }, _removeRoute: function(options) { var that = this; $.each(this._routes, function(routeIndex, routeObject) { if (routeObject.options !== options) { return true } that._destroyRoute(routeObject); that._routes.splice(routeIndex, 1); that._fireRouteRemovedAction({ options: options }); return false }) }, _destroyRoute: abstract, _clearRoutes: function() { while (this._routes.length > 0) { this._removeRoute(this._routes[0].options) } }, adjustViewport: function() { return this._fitBounds() }, _fitBounds: abstract, _updateBounds: function() { var that = this; this._clearBounds(); if (!this._option("autoAdjust")) { return } $.each(this._markers, function(_, markerObject) { that._extendBounds(markerObject.location) }); $.each(this._routes, function(_, routeObject) { routeObject.northEast && that._extendBounds(routeObject.northEast); routeObject.southWest && that._extendBounds(routeObject.southWest) }) }, _clearBounds: function() { this._bounds = null }, _extendBounds: abstract }); module.exports = DynamicProvider }, /*!********************************************!*\ !*** ./js/ui/map/provider.dynamic.bing.js ***! \********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), noop = commonUtils.noop, Promise = __webpack_require__( /*! ../../core/polyfills/promise */ 300), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, DynamicProvider = __webpack_require__( /*! ./provider.dynamic */ 304), Color = __webpack_require__( /*! ../../color */ 38), browser = __webpack_require__( /*! ../../core/utils/browser */ 23), isDefined = commonUtils.isDefined; var BING_MAP_READY = "_bingScriptReady", BING_URL_V7 = "https://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=7.0&s=1&onScriptLoad=" + BING_MAP_READY, BING_URL_V8 = "https://www.bing.com/api/maps/mapcontrol?callback=" + BING_MAP_READY, INFOBOX_V_OFFSET_V7 = 33, INFOBOX_V_OFFSET_V8 = 13, IS_V8_SUPPORTED = !(browser.msie && parseInt(browser.version) < 11), BING_CREDENTIALS = "AhuxC0dQ1DBTNo8L-H9ToVMQStmizZzBJdraTSgCzDSWPsA1Qd8uIvFSflzxdaLH", MIN_LOCATION_RECT_LENGTH = 1e-16; var msMapsLoaded = function() { return window.Microsoft && window.Microsoft.Maps }; var msMapsLoader; var BingProvider = DynamicProvider.inherit({ _mapType: function(type) { var mapTypes = { roadmap: Microsoft.Maps.MapTypeId.road, hybrid: Microsoft.Maps.MapTypeId.aerial, satellite: Microsoft.Maps.MapTypeId.aerial }; return mapTypes[type] || mapTypes.road }, _movementMode: function(type) { var movementTypes = { driving: Microsoft.Maps.Directions.RouteMode.driving, walking: Microsoft.Maps.Directions.RouteMode.walking }; return movementTypes[type] || movementTypes.driving }, _resolveLocation: function(location) { return new Promise(function(resolve) { var latLng = this._getLatLng(location); if (latLng) { resolve(new Microsoft.Maps.Location(latLng.lat, latLng.lng)) } else { this._geocodeLocation(location).then(function(geocodedLocation) { resolve(geocodedLocation) }) } }.bind(this)) }, _geocodedLocations: {}, _geocodeLocationImpl: function(location) { return new Promise(function(resolve) { if (!isDefined(location)) { resolve(new Microsoft.Maps.Location(0, 0)); return } var searchManager = new Microsoft.Maps.Search.SearchManager(this._map); var searchRequest = { where: location, count: 1, callback: function(searchResponse) { var result = searchResponse.results[0]; if (result) { var boundsBox = searchResponse.results[0].location; resolve(new Microsoft.Maps.Location(boundsBox.latitude, boundsBox.longitude)) } else { resolve(new Microsoft.Maps.Location(0, 0)) } } }; searchManager.geocode(searchRequest) }.bind(this)) }, _normalizeLocation: function(location) { return { lat: location.latitude, lng: location.longitude } }, _normalizeLocationRect: function(locationRect) { var northWest = this._normalizeLocation(locationRect.getNorthwest()), southEast = this._normalizeLocation(locationRect.getSoutheast()); return { northEast: { lat: northWest.lat, lng: southEast.lng }, southWest: { lat: southEast.lat, lng: northWest.lng } } }, _loadImpl: function() { return new Promise(function(resolve) { if (msMapsLoaded()) { resolve() } else { if (!msMapsLoader) { msMapsLoader = this._loadMapScript() } msMapsLoader.then(function() { if (msMapsLoaded()) { resolve(); return } this._loadMapScript().then(resolve) }.bind(this)) } }.bind(this)).then(function() { return Promise.all([new Promise(function(resolve) { Microsoft.Maps.loadModule("Microsoft.Maps.Search", { callback: resolve }) }), new Promise(function(resolve) { Microsoft.Maps.loadModule("Microsoft.Maps.Directions", { callback: resolve }) })]) }) }, _loadMapScript: function() { var bingUrl = IS_V8_SUPPORTED ? BING_URL_V8 : BING_URL_V7; return new Promise(function(resolve) { window[BING_MAP_READY] = resolve; $.getScript(bingUrl) }).then(function() { try { delete window[BING_MAP_READY] } catch (e) { window[BING_MAP_READY] = void 0 } }) }, _init: function() { if (IS_V8_SUPPORTED) { this._createMap(); return Promise.resolve() } else { return new Promise(function(resolve) { this._createMap(); var handler = Microsoft.Maps.Events.addHandler(this._map, "tiledownloadcomplete", function() { resolve(handler) }) }.bind(this)).then(function(handler) { Microsoft.Maps.Events.removeHandler(handler) }) } }, _createMap: function() { var controls = this._option("controls"); this._map = new Microsoft.Maps.Map(this._$container[0], { credentials: this._keyOption("bing") || BING_CREDENTIALS, zoom: this._option("zoom"), showDashboard: controls, showMapTypeSelector: controls, showScalebar: controls }) }, _attachHandlers: function() { this._providerViewChangeHandler = Microsoft.Maps.Events.addHandler(this._map, "viewchange", this._viewChangeHandler.bind(this)); this._providerClickHandler = Microsoft.Maps.Events.addHandler(this._map, "click", this._clickActionHandler.bind(this)) }, _viewChangeHandler: function() { var bounds = this._map.getBounds(); this._option("bounds", this._normalizeLocationRect(bounds)); var center = this._map.getCenter(); this._option("center", this._normalizeLocation(center)); if (!this._preventZoomChangeEvent) { this._option("zoom", this._map.getZoom()) } }, _clickActionHandler: function(e) { if ("map" === e.targetType) { var location; if (IS_V8_SUPPORTED) { location = e.location } else { var point = new Microsoft.Maps.Point(e.getX(), e.getY()); location = e.target.tryPixelToLocation(point) } this._fireClickAction({ location: this._normalizeLocation(location) }) } }, updateDimensions: function() { var $container = this._$container; this._map.setOptions({ width: $container.width(), height: $container.height() }); return Promise.resolve() }, updateMapType: function() { var type = this._option("type"), labelOverlay = Microsoft.Maps.LabelOverlay; this._map.setView({ animate: false, mapTypeId: this._mapType(type), labelOverlay: "satellite" === type ? labelOverlay.hidden : labelOverlay.visible }); return Promise.resolve() }, updateBounds: function() { return Promise.all([this._resolveLocation(this._option("bounds.northEast")), this._resolveLocation(this._option("bounds.southWest"))]).then(function(result) { var bounds = new Microsoft.Maps.LocationRect.fromLocations(result[0], result[1]); this._map.setView({ animate: false, bounds: bounds }) }.bind(this)) }, updateCenter: function() { return this._resolveLocation(this._option("center")).then(function(center) { this._map.setView({ animate: false, center: center }) }.bind(this)) }, updateZoom: function() { this._map.setView({ animate: false, zoom: this._option("zoom") }); return Promise.resolve() }, updateControls: function() { this.clean(); return this.render.apply(this, arguments) }, _renderMarker: function(options) { return this._resolveLocation(options.location).then(function(location) { var pushpinOptions = { icon: options.iconSrc || this._option("markerIconSrc") }; if (options.html) { extend(pushpinOptions, { htmlContent: options.html, width: null, height: null }); var htmlOffset = options.htmlOffset; if (htmlOffset) { pushpinOptions.anchor = new Microsoft.Maps.Point((-htmlOffset.left), (-htmlOffset.top)) } } var pushpin = new Microsoft.Maps.Pushpin(location, pushpinOptions); this._map.entities.push(pushpin); var infobox = this._renderTooltip(location, options.tooltip); var handler; if (options.onClick || options.tooltip) { var markerClickAction = this._mapWidget._createAction(options.onClick || noop), markerNormalizedLocation = this._normalizeLocation(location); handler = Microsoft.Maps.Events.addHandler(pushpin, "click", function() { markerClickAction({ location: markerNormalizedLocation }); if (infobox) { infobox.setOptions({ visible: true }) } }) } return { location: location, marker: pushpin, infobox: infobox, handler: handler } }.bind(this)) }, _renderTooltip: function(location, options) { if (!options) { return } options = this._parseTooltipOptions(options); var vOffset = IS_V8_SUPPORTED ? INFOBOX_V_OFFSET_V8 : INFOBOX_V_OFFSET_V7, infobox = new Microsoft.Maps.Infobox(location, { description: options.text, offset: new Microsoft.Maps.Point(0, vOffset), visible: options.visible }); if (IS_V8_SUPPORTED) { infobox.setMap(this._map) } else { this._map.entities.push(infobox, null) } return infobox }, _destroyMarker: function(marker) { this._map.entities.remove(marker.marker); if (marker.infobox) { this._map.entities.remove(marker.infobox) } if (marker.handler) { Microsoft.Maps.Events.removeHandler(marker.handler) } }, _renderRoute: function(options) { return Promise.all($.map(options.locations, function(point) { return this._resolveLocation(point) }.bind(this))).then(function(locations) { return new Promise(function(resolve) { var direction = new Microsoft.Maps.Directions.DirectionsManager(this._map), color = new Color(options.color || this._defaultRouteColor()).toHex(), routeColor = new Microsoft.Maps.Color.fromHex(color); routeColor.a = 255 * (options.opacity || this._defaultRouteOpacity()); direction.setRenderOptions({ autoUpdateMapView: false, displayRouteSelector: false, waypointPushpinOptions: { visible: false }, drivingPolylineOptions: { strokeColor: routeColor, strokeThickness: options.weight || this._defaultRouteWeight() }, walkingPolylineOptions: { strokeColor: routeColor, strokeThickness: options.weight || this._defaultRouteWeight() } }); direction.setRequestOptions({ routeMode: this._movementMode(options.mode), routeDraggable: false }); $.each(locations, function(_, location) { var waypoint = new Microsoft.Maps.Directions.Waypoint({ location: location }); direction.addWaypoint(waypoint) }); var handler = Microsoft.Maps.Events.addHandler(direction, "directionsUpdated", function(args) { Microsoft.Maps.Events.removeHandler(handler); var routeSummary = args.routeSummary[0]; resolve({ instance: direction, northEast: routeSummary.northEast, southWest: routeSummary.southWest }) }); direction.calculateDirections() }.bind(this)) }.bind(this)) }, _destroyRoute: function(routeObject) { routeObject.instance.dispose() }, _fitBounds: function() { this._updateBounds(); if (this._bounds && this._option("autoAdjust")) { var zoomBeforeFitting = this._map.getZoom(); this._preventZoomChangeEvent = true; var bounds = this._bounds.clone(); bounds.height = 1.1 * bounds.height; bounds.width = 1.1 * bounds.width; this._map.setView({ animate: false, bounds: bounds, zoom: zoomBeforeFitting }); var zoomAfterFitting = this._map.getZoom(); if (zoomBeforeFitting < zoomAfterFitting) { this._map.setView({ animate: false, zoom: zoomBeforeFitting }) } else { this._option("zoom", zoomAfterFitting) } delete this._preventZoomChangeEvent } return Promise.resolve() }, _extendBounds: function(location) { if (this._bounds) { this._bounds = new Microsoft.Maps.LocationRect.fromLocations(this._bounds.getNorthwest(), this._bounds.getSoutheast(), location) } else { this._bounds = new Microsoft.Maps.LocationRect(location, MIN_LOCATION_RECT_LENGTH, MIN_LOCATION_RECT_LENGTH) } }, clean: function() { if (this._map) { Microsoft.Maps.Events.removeHandler(this._providerViewChangeHandler); Microsoft.Maps.Events.removeHandler(this._providerClickHandler); this._clearMarkers(); this._clearRoutes(); this._map.dispose() } return Promise.resolve() } }); BingProvider.remapConstant = function(newValue) { BING_URL_V7 = newValue; BING_URL_V8 = newValue }; module.exports = BingProvider }, /*!**************************!*\ !*** ./js/ui/nav_bar.js ***! \**************************/ function(module, exports, __webpack_require__) { var registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, NavBarItem = __webpack_require__( /*! ./nav_bar/item */ 307), Tabs = __webpack_require__( /*! ./tabs */ 293); var NAVBAR_CLASS = "dx-navbar", ITEM_CLASS = "dx-item-content", NAVBAR_ITEM_CLASS = "dx-nav-item", NAVBAR_ITEM_CONTENT_CLASS = "dx-nav-item-content"; var NavBar = Tabs.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { scrollingEnabled: false }) }, _render: function() { this.callBase(); this.element().addClass(NAVBAR_CLASS) }, _postprocessRenderItem: function(args) { this.callBase(args); var $itemElement = args.itemElement, itemData = args.itemData; $itemElement.addClass(NAVBAR_ITEM_CLASS); $itemElement.find("." + ITEM_CLASS).addClass(NAVBAR_ITEM_CONTENT_CLASS); if (!itemData.icon && !itemData.iconSrc) { $itemElement.addClass("dx-navbar-text-item") } } }); NavBar.ItemClass = NavBarItem; registerComponent("dxNavBar", NavBar); module.exports = NavBar }, /*!*******************************!*\ !*** ./js/ui/nav_bar/item.js ***! \*******************************/ function(module, exports, __webpack_require__) { var TabsItem = __webpack_require__( /*! ../tabs/item */ 294); var TABS_ITEM_BADGE_CLASS = "dx-tabs-item-badge", NAVBAR_ITEM_BADGE_CLASS = "dx-navbar-item-badge"; var NavBarItem = TabsItem.inherit({ _renderBadge: function(badge) { this.callBase(badge); this._$element.children("." + TABS_ITEM_BADGE_CLASS).removeClass(TABS_ITEM_BADGE_CLASS).addClass(NAVBAR_ITEM_BADGE_CLASS) } }); module.exports = NavBarItem }, /*!******************************!*\ !*** ./js/ui/radio_group.js ***! \******************************/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__( /*! ./radio_group/radio_group */ 309) }, /*!******************************************!*\ !*** ./js/ui/radio_group/radio_group.js ***! \******************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, devices = __webpack_require__( /*! ../../core/devices */ 53), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), Editor = __webpack_require__( /*! ../editor/editor */ 106), inkRipple = __webpack_require__( /*! ../widget/utils.ink_ripple */ 202), DataExpressionMixin = __webpack_require__( /*! ../editor/ui.data_expression */ 251), themes = __webpack_require__( /*! ../themes */ 143), CollectionWidget = __webpack_require__( /*! ../collection/ui.collection_widget.edit */ 149), ChildDefaultTemplate = __webpack_require__( /*! ../widget/child_default_template */ 100); var RADIO_GROUP_CLASS = "dx-radiogroup", RADIO_GROUP_VERTICAL_CLASS = "dx-radiogroup-vertical", RADIO_GROUP_HORIZONTAL_CLASS = "dx-radiogroup-horizontal", RADIO_BUTTON_CLASS = "dx-radiobutton", RADIO_BUTTON_ICON_CLASS = "dx-radiobutton-icon", RADIO_BUTTON_ICON_DOT_CLASS = "dx-radiobutton-icon-dot", RADIO_VALUE_CONTAINER_CLASS = "dx-radio-value-container", RADIO_BUTTON_CHECKED_CLASS = "dx-radiobutton-checked", ITEM_DATA_KEY = "dxItemData", RADIO_FEEDBACK_HIDE_TIMEOUT = 100; var RadioCollection = CollectionWidget.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), DataExpressionMixin._dataExpressionDefaultOptions(), { _itemAttributes: { role: "radio" } }) }, _supportedKeys: function() { var parent = this.callBase(); return extend({}, parent, { enter: function(e) { e.preventDefault(); return parent.enter.apply(this, arguments) }, space: function(e) { e.preventDefault(); return parent.space.apply(this, arguments) } }) }, _focusTarget: function() { return this.element().parent() }, _keyboardEventBindingTarget: function() { return this._focusTarget() } }); var RadioGroup = Editor.inherit({ _activeStateUnit: "." + RADIO_BUTTON_CLASS, _getDefaultOptions: function() { return extend(this.callBase(), extend(DataExpressionMixin._dataExpressionDefaultOptions(), { hoverStateEnabled: true, activeStateEnabled: true, layout: "vertical", useInkRipple: false })) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: { tablet: true }, options: { layout: "horizontal" } }, { device: function() { return "desktop" === devices.real().deviceType && !devices.isSimulator() }, options: { focusStateEnabled: true } }, { device: function() { return /android5/.test(themes.current()) }, options: { useInkRipple: true } }]) }, _setOptionsByReference: function() { this.callBase(); extend(this._optionsByReference, { value: true }) }, _dataSourceOptions: function() { return { paginate: false } }, _init: function() { this.callBase(); this._initDataExpressions(); this._feedbackHideTimeout = RADIO_FEEDBACK_HIDE_TIMEOUT }, _initTemplates: function() { this.callBase(); this._defaultTemplates.item = new ChildDefaultTemplate("item", this) }, _render: function() { this.element().addClass(RADIO_GROUP_CLASS); this._renderSubmitElement(); this._renderRadios(); this.setAria("role", "radiogroup"); this.callBase(); this._renderLayout(); this._updateItemsSize(); this.option("useInkRipple") && this._renderInkRipple() }, _renderInkRipple: function() { this._inkRipple = inkRipple.render({ waveSizeCoefficient: 3.3, useHoldAnimation: false, isCentered: true }) }, _toggleActiveState: function($element, value, e) { this.callBase.apply(this, arguments); if (!this._inkRipple) { return } if (value) { this._inkRipple.showWave({ element: $element.find("." + RADIO_BUTTON_ICON_CLASS), jQueryEvent: e }) } else { this._inkRipple.hideWave({ element: $element.find("." + RADIO_BUTTON_ICON_CLASS), jQueryEvent: e }) } }, _renderFocusState: noop, _renderRadios: function() { var $radios = $("<div>").appendTo(this.element()); this._radios = this._createComponent($radios, RadioCollection, { dataSource: this._dataSource, onItemRendered: this._itemRenderedHandler.bind(this), onItemClick: this._itemClickHandler.bind(this), itemTemplate: this._getTemplateByOption("itemTemplate"), scrollingEnabled: false, focusStateEnabled: this.option("focusStateEnabled"), accessKey: this.option("accessKey"), tabIndex: this.option("tabIndex"), noDataText: "" }); this._setCollectionWidgetOption("onContentReady", this._contentReadyHandler.bind(this)); this._contentReadyHandler() }, _renderSubmitElement: function() { this._$submitElement = $("<input>").attr("type", "hidden").appendTo(this.element()); this._setSubmitValue() }, _setSubmitValue: function(value) { value = value || this.option("value"); var submitValue = "this" === this.option("valueExpr") ? this._displayGetter(value) : value; this._$submitElement.val(submitValue) }, _getSubmitElement: function() { return this._$submitElement }, _contentReadyHandler: function() { this.itemElements().addClass(RADIO_BUTTON_CLASS); this._refreshSelected() }, _itemRenderedHandler: function(e) { if (e.itemData.html) { return } var $radio, $radioContainer; $radio = $("<div>").addClass(RADIO_BUTTON_ICON_CLASS); $("<div>").addClass(RADIO_BUTTON_ICON_DOT_CLASS).appendTo($radio); $radioContainer = $("<div>").append($radio).addClass(RADIO_VALUE_CONTAINER_CLASS); e.itemElement.prepend($radioContainer) }, _itemClickHandler: function(e) { this._saveValueChangeEvent(e.jQueryEvent); this.option("value", this._getItemValue(e.itemData)) }, _getItemValue: function(item) { return !!this._valueGetter ? this._valueGetter(item) : item.text }, itemElements: function() { return this._radios.itemElements() }, _renderDimensions: function() { this.callBase(); this._updateItemsSize() }, _renderLayout: function() { var layout = this.option("layout"); this.element().toggleClass(RADIO_GROUP_VERTICAL_CLASS, "vertical" === layout); this.element().toggleClass(RADIO_GROUP_HORIZONTAL_CLASS, "horizontal" === layout) }, _refreshSelected: function() { var selectedValue = this.option("value"); this.itemElements().each(function(_, item) { var $item = $(item); var itemValue = this._valueGetter($item.data(ITEM_DATA_KEY)); $item.toggleClass(RADIO_BUTTON_CHECKED_CLASS, this._isValueEquals(itemValue, selectedValue)); this.setAria("checked", this._isValueEquals(itemValue, selectedValue), $item) }.bind(this)) }, _updateItemsSize: function() { if ("horizontal" === this.option("layout")) { this.itemElements().css("height", "auto") } else { var itemsCount = this.option("items").length; this.itemElements().css("height", 100 / itemsCount + "%") } }, _getAriaTarget: function() { return this.element() }, _setCollectionWidgetOption: function() { this._setWidgetOption("_radios", arguments) }, focus: function() { this._radios && this._radios.focus() }, _optionChanged: function(args) { this._dataExpressionOptionChanged(args); switch (args.name) { case "useInkRipple": this._invalidate(); break; case "focusStateEnabled": case "accessKey": case "tabIndex": this._setCollectionWidgetOption(args.name, args.value); break; case "disabled": this.callBase(args); this._setCollectionWidgetOption(args.name, args.value); break; case "dataSource": this._setCollectionWidgetOption("dataSource"); break; case "valueExpr": this._refreshSelected(); break; case "value": this._refreshSelected(); this._setSubmitValue(args.value); this.callBase(args); break; case "items": case "itemTemplate": case "displayExpr": break; case "layout": this._renderLayout(); this._updateItemsSize(); break; default: this.callBase(args) } } }).include(DataExpressionMixin); registerComponent("dxRadioGroup", RadioGroup); module.exports = RadioGroup }, /*!*******************************!*\ !*** ./js/ui/range_slider.js ***! \*******************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), Slider = __webpack_require__( /*! ./slider */ 311), SliderHandle = __webpack_require__( /*! ./slider/ui.slider_handle */ 313), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, applyServerDecimalSeparator = __webpack_require__( /*! ../core/utils/common */ 14).applyServerDecimalSeparator, eventUtils = __webpack_require__( /*! ../events/utils */ 71), messageLocalization = __webpack_require__( /*! ../localization/message */ 89); var RANGE_SLIDER_CLASS = "dx-rangeslider", RANGE_SLIDER_START_HANDLE_CLASS = RANGE_SLIDER_CLASS + "-start-handle", RANGE_SLIDER_END_HANDLE_CLASS = RANGE_SLIDER_CLASS + "-end-handle"; var RangeSlider = Slider.inherit({ _supportedKeys: function() { var isRTL = this.option("rtlEnabled"); var that = this, _changeHandle = function(e, capturedHandle) { if (that.option("start") === that.option("end")) { that._capturedHandle = capturedHandle; e.target = that._capturedHandle; that._capturedHandle.focus() } }, _setHandleValue = function(e, step, sign) { var isStart = $(e.target).hasClass(RANGE_SLIDER_START_HANDLE_CLASS), valueOption = isStart ? "start" : "end", val = that.option(valueOption); step = that._valueStep(step); val += sign * (isRTL ? -step : step); that.option(valueOption, val) }, moveHandleRight = function(e, step) { _changeHandle(e, isRTL ? that._$handleStart : that._$handleEnd); _setHandleValue(e, step, 1) }, moveHandleLeft = function(e, step) { _changeHandle(e, isRTL ? that._$handleEnd : that._$handleStart); _setHandleValue(e, step, -1) }; return extend(this.callBase(), { leftArrow: function(e) { e.preventDefault(); e.stopPropagation(); moveHandleLeft(e, this.option("step")) }, rightArrow: function(e) { e.preventDefault(); e.stopPropagation(); moveHandleRight(e, this.option("step")) }, pageUp: function(e) { e.preventDefault(); e.stopPropagation(); moveHandleRight(e, this.option("step") * this.option("keyStep")) }, pageDown: function(e) { e.preventDefault(); e.stopPropagation(); moveHandleLeft(e, this.option("step") * this.option("keyStep")) }, home: function(e) { e.preventDefault(); e.stopPropagation(); var isStart = $(e.target).hasClass(RANGE_SLIDER_START_HANDLE_CLASS), valueOption = isStart ? "start" : "end", startOption = isStart ? "min" : "start", val = this.option(startOption); this.option(valueOption, val) }, end: function(e) { e.preventDefault(); e.stopPropagation(); var isStart = $(e.target).hasClass(RANGE_SLIDER_START_HANDLE_CLASS), valueOption = isStart ? "start" : "end", endOption = isStart ? "end" : "max", val = this.option(endOption); this.option(valueOption, val) } }) }, _getDefaultOptions: function() { return extend(this.callBase(), { start: 40, end: 60, value: [40, 60], startName: "", endName: "" }) }, _renderSubmitElement: function() { var $element = this.element(); this._$submitStartElement = $("<input>").attr("type", "hidden").attr("name", this.option("startName")).appendTo($element); this._$submitEndElement = $("<input>").attr("type", "hidden").attr("name", this.option("endName")).appendTo($element) }, _initOptions: function(options) { this.callBase(options); var initialValue = this.initialOption("value"), value = this.option("value"); if (value[0] === initialValue[0] && value[1] === initialValue[1]) { this.option("value", [this.option("start"), this.option("end")]) } else { this.option({ start: value[0], end: value[1] }) } }, _render: function() { this.callBase(); this.element().addClass(RANGE_SLIDER_CLASS); this._callHandlerMethod("repaint") }, _renderHandle: function() { this._$handleStart = this._renderHandleImpl(this.option("start"), this._$handleStart).addClass(RANGE_SLIDER_START_HANDLE_CLASS); this._$handleEnd = this._renderHandleImpl(this.option("end"), this._$handleEnd).addClass(RANGE_SLIDER_END_HANDLE_CLASS); this._updateHandleAriaLabels() }, _startHandler: function(args) { var e = args.jQueryEvent, $range = this._$range, rangeWidth = $range.width(), eventOffsetX = eventUtils.eventData(e).x - this._$bar.offset().left, startHandleX = $range.position().left, endHandleX = $range.position().left + rangeWidth, rtlEnabled = this.option("rtlEnabled"), startHandleIsClosest = (rtlEnabled ? -1 : 1) * ((startHandleX + endHandleX) / 2 - eventOffsetX) > 0; this._capturedHandle = startHandleIsClosest ? this._$handleStart : this._$handleEnd; this.callBase(args) }, _updateHandleAriaLabels: function() { this.setAria("label", messageLocalization.getFormatter("dxRangeSlider-ariaFrom")(this.option("dxRangeSlider-ariaFrom")), this._$handleStart); this.setAria("label", messageLocalization.getFormatter("dxRangeSlider-ariaTill")(this.option("dxRangeSlider-ariaTill")), this._$handleEnd) }, _activeHandle: function() { return this._capturedHandle }, _updateHandlePosition: function(e) { var rtlEnabled = this.option("rtlEnabled"), offsetDirection = rtlEnabled ? -1 : 1, max = this.option("max"), min = this.option("min"); var newRatio = this._startOffset + offsetDirection * e.jQueryEvent.offset / this._swipePixelRatio(); newRatio = newRatio.toPrecision(12); var newValue = newRatio * (max - min) + min; this._updateSelectedRangePosition(newRatio, newRatio); SliderHandle.getInstance(this._activeHandle()).fitTooltipPosition; this._changeValueOnSwipe(newRatio); var $nextHandle, startValue = this.option("start"), endValue = this.option("end"); if (startValue === endValue) { if (newValue < startValue) { $nextHandle = this._$handleStart } else { $nextHandle = this._$handleEnd } $nextHandle.focus(); if ($nextHandle && $nextHandle !== this._capturedHandle) { this._updateSelectedRangePosition((startValue - min) / (max - min), (endValue - min) / (max - min)); this._toggleActiveState(this._activeHandle(), false); this._toggleActiveState($nextHandle, true); this._capturedHandle = $nextHandle } this._updateSelectedRangePosition(newRatio, newRatio); this._changeValueOnSwipe(newRatio) } }, _updateSelectedRangePosition: function(leftRatio, rightRatio) { var rtlEnabled = this.option("rtlEnabled"), moveRight = this._capturedHandle === this._$handleStart && rtlEnabled || this._capturedHandle === this._$handleEnd && !rtlEnabled; var prop = moveRight ? "right" : "left"; if (rtlEnabled ^ moveRight) { this._$range.css(prop, 100 - 100 * rightRatio + "%") } else { this._$range.css(prop, 100 * leftRatio + "%") } }, _setValueOnSwipe: function(value) { var option = this._capturedHandle === this._$handleStart ? "start" : "end", start = this.option("start"), end = this.option("end"), max = this.option("max"), min = this.option("min"); start = Math.min(Math.max(start, min), max); end = Math.min(Math.max(end, min), max); if ("start" === option) { start = value > end ? end : value } else { end = value < start ? start : value } this.option("value", [start, end]) }, _renderValue: function() { var valStart = this.option("start"), valEnd = this.option("end"), min = this.option("min"), max = this.option("max"), rtlEnabled = this.option("rtlEnabled"); valStart = Math.max(min, Math.min(valStart, max)); valEnd = Math.max(valStart, Math.min(valEnd, max)); this.option("start", valStart); this.option("end", valEnd); this._$submitStartElement.val(applyServerDecimalSeparator(valStart)); this._$submitEndElement.val(applyServerDecimalSeparator(valEnd)); var ratio1 = max === min ? 0 : (valStart - min) / (max - min), ratio2 = max === min ? 0 : (valEnd - min) / (max - min); var startOffset = parseFloat((100 * ratio1).toPrecision(12)) + "%", endOffset = parseFloat((100 * (1 - ratio2)).toPrecision(12)) + "%"; !this._needPreventAnimation && this._setRangeStyles({ right: rtlEnabled ? startOffset : endOffset, left: rtlEnabled ? endOffset : startOffset }); SliderHandle.getInstance(this._$handleStart).option("value", valStart); SliderHandle.getInstance(this._$handleEnd).option("value", valEnd) }, _callHandlerMethod: function(name, args) { SliderHandle.getInstance(this._$handleStart)[name](args); SliderHandle.getInstance(this._$handleEnd)[name](args) }, _setValueOption: function() { var start = this.option("start"), end = this.option("end"); this.option("value", [start, end]) }, _optionChanged: function(args) { switch (args.name) { case "value": this.option({ start: args.value[0], end: args.value[1] }); break; case "start": case "end": this._setValueOption(); this._renderValue(); var start = this.option("start"), end = this.option("end"); this._createActionByOption("onValueChanged", { excludeValidators: ["disabled", "readOnly"] })({ start: start, end: end, value: [start, end], jQueryEvent: this._valueChangeEventInstance }); this._saveValueChangeEvent(void 0); break; case "startName": this._$submitStartElement.attr("name", args.value); break; case "endName": this._$submitEndElement.attr("name", args.value); break; case "name": break; default: this.callBase(args) } } }); registerComponent("dxRangeSlider", RangeSlider); module.exports = RangeSlider }, /*!*************************!*\ !*** ./js/ui/slider.js ***! \*************************/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__( /*! ./slider/ui.slider */ 312) }, /*!***********************************!*\ !*** ./js/ui/slider/ui.slider.js ***! \***********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), domUtils = __webpack_require__( /*! ../../core/utils/dom */ 56), numberLocalization = __webpack_require__( /*! ../../localization/number */ 32), devices = __webpack_require__( /*! ../../core/devices */ 53), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, applyServerDecimalSeparator = __webpack_require__( /*! ../../core/utils/common */ 14).applyServerDecimalSeparator, registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), TrackBar = __webpack_require__( /*! ../track_bar */ 284), eventUtils = __webpack_require__( /*! ../../events/utils */ 71), pointerEvents = __webpack_require__( /*! ../../events/pointer */ 76), feedbackEvents = __webpack_require__( /*! ../../events/core/emitter.feedback */ 104), SliderHandle = __webpack_require__( /*! ./ui.slider_handle */ 313), inkRipple = __webpack_require__( /*! ../widget/utils.ink_ripple */ 202), clickEvent = __webpack_require__( /*! ../../events/click */ 75), Swipeable = __webpack_require__( /*! ../../events/gesture/swipeable */ 255), themes = __webpack_require__( /*! ../themes */ 143); var SLIDER_CLASS = "dx-slider", SLIDER_WRAPPER_CLASS = "dx-slider-wrapper", SLIDER_HANDLE_SELECTOR = ".dx-slider-handle", SLIDER_BAR_CLASS = "dx-slider-bar", SLIDER_RANGE_CLASS = "dx-slider-range", SLIDER_RANGE_VISIBLE_CLASS = "dx-slider-range-visible", SLIDER_LABEL_CLASS = "dx-slider-label", SLIDER_LABEL_POSITION_CLASS_PREFIX = "dx-slider-label-position-", SLIDER_TOOLTIP_POSITION_CLASS_PREFIX = "dx-slider-tooltip-position-"; var Slider = TrackBar.inherit({ _activeStateUnit: SLIDER_HANDLE_SELECTOR, _supportedKeys: function() { var isRTL = this.option("rtlEnabled"); var that = this; var roundedValue = function(offset, isLeftDirection) { offset = that._valueStep(offset); var step = that.option("step"); var value = that.option("value"); var division = (value - that.option("min")) % step; var result = isLeftDirection ? value - offset + (division ? step - division : 0) : value + offset - division; var min = that.option("min"), max = that.option("max"); if (result < min) { result = min } else { if (result > max) { result = max } } return result }; var moveHandleRight = function(offset) { that.option("value", roundedValue(offset, isRTL)) }; var moveHandleLeft = function(offset) { that.option("value", roundedValue(offset, !isRTL)) }; return extend(this.callBase(), { leftArrow: function(e) { e.preventDefault(); e.stopPropagation(); moveHandleLeft(this.option("step")) }, rightArrow: function(e) { e.preventDefault(); e.stopPropagation(); moveHandleRight(this.option("step")) }, pageUp: function(e) { e.preventDefault(); e.stopPropagation(); moveHandleRight(this.option("step") * this.option("keyStep")) }, pageDown: function(e) { e.preventDefault(); e.stopPropagation(); moveHandleLeft(this.option("step") * this.option("keyStep")) }, home: function(e) { e.preventDefault(); e.stopPropagation(); var min = this.option("min"); this.option("value", min) }, end: function(e) { e.preventDefault(); e.stopPropagation(); var max = this.option("max"); this.option("value", max) } }) }, _getDefaultOptions: function() { return extend(this.callBase(), { hoverStateEnabled: true, activeStateEnabled: true, step: 1, value: 50, showRange: true, tooltip: { enabled: false, format: function(value) { return value }, position: "top", showMode: "onHover" }, label: { visible: false, position: "bottom", format: function(value) { return value } }, keyStep: 1, useInkRipple: false }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function() { return "desktop" === devices.real().deviceType && !devices.isSimulator() }, options: { focusStateEnabled: true } }, { device: function() { return /android5/.test(themes.current()) }, options: { useInkRipple: true } }]) }, _render: function() { this.element().addClass(SLIDER_CLASS); this._renderSubmitElement(); this.callBase(); this._renderLabels(); this._renderStartHandler(); this._renderAriaMinAndMax(); this._repaintHandle(); this.option("useInkRipple") && this._renderInkRipple() }, _renderSubmitElement: function() { this._$submitElement = $("<input>").attr("type", "hidden").appendTo(this.element()) }, _getSubmitElement: function() { return this._$submitElement }, _renderInkRipple: function() { this._inkRipple = inkRipple.render({ waveSizeCoefficient: .7, isCentered: true, wavesNumber: 2, useHoldAnimation: false }) }, _renderInkWave: function(element, jQueryEvent, doRender, waveIndex) { if (!this._inkRipple) { return } var config = { element: element, jQueryEvent: jQueryEvent, wave: waveIndex }; if (doRender) { this._inkRipple.showWave(config) } else { this._inkRipple.hideWave(config) } }, _visibilityChanged: function() { this.repaint() }, _renderWrapper: function() { this.callBase(); this._$wrapper.addClass(SLIDER_WRAPPER_CLASS); this._createComponent(this._$wrapper, Swipeable, { elastic: false, immediate: true, onStart: this._swipeStartHandler.bind(this), onUpdated: this._swipeUpdateHandler.bind(this), onEnd: this._swipeEndHandler.bind(this), itemSizeFunc: this._itemWidthFunc.bind(this) }) }, _renderContainer: function() { this.callBase(); this._$bar.addClass(SLIDER_BAR_CLASS) }, _renderRange: function() { this.callBase(); this._$range.addClass(SLIDER_RANGE_CLASS); this._renderHandle(); this._renderRangeVisibility() }, _renderRangeVisibility: function() { this._$range.toggleClass(SLIDER_RANGE_VISIBLE_CLASS, Boolean(this.option("showRange"))) }, _renderHandle: function() { this._$handle = this._renderHandleImpl(this.option("value"), this._$handle) }, _renderHandleImpl: function(value, $element) { var $handle = $element || $("<div>").appendTo(this._$range), format = this.option("tooltip.format"), tooltipEnabled = this.option("tooltip.enabled"), tooltipPosition = this.option("tooltip.position"); this.element().toggleClass(SLIDER_TOOLTIP_POSITION_CLASS_PREFIX + "bottom", tooltipEnabled && "bottom" === tooltipPosition).toggleClass(SLIDER_TOOLTIP_POSITION_CLASS_PREFIX + "top", tooltipEnabled && "top" === tooltipPosition); this._createComponent($handle, SliderHandle, { value: value, tooltipEnabled: tooltipEnabled, tooltipPosition: tooltipPosition, tooltipFormat: format, tooltipShowMode: this.option("tooltip.showMode"), tooltipFitIn: this.element() }); return $handle }, _renderAriaMinAndMax: function() { this.setAria({ valuemin: this.option("min"), valuemax: this.option("max") }, this._$handle) }, _hoverStartHandler: function(e) { SliderHandle.getInstance($(e.currentTarget)).updateTooltip() }, _toggleActiveState: function($element, value) { this.callBase($element, value); if (value) { SliderHandle.getInstance($element).updateTooltip() } this._renderInkWave($element, null, !!value, 1) }, _toggleFocusClass: function(isFocused, $element) { this.callBase(isFocused, $element); if (this._disposed) { return } var $focusTarget = $($element || this._focusTarget()); this._renderInkWave($focusTarget, null, isFocused, 0) }, _renderLabels: function() { this.element().removeClass(SLIDER_LABEL_POSITION_CLASS_PREFIX + "bottom").removeClass(SLIDER_LABEL_POSITION_CLASS_PREFIX + "top"); if (this.option("label.visible")) { var min = this.option("min"), max = this.option("max"), position = this.option("label.position"), labelFormat = this.option("label.format"); if (!this._$minLabel) { this._$minLabel = $("<div>").addClass(SLIDER_LABEL_CLASS).appendTo(this._$wrapper) } this._$minLabel.html(numberLocalization.format(min, labelFormat)); if (!this._$maxLabel) { this._$maxLabel = $("<div>").addClass(SLIDER_LABEL_CLASS).appendTo(this._$wrapper) } this._$maxLabel.html(numberLocalization.format(max, labelFormat)); this.element().addClass(SLIDER_LABEL_POSITION_CLASS_PREFIX + position) } else { if (this._$minLabel) { this._$minLabel.remove(); delete this._$minLabel } if (this._$maxLabel) { this._$maxLabel.remove(); delete this._$maxLabel } } }, _renderDimensions: function() { this.callBase(); if (this._$bar) { var barMarginWidth = this._$bar.outerWidth(true) - this._$bar.outerWidth(); this._$bar.width(this.option("width") - barMarginWidth) } }, _renderStartHandler: function() { var pointerDownEventName = eventUtils.addNamespace(pointerEvents.down, this.NAME), clickEventName = eventUtils.addNamespace(clickEvent.name, this.NAME), startAction = this._createAction(this._startHandler.bind(this)); this.element().off(pointerDownEventName).on(pointerDownEventName, function(e) { if (eventUtils.isMouseEvent(e)) { startAction({ jQueryEvent: e }) } }).off(clickEventName).on(clickEventName, function(e) { var handle = this._activeHandle(); handle && handle.focusin() && handle.focus(); startAction({ jQueryEvent: e }) }.bind(this)) }, _itemWidthFunc: function() { return this._itemWidthRatio }, _swipeStartHandler: function(e) { var startOffset, endOffset, rtlEnabled = this.option("rtlEnabled"); if (eventUtils.isTouchEvent(e.jQueryEvent)) { this._createAction(this._startHandler.bind(this))({ jQueryEvent: e.jQueryEvent }) } this._feedbackDeferred = $.Deferred(); feedbackEvents.lock(this._feedbackDeferred); this._toggleActiveState(this._activeHandle(), this.option("activeStateEnabled")); this._startOffset = this._currentRatio; startOffset = this._startOffset * this._swipePixelRatio(); endOffset = (1 - this._startOffset) * this._swipePixelRatio(); e.jQueryEvent.maxLeftOffset = rtlEnabled ? endOffset : startOffset; e.jQueryEvent.maxRightOffset = rtlEnabled ? startOffset : endOffset; this._itemWidthRatio = this.element().width() / this._swipePixelRatio(); this._needPreventAnimation = true }, _swipeEndHandler: function(e) { this._feedbackDeferred.resolve(); this._toggleActiveState(this._activeHandle(), false); var offsetDirection = this.option("rtlEnabled") ? -1 : 1; delete this._needPreventAnimation; this._changeValueOnSwipe(this._startOffset + offsetDirection * e.jQueryEvent.targetOffset / this._swipePixelRatio()); delete this._startOffset; this._renderValue() }, _activeHandle: function() { return this._$handle }, _swipeUpdateHandler: function(e) { this._saveValueChangeEvent(e); this._updateHandlePosition(e) }, _updateHandlePosition: function(e) { var offsetDirection = this.option("rtlEnabled") ? -1 : 1; var newRatio = this._startOffset + offsetDirection * e.jQueryEvent.offset / this._swipePixelRatio(); this._$range.width(100 * newRatio + "%"); SliderHandle.getInstance(this._activeHandle()).fitTooltipPosition; this._changeValueOnSwipe(newRatio) }, _swipePixelRatio: function() { var min = this.option("min"), max = this.option("max"), step = this._valueStep(this.option("step")); return (max - min) / step }, _valueStep: function(step) { if (!step || isNaN(step)) { step = 1 } step = parseFloat(step.toFixed(5)); if (0 === step) { step = 1e-5 } return step }, _changeValueOnSwipe: function(ratio) { var min = this.option("min"), max = this.option("max"), step = this._valueStep(this.option("step")), newChange = ratio * (max - min), newValue = min + newChange; if (step < 0) { return } if (newValue === max || newValue === min) { this._setValueOnSwipe(newValue) } else { var stepExponent = (step + "").split(".")[1]; var minExponent = (min + "").split(".")[1]; var exponentLength = Math.max(stepExponent && stepExponent.length || 0, minExponent && minExponent.length || 0); var stepCount = Math.round((newValue - min) / step); newValue = Number((stepCount * step + min).toFixed(exponentLength)); this._setValueOnSwipe(Math.max(Math.min(newValue, max), min)) } }, _setValueOnSwipe: function(value) { this.option("value", value) }, _startHandler: function(args) { var e = args.jQueryEvent; this._currentRatio = (eventUtils.eventData(e).x - this._$bar.offset().left) / this._$bar.width(); if (this.option("rtlEnabled")) { this._currentRatio = 1 - this._currentRatio } this._saveValueChangeEvent(e); this._changeValueOnSwipe(this._currentRatio) }, _renderValue: function() { this.callBase(); var value = this.option("value"); this._$submitElement.val(applyServerDecimalSeparator(value)); SliderHandle.getInstance(this._activeHandle()).option("value", value) }, _setRangeStyles: function(options) { this._$range.css(options) }, _callHandlerMethod: function(name, args) { SliderHandle.getInstance(this._$handle)[name](args) }, _repaintHandle: function() { this._callHandlerMethod("repaint") }, _fitTooltip: function() { this._callHandlerMethod("fitTooltipPosition") }, _optionChanged: function(args) { switch (args.name) { case "visible": this.callBase(args); this._renderHandle(); this._repaintHandle(); domUtils.triggerShownEvent(this.element()); break; case "min": case "max": this._renderLabels(); this._renderAriaMinAndMax(); this.callBase(args); this._fitTooltip(); break; case "step": this._renderValue(); break; case "keyStep": break; case "showRange": this._renderRangeVisibility(); break; case "tooltip": this._renderHandle(); break; case "label": this._renderLabels(); break; case "rtlEnabled": this._toggleRTLDirection(); this._renderValue(); break; case "useInkRipple": this._invalidate(); break; default: this.callBase(args) } }, _refresh: function() { this._renderDimensions(); this._renderValue(); this._renderHandle(); this._repaintHandle() } }); registerComponent("dxSlider", Slider); module.exports = Slider }, /*!******************************************!*\ !*** ./js/ui/slider/ui.slider_handle.js ***! \******************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Widget = __webpack_require__( /*! ../widget/ui.widget */ 95), Tooltip = __webpack_require__( /*! ../tooltip */ 314), translator = __webpack_require__( /*! ../../animation/translator */ 69), positionUtils = __webpack_require__( /*! ../../animation/position */ 70), mathUtils = __webpack_require__( /*! ../../core/utils/math */ 87), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, numberLocalization = __webpack_require__( /*! ../../localization/number */ 32); var SLIDER_CLASS = "dx-slider", SLIDER_HANDLE_CLASS = "dx-slider-handle"; var POSITION_ALIASES = { top: { my: "bottom center", at: "top center", collision: "none" }, bottom: { my: "top center", at: "bottom center", collision: "none" }, right: { my: "left center", at: "right center", collision: "none" }, left: { my: "right center", at: "left center", collision: "none" } }; var SliderHandle = Widget.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { hoverStateEnabled: false, value: 0, tooltipEnabled: false, tooltipFormat: function(v) { return v }, tooltipPosition: "top", tooltipShowMode: "onHover", tooltipFitIn: null }) }, _render: function() { this.callBase(); this.element().addClass(SLIDER_HANDLE_CLASS); this._renderTooltip(); this.setAria({ role: "slider", valuenow: this.option("value") }) }, _renderTooltip: function() { if (this.option("tooltipEnabled")) { if (!this._$tooltip) { this._$tooltip = $("<div>").appendTo(this.element()) } this._$slider = this.element().closest("." + SLIDER_CLASS); this._updateTooltip() } else { this._removeTooltip() } }, _createTooltip: function() { if (this._tooltip) { return false } this._tooltip = this._createComponent(this._$tooltip, Tooltip, { visible: true, target: this.element(), closeOnOutsideClick: false, container: this.element(), closeOnBackButton: false, closeOnTargetScroll: false, onPositioned: function(args) { this._saveTooltipElements(args.component); this._saveTooltipLocation(); this._centeredTooltipPosition() }.bind(this), animation: null, arrowPosition: null, templatesRenderAsynchronously: false }); return true }, _removeTooltip: function() { if (!this._$tooltip) { return } this._$tooltip.remove(); delete this._$tooltip; delete this._tooltip }, _renderTooltipPosition: function() { if (!this._tooltip) { return } var position = this.option("tooltipPosition"); this._saveTooltipElements(); this._resetTooltipPosition(); if ("string" === commonUtils.type(position)) { position = extend({ boundary: this._$slider, boundaryOffset: { h: 1, v: 1 } }, POSITION_ALIASES[position]) } this._tooltip.option("position", position); this._saveTooltipLocation() }, _saveTooltipElements: function(tooltip) { tooltip = this._tooltip || tooltip; this._$tooltipContent = tooltip.content().parent(); this._$tooltipArrow = this._$tooltipContent.find(".dx-popover-arrow") }, _resetTooltipPosition: function() { translator.resetPosition(this._$tooltipContent); translator.resetPosition(this._$tooltipArrow) }, _saveTooltipLocation: function() { this._contentLocate = translator.locate(this._$tooltipContent) }, _centeredTooltipPosition: function() { if (!this._tooltip) { return } this._$tooltipContent.outerWidth("auto"); var outerWidthWithoutRounding = this._$tooltipContent.get(0).getBoundingClientRect().width; var tooltipOuterWidth = Math.ceil(outerWidthWithoutRounding); var roundedTooltipOuterWidth = tooltipOuterWidth % 2 + tooltipOuterWidth; this._$tooltipContent.outerWidth(roundedTooltipOuterWidth); var tooltipCenter = (roundedTooltipOuterWidth - this.element().width()) / 2; this._contentLocate.left = -tooltipCenter; this._$tooltipArrow.css({ marginLeft: -this._$tooltipArrow.outerWidth() / 2, left: "50%" }); this._fitTooltip() }, _fitTooltip: function() { if (!this._tooltip) { return } var position = this.option("tooltipPosition"); if ("string" === commonUtils.type(position)) { position = extend({ of: this.element(), boundary: this._$slider, boundaryOffset: { h: 2, v: 1 } }, POSITION_ALIASES[position], { collision: "fit none" }) } var calculatePosition = positionUtils.calculate(this._$tooltipContent, position); var isLeftSide = "left" === calculatePosition.h.collisionSide; var arrowLeft = (isLeftSide ? -1 : 1) * calculatePosition.h.oversize, arrowMinLeft = this._contentLocate.left, arrowMaxRight = this._contentLocate.left + this._$tooltipContent.outerWidth() - this._$tooltipArrow.outerWidth(); translator.move(this._$tooltipContent, { left: this._contentLocate.left + (isLeftSide ? 1 : -1) * calculatePosition.h.oversize }); translator.move(this._$tooltipArrow, { left: mathUtils.fitIntoRange(arrowLeft, arrowMinLeft, arrowMaxRight) }) }, _renderValue: function() { if (!this._tooltip) { return } var formattedValue = numberLocalization.format(this.option("value"), this.option("tooltipFormat")); this._tooltip.content().html(formattedValue); this._fitTooltip() }, _updateTooltip: function() { var hoverMode = /^onhover$/i.test(this.option("tooltipShowMode")); if (!hoverMode) { this._createTooltip() } this.element().toggleClass("dx-slider-tooltip-on-hover", hoverMode); this._renderTooltipPosition(); this._renderValue(); this._centeredTooltipPosition() }, _clean: function() { this.callBase(); delete this._$tooltip; delete this._tooltip }, _ensureTooltipIsCentered: function(value, previousValue) { if (commonUtils.isDefined(value) && commonUtils.isDefined(previousValue) && value.toString().length !== previousValue.toString().length) { this._centeredTooltipPosition() } }, _optionChanged: function(args) { switch (args.name) { case "tooltipFormat": this._renderValue(); break; case "value": this._renderValue(); this._ensureTooltipIsCentered(args.value, args.previousValue); this.setAria("valuenow", args.value); break; case "tooltipEnabled": this._renderTooltip(); break; case "tooltipPosition": this._renderTooltipPosition(); this._centeredTooltipPosition(); break; case "tooltipShowMode": this._updateTooltip(); break; case "tooltipFitIn": this._fitTooltip(); break; default: this.callBase(args) } }, fitTooltipPosition: function() { this._fitTooltip() }, updateTooltip: function() { if (!this._createTooltip()) { return } this._renderTooltipPosition(); this._renderValue(); this._centeredTooltipPosition() }, repaint: function() { this._renderTooltipPosition(); this._centeredTooltipPosition(); if (this._tooltip) { this._tooltip._visibilityChanged(true) } } }); module.exports = SliderHandle }, /*!**************************!*\ !*** ./js/ui/tooltip.js ***! \**************************/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__( /*! ./tooltip/tooltip */ 315); module.exports.show = __webpack_require__( /*! ./tooltip/ui.tooltip */ 316).show; module.exports.hide = __webpack_require__( /*! ./tooltip/ui.tooltip */ 316).hide }, /*!**********************************!*\ !*** ./js/ui/tooltip/tooltip.js ***! \**********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Guid = __webpack_require__( /*! ../../core/guid */ 151), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, Popover = __webpack_require__( /*! ../popover */ 207), TOOLTIP_CLASS = "dx-tooltip", TOOLTIP_WRAPPER_CLASS = "dx-tooltip-wrapper"; var Tooltip = Popover.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { toolbarItems: [], showCloseButton: false, showTitle: false, title: null, titleTemplate: null, onTitleRendered: null, bottomTemplate: null, propagateOutsideClick: true }) }, _render: function() { this.element().addClass(TOOLTIP_CLASS); this._wrapper().addClass(TOOLTIP_WRAPPER_CLASS); this.callBase() }, _renderContent: function() { this.callBase(); this._contentId = "dx-" + new Guid; this._$content.attr({ id: this._contentId, role: "tooltip" }); this._toggleAriaDescription(true) }, _toggleAriaDescription: function(showing) { var $target = $(this.option("target")), label = showing ? this._contentId : void 0; this.setAria("describedby", label, $target) } }); registerComponent("dxTooltip", Tooltip); module.exports = Tooltip }, /*!*************************************!*\ !*** ./js/ui/tooltip/ui.tooltip.js ***! \*************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Tooltip = __webpack_require__( /*! ./tooltip */ 315), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, viewPortUtils = __webpack_require__( /*! ../../core/utils/view_port */ 55); var tooltip = null; var removeTooltipElement = null; var createTooltip = function(options) { options = extend({ position: "top" }, options); var content = options.content; delete options.content; var $tooltip = $("<div />").html(content).appendTo(viewPortUtils.value()); removeTooltipElement = function() { $tooltip.remove() }; tooltip = new Tooltip($tooltip, options) }; var removeTooltip = function() { if (!tooltip) { return } removeTooltipElement(); tooltip = null }; exports.show = function(options) { removeTooltip(); createTooltip(options); return tooltip.show() }; exports.hide = function() { if (!tooltip) { return $.Deferred().resolve() } return tooltip.hide().done(removeTooltip).promise() } }, /*!*****************************!*\ !*** ./js/ui/select_box.js ***! \*****************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../core/utils/array */ 26).inArray, errors = __webpack_require__( /*! ../core/errors */ 7), inkRipple = __webpack_require__( /*! ./widget/utils.ink_ripple */ 202), messageLocalization = __webpack_require__( /*! ../localization/message */ 89), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), eventUtils = __webpack_require__( /*! ../events/utils */ 71), dataQuery = __webpack_require__( /*! ../data/query */ 159), DropDownList = __webpack_require__( /*! ./drop_down_editor/ui.drop_down_list */ 209), themes = __webpack_require__( /*! ./themes */ 143), clickEvent = __webpack_require__( /*! ../events/click */ 75); var DISABLED_STATE_SELECTOR = ".dx-state-disabled", SELECTBOX_CLASS = "dx-selectbox", SELECTBOX_POPUP_CLASS = "dx-selectbox-popup", SELECTBOX_CONTAINER_CLASS = "dx-selectbox-container", SELECTBOX_POPUP_WRAPPER_CLASS = "dx-selectbox-popup-wrapper"; var SelectBox = DropDownList.inherit({ _supportedKeys: function() { var that = this, parent = this.callBase(), clearSelectBox = function(e) { var isEditable = this._isEditable(); if (!isEditable) { if (this.option("showClearButton")) { e.preventDefault(); this.reset() } } else { if (this._valueSubstituted()) { this._preventFiltering = true } } this._preventSubstitution = true }; var searchIfNeeded = function() { if (that.option("searchEnabled") && that._valueSubstituted()) { that._searchHandler() } }; return extend({}, parent, { tab: function() { if (this.option("opened") && "instantly" === this.option("applyValueMode")) { this._cleanInputSelection() } parent.tab.apply(this, arguments) }, upArrow: function() { if (parent.upArrow.apply(this, arguments)) { if (!this.option("opened")) { this._setNextValue(-1) } return true } }, downArrow: function() { if (parent.downArrow.apply(this, arguments)) { if (!this.option("opened")) { this._setNextValue(1) } return true } }, leftArrow: function() { searchIfNeeded(); parent.leftArrow.apply(this, arguments) }, rightArrow: function() { searchIfNeeded(); parent.rightArrow.apply(this, arguments) }, home: function() { searchIfNeeded(); parent.home.apply(this, arguments) }, end: function() { searchIfNeeded(); parent.end.apply(this, arguments) }, escape: function() { parent.escape.apply(this, arguments); if (!this._isEditable()) { this._focusListElement(null); this._updateField(this.option("selectedItem")) } }, enter: function(e) { if ("" === this._input().val() && this.option("value") && this.option("allowClearing")) { this.option({ selectedItem: null, value: null }); this.close() } else { if (this.option("acceptCustomValue")) { e.preventDefault() } if (parent.enter.apply(this, arguments)) { return this.option("opened") } } }, backspace: clearSelectBox, del: clearSelectBox }) }, _getDefaultOptions: function() { return extend(this.callBase(), { placeholder: messageLocalization.format("Select"), fieldTemplate: null, valueChangeEvent: "change", acceptCustomValue: false, onCustomItemCreating: function(e) { return e.text }, showSelectionControls: false, autocompletionEnabled: true, allowClearing: true, tooltipEnabled: false, openOnFieldClick: true, showDropDownButton: true, displayCustomValue: false, _isAdaptablePopupPosition: false, useInkRipple: false }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function() { return /win8/.test(themes.current()) }, options: { _isAdaptablePopupPosition: true, popupPosition: { at: "left top", offset: { h: 0, v: 0 } } } }, { device: function() { return /android5/.test(themes.current()) }, options: { _isAdaptablePopupPosition: true, popupPosition: { offset: { h: -16, v: -8 } }, useInkRipple: true } }]) }, _init: function() { this.callBase(); this._initCustomItemCreatingAction() }, _render: function() { this._renderSubmitElement(); this.callBase(); this.element().addClass(SELECTBOX_CLASS); this.option("useInkRipple") && this._renderInkRipple(); this._renderTooltip(); this._$container.addClass(SELECTBOX_CONTAINER_CLASS) }, _renderSubmitElement: function() { this._$submitElement = $("<input>").attr("type", "hidden").appendTo(this.element()) }, _renderInkRipple: function() { this._inkRipple = inkRipple.render() }, _toggleActiveState: function($element, value, e) { this.callBase.apply(this, arguments); if (!this._inkRipple || this._isEditable()) { return } var config = { element: this._inputWrapper(), jQueryEvent: e }; if (value) { this._inkRipple.showWave(config) } else { this._inkRipple.hideWave(config) } }, _createPopup: function() { this.callBase(); this._popup.element().addClass(SELECTBOX_POPUP_CLASS) }, _popupWrapperClass: function() { return this.callBase() + " " + SELECTBOX_POPUP_WRAPPER_CLASS }, _renderOpenedState: function() { this.callBase(); if (this.option("opened")) { this._scrollToSelectedItem(); this._focusSelectedElement() } }, _focusSelectedElement: function() { var searchValue = this._searchValue(); if (!searchValue) { this._focusListElement(null); return } var $listItems = this._list._itemElements(), index = inArray(this.option("selectedItem"), this.option("items")), focusedElement = index >= 0 && !this._isCustomItemSelected() ? $listItems.eq(index) : null; this._focusListElement(focusedElement) }, _renderFocusedElement: function() { if (!this._list) { return } var searchValue = this._searchValue(); if (!searchValue || this.option("acceptCustomValue")) { this._focusListElement(null); return } var $listItems = this._list._itemElements(), focusedElement = $listItems.not(DISABLED_STATE_SELECTOR).eq(0); this._focusListElement(focusedElement) }, _focusListElement: function(element) { this._preventInputValueRender = true; this._list.option("focusedElement", element); delete this._preventInputValueRender }, _scrollToSelectedItem: function() { this._list.scrollToItem(this._list.option("selectedItem")) }, _listContentReadyHandler: function() { this.callBase(); var isPaginate = this._dataSource.paginate(); if (isPaginate && this._needPopupRepaint()) { return } this._scrollToSelectedItem() }, _renderValue: function() { this._renderInputValue(); this._setSubmitValue() }, _setSubmitValue: function() { var value = this.option("value"), submitValue = "this" === this.option("valueExpr") ? this._displayGetter(value) : value; this._$submitElement.val(submitValue) }, _getSubmitElement: function() { return this._$submitElement }, _renderInputValue: function() { return this.callBase().always(function() { this._renderInputValueAsync() }.bind(this)) }, _renderInputValueAsync: function() { this._renderTooltip(); this._renderInputValueImpl(); this._refreshSelected() }, _renderInputValueImpl: function() { this._renderInputAddons() }, _fitIntoRange: function(value, start, end) { if (value > end) { return start } if (value < start) { return end } return value }, _setNextValue: function(step) { var dataSourceIsLoaded = this._dataSource.isLoaded() ? $.Deferred().resolve() : this._dataSource.load(); dataSourceIsLoaded.done(function() { var item = this._calcNextItem(step), value = this._valueGetter(item); this._setValue(value) }.bind(this)) }, _calcNextItem: function(step) { var items = this._items(); var nextIndex = this._fitIntoRange(this._getSelectedIndex() + step, 0, items.length - 1); return items[nextIndex] }, _items: function() { var items = this._list ? this.option("items") : this._dataSource.items(); var availableItems = new dataQuery(items).filter("disabled", "<>", true).toArray(); return availableItems }, _getSelectedIndex: function() { var items = this._items(); var selectedItem = this.option("selectedItem"); var result = -1; $.each(items, function(index, item) { if (this._isValueEquals(item, selectedItem)) { result = index; return false } }.bind(this)); return result }, _setSelectedItem: function(item) { var isUnknownItem = !this._isCustomValueAllowed() && void 0 === item; this.callBase(isUnknownItem ? null : item) }, _isCustomValueAllowed: function() { return this.option("acceptCustomValue") || this.callBase() }, _displayValue: function(item) { item = !commonUtils.isDefined(item) && this._isCustomValueAllowed() ? this.option("value") : item; return this.callBase(item) }, _listConfig: function() { var result = extend(this.callBase(), { pageLoadMode: "scrollBottom", onSelectionChanged: this._getSelectionChangeHandler(), selectedItem: this.option("selectedItem"), onFocusedItemChanged: this._listFocusedItemChangeHandler.bind(this) }); if (this.option("showSelectionControls")) { extend(result, { showSelectionControls: true, selectionByClick: true }) } return result }, _listFocusedItemChangeHandler: function(e) { if (this._preventInputValueRender) { return } var list = e.component, focusedElement = list.option("focusedElement"), focusedItem = list._getItemData(focusedElement); this._updateField(focusedItem) }, _updateField: function(item) { var fieldTemplate = this._getTemplateByOption("fieldTemplate"); if (!(fieldTemplate && this.option("fieldTemplate"))) { this._renderDisplayText(this._displayGetter(item)); return } this._renderInputAddons() }, _getSelectionChangeHandler: function() { return this.option("showSelectionControls") ? this._selectionChangeHandler.bind(this) : commonUtils.noop }, _selectionChangeHandler: function(e) { $.each(e.addedItems || [], function(_, addedItem) { this._setValue(this._valueGetter(addedItem)) }.bind(this)) }, _toggleOpenState: function(isVisible) { if (this.option("disabled")) { return } isVisible = arguments.length ? isVisible : !this.option("opened"); if (!isVisible) { this._restoreInputText() } if (this._wasSearch() && isVisible) { this._wasSearch(false); if (this.option("showDataBeforeSearch") || 0 === this.option("minSearchLength")) { var searchValue = this._dataSource.searchValue(); searchValue && this._wasSearch(true); this._filterDataSource(searchValue || null) } else { this._setListOption("items", []) } } this.callBase(isVisible) }, _renderTooltip: function() { if (this.option("tooltipEnabled")) { this.element().attr("title", this.option("displayValue")) } }, _renderDimensions: function() { this.callBase(); this._setPopupOption("width") }, _restoreInputText: function() { if (this.option("acceptCustomValue")) { return } if (!this._searchValue() && this.option("allowClearing")) { this._clearTextValue(); return } var oldSelectedItem = this.option("selectedItem"); this._renderInputValue().always(function(selectedItem) { var newSelectedItem = commonUtils.ensureDefined(selectedItem, oldSelectedItem); this._setSelectedItem(newSelectedItem); this._updateField(newSelectedItem); this._clearFilter() }.bind(this)) }, _focusOutHandler: function(e) { this.callBase(e); this._restoreInputText() }, _clearTextValue: function() { this.option("value", null) }, _renderValueChangeEvent: function() { if (this._isEditable()) { this.callBase() } }, _isEditable: function() { return this.option("acceptCustomValue") || this.option("searchEnabled") }, _fieldRenderData: function() { var $listFocused = this._list && this._list.option("focusedElement"); if ($listFocused) { return this._list._getItemData($listFocused) } return this.option("selectedItem") }, _readOnlyPropValue: function() { return !this._isEditable() || this.option("readOnly") }, _isSelectedValue: function(value) { return this._isValueEquals(value, this.option("value")) }, _shouldCloseOnItemClick: function() { return !(this.option("showSelectionControls") && "single" !== this.option("selectionMode")) }, _listItemClickHandler: function(e) { var previousValue = this._getCurrentValue(); this._saveValueChangeEvent(e.jQueryEvent); this._completeSelection(this._valueGetter(e.itemData)); if (this._shouldCloseOnItemClick()) { this.option("opened", false) } if (this.option("searchEnabled") && previousValue === this._valueGetter(e.itemData)) { this._updateField(e.itemData) } }, _completeSelection: function(value) { if (this._wasSearch()) { this._clearFilter() } this._setValue(value) }, _clearValueHandler: function() { this.reset() }, _loadItem: function(value) { var that = this, deferred = $.Deferred(); this.callBase(value).done(function(item) { deferred.resolve(item) }).fail(function() { var selectedItem = that.option("selectedItem"); if (that.option("acceptCustomValue") && value === that._valueGetter(selectedItem)) { deferred.resolve(selectedItem) } else { deferred.reject() } }); return deferred.promise() }, _isCustomItemSelected: function() { var selectedItem = this.option("selectedItem"), searchValue = this._searchValue(), selectedItemText = this._displayGetter(selectedItem); return !selectedItemText || searchValue !== selectedItemText.toString() }, _valueChangeEventHandler: function() { if (this.option("acceptCustomValue") && this._isCustomItemSelected()) { this._customItemAddedHandler() } }, _initCustomItemCreatingAction: function() { this._customItemCreatingAction = this._createActionByOption("onCustomItemCreating") }, _customItemAddedHandler: function() { var searchValue = this._searchValue(), item = this._customItemCreatingAction({ text: searchValue }), isDeferred = item && item.promise && item.done && item.fail; if (void 0 === item) { this._renderValue(); throw errors.Error("E0121") } if (isDeferred) { item.done(this._setCustomItem.bind(this)).fail(this._setCustomItem.bind(this, null)) } else { this._setCustomItem(item) } }, _setCustomItem: function(item) { if (this._disposed) { return } item = item || null; this.option("selectedItem", item); this._setValue(this._valueGetter(item)); this._renderDisplayText(this._displayGetter(item)); if (null === item && this._wasSearch()) { this._filterDataSource(null) } }, _createClearButton: function() { var eventName = eventUtils.addNamespace(clickEvent.name, this.NAME); return this.callBase().on(eventName, function() { return false }) }, _wasSearch: function(value) { if (!arguments.length) { return this._wasSearchValue } this._wasSearchValue = value }, _searchHandler: function(e) { if (e && this._isControlKey(e.key) || this._preventFiltering) { delete this._preventFiltering; return } if (this._needPassDataSourceToList()) { this._wasSearch(true) } this.callBase(e) }, _dataSourceFiltered: function(searchValue) { this.callBase(); if (null !== searchValue) { this._renderInputSubstitution(); this._renderFocusedElement() } }, _valueSubstituted: function() { var input = this._input().get(0), inputHasSelection = input.selectionStart !== input.selectionEnd; return this._wasSearch() && inputHasSelection }, _shouldSubstitutionBeRendered: function() { return this.option("autocompletionEnabled") && !this._preventSubstitution && this.option("searchEnabled") && !this.option("acceptCustomValue") && "startswith" === this.option("searchMode") }, _renderInputSubstitution: function() { if (!this._shouldSubstitutionBeRendered()) { delete this._preventSubstitution; return } var item = this._list && this._getPlainItems(this._list.option("items"))[0]; if (!item) { return } var $input = this._input(), valueLength = $input.val().length; if (0 === valueLength) { return } var inputElement = $input.get(0), displayValue = this._displayGetter(item); inputElement.value = displayValue; inputElement.selectionStart = valueLength; inputElement.selectionEnd = displayValue.length }, _cleanInputSelection: function() { var inputElement = this._input().get(0), endPosition = inputElement.value.length; inputElement.selectionStart = endPosition; inputElement.selectionEnd = endPosition }, _dispose: function() { this._renderInputValueAsync = commonUtils.noop; this.callBase() }, _optionChanged: function(args) { switch (args.name) { case "_isAdaptablePopupPosition": case "autocompletionEnabled": break; case "onCustomItemCreating": this._initCustomItemCreatingAction(); break; case "tooltipEnabled": this._renderTooltip(); break; case "displayCustomValue": case "acceptCustomValue": case "showSelectionControls": case "useInkRipple": this._invalidate(); break; case "selectedItem": if (args.previousValue !== args.value) { this.callBase(args) } break; case "allowClearing": break; default: this.callBase(args) } } }); registerComponent("dxSelectBox", SelectBox); module.exports = SelectBox }, /*!*************************!*\ !*** ./js/ui/switch.js ***! \*************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), devices = __webpack_require__( /*! ../core/devices */ 53), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, inkRipple = __webpack_require__( /*! ./widget/utils.ink_ripple */ 202), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), Editor = __webpack_require__( /*! ./editor/editor */ 106), eventUtils = __webpack_require__( /*! ../events/utils */ 71), feedbackEvents = __webpack_require__( /*! ../events/core/emitter.feedback */ 104), themes = __webpack_require__( /*! ./themes */ 143), fx = __webpack_require__( /*! ../animation/fx */ 68), messageLocalization = __webpack_require__( /*! ../localization/message */ 89), clickEvent = __webpack_require__( /*! ../events/click */ 75), Swipeable = __webpack_require__( /*! ../events/gesture/swipeable */ 255); var SWITCH_CLASS = "dx-switch", SWITCH_WRAPPER_CLASS = SWITCH_CLASS + "-wrapper", SWITCH_CONTAINER_CLASS = SWITCH_CLASS + "-container", SWITCH_INNER_CLASS = SWITCH_CLASS + "-inner", SWITCH_HANDLE_CLASS = SWITCH_CLASS + "-handle", SWITCH_ON_VALUE_CLASS = SWITCH_CLASS + "-on-value", SWITCH_ON_CLASS = SWITCH_CLASS + "-on", SWITCH_OFF_CLASS = SWITCH_CLASS + "-off", SWITCH_ANIMATION_DURATION = 100; var Switch = Editor.inherit({ _supportedKeys: function() { var isRTL = this.option("rtlEnabled"); var click = function(e) { e.preventDefault(); this._clickAction({ jQueryEvent: e }) }, move = function(value, e) { e.preventDefault(); e.stopPropagation(); this._animateValue(value) }; return extend(this.callBase(), { space: click, enter: click, leftArrow: move.bind(this, isRTL ? true : false), rightArrow: move.bind(this, isRTL ? false : true) }) }, _getDefaultOptions: function() { return extend(this.callBase(), { hoverStateEnabled: true, activeStateEnabled: true, onText: messageLocalization.format("dxSwitch-onText"), offText: messageLocalization.format("dxSwitch-offText"), value: false, useInkRipple: false, useOldRendering: false }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function() { return "desktop" === devices.real().deviceType && !devices.isSimulator() }, options: { focusStateEnabled: true } }, { device: function() { return /android5/.test(themes.current()) }, options: { useInkRipple: true } }, { device: function() { var device = devices.real(); return "android" === device.platform && (device.version[0] < 4 || 4 === device.version[0] && device.version[1] < 4) }, options: { useOldRendering: true } }]) }, _feedbackHideTimeout: 0, _animating: false, _render: function() { this._renderSwitchInner(); this._renderLabels(); this._renderContainers(); this.option("useInkRipple") && this._renderInkRipple(); this.element().addClass(SWITCH_CLASS).append(this._$switchWrapper); this.setAria("role", "button"); this._renderSubmitElement(); this._renderSwipeable(); this.callBase(); this._renderHandleWidth(); this._getHandleOffset = this.option("useOldRendering") ? this._getPixelOffset : this._getCalcOffset; this._renderValue(); this._renderClick() }, _renderHandleWidth: function() { this._handleWidth = parseFloat(window.getComputedStyle(this._$handle.get(0)).width) }, _getCalcOffset: function(value, offset) { var ratio = offset - Number(!value); return "calc(" + 100 * ratio + "% + " + -this._getHandleWidth() * ratio + "px)" }, _getHandleWidth: function() { !this._handleWidth && this._renderHandleWidth(); return this._handleWidth }, _getPixelOffset: function(value, offset) { return this._getMarginBound() * (offset - Number(!value)) }, _renderSwitchInner: function() { this._$switchInner = $("<div>").addClass(SWITCH_INNER_CLASS); this._$handle = $("<div>").addClass(SWITCH_HANDLE_CLASS).appendTo(this._$switchInner) }, _renderLabels: function() { this._$labelOn = $("<div>").addClass(SWITCH_ON_CLASS).prependTo(this._$switchInner); this._$labelOff = $("<div>").addClass(SWITCH_OFF_CLASS).appendTo(this._$switchInner); this._setLabelsText() }, _renderContainers: function() { this._$switchContainer = $("<div>").addClass(SWITCH_CONTAINER_CLASS).append(this._$switchInner); this._$switchWrapper = $("<div>").addClass(SWITCH_WRAPPER_CLASS).append(this._$switchContainer) }, _renderSwipeable: function() { this._createComponent(this.element(), Swipeable, { elastic: false, immediate: true, onStart: this._swipeStartHandler.bind(this), onUpdated: this._swipeUpdateHandler.bind(this), onEnd: this._swipeEndHandler.bind(this), itemSizeFunc: this._getMarginBound.bind(this) }) }, _renderSubmitElement: function() { this._$submitElement = $("<input>").attr("type", "hidden").appendTo(this.element()) }, _getSubmitElement: function() { return this._$submitElement }, _renderInkRipple: function() { this._inkRipple = inkRipple.render({ waveSizeCoefficient: 1.7, isCentered: true, useHoldAnimation: false, wavesNumber: 2 }) }, _renderInkWave: function(element, jQueryEvent, doRender, waveIndex) { if (!this._inkRipple) { return } var config = { element: element, jQueryEvent: jQueryEvent, wave: waveIndex }; if (doRender) { this._inkRipple.showWave(config) } else { this._inkRipple.hideWave(config) } }, _updateFocusState: function(e, value) { this.callBase.apply(this, arguments); this._renderInkWave(this._$handle, e, value, 0) }, _toggleActiveState: function($element, value, e) { this.callBase.apply(this, arguments); this._renderInkWave(this._$handle, e, value, 1) }, _getMarginBound: function() { if (!this._marginBound) { this._marginBound = this._$switchContainer.outerWidth(true) - this._getHandleWidth() } return this._marginBound }, _marginDirection: function() { return this.option("rtlEnabled") ? "Right" : "Left" }, _offsetDirection: function() { return this.option("rtlEnabled") ? -1 : 1 }, _renderPosition: function(state, swipeOffset) { var marginDirection = this._marginDirection(), resetMarginDirection = "Left" === marginDirection ? "Right" : "Left"; this._$switchInner.css("margin" + marginDirection, this._getHandleOffset(state, swipeOffset)); this._$switchInner.css("margin" + resetMarginDirection, 0) }, _validateValue: function() { var check = this.option("value"); if ("boolean" !== typeof check) { this._options.value = !!check } }, _renderClick: function() { var eventName = eventUtils.addNamespace(clickEvent.name, this.NAME); this._clickAction = this._createAction(this._clickHandler.bind(this)); this.element().off(eventName).on(eventName, function(e) { this._clickAction({ jQueryEvent: e }) }.bind(this)) }, _clickHandler: function(args) { var e = args.jQueryEvent; this._saveValueChangeEvent(e); if (this._animating || this._swiping) { return } this._animateValue(!this.option("value")) }, _animateValue: function(value) { var startValue = this.option("value"), endValue = value; if (startValue === endValue) { return } this._animating = true; var that = this, marginDirection = this._marginDirection(), resetMarginDirection = "Left" === marginDirection ? "Right" : "Left", fromConfig = {}, toConfig = {}; this._$switchInner.css("margin" + resetMarginDirection, 0); fromConfig["margin" + marginDirection] = this._getHandleOffset(startValue, 0); toConfig["margin" + marginDirection] = this._getHandleOffset(endValue, 0); fx.animate(this._$switchInner, { from: fromConfig, to: toConfig, duration: SWITCH_ANIMATION_DURATION, complete: function() { that._animating = false; that.option("value", endValue) } }) }, _swipeStartHandler: function(e) { var state = this.option("value"), rtlEnabled = this.option("rtlEnabled"), maxOffOffset = rtlEnabled ? 0 : 1, maxOnOffset = rtlEnabled ? 1 : 0; e.jQueryEvent.maxLeftOffset = state ? maxOffOffset : maxOnOffset; e.jQueryEvent.maxRightOffset = state ? maxOnOffset : maxOffOffset; this._swiping = true; this._feedbackDeferred = $.Deferred(); feedbackEvents.lock(this._feedbackDeferred); this._toggleActiveState(this.element(), this.option("activeStateEnabled")) }, _swipeUpdateHandler: function(e) { this._renderPosition(this.option("value"), this._offsetDirection() * e.jQueryEvent.offset) }, _swipeEndHandler: function(e) { var that = this, offsetDirection = this._offsetDirection(), toConfig = {}; toConfig["margin" + this._marginDirection()] = this._getHandleOffset(that.option("value"), offsetDirection * e.jQueryEvent.targetOffset); fx.animate(this._$switchInner, { to: toConfig, duration: SWITCH_ANIMATION_DURATION, complete: function() { that._swiping = false; var pos = that.option("value") + offsetDirection * e.jQueryEvent.targetOffset; that.option("value", Boolean(pos)); that._feedbackDeferred.resolve(); that._toggleActiveState(that.element(), false) } }) }, _renderValue: function() { this._validateValue(); var val = this.option("value"); this._renderPosition(val, 0); this.element().toggleClass(SWITCH_ON_VALUE_CLASS, val); this._$submitElement.val(val); this.setAria({ pressed: val, label: val ? this.option("onText") : this.option("offText") }) }, _setLabelsText: function() { this._$labelOn.text(this.option("onText")); this._$labelOff.text(this.option("offText")) }, _visibilityChanged: function(visible) { if (visible) { this.repaint() } }, _optionChanged: function(args) { switch (args.name) { case "useOldRendering": case "useInkRipple": this._invalidate(); break; case "width": delete this._marginBound; this._refresh(); break; case "onText": case "offText": this._setLabelsText(); break; case "value": this._renderValue(); this.callBase(args); break; default: this.callBase(args) } } }); registerComponent("dxSwitch", Switch); module.exports = Switch }, /*!**************************!*\ !*** ./js/ui/tag_box.js ***! \**************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), devices = __webpack_require__( /*! ../core/devices */ 53), commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), arrayUtils = __webpack_require__( /*! ../core/utils/array */ 26), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../core/utils/array */ 26).inArray, messageLocalization = __webpack_require__( /*! ../localization/message */ 89), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), eventUtils = __webpack_require__( /*! ../events/utils */ 71), SelectBox = __webpack_require__( /*! ./select_box */ 317), clickEvent = __webpack_require__( /*! ../events/click */ 75), caret = __webpack_require__( /*! ./text_box/utils.caret */ 215), browser = __webpack_require__( /*! ../core/utils/browser */ 23), when = __webpack_require__( /*! ../integration/jquery/deferred */ 16).when, pointerEvents = __webpack_require__( /*! ../events/pointer */ 76), BindableTemplate = __webpack_require__( /*! ./widget/bindable_template */ 166); var TAGBOX_TAG_DATA_KEY = "dxTagData"; var TAGBOX_CLASS = "dx-tagbox", TAGBOX_TAG_CONTAINER_CLASS = "dx-tag-container", TAGBOX_TAG_CLASS = "dx-tag", TAGBOX_CUSTOM_TAG_CLASS = "dx-tag-custom", TAGBOX_TAG_REMOVE_BUTTON_CLASS = "dx-tag-remove-button", TAGBOX_ONLY_SELECT_CLASS = "dx-tagbox-only-select", TAGBOX_SINGLE_LINE_CLASS = "dx-tagbox-single-line", TAGBOX_POPUP_WRAPPER_CLASS = "dx-tagbox-popup-wrapper", LIST_SELECT_ALL_CHECKBOX_CLASS = "dx-list-select-all-checkbox", TAGBOX_TAG_CONTENT_CLASS = "dx-tag-content", TAGBOX_DEFAULT_FIELD_TEMPLATE_CLASS = "dx-tagbox-default-template", TAGBOX_CUSTOM_FIELD_TEMPLATE_CLASS = "dx-tagbox-custom-template", NATIVE_CLICK_CLASS = "dx-native-click"; var TAGBOX_MOUSE_WHEEL_DELTA_MULTIPLIER = -.3; var TagBox = SelectBox.inherit({ _supportedKeys: function() { var parent = this.callBase(); return extend(parent, { backspace: function(e) { if (!this._isCaretAtTheStart()) { return } e.preventDefault(); e.stopPropagation(); this._isTagRemoved = true; var $tagToDelete = this._$focusedTag || this._tagElements().last(); if (this._$focusedTag) { this._moveTagFocus("prev", true) } if (0 === $tagToDelete.length) { return } this._preserveFocusedTag = true; this._removeTagElement($tagToDelete); delete this._preserveFocusedTag }, del: function(e) { if (!this._$focusedTag || !this._isCaretAtTheStart()) { return } e.preventDefault(); e.stopPropagation(); this._isTagRemoved = true; var $tagToDelete = this._$focusedTag; this._moveTagFocus("next", true); this._preserveFocusedTag = true; this._removeTagElement($tagToDelete); delete this._preserveFocusedTag }, enter: function(e) { var isListItemFocused = this._list && null !== this._list.option("focusedElement"), isCustomItem = this.option("acceptCustomValue") && !isListItemFocused; if (isCustomItem) { e.preventDefault(); "" !== this._searchValue() && this._customItemAddedHandler(); return } if (!this.option("opened")) { return } e.preventDefault(); this._keyboardProcessor._childProcessors[0].process(e) }, leftArrow: function(e) { if (!this._isCaretAtTheStart()) { return } var rtlEnabled = this.option("rtlEnabled"); if (this._isEditable() && rtlEnabled && !this._$focusedTag) { return } e.preventDefault(); var direction = rtlEnabled ? "next" : "prev"; this._moveTagFocus(direction); !this.option("multiline") && this._scrollContainer(direction) }, rightArrow: function(e) { if (!this._isCaretAtTheStart()) { return } var rtlEnabled = this.option("rtlEnabled"); if (this._isEditable() && !rtlEnabled && !this._$focusedTag) { return } e.preventDefault(); var direction = rtlEnabled ? "prev" : "next"; this._moveTagFocus(direction); !this.option("multiline") && this._scrollContainer(direction) } }) }, _isCaretAtTheStart: function() { return 0 === caret(this._input()).start }, _moveTagFocus: function(direction, clearOnBoundary) { if (!this._$focusedTag) { var tagElements = this._tagElements(); this._$focusedTag = "next" === direction ? tagElements.first() : tagElements.last(); this._toggleFocusClass(true, this._$focusedTag); return } var $nextFocusedTag = this._$focusedTag[direction]("." + TAGBOX_TAG_CLASS); if ($nextFocusedTag.length > 0) { this._replaceFocusedTag($nextFocusedTag) } else { if (clearOnBoundary || "next" === direction && this._isEditable()) { this._clearTagFocus() } } }, _replaceFocusedTag: function($nextFocusedTag) { this._toggleFocusClass(false, this._$focusedTag); this._$focusedTag = $nextFocusedTag; this._toggleFocusClass(true, this._$focusedTag) }, _clearTagFocus: function() { if (!this._$focusedTag) { return } this._toggleFocusClass(false, this._$focusedTag); delete this._$focusedTag }, _focusClassTarget: function($element) { if ($element && $element.length && $element[0] !== this._focusTarget()[0]) { return $element } return this.callBase() }, _scrollContainer: function(direction) { if (this.option("multiline")) { return } if (!this._$tagsContainer) { return } var scrollPosition = this._getScrollPosition(direction); this._$tagsContainer.scrollLeft(scrollPosition) }, _getScrollPosition: function(direction) { if ("start" === direction || "end" === direction) { return this._getBorderPosition(direction) } return this._$focusedTag ? this._getFocusedTagPosition(direction) : this._getBorderPosition("end") }, _getBorderPosition: function(direction) { var rtlEnabled = this.option("rtlEnabled"), isScrollLeft = "end" === direction ^ rtlEnabled, isScrollReverted = rtlEnabled && !browser.webkit, scrollSign = !rtlEnabled || browser.webkit || browser.msie ? 1 : -1; return isScrollLeft ^ !isScrollReverted ? 0 : scrollSign * (this._$tagsContainer.get(0).scrollWidth - this._$tagsContainer.outerWidth()) }, _getFocusedTagPosition: function(direction) { var rtlEnabled = this.option("rtlEnabled"), isScrollLeft = "next" === direction ^ rtlEnabled, scrollOffset = this._$focusedTag.position().left, scrollLeft = this._$tagsContainer.scrollLeft(); if (isScrollLeft) { scrollOffset += this._$focusedTag.outerWidth(true) - this._$tagsContainer.outerWidth() } if (isScrollLeft ^ scrollOffset < 0) { var scrollCorrection = rtlEnabled && browser.msie ? -1 : 1; scrollLeft += scrollOffset * scrollCorrection } return scrollLeft }, _setNextValue: commonUtils.noop, _setDeprecatedOptions: function() { this.callBase(); extend(this._deprecatedOptions, { values: { since: "16.1", alias: "value" } }) }, _getDefaultOptions: function() { return extend(this.callBase(), { value: [], showDropDownButton: false, tagTemplate: "tag", selectAllText: messageLocalization.format("dxList-selectAll"), hideSelectedItems: false, selectedItems: [], selectAllMode: "page", onSelectAllValueChanged: null, multiline: true }) }, _init: function() { this.callBase(); this._selectedItems = []; this._initSelectAllValueChangedAction() }, _initTemplates: function() { this.callBase(); this._defaultTemplates.tag = new BindableTemplate(function($container, data) { var $tagContent = $("<div>").addClass(TAGBOX_TAG_CONTENT_CLASS); $("<span>").text(data).appendTo($tagContent); $("<div>").addClass(TAGBOX_TAG_REMOVE_BUTTON_CLASS).appendTo($tagContent); $container.append($tagContent) }, [], this.option("integrationOptions.watchMethod")) }, _renderSubmitElement: function() { this._$submitElement = $("<select>").attr("multiple", "multiple").css("display", "none").appendTo(this.element()) }, _setSubmitValue: function() { var value = this._getValue(), useDisplayText = "this" === this.option("valueExpr"), $options = []; for (var i = 0, n = value.length; i < n; i++) { $options.push($("<option>").val(useDisplayText ? this._displayGetter(value[i]) : value[i]).attr("selected", "selected")) } this._$submitElement.html($options) }, _render: function() { this._tagElementsCache = $(); var isSingleLineMode = !this.option("multiline"); this.element().addClass(TAGBOX_CLASS).toggleClass(TAGBOX_ONLY_SELECT_CLASS, !(this.option("searchEnabled") || this.option("acceptCustomValue"))).toggleClass(TAGBOX_SINGLE_LINE_CLASS, isSingleLineMode); this._toggleRTLDirection(this.option("rtlEnabled")); this._initTagTemplate(); this.callBase(); if (isSingleLineMode) { this._renderPreventBlur() } this._renderTagRemoveAction(); this._renderSingleLineScroll(); this._scrollContainer("start") }, _initTagTemplate: function() { this._tagTemplate = this._getTemplateByOption("tagTemplate") }, _renderField: function() { var isDefaultFieldTemplate = !commonUtils.isDefined(this.option("fieldTemplate")); this.element().toggleClass(TAGBOX_DEFAULT_FIELD_TEMPLATE_CLASS, isDefaultFieldTemplate).toggleClass(TAGBOX_CUSTOM_FIELD_TEMPLATE_CLASS, !isDefaultFieldTemplate); this.callBase() }, _renderPreventBlur: function() { var eventName = eventUtils.addNamespace(pointerEvents.down, "dxTagBoxContainer"); this._$tagsContainer && this._$tagsContainer.off(eventName).on(eventName, function(e) { e.preventDefault() }) }, _renderTagRemoveAction: function() { var tagRemoveAction = this._createAction(this._removeTagHandler.bind(this)); var eventName = eventUtils.addNamespace(clickEvent.name, "dxTagBoxTagRemove"); this.element().find(".dx-texteditor-container").off(eventName).on(eventName, "." + TAGBOX_TAG_REMOVE_BUTTON_CLASS, function(e) { tagRemoveAction({ jQueryEvent: e }) }); this._renderTypingEvent() }, _renderSingleLineScroll: function() { var mouseWheelEvent = eventUtils.addNamespace("dxmousewheel", this.NAME), $element = this.element(), isMultiline = this.option("multiline"); $element.off(mouseWheelEvent); if ("desktop" !== devices.real().deviceType) { this._$tagsContainer && this._$tagsContainer.css("overflow-x", isMultiline ? "" : "auto"); return } if (isMultiline) { return } $element.on(mouseWheelEvent, this._tagContainerMouseWheelHandler.bind(this)) }, _tagContainerMouseWheelHandler: function(e) { var scrollLeft = this._$tagsContainer.scrollLeft(); this._$tagsContainer.scrollLeft(scrollLeft + e.delta * TAGBOX_MOUSE_WHEEL_DELTA_MULTIPLIER); return false }, _renderTypingEvent: function() { this._input().on(eventUtils.addNamespace("keydown", this.NAME), function(e) { if (!this._isControlKey(e.key) && this._isEditable()) { this._clearTagFocus() } }.bind(this)) }, _popupWrapperClass: function() { return this.callBase() + " " + TAGBOX_POPUP_WRAPPER_CLASS }, _renderInputValueImpl: function() { this._renderMultiSelect() }, _loadInputValue: function() { return $.when() }, _clearTextValue: function() { this._input().val("") }, _focusInHandler: function(e) { this.callBase(e); this._scrollContainer("end") }, _focusOutHandler: function(e) { if (this.option("opened") && "useButtons" === this.option("applyValueMode")) { return } this.callBase(e); this._clearTextValue(); this._clearTagFocus(); this._scrollContainer("start") }, _getFirstPopupElement: function() { return this.option("showSelectionControls") ? this._popup._wrapper().find("." + LIST_SELECT_ALL_CHECKBOX_CLASS) : this.callBase() }, _suppressingSelectionChanged: function(callback) { this._setListOption("onSelectionChanged", commonUtils.noop); callback.call(this); this._setListOption("onSelectionChanged", this._getSelectionChangeHandler()) }, _initSelectAllValueChangedAction: function() { this._selectAllValueChangeAction = this._createActionByOption("onSelectAllValueChanged") }, _renderList: function() { this.callBase(); this._setListDataSourceFilter(); if (!this.option("showSelectionControls")) { return } var $selectAllCheckBox = this._list.element().find("." + LIST_SELECT_ALL_CHECKBOX_CLASS), selectAllCheckbox = $selectAllCheckBox.dxCheckBox("instance"); selectAllCheckbox.registerKeyHandler("tab", this._popupElementTabHandler.bind(this)); selectAllCheckbox.registerKeyHandler("escape", this._popupElementEscHandler.bind(this)) }, _listConfig: function() { var that = this, selectionMode = this.option("showSelectionControls") ? "all" : "multiple"; return extend(this.callBase(), { selectionMode: selectionMode, selectAllText: this.option("selectAllText"), onSelectAllValueChanged: function(e) { that._selectAllValueChangeAction({ value: e.value }) }, selectAllMode: this.option("selectAllMode"), selectedItems: this._selectedItems, onFocusedItemChanged: null }) }, _renderMultiSelect: function() { this._$tagsContainer = this.element().find(".dx-texteditor-container").addClass(TAGBOX_TAG_CONTAINER_CLASS).addClass(NATIVE_CLICK_CLASS); this._renderInputSize(); this._renderTags(); this._popup && this._popup.refreshPosition() }, _listItemClickHandler: function(e) { !this.option("showSelectionControls") && this._clearTextValue(); if ("useButtons" === this.option("applyValueMode")) { return } this.callBase(e) }, _renderInputSize: function() { var $input = this._input(); $input.prop("size", $input.val() ? $input.val().length + 2 : 1) }, _renderInputSubstitution: function() { this.callBase(); this._renderInputSize() }, _getValue: function() { return this.option("value") || [] }, _renderTags: function() { this._cleanTags(); var $input = this._input(); var itemLoadDeferreds = $.map(this._getValue(), function(value) { return this._renderTag(value, $input) }.bind(this)); when.apply($, itemLoadDeferreds).done(function() { this._renderInputAddons(); this._scrollContainer("end"); this.option("selectedItems", this._selectedItems.slice()) }.bind(this)); this._renderEmptyState(); if (!this._preserveFocusedTag) { this._clearTagFocus() } this._refreshTagElements() }, _renderEmptyState: function() { var isEmpty = !(this._getValue().length || this._selectedItems.length || this._searchValue()); this._toggleEmptiness(isEmpty); this._renderDisplayText() }, _renderDisplayText: function() { this._renderInputSize() }, _cleanTags: function() { var $tags = this._tagElements(), values = this._getValue(); $.each($tags, function(_, tag) { var $tag = $(tag), index = inArray($tag.data(TAGBOX_TAG_DATA_KEY), values); if (index < 0) { $tag.remove() } }); this._cleanSelectedItems() }, _cleanSelectedItems: function() { if (this.option("fieldTemplate")) { this._selectedItems = []; return } var values = this._getValue(), selectedItemsCount = this._selectedItems.length; for (var index = 0; index < selectedItemsCount; index++) { var selectedItem = this._selectedItems[index], value = this._valueGetter(selectedItem); if (inArray(value, values) < 0) { this._selectedItems.splice(index, 1); index--; selectedItemsCount-- } } }, _refreshTagElements: function() { this._tagElementsCache = this.element().find("." + TAGBOX_TAG_CLASS) }, _tagElements: function() { return this._tagElementsCache }, _getDefaultTagTemplate: function() { return this._defaultTemplates.tag }, _renderTag: function(value, $input) { var $tag = this._getTag(value); if ($tag && !$tag.hasClass(TAGBOX_CUSTOM_TAG_CLASS)) { return $.Deferred().resolve() } $tag && $tag.removeClass(TAGBOX_CUSTOM_TAG_CLASS); $tag = $tag || this._createTag(value, $input); return this._loadItem(value).always(function(item) { if (!commonUtils.isDefined(item)) { $tag.addClass(TAGBOX_CUSTOM_TAG_CLASS); item = value } else { this._selectedItems.push(item) } if (this._displayGetterExpr() && this._tagTemplate === this._getDefaultTagTemplate()) { item = this._displayGetter(item) } this._tagTemplate.render({ model: item, container: $tag }) }.bind(this)) }, _getTag: function(value) { var $tags = this._tagElements(), tagsLength = $tags.length; var result = false; for (var i = 0; i < tagsLength; i++) { var $tag = $tags[i]; if (value === $.data($tag, TAGBOX_TAG_DATA_KEY)) { result = $($tag); break } } return result }, _createTag: function(value, $input) { return $("<div>").addClass(TAGBOX_TAG_CLASS).data(TAGBOX_TAG_DATA_KEY, value).insertBefore($input) }, _toggleEmptinessEventHandler: function() { this._toggleEmptiness(!this._getValue().length && !this._searchValue().length) }, _customItemAddedHandler: function(e) { this.callBase(e); this._input().val("") }, _removeTagHandler: function(args) { var e = args.jQueryEvent; e.stopPropagation(); var $tag = $(e.target).closest("." + TAGBOX_TAG_CLASS); this._removeTagElement($tag) }, _removeTagElement: function($tag) { var itemValue = $tag.data(TAGBOX_TAG_DATA_KEY); this._removeTagWithUpdate(itemValue); this._refreshTagElements() }, _updateField: commonUtils.noop, _removeTagWithUpdate: function(itemValue) { var value = this._getValue().slice(); this._removeTag(value, itemValue); this.option("value", value); if (0 === value.length) { this._clearTagFocus() } }, _getCurrentValue: function() { return this._lastValue() }, _selectionChangeHandler: function(e) { if ("useButtons" === this.option("applyValueMode")) { return } var value = this._getValue().slice(); $.each(e.removedItems || [], function(_, removedItem) { this._removeTag(value, this._valueGetter(removedItem)) }.bind(this)); $.each(e.addedItems || [], function(_, addedItem) { this._addTag(value, this._valueGetter(addedItem)) }.bind(this)); this._updateWidgetHeight(); this.option("value", value) }, _removeTag: function(value, item) { var index = this._valueIndex(item, value); if (index >= 0) { value.splice(index, 1) } }, _addTag: function(value, item) { var index = this._valueIndex(item); if (index < 0) { value.push(item) } }, _fieldRenderData: function() { return this._selectedItems.slice() }, _setValue: function(value) { if (null === value) { return } if (this.option("showSelectionControls")) { return } var valueIndex = this._valueIndex(value), values = this._getValue().slice(); if (valueIndex >= 0) { values.splice(valueIndex, 1) } else { values.push(value) } this.option("value", values) }, _isSelectedValue: function(value) { return this._valueIndex(value) > -1 }, _valueIndex: function(value, values) { values = values || this._getValue(); var result = -1; $.each(values, function(index, selectedValue) { if (this._isValueEquals(value, selectedValue)) { result = index; return false } }.bind(this)); return result }, _lastValue: function() { var values = this._getValue(), lastValue = values[values.length - 1]; return commonUtils.isDefined(lastValue) ? lastValue : null }, _valueChangeEventHandler: commonUtils.noop, _shouldRenderSearchEvent: function() { return this.option("searchEnabled") || this.option("acceptCustomValue") }, _searchHandler: function(e) { if (this.option("searchEnabled") && !!e && !this._isTagRemoved) { this.callBase(e) } this._updateWidgetHeight(); delete this._isTagRemoved }, _updateWidgetHeight: function() { var element = this.element(), originalHeight = element.height(); this._renderInputSize(); var currentHeight = element.height(); if (this._popup && this.option("opened") && this._isEditable() && currentHeight !== originalHeight) { this._popup.repaint() } }, _refreshSelected: function() { this._list && this._suppressingSelectionChanged(function() { this.callBase() }) }, _resetListDataSourceFilter: function() { var dataSource = this._getDataSource(); if (!dataSource) { return } dataSource.filter(null); dataSource.reload() }, _setListDataSourceFilter: function() { if (!this.option("hideSelectedItems") || !this._list) { return } var dataSource = this._getDataSource(); if (!dataSource) { return } dataSource.filter(this._dataSourceFilter.bind(this)); dataSource.reload() }, _dataSourceFilter: function(itemData) { var itemValue = this._valueGetter(itemData), result = true; $.each(this._getValue(), function(index, value) { if (this._isValueEquals(value, itemValue)) { result = false; return false } }.bind(this)); return result }, _applyButtonHandler: function() { this.option("value", this._getListValues()); this._clearTextValue(); this.callBase() }, _getListValues: function() { if (!this._list) { return [] } var that = this, selectedItems = this._getPlainItems(this._list.option("selectedItems")), result = []; $.each(selectedItems, function(index, item) { result[index] = that._valueGetter(item) }); return result }, _renderOpenedState: function() { this.callBase(); if (this.option(false)) { this._refreshSelected() } }, _clean: function() { this.callBase(); delete this._defaultTagTemplate; delete this._tagTemplate }, _optionChanged: function(args) { switch (args.name) { case "onSelectAllValueChanged": this._initSelectAllValueChangedAction(); break; case "hideSelectedItems": if (args.value) { this._setListDataSourceFilter() } else { this._resetListDataSourceFilter() } break; case "displayExpr": this.callBase(args); this._invalidate(); break; case "tagTemplate": this._initTagTemplate(); this._invalidate(); break; case "selectAllText": this._setListOption("selectAllText", this.option("selectAllText")); break; case "value": this.callBase(args); this._setListDataSourceFilter(); break; case "selectAllMode": this._setListOption(args.name, args.value); break; case "selectedItem": break; case "selectedItems": var addedItems = arrayUtils.removeDuplicates(args.value, args.previousValue), removedItems = arrayUtils.removeDuplicates(args.previousValue, args.value); this._selectionChangedAction({ addedItems: addedItems, removedItems: removedItems }); break; case "multiline": this.element().toggleClass(TAGBOX_SINGLE_LINE_CLASS, !args.value); this._renderSingleLineScroll(); break; default: this.callBase(args) } }, reset: function() { this.option("value", []); this._clearFilter(); this._clearSelectedItem() } }); registerComponent("dxTagBox", TagBox); module.exports = TagBox }, /*!****************************!*\ !*** ./js/ui/text_area.js ***! \****************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), noop = __webpack_require__( /*! ../core/utils/common */ 14).noop, registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, eventUtils = __webpack_require__( /*! ../events/utils */ 71), pointerEvents = __webpack_require__( /*! ../events/pointer */ 76), TextBox = __webpack_require__( /*! ./text_box */ 211); var TEXTAREA_CLASS = "dx-textarea", TEXTEDITOR_INPUT_CLASS = "dx-texteditor-input"; var TextArea = TextBox.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { spellcheck: true, minHeight: void 0, maxHeight: void 0, autoResizeEnabled: false }) }, _render: function() { this.callBase(); this.element().addClass(TEXTAREA_CLASS); this.setAria("multiline", "true"); this._updateInputHeight() }, _renderInput: function() { this.callBase(); this._renderScrollHandler() }, _createInput: function() { var $input = $("<textarea>"); this._applyInputAttributes($input, this.option("inputAttr")); return $input }, _applyInputAttributes: function($input, customAttributes) { $input.attr(customAttributes).addClass(TEXTEDITOR_INPUT_CLASS) }, _renderScrollHandler: function() { var $input = this._input(), eventY = 0; $input.on(eventUtils.addNamespace(pointerEvents.down, this.NAME), function(e) { eventY = eventUtils.eventData(e).y }); $input.on(eventUtils.addNamespace(pointerEvents.move, this.NAME), function(e) { var scrollTopPos = $input.scrollTop(), scrollBottomPos = $input.prop("scrollHeight") - $input.prop("clientHeight") - scrollTopPos; if (0 === scrollTopPos && 0 === scrollBottomPos) { return } var currentEventY = eventUtils.eventData(e).y; var isScrollFromTop = 0 === scrollTopPos && eventY >= currentEventY, isScrollFromBottom = 0 === scrollBottomPos && eventY <= currentEventY, isScrollFromMiddle = scrollTopPos > 0 && scrollBottomPos > 0; if (isScrollFromTop || isScrollFromBottom || isScrollFromMiddle) { e.isScrollingEvent = true; e.stopPropagation() } eventY = currentEventY }) }, _renderDimensions: function() { var width = this.option("width"), height = this.option("height"), minHeight = this.option("minHeight"), maxHeight = this.option("maxHeight"), $element = this.element(); $element.css({ "min-height": void 0 !== minHeight ? minHeight : "", "max-height": void 0 !== maxHeight ? maxHeight : "" }); $element.outerWidth(width); $element.outerHeight(height) }, _resetDimensions: function() { this.element().css({ height: "", "min-height": "", "max-height": "" }) }, _renderEvents: function() { if (this.option("autoResizeEnabled")) { this._input().on(eventUtils.addNamespace("input paste", this.NAME), this._updateInputHeight.bind(this)) } this.callBase() }, _refreshEvents: function() { this._input().off(eventUtils.addNamespace("input paste", this.NAME)); this.callBase() }, _updateInputHeight: function() { var $input = this._input(); if (!this.option("autoResizeEnabled") || void 0 !== this.option("height")) { $input.css("height", ""); return } this._resetDimensions(); $input.css("height", 0); var heightDifference = this._$element.outerHeight() - $input.outerHeight(); this._renderDimensions(); var minHeight = this.option("minHeight"), maxHeight = this.option("maxHeight"), inputHeight = $input[0].scrollHeight; if (void 0 !== minHeight) { inputHeight = Math.max(inputHeight, minHeight - heightDifference) } if (void 0 !== maxHeight) { inputHeight = Math.min(inputHeight, maxHeight - heightDifference) } $input.css("height", inputHeight) }, _renderInputType: noop, _visibilityChanged: function(visible) { if (visible) { this._updateInputHeight() } }, _optionChanged: function(args) { switch (args.name) { case "autoResizeEnabled": this._refreshEvents(); this._updateInputHeight(); break; case "value": case "height": this.callBase(args); this._updateInputHeight(); break; case "minHeight": case "maxHeight": this._renderDimensions(); this._updateInputHeight(); break; case "visible": this.callBase(args); args.value && this._updateInputHeight(); break; default: this.callBase(args) } } }); registerComponent("dxTextArea", TextArea); module.exports = TextArea }, /*!****************************!*\ !*** ./js/ui/tile_view.js ***! \****************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), devices = __webpack_require__( /*! ../core/devices */ 53), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), inflector = __webpack_require__( /*! ../core/utils/inflector */ 39), commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, ScrollView = __webpack_require__( /*! ./scroll_view */ 233), CollectionWidget = __webpack_require__( /*! ./collection/ui.collection_widget.edit */ 149); var TILEVIEW_CLASS = "dx-tileview", TILEVIEW_CONTAINER_CLASS = "dx-tileview-wrapper", TILEVIEW_ITEM_CLASS = "dx-tile", TILEVIEW_ITEM_SELECTOR = "." + TILEVIEW_ITEM_CLASS, TILEVIEW_ITEM_DATA_KEY = "dxTileData"; var CONFIGS = { horizontal: { itemMainRatio: "widthRatio", itemCrossRatio: "heightRatio", baseItemMainDimension: "baseItemWidth", baseItemCrossDimension: "baseItemHeight", mainDimension: "width", crossDimension: "height", mainPosition: "left", crossPosition: "top" }, vertical: { itemMainRatio: "heightRatio", itemCrossRatio: "widthRatio", baseItemMainDimension: "baseItemHeight", baseItemCrossDimension: "baseItemWidth", mainDimension: "height", crossDimension: "width", mainPosition: "top", crossPosition: "left" } }; var TileView = CollectionWidget.inherit({ _activeStateUnit: TILEVIEW_ITEM_SELECTOR, _getDefaultOptions: function() { return extend(this.callBase(), { items: null, direction: "horizontal", hoverStateEnabled: true, showScrollbar: false, height: 500, baseItemWidth: 100, baseItemHeight: 100, itemMargin: 20, activeStateEnabled: true, indicateLoading: true }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function() { return "desktop" === devices.real().deviceType && !devices.isSimulator() }, options: { focusStateEnabled: true } }]) }, _itemClass: function() { return TILEVIEW_ITEM_CLASS }, _itemDataKey: function() { return TILEVIEW_ITEM_DATA_KEY }, _itemContainer: function() { return this._$container }, _init: function() { this.callBase(); this.element().addClass(TILEVIEW_CLASS); this._initScrollView() }, _dataSourceLoadingChangedHandler: function(isLoading) { var scrollView = this._scrollView; if (!scrollView) { return } if (isLoading && this.option("indicateLoading")) { scrollView.startLoading() } else { scrollView.finishLoading() } }, _hideLoadingIfLoadIndicationOff: function() { if (!this.option("indicateLoading")) { this._dataSourceLoadingChangedHandler(false) } }, _initScrollView: function() { this._scrollView = this._createComponent(this.element(), ScrollView, { direction: this.option("direction"), scrollByContent: true, useKeyboard: false, showScrollbar: this.option("showScrollbar") }); this._$container = this._scrollView.content(); this._$container.addClass(TILEVIEW_CONTAINER_CLASS); this._scrollView.option("onUpdated", this._renderGeometry.bind(this)) }, _render: function() { this.callBase(); this._cellsPerDimension = 1; this._renderGeometry(); this._updateScrollView(); this._fireContentReadyAction() }, _renderContent: function() { this._renderContentImpl() }, _updateScrollView: function() { this._scrollView.option("direction", this.option("direction")); this._scrollView.update(); this._indicateLoadingIfAlreadyStarted() }, _indicateLoadingIfAlreadyStarted: function() { if (this._isDataSourceLoading()) { this._dataSourceLoadingChangedHandler(true) } }, _renderGeometry: function() { this._config = CONFIGS[this.option("direction")]; var items = this.option("items") || [], config = this._config, itemMargin = this.option("itemMargin"), maxItemCrossRatio = Math.max.apply(Math, $.map(items || [], function(item) { return Math.round(item[config.itemCrossRatio] || 1) })); this._cellsPerDimension = Math.floor(this.element()[config.crossDimension]() / (this.option(config.baseItemCrossDimension) + itemMargin)); this._cellsPerDimension = Math.max(this._cellsPerDimension, maxItemCrossRatio); this._cells = []; this._cells.push(new Array(this._cellsPerDimension)); this._arrangeItems(items); this._$container[config.mainDimension](this._cells.length * this.option(config.baseItemMainDimension) + (this._cells.length + 1) * itemMargin) }, _arrangeItems: function(items) { var config = this._config, itemMainRatio = config.itemMainRatio, itemCrossRatio = config.itemCrossRatio, mainPosition = config.mainPosition; this._itemsPositions = []; $.each(items, function(index, item) { var currentItem = {}; currentItem[itemMainRatio] = item[itemMainRatio] || 1; currentItem[itemCrossRatio] = item[itemCrossRatio] || 1; currentItem.index = index; currentItem[itemMainRatio] = currentItem[itemMainRatio] <= 0 ? 0 : Math.round(currentItem[config.itemMainRatio]); currentItem[itemCrossRatio] = currentItem[itemCrossRatio] <= 0 ? 0 : Math.round(currentItem[config.itemCrossRatio]); var itemPosition = this._getItemPosition(currentItem); if (itemPosition[mainPosition] === -1) { itemPosition[mainPosition] = this._cells.push(new Array(this._cellsPerDimension)) - 1 } this._occupyCells(currentItem, itemPosition); this._arrangeItem(currentItem, itemPosition); this._itemsPositions.push(itemPosition) }.bind(this)) }, _getItemPosition: function(item) { var config = this._config, mainPosition = config.mainPosition, crossPosition = config.crossPosition; var position = {}; position[mainPosition] = -1; position[crossPosition] = 0; for (var main = 0; main < this._cells.length; main++) { for (var cross = 0; cross < this._cellsPerDimension; cross++) { if (this._itemFit(main, cross, item)) { position[mainPosition] = main; position[crossPosition] = cross; break } } if (position[mainPosition] > -1) { break } } return position }, _itemFit: function(mainPosition, crossPosition, item) { var result = true, config = this._config, itemRatioMain = item[config.itemMainRatio], itemRatioCross = item[config.itemCrossRatio]; if (crossPosition + itemRatioCross > this._cellsPerDimension) { return false } for (var main = mainPosition; main < mainPosition + itemRatioMain; main++) { for (var cross = crossPosition; cross < crossPosition + itemRatioCross; cross++) { if (this._cells.length - 1 < main) { this._cells.push(new Array(this._cellsPerDimension)) } else { if (void 0 !== this._cells[main][cross]) { result = false; break } } } } return result }, _occupyCells: function(item, itemPosition) { var config = this._config, itemPositionMain = itemPosition[config.mainPosition], itemPositionCross = itemPosition[config.crossPosition], itemRatioMain = item[config.itemMainRatio], itemRatioCross = item[config.itemCrossRatio]; for (var main = itemPositionMain; main < itemPositionMain + itemRatioMain; main++) { for (var cross = itemPositionCross; cross < itemPositionCross + itemRatioCross; cross++) { this._cells[main][cross] = item.index } } }, _arrangeItem: function(item, itemPosition) { var config = this._config, itemPositionMain = itemPosition[config.mainPosition], itemPositionCross = itemPosition[config.crossPosition], itemRatioMain = item[config.itemMainRatio], itemRatioCross = item[config.itemCrossRatio], baseItemCross = this.option(config.baseItemCrossDimension), baseItemMain = this.option(config.baseItemMainDimension), itemMargin = this.option("itemMargin"); var cssProps = { display: itemRatioMain <= 0 || itemRatioCross <= 0 ? "none" : "" }; cssProps[config.mainDimension] = itemRatioMain * baseItemMain + (itemRatioMain - 1) * itemMargin; cssProps[config.crossDimension] = itemRatioCross * baseItemCross + (itemRatioCross - 1) * itemMargin; cssProps[config.mainPosition] = itemPositionMain * baseItemMain + (itemPositionMain + 1) * itemMargin; cssProps[config.crossPosition] = itemPositionCross * baseItemCross + (itemPositionCross + 1) * itemMargin; if (this.option("rtlEnabled")) { var offsetCorrection = this._$container.width(), baseItemWidth = this.option("baseItemWidth"), itemPositionX = itemPosition.left, offsetPosition = itemPositionX * baseItemWidth, itemBaseOffset = baseItemWidth + itemMargin, itemWidth = itemBaseOffset * item.widthRatio, subItemMargins = itemPositionX * itemMargin; cssProps.left = offsetCorrection - (offsetPosition + itemWidth + subItemMargins) } this._itemElements().eq(item.index).css(cssProps) }, _moveFocus: function(location) { var FOCUS_UP = "up", FOCUS_DOWN = "down", FOCUS_LEFT = this.option("rtlEnabled") ? "right" : "left", FOCUS_RIGHT = this.option("rtlEnabled") ? "left" : "right", FOCUS_PAGE_UP = "pageup", FOCUS_PAGE_DOWN = "pagedown"; var horizontalDirection = "horizontal" === this.option("direction"), cells = this._cells, index = this.option("focusedElement").index(), targetCol = this._itemsPositions[index].left, targetRow = this._itemsPositions[index].top; var colCount = (horizontalDirection ? cells : cells[0]).length; var rowCount = (horizontalDirection ? cells[0] : cells).length; var getCell = function(col, row) { if (horizontalDirection) { return cells[col][row] } return cells[row][col] }; switch (location) { case FOCUS_PAGE_UP: case FOCUS_UP: while (targetRow > 0 && index === getCell(targetCol, targetRow)) { targetRow-- } if (targetRow < 0) { targetRow = 0 } break; case FOCUS_PAGE_DOWN: case FOCUS_DOWN: while (targetRow < rowCount && index === getCell(targetCol, targetRow)) { targetRow++ } if (targetRow === rowCount) { targetRow = rowCount - 1 } break; case FOCUS_RIGHT: while (targetCol < colCount && index === getCell(targetCol, targetRow)) { targetCol++ } if (targetCol === colCount) { targetCol = colCount - 1 } break; case FOCUS_LEFT: while (targetCol >= 0 && index === getCell(targetCol, targetRow)) { targetCol-- } if (targetCol < 0) { targetCol = 0 } break; default: this.callBase.apply(this, arguments); return } var newTargetIndex = getCell(targetCol, targetRow); if (!commonUtils.isDefined(newTargetIndex)) { return } var $newTarget = this._itemElements().eq(newTargetIndex); this.option("focusedElement", $newTarget); this._scrollToItem($newTarget) }, _scrollToItem: function($itemElement) { if (!$itemElement.length) { return } var config = this._config, outerMainProp = "outer" + inflector.captionize(config.mainDimension), itemMargin = this.option("itemMargin"), itemPosition = $itemElement.position()[config.mainPosition], itemDimension = $itemElement[outerMainProp](), itemTail = itemPosition + itemDimension, scrollPosition = this.scrollPosition(), clientWidth = this.element()[outerMainProp](); if (scrollPosition <= itemPosition && itemTail <= scrollPosition + clientWidth) { return } if (scrollPosition > itemPosition) { this._scrollView.scrollTo(itemPosition - itemMargin) } else { this._scrollView.scrollTo(itemPosition + itemDimension - clientWidth + itemMargin) } }, _optionChanged: function(args) { switch (args.name) { case "showScrollbar": this._initScrollView(); break; case "disabled": this._scrollView.option("disabled", args.value); this.callBase(args); break; case "baseItemWidth": case "baseItemHeight": case "itemMargin": this._renderGeometry(); break; case "width": case "height": this.callBase(args); this._renderGeometry(); this._updateScrollView(); break; case "direction": this._renderGeometry(); this._updateScrollView(); break; case "indicateLoading": this._hideLoadingIfLoadIndicationOff(); break; default: this.callBase(args) } }, scrollPosition: function() { return this._scrollView.scrollOffset()[this._config.mainPosition] } }); registerComponent("dxTileView", TileView); module.exports = TileView }, /*!**************************!*\ !*** ./js/ui/toolbar.js ***! \**************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), themes = __webpack_require__( /*! ./themes */ 143), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), grep = __webpack_require__( /*! ../core/utils/common */ 14).grep, extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, ActionSheetStrategy = __webpack_require__( /*! ./toolbar/ui.toolbar.strategy.action_sheet */ 323), DropDownMenuStrategy = __webpack_require__( /*! ./toolbar/ui.toolbar.strategy.drop_down_menu */ 325), ListBottomStrategy = __webpack_require__( /*! ./toolbar/ui.toolbar.strategy.list_bottom */ 327), ListTopStrategy = __webpack_require__( /*! ./toolbar/ui.toolbar.strategy.list_top */ 329), ToolbarBase = __webpack_require__( /*! ./toolbar/ui.toolbar.base */ 203), ChildDefaultTemplate = __webpack_require__( /*! ./widget/child_default_template */ 100); var STRATEGIES = { actionSheet: ActionSheetStrategy, dropDownMenu: DropDownMenuStrategy, listBottom: ListBottomStrategy, listTop: ListTopStrategy }; var TOOLBAR_AUTO_HIDE_ITEM_CLASS = "dx-toolbar-item-auto-hide", TOOLBAR_AUTO_HIDE_TEXT_CLASS = "dx-toolbar-text-auto-hide", TOOLBAR_HIDDEN_ITEM = "dx-toolbar-item-invisible"; var Toolbar = ToolbarBase.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { menuItemTemplate: "menuItem", submenuType: "dropDownMenu" }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function() { return /ios7.*/.test(themes.current()) }, options: { submenuType: "actionSheet" } }, { device: function() { return /android5.*/.test(themes.current()) }, options: { submenuType: "dropDownMenu" } }, { device: function() { return /win8.*/.test(themes.current()) }, options: { submenuType: "listBottom" } }, { device: function() { return /win10.*/.test(themes.current()) }, options: { submenuType: "listTop" } }]) }, _dimensionChanged: function(dimension) { if ("height" === dimension) { return } this._menuStrategy.toggleMenuVisibility(false, true); this.callBase(); this._menuStrategy.renderMenuItems() }, _initTemplates: function() { this.callBase(); this._defaultTemplates.actionSheetItem = new ChildDefaultTemplate("item", this) }, _render: function() { this.callBase(); this._menuStrategy.renderMenuItems() }, _renderContentImpl: function() { this.callBase(); this._hideOverflowItems(); this._renderMenu() }, _renderItem: function(index, item, itemContainer, $after) { var itemElement = this.callBase(index, item, itemContainer, $after); if ("auto" === item.locateInMenu) { itemElement.addClass(TOOLBAR_AUTO_HIDE_ITEM_CLASS) } if ("dxButton" === item.widget && "inMenu" === item.showText) { itemElement.toggleClass(TOOLBAR_AUTO_HIDE_TEXT_CLASS) } return itemElement }, _hideOverflowItems: function(elementWidth) { var overflowItems = this.element().find("." + TOOLBAR_AUTO_HIDE_ITEM_CLASS); if (!overflowItems.length) { return } elementWidth = elementWidth || this.element().width(); $(overflowItems).removeClass(TOOLBAR_HIDDEN_ITEM); var beforeWidth = this._$beforeSection.outerWidth(), centerWidth = this._$centerSection.outerWidth(), afterWidth = this._$afterSection.outerWidth(), itemsWidth = beforeWidth + centerWidth + afterWidth; while (overflowItems.length && elementWidth < itemsWidth) { var $item = overflowItems.eq(-1); itemsWidth -= $item.outerWidth(); $item.addClass(TOOLBAR_HIDDEN_ITEM); overflowItems.splice(-1, 1) } }, _getMenuItems: function() { var that = this; var menuItems = grep(this.option("items") || [], function(item) { return that._isMenuItem(item) }); var $hiddenItems = this._itemContainer().children("." + TOOLBAR_AUTO_HIDE_ITEM_CLASS + "." + TOOLBAR_HIDDEN_ITEM).not(".dx-state-invisible"); this._restoreItems = this._restoreItems || []; var overflowItems = $.map($hiddenItems, function(item) { var itemData = that._getItemData(item), $itemContainer = $(item).children(), $itemMarkup = $itemContainer.children(); return extend({ menuItemTemplate: function() { that._restoreItems.push({ container: $itemContainer, item: $itemMarkup }); var $container = $("<div>").addClass(TOOLBAR_AUTO_HIDE_ITEM_CLASS); return $container.append($itemMarkup) } }, itemData) }); return $.merge(overflowItems, menuItems) }, _getToolbarItems: function() { var that = this; return grep(this.option("items") || [], function(item) { return !that._isMenuItem(item) }) }, _renderMenu: function() { this._renderMenuStrategy(); this._menuStrategy.render() }, _renderMenuStrategy: function() { var strategyName = this.option("submenuType"); if (this._requireDropDownStrategy()) { strategyName = "dropDownMenu" } var strategy = STRATEGIES[strategyName]; if (!(this._menuStrategy && this._menuStrategy.NAME === strategyName)) { this._menuStrategy = new strategy(this) } }, _requireDropDownStrategy: function() { var strategyName = this.option("submenuType"); if (("listBottom" === strategyName || "listTop" === strategyName) && "topToolbar" === this.option("renderAs")) { return true } var items = this.option("items") || [], result = false; $.each(items, function(index, item) { if ("auto" === item.locateInMenu) { result = true } else { if ("always" === item.locateInMenu && item.widget) { result = true } } }); return result }, _arrangeItems: function() { if (this.element().is(":hidden")) { return } this._$centerSection.css({ margin: "0 auto", "float": "none" }); $.each(this._restoreItems || [], function(_, obj) { $(obj.container).append(obj.item) }); this._restoreItems = []; var elementWidth = this.element().width(); this._hideOverflowItems(elementWidth); this.callBase(elementWidth) }, _itemOptionChanged: function(item, property, value) { if (this._isMenuItem(item)) { this._menuStrategy.renderMenuItems() } else { if (this._isToolbarItem(item)) { this.callBase(item, property, value) } else { this.callBase(item, property, value); this._menuStrategy.renderMenuItems() } } }, _isMenuItem: function(itemData) { return "menu" === itemData.location || "always" === itemData.locateInMenu }, _isToolbarItem: function(itemData) { return void 0 === itemData.location || "never" === itemData.locateInMenu }, _optionChanged: function(args) { var name = args.name; var value = args.value; switch (name) { case "submenuType": this._invalidate(); break; case "visible": this.callBase.apply(this, arguments); this._menuStrategy.handleToolbarVisibilityChange(value); break; case "menuItemTemplate": this._changeMenuOption("itemTemplate", this._getTemplate(value)); break; case "onItemClick": this._changeMenuOption(name, value); this.callBase.apply(this, arguments); break; default: this.callBase.apply(this, arguments) } }, _changeMenuOption: function(name, value) { this._menuStrategy.widgetOption(name, value) } }); registerComponent("dxToolbar", Toolbar); module.exports = Toolbar }, /*!***********************************************************!*\ !*** ./js/ui/toolbar/ui.toolbar.strategy.action_sheet.js ***! \***********************************************************/ function(module, exports, __webpack_require__) { var ToolbarStrategy = __webpack_require__( /*! ./ui.toolbar.strategy */ 324), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, ActionSheet = __webpack_require__( /*! ../action_sheet */ 206); var ActionSheetStrategy = ToolbarStrategy.inherit({ NAME: "actionSheet", _getMenuItemTemplate: function() { return this._toolbar._getTemplate("actionSheetItem") }, render: function() { if (!this._hasVisibleMenuItems()) { return } this.callBase() }, _menuWidgetClass: function() { return ActionSheet }, _menuContainer: function() { return this._toolbar.element() }, _widgetOptions: function() { return extend({}, this.callBase(), { target: this._$button, showTitle: false }) }, _menuButtonOptions: function() { return extend({}, this.callBase(), { icon: "overflow" }) }, _toggleMenu: function() { this.callBase.apply(this, arguments); this._menu.toggle(this._menuShown); this._menuShown = false } }); module.exports = ActionSheetStrategy }, /*!**********************************************!*\ !*** ./js/ui/toolbar/ui.toolbar.strategy.js ***! \**********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, errors = __webpack_require__( /*! ../../core/errors */ 7), compileGetter = __webpack_require__( /*! ../../core/utils/data */ 50).compileGetter, Class = __webpack_require__( /*! ../../core/class */ 25), Button = __webpack_require__( /*! ../button */ 201), abstract = Class.abstract; var TOOLBAR_MENU_CONTAINER_CLASS = "dx-toolbar-menu-container", TOOLBAR_MENU_BUTTON_CLASS = "dx-toolbar-menu-button"; var ToolbarStrategy = Class.inherit({ ctor: function(toolbar) { this._toolbar = toolbar }, render: function() { this._renderMenuButton(); this._renderWidget() }, _widgetOptions: function() { var itemClickAction = this._toolbar._createActionByOption("onItemClick"); return { itemTemplate: this._getMenuItemTemplate.bind(this), onItemClick: function(e) { this._toggleMenu(false, true); itemClickAction(e) }.bind(this) } }, _getMenuItemTemplate: function() { return this._toolbar._getTemplateByOption("menuItemTemplate") }, _renderWidget: function() { var $menu = $("<div>").appendTo(this._menuContainer()); this._menu = this._toolbar._createComponent($menu, this._menuWidgetClass(), this._widgetOptions()); this.renderMenuItems() }, _menuContainer: abstract, _menuWidgetClass: abstract, _hasVisibleMenuItems: function(items) { var menuItems = items || this._toolbar.option("items"), result = false; var optionGetter = compileGetter("visible"), overflowGetter = compileGetter("locateInMenu"); var menuLocation = false; $.each(menuItems, function(index, item) { var itemVisible = optionGetter(item, { functionsAsIs: true }), itemOverflow = overflowGetter(item, { functionsAsIs: true }); if ("menu" === item.location) { menuLocation = true } if (false !== itemVisible && ("auto" === itemOverflow || "always" === itemOverflow || "menu" === item.location)) { result = true } }); if (menuLocation) { errors.log("W0001", "dxToolbar - 'location' item field", "menu", "16.1", "Use 'locateInMenu' item field instead.") } return result }, _getMenuItems: function() { return this._toolbar._getMenuItems() }, _renderMenuButton: function() { var buttonOptions = this._menuButtonOptions(); this._renderMenuButtonContainer(); this._$button = $("<div>").appendTo(this._$menuButtonContainer).addClass(TOOLBAR_MENU_BUTTON_CLASS); this._toolbar._createComponent(this._$button, Button, buttonOptions) }, _menuButtonOptions: function() { return { onClick: this._menuButtonClickHandler.bind(this) } }, _menuButtonClickHandler: function() { this._toggleMenu(!this._menuShown, true) }, _renderMenuButtonContainer: function() { var $afterSection = this._toolbar._$afterSection; this._$menuButtonContainer = $("<div>").appendTo($afterSection).addClass(this._toolbar._buttonClass()).addClass(TOOLBAR_MENU_CONTAINER_CLASS) }, renderMenuItems: function() { this._menu && this._menu.option("items", this._getMenuItems()) }, toggleMenuVisibility: function(visible, animate) { this._menu && this._toggleMenu(visible, animate) }, _toggleMenu: function(visible) { this._menuShown = visible }, getMenuWidget: function() { return this._menu }, widgetOption: function(name, value) { this._menu && this._menu.option(name, value) }, handleToolbarVisibilityChange: noop }); module.exports = ToolbarStrategy }, /*!*************************************************************!*\ !*** ./js/ui/toolbar/ui.toolbar.strategy.drop_down_menu.js ***! \*************************************************************/ function(module, exports, __webpack_require__) { var extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, ToolbarStrategy = __webpack_require__( /*! ./ui.toolbar.strategy */ 324), ToolbarMenu = __webpack_require__( /*! ./ui.toolbar.menu */ 326), DropDownMenu = __webpack_require__( /*! ../drop_down_menu */ 281); var DropDownMenuStrategy = ToolbarStrategy.inherit({ NAME: "dropDownMenu", render: function() { if (!this._hasVisibleMenuItems()) { return } this._renderMenuButtonContainer(); this._renderWidget() }, renderMenuItems: function() { if (!this._menu) { this.render() } this.callBase(); if (this._menu && !this._menu.option("items").length) { this._menu.close() } }, _menuWidgetClass: function() { return DropDownMenu }, _widgetOptions: function() { return extend(this.callBase(), { deferRendering: true, menuWidget: ToolbarMenu, popupPosition: { at: "bottom right", my: "top right" } }) }, _getMenuItems: function() { var menuItems = this.callBase(), isMenuVisible = menuItems.length && this._hasVisibleMenuItems(menuItems); this._toggleMenuVisibility(isMenuVisible); return menuItems }, _toggleMenuVisibility: function(value) { if (!this._menuContainer()) { return } this._menuContainer().toggleClass("dx-state-invisible", !value) }, _menuContainer: function() { return this._$menuButtonContainer } }); module.exports = DropDownMenuStrategy }, /*!******************************************!*\ !*** ./js/ui/toolbar/ui.toolbar.menu.js ***! \******************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), List = __webpack_require__( /*! ../list/ui.list.base */ 231); var TOOLBAR_MENU_ACTION_CLASS = "dx-toolbar-menu-action", TOOLBAR_HIDDEN_BUTTON_CLASS = "dx-toolbar-hidden-button", TOOLBAR_MENU_SECTION_CLASS = "dx-toolbar-menu-section", TOOLBAR_MENU_LAST_SECTION_CLASS = "dx-toolbar-menu-last-section"; var ToolbarMenu = List.inherit({ _activeStateUnit: "." + TOOLBAR_MENU_ACTION_CLASS, _render: function() { this._renderSections(); this.callBase() }, _getSections: function() { return this._itemContainer().children() }, _itemElements: function() { return this._getSections().children(this._itemSelector()) }, _renderSections: function() { var that = this, $container = this._itemContainer(); $.each(["before", "center", "after", "menu"], function() { var sectionName = "_$" + this + "Section", $section = that[sectionName]; if (!$section) { that[sectionName] = $section = $("<div>").addClass(TOOLBAR_MENU_SECTION_CLASS) } $section.appendTo($container) }) }, _renderItems: function() { this.callBase.apply(this, arguments); this._updateSections() }, _updateSections: function() { var $sections = this.element().find("." + TOOLBAR_MENU_SECTION_CLASS); $sections.removeClass(TOOLBAR_MENU_LAST_SECTION_CLASS); $sections.not(":empty").eq(-1).addClass(TOOLBAR_MENU_LAST_SECTION_CLASS) }, _renderItem: function(index, item, itemContainer, $after) { var itemElement, location = item.location || "menu", $container = this["_$" + location + "Section"]; itemElement = this.callBase(index, item, $container, $after); if (this._getItemTemplateName({ itemData: item })) { itemElement.addClass("dx-toolbar-menu-custom") } if ("menu" === location || "dxButton" === item.widget || item.isAction) { itemElement.addClass(TOOLBAR_MENU_ACTION_CLASS) } if ("dxButton" === item.widget) { itemElement.addClass(TOOLBAR_HIDDEN_BUTTON_CLASS) } return itemElement }, _getItemTemplateName: function(args) { var template = this.callBase(args); var data = args.itemData, menuTemplate = data && data.menuItemTemplate; return menuTemplate || template }, _itemClickHandler: function(e, args, config) { if ($(e.target).closest("." + TOOLBAR_MENU_ACTION_CLASS).length) { this.callBase(e, args, config) } }, _clean: function() { this._getSections().empty(); this.callBase() } }); registerComponent("dxToolbarMenu", ToolbarMenu); module.exports = ToolbarMenu }, /*!**********************************************************!*\ !*** ./js/ui/toolbar/ui.toolbar.strategy.list_bottom.js ***! \**********************************************************/ function(module, exports, __webpack_require__) { var ListStrategy = __webpack_require__( /*! ./ui.toolbar.strategy.list_base */ 328), Swipeable = __webpack_require__( /*! ../../events/gesture/swipeable */ 255); var ListBottomStrategy = ListStrategy.inherit({ NAME: "listBottom", _renderWidget: function() { this._renderContainerSwipe(); this.callBase(); this._toolbar._$toolbarItemsContainer.prependTo(this._listOverlay.content()) }, _renderContainerSwipe: function() { this._toolbar._createComponent(this._toolbar._$toolbarItemsContainer, Swipeable, { elastic: false, onStart: this._swipeStartHandler.bind(this), onUpdated: this._swipeUpdateHandler.bind(this), onEnd: this._swipeEndHandler.bind(this), itemSizeFunc: this._getListHeight.bind(this), direction: "vertical" }) }, _swipeStartHandler: function(e) { e.jQueryEvent.maxTopOffset = this._menuShown ? 0 : 1; e.jQueryEvent.maxBottomOffset = this._menuShown ? 1 : 0 }, _swipeUpdateHandler: function(e) { var offset = this._menuShown ? e.jQueryEvent.offset : 1 + e.jQueryEvent.offset; this._renderMenuPosition(offset, false) }, _swipeEndHandler: function(e) { var targetOffset = e.jQueryEvent.targetOffset; targetOffset -= this._menuShown - 1; this._toggleMenu(0 === targetOffset, true) } }); module.exports = ListBottomStrategy }, /*!********************************************************!*\ !*** ./js/ui/toolbar/ui.toolbar.strategy.list_base.js ***! \********************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, ToolbarStrategy = __webpack_require__( /*! ./ui.toolbar.strategy */ 324), translator = __webpack_require__( /*! ../../animation/translator */ 69), hideTopOverlayCallback = __webpack_require__( /*! ../../mobile/hide_top_overlay */ 65).hideCallback, fx = __webpack_require__( /*! ../../animation/fx */ 68), Overlay = __webpack_require__( /*! ../overlay */ 109), List = __webpack_require__( /*! ../list/ui.list.base */ 231); var TOOLBAR_LIST_VISIBLE_CLASS = "dx-toolbar-list-visible", SUBMENU_ANIMATION_EASING = "easeOutCubic", SUBMENU_HIDE_DURATION = 200, SUBMENU_SHOW_DURATION = 400; var ListStrategy = ToolbarStrategy.inherit({ render: function() { this._renderListOverlay(); this.callBase(); this._changeListVisible(this._toolbar.option("visible")) }, _renderWidget: function() { if (!this._hasVisibleMenuItems()) { return } this.callBase() }, _menuWidgetClass: function() { return List }, _menuContainer: function() { return this._listOverlay.content() }, _menuButtonOptions: function() { return extend({}, this.callBase(), { activeStateEnabled: false, text: "..." }) }, _widgetOptions: function() { return extend({}, this.callBase(), { width: "100%", indicateLoading: false }) }, _renderListOverlay: function() { var $listOverlay = $("<div>").appendTo(this._toolbar.element()); this._listOverlay = this._toolbar._createComponent($listOverlay, Overlay, this._listOverlayConfig()) }, _listOverlayConfig: function() { return { container: false, deferRendering: false, shading: false, height: "auto", width: "100%", showTitle: false, closeOnOutsideClick: this._listOutsideClickHandler.bind(this), position: null, animation: null, closeOnBackButton: false } }, _listOutsideClickHandler: function(e) { if (!$(e.target).closest(this._listOverlay.content()).length) { this._toggleMenu(false, true) } }, _getListHeight: function() { var listHeight = this._listOverlay.content().find(".dx-list").height(), semiHiddenHeight = this._toolbar._$toolbarItemsContainer.height() - this._toolbar.element().height(); return listHeight + semiHiddenHeight }, _hideTopOverlayHandler: function() { this._toggleMenu(false, true) }, _toggleHideTopOverlayCallback: function() { if (this._closeCallback) { hideTopOverlayCallback.remove(this._closeCallback) } if (this._menuShown) { this._closeCallback = this._hideTopOverlayHandler.bind(this); hideTopOverlayCallback.add(this._closeCallback) } }, _calculatePixelOffset: function(offset) { offset = (offset || 0) - 1; var maxOffset = this._getListHeight(); return offset * maxOffset }, _renderMenuPosition: function(offset, animate) { var pos = this._calculatePixelOffset(offset), element = this._listOverlay.content(); if (animate) { return this._animateMenuToggling(element, pos, this._menuShown) } translator.move(element, { top: pos }); return $.Deferred().resolve().promise() }, _animateMenuToggling: function($element, position, isShowAnimation) { var duration = isShowAnimation ? SUBMENU_SHOW_DURATION : SUBMENU_HIDE_DURATION; return fx.animate($element, { type: "slide", to: { top: position }, easing: SUBMENU_ANIMATION_EASING, duration: duration }) }, _toggleMenu: function(visible, animate) { this.callBase.apply(this, arguments); this._toggleHideTopOverlayCallback(); this._renderMenuPosition(this._menuShown ? 0 : 1, animate).done(function() { this._toolbar.element().toggleClass(TOOLBAR_LIST_VISIBLE_CLASS, visible) }.bind(this)) }, _changeListVisible: function(value) { if (this._listOverlay) { this._listOverlay.option("visible", value); this._toggleMenu(false, false) } }, handleToolbarVisibilityChange: function(value) { this._changeListVisible(value) } }); module.exports = ListStrategy }, /*!*******************************************************!*\ !*** ./js/ui/toolbar/ui.toolbar.strategy.list_top.js ***! \*******************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), ListStrategy = __webpack_require__( /*! ./ui.toolbar.strategy.list_base */ 328), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, translator = __webpack_require__( /*! ../../animation/translator */ 69); var ListTopStrategy = ListStrategy.inherit({ NAME: "listTop", _listOverlayConfig: function() { var config = this.callBase(); return extend({}, config, { onContentReady: this._setItemsContainerZIndex.bind(this) }) }, _setItemsContainerZIndex: function(e) { var overlayZIndex = e.component.content().css("z-index"); this._toolbar._$toolbarItemsContainer.css("z-index", overlayZIndex + 1) }, _renderMenuPosition: function(offset, animate) { var $element = this._toolbar._$toolbarItemsContainer; var pos = this._calculateItemsContainerOffset(offset); if (animate) { this._animateMenuToggling($element, pos, this._menuShown) } else { translator.move($element, { top: pos }) } return this.callBase(offset, animate) }, _calculateItemsContainerOffset: function(offset) { offset = (offset || 0) - 1; var maxOffset = this._getItemsContainerHeight(); return offset * maxOffset }, _getItemsContainerHeight: function() { var semiHiddenHeight = this._toolbar._$toolbarItemsContainer.height() - this._toolbar.element().height(); return semiHiddenHeight }, _listOutsideClickHandler: function(e) { var $target = $(e.target); var isOverlayClick = $target.closest(this._listOverlay.content()).length > 0; var isItemsContainerClick = $target.closest(this._toolbar._$toolbarItemsContainer).length > 0; if (!isOverlayClick && !isItemsContainerClick) { this._toggleMenu(false, true) } } }); module.exports = ListTopStrategy }, , , , , , , /*!*************************************************!*\ !*** ./js/bundles/modules/parts/widgets-web.js ***! \*************************************************/ function(module, exports, __webpack_require__) { var data = __webpack_require__( /*! ./data */ 185); var ui = __webpack_require__( /*! ./widgets-base */ 4); ui.dxAccordion = __webpack_require__( /*! ../../../ui/accordion */ 337); ui.dxContextMenu = __webpack_require__( /*! ../../../ui/context_menu */ 338); ui.dxDataGrid = __webpack_require__( /*! ../../../ui/data_grid */ 345); ui.dxTreeList = __webpack_require__( /*! ../../../ui/tree_list */ 420); ui.dxMenu = __webpack_require__( /*! ../../../ui/menu */ 398); ui.dxPivotGrid = __webpack_require__( /*! ../../../ui/pivot_grid */ 448); ui.dxPivotGridFieldChooser = __webpack_require__( /*! ../../../ui/pivot_grid_field_chooser */ 466); data.PivotGridDataSource = __webpack_require__( /*! ../../../ui/pivot_grid/data_source */ 452); data.XmlaStore = __webpack_require__( /*! ../../../ui/pivot_grid/xmla_store */ 467); ui.dxScheduler = __webpack_require__( /*! ../../../ui/scheduler */ 468); ui.dxTreeView = __webpack_require__( /*! ../../../ui/tree_view */ 380) }, /*!****************************!*\ !*** ./js/ui/accordion.js ***! \****************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), fx = __webpack_require__( /*! ../animation/fx */ 68), clickEvent = __webpack_require__( /*! ../events/click */ 75), devices = __webpack_require__( /*! ../core/devices */ 53), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, isPlainObject = __webpack_require__( /*! ../core/utils/type */ 12).isPlainObject, registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), eventUtils = __webpack_require__( /*! ../events/utils */ 71), CollectionWidget = __webpack_require__( /*! ./collection/ui.collection_widget.edit */ 149), when = __webpack_require__( /*! ../integration/jquery/deferred */ 16).when, BindableTemplate = __webpack_require__( /*! ./widget/bindable_template */ 166), iconUtils = __webpack_require__( /*! ../core/utils/icon */ 115); var ACCORDION_CLASS = "dx-accordion", ACCORDION_WRAPPER_CLASS = "dx-accordion-wrapper", ACCORDION_ITEM_CLASS = "dx-accordion-item", ACCORDION_ITEM_OPENED_CLASS = "dx-accordion-item-opened", ACCORDION_ITEM_CLOSED_CLASS = "dx-accordion-item-closed", ACCORDION_ITEM_TITLE_CLASS = "dx-accordion-item-title", ACCORDION_ITEM_BODY_CLASS = "dx-accordion-item-body", ACCORDION_ITEM_DATA_KEY = "dxAccordionItemData"; var Accordion = CollectionWidget.inherit({ _activeStateUnit: "." + ACCORDION_ITEM_CLASS, _getDefaultOptions: function() { return extend(this.callBase(), { hoverStateEnabled: true, height: void 0, itemTitleTemplate: "title", onItemTitleClick: null, selectedIndex: 0, collapsible: false, multiple: false, animationDuration: 300, deferRendering: true, selectionByClick: true, activeStateEnabled: true, _itemAttributes: { role: "tab" } }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function() { return "desktop" === devices.real().deviceType && !devices.isSimulator() }, options: { focusStateEnabled: true } }]) }, _itemElements: function() { return this._itemContainer().children(this._itemSelector()) }, _init: function() { this.callBase(); this.option("selectionRequired", !this.option("collapsible")); this.option("selectionMode", this.option("multiple") ? "multiple" : "single"); var $element = this.element(); $element.addClass(ACCORDION_CLASS); this._$container = $("<div>").addClass(ACCORDION_WRAPPER_CLASS); $element.append(this._$container) }, _initTemplates: function() { this.callBase(); this._defaultTemplates.title = new BindableTemplate(function($container, data) { if (isPlainObject(data)) { if (data.title) { $container.text(data.title) } $container.append(iconUtils.getImageContainer(data.icon || data.iconSrc)) } else { $container.html(String(data)) } }, ["title", "icon", "iconSrc"], this.option("integrationOptions.watchMethod")) }, _render: function() { this._deferredItems = []; this.callBase(); this._fireContentReadyAction(); this.setAria({ role: "tablist", multiselectable: this.option("multiple") }); this._attachItemTitleClickAction() }, _renderContent: function() { this._renderContentImpl() }, _itemDataKey: function() { return ACCORDION_ITEM_DATA_KEY }, _itemClass: function() { return ACCORDION_ITEM_CLASS }, _itemContainer: function() { return this._$container }, _itemTitles: function() { return this._itemElements().find("." + ACCORDION_ITEM_TITLE_CLASS) }, _itemContents: function() { return this._itemElements().find("." + ACCORDION_ITEM_BODY_CLASS) }, _getItemData: function(target) { return $(target).parent().data(this._itemDataKey()) || this.callBase.apply(this, arguments) }, _executeItemRenderAction: function(itemData) { if (itemData.type) { return } this.callBase.apply(this, arguments) }, _itemSelectHandler: function(e) { if ($(e.target).closest(this._itemContents()).length) { return } this.callBase.apply(this, arguments) }, _renderItemContent: function(args) { var $itemTitle = this.callBase(extend({}, args, { contentClass: ACCORDION_ITEM_TITLE_CLASS, templateProperty: "titleTemplate", defaultTemplateName: this.option("itemTitleTemplate") })); var deferred = $.Deferred(); this._deferredItems.push(deferred); if (!this.option("deferRendering")) { deferred.resolve() } deferred.done(this.callBase.bind(this, extend({}, args, { contentClass: ACCORDION_ITEM_BODY_CLASS, container: $("<div>").appendTo($itemTitle.parent()) }))) }, _attachItemTitleClickAction: function() { var itemSelector = "." + ACCORDION_ITEM_TITLE_CLASS, eventName = eventUtils.addNamespace(clickEvent.name, this.NAME); this._itemContainer().off(eventName, itemSelector).on(eventName, itemSelector, this._itemTitleClickHandler.bind(this)) }, _itemTitleClickHandler: function(e) { this._itemJQueryEventHandler(e, "onItemTitleClick") }, _renderSelection: function(addedSelection, removedSelection) { this._itemElements().addClass(ACCORDION_ITEM_CLOSED_CLASS); this.setAria("hidden", true, this._itemContents()); this._updateItems(addedSelection, removedSelection, true) }, _updateSelection: function(addedSelection, removedSelection) { this._updateItems(addedSelection, removedSelection, false) }, _updateItems: function(addedSelection, removedSelection, skipAnimation) { var $items = this._itemElements(), that = this; $.each(addedSelection, function(_, index) { that._deferredItems[index].resolve(); var $item = $items.eq(index).addClass(ACCORDION_ITEM_OPENED_CLASS).removeClass(ACCORDION_ITEM_CLOSED_CLASS); that.setAria("hidden", false, $item.find("." + ACCORDION_ITEM_BODY_CLASS)) }); $.each(removedSelection, function(_, index) { var $item = $items.eq(index).removeClass(ACCORDION_ITEM_OPENED_CLASS); that.setAria("hidden", true, $item.find("." + ACCORDION_ITEM_BODY_CLASS)) }); if (that.option("templatesRenderAsynchronously")) { this._animationTimer = setTimeout(function() { this._updateItemHeights(skipAnimation) }.bind(this)) } else { this._updateItemHeights(skipAnimation) } }, _updateItemHeights: function(skipAnimation) { var that = this, deferredAnimate = that._deferredAnimate, itemHeight = this._splitFreeSpace(this._calculateFreeSpace()); clearTimeout(this._animationTimer); return when.apply($, $.map(this._itemElements(), function(item) { return that._updateItemHeight($(item), itemHeight, skipAnimation) })).done(function() { if (deferredAnimate) { deferredAnimate.resolveWith(that) } }) }, _updateItemHeight: function($item, itemHeight, skipAnimation) { var $title = $item.children("." + ACCORDION_ITEM_TITLE_CLASS); if (fx.isAnimating($item)) { fx.stop($item) } var startItemHeight = $item.outerHeight(), finalItemHeight = $item.hasClass(ACCORDION_ITEM_OPENED_CLASS) ? itemHeight + $title.outerHeight() || $item.height("auto").outerHeight() : $title.outerHeight(); return this._animateItem($item, startItemHeight, finalItemHeight, skipAnimation, !!itemHeight) }, _animateItem: function($element, startHeight, endHeight, skipAnimation, fixedHeight) { var d; if (skipAnimation || startHeight === endHeight) { $element.css("height", endHeight); d = $.Deferred().resolve() } else { d = fx.animate($element, { type: "custom", from: { height: startHeight }, to: { height: endHeight }, duration: this.option("animationDuration") }) } return d.done(function() { if ($element.hasClass(ACCORDION_ITEM_OPENED_CLASS) && !fixedHeight) { $element.css("height", "") } $element.not("." + ACCORDION_ITEM_OPENED_CLASS).addClass(ACCORDION_ITEM_CLOSED_CLASS) }) }, _splitFreeSpace: function(freeSpace) { if (!freeSpace) { return freeSpace } return freeSpace / this.option("selectedItems").length }, _calculateFreeSpace: function() { var height = this.option("height"); if (void 0 === height || "auto" === height) { return } var $titles = this._itemTitles(), itemsHeight = 0; $.each($titles, function(_, title) { itemsHeight += $(title).outerHeight() }); return this.element().height() - itemsHeight }, _visibilityChanged: function(visible) { if (visible) { this._dimensionChanged() } }, _dimensionChanged: function() { this._updateItemHeights(true) }, _clean: function() { clearTimeout(this._animationTimer); this.callBase() }, _optionChanged: function(args) { switch (args.name) { case "animationDuration": case "onItemTitleClick": break; case "collapsible": this.option("selectionRequired", !this.option("collapsible")); break; case "itemTitleTemplate": case "height": case "deferRendering": this._invalidate(); break; case "multiple": this.option("selectionMode", args.value ? "multiple" : "single"); break; default: this.callBase(args) } }, expandItem: function(index) { this._deferredAnimate = $.Deferred(); this.selectItem(index); return this._deferredAnimate.promise() }, collapseItem: function(index) { this._deferredAnimate = $.Deferred(); this.unselectItem(index); return this._deferredAnimate.promise() }, updateDimensions: function() { return this._updateItemHeights(false) } }); registerComponent("dxAccordion", Accordion); module.exports = Accordion }, /*!*******************************!*\ !*** ./js/ui/context_menu.js ***! \*******************************/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__( /*! ./context_menu/ui.context_menu */ 339) }, /*!***********************************************!*\ !*** ./js/ui/context_menu/ui.context_menu.js ***! \***********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Guid = __webpack_require__( /*! ../../core/guid */ 151), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), typeUtils = __webpack_require__( /*! ../../core/utils/type */ 12), inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, fx = __webpack_require__( /*! ../../animation/fx */ 68), positionUtils = __webpack_require__( /*! ../../animation/position */ 70), devices = __webpack_require__( /*! ../../core/devices */ 53), eventUtils = __webpack_require__( /*! ../../events/utils */ 71), Overlay = __webpack_require__( /*! ../overlay */ 109), MenuBase = __webpack_require__( /*! ./ui.menu_base */ 340); var DX_MENU_CLASS = "dx-menu", DX_MENU_ITEM_CLASS = DX_MENU_CLASS + "-item", DX_MENU_ITEM_EXPANDED_CLASS = DX_MENU_ITEM_CLASS + "-expanded", DX_MENU_PHONE_CLASS = "dx-menu-phone-overlay", DX_MENU_ITEMS_CONTAINER_CLASS = DX_MENU_CLASS + "-items-container", DX_MENU_ITEM_WRAPPER_CLASS = DX_MENU_ITEM_CLASS + "-wrapper", DX_SUBMENU_CLASS = "dx-submenu", DX_CONTEXT_MENU_CLASS = "dx-context-menu", DX_HAS_CONTEXT_MENU_CLASS = "dx-has-context-menu", DX_STATE_DISABLED_CLASS = "dx-state-disabled", FOCUS_UP = "up", FOCUS_DOWN = "down", FOCUS_LEFT = "left", FOCUS_RIGHT = "right", FOCUS_FIRST = "first", FOCUS_LAST = "last", ACTIONS = ["onShowing", "onShown", "onSubmenuCreated", "onHiding", "onHidden", "onPositioning", "onLeftFirstItem", "onLeftLastItem", "onCloseRootSubmenu", "onExpandLastSubmenu"], LOCAL_SUBMENU_DIRECTIONS = [FOCUS_UP, FOCUS_DOWN, FOCUS_FIRST, FOCUS_LAST], DEFAULT_SHOW_EVENT = "dxcontextmenu"; var ContextMenu = MenuBase.inherit(function() { var getShowEvent = function(that) { var result = null, optionValue = that.option("showEvent"); if (commonUtils.isObject(optionValue)) { if (null !== optionValue.name) { result = optionValue.name || DEFAULT_SHOW_EVENT } } else { result = optionValue } return result }, getShowDelay = function(that) { var optionValue = that.option("showEvent"); return commonUtils.isObject(optionValue) && optionValue.delay }; return { _getDefaultOptions: function() { return extend(this.callBase(), { showEvent: DEFAULT_SHOW_EVENT, closeOnOutsideClick: true, position: { at: "top left", my: "top left" }, onShowing: null, onShown: null, onSubmenuCreated: null, onHiding: null, onHidden: null, onPositioning: null, submenuDirection: "auto", visible: false, target: void 0, onLeftFirstItem: null, onLeftLastItem: null, onCloseRootSubmenu: null, onExpandLastSubmenu: null }) }, _initActions: function() { this._actions = {}; $.each(ACTIONS, function(index, action) { this._actions[action] = this._createActionByOption(action) || commonUtils.noop }.bind(this)) }, _setOptionsByReference: function() { this.callBase(); extend(this._optionsByReference, { animation: true, selectedItem: true }) }, _focusInHandler: commonUtils.noop, _itemContainer: function() { return this._overlay ? this._overlay.content() : $() }, _eventBindingTarget: function() { return this._itemContainer() }, itemsContainer: function() { return this._overlay ? this._overlay.content() : void 0 }, _supportedKeys: function() { var selectItem = function() { var $item = this.option("focusedElement"); this.hide(); if (!$item || !this._isSelectionEnabled()) { return } this.selectItem($item[0]) }; return extend(this.callBase(), { space: selectItem, esc: this.hide }) }, _getActiveItem: function() { var $items = this._getAvailableItems(), $focusedItem = $items.filter(".dx-state-focused"), $hoveredItem = $items.filter(".dx-state-hover"), $hoveredItemContainer = $hoveredItem.closest("." + DX_MENU_ITEMS_CONTAINER_CLASS); if ($hoveredItemContainer.find("." + DX_MENU_ITEM_CLASS).index($focusedItem) >= 0) { return $focusedItem } if ($hoveredItem.length) { return $hoveredItem } return this.callBase() }, _moveFocus: function(location) { var $newTarget, $items = this._getItemsByLocation(location), $oldTarget = this._getActiveItem(true), $hoveredItem = this.itemsContainer().find(".dx-state-hover"), $focusedItem = this.option("focusedElement"), $activeItemHighlighted = !!($focusedItem || $hoveredItem.length); switch (location) { case FOCUS_UP: $newTarget = $activeItemHighlighted ? this._prevItem($items) : $oldTarget; if ($oldTarget.is($items.first())) { this._actions.onLeftFirstItem($oldTarget) } break; case FOCUS_DOWN: $newTarget = $activeItemHighlighted ? this._nextItem($items) : $oldTarget; if ($oldTarget.is($items.last())) { this._actions.onLeftLastItem($oldTarget) } break; case FOCUS_RIGHT: $newTarget = this.option("rtlEnabled") ? this._hideSubmenuHandler() : this._expandSubmenuHandler($items, location); break; case FOCUS_LEFT: $newTarget = this.option("rtlEnabled") ? this._expandSubmenuHandler($items, location) : this._hideSubmenuHandler(); break; case FOCUS_FIRST: $newTarget = $items.first(); break; case FOCUS_LAST: $newTarget = $items.last(); break; default: return this.callBase(location) } if (0 !== $newTarget.length) { this.option("focusedElement", $newTarget) } }, _getItemsByLocation: function(location) { var $items, $activeItem = this._getActiveItem(true); if (inArray(location, LOCAL_SUBMENU_DIRECTIONS) >= 0) { $items = $activeItem.closest("." + DX_MENU_ITEMS_CONTAINER_CLASS).children().children() } $items = this._getAvailableItems($items); return $items }, _getAriaTarget: function() { return this.element() }, _refreshActiveDescendant: function() { if (!this._overlay) { return } var id = this.getFocusedItemId(); this.setAria("activedescendant", "", this._overlay.content()); this.setAria("activedescendant", id, this._overlay.content()) }, _hideSubmenuHandler: function() { var $curItem = this._getActiveItem(true), $parentItem = $curItem.parents("." + DX_MENU_ITEM_EXPANDED_CLASS).first(); if ($parentItem.length) { this._hideSubmenusOnSameLevel($parentItem); this._hideSubmenu($curItem.closest("." + DX_SUBMENU_CLASS)); return $parentItem } this._actions.onCloseRootSubmenu($curItem); return $curItem }, _expandSubmenuHandler: function($items, location) { var $curItem = this._getActiveItem(true), node = this._dataAdapter.getNodeByItem(this._getItemData($curItem)), isItemHasSubmenu = this._hasSubmenu(node), $submenu = $curItem.children("." + DX_SUBMENU_CLASS); if (isItemHasSubmenu && !$curItem.hasClass(DX_STATE_DISABLED_CLASS)) { if (!$submenu.length || "hidden" === $submenu.css("visibility")) { this._showSubmenu($curItem) } return this._nextItem(this._getItemsByLocation(location)) } this._actions.onExpandLastSubmenu($curItem); return $curItem }, _clean: function() { if (this._overlay) { this._overlay.element().remove(); this._overlay = null } this._detachShowContextMenuEvents(this._getTarget()); this.callBase() }, _render: function() { this.element().addClass(DX_HAS_CONTEXT_MENU_CLASS); this.callBase(); this.setAria("role", "menu") }, _renderContentImpl: function() { this._detachShowContextMenuEvents(this._getTarget()); this._attachShowContextMenuEvents() }, _renderContextMenuOverlay: function() { if (this._overlay) { return } var $overlayContent, overlayOptions = this._getOverlayOptions(), $overlayElement = $("<div>"); this._overlay = this._createComponent($overlayElement.appendTo(this._$element), Overlay, overlayOptions); $overlayContent = this._overlay.content(); $overlayContent.addClass(DX_CONTEXT_MENU_CLASS); this._addCustomCssClass($overlayContent); this._addPlatformDependentClass($overlayContent); this._attachContextMenuEvent() }, _itemContextMenuHandler: function(e) { this.callBase(e); e.stopPropagation() }, _addPlatformDependentClass: function($element) { if (devices.current().phone) { $element.addClass(DX_MENU_PHONE_CLASS) } }, _detachShowContextMenuEvents: function(target) { var eventName, showEvent = getShowEvent(this); if (!showEvent) { return } eventName = eventUtils.addNamespace(showEvent, this.NAME); if (this._showContextMenuEventHandler) { $(document).off(eventName, target, this._showContextMenuEventHandler) } else { $(target).off(eventName) } }, _attachShowContextMenuEvents: function() { var delay, handler, eventName, contextMenuAction, that = this, target = that._getTarget(), showEvent = getShowEvent(that); if (!showEvent) { return } eventName = eventUtils.addNamespace(showEvent, that.NAME); contextMenuAction = that._createAction(function(e) { delay = getShowDelay(that); if (delay) { setTimeout(function() { that._show(e.jQueryEvent) }, delay) } else { that._show(e.jQueryEvent) } }.bind(that), { validatingTargetName: "target" }); handler = function(e) { contextMenuAction({ jQueryEvent: e, target: $(e.currentTarget) }) }; contextMenuAction = that._createAction(contextMenuAction); if (target.jquery || target.nodeType || commonUtils.isWindow(target)) { that._showContextMenuEventHandler = void 0; $(target).on(eventName, handler) } else { that._showContextMenuEventHandler = handler; $(document).on(eventName, target, that._showContextMenuEventHandler) } }, _hoverEndHandler: function(e) { this.callBase(e); e.stopPropagation() }, _renderDimensions: commonUtils.noop, _renderContainer: function($wrapper, submenuContainer) { var $itemsContainer, $holder = submenuContainer || this._itemContainer(); $wrapper = $("<div>"); $wrapper.appendTo($holder).addClass(DX_SUBMENU_CLASS).css("visibility", submenuContainer ? "hidden" : "visible"); $itemsContainer = this.callBase($wrapper); if (submenuContainer) { return $itemsContainer } if (this.option("width")) { return $itemsContainer.css("min-width", this.option("width")) } if (this.option("height")) { return $itemsContainer.css("min-height", this.option("height")) } return $itemsContainer }, _renderSubmenuItems: function(node, $itemFrame) { this._renderItems(this._getChildNodes(node), $itemFrame); this._actions.onSubmenuCreated({ itemElement: $itemFrame, itemData: node.internalFields.item, submenuElement: $itemFrame.children("." + DX_SUBMENU_CLASS) }) }, _getOverlayOptions: function() { var position = this.option("position"), overlayAnimation = this.option("animation"), overlayOptions = { focusStateEnabled: this.option("focusStateEnabled"), animation: overlayAnimation, closeOnOutsideClick: this._closeOnOutsideClickHandler.bind(this), closeOnTargetScroll: true, deferRendering: false, position: { at: position.at, my: position.my, of: this._getTarget(), collision: "flipfit" }, shading: false, showTitle: false, height: "auto", width: "auto", onShown: this._overlayShownActionHandler.bind(this), onHiding: this._overlayHidingActionHandler.bind(this), onHidden: this._overlayHiddenActionHandler.bind(this) }; return overlayOptions }, _overlayShownActionHandler: function(arg) { this._actions.onShown(arg) }, _overlayHidingActionHandler: function(arg) { this._actions.onHiding(arg); if (!arg.cancel) { this._hideAllShownSubmenus(); this._setOptionSilent("visible", false) } }, _overlayHiddenActionHandler: function(arg) { this._actions.onHidden(arg) }, _closeOnOutsideClickHandler: function(e) { var $clickedItem, $activeItemContainer, $itemContainers, $rootItem, isRootItemClicked, isInnerOverlayClicked, closeOnOutsideClick = this.option("closeOnOutsideClick"); if (commonUtils.isFunction(closeOnOutsideClick)) { return closeOnOutsideClick(e) } if (!closeOnOutsideClick) { return false } if (e.target === document) { return true } $activeItemContainer = this._getActiveItemsContainer(e.target); $itemContainers = this._getItemsContainers(); $clickedItem = this._searchActiveItem(e.target); $rootItem = this.element().parents("." + DX_MENU_ITEM_CLASS); isRootItemClicked = $clickedItem[0] === $rootItem[0] && $clickedItem.length && $rootItem.length; isInnerOverlayClicked = this._isIncludeOverlay($activeItemContainer, $itemContainers) && $clickedItem.length; if (isInnerOverlayClicked || isRootItemClicked) { if ("onClick" === this._getShowSubmenuMode()) { this._hideAllShownChildSubmenus($clickedItem) } return false } return true }, _getActiveItemsContainer: function(target) { return $(target).closest("." + DX_MENU_ITEMS_CONTAINER_CLASS) }, _getItemsContainers: function() { return this._overlay._$content.find("." + DX_MENU_ITEMS_CONTAINER_CLASS) }, _searchActiveItem: function(target) { return $(target).closest("." + DX_MENU_ITEM_CLASS).eq(0) }, _isIncludeOverlay: function($activeOverlay, $allOverlays) { var isSame = false; $.each($allOverlays, function(index, $overlay) { if ($activeOverlay.is($overlay) && !isSame) { isSame = true } }); return isSame }, _hideAllShownChildSubmenus: function($clickedItem) { var $context, that = this, $submenuElements = $clickedItem.find("." + DX_SUBMENU_CLASS), shownSubmenus = extend([], this._shownSubmenus); if ($submenuElements.length > 0) { $.each(shownSubmenus, function(index, $submenu) { $context = that._searchActiveItem($submenu.context).parent(); if ($context.parent().is($clickedItem.parent().parent()) && !$context.is($clickedItem.parent())) { that._hideSubmenu($submenu) } }) } }, _showSubmenu: function($item) { var node = this._dataAdapter.getNodeByItem(this._getItemData($item)); this._hideSubmenusOnSameLevel($item); if (!this._hasSubmenu(node)) { return } var $submenu = $item.children("." + DX_SUBMENU_CLASS), isSubmenuRendered = $submenu.length; this.callBase($item); if (!isSubmenuRendered) { this._renderSubmenuItems(node, $item) } if (!this._isSubmenuVisible($submenu)) { this._drawSubmenu($item) } }, _hideSubmenusOnSameLevel: function($item) { var $expandedItems = $item.parent("." + DX_MENU_ITEM_WRAPPER_CLASS).siblings().find("." + DX_MENU_ITEM_EXPANDED_CLASS); if ($expandedItems.length) { $expandedItems.removeClass(DX_MENU_ITEM_EXPANDED_CLASS); this._hideSubmenu($expandedItems.find("." + DX_SUBMENU_CLASS)) } }, _hideSubmenuGroup: function($submenu) { if (this._isSubmenuVisible($submenu)) { this._hideSubmenuCore($submenu) } }, _isSubmenuVisible: function($submenu) { return "visible" === $submenu.css("visibility") }, _drawSubmenu: function($itemElement) { var animation = this.option("animation") ? this.option("animation").show : {}, $submenu = $itemElement.children("." + DX_SUBMENU_CLASS), submenuPosition = this._getSubmenuPosition($itemElement); if (this._overlay && this._overlay.option("visible")) { if (!commonUtils.isDefined(this._shownSubmenus)) { this._shownSubmenus = [] } if (inArray($submenu, this._shownSubmenus)) { this._shownSubmenus.push($submenu) } if (animation) { fx.stop($submenu) } positionUtils.setup($submenu, submenuPosition); if (animation) { if (typeUtils.isPlainObject(animation.to)) { animation.to.position = submenuPosition } this._animate($submenu, animation) } $submenu.css("visibility", "visible") } }, _animate: function($container, options) { fx.animate($container, options) }, _getSubmenuPosition: function($rootItem) { var submenuDirection = this.option("submenuDirection").toLowerCase(), $rootItemWrapper = $rootItem.parent("." + DX_MENU_ITEM_WRAPPER_CLASS), position = { collision: "flip", of: $rootItemWrapper, offset: { h: 0, v: -1 } }; switch (submenuDirection) { case "left": position.at = "left top"; position.my = "right top"; break; case "right": position.at = "right top"; position.my = "left top"; break; default: if (this.option("rtlEnabled")) { position.at = "left top"; position.my = "right top" } else { position.at = "right top"; position.my = "left top" } } return position }, _updateSubmenuVisibilityOnClick: function(actionArgs) { if (!actionArgs.args.length) { return } actionArgs.args[0].jQueryEvent.stopPropagation(); var $itemElement = actionArgs.args[0].itemElement, itemData = actionArgs.args[0].itemData, node = this._dataAdapter.getNodeByItem(itemData); if (!node) { return } var $submenu = $itemElement.find("." + DX_SUBMENU_CLASS), shouldRenderSubmenu = this._hasSubmenu(node) && !$submenu.length; if (shouldRenderSubmenu) { this._renderSubmenuItems(node, $itemElement); $submenu = $itemElement.find("." + DX_SUBMENU_CLASS) } if ($itemElement.context === $submenu.context && "visible" === $submenu.css("visibility")) { return } var notCloseMenuOnItemClick = itemData && false === itemData.closeMenuOnClick; if (!itemData || itemData.disabled || notCloseMenuOnItemClick) { return } this._updateSelectedItemOnClick(actionArgs); if (0 === $submenu.length) { var $prevSubmenu = $($itemElement.parents("." + DX_SUBMENU_CLASS)[0]); this._hideSubmenu($prevSubmenu); if (!actionArgs.canceled && this._overlay && this._overlay.option("visible")) { this.option("visible", false) } } else { if (this._shownSubmenus && this._shownSubmenus.length > 0) { if (this._shownSubmenus[0].is($submenu) || 1 === this._shownSubmenus[0].has($submenu).length) { this._hideSubmenu($submenu) } else { this._hideAllShownSubmenus() } } this._showSubmenu($itemElement) } }, _hideSubmenu: function($curSubmenu) { var that = this, shownSubmenus = extend([], that._shownSubmenus); $.each(shownSubmenus, function(index, $submenu) { if ($curSubmenu.is($submenu) || $curSubmenu.has($submenu).length) { $submenu.parent().removeClass(DX_MENU_ITEM_EXPANDED_CLASS); that._hideSubmenuCore($submenu) } }) }, _hideSubmenuCore: function($submenu) { var index = inArray($submenu, this._shownSubmenus), animation = this.option("animation") ? this.option("animation").hide : null; if (index >= 0) { this._shownSubmenus.splice(index, 1) } this._stopAnimate($submenu); animation && this._animate($submenu, animation); $submenu.css("visibility", "hidden") }, _stopAnimate: function($container) { fx.stop($container, true) }, _hideAllShownSubmenus: function() { var that = this, shownSubmenus = extend([], that._shownSubmenus), $expandedItems = this._overlay.content().find("." + DX_MENU_ITEM_EXPANDED_CLASS); $expandedItems.removeClass(DX_MENU_ITEM_EXPANDED_CLASS); $.each(shownSubmenus, function(_, $submenu) { that._hideSubmenuCore($submenu) }) }, _visibilityChanged: function(visible) { if (visible) { this._renderContentImpl() } }, _optionChanged: function(args) { if (this._cancelOptionChange === args.name) { return } if (inArray(args.name, ACTIONS) > -1) { this._initActions(); return } switch (args.name) { case "visible": this._toggleVisibility(args.value); break; case "showEvent": case "position": case "submenuDirection": this._invalidate(); break; case "target": args.previousValue && this._detachShowContextMenuEvents(args.previousValue); this.option("position").of = null; this._invalidate(); break; case "closeOnOutsideClick": break; default: this.callBase(args) } }, _toggleVisibility: function(showing) { showing ? this._show() : this._hide() }, _show: function(jQEvent) { var args = { jQEvent: jQEvent }, promise = $.Deferred().reject().promise(); this._actions.onShowing(args); if (args.cancel) { return promise } var position = this._positionContextMenu(jQEvent); if (position) { if (!this._overlay) { this._renderContextMenuOverlay(); this._overlay.content().addClass(this._widgetClass()); this._renderFocusState(); this._attachHoverEvents(); this._attachClickEvent(); this._renderItems(this._dataAdapter.getRootNodes()) } this._setOptionSilent("visible", true); this._overlay.option("position", position); promise = this._overlay.show(); var id = "dx-" + new Guid; this._overlay.content().attr({ id: id, role: "menu" }); this.setAria("owns", id) } return promise }, _getTarget: function() { return this.option("target") || this.option("position").of || $(document) }, _getContextMenuPosition: function() { return extend({}, this.option("position"), { of: this._getTarget() }) }, _positionContextMenu: function(jQEvent) { var actionArgs, position = this._getContextMenuPosition(), isInitialPosition = this._isInitialOptionValue("position"), positioningAction = this._createActionByOption("onPositioning", actionArgs); if (jQEvent && jQEvent.preventDefault && isInitialPosition) { position.of = jQEvent } actionArgs = { position: position, jQueryEvent: jQEvent }; positioningAction(actionArgs); if (actionArgs.cancel) { position = null } else { if (actionArgs.jQueryEvent) { actionArgs.jQueryEvent.cancel = true; jQEvent.preventDefault() } } return position }, _hide: function() { var promise; if (this._overlay) { this._overlay.content().removeAttr("id"); promise = this._overlay.hide(); this._setOptionSilent("visible", false) } this.setAria("owns", void 0); return promise || $.Deferred().reject().promise() }, toggle: function(showing) { var visible = this.option("visible"); showing = void 0 === showing ? !visible : showing; return this._toggleVisibility(showing) }, show: function() { return this.toggle(true) }, hide: function() { return this.toggle(false) } } }()); registerComponent("dxContextMenu", ContextMenu); module.exports = ContextMenu }, /*!********************************************!*\ !*** ./js/ui/context_menu/ui.menu_base.js ***! \********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), typeUtils = __webpack_require__( /*! ../../core/utils/type */ 12), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inkRipple = __webpack_require__( /*! ../widget/utils.ink_ripple */ 202), HierarchicalCollectionWidget = __webpack_require__( /*! ../hierarchical_collection/ui.hierarchical_collection_widget */ 341), MenuBaseEditStrategy = __webpack_require__( /*! ./ui.menu_base.edit.strategy */ 344), devices = __webpack_require__( /*! ../../core/devices */ 53), themes = __webpack_require__( /*! ../themes */ 143); var DX_MENU_CLASS = "dx-menu", DX_MENU_NO_ICONS_CLASS = DX_MENU_CLASS + "-no-icons", DX_MENU_BASE_CLASS = "dx-menu-base", ITEM_CLASS = DX_MENU_CLASS + "-item", DX_MENU_SELECTED_ITEM_CLASS = ITEM_CLASS + "-selected", DX_MENU_ITEM_WRAPPER_CLASS = ITEM_CLASS + "-wrapper", DX_MENU_ITEMS_CONTAINER_CLASS = DX_MENU_CLASS + "-items-container", DX_MENU_ITEM_EXPANDED_CLASS = ITEM_CLASS + "-expanded", DX_MENU_SEPARATOR_CLASS = DX_MENU_CLASS + "-separator", DX_MENU_ITEM_LAST_GROUP_ITEM = DX_MENU_CLASS + "-last-group-item", DX_ITEM_HAS_TEXT = ITEM_CLASS + "-has-text", DX_ITEM_HAS_ICON = ITEM_CLASS + "-has-icon", DX_ITEM_HAS_SUBMENU = ITEM_CLASS + "-has-submenu", DX_MENU_ITEM_POPOUT_CLASS = ITEM_CLASS + "-popout", DX_MENU_ITEM_POPOUT_CONTAINER_CLASS = DX_MENU_ITEM_POPOUT_CLASS + "-container", DX_MENU_ITEM_CAPTION_CLASS = ITEM_CLASS + "-text", SINGLE_SELECTION_MODE = "single", DEFAULT_DELAY = { show: 50, hide: 300 }; var MenuBase = HierarchicalCollectionWidget.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { items: [], cssClass: "", activeStateEnabled: true, showSubmenuMode: { name: "onHover", delay: { show: 50, hide: 300 } }, animation: { show: { type: "fade", from: 0, to: 1, duration: 100 }, hide: { type: "fade", from: 1, to: 0, duration: 100 } }, selectByClick: false, focusOnSelectedItem: false, keyExpr: null, _itemAttributes: { role: "menuitem" }, useInkRipple: false }) }, _setDeprecatedOptions: function() { this.callBase(); extend(this._deprecatedOptions, { selectionByClick: { since: "16.1", alias: "selectByClick" } }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function() { return /android5/.test(themes.current()) }, options: { useInkRipple: true } }]) }, _activeStateUnit: "." + ITEM_CLASS, _itemDataKey: function() { return "dxMenuItemDataKey" }, _itemClass: function() { return ITEM_CLASS }, _setAriaSelected: commonUtils.noop, _selectedItemClass: function() { return DX_MENU_SELECTED_ITEM_CLASS }, _widgetClass: function() { return DX_MENU_BASE_CLASS }, _focusTarget: function() { return this._itemContainer() }, _supportedKeys: function() { var selectItem = function() { var $item = this.option("focusedElement"); if (!$item || !this._isSelectionEnabled()) { return } this.selectItem($item[0]) }; return extend(this.callBase(), { space: selectItem, pageUp: commonUtils.noop, pageDown: commonUtils.noop }) }, _isSelectionEnabled: function() { return this.option("selectionMode") === SINGLE_SELECTION_MODE }, _init: function() { this.callBase(); this._renderSelectedItem(); this._initActions() }, _getTextContainer: function(itemData) { var itemText = itemData.text, $itemContainer = $("<span>").addClass(DX_MENU_ITEM_CAPTION_CLASS), itemContent = typeUtils.isPlainObject(itemData) ? itemText : String(itemData); return itemText && $itemContainer.html(itemContent) }, _getPopoutContainer: function(itemData) { var $popOutContainer, items = itemData.items; if (items && items.length) { var $popOutImage = $("<div>").addClass(DX_MENU_ITEM_POPOUT_CLASS); $popOutContainer = $("<span>").addClass(DX_MENU_ITEM_POPOUT_CONTAINER_CLASS).append($popOutImage) } return $popOutContainer }, _getDataAdapterOptions: function() { return { rootValue: 0, multipleSelection: false, recursiveSelection: false, recursiveExpansion: false, searchValue: "" } }, _selectByItem: function(selectedItem) { if (!selectedItem) { return } var nodeToSelect = this._dataAdapter.getNodeByItem(selectedItem); this._dataAdapter.toggleSelection(nodeToSelect.internalFields.key, true) }, _renderSelectedItem: function() { var selectedKeys = this._dataAdapter.getSelectedNodesKeys(), selectedKey = selectedKeys.length && selectedKeys[0], selectedItem = this.option("selectedItem"); if (!selectedKey) { this._selectByItem(selectedItem); return } var node = this._dataAdapter.getNodeByKey(selectedKey); if (false === node.selectable) { return } if (!selectedItem) { this.option("selectedItem", node.internalFields.item); return } if (selectedItem !== node.internalFields.item) { this._dataAdapter.toggleSelection(selectedKey, false); this._selectByItem(selectedItem) } }, _initActions: commonUtils.noop, _render: function() { this.callBase(); this._addCustomCssClass(this.element()); this.option("useInkRipple") && this._renderInkRipple() }, _renderInkRipple: function() { this._inkRipple = inkRipple.render() }, _toggleActiveState: function($element, value, e) { this.callBase.apply(this, arguments); if (!this._inkRipple) { return } var config = { element: $element, jQueryEvent: e }; if (value) { this._inkRipple.showWave(config) } else { this._inkRipple.hideWave(config) } }, _getShowSubmenuMode: function() { var defaultValue = "onClick", optionValue = this.option("showSubmenuMode"); optionValue = commonUtils.isObject(optionValue) ? optionValue.name : optionValue; return this._isDesktopDevice() ? optionValue : defaultValue }, _initSelectedItems: commonUtils.noop, _isDesktopDevice: function() { return "desktop" === devices.real().deviceType }, _initEditStrategy: function() { var Strategy = MenuBaseEditStrategy; this._editStrategy = new Strategy(this) }, _addCustomCssClass: function($element) { $element.addClass(this.option("cssClass")) }, _itemWrapperSelector: function() { return "." + DX_MENU_ITEM_WRAPPER_CLASS }, _hoverStartHandler: function(e) { var that = this, $itemElement = that._getItemElementByEventArgs(e); if (!$itemElement || that._isItemDisabled($itemElement)) { return } e.stopPropagation(); if ("onHover" === that._getShowSubmenuMode()) { clearTimeout(this._showSubmenusTimeout); this._showSubmenusTimeout = setTimeout(that._showSubmenu.bind(that, $itemElement), that._getSubmenuDelay("show")) } }, _getAvailableItems: function($itemElements) { return this.callBase($itemElements).filter(function() { return "hidden" !== $(this).css("visibility") }) }, _isItemDisabled: function($item) { return this._disabledGetter($item.data(this._itemDataKey())) }, _showSubmenu: function($itemElement) { this._addExpandedClass($itemElement) }, _addExpandedClass: function($itemElement) { $itemElement.addClass(DX_MENU_ITEM_EXPANDED_CLASS) }, _getSubmenuDelay: function(action) { var delay = this.option("showSubmenuMode").delay; if (!commonUtils.isDefined(delay)) { return DEFAULT_DELAY[action] } return commonUtils.isObject(delay) ? delay[action] : delay }, _getItemElementByEventArgs: function(eventArgs) { var $target = $(eventArgs.target); if ($target.hasClass(this._itemClass()) || $target.get(0) === eventArgs.currentTarget) { return $target } while (!$target.hasClass(this._itemClass())) { $target = $target.parent(); if ($target.hasClass("dx-submenu")) { return null } } return $target }, _hoverEndHandler: function() { clearTimeout(this._showSubmenusTimeout) }, _hasSubmenu: function(node) { return node.internalFields.childrenKeys.length }, _renderContentImpl: function() { this._renderItems(this._dataAdapter.getRootNodes()) }, _renderItems: function(nodes, submenuContainer) { var $nodeContainer, that = this; if (nodes.length) { this.hasIcons = false; $nodeContainer = this._renderContainer(this.element(), submenuContainer); $.each(nodes, function(index, node) { that._renderItem(index, node, $nodeContainer) }); if (!this.hasIcons) { $nodeContainer.addClass(DX_MENU_NO_ICONS_CLASS) } } }, _renderContainer: function($wrapper) { return $("<ul>").appendTo($wrapper).addClass(DX_MENU_ITEMS_CONTAINER_CLASS) }, _createDOMElement: function($nodeContainer) { var $node = $("<li>").appendTo($nodeContainer).addClass(DX_MENU_ITEM_WRAPPER_CLASS); return $node }, _renderItem: function(index, node, $nodeContainer) { var $itemFrame, items = this.option("items"); this._renderSeparator(node, index, $nodeContainer); if (false === node.internalFields.item.visible) { return } var $node = this._createDOMElement($nodeContainer); if (items[index + 1] && items[index + 1].beginGroup) { $node.addClass(DX_MENU_ITEM_LAST_GROUP_ITEM) } $itemFrame = this.callBase(index, node.internalFields.item, $node); if (node.internalFields.item === this.option("selectedItem")) { $itemFrame.addClass(DX_MENU_SELECTED_ITEM_CLASS) } this._addContentClasses(node, $itemFrame); $itemFrame.attr("tabindex", -1); if (this._hasSubmenu(node)) { this.setAria("haspopup", "true", $itemFrame) } }, _addContentClasses: function(node, $itemFrame) { if (this._displayGetter(node)) { $itemFrame.addClass(DX_ITEM_HAS_TEXT) } if (node.icon || node.iconSrc) { $itemFrame.addClass(DX_ITEM_HAS_ICON); this.hasIcons = true } if (this._hasSubmenu(node)) { $itemFrame.addClass(DX_ITEM_HAS_SUBMENU) } }, _postprocessRenderItem: function(args) { var node, $itemElement = $(args.itemElement), selectedIndex = this._dataAdapter.getSelectedNodesKeys(); if (!selectedIndex.length || !this._selectedGetter(args.itemData) || !this._isItemSelectable(args.itemData)) { this._setAriaSelected($itemElement, "false"); return } node = this._dataAdapter.getNodeByItem(args.itemData); if (node.internalFields.key === selectedIndex[0]) { $itemElement.addClass(this._selectedItemClass()); this._setAriaSelected($itemElement, "true") } else { this._setAriaSelected($itemElement, "false") } }, _isItemSelectable: function(item) { return false !== item.selectable }, _renderSeparator: function(node, index, $itemsContainer) { if (node.beginGroup && index > 0) { this._needSeparate = true } if (false !== node.visible && this._needSeparate) { if (index > 0) { $("<li>").appendTo($itemsContainer).addClass(DX_MENU_SEPARATOR_CLASS) } this._needSeparate = false } }, _itemClickHandler: function(e) { var itemClickActionHandler = this._createAction(this._updateSubmenuVisibilityOnClick.bind(this)); this._itemJQueryEventHandler(e, "onItemClick", {}, { afterExecute: itemClickActionHandler.bind(this) }) }, _updateSubmenuVisibilityOnClick: function(actionArgs) { this._updateSelectedItemOnClick(actionArgs); if ("onClick" === this._getShowSubmenuMode()) { this._addExpandedClass(actionArgs.args[0].itemElement) } }, _updateSelectedItemOnClick: function(actionArgs) { var selectedItemKey, args = actionArgs.args ? actionArgs.args[0] : actionArgs; if (!this._isItemSelectionAllowed(args.itemData)) { return } selectedItemKey = this._dataAdapter.getSelectedNodesKeys(); var selectedNode = selectedItemKey.length && this._dataAdapter.getNodeByKey(selectedItemKey[0]); if (selectedNode) { this._toggleItemSelection(selectedNode, false) } if (!selectedNode || selectedNode.internalFields.item !== args.itemData) { this.selectItem(args.itemData) } else { this._fireSelectionChangeEvent(null, this.option("selectedItem")); this._setOptionSilent("selectedItem", null) } }, _isItemSelectionAllowed: function(item) { var isSelectionByClickEnabled = this._isSelectionEnabled() && this.option("selectByClick"); return !this._isContainerEmpty() && isSelectionByClickEnabled && this._isItemSelectable(item) && !this._itemsGetter(item) }, _isContainerEmpty: function() { return this._itemContainer().is(":empty") }, _syncSelectionOptions: commonUtils.noop, _optionChanged: function(args) { if (this._cancelOptionChange === args.name) { return } switch (args.name) { case "showSubmenuMode": break; case "selectedItem": var itemData = args.value, node = this._dataAdapter.getNodeByItem(itemData), selectedKey = this._dataAdapter.getSelectedNodesKeys()[0]; if (node && node.internalFields.key !== selectedKey) { if (false === node.selectable) { break } if (selectedKey) { this._toggleItemSelection(this._dataAdapter.getNodeByKey(selectedKey), false) } this._toggleItemSelection(node, true); this._updateSelectedItems() } break; case "cssClass": case "position": case "selectByClick": case "animation": case "useInkRipple": this._invalidate(); break; default: this.callBase(args) } }, _toggleItemSelection: function(node, value) { var itemElement = this._getElementByItem(node.internalFields.item); itemElement && $(itemElement).toggleClass(DX_MENU_SELECTED_ITEM_CLASS); this._dataAdapter.toggleSelection(node.internalFields.key, value) }, _getElementByItem: function(itemData) { var result, that = this; $.each(this._itemElements(), function(_, itemElement) { if ($(itemElement).data(that._itemDataKey()) !== itemData) { return true } result = itemElement; return false }); return result }, _updateSelectedItems: function(oldSelection, newSelection) { if (oldSelection || newSelection) { this._updateSelection(newSelection, oldSelection); this._fireSelectionChangeEvent(newSelection, oldSelection) } }, _fireSelectionChangeEvent: function(addedSelection, removedSelection) { this._createActionByOption("onSelectionChanged", { excludeValidators: ["disabled", "readOnly"] })({ addedItems: [addedSelection], removedItems: [removedSelection] }) }, selectItem: function(itemElement) { var itemData = itemElement.nodeType ? this._getItemData(itemElement) : itemElement, node = this._dataAdapter.getNodeByItem(itemData), selectedKey = this._dataAdapter.getSelectedNodesKeys()[0], selectedItem = this.option("selectedItem"); if (node.internalFields.key !== selectedKey) { if (selectedKey) { this._toggleItemSelection(this._dataAdapter.getNodeByKey(selectedKey), false) } this._toggleItemSelection(node, true); this._updateSelectedItems(selectedItem, itemData); this._setOptionSilent("selectedItem", itemData) } }, unselectItem: function(itemElement) { var itemData = itemElement.nodeType ? this._getItemData(itemElement) : itemElement, node = this._dataAdapter.getNodeByItem(itemData), selectedItem = this.option("selectedItem"); if (node.internalFields.selected) { this._toggleItemSelection(node, false); this._updateSelectedItems(selectedItem, null); this._setOptionSilent("selectedItem", null) } } }); module.exports = MenuBase }, /*!****************************************************************************!*\ !*** ./js/ui/hierarchical_collection/ui.hierarchical_collection_widget.js ***! \****************************************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), dataCoreUtils = __webpack_require__( /*! ../../core/utils/data */ 50), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, devices = __webpack_require__( /*! ../../core/devices */ 53), iconUtils = __webpack_require__( /*! ../../core/utils/icon */ 115), HierarchicalDataAdapter = __webpack_require__( /*! ./ui.data_adapter */ 342), CollectionWidget = __webpack_require__( /*! ../collection/ui.collection_widget.edit */ 149), BindableTemplate = __webpack_require__( /*! ../widget/bindable_template */ 166), isFunction = commonUtils.isFunction, noop = commonUtils.noop; var DISABLED_STATE_CLASS = "dx-state-disabled"; var HierarchicalCollectionWidget = CollectionWidget.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { keyExpr: "id", displayExpr: "text", selectedExpr: "selected", disabledExpr: "disabled", itemsExpr: "items", hoverStateEnabled: true, parentIdExpr: "parentId", expandedExpr: "expanded" }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function() { return "desktop" === devices.real().deviceType && !devices.isSimulator() }, options: { focusStateEnabled: true } }]) }, _init: function() { this.callBase(); this._initAccessors(); this._initDataAdapter(); this._initDynamicTemplates() }, _initDataSource: function() { this.callBase(); this._dataSource && this._dataSource.paginate(false) }, _initDataAdapter: function() { var accessors = this._createDataAdapterAccessors(); this._dataAdapter = new HierarchicalDataAdapter(extend({ dataAccessors: { getters: accessors.getters, setters: accessors.setters }, items: this.option("items") }, this._getDataAdapterOptions())) }, _getDataAdapterOptions: noop, _initDynamicTemplates: function() { this._defaultTemplates.item = new BindableTemplate(function($container, itemData) { $container.html(itemData.html).append(this._getIconContainer(itemData)).append(this._getTextContainer(itemData)).append(this._getPopoutContainer(itemData)) }.bind(this), ["text", "html", "items", "icon", "iconSrc"], this.option("integrationOptions.watchMethod"), { text: this._displayGetter, items: this._itemsGetter }) }, _getIconContainer: function(itemData) { var icon = itemData.icon || itemData.iconSrc; return icon ? iconUtils.getImageContainer(icon) : void 0 }, _getTextContainer: function(itemData) { return $("<span>").text(itemData.text) }, _getPopoutContainer: noop, _initAccessors: function() { var that = this; $.each(this._getAccessors(), function(_, accessor) { that._compileAccessor(accessor) }) }, _getAccessors: function() { return ["key", "display", "selected", "items", "disabled", "parentId", "expanded"] }, _getChildNodes: function(node) { var that = this, arr = []; $.each(node.internalFields.childrenKeys, function(_, key) { var childNode = that._dataAdapter.getNodeByKey(key); arr.push(childNode) }); return arr }, _hasChildren: function(node) { return node && node.internalFields.childrenKeys.length }, _compileAccessor: function(optionName) { var getter = "_" + optionName + "Getter", setter = "_" + optionName + "Setter", optionExpr = this.option(optionName + "Expr"); if (!optionExpr) { this[getter] = noop; this[setter] = noop; return } else { if (isFunction(optionExpr)) { this[setter] = function(obj, value) { obj[optionExpr()] = value }; this[getter] = function(obj) { return obj[optionExpr()] }; return } } this[getter] = dataCoreUtils.compileGetter(optionExpr); this[setter] = dataCoreUtils.compileSetter(optionExpr) }, _createDataAdapterAccessors: function() { var that = this, accessors = { getters: {}, setters: {} }; $.each(this._getAccessors(), function(_, accessor) { var getterName = "_" + accessor + "Getter", setterName = "_" + accessor + "Setter", newAccessor = "parentId" === accessor ? "parentKey" : accessor; accessors.getters[newAccessor] = that[getterName]; accessors.setters[newAccessor] = that[setterName] }); return accessors }, _render: function() { this.callBase(); this._focusTarget().addClass(this._widgetClass()) }, _widgetClass: noop, _renderItemFrame: function(index, itemData) { var $itemFrame = this.callBase.apply(this, arguments); $itemFrame.toggleClass(DISABLED_STATE_CLASS, !!this._disabledGetter(itemData)); return $itemFrame }, _optionChanged: function(args) { switch (args.name) { case "displayExpr": case "keyExpr": this._initAccessors(); this._initDynamicTemplates(); this.repaint(); break; case "itemsExpr": case "selectedExpr": case "disabledExpr": case "expandedExpr": case "parentIdExpr": this._initAccessors(); this._initDataAdapter(); this.repaint(); break; case "items": this._initDataAdapter(); this.callBase(args); break; default: this.callBase(args) } } }); module.exports = HierarchicalCollectionWidget }, /*!**********************************************************!*\ !*** ./js/ui/hierarchical_collection/ui.data_adapter.js ***! \**********************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, errors = __webpack_require__( /*! ../../ui/widget/ui.errors */ 22), inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, query = __webpack_require__( /*! ../../data/query */ 159), HierarchicalDataConverter = __webpack_require__( /*! ./ui.data_converter */ 343); var EXPANDED = "expanded", SELECTED = "selected", DISABLED = "disabled"; var DataAdapter = Class.inherit({ ctor: function(options) { this.options = {}; extend(this.options, this._defaultOptions(), options); this.options.dataConverter.setDataAccessors(this.options.dataAccessors); this._selectedNodesKeys = []; this._expandedNodesKeys = []; this._dataStructure = []; this._createInternalDataStructure(); this.getTreeNodes() }, setOption: function(name, value) { this.options[name] = value; if ("recursiveSelection" === name) { this._updateSelection() } }, _defaultOptions: function() { return { dataAccessors: void 0, items: [], multipleSelection: true, recursiveSelection: false, recursiveExpansion: false, rootValue: 0, searchValue: "", dataType: "tree", dataConverter: new HierarchicalDataConverter, onNodeChanged: commonUtils.noop } }, _createInternalDataStructure: function() { this._initialDataStructure = this.options.dataConverter.createPlainStructure(this.options.items, this.options.rootValue, this.options.dataType); this._dataStructure = this.options.searchValue.length ? this.search(this.options.searchValue) : this._initialDataStructure; this.options.dataConverter._dataStructure = this._dataStructure; this._updateSelection(); this._updateExpansion() }, _updateSelection: function() { if (this.options.recursiveSelection) { this._setChildrenSelection(); this._setParentSelection() } this._selectedNodesKeys = this._updateNodesKeysArray(SELECTED) }, _updateExpansion: function(key) { if (this.options.recursiveExpansion) { key ? this._updateOneBranch(key) : this._setParentExpansion() } this._expandedNodesKeys = this._updateNodesKeysArray(EXPANDED) }, _updateNodesKeysArray: function(property) { var that = this, array = []; $.each(this._dataStructure, function(_, node) { if (!that._isNodeVisible(node)) { return } if (!!node.internalFields[property]) { if (property === EXPANDED || that.options.multipleSelection) { array.push(node.internalFields.key) } else { array.length && that.toggleSelection(array[0], false, true); array = [node.internalFields.key] } } }); return array }, _isNodeVisible: function(node) { return false !== node.internalFields.item.visible }, _getByKey: function(data, key) { return data === this._dataStructure ? this.options.dataConverter._getByKey(key) : this.options.dataConverter.getByKey(data, key) }, _setChildrenSelection: function() { var that = this; $.each(this._dataStructure, function(_, node) { if (!node.internalFields.childrenKeys.length) { return } var isSelected = node.internalFields.selected; true === isSelected && that._toggleChildrenSelection(node, isSelected) }) }, _setParentSelection: function() { var length = this._dataStructure.length; for (var i = length - 1; i >= 0; i--) { var node = this._dataStructure[i], parent = this.options.dataConverter.getParentNode(node); if (parent && node.internalFields.parentKey !== this.options.rootValue) { var newParentState = this._calculateSelectedState(parent); this._setFieldState(parent, SELECTED, newParentState) } } }, _setParentExpansion: function() { var that = this; $.each(this._dataStructure, function(_, node) { if (!node.internalFields.expanded) { return } that._updateOneBranch(node.internalFields.key) }) }, _updateOneBranch: function(key) { var that = this, node = this.getNodeByKey(key); that._iterateParents(node, function(parent) { that._setFieldState(parent, EXPANDED, true) }) }, _iterateChildren: function(node, recursive, callback) { var that = this; $.each(node.internalFields.childrenKeys, function(_, key) { var child = that.getNodeByKey(key); commonUtils.isFunction(callback) && callback(child); if (child.internalFields.childrenKeys.length && recursive) { that._iterateChildren(child, recursive, callback) } }) }, _iterateParents: function(node, callback) { if (node.internalFields.parentKey === this.options.rootValue) { return } var parent = this.options.dataConverter.getParentNode(node); if (parent) { commonUtils.isFunction(callback) && callback(parent); if (parent.internalFields.parentKey !== this.options.rootValue) { this._iterateParents(parent, callback) } } }, _calculateSelectedState: function(node) { var itemsCount = node.internalFields.childrenKeys.length, selectedItemsCount = 0, invisibleItemsCount = 0, result = false; for (var i = 0; i <= itemsCount - 1; i++) { var childNode = this.getNodeByKey(node.internalFields.childrenKeys[i]), isChildInvisible = false === childNode.internalFields.item.visible, childState = childNode.internalFields.selected; if (isChildInvisible) { invisibleItemsCount++; continue } if (childState) { selectedItemsCount++ } else { if (void 0 === childState) { selectedItemsCount += .5 } } } if (selectedItemsCount) { result = selectedItemsCount === itemsCount - invisibleItemsCount ? true : void 0 } return result }, _toggleChildrenSelection: function(node, state) { var that = this; this._iterateChildren(node, true, function(child) { if (that._isNodeVisible(child)) { that._setFieldState(child, SELECTED, state) } }) }, _setFieldState: function(node, field, state) { if (node.internalFields[field] === state) { return } node.internalFields[field] = state; if (node.internalFields.publicNode) { node.internalFields.publicNode[field] = state } this.options.dataAccessors.setters[field](node.internalFields.item, state); this.options.onNodeChanged(node) }, _markChildren: function(keys) { var that = this; $.each(keys, function(_, key) { var index = that.getIndexByKey(key), node = that.getNodeByKey(key); that._dataStructure[index] = 0; node.internalFields.childrenKeys.length && that._markChildren(node.internalFields.childrenKeys) }) }, _removeNode: function(key) { var node = this.getNodeByKey(key); this._dataStructure[this.getIndexByKey(key)] = 0; this._markChildren(node.internalFields.childrenKeys); var that = this, counter = 0, items = extend([], this._dataStructure); $.each(items, function(index, item) { if (!item) { that._dataStructure.splice(index - counter, 1); counter++ } }) }, _addNode: function(item) { var dataConverter = this.options.dataConverter, node = dataConverter._convertItemToNode(item, this.options.dataAccessors.getters.parentKey(item)); this._dataStructure = this._dataStructure.concat(node); this._initialDataStructure = this._initialDataStructure.concat(node); dataConverter._dataStructure = dataConverter._dataStructure.concat(node) }, _updateFields: function() { this.options.dataConverter.updateChildrenKeys(); this._updateSelection(); this._updateExpansion() }, getSelectedNodesKeys: function() { return this._selectedNodesKeys }, getExpandedNodesKeys: function() { return this._expandedNodesKeys }, getData: function() { return this._dataStructure }, getFullData: function() { return this._initialDataStructure }, getNodeByItem: function(item) { var result = null; $.each(this._dataStructure, function(_, node) { if (node.internalFields.item === item) { result = node; return false } }); return result }, getNodesByItems: function(items) { var that = this, nodes = []; $.each(items, function(_, item) { var node = that.getNodeByItem(item); node && nodes.push(node) }); return nodes }, getNodeByKey: function(key) { return this._getByKey(this._dataStructure, key) }, getTreeNodes: function() { return this.options.dataConverter.convertToPublicNodes(this.getRootNodes()) }, getItemsCount: function() { return this.options.dataConverter.getItemsCount() }, getVisibleItemsCount: function() { return this.options.dataConverter.getVisibleItemsCount() }, getPublicNode: function(node) { return node.internalFields.publicNode }, getRootNodes: function() { return this.getChildrenNodes(this.options.rootValue) }, getChildrenNodes: function(parentKey) { return query(this._dataStructure).filter(["internalFields.parentKey", parentKey]).toArray() }, getIndexByKey: function(key) { return this.options.dataConverter.getIndexByKey(key) }, addItem: function(item) { this._addNode(item); this._updateFields() }, removeItem: function(key) { this._removeNode(key); this._updateFields() }, toggleSelection: function(key, state, selectRecursive) { var node = this._getByKey(selectRecursive ? this._initialDataStructure : this._dataStructure, key); this._setFieldState(node, SELECTED, state); if (this.options.recursiveSelection && !selectRecursive) { state ? this._setChildrenSelection() : this._toggleChildrenSelection(node, state); this._setParentSelection() } this._selectedNodesKeys = this._updateNodesKeysArray(SELECTED) }, toggleNodeDisabledState: function(key, state) { var node = this.getNodeByKey(key); this._setFieldState(node, DISABLED, state) }, toggleSelectAll: function(state) { if (!commonUtils.isDefined(state)) { return } var that = this; $.each(this._dataStructure, function(_, node) { if (!that._isNodeVisible(node)) { return } that._setFieldState(node, SELECTED, state); that._selectedNodesKeys = that._updateNodesKeysArray(SELECTED) }) }, isAllSelected: function() { if (this.getSelectedNodesKeys().length) { return this.getSelectedNodesKeys().length === this.getVisibleItemsCount() ? true : void 0 } else { return false } }, toggleExpansion: function(key, state) { var node = this.getNodeByKey(key); this._setFieldState(node, EXPANDED, state); if (state) { this._updateExpansion(key) } this._expandedNodesKeys = this._updateNodesKeysArray(EXPANDED) }, _filterDataStructure: function(substring) { var text, matches = [], dataStructure = this._initialDataStructure, escaped = commonUtils.escapeRegExp(substring), reg = new RegExp(escaped, "i"); for (var i = 0, size = dataStructure.length; i < size; i++) { text = this.options.dataAccessors.getters.display(dataStructure[i]); reg.test(text) && matches.push(dataStructure[i]) } return matches }, search: function(substring) { var that = this, matches = this._filterDataStructure(substring), dataConverter = this.options.dataConverter; function lookForParents(matches, index) { var length = matches.length; while (index < length) { var node = matches[index]; if (node.internalFields.parentKey === that.options.rootValue) { index++; continue } var parent = dataConverter.getParentNode(node); if (!parent) { errors.log("W1007", node.internalFields.parentKey, node.internalFields.key); index++; continue } if (!parent.internalFields.expanded) { that._setFieldState(parent, EXPANDED, true) } if (inArray(parent, matches) > -1) { index++; continue } matches.splice(index, 0, parent); lookForParents(matches, index) } } lookForParents(matches, 0); dataConverter._indexByKey = {}; $.each(matches, function(index, node) { node.internalFields.childrenKeys = []; dataConverter._indexByKey[node.internalFields.key] = index }); dataConverter._dataStructure = matches; dataConverter.setChildrenKeys(); return dataConverter._dataStructure } }); module.exports = DataAdapter }, /*!************************************************************!*\ !*** ./js/ui/hierarchical_collection/ui.data_converter.js ***! \************************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, errors = __webpack_require__( /*! ../../ui/widget/ui.errors */ 22), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14); var DataConverter = Class.inherit({ ctor: function() { this._dataStructure = []; this._itemsCount = 0; this._visibleItemsCount = 0 }, _indexByKey: {}, _convertItemsToNodes: function(items, parentKey) { var that = this; $.each(items, function(_, item) { var parentId = commonUtils.isDefined(parentKey) ? parentKey : that._getParentId(item), node = that._convertItemToNode(item, parentId); that._dataStructure.push(node); that._checkForDuplicateId(node.internalFields.key); that._indexByKey[node.internalFields.key] = that._dataStructure.length - 1; if (that._itemHasChildren(item)) { that._convertItemsToNodes(that._dataAccessors.getters.items(item), node.internalFields.key) } }) }, _checkForDuplicateId: function(key) { if (commonUtils.isDefined(this._indexByKey[key])) { throw errors.Error("E1040", key) } }, _getParentId: function(item) { return "plain" === this._dataType ? this._dataAccessors.getters.parentKey(item) : void 0 }, _itemHasChildren: function(item) { var items = this._dataAccessors.getters.items(item); return items && items.length }, _getUniqueKey: function(item) { var keyGetter = this._dataAccessors.getters.key, itemKey = keyGetter(item), isCorrectKey = keyGetter && (itemKey || 0 === itemKey) && commonUtils.isPrimitive(itemKey); return isCorrectKey ? itemKey : this.getItemsCount() }, _convertItemToNode: function(item, parentKey) { this._itemsCount++; false !== item.visible && this._visibleItemsCount++; var that = this, node = { internalFields: { disabled: that._dataAccessors.getters.disabled(item) || false, expanded: that._dataAccessors.getters.expanded(item) || false, selected: that._dataAccessors.getters.selected(item) || false, key: that._getUniqueKey(item), parentKey: commonUtils.isDefined(parentKey) ? parentKey : that._rootValue, item: that._makeObjectFromPrimitive(item), childrenKeys: [] } }; extend(node, item); delete node.items; return node }, setChildrenKeys: function() { var that = this; $.each(this._dataStructure, function(_, node) { if (node.internalFields.parentKey === that._rootValue) { return } var parent = that.getParentNode(node); parent && parent.internalFields.childrenKeys.push(node.internalFields.key) }) }, _makeObjectFromPrimitive: function(item) { if (commonUtils.isPrimitive(item)) { var key = item; item = {}; this._dataAccessors.setters.key(item, key) } return item }, _convertToPublicNode: function(node, parent) { if (!node) { return null } var publicNode = { text: this._dataAccessors.getters.display(node), key: node.internalFields.key, selected: node.internalFields.selected, expanded: node.internalFields.expanded, disabled: node.internalFields.disabled, parent: parent || null, itemData: node.internalFields.item, children: [], items: [] }; if (publicNode.parent) { publicNode.parent.children.push(publicNode); publicNode.parent.items.push(publicNode) } return publicNode }, convertToPublicNodes: function(data, parent) { if (!data.length) { return [] } var that = this, publicNodes = []; $.each(data, function(_, node) { node = commonUtils.isPrimitive(node) ? that._getByKey(node) : node; var publicNode = that._convertToPublicNode(node, parent); publicNode.children = that.convertToPublicNodes(node.internalFields.childrenKeys, publicNode); publicNodes.push(publicNode); node.internalFields.publicNode = publicNode }); return publicNodes }, setDataAccessors: function(accessors) { this._dataAccessors = accessors }, _getByKey: function(key) { return this._dataStructure[this.getIndexByKey(key)] || null }, getParentNode: function(node) { return this._getByKey(node.internalFields.parentKey) }, getByKey: function(data, key) { var result = null, that = this; var getByKey = function(data, key) { $.each(data, function(_, element) { var currentElementKey = element.internalFields && element.internalFields.key || that._dataAccessors.getters.key(element), items = that._dataAccessors.getters.items(element); if (currentElementKey === key) { result = element; return false } if (items) { getByKey(items, key) } }); return result }; return getByKey(data, key) }, getItemsCount: function() { return this._itemsCount }, getVisibleItemsCount: function() { return this._visibleItemsCount }, updateIndexByKey: function() { var that = this; this._indexByKey = {}; $.each(this._dataStructure, function(index, node) { that._checkForDuplicateId(node.internalFields.key); that._indexByKey[node.internalFields.key] = index }) }, updateChildrenKeys: function() { this._indexByKey = {}; this.removeChildrenKeys(); this.updateIndexByKey(); this.setChildrenKeys() }, removeChildrenKeys: function() { this._indexByKey = {}; $.each(this._dataStructure, function(index, node) { node.internalFields.childrenKeys = [] }) }, getIndexByKey: function(key) { return this._indexByKey[key] }, createPlainStructure: function(items, rootValue, dataType) { this._itemsCount = 0; this._visibleItemsCount = 0; this._rootValue = rootValue; this._dataType = dataType; this._indexByKey = {}; this._convertItemsToNodes(items); this.setChildrenKeys(); return this._dataStructure } }); module.exports = DataConverter }, /*!**********************************************************!*\ !*** ./js/ui/context_menu/ui.menu_base.edit.strategy.js ***! \**********************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), PlainEditStrategy = __webpack_require__( /*! ../collection/ui.collection_widget.edit.strategy.plain */ 167); var MenuBaseEditStrategy = PlainEditStrategy.inherit({ _getPlainItems: function() { return $.map(this._collectionWidget.option("items"), function getMenuItems(item) { return item.items ? [item].concat($.map(item.items, getMenuItems)) : item }) }, _stringifyItem: function(item) { var that = this; return JSON.stringify(item, function(key, value) { if ("template" === key) { return that._getTemplateString(value) } return value }) }, _getTemplateString: function(template) { var result; if ("object" === typeof template) { result = $(template).text() } else { result = template.toString() } return result } }); module.exports = MenuBaseEditStrategy }, /*!****************************!*\ !*** ./js/ui/data_grid.js ***! \****************************/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__( /*! ./data_grid/ui.data_grid */ 346) }, /*!*****************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.js ***! \*****************************************/ function(module, exports, __webpack_require__) { var DataGrid = __webpack_require__( /*! ./ui.data_grid.base */ 347); module.exports = DataGrid; __webpack_require__( /*! ./ui.data_grid.state_storing */ 374); __webpack_require__( /*! ./ui.data_grid.selection */ 376); __webpack_require__( /*! ./ui.data_grid.column_chooser */ 378); __webpack_require__( /*! ./ui.data_grid.grouping */ 381); __webpack_require__( /*! ./ui.data_grid.master_detail */ 385); __webpack_require__( /*! ./ui.data_grid.editing */ 387); __webpack_require__( /*! ./ui.data_grid.validating */ 391); __webpack_require__( /*! ./ui.data_grid.virtual_scrolling */ 393); __webpack_require__( /*! ./ui.data_grid.filter_row */ 396); __webpack_require__( /*! ./ui.data_grid.header_filter */ 401); __webpack_require__( /*! ./ui.data_grid.search */ 404); __webpack_require__( /*! ./ui.data_grid.pager */ 406); __webpack_require__( /*! ./ui.data_grid.columns_resizing_reordering */ 408); __webpack_require__( /*! ./ui.data_grid.keyboard_navigation */ 410); __webpack_require__( /*! ./ui.data_grid.summary */ 412); __webpack_require__( /*! ./ui.data_grid.column_fixing */ 414); __webpack_require__( /*! ./ui.data_grid.adaptivity */ 416); __webpack_require__( /*! ./ui.data_grid.export */ 418) }, /*!**********************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.base.js ***! \**********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, logger = __webpack_require__( /*! ../../core/utils/console */ 13).logger, browser = __webpack_require__( /*! ../../core/utils/browser */ 23), Widget = __webpack_require__( /*! ../widget/ui.widget */ 95), gridCore = __webpack_require__( /*! ./ui.data_grid.core */ 348), callModuleItemsMethod = gridCore.callModuleItemsMethod; var DATAGRID_ROW_SELECTOR = ".dx-row", DATAGRID_DEPRECATED_TEMPLATE_WARNING = "Specifying grid templates with the name of a jQuery selector is now deprecated. Instead, use the jQuery object that references this selector."; __webpack_require__( /*! ./ui.data_grid.column_headers */ 351); __webpack_require__( /*! ./ui.data_grid.columns_controller */ 355); __webpack_require__( /*! ./ui.data_grid.data_controller */ 357); __webpack_require__( /*! ./ui.data_grid.sorting */ 361); __webpack_require__( /*! ./ui.data_grid.rows */ 364); __webpack_require__( /*! ./ui.data_grid.context_menu */ 366); __webpack_require__( /*! ./ui.data_grid.error_handling */ 368); __webpack_require__( /*! ./ui.data_grid.grid_view */ 370); __webpack_require__( /*! ./ui.data_grid.header_panel */ 372); gridCore.registerModulesOrder(["stateStoring", "columns", "selection", "editorFactory", "columnChooser", "editing", "grouping", "masterDetail", "validating", "adaptivity", "data", "virtualScrolling", "columnHeaders", "filterRow", "headerPanel", "headerFilter", "sorting", "search", "rows", "pager", "columnsResizingReordering", "contextMenu", "keyboardNavigation", "errorHandling", "summary", "columnFixing", "export", "gridView"]); var DataGrid = Widget.inherit({ _activeStateUnit: DATAGRID_ROW_SELECTOR, _getDefaultOptions: function() { var that = this, result = that.callBase(); $.each(gridCore.modules, function() { if (commonUtils.isFunction(this.defaultOptions)) { extend(true, result, this.defaultOptions()) } }); return result }, _setDeprecatedOptions: function() { this.callBase(); extend(this._deprecatedOptions, { "editing.editMode": { since: "15.2", alias: "editing.mode" }, "editing.editEnabled": { since: "15.2", alias: "editing.allowUpdating" }, "editing.insertEnabled": { since: "15.2", alias: "editing.allowAdding" }, "editing.removeEnabled": { since: "15.2", alias: "editing.allowDeleting" }, "grouping.groupContinuedMessage": { since: "16.1", alias: "grouping.texts.groupContinuedMessage" }, "grouping.groupContinuesMessage": { since: "16.1", alias: "grouping.texts.groupContinuesMessage" }, "export.texts.excelFormat": { since: "16.1", alias: "export.texts.exportAll" }, "export.texts.exportToExcel": { since: "16.1", alias: "export.texts.exportAll" }, "export.texts.selectedRows": { since: "16.1", alias: "export.texts.exportSelectedRows" }, "filterRow.operationDescriptions.>": { since: "16.2", alias: "filterRow.operationDescriptions.greaterThan" }, "filterRow.operationDescriptions.<": { since: "16.2", alias: "filterRow.operationDescriptions.lessThan" }, "filterRow.operationDescriptions.=": { since: "16.2", alias: "filterRow.operationDescriptions.equal" }, "filterRow.operationDescriptions.<>": { since: "16.2", alias: "filterRow.operationDescriptions.notEqual" }, "filterRow.operationDescriptions.<=": { since: "16.2", alias: "filterRow.operationDescriptions.lessThanOrEqual" }, "filterRow.operationDescriptions.>=": { since: "16.2", alias: "filterRow.operationDescriptions.greaterThanOrEqual" }, "filterRow.operationDescriptions.startswith": { since: "16.2", alias: "filterRow.operationDescriptions.startsWith" }, "filterRow.operationDescriptions.notcontains": { since: "16.2", alias: "filterRow.operationDescriptions.notContains" }, "filterRow.operationDescriptions.endswith": { since: "16.2", alias: "filterRow.operationDescriptions.endsWith" } }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: { platform: "ios" }, options: { showRowLines: true } }, { device: function() { return browser.webkit }, options: { loadingTimeout: 30, loadPanel: { animation: { show: { easing: "cubic-bezier(1, 0, 1, 0)", duration: 500, from: { opacity: 0 }, to: { opacity: 1 } } } } } }, { device: function(device) { return "desktop" !== device.deviceType }, options: { grouping: { expandMode: "rowClick" } } }]) }, _init: function() { var that = this; that.callBase(); gridCore.processModules(that, gridCore); callModuleItemsMethod(that, "init") }, _clean: commonUtils.noop, _optionChanged: function(args) { var that = this; callModuleItemsMethod(that, "optionChanged", [args]); if (!args.handled) { that.callBase(args) } }, _dimensionChanged: function() { this.updateDimensions(true) }, _visibilityChanged: function(visible) { if (visible) { this.updateDimensions() } }, _renderContentImpl: function() { this.getView("gridView").render(this.element()) }, _renderContent: function() { var that = this; commonUtils.deferRender(function() { that._renderContentImpl() }) }, _getTemplate: function(templateName) { var template = templateName; if (commonUtils.isString(template) && "#" === template[0]) { template = $(templateName); logger.warn(DATAGRID_DEPRECATED_TEMPLATE_WARNING) } return this.callBase(template) }, _dispose: function() { var that = this; that.callBase(); callModuleItemsMethod(that, "dispose") }, isReady: function() { return this.getController("data").isReady() }, beginUpdate: function() { var that = this; that.callBase(); callModuleItemsMethod(that, "beginUpdate") }, endUpdate: function() { var that = this; callModuleItemsMethod(that, "endUpdate"); that.callBase() }, getController: function(name) { return this._controllers[name] }, getView: function(name) { return this._views[name] }, focus: function(element) { this.callBase(); if (commonUtils.isDefined(element)) { this.getController("keyboardNavigation").focus(element) } } }); DataGrid.registerModule = gridCore.registerModule.bind(gridCore); registerComponent("dxDataGrid", DataGrid); module.exports = DataGrid }, /*!**********************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.core.js ***! \**********************************************/ function(module, exports, __webpack_require__) { var extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, gridCoreUtils = __webpack_require__( /*! ../grid_core/ui.grid_core.utils */ 349), modules = __webpack_require__( /*! ../grid_core/ui.grid_core.modules */ 350); extend(exports, modules, gridCoreUtils, { modules: [] }) }, /*!***********************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.utils.js ***! \***********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), stringUtils = __webpack_require__( /*! ../../core/utils/string */ 18), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, toComparable = __webpack_require__( /*! ../../core/utils/data */ 50).toComparable, LoadPanel = __webpack_require__( /*! ../load_panel */ 246), dataUtils = __webpack_require__( /*! ../../data/utils */ 137), formatHelper = __webpack_require__( /*! ../../format_helper */ 66); var NO_DATA_CLASS = "nodata", DATE_INTERVAL_SELECTORS = { year: function(value) { return value && value.getFullYear() }, month: function(value) { return value && value.getMonth() + 1 }, day: function(value) { return value && value.getDate() }, quarter: function(value) { return value && Math.floor(value.getMonth() / 3) + 1 }, hour: function(value) { return value && value.getHours() }, minute: function(value) { return value && value.getMinutes() }, second: function(value) { return value && value.getSeconds() } }, DEFAULT_DATE_INTERVAL = ["year", "month", "day"]; module.exports = function() { var getIntervalSelector = function() { var groupInterval, nameIntervalSelector, data = arguments[1], value = this.calculateCellValue(data); if (!commonUtils.isDefined(value)) { return null } else { if ("date" === this.dataType) { nameIntervalSelector = arguments[0]; return DATE_INTERVAL_SELECTORS[nameIntervalSelector](value) } else { if ("number" === this.dataType) { groupInterval = arguments[0]; return Math.floor(Number(value) / groupInterval) * groupInterval } } } }; var getDateValues = function(dateValue) { if (commonUtils.isDate(dateValue)) { return [dateValue.getFullYear(), dateValue.getMonth(), dateValue.getDate(), dateValue.getHours(), dateValue.getMinutes(), dateValue.getSeconds()] } return $.map(("" + dateValue).split("/"), function(value, index) { return 1 === index ? Number(value) - 1 : Number(value) }) }; var getFilterExpressionForDate = function(filterValue, selectedFilterOperation, target) { var dateStart, dateEnd, column = this, selector = getFilterSelector(column, target), values = getDateValues(filterValue), dateInterval = "headerFilter" === target && module.exports.getGroupInterval(column)[values.length - 1]; switch (dateInterval) { case "year": dateStart = new Date(values[0], 0, 1); dateEnd = new Date(values[0] + 1, 0, 1); break; case "month": dateStart = new Date(values[0], values[1], 1); dateEnd = new Date(values[0], values[1] + 1, 1); break; case "quarter": dateStart = new Date(values[0], 3 * values[1], 1); dateEnd = new Date(values[0], 3 * values[1] + 3, 1); break; case "hour": dateStart = new Date(values[0], values[1], values[2], values[3]); dateEnd = new Date(values[0], values[1], values[2], values[3] + 1); break; case "minute": dateStart = new Date(values[0], values[1], values[2], values[3], values[4]); dateEnd = new Date(values[0], values[1], values[2], values[3], values[4] + 1); break; case "second": dateStart = new Date(values[0], values[1], values[2], values[3], values[4], values[5]); dateEnd = new Date(values[0], values[1], values[2], values[3], values[4], values[5] + 1); break; default: dateStart = new Date(values[0], values[1], values[2]); dateEnd = new Date(values[0], values[1], values[2] + 1) } switch (selectedFilterOperation) { case "<": return [selector, "<", dateStart]; case "<=": return [selector, "<", dateEnd]; case ">": return [selector, ">=", dateEnd]; case ">=": return [selector, ">=", dateStart]; case "<>": return [ [selector, "<", dateStart], "or", [selector, ">=", dateEnd] ]; default: return [ [selector, ">=", dateStart], "and", [selector, "<", dateEnd] ] } }; var getFilterExpressionForNumber = function(filterValue, selectedFilterOperation, target) { var interval, startFilterValue, endFilterValue, column = this, selector = getFilterSelector(column, target), values = ("" + filterValue).split("/"), value = Number(values[values.length - 1]), isExclude = "exclude" === column.filterType, groupInterval = module.exports.getGroupInterval(column); if ("headerFilter" === target && groupInterval && commonUtils.isDefined(filterValue)) { interval = groupInterval[values.length - 1]; startFilterValue = [selector, isExclude ? "<" : ">=", value]; endFilterValue = [selector, isExclude ? ">=" : "<", value + interval]; return [startFilterValue, isExclude ? "or" : "and", endFilterValue] } return [selector, selectedFilterOperation || "=", filterValue] }; var getFilterSelector = function(column, target) { var selector = column.dataField || column.selector; if ("search" === target) { selector = column.displayField || column.calculateDisplayValue || selector } return selector }; var isZeroTime = function(date) { return date.getHours() + date.getMinutes() + date.getSeconds() + date.getMilliseconds() < 1 }; var getFilterExpressionByRange = function(filterValue) { var endFilterValue, startFilterExpression, endFilterExpression, column = this, dataField = column.dataField; if (Array.isArray(filterValue) && commonUtils.isDefined(filterValue[0]) && commonUtils.isDefined(filterValue[1])) { startFilterExpression = [dataField, ">=", filterValue[0]]; endFilterExpression = [dataField, "<=", filterValue[1]]; if ("date" === column.dataType) { if (isZeroTime(filterValue[1])) { endFilterValue = new Date(filterValue[1].getTime()); endFilterValue.setDate(filterValue[1].getDate() + 1); endFilterExpression = [dataField, "<", endFilterValue] } } return [startFilterExpression, "and", endFilterExpression] } }; var equalSelectors = function(selector1, selector2) { if (commonUtils.isFunction(selector1) && commonUtils.isFunction(selector2)) { if (selector1.originalCallback && selector2.originalCallback) { return selector1.originalCallback === selector2.originalCallback } } return selector1 === selector2 }; return { renderNoDataText: function($element) { var that = this; $element = $element || this.element(); var noDataClass = that.addWidgetPrefix(NO_DATA_CLASS), noDataElement = $element.find("." + noDataClass).last(), isVisible = this._dataController.isEmpty(), isLoading = this._dataController.isLoading(), rtlEnabled = this.option("rtlEnabled"); if (!noDataElement.length) { noDataElement = $("<span>").addClass(noDataClass).appendTo($element) } if (isVisible && !isLoading) { noDataElement.removeClass("dx-hidden").text(that._getNoDataText()); commonUtils.deferUpdate(function() { var noDataHeight = noDataElement.height(), noDataWidth = noDataElement.width(); commonUtils.deferRender(function() { noDataElement.css({ marginTop: -Math.floor(noDataHeight / 2), marginRight: rtlEnabled ? -Math.floor(noDataWidth / 2) : 0, marginLeft: rtlEnabled ? 0 : -Math.floor(noDataWidth / 2) }) }) }) } else { noDataElement.addClass("dx-hidden") } }, renderLoadPanel: function($element, $container, isLocalStore) { var loadPanelOptions, that = this; that._loadPanel && that._loadPanel.element().remove(); loadPanelOptions = that.option("loadPanel"); if (loadPanelOptions && ("auto" === loadPanelOptions.enabled ? !isLocalStore : loadPanelOptions.enabled)) { loadPanelOptions = extend({ shading: false, message: loadPanelOptions.text, position: { of: $element }, container: $element }, loadPanelOptions); that._loadPanel = that._createComponent($("<div>").appendTo($container), LoadPanel, loadPanelOptions) } else { that._loadPanel = null } }, getIndexByKey: function(key, items, keyName) { var item, index = -1; if (Array.isArray(items)) { keyName = arguments.length <= 2 ? "key" : keyName; for (var i = 0; i < items.length; i++) { item = commonUtils.isDefined(keyName) ? items[i][keyName] : items[i]; if (commonUtils.equalByValue(key, item)) { index = i; break } } } return index }, combineFilters: function(filters, operation) { var i, resultFilter = []; operation = operation || "and"; for (i = 0; i < filters.length; i++) { if (!filters[i]) { continue } if (resultFilter.length) { resultFilter.push(operation) } resultFilter.push(filters[i]) } if (1 === resultFilter.length) { resultFilter = resultFilter[0] } if (resultFilter.length) { return resultFilter } }, checkChanges: function(changes, changeNames) { var i, changesWithChangeNamesCount = 0; for (i = 0; i < changeNames.length; i++) { if (changes[changeNames[i]]) { changesWithChangeNamesCount++ } } return changes.length && changes.length === changesWithChangeNamesCount }, equalFilterParameters: function(filter1, filter2) { var i; if (Array.isArray(filter1) && Array.isArray(filter2)) { if (filter1.length !== filter2.length) { return false } else { for (i = 0; i < filter1.length; i++) { if (!module.exports.equalFilterParameters(filter1[i], filter2[i])) { return false } } } return true } else { if (commonUtils.isFunction(filter1) && filter1.columnIndex >= 0 && commonUtils.isFunction(filter2) && filter2.columnIndex >= 0) { return filter1.columnIndex === filter2.columnIndex } else { return toComparable(filter1) == toComparable(filter2) } } }, proxyMethod: function(instance, methodName, defaultResult) { if (!instance[methodName]) { instance[methodName] = function() { var dataSource = this._dataSource; return dataSource ? dataSource[methodName].apply(dataSource, arguments) : defaultResult } } }, formatValue: function(value, options) { var valueText = formatHelper.format(value, options.format, options.precision) || value && value.toString() || "", formatObject = { value: value, valueText: options.getDisplayFormat ? options.getDisplayFormat(valueText) : valueText, target: options.target || "row", groupInterval: options.groupInterval }; return options.customizeText ? options.customizeText.call(options, formatObject) : formatObject.valueText }, getFormatOptionsByColumn: function(column, target) { return { format: column.format, precision: column.precision, getDisplayFormat: column.getDisplayFormat, customizeText: column.customizeText, target: target, trueText: column.trueText, falseText: column.falseText } }, getDisplayValue: function(column, value, data, rowType) { if (column.displayValueMap && void 0 !== column.displayValueMap[value]) { return column.displayValueMap[value] } else { if (column.calculateDisplayValue && data && "group" !== rowType) { return column.calculateDisplayValue(data) } else { if (column.lookup && !("group" === rowType && (column.calculateGroupValue || column.calculateDisplayValue))) { return column.lookup.calculateCellValue(value) } } } return value }, getGroupRowSummaryText: function(summaryItems, summaryTexts) { var i, summaryItem, result = "("; for (i = 0; i < summaryItems.length; i++) { summaryItem = summaryItems[i]; result += (i > 0 ? ", " : "") + module.exports.getSummaryText(summaryItem, summaryTexts) } return result += ")" }, getSummaryText: function(summaryItem, summaryTexts) { var displayFormat = summaryItem.displayFormat || summaryItem.columnCaption && summaryTexts[summaryItem.summaryType + "OtherColumn"] || summaryTexts[summaryItem.summaryType]; return this.formatValue(summaryItem.value, { format: summaryItem.valueFormat, precision: summaryItem.precision, getDisplayFormat: function(valueText) { return displayFormat ? stringUtils.format(displayFormat, valueText, summaryItem.columnCaption) : valueText }, customizeText: summaryItem.customizeText }) }, normalizeSortingInfo: function(sort) { sort = sort || []; var result, i; result = dataUtils.normalizeSortingInfo(sort); for (i = 0; i < sort.length; i++) { if (sort && sort[i] && void 0 !== sort[i].isExpanded) { result[i].isExpanded = sort[i].isExpanded } if (sort && sort[i] && void 0 !== sort[i].groupInterval) { result[i].groupInterval = sort[i].groupInterval } } return result }, getFormatByDataType: function(dataType) { switch (dataType) { case "date": return "shortDate" } }, defaultCalculateFilterExpression: function(filterValue, selectedFilterOperation, target) { var column = this, selector = getFilterSelector(column, target), isSearchByDisplayValue = column.calculateDisplayValue && "search" === target, dataType = isSearchByDisplayValue && column.lookup && column.lookup.dataType || column.dataType, filter = null; if ("headerFilter" === target && null === filterValue) { filter = [selector, selectedFilterOperation || "=", null]; if ("string" === dataType) { filter = [filter, "=" === selectedFilterOperation ? "or" : "and", [selector, selectedFilterOperation || "=", ""]] } } else { if ("string" === dataType && (!column.lookup || isSearchByDisplayValue)) { filter = [selector, selectedFilterOperation || "contains", filterValue] } else { if ("between" === selectedFilterOperation) { return getFilterExpressionByRange.apply(column, arguments) } else { if ("date" === dataType && commonUtils.isDefined(filterValue)) { return getFilterExpressionForDate.apply(column, arguments) } else { if ("number" === dataType) { return getFilterExpressionForNumber.apply(column, arguments) } else { if ("object" !== dataType) { filter = [selector, selectedFilterOperation || "=", filterValue] } } } } } } return filter }, getHeaderFilterGroupParameters: function(column, remoteGrouping) { var result = [], dataField = column.dataField || column.name, groupInterval = this.getGroupInterval(column); if (groupInterval) { $.each(groupInterval, function(index, interval) { result.push(remoteGrouping ? { selector: dataField, groupInterval: interval, isExpanded: index < groupInterval.length - 1 } : getIntervalSelector.bind(column, interval)) }); return result } return remoteGrouping ? [{ selector: dataField, isExpanded: false }] : function(data) { var result = column.calculateCellValue(data); if (void 0 === result || "" === result) { result = null } return result } }, getGroupInterval: function(column) { var index, result = [], dateIntervals = ["year", "month", "day", "hour", "minute", "second"], groupInterval = column.headerFilter && column.headerFilter.groupInterval, interval = "quarter" === groupInterval ? "month" : groupInterval; if ("date" === column.dataType) { result = DEFAULT_DATE_INTERVAL; index = inArray(interval, dateIntervals); if (index >= 0) { result = dateIntervals.slice(0, index); result.push(groupInterval); return result } return result } else { if (commonUtils.isDefined(groupInterval)) { return Array.isArray(groupInterval) ? groupInterval : [groupInterval] } } }, equalSortParameters: function(sortParameters1, sortParameters2, ignoreIsExpanded) { var i; sortParameters1 = module.exports.normalizeSortingInfo(sortParameters1); sortParameters2 = module.exports.normalizeSortingInfo(sortParameters2); if (Array.isArray(sortParameters1) && Array.isArray(sortParameters2)) { if (sortParameters1.length !== sortParameters2.length) { return false } else { for (i = 0; i < sortParameters1.length; i++) { if (!equalSelectors(sortParameters1[i].selector, sortParameters2[i].selector) || sortParameters1[i].desc !== sortParameters2[i].desc || sortParameters1[i].groupInterval !== sortParameters2[i].groupInterval || !ignoreIsExpanded && Boolean(sortParameters1[i].isExpanded) !== Boolean(sortParameters2[i].isExpanded)) { return false } } } return true } else { return (!sortParameters1 || !sortParameters1.length) === (!sortParameters2 || !sortParameters2.length) } }, getPointsByColumns: function(items, pointCreated, isVertical, startColumnIndex) { var point, i, item, offset, prevItemOffset, rtlEnabled, cellsLength = items.length, notCreatePoint = false, columnIndex = startColumnIndex || 0, result = []; for (i = 0; i <= cellsLength; i++) { if (i < cellsLength) { item = items.eq(i); offset = item.offset(); rtlEnabled = "rtl" === item.css("direction") } point = { index: columnIndex, x: offset ? offset.left + (!isVertical && rtlEnabled ^ i === cellsLength ? item.outerWidth() : 0) : 0, y: offset ? offset.top + (isVertical && i === cellsLength ? item.outerHeight() : 0) : 0, columnIndex: columnIndex }; if (!isVertical && i > 0) { prevItemOffset = items.eq(i - 1).offset(); if (prevItemOffset.top < point.y) { point.y = prevItemOffset.top } } if (pointCreated) { notCreatePoint = pointCreated(point) } if (!notCreatePoint) { result.push(point) } columnIndex++ } return result } } }() }, /*!*************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.modules.js ***! \*************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, errors = __webpack_require__( /*! ../widget/ui.errors */ 22), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), WIDGET_WITH_LEGACY_CONTAINER_NAME = "dxDataGrid"; var CallBacks = function(options) { options = options || {}; var firing, firingIndex, list = [], fireCore = function(context, args) { firing = true; for (firingIndex = 0; firingIndex < list.length; firingIndex++) { if (list[firingIndex] && false === list[firingIndex].apply(context, args) && options.stopOnFalse) { break } } firing = false }, that = { add: function(fn) { if ("function" === typeof fn && !that.has(fn)) { list.push(fn) } return this }, has: function(fn) { return fn ? inArray(fn, list) > -1 : !!list.length }, remove: function(fn) { var index = inArray(fn, list); if (index > -1) { list.splice(index, 1); if (firing && index <= firingIndex) { firingIndex-- } } return this }, fireWith: function(context, args) { args = args || []; fireCore(context, args.slice ? args.slice() : args) }, fire: function() { that.fireWith(this, arguments); return this }, empty: function() { list = []; return this } }; return that }; var ModuleItem = Class.inherit({ _endUpdateCore: function() {}, ctor: function(component) { var that = this; that._updateLockCount = 0; that.component = component; that._actions = {}; that._actionConfigs = {}; $.each(this.callbackNames() || [], function(index, name) { var flags = that.callbackFlags(name); that[this] = CallBacks(flags) }) }, init: function() {}, callbackNames: function() {}, callbackFlags: function() {}, publicMethods: function() {}, beginUpdate: function() { this._updateLockCount++ }, endUpdate: function() { if (this._updateLockCount > 0) { this._updateLockCount--; if (!this._updateLockCount) { this._endUpdateCore() } } }, option: function(name) { var component = this.component, optionCache = component._optionCache; if (1 === arguments.length && optionCache) { if (!(name in optionCache)) { optionCache[name] = component.option(name) } return optionCache[name] } return component.option.apply(component, arguments) }, localize: function(name) { var optionCache = this.component._optionCache; if (optionCache) { if (!(name in optionCache)) { optionCache[name] = messageLocalization.format(name) } return optionCache[name] } return messageLocalization.format(name) }, on: function() { return this.component.on.apply(this.component, arguments) }, off: function() { return this.component.off.apply(this.component, arguments) }, optionChanged: function(args) { if (args.name in this._actions) { this.createAction(args.name, this._actionConfigs[args.name]); args.handled = true } }, getAction: function(actionName) { return this._actions[actionName] }, setAria: function(name, value, $target) { var target = $target.get(0), prefix = "role" !== name && "id" !== name ? "aria-" : ""; if (target.setAttribute) { target.setAttribute(prefix + name, value) } else { $target.attr(prefix + name, value) } }, _createComponent: function() { return this.component._createComponent.apply(this.component, arguments) }, getController: function(name) { return this.component._controllers[name] }, createAction: function(actionName, config) { var action; if (commonUtils.isFunction(actionName)) { action = this.component._createAction(actionName.bind(this), config); return function(e) { action({ jQueryEvent: e }) } } else { this._actions[actionName] = this.component._createActionByOption(actionName, config); this._actionConfigs[actionName] = config } }, executeAction: function(actionName, options) { var action = this._actions[actionName]; return action && action(options) }, dispose: function() { var that = this; $.each(that.callbackNames() || [], function() { that[this].empty() }) }, addWidgetPrefix: function(className) { var componentName = this.component.NAME; return "dx-" + componentName.slice(2).toLowerCase() + (className ? "-" + className : "") }, getWidgetContainerClass: function() { var containerName = this.component.NAME === WIDGET_WITH_LEGACY_CONTAINER_NAME ? null : "container"; return this.addWidgetPrefix(containerName) } }); var Controller = ModuleItem; var ViewController = Controller.inherit({ getView: function(name) { return this.component._views[name] }, getViews: function() { return this.component._views } }); var View = ModuleItem.inherit({ _isReady: function() { return this.component.isReady() }, _endUpdateCore: function() { this.callBase(); if (!this._isReady() && this._requireReady) { this._requireRender = false; this.component._requireResize = false } if (this._requireRender) { this._requireRender = false; this.render(this._$parent) } }, _invalidate: function(requireResize, requireReady) { this._requireRender = true; this.component._requireResize = this.component._requireResize || requireResize; this._requireReady = this._requireReady || requireReady }, _renderCore: function() {}, _resizeCore: function() {}, _afterRender: function() {}, _parentElement: function() { return this._$parent }, ctor: function(component) { this.callBase(component); this.renderCompleted = $.Callbacks(); this.resizeCompleted = $.Callbacks() }, element: function() { return this._$element }, getElementHeight: function() { var $element = this.element(); if (!$element) { return 0 } var marginTop = parseFloat($element.css("marginTop")) || 0, marginBottom = parseFloat($element.css("marginBottom")) || 0, offsetHeight = $element.get(0).offsetHeight; return offsetHeight + marginTop + marginBottom }, isVisible: function() { return true }, getTemplate: function(name) { return this.component._getTemplate(name) }, render: function($parent, options) { var $element = this._$element, isVisible = this.isVisible(); if (!$element && !$parent) { return } this._requireReady = false; if (!$element) { $element = this._$element = $("<div />").appendTo($parent); this._$parent = $parent } $element.toggleClass("dx-hidden", !isVisible); if (isVisible) { this.component._optionCache = {}; this._renderCore(options); this.component._optionCache = void 0; this._afterRender($parent); this.renderCompleted.fire() } }, resize: function() { this.isResizing = true; this._resizeCore(); this.resizeCompleted.fire(); this.isResizing = false }, focus: function() { this.element().focus() } }); var MODULES_ORDER_MAX_INDEX = 1e6; var processModules = function(that, componentClass) { var modules = componentClass.modules, modulesOrder = componentClass.modulesOrder, controllerTypes = componentClass.controllerTypes || {}, viewTypes = componentClass.viewTypes || {}; if (!componentClass.controllerTypes) { if (modulesOrder) { modules.sort(function(module1, module2) { var orderIndex1 = inArray(module1.name, modulesOrder); var orderIndex2 = inArray(module2.name, modulesOrder); if (orderIndex1 < 0) { orderIndex1 = MODULES_ORDER_MAX_INDEX } if (orderIndex2 < 0) { orderIndex2 = MODULES_ORDER_MAX_INDEX } return orderIndex1 - orderIndex2 }) } $.each(modules, function() { var controllers = this.controllers, moduleName = this.name, views = this.views; controllers && $.each(controllers, function(name, type) { if (controllerTypes[name]) { throw errors.Error("E1001", moduleName, name) } else { if (!(type && type.subclassOf && type.subclassOf(Controller))) { type.subclassOf(Controller); throw errors.Error("E1002", moduleName, name) } } controllerTypes[name] = type }); views && $.each(views, function(name, type) { if (viewTypes[name]) { throw errors.Error("E1003", moduleName, name) } else { if (!(type && type.subclassOf && type.subclassOf(View))) { throw errors.Error("E1004", moduleName, name) } } viewTypes[name] = type }) }); $.each(modules, function() { var extenders = this.extenders; if (extenders) { extenders.controllers && $.each(extenders.controllers, function(name, extender) { if (controllerTypes[name]) { controllerTypes[name] = controllerTypes[name].inherit(extender) } }); extenders.views && $.each(extenders.views, function(name, extender) { if (viewTypes[name]) { viewTypes[name] = viewTypes[name].inherit(extender) } }) } }); componentClass.controllerTypes = controllerTypes; componentClass.viewTypes = viewTypes } var registerPublicMethods = function(that, name, moduleItem) { var publicMethods = moduleItem.publicMethods(); if (publicMethods) { $.each(publicMethods, function(index, methodName) { if (moduleItem[methodName]) { if (!that[methodName]) { that[methodName] = function() { return moduleItem[methodName].apply(moduleItem, arguments) } } else { throw errors.Error("E1005", methodName) } } else { throw errors.Error("E1006", name, methodName) } }) } }; var createModuleItems = function(moduleTypes) { var moduleItems = {}; $.each(moduleTypes, function(name, moduleType) { var moduleItem = new moduleType(that); moduleItem.name = name; registerPublicMethods(that, name, moduleItem); moduleItems[name] = moduleItem }); return moduleItems }; that._controllers = createModuleItems(controllerTypes); that._views = createModuleItems(viewTypes) }; var callModuleItemsMethod = function(that, methodName, args) { args = args || []; if (that._controllers) { $.each(that._controllers, function() { this[methodName] && this[methodName].apply(this, args) }) } if (that._views) { $.each(that._views, function() { this[methodName] && this[methodName].apply(this, args) }) } }; module.exports = { modules: [], View: View, ViewController: ViewController, Controller: Controller, registerModule: function(name, module) { var i, modules = this.modules; for (i = 0; i < modules.length; i++) { if (modules[i].name === name) { return } } module.name = name; modules.push(module); delete this.controllerTypes; delete this.viewTypes }, registerModulesOrder: function(moduleNames) { this.modulesOrder = moduleNames }, unregisterModule: function(name) { this.modules = commonUtils.grep(this.modules, function(module) { return module.name !== name }); delete this.controllerTypes; delete this.viewTypes }, processModules: processModules, callModuleItemsMethod: callModuleItemsMethod }; module.exports.CallBacks = CallBacks }, /*!********************************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.column_headers.js ***! \********************************************************/ function(module, exports, __webpack_require__) { var gridCore = __webpack_require__( /*! ./ui.data_grid.core */ 348), columnHeadersViewModule = __webpack_require__( /*! ../grid_core/ui.grid_core.column_headers */ 352); exports.ColumnHeadersView = columnHeadersViewModule.views.columnHeadersView; gridCore.registerModule("columnHeaders", columnHeadersViewModule) }, /*!********************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.column_headers.js ***! \********************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), columnsView = __webpack_require__( /*! ./ui.grid_core.columns_view */ 353), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, messageLocalization = __webpack_require__( /*! ../../localization/message */ 89); var CELL_CONTENT_CLASS = "text-content", HEADERS_CLASS = "headers", NOWRAP_CLASS = "nowrap", HEADER_ROW_CLASS = "dx-header-row", COLUMN_LINES_CLASS = "dx-column-lines", CONTEXT_MENU_SORT_ASC_ICON = "context-menu-sort-asc", CONTEXT_MENU_SORT_DESC_ICON = "context-menu-sort-desc", CONTEXT_MENU_SORT_NONE_ICON = "context-menu-sort-none", CELL_FOCUS_DISABLED_CLASS = "dx-cell-focus-disabled", VISIBILITY_HIDDEN_CLASS = "dx-visibility-hidden", TEXT_CONTENT_ALIGNMENT_CLASS_PREFIX = "dx-text-content-alignment-", SORT_INDICATOR_CLASS = "dx-sort-indicator", HEADER_FILTER_INDICATOR_CLASS = "dx-header-filter-indicator"; module.exports = { defaultOptions: function() { return { showColumnHeaders: true, cellHintEnabled: true } }, views: { columnHeadersView: columnsView.ColumnsView.inherit(function() { var createCellContent = function(that, $cell, options) { var showColumnLines, $cellContent = $("<div />").addClass(that.addWidgetPrefix(CELL_CONTENT_CLASS)); addCssClassesToCellContent(that, $cell, options.column, $cellContent); showColumnLines = that.option("showColumnLines"); return $cellContent[showColumnLines || "right" === options.column.alignment ? "appendTo" : "prependTo"]($cell) }; var addCssClassesToCellContent = function(that, $cell, column, $cellContent) { var $indicatorElements = that._getIndicatorElements($cell, true), $visibleIndicatorElements = that._getIndicatorElements($cell), indicatorCount = $indicatorElements && $indicatorElements.length, columnAlignment = that._getColumnAlignment(column.alignment); $cellContent = $cellContent || $cell.children("." + that.addWidgetPrefix(CELL_CONTENT_CLASS)); $cellContent.toggleClass(TEXT_CONTENT_ALIGNMENT_CLASS_PREFIX + columnAlignment, indicatorCount > 0).toggleClass(TEXT_CONTENT_ALIGNMENT_CLASS_PREFIX + ("left" === columnAlignment ? "right" : "left"), indicatorCount > 0 && "center" === column.alignment).toggleClass(SORT_INDICATOR_CLASS, !!$visibleIndicatorElements.filter("." + that._getIndicatorClassName("sort")).length).toggleClass(HEADER_FILTER_INDICATOR_CLASS, !!$visibleIndicatorElements.filter("." + that._getIndicatorClassName("headerFilter")).length) }; return { _createTable: function() { var $table = this.callBase.apply(this, arguments); $table.on("mousedown selectstart", this.createAction(function(e) { var event = e.jQueryEvent; if (event.shiftKey) { event.preventDefault() } })); return $table }, _getDefaultTemplate: function(column) { var template, that = this; if (column.command) { template = function($container, options) { var column = options.column; $container.html(" "); $container.addClass(column.cssClass) } } else { template = function($container, options) { var $content = createCellContent(that, $container, options); $content.text(column.caption) } } return template }, _getHeaderTemplate: function(column) { return !column.command && column.headerCellTemplate || { allowRenderToDetachedContainer: true, render: this._getDefaultTemplate(column) } }, _processTemplate: function(template, options) { var resultTemplate, that = this, column = options.column, renderingTemplate = that.callBase(template); if (renderingTemplate && column.headerCellTemplate) { resultTemplate = { render: function(options) { var $content = createCellContent(that, options.container, options.model); renderingTemplate.render(extend({}, options, { container: $content })) } } } else { resultTemplate = renderingTemplate } return resultTemplate }, _handleDataChanged: function() { if (this._isGroupingChanged || this._requireReady) { this._isGroupingChanged = false; this.render() } }, _renderCell: function($row, options) { var $cell = this.callBase($row, options); if ("header" === options.row.rowType) { $cell.addClass(CELL_FOCUS_DISABLED_CLASS); if (!commonUtils.isDefined(options.column.command)) { this.setAria("role", "columnheader", $cell); this.setAria("label", options.column.caption + " " + messageLocalization.format("dxDataGrid-ariaColumn"), $cell) } } return $cell }, _createRow: function(row) { var $row = this.callBase(row).toggleClass(COLUMN_LINES_CLASS, this.option("showColumnLines")); if ("header" === row.rowType) { $row.addClass(HEADER_ROW_CLASS) } return $row }, _renderCore: function() { var that = this, $container = that.element(); if (that._tableElement && !that._dataController.isLoaded() && !that._hasRowElements) { return } $container.addClass(that.addWidgetPrefix(HEADERS_CLASS)).toggleClass(that.addWidgetPrefix(NOWRAP_CLASS), !that.option("wordWrapEnabled")).empty(); that._updateContent(that._renderTable()); that.callBase.apply(that, arguments) }, _renderRows: function() { var that = this; if (that._dataController.isLoaded() || that._hasRowElements) { that.callBase.apply(that, arguments); that._hasRowElements = true } }, _getRowVisibleColumns: function(rowIndex) { return this._columnsController.getVisibleColumns(rowIndex) }, _renderRow: function($table, options) { options.columns = this._getRowVisibleColumns(options.row.rowIndex); this.callBase($table, options) }, _createCell: function(options) { var column = options.column, $cellElement = this.callBase.apply(this, arguments); column.rowspan > 1 && $cellElement.attr("rowspan", column.rowspan); return $cellElement }, _getRows: function() { var i, result = [], rowCount = this.getRowCount(); if (this.option("showColumnHeaders")) { for (i = 0; i < rowCount; i++) { result.push({ rowType: "header", rowIndex: i }) } } return result }, _getCellTemplate: function(options) { if ("header" === options.rowType) { return this._getHeaderTemplate(options.column) } }, _columnOptionChanged: function(e) { var changeTypes = e.changeTypes, optionNames = e.optionNames; if (changeTypes.grouping) { this._isGroupingChanged = true; return } this.callBase(e); if (optionNames.width || optionNames.visible) { this.resizeCompleted.fire() } }, _isElementVisible: function(elementOptions) { return elementOptions && elementOptions.visible }, _alignCaptionByCenter: function($cell) { var $indicatorsContainer = this._getIndicatorContainer($cell, true); if ($indicatorsContainer && $indicatorsContainer.length) { $indicatorsContainer.filter("." + VISIBILITY_HIDDEN_CLASS).remove(); $indicatorsContainer = this._getIndicatorContainer($cell); $indicatorsContainer.clone().addClass(VISIBILITY_HIDDEN_CLASS).css("float", "").insertBefore($cell.children("." + this.addWidgetPrefix(CELL_CONTENT_CLASS))) } }, _updateCell: function($cell, options) { if ("header" === options.rowType && "center" === options.column.alignment) { this._alignCaptionByCenter($cell) } this.callBase.apply(this, arguments) }, _updateIndicator: function($cell, column, indicatorName) { var $indicatorElement = this.callBase.apply(this, arguments); if ("center" === column.alignment) { this._alignCaptionByCenter($cell) } addCssClassesToCellContent(this, $cell, column); return $indicatorElement }, _getIndicatorContainer: function($cell, returnAll) { var $indicatorsContainer = this.callBase($cell); return returnAll ? $indicatorsContainer : $indicatorsContainer.filter(":not(." + VISIBILITY_HIDDEN_CLASS + ")") }, getHeadersRowHeight: function() { var $tableElement = this._getTableElement(), $headerRows = $tableElement && $tableElement.find("." + HEADER_ROW_CLASS); if ($headerRows && $headerRows.length) { return $headerRows.first().height() * $headerRows.length } return 0 }, getHeaderElement: function(index) { var columnElements = this.getColumnElements(); return columnElements && columnElements.eq(index) }, getColumnElements: function(index, bandColumnIndex) { var rowIndex, result, $cellElement, visibleColumns, that = this, columnsController = that._columnsController, rowCount = that.getRowCount(); if (that.option("showColumnHeaders")) { if (rowCount > 1 && (!commonUtils.isDefined(index) || commonUtils.isDefined(bandColumnIndex))) { result = []; visibleColumns = commonUtils.isDefined(bandColumnIndex) ? columnsController.getChildrenByBandColumn(bandColumnIndex, true) : columnsController.getVisibleColumns(); $.each(visibleColumns, function(_, column) { rowIndex = commonUtils.isDefined(index) ? index : columnsController.getRowIndex(column.index); $cellElement = that.getCellElement(rowIndex, columnsController.getVisibleIndex(column.index, rowIndex)); $cellElement && result.push($cellElement.get(0)) }); return $(result) } else { if (!index || index < rowCount) { return that.getCellElements(index || 0) } } } }, getColumnWidths: function() { var $columnElements = this.getColumnElements(); if ($columnElements && $columnElements.length) { return this._getWidths($columnElements) } return this.callBase.apply(this, arguments) }, allowDragging: function(column, sourceLocation, draggingPanels) { var i, draggingPanel, rowIndex = column && this._columnsController.getRowIndex(column.index), columns = this.getColumns(0 === rowIndex ? 0 : null), draggableColumnCount = 0, allowDrag = function(column) { return column.allowReordering || column.allowGrouping || column.allowHiding }; for (i = 0; i < columns.length; i++) { if (allowDrag(columns[i])) { draggableColumnCount++ } } if (draggableColumnCount <= 1) { return false } else { if (!draggingPanels) { return (this.option("allowColumnReordering") || this._columnsController.isColumnOptionUsed("allowReordering")) && column && column.allowReordering } } for (i = 0; i < draggingPanels.length; i++) { draggingPanel = draggingPanels[i]; if (draggingPanel && draggingPanel.allowDragging(column, sourceLocation)) { return true } } return false }, getBoundingRect: function() { var offset, that = this, $columnElements = that.getColumnElements(); if ($columnElements && $columnElements.length) { offset = that._getTableElement().offset(); return { top: offset.top } } return null }, getName: function() { return "headers" }, getColumnCount: function() { var $columnElements = this.getColumnElements(); return $columnElements ? $columnElements.length : 0 }, isVisible: function() { return this.option("showColumnHeaders") }, optionChanged: function(args) { var that = this; switch (args.name) { case "showColumnHeaders": case "wordWrapEnabled": case "showColumnLines": that._invalidate(true, true); args.handled = true; break; default: that.callBase(args) } }, getHeight: function() { return this.getElementHeight() }, getContextMenuItems: function(options) { var onItemClick, sortingOptions, that = this, column = options.column; if (options.row && "header" === options.row.rowType) { sortingOptions = that.option("sorting"); if (sortingOptions && "none" !== sortingOptions.mode && column && column.allowSorting) { onItemClick = function(params) { setTimeout(function() { that._columnsController.changeSortOrder(column.index, params.itemData.value) }) }; return [{ text: sortingOptions.ascendingText, value: "asc", disabled: "asc" === column.sortOrder, icon: CONTEXT_MENU_SORT_ASC_ICON, onItemClick: onItemClick }, { text: sortingOptions.descendingText, value: "desc", disabled: "desc" === column.sortOrder, icon: CONTEXT_MENU_SORT_DESC_ICON, onItemClick: onItemClick }, { text: sortingOptions.clearText, value: "none", disabled: !column.sortOrder, icon: CONTEXT_MENU_SORT_NONE_ICON, onItemClick: onItemClick }] } } }, getRowCount: function() { return this._columnsController && this._columnsController.getRowCount() }, setRowsOpacity: function(columnIndex, value, rowIndex) { var i, columnElements, that = this, rowCount = that.getRowCount(), columns = that._columnsController.getColumns(), column = columns && columns[columnIndex], columnID = column && column.isBand && column.index, setColumnOpacity = function(index, column) { if (column.ownerBand === columnID) { columnElements.eq(index).css({ opacity: value }); if (column.isBand) { that.setRowsOpacity(column.index, value, i + 1) } } }; if (commonUtils.isDefined(columnID)) { rowIndex = rowIndex || 0; for (i = rowIndex; i < rowCount; i++) { columnElements = that.getCellElements(i); $.each(that.getColumns(i), setColumnOpacity) } } } } }()) } } }, /*!******************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.columns_view.js ***! \******************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), clickEvent = __webpack_require__( /*! ../../events/click */ 75), browser = __webpack_require__( /*! ../../core/utils/browser */ 23), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, getDefaultAlignment = __webpack_require__( /*! ../../core/utils/position */ 107).getDefaultAlignment, devices = __webpack_require__( /*! ../../core/devices */ 53), modules = __webpack_require__( /*! ./ui.grid_core.modules */ 350), gridCoreUtils = __webpack_require__( /*! ./ui.grid_core.utils */ 349), columnStateMixin = __webpack_require__( /*! ./ui.grid_core.column_state_mixin */ 354); var SCROLL_CONTAINER_CLASS = "scroll-container", GROUP_SPACE_CLASS = "group-space", CONTENT_CLASS = "content", TABLE_CLASS = "table", TABLE_FIXED_CLASS = "table-fixed", CONTENT_FIXED_CLASS = "content-fixed", ROW_CLASS = "dx-row", GROUP_ROW_CLASS = "dx-group-row", DETAIL_ROW_CLASS = "dx-master-detail-row", HIDDEN_COLUMNS_WIDTH = "0.0001px", CELL_HINT_VISIBLE = "dxCellHintVisible", FORM_FIELD_ITEM_CONTENT_CLASS = "dx-field-item-content"; var appendElementTemplate = { render: function(options) { options.container.append(options.content) } }; exports.ColumnsView = modules.View.inherit(columnStateMixin).inherit({ _createScrollableOptions: function() { var that = this, scrollingOptions = that.option("scrolling"), useNativeScrolling = that.option("scrolling.useNative"); var options = extend({}, scrollingOptions, { direction: "both", bounceEnabled: false, useKeyboard: false }); if (void 0 === useNativeScrolling) { useNativeScrolling = true } if ("auto" === useNativeScrolling) { delete options.useNative; delete options.useSimulatedScrollbar } else { options.useNative = !!useNativeScrolling; options.useSimulatedScrollbar = !useNativeScrolling } return options }, _updateCell: function($cell, parameters) { if (parameters.rowType) { this._cellPrepared($cell, parameters) } }, _createCell: function(options) { var column = options.column, alignment = column.alignment || getDefaultAlignment(this.option("rtlEnabled")); var cell = window.document.createElement("td"); cell.style.textAlign = alignment; var $cell = $(cell); this.setAria("role", "gridcell", $cell); if (!commonUtils.isDefined(column.groupIndex) && column.cssClass) { $cell.addClass(column.cssClass) } if ("expand" === column.command) { $cell.addClass(this.addWidgetPrefix(GROUP_SPACE_CLASS)) } column.colspan > 1 && $cell.attr("colspan", column.colspan); return $cell }, _createRow: function() { return $("<tr />").addClass(ROW_CLASS).attr("role", "row") }, _getTableRoleName: function() { return "grid" }, _createTable: function(columns) { var that = this, $table = $("<table />").addClass(that.addWidgetPrefix(TABLE_CLASS)).addClass(that.addWidgetPrefix(TABLE_FIXED_CLASS)).attr("role", that._getTableRoleName()); if (columns) { $table.append(that._createColGroup(columns)); if (devices.real().ios) { $table.append("<thead><tr></tr></thead>") } } $table.append("<tbody />"); if (browser.mozilla) { $table.on("mousedown", "td", function(e) { if (e.ctrlKey) { e.preventDefault() } }) } if (that.option("cellHintEnabled")) { $table.on("mousemove", ".dx-row > td", this.createAction(function(args) { var e = args.jQueryEvent, $element = $(e.target), $cell = $(e.currentTarget), $row = $cell.parent(), isDataRow = $row.hasClass("dx-data-row"), isHeaderRow = $row.hasClass("dx-header-row"), isGroupRow = $row.hasClass("dx-group-row"), visibleColumns = that._columnsController.getVisibleColumns(), rowOptions = $row.data("options"), columnIndex = $cell.index(), cellOptions = rowOptions && rowOptions.cells && rowOptions.cells[columnIndex], column = cellOptions ? cellOptions.column : visibleColumns[columnIndex]; if ((!isDataRow || isDataRow && column && !column.cellTemplate) && (!isHeaderRow || isHeaderRow && column && !column.headerCellTemplate) && (!isGroupRow || isGroupRow && column && (void 0 === column.groupIndex || !column.groupCellTemplate))) { if ($element.data(CELL_HINT_VISIBLE)) { $element.removeAttr("title"); $element.data(CELL_HINT_VISIBLE, false) } if ($element[0].scrollWidth > $element[0].clientWidth && !commonUtils.isDefined($element.attr("title"))) { $element.attr("title", $element.text()); $element.data(CELL_HINT_VISIBLE, true) } } })) } var getOptions = function(event) { var formItemOptions, resultOptions, $cell = $(event.currentTarget), $fieldItemContent = $(event.target).closest("." + FORM_FIELD_ITEM_CONTENT_CLASS), rowOptions = $cell.parent().data("options"), options = rowOptions && rowOptions.cells && rowOptions.cells[$cell.index()]; resultOptions = extend({}, options, { cellElement: $cell, jQueryEvent: event, eventType: event.type }); if ($fieldItemContent.length) { formItemOptions = $fieldItemContent.data("dxFormItem"); if (formItemOptions.column) { resultOptions.column = formItemOptions.column; resultOptions.columnIndex = that._columnsController.getVisibleIndex(resultOptions.column.index) } } return resultOptions }; $table.on("mouseover", ".dx-row > td", function(e) { that.executeAction("onCellHoverChanged", getOptions(e)) }); $table.on("mouseout", ".dx-row > td", function(e) { that.executeAction("onCellHoverChanged", getOptions(e)) }); $table.on(clickEvent.name, ".dx-row > td", function(e) { that.executeAction("onCellClick", getOptions(e)) }); $table.on(clickEvent.name, ".dx-row", { useNative: that._isNativeClick() }, that.createAction(function(e) { var jQueryEvent = e.jQueryEvent; if (!$(jQueryEvent.target).closest("a").length) { e.rowIndex = that.getRowIndex(jQueryEvent.currentTarget); if (e.rowIndex >= 0) { e.rowElement = $(jQueryEvent.currentTarget); e.columns = that.getColumns(); that._rowClick(e) } } })); return $table }, _isNativeClick: commonUtils.noop, _rowClick: commonUtils.noop, _createColGroup: function(columns) { var i, j, colspan, colgroupElement = $("<colgroup />"); for (i = 0; i < columns.length; i++) { colspan = columns[i].colspan || 1; for (j = 0; j < colspan; j++) { colgroupElement.append(this._createCol(columns[i])) } } return colgroupElement }, _createCol: function(column) { var width = column.visibleWidth || column.width; if ("adaptiveHidden" === width) { width = HIDDEN_COLUMNS_WIDTH } return $("<col />").width(width) }, renderDelayedTemplates: function() { var templateParameters, delayedTemplates = this._delayedTemplates; while (delayedTemplates.length) { templateParameters = delayedTemplates.shift(); templateParameters.template.render(templateParameters.options); if (templateParameters.options.model && templateParameters.options.model.column) { this._updateCell(templateParameters.options.container, templateParameters.options.model) } } }, _processTemplate: function(template) { var templateID, renderingTemplate, that = this; if (template && template.render && !template.jquery) { renderingTemplate = { allowRenderToDetachedContainer: template.allowRenderToDetachedContainer, render: function(options) { template.render(options.container, options.model) } } } else { if (commonUtils.isFunction(template)) { renderingTemplate = { render: function(options) { var renderedTemplate = template(options.container, options.model); if (renderedTemplate && (renderedTemplate.jquery || renderedTemplate.nodeType)) { options.container.append(renderedTemplate) } } } } else { templateID = commonUtils.isString(template) ? template : $(template).attr("id"); if (!templateID) { renderingTemplate = that.getTemplate(template) } else { if (!that._templatesCache[templateID]) { that._templatesCache[templateID] = that.getTemplate(template) } renderingTemplate = that._templatesCache[templateID] } } } return renderingTemplate }, renderTemplate: function(container, template, options, allowRenderToDetachedContainer) { var that = this, renderingTemplate = that._processTemplate(template, options); if (renderingTemplate) { options.component = that.component; if (renderingTemplate.allowRenderToDetachedContainer || allowRenderToDetachedContainer) { renderingTemplate.render({ container: container, model: options }); return true } else { that._delayedTemplates.push({ template: renderingTemplate, options: { container: container, model: options } }) } } return false }, _appendRow: function($table, $row, appendTemplate) { appendTemplate = appendTemplate || appendElementTemplate; appendTemplate.render({ content: $row, container: $table }) }, _resizeCore: function() { var that = this, scrollLeft = that._scrollLeft; if (scrollLeft >= 0) { that._scrollLeft = 0; that.scrollTo({ left: scrollLeft }) } }, _renderCore: function() { var $root = this.element().parent(); if (!$root || $root.parent().length) { this.renderDelayedTemplates() } }, _renderTable: function(options) { options = options || {}; var $table, that = this; options.columns = that._columnsController.getVisibleColumns(); $table = that._createTable(options.columns); that._renderRows($table, options); return $table }, _renderRows: function($table, options) { var i, that = this, rows = that._getRows(options.change); for (i = 0; i < rows.length; i++) { that._renderRow($table, extend({ row: rows[i] }, options)) } }, _renderRow: function($table, options) { var $row, that = this; options.row.cells = []; $row = that._createRow(options.row); that._renderCells($row, options); that._appendRow($table, $row); that._rowPrepared($row, extend({ columns: options.columns }, options.row)) }, _renderCells: function($row, options) { var i, that = this, columnIndex = 0, row = options.row, columns = options.columns; for (i = 0; i < columns.length; i++) { that._renderCell($row, extend({ column: columns[i], columnIndex: columnIndex, value: row.values && row.values[columnIndex] }, options)); if (columns[i].colspan > 1) { columnIndex += columns[i].colspan } else { columnIndex++ } } }, _renderCell: function($row, options) { var $cell, that = this, cellOptions = that._getCellOptions(options), column = options.column; options.row.cells.push(cellOptions); $cell = that._createCell(cellOptions); if (!column.command) { that.setAria("label", that.localize("dxDataGrid-ariaColumn") + " " + column.caption + ", " + that.localize("dxDataGrid-ariaValue") + " " + cellOptions.text, $cell) } that._renderCellContent($cell, cellOptions); $row.get(0).appendChild($cell.get(0)); return $cell }, _renderCellContent: function($cell, options) { var template = this._getCellTemplate(options); if (!template || this.renderTemplate($cell, template, options)) { this._updateCell($cell, options) } }, _getCellTemplate: function() {}, _getRows: function() { return [] }, _getCellOptions: function(options) { return { column: options.column, columnIndex: options.columnIndex, rowType: options.row.rowType } }, _cellPrepared: function($cell, options) { options.cellElement = $cell; this.executeAction("onCellPrepared", options) }, _rowPrepared: function($row, options) { $.data($row.get(0), "options", options); options.rowElement = $row; this.executeAction("onRowPrepared", options) }, _columnOptionChanged: function(e) { var optionNames = e.optionNames; if (gridCoreUtils.checkChanges(optionNames, ["width", "visibleWidth"])) { var visibleColumns = this._columnsController.getVisibleColumns(); var widths = $.map(visibleColumns, function(column) { return column.visibleWidth || column.width || "auto" }); this.setColumnWidths(widths); return } if (!this._requireReady) { this.render() } }, getTableElements: function() { return this._tableElement || $() }, _getTableElement: function() { return this._tableElement }, _setTableElement: function(tableElement) { this._tableElement = tableElement }, optionChanged: function(args) { this.callBase(args); switch (args.name) { case "cellHintEnabled": case "onCellPrepared": case "onRowPrepared": case "onCellHoverChanged": this._invalidate(true, true); args.handled = true } }, init: function() { var that = this; that._scrollLeft = -1; that._columnsController = that.getController("columns"); that._dataController = that.getController("data"); that._delayedTemplates = []; that._templatesCache = {}; that.createAction("onCellClick"); that.createAction("onRowClick"); that.createAction("onCellHoverChanged", { excludeValidators: ["disabled", "readOnly"] }); that.createAction("onCellPrepared", { excludeValidators: ["designMode", "disabled", "readOnly"], category: "rendering" }); that.createAction("onRowPrepared", { excludeValidators: ["designMode", "disabled", "readOnly"], category: "rendering", afterExecute: function(e) { that._afterRowPrepared(e) } }); that._columnsController.columnsChanged.add(that._columnOptionChanged.bind(that)); that._dataController && that._dataController.changed.add(that._handleDataChanged.bind(that)) }, _afterRowPrepared: commonUtils.noop, _handleDataChanged: function() {}, callbackNames: function() { return ["scrollChanged"] }, scrollTo: function(pos) { var that = this, $element = that.element(), $scrollContainer = $element && $element.children("." + that.addWidgetPrefix(SCROLL_CONTAINER_CLASS)).not("." + that.addWidgetPrefix(CONTENT_FIXED_CLASS)); that._skipScrollChanged = false; if (commonUtils.isDefined(pos) && commonUtils.isDefined(pos.left) && that._scrollLeft !== pos.left) { that._scrollLeft = pos.left; $scrollContainer && $scrollContainer.scrollLeft(Math.round(pos.left)); that._skipScrollChanged = true } }, _wrapTableInScrollContainer: function($table) { var $scrollContainer, that = this; $scrollContainer = $("<div/>").on("scroll", function() { !that._skipScrollChanged && that.scrollChanged.fire({ left: $scrollContainer.scrollLeft() }, that.name); that._skipScrollChanged = false }).addClass(that.addWidgetPrefix(CONTENT_CLASS)).addClass(that.addWidgetPrefix(SCROLL_CONTAINER_CLASS)).append($table).appendTo(that.element()); return $scrollContainer }, _updateContent: function($newTableElement) { this._setTableElement($newTableElement); this._wrapTableInScrollContainer($newTableElement) }, _findContentElement: commonUtils.noop, _getWidths: function($cellElements) { var width, clientRect, result = []; if ($cellElements) { $.each($cellElements, function(index, item) { width = item.offsetWidth; if (item.getBoundingClientRect) { clientRect = item.getBoundingClientRect(); if (clientRect.width > width) { width = Math.ceil(clientRect.width) } } result.push(width) }) } return result }, getColumnWidths: function($tableElement) { var $cells, that = this, result = []; (this.option("forceApplyBindings") || $.noop)(); $tableElement = $tableElement || that._getTableElement(); if ($tableElement) { $cells = $tableElement.children("tbody").children(); for (var i = 0; i < $cells.length; i++) { var $cell = $cells.eq(i); if (!$cell.is("." + GROUP_ROW_CLASS) && !$cell.is("." + DETAIL_ROW_CLASS)) { $cells = $cell.children("td"); break } } result = that._getWidths($cells) } return result }, setColumnWidths: function(widths, $tableElement, columns) { var $cols, i, width, columnIndex; $tableElement = $tableElement || this._getTableElement(); if ($tableElement && $tableElement.length && widths) { columnIndex = 0; $cols = $tableElement.find("col"); columns = columns || this.getColumns(null, $tableElement); for (i = 0; i < columns.length; i++) { if (columns[i].colspan) { columnIndex += columns[i].colspan; continue } width = widths[columnIndex]; if ("adaptiveHidden" === width) { width = HIDDEN_COLUMNS_WIDTH } $cols.eq(columnIndex).css("width", width || "auto"); columnIndex++ } } }, getCellElements: function(rowIndex) { return this._getCellElementsCore(rowIndex) }, _getCellElementsCore: function(rowIndex) { var $row = this._getRowElements().eq(rowIndex); return $row.children() }, getCellElement: function(rowIndex, columnIdentifier) { var $cell, that = this, $cells = that.getCellElements(rowIndex), columnVisibleIndex = that._getVisibleColumnIndex($cells, rowIndex, columnIdentifier); if ($cells.length && columnVisibleIndex >= 0) { $cell = $cells.eq(columnVisibleIndex) } if ($cell && $cell.length) { return $cell } }, getRowElement: function(rowIndex) { var that = this, $rowElement = $(), $tableElements = that.getTableElements(); $.each($tableElements, function(_, tableElement) { $rowElement = $rowElement.add(that._getRowElements($(tableElement)).eq(rowIndex)) }); if ($rowElement.length) { return $rowElement } }, _getVisibleColumnIndex: function($cells, rowIndex, columnIdentifier) { var columnIndex; if (commonUtils.isString(columnIdentifier)) { columnIndex = this._columnsController.columnOption(columnIdentifier, "index"); return this._columnsController.getVisibleIndex(columnIndex) } return columnIdentifier }, getColumnElements: function() {}, getColumns: function(rowIndex) { return this._columnsController.getVisibleColumns(rowIndex) }, getCell: function(cellPosition, rows) { var $cells, $rows = rows || this._getRowElements(); if ($rows.length > 0 && cellPosition.rowIndex >= 0) { if ("virtual" !== this.option("scrolling.mode")) { cellPosition.rowIndex = cellPosition.rowIndex < $rows.length ? cellPosition.rowIndex : $rows.length - 1 } $cells = this.getCellElements(cellPosition.rowIndex); if ($cells && $cells.length > 0) { return $cells.eq($cells.length > cellPosition.columnIndex ? cellPosition.columnIndex : $cells.length - 1) } } }, getRowsCount: function() { var tableElement = this._getTableElement(); if (tableElement && 1 === tableElement.length) { return tableElement[0].rows.length } return 0 }, _getRowElements: function(tableElement) { tableElement = tableElement || this._getTableElement(); return tableElement && tableElement.children("tbody").children("." + ROW_CLASS) || $() }, getRowIndex: function($row) { return this._getRowElements().index($row) }, getBoundingRect: function() {}, getName: function() {}, setScrollerSpacing: function(width) { var that = this, $element = that.element(), rtlEnabled = that.option("rtlEnabled"); $element && $element.css(rtlEnabled ? { paddingLeft: width } : { paddingRight: width }) }, isScrollbarVisible: function(isHorizontal) { var $element = this.element(), $tableElement = this._tableElement; if ($element && $tableElement) { return isHorizontal ? $tableElement.outerWidth() - $element.width() > 0 : $tableElement.outerHeight() - $element.height() > 0 } return false } }) }, /*!************************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.column_state_mixin.js ***! \************************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, getDefaultAlignment = __webpack_require__( /*! ../../core/utils/position */ 107).getDefaultAlignment, commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14); var COLUMN_INDICATORS_CLASS = "dx-column-indicators", GROUP_PANEL_ITEM_CLASS = "dx-group-panel-item"; module.exports = { _applyColumnState: function(options) { var that = this, rtlEnabled = this.option("rtlEnabled"), columnAlignment = that._getColumnAlignment(options.column.alignment, rtlEnabled), parameters = extend(true, { columnAlignment: columnAlignment }, options), isGroupPanelItem = parameters.rootElement.hasClass(GROUP_PANEL_ITEM_CLASS), $indicatorsContainer = that._createIndicatorContainer(parameters, isGroupPanelItem), $span = $("<span>").addClass(that._getIndicatorClassName(options.name)), getIndicatorAlignment = function() { if (rtlEnabled) { return "left" === columnAlignment ? "right" : "left" } return columnAlignment }; parameters.container = $indicatorsContainer; parameters.indicator = $span; that._renderIndicator(parameters); $indicatorsContainer[(isGroupPanelItem || !options.showColumnLines) && "left" === getIndicatorAlignment() ? "appendTo" : "prependTo"](options.rootElement); return $span }, _getIndicatorClassName: commonUtils.noop, _getColumnAlignment: function(alignment, rtlEnabled) { rtlEnabled = rtlEnabled || this.option("rtlEnabled"); return alignment && "center" !== alignment ? alignment : getDefaultAlignment(rtlEnabled) }, _createIndicatorContainer: function(options, ignoreIndicatorAlignment) { var $indicatorsContainer = this._getIndicatorContainer(options.rootElement), indicatorAlignment = "left" === options.columnAlignment ? "right" : "left"; if (!$indicatorsContainer.length) { $indicatorsContainer = $("<div>").addClass(COLUMN_INDICATORS_CLASS) } return $indicatorsContainer.css("float", options.showColumnLines && !ignoreIndicatorAlignment ? indicatorAlignment : null) }, _getIndicatorContainer: function($cell) { return $cell && $cell.find("." + COLUMN_INDICATORS_CLASS) }, _getIndicatorElements: function($cell) { var $indicatorContainer = this._getIndicatorContainer($cell); return $indicatorContainer && $indicatorContainer.children() }, _renderIndicator: function(options) { var $container = options.container, $indicator = options.indicator; $container && $indicator && $container.append($indicator) }, _updateIndicators: function(indicatorName) { var rowOptions, $cell, i, that = this, columns = that.getColumns(), $cells = that.getColumnElements(); if (!$cells.length) { return } for (i = 0; i < columns.length; i++) { $cell = $cells.eq(i); that._updateIndicator($cell, columns[i], indicatorName); rowOptions = $cell.parent().data("options"); if (rowOptions && rowOptions.cells) { rowOptions.cells[$cell.index()].column = columns[i] } } }, _updateIndicator: function($cell, column, indicatorName) { if (!column.command) { return this._applyColumnState({ name: indicatorName, rootElement: $cell, column: column, showColumnLines: this.option("showColumnLines") }) } } } }, /*!************************************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.columns_controller.js ***! \************************************************************/ function(module, exports, __webpack_require__) { var gridCore = __webpack_require__( /*! ./ui.data_grid.core */ 348), columnsControllerModule = __webpack_require__( /*! ../grid_core/ui.grid_core.columns_controller */ 356), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend; gridCore.registerModule("columns", { defaultOptions: function() { return extend(true, {}, columnsControllerModule.defaultOptions(), { commonColumnSettings: { allowExporting: true } }) }, controllers: columnsControllerModule.controllers }) }, /*!************************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.columns_controller.js ***! \************************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), isWrapped = __webpack_require__( /*! ../../core/utils/variable_wrapper */ 28).isWrapped, dataCoreUtils = __webpack_require__( /*! ../../core/utils/data */ 50), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), getDefaultAlignment = __webpack_require__( /*! ../../core/utils/position */ 107).getDefaultAlignment, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, config = __webpack_require__( /*! ../../core/config */ 15), isDefined = commonUtils.isDefined, objectUtils = __webpack_require__( /*! ../../core/utils/object */ 27), errors = __webpack_require__( /*! ../widget/ui.errors */ 22), modules = __webpack_require__( /*! ../grid_core/ui.grid_core.modules */ 350), gridCoreUtils = __webpack_require__( /*! ../grid_core/ui.grid_core.utils */ 349), normalizeSortingInfo = gridCoreUtils.normalizeSortingInfo, equalSortParameters = gridCoreUtils.equalSortParameters, normalizeIndexes = __webpack_require__( /*! ../../core/utils/array */ 26).normalizeIndexes, inflector = __webpack_require__( /*! ../../core/utils/inflector */ 39), dateSerialization = __webpack_require__( /*! ../../core/utils/date_serialization */ 259), numberLocalization = __webpack_require__( /*! ../../localization/number */ 32), dateLocalization = __webpack_require__( /*! ../../localization/date */ 33), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when, DataSourceModule = __webpack_require__( /*! ../../data/data_source/data_source */ 153), normalizeDataSourceOptions = DataSourceModule.normalizeDataSourceOptions; var USER_STATE_FIELD_NAMES_15_1 = ["filterValues", "filterType", "fixed", "fixedPosition"], USER_STATE_FIELD_NAMES = ["visibleIndex", "dataField", "name", "dataType", "width", "visible", "sortOrder", "sortIndex", "groupIndex", "filterValue", "selectedFilterOperation", "added"].concat(USER_STATE_FIELD_NAMES_15_1), COMMAND_EXPAND_CLASS = "dx-command-expand"; module.exports = { defaultOptions: function() { return { commonColumnSettings: { allowFiltering: true, allowHiding: true, allowSorting: true, allowEditing: true, encodeHtml: true, trueText: messageLocalization.format("dxDataGrid-trueText"), falseText: messageLocalization.format("dxDataGrid-falseText") }, allowColumnReordering: false, allowColumnResizing: false, columnResizingMode: "nextColumn", columnMinWidth: void 0, adaptColumnWidthByRatio: true, columns: void 0, regenerateColumnsByVisibleItems: false, customizeColumns: null, dateSerializationFormat: void 0 } }, controllers: { columns: modules.Controller.inherit(function() { var DEFAULT_COLUMN_OPTIONS = { visible: true, showInColumnChooser: true }, DATATYPE_OPERATIONS = { number: ["=", "<>", "<", ">", "<=", ">=", "between"], string: ["contains", "notcontains", "startswith", "endswith", "=", "<>"], date: ["=", "<>", "<", ">", "<=", ">=", "between"] }, COLUMN_INDEX_OPTIONS = { visibleIndex: true, groupIndex: true, grouped: true, sortIndex: true, sortOrder: true }, GROUP_LOCATION = "group", COLUMN_CHOOSER_LOCATION = "columnChooser"; var createColumn = function(that, columnOptions, userStateColumnOptions, bandColumn) { var calculatedColumnOptions, commonColumnOptions = {}; if (columnOptions) { if (commonUtils.isString(columnOptions)) { columnOptions = { dataField: columnOptions } } if (columnOptions.command) { return extend(true, {}, columnOptions) } else { commonColumnOptions = that.getCommonSettings(); if (userStateColumnOptions && userStateColumnOptions.name && userStateColumnOptions.dataField) { columnOptions = extend({}, columnOptions, { dataField: userStateColumnOptions.dataField }) } calculatedColumnOptions = that._createCalculatedColumnOptions(columnOptions, bandColumn); return extend(true, {}, DEFAULT_COLUMN_OPTIONS, commonColumnOptions, calculatedColumnOptions, columnOptions, { selector: null }) } } }; var createColumnsFromOptions = function(that, columnsOptions, bandColumn) { var result = []; if (columnsOptions) { $.each(columnsOptions, function(index, columnOptions) { var userStateColumnOptions = that._columnsUserState && checkUserStateColumn(columnOptions, that._columnsUserState[index]) && that._columnsUserState[index], column = createColumn(that, columnOptions, userStateColumnOptions, bandColumn); if (column) { if (bandColumn) { column.ownerBand = bandColumn } result.push(column); if (column.isBand) { result = result.concat(createColumnsFromOptions(that, column.columns, column)); delete column.columns } } }) } return result }; var getParentBandColumns = function(columnIndex, columnParentByIndex) { var result = [], parent = columnParentByIndex[columnIndex]; while (parent) { result.push(parent); columnIndex = parent.index; parent = columnParentByIndex[columnIndex] } return result }; var getChildrenByBandColumn = function(columnIndex, columnChildrenByIndex, recursive) { var column, result = [], children = columnChildrenByIndex[columnIndex]; if (children) { for (var i = 0; i < children.length; i++) { column = children[i]; if (!isDefined(column.groupIndex) || column.showWhenGrouped) { result.push(column); if (recursive && column.isBand) { result = result.concat(getChildrenByBandColumn(column.index, columnChildrenByIndex, recursive)) } } } } return result }; var getColumnByIndexes = function(that, columnIndexes) { var result, columns = that._columns, callbackFilter = function(column) { return column.ownerBand === result.index }; for (var i = 0; i < columnIndexes.length; i++) { result = columns[columnIndexes[i]]; if (result) { columns = that._columns.filter(callbackFilter) } } return result }; var calculateColspan = function(that, columnID) { var colspan = 0, columns = that.getChildrenByBandColumn(columnID, true); $.each(columns, function(_, column) { if (column.isBand) { column.colspan = column.colspan || calculateColspan(that, column.index); colspan += column.colspan } else { colspan += 1 } }); return colspan }; var processBandColumns = function(that, columns, bandColumnsCache) { var i, column, rowspan, rowCount = that.getRowCount(); for (i = 0; i < columns.length; i++) { column = columns[i]; if (column.visible || column.command) { if (column.isBand) { column.colspan = column.colspan || calculateColspan(that, column.index) } if (!column.isBand || !column.colspan) { rowspan = rowCount - (!column.command && !isDefined(column.groupIndex) ? getParentBandColumns(column.index, bandColumnsCache.columnParentByIndex).length : 0); if (rowspan > 1) { column.rowspan = rowspan } } } } }; var getValueDataType = function(value) { var dataType = commonUtils.type(value); if ("string" !== dataType && "boolean" !== dataType && "number" !== dataType && "date" !== dataType && "object" !== dataType) { dataType = void 0 } return dataType }; var getSerializationFormat = function(dataType, value) { switch (dataType) { case "date": return dateSerialization.getDateSerializationFormat(value); case "number": if (commonUtils.isString(value)) { return "string" } if (commonUtils.isNumeric(value)) { return null } } }; var updateSerializers = function(options, dataType) { if (!options.deserializeValue) { if ("date" === dataType) { options.deserializeValue = function(value) { return dateSerialization.deserializeDate(value) }; options.serializeValue = function(value) { return dateSerialization.serializeDate(value, this.serializationFormat) } } if ("number" === dataType) { options.deserializeValue = function(value) { var parsedValue = parseFloat(value); return isNaN(parsedValue) ? value : parsedValue }; options.serializeValue = function(value) { return isDefined(value) && "string" === this.serializationFormat ? value.toString() : value } } } }; var getAlignmentByDataType = function(dataType, isRTL) { switch (dataType) { case "number": return "right"; case "boolean": return "center"; default: return getDefaultAlignment(isRTL) } }; var getCustomizeTextByDataType = function(dataType) { if ("boolean" === dataType) { return function(e) { if (true === e.value) { return this.trueText || "true" } else { if (false === e.value) { return this.falseText || "false" } else { return e.valueText || "" } } } } }; var createColumnsFromDataSource = function(that, dataSource) { var fieldName, i, firstItems = that._getFirstItems(dataSource), processedFields = {}, result = []; for (i = 0; i < firstItems.length; i++) { if (firstItems[i]) { for (fieldName in firstItems[i]) { if (!commonUtils.isFunction(firstItems[i][fieldName]) || isWrapped(firstItems[i][fieldName])) { processedFields[fieldName] = true } } } } for (fieldName in processedFields) { if (0 !== fieldName.indexOf("__")) { var column = createColumn(that, fieldName); result.push(column) } } return result }; var updateColumnIndexes = function(that) { $.each(that._columns, function(index, column) { column.index = index }); $.each(that._columns, function(index, column) { if (commonUtils.isObject(column.ownerBand)) { column.ownerBand = column.ownerBand.index } }); $.each(that._commandColumns, function(index, column) { column.index = -(index + 1) }) }; var updateColumnGroupIndexes = function(that, currentColumn) { normalizeIndexes(that._columns, "groupIndex", currentColumn, function(column) { var grouped = column.grouped; delete column.grouped; return grouped }) }; var updateColumnSortIndexes = function(that, currentColumn) { $.each(that._columns, function(index, column) { if (isDefined(column.sortIndex) && !isSortOrderValid(column.sortOrder)) { delete column.sortIndex } }); normalizeIndexes(that._columns, "sortIndex", currentColumn, function(column) { return !isDefined(column.groupIndex) && isSortOrderValid(column.sortOrder) }) }; var updateColumnVisibleIndexes = function(that, currentColumn) { var i, key, column, bandColumnIndex, parentBandColumns, bandColumns = {}, columns = [], bandColumnsCache = that.getBandColumnsCache(); for (i = 0; i < that._columns.length; i++) { column = that._columns[i]; parentBandColumns = getParentBandColumns(i, bandColumnsCache.columnParentByIndex); if (parentBandColumns.length) { bandColumnIndex = parentBandColumns[parentBandColumns.length - 1].index; bandColumns[bandColumnIndex] = bandColumns[bandColumnIndex] || []; bandColumns[bandColumnIndex].push(column) } else { columns.push(column) } } for (key in bandColumns) { normalizeIndexes(bandColumns[key], "visibleIndex", currentColumn) } normalizeIndexes(columns, "visibleIndex", currentColumn) }; var getColumnIndexByVisibleIndex = function(that, visibleIndex, location) { var column, rowIndex = commonUtils.isObject(visibleIndex) ? visibleIndex.rowIndex : null, columns = location === GROUP_LOCATION ? that.getGroupColumns() : location === COLUMN_CHOOSER_LOCATION ? that.getChooserColumns() : that.getVisibleColumns(rowIndex); visibleIndex = commonUtils.isObject(visibleIndex) ? visibleIndex.columnIndex : visibleIndex; column = columns[visibleIndex]; return column && isDefined(column.index) ? column.index : -1 }; var moveColumnToGroup = function(that, column, groupIndex) { var i, groupColumns = that.getGroupColumns(); if (groupIndex >= 0) { for (i = 0; i < groupColumns.length; i++) { if (groupColumns[i].groupIndex >= groupIndex) { groupColumns[i].groupIndex++ } } } else { groupIndex = 0; for (i = 0; i < groupColumns.length; i++) { groupIndex = Math.max(groupIndex, groupColumns[i].groupIndex + 1) } } column.groupIndex = groupIndex }; var checkUserStateColumn = function(column, userStateColumn) { return column && userStateColumn && userStateColumn.name === column.name && (userStateColumn.dataField === column.dataField || column.name) }; var applyUserState = function(that) { var column, columnUserState, userStateColumnIndex, i, columnsUserState = that._columnsUserState, ignoreColumnOptionNames = that._ignoreColumnOptionNames || [], columns = that._columns, columnCountById = {}, resultColumns = [], allColumnsHaveState = true, userStateColumnIndexes = []; function applyFieldsState(column, userStateColumn) { var fieldName; if (!userStateColumn) { return } for (var index = 0; index < USER_STATE_FIELD_NAMES.length; index++) { fieldName = USER_STATE_FIELD_NAMES[index]; if (inArray(fieldName, ignoreColumnOptionNames) >= 0) { continue } if ("dataType" === fieldName) { column[fieldName] = column[fieldName] || userStateColumn[fieldName] } else { if (inArray(fieldName, USER_STATE_FIELD_NAMES_15_1) >= 0) { if (fieldName in userStateColumn) { column[fieldName] = userStateColumn[fieldName] } } else { column[fieldName] = userStateColumn[fieldName] } } } } function findUserStateColumn(columnsUserState, column) { var id = column.name || column.dataField, count = columnCountById[id] || 0; for (var j = 0; j < columnsUserState.length; j++) { if (checkUserStateColumn(column, columnsUserState[j])) { if (count) { count-- } else { columnCountById[id] = columnCountById[id] || 0; columnCountById[id]++; return j } } } return -1 } if (columnsUserState) { for (i = 0; i < columns.length; i++) { userStateColumnIndex = findUserStateColumn(columnsUserState, columns[i]); allColumnsHaveState = allColumnsHaveState && userStateColumnIndex >= 0; userStateColumnIndexes.push(userStateColumnIndex) } for (i = 0; i < columns.length; i++) { column = columns[i]; userStateColumnIndex = userStateColumnIndexes[i]; if (that._hasUserState || allColumnsHaveState) { applyFieldsState(column, columnsUserState[userStateColumnIndex]) } if (userStateColumnIndex >= 0 && isDefined(columnsUserState[userStateColumnIndex].initialIndex)) { resultColumns[userStateColumnIndex] = column } else { resultColumns.push(column) } } for (i = 0; i < columnsUserState.length; i++) { columnUserState = columnsUserState[i]; if (columnUserState.added && findUserStateColumn(columns, columnUserState) < 0) { column = createColumn(that, columnUserState.added); applyFieldsState(column, columnUserState); resultColumns.push(column) } } assignColumns(that, resultColumns) } }; var updateIndexes = function(that, column) { updateColumnIndexes(that); updateColumnGroupIndexes(that, column); updateColumnSortIndexes(that, column); updateColumnVisibleIndexes(that, column) }; var resetColumnsCache = function(that) { that._visibleColumns = void 0; that._fixedColumns = void 0; that._rowCount = void 0; that._bandColumnsCache = void 0 }; var assignColumns = function(that, columns) { that._columns = columns; resetColumnsCache(that); that.updateColumnDataTypes() }; var updateColumnChanges = function(that, changeType, optionName, columnIndex) { var columnChanges = that._columnChanges || { optionNames: { length: 0 }, changeTypes: { length: 0 }, columnIndex: columnIndex }; optionName = optionName || "all"; optionName = optionName.split(".")[0]; var changeTypes = columnChanges.changeTypes; if (changeType && !changeTypes[changeType]) { changeTypes[changeType] = true; changeTypes.length++ } var optionNames = columnChanges.optionNames; if (optionName && !optionNames[optionName]) { optionNames[optionName] = true; optionNames.length++ } if (void 0 === columnIndex || columnIndex !== columnChanges.columnIndex) { delete columnChanges.columnIndex } that._columnChanges = columnChanges; resetColumnsCache(that) }; var fireColumnsChanged = function(that) { var onColumnsChanging = that.option("onColumnsChanging"), columnChanges = that._columnChanges; if (that.isInitialized() && !that._updateLockCount && columnChanges) { if (onColumnsChanging) { that._updateLockCount++; onColumnsChanging(extend({ component: that.component }, columnChanges)); that._updateLockCount-- } that._columnChanges = void 0; if (columnChanges.optionNames && (columnChanges.optionNames.dataField || columnChanges.optionNames.lookup)) { that.reinit() } else { that.columnsChanged.fire(columnChanges) } } }; var columnOptionCore = function(that, column, optionName, value, notFireEvent) { var prevValue, optionSetter, columns, changeType, optionGetter = dataCoreUtils.compileGetter(optionName), columnIndex = column.index; if (3 === arguments.length) { return optionGetter(column, { functionsAsIs: true }) } prevValue = optionGetter(column, { functionsAsIs: true }); if (prevValue !== value) { if ("groupIndex" === optionName) { changeType = "grouping" } else { if ("sortIndex" === optionName || "sortOrder" === optionName) { changeType = "sorting" } else { changeType = "columns" } } optionSetter = dataCoreUtils.compileSetter(optionName); optionSetter(column, value, { functionsAsIs: true }); if (!isDefined(prevValue) && !isDefined(value) && 0 !== optionName.indexOf("buffer")) { notFireEvent = true } if (!notFireEvent) { if (inArray(optionName, USER_STATE_FIELD_NAMES) < 0 && "visibleWidth" !== optionName) { columns = that.option("columns"); column = columns && columns[columnIndex]; if (commonUtils.isString(column)) { column = columns[columnIndex] = { dataField: column } } if (column) { optionSetter(column, value, { functionsAsIs: true }) } } updateColumnChanges(that, changeType, optionName, columnIndex) } else { resetColumnsCache(that) } } }; var isSortOrderValid = function(sortOrder) { return "asc" === sortOrder || "desc" === sortOrder }; var addExpandColumn = function(that) { that.addCommandColumn({ command: "expand", width: "auto", cssClass: COMMAND_EXPAND_CLASS, allowEditing: false, allowGrouping: false, allowSorting: false, allowResizing: false, allowReordering: false, allowHiding: false }) }; var defaultSetCellValue = function(data, value) { var name, i, path = this.dataField.split("."), dotCount = path.length - 1; if (this.serializeValue) { value = this.serializeValue(value) } for (i = 0; i < dotCount; i++) { name = path[i]; data = data[name] = data[name] || {} } data[path[dotCount]] = value }; var getDataColumns = function(columns, rowIndex, bandColumnID) { var result = []; rowIndex = rowIndex || 0; columns[rowIndex] && $.each(columns[rowIndex], function(_, column) { if (column.ownerBand === bandColumnID || isDefined(column.groupIndex)) { if (!column.isBand || !column.colspan) { if (!column.command || rowIndex < 1) { result.push(column) } } else { result.push.apply(result, getDataColumns(columns, rowIndex + 1, column.index)) } } }); return result }; var getRowCount = function(that, level, bandColumnIndex) { var rowCount = 1, bandColumnsCache = that.getBandColumnsCache(), columnParentByIndex = bandColumnsCache.columnParentByIndex; that._columns.forEach(function(column) { var parents = getParentBandColumns(column.index, columnParentByIndex), invisibleParents = parents.filter(function(column) { return !column.visible }); if (column.visible && !invisibleParents.length) { rowCount = Math.max(rowCount, parents.length + 1) } }); return rowCount }; var getFixedPosition = function(column) { return !column.fixedPosition ? "left" : column.fixedPosition }; var processExpandColumns = function(columns, expandColumns, columnIndex) { var rowspan = columns[columnIndex] && columns[columnIndex].rowspan, expandColumnsByRow = expandColumns.slice(0); if (rowspan > 1) { expandColumnsByRow = $.map(expandColumnsByRow, function(expandColumn) { return extend({}, expandColumn, { rowspan: rowspan }) }) } expandColumnsByRow.unshift(columnIndex, 0); columns.splice.apply(columns, expandColumnsByRow); return rowspan || 1 }; var digitsCount = function(number) { var i; for (i = 0; number > 1; i++) { number /= 10 } return i }; var numberToString = function(number, digitsCount) { var str = number ? number.toString() : "0"; while (str.length < digitsCount) { str = "0" + str } return str }; return { _getFirstItems: function(dataSource) { var groupsCount, items = []; var getFirstItemsCore = function(items, groupsCount) { var i, childItems; if (!items || !groupsCount) { return items } for (i = 0; i < items.length; i++) { childItems = getFirstItemsCore(items[i].items || items[i].collapsedItems, groupsCount - 1); if (childItems && childItems.length) { return childItems } } }; if (dataSource && dataSource.items().length > 0) { groupsCount = normalizeSortingInfo(dataSource.group()).length; items = getFirstItemsCore(dataSource.items(), groupsCount) || [] } return items }, _endUpdateCore: function() { fireColumnsChanged(this) }, init: function() { var that = this, columns = that.option("columns"); that._commandColumns = that._commandColumns || []; that._columns = that._columns || []; addExpandColumn(that); that._isColumnsFromOptions = !!columns; if (that._isColumnsFromOptions) { assignColumns(that, columns ? createColumnsFromOptions(that, columns) : []); applyUserState(that) } else { assignColumns(that, that._columnsUserState ? createColumnsFromOptions(that, that._columnsUserState) : that._columns) } if (that._dataSourceApplied) { that.applyDataSource(that._dataSource, true) } else { updateIndexes(that) } }, callbackNames: function() { return ["columnsChanged"] }, optionChanged: function(args) { switch (args.name) { case "adaptColumnWidthByRatio": args.handled = true; break; case "columns": args.handled = true; if (args.name === args.fullName) { this._columnsUserState = null; this._ignoreColumnOptionNames = null; this.init() } else { this._columnOptionChanged(args) } break; case "commonColumnSettings": case "columnAutoWidth": case "allowColumnResizing": case "allowColumnReordering": case "columnFixing": case "grouping": case "groupPanel": case "regenerateColumnsByVisibleItems": case "customizeColumns": case "editing": case "columnHidingEnabled": case "dateSerializationFormat": case "columnResizingMode": case "columnMinWidth": args.handled = true; this.reinit(); break; case "rtlEnabled": this.reinit(); break; default: this.callBase(args) } }, _columnOptionChanged: function(args) { var column, columnIndexes = [], columnOptionValue = {}, columnOptionName = args.fullName.replace(/columns\[(\d+)\]\.?/gi, function(_, columnIndex) { columnIndexes.push(parseInt(columnIndex)); return "" }); if (columnIndexes.length) { column = getColumnByIndexes(this, columnIndexes); if (columnOptionName) { columnOptionValue[columnOptionName] = args.value } else { columnOptionValue = args.value } } if (column) { this.columnOption(column.index, columnOptionValue) } }, publicMethods: function() { return ["addColumn", "deleteColumn", "columnOption", "columnCount", "clearSorting", "clearGrouping", "getVisibleColumns"] }, applyDataSource: function(dataSource, forceApplying) { var that = this, isDataSourceLoaded = dataSource && dataSource.isLoaded(); that._dataSource = dataSource; if (!that._dataSourceApplied || 0 === that._dataSourceColumnsCount || forceApplying || that.option("regenerateColumnsByVisibleItems")) { if (isDataSourceLoaded) { if (!that._isColumnsFromOptions) { assignColumns(that, createColumnsFromDataSource(that, dataSource)); that._dataSourceColumnsCount = that._columns.length; applyUserState(that) } return that.updateColumns(dataSource, forceApplying) } else { that._dataSourceApplied = false } } else { if (isDataSourceLoaded && !that.isAllDataTypesDefined(true) && that.updateColumnDataTypes(dataSource)) { updateColumnChanges(that, "columns"); fireColumnsChanged(that) } } }, reset: function() { this._dataSourceApplied = false; this._dataSourceColumnsCount = void 0; this.reinit() }, reinit: function() { this._columnsUserState = this.getUserState(); this._ignoreColumnOptionNames = null; this.init() }, isInitialized: function() { return !!this._columns.length || !!this.option("columns") }, isDataSourceApplied: function() { return this._dataSourceApplied }, getCommonSettings: function() { var commonColumnSettings = this.option("commonColumnSettings") || {}, groupingOptions = this.option("grouping") || {}, groupPanelOptions = this.option("groupPanel") || {}; return extend({ allowFixing: this.option("columnFixing.enabled"), allowResizing: this.option("allowColumnResizing"), allowReordering: this.option("allowColumnReordering"), minWidth: this.option("columnMinWidth"), autoExpandGroup: groupingOptions.autoExpandAll, allowCollapsing: groupingOptions.allowCollapsing, allowGrouping: groupPanelOptions.allowColumnDragging && groupPanelOptions.visible || groupingOptions.contextMenuEnabled }, commonColumnSettings) }, isColumnOptionUsed: function(optionName) { for (var i = 0; i < this._columns.length; i++) { if (this._columns[i][optionName]) { return true } } }, isAllDataTypesDefined: function(checkSerializers) { var i, columns = this._columns; if (!columns.length) { return false } for (i = 0; i < columns.length; i++) { if (!columns[i].dataType || checkSerializers && columns[i].deserializeValue && void 0 === columns[i].serializationFormat) { return false } } return true }, getColumns: function() { return this._columns }, getGroupColumns: function() { var result = []; $.each(this._columns, function() { var column = this; if (isDefined(column.groupIndex)) { result[column.groupIndex] = column } }); return result }, getVisibleColumns: function(rowIndex) { this._visibleColumns = this._visibleColumns || this._getVisibleColumnsCore(); rowIndex = isDefined(rowIndex) ? rowIndex : this._visibleColumns.length - 1; return this._visibleColumns[rowIndex] || [] }, getFixedColumns: function(rowIndex) { this._fixedColumns = this._fixedColumns || this._getFixedColumnsCore(); rowIndex = isDefined(rowIndex) ? rowIndex : this._fixedColumns.length - 1; return this._fixedColumns[rowIndex] || [] }, _getFixedColumnsCore: function() { var i, j, column, prevColumn, notFixedColumnCount, transparentColumnIndex, lastFixedPosition, visibleColumns, that = this, result = [], rowCount = that.getRowCount(), isColumnFixing = that._isColumnFixing(), transparentColumn = { command: "transparent" }, transparentColspan = 0; if (isColumnFixing) { for (i = 0; i <= rowCount; i++) { notFixedColumnCount = 0; lastFixedPosition = null; transparentColumnIndex = null; visibleColumns = that.getVisibleColumns(i); for (j = 0; j < visibleColumns.length; j++) { prevColumn = visibleColumns[j - 1]; column = visibleColumns[j]; if (!column.command) { if (!column.fixed) { if (0 === i) { if (column.isBand && column.colspan) { transparentColspan += column.colspan } else { transparentColspan++ } } notFixedColumnCount++; if (!isDefined(transparentColumnIndex)) { transparentColumnIndex = j } } else { if (prevColumn && prevColumn.fixed && getFixedPosition(prevColumn) !== getFixedPosition(column)) { if (!isDefined(transparentColumnIndex)) { transparentColumnIndex = j } } else { lastFixedPosition = column.fixedPosition } } } } if (0 === i && (0 === notFixedColumnCount || notFixedColumnCount >= visibleColumns.length)) { return [] } if (!isDefined(transparentColumnIndex)) { transparentColumnIndex = "right" === lastFixedPosition ? 0 : visibleColumns.length } result[i] = visibleColumns.slice(0); if (!transparentColumn.colspan) { transparentColumn.colspan = transparentColspan } result[i].splice(transparentColumnIndex, notFixedColumnCount, transparentColumn) } } return result }, _isColumnFixing: function() { var isColumnFixing = this.option("columnFixing.enabled"); !isColumnFixing && $.each(this._columns, function(_, column) { if (column.fixed) { isColumnFixing = true; return false } }); return isColumnFixing }, _getExpandColumnsCore: function() { return this.getGroupColumns() }, getExpandColumns: function() { var expandColumn, expandColumns = this._getExpandColumnsCore(); if (expandColumns.length) { expandColumn = this.columnOption("command:expand") } expandColumns = $.map(expandColumns, function(column) { return extend({}, column, { visibleWidth: null }, expandColumn, { index: column.index }) }); return expandColumns }, getBandColumnsCache: function() { if (!this._bandColumnsCache) { var columns = this._columns, columnChildrenByIndex = {}, columnParentByIndex = {}; columns.forEach(function(column) { var parentIndex = column.ownerBand, parent = columns[parentIndex]; if (column.colspan) { column.colspan = void 0 } if (column.rowspan) { column.rowspan = void 0 } if (parent) { columnParentByIndex[column.index] = parent } else { parentIndex = -1 } columnChildrenByIndex[parentIndex] = columnChildrenByIndex[parentIndex] || []; columnChildrenByIndex[parentIndex].push(column) }); this._bandColumnsCache = { columnChildrenByIndex: columnChildrenByIndex, columnParentByIndex: columnParentByIndex } } return this._bandColumnsCache }, _isColumnVisible: function(column) { return column.visible && this.isParentColumnVisible(column.index) }, _getVisibleColumnsCore: function() { var i, firstPositiveIndexColumn, isFixedToEnd, that = this, result = [], rowspanExpandColumns = 0, expandColumns = that.getExpandColumns(), rowCount = that.getRowCount(), positiveIndexedColumns = [], negativeIndexedColumns = [], notGroupedColumnsCount = 0, rtlEnabled = that.option("rtlEnabled"), columns = extend(true, [], that._columns.length ? that._commandColumns.concat(that._columns) : []), bandColumnsCache = that.getBandColumnsCache(), columnDigitsCount = digitsCount(columns.length); processBandColumns(that, columns, bandColumnsCache); for (i = 0; i < rowCount; i++) { result[i] = []; negativeIndexedColumns[i] = [{}]; positiveIndexedColumns[i] = [{}, {}, {}] } $.each(columns, function() { var rowIndex, indexedColumns, column = this, visibleIndex = column.visibleIndex, parentBandColumns = getParentBandColumns(column.index, bandColumnsCache.columnParentByIndex), visible = that._isColumnVisible(column); if (visible && (!isDefined(column.groupIndex) || column.showWhenGrouped)) { rowIndex = parentBandColumns.length; if (visibleIndex < 0) { visibleIndex = -visibleIndex; indexedColumns = negativeIndexedColumns[rowIndex] } else { column.fixed = parentBandColumns.length ? parentBandColumns[0].fixed : column.fixed; column.fixedPosition = parentBandColumns.length ? parentBandColumns[0].fixedPosition : column.fixedPosition; if (column.fixed || column.command) { isFixedToEnd = "right" === column.fixedPosition; if (rtlEnabled) { isFixedToEnd = !isFixedToEnd } if (isFixedToEnd || column.command) { indexedColumns = positiveIndexedColumns[rowIndex][2] } else { indexedColumns = positiveIndexedColumns[rowIndex][0] } } else { indexedColumns = positiveIndexedColumns[rowIndex][1] } } if (parentBandColumns.length) { visibleIndex = numberToString(visibleIndex, columnDigitsCount); for (i = parentBandColumns.length - 1; i >= 0; i--) { visibleIndex = numberToString(parentBandColumns[i].visibleIndex, columnDigitsCount) + visibleIndex } } indexedColumns[visibleIndex] = indexedColumns[visibleIndex] || []; indexedColumns[visibleIndex].push(column); notGroupedColumnsCount++ } }); $.each(result, function(rowIndex) { objectUtils.orderEach(negativeIndexedColumns[rowIndex], function(_, columns) { result[rowIndex].unshift.apply(result[rowIndex], columns) }); firstPositiveIndexColumn = result[rowIndex].length; $.each(positiveIndexedColumns[rowIndex], function(index, columnsByFixing) { objectUtils.orderEach(columnsByFixing, function(_, columnsByVisibleIndex) { result[rowIndex].push.apply(result[rowIndex], columnsByVisibleIndex) }) }); if (rowspanExpandColumns < rowIndex + 1) { rowspanExpandColumns += processExpandColumns(result[rowIndex], expandColumns, firstPositiveIndexColumn) } }); result.push(getDataColumns(result)); if (!notGroupedColumnsCount && that._columns.length) { result[rowCount].push({ command: "empty" }) } return result }, getInvisibleColumns: function(columns, bandColumnIndex) { var hiddenColumnsByBand, that = this, result = []; columns = columns || that._columns; $.each(columns, function(_, column) { if (column.ownerBand !== bandColumnIndex) { return } if (column.isBand) { if (!column.visible) { hiddenColumnsByBand = that.getChildrenByBandColumn(column.index) } else { hiddenColumnsByBand = that.getInvisibleColumns(that.getChildrenByBandColumn(column.index), column.index) } if (hiddenColumnsByBand.length) { result.push(column); result = result.concat(hiddenColumnsByBand) } return } if (!column.visible) { result.push(column) } }); return result }, getChooserColumns: function(getAllColumns) { var columns = getAllColumns ? this.getColumns() : this.getInvisibleColumns(); return commonUtils.grep(columns, function(column) { return column.showInColumnChooser }) }, allowMoveColumn: function(fromVisibleIndex, toVisibleIndex, sourceLocation, targetLocation) { var that = this, columnIndex = getColumnIndexByVisibleIndex(that, fromVisibleIndex, sourceLocation), sourceColumn = that._columns[columnIndex]; if (sourceColumn && (sourceColumn.allowReordering || sourceColumn.allowGrouping || sourceColumn.allowHiding)) { if (sourceLocation === targetLocation) { if (sourceLocation === COLUMN_CHOOSER_LOCATION) { return false } fromVisibleIndex = commonUtils.isObject(fromVisibleIndex) ? fromVisibleIndex.columnIndex : fromVisibleIndex; toVisibleIndex = commonUtils.isObject(toVisibleIndex) ? toVisibleIndex.columnIndex : toVisibleIndex; return fromVisibleIndex !== toVisibleIndex && fromVisibleIndex + 1 !== toVisibleIndex } else { if (sourceLocation === GROUP_LOCATION && targetLocation !== COLUMN_CHOOSER_LOCATION || targetLocation === GROUP_LOCATION) { return sourceColumn && sourceColumn.allowGrouping } else { if (sourceLocation === COLUMN_CHOOSER_LOCATION || targetLocation === COLUMN_CHOOSER_LOCATION) { return sourceColumn && sourceColumn.allowHiding } } } return true } return false }, moveColumn: function(fromVisibleIndex, toVisibleIndex, sourceLocation, targetLocation) { var targetGroupIndex, column, that = this, fromIndex = getColumnIndexByVisibleIndex(that, fromVisibleIndex, sourceLocation), toIndex = getColumnIndexByVisibleIndex(that, toVisibleIndex, targetLocation), isGroupMoving = sourceLocation === GROUP_LOCATION || targetLocation === GROUP_LOCATION; if (fromIndex >= 0) { column = that._columns[fromIndex]; toVisibleIndex = commonUtils.isObject(toVisibleIndex) ? toVisibleIndex.columnIndex : toVisibleIndex; targetGroupIndex = toIndex >= 0 ? that._columns[toIndex].groupIndex : -1; if (isDefined(column.groupIndex) && sourceLocation === GROUP_LOCATION) { if (targetGroupIndex > column.groupIndex) { targetGroupIndex-- } delete column.groupIndex; delete column.sortOrder; updateColumnGroupIndexes(that) } if (targetLocation === GROUP_LOCATION) { moveColumnToGroup(that, column, targetGroupIndex); updateColumnGroupIndexes(that) } else { if (toVisibleIndex >= 0) { var targetColumn = that._columns[toIndex]; if (!targetColumn || column.ownerBand !== targetColumn.ownerBand) { column.visibleIndex = void 0 } else { if (column.fixed ^ targetColumn.fixed) { column.visibleIndex = void 0 } else { column.visibleIndex = targetColumn.visibleIndex } } updateColumnVisibleIndexes(that, column) } } var isVisible = targetLocation !== COLUMN_CHOOSER_LOCATION, changeType = isGroupMoving ? "grouping" : "columns"; if (column.visible !== isVisible) { column.visible = isVisible; updateColumnChanges(that, changeType, "visible", column.index) } else { updateColumnChanges(that, changeType) } fireColumnsChanged(that) } }, changeSortOrder: function(columnIndex, sortOrder) { var that = this, sortingOptions = that.option("sorting"), sortingMode = sortingOptions && sortingOptions.mode, needResetSorting = "single" === sortingMode || !sortOrder, allowSorting = "single" === sortingMode || "multiple" === sortingMode, column = that._columns[columnIndex], nextSortOrder = function(column) { if ("ctrl" === sortOrder) { if (!("sortOrder" in column && "sortIndex" in column)) { return false } delete column.sortOrder; delete column.sortIndex } else { if (isDefined(column.groupIndex) || isDefined(column.sortIndex)) { column.sortOrder = "desc" === column.sortOrder ? "asc" : "desc"; } else { column.sortOrder = "asc" } } return true }, isSortingChanged = false; if (allowSorting && column && column.allowSorting) { if (needResetSorting && !isDefined(column.groupIndex)) { $.each(that._columns, function(index) { if (index !== columnIndex && this.sortOrder && !isDefined(this.groupIndex)) { delete this.sortOrder; delete this.sortIndex; isSortingChanged = true } }) } if (isSortOrderValid(sortOrder)) { if (column.sortOrder !== sortOrder) { column.sortOrder = sortOrder; isSortingChanged = true } } else { if ("none" === sortOrder) { if (column.sortOrder) { delete column.sortIndex; delete column.sortOrder; isSortingChanged = true } } else { isSortingChanged = nextSortOrder(column) } } } if (isSortingChanged) { updateColumnSortIndexes(that); updateColumnChanges(that, "sorting"); fireColumnsChanged(that) } }, getSortDataSourceParameters: function(useLocalSelector) { var that = this, sortColumns = [], sort = []; $.each(that._columns, function() { if ((this.dataField || this.selector || this.calculateCellValue) && isDefined(this.sortIndex) && !isDefined(this.groupIndex)) { sortColumns[this.sortIndex] = this } }); $.each(sortColumns, function() { var sortOrder = this && this.sortOrder; if (isSortOrderValid(sortOrder)) { sort.push({ selector: this.calculateSortValue || this.displayField || this.calculateDisplayValue || useLocalSelector && this.selector || this.dataField || this.calculateCellValue, desc: "desc" === this.sortOrder }) } }); return sort.length > 0 ? sort : null }, getGroupDataSourceParameters: function(useLocalSelector) { var group = []; $.each(this.getGroupColumns(), function() { var selector = this.calculateGroupValue || this.displayField || this.calculateDisplayValue || useLocalSelector && this.selector || this.dataField || this.calculateCellValue; if (selector) { group.push({ selector: selector, desc: "desc" === this.sortOrder, isExpanded: !!this.autoExpandGroup }) } }); return group.length > 0 ? group : null }, refresh: function(updateNewLookupsOnly) { var deferreds = []; $.each(this._columns, function() { var lookup = this.lookup; if (lookup && !this.calculateDisplayValue) { if (updateNewLookupsOnly && lookup.valueMap) { return } if (lookup.update) { deferreds.push(lookup.update()) } } }); return when.apply($, deferreds).done(resetColumnsCache.bind(null, this)) }, _updateColumnOptions: function(column) { column.selector = column.selector || function(data) { return column.calculateCellValue(data) }; $.each(["calculateSortValue", "calculateGroupValue", "calculateDisplayValue"], function(_, calculateCallbackName) { var calculateCallback = column[calculateCallbackName]; if (commonUtils.isFunction(calculateCallback) && !calculateCallback.originalCallback) { column[calculateCallbackName] = function(data) { return calculateCallback.call(column, data) }; column[calculateCallbackName].originalCallback = calculateCallback } }); if (commonUtils.isString(column.calculateDisplayValue)) { column.displayField = column.calculateDisplayValue; column.calculateDisplayValue = dataCoreUtils.compileGetter(column.displayField) } if (column.calculateDisplayValue) { column.displayValueMap = column.displayValueMap || {} } updateSerializers(column, column.dataType); var lookup = column.lookup; if (lookup) { updateSerializers(lookup, lookup.dataType) } var dataType = lookup ? lookup.dataType : column.dataType; if (dataType) { column.alignment = column.alignment || getAlignmentByDataType(dataType, this.option("rtlEnabled")); column.format = column.format || gridCoreUtils.getFormatByDataType(dataType); column.customizeText = column.customizeText || getCustomizeTextByDataType(dataType); if (!isDefined(column.filterOperations)) { column.filterOperations = !lookup && DATATYPE_OPERATIONS[dataType] || [] } column.defaultFilterOperation = column.filterOperations && column.filterOperations[0] || "="; column.showEditorAlways = isDefined(column.showEditorAlways) ? column.showEditorAlways : "boolean" === dataType && !column.cellTemplate } }, updateColumnDataTypes: function(dataSource) { var that = this, dateSerializationFormat = that.option("dateSerializationFormat"), firstItems = that._getFirstItems(dataSource), isColumnDataTypesUpdated = false; $.each(that._columns, function(index, column) { var i, value, dataType, lookupDataType, valueDataType, lookup = column.lookup; if ("date" === column.dataType && void 0 === column.serializationFormat) { column.serializationFormat = dateSerializationFormat } if (lookup && "date" === lookup.dataType && void 0 === column.serializationFormat) { lookup.serializationFormat = dateSerializationFormat } if (column.calculateCellValue && firstItems.length) { if (!column.dataType || lookup && !lookup.dataType) { for (i = 0; i < firstItems.length; i++) { value = column.calculateCellValue(firstItems[i]); valueDataType = column.dataType || getValueDataType(value); dataType = dataType || valueDataType; if (dataType && valueDataType && dataType !== valueDataType) { dataType = "string" } if (lookup) { valueDataType = lookup.dataType || getValueDataType(gridCoreUtils.getDisplayValue(column, value, firstItems[i])); lookupDataType = lookupDataType || valueDataType; if (lookupDataType && valueDataType && lookupDataType !== valueDataType) { lookupDataType = "string" } } } column.dataType = dataType; if (lookup) { lookup.dataType = lookupDataType } if (dataType) { isColumnDataTypesUpdated = true } } if (void 0 === column.serializationFormat || lookup && void 0 === lookup.serializationFormat) { for (i = 0; i < firstItems.length; i++) { value = column.calculateCellValue(firstItems[i], true); if (void 0 === column.serializationFormat) { column.serializationFormat = getSerializationFormat(column.dataType, value) } if (lookup && void 0 === lookup.serializationFormat) { lookup.serializationFormat = getSerializationFormat(lookup.dataType, lookup.calculateCellValue(value, true)) } } } } that._updateColumnOptions(column) }); return isColumnDataTypesUpdated }, _customizeColumns: function(columns) { var that = this, customizeColumns = that.option("customizeColumns"); if (customizeColumns) { customizeColumns(columns); assignColumns(that, createColumnsFromOptions(that, columns)) } }, updateColumns: function(dataSource, forceApplying) { var sortParameters, groupParameters, that = this; if (!forceApplying) { that.updateSortingGrouping(dataSource) } if (!dataSource || dataSource.isLoaded()) { sortParameters = dataSource ? dataSource.sort() || [] : that.getSortDataSourceParameters(); groupParameters = dataSource ? dataSource.group() || [] : that.getGroupDataSourceParameters(); that._customizeColumns(that._columns); updateIndexes(that); var columns = that._columns; return when(that.refresh(true)).always(function() { if (that._columns !== columns) { return } that._updateChanges(dataSource, { sorting: sortParameters, grouping: groupParameters }); fireColumnsChanged(that) }) } }, _updateChanges: function(dataSource, parameters) { var that = this; if (dataSource) { that.updateColumnDataTypes(dataSource); that._dataSourceApplied = true } if (!equalSortParameters(parameters.sorting, that.getSortDataSourceParameters())) { updateColumnChanges(that, "sorting") } if (!equalSortParameters(parameters.grouping, that.getGroupDataSourceParameters())) { updateColumnChanges(that, "grouping") } updateColumnChanges(that, "columns") }, updateSortingGrouping: function(dataSource, fromDataSource) { var sortParameters, groupParameters, columnsGroupParameters, columnsSortParameters, isColumnsChanged, that = this, updateSortGroupParameterIndexes = function(columns, sortParameters, indexParameterName) { var i, selector, isExpanded; $.each(columns, function(index, column) { delete column[indexParameterName]; if (sortParameters) { for (i = 0; i < sortParameters.length; i++) { selector = sortParameters[i].selector; isExpanded = sortParameters[i].isExpanded; if (selector === column.dataField || selector === column.name || selector === column.selector || selector === column.calculateCellValue || selector === column.calculateGroupValue) { column.sortOrder = column.sortOrder || (sortParameters[i].desc ? "desc" : "asc"); if (void 0 !== isExpanded) { column.autoExpandGroup = isExpanded } column[indexParameterName] = i; break } } } }) }; if (dataSource) { sortParameters = normalizeSortingInfo(dataSource.sort()); groupParameters = normalizeSortingInfo(dataSource.group()); columnsGroupParameters = that.getGroupDataSourceParameters(); columnsSortParameters = that.getSortDataSourceParameters(); if (!that._columns.length) { $.each(groupParameters, function(index, group) { that._columns.push(group.selector) }); $.each(sortParameters, function(index, sort) { that._columns.push(sort.selector) }); assignColumns(that, createColumnsFromOptions(that, that._columns)) } if ((fromDataSource || !columnsGroupParameters && !that._hasUserState) && !equalSortParameters(groupParameters, columnsGroupParameters)) { that.__groupingUpdated = true; updateSortGroupParameterIndexes(that._columns, groupParameters, "groupIndex"); if (fromDataSource) { updateColumnChanges(that, "grouping"); isColumnsChanged = true } } if ((fromDataSource || !columnsSortParameters && !that._hasUserState) && !equalSortParameters(sortParameters, columnsSortParameters)) { that.__sortingUpdated = true; updateSortGroupParameterIndexes(that._columns, sortParameters, "sortIndex"); if (fromDataSource) { updateColumnChanges(that, "sorting"); isColumnsChanged = true } } if (isColumnsChanged) { fireColumnsChanged(that) } } }, updateFilter: function(filter, remoteFiltering, columnIndex) { var that = this; if (!Array.isArray(filter)) { return filter } var column, i; filter = extend([], filter); columnIndex = filter.columnIndex || columnIndex; if (commonUtils.isString(filter[0])) { column = that.columnOption(filter[0]); if (remoteFiltering) { if (config().forceIsoDateParsing && column && column.serializeValue && filter.length > 1) { filter[filter.length - 1] = column.serializeValue(filter[filter.length - 1]) } } else { if (column && column.selector) { filter[0] = column.selector; filter[0].columnIndex = column.index } } } else { if (commonUtils.isFunction(filter[0])) { filter[0].columnIndex = columnIndex } } for (i = 0; i < filter.length; i++) { filter[i] = that.updateFilter(filter[i], remoteFiltering, columnIndex) } return filter }, columnCount: function() { return this._columns.length }, columnOption: function(identifier, option, value, notFireEvent) { var i, needUpdateIndexes, column, that = this, identifierOptionName = commonUtils.isString(identifier) && identifier.substr(0, identifier.indexOf(":")), columns = identifier < 0 || "command" === identifierOptionName ? that._commandColumns : that._columns; if (void 0 === identifier) { return } if (identifierOptionName) { identifier = identifier.substr(identifierOptionName.length + 1) } for (i = 0; i < columns.length; i++) { if (identifierOptionName) { if ("" + columns[i][identifierOptionName] === identifier) { column = columns[i]; break } } else { if (columns[i].index === identifier || columns[i].name === identifier || columns[i].dataField === identifier || columns[i].caption === identifier) { column = columns[i]; break } } } if (column) { if (1 === arguments.length) { return extend({}, column) } if (commonUtils.isString(option)) { if (2 === arguments.length) { return columnOptionCore(that, column, option) } else { needUpdateIndexes = needUpdateIndexes || COLUMN_INDEX_OPTIONS[option]; columnOptionCore(that, column, option, value, notFireEvent) } } else { if (commonUtils.isObject(option)) { $.each(option, function(optionName, value) { needUpdateIndexes = needUpdateIndexes || COLUMN_INDEX_OPTIONS[optionName]; columnOptionCore(that, column, optionName, value, notFireEvent) }) } } if (needUpdateIndexes) { updateIndexes(that, column) } fireColumnsChanged(that) } }, clearSorting: function() { var i, that = this, columnCount = this.columnCount(); that.beginUpdate(); for (i = 0; i < columnCount; i++) { that.columnOption(i, "sortOrder", void 0) } that.endUpdate() }, clearGrouping: function() { var i, that = this, columnCount = this.columnCount(); that.beginUpdate(); for (i = 0; i < columnCount; i++) { that.columnOption(i, "groupIndex", void 0) } that.endUpdate() }, getVisibleIndex: function(index, rowIndex) { var i, columns = this.getVisibleColumns(rowIndex); for (i = columns.length - 1; i >= 0; i--) { if (columns[i].index === index) { return i } } return -1 }, addColumn: function(options) { var that = this, column = createColumn(that, options); column.added = options; that._columns.push(column); updateIndexes(that, column); that.updateColumns(that._dataSource) }, deleteColumn: function(id) { var that = this, columnIndex = that.columnOption(id, "index"); if (columnIndex >= 0) { that._columns.splice(columnIndex, 1); updateIndexes(that); that.updateColumns(that._dataSource) } }, addCommandColumn: function(options) { var i, commandColumns = this._commandColumns; for (i = 0; i < commandColumns.length; i++) { if (commandColumns[i].command === options.command) { return } } commandColumns.push(options) }, getUserState: function() { var i, columns = this._columns, result = []; function handleStateField(index, value) { if (void 0 !== columns[i][value]) { result[i][value] = columns[i][value] } } for (i = 0; i < columns.length; i++) { result[i] = {}; $.each(USER_STATE_FIELD_NAMES, handleStateField) } return result }, setUserState: function(state) { var commonColumnSettings, that = this, ignoreColumnOptionNames = that.option("stateStoring.ignoreColumnOptionNames"); if (!ignoreColumnOptionNames) { ignoreColumnOptionNames = []; commonColumnSettings = that.getCommonSettings(); if (!that.option("columnChooser.enabled")) { ignoreColumnOptionNames.push("visible") } if ("none" === that.option("sorting.mode")) { ignoreColumnOptionNames.push("sortIndex", "sortOrder") } if (!commonColumnSettings.allowGrouping) { ignoreColumnOptionNames.push("groupIndex") } if (!commonColumnSettings.allowFixing) { ignoreColumnOptionNames.push("fixed", "fixedPosition") } if (!commonColumnSettings.allowResizing) { ignoreColumnOptionNames.push("width", "visibleWidth") } if (!that.option("filterRow.visible")) { ignoreColumnOptionNames.push("filterValue", "selectedFilterOperation") } if (!that.option("headerFilter.visible")) { ignoreColumnOptionNames.push("filterValues", "filterType") } } that._columnsUserState = state; that._ignoreColumnOptionNames = ignoreColumnOptionNames; that._hasUserState = !!state; that.init() }, _createCalculatedColumnOptions: function(columnOptions, bandColumn) { var getter, calculatedColumnOptions = {}, dataField = columnOptions.dataField; if (Array.isArray(columnOptions.columns) && columnOptions.columns.length || columnOptions.isBand) { calculatedColumnOptions.isBand = true; dataField = null } if (dataField) { if (commonUtils.isString(dataField)) { getter = dataCoreUtils.compileGetter(dataField); calculatedColumnOptions = { caption: inflector.captionize(dataField), calculateCellValue: function(data, skipDeserialization) { var value = getter(data); return this.deserializeValue && !skipDeserialization ? this.deserializeValue(value) : value }, setCellValue: defaultSetCellValue, parseValue: function(text) { var result, parsedValue, column = this; if ("number" === column.dataType) { if (commonUtils.isString(text)) { parsedValue = numberLocalization.parse(text); if (commonUtils.isNumeric(parsedValue)) { result = parsedValue } } else { if (isDefined(text)) { result = Number(text) } } } else { if ("boolean" === column.dataType) { if (text === column.trueText) { result = true } else { if (text === column.falseText) { result = false } } } else { if ("date" === column.dataType) { parsedValue = dateLocalization.parse(text, column.format); if (parsedValue) { result = parsedValue } } else { result = text } } } return result } } } calculatedColumnOptions.allowFiltering = true } else { calculatedColumnOptions.allowFiltering = !!columnOptions.calculateFilterExpression } calculatedColumnOptions.calculateFilterExpression = function() { return gridCoreUtils.defaultCalculateFilterExpression.apply(this, arguments) }; calculatedColumnOptions.createFilterExpression = function() { var result; if (this.calculateFilterExpression) { result = this.calculateFilterExpression.apply(this, arguments) } if (commonUtils.isFunction(result)) { result = [result, "=", true] } else { if (result) { result.columnIndex = this.index } } return result }; if (!dataField || !commonUtils.isString(dataField)) { extend(true, calculatedColumnOptions, { allowSorting: false, allowGrouping: false, calculateCellValue: function() { return null } }) } if (bandColumn) { calculatedColumnOptions.allowFixing = false } if (columnOptions.dataType) { calculatedColumnOptions.userDataType = columnOptions.dataType } if (columnOptions.selectedFilterOperation) { calculatedColumnOptions.defaultSelectedFilterOperation = columnOptions.selectedFilterOperation } if (columnOptions.lookup) { calculatedColumnOptions.lookup = { calculateCellValue: function(value, skipDeserialization) { if (this.valueExpr) { value = this.valueMap && this.valueMap[value] } return this.deserializeValue && !skipDeserialization ? this.deserializeValue(value) : value }, updateValueMap: function() { var calculateValue, calculateDisplayValue, item, i; this.valueMap = {}; if (this.items) { calculateValue = dataCoreUtils.compileGetter(this.valueExpr); calculateDisplayValue = dataCoreUtils.compileGetter(this.displayExpr); for (i = 0; i < this.items.length; i++) { item = this.items[i]; var displayValue = calculateDisplayValue(item); this.valueMap[calculateValue(item)] = displayValue; this.dataType = this.dataType || getValueDataType(displayValue) } } }, update: function() { var dataSourceOptions, that = this, dataSource = that.dataSource; if (dataSource) { if (commonUtils.isFunction(dataSource) && !isWrapped(dataSource)) { dataSource = dataSource({}) } if (commonUtils.isObject(dataSource) || Array.isArray(dataSource)) { if (that.valueExpr) { dataSourceOptions = normalizeDataSourceOptions(dataSource); dataSourceOptions.paginate = false; dataSource = new DataSourceModule.DataSource(dataSourceOptions); return dataSource.load().done(function(data) { that.items = data; that.updateValueMap && that.updateValueMap() }) } } else { errors.log("E1016") } } else { that.updateValueMap && that.updateValueMap() } } } } calculatedColumnOptions.resizedCallbacks = $.Callbacks(); if (columnOptions.resized) { calculatedColumnOptions.resizedCallbacks.add(columnOptions.resized.bind(columnOptions)) } $.each(calculatedColumnOptions, function(optionName) { var defaultOptionName; if (commonUtils.isFunction(calculatedColumnOptions[optionName]) && 0 !== optionName.indexOf("default")) { defaultOptionName = "default" + optionName.charAt(0).toUpperCase() + optionName.substr(1); calculatedColumnOptions[defaultOptionName] = calculatedColumnOptions[optionName] } }); return calculatedColumnOptions }, getRowCount: function() { this._rowCount = this._rowCount || getRowCount(this); return this._rowCount }, getRowIndex: function(columnIndex, alwaysGetRowIndex) { var column = this._columns[columnIndex], bandColumnsCache = this.getBandColumnsCache(); return column && (alwaysGetRowIndex || column.visible && !(column.command || isDefined(column.groupIndex))) ? getParentBandColumns(columnIndex, bandColumnsCache.columnParentByIndex).length : 0 }, getChildrenByBandColumn: function(bandColumnIndex, onlyVisibleDirectChildren) { var that = this, bandColumnsCache = that.getBandColumnsCache(), result = getChildrenByBandColumn(bandColumnIndex, bandColumnsCache.columnChildrenByIndex, !onlyVisibleDirectChildren); if (onlyVisibleDirectChildren) { return result.filter(function(column) { return column.visible && !column.command }).sort(function(column1, column2) { return column1.visibleIndex - column2.visibleIndex }) } return result }, isParentBandColumn: function(columnIndex, bandColumnIndex) { var result = false, column = this._columns[columnIndex], bandColumnsCache = this.getBandColumnsCache(), parentBandColumns = column && getParentBandColumns(columnIndex, bandColumnsCache.columnParentByIndex); if (parentBandColumns) { $.each(parentBandColumns, function(_, bandColumn) { if (bandColumn.index === bandColumnIndex) { result = true; return false } }) } return result }, isParentColumnVisible: function(columnIndex) { var result = true, bandColumnsCache = this.getBandColumnsCache(), bandColumns = columnIndex >= 0 && getParentBandColumns(columnIndex, bandColumnsCache.columnParentByIndex); bandColumns && $.each(bandColumns, function(_, bandColumn) { result = result && bandColumn.visible; return result }); return result } } }()) } } }, /*!*********************************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.data_controller.js ***! \*********************************************************/ function(module, exports, __webpack_require__) { var gridCore = __webpack_require__( /*! ./ui.data_grid.core */ 348), dataSourceAdapterProvider = __webpack_require__( /*! ./ui.data_grid.data_source_adapter */ 358), dataControllerModule = __webpack_require__( /*! ../grid_core/ui.grid_core.data_controller */ 360); exports.DataController = dataControllerModule.controllers.data.inherit(function() { return { _getDataSourceAdapter: function() { return dataSourceAdapterProvider } } }()); gridCore.registerModule("data", { defaultOptions: dataControllerModule.defaultOptions, controllers: { data: exports.DataController } }) }, /*!*************************************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.data_source_adapter.js ***! \*************************************************************/ function(module, exports, __webpack_require__) { var DataSourceAdapter = __webpack_require__( /*! ../grid_core/ui.grid_core.data_source_adapter */ 359); module.exports = { extend: function(extender) { DataSourceAdapter = DataSourceAdapter.inherit(extender) }, create: function(component) { return new DataSourceAdapter(component) } } }, /*!*************************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.data_source_adapter.js ***! \*************************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), gridCore = __webpack_require__( /*! ../data_grid/ui.data_grid.core */ 348), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), typeUtils = __webpack_require__( /*! ../../core/utils/type */ 12), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, ArrayStore = __webpack_require__( /*! ../../data/array_store */ 158), when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when; module.exports = gridCore.Controller.inherit(function() { function cloneItems(items, groupCount) { if (items) { items = items.slice(0); if (groupCount) { for (var i = 0; i < items.length; i++) { items[i] = extend({ key: items[i].key }, items[i]); items[i].items = cloneItems(items[i].items, groupCount - 1) } } } return items } function calculateOperationTypes(loadOptions, lastLoadOptions) { var operationTypes = {}; if (lastLoadOptions) { operationTypes = { sorting: !gridCore.equalSortParameters(loadOptions.sort, lastLoadOptions.sort), grouping: !gridCore.equalSortParameters(loadOptions.group, lastLoadOptions.group, true), filtering: !gridCore.equalFilterParameters(loadOptions.filter, lastLoadOptions.filter), skip: loadOptions.skip !== lastLoadOptions.skip, take: loadOptions.take !== lastLoadOptions.take }; operationTypes.reload = operationTypes.sorting || operationTypes.grouping || operationTypes.filtering; operationTypes.paging = operationTypes.skip || operationTypes.take } return operationTypes } function executeTask(action, timeout) { if (commonUtils.isDefined(timeout)) { commonUtils.executeAsync(action, timeout) } else { action() } } return { init: function(dataSource, remoteOperations) { var that = this; that._dataSource = dataSource; that._remoteOperations = remoteOperations || {}; that._isLastPage = !dataSource.isLastPage(); that._hasLastPage = false; that._currentTotalCount = 0; that.changed = $.Callbacks(); that.loadingChanged = $.Callbacks(); that.loadError = $.Callbacks(); that.customizeStoreLoadOptions = $.Callbacks(); that._dataChangedHandler = that._handleDataChanged.bind(that); that._dataLoadingHandler = that._handleDataLoading.bind(that); that._dataLoadedHandler = that._handleDataLoaded.bind(that); that._loadingChangedHandler = that._handleLoadingChanged.bind(that); that._loadErrorHandler = that._handleLoadError.bind(that); dataSource.on("changed", that._dataChangedHandler); dataSource.on("customizeStoreLoadOptions", that._dataLoadingHandler); dataSource.on("customizeLoadResult", that._dataLoadedHandler); dataSource.on("loadingChanged", that._loadingChangedHandler); dataSource.on("loadError", that._loadErrorHandler); $.each(dataSource, function(memberName, member) { if (!that[memberName] && commonUtils.isFunction(member)) { that[memberName] = function() { return this._dataSource[memberName].apply(this._dataSource, arguments) } } }) }, remoteOperations: function() { return this._remoteOperations }, dispose: function(isSharedDataSource) { var that = this, dataSource = that._dataSource; dataSource.off("changed", that._dataChangedHandler); dataSource.off("customizeStoreLoadOptions", that._dataLoadingHandler); dataSource.off("customizeLoadResult", that._dataLoadedHandler); dataSource.off("loadingChanged", that._loadingChangedHandler); dataSource.off("loadError", that._loadErrorHandler); if (!isSharedDataSource) { dataSource.dispose() } }, refresh: function(options, isReload, operationTypes) { var that = this, dataSource = that._dataSource; if (isReload || operationTypes.reload) { that._currentTotalCount = 0; that._isLastPage = !dataSource.paginate(); that._hasLastPage = that._isLastPage } }, _customizeRemoteOperations: function(options, isReload, operationTypes) { var that = this, cachedStoreData = that._cachedStoreData, cachedPagingData = that._cachedPagingData; if (isReload) { cachedStoreData = void 0; cachedPagingData = void 0 } else { if (operationTypes.reload) { cachedPagingData = void 0 } $.each(operationTypes, function(operationType, value) { if (value && options.remoteOperations[operationType]) { cachedStoreData = void 0; cachedPagingData = void 0 } }) } if (cachedPagingData) { options.remoteOperations.paging = false } options.cachedStoreData = cachedStoreData; options.cachedPagingData = cachedPagingData; if (!options.isCustomLoading) { that._cachedStoreData = cachedStoreData; that._cachedPagingData = cachedPagingData } }, _handleDataLoading: function(options) { var loadOptions, operationTypes, that = this, dataSource = that._dataSource, lastLoadOptions = that._lastLoadOptions; that.customizeStoreLoadOptions.fire(options); options.delay = this.option("loadingTimeout"); options.originalStoreLoadOptions = options.storeLoadOptions; options.remoteOperations = extend({}, this.remoteOperations()); var isReload = !that.isLoaded() && !that._isRefreshing; loadOptions = extend({}, options.storeLoadOptions); operationTypes = calculateOperationTypes(loadOptions, lastLoadOptions); that._customizeRemoteOperations(options, isReload, operationTypes); if (!options.isCustomLoading) { that._lastLoadOptions = loadOptions; that._isRefreshing = true; when(that.refresh(options, isReload, operationTypes)).always(function() { if (that._lastOperationId === options.operationId) { that.load() } that._isRefreshing = false }); dataSource.cancel(that._lastOperationId); that._lastOperationId = options.operationId; if (that._isRefreshing) { dataSource.cancel(that._lastOperationId) } } this._handleDataLoadingCore(options) }, _handleDataLoadingCore: function(options) { var remoteOperations = options.remoteOperations; options.loadOptions = {}; var localLoadOptionNames = { filter: !remoteOperations.filtering, sort: !remoteOperations.sorting, group: !remoteOperations.grouping, summary: !remoteOperations.summary, skip: !remoteOperations.paging, take: !remoteOperations.paging, requireTotalCount: !remoteOperations.paging }; $.each(options.storeLoadOptions, function(optionName, optionValue) { if (localLoadOptionNames[optionName]) { options.loadOptions[optionName] = optionValue; delete options.storeLoadOptions[optionName] } }); options.data = options.cachedStoreData }, _handleDataLoaded: function(options) { var loadOptions = options.loadOptions, localPaging = options.remoteOperations && !options.remoteOperations.paging, isCaching = false !== this.option("cacheEnabled") && localPaging && options.storeLoadOptions, needStoreCache = isCaching && !options.isCustomLoading; if (!loadOptions) { this._dataSource.cancel(options.operationId); return } if (localPaging) { options.skip = loadOptions.skip; options.take = loadOptions.take; delete loadOptions.skip; delete loadOptions.take } if (loadOptions.group) { loadOptions.group = options.group || loadOptions.group } var groupCount = gridCore.normalizeSortingInfo(options.storeLoadOptions.group || loadOptions.group).length; if (isCaching && options.cachedPagingData) { options.data = cloneItems(options.cachedPagingData, groupCount) } else { if (needStoreCache) { if (!this._cachedStoreData) { this._cachedStoreData = cloneItems(options.data, gridCore.normalizeSortingInfo(options.storeLoadOptions.group).length) } else { if (options.mergeStoreLoadData) { options.data = this._cachedStoreData = this._cachedStoreData.concat(options.data) } } } new ArrayStore(options.data).load(loadOptions).done(function(data) { options.data = data }); if (needStoreCache) { this._cachedPagingData = cloneItems(options.data, groupCount) } } if (loadOptions.requireTotalCount && localPaging) { options.extra = typeUtils.isPlainObject(options.extra) ? options.extra : {}; options.extra.totalCount = options.data.length } this._handleDataLoadedCore(options); options.storeLoadOptions = options.originalStoreLoadOptions }, _handleDataLoadedCore: function(options) { if (options.remoteOperations && !options.remoteOperations.paging && Array.isArray(options.data)) { if (void 0 !== options.skip) { options.data = options.data.slice(options.skip) } if (void 0 !== options.take) { options.data = options.data.slice(0, options.take) } } }, _handleLoadingChanged: function(isLoading) { this.loadingChanged.fire(isLoading) }, _handleLoadError: function(error) { this.changed.fire({ changeType: "loadError", error: error }); this.loadError.fire(error) }, _handleDataChanged: function(args) { var currentTotalCount, that = this, dataSource = that._dataSource, isLoading = false, itemsCount = that.itemsCount(); that._isLastPage = !itemsCount || !that.pageSize() || itemsCount < that.pageSize(); if (that._isLastPage) { that._hasLastPage = true } if (dataSource.totalCount() >= 0) { if (dataSource.pageIndex() >= that.pageCount()) { dataSource.pageIndex(that.pageCount() - 1); dataSource.load(); isLoading = true } } else { currentTotalCount = dataSource.pageIndex() * that.pageSize() + itemsCount; that._currentTotalCount = Math.max(that._currentTotalCount, currentTotalCount); if (0 === itemsCount && dataSource.pageIndex() >= that.pageCount()) { dataSource.pageIndex(that.pageCount() - 1); if ("infinite" !== that.option("scrolling.mode")) { dataSource.load(); isLoading = true } } } if (!isLoading) { this.component._optionCache = {}; this.changed.fire(args); this.component._optionCache = void 0 } }, isLastPage: function() { return this._isLastPage }, totalCount: function() { return parseInt(this._currentTotalCount || this._dataSource.totalCount()) }, itemsCount: function() { return this._dataSource.items().length }, totalItemsCount: function() { return this.totalCount() }, pageSize: function() { var dataSource = this._dataSource; if (!arguments.length && !dataSource.paginate()) { return 0 } return dataSource.pageSize.apply(dataSource, arguments) }, pageCount: function() { var that = this, count = that.totalItemsCount(), pageSize = that.pageSize(); if (pageSize && count > 0) { return Math.max(1, Math.ceil(count / pageSize)) } return 1 }, hasKnownLastPage: function() { return this._hasLastPage || this._dataSource.totalCount() >= 0 }, loadFromStore: function(loadOptions) { var dataSource = this._dataSource, d = $.Deferred(); if (!dataSource) { return } dataSource.store().load(loadOptions).done(function(data, extra) { if (data && !Array.isArray(data) && Array.isArray(data.data)) { extra = data; data = data.data } d.resolve(data, extra) }).fail(d.reject); return d }, load: function(options) { var store, loadResult, dataSourceLoadOptions, that = this, dataSource = that._dataSource, d = $.Deferred(); if (options) { store = dataSource.store(); dataSourceLoadOptions = dataSource.loadOptions(); loadResult = { storeLoadOptions: options, isCustomLoading: true }; $.each(store._customLoadOptions() || [], function(_, optionName) { if (!(optionName in loadResult.storeLoadOptions)) { loadResult.storeLoadOptions[optionName] = dataSourceLoadOptions[optionName] } }); dataSource._scheduleLoadCallbacks(d); that._handleDataLoading(loadResult); executeTask(function() { when(loadResult.data || that.loadFromStore(loadResult.storeLoadOptions)).done(function(data, extra) { loadResult.data = data; loadResult.extra = extra || {}; that._handleDataLoaded(loadResult); if (options.requireTotalCount && void 0 === loadResult.extra.totalCount) { loadResult.extra.totalCount = store.totalCount(loadResult.storeLoadOptions) } when(loadResult.data, loadResult.extra.totalCount).done(function(data, totalCount) { loadResult.extra.totalCount = totalCount; d.resolve(data, loadResult.extra) }).fail(d.reject) }).fail(d.reject) }, that.option("loadingTimeout")); return d.fail(function() { that.fireEvent("loadError", arguments) }).promise() } else { return dataSource.load() } }, reload: function(full) { return full ? this._dataSource.reload() : this._dataSource.load() } } }()) }, /*!*********************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.data_controller.js ***! \*********************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), modules = __webpack_require__( /*! ./ui.grid_core.modules */ 350), gridCoreUtils = __webpack_require__( /*! ./ui.grid_core.utils */ 349), ArrayStore = __webpack_require__( /*! ../../data/array_store */ 158), CustomStore = __webpack_require__( /*! ../../data/custom_store */ 162), errors = __webpack_require__( /*! ../widget/ui.errors */ 22), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, DataHelperMixin = __webpack_require__( /*! ../../data_helper */ 152), equalKeys = commonUtils.equalByValue, when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when; module.exports = { defaultOptions: function() { return { loadingTimeout: 0, dataSource: null, cacheEnabled: true, onDataErrorOccurred: null, remoteOperations: "auto", paging: { enabled: true, pageSize: void 0, pageIndex: void 0 } } }, controllers: { data: modules.Controller.inherit({}).include(DataHelperMixin).inherit(function() { var members = { init: function() { var that = this; that._items = []; that._columnsController = that.getController("columns"); that._columnsChangedHandler = that._handleColumnsChanged.bind(that); that._dataChangedHandler = that._handleDataChanged.bind(that); that._loadingChangedHandler = that._handleLoadingChanged.bind(that); that._loadErrorHandler = that._handleLoadError.bind(that); that._customizeStoreLoadOptionsHandler = that._handleCustomizeStoreLoadOptions.bind(that); that._columnsController.columnsChanged.add(that._columnsChangedHandler); that._isLoading = false; that._isCustomLoading = false; that._changes = []; that.createAction("onDataErrorOccurred"); that.dataErrorOccurred.add(function(error) { return that.executeAction("onDataErrorOccurred", { error: error }) }); that._refreshDataSource() }, callbackNames: function() { return ["changed", "loadingChanged", "dataErrorOccurred", "pageChanged", "dataSourceChanged"] }, callbackFlags: function(name) { if ("dataErrorOccurred" === name) { return { stopOnFalse: true } } }, publicMethods: function() { return ["beginCustomLoading", "endCustomLoading", "refresh", "filter", "clearFilter", "getCombinedFilter", "keyOf", "byKey", "getDataByKeys", "pageIndex", "pageSize", "pageCount", "totalCount", "_disposeDataSource", "getKeyByRowIndex", "getRowIndexByKey", "getDataSource", "getVisibleRows", "repaintRows"] }, optionChanged: function(args) { var that = this; function handled() { args.handled = true } function reload() { that._columnsController.reset(); that._items = []; that._refreshDataSource() } if ("dataSource" === args.name && args.name === args.fullName && args.value === args.previousValue) { handled(); that.refresh(); return } switch (args.name) { case "cacheEnabled": case "loadingTimeout": case "remoteOperations": handled(); break; case "keyExpr": case "dataSource": case "scrolling": case "paging": handled(); reload(); break; case "rtlEnabled": reload(); break; default: that.callBase(args) } }, isReady: function() { return !this._isLoading }, getDataSource: function() { return this._dataSource && this._dataSource._dataSource }, getCombinedFilter: function(returnDataField) { return this.combinedFilter(void 0, returnDataField) }, combinedFilter: function(filter, returnDataField) { var additionalFilter, that = this, dataSource = that._dataSource, columnsController = that._columnsController; if (dataSource) { if (void 0 === filter) { filter = dataSource.filter() } additionalFilter = that._calculateAdditionalFilter(); if (additionalFilter) { if (columnsController.isDataSourceApplied() || columnsController.isAllDataTypesDefined()) { filter = gridCoreUtils.combineFilters([additionalFilter, filter]) } } filter = columnsController.updateFilter(filter, returnDataField || dataSource.remoteOperations().filtering) } return filter }, _endUpdateCore: function() { var changes = this._changes; if (changes.length) { this._changes = []; this.updateItems(1 === changes.length ? changes[0] : {}) } }, _handleCustomizeStoreLoadOptions: function(e) { var columnsController = this._columnsController, dataSource = this._dataSource, storeLoadOptions = e.storeLoadOptions; if (e.isCustomLoading && !storeLoadOptions.isLoadingAll) { return } storeLoadOptions.filter = this.combinedFilter(storeLoadOptions.filter); if (!columnsController.isDataSourceApplied()) { columnsController.updateColumnDataTypes(dataSource) } this._columnsUpdating = true; columnsController.updateSortingGrouping(dataSource, !this._isFirstLoading); this._columnsUpdating = false; storeLoadOptions.sort = columnsController.getSortDataSourceParameters(); storeLoadOptions.group = columnsController.getGroupDataSourceParameters(); dataSource.sort(storeLoadOptions.sort); dataSource.group(storeLoadOptions.group); storeLoadOptions.sort = columnsController.getSortDataSourceParameters(!dataSource.remoteOperations().sorting); e.group = columnsController.getGroupDataSourceParameters(!dataSource.remoteOperations().grouping); this._isFirstLoading = false }, _handleColumnsChanged: function(e) { var filterValue, filterValues, that = this, changeTypes = e.changeTypes, optionNames = e.optionNames; var updateItemsHandler = function() { that._columnsController.columnsChanged.remove(updateItemsHandler); that.updateItems() }; if (changeTypes.sorting || changeTypes.grouping) { if (that._dataSource && !that._columnsUpdating) { that._dataSource.group(that._columnsController.getGroupDataSourceParameters()); that._dataSource.sort(that._columnsController.getSortDataSourceParameters()); that.reload() } that.pageChanged.fire() } else { if (changeTypes.columns) { if (optionNames.filterValues || optionNames.filterValue || optionNames.selectedFilterOperation) { filterValue = that._columnsController.columnOption(e.columnIndex, "filterValue"); filterValues = that._columnsController.columnOption(e.columnIndex, "filterValues"); if (Array.isArray(filterValues) || void 0 === e.columnIndex || commonUtils.isDefined(filterValue) || !optionNames.selectedFilterOperation || optionNames.filterValue) { that._applyFilter() } } if (!that._needApplyFilter && !gridCoreUtils.checkChanges(optionNames, ["width", "visibleWidth", "filterValue", "bufferedFilterValue", "selectedFilterOperation", "filterValues", "filterType"])) { that._columnsController.columnsChanged.add(updateItemsHandler) } if (commonUtils.isDefined(optionNames.visible)) { var column = that._columnsController.columnOption(e.columnIndex); if (column && (commonUtils.isDefined(column.filterValue) || commonUtils.isDefined(column.filterValues))) { that._applyFilter() } } } } }, _handleDataChanged: function(e) { var that = this, dataSource = that._dataSource, columnsController = that._columnsController, isAllDataTypesDefined = columnsController.isAllDataTypesDefined(), isAsyncDataSourceApplying = false; if (dataSource && !that._isDataSourceApplying) { that._isDataSourceApplying = true; when(that._columnsController.applyDataSource(dataSource)).done(function() { if (that._isLoading) { that._handleLoadingChanged(false) } if (isAsyncDataSourceApplying && e && e.isDelayed) { e.isDelayed = false } that._isDataSourceApplying = false; var additionalFilter = that._calculateAdditionalFilter(), needApplyFilter = that._needApplyFilter; that._needApplyFilter = false; if (needApplyFilter && additionalFilter && additionalFilter.length && !isAllDataTypesDefined) { errors.log("W1005", that.component.NAME); that._applyFilter() } else { that.updateItems(e) } }); if (that._isDataSourceApplying) { isAsyncDataSourceApplying = true; that._handleLoadingChanged(true) } that._needApplyFilter = !that._columnsController.isDataSourceApplied() } }, _handleLoadingChanged: function(isLoading) { this._isLoading = isLoading; this._fireLoadingChanged() }, _handleLoadError: function(e) { this.dataErrorOccurred.fire(e) }, _setPagingOptions: function(dataSource) { var pageIndex = this.option("paging.pageIndex"), pageSize = this.option("paging.pageSize"), pagingEnabled = this.option("paging.enabled"), scrollingMode = this.option("scrolling.mode"), appendMode = "infinite" === scrollingMode, virtualMode = "virtual" === scrollingMode; dataSource.requireTotalCount(!appendMode); if (void 0 !== pagingEnabled) { dataSource.paginate(pagingEnabled || virtualMode || appendMode) } if (void 0 !== pageSize) { dataSource.pageSize(pageSize) } if (void 0 !== pageIndex) { dataSource.pageIndex(pageIndex) } }, _getSpecificDataSourceOption: function() { var dataSource = this.option("dataSource"); if (Array.isArray(dataSource)) { return { store: { type: "array", data: dataSource, key: this.option("keyExpr") } } } return dataSource }, _initDataSource: function() { var that = this, dataSource = this.option("dataSource"), oldDataSource = this._dataSource; that.callBase(); dataSource = that._dataSource; that._isFirstLoading = true; if (dataSource) { that._setPagingOptions(dataSource); that.setDataSource(dataSource) } else { if (oldDataSource) { that.updateItems() } } }, _loadDataSource: function() { var dataSource = this._dataSource; return dataSource ? dataSource.load() : $.Deferred().resolve().promise() }, _processItems: function(items, changeType) { var that = this, visibleColumns = that._columnsController.getVisibleColumns(), visibleItems = that._items, dataIndex = "append" === changeType && visibleItems.length > 0 ? visibleItems[visibleItems.length - 1].dataIndex + 1 : 0, options = { visibleColumns: visibleColumns, dataIndex: dataIndex }, result = []; $.each(items, function(index, item) { if (commonUtils.isDefined(item)) { options.rowIndex = index; item = that._processItem(item, options); result.push(item) } }); return result }, _processItem: function(item, options) { item = this._generateDataItem(item); item = this._processDataItem(item, options); item.dataIndex = options.dataIndex++; return item }, _generateDataItem: function(data) { return { rowType: "data", data: data, key: this.keyOf(data) } }, _processDataItem: function(dataItem, options) { dataItem.values = this.generateDataValues(dataItem.data, options.visibleColumns); return dataItem }, generateDataValues: function(data, columns) { var column, value, values = []; for (var i = 0; i < columns.length; i++) { column = columns[i]; value = null; if (column.command) { value = null } else { if (column.calculateCellValue) { value = column.calculateCellValue(data) } else { if (column.dataField) { value = data[column.dataField] } } } values.push(value) } return values }, _updateItemsCore: function(change) { var items, that = this, dataSource = that._dataSource, changeType = change.changeType || "refresh"; change.changeType = changeType; if (dataSource) { items = change.items || dataSource.items(); items = that._processItems(items.slice(0), changeType); change.items = items; switch (changeType) { case "prepend": that._items.unshift.apply(that._items, items); break; case "append": that._items.push.apply(that._items, items); break; case "update": var prevIndex = -1, rowIndices = change.rowIndices.slice(0), rowIndexCorrection = 0; rowIndices.sort(function(a, b) { return a - b }); for (var i = 0; i < rowIndices.length; i++) { if (rowIndices[i] < 0) { rowIndices.splice(i, 1); i-- } } change.items = []; change.rowIndices = []; change.changeTypes = []; var equalItems = function(item1, item2, strict) { var result = item1 && item2 && equalKeys(item1.key, item2.key); if (result && strict) { result = item1.rowType === item2.rowType && ("detail" !== item2.rowType || item1.isEditing === item2.isEditing) } return result }; $.each(rowIndices, function(index, rowIndex) { var oldItem, newItem, oldNextItem, newNextItem, strict; rowIndex += rowIndexCorrection; if (prevIndex === rowIndex) { return } prevIndex = rowIndex; oldItem = that._items[rowIndex]; oldNextItem = that._items[rowIndex + 1]; newItem = items[rowIndex]; newNextItem = items[rowIndex + 1]; strict = equalItems(oldItem, oldNextItem) || equalItems(newItem, newNextItem); if (newItem) { change.items.push(newItem) } if (oldItem && newItem && equalItems(oldItem, newItem, strict)) { changeType = "update"; that._items[rowIndex] = newItem; if (oldItem.visible !== newItem.visible) { change.items.splice(-1, 1, { visible: newItem.visible }) } } else { if (newItem && !oldItem || newNextItem && equalItems(oldItem, newNextItem, strict)) { changeType = "insert"; that._items.splice(rowIndex, 0, newItem); rowIndexCorrection++ } else { if (oldItem && !newItem || oldNextItem && equalItems(newItem, oldNextItem, strict)) { changeType = "remove"; that._items.splice(rowIndex, 1); rowIndexCorrection--; prevIndex = -1 } else { if (newItem) { changeType = "update"; that._items[rowIndex] = newItem } else { return } } } } change.rowIndices.push(rowIndex); change.changeTypes.push(changeType) }); break; default: that._items = items.slice(0) } $.each(that._items, function(index, item) { item.rowIndex = index }) } else { that._items = [] } }, updateItems: function(change) { change = change || {}; var that = this; if (that._updateLockCount) { that._changes.push(change); return } that._updateItemsCore(change); commonUtils.deferRender(function() { that.changed.fire(change) }) }, isLoading: function() { return this._isLoading || this._isCustomLoading }, _fireLoadingChanged: function(messageText) { this.loadingChanged.fire(this.isLoading(), messageText) }, _calculateAdditionalFilter: function() { return null }, _applyFilter: function() { var that = this, dataSource = that._dataSource; if (dataSource) { dataSource.pageIndex(0); return that.reload().done(that.pageChanged.fire.bind(that.pageChanged)) } }, filter: function(filterExpr) { var dataSource = this._dataSource, filter = dataSource.filter(); if (0 === arguments.length) { return dataSource ? dataSource.filter() : void 0 } filterExpr = arguments.length > 1 ? Array.prototype.slice.call(arguments, 0) : filterExpr; if (gridCoreUtils.equalFilterParameters(filter, filterExpr)) { return } if (dataSource) { dataSource.filter(filterExpr) } this._applyFilter() }, clearFilter: function(filterName) { var that = this, columnsController = that._columnsController, clearColumnOption = function(optionName) { var index, columnCount = columnsController.columnCount(); for (index = 0; index < columnCount; index++) { columnsController.columnOption(index, optionName, void 0) } }; that.component.beginUpdate(); if (arguments.length > 0) { switch (filterName) { case "dataSource": that.filter(null); break; case "search": that.searchByText(""); break; case "header": clearColumnOption("filterValues"); break; case "row": clearColumnOption("filterValue") } } else { that.filter(null); that.searchByText(""); clearColumnOption("filterValue"); clearColumnOption("filterValues") } that.component.endUpdate() }, _fireDataSourceChanged: function() { var that = this; var changedHandler = function() { that.changed.remove(changedHandler); that.dataSourceChanged.fire() }; that.changed.add(changedHandler) }, _getDataSourceAdapter: commonUtils.noop, _createDataSourceAdapterCore: function(dataSource, remoteOperations) { var dataSourceAdapterProvider = this._getDataSourceAdapter(), dataSourceAdapter = dataSourceAdapterProvider.create(this.component); dataSourceAdapter.init(dataSource, remoteOperations); return dataSourceAdapter }, isLocalStore: function(store) { store = store || this.store(); return store instanceof ArrayStore }, isCustomStore: function(store) { store = store || this.store(); return store instanceof CustomStore }, _createDataSourceAdapter: function(dataSource) { var remoteOperations = this.option("remoteOperations"), store = dataSource.store(), enabledRemoteOperations = { filtering: true, sorting: true, paging: true, grouping: true, summary: true }; if (remoteOperations && remoteOperations.groupPaging) { remoteOperations = extend({}, enabledRemoteOperations, remoteOperations) } if ("auto" === remoteOperations) { remoteOperations = this.isLocalStore(store) || this.isCustomStore(store) ? {} : { filtering: true, sorting: true, paging: true } } if (true === remoteOperations) { remoteOperations = enabledRemoteOperations } return this._createDataSourceAdapterCore(dataSource, remoteOperations) }, setDataSource: function(dataSource) { var that = this, oldDataSource = that._dataSource; if (!dataSource && oldDataSource) { oldDataSource.changed.remove(that._dataChangedHandler); oldDataSource.loadingChanged.remove(that._loadingChangedHandler); oldDataSource.loadError.remove(that._loadErrorHandler); oldDataSource.customizeStoreLoadOptions.remove(that._customizeStoreLoadOptionsHandler); oldDataSource.dispose(that._isSharedDataSource) } if (dataSource) { dataSource = that._createDataSourceAdapter(dataSource) } that._dataSource = dataSource; if (dataSource) { that._fireDataSourceChanged(); that._isLoading = !dataSource.isLoaded(); that._needApplyFilter = true; dataSource.changed.add(that._dataChangedHandler); dataSource.loadingChanged.add(that._loadingChangedHandler); dataSource.loadError.add(that._loadErrorHandler); dataSource.customizeStoreLoadOptions.add(that._customizeStoreLoadOptionsHandler) } }, items: function() { return this._items }, isEmpty: function() { return !this.items().length }, pageCount: function() { return this._dataSource ? this._dataSource.pageCount() : 1 }, dataSource: function() { return this._dataSource }, store: function() { var dataSource = this._dataSource; return dataSource && dataSource.store() }, loadAll: function(data) { var that = this, d = $.Deferred(), dataSource = that._dataSource; if (dataSource) { if (data) { var options = { data: data, isCustomLoading: true, storeLoadOptions: {}, loadOptions: { group: dataSource.group(), sort: dataSource.sort() } }; dataSource._handleDataLoaded(options); when(options.data).done(function(data) { d.resolve(that._processItems(data, "loadingAll"), options.extra && options.extra.summary) }).fail(d.reject) } else { if (!that.isLoading()) { var loadOptions = extend({}, dataSource.loadOptions(), { isLoadingAll: true, requireTotalCount: false }); dataSource.load(loadOptions).done(function(items, extra) { items = that._processItems(items.slice(0), "loadingAll"); d.resolve(items, extra && extra.summary) }).fail(d.reject) } else { d.reject() } } } else { d.resolve([]) } return d }, getKeyByRowIndex: function(rowIndex) { var item = this.items()[rowIndex]; if (item) { return item.key } }, getRowIndexByKey: function(key) { return gridCoreUtils.getIndexByKey(key, this.items()) }, keyOf: function(data) { var store = this.store(); if (store) { return store.keyOf(data) } }, byKey: function(key) { var result, store = this.store(), rowIndex = this.getRowIndexByKey(key); if (!store) { return } if (rowIndex >= 0) { result = $.Deferred().resolve(this.items()[rowIndex].data) } return result || store.byKey(key) }, key: function() { var store = this.store(); if (store) { return store.key() } }, getRowIndexOffset: function() { return 0 }, getDataByKeys: function(rowKeys) { var that = this, result = $.Deferred(), deferreds = [], data = []; $.each(rowKeys, function(index, key) { deferreds.push(that.byKey(key).done(function(keyData) { data[index] = keyData })) }); when.apply($, deferreds).always(function() { result.resolve(data) }); return result }, pageIndex: function(value) { var that = this, pagingOptions = that.option("paging"), dataSource = that._dataSource; if (dataSource) { if (void 0 !== value) { if (dataSource.pageIndex() !== value) { dataSource.pageIndex(value); if (pagingOptions) { pagingOptions.pageIndex = value } return dataSource.load().done(that.pageChanged.fire.bind(that.pageChanged)) } } return dataSource.pageIndex() } return 0 }, pageSize: function(value) { var that = this, pagingOptions = that.option("paging"), dataSource = that._dataSource; if (void 0 === value) { return dataSource ? dataSource.pageSize() : 0 } if (dataSource) { if (dataSource.pageSize() !== value) { dataSource.pageIndex(0); dataSource.pageSize(value); if (pagingOptions) { pagingOptions.pageSize = value } return dataSource.reload().done(that.pageChanged.fire.bind(that.pageChanged)) } } }, beginCustomLoading: function(messageText) { this._isCustomLoading = true; this._fireLoadingChanged(messageText || "") }, endCustomLoading: function() { this._isCustomLoading = false; this._fireLoadingChanged() }, refresh: function() { var that = this, d = $.Deferred(); when(this._columnsController.refresh()).always(function() { when(that.reload(true)).done(d.resolve).fail(d.reject) }); return d }, getVisibleRows: function() { return this.items() }, _disposeDataSource: function() { this.setDataSource(null) }, repaintRows: function(rowIndexes) { rowIndexes = Array.isArray(rowIndexes) ? rowIndexes : [rowIndexes]; if (rowIndexes.length > 1 || commonUtils.isDefined(rowIndexes[0])) { this.updateItems({ changeType: "update", rowIndices: rowIndexes }) } } }; gridCoreUtils.proxyMethod(members, "load"); gridCoreUtils.proxyMethod(members, "reload"); gridCoreUtils.proxyMethod(members, "itemsCount", 0); gridCoreUtils.proxyMethod(members, "totalItemsCount", 0); gridCoreUtils.proxyMethod(members, "hasKnownLastPage", true); gridCoreUtils.proxyMethod(members, "isLoaded", true); gridCoreUtils.proxyMethod(members, "totalCount", 0); return members }()) } } }, /*!*************************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.sorting.js ***! \*************************************************/ function(module, exports, __webpack_require__) { var gridCore = __webpack_require__( /*! ./ui.data_grid.core */ 348), sortingModule = __webpack_require__( /*! ../grid_core/ui.grid_core.sorting */ 362); gridCore.registerModule("sorting", sortingModule) }, /*!*************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.sorting.js ***! \*************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), clickEvent = __webpack_require__( /*! ../../events/click */ 75), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, sortingMixin = __webpack_require__( /*! ../grid_core/ui.grid_core.sorting_mixin */ 363), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), eventUtils = __webpack_require__( /*! ../../events/utils */ 71); var COLUMN_HEADERS_VIEW_NAMESPACE = "dxDataGridColumnHeadersView"; var ColumnHeadersViewSortingExtender = extend({}, sortingMixin, { _createRow: function(row) { var that = this, $row = that.callBase(row); if ("header" === row.rowType) { $row.on(eventUtils.addNamespace(clickEvent.name, COLUMN_HEADERS_VIEW_NAMESPACE), "> td", that.createAction(function(e) { var keyName = null, event = e.jQueryEvent, $cellElementFromEvent = $(event.currentTarget), rowIndex = $cellElementFromEvent.parent().index(), columnIndex = $.map(that.getCellElements(rowIndex), function($cellElement, index) { if ($cellElement === $cellElementFromEvent.get(0)) { return index } })[0], visibleColumns = that._columnsController.getVisibleColumns(rowIndex), column = visibleColumns[columnIndex], editingController = that.getController("editing"), editingMode = that.option("editing.mode"), isCellEditing = editingController && editingController.isEditing() && ("batch" === editingMode || "cell" === editingMode); if (isCellEditing) { return } if (column && !commonUtils.isDefined(column.groupIndex) && !column.command) { if (event.shiftKey) { keyName = "shift" } else { if (event.ctrlKey) { keyName = "ctrl" } } setTimeout(function() { that._columnsController.changeSortOrder(column.index, keyName) }) } })) } return $row }, _renderCellContent: function($cell, options) { var that = this, column = options.column; if (!column.command && "header" === options.rowType) { that._applyColumnState({ name: "sort", rootElement: $cell, column: column, showColumnLines: that.option("showColumnLines") }) } that.callBase($cell, options) }, _columnOptionChanged: function(e) { var changeTypes = e.changeTypes; if (1 === changeTypes.length && changeTypes.sorting) { this._updateIndicators("sort"); return } this.callBase(e) }, optionChanged: function(args) { var that = this; switch (args.name) { case "sorting": that._invalidate(); args.handled = true; break; default: that.callBase(args) } } }); var HeaderPanelSortingExtender = extend({}, sortingMixin, { _createGroupPanelItem: function($rootElement, groupColumn) { var that = this, $item = that.callBase.apply(that, arguments); $item.on(eventUtils.addNamespace(clickEvent.name, "dxDataGridHeaderPanel"), that.createAction(function() { setTimeout(function() { that.getController("columns").changeSortOrder(groupColumn.index) }) })); that._applyColumnState({ name: "sort", rootElement: $item, column: { alignment: that.option("rtlEnabled") ? "right" : "left", allowSorting: groupColumn.allowSorting, sortOrder: "desc" === groupColumn.sortOrder ? "desc" : "asc" }, showColumnLines: true }); return $item }, optionChanged: function(args) { var that = this; switch (args.name) { case "sorting": that._invalidate(); args.handled = true; break; default: that.callBase(args) } } }); module.exports = { defaultOptions: function() { return { sorting: { mode: "single", ascendingText: messageLocalization.format("dxDataGrid-sortingAscendingText"), descendingText: messageLocalization.format("dxDataGrid-sortingDescendingText"), clearText: messageLocalization.format("dxDataGrid-sortingClearText") } } }, extenders: { views: { columnHeadersView: ColumnHeadersViewSortingExtender, headerPanel: HeaderPanelSortingExtender } } } }, /*!*******************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.sorting_mixin.js ***! \*******************************************************/ function(module, exports, __webpack_require__) { var commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14); var SORT_CLASS = "dx-sort", SORT_NONE_CLASS = "dx-sort-none", SORTUP_CLASS = "dx-sort-up", SORTDOWN_CLASS = "dx-sort-down", HEADERS_ACTION_CLASS = "action"; module.exports = { _applyColumnState: function(options) { var side, ariaSortState, $sortIndicator, that = this, sortingMode = that.option("sorting.mode"), rootElement = options.rootElement, column = options.column, $indicatorsContainer = that._getIndicatorContainer(rootElement); if ("sort" === options.name) { side = that.option("rtlEnabled") ? "right" : "left"; rootElement.find("." + SORT_CLASS).remove(); !$indicatorsContainer.children().length && $indicatorsContainer.remove(); if (("single" === sortingMode || "multiple" === sortingMode) && column.allowSorting || commonUtils.isDefined(column.sortOrder)) { ariaSortState = "asc" === column.sortOrder ? "ascending" : "descending"; $sortIndicator = that.callBase(options).toggleClass(SORTUP_CLASS, "asc" === column.sortOrder).toggleClass(SORTDOWN_CLASS, "desc" === column.sortOrder); options.rootElement.addClass(that.addWidgetPrefix(HEADERS_ACTION_CLASS)) } if (!commonUtils.isDefined(column.sortOrder)) { that.setAria("sort", "none", rootElement) } else { that.setAria("sort", ariaSortState, rootElement) } return $sortIndicator } else { return that.callBase(options) } }, _getIndicatorClassName: function(name) { if ("sort" === name) { return SORT_CLASS } return this.callBase(name) }, _renderIndicator: function(options) { var rtlEnabled, column = options.column, $container = options.container, $indicator = options.indicator; if ("sort" === options.name) { rtlEnabled = this.option("rtlEnabled"); if (!commonUtils.isDefined(column.sortOrder)) { $indicator && $indicator.addClass(SORT_NONE_CLASS) } if ($container.children().length && (!rtlEnabled && "left" === options.columnAlignment || rtlEnabled && "right" === options.columnAlignment)) { $container.prepend($indicator); return } } this.callBase(options) }, _updateIndicator: function($cell, column, indicatorName) { if ("sort" === indicatorName && commonUtils.isDefined(column.groupIndex)) { return } return this.callBase.apply(this, arguments) }, _getIndicatorElements: function($cell, returnAll) { var $indicatorElements = this.callBase($cell); return returnAll ? $indicatorElements : $indicatorElements && $indicatorElements.not("." + SORT_NONE_CLASS) } } }, /*!**********************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.rows.js ***! \**********************************************/ function(module, exports, __webpack_require__) { var gridCore = __webpack_require__( /*! ./ui.data_grid.core */ 348), rowsViewModule = __webpack_require__( /*! ../grid_core/ui.grid_core.rows */ 365); exports.RowsView = rowsViewModule.views.rowsView; gridCore.registerModule("rows", rowsViewModule) }, /*!**********************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.rows.js ***! \**********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, stringUtils = __webpack_require__( /*! ../../core/utils/string */ 18), getDefaultAlignment = __webpack_require__( /*! ../../core/utils/position */ 107).getDefaultAlignment, compileGetter = __webpack_require__( /*! ../../core/utils/data */ 50).compileGetter, gridCoreUtils = __webpack_require__( /*! ./ui.grid_core.utils */ 349), columnsView = __webpack_require__( /*! ./ui.grid_core.columns_view */ 353), Scrollable = __webpack_require__( /*! ../scroll_view/ui.scrollable */ 244), removeEvent = __webpack_require__( /*! ../../core/remove_event */ 47), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), isDefined = commonUtils.isDefined; var ROWS_VIEW_CLASS = "rowsview", CONTENT_CLASS = "content", NOWRAP_CLASS = "nowrap", GROUP_ROW_CLASS = "dx-group-row", GROUP_CELL_CLASS = "dx-group-cell", DATA_ROW_CLASS = "dx-data-row", FREE_SPACE_CLASS = "dx-freespace-row", ROW_LINES_CLASS = "dx-row-lines", COLUMN_LINES_CLASS = "dx-column-lines", ROW_ALTERNATION_CLASS = "dx-row-alt", LAST_ROW_BORDER = "dx-last-row-border", LOADPANEL_HIDE_TIMEOUT = 200; module.exports = { defaultOptions: function() { return { hoverStateEnabled: false, scrolling: { useNative: "auto" }, loadPanel: { enabled: "auto", text: messageLocalization.format("Loading"), width: 200, height: 90, showIndicator: true, indicatorSrc: "", showPane: true }, rowTemplate: null, columnAutoWidth: false, noDataText: messageLocalization.format("dxDataGrid-noDataText"), wordWrapEnabled: false, showColumnLines: true, showRowLines: false, rowAlternationEnabled: false, activeStateEnabled: false, twoWayBindingEnabled: true } }, views: { rowsView: columnsView.ColumnsView.inherit(function() { var appendFreeSpaceRowTemplate = { render: function(options) { var $tbody = options.container.find("tbody"); if ($tbody.length) { $tbody.last().append(options.content) } else { options.container.append(options.content) } } }; return { _getDefaultTemplate: function(column) { switch (column.command) { case "empty": return function(container) { container.html(" ") }; default: return function($container, options) { var isDataTextEmpty = stringUtils.isEmpty(options.text) && "data" === options.rowType, text = isDataTextEmpty ? " " : options.text, container = $container.get(0); if (column.encodeHtml && !isDataTextEmpty) { container.textContent = text } else { container.innerHTML = text } } } }, _getDefaultGroupTemplate: function(column) { var that = this, summaryTexts = that.option("summary.texts"); return function($container, options) { var data = options.data, text = options.column.caption + ": " + options.text, container = $container.get(0); if (options.summaryItems && options.summaryItems.length) { text += " " + gridCoreUtils.getGroupRowSummaryText(options.summaryItems, summaryTexts) } if (data) { if (options.groupContinuedMessage && options.groupContinuesMessage) { text += " (" + options.groupContinuedMessage + ". " + options.groupContinuesMessage + ")" } else { if (options.groupContinuesMessage) { text += " (" + options.groupContinuesMessage + ")" } else { if (options.groupContinuedMessage) { text += " (" + options.groupContinuedMessage + ")" } } } } $container.addClass(GROUP_CELL_CLASS); if (column.encodeHtml) { container.textContent = text } else { container.innerHTML = text } } }, _update: function() {}, _getCellTemplate: function(options) { var template, that = this, column = options.column; if ("group" === options.rowType && isDefined(column.groupIndex) && !column.showWhenGrouped) { template = column.groupCellTemplate || { allowRenderToDetachedContainer: true, render: that._getDefaultGroupTemplate(column) } } else { template = column.cellTemplate || { allowRenderToDetachedContainer: true, render: that._getDefaultTemplate(column) } } return template }, _createRow: function(row) { var isGroup, isDataRow, isRowExpanded, $row = this.callBase(row); if (row) { isGroup = "group" === row.rowType; isDataRow = "data" === row.rowType; isDataRow && $row.addClass(DATA_ROW_CLASS); isDataRow && row.dataIndex % 2 === 1 && this.option("rowAlternationEnabled") && $row.addClass(ROW_ALTERNATION_CLASS); isDataRow && this.option("showRowLines") && $row.addClass(ROW_LINES_CLASS); this.option("showColumnLines") && $row.addClass(COLUMN_LINES_CLASS); if (false === row.visible) { $row.hide() } if (isGroup) { $row.addClass(GROUP_ROW_CLASS); isRowExpanded = row.isExpanded; this.setAria("role", "rowgroup", $row); this.setAria("expanded", isDefined(isRowExpanded) && isRowExpanded.toString(), $row) } } return $row }, _afterRowPrepared: function(e) { var arg = e.args[0], dataController = this._dataController, watch = this.option("integrationOptions.watchMethod"); if (!arg.data || "data" !== arg.rowType || arg.inserted || !this.option("twoWayBindingEnabled") || !watch) { return } var dispose = watch(function() { return dataController.generateDataValues(arg.data, arg.columns) }, function() { dataController.updateItems({ changeType: "update", rowIndices: [arg.rowIndex] }) }, { deep: true, skipImmediate: true }); arg.rowElement.on(removeEvent, dispose) }, _renderScrollable: function(force) { var that = this, $element = that.element(); if (!$element.children().length) { $element.append("<div />") } if (force || !that._loadPanel) { that._renderLoadPanel($element, $element.parent(), that._dataController.isLocalStore()) } if ((force || !that.getScrollable()) && that._dataController.isLoaded()) { var columns = that.getColumns(), allColumnsHasWidth = true; for (var i = 0; i < columns.length; i++) { if (!columns[i].width && !columns[i].minWidth) { allColumnsHasWidth = false; break } } if (that.option("columnAutoWidth") || that._hasHeight || allColumnsHasWidth || that._columnsController._isColumnFixing()) { that._renderScrollableCore($element) } } }, _handleScroll: function(e) { var that = this; that._isScrollByEvent = !!e.jQueryEvent; that._scrollTop = e.scrollOffset.top; that._scrollLeft = e.scrollOffset.left; that.scrollChanged.fire(e.scrollOffset, that.name) }, _renderScrollableCore: function($element) { var that = this, dxScrollableOptions = that._createScrollableOptions(), scrollHandler = that._handleScroll.bind(that); dxScrollableOptions.onScroll = scrollHandler; dxScrollableOptions.onStop = scrollHandler; that._scrollable = that._createComponent($element, Scrollable, dxScrollableOptions); that._scrollableContainer = that._scrollable && that._scrollable._$container }, _renderLoadPanel: gridCoreUtils.renderLoadPanel, _renderContent: function(contentElement, tableElement) { contentElement.replaceWith($("<div>").addClass(this.addWidgetPrefix(CONTENT_CLASS)).append(tableElement)); return this._findContentElement() }, _updateContent: function(newTableElement, change) { var that = this, tableElement = that._getTableElement(), contentElement = that._findContentElement(), changeType = change && change.changeType, executors = []; switch (changeType) { case "update": $.each(change.rowIndices, function(index, rowIndex) { var $newRowElement = that._getRowElements(newTableElement).eq(index), changeType = change.changeTypes[index], item = change.items && change.items[index]; executors.push(function() { var $rowsElement = that._getRowElements(), $rowElement = $rowsElement.eq(rowIndex); switch (changeType) { case "update": if (item) { if (isDefined(item.visible) && item.visible !== $rowElement.is(":visible")) { $rowElement.toggle(item.visible) } else { $rowElement.replaceWith($newRowElement) } } break; case "insert": if (!$rowsElement.length) { $newRowElement.prependTo(tableElement) } else { if ($rowElement.length) { $newRowElement.insertBefore($rowElement) } else { $newRowElement.insertAfter($rowsElement.last()) } } break; case "remove": $rowElement.remove() } }) }); $.each(executors, function() { this() }); newTableElement.remove(); break; default: that._setTableElement(newTableElement); contentElement.addClass(that.addWidgetPrefix(CONTENT_CLASS)); that._renderContent(contentElement, newTableElement) } }, _renderFreeSpaceRow: function(tableElement) { var i, that = this, freeSpaceRowElement = that._createRow(), columns = this.getColumns(); freeSpaceRowElement.addClass(FREE_SPACE_CLASS).toggleClass(COLUMN_LINES_CLASS, that.option("showColumnLines")); for (i = 0; i < columns.length; i++) { freeSpaceRowElement.append(that._createCell({ column: columns[i], rowType: "freeSpace" })) } that._appendRow(tableElement, freeSpaceRowElement, appendFreeSpaceRowTemplate) }, _needUpdateRowHeight: function(itemsCount) { return itemsCount > 0 && !this._rowHeight }, _updateRowHeight: function() { var tableHeight, freeSpaceRowHeight, $freeSpaceRowElement, that = this, tableElement = that._getTableElement(), itemsCount = that._dataController.items().length; if (tableElement && that._needUpdateRowHeight(itemsCount)) { tableHeight = tableElement.outerHeight(); $freeSpaceRowElement = that._getFreeSpaceRowElements().first(); if ($freeSpaceRowElement && $freeSpaceRowElement.is(":visible")) { freeSpaceRowHeight = parseFloat($freeSpaceRowElement[0].style.height) || 0; tableHeight -= freeSpaceRowHeight } that._rowHeight = tableHeight / itemsCount } }, _findContentElement: function() { var $content = this.element(), scrollable = this.getScrollable(); if ($content) { if (scrollable) { $content = scrollable.content() } return $content.children().first() } }, _getRowElements: function(tableElement) { var $rows = this.callBase(tableElement); return $rows && $rows.not("." + FREE_SPACE_CLASS) }, _getFreeSpaceRowElements: function($table) { var tableElements = $table || this.getTableElements(); return tableElements && tableElements.children("tbody").children("." + FREE_SPACE_CLASS) }, _getNoDataText: function() { return this.option("noDataText") }, _renderNoDataText: gridCoreUtils.renderNoDataText, _rowClick: function(e) { var item = this._dataController.items()[e.rowIndex] || {}; this.executeAction("onRowClick", extend({ evaluate: function(expr) { var getter = compileGetter(expr); return getter(item.data) } }, e, item)) }, _getGroupCellOptions: function(options) { var columnIndex = (options.row.groupIndex || 0) + options.columnsCountBeforeGroups; return { columnIndex: columnIndex, colspan: options.columns.length - columnIndex - 1 } }, _renderCells: function($row, options) { if ("group" === options.row.rowType) { this._renderGroupedCells($row, options) } else { if (options.row.values) { this.callBase($row, options) } } }, _renderGroupedCells: function($row, options) { var i, isExpanded, groupColumn, groupColumnAlignment, row = options.row, columns = options.columns, rowIndex = row.rowIndex, groupCellOptions = this._getGroupCellOptions(options); for (i = 0; i <= groupCellOptions.columnIndex; i++) { if (i === groupCellOptions.columnIndex && columns[i].allowCollapsing && "infinite" !== options.scrollingMode) { isExpanded = !!row.isExpanded } else { isExpanded = null } this._renderCell($row, { value: isExpanded, row: row, rowIndex: rowIndex, column: { command: "expand", cssClass: columns[i].cssClass }, columnIndex: i }) } groupColumnAlignment = getDefaultAlignment(this.option("rtlEnabled")); groupColumn = extend({}, columns[groupCellOptions.columnIndex], { command: null, cssClass: null, showWhenGrouped: false, alignment: groupColumnAlignment }); if (groupCellOptions.colspan > 1) { groupColumn.colspan = groupCellOptions.colspan } this._renderCell($row, { value: row.values[row.groupIndex], row: row, rowIndex: rowIndex, column: groupColumn, columnIndex: groupCellOptions.columnIndex }) }, _renderRows: function($table, options) { var i, that = this, columns = options.columns, columnsCountBeforeGroups = 0, scrollingMode = that.option("scrolling.mode"); for (i = 0; i < columns.length; i++) { if ("expand" === columns[i].command) { columnsCountBeforeGroups = i; break } } that.callBase($table, extend({ scrollingMode: scrollingMode, columnsCountBeforeGroups: columnsCountBeforeGroups }, options)); that._renderFreeSpaceRow($table); if (!that._hasHeight) { that.updateFreeSpaceRowHeight($table) } }, _renderRow: function($table, options) { var that = this, row = options.row, rowTemplate = that.option("rowTemplate"); if (("data" === row.rowType || "group" === row.rowType) && !isDefined(row.groupIndex) && rowTemplate) { that.renderTemplate($table, rowTemplate, extend({ columns: options.columns }, row), true) } else { that.callBase($table, options) } }, _renderTable: function(options) { var that = this, $table = that.callBase(options), resizeCompletedHandler = function() { var scrollableInstance = that.getScrollable(); if (scrollableInstance && that.element().closest(document).length) { that.resizeCompleted.remove(resizeCompletedHandler); scrollableInstance._visibilityChanged(true) } }; if (!isDefined(that._getTableElement())) { that._setTableElement($table); that._renderScrollable(true); that.resizeCompleted.add(resizeCompletedHandler) } else { that._renderScrollable() } return $table }, _createTable: function() { var $table = this.callBase.apply(this, arguments); if (this.option("rowTemplate")) { $table.appendTo(this.component.element()) } return $table }, _renderCore: function(change) { var $table, that = this, $element = that.element(); $element.addClass(that.addWidgetPrefix(ROWS_VIEW_CLASS)).toggleClass(that.addWidgetPrefix(NOWRAP_CLASS), !that.option("wordWrapEnabled")); $table = that._renderTable({ change: change }); that._updateContent($table, change); that.callBase(change); that._lastColumnWidths = null }, _getRows: function(change) { return change && change.items || this._dataController.items() }, _getCellOptions: function(options) { var parameters, groupingTextsOptions, scrollingMode, that = this, column = options.column, row = options.row, data = row.data, summaryCells = row && row.summaryCells, value = options.value, displayValue = gridCoreUtils.getDisplayValue(column, value, data, row.rowType); parameters = this.callBase(options); parameters.value = value; parameters.displayValue = displayValue; parameters.row = row; parameters.key = row.key; parameters.data = data; parameters.rowType = row.rowType; parameters.values = row.values; parameters.text = !column.command ? gridCoreUtils.formatValue(displayValue, column) : ""; parameters.rowIndex = row.rowIndex; parameters.summaryItems = summaryCells && summaryCells[options.columnIndex]; parameters.resized = column.resizedCallbacks; if (isDefined(column.groupIndex)) { groupingTextsOptions = that.option("grouping.texts"); scrollingMode = that.option("scrolling.mode"); if ("virtual" !== scrollingMode && "infinite" !== scrollingMode) { parameters.groupContinuesMessage = data && data.isContinuationOnNextPage && groupingTextsOptions && groupingTextsOptions.groupContinuesMessage; parameters.groupContinuedMessage = data && data.isContinuation && groupingTextsOptions && groupingTextsOptions.groupContinuedMessage } } return parameters }, getCellOptions: function(rowIndex, columnIdentifier) { var cellOptions, column, rowOptions = this._dataController.items()[rowIndex]; if (rowOptions) { column = this._columnsController.columnOption(columnIdentifier); if (column) { cellOptions = this._getCellOptions({ value: column.calculateCellValue(rowOptions.data), rowIndex: rowOptions.rowIndex, row: rowOptions, column: column }) } } return cellOptions }, getRow: function(index) { var rows = this._getRowElements(); if (rows.length > index) { return $(rows[index]) } }, getCellIndex: function($cell) { var cellIndex = $cell.length ? $cell[0].cellIndex : -1; return cellIndex }, updateFreeSpaceRowHeight: function($table) { var freeSpaceRowCount, scrollingMode, that = this, contentElement = that._findContentElement(), freeSpaceRowElements = that._getFreeSpaceRowElements($table); if (freeSpaceRowElements && contentElement) { var isFreeSpaceRowVisible = false; if (that._dataController.items().length > 0) { if (!that._hasHeight) { freeSpaceRowCount = that._dataController.pageSize() - that._dataController.items().length; scrollingMode = that.option("scrolling.mode"); if (freeSpaceRowCount > 0 && that._dataController.pageCount() > 1 && "virtual" !== scrollingMode && "infinite" !== scrollingMode) { freeSpaceRowElements.height(freeSpaceRowCount * that._rowHeight); isFreeSpaceRowVisible = true } if (!isFreeSpaceRowVisible && $table) { freeSpaceRowElements.height(0) } else { freeSpaceRowElements.css("display", isFreeSpaceRowVisible ? "" : "none") } that._updateLastRowBorder(isFreeSpaceRowVisible) } else { freeSpaceRowElements.css("display", "none"); commonUtils.deferUpdate(function() { var scrollbarWidth = that.getScrollbarWidth(true), elementHeightWithoutScrollbar = that.element().height() - scrollbarWidth, contentHeight = contentElement.outerHeight(), showFreeSpaceRow = elementHeightWithoutScrollbar - contentHeight > 0, contentTableHeight = contentElement.children().first().outerHeight(), resultHeight = elementHeightWithoutScrollbar - contentTableHeight; if (showFreeSpaceRow) { commonUtils.deferRender(function() { freeSpaceRowElements.height(resultHeight); isFreeSpaceRowVisible = true; freeSpaceRowElements.css("display", "") }) } commonUtils.deferRender(function() { that._updateLastRowBorder(isFreeSpaceRowVisible) }) }) } } else { freeSpaceRowElements.height(0); freeSpaceRowElements.css("display", ""); that._updateLastRowBorder(true) } } }, _columnOptionChanged: function(e) { var optionNames = e.optionNames; if (e.changeTypes.grouping) { return } if (optionNames.width || optionNames.visibleWidth) { this.callBase(e); this._fireColumnResizedCallbacks() } }, getScrollable: function() { return this._scrollable }, init: function() { var that = this, dataController = that.getController("data"); that.callBase(); that._editorFactoryController = that.getController("editorFactory"); that._rowHeight = 0; that._scrollTop = 0; that._scrollLeft = -1; that._hasHeight = false; dataController.loadingChanged.add(function(isLoading, messageText) { that.setLoading(isLoading, messageText) }); dataController.dataSourceChanged.add(function() { that._handleScroll({ scrollOffset: { top: that._scrollTop, left: that._scrollLeft } }) }) }, _handleDataChanged: function(change) { var that = this; switch (change.changeType) { case "refresh": case "prepend": case "append": case "update": that.render(null, change); break; default: that._update(change) } }, publicMethods: function() { return ["isScrollbarVisible", "getTopVisibleRowData", "getScrollbarWidth", "getCellElement", "getRowElement", "getScrollable"] }, contentWidth: function() { return this.element().width() - this.getScrollbarWidth() }, getScrollbarWidth: function(isHorizontal) { var scrollableContainer = this._scrollableContainer && this._scrollableContainer.get(0), scrollbarWidth = 0; if (scrollableContainer) { if (!isHorizontal) { scrollbarWidth = scrollableContainer.clientWidth ? scrollableContainer.offsetWidth - scrollableContainer.clientWidth : 0 } else { scrollbarWidth = scrollableContainer.clientHeight ? scrollableContainer.offsetHeight - scrollableContainer.clientHeight : 0 } } return scrollbarWidth > 0 ? scrollbarWidth : 0 }, _fireColumnResizedCallbacks: function() { var i, that = this, lastColumnWidths = that._lastColumnWidths || [], columnWidths = [], columns = that.getColumns(); for (i = 0; i < columns.length; i++) { columnWidths[i] = columns[i].visibleWidth; if (columns[i].resizedCallbacks && !isDefined(columns[i].groupIndex) && lastColumnWidths[i] !== columnWidths[i]) { columns[i].resizedCallbacks.fire(columnWidths[i]) } } that._lastColumnWidths = columnWidths }, _updateLastRowBorder: function(isFreeSpaceRowVisible) { if (this.option("showBorders") && this.option("showRowLines") && !isFreeSpaceRowVisible) { this.element().addClass(LAST_ROW_BORDER) } else { this.element().removeClass(LAST_ROW_BORDER) } }, _updateScrollable: function() { var dxScrollable = Scrollable.getInstance(this.element()); if (dxScrollable) { dxScrollable.update(); this._updateHorizontalScrollPosition() } }, _updateHorizontalScrollPosition: function() { var scrollable = this.getScrollable(), scrollLeft = scrollable && scrollable.scrollOffset().left; if (this._scrollLeft >= 0 && scrollLeft !== this._scrollLeft) { scrollable.scrollTo({ x: this._scrollLeft }) } }, _resizeCore: function() { var that = this; that._fireColumnResizedCallbacks(); that._updateRowHeight(); commonUtils.deferRender(function() { that._renderScrollable(); that._renderNoDataText(); that.updateFreeSpaceRowHeight() }); that._updateScrollable(); that.setLoading(that._dataController.isLoading()) }, scrollTo: function(location) { var $element = this.element(), dxScrollable = $element && Scrollable.getInstance($element); if (dxScrollable) { dxScrollable.scrollTo(location) } }, height: function(height, hasHeight) { var that = this, $element = this.element(); if (isDefined(height)) { that._hasHeight = void 0 === hasHeight ? "auto" !== height : hasHeight; if ($element) { $element.css("height", height) } } else { return $element ? $element.outerHeight(true) : 0 } }, setLoading: function(isLoading, messageText) { var visibilityOptions, that = this, loadPanel = that._loadPanel, dataController = that._dataController, loadPanelOptions = that.option("loadPanel") || {}, animation = dataController.isLoaded() ? loadPanelOptions.animation : null, $element = that.element(); if (!loadPanel && void 0 !== messageText && dataController.isLocalStore() && "auto" === loadPanelOptions.enabled && $element) { that._renderLoadPanel($element, $element.parent()); loadPanel = that._loadPanel } if (loadPanel) { visibilityOptions = { message: messageText || loadPanelOptions.text, animation: animation, visible: isLoading }; clearTimeout(that._hideLoadingTimeoutID); if (loadPanel.option("visible") && !isLoading) { that._hideLoadingTimeoutID = setTimeout(function() { loadPanel.option(visibilityOptions) }, LOADPANEL_HIDE_TIMEOUT) } else { loadPanel.option(visibilityOptions) } } }, setRowsOpacity: function(columnIndex, value) { var i, that = this, columnsController = that._columnsController, visibleColumns = that.getColumns(), columns = columnsController.getColumns(), column = columns && columns[columnIndex], columnID = column && column.isBand && column.index, $rows = that._getRowElements().not("." + GROUP_ROW_CLASS) || []; $.each($rows, function(rowIndex, row) { if (!$(row).hasClass(GROUP_ROW_CLASS)) { for (i = 0; i < visibleColumns.length; i++) { if (commonUtils.isNumeric(columnID) && columnsController.isParentBandColumn(visibleColumns[i].index, columnID) || visibleColumns[i].index === columnIndex) { that.getCellElements(rowIndex).eq(i).css({ opacity: value }); if (!commonUtils.isNumeric(columnID)) { break } } } } }) }, _getCellElementsCore: function(rowIndex) { var groupCellIndex, $cells = this.callBase(rowIndex); if ($cells) { groupCellIndex = $cells.filter("." + GROUP_CELL_CLASS).index(); if (groupCellIndex >= 0 && $cells.length > groupCellIndex + 1) { $cells.length = groupCellIndex + 1 } } return $cells }, getTopVisibleItemIndex: function() { var rowElements, rowElement, that = this, itemIndex = 0, prevOffsetTop = 0, offsetTop = 0, scrollPosition = that._scrollTop, contentElementOffsetTop = that._findContentElement().offset().top, items = that._dataController.items(), tableElement = that._getTableElement(); if (items.length && tableElement) { rowElements = tableElement.children("tbody").children(".dx-row:visible, .dx-error-row").not("." + FREE_SPACE_CLASS); for (itemIndex = 0; itemIndex < items.length; itemIndex++) { prevOffsetTop = offsetTop; rowElement = rowElements.eq(itemIndex); if (rowElement.length) { offsetTop = rowElement.offset().top - contentElementOffsetTop; if (offsetTop > scrollPosition) { if (2 * scrollPosition < offsetTop + prevOffsetTop && itemIndex) { itemIndex-- } break } } } if (itemIndex && itemIndex === items.length) { itemIndex-- } } return itemIndex }, getTopVisibleRowData: function() { var itemIndex = this.getTopVisibleItemIndex(), items = this._dataController.items(); if (items[itemIndex]) { return items[itemIndex].data } }, optionChanged: function(args) { var that = this; that.callBase(args); switch (args.name) { case "wordWrapEnabled": case "showColumnLines": case "showRowLines": case "rowAlternationEnabled": case "rowTemplate": case "twoWayBindingEnabled": that._invalidate(true, true); args.handled = true; break; case "scrolling": that._rowHeight = null; that._tableElement = null; args.handled = true; break; case "rtlEnabled": that._rowHeight = null; that._tableElement = null; break; case "loadPanel": that._tableElement = null; that._invalidate(true, true); args.handled = true; break; case "noDataText": that._renderNoDataText(); args.handled = true } }, dispose: function() { clearTimeout(this._hideLoadingTimeoutID) }, setScrollerSpacing: function() {} } }()) } } }, /*!******************************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.context_menu.js ***! \******************************************************/ function(module, exports, __webpack_require__) { var treeListCore = __webpack_require__( /*! ./ui.data_grid.core */ 348), contextMenuModule = __webpack_require__( /*! ../grid_core/ui.grid_core.context_menu */ 367); treeListCore.registerModule("contextMenu", contextMenuModule) }, /*!******************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.context_menu.js ***! \******************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, modules = __webpack_require__( /*! ./ui.grid_core.modules */ 350), ContextMenu = __webpack_require__( /*! ../context_menu */ 338); var CONTEXT_MENU = "dx-context-menu", viewName = { columnHeadersView: "header", rowsView: "content", footerView: "footer", headerPanel: "headerPanel" }, VIEW_NAMES = ["columnHeadersView", "rowsView", "footerView", "headerPanel"]; var ContextMenuController = modules.ViewController.inherit({ init: function() { this.createAction("onContextMenuPreparing") }, getContextMenuItems: function(jQueryEvent) { if (!jQueryEvent) { return false } var view, options, rowIndex, columnIndex, rowOptions, $element, $targetRowElement, $targetCellElement, menuItems, that = this, $targetElement = $(jQueryEvent.target); $.each(VIEW_NAMES, function() { view = that.getView(this); $element = view && view.element(); if ($element && ($element.is($targetElement) || $element.find($targetElement).length)) { $targetCellElement = $targetElement.closest("td"); $targetRowElement = $targetCellElement.closest(".dx-row"); rowIndex = view.getRowIndex($targetRowElement); columnIndex = $targetCellElement[0] && $targetCellElement[0].cellIndex; rowOptions = $targetRowElement.data("options"); options = { jQueryEvent: jQueryEvent, targetElement: $targetElement, target: viewName[this], rowIndex: rowIndex, row: view._getRows()[rowIndex], columnIndex: columnIndex, column: rowOptions && rowOptions.cells[columnIndex].column }; options.items = view.getContextMenuItems && view.getContextMenuItems(options); that.executeAction("onContextMenuPreparing", options); that._contextMenuPrepared(options); menuItems = options.items; if (menuItems) { return false } } }); return menuItems }, _contextMenuPrepared: noop }); var ContextMenuView = modules.View.inherit({ _renderCore: function() { var that = this; this._createComponent(that.element().addClass(CONTEXT_MENU), ContextMenu, { onPositioning: function(actionArgs) { var event = actionArgs.jQueryEvent, contextMenuInstance = actionArgs.component, items = that.getController("contextMenu").getContextMenuItems(event); if (items) { contextMenuInstance.option("items", items); event.stopPropagation() } else { actionArgs.cancel = true } }, onItemClick: function(params) { params.itemData.onItemClick && params.itemData.onItemClick(params) }, cssClass: that.getWidgetContainerClass(), target: that.component.element() }) } }); module.exports = { defaultOptions: function() { return { onContextMenuPreparing: null } }, controllers: { contextMenu: ContextMenuController }, views: { contextMenuView: ContextMenuView } } }, /*!********************************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.error_handling.js ***! \********************************************************/ function(module, exports, __webpack_require__) { var gridCore = __webpack_require__( /*! ./ui.data_grid.core */ 348), errorHandlingModule = __webpack_require__( /*! ../grid_core/ui.grid_core.error_handling */ 369); gridCore.registerModule("errorHandling", errorHandlingModule) }, /*!********************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.error_handling.js ***! \********************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), clickEvent = __webpack_require__( /*! ../../events/click */ 75), modules = __webpack_require__( /*! ./ui.grid_core.modules */ 350); var ERROR_ROW_CLASS = "dx-error-row", ERROR_MESSAGE_CLASS = "dx-error-message", ERROR_CLOSEBUTTON_CLASS = "dx-closebutton", ACTION_CLASS = "action"; var ErrorHandlingController = modules.ViewController.inherit({ init: function() { var that = this; that._columnHeadersView = that.getView("columnHeadersView"); that._rowsView = that.getView("rowsView") }, _createErrorRow: function(message, $tableElements) { var $errorRow, $closeButton, that = this, $errorMessage = $("<div/>").addClass(ERROR_MESSAGE_CLASS).text(message); if ($tableElements) { $errorRow = $("<tr />").addClass(ERROR_ROW_CLASS); $closeButton = $("<div/>").addClass(ERROR_CLOSEBUTTON_CLASS).addClass(that.addWidgetPrefix(ACTION_CLASS)); $closeButton.on(clickEvent.name, that.createAction(function(args) { var $errorRow, e = args.jQueryEvent, errorRowIndex = $(e.currentTarget).closest("." + ERROR_ROW_CLASS).index(); e.stopPropagation(); $.each($tableElements, function(_, tableElement) { $errorRow = $(tableElement).children("tbody").children("tr").eq(errorRowIndex); that.removeErrorRow($errorRow) }) })); $("<td/>").attr({ colspan: that.getController("columns").getVisibleColumns().length, role: "presentation" }).prepend($closeButton).append($errorMessage).appendTo($errorRow); return $errorRow } return $errorMessage }, renderErrorRow: function(message, rowIndex, $popupContent) { var $row, $errorMessageElement, rowElements, viewElement, $tableElements, that = this; if ($popupContent) { $popupContent.find("." + ERROR_MESSAGE_CLASS).remove(); $errorMessageElement = that._createErrorRow(message); $popupContent.prepend($errorMessageElement); return } viewElement = rowIndex >= 0 ? that._rowsView : that._columnHeadersView, $tableElements = $popupContent || viewElement.getTableElements(); $.each($tableElements, function(_, tableElement) { $errorMessageElement = that._createErrorRow(message, $tableElements); rowElements = $(tableElement).children("tbody").children("tr"); if (rowIndex >= 0) { $row = viewElement._getRowElements($(tableElement)).eq(rowIndex); that.removeErrorRow(rowElements.eq($row.index() + 1)); $errorMessageElement.insertAfter($row) } else { that.removeErrorRow(rowElements.last()); $(tableElement).append($errorMessageElement) } }) }, removeErrorRow: function($row) { var $columnHeaders = this._columnHeadersView && this._columnHeadersView.element(); $row = $row || $columnHeaders && $columnHeaders.find("." + ERROR_ROW_CLASS); $row && $row.hasClass(ERROR_ROW_CLASS) && $row.remove() }, optionChanged: function(args) { var that = this; switch (args.name) { case "errorRowEnabled": args.handled = true; break; default: that.callBase(args) } } }); module.exports = { defaultOptions: function() { return { errorRowEnabled: true } }, controllers: { errorHandling: ErrorHandlingController }, extenders: { controllers: { data: { init: function() { var that = this, errorHandlingController = that.getController("errorHandling"); that.callBase(); that.dataErrorOccurred.add(function(error, $popupContent) { var message = error && error.message || error; if (that.option("errorRowEnabled")) { errorHandlingController.renderErrorRow(message, void 0, $popupContent) } }); that.changed.add(function() { var errorHandlingController = that.getController("errorHandling"), editingController = that.getController("editing"); if (editingController && !editingController.hasChanges()) { errorHandlingController && errorHandlingController.removeErrorRow() } }) } } } } } }, /*!***************************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.grid_view.js ***! \***************************************************/ function(module, exports, __webpack_require__) { var gridCore = __webpack_require__( /*! ./ui.data_grid.core */ 348), gridViewModule = __webpack_require__( /*! ../grid_core/ui.grid_core.grid_view */ 371); gridCore.registerModule("gridView", gridViewModule) }, /*!***************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.grid_view.js ***! \***************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), modules = __webpack_require__( /*! ./ui.grid_core.modules */ 350), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when; var TABLE_CLASS = "table", BORDERS_CLASS = "borders", TABLE_FIXED_CLASS = "table-fixed", IMPORTANT_MARGIN_CLASS = "important-margin", TEXT_CONTENT_CLASS = "text-content", HIDDEN_CLASS = "dx-hidden", HIDDEN_COLUMNS_WIDTH = "adaptiveHidden", EDITORS_INPUT_SELECTOR = "input:not([type='hidden'])", EMPTY_GRID_ROWS_HEIGHT = 100, LOADPANEL_MARGIN = 50, VIEW_NAMES = ["columnsSeparatorView", "blockSeparatorView", "trackerView", "headerPanel", "columnHeadersView", "rowsView", "footerView", "columnChooserView", "pagerView", "draggingHeaderView", "contextMenuView", "errorView", "headerFilterView"]; var isPercentWidth = function(width) { return commonUtils.isString(width) && "%" === width.slice(-1) }; var mergeArraysByMaxValue = function(values1, values2) { var i, result = []; if (values1 && values2 && values1.length && values1.length === values2.length) { for (i = 0; i < values1.length; i++) { result.push(values1[i] > values2[i] ? values1[i] : values2[i]) } } else { if (values1 && values1.length) { result = values1 } else { if (values2) { result = values2 } } } return result }; var getContainerHeight = function($container) { var clientHeight = $container.get(0).clientHeight, paddingTop = parseFloat($container.css("paddingTop")), paddingBottom = parseFloat($container.css("paddingBottom")); return clientHeight - paddingTop - paddingBottom }; var ResizingController = modules.ViewController.inherit({ _initPostRenderHandlers: function() { var that = this; if (!that._refreshSizesHandler) { that._refreshSizesHandler = function(e) { that._dataController.changed.remove(that._refreshSizesHandler); var resizeDeferred, changeType = e && e.changeType, isDelayed = e && e.isDelayed; if (!e || "refresh" === changeType || "prepend" === changeType || "append" === changeType) { if (!isDelayed) { resizeDeferred = that.resize() } } else { if ("update" === changeType) { if (that._dataController.items().length > 1 || "insert" !== e.changeTypes[0]) { that._rowsView.resize() } else { resizeDeferred = that.resize() } } } if (changeType && "updateSelection" !== changeType && !isDelayed) { when(resizeDeferred).done(function() { that.component._fireContentReadyAction() }) } }; that._dataController.changed.add(function() { that._dataController.changed.add(that._refreshSizesHandler) }) } }, _getBestFitWidths: function() { var rowsColumnWidths, headerColumnWidths, footerColumnWidths, resultWidths, that = this; rowsColumnWidths = that._rowsView.getColumnWidths(); headerColumnWidths = that._columnHeadersView && that._columnHeadersView.getColumnWidths(); footerColumnWidths = that._footerView && that._footerView.getColumnWidths(); resultWidths = mergeArraysByMaxValue(rowsColumnWidths, headerColumnWidths); resultWidths = mergeArraysByMaxValue(resultWidths, footerColumnWidths); return resultWidths }, _setVisibleWidths: function(visibleColumns, widths) { var columnsController = this._columnsController; columnsController.beginUpdate(); $.each(visibleColumns, function(index, column) { var columnId = column.command ? "command:" + column.command : column.index; columnsController.columnOption(columnId, "visibleWidth", widths[index]) }); columnsController.endUpdate() }, _toggleBestFitMode: function(isBestFit) { var $element = this.component.element(); $element.find("." + this.addWidgetPrefix(TABLE_CLASS)).toggleClass(this.addWidgetPrefix(TABLE_FIXED_CLASS), !isBestFit); $element.find(EDITORS_INPUT_SELECTOR).toggleClass(HIDDEN_CLASS, isBestFit); $element.find(".dx-group-cell").toggleClass(HIDDEN_CLASS, isBestFit); $element.find(".dx-header-row ." + this.addWidgetPrefix(TEXT_CONTENT_CLASS)).css("max-width", "") }, _synchronizeColumns: function() { var resetBestFitMode, that = this, columnsController = that._columnsController, visibleColumns = columnsController.getVisibleColumns(), columnAutoWidth = that.option("columnAutoWidth"), needBestFit = that._needBestFit(), hasMinWidth = false, isColumnWidthsCorrected = false, resultWidths = [], normalizeWidthsByExpandColumns = function() { var expandColumnWidth; $.each(visibleColumns, function(index, column) { if ("expand" === column.command) { expandColumnWidth = resultWidths[index] } }); $.each(visibleColumns, function(index, column) { if ("expand" === column.command && expandColumnWidth) { resultWidths[index] = expandColumnWidth } }) }; !needBestFit && $.each(visibleColumns, function(index, column) { if ("auto" === column.width || column.fixed) { needBestFit = true; return false } }); $.each(visibleColumns, function(index, column) { if (column.minWidth) { hasMinWidth = true; return false } }); that._setVisibleWidths(visibleColumns, []); if (needBestFit) { that._toggleBestFitMode(true); resetBestFitMode = true } commonUtils.deferUpdate(function() { if (needBestFit) { resultWidths = that._getBestFitWidths(); $.each(visibleColumns, function(index, column) { var columnId = column.command ? "command:" + column.command : column.index; columnsController.columnOption(columnId, "bestFitWidth", resultWidths[index], true) }) } else { if (hasMinWidth) { resultWidths = that._getBestFitWidths() } } $.each(visibleColumns, function(index) { if ("auto" !== this.width) { if (this.width) { resultWidths[index] = this.width } else { if (!columnAutoWidth && !this.minWidth) { resultWidths[index] = void 0 } } } }); isColumnWidthsCorrected = that._correctColumnWidths(resultWidths, visibleColumns); if (columnAutoWidth) { normalizeWidthsByExpandColumns(); that._processStretch(resultWidths, visibleColumns) } commonUtils.deferRender(function() { if (resetBestFitMode) { that._toggleBestFitMode(false); resetBestFitMode = false } if (needBestFit || isColumnWidthsCorrected) { that._setVisibleWidths(visibleColumns, resultWidths) } }) }) }, _needBestFit: function() { return this.option("columnAutoWidth") || this._maxHeightHappened }, _correctColumnWidths: function(resultWidths, visibleColumns) { var lastColumnIndex, that = this, hasPercentWidth = false, hasAutoWidth = false, isColumnWidthsCorrected = false, $element = that.component.element(), hasWidth = that._hasWidth; $.each(visibleColumns, function(index) { var isMinWidthApplied = false, isHiddenColumn = resultWidths[index] === HIDDEN_COLUMNS_WIDTH; if (resultWidths[index] < this.minWidth && !isHiddenColumn) { resultWidths[index] = this.minWidth; isColumnWidthsCorrected = true; isMinWidthApplied = true } if ("auto" !== this.width) { if (this.width) { if (!isHiddenColumn && !isMinWidthApplied) { resultWidths[index] = this.width } } else { hasAutoWidth = true } } if (isPercentWidth(this.width)) { hasPercentWidth = true } }); if ($element && that._maxWidth) { delete that._maxWidth; $element.css("max-width", "") } if (!hasAutoWidth && resultWidths.length) { var contentWidth = that._rowsView.contentWidth(), scrollbarWidth = that._rowsView.getScrollbarWidth(), totalWidth = that._getTotalWidth(resultWidths, contentWidth); if (totalWidth <= contentWidth) { lastColumnIndex = resultWidths.length - 1; while (lastColumnIndex >= 0 && visibleColumns[lastColumnIndex] && (visibleColumns[lastColumnIndex].command || resultWidths[lastColumnIndex] === HIDDEN_COLUMNS_WIDTH)) { lastColumnIndex-- } if (lastColumnIndex >= 0) { resultWidths[lastColumnIndex] = "auto"; isColumnWidthsCorrected = true; if (!hasWidth && !hasPercentWidth) { that._maxWidth = totalWidth + scrollbarWidth + (that.option("showBorders") ? 2 : 0); $element.css("max-width", that._maxWidth) } } } } return isColumnWidthsCorrected }, _processStretch: function(resultSizes, visibleColumns) { var diff, diffElement, onePixelElementsCount, i, groupSize = this._rowsView.contentWidth(), tableSize = this._getTotalWidth(resultSizes, groupSize), unusedIndexes = { length: 0 }; if (!resultSizes.length) { return } $.each(visibleColumns, function(index) { if (this.width || resultSizes[index] === HIDDEN_COLUMNS_WIDTH) { unusedIndexes[index] = true; unusedIndexes.length++ } }); diff = groupSize - tableSize; diffElement = Math.floor(diff / (resultSizes.length - unusedIndexes.length)); onePixelElementsCount = diff - diffElement * (resultSizes.length - unusedIndexes.length); if (diff >= 0) { for (i = 0; i < resultSizes.length; i++) { if (unusedIndexes[i]) { continue } resultSizes[i] += diffElement; if (onePixelElementsCount) { resultSizes[i]++; onePixelElementsCount-- } } } }, _getTotalWidth: function(widths, groupWidth) { var width, i, result = 0; for (i = 0; i < widths.length; i++) { width = widths[i]; if (width && width !== HIDDEN_COLUMNS_WIDTH) { result += isPercentWidth(width) ? parseInt(width) * groupWidth / 100 : parseInt(width) } } return Math.round(result) }, updateSize: function($rootElement) { var $groupElement, width, that = this, importantMarginClass = that.addWidgetPrefix(IMPORTANT_MARGIN_CLASS); if (void 0 === that._hasHeight && $rootElement && $rootElement.is(":visible")) { $groupElement = $rootElement.children("." + that.getWidgetContainerClass()); if ($groupElement.length) { $groupElement.detach() } that._hasHeight = !!getContainerHeight($rootElement); width = $rootElement.width(); $rootElement.addClass(importantMarginClass); that._hasWidth = $rootElement.width() === width; $rootElement.removeClass(importantMarginClass); if ($groupElement.length) { $groupElement.appendTo($rootElement) } } }, publicMethods: function() { return ["resize", "updateDimensions"] }, resize: function() { return !this.component._requireResize && this.updateDimensions() }, updateDimensions: function(checkSize) { var that = this, $element = that.component.element(), maxHeight = parseFloat($element.css("maxHeight")), minHeight = parseFloat($element.css("minHeight")); that._initPostRenderHandlers(); if (!that._checkSize(checkSize)) { return } return commonUtils.deferRender(function() { var scrollTop, scrollable = that._rowsView.getScrollable(); if (that._dataController.isLoaded()) { that._synchronizeColumns(); if (maxHeight || minHeight) { scrollTop = scrollable && scrollable._container().get(0).scrollTop; that._rowsView.height("auto") } } commonUtils.deferUpdate(function() { commonUtils.deferRender(function() { commonUtils.deferUpdate(function() { that._updateDimensionsCore(maxHeight, scrollTop) }) }) }) }) }, _checkSize: function(checkSize) { var $rootElement = this.component.element(); if (checkSize && (this._lastWidth === $rootElement.width() && this._lastHeight === $rootElement.height() || !$rootElement.is(":visible"))) { return false } return true }, _updateDimensionsCore: function(maxHeight, scrollTop) { var rowsViewHeight, $testDiv, that = this, scrollable = that._rowsView.getScrollable(), dataController = that._dataController, rowsView = that._rowsView, columnHeadersView = that._columnHeadersView, footerView = that._footerView, $rootElement = that.component.element(), rootElementHeight = $rootElement && ($rootElement.get(0).clientHeight || $rootElement.height()), maxHeightHappened = maxHeight && rootElementHeight >= maxHeight, hasHeight = that._hasHeight || maxHeightHappened, loadPanelOptions = that.option("loadPanel"), height = that.option("height") || $rootElement.get(0).style.height, editorFactory = that.getController("editorFactory"); that._maxHeightHappened = maxHeightHappened; that.updateSize($rootElement); if (height && that._hasHeight ^ "auto" !== height) { $testDiv = $("<div>").height(height).appendTo($rootElement); that._hasHeight = !!$testDiv.height(); $testDiv.remove() } if (that.option("scrolling") && (that._hasHeight && rootElementHeight > 0 || maxHeightHappened)) { rowsViewHeight = rootElementHeight; $.each(that.getViews(), function() { if (this.isVisible() && this.getHeight) { rowsViewHeight -= this.getHeight() } }) } else { if (!that._hasHeight && 0 === dataController.items().length) { rowsViewHeight = loadPanelOptions && loadPanelOptions.enabled ? loadPanelOptions.height + LOADPANEL_MARGIN : EMPTY_GRID_ROWS_HEIGHT } else { rowsViewHeight = "auto" } } commonUtils.deferRender(function() { rowsView.height(rowsViewHeight, hasHeight); if (scrollTop && scrollable) { scrollable._container().get(0).scrollTop = scrollTop } if (!dataController.isLoaded()) { rowsView.setLoading(true); return } commonUtils.deferUpdate(function() { that._updateLastSizes($rootElement); var vScrollbarWidth = hasHeight ? rowsView.getScrollbarWidth() : 0; var hScrollbarWidth = rowsView.getScrollbarWidth(true); commonUtils.deferRender(function() { columnHeadersView && columnHeadersView.setScrollerSpacing(vScrollbarWidth); footerView && footerView.setScrollerSpacing(vScrollbarWidth); rowsView.setScrollerSpacing(vScrollbarWidth, hScrollbarWidth) }); $.each(VIEW_NAMES, function(index, viewName) { var view = that.getView(viewName); if (view) { view.resize() } }); editorFactory && editorFactory.resize() }) }) }, _updateLastSizes: function($rootElement) { this._lastWidth = $rootElement.width(); this._lastHeight = $rootElement.height() }, optionChanged: function(args) { switch (args.name) { case "width": case "height": this.component._renderDimensions(); this.resize(); default: this.callBase(args) } }, init: function() { var that = this; that._dataController = that.getController("data"); that._columnsController = that.getController("columns"); that._columnHeadersView = that.getView("columnHeadersView"); that._footerView = that.getView("footerView"); that._rowsView = that.getView("rowsView") } }); var SynchronizeScrollingController = modules.ViewController.inherit({ _scrollChangedHandler: function(views, pos, viewName) { for (var j = 0; j < views.length; j++) { if (views[j] && views[j].name !== viewName) { views[j].scrollTo({ left: pos.left, top: pos.top }) } } }, init: function() { var view, i, views = [this.getView("columnHeadersView"), this.getView("footerView"), this.getView("rowsView")]; for (i = 0; i < views.length; i++) { view = views[i]; if (view) { view.scrollChanged.add(this._scrollChangedHandler.bind(this, views)) } } } }); var GridView = modules.View.inherit({ _endUpdateCore: function() { if (this.component._requireResize) { this.component._requireResize = false; this._resizingController.resize() } }, _getWidgetAriaLabel: function() { return "dxDataGrid-ariaDataGrid" }, init: function() { var that = this; that._resizingController = this.getController("resizing"); that._dataController = that.getController("data") }, getView: function(name) { return this.component._views[name] }, element: function() { return this._groupElement }, optionChanged: function(args) { var that = this; if (commonUtils.isDefined(that._groupElement) && "showBorders" === args.name) { that._groupElement.toggleClass(that.addWidgetPrefix(BORDERS_CLASS), !!args.value); args.handled = true } else { that.callBase(args) } }, _renderViews: function($groupElement) { var that = this; $.each(VIEW_NAMES, function(index, viewName) { var view = that.getView(viewName); if (view) { view.render($groupElement) } }) }, render: function($rootElement) { var that = this, isFirstRender = !that._groupElement, $groupElement = that._groupElement || $("<div>").addClass(that.getWidgetContainerClass()); $groupElement.toggleClass(that.addWidgetPrefix(BORDERS_CLASS), !!that.option("showBorders")); that.component.setAria({ role: "application", label: messageLocalization.format(that._getWidgetAriaLabel()) }, $rootElement); that._rootElement = $rootElement || that._rootElement; if (isFirstRender) { that._groupElement = $groupElement; that.getController("resizing").updateSize($rootElement); $groupElement.appendTo($rootElement) } that._renderViews($groupElement); that.update() }, update: function() { var that = this, $rootElement = that._rootElement, $groupElement = that._groupElement, resizingController = that.getController("resizing"); if ($rootElement && $groupElement) { resizingController.resize(); if (that._dataController.isLoaded()) { that.component._fireContentReadyAction() } } } }); module.exports = { defaultOptions: function() { return { showBorders: false } }, controllers: { resizing: ResizingController, synchronizeScrolling: SynchronizeScrollingController }, views: { gridView: GridView } } }, /*!******************************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.header_panel.js ***! \******************************************************/ function(module, exports, __webpack_require__) { var gridCore = __webpack_require__( /*! ./ui.data_grid.core */ 348), headerPanelModule = __webpack_require__( /*! ../grid_core/ui.grid_core.header_panel */ 373); exports.HeaderPanel = headerPanelModule.views.headerPanel; gridCore.registerModule("headerPanel", headerPanelModule) }, /*!******************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.header_panel.js ***! \******************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Toolbar = __webpack_require__( /*! ../toolbar */ 322), columnsView = __webpack_require__( /*! ./ui.grid_core.columns_view */ 353), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), domUtils = __webpack_require__( /*! ../../core/utils/dom */ 56); __webpack_require__( /*! ../drop_down_menu */ 281); var HEADER_PANEL_CLASS = "header-panel", TOOLBAR_BUTTON_CLASS = "toolbar-button"; var HeaderPanel = columnsView.ColumnsView.inherit({ _getToolbarItems: function() { return [] }, _getButtonContainer: function() { return $("<div />").addClass(this.addWidgetPrefix(TOOLBAR_BUTTON_CLASS)) }, _getToolbarButtonClass: function(specificClass) { var secondClass = specificClass ? " " + specificClass : ""; return this.addWidgetPrefix(TOOLBAR_BUTTON_CLASS) + secondClass }, _getToolbarOptions: function() { var toolbarItems, options = { toolbarOptions: { items: this._getToolbarItems(), onItemRendered: function(e) { var itemRenderedCallback = e.itemData.onItemRendered; if (itemRenderedCallback) { itemRenderedCallback(e) } } } }; this.executeAction("onToolbarPreparing", options); if (options.toolbarOptions && !commonUtils.isDefined(options.toolbarOptions.visible)) { toolbarItems = options.toolbarOptions.items; options.toolbarOptions.visible = !!(toolbarItems && toolbarItems.length) } return options.toolbarOptions }, _renderCore: function() { if (!this._toolbar) { this.element().addClass(this.addWidgetPrefix(HEADER_PANEL_CLASS)); this._toolbar = this._createComponent($("<div />").appendTo(this.element()), Toolbar, this._toolbarOptions) } else { this._toolbar.option(this._toolbarOptions) } }, _columnOptionChanged: commonUtils.noop, init: function() { this.callBase(); this.createAction("onToolbarPreparing", { excludeValidators: ["designMode", "disabled", "readOnly"] }) }, render: function() { this._toolbarOptions = this._getToolbarOptions(); this.callBase.apply(this, arguments) }, setToolbarItemDisabled: function(name, optionValue) { var toolbarInstance = this._toolbar; if (toolbarInstance) { var items = toolbarInstance.option("items") || [], itemIndex = items.indexOf(items.filter(function(item) { return item.name === name })[0]); if (itemIndex >= 0) { var itemOptionPrefix = "items[" + itemIndex + "]"; if (toolbarInstance.option(itemOptionPrefix + ".options")) { toolbarInstance.option(itemOptionPrefix + ".options.disabled", optionValue) } else { toolbarInstance.option(itemOptionPrefix + ".disabled", optionValue) } } } }, getHeaderPanel: function() { return this.element() }, getHeight: function() { return this.getElementHeight() }, optionChanged: function(args) { if ("onToolbarPreparing" === args.name) { this._invalidate(); args.handled = true } this.callBase(args) }, isVisible: function() { return this._toolbarOptions && this._toolbarOptions.visible }, allowDragging: commonUtils.noop }); module.exports = { defaultOptions: function() { return {} }, views: { headerPanel: HeaderPanel }, extenders: { controllers: { resizing: { _updateDimensionsCore: function() { this.callBase.apply(this, arguments); var $headerPanelElement = this.getView("headerPanel").element(); if ($headerPanelElement) { domUtils.triggerResizeEvent($headerPanelElement) } } } } } } }, /*!*******************************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.state_storing.js ***! \*******************************************************/ function(module, exports, __webpack_require__) { var gridCore = __webpack_require__( /*! ./ui.data_grid.core */ 348), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, stateStoringCore = __webpack_require__( /*! ../grid_core/ui.grid_core.state_storing */ 375), equalByValue = commonUtils.equalByValue; var processLoadState = function(that) { var columnsController = that.getController("columns"), selectionController = that.getController("selection"), exportController = that.getController("export"), dataController = that.getController("data"), pagerView = that.getView("pagerView"); if (columnsController) { columnsController.columnsChanged.add(function() { var columnsState = columnsController.getUserState(), columnsStateHash = commonUtils.getKeyHash(columnsState), currentColumnsStateHash = commonUtils.getKeyHash(that._state.columns); if (!equalByValue(currentColumnsStateHash, columnsStateHash)) { extend(that._state, { columns: columnsState }); that.isEnabled() && that.save() } }) } if (selectionController) { selectionController.selectionChanged.add(function(e) { extend(that._state, { selectedRowKeys: e.selectedRowKeys, selectionFilter: e.selectionFilter }); that.isEnabled() && that.save() }) } if (dataController) { that._initialPageSize = that.option("paging.pageSize"); dataController.changed.add(function() { extend(that._state, { searchText: that.option("searchPanel.text"), pageIndex: dataController.pageIndex(), pageSize: dataController.pageSize(), allowedPageSizes: pagerView ? pagerView.getPageSizes() : void 0 }); that.isEnabled() && that.save() }) } if (exportController) { exportController.selectionOnlyChanged.add(function() { extend(that._state, { exportSelectionOnly: exportController.selectionOnly() }); that.isEnabled() && that.save() }) } }; var applyState = function(that, state) { var allowedPageSizes = state.allowedPageSizes, searchText = state.searchText, selectedRowKeys = state.selectedRowKeys, selectionFilter = state.selectionFilter, exportController = that.getController("export"), columnsController = that.getController("columns"), scrollingMode = that.option("scrolling.mode"); that.component.beginUpdate(); if (columnsController) { columnsController.setUserState(state.columns) } if (exportController) { exportController.selectionOnly(state.exportSelectionOnly) } that.option("selectedRowKeys", selectedRowKeys || []); that.option("selectionFilter", selectionFilter); if (allowedPageSizes && "auto" === that.option("pager.allowedPageSizes")) { that.option("pager").allowedPageSizes = allowedPageSizes } that.component.endUpdate(); that.option("searchPanel.text", searchText || ""); that.option("paging.pageSize", "virtual" !== scrollingMode && "infinite" !== scrollingMode && state.pageSize ? state.pageSize : that._initialPageSize); that.option("paging.pageIndex", state.pageIndex || 0) }; gridCore.registerModule("stateStoring", { defaultOptions: function() { return { stateStoring: { enabled: false, storageKey: null, type: "localStorage", customLoad: null, customSave: null, savingTimeout: 2e3 } } }, controllers: { stateStoring: stateStoringCore.StateStoringController }, extenders: { controllers: { stateStoring: { init: function() { this.callBase.apply(this, arguments); processLoadState(this) }, isLoading: function() { return this.callBase() || this.getController("data").isStateLoading() }, state: function(state) { var result = this.callBase.apply(this, arguments); if (void 0 !== state) { applyState(this, extend({}, state)) } return result } }, columns: { getVisibleColumns: function() { var visibleColumns = this.callBase.apply(this, arguments), stateStoringController = this.getController("stateStoring"); return stateStoringController.isEnabled() && !stateStoringController.isLoaded() ? [] : visibleColumns } }, data: { _refreshDataSource: function() { var that = this, callBase = that.callBase, stateStoringController = that.getController("stateStoring"); if (stateStoringController.isEnabled() && !stateStoringController.isLoaded()) { clearTimeout(that._restoreStateTimeoutID); that._restoreStateTimeoutID = setTimeout(function() { stateStoringController.load().always(function() { that._restoreStateTimeoutID = null; callBase.call(that) }) }) } else { if (!that.isStateLoading()) { callBase.call(that) } } }, isLoading: function() { var that = this, stateStoringController = that.getController("stateStoring"); return this.callBase() || stateStoringController.isLoading() }, isStateLoading: function() { return commonUtils.isDefined(this._restoreStateTimeoutID) }, isLoaded: function() { return this.callBase() && !this.isStateLoading() }, dispose: function() { clearTimeout(this._restoreStateTimeoutID); this.callBase() } } } } }) }, /*!*******************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.state_storing.js ***! \*******************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), modules = __webpack_require__( /*! ./ui.grid_core.modules */ 350), errors = __webpack_require__( /*! ../widget/ui.errors */ 22), browser = __webpack_require__( /*! ../../core/utils/browser */ 23), sessionStorage = __webpack_require__( /*! ../../core/utils/storage */ 54).sessionStorage, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), typeUtils = __webpack_require__( /*! ../../core/utils/type */ 12); var DATE_REGEX = /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/; var parseDates = function(state) { if (!state) { return } $.each(state, function(key, value) { var date; if (typeUtils.isPlainObject(value) || Array.isArray(value)) { parseDates(value) } else { if ("string" === typeof value) { date = DATE_REGEX.exec(value); if (date) { state[key] = new Date(Date.UTC(+date[1], +date[2] - 1, +date[3], +date[4], +date[5], +date[6])) } } } }) }; exports.StateStoringController = modules.ViewController.inherit(function() { var getStorage = function(options) { var storage = "sessionStorage" === options.type ? sessionStorage() : localStorage; if (!storage) { if ("file:" === window.location.protocol && browser.msie) { throw new Error("E1038") } else { throw new Error("E1007") } } return storage }; var getUniqueStorageKey = function(options) { return commonUtils.isDefined(options.storageKey) ? options.storageKey : "storage" }; return { _loadState: function() { var options = this.option("stateStoring"); if ("custom" === options.type) { return options.customLoad && options.customLoad() } try { return JSON.parse(getStorage(options).getItem(getUniqueStorageKey(options))) } catch (e) { errors.log(e.message) } }, _saveState: function(state) { var options = this.option("stateStoring"); if ("custom" === options.type) { options.customSave && options.customSave(state); return } try { getStorage(options).setItem(getUniqueStorageKey(options), JSON.stringify(state)) } catch (e) {} }, publicMethods: function() { return ["state"] }, isEnabled: function() { return this.option("stateStoring.enabled") }, init: function() { var that = this; that._state = {}; that._isLoaded = false; that._isLoading = false; that._windowUnloadHandler = function() { if (void 0 !== that._savingTimeoutID) { that._saveState(that.state()) } }; $(window).on("unload", that._windowUnloadHandler); return that }, isLoaded: function() { return this._isLoaded }, isLoading: function() { return this._isLoading }, load: function() { var loadResult, that = this; that._isLoading = true; loadResult = that._loadState(); if (!loadResult || !commonUtils.isFunction(loadResult.done)) { loadResult = $.Deferred().resolve(loadResult) } loadResult.done(function(state) { that._isLoaded = true; that._isLoading = false; that.state(state) }); return loadResult }, state: function(state) { var that = this; if (!arguments.length) { return extend(true, {}, that._state) } else { that._state = extend({}, state); parseDates(that._state) } }, save: function() { var that = this; clearTimeout(that._savingTimeoutID); that._savingTimeoutID = setTimeout(function() { that._saveState(that.state()); that._savingTimeoutID = void 0 }, that.option("stateStoring.savingTimeout")) }, optionChanged: function(args) { var that = this; switch (args.name) { case "stateStoring": if (that.isEnabled() && !that.isLoading()) { that.load() } args.handled = true; break; default: that.callBase(args) } }, dispose: function() { clearTimeout(this._savingTimeoutID); $(window).off("unload", this._windowUnloadHandler) } } }()) }, /*!***************************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.selection.js ***! \***************************************************/ function(module, exports, __webpack_require__) { var gridCore = __webpack_require__( /*! ./ui.data_grid.core */ 348), selectionModule = __webpack_require__( /*! ../grid_core/ui.grid_core.selection */ 377); gridCore.registerModule("selection", selectionModule) }, /*!***************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.selection.js ***! \***************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), gridCore = __webpack_require__( /*! ../data_grid/ui.data_grid.core */ 348), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, support = __webpack_require__( /*! ../../core/utils/support */ 61), clickEvent = __webpack_require__( /*! ../../events/click */ 75), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), eventUtils = __webpack_require__( /*! ../../events/utils */ 71), holdEvent = __webpack_require__( /*! ../../events/hold */ 164), Selection = __webpack_require__( /*! ../selection/selection */ 169); var EDITOR_CELL_CLASS = "dx-editor-cell", ROW_CLASS = "dx-row", ROW_SELECTION_CLASS = "dx-selection", SELECT_CHECKBOX_CLASS = "dx-select-checkbox", CHECKBOXES_HIDDEN_CLASS = "dx-select-checkboxes-hidden", COMMAND_SELECT_CLASS = "dx-command-select", SELECTION_DISABLED_CLASS = "dx-selection-disabled", DATA_ROW_CLASS = "dx-data-row"; var SHOW_CHECKBOXES_MODE = "selection.showCheckBoxesMode", SELECTION_MODE = "selection.mode"; var processLongTap = function(that, jQueryEvent) { var selectionController = that.getController("selection"), rowsView = that.getView("rowsView"), $row = $(jQueryEvent.target).closest("." + DATA_ROW_CLASS), rowIndex = rowsView.getRowIndex($row); if (rowIndex < 0) { return } if ("onLongTap" === that.option(SHOW_CHECKBOXES_MODE)) { if (selectionController.isSelectionWithCheckboxes()) { selectionController.stopSelectionWithCheckboxes() } else { selectionController.startSelectionWithCheckboxes() } } else { if ("onClick" === that.option(SHOW_CHECKBOXES_MODE)) { selectionController.startSelectionWithCheckboxes() } if ("always" !== that.option(SHOW_CHECKBOXES_MODE)) { selectionController.changeItemSelection(rowIndex, { control: true }) } } }; exports.SelectionController = gridCore.Controller.inherit(function() { var isSeveralRowsSelected = function(that, selectionFilter) { var keyIndex = 0, store = that.getController("data").store(), key = store && store.key(), isComplexKey = Array.isArray(key); if (!selectionFilter.length) { return false } if (isComplexKey && Array.isArray(selectionFilter[0]) && "and" === selectionFilter[1]) { for (var i = 0; i < selectionFilter.length; i++) { if (Array.isArray(selectionFilter[i])) { if (selectionFilter[i][0] !== key[keyIndex] || "=" !== selectionFilter[i][1]) { return true } keyIndex++ } } return false } return key !== selectionFilter[0] }; return { init: function() { var that = this, dataController = that.getController("data"), selectionOptions = that.option("selection") || {}; that._selectionMode = that.option(SELECTION_MODE); that._isSelectionWithCheckboxes = false; that._selection = that._createSelection({ selectedKeys: that.option("selectedRowKeys"), mode: that._selectionMode, deferred: selectionOptions.deferred, maxFilterLengthInRequest: selectionOptions.maxFilterLengthInRequest, selectionFilter: that.option("selectionFilter"), key: function() { return dataController && dataController.key() }, keyOf: function(item) { return dataController && dataController.keyOf(item) }, dataFields: function() { return dataController.dataSource() && dataController.dataSource().select() }, load: function(options) { return dataController.dataSource() && dataController.dataSource().load(options) || $.Deferred().resolve([]) }, plainItems: function() { return dataController.items() }, isItemSelected: function(item) { return item.selected }, isSelectableItem: function(item) { return item && "data" === item.rowType && !item.inserted }, getItemData: function(item) { return item && (item.oldData || item.data || item) }, filter: function() { return dataController.getCombinedFilter() }, totalCount: function() { return dataController.totalCount() }, onSelectionChanged: that._updateSelectedItems.bind(this) }); that._updateSelectColumn(); that.createAction("onSelectionChanged", { excludeValidators: ["disabled", "readOnly"] }) }, _updateSelectColumn: function() { var columnsController = this.getController("columns"), isSelectColumnVisible = this.isSelectColumnVisible(); columnsController.addCommandColumn({ command: "select", visible: isSelectColumnVisible, visibleIndex: -1, dataType: "boolean", alignment: "center", cssClass: COMMAND_SELECT_CLASS, width: "auto" }); columnsController.columnOption("command:select", "visible", isSelectColumnVisible) }, _createSelection: function(options) { return new Selection(options) }, _fireSelectionChanged: function() { var argument = this.option("selection.deferred") ? { selectionFilter: this.option("selectionFilter") } : { selectedRowKeys: this.option("selectedRowKeys") }; this.selectionChanged.fire(argument) }, _updateCheckboxesState: function(options) { var isDeferredMode = options.isDeferredMode, selectionFilter = options.selectionFilter, selectedItemKeys = options.selectedItemKeys, removedItemKeys = options.removedItemKeys; if ("onClick" === this.option(SHOW_CHECKBOXES_MODE)) { if (isDeferredMode ? selectionFilter && isSeveralRowsSelected(this, selectionFilter) : selectedItemKeys.length > 1) { this.startSelectionWithCheckboxes() } else { if (isDeferredMode ? selectionFilter && !selectionFilter.length : 0 === selectedItemKeys.length && removedItemKeys.length) { this.stopSelectionWithCheckboxes() } } } }, _updateSelectedItems: function(args) { var that = this, isDeferredMode = that.option("selection.deferred"), selectionFilter = that._selection.selectionFilter(), dataController = that.getController("data"), items = dataController.items(); if (!items) { return } var isSelectionWithCheckboxes = that.isSelectionWithCheckboxes(); var changedItemIndexes = that.getChangedItemIndexes(items); that._updateCheckboxesState({ selectedItemKeys: args.selectedItemKeys, removedItemKeys: args.removedItemKeys, selectionFilter: selectionFilter, isDeferredMode: isDeferredMode }); if (changedItemIndexes.length || isSelectionWithCheckboxes !== that.isSelectionWithCheckboxes()) { dataController.updateItems({ changeType: "updateSelection", itemIndexes: changedItemIndexes }) } if (isDeferredMode) { that.option("selectionFilter", selectionFilter); that._fireSelectionChanged(); that.executeAction("onSelectionChanged", {}) } else { if (args.addedItemKeys.length || args.removedItemKeys.length) { that._selectedItemsInternalChange = true; that.option("selectedRowKeys", args.selectedItemKeys.slice(0)); that._selectedItemsInternalChange = false; that.executeAction("onSelectionChanged", { selectedRowsData: args.selectedItems, selectedRowKeys: args.selectedItemKeys, currentSelectedRowKeys: args.addedItemKeys, currentDeselectedRowKeys: args.removedItemKeys }) } that._fireSelectionChanged() } }, getChangedItemIndexes: function(items) { var that = this, itemIndexes = [], isDeferredSelection = this.option("selection.deferred"); for (var i = 0, length = items.length; i < length; i++) { var row = items[i]; var isItemSelected = that._selection.isItemSelected(isDeferredSelection ? row.data : row.key); if (that._selection.isDataItem(row) && row.isSelected !== isItemSelected) { itemIndexes.push(i) } } return itemIndexes }, callbackNames: function() { return ["selectionChanged"] }, optionChanged: function(args) { var that = this; that.callBase(args); switch (args.name) { case "selection": var oldSelectionMode = that._selectionMode; that.init(); var selectionMode = that._selectionMode; var selectedRowKeys = that.option("selectedRowKeys"); if (oldSelectionMode !== selectionMode) { if ("single" === selectionMode) { if (selectedRowKeys.length > 1) { selectedRowKeys = [selectedRowKeys[0]] } } else { if ("multiple" !== selectionMode) { selectedRowKeys = [] } } } that.selectRows(selectedRowKeys).always(function() { that._fireSelectionChanged() }); that.getController("columns").updateColumns(); args.handled = true; break; case "selectionFilter": this._selection.selectionFilter(args.value); args.handled = true; break; case "selectedRowKeys": if (Array.isArray(args.value) && !that._selectedItemsInternalChange && that.component.getDataSource()) { that.selectRows(args.value) } args.handled = true } }, publicMethods: function() { return ["selectRows", "deselectRows", "selectRowsByIndexes", "getSelectedRowKeys", "getSelectedRowsData", "clearSelection", "selectAll", "deselectAll", "startSelectionWithCheckboxes", "stopSelectionWithCheckboxes", "isRowSelected"] }, isRowSelected: function(arg) { return this._selection.isItemSelected(arg) }, isSelectColumnVisible: function() { return "multiple" === this.option(SELECTION_MODE) && ("always" === this.option(SHOW_CHECKBOXES_MODE) || "onClick" === this.option(SHOW_CHECKBOXES_MODE) || this._isSelectionWithCheckboxes) }, _isOnePageSelectAll: function() { return "page" === this.option("selection.selectAllMode") }, isSelectAll: function() { return this._selection.getSelectAllState(this._isOnePageSelectAll()) }, selectAll: function() { if ("onClick" === this.option(SHOW_CHECKBOXES_MODE)) { this.startSelectionWithCheckboxes() } return this._selection.selectAll(this._isOnePageSelectAll()) }, deselectAll: function() { return this._selection.deselectAll(this._isOnePageSelectAll()) }, clearSelection: function() { return this.selectedItemKeys([]) }, refresh: function() { var selectedRowKeys = this.option("selectedRowKeys") || []; if (!this.option("selection.deferred") && selectedRowKeys.length) { return this.selectedItemKeys(selectedRowKeys) } return $.Deferred().resolve().promise() }, selectedItemKeys: function(value, preserve, isDeselect, isSelectAll) { return this._selection.selectedItemKeys(value, preserve, isDeselect, isSelectAll) }, getSelectedRowKeys: function() { return this._selection.getSelectedItemKeys() }, selectRows: function(keys, preserve) { return this.selectedItemKeys(keys, preserve) }, deselectRows: function(keys) { return this.selectedItemKeys(keys, true, true) }, selectRowsByIndexes: function(indexes) { var items = this.getController("data").items(), keys = []; if (!Array.isArray(indexes)) { indexes = Array.prototype.slice.call(arguments, 0) } $.each(indexes, function() { var item = items[this]; if (item && "data" === item.rowType) { keys.push(item.key) } }); return this.selectRows(keys) }, getSelectedRowsData: function() { return this._selection.getSelectedItems() }, changeItemSelection: function(itemIndex, keys) { keys = keys || {}; if (this.isSelectionWithCheckboxes()) { keys.control = true } return this._selection.changeItemSelection(itemIndex, keys) }, focusedItemIndex: function(itemIndex) { var that = this; if (commonUtils.isDefined(itemIndex)) { that._selection._focusedItemIndex = itemIndex } else { return that._selection._focusedItemIndex } }, isSelectionWithCheckboxes: function() { return "multiple" === this.option(SELECTION_MODE) && ("always" === this.option(SHOW_CHECKBOXES_MODE) || this._isSelectionWithCheckboxes) }, startSelectionWithCheckboxes: function() { var that = this; if ("multiple" === that.option(SELECTION_MODE) && !that.isSelectionWithCheckboxes()) { that._isSelectionWithCheckboxes = true; that._updateSelectColumn(); return true } return false }, stopSelectionWithCheckboxes: function() { var that = this; if (that._isSelectionWithCheckboxes) { that._isSelectionWithCheckboxes = false; that._updateSelectColumn(); return true } return false } } }()); module.exports = { defaultOptions: function() { return { selection: { mode: "none", showCheckBoxesMode: "onClick", allowSelectAll: true, selectAllMode: "allPages", maxFilterLengthInRequest: 1500, deferred: false }, selectionFilter: [], selectedRowKeys: [] } }, controllers: { selection: exports.SelectionController }, extenders: { controllers: { data: { init: function() { var selectionController = this.getController("selection"), isDeferredMode = this.option("selection.deferred"); this.callBase.apply(this, arguments); if (isDeferredMode) { selectionController._updateCheckboxesState({ isDeferredMode: true, selectionFilter: this.option("selectionFilter") }) } }, _loadDataSource: function() { var that = this; return that.callBase().done(function() { that.getController("selection").refresh() }) }, pageIndex: function(value) { var that = this, dataSource = that._dataSource; if (dataSource && value && dataSource.pageIndex() !== value) { that.getController("selection").focusedItemIndex(-1) } return that.callBase(value) }, _processDataItem: function(item, options) { var that = this, selectionController = that.getController("selection"), hasSelectColumn = selectionController.isSelectColumnVisible(), isDeferredSelection = options.isDeferredSelection = void 0 === options.isDeferredSelection ? this.option("selection.deferred") : options.isDeferredSelection, dataItem = this.callBase.apply(this, arguments); dataItem.isSelected = selectionController.isRowSelected(isDeferredSelection ? dataItem.data : dataItem.key); if (hasSelectColumn && dataItem.values) { for (var i = 0; i < options.visibleColumns.length; i++) { if ("select" === options.visibleColumns[i].command) { dataItem.values[i] = dataItem.isSelected; break } } } return dataItem }, refresh: function() { var that = this, d = $.Deferred(); this.callBase.apply(this, arguments).done(function() { that.getController("selection").refresh().done(d.resolve).fail(d.reject) }).fail(d.reject); return d.promise() } }, contextMenu: { _contextMenuPrepared: function(options) { var jQueryEvent = options.jQueryEvent; if (jQueryEvent.originalEvent && "dxhold" !== jQueryEvent.originalEvent.type || options.items && options.items.length > 0) { return } processLongTap(this, jQueryEvent) } } }, views: { columnHeadersView: { init: function() { var that = this; that.callBase(); that.getController("selection").selectionChanged.add(that._updateSelectAllValue.bind(that)) }, _updateSelectAllValue: function() { var that = this, $element = that.element(), $editor = $element && $element.find("." + SELECT_CHECKBOX_CLASS); if ($element && $editor.length && "multiple" === that.option("selection.mode")) { $editor.dxCheckBox("instance").option("value", that.getController("selection").isSelectAll()) } }, _handleDataChanged: function(e) { this.callBase(e); if (!e || "refresh" === e.changeType) { this._updateSelectAllValue() } }, _getDefaultTemplate: function(column) { var that = this; if ("select" === column.command) { return function($cell, options) { var column = options.column; if ("select" === column.command) { $cell.addClass(EDITOR_CELL_CLASS); that._renderSelectAllCheckBox($cell, column); that._attachSelectAllCheckBoxClickEvent($cell) } } } else { return that.callBase(column) } }, _renderSelectAllCheckBox: function($container, column) { var groupElement, that = this, selectionController = that.getController("selection"); groupElement = $("<div />").appendTo($container).addClass(SELECT_CHECKBOX_CLASS); that.setAria("label", messageLocalization.format("dxDataGrid-ariaSelectAll"), $container); that.getController("editorFactory").createEditor(groupElement, extend({}, column, { parentType: "headerRow", dataType: "boolean", value: selectionController.isSelectAll(), editorOptions: { visible: that.option("selection.allowSelectAll") || false !== selectionController.isSelectAll() }, tabIndex: -1, setValue: function(value, e) { var allowSelectAll = that.option("selection.allowSelectAll"); e.component.option("visible", allowSelectAll || false !== e.component.option("value")); if (!e.jQueryEvent || selectionController.isSelectAll() === value) { return } if (e.value && !allowSelectAll) { e.component.option("value", false) } else { e.value ? selectionController.selectAll() : selectionController.deselectAll() } e.jQueryEvent.preventDefault() } })); return groupElement }, _attachSelectAllCheckBoxClickEvent: function($element) { $element.on(clickEvent.name, this.createAction(function(e) { var event = e.jQueryEvent; if (!$(event.target).closest("." + SELECT_CHECKBOX_CLASS).length) { $(event.currentTarget).children().trigger(clickEvent.name) } event.stopPropagation(); event.preventDefault() })) } }, rowsView: { _getDefaultTemplate: function(column) { var that = this; if ("select" === column.command) { return function(container, options) { that.renderSelectCheckBoxContainer(column, container, options) } } else { return that.callBase(column) } }, renderSelectCheckBoxContainer: function(column, container, options) { if ("data" === options.rowType && !options.row.inserted) { container.addClass(EDITOR_CELL_CLASS); this._attachCheckBoxClickEvent(container); this.setAria("label", messageLocalization.format("dxDataGrid-ariaSelectRow"), container); this._renderSelectCheckBox(container, options.value, column) } }, _renderSelectCheckBox: function(container, value, column) { var groupElement = $("<div />").addClass(SELECT_CHECKBOX_CLASS).appendTo(container); this.getController("editorFactory").createEditor(groupElement, extend({}, column, { parentType: "dataRow", dataType: "boolean", value: value, tabIndex: -1, setValue: function(value, e) { if (e && e.jQueryEvent && "keydown" === e.jQueryEvent.type) { container.trigger(clickEvent.name, e) } } })); return groupElement }, _attachCheckBoxClickEvent: function($element) { $element.on(clickEvent.name, this.createAction(function(e) { var selectionController = this.getController("selection"), event = e.jQueryEvent, rowIndex = this.getRowIndex($(event.currentTarget).closest("." + ROW_CLASS)); if (rowIndex >= 0) { selectionController.startSelectionWithCheckboxes(); selectionController.changeItemSelection(rowIndex, { shift: event.shiftKey }) } })) }, _update: function(change) { var that = this, tableElements = that.getTableElements(); if ("updateSelection" === change.changeType) { if (tableElements.length > 0) { $.each(tableElements, function(_, tableElement) { $.each(change.itemIndexes || [], function(_, index) { var $row, isSelected; if (change.items[index]) { $row = that._getRowElements($(tableElement)).eq(index); isSelected = !!change.items[index].isSelected; $row.toggleClass(ROW_SELECTION_CLASS, isSelected).find("." + SELECT_CHECKBOX_CLASS).dxCheckBox("option", "value", isSelected); that.setAria("selected", isSelected, $row) } }) }); that._updateCheckboxesClass() } } else { that.callBase(change) } }, _createTable: function() { var that = this, selectionMode = that.option("selection.mode"), $table = that.callBase.apply(that, arguments); if ("none" !== selectionMode) { if ("onLongTap" === that.option(SHOW_CHECKBOXES_MODE) || !support.touch) { $table.on(eventUtils.addNamespace(holdEvent.name, "dxDataGridRowsView"), "." + DATA_ROW_CLASS, that.createAction(function(e) { processLongTap(that.component, e.jQueryEvent); e.jQueryEvent.stopPropagation() })) } $table.on("mousedown selectstart", that.createAction(function(e) { var event = e.jQueryEvent; if (event.shiftKey) { event.preventDefault() } })) } return $table }, _createRow: function(row) { var isSelected, $row = this.callBase(row); if (row) { isSelected = !!row.isSelected; if (isSelected) { $row.addClass(ROW_SELECTION_CLASS) } this.setAria("selected", isSelected, $row) } return $row }, _rowClick: function(e) { var that = this, jQueryEvent = e.jQueryEvent, isSelectionDisabled = $(jQueryEvent.target).closest("." + SELECTION_DISABLED_CLASS).length; if (!that.isClickableElement($(jQueryEvent.target))) { if (!isSelectionDisabled && ("multiple" !== that.option(SELECTION_MODE) || "always" !== that.option(SHOW_CHECKBOXES_MODE))) { if (that.getController("selection").changeItemSelection(e.rowIndex, { control: jQueryEvent.ctrlKey || jQueryEvent.metaKey, shift: jQueryEvent.shiftKey })) { jQueryEvent.preventDefault(); e.handled = true } } that.callBase(e) } }, isClickableElement: function($target) { var isCommandSelect = $target.closest("." + COMMAND_SELECT_CLASS).length; return !!isCommandSelect }, _renderCore: function(change) { this.callBase(change); this._updateCheckboxesClass() }, _updateCheckboxesClass: function() { var tableElements = this.getTableElements(), selectionController = this.getController("selection"), isCheckBoxesHidden = selectionController.isSelectColumnVisible() && !selectionController.isSelectionWithCheckboxes(); $.each(tableElements, function(_, tableElement) { $(tableElement).toggleClass(CHECKBOXES_HIDDEN_CLASS, isCheckBoxesHidden) }) } } } } } }, /*!********************************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.column_chooser.js ***! \********************************************************/ function(module, exports, __webpack_require__) { var gridCore = __webpack_require__( /*! ./ui.data_grid.core */ 348), columnChooserModule = __webpack_require__( /*! ../grid_core/ui.grid_core.column_chooser */ 379); exports.ColumnChooserController = columnChooserModule.controllers.columnChooser; exports.ColumnChooserView = columnChooserModule.views.columnChooserView; gridCore.registerModule("columnChooser", columnChooserModule) }, /*!********************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.column_chooser.js ***! \********************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), modules = __webpack_require__( /*! ./ui.grid_core.modules */ 350), columnsView = __webpack_require__( /*! ./ui.grid_core.columns_view */ 353), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), themes = __webpack_require__( /*! ../themes */ 143), Button = __webpack_require__( /*! ../button */ 201), TreeView = __webpack_require__( /*! ../tree_view */ 380), devices = __webpack_require__( /*! ../../core/devices */ 53), Popup = __webpack_require__( /*! ../popup */ 200); var COLUMN_CHOOSER_CLASS = "column-chooser", COLUMN_CHOOSER_BUTTON_CLASS = "column-chooser-button", NOTOUCH_ACTION_CLASS = "notouch-action", COLUMN_CHOOSER_LIST_CLASS = "column-chooser-list", COLUMN_CHOOSER_DRAG_CLASS = "column-chooser-mode-drag", COLUMN_CHOOSER_SELECT_CLASS = "column-chooser-mode-select", COLUMN_CHOOSER_ICON_NAME = "column-chooser", COLUMN_CHOOSER_ITEM_CLASS = "dx-column-chooser-item", CLICK_TIMEOUT = 300, processItems = function(that, chooserColumns) { var item, items = [], isSelectMode = "select" === that.option("columnChooser.mode"); if (chooserColumns.length) { $.each(chooserColumns, function(index, column) { item = { text: column.caption, cssClass: column.cssClass, allowHiding: column.allowHiding, expanded: true, id: column.index, parentId: commonUtils.isDefined(column.ownerBand) ? column.ownerBand : null }; if (isSelectMode) { item.selected = column.visible } items.push(item) }) } return items }; var ColumnChooserController = modules.ViewController.inherit({ renderShowColumnChooserButton: function($element) { var $columnChooserButton, that = this, columnChooserButtonClass = that.addWidgetPrefix(COLUMN_CHOOSER_BUTTON_CLASS), columnChooserEnabled = that.option("columnChooser.enabled"), $showColumnChooserButton = $element.find("." + columnChooserButtonClass); if (columnChooserEnabled) { if (!$showColumnChooserButton.length) { $columnChooserButton = $("<div />").addClass(columnChooserButtonClass).appendTo($element); that._createComponent($columnChooserButton, Button, { icon: COLUMN_CHOOSER_ICON_NAME, onClick: function() { that.getView("columnChooserView").showColumnChooser() }, hint: that.option("columnChooser.title"), integrationOptions: {} }) } else { $showColumnChooserButton.show() } } else { $showColumnChooserButton.hide() } }, getPosition: function() { var rowsView = this.getView("rowsView"); return { my: "right bottom", at: "right bottom", of: rowsView && rowsView.element(), collision: "fit", offset: "-2 -2", boundaryOffset: "2 2" } } }); var ColumnChooserView = columnsView.ColumnsView.inherit({ _resizeCore: commonUtils.noop, _isWinDevice: function() { return !!devices.real().win }, _updateList: function(allowUpdate) { var items, $popupContent = this._popupContainer.content(), isSelectMode = "select" === this.option("columnChooser.mode"), chooserColumns = this._columnsController.getChooserColumns(isSelectMode); if (!isSelectMode || !this._columnChooserList || allowUpdate) { this._popupContainer._wrapper().toggleClass(this.addWidgetPrefix(COLUMN_CHOOSER_DRAG_CLASS), !isSelectMode).toggleClass(this.addWidgetPrefix(COLUMN_CHOOSER_SELECT_CLASS), isSelectMode); items = processItems(this, chooserColumns); this._renderColumnChooserList($popupContent, items) } }, _initializePopupContainer: function() { var that = this, $element = that.element().addClass(that.addWidgetPrefix(COLUMN_CHOOSER_CLASS)), columnChooserOptions = that.option("columnChooser"), theme = themes.current(), isGenericTheme = theme && theme.indexOf("generic") > -1, isAndroid5Theme = theme && theme.indexOf("android5") > -1, dxPopupOptions = { visible: false, shading: false, showCloseButton: false, dragEnabled: true, resizeEnabled: true, toolbarItems: [{ text: columnChooserOptions.title, toolbar: "top", location: isGenericTheme || isAndroid5Theme ? "before" : "center" }], position: that.getController("columnChooser").getPosition(), width: columnChooserOptions.width, height: columnChooserOptions.height, rtlEnabled: that.option("rtlEnabled"), onHidden: function() { if (that._isWinDevice()) { $(document.body).removeClass(that.addWidgetPrefix(NOTOUCH_ACTION_CLASS)) } }, container: columnChooserOptions.container }; if (isGenericTheme) { extend(dxPopupOptions, { showCloseButton: true }) } else { dxPopupOptions.toolbarItems[dxPopupOptions.toolbarItems.length] = { shortcut: "cancel" } } if (!commonUtils.isDefined(this._popupContainer)) { that._popupContainer = that._createComponent($element, Popup, dxPopupOptions); that._popupContainer.on("optionChanged", function(args) { if ("visible" === args.name) { that.renderCompleted.fire() } }) } else { this._popupContainer.option(dxPopupOptions) } }, _renderCore: function(allowUpdate) { if (this._popupContainer) { this._updateList(allowUpdate) } }, _renderColumnChooserList: function($container, items) { var scrollTop, scrollableInstance, isSelectMode = "select" === this.option("columnChooser.mode"), listConfig = { items: items, dataStructure: "plain", activeStateEnabled: true, focusStateEnabled: true, hoverStateEnabled: true, itemTemplate: "item", showCheckBoxesMode: "none", rootValue: null }; if (isSelectMode) { scrollableInstance = $container.find(".dx-scrollable").data("dxScrollable"); scrollTop = scrollableInstance && scrollableInstance.scrollTop(); listConfig.onContentReady = function(e) { if (scrollTop) { var scrollable = e.element.find(".dx-scrollable").data("dxScrollable"); scrollable && scrollable.scrollTo({ y: scrollTop }) } } } if (this._isWinDevice()) { listConfig.useNativeScrolling = false } extend(listConfig, isSelectMode ? this._prepareSelectModeConfig() : this._prepareDragModeConfig()); if (this._columnChooserList) { this._columnChooserList.option(listConfig) } else { this._columnChooserList = this._createComponent($container, TreeView, listConfig); $container.addClass(this.addWidgetPrefix(COLUMN_CHOOSER_LIST_CLASS)) } }, _prepareDragModeConfig: function() { var columnChooserOptions = this.option("columnChooser"); return { noDataText: columnChooserOptions.emptyPanelText, activeStateEnabled: false, focusStateEnabled: false, hoverStateEnabled: false, itemTemplate: function(data, index, $item) { $item.text(data.text).parent().addClass(data.cssClass).addClass(COLUMN_CHOOSER_ITEM_CLASS) } } }, _prepareSelectModeConfig: function() { var that = this, selectionChangedHandler = function(e) { var visibleColumns = that._columnsController.getVisibleColumns().filter(function(item) { return !item.command }), isLastColumnUnselected = 1 === visibleColumns.length && !e.itemData.selected; if (isLastColumnUnselected) { e.component.selectItem(e.itemElement) } else { setTimeout(function() { that._columnsController.columnOption(e.itemData.id, "visible", e.itemData.selected) }, CLICK_TIMEOUT) } }; return { selectNodesRecursive: false, showCheckBoxesMode: "normal", onItemSelectionChanged: selectionChangedHandler } }, _columnOptionChanged: function(e) { var changeTypes = e.changeTypes, optionNames = e.optionNames, isSelectMode = "select" === this.option("columnChooser.mode"); this.callBase(e); if (isSelectMode) { if (optionNames.showInColumnChooser || optionNames.visible || changeTypes.columns && optionNames.all) { this.render(null, true) } } }, optionChanged: function(args) { switch (args.name) { case "columnChooser": this.render(null, true); break; default: this.callBase(args) } }, getColumnElements: function() { var $content = this._popupContainer && this._popupContainer.content(); return $content && $content.find("." + COLUMN_CHOOSER_ITEM_CLASS) }, getName: function() { return "columnChooser" }, getColumns: function() { return this._columnsController.getChooserColumns() }, allowDragging: function(column, sourceLocation) { var columnVisible = column && column.allowHiding && ("columnChooser" !== sourceLocation || !column.visible && this._columnsController.isParentColumnVisible(column.index)); return this.isColumnChooserVisible() && columnVisible }, getBoundingRect: function() { var offset, that = this, container = that._popupContainer && that._popupContainer._container(); if (container && container.is(":visible")) { offset = container.offset(); return { left: offset.left, top: offset.top, right: offset.left + container.outerWidth(), bottom: offset.top + container.outerHeight() } } return null }, showColumnChooser: function() { this._isPopupContainerShown = true; if (!this._popupContainer) { this._initializePopupContainer(); this.render() } this._popupContainer.show(); if (this._isWinDevice()) { $(document.body).addClass(this.addWidgetPrefix(NOTOUCH_ACTION_CLASS)) } }, hideColumnChooser: function() { if (this._popupContainer) { this._popupContainer.hide(); this._isPopupContainerShown = false } }, isColumnChooserVisible: function() { var popupContainer = this._popupContainer; return popupContainer && popupContainer.option("visible") }, publicMethods: function() { return ["showColumnChooser", "hideColumnChooser"] } }); module.exports = { defaultOptions: function() { return { columnChooser: { enabled: false, mode: "dragAndDrop", width: 250, height: 260, title: messageLocalization.format("dxDataGrid-columnChooserTitle"), emptyPanelText: messageLocalization.format("dxDataGrid-columnChooserEmptyText"), container: void 0 } } }, controllers: { columnChooser: ColumnChooserController }, views: { columnChooserView: ColumnChooserView }, extenders: { views: { headerPanel: { _getToolbarItems: function() { var items = this.callBase(); return this._appendColumnChooserItem(items) }, _appendColumnChooserItem: function(items) { var that = this, columnChooserEnabled = that.option("columnChooser.enabled"); if (columnChooserEnabled) { var onClickHandler = function() { that.component.getView("columnChooserView").showColumnChooser() }, onInitialized = function(e) { e.element.addClass(that._getToolbarButtonClass(that.addWidgetPrefix(COLUMN_CHOOSER_BUTTON_CLASS))) }, hintText = that.option("columnChooser.title"), toolbarItem = { widget: "dxButton", options: { icon: COLUMN_CHOOSER_ICON_NAME, onClick: onClickHandler, hint: hintText, text: hintText, onInitialized: onInitialized }, showText: "inMenu", location: "after", name: "columnChooserButton", locateInMenu: "auto", sortIndex: 40 }; items.push(toolbarItem) } return items }, optionChanged: function(args) { switch (args.name) { case "columnChooser": this._invalidate(); args.handled = true; break; default: this.callBase(args) } }, isVisible: function() { var that = this, columnChooserEnabled = that.option("columnChooser.enabled"); return that.callBase() || columnChooserEnabled } } }, controllers: { columns: { allowMoveColumn: function(fromVisibleIndex, toVisibleIndex, sourceLocation, targetLocation) { var columnChooserMode = this.option("columnChooser.mode"), isMoveColumnDisallowed = "select" === columnChooserMode && "columnChooser" === targetLocation; return isMoveColumnDisallowed ? false : this.callBase(fromVisibleIndex, toVisibleIndex, sourceLocation, targetLocation) } } } } } }, /*!****************************!*\ !*** ./js/ui/tree_view.js ***! \****************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), messageLocalization = __webpack_require__( /*! ../localization/message */ 89), clickEvent = __webpack_require__( /*! ../events/click */ 75), commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../core/utils/array */ 26).inArray, registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), CheckBox = __webpack_require__( /*! ./check_box */ 248), HierarchicalCollectionWidget = __webpack_require__( /*! ./hierarchical_collection/ui.hierarchical_collection_widget */ 341), eventUtils = __webpack_require__( /*! ../events/utils */ 71), pointerEvents = __webpack_require__( /*! ../events/pointer */ 76), dblclickEvent = __webpack_require__( /*! ../events/double_click */ 182), fx = __webpack_require__( /*! ../animation/fx */ 68), Scrollable = __webpack_require__( /*! ./scroll_view/ui.scrollable */ 244), LoadIndicator = __webpack_require__( /*! ./load_indicator */ 238), deferredUtils = __webpack_require__( /*! ../integration/jquery/deferred */ 16); var WIDGET_CLASS = "dx-treeview", NODE_CONTAINER_CLASS = "dx-treeview-node-container", OPENED_NODE_CONTAINER_CLASS = "dx-treeview-node-container-opened", NODE_CLASS = "dx-treeview-node", ITEM_CLASS = "dx-treeview-item", ITEM_WITH_CHECKBOX_CLASS = "dx-treeview-item-with-checkbox", ITEM_DATA_KEY = "dx-treeview-item-data", IS_LEAF = "dx-treeview-node-is-leaf", EXPAND_EVENT_NAMESPACE = "dxTreeView_expand", TOGGLE_ITEM_VISIBILITY_CLASS = "dx-treeview-toggle-item-visibility", LOAD_INDICATOR_CLASS = "dx-treeview-loadindicator", LOAD_INDICATOR_WRAPPER_CLASS = "dx-treeview-loadindicator-wrapper", NODE_LOAD_INDICATOR_CLASS = "dx-treeview-node-loadindicator", TOGGLE_ITEM_VISIBILITY_OPENED_CLASS = "dx-treeview-toggle-item-visibility-opened", SELECT_ALL_ITEM_CLASS = "dx-treeview-select-all-item", DISABLED_STATE_CLASS = "dx-state-disabled", SELECTED_ITEM_CLASS = "dx-state-selected", DATA_ITEM_ID = "data-item-id"; var TreeView = HierarchicalCollectionWidget.inherit({ _supportedKeys: function(e) { var click = function(e) { var $itemElement = this.option("focusedElement"); if (!$itemElement) { return } e.target = $itemElement; e.currentTarget = $itemElement; this._itemClickHandler(e, $itemElement.children("." + ITEM_CLASS)) }; var select = function(e) { e.preventDefault(); this._changeCheckBoxState(this.option("focusedElement")) }; var toggleExpandedNestedItems = function(state, e) { if (!this.option("expandAllEnabled")) { return } e.preventDefault(); var $rootElement = this.option("focusedElement"); if (!$rootElement) { return } var rootItem = this._getItemData($rootElement.find("." + ITEM_CLASS)); this._toggleExpandedNestedItems([rootItem], state) }; return extend(this.callBase(), { enter: this._showCheckboxes() ? select : click, space: this._showCheckboxes() ? select : click, asterisk: toggleExpandedNestedItems.bind(this, true), minus: toggleExpandedNestedItems.bind(this, false) }) }, _changeCheckBoxState: function($element) { var checkboxInstance = this._getCheckBoxInstance($element), currentState = checkboxInstance.option("value"); if (!checkboxInstance.option("disabled")) { this._updateItemSelection(!currentState, $element.find("." + ITEM_CLASS).get(0), true, $element) } }, _toggleExpandedNestedItems: function(items, state) { if (!items) { return } for (var i = 0, len = items.length; i < len; i++) { var item = items[i], node = this._dataAdapter.getNodeByItem(item); this._toggleExpandedState(node, state); this._toggleExpandedNestedItems(item.items, state) } }, _getNodeElement: function(node) { return this.element().find("[" + DATA_ITEM_ID + "='" + commonUtils.normalizeKey(node.internalFields.key) + "']") }, _activeStateUnit: "." + ITEM_CLASS, _widgetClass: function() { return WIDGET_CLASS }, _getDefaultOptions: function() { return extend(this.callBase(), { animationEnabled: true, dataStructure: "tree", expandAllEnabled: false, hasItemsExpr: "hasItems", selectNodesRecursive: true, expandNodesRecursive: true, showCheckBoxesMode: "none", selectAllText: messageLocalization.format("dxList-selectAll"), onItemSelectionChanged: null, onItemExpanded: null, onItemCollapsed: null, scrollDirection: "vertical", virtualModeEnabled: false, rootValue: 0, searchValue: "", focusStateEnabled: false, selectionMode: "multiple", expandEvent: "dblclick", selectByClick: false, createChildren: null }) }, _setDeprecatedOptions: function() { this.callBase(); extend(this._deprecatedOptions, { showCheckBoxes: { since: "15.2", message: "use 'showCheckBoxesMode' option instead" }, selectAllEnabled: { since: "15.2", message: "use 'showCheckBoxesMode' option instead" }, onItemSelected: { since: "16.1", alias: "onItemSelectionChanged" } }) }, _initSelectedItems: commonUtils.noop, _syncSelectionOptions: commonUtils.noop, _fireSelectionChanged: function() { var selectionChangePromise = this._selectionChangePromise; deferredUtils.when(selectionChangePromise).done(function() { this._createActionByOption("onSelectionChanged", { excludeValidators: ["disabled", "readOnly"] })() }.bind(this)) }, _checkBoxModeChange: function(value, previousValue) { if ("none" === previousValue || "none" === value) { this.repaint(); return } var selectAllExists = this._$selectAllItem && this._$selectAllItem.length; switch (value) { case "selectAll": !selectAllExists && this._renderSelectAllItem(); break; case "normal": if (selectAllExists) { this._$selectAllItem.remove(); delete this._$selectAllItem } } }, _removeSelection: function() { var that = this; $.each(this._dataAdapter.getFullData(), function(_, node) { if (!that._hasChildren(node)) { return } that._dataAdapter.toggleSelection(node.internalFields.key, false, true) }) }, _optionChanged: function(args) { var name = args.name, value = args.value, previousValue = args.previousValue; switch (name) { case "showCheckBoxes": this.option("showCheckBoxesMode", value ? "normal" : "none"); break; case "selectAllEnabled": this.option("showCheckBoxesMode", value ? "selectAll" : "normal"); break; case "selectAllText": if (this._$selectAllItem) { this._$selectAllItem.dxCheckBox("instance").option("text", value) } break; case "showCheckBoxesMode": this._checkBoxModeChange(value, previousValue); break; case "scrollDirection": this._scrollableContainer.option("direction", value); break; case "items": delete this._$selectAllItem; this.callBase(args); break; case "dataSource": this.callBase(args); this._initDataAdapter(); this._filter = {}; break; case "hasItemsExpr": this._initAccessors(); this.repaint(); break; case "expandEvent": this._initExpandEvent(); break; case "dataStructure": case "rootValue": case "searchValue": if ((!value.length || value < previousValue) && "none" !== this.option("showCheckBoxesMode")) { this._removeSelection() } this._initDataAdapter(); this.repaint(); break; case "createChildren": case "expandNodesRecursive": case "onItemSelectionChanged": case "onItemExpanded": case "onItemCollapsed": case "expandAllEnabled": case "animationEnabled": case "virtualModeEnabled": case "selectByClick": break; case "selectNodesRecursive": this._dataAdapter.setOption("recursiveSelection", args.value); this.repaint(); break; default: this.callBase(args) } }, _initDataSource: function() { if (this._useCustomChildrenLoader()) { this._loadChildrenByCustomLoader(null).done(function(newItems) { if (newItems && newItems.length) { this.option("items", newItems) } }.bind(this)) } else { this.callBase(); this._isVirtualMode() && this._initVirtualMode() } }, _initVirtualMode: function() { var that = this, filter = that._filter; if (!filter.custom) { filter.custom = that._dataSource.filter() } if (!filter.internal) { filter.internal = [that.option("parentIdExpr"), that.option("rootValue")] } }, _useCustomChildrenLoader: function() { return commonUtils.isFunction(this.option("createChildren")) && this._isDataStructurePlain() }, _loadChildrenByCustomLoader: function(parentNode) { var invocationResult = this.option("createChildren").call(this, parentNode); if (Array.isArray(invocationResult)) { return $.Deferred().resolve(invocationResult).promise() } if (invocationResult && commonUtils.isFunction(invocationResult.then)) { return deferredUtils.fromPromise(invocationResult) } return $.Deferred().resolve([]).promise() }, _combineFilter: function() { if (!this._filter.custom || !this._filter.custom.length) { return this._filter.internal } return [this._filter.custom, this._filter.internal] }, _dataSourceLoadErrorHandler: function() { this._renderEmptyMessage() }, _init: function() { this._filter = {}; this.callBase(); this._initStoreChangeHandlers(); this._initCheckBoxesMode() }, _dataSourceChangedHandler: function(newItems) { if (this._initialized && this._isVirtualMode() && this.option("items").length) { return } this.option("items", newItems) }, _removeTreeViewLoadIndicator: function() { if (!this._treeViewLoadIndicator) { return } this._treeViewLoadIndicator.remove(); this._treeViewLoadIndicator = null }, _createTreeViewLoadIndicator: function() { this._treeViewLoadIndicator = $("<div>", { "class": LOAD_INDICATOR_CLASS }); this._createComponent(this._treeViewLoadIndicator, LoadIndicator, {}); return this._treeViewLoadIndicator }, _dataSourceLoadingChangedHandler: function(isLoading) { var resultFilter; if (this._isVirtualMode()) { resultFilter = this._combineFilter(); this._dataSource.filter(resultFilter) } if (isLoading && !this._dataSource.isLoaded()) { this.option("items", []); var $wrapper = $("<div>", { "class": LOAD_INDICATOR_WRAPPER_CLASS }); this._createTreeViewLoadIndicator().appendTo($wrapper); this.itemsContainer().append($wrapper); if (this._isVirtualMode() && this._dataSource.filter() !== resultFilter) { this._dataSource.filter([]) } } else { this._removeTreeViewLoadIndicator() } }, _initStoreChangeHandlers: function() { if ("plain" !== this.option("dataStructure")) { return } var that = this; this._dataSource && this._dataSource.store().on("inserted", function(newItem) { that.option().items = that.option("items").concat(newItem); that._dataAdapter.addItem(newItem); if (!that._isFiltered(newItem)) { return } that._updateLevel(that._parentIdGetter(newItem)) }).on("removed", function(removedKey) { var node = that._dataAdapter.getNodeByKey(removedKey); that.option("items")[that._dataAdapter.getIndexByKey(node.internalFields.key)] = 0; that._markChildrenItemsToRemove(node); that._removeItems(); that._dataAdapter.removeItem(removedKey); that._updateLevel(that._parentIdGetter(node)) }) }, _markChildrenItemsToRemove: function(node) { var that = this, keys = node.internalFields.childrenKeys; $.each(keys, function(_, key) { that.option("items")[that._dataAdapter.getIndexByKey(key)] = 0; that._markChildrenItemsToRemove(that._dataAdapter.getNodeByKey(key)) }) }, _removeItems: function() { var that = this, counter = 0, items = extend(true, [], this.option("items")); $.each(items, function(index, item) { if (!item) { that.option("items").splice(index - counter, 1); counter++ } }) }, _isFiltered: function(item) { var value = this.option("searchValue"), reg = new RegExp(value, "i"); return reg.test(this._displayGetter(item)) }, _updateLevel: function(parentId) { var $container = this._getContainerByParentKey(parentId); this._renderItems($container, this._dataAdapter.getChildrenNodes(parentId)) }, _getOldContainer: function($itemElement) { if ($itemElement.length) { return $itemElement.children("." + NODE_CONTAINER_CLASS) } if (this._scrollableContainer) { return this._scrollableContainer.content().children() } return $() }, _getContainerByParentKey: function(parentId) { var $container, node = this._dataAdapter.getNodeByKey(parentId), $itemElement = node ? this._getNodeElement(node) : []; this._getOldContainer($itemElement).remove(); $container = this._renderNodeContainer($itemElement); if (this._isRootLevel(parentId)) { if (!this._scrollableContainer) { this._renderScrollableContainer() } this._scrollableContainer.content().append($container) } return $container }, _isRootLevel: function(parentId) { return parentId === this.option("rootValue") }, _getAccessors: function() { return ["key", "display", "selected", "expanded", "items", "parentId", "disabled", "hasItems"] }, _getDataAdapterOptions: function() { return { rootValue: this.option("rootValue"), multipleSelection: !this._isSingleSelection(), recursiveSelection: this._isRecursiveSelection(), recursiveExpansion: this.option("expandNodesRecursive"), searchValue: this.option("searchValue"), dataType: this.option("dataStructure") } }, _render: function() { this.callBase(); this.setAria("role", "tree") }, _renderContentImpl: function() { if (!this.option("items") || !this.option("items").length) { return } var $nodeContainer = this._renderNodeContainer(); this._renderScrollableContainer(); this._scrollableContainer.content().append($nodeContainer); this._renderItems($nodeContainer, this._dataAdapter.getRootNodes()); this._initExpandEvent(); if (this._selectAllEnabled()) { this._renderSelectAllItem($nodeContainer) } }, _isVirtualMode: function() { return this.option("virtualModeEnabled") && this._isDataStructurePlain() && !!this.option("dataSource") }, _isDataStructurePlain: function() { return "plain" === this.option("dataStructure") }, _fireContentReadyAction: function() { this.callBase(); if (this._scrollableContainer) { this._scrollableContainer.update() } }, _renderScrollableContainer: function() { this._scrollableContainer = this._createComponent($("<div>").appendTo(this.element()), Scrollable, { direction: this.option("scrollDirection"), useKeyboard: false }) }, _renderNodeContainer: function($parent) { var $container = $("<ul>").addClass(NODE_CONTAINER_CLASS); this.setAria("role", "group", $container); if ($parent && $parent.length) { var itemData = this._getItemData($parent.children("." + ITEM_CLASS)); if (this._expandedGetter(itemData)) { $container.addClass(OPENED_NODE_CONTAINER_CLASS) } $container.appendTo($parent) } return $container }, _createDOMElement: function($nodeContainer, node) { var $node = $("<li>").addClass(NODE_CLASS).attr(DATA_ITEM_ID, commonUtils.normalizeKey(node.internalFields.key)).prependTo($nodeContainer); this.setAria({ role: "treeitem", label: this._displayGetter(node.internalFields.item) || "", expanded: node.internalFields.expanded || false, level: this._getLevel($nodeContainer) }, $node); return $node }, _getLevel: function($nodeContainer) { var parent = $nodeContainer.parent(); return parent.hasClass("dx-scrollable-content") ? 1 : parseInt(parent.attr("aria-level")) + 1 }, _showCheckboxes: function() { return "none" !== this.option("showCheckBoxesMode") }, _selectAllEnabled: function() { return "selectAll" === this.option("showCheckBoxesMode") }, _initCheckBoxesMode: function() { if (this._showCheckboxes()) { return } this._suppressDeprecatedWarnings(); var showCheckboxes = this.option("showCheckBoxes"), selectAllEnabled = this.option("selectAllEnabled"); this._resumeDeprecatedWarnings(); this.option("showCheckBoxesMode", showCheckboxes ? selectAllEnabled ? "selectAll" : "normal" : "none") }, _renderItems: function($nodeContainer, nodes) { var length = nodes.length - 1; for (var i = length; i >= 0; i--) { this._renderItem(nodes[i], $nodeContainer) } this._renderFocusTarget() }, _renderItem: function(node, $nodeContainer) { var $node = this._createDOMElement($nodeContainer, node), nodeData = node.internalFields; this._showCheckboxes() && this._renderCheckBox($node, node); this.setAria("selected", nodeData.selected, $node); this._toggleSelectedClass($node, nodeData.selected); this.callBase(nodeData.key, nodeData.item, $node); if (false !== nodeData.item.visible) { this._renderChildren($node, node) } }, _renderChildren: function($node, node) { if (!this._hasChildren(node)) { this._addLeafClass($node); return } this._renderToggleItemVisibilityIcon($node, node); if (!node.internalFields.expanded) { return } var that = this; that._loadSublevel(node).done(function(childNodes) { that._renderSublevel($node, that._getActualNode(node), childNodes) }) }, _getActualNode: function(cachedNode) { return this._dataAdapter.getNodeByKey(cachedNode.internalFields.key) }, _hasChildren: function(node) { if (this._isVirtualMode() || this._useCustomChildrenLoader()) { return false !== this._hasItemsGetter(node.internalFields.item) } return this.callBase(node) }, _loadSublevel: function(node) { var deferred = $.Deferred(), that = this, childrenNodes = that._getChildNodes(node); if (childrenNodes.length) { deferred.resolve(childrenNodes) } else { that._loadNestedItems(node).done(function(items) { deferred.resolve(that._dataAdapter.getNodesByItems(items)) }) } return deferred.promise() }, _renderSublevel: function($node, node, childNodes) { var $nestedNodeContainer = this._renderNodeContainer($node, node); this._renderItems($nestedNodeContainer, childNodes); if (childNodes.length && !node.internalFields.selected) { var firstChild = childNodes[0]; this._updateParentsState(firstChild, this._getNodeElement(firstChild)) } this._normalizeIconState($node, childNodes.length); $nestedNodeContainer.addClass(OPENED_NODE_CONTAINER_CLASS) }, _executeItemRenderAction: function(key, itemData, itemElement) { var node = this._dataAdapter.getNodeByKey(key); this._getItemRenderAction()({ itemElement: itemElement, itemIndex: key, itemData: itemData, node: node }) }, _addLeafClass: function($node) { $node.addClass(IS_LEAF) }, _initExpandEvent: function() { var that = this, expandedEventName = this._getEventNameByOption(this.option("expandEvent")), $itemsContainer = this._itemContainer(), itemSelector = this._itemSelector(); $itemsContainer.off("." + EXPAND_EVENT_NAMESPACE, itemSelector).on(expandedEventName, itemSelector, function(e) { var $nodeElement = $(e.currentTarget.parentNode); if (!$nodeElement.hasClass(IS_LEAF)) { that._toggleExpandedState(e.currentTarget, void 0, e) } }) }, _getEventNameByOption: function(name) { var event = "click" === name ? clickEvent : dblclickEvent; return eventUtils.addNamespace(event.name, EXPAND_EVENT_NAMESPACE) }, _getNode: function(identifier) { if (identifier.internalFields) { return identifier } if (commonUtils.isPrimitive(identifier)) { return this._dataAdapter.getNodeByKey(identifier) } var itemElement = $(identifier).get(0); if (!itemElement) { return null } if (itemElement.nodeType) { return this._getNodeByElement(itemElement) } return this._dataAdapter.getNodeByItem(itemElement) }, _getNodeByElement: function(itemElement) { var $node = $(itemElement).closest("." + NODE_CLASS), key = commonUtils.denormalizeKey($node.attr(DATA_ITEM_ID)); return this._dataAdapter.getNodeByKey(key) }, _toggleExpandedState: function(itemElement, state, e) { var node = this._getNode(itemElement), currentState = node.internalFields.expanded; if (node.internalFields.disabled || currentState === state) { return } if (!commonUtils.isDefined(state)) { state = !currentState } this._dataAdapter.toggleExpansion(node.internalFields.key, state); node.internalFields.expanded = state; if (this._hasChildren(node)) { var $node = this._getNodeElement(node); this._createLoadIndicator($node) } this._updateExpandedItemsUI(node, state, e) }, _createLoadIndicator: function($node) { var $icon = $node.children("." + TOGGLE_ITEM_VISIBILITY_CLASS), $nodeContainer = $node.children("." + NODE_CONTAINER_CLASS); if ($icon.hasClass(TOGGLE_ITEM_VISIBILITY_OPENED_CLASS) || $nodeContainer.not(":empty").length) { return } this._createComponent($("<div>", { "class": NODE_LOAD_INDICATOR_CLASS }), LoadIndicator, {}).element().appendTo($node); $icon.hide() }, _renderToggleItemVisibilityIcon: function($node, node) { var $icon = $("<div>").addClass(TOGGLE_ITEM_VISIBILITY_CLASS).appendTo($node); if (node.internalFields.expanded) { $icon.addClass(TOGGLE_ITEM_VISIBILITY_OPENED_CLASS); $node.parent().addClass(OPENED_NODE_CONTAINER_CLASS) } if (node.internalFields.disabled) { $icon.addClass(DISABLED_STATE_CLASS) } this._renderToggleItemVisibilityIconClick($icon, node) }, _renderToggleItemVisibilityIconClick: function($icon, node) { var eventName = eventUtils.addNamespace(clickEvent.name, this.NAME), that = this; $icon.off(eventName).on(eventName, function(e) { that._toggleExpandedState(node, void 0, e) }) }, _updateExpandedItemsUI: function(node, state, e) { var $node = this._getNodeElement(node); if (!$node.length && this.option("expandNodesRecursive")) { this._updateExpandedItemsUI(this._getNode(node.internalFields.parentKey), state, e) } var $icon = $node.children("." + TOGGLE_ITEM_VISIBILITY_CLASS); var $nodeContainer = $node.children("." + NODE_CONTAINER_CLASS); $icon.toggleClass(TOGGLE_ITEM_VISIBILITY_OPENED_CLASS, state); var nodeContainerExists = $nodeContainer.length > 0; if (!state || nodeContainerExists && !$nodeContainer.is(":empty")) { this._updateExpandedItem(node, state, e); return } if (this._isVirtualMode() || this._useCustomChildrenLoader()) { this._loadNestedItemsWithUpdate(node, state, e); return } this._renderSublevel($node, node, this._getChildNodes(node)); this._fireContentReadyAction(); this._updateExpandedItem(node, state, e) }, _loadNestedItemsWithUpdate: function(node, state, e) { var that = this, $node = this._getNodeElement(node); that._loadNestedItems(node).done(function(items) { var actualNodeData = that._getActualNode(node); that._renderSublevel($node, actualNodeData, that._dataAdapter.getNodesByItems(items)); if (!items || !items.length) { return } that._fireContentReadyAction(); that._updateExpandedItem(actualNodeData, state, e) }) }, _loadNestedItems: function(node) { var that = this; if (that._useCustomChildrenLoader()) { var publicNode = this._dataAdapter.getPublicNode(node); return that._loadChildrenByCustomLoader(publicNode).done(function(newItems) { that._appendItems(newItems) }) } if (!that._isVirtualMode()) { return $.Deferred().resolve([]).promise() } that._filter.internal = [that.option("parentIdExpr"), node.internalFields.key]; that._dataSource.filter(that._combineFilter()); return that._dataSource.load().done(function(newItems) { var areItemsAlreadyPresent = inArray(newItems[0], that.option("items")) + 1; !areItemsAlreadyPresent && that._appendItems(newItems) }) }, _appendItems: function(newItems) { this.option().items = this.option("items").concat(newItems); this._initDataAdapter() }, _updateExpandedItem: function(node, state, e) { this._animateNodeContainer(node, state, e) }, _animateNodeContainer: function(node, state, e) { var $node = this._getNodeElement(node), $nodeContainer = $node.children("." + NODE_CONTAINER_CLASS), nodeHeight = $nodeContainer.height(); fx.stop($nodeContainer, true); fx.animate($nodeContainer, { type: "custom", duration: this.option("animationEnabled") ? 400 : 0, from: { "max-height": state ? 0 : nodeHeight }, to: { "max-height": state ? nodeHeight : 0 }, start: function() { $nodeContainer.addClass(OPENED_NODE_CONTAINER_CLASS) }, complete: function() { $nodeContainer.css("max-height", "none"); $nodeContainer.toggleClass(OPENED_NODE_CONTAINER_CLASS, state); this.setAria("expanded", state, $node); this._scrollableContainer.update(); this._fireExpandedStateUpdatedEvent(state, node, e) }.bind(this) }) }, _fireExpandedStateUpdatedEvent: function(isExpanded, node, e) { var target, optionName = isExpanded ? "onItemExpanded" : "onItemCollapsed"; if (!this._hasChildren(node)) { return } if (commonUtils.isDefined(e)) { this._itemJQueryEventHandler(e, optionName, { node: this._dataAdapter.getPublicNode(node) }) } else { target = this._getNodeElement(node); this._itemEventHandler(target, optionName, { jQueryEvent: e, node: this._dataAdapter.getPublicNode(node) }) } }, _normalizeIconState: function($node, hasNewItems) { var $icon, $loadIndicator = $node.find(".dx-loadindicator"); $loadIndicator.length && LoadIndicator.getInstance($loadIndicator).option("visible", false); if (hasNewItems) { $icon = $node.find("." + TOGGLE_ITEM_VISIBILITY_CLASS); $icon.show(); return } $node.find("." + TOGGLE_ITEM_VISIBILITY_CLASS).removeClass(TOGGLE_ITEM_VISIBILITY_CLASS); $node.addClass(IS_LEAF) }, _renderContent: function() { this._renderEmptyMessage(); var items = this.option("items"); if (items && items.length) { this._contentAlreadyRendered = true } this.callBase() }, _renderSelectAllItem: function($container) { $container = $container || this.element().find("." + NODE_CONTAINER_CLASS).first(); this._$selectAllItem = $("<div>").addClass(SELECT_ALL_ITEM_CLASS); var value = this._dataAdapter.isAllSelected(); this._createComponent(this._$selectAllItem, CheckBox, { value: value, text: this.option("selectAllText"), onValueChanged: this._toggleSelectAll.bind(this) }); this._toggleSelectedClass(this._$selectAllItem, value); $container.before(this._$selectAllItem) }, _toggleSelectAll: function(args) { this._dataAdapter.toggleSelectAll(args.value); this._updateItemsUI(); this._fireSelectionChanged() }, _renderCheckBox: function($node, node) { $node.addClass(ITEM_WITH_CHECKBOX_CLASS); var $checkbox = $("<div>").appendTo($node); this._createComponent($checkbox, CheckBox, { value: node.internalFields.selected, onValueChanged: this._changeCheckboxValue.bind(this), focusStateEnabled: false, disabled: this._disabledGetter(node) }) }, _toggleSelectedClass: function($node, value) { $node.toggleClass(SELECTED_ITEM_CLASS, !!value) }, _toggleNodeDisabledState: function(node, state) { var $node = this._getNodeElement(node), $item = $node.find("." + ITEM_CLASS).eq(0); this._dataAdapter.toggleNodeDisabledState(node.internalFields.key, state); $item.toggleClass(DISABLED_STATE_CLASS, !!state); if (this._showCheckboxes()) { var checkbox = this._getCheckBoxInstance($node); checkbox.option("disabled", !!state) } }, _itemOptionChanged: function(item, property, value) { var node = this._dataAdapter.getNodeByItem(item); switch (property) { case this.option("disabledExpr"): this._toggleNodeDisabledState(node, value) } }, _changeCheckboxValue: function(e) { var $node = e.element.parent("." + NODE_CLASS), $item = $node.children("." + ITEM_CLASS), item = this._getItemData($item), node = this._getNodeByElement($item), value = e.value; if (node.internalFields.selected === value) { return } this._updateItemSelection(value, item, e.jQueryEvent) }, _isSingleSelection: function() { return "single" === this.option("selectionMode") }, _isRecursiveSelection: function() { return this.option("selectNodesRecursive") && "single" !== this.option("selectionMode") }, _updateItemSelection: function(value, itemElement, jQueryEvent) { var node = this._getNode(itemElement); if (!node || node.internalFields.selected === value) { return } if (this._isSingleSelection()) { this._toggleSelectAll({ value: false }) } this._dataAdapter.toggleSelection(node.internalFields.key, value); this._updateItemsUI(); var initiator = jQueryEvent || this._findItemElementByItem(node.internalFields.item), handler = jQueryEvent ? this._itemJQueryEventHandler : this._itemEventHandler; handler.call(this, initiator, "onItemSelectionChanged", { node: this._dataAdapter.getPublicNode(node), itemData: node.internalFields.item }); this._fireSelectionChanged() }, _getCheckBoxInstance: function($node) { return $node.children(".dx-checkbox").dxCheckBox("instance") }, _updateItemsUI: function() { var that = this; $.each(this._dataAdapter.getData(), function(_, node) { var $node = that._getNodeElement(node), nodeSelection = node.internalFields.selected; if (!$node.length) { return } that._toggleSelectedClass($node, nodeSelection); that.setAria("selected", nodeSelection, $node); if (that._showCheckboxes()) { var checkbox = that._getCheckBoxInstance($node); checkbox.option("value", nodeSelection) } }); if (this._selectAllEnabled()) { this._$selectAllItem.dxCheckBox("instance").option("value", this._dataAdapter.isAllSelected()) } }, _updateParentsState: function(node, $node) { var parentNode = this._dataAdapter.getNodeByKey(node.internalFields.parentKey); if (!$node) { return } var $parentNode = $($node.parents("." + NODE_CLASS)[0]); if (this._showCheckboxes()) { var parentValue = parentNode.internalFields.selected; this._getCheckBoxInstance($parentNode).option("value", parentValue); this._toggleSelectedClass($parentNode, parentValue) } if (parentNode.internalFields.parentKey !== this.option("rootValue")) { this._updateParentsState(parentNode, $parentNode) } }, _itemEventHandlerImpl: function(initiator, action, actionArgs) { var $itemElement = $(initiator).closest("." + NODE_CLASS).children("." + ITEM_CLASS); return action(extend(this._extendActionArgs($itemElement), actionArgs)) }, _itemContextMenuHandler: function(e) { this._createEventHandler("onItemContextMenu", e) }, _itemHoldHandler: function(e) { this._createEventHandler("onItemHold", e) }, _createEventHandler: function(eventName, e) { var node = this._getNodeByElement(e.currentTarget); this._itemJQueryEventHandler(e, eventName, { node: this._dataAdapter.getPublicNode(node) }) }, _itemClass: function() { return ITEM_CLASS }, _itemDataKey: function() { return ITEM_DATA_KEY }, _attachClickEvent: function() { var that = this, clickSelector = "." + this._itemClass(), pointerDownSelector = "." + NODE_CLASS + ", ." + SELECT_ALL_ITEM_CLASS, eventName = eventUtils.addNamespace(clickEvent.name, that.NAME), pointerDownEvent = eventUtils.addNamespace(pointerEvents.down, this.NAME); that._itemContainer().off(eventName, clickSelector).off(pointerDownEvent, pointerDownSelector).on(eventName, clickSelector, function(e) { that._itemClickHandler(e, $(this)) }).on(pointerDownEvent, pointerDownSelector, function(e) { that._itemPointerDownHandler(e) }) }, _itemClickHandler: function(e, $item) { var itemData = this._getItemData($item), node = this._getNodeByElement($item); this._itemJQueryEventHandler(e, "onItemClick", { node: this._dataAdapter.getPublicNode(node) }); if (this.option("selectByClick")) { this._updateItemSelection(!node.internalFields.selected, itemData, e) } }, _updateSelectionToFirstItem: function($items, startIndex) { var itemIndex = startIndex; while (itemIndex >= 0) { var $item = $($items[itemIndex]); this._updateItemSelection(true, $item.find("." + ITEM_CLASS).get(0)); itemIndex-- } }, _updateSelectionToLastItem: function($items, startIndex) { var itemIndex = startIndex, length = $items.length; while (itemIndex < length) { var $item = $($items[itemIndex]); this._updateItemSelection(true, $item.find("." + ITEM_CLASS).get(0)); itemIndex++ } }, _focusInHandler: function(e) { var that = this, currentTarget = e.currentTarget, focusTargets = that._focusTarget(); if (inArray(currentTarget, focusTargets) !== -1) { that._toggleFocusClass(true, currentTarget) } if (that.option("focusedElement")) { clearTimeout(that._setFocusedItemTimeout); that._setFocusedItemTimeout = setTimeout(function() { that._setFocusedItem(that.option("focusedElement")) }); return } var $activeItem = that._getActiveItem(); that.option("focusedElement", $activeItem.closest("." + NODE_CLASS)) }, _setFocusedItem: function($target) { if (!$target || !$target.length) { return } if (!$target.children().hasClass(DISABLED_STATE_CLASS)) { this.callBase($target) } this._scrollableContainer.scrollToElement($target.find("." + ITEM_CLASS).first()) }, _itemPointerDownHandler: function(e) { if (!this.option("focusStateEnabled")) { return } var $target = $(e.target).closest("." + NODE_CLASS + ", ." + SELECT_ALL_ITEM_CLASS); if (!$target.length) { return } var itemElement = $target.hasClass(DISABLED_STATE_CLASS) ? null : $target; this.option("focusedElement", itemElement) }, _findNonDisabledNodes: function($nodes) { return $nodes.not(function() { return $(this).children("." + ITEM_CLASS).hasClass(DISABLED_STATE_CLASS) }) }, _moveFocus: function(location, e) { var FOCUS_UP = "up", FOCUS_DOWN = "down", FOCUS_FIRST = "first", FOCUS_LAST = "last", FOCUS_LEFT = this.option("rtlEnabled") ? "right" : "left", FOCUS_RIGHT = this.option("rtlEnabled") ? "left" : "right"; this.element().find("." + NODE_CONTAINER_CLASS).each(function() { fx.stop(this, true) }); var $items = this._findNonDisabledNodes(this._nodeElements()); if (!$items || !$items.length) { return } switch (location) { case FOCUS_UP: var $prevItem = this._prevItem($items); this.option("focusedElement", $prevItem); if (e.shiftKey && this._showCheckboxes()) { this._updateItemSelection(true, $prevItem.find("." + ITEM_CLASS).get(0)) } break; case FOCUS_DOWN: var $nextItem = this._nextItem($items); this.option("focusedElement", $nextItem); if (e.shiftKey && this._showCheckboxes()) { this._updateItemSelection(true, $nextItem.find("." + ITEM_CLASS).get(0)) } break; case FOCUS_FIRST: var $firstItem = $items.first(); if (e.shiftKey && this._showCheckboxes()) { this._updateSelectionToFirstItem($items, $items.index(this._prevItem($items))) } this.option("focusedElement", $firstItem); break; case FOCUS_LAST: var $lastItem = $items.last(); if (e.shiftKey && this._showCheckboxes()) { this._updateSelectionToLastItem($items, $items.index(this._nextItem($items))) } this.option("focusedElement", $lastItem); break; case FOCUS_RIGHT: this._expandFocusedContainer(); break; case FOCUS_LEFT: this._collapseFocusedContainer(); break; default: this.callBase.apply(this, arguments); return } }, _nodeElements: function() { return this.element().find("." + NODE_CLASS).not(":hidden") }, _expandFocusedContainer: function() { var $focusedNode = this.option("focusedElement"); if (!$focusedNode || $focusedNode.hasClass(IS_LEAF)) { return } var $node = $focusedNode.find("." + NODE_CONTAINER_CLASS).eq(0); if ($node.hasClass(OPENED_NODE_CONTAINER_CLASS)) { this.option("focusedElement", this._nextItem(this._findNonDisabledNodes(this._nodeElements()))); return } var node = this._getNodeByElement($focusedNode.children("." + ITEM_CLASS)); this._toggleExpandedState(node, true) }, _getClosestNonDisabledNode: function($node) { do { $node = $node.parent().closest("." + NODE_CLASS) } while ($node.children(".dx-treeview-item.dx-state-disabled").length); return $node }, _collapseFocusedContainer: function() { var $focusedNode = this.option("focusedElement"); if (!$focusedNode) { return } var nodeElement = $focusedNode.find("." + NODE_CONTAINER_CLASS).eq(0); if (!$focusedNode.hasClass(IS_LEAF) && nodeElement.hasClass(OPENED_NODE_CONTAINER_CLASS)) { var node = this._getNodeByElement($focusedNode.children("." + ITEM_CLASS)); this._toggleExpandedState(node, false) } else { var collapsedNode = this._getClosestNonDisabledNode($focusedNode); collapsedNode.length && this.option("focusedElement", collapsedNode) } }, updateDimensions: function() { var that = this, deferred = $.Deferred(); if (that._scrollableContainer) { that._scrollableContainer.update().done(function() { deferred.resolveWith(that) }) } else { deferred.resolveWith(that) } return deferred.promise() }, selectItem: function(itemElement) { this._updateItemSelection(true, itemElement) }, unselectItem: function(itemElement) { this._updateItemSelection(false, itemElement) }, expandItem: function(itemElement) { this._toggleExpandedState(itemElement, true) }, collapseItem: function(itemElement) { this._toggleExpandedState(itemElement, false) }, getNodes: function() { return this._dataAdapter.getTreeNodes() }, getSelectedNodesKeys: function() { return this._dataAdapter.getSelectedNodesKeys() }, selectAll: function() { if (this._selectAllEnabled()) { this._$selectAllItem.dxCheckBox("instance").option("value", true) } else { this._toggleSelectAll({ value: true }) } }, unselectAll: function() { if (this._selectAllEnabled()) { this._$selectAllItem.dxCheckBox("instance").option("value", false) } else { this._toggleSelectAll({ value: false }) } }, collapseAll: function() { var that = this; $.each(this._dataAdapter.getExpandedNodesKeys(), function(_, key) { that._toggleExpandedState(key, false) }) } }); registerComponent("dxTreeView", TreeView); module.exports = TreeView }, /*!**************************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.grouping.js ***! \**************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), gridCore = __webpack_require__( /*! ./ui.data_grid.core */ 348), ExpandedGroupingHelper = __webpack_require__( /*! ./ui.data_grid.grouping.expanded */ 382).GroupingHelper, CollapsedGroupingHelper = __webpack_require__( /*! ./ui.data_grid.grouping.collapsed */ 384).GroupingHelper, messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), dataSourceAdapter = __webpack_require__( /*! ./ui.data_grid.data_source_adapter */ 358), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), devices = __webpack_require__( /*! ../../core/devices */ 53), when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when; var DATAGRID_GROUP_PANEL_CLASS = "dx-datagrid-group-panel", DATAGRID_GROUP_PANEL_MESSAGE_CLASS = "dx-group-panel-message", DATAGRID_GROUP_PANEL_ITEM_CLASS = "dx-group-panel-item", DATAGRID_GROUP_OPENED_CLASS = "dx-datagrid-group-opened", DATAGRID_GROUP_CLOSED_CLASS = "dx-datagrid-group-closed", DATAGRID_EXPAND_CLASS = "dx-datagrid-expand", DATAGRID_SELECTION_DISABLED_CLASS = "dx-selection-disabled", DATAGRID_GROUP_ROW_CLASS = "dx-group-row"; var GroupingDataSourceAdapterExtender = function() { return { init: function() { this.callBase.apply(this, arguments); this._initGroupingHelper() }, _initGroupingHelper: function(options) { var grouping = this._grouping, remoteOperations = options ? options.remoteOperations : this.remoteOperations(); if (remoteOperations.filtering && remoteOperations.sorting && remoteOperations.paging && !remoteOperations.grouping) { if (!grouping || grouping instanceof CollapsedGroupingHelper) { this._grouping = new ExpandedGroupingHelper(this) } } else { if (!grouping || grouping instanceof ExpandedGroupingHelper) { this._grouping = new CollapsedGroupingHelper(this) } } }, totalItemsCount: function() { var that = this, totalCount = that.callBase(); return totalCount > 0 && that._dataSource.group() && that._dataSource.requireTotalCount() ? totalCount + that._grouping.totalCountCorrection() : totalCount }, itemsCount: function() { return this._dataSource.group() ? this._grouping.itemsCount() || 0 : this.callBase() }, allowCollapseAll: function() { return this._grouping.allowCollapseAll() }, isRowExpanded: function(key) { var groupInfo = this._grouping.findGroupInfo(key); return groupInfo ? groupInfo.isExpanded : !this._grouping.allowCollapseAll() }, collapseAll: function(groupIndex) { return this._collapseExpandAll(groupIndex, false) }, expandAll: function(groupIndex) { return this._collapseExpandAll(groupIndex, true) }, _collapseExpandAll: function(groupIndex, isExpand) { var i, that = this, dataSource = that._dataSource, group = dataSource.group(), groups = gridCore.normalizeSortingInfo(group || []); if (groups.length) { for (i = 0; i < groups.length; i++) { if (void 0 === groupIndex || groupIndex === i) { groups[i].isExpanded = isExpand } else { if (group && group[i]) { groups[i].isExpanded = group[i].isExpanded } } } dataSource.group(groups); that._grouping.foreachGroups(function(groupInfo, parents) { if (void 0 === groupIndex || groupIndex === parents.length - 1) { groupInfo.isExpanded = isExpand } }, false, true) } return true }, refresh: function() { this.callBase.apply(this, arguments); return this._grouping.refresh.apply(this._grouping, arguments) }, changeRowExpand: function(path) { var that = this, dataSource = that._dataSource; if (dataSource.group()) { dataSource._changeLoadingCount(1); return that._changeRowExpandCore(path).always(function() { dataSource._changeLoadingCount(-1) }) } }, _changeRowExpandCore: function(path) { return this._grouping.changeRowExpand(path) }, getGroupsInfo: function() { return this._grouping._groupsInfo }, _hasGroupLevelsExpandState: function(group, isExpanded) { if (group && Array.isArray(group)) { for (var i = 0; i < group.length; i++) { if (group[i].isExpanded === isExpanded) { return true } } } }, _customizeRemoteOperations: function(options) { var remoteOperations = options.remoteOperations; if (options.storeLoadOptions.group) { if (remoteOperations.grouping && !options.isCustomLoading) { if (!remoteOperations.groupPaging || this._hasGroupLevelsExpandState(options.storeLoadOptions.group, true)) { remoteOperations.paging = false } } if (!remoteOperations.grouping && (!remoteOperations.sorting || !remoteOperations.filtering || options.isCustomLoading || this._hasGroupLevelsExpandState(options.storeLoadOptions.group, false))) { remoteOperations.paging = false } } this.callBase.apply(this, arguments) }, _handleDataLoading: function(options) { this.callBase(options); this._initGroupingHelper(options); return this._grouping.handleDataLoading(options) }, _handleDataLoaded: function(options) { return this._grouping.handleDataLoaded(options, this.callBase.bind(this)) }, _handleDataLoadedCore: function(options) { return this._grouping.handleDataLoadedCore(options, this.callBase.bind(this)) } } }(); dataSourceAdapter.extend(GroupingDataSourceAdapterExtender); var GroupingDataControllerExtender = function() { return { init: function() { var that = this; that.callBase(); that.createAction("onRowExpanding"); that.createAction("onRowExpanded"); that.createAction("onRowCollapsing"); that.createAction("onRowCollapsed") }, _processItems: function(items, changeType) { var groupColumns = this._columnsController.getGroupColumns(); if (items.length && groupColumns.length) { items = this._processGroupItems(items, groupColumns.length) } return this.callBase(items, changeType) }, _processItem: function(item, options) { if (commonUtils.isDefined(item.groupIndex) && commonUtils.isString(item.rowType) && 0 === item.rowType.indexOf("group")) { item = this._processGroupItem(item, options); options.dataIndex = 0 } else { item = this.callBase.apply(this, arguments) } return item }, _processGroupItem: function(item) { return item }, _processGroupItems: function(items, groupsCount, options) { var scrollingMode, i, item, resultItems, that = this, groupedColumns = that._columnsController.getGroupColumns(), column = groupedColumns[groupedColumns.length - groupsCount]; if (!options) { scrollingMode = that.option("scrolling.mode"); options = { collectContinuationItems: "virtual" !== scrollingMode && "infinite" !== scrollingMode, resultItems: [], path: [], values: [] } } resultItems = options.resultItems; if (options.data) { if (options.collectContinuationItems || !options.data.isContinuation) { resultItems.push({ rowType: "group", data: options.data, groupIndex: options.path.length - 1, isExpanded: !!options.data.items, key: options.path.slice(0), values: options.values.slice(0) }) } } if (items) { if (0 === groupsCount) { resultItems.push.apply(resultItems, items) } else { for (i = 0; i < items.length; i++) { item = items[i]; if (item && "items" in item) { options.data = item; options.path.push(item.key); options.values.push(column && column.deserializeValue ? column.deserializeValue(item.key) : item.key); that._processGroupItems(item.items, groupsCount - 1, options); options.data = void 0; options.path.pop(); options.values.pop() } else { resultItems.push(item) } } } } return resultItems }, publicMethods: function() { return this.callBase().concat(["collapseAll", "expandAll", "isRowExpanded", "expandRow", "collapseRow"]) }, collapseAll: function(groupIndex) { var dataSource = this._dataSource; if (dataSource && dataSource.collapseAll(groupIndex)) { dataSource.pageIndex(0); dataSource.reload() } }, expandAll: function(groupIndex) { var dataSource = this._dataSource; if (dataSource && dataSource.expandAll(groupIndex)) { dataSource.pageIndex(0); dataSource.reload() } }, changeRowExpand: function(key) { var that = this, expanded = that.isRowExpanded(key), args = { key: key, expanded: expanded }; that.executeAction(expanded ? "onRowCollapsing" : "onRowExpanding", args); if (!args.cancel) { return when(that._changeRowExpandCore(key)).done(function() { args.expanded = !expanded; that.executeAction(expanded ? "onRowCollapsed" : "onRowExpanded", args) }) } }, _changeRowExpandCore: function(key) { var d, that = this, dataSource = this._dataSource; if (!dataSource) { return } d = $.Deferred(); when(dataSource.changeRowExpand(key)).done(function() { that.load().done(d.resolve).fail(d.reject) }).fail(d.reject); return d }, isRowExpanded: function(key) { var dataSource = this._dataSource; return dataSource && dataSource.isRowExpanded(key) }, expandRow: function(key) { if (!this.isRowExpanded(key)) { return this.changeRowExpand(key) } return $.Deferred().resolve() }, collapseRow: function(key) { if (this.isRowExpanded(key)) { return this.changeRowExpand(key) } return $.Deferred().resolve() }, optionChanged: function(args) { if ("grouping" === args.name) { args.name = "dataSource" } this.callBase(args) } } }(); var onGroupingMenuItemClick = function(column, params) { var columnsController = this._columnsController; switch (params.itemData.value) { case "group": var groups = columnsController._dataSource.group() || []; columnsController.columnOption(column.dataField, "groupIndex", groups.length); break; case "ungroup": columnsController.columnOption(column.dataField, "groupIndex", -1); break; case "ungroupAll": this.component.clearGrouping() } }; var GroupingHeaderPanelExtender = function() { return { _getToolbarItems: function() { var items = this.callBase(); return this._appendGroupingItem(items) }, _appendGroupingItem: function(items) { var that = this, groupPanelRenderedCallback = function(e) { that._updateGroupPanelContent(e.itemElement.find("." + DATAGRID_GROUP_PANEL_CLASS)) }; if (that._isGroupPanelVisible()) { var toolbarItem = { html: "<div class='" + DATAGRID_GROUP_PANEL_CLASS + "'></div>", name: "groupPanel", onItemRendered: groupPanelRenderedCallback, location: "before", locateInMenu: "never", sortIndex: 1 }; items.push(toolbarItem) } return items }, _isGroupPanelVisible: function() { var isVisible, groupPanelOptions = this.option("groupPanel"); if (groupPanelOptions) { isVisible = groupPanelOptions.visible; if ("auto" === isVisible) { isVisible = "desktop" === devices.current().deviceType ? true : false } } return isVisible }, _renderGroupPanelItems: function($groupPanel, groupColumns) { var that = this; $groupPanel.empty(); $.each(groupColumns, function(index, groupColumn) { that._createGroupPanelItem($groupPanel, groupColumn) }) }, _createGroupPanelItem: function($rootElement, groupColumn) { return $("<div />").addClass(groupColumn.cssClass).addClass(DATAGRID_GROUP_PANEL_ITEM_CLASS).data("columnData", groupColumn).appendTo($rootElement).text(groupColumn.caption) }, _columnOptionChanged: function(e) { if (!this._requireReady && !gridCore.checkChanges(e.optionNames, ["width", "visibleWidth"])) { var $toolbarElement = this.element(), $groupPanel = $toolbarElement && $toolbarElement.find("." + DATAGRID_GROUP_PANEL_CLASS); if ($groupPanel && $groupPanel.length) { this._updateGroupPanelContent($groupPanel); this.renderCompleted.fire() } } this.callBase() }, _updateGroupPanelContent: function($groupPanel) { var that = this, groupColumns = that.getController("columns").getGroupColumns(), groupPanelOptions = that.option("groupPanel"); that._renderGroupPanelItems($groupPanel, groupColumns); if (groupPanelOptions.allowColumnDragging && !groupColumns.length) { $("<div />").addClass(DATAGRID_GROUP_PANEL_MESSAGE_CLASS).text(groupPanelOptions.emptyPanelText).appendTo($groupPanel) } }, allowDragging: function(column) { var groupPanelOptions = this.option("groupPanel"); return this._isGroupPanelVisible() && groupPanelOptions.allowColumnDragging && column && column.allowGrouping }, getColumnElements: function() { var $element = this.element(); return $element && $element.find("." + DATAGRID_GROUP_PANEL_ITEM_CLASS) }, getColumns: function() { return this.getController("columns").getGroupColumns() }, getBoundingRect: function() { var offset, that = this, $element = that.element(); if ($element && $element.find("." + DATAGRID_GROUP_PANEL_CLASS).length) { offset = $element.offset(); return { top: offset.top, bottom: offset.top + $element.height() } } return null }, getName: function() { return "group" }, getContextMenuItems: function(options) { var items, that = this, contextMenuEnabled = that.option("grouping.contextMenuEnabled"), $groupedColumnElement = options.targetElement.closest("." + DATAGRID_GROUP_PANEL_ITEM_CLASS); if ($groupedColumnElement.length) { options.column = $groupedColumnElement.data("columnData") } if (contextMenuEnabled && options.column) { var column = options.column, isGroupingAllowed = commonUtils.isDefined(column.allowGrouping) ? column.allowGrouping : true; if (isGroupingAllowed) { var isColumnGrouped = commonUtils.isDefined(column.groupIndex) && column.groupIndex > -1, groupingTexts = that.option("grouping.texts"), onItemClick = onGroupingMenuItemClick.bind(that, column); items = [{ text: groupingTexts.ungroup, value: "ungroup", disabled: !isColumnGrouped, onItemClick: onItemClick }, { text: groupingTexts.ungroupAll, value: "ungroupAll", onItemClick: onItemClick }] } } return items }, isVisible: function() { return this.callBase() || this._isGroupPanelVisible() }, optionChanged: function(args) { if ("groupPanel" === args.name) { this._invalidate(); args.handled = true } else { this.callBase(args) } } } }(); exports.GroupingHeaderPanelExtender = GroupingHeaderPanelExtender; var GroupingRowsViewExtender = function() { return { getContextMenuItems: function(options) { var items, that = this, contextMenuEnabled = that.option("grouping.contextMenuEnabled"); if (contextMenuEnabled && options.row && "group" === options.row.rowType) { var columnsController = that._columnsController, column = columnsController.columnOption("groupIndex:" + options.row.groupIndex); if (column && column.allowGrouping) { var groupingTexts = that.option("grouping.texts"), onItemClick = onGroupingMenuItemClick.bind(that, column); items = []; items.push({ text: groupingTexts.ungroup, value: "ungroup", onItemClick: onItemClick }, { text: groupingTexts.ungroupAll, value: "ungroupAll", onItemClick: onItemClick }) } } return items }, _rowClick: function(e) { var that = this, expandMode = that.option("grouping.expandMode"), isGroupRowStateChanged = "rowClick" === expandMode && $(e.jQueryEvent.target).closest("." + DATAGRID_GROUP_ROW_CLASS).length, isExpandButtonClicked = $(e.jQueryEvent.target).closest("." + DATAGRID_EXPAND_CLASS).length; if (isGroupRowStateChanged || isExpandButtonClicked) { that._changeGroupRowState(e) } that.callBase(e) }, _changeGroupRowState: function(e) { var dataController = this.getController("data"), row = dataController.items()[e.rowIndex]; if ("detail" !== row.rowType) { dataController.changeRowExpand(row.key); e.jQueryEvent.preventDefault(); e.handled = true } }, _getCellTemplate: function(options) { var that = this; if ("expand" === options.column.command) { return { allowRenderToDetachedContainer: true, render: function(container, options) { if (commonUtils.isDefined(options.value) && !(options.data && options.data.isContinuation) && !options.row.inserted) { container.addClass(DATAGRID_EXPAND_CLASS).addClass(DATAGRID_SELECTION_DISABLED_CLASS); $("<div>").addClass(options.value ? DATAGRID_GROUP_OPENED_CLASS : DATAGRID_GROUP_CLOSED_CLASS).appendTo(container); that.setAria("label", options.value ? that.localize("dxDataGrid-ariaCollapse") : that.localize("dxDataGrid-ariaExpand"), container) } } } } return that.callBase(options) } } }(); var columnHeadersViewExtender = function() { return { getContextMenuItems: function(options) { var that = this, contextMenuEnabled = that.option("grouping.contextMenuEnabled"), items = that.callBase(options); if (contextMenuEnabled && options.row && "header" === options.row.rowType) { var column = options.column; if (!column.command && (!commonUtils.isDefined(column.allowGrouping) || column.allowGrouping)) { var groupingTexts = that.option("grouping.texts"), isColumnGrouped = commonUtils.isDefined(column.groupIndex) && column.groupIndex > -1, onItemClick = onGroupingMenuItemClick.bind(that, column); items = items || []; items.push({ text: groupingTexts.groupByThisColumn, value: "group", beginGroup: true, disabled: isColumnGrouped, onItemClick: onItemClick }); if (column.showWhenGrouped) { items.push({ text: groupingTexts.ungroup, value: "ungroup", disabled: !isColumnGrouped, onItemClick: onItemClick }) } items.push({ text: groupingTexts.ungroupAll, value: "ungroupAll", onItemClick: onItemClick }) } } return items } } }(); gridCore.registerModule("grouping", { defaultOptions: function() { return { grouping: { autoExpandAll: true, allowCollapsing: true, contextMenuEnabled: false, expandMode: "buttonClick", texts: { groupContinuesMessage: messageLocalization.format("dxDataGrid-groupContinuesMessage"), groupContinuedMessage: messageLocalization.format("dxDataGrid-groupContinuedMessage"), groupByThisColumn: messageLocalization.format("dxDataGrid-groupHeaderText"), ungroup: messageLocalization.format("dxDataGrid-ungroupHeaderText"), ungroupAll: messageLocalization.format("dxDataGrid-ungroupAllText") } }, groupPanel: { visible: false, emptyPanelText: messageLocalization.format("dxDataGrid-groupPanelEmptyText"), allowColumnDragging: true } } }, extenders: { controllers: { data: GroupingDataControllerExtender }, views: { headerPanel: GroupingHeaderPanelExtender, rowsView: GroupingRowsViewExtender, columnHeadersView: columnHeadersViewExtender } } }) }, /*!***********************************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.grouping.expanded.js ***! \***********************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), toComparable = __webpack_require__( /*! ../../core/utils/data */ 50).toComparable, dataUtils = __webpack_require__( /*! ../../data/utils */ 137), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, storeHelper = __webpack_require__( /*! ../../data/store_helper */ 156), gridCore = __webpack_require__( /*! ./ui.data_grid.core */ 348), normalizeSortingInfo = gridCore.normalizeSortingInfo, groupingCore = __webpack_require__( /*! ./ui.data_grid.grouping.core */ 383), createGroupFilter = groupingCore.createGroupFilter, createOffsetFilter = groupingCore.createOffsetFilter, dataQuery = __webpack_require__( /*! ../../data/query */ 159), when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when; var loadTotalCount = function(dataSource, options) { var d = $.Deferred(), loadOptions = extend({ skip: 0, take: 1, requireTotalCount: true }, options); dataSource.load(loadOptions).done(function(data, extra) { d.resolve(extra && extra.totalCount) }).fail(d.reject.bind(d)); return d }; exports.loadTotalCount = loadTotalCount; exports.GroupingHelper = groupingCore.GroupingHelper.inherit(function() { var foreachCollapsedGroups = function(that, callback, updateOffsets) { return that.foreachGroups(function(groupInfo) { if (!groupInfo.isExpanded) { return callback(groupInfo) } }, false, false, updateOffsets, true) }; var correctSkipLoadOption = function(that, skip) { var skipCorrection = 0, resultSkip = skip || 0; if (skip) { foreachCollapsedGroups(that, function(groupInfo) { if (groupInfo.offset - skipCorrection >= skip) { return false } skipCorrection += groupInfo.count - 1 }); resultSkip += skipCorrection } return resultSkip }; var processGroupItems = function(that, items, path, offset, skipFirstItem, take) { var i, item, offsetInfo, removeLastItemsCount = 0, needRemoveFirstItem = false; for (i = 0; i < items.length; i++) { item = items[i]; if (void 0 !== item.items) { path.push(item.key); var groupInfo = that.findGroupInfo(path); if (groupInfo && !groupInfo.isExpanded) { item.collapsedItems = item.items; item.items = null; offset += groupInfo.count; take--; if (take < 0) { removeLastItemsCount++ } if (skipFirstItem) { needRemoveFirstItem = true } } else { if (item.items) { offsetInfo = processGroupItems(that, item.items, path, offset, skipFirstItem, take); if (skipFirstItem) { if (offsetInfo.offset - offset > 1) { item.isContinuation = true } else { needRemoveFirstItem = true } } offset = offsetInfo.offset; take = offsetInfo.take; if (take < 0) { if (item.items.length) { item.isContinuationOnNextPage = true } else { removeLastItemsCount++ } } } } path.pop() } else { if (skipFirstItem) { needRemoveFirstItem = true } offset++; take--; if (take < 0) { removeLastItemsCount++ } } skipFirstItem = false } if (needRemoveFirstItem) { items.splice(0, 1) } if (removeLastItemsCount) { items.splice(-removeLastItemsCount, removeLastItemsCount) } return { offset: offset, take: take } }; var pathEquals = function(path1, path2) { var i; if (path1.length !== path2.length) { return false } for (i = 0; i < path1.length; i++) { if (!dataUtils.keysEqual(null, path1[i], path2[i])) { return false } } return true }; var updateGroupOffsets = function(that, items, path, offset, additionalGroupInfo) { var i, item; if (!items) { return } for (i = 0; i < items.length; i++) { item = items[i]; if ("key" in item && void 0 !== item.items) { path.push(item.key); if (additionalGroupInfo && pathEquals(additionalGroupInfo.path, path) && !item.isContinuation) { additionalGroupInfo.offset = offset } var groupInfo = that.findGroupInfo(path); if (groupInfo && !item.isContinuation) { groupInfo.offset = offset } if (groupInfo && !groupInfo.isExpanded) { offset += groupInfo.count } else { offset = updateGroupOffsets(that, item.items, path, offset, additionalGroupInfo) } path.pop() } else { offset++ } } return offset }; var removeGroupLoadOption = function(storeLoadOptions, loadOptions) { var groups, sorts; if (loadOptions.group) { groups = normalizeSortingInfo(loadOptions.group); sorts = normalizeSortingInfo(storeLoadOptions.sort); storeLoadOptions.sort = storeHelper.arrangeSortingInfo(groups, sorts); delete loadOptions.group } }; var createNotGroupFilter = function(path, storeLoadOptions, group) { var i, j, filterElement, groups = normalizeSortingInfo(group || storeLoadOptions.group), filter = []; for (i = 0; i < path.length; i++) { filterElement = []; for (j = 0; j <= i; j++) { filterElement.push([groups[j].selector, i === j ? "<>" : "=", path[j]]) } filter.push(gridCore.combineFilters(filterElement)) } filter = gridCore.combineFilters(filter, "or"); return gridCore.combineFilters([filter, storeLoadOptions.filter]) }; var getGroupCount = function(item, groupCount) { var i, count = item.count || item.items.length; if (!item.count && groupCount > 1) { count = 0; for (i = 0; i < item.items.length; i++) { count += getGroupCount(item.items[i], groupCount - 1) } } return count }; return { handleDataLoading: function(options) { var loadOptions, take, that = this, storeLoadOptions = options.storeLoadOptions, collapsedGroups = [], collapsedItemsCount = 0, skipFirstItem = false, group = options.loadOptions.group, skipCorrection = 0; removeGroupLoadOption(storeLoadOptions, options.loadOptions); options.group = options.group || group; if (options.isCustomLoading) { return } loadOptions = extend({}, storeLoadOptions); loadOptions.skip = correctSkipLoadOption(that, storeLoadOptions.skip); if (loadOptions.skip && loadOptions.take && group) { loadOptions.skip--; loadOptions.take++; skipFirstItem = true } if (loadOptions.take && group) { take = loadOptions.take; loadOptions.take++ } foreachCollapsedGroups(that, function(groupInfo) { if (groupInfo.offset >= loadOptions.skip + loadOptions.take + skipCorrection) { return false } else { if (groupInfo.offset >= loadOptions.skip + skipCorrection && groupInfo.count) { skipCorrection += groupInfo.count - 1; collapsedGroups.push(groupInfo); collapsedItemsCount += groupInfo.count } } }); $.each(collapsedGroups, function() { loadOptions.filter = createNotGroupFilter(this.path, loadOptions, group) }); options.storeLoadOptions = loadOptions; options.collapsedGroups = collapsedGroups; options.collapsedItemsCount = collapsedItemsCount; options.skip = loadOptions.skip || 0; options.skipFirstItem = skipFirstItem; options.take = take }, handleDataLoaded: function(options, callBase) { var pathIndex, query, that = this, data = options.data, collapsedGroups = options.collapsedGroups, groups = normalizeSortingInfo(options.group), groupCount = groups.length; function appendCollapsedPath(data, path, groups, collapsedGroup, offset) { if (!data || !path.length || !groups.length) { return } var i, keyValue, pathValue = toComparable(path[0], true); for (i = 0; i < data.length; i++) { keyValue = toComparable(data[i].key, true); if (offset >= collapsedGroup.offset || pathValue === keyValue) { break } else { offset += getGroupCount(data[i], groups.length) } } if (!data.length || pathValue !== keyValue) { data.splice(i, 0, { key: path[0], items: [], count: 1 === path.length ? collapsedGroup.count : void 0 }) } appendCollapsedPath(data[i].items, path.slice(1), groups.slice(1), collapsedGroup, offset) } callBase(options); if (groupCount) { query = dataQuery(data); storeHelper.multiLevelGroup(query, groups).enumerate().done(function(groupedData) { data = groupedData }); if (collapsedGroups) { for (pathIndex = 0; pathIndex < collapsedGroups.length; pathIndex++) { appendCollapsedPath(data, collapsedGroups[pathIndex].path, groups, collapsedGroups[pathIndex], options.skip) } } if (!options.isCustomLoading) { processGroupItems(that, data, [], options.skip, options.skipFirstItem, options.take); that.updateItemsCount(data, groupCount) } options.data = data; if (options.collapsedItemsCount && options.extra && options.extra.totalCount >= 0) { options.extra.totalCount += options.collapsedItemsCount } } }, updateTotalItemsCount: function() { var itemsCountCorrection = 0; foreachCollapsedGroups(this, function(groupInfo) { if (groupInfo.count) { itemsCountCorrection -= groupInfo.count - 1 } }); this.callBase(itemsCountCorrection) }, changeRowExpand: function(path) { var groupCountQuery, that = this, dataSource = that._dataSource, beginPageIndex = dataSource.beginPageIndex ? dataSource.beginPageIndex() : dataSource.pageIndex(), dataSourceItems = dataSource.items(), offset = correctSkipLoadOption(that, beginPageIndex * dataSource.pageSize()), groupInfo = that.findGroupInfo(path); if (groupInfo && !groupInfo.isExpanded) { groupCountQuery = $.Deferred().resolve(groupInfo.count) } else { groupCountQuery = loadTotalCount(dataSource, { filter: createGroupFilter(path, { filter: dataSource.filter(), group: dataSource.group() }) }) } return when(groupCountQuery).done(function(count) { count = parseInt(count.length ? count[0] : count); if (groupInfo) { updateGroupOffsets(that, dataSourceItems, [], offset); groupInfo.isExpanded = !groupInfo.isExpanded; groupInfo.count = count } else { groupInfo = { offset: -1, count: count, path: path, isExpanded: false }; updateGroupOffsets(that, dataSourceItems, [], offset, groupInfo); if (groupInfo.offset >= 0) { that.addGroupInfo(groupInfo) } } that.updateTotalItemsCount() }).fail(function() { dataSource.fireEvent("loadError", arguments) }) }, allowCollapseAll: function() { return false }, refresh: function(options, isReload, operationTypes) { var that = this, storeLoadOptions = options.storeLoadOptions, dataSource = that._dataSource; this.callBase.apply(this, arguments); if (isReload || operationTypes.reload) { return foreachCollapsedGroups(that, function(groupInfo) { var groupCountQuery = loadTotalCount(dataSource, { filter: createGroupFilter(groupInfo.path, storeLoadOptions) }), groupOffsetQuery = loadTotalCount(dataSource, { filter: createOffsetFilter(groupInfo.path, storeLoadOptions) }); return when(groupOffsetQuery, groupCountQuery).done(function(offset, count) { offset = parseInt(offset.length ? offset[0] : offset); count = parseInt(count.length ? count[0] : count); groupInfo.offset = offset; if (groupInfo.count !== count) { groupInfo.count = count; that.updateTotalItemsCount() } }) }, true) } } } }()) }, /*!*******************************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.grouping.core.js ***! \*******************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), gridCore = __webpack_require__( /*! ./ui.data_grid.core */ 348), normalizeSortingInfo = __webpack_require__( /*! ../../data/utils */ 137).normalizeSortingInfo, when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when; exports.createGroupFilter = function(path, storeLoadOptions) { var i, groups = normalizeSortingInfo(storeLoadOptions.group), filter = []; for (i = 0; i < path.length; i++) { filter.push([groups[i].selector, "=", path[i]]) } if (storeLoadOptions.filter) { filter.push(storeLoadOptions.filter) } return gridCore.combineFilters(filter) }; exports.createOffsetFilter = function(path, storeLoadOptions) { var i, j, filterElement, selector, groups = normalizeSortingInfo(storeLoadOptions.group), filter = []; for (i = 0; i < path.length; i++) { filterElement = []; for (j = 0; j <= i; j++) { selector = groups[j].selector; if (i === j && (null === path[j] || false === path[j] || true === path[j])) { if (false === path[j]) { filterElement.push([selector, "=", groups[j].desc ? true : null]) } else { if (path[j] ? !groups[j].desc : groups[j].desc) { filterElement.push([selector, "<>", path[j]]) } else { filterElement.push([selector, "<>", null]); filterElement.push([selector, "=", null]) } } } else { filterElement.push([selector, i === j ? groups[j].desc ? ">" : "<" : "=", path[j]]) } } filter.push(gridCore.combineFilters(filterElement)) } filter = gridCore.combineFilters(filter, "or"); return gridCore.combineFilters([filter, storeLoadOptions.filter]) }; exports.GroupingHelper = Class.inherit(function() { var findGroupInfoByKey = function(groupsInfo, key) { var hash = groupsInfo.hash; return hash && hash[key] }; var getGroupInfoIndexByOffset = function(groupsInfo, offset) { var index, leftIndex = 0, rightIndex = groupsInfo.length - 1; if (!groupsInfo.length) { return 0 } do { var middleIndex = rightIndex + leftIndex >> 1; if (groupsInfo[middleIndex].offset > offset) { rightIndex = middleIndex } else { leftIndex = middleIndex } } while (rightIndex - leftIndex > 1); for (index = leftIndex; index <= rightIndex; index++) { if (groupsInfo[index].offset > offset) { break } } return index }; var updateGroupInfoOffsets = function(groupsInfo, parents) { var groupInfo, index; parents = parents || []; for (index = 0; index < groupsInfo.length; index++) { groupInfo = groupsInfo[index]; if (groupInfo.data && groupInfo.data.offset !== groupInfo.offset) { groupInfo.offset = groupInfo.data.offset; for (var parentIndex = 0; parentIndex < parents.length; parentIndex++) { parents[parentIndex].offset = groupInfo.offset } } } groupsInfo.sort(function(a, b) { return a.offset - b.offset }) }; var cleanGroupsInfo = function(groupsInfo, groupIndex, groupsCount) { var i; for (i = 0; i < groupsInfo.length; i++) { if (groupIndex + 1 >= groupsCount) { groupsInfo[i].children = [] } else { cleanGroupsInfo(groupsInfo[i].children, groupIndex + 1, groupsCount) } } }; return { ctor: function(dataSourceAdapter) { this._dataSource = dataSourceAdapter; this.reset() }, reset: function() { this._groupsInfo = []; this._totalCountCorrection = 0; this._itemsCount = 0 }, totalCountCorrection: function() { return this._totalCountCorrection }, updateTotalItemsCount: function(totalCountCorrection) { this._totalCountCorrection = totalCountCorrection || 0 }, _isGroupItemCountable: function(item) { return !this._isVirtualPaging() || !item.isContinuation }, _isVirtualPaging: function() { var scrollingMode = this._dataSource.option("scrolling.mode"); return "virtual" === scrollingMode || "infinite" === scrollingMode }, itemsCount: function() { return this._itemsCount }, updateItemsCount: function(data, groupsCount) { function calculateItemsCount(that, items, groupsCount) { var i, result = 0; if (items) { if (!groupsCount) { result = items.length } else { for (i = 0; i < items.length; i++) { if (that._isGroupItemCountable(items[i])) { result++ } result += calculateItemsCount(that, items[i].items, groupsCount - 1) } } } return result } this._itemsCount = calculateItemsCount(this, data, groupsCount) }, foreachGroups: function(callback, childrenAtFirst, foreachCollapsedGroups, updateOffsets, updateParentOffsets) { var that = this; function foreachGroupsCore(groupsInfo, callback, childrenAtFirst, parents) { var i, callbackResult, callbackResults = []; function executeCallback(callback, data, parents, callbackResults) { var callbackResult = data && callback(data, parents); callbackResult && callbackResults.push(callbackResult); return callbackResult } for (i = 0; i < groupsInfo.length; i++) { parents.push(groupsInfo[i].data); if (!childrenAtFirst && false === executeCallback(callback, groupsInfo[i].data, parents, callbackResults)) { return false } if (!groupsInfo[i].data || groupsInfo[i].data.isExpanded || foreachCollapsedGroups) { callbackResult = foreachGroupsCore(groupsInfo[i].children, callback, childrenAtFirst, parents); callbackResult && callbackResults.push(callbackResult); if (false === callbackResult) { return false } } if (childrenAtFirst && false === executeCallback(callback, groupsInfo[i].data, parents, callbackResults)) { return false } if (!groupsInfo[i].data || groupsInfo[i].data.offset !== groupsInfo[i].offset) { updateOffsets = true } parents.pop() } var currentParents = updateParentOffsets && parents.slice(0); return updateOffsets && when.apply($, callbackResults).always(function() { updateGroupInfoOffsets(groupsInfo, currentParents) }) } return foreachGroupsCore(that._groupsInfo, callback, childrenAtFirst, []) }, findGroupInfo: function(path) { var pathIndex, groupInfo, that = this, groupsInfo = that._groupsInfo; for (pathIndex = 0; groupsInfo && pathIndex < path.length; pathIndex++) { groupInfo = findGroupInfoByKey(groupsInfo, path[pathIndex]); groupsInfo = groupInfo && groupInfo.children } return groupInfo && groupInfo.data }, addGroupInfo: function(groupInfoData) { var index, groupInfo, pathIndex, that = this, path = groupInfoData.path, groupsInfo = that._groupsInfo; for (pathIndex = 0; pathIndex < path.length; pathIndex++) { groupInfo = findGroupInfoByKey(groupsInfo, path[pathIndex]); if (!groupInfo) { groupInfo = { key: path[pathIndex], offset: groupInfoData.offset, data: { offset: groupInfoData.offset, isExpanded: true, path: path.slice(0, pathIndex + 1) }, children: [] }; index = getGroupInfoIndexByOffset(groupsInfo, groupInfoData.offset); groupsInfo.splice(index, 0, groupInfo); groupsInfo.hash = groupsInfo.hash || {}; groupsInfo.hash[groupInfo.key] = groupInfo } if (pathIndex === path.length - 1) { groupInfo.data = groupInfoData; if (groupInfo.offset !== groupInfoData.offset) { updateGroupInfoOffsets(groupsInfo) } } groupsInfo = groupInfo.children } }, allowCollapseAll: function() { return true }, refresh: function(options) { var groupIndex, that = this, storeLoadOptions = options.storeLoadOptions, oldGroups = normalizeSortingInfo(that._group || []), groups = normalizeSortingInfo(storeLoadOptions.group || []), groupsCount = Math.min(oldGroups.length, groups.length); that._group = storeLoadOptions.group; for (groupIndex = 0; groupIndex < groupsCount; groupIndex++) { if (oldGroups[groupIndex].selector !== groups[groupIndex].selector) { groupsCount = groupIndex; break } } if (!groupsCount) { that.reset() } else { cleanGroupsInfo(that._groupsInfo, 0, groupsCount) } }, handleDataLoading: function() {}, handleDataLoaded: function(options, callBase) { callBase(options) }, handleDataLoadedCore: function(options, callBase) { callBase(options) } } }()) }, /*!************************************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.grouping.collapsed.js ***! \************************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, gridCore = __webpack_require__( /*! ./ui.data_grid.core */ 348), normalizeSortingInfo = gridCore.normalizeSortingInfo, groupingCore = __webpack_require__( /*! ./ui.data_grid.grouping.core */ 383), createGroupFilter = groupingCore.createGroupFilter, createOffsetFilter = groupingCore.createOffsetFilter, errors = __webpack_require__( /*! ../widget/ui.errors */ 22), dataErrors = __webpack_require__( /*! ../../data/errors */ 155).errors, when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when; exports.GroupingHelper = groupingCore.GroupingHelper.inherit(function() { var foreachExpandedGroups = function(that, callback, updateGroups) { return that.foreachGroups(function(groupInfo, parents) { if (groupInfo.isExpanded) { return callback(groupInfo, parents) } }, true, false, updateGroups, updateGroups) }; var processGroupItems = function(that, items, groupsCount, expandedInfo, path, isCustomLoading, isLastGroupExpanded) { var i, item, groupInfo, isExpanded; expandedInfo.items = expandedInfo.items || []; expandedInfo.paths = expandedInfo.paths || []; expandedInfo.count = expandedInfo.count || 0; expandedInfo.lastCount = expandedInfo.lastCount || 0; if (!groupsCount) { return } for (i = 0; i < items.length; i++) { item = items[i]; if (void 0 !== item.items) { path.push(item.key); if (isCustomLoading) { isExpanded = true } else { groupInfo = that.findGroupInfo(path); isExpanded = groupInfo && groupInfo.isExpanded } if (!isExpanded) { item.collapsedItems = item.items; item.items = null } else { if (item.items) { processGroupItems(that, item.items, groupsCount - 1, expandedInfo, path, isCustomLoading, isLastGroupExpanded) } else { if (1 === groupsCount && item.count && (!isCustomLoading || isLastGroupExpanded)) { expandedInfo.items.push(item); expandedInfo.paths.push(path.slice(0)); expandedInfo.count += expandedInfo.lastCount; expandedInfo.lastCount = item.count } } } path.pop() } } }; var updateGroupInfoItem = function(that, item, isLastGroupLevel, path, offset) { var count, groupInfo = that.findGroupInfo(path); if (!groupInfo) { if (isLastGroupLevel) { count = item.count > 0 ? item.count : item.items.length } that.addGroupInfo({ isExpanded: that._isGroupExpanded(path.length - 1), path: path.slice(0), offset: offset, count: count || 0 }) } else { if (isLastGroupLevel) { groupInfo.count = item.count > 0 ? item.count : item.items && item.items.length || 0 } else { item.count = groupInfo.count || item.count } groupInfo.offset = offset } }; var updateGroupInfos = function(that, options, items, loadedGroupCount, groupIndex, path) { var item, count, i, groupCount = options.group ? options.group.length : 0, isLastGroupLevel = groupCount === loadedGroupCount, remotePaging = options.remoteOperations.paging, offset = 0, totalCount = 0; groupIndex = groupIndex || 0; path = path || []; if (remotePaging) { offset = 0 === groupIndex ? options.skip || 0 : options.skips[groupIndex - 1] || 0 } if (groupIndex >= loadedGroupCount) { return items.length } for (i = 0; i < items.length; i++) { item = items[i]; if (item) { path.push(item.key); if (!item.count && !item.items || void 0 === item.items) { return -1 } updateGroupInfoItem(that, item, isLastGroupLevel, path, offset + i); count = item.items ? updateGroupInfos(that, options, item.items, loadedGroupCount, groupIndex + 1, path) : item.count || -1; if (count < 0) { return -1 } totalCount += count; path.pop() } } return totalCount }; var isGroupExpanded = function(groups, groupIndex) { return groups && groups.length && groups[groupIndex] && !!groups[groupIndex].isExpanded }; var getTotalOffset = function(groupInfos, pageSize, offset) { var groupIndex, groupSize, totalOffset = offset; for (groupIndex = 0; groupIndex < groupInfos.length; groupIndex++) { groupSize = groupInfos[groupIndex].offset + 1; if (groupIndex > 0) { groupSize += groupInfos[groupIndex - 1].childrenTotalCount; if (pageSize) { groupSize += getContinuationGroupCount(totalOffset, pageSize, groupSize, groupIndex - 1) * groupIndex } } totalOffset += groupSize } return totalOffset }; var getContinuationGroupCount = function(groupOffset, pageSize, groupSize, groupIndex) { groupIndex = groupIndex || 0; if (pageSize > 1 && groupSize > 0) { var pageOffset = groupOffset - Math.floor(groupOffset / pageSize) * pageSize || pageSize; pageOffset += groupSize - groupIndex - 2; if (pageOffset < 0) { pageOffset += pageSize } return Math.floor(pageOffset / (pageSize - groupIndex - 1)) } return 0 }; exports.getContinuationGroupCount = getContinuationGroupCount; function applyContinuationToGroupItem(options, expandedInfo, groupLevel, expandedItemIndex) { var item = expandedInfo.items[expandedItemIndex], skip = options.skips && options.skips[groupLevel], take = options.takes && options.takes[groupLevel], isLastExpandedItem = expandedItemIndex === expandedInfo.items.length - 1, isFirstExpandedItem = 0 === expandedItemIndex, lastExpandedItemSkip = isFirstExpandedItem && skip || 0, isItemsTruncatedByTake = item.count > take + lastExpandedItemSkip; if (isFirstExpandedItem && void 0 !== skip) { item.isContinuation = true } if (isLastExpandedItem && void 0 !== take && isItemsTruncatedByTake) { item.isContinuationOnNextPage = true } } function fillSkipTakeInExpandedInfo(options, expandedInfo, currentGroupCount) { var currentGroupIndex = currentGroupCount - 1, groupCount = options.group ? options.group.length : 0; expandedInfo.skip = options.skips && options.skips[currentGroupIndex]; if (options.takes && void 0 !== options.takes[currentGroupIndex]) { if (groupCount === currentGroupCount) { expandedInfo.take = expandedInfo.count ? expandedInfo.count - (expandedInfo.skip || 0) : 0 } else { expandedInfo.take = 0 } expandedInfo.take += options.takes[currentGroupIndex] } } function isDataDeferred(data) { return !Array.isArray(data) } function makeDataDeferred(options) { if (!isDataDeferred(options.data)) { options.data = $.Deferred() } } function loadGroupItems(that, options, loadedGroupCount, expandedInfo, groupLevel, data) { if (!options.isCustomLoading) { expandedInfo = {}; var currentGroupCount = loadedGroupCount + groupLevel; processGroupItems(that, data, currentGroupCount, expandedInfo, []); fillSkipTakeInExpandedInfo(options, expandedInfo, currentGroupCount) } var groupCount = options.group ? options.group.length : 0; if (expandedInfo.paths.length && groupCount - loadedGroupCount - groupLevel > 0) { makeDataDeferred(options); loadExpandedGroups(that, options, expandedInfo, loadedGroupCount, groupLevel, data) } else { if (expandedInfo.paths.length && options.storeLoadOptions.group) { makeDataDeferred(options); loadLastLevelGroupItems(that, options, expandedInfo, data) } else { if (isDataDeferred(options.data)) { options.data.resolve(data) } } } } function loadExpandedGroups(that, options, expandedInfo, loadedGroupCount, groupLevel, data) { var groups = options.group || [], currentGroup = groups[groupLevel + 1], deferreds = []; $.each(expandedInfo.paths, function(expandedItemIndex) { var loadOptions = { requireTotalCount: false, requireGroupCount: true, group: [currentGroup], groupSummary: options.storeLoadOptions.groupSummary, filter: createGroupFilter(expandedInfo.paths[expandedItemIndex], { filter: options.storeLoadOptions.filter, group: groups }) }; if (0 === expandedItemIndex) { loadOptions.skip = expandedInfo.skip || 0 } if (expandedItemIndex === expandedInfo.paths.length - 1) { loadOptions.take = expandedInfo.take } var loadResult = 0 === loadOptions.take ? [] : that._dataSource.loadFromStore(loadOptions); when(loadResult).done(function(data) { var item = expandedInfo.items[expandedItemIndex]; applyContinuationToGroupItem(options, expandedInfo, groupLevel, expandedItemIndex); item.items = data }); deferreds.push(loadResult) }); when.apply(null, deferreds).done(function() { updateGroupInfos(that, options, data, groups.length); loadGroupItems(that, options, loadedGroupCount, expandedInfo, groupLevel + 1, data) }) } function loadLastLevelGroupItems(that, options, expandedInfo, data) { var expandedFilters = [], groups = options.group || []; $.each(expandedInfo.paths, function(_, expandedPath) { expandedFilters.push(createGroupFilter(expandedPath, { group: options.isCustomLoading ? options.storeLoadOptions.group : groups })) }); var filter = options.storeLoadOptions.filter; if (!options.storeLoadOptions.isLoadingAll) { filter = gridCore.combineFilters([filter, gridCore.combineFilters(expandedFilters, "or")]) } var loadOptions = extend({}, options.storeLoadOptions, { requireTotalCount: false, requireGroupCount: false, group: null, sort: groups.concat(normalizeSortingInfo(options.storeLoadOptions.sort || [])), filter: filter }); loadOptions.skip = expandedInfo.skip; loadOptions.take = expandedInfo.take; when(0 === expandedInfo.take ? [] : that._dataSource.loadFromStore(loadOptions)).done(function(items, extra) { $.each(expandedInfo.items, function(index, item) { var itemCount = item.count - (0 === index && loadOptions.skip || 0), expandedItems = items.splice(0, itemCount); applyContinuationToGroupItem(options, expandedInfo, groups.length - 1, index); item.items = expandedItems }); options.data.resolve(data) }).fail(options.data.reject) } var loadGroupTotalCount = function(dataSource, options) { var d = $.Deferred(), isGrouping = !!(options.group && options.group.length), loadOptions = extend({ skip: 0, take: 1, requireGroupCount: isGrouping, requireTotalCount: !isGrouping }, options, { group: isGrouping ? options.group : null }); dataSource.load(loadOptions).done(function(data, extra) { var count = extra && (isGrouping ? extra.groupCount : extra.totalCount); if (!isFinite(count)) { throw dataErrors.Error(isGrouping ? "E4022" : "E4021") } d.resolve(count) }).fail(d.reject.bind(d)); return d }; return { updateTotalItemsCount: function(options) { var totalItemsCount = 0, totalCount = options.extra && options.extra.totalCount || 0, groupCount = options.extra && options.extra.groupCount || 0, pageSize = this._dataSource.pageSize(), isVirtualPaging = this._isVirtualPaging(); foreachExpandedGroups(this, function(groupInfo) { groupInfo.childrenTotalCount = 0 }); foreachExpandedGroups(this, function(groupInfo, parents) { var totalOffset = getTotalOffset(parents, isVirtualPaging ? 0 : pageSize, totalItemsCount), count = groupInfo.count + groupInfo.childrenTotalCount; if (!isVirtualPaging) { count += getContinuationGroupCount(totalOffset, pageSize, count, parents.length - 1) } if (parents[parents.length - 2]) { parents[parents.length - 2].childrenTotalCount += count } else { totalItemsCount += count } }); this.callBase(totalItemsCount - totalCount + groupCount) }, _isGroupExpanded: function(groupIndex) { var groups = this._dataSource.group(); return isGroupExpanded(groups, groupIndex) }, _updatePagingOptions: function(options) { var that = this, isVirtualPaging = that._isVirtualPaging(), pageSize = that._dataSource.pageSize(), skips = [], takes = [], skipChildrenTotalCount = 0, childrenTotalCount = 0; if (options.take) { foreachExpandedGroups(this, function(groupInfo) { groupInfo.childrenTotalCount = 0; groupInfo.skipChildrenTotalCount = 0 }); foreachExpandedGroups(that, function(groupInfo, parents) { var skip, take, takeCorrection = 0, parentTakeCorrection = 0, totalOffset = getTotalOffset(parents, isVirtualPaging ? 0 : pageSize, childrenTotalCount), continuationGroupCount = 0, skipContinuationGroupCount = 0, groupInfoCount = groupInfo.count + groupInfo.childrenTotalCount, childrenGroupInfoCount = groupInfoCount; skip = options.skip - totalOffset; if (totalOffset <= options.skip + options.take && groupInfoCount) { take = options.take; if (!isVirtualPaging) { continuationGroupCount = getContinuationGroupCount(totalOffset, pageSize, groupInfoCount, parents.length - 1); groupInfoCount += continuationGroupCount * parents.length; childrenGroupInfoCount += continuationGroupCount; if (pageSize && skip >= 0) { takeCorrection = parents.length; parentTakeCorrection = parents.length - 1; skipContinuationGroupCount = Math.floor(skip / pageSize) } } if (skip >= 0) { if (totalOffset + groupInfoCount > options.skip) { skips.unshift(skip - skipContinuationGroupCount * takeCorrection - groupInfo.skipChildrenTotalCount) } if (totalOffset + groupInfoCount >= options.skip + take) { takes.unshift(take - takeCorrection - groupInfo.childrenTotalCount + groupInfo.skipChildrenTotalCount) } } else { if (totalOffset + groupInfoCount >= options.skip + take) { takes.unshift(take + skip - groupInfo.childrenTotalCount) } } } if (totalOffset <= options.skip) { if (parents[parents.length - 2]) { parents[parents.length - 2].skipChildrenTotalCount += Math.min(childrenGroupInfoCount, skip + 1 - skipContinuationGroupCount * parentTakeCorrection) } else { skipChildrenTotalCount += Math.min(childrenGroupInfoCount, skip + 1) } } if (totalOffset <= options.skip + take) { groupInfoCount = Math.min(childrenGroupInfoCount, skip + take - (skipContinuationGroupCount + 1) * parentTakeCorrection); if (parents[parents.length - 2]) { parents[parents.length - 2].childrenTotalCount += groupInfoCount } else { childrenTotalCount += groupInfoCount } } }); options.skip -= skipChildrenTotalCount; options.take -= childrenTotalCount - skipChildrenTotalCount } options.skips = skips; options.takes = takes }, changeRowExpand: function(path) { var that = this, groupInfo = that.findGroupInfo(path), dataSource = that._dataSource, remoteGroupPaging = dataSource.remoteOperations().groupPaging, groups = normalizeSortingInfo(dataSource.group()); if (groupInfo) { groupInfo.isExpanded = !groupInfo.isExpanded; if (remoteGroupPaging && groupInfo.isExpanded && path.length < groups.length) { return loadGroupTotalCount(dataSource, { filter: createGroupFilter(path, { filter: dataSource.filter(), group: dataSource.group() }), group: groups.slice(path.length) }).done(function(groupCount) { groupInfo.count = groupCount }) } return $.Deferred().resolve() } return $.Deferred().reject() }, handleDataLoading: function(options) { var that = this, storeLoadOptions = options.storeLoadOptions, groups = normalizeSortingInfo(storeLoadOptions.group || options.loadOptions.group); if (options.isCustomLoading || !groups.length) { return } if (options.remoteOperations.grouping) { var remotePaging = that._dataSource.remoteOperations().paging; storeLoadOptions.group = normalizeSortingInfo(storeLoadOptions.group); storeLoadOptions.group.forEach(function(group, index) { var isLastGroup = index === storeLoadOptions.group.length - 1; group.isExpanded = !remotePaging || !isLastGroup }) } options.group = options.group || groups; if (options.remoteOperations.paging) { options.skip = storeLoadOptions.skip; options.take = storeLoadOptions.take; storeLoadOptions.requireGroupCount = true; storeLoadOptions.group = groups.slice(0, 1); that._updatePagingOptions(options); storeLoadOptions.skip = options.skip; storeLoadOptions.take = options.take } else { that.foreachGroups(function(groupInfo) { groupInfo.count = 0 }) } }, handleDataLoadedCore: function(options, callBase) { var totalCount, that = this, loadedGroupCount = normalizeSortingInfo(options.storeLoadOptions.group || options.loadOptions.group).length, groupCount = options.group ? options.group.length : 0, expandedInfo = {}; if (options.isCustomLoading) { callBase(options); processGroupItems(that, options.data, loadedGroupCount, expandedInfo, [], options.isCustomLoading, options.storeLoadOptions.isLoadingAll) } else { totalCount = updateGroupInfos(that, options, options.data, loadedGroupCount); if (totalCount < 0) { throw errors.Error("E1037") } if (!options.remoteOperations.paging) { if (loadedGroupCount && options.extra && options.loadOptions.requireTotalCount) { options.extra.totalCount = totalCount; options.extra.groupCount = options.data.length } } if (groupCount && options.storeLoadOptions.requireGroupCount && !isFinite(options.extra.groupCount)) { throw dataErrors.Error("E4022") } that.updateTotalItemsCount(options); if (!options.remoteOperations.paging) { that._updatePagingOptions(options) } callBase(options); if (!options.remoteOperations.paging) { that._processPaging(options, loadedGroupCount) } } loadGroupItems(that, options, loadedGroupCount, expandedInfo, 0, options.data); if (!options.isCustomLoading) { when(options.data).done(function(data) { that.updateItemsCount(data, groupCount) }) } }, _processSkips: function(items, skips, groupCount) { if (!groupCount) { return } var firstItem = items[0], skip = skips[0], children = firstItem && firstItem.items; if (void 0 !== skip) { firstItem.isContinuation = true; if (children) { firstItem.items = children.slice(skip); this._processSkips(firstItem.items, skips.slice(1), groupCount - 1) } } }, _processTakes: function(items, skips, takes, groupCount) { if (!groupCount || !items) { return } var lastItem = items[items.length - 1], children = lastItem && lastItem.items, take = takes[0], skip = skips[0]; if (lastItem) { var maxTakeCount = lastItem.count - (lastItem.isContinuation && skip || 0) || children.length; if (void 0 !== take && maxTakeCount > take) { lastItem.isContinuationOnNextPage = true; if (children) { children = children.slice(0, take); lastItem.items = children } } this._processTakes(children, skips.slice(1), takes.slice(1), groupCount - 1) } }, _processPaging: function(options, groupCount) { this._processSkips(options.data, options.skips, groupCount); this._processTakes(options.data, options.skips, options.takes, groupCount) }, refresh: function(options, isReload, operationTypes) { var isExpanded, groupIndex, that = this, dataSource = that._dataSource, storeLoadOptions = options.storeLoadOptions, group = options.group || options.storeLoadOptions.group, oldGroups = normalizeSortingInfo(that._group); function handleGroup(groupInfo, parents) { if (parents.length === groupIndex + 1) { groupInfo.isExpanded = isExpanded } } for (groupIndex = 0; groupIndex < oldGroups.length; groupIndex++) { isExpanded = isGroupExpanded(group, groupIndex); if (isGroupExpanded(that._group, groupIndex) !== isExpanded) { that.foreachGroups(handleGroup) } } that.callBase.apply(this, arguments); if (group && options.remoteOperations.paging && (isReload || operationTypes.reload)) { return foreachExpandedGroups(that, function(groupInfo) { var groupCountQuery = loadGroupTotalCount(dataSource, { filter: createGroupFilter(groupInfo.path, { filter: storeLoadOptions.filter, group: group }), group: group.slice(groupInfo.path.length) }), groupOffsetQuery = loadGroupTotalCount(dataSource, { filter: createOffsetFilter(groupInfo.path, { filter: storeLoadOptions.filter, group: group }), group: group.slice(groupInfo.path.length - 1, 1) }); return when(groupOffsetQuery, groupCountQuery).done(function(offset, count) { offset = parseInt(offset.length ? offset[0] : offset); count = parseInt(count.length ? count[0] : count); groupInfo.offset = offset; if (groupInfo.count !== count) { groupInfo.count = count; that.updateTotalItemsCount(options) } }) }, true) } } } }()) }, /*!*******************************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.master_detail.js ***! \*******************************************************/ function(module, exports, __webpack_require__) { var gridCore = __webpack_require__( /*! ./ui.data_grid.core */ 348), masterDetailModule = __webpack_require__( /*! ../grid_core/ui.grid_core.master_detail */ 386); gridCore.registerModule("masterDetail", masterDetailModule) }, /*!*******************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.master_detail.js ***! \*******************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), gridCoreUtils = __webpack_require__( /*! ./ui.grid_core.utils */ 349), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14); var MASTER_DETAIL_CELL_CLASS = "dx-master-detail-cell", MASTER_DETAIL_ROW_CLASS = "dx-master-detail-row", CELL_FOCUS_DISABLED_CLASS = "dx-cell-focus-disabled", ROW_LINES_CLASS = "dx-row-lines"; module.exports = { defaultOptions: function() { return { masterDetail: { enabled: false, autoExpandAll: false, template: null } } }, extenders: { controllers: { columns: { _getExpandColumnsCore: function() { var expandColumns = this.callBase(); if (this.option("masterDetail.enabled")) { expandColumns.push({}) } return expandColumns } }, data: function() { var initMasterDetail = function(that) { that._expandedItems = []; that._isExpandAll = that.option("masterDetail.autoExpandAll") }; return { init: function() { var that = this; initMasterDetail(that); that.callBase() }, expandAll: function(groupIndex) { var that = this; if (groupIndex < 0) { that._isExpandAll = true; that._expandedItems = []; that.updateItems() } else { that.callBase.apply(that, arguments) } }, collapseAll: function(groupIndex) { var that = this; if (groupIndex < 0) { that._isExpandAll = false; that._expandedItems = []; that.updateItems() } else { that.callBase.apply(that, arguments) } }, isRowExpanded: function(key) { var that = this, expandIndex = gridCoreUtils.getIndexByKey(key, that._expandedItems); if (Array.isArray(key)) { return that.callBase.apply(that, arguments) } else { return !!(that._isExpandAll ^ (expandIndex >= 0 && that._expandedItems[expandIndex].visible)) } }, _getRowIndicesForExpand: function(key) { var rowIndex = this.getRowIndexByKey(key); return [rowIndex, rowIndex + 1] }, _changeRowExpandCore: function(key) { var expandIndex, that = this; if (Array.isArray(key)) { return that.callBase.apply(that, arguments) } else { expandIndex = gridCoreUtils.getIndexByKey(key, that._expandedItems); if (expandIndex >= 0) { var visible = that._expandedItems[expandIndex].visible; that._expandedItems[expandIndex].visible = !visible } else { that._expandedItems.push({ key: key, visible: true }) } that.updateItems({ changeType: "update", rowIndices: that._getRowIndicesForExpand(key) }) } }, _processDataItem: function(data, options) { var that = this, dataItem = that.callBase.apply(that, arguments); dataItem.isExpanded = that.isRowExpanded(dataItem.key); if (void 0 === options.detailColumnIndex) { options.detailColumnIndex = -1; $.each(options.visibleColumns, function(index, column) { if ("expand" === column.command && !commonUtils.isDefined(column.groupIndex)) { options.detailColumnIndex = index; return false } }) } if (options.detailColumnIndex >= 0) { dataItem.values[options.detailColumnIndex] = dataItem.isExpanded } return dataItem }, _processItems: function(items, changeType) { var expandIndex, that = this, result = []; items = that.callBase.apply(that, arguments); if ("loadingAll" === changeType) { return items } if ("refresh" === changeType) { that._expandedItems = commonUtils.grep(that._expandedItems, function(item) { return item.visible }) } $.each(items, function(index, item) { result.push(item); expandIndex = gridCoreUtils.getIndexByKey(item.key, that._expandedItems); if ("data" === item.rowType && (item.isExpanded || expandIndex >= 0) && !item.inserted) { result.push({ visible: item.isExpanded, rowType: "detail", key: item.key, data: item.data, values: [] }) } }); return result }, optionChanged: function(args) { var value, previousValue, isEnabledChanged, isAutoExpandAllChanged, that = this; if ("masterDetail" === args.name) { args.name = "dataSource"; switch (args.fullName) { case "masterDetail": value = args.value || {}; previousValue = args.previousValue || {}; isEnabledChanged = value.enabled !== previousValue.enabled; isAutoExpandAllChanged = value.autoExpandAll !== previousValue.autoExpandAll; break; case "masterDetail.enabled": isEnabledChanged = true; break; case "masterDetail.autoExpandAll": isAutoExpandAllChanged = true } if (isEnabledChanged || isAutoExpandAllChanged) { initMasterDetail(that) } } that.callBase(args) } } }() }, views: { rowsView: function() { return { _getCellTemplate: function(options) { var template, that = this, column = options.column, editingController = that.getController("editing"), isEditRow = editingController && editingController.isEditRow(options.rowIndex); if ("detail" === column.command && !isEditRow) { template = that.option("masterDetail.template") || that._getDefaultTemplate(column) } else { template = that.callBase.apply(that, arguments) } return template }, _cellPrepared: function($cell, options) { var that = this, component = that.component; that.callBase.apply(that, arguments); if (that._isFixedColumns && "detail" === options.rowType && "detail" === options.column.command) { $cell.find("." + that.getWidgetContainerClass()).each(function() { var dataGrid = $(this).parent().data("dxDataGrid"); if (dataGrid) { dataGrid.on("contentReady", function() { var $rows = component.getRowElement(options.rowIndex); if ($rows && 2 === $rows.length && $rows.eq(0).height() !== $rows.eq(1).height()) { component.updateDimensions() } }) } }) } }, _isDetailRow: function(row) { return row && row.rowType && 0 === row.rowType.indexOf("detail") }, _createRow: function(row) { var $row = this.callBase(row); if (row && this._isDetailRow(row)) { this.option("showRowLines") && $row.addClass(ROW_LINES_CLASS); $row.addClass(MASTER_DETAIL_ROW_CLASS); if (commonUtils.isDefined(row.visible)) { $row.toggle(row.visible) } } return $row }, _getGroupCellOptions: function(options) { var row = options.row, groupColumns = this._columnsController.getGroupColumns(), columnIndex = groupColumns.length + options.columnsCountBeforeGroups, emptyCellsCount = columnIndex + Number(this.option("masterDetail.enabled")); if (row && this._isDetailRow(row)) { return { columnIndex: columnIndex, emptyCellsCount: emptyCellsCount, colspan: options.columns.length - emptyCellsCount } } return this.callBase(options) }, _renderCells: function($row, options) { var $detailCell, groupCellOptions, i, row = options.row; if (row.rowType && this._isDetailRow(row)) { groupCellOptions = this._getGroupCellOptions(options); for (i = 0; i < groupCellOptions.emptyCellsCount; i++) { this._renderCell($row, { value: null, row: row, rowIndex: row.rowIndex, column: options.columns[i] }) } $detailCell = this._renderCell($row, { value: null, row: row, rowIndex: row.rowIndex, column: { command: "detail" }, columnIndex: groupCellOptions.columnIndex }); $detailCell.addClass(CELL_FOCUS_DISABLED_CLASS).addClass(MASTER_DETAIL_CELL_CLASS).attr("colspan", groupCellOptions.colspan) } else { this.callBase.apply(this, arguments) } } } }() } } } }, /*!*************************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.editing.js ***! \*************************************************/ function(module, exports, __webpack_require__) { __webpack_require__( /*! ./ui.data_grid.editor_factory */ 388); var gridCore = __webpack_require__( /*! ./ui.data_grid.core */ 348), editingModule = __webpack_require__( /*! ../grid_core/ui.grid_core.editing */ 390); gridCore.registerModule("editing", editingModule) }, /*!********************************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.editor_factory.js ***! \********************************************************/ function(module, exports, __webpack_require__) { var gridCore = __webpack_require__( /*! ./ui.data_grid.core */ 348), editorFactoryModule = __webpack_require__( /*! ../grid_core/ui.grid_core.editor_factory */ 389); gridCore.registerModule("editorFactory", editorFactoryModule) }, /*!********************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.editor_factory.js ***! \********************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), isWrapped = __webpack_require__( /*! ../../core/utils/variable_wrapper */ 28).isWrapped, compileGetter = __webpack_require__( /*! ../../core/utils/data */ 50).compileGetter, modules = __webpack_require__( /*! ./ui.grid_core.modules */ 350), browser = __webpack_require__( /*! ../../core/utils/browser */ 23), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, devices = __webpack_require__( /*! ../../core/devices */ 53), positionUtils = __webpack_require__( /*! ../../animation/position */ 70), eventUtils = __webpack_require__( /*! ../../events/utils */ 71), clickEvent = __webpack_require__( /*! ../../events/click */ 75), pointerEvents = __webpack_require__( /*! ../../events/pointer */ 76), normalizeDataSourceOptions = __webpack_require__( /*! ../../data/data_source/data_source */ 153).normalizeDataSourceOptions, compareVersion = __webpack_require__( /*! ../../core/utils/version */ 17).compare, addNamespace = eventUtils.addNamespace; __webpack_require__( /*! ../text_box */ 211); __webpack_require__( /*! ../number_box */ 263); __webpack_require__( /*! ../check_box */ 248); __webpack_require__( /*! ../select_box */ 317); __webpack_require__( /*! ../date_box */ 267); var CHECKBOX_SIZE_CLASS = "checkbox-size", FOCUS_OVERLAY_CLASS = "focus-overlay", CONTENT_CLASS = "content", CELL_FOCUS_DISABLED_CLASS = "dx-cell-focus-disabled", EDITOR_INLINE_BLOCK = "dx-editor-inline-block", MODULE_NAMESPACE = "dxDataGridEditorFactory", UPDATE_FOCUS_EVENTS = addNamespace([pointerEvents.down, "focusin", clickEvent.name].join(" "), MODULE_NAMESPACE), FOCUSED_ELEMENT_CLASS = "dx-focused", POINTER_EVENTS_TARGET_CLASS = "dx-pointer-events-target", POINTER_EVENTS_NONE_CLASS = "dx-pointer-events-none", EDITORS_INPUT_SELECTOR = "input:not([type='hidden'])", FOCUSED_ELEMENT_SELECTOR = "td[tabindex]:focus, input:focus, textarea:focus, .dx-lookup-field:focus", DX_HIDDEN = "dx-hidden", TAB_KEY = 9; var EditorFactoryController = modules.ViewController.inherit(function() { var getResultConfig = function(config, options) { return extend(config, { readOnly: options.readOnly, placeholder: options.placeholder, inputAttr: { id: options.id }, tabIndex: options.tabIndex }, options.editorOptions) }; var checkEnterBug = function() { return browser.msie && parseInt(browser.version) <= 11 || devices.real().ios }; var getTextEditorConfig = function(options) { var isValueChanged = false, data = {}, isEnterBug = checkEnterBug(), sharedData = options.sharedData || data; return getResultConfig({ placeholder: options.placeholder, width: options.width, value: options.value, onValueChanged: function(e) { var updateValue = function(e, notFireEvent) { isValueChanged = false; options && options.setValue(e.value, notFireEvent) }; window.clearTimeout(data.valueChangeTimeout); if (e.jQueryEvent && "keyup" === e.jQueryEvent.type && !options.updateValueImmediately) { if ("filterRow" === options.parentType || "searchPanel" === options.parentType) { sharedData.valueChangeTimeout = data.valueChangeTimeout = window.setTimeout(function() { updateValue(e, data.valueChangeTimeout !== sharedData.valueChangeTimeout) }, commonUtils.isDefined(options.updateValueTimeout) ? options.updateValueTimeout : 0) } else { isValueChanged = true } } else { updateValue(e) } }, onFocusOut: function(e) { if (isEnterBug && isValueChanged) { isValueChanged = false; options.setValue(e.component.option("value")) } }, onKeyDown: function(e) { if (isEnterBug && isValueChanged && 13 === e.jQueryEvent.keyCode) { isValueChanged = false; options.setValue(e.component.option("value")) } }, valueChangeEvent: "change" + ("filterRow" === options.parentType || isEnterBug ? " keyup" : "") }, options) }; var prepareDateBox = function(options) { options.editorName = "dxDateBox"; options.editorOptions = getResultConfig({ value: options.value, onValueChanged: function(args) { options.setValue(args.value) }, onKeyDown: function(e) { if (checkEnterBug() && 13 === e.jQueryEvent.keyCode) { e.component.blur(); e.component.focus() } }, displayFormat: options.format, formatWidthCalculator: null, width: "auto" }, options) }; var prepareTextBox = function(options) { var config = getTextEditorConfig(options), isSearching = "searchPanel" === options.parentType, toString = function(value) { return commonUtils.isDefined(value) ? value.toString() : "" }; config.value = toString(options.value); config.valueChangeEvent += isSearching ? " keyup search" : ""; config.mode = isSearching ? "search" : "text"; options.editorName = "dxTextBox"; options.editorOptions = config }; var prepareNumberBox = function(options) { var config = getTextEditorConfig(options); config.value = commonUtils.isDefined(options.value) ? options.value : null; options.editorName = "dxNumberBox"; options.editorOptions = config }; var prepareBooleanEditor = function(options) { if ("filterRow" === options.parentType) { prepareSelectBox(extend(options, { lookup: { displayExpr: function(data) { if (true === data) { return options.trueText || "true" } else { if (false === data) { return options.falseText || "false" } } }, dataSource: [true, false] } })) } else { prepareCheckBox(options) } }; var prepareSelectBox = function(options) { var displayGetter, dataSource, postProcess, lookup = options.lookup, isFilterRow = "filterRow" === options.parentType; if (lookup) { displayGetter = compileGetter(lookup.displayExpr); dataSource = lookup.dataSource; if (commonUtils.isFunction(dataSource) && !isWrapped(dataSource)) { dataSource = dataSource(options.row || {}) } if (commonUtils.isObject(dataSource) || Array.isArray(dataSource)) { dataSource = normalizeDataSourceOptions(dataSource); if (isFilterRow) { postProcess = dataSource.postProcess; dataSource.postProcess = function(items) { if (0 === this.pageIndex()) { items = items.slice(0); items.unshift(null) } if (postProcess) { return postProcess.call(this, items) } return items } } } var allowClearing = Boolean(lookup.allowClearing && !isFilterRow); options.editorName = "dxSelectBox"; options.editorOptions = getResultConfig({ searchEnabled: true, value: options.value, valueExpr: options.lookup.valueExpr, searchExpr: options.lookup.searchExpr || options.lookup.displayExpr, allowClearing: allowClearing, showClearButton: allowClearing, displayExpr: function(data) { if (null === data) { return options.showAllText } return displayGetter(data) }, dataSource: dataSource, onValueChanged: function(e) { var params = [e.value]; !isFilterRow && params.push(e.component.option("text")); options.setValue.apply(this, params) } }, options) } }; var prepareCheckBox = function(options) { options.editorName = "dxCheckBox"; options.editorOptions = getResultConfig({ value: commonUtils.isDefined(options.value) ? options.value : void 0, hoverStateEnabled: !options.readOnly, focusStateEnabled: !options.readOnly, activeStateEnabled: false, onValueChanged: function(e) { options.setValue && options.setValue(e.value, e) } }, options) }; var createEditorCore = function(that, options) { if (options.editorName && options.editorOptions && options.editorElement[options.editorName]) { if ("dxCheckBox" === options.editorName) { if (!options.isOnForm) { options.editorElement.addClass(that.addWidgetPrefix(CHECKBOX_SIZE_CLASS)); options.editorElement.parent().addClass(EDITOR_INLINE_BLOCK) } if (options.command || options.editorOptions.readOnly) { options.editorElement.parent().addClass(CELL_FOCUS_DISABLED_CLASS) } } that._createComponent(options.editorElement, options.editorName, options.editorOptions); if ("dxTextBox" === options.editorName) { options.editorElement.dxTextBox("instance").registerKeyHandler("enter", commonUtils.noop) } } }; return { _getFocusedElement: function($dataGridElement) { return $dataGridElement.find(FOCUSED_ELEMENT_SELECTOR) }, _getFocusCellSelector: function() { return ".dx-row > td" }, _updateFocusCore: function() { var $focusCell, hideBorders, $focus = this._$focusedElement, $dataGridElement = this.component && this.component.element(); if ($dataGridElement) { $focus = this._getFocusedElement($dataGridElement); if ($focus.length) { if (!$focus.hasClass(CELL_FOCUS_DISABLED_CLASS)) { $focusCell = $focus.closest(this._getFocusCellSelector() + ", ." + CELL_FOCUS_DISABLED_CLASS); hideBorders = $focusCell.get(0) !== $focus.get(0) && $focusCell.hasClass(EDITOR_INLINE_BLOCK); $focus = $focusCell } if ($focus.length && !$focus.hasClass(CELL_FOCUS_DISABLED_CLASS)) { this.focus($focus, hideBorders); return } } } this.loseFocus() }, _updateFocus: function(e) { var that = this, isFocusOverlay = e && e.jQueryEvent && $(e.jQueryEvent.target).hasClass(that.addWidgetPrefix(FOCUS_OVERLAY_CLASS)); that._isFocusOverlay = that._isFocusOverlay || isFocusOverlay; clearTimeout(that._updateFocusTimeoutID); that._updateFocusTimeoutID = setTimeout(function() { delete that._updateFocusTimeoutID; if (!that._isFocusOverlay) { that._updateFocusCore() } that._isFocusOverlay = false }) }, _updateFocusOverlaySize: function($element, position) { var location = positionUtils.calculate($element, extend({ collision: "fit" }, position)); if (location.h.oversize > 0) { $element.outerWidth($element.outerWidth() - location.h.oversize) } if (location.v.oversize > 0) { $element.outerHeight($element.outerHeight() - location.v.oversize) } }, callbackNames: function() { return ["focused"] }, focus: function($element, hideBorder) { var that = this; if (void 0 === $element) { return that._$focusedElement } else { if ($element) { that._focusTimeoutID = setTimeout(function() { delete that._focusTimeoutID; var focusOverlayPosition, $focusOverlay = that._$focusOverlay = that._$focusOverlay || $("<div>").addClass(that.addWidgetPrefix(FOCUS_OVERLAY_CLASS) + " " + POINTER_EVENTS_TARGET_CLASS); if (hideBorder) { that._$focusOverlay && that._$focusOverlay.addClass(DX_HIDDEN) } else { var align = browser.msie ? "left bottom" : browser.mozilla ? "right bottom" : "left top", $content = $element.closest("." + that.addWidgetPrefix(CONTENT_CLASS)); $focusOverlay.removeClass(DX_HIDDEN).appendTo($content).outerWidth($element.outerWidth() + 1).outerHeight($element.outerHeight() + 1); focusOverlayPosition = { precise: compareVersion($.fn.jquery, [3]) >= 0, my: align, at: align, of: $element, boundary: $content.length && $content }; that._updateFocusOverlaySize($focusOverlay, focusOverlayPosition); positionUtils.setup($focusOverlay, focusOverlayPosition); $focusOverlay.css("visibility", "visible") } that._$focusedElement && that._$focusedElement.removeClass(FOCUSED_ELEMENT_CLASS); $element.addClass(FOCUSED_ELEMENT_CLASS); that._$focusedElement = $element; that.focused.fire($element) }) } } }, resize: function() { var $focusedElement = this._$focusedElement; if ($focusedElement) { this.focus($focusedElement) } }, loseFocus: function() { this._$focusedElement && this._$focusedElement.removeClass(FOCUSED_ELEMENT_CLASS); this._$focusedElement = null; this._$focusOverlay && this._$focusOverlay.addClass(DX_HIDDEN) }, init: function() { this.createAction("onEditorPreparing", { excludeValidators: ["designMode", "disabled", "readOnly"], category: "rendering" }); this.createAction("onEditorPrepared", { excludeValidators: ["designMode", "disabled", "readOnly"], category: "rendering" }); this._updateFocusHandler = this._updateFocusHandler || this.createAction(this._updateFocus.bind(this)); $(document).on(UPDATE_FOCUS_EVENTS, this._updateFocusHandler); this._attachContainerEventHandlers() }, _attachContainerEventHandlers: function() { var that = this, $container = that.component && that.component.element(), isIE10OrLower = browser.msie && parseInt(browser.version) < 11; if ($container) { $container.on(addNamespace("keydown", MODULE_NAMESPACE), function(e) { if (e.which === TAB_KEY) { that._updateFocusHandler(e) } }); isIE10OrLower && $container.on([pointerEvents.down, pointerEvents.move, pointerEvents.up, clickEvent.name].join(" "), "." + POINTER_EVENTS_TARGET_CLASS, that._focusOverlayEventProxy.bind(that)) } }, _focusOverlayEventProxy: function(e) { var element, $target = $(e.target), $currentTarget = $(e.currentTarget), needProxy = $target.hasClass(POINTER_EVENTS_TARGET_CLASS) || $target.hasClass(POINTER_EVENTS_NONE_CLASS), $focusedElement = this._$focusedElement; if (!needProxy || $currentTarget.hasClass(DX_HIDDEN)) { return } $currentTarget.addClass(DX_HIDDEN); element = $target.get(0).ownerDocument.elementFromPoint(e.clientX, e.clientY); eventUtils.fireEvent({ originalEvent: e, target: element }); e.stopPropagation(); $currentTarget.removeClass(DX_HIDDEN); $focusedElement && $focusedElement.find(EDITORS_INPUT_SELECTOR).focus() }, dispose: function() { clearTimeout(this._focusTimeoutID); clearTimeout(this._updateFocusTimeoutID); $(document).off(UPDATE_FOCUS_EVENTS, this._updateFocusHandler) }, createEditor: function($container, options) { options.cancel = false; options.editorElement = $container; if (!commonUtils.isDefined(options.tabIndex)) { options.tabIndex = this.option("tabIndex") } if (options.lookup) { prepareSelectBox(options) } else { switch (options.dataType) { case "date": prepareDateBox(options); break; case "boolean": prepareBooleanEditor(options); break; case "number": prepareNumberBox(options); break; default: prepareTextBox(options) } } this.executeAction("onEditorPreparing", options); if (options.cancel) { return } createEditorCore(this, options); this.executeAction("onEditorPrepared", options) } } }()); module.exports = { defaultOptions: function() { return {} }, controllers: { editorFactory: EditorFactoryController }, extenders: { controllers: { columnsResizer: { _startResizing: function(args) { this.callBase(args); if (this.isResizing()) { this.getController("editorFactory").loseFocus() } } } } } } }, /*!*************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.editing.js ***! \*************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Guid = __webpack_require__( /*! ../../core/guid */ 151), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), typeUtils = __webpack_require__( /*! ../../core/utils/type */ 12), deepExtendArraySafe = __webpack_require__( /*! ../../core/utils/object */ 27).deepExtendArraySafe, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, modules = __webpack_require__( /*! ./ui.grid_core.modules */ 350), clickEvent = __webpack_require__( /*! ../../events/click */ 75), gridCoreUtils = __webpack_require__( /*! ./ui.grid_core.utils */ 349), getIndexByKey = gridCoreUtils.getIndexByKey, eventUtils = __webpack_require__( /*! ../../events/utils */ 71), addNamespace = eventUtils.addNamespace, dialog = __webpack_require__( /*! ../dialog */ 199), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), Button = __webpack_require__( /*! ../button */ 201), Popup = __webpack_require__( /*! ../popup */ 200), errors = __webpack_require__( /*! ../widget/ui.errors */ 22), devices = __webpack_require__( /*! ../../core/devices */ 53), Form = __webpack_require__( /*! ../form */ 285), holdEvent = __webpack_require__( /*! ../../events/hold */ 164), when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when; var EDIT_FORM_CLASS = "edit-form", EDIT_FORM_ITEM_CLASS = "edit-form-item", FOCUS_OVERLAY_CLASS = "focus-overlay", READONLY_CLASS = "readonly", EDIT_POPUP_CLASS = "edit-popup", FORM_BUTTONS_CONTAINER_CLASS = "form-buttons-container", ADD_ROW_BUTTON_CLASS = "addrow-button", LINK_CLASS = "dx-link", EDITOR_CELL_CLASS = "dx-editor-cell", ROW_SELECTED = "dx-selection", EDIT_ROW = "dx-edit-row", EDIT_BUTTON_CLASS = "dx-edit-button", BUTTON_CLASS = "dx-button", INSERT_INDEX = "__DX_INSERT_INDEX__", ROW_CLASS = "dx-row", ROW_REMOVED = "dx-row-removed", ROW_INSERTED = "dx-row-inserted", ROW_MODIFIED = "dx-row-modified", CELL_MODIFIED = "dx-cell-modified", CELL_HIGHLIGHT_OUTLINE = "dx-highlight-outline", EDITING_NAMESPACE = "dxDataGridEditing", DATA_ROW_CLASS = "dx-data-row", CELL_FOCUS_DISABLED_CLASS = "dx-cell-focus-disabled", EDITORS_INPUT_SELECTOR = "input:not([type='hidden'])", FOCUSABLE_ELEMENT_SELECTOR = "[tabindex], " + EDITORS_INPUT_SELECTOR, EDIT_MODE_BATCH = "batch", EDIT_MODE_ROW = "row", EDIT_MODE_CELL = "cell", EDIT_MODE_FORM = "form", EDIT_MODE_POPUP = "popup", DATA_EDIT_DATA_INSERT_TYPE = "insert", DATA_EDIT_DATA_UPDATE_TYPE = "update", DATA_EDIT_DATA_REMOVE_TYPE = "remove", POINTER_EVENTS_NONE_CLASS = "dx-pointer-events-none", POINTER_EVENTS_TARGET_CLASS = "dx-pointer-events-target", EDIT_MODES = [EDIT_MODE_BATCH, EDIT_MODE_ROW, EDIT_MODE_CELL, EDIT_MODE_FORM, EDIT_MODE_POPUP], ROW_BASED_MODES = [EDIT_MODE_ROW, EDIT_MODE_FORM, EDIT_MODE_POPUP], CELL_BASED_MODES = [EDIT_MODE_BATCH, EDIT_MODE_CELL], MODES_WITH_DELAYED_FOCUS = [EDIT_MODE_ROW, EDIT_MODE_FORM]; var getEditMode = function(that) { var editMode = that.option("editing.mode"); if (EDIT_MODES.indexOf(editMode) !== -1) { return editMode } return EDIT_MODE_ROW }; var isRowEditMode = function(that) { var editMode = getEditMode(that); return ROW_BASED_MODES.indexOf(editMode) !== -1 }; var EditingController = modules.ViewController.inherit(function() { var getDefaultEditorTemplate = function(that) { return function(container, options) { var $editor = $("<div/>").appendTo(container); that.getController("editorFactory").createEditor($editor, extend({}, options.column, { value: options.value, setValue: options.setValue, row: options.row, parentType: "dataRow", width: null, readOnly: !options.setValue, isOnForm: options.isOnForm, id: options.id, updateValueImmediately: isRowEditMode(that) })) } }; return { init: function() { var that = this; that._editRowIndex = -1; that._editData = []; that._editColumnIndex = -1; that._columnsController = that.getController("columns"); that._dataController = that.getController("data"); that._rowsView = that.getView("rowsView"); if (!that._dataChangedHandler) { that._dataChangedHandler = that._handleDataChanged.bind(that); that._dataController.changed.add(that._dataChangedHandler) } if (!that._saveEditorHandler) { that.createAction("onInitNewRow", { excludeValidators: ["disabled", "readOnly"] }); that.createAction("onRowInserting", { excludeValidators: ["disabled", "readOnly"] }); that.createAction("onRowInserted", { excludeValidators: ["disabled", "readOnly"] }); that.createAction("onEditingStart", { excludeValidators: ["disabled", "readOnly"] }); that.createAction("onRowUpdating", { excludeValidators: ["disabled", "readOnly"] }); that.createAction("onRowUpdated", { excludeValidators: ["disabled", "readOnly"] }); that.createAction("onRowRemoving", { excludeValidators: ["disabled", "readOnly"] }); that.createAction("onRowRemoved", { excludeValidators: ["disabled", "readOnly"] }); that._saveEditorHandler = that.createAction(function(e) { var isEditorPopup, isDomElement, isFocusOverlay, isAddRowButton, isCellEditMode, $target, event = e.jQueryEvent; if (!isRowEditMode(that) && !that._editCellInProgress) { $target = $(event.target); isEditorPopup = $target.closest(".dx-dropdowneditor-overlay").length; isDomElement = $target.closest(document).length; isAddRowButton = $target.closest("." + that.addWidgetPrefix(ADD_ROW_BUTTON_CLASS)).length; isFocusOverlay = $target.hasClass(that.addWidgetPrefix(FOCUS_OVERLAY_CLASS)); isCellEditMode = getEditMode(that) === EDIT_MODE_CELL; if (!isEditorPopup && !isFocusOverlay && !(isAddRowButton && isCellEditMode && that.isEditing()) && isDomElement) { that._closeEditItem.bind(that)($target) } } }); $(document).on(clickEvent.name, that._saveEditorHandler) } that._updateEditColumn(); that._updateEditButtons() }, _closeEditItem: function($targetElement) { var isDataRow = $targetElement.closest("." + DATA_ROW_CLASS).length, $targetCell = $targetElement.closest("." + ROW_CLASS + "> td"), columnIndex = $targetCell[0] && $targetCell[0].cellIndex, rowIndex = this.getView("rowsView").getRowIndex($targetCell.parent()), visibleColumns = this._columnsController.getVisibleColumns(), allowEditing = visibleColumns[columnIndex] && visibleColumns[columnIndex].allowEditing; if (this.isEditing() && (!isDataRow || isDataRow && !allowEditing && !this.isEditCell(rowIndex, columnIndex))) { this.closeEditCell() } }, _handleDataChanged: function(args) { if ("standard" === this.option("scrolling.mode")) { this.resetRowAndPageIndices() } if ("prepend" === args.changeType) { $.each(this._editData, function(_, editData) { editData.rowIndex += args.items.length; if (editData.type === DATA_EDIT_DATA_INSERT_TYPE) { editData.key.rowIndex += args.items.length; editData.key.dataRowIndex += args.items.filter(function(item) { return "data" === item.rowType }).length } }) } }, isRowEditMode: function() { return isRowEditMode(this) }, getEditMode: function() { return getEditMode(this) }, getFirstEditableColumnIndex: function() { var columnIndex, columnsController = this.getController("columns"); if (getEditMode(this) === EDIT_MODE_FORM && this._firstFormItem) { columnIndex = this._firstFormItem.column.index } else { var visibleColumns = columnsController.getVisibleColumns(); $.each(visibleColumns, function(index, column) { if (column.allowEditing) { columnIndex = index; return false } }) } return columnIndex }, getFirstEditableCellInRow: function(rowIndex) { return this.getView("rowsView").getCellElement(rowIndex ? rowIndex : 0, this.getFirstEditableColumnIndex()) }, getFocusedCellInRow: function(rowIndex) { return this.getFirstEditableCellInRow(rowIndex) }, getIndexByKey: function(key, items) { return getIndexByKey(key, items) }, hasChanges: function() { var that = this, result = false; for (var i = 0; i < that._editData.length; i++) { if (that._editData[i].type) { result = true; break } } return result }, dispose: function() { this.callBase(); clearTimeout(this._inputFocusTimeoutID); $(document).off(clickEvent.name, this._saveEditorHandler) }, optionChanged: function(args) { if ("editing" === args.name) { this.init(); args.handled = true } else { this.callBase(args) } }, publicMethods: function() { return ["insertRow", "addRow", "removeRow", "deleteRow", "undeleteRow", "editRow", "editCell", "closeEditCell", "saveEditData", "cancelEditData", "hasEditData"] }, refresh: function() { if (getEditMode(this) === EDIT_MODE_CELL) { return } if (getEditMode(this) !== EDIT_MODE_BATCH) { this.init() } else { this._editRowIndex = -1; this._editColumnIndex = -1 } }, isEditing: function() { return this._editRowIndex > -1 }, isEditRow: function(rowIndex) { var editMode = getEditMode(this); return this._getVisibleEditRowIndex() === rowIndex && ROW_BASED_MODES.indexOf(editMode) !== -1 }, getEditRowKey: function() { var items = this._dataController.items(), item = items[this._getVisibleEditRowIndex()]; return item && item.key }, getEditFormRowIndex: function() { var editMode = getEditMode(this); return editMode === EDIT_MODE_FORM || editMode === EDIT_MODE_POPUP ? this._getVisibleEditRowIndex() : -1 }, isEditCell: function(rowIndex, columnIndex) { return this._getVisibleEditRowIndex() === rowIndex && this._editColumnIndex === columnIndex }, getPopupContent: function() { var editMode = getEditMode(this), popupVisible = this._editPopup && this._editPopup.option("visible"); if (editMode === EDIT_MODE_POPUP && popupVisible) { return this._editPopup.content() } }, getEditForm: function() { return this._editForm }, _needInsertItem: function(editData, changeType) { var that = this, dataSource = that._dataController.dataSource(), scrollingMode = that.option("scrolling.mode"), pageIndex = dataSource.pageIndex(), beginPageIndex = dataSource.beginPageIndex ? dataSource.beginPageIndex() : pageIndex, endPageIndex = dataSource.endPageIndex ? dataSource.endPageIndex() : pageIndex; if ("standard" !== scrollingMode) { switch (changeType) { case "append": return editData.key.pageIndex === endPageIndex; case "prepend": return editData.key.pageIndex === beginPageIndex; case "refresh": editData.key.rowIndex = 0; editData.key.dataRowIndex = 0; editData.key.pageIndex = 0; break; default: return editData.key.pageIndex >= beginPageIndex && editData.key.pageIndex <= endPageIndex } } return editData.key.pageIndex === pageIndex }, _generateNewItem: function(key) { var item = { key: key }; if (key && key[INSERT_INDEX]) { item[INSERT_INDEX] = key[INSERT_INDEX] } return item }, processItems: function(items, changeType) { var i, key, item, that = this, editData = that._editData; that.update(changeType); for (i = 0; i < editData.length; i++) { key = editData[i].key; item = that._generateNewItem(key); if (editData[i].type === DATA_EDIT_DATA_INSERT_TYPE && that._needInsertItem(editData[i], changeType, items, item)) { items.splice(key.dataRowIndex, 0, item) } } return items }, processDataItem: function(item, options, generateDataValues) { var data, editMode, editData, editIndex, that = this, columns = options.visibleColumns, key = item.data[INSERT_INDEX] ? item.data.key : item.key; editIndex = getIndexByKey(key, that._editData); if (editIndex >= 0) { editMode = getEditMode(that); editData = that._editData[editIndex]; data = editData.data; item.isEditing = options.rowIndex === that._getVisibleEditRowIndex(); switch (editData.type) { case DATA_EDIT_DATA_INSERT_TYPE: if (editMode === EDIT_MODE_POPUP) { item.visible = false } item.inserted = true; item.key = key; item.data = data; break; case DATA_EDIT_DATA_UPDATE_TYPE: item.modified = true; item.oldData = item.data; item.data = deepExtendArraySafe(deepExtendArraySafe({}, item.data), data); item.modifiedValues = generateDataValues(data, columns); break; case DATA_EDIT_DATA_REMOVE_TYPE: if (editMode === EDIT_MODE_BATCH) { item.data = deepExtendArraySafe(deepExtendArraySafe({}, item.data), data) } item.removed = true } } }, insertRow: function() { errors.log("W0002", "dxDataGrid", "insertRow", "15.2", "Use the 'addRow' method instead"); return this.addRow() }, _initNewRow: function(options, insertKey) { this.executeAction("onInitNewRow", options); var rows = this._dataController.items(), row = rows[insertKey.rowIndex]; if (row && (!row.isEditing && "detail" === row.rowType || "detailAdaptive" === row.rowType)) { insertKey.rowIndex++ } insertKey.dataRowIndex = rows.filter(function(row, index) { return index < insertKey.rowIndex && "data" === row.rowType }).length }, _getInsertIndex: function() { return this._editData.filter(function(editItem) { return editItem.type === DATA_EDIT_DATA_INSERT_TYPE }).length + 1 }, addRow: function(parentKey) { var $firstCell, that = this, dataController = that._dataController, store = dataController.store(), key = store && store.key(), rowsView = that.getView("rowsView"), param = { data: {} }, parentRowIndex = dataController.getRowIndexByKey(parentKey), insertKey = { pageIndex: dataController.pageIndex(), rowIndex: parentRowIndex >= 0 ? parentRowIndex + 1 : rowsView ? rowsView.getTopVisibleItemIndex() : 0, parentKey: parentKey }, oldEditRowIndex = that._getVisibleEditRowIndex(), editMode = getEditMode(that); if (editMode === EDIT_MODE_CELL && that.hasChanges()) { that.saveEditData() } that.refresh(); var insertIndex = that._getInsertIndex(); if (editMode !== EDIT_MODE_BATCH && insertIndex > 1) { return } if (!key) { param.data.__KEY__ = String(new Guid) } that._initNewRow(param, insertKey); if (editMode !== EDIT_MODE_BATCH) { that._editRowIndex = insertKey.rowIndex + that._dataController.getRowIndexOffset() } insertKey[INSERT_INDEX] = insertIndex; that._addEditData({ key: insertKey, data: param.data, type: DATA_EDIT_DATA_INSERT_TYPE }); dataController.updateItems({ changeType: "update", rowIndices: [oldEditRowIndex, insertKey.rowIndex] }); if (editMode === EDIT_MODE_POPUP) { that._showEditPopup(insertKey.rowIndex) } else { $firstCell = that.getFirstEditableCellInRow(insertKey.rowIndex); that._editCellInProgress = true; that._delayedInputFocus($firstCell, function() { that._editCellInProgress = false; var $cell = that.getFirstEditableCellInRow(insertKey.rowIndex); $cell && $cell.trigger(clickEvent.name) }) } that._afterInsertRow({ key: insertKey, data: param.data }) }, _isEditingStart: function(options) { this.executeAction("onEditingStart", options); return options.cancel }, _beforeEditCell: function(rowIndex, columnIndex, item) { if (getEditMode(this) === EDIT_MODE_CELL && !item.inserted && this.hasChanges()) { this.saveEditData(); if (this.hasChanges()) { return true } } }, _beforeUpdateItems: function() {}, _getVisibleEditRowIndex: function() { return this._editRowIndex >= 0 ? this._editRowIndex - this._dataController.getRowIndexOffset() : -1 }, editRow: function(rowIndex) { var $editingCell, that = this, dataController = that._dataController, items = dataController.items(), item = items[rowIndex], params = { data: item.data, cancel: false }, oldEditRowIndex = that._getVisibleEditRowIndex(); if (rowIndex === oldEditRowIndex) { return true } if (!item.inserted) { params.key = item.key } if (that._isEditingStart(params)) { return } that.init(); that._pageIndex = dataController.pageIndex(); that._editRowIndex = (items[0].inserted ? rowIndex - 1 : rowIndex) + that._dataController.getRowIndexOffset(); that._addEditData({ data: {}, key: item.key, oldData: item.data }); var rowIndices = [oldEditRowIndex, rowIndex], editMode = getEditMode(that); that._beforeUpdateItems(rowIndices, rowIndex, oldEditRowIndex); if (editMode === EDIT_MODE_POPUP) { that._showEditPopup(rowIndex) } else { dataController.updateItems({ changeType: "update", rowIndices: rowIndices }) } if (MODES_WITH_DELAYED_FOCUS.indexOf(editMode) !== -1) { $editingCell = that.getFocusedCellInRow(that._getVisibleEditRowIndex()); that._delayedInputFocus($editingCell, function() { $editingCell && that.component.focus($editingCell) }) } }, _showEditPopup: function(rowIndex) { var that = this, isMobileDevice = "desktop" !== devices.current().deviceType, popupOptions = extend({ showTitle: false, fullScreen: isMobileDevice, toolbarItems: [{ toolbar: "bottom", location: "after", widget: "dxButton", options: that._getSaveButtonConfig() }, { toolbar: "bottom", location: "after", widget: "dxButton", options: that._getCancelButtonConfig() }], contentTemplate: that._getPopupEditFormTemplate(rowIndex) }, that.option("editing.popup")); if (!that._editPopup) { var $popupContainer = $("<div>").appendTo(that.component.element()).addClass(that.addWidgetPrefix(EDIT_POPUP_CLASS)); that._editPopup = that._createComponent($popupContainer, Popup, {}); that._editPopup.on("hidden", that._getEditPopupHiddenHandler()); that._editPopup.on("shown", function(e) { e.component.content().find(FOCUSABLE_ELEMENT_SELECTOR).first().focus() }) } that._editPopup.option(popupOptions); that._editPopup.show() }, _getEditPopupHiddenHandler: function() { var that = this; return function(e) { if (that.isEditing()) { that.cancelEditData() } } }, _getPopupEditFormTemplate: function(rowIndex) { var that = this, rowData = that.component.getVisibleRows()[rowIndex], templateOptions = { row: rowData, rowType: rowData.rowType, key: rowData.key }; return function($container) { var formTemplate = that.getEditFormTemplate(); formTemplate($container, templateOptions, true) } }, _getSaveButtonConfig: function() { return { text: this.option("editing.texts.saveRowChanges"), onClick: this.saveEditData.bind(this) } }, _getCancelButtonConfig: function() { return { text: this.option("editing.texts.cancelRowChanges"), onClick: this.cancelEditData.bind(this) } }, editCell: function(rowIndex, columnIndex) { var $cell, showEditorAlways, that = this, columnsController = that._columnsController, dataController = that._dataController, items = dataController.items(), item = items[rowIndex], params = { data: item && item.data, cancel: false }, oldEditRowIndex = that._getVisibleEditRowIndex(), oldEditColumnIndex = that._editColumnIndex, columns = columnsController.getVisibleColumns(), rowsView = that.getView("rowsView"); if (commonUtils.isString(columnIndex)) { columnIndex = columnsController.columnOption(columnIndex, "index"); columnIndex = columnsController.getVisibleIndex(columnIndex) } params.column = columnsController.getVisibleColumns()[columnIndex]; showEditorAlways = params.column && params.column.showEditorAlways; if (params.column && item && ("data" === item.rowType || "detailAdaptive" === item.rowType) && !item.removed && !isRowEditMode(that)) { if (this.isEditCell(rowIndex, columnIndex)) { return true } var editRowIndex = rowIndex + that._dataController.getRowIndexOffset(); if (that._beforeEditCell(rowIndex, columnIndex, item)) { return true } if (!item.inserted) { params.key = item.key } if (that._isEditingStart(params)) { return true } that._editRowIndex = editRowIndex; that._editColumnIndex = columnIndex; that._pageIndex = dataController.pageIndex(); that._addEditData({ data: {}, key: item.key, oldData: item.data }); if (!showEditorAlways || columns[oldEditColumnIndex] && !columns[oldEditColumnIndex].showEditorAlways) { that._editCellInProgress = true; that.getController("editorFactory").loseFocus(); dataController.updateItems({ changeType: "update", rowIndices: [oldEditRowIndex, that._getVisibleEditRowIndex()] }) } $cell = rowsView && rowsView.getCellElement(that._getVisibleEditRowIndex(), that._editColumnIndex); if ($cell && !$cell.find(":focus").length) { that._focusEditingCell(function() { that._editCellInProgress = false }, $cell, true) } else { that._editCellInProgress = false } return true } return false }, _delayedInputFocus: function($cell, beforeFocusCallback, callBeforeFocusCallbackAlways) { var that = this; function inputFocus() { if (beforeFocusCallback) { beforeFocusCallback() } $cell && $cell.find(FOCUSABLE_ELEMENT_SELECTOR).first().focus(); that._beforeFocusCallback = null } if (devices.real().ios || devices.real().android) { inputFocus() } else { if (that._beforeFocusCallback) { that._beforeFocusCallback() } clearTimeout(that._inputFocusTimeoutID); if (callBeforeFocusCallbackAlways) { that._beforeFocusCallback = beforeFocusCallback } that._inputFocusTimeoutID = setTimeout(inputFocus) } }, _focusEditingCell: function(beforeFocusCallback, $editCell, callBeforeFocusCallbackAlways) { var that = this, rowsView = that.getView("rowsView"); $editCell = $editCell || rowsView && rowsView.getCellElement(that._getVisibleEditRowIndex(), that._editColumnIndex); that._delayedInputFocus($editCell, beforeFocusCallback, callBeforeFocusCallbackAlways) }, removeRow: function(rowIndex) { errors.log("W0002", "dxDataGrid", "removeRow", "15.2", "Use the 'deleteRow' method instead"); return this.deleteRow(rowIndex) }, deleteRow: function(rowIndex) { var removeByKey, showDialogTitle, that = this, editingOptions = that.option("editing"), editingTexts = editingOptions && editingOptions.texts, confirmDeleteTitle = editingTexts && editingTexts.confirmDeleteTitle, isBatchMode = editingOptions && editingOptions.mode === EDIT_MODE_BATCH, confirmDeleteMessage = editingTexts && editingTexts.confirmDeleteMessage, dataController = that._dataController, oldEditRowIndex = that._getVisibleEditRowIndex(), item = dataController.items()[rowIndex], key = item && item.key; if (item) { removeByKey = function(key) { that.refresh(); var editIndex = getIndexByKey(key, that._editData); if (editIndex >= 0) { if (that._editData[editIndex].type === DATA_EDIT_DATA_INSERT_TYPE) { that._editData.splice(editIndex, 1) } else { that._editData[editIndex].type = DATA_EDIT_DATA_REMOVE_TYPE } } else { that._addEditData({ key: key, oldData: item.data, type: DATA_EDIT_DATA_REMOVE_TYPE }) } if (isBatchMode) { dataController.updateItems({ changeType: "update", rowIndices: [oldEditRowIndex, rowIndex] }) } else { that.saveEditData() } }; if (isBatchMode || !confirmDeleteMessage) { removeByKey(key) } else { showDialogTitle = commonUtils.isDefined(confirmDeleteTitle) && confirmDeleteTitle.length > 0; dialog.confirm(confirmDeleteMessage, confirmDeleteTitle, showDialogTitle).done(function(confirmResult) { if (confirmResult) { removeByKey(key) } }) } } }, undeleteRow: function(rowIndex) { var that = this, dataController = that._dataController, item = dataController.items()[rowIndex], oldEditRowIndex = that._getVisibleEditRowIndex(), key = item && item.key; if (item) { var editData, editIndex = getIndexByKey(key, that._editData); if (editIndex >= 0) { editData = that._editData[editIndex]; if (typeUtils.isEmptyObject(editData.data)) { that._editData.splice(editIndex, 1) } else { editData.type = DATA_EDIT_DATA_UPDATE_TYPE } dataController.updateItems({ changeType: "update", rowIndices: [oldEditRowIndex, rowIndex] }) } } }, _saveEditDataCore: function(deferreds, results) { var that = this, store = that._dataController.store(), isDataSaved = true; function executeEditingAction(actionName, params, func) { var deferred = $.Deferred(); that.executeAction(actionName, params); function createFailureHandler(deferred) { return function(arg) { var error = arg instanceof Error ? arg : new Error(arg && String(arg) || "Unknown error"); deferred.reject(error) } } when(params.cancel).done(function(cancel) { if (cancel) { deferred.resolve("cancel") } else { func(params).done(deferred.resolve).fail(createFailureHandler(deferred)) } }).fail(createFailureHandler(deferred)); return deferred } $.each(that._editData, function(index, editData) { var deferred, doneDeferred, params, data = editData.data, oldData = editData.oldData, type = editData.type; if (that._beforeSaveEditData(editData, index)) { return } switch (type) { case DATA_EDIT_DATA_REMOVE_TYPE: params = { data: oldData, key: editData.key, cancel: false }; deferred = executeEditingAction("onRowRemoving", params, function() { return store.remove(editData.key) }); break; case DATA_EDIT_DATA_INSERT_TYPE: params = { data: data, cancel: false }; deferred = executeEditingAction("onRowInserting", params, function() { return store.insert(params.data).done(function(data, key) { editData.key = key }) }); break; case DATA_EDIT_DATA_UPDATE_TYPE: params = { newData: data, oldData: oldData, key: editData.key, cancel: false }; deferred = executeEditingAction("onRowUpdating", params, function() { return store.update(editData.key, params.newData) }) } if (deferred) { doneDeferred = $.Deferred(); deferred.always(function(data) { isDataSaved = "cancel" !== data; results.push({ key: editData.key, result: data }) }).always(doneDeferred.resolve); deferreds.push(doneDeferred.promise()) } }); return isDataSaved }, _processSaveEditDataResult: function(results) { var i, arg, cancel, editData, editIndex, isError, $popupContent, that = this, dataController = that._dataController, hasSavedData = false, editMode = getEditMode(that); for (i = 0; i < results.length; i++) { arg = results[i].result; cancel = "cancel" === arg; editIndex = getIndexByKey(results[i].key, that._editData); editData = that._editData[editIndex]; if (editData) { isError = arg && arg instanceof Error; if (isError) { editData.error = arg; $popupContent = that.getPopupContent(); dataController.dataErrorOccurred.fire(arg, $popupContent); if (editMode !== EDIT_MODE_BATCH) { break } } else { if (!cancel || editMode !== EDIT_MODE_BATCH && editData.type === DATA_EDIT_DATA_REMOVE_TYPE) { that._editData.splice(editIndex, 1); hasSavedData = !cancel } } } } return hasSavedData }, _fireSaveEditDataEvents: function(editData) { var that = this; $.each(editData, function(_, itemData) { var data = itemData.data, key = itemData.key, type = itemData.type, params = { key: key, data: data }; if (itemData.error) { params.error = itemData.error } switch (type) { case DATA_EDIT_DATA_REMOVE_TYPE: that.executeAction("onRowRemoved", extend({}, params, { data: itemData.oldData })); break; case DATA_EDIT_DATA_INSERT_TYPE: that.executeAction("onRowInserted", params); break; case DATA_EDIT_DATA_UPDATE_TYPE: that.executeAction("onRowUpdated", params) } }) }, saveEditData: function() { var editData, that = this, results = [], deferreds = [], dataController = that._dataController, editMode = getEditMode(that), result = $.Deferred(); var resetEditIndices = function(that) { if (editMode !== EDIT_MODE_CELL) { that._editColumnIndex = -1; that._editRowIndex = -1 } }; if (that._beforeSaveEditData() || that._saving) { that._afterSaveEditData(); return result.resolve().promise() } if (!that._saveEditDataCore(deferreds, results) && editMode === EDIT_MODE_CELL) { that._focusEditingCell() } if (deferreds.length) { that._saving = true; when.apply($, deferreds).done(function() { editData = that._editData.slice(0); if (that._processSaveEditDataResult(results)) { resetEditIndices(that); if (editMode === EDIT_MODE_POPUP && that._editPopup) { that._editPopup.hide() } when(dataController.refresh()).always(function() { that._fireSaveEditDataEvents(editData); that._afterSaveEditData(); that._focusEditingCell(); result.resolve() }) } else { result.resolve() } }).fail(result.resolve); return result.always(function() { that._saving = false }).promise() } if (isRowEditMode(that)) { if (!that.hasChanges()) { that.cancelEditData() } } else { if (CELL_BASED_MODES.indexOf(editMode) !== -1) { resetEditIndices(that); dataController.updateItems() } else { that._focusEditingCell() } } that._afterSaveEditData(); return result.resolve().promise() }, _updateEditColumn: function() { var that = this, isEditColumnVisible = that._isEditColumnVisible(); that._columnsController.addCommandColumn({ command: "edit", visible: isEditColumnVisible, cssClass: "dx-command-edit", width: "auto" }); that._columnsController.columnOption("command:edit", "visible", isEditColumnVisible) }, _isEditColumnVisible: function() { var that = this, editingOptions = that.option("editing"); if (editingOptions) { var editMode = getEditMode(that), isVisibleWithCurrentEditMode = false; switch (editMode) { case EDIT_MODE_ROW: isVisibleWithCurrentEditMode = editingOptions.allowUpdating || editingOptions.allowAdding; break; case EDIT_MODE_FORM: case EDIT_MODE_POPUP: isVisibleWithCurrentEditMode = editingOptions.allowUpdating } return editingOptions.allowDeleting || isVisibleWithCurrentEditMode } }, _updateEditButtons: function() { var that = this, headerPanel = that.getView("headerPanel"), hasChanges = that.hasChanges(); if (headerPanel) { headerPanel.setToolbarItemDisabled("saveButton", !hasChanges); headerPanel.setToolbarItemDisabled("revertButton", !hasChanges) } }, _applyModified: function($element) { $element && $element.addClass(CELL_MODIFIED) }, _beforeCloseEditCellInBatchMode: function() {}, cancelEditData: function() { var that = this, editMode = getEditMode(that), rowIndex = this._editRowIndex, dataController = that._dataController; that._beforeCancelEditData(); that.init(); if (ROW_BASED_MODES.indexOf(editMode) !== -1 && rowIndex >= 0) { dataController.updateItems({ changeType: "update", rowIndices: [rowIndex, rowIndex + 1] }) } else { dataController.updateItems() } if (editMode === EDIT_MODE_POPUP) { that._hideEditPopup() } }, _hideEditPopup: function() { this._editPopup && this._editPopup.option("visible", false) }, hasEditData: function() { return this.hasChanges() }, closeEditCell: function() { var that = this, editMode = getEditMode(that), oldEditRowIndex = that._getVisibleEditRowIndex(), dataController = that._dataController; if (!isRowEditMode(that)) { setTimeout(function() { if (editMode === EDIT_MODE_CELL && that.hasChanges()) { that._editRowIndex = -1; that._editColumnIndex = -1; that.saveEditData() } else { if (oldEditRowIndex >= 0) { var rowIndices = [oldEditRowIndex]; that._editRowIndex = -1; that._editColumnIndex = -1; that._beforeCloseEditCellInBatchMode(rowIndices); dataController.updateItems({ changeType: "update", rowIndices: rowIndices }) } } }) } }, update: function(changeType) { var that = this, dataController = that._dataController; if (dataController && that._pageIndex !== dataController.pageIndex()) { if ("refresh" === changeType) { that.refresh() } that._pageIndex = dataController.pageIndex() } that._updateEditButtons() }, _getRowIndicesForCascadeUpdating: function(row) { return [row.rowIndex] }, updateFieldValue: function(options, value, text, forceUpdateRow) { var params, that = this, data = {}, rowKey = options.key, $cellElement = options.cellElement, editMode = getEditMode(that); if (void 0 === rowKey) { that._dataController.dataErrorOccurred.fire(errors.Error("E1043")) } if (void 0 !== rowKey && options.column.setCellValue) { if (editMode === EDIT_MODE_BATCH) { that._applyModified($cellElement, options) } options.value = value; options.column.setCellValue(data, value, text); if (text && options.column.displayValueMap) { options.column.displayValueMap[value] = text } params = { data: data, key: rowKey, oldData: options.data, type: DATA_EDIT_DATA_UPDATE_TYPE }; that._addEditData(params, options.row); that._updateEditButtons(); if (options.column.showEditorAlways && getEditMode(that) === EDIT_MODE_CELL && options.row && !options.row.inserted) { that.saveEditData() } else { if (options.row && (forceUpdateRow || options.column.setCellValue !== options.column.defaultSetCellValue)) { that._updateEditRow(options.row, forceUpdateRow) } } } }, _updateEditRow: function(row, forceUpdateRow) { var that = this, editMode = getEditMode(that); if (editMode === EDIT_MODE_POPUP) { setTimeout(this._updatePopupForm.bind(this, forceUpdateRow)) } else { this._dataController.updateItems({ changeType: "update", rowIndices: this._getRowIndicesForCascadeUpdating(row) }); if (!forceUpdateRow) { this._focusEditingCell() } } }, _updatePopupForm: function(forceUpdateRow) { var columnIndex, $focusedItemElement, rowsView = this._rowsView, rowIndex = this.getEditFormRowIndex(); if (rowIndex >= 0 && this._editForm) { if (!forceUpdateRow) { $focusedItemElement = this._editForm.element().find(".dx-state-focused"); columnIndex = rowsView.getCellIndex($focusedItemElement, rowIndex) } this._editForm.repaint(); if (columnIndex >= 0) { $focusedItemElement = rowsView.getCellElement(rowIndex, columnIndex); this._delayedInputFocus($focusedItemElement) } } }, _addEditData: function(options, row) { var that = this, editDataIndex = getIndexByKey(options.key, that._editData); if (editDataIndex < 0) { editDataIndex = that._editData.length; that._editData.push(options) } if (that._editData[editDataIndex]) { options.type = that._editData[editDataIndex].type || options.type; deepExtendArraySafe(that._editData[editDataIndex], { data: options.data, type: options.type }); if (row) { row.data = deepExtendArraySafe(deepExtendArraySafe({}, row.data), options.data) } } return editDataIndex }, _getFormEditItemTemplate: function(cellOptions, column) { return column.editCellTemplate || getDefaultEditorTemplate(this) }, renderFormEditTemplate: function(detailCellOptions, item, form, $container, isReadOnly) { var that = this, column = item.column, rowData = detailCellOptions.row && detailCellOptions.row.data, cellOptions = extend({}, detailCellOptions, { cellElement: null, isOnForm: true, item: item, value: column.calculateCellValue(rowData), column: extend({}, column, { editorOptions: item.editorOptions }), id: form.getItemID(item.name || item.dataField), columnIndex: column.index, setValue: !isReadOnly && column.allowEditing && function(value) { that.updateFieldValue(cellOptions, value) } }), template = that._getFormEditItemTemplate.bind(that)(cellOptions, column); if (that._rowsView.renderTemplate($container, template, cellOptions, !!$container.closest(document).length)) { that._rowsView._updateCell($container, cellOptions) } }, getFormEditorTemplate: function(cellOptions, item) { var that = this; return function(options, $container) { that.renderFormEditTemplate.bind(that)(cellOptions, item, options.component, $container) } }, getEditFormTemplate: function() { var that = this; return function($container, detailOptions, renderFormOnly) { var editFormOptions = that.option("editing.form"), items = that.option("editing.form.items"), userCustomizeItem = that.option("editing.form.customizeItem"), editData = that._editData[getIndexByKey(detailOptions.key, that._editData)], editFormItemClass = that.addWidgetPrefix(EDIT_FORM_ITEM_CLASS), isScrollingEnabled = getEditMode(that) === EDIT_MODE_POPUP; if (!items) { var columns = that.getController("columns").getColumns(); items = []; $.each(columns, function(_, column) { if (!column.isBand) { items.push({ column: column, name: column.name, dataField: column.dataField }) } }) } that._firstFormItem = void 0; that._editForm = that._createComponent($("<div>").appendTo($container), Form, extend({ scrollingEnabled: isScrollingEnabled }, editFormOptions, { items: items, formID: "dx-" + new Guid, validationGroup: editData, customizeItem: function(item) { var column = item.column || that._columnsController.columnOption(item.name || item.dataField); if (column) { item.label = item.label || {}; item.label.text = item.label.text || column.caption; item.template = item.template || that.getFormEditorTemplate(detailOptions, item); item.column = column; if (column.formItem) { extend(item, column.formItem) } var itemVisible = commonUtils.isDefined(item.visible) ? item.visible : true; if (!that._firstFormItem && itemVisible) { that._firstFormItem = item } } userCustomizeItem && userCustomizeItem.call(this, item); item.cssClass = commonUtils.isString(item.cssClass) ? item.cssClass + " " + editFormItemClass : editFormItemClass } })); if (!renderFormOnly) { var $buttonsContainer = $("<div>").addClass(that.addWidgetPrefix(FORM_BUTTONS_CONTAINER_CLASS)).appendTo($container); that._createComponent($("<div>").appendTo($buttonsContainer), Button, that._getSaveButtonConfig()); that._createComponent($("<div>").appendTo($buttonsContainer), Button, that._getCancelButtonConfig()) } } }, getColumnTemplate: function(options) { var template, editingOptions, editingTexts, allowUpdating, editingStartOptions, that = this, column = options.column, rowIndex = options.row && options.row.rowIndex, isRowMode = isRowEditMode(that), isRowEditing = that.isEditRow(rowIndex), isCellEditing = that.isEditCell(rowIndex, options.columnIndex); if ((column.showEditorAlways || column.setCellValue && (isRowEditing && column.allowEditing || isCellEditing)) && ("data" === options.rowType || "detailAdaptive" === options.rowType) && !column.command) { allowUpdating = that.option("editing.allowUpdating"); if (((allowUpdating || isRowEditing) && column.allowEditing || isCellEditing) && (isRowMode && isRowEditing || !isRowMode)) { if (column.showEditorAlways && !isRowMode) { editingStartOptions = { cancel: false, key: options.row.inserted ? void 0 : options.row.key, data: options.row.data, column: column }; that._isEditingStart(editingStartOptions) } if (!editingStartOptions || !editingStartOptions.cancel) { options.setValue = function(value, text) { that.updateFieldValue(options, value, text) } } } template = column.editCellTemplate || getDefaultEditorTemplate(that) } else { if ("edit" === column.command && "data" === options.rowType) { template = function(container, options) { container.css("text-align", "center"); options.rtlEnabled = that.option("rtlEnabled"); editingOptions = that.option("editing") || {}; editingTexts = editingOptions.texts || {}; if (options.row && options.row.rowIndex === that._getVisibleEditRowIndex() && isRowMode) { that._createLink(container, editingTexts.saveRowChanges, "saveEditData", options, "dx-link-save"); that._createLink(container, editingTexts.cancelRowChanges, "cancelEditData", options, "dx-link-cancel") } else { that._createEditingLinks(container, options, editingOptions, isRowMode) } } } else { if ("detail" === column.command && "detail" === options.rowType && isRowEditing) { template = that.getEditFormTemplate(options) } } } return template }, _createLink: function(container, text, methodName, options, linkClass) { var that = this, $link = $("<a>").addClass(LINK_CLASS).addClass(linkClass).text(text).on(addNamespace(clickEvent.name, EDITING_NAMESPACE), that.createAction(function(params) { var e = params.jQueryEvent; e.stopPropagation(); setTimeout(function() { options.row && that[methodName](options.row.rowIndex) }) })); options.rtlEnabled ? container.prepend($link, " ") : container.append($link, " ") }, _createEditingLinks: function(container, options, editingOptions, isRowMode) { var editingTexts = editingOptions.texts || {}; if (editingOptions.allowUpdating && isRowMode) { this._createLink(container, editingTexts.editRow, "editRow", options, "dx-link-edit") } if (editingOptions.allowDeleting) { if (options.row.removed) { this._createLink(container, editingTexts.undeleteRow, "undeleteRow", options, "dx-link-undelete") } else { this._createLink(container, editingTexts.deleteRow, "deleteRow", options, "dx-link-delete") } } }, prepareEditButtons: function(headerPanel) { var that = this, editingOptions = that.option("editing") || {}, editingTexts = that.option("editing.texts") || {}, titleButtonTextByClassNames = { revert: editingTexts.cancelAllChanges, save: editingTexts.saveAllChanges, addRow: editingTexts.addRow }, classNameButtonByNames = { revert: "cancel", save: "save", addRow: "addrow" }, buttonItems = []; var prepareButtonItem = function(name, methodName, sortIndex) { var className = classNameButtonByNames[name], onInitialized = function(e) { e.element.addClass(headerPanel._getToolbarButtonClass(EDIT_BUTTON_CLASS + " " + that.addWidgetPrefix(className) + "-button")) }, hintText = titleButtonTextByClassNames[name], isButtonDisabled = ("save" === className || "cancel" === className) && !that.hasChanges(); return { widget: "dxButton", options: { onInitialized: onInitialized, icon: "edit-button-" + className, disabled: isButtonDisabled, onClick: function() { that[methodName]() }, text: hintText, hint: hintText }, showText: "inMenu", name: name + "Button", location: "after", locateInMenu: "auto", sortIndex: sortIndex } }; if (editingOptions.allowAdding) { buttonItems.push(prepareButtonItem("addRow", "addRow", 20)) } if ((editingOptions.allowUpdating || editingOptions.allowAdding || editingOptions.allowDeleting) && getEditMode(that) === EDIT_MODE_BATCH) { buttonItems.push(prepareButtonItem("save", "saveEditData", 21)); buttonItems.push(prepareButtonItem("revert", "cancelEditData", 22)) } return buttonItems }, showHighlighting: function($cell) { var $highlight = $cell.find("." + CELL_HIGHLIGHT_OUTLINE); if ("TD" === $cell.get(0).tagName && !$highlight.length) { $cell.wrapInner($("<div>").addClass(CELL_HIGHLIGHT_OUTLINE + " " + POINTER_EVENTS_TARGET_CLASS)) } }, resetRowAndPageIndices: function(alwaysRest) { var that = this; $.each(that._editData, function(_, editData) { if (editData.pageIndex !== that._pageIndex || alwaysRest) { delete editData.pageIndex; delete editData.rowIndex } }) }, _afterInsertRow: function() {}, _beforeSaveEditData: function() {}, _afterSaveEditData: function() {}, _beforeCancelEditData: function() {} } }()); module.exports = { defaultOptions: function() { return { editing: { mode: "row", allowAdding: false, allowUpdating: false, allowDeleting: false, texts: { editRow: messageLocalization.format("dxDataGrid-editingEditRow"), saveAllChanges: messageLocalization.format("dxDataGrid-editingSaveAllChanges"), saveRowChanges: messageLocalization.format("dxDataGrid-editingSaveRowChanges"), cancelAllChanges: messageLocalization.format("dxDataGrid-editingCancelAllChanges"), cancelRowChanges: messageLocalization.format("dxDataGrid-editingCancelRowChanges"), addRow: messageLocalization.format("dxDataGrid-editingAddRow"), deleteRow: messageLocalization.format("dxDataGrid-editingDeleteRow"), undeleteRow: messageLocalization.format("dxDataGrid-editingUndeleteRow"), confirmDeleteMessage: messageLocalization.format("dxDataGrid-editingConfirmDeleteMessage"), confirmDeleteTitle: "" }, form: { colCount: 2 }, popup: {} } } }, controllers: { editing: EditingController }, extenders: { controllers: { data: { init: function() { this._editingController = this.getController("editing"); this.callBase() }, reload: function(full) { var d, editingController = this.getController("editing"); this._editingController.refresh(); d = this.callBase(full); return d && d.done(function() { editingController.resetRowAndPageIndices(true) }) }, _updateItemsCore: function(change) { this.callBase(change); var editingController = this._editingController, editFormRowIndex = editingController.getEditMode() === EDIT_MODE_FORM && editingController.getEditFormRowIndex(), editFormItem = this.items()[editFormRowIndex]; if (editFormItem) { editFormItem.rowType = "detail" } }, _processItems: function(items, changeType) { items = this._editingController.processItems(items, changeType); return this.callBase(items, changeType) }, _processDataItem: function(dataItem, options) { this._editingController.processDataItem(dataItem, options, this.generateDataValues); return this.callBase(dataItem, options) }, _processItem: function(item, options) { item = this.callBase(item, options); if (item.inserted) { options.dataIndex--; delete item.dataIndex } return item } } }, views: { rowsView: { init: function() { this.callBase(); this._editingController = this.getController("editing") }, getCellElements: function(rowIndex) { var $cellElements = this.callBase(rowIndex), editingController = this._editingController, editForm = editingController.getEditForm(), editFormRowIndex = editingController.getEditFormRowIndex(); if (editFormRowIndex === rowIndex && $cellElements && editForm) { return editForm.element().find("." + this.addWidgetPrefix(EDIT_FORM_ITEM_CLASS) + ", ." + BUTTON_CLASS) } return $cellElements }, getCellIndex: function($cell, rowIndex) { if (!$cell.is("td") && rowIndex >= 0) { var $cellElements = this.getCellElements(rowIndex), cellIndex = -1; $.each($cellElements, function(index, cellElement) { if ($(cellElement).find($cell).length) { cellIndex = index; return false } }); return cellIndex } return this.callBase.apply(this, arguments) }, _getVisibleColumnIndex: function($cells, rowIndex, columnIdentifier) { var item, visibleIndex = this.callBase($cells, rowIndex, columnIdentifier), editFormRowIndex = this._editingController.getEditFormRowIndex(); if (editFormRowIndex === rowIndex) { $.each($cells, function(index, cellElement) { item = $(cellElement).find(".dx-field-item-content").data("dx-form-item"); if (item && item.column && item.column.visibleIndex === visibleIndex) { visibleIndex = index; return false } }) } return visibleIndex }, publicMethods: function() { return this.callBase().concat(["cellValue"]) }, _getCellTemplate: function(options) { var that = this, template = that._editingController.getColumnTemplate(options); return template || that.callBase(options) }, _isNativeClick: function() { return (devices.real().ios || devices.real().android) && this.option("editing.allowUpdating") }, _createTable: function() { var that = this, $table = that.callBase.apply(that, arguments); if (!isRowEditMode(that) && that.option("editing.allowUpdating")) { $table.on(addNamespace(holdEvent.name, "dxDataGridRowsView"), "td:not(." + EDITOR_CELL_CLASS + ")", that.createAction(function() { var editingController = that._editingController; if (editingController.isEditing()) { editingController.closeEditCell() } })) } return $table }, _createRow: function(row) { var editingController, isEditRow, isRowRemoved, isRowInserted, isRowModified, $row = this.callBase(row); if (row) { editingController = this._editingController; isEditRow = editingController.isEditRow(row.rowIndex); isRowRemoved = !!row.removed; isRowInserted = !!row.inserted; isRowModified = !!row.modified; if (getEditMode(this) === EDIT_MODE_BATCH) { isRowRemoved && $row.addClass(ROW_REMOVED) } else { isEditRow && $row.addClass(EDIT_ROW) } isRowInserted && $row.addClass(ROW_INSERTED); isRowModified && $row.addClass(ROW_MODIFIED); if (isEditRow || isRowInserted || isRowRemoved) { $row.removeClass(ROW_SELECTED) } if (isEditRow && "detail" === row.rowType) { $row.addClass(this.addWidgetPrefix(EDIT_FORM_CLASS)) } } return $row }, _getColumnIndexByElement: function($element) { var $tableElement = $element.closest("table"), $tableElements = this.getTableElements(); while ($tableElement.length && !$tableElements.filter($tableElement).length) { $element = $tableElement.closest("td"); $tableElement = $element.closest("table") } return this._getColumnIndexByElementCore($element) }, _getColumnIndexByElementCore: function($element) { var $targetElement = $element.closest("." + ROW_CLASS + "> td:not(.dx-master-detail-cell)"); return this.getCellIndex($targetElement) }, _rowClick: function(e) { var that = this, editingController = that._editingController, $targetElement = $(e.jQueryEvent.target), columnIndex = that._getColumnIndexByElement($targetElement), row = that._dataController.items()[e.rowIndex], allowUpdating = that.option("editing.allowUpdating") || row && row.inserted, column = that._columnsController.getVisibleColumns()[columnIndex], allowEditing = column && (column.allowEditing || editingController.isEditCell(e.rowIndex, columnIndex)); if ($targetElement.closest("." + ROW_CLASS + "> td").hasClass(POINTER_EVENTS_NONE_CLASS)) { return } if (!(allowUpdating && allowEditing && editingController.editCell(e.rowIndex, columnIndex)) && !editingController.isEditRow(e.rowIndex)) { that.callBase(e) } }, _cellPrepared: function($cell, parameters) { var columnIndex = parameters.columnIndex, editingController = this._editingController, isCommandCell = !!parameters.column.command, isEditableCell = parameters.setValue, isEditing = parameters.isEditing || editingController.isEditRow(parameters.rowIndex) && parameters.column.allowEditing; if ("data" === parameters.rowType && !parameters.column.command && (isEditing || parameters.column.showEditorAlways)) { var alignment = parameters.column.alignment; $cell.addClass(EDITOR_CELL_CLASS).toggleClass(this.addWidgetPrefix(READONLY_CLASS), !isEditableCell).toggleClass(CELL_FOCUS_DISABLED_CLASS, !isEditableCell); if (alignment) { $cell.find(EDITORS_INPUT_SELECTOR).first().css("text-align", alignment) } } var modifiedValues = parameters.row && (parameters.row.inserted ? parameters.row.values : parameters.row.modifiedValues); if (modifiedValues && void 0 !== modifiedValues[columnIndex] && parameters.column && !isCommandCell && parameters.column.setCellValue) { editingController.showHighlighting($cell); $cell.addClass(CELL_MODIFIED) } else { if (isEditableCell) { editingController.showHighlighting($cell, true) } } this.callBase.apply(this, arguments) }, _formItemPrepared: function() {}, _isFormItem: function(parameters) { var isDetailRow = "detail" === parameters.rowType || "detailAdaptive" === parameters.rowType, isPopupEditing = "data" === parameters.rowType && "popup" === getEditMode(this); return (isDetailRow || isPopupEditing) && parameters.item }, _updateCell: function($cell, parameters) { if (this._isFormItem(parameters)) { this._formItemPrepared(parameters, $cell) } else { this.callBase($cell, parameters) } }, _update: function(change) { this.callBase(change); if ("updateSelection" === change.changeType) { this.getTableElements().children("tbody").children("." + EDIT_ROW).removeClass(ROW_SELECTED) } }, _getCellOptions: function(options) { var cellOptions = this.callBase(options); cellOptions.isEditing = this._editingController.isEditCell(cellOptions.rowIndex, cellOptions.columnIndex); return cellOptions }, cellValue: function(rowIndex, columnIdentifier, value, text) { var cellOptions = this.getCellOptions(rowIndex, columnIdentifier); if (cellOptions) { if (void 0 === value) { return cellOptions.value } else { this._editingController.updateFieldValue(cellOptions, value, text, true) } } } }, headerPanel: { _getToolbarItems: function() { var items = this.callBase(), editButtonItems = this.getController("editing").prepareEditButtons(this); return editButtonItems.concat(items) }, optionChanged: function(args) { switch (args.name) { case "editing": this._invalidate(); this.callBase(args); break; default: this.callBase(args) } }, isVisible: function() { var that = this, editingOptions = that.getController("editing").option("editing"); return that.callBase() || editingOptions && (editingOptions.allowAdding || (editingOptions.allowUpdating || editingOptions.allowDeleting) && editingOptions.mode === EDIT_MODE_BATCH) } } } } } }, /*!****************************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.validating.js ***! \****************************************************/ function(module, exports, __webpack_require__) { var gridCore = __webpack_require__( /*! ./ui.data_grid.core */ 348), validatingModule = __webpack_require__( /*! ../grid_core/ui.grid_core.validating */ 392); gridCore.registerModule("validating", validatingModule) }, /*!****************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.validating.js ***! \****************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), modules = __webpack_require__( /*! ./ui.grid_core.modules */ 350), gridCoreUtils = __webpack_require__( /*! ./ui.grid_core.utils */ 349), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, equalByValue = commonUtils.equalByValue, messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), Button = __webpack_require__( /*! ../button */ 201), pointerEvents = __webpack_require__( /*! ../../events/pointer */ 76), ValidationEngine = __webpack_require__( /*! ../validation_engine */ 117), Validator = __webpack_require__( /*! ../validator */ 288), Tooltip = __webpack_require__( /*! ../tooltip */ 314), Overlay = __webpack_require__( /*! ../overlay */ 109); var INVALIDATE_CLASS = "invalid", REVERT_TOOLTIP_CLASS = "revert-tooltip", ROWS_VIEW_CLASS = "rowsview", INVALID_MESSAGE_CLASS = "dx-invalid-message", INVALID_MESSAGE_ALWAYS_CLASS = "dx-invalid-message-always", REVERT_BUTTON_CLASS = "dx-revert-button", CELL_HIGHLIGHT_OUTLINE = "dx-highlight-outline", INSERT_INDEX = "__DX_INSERT_INDEX__", PADDING_BETWEEN_TOOLTIPS = 2, EDIT_MODE_ROW = "row", EDIT_MODE_FORM = "form", EDIT_MODE_BATCH = "batch", EDIT_MODE_CELL = "cell", EDIT_MODE_POPUP = "popup", FORM_BASED_MODES = [EDIT_MODE_POPUP, EDIT_MODE_FORM]; var ValidatingController = modules.Controller.inherit(function() { return { init: function() { this._editingController = this.getController("editing"); this.createAction("onRowValidating") }, _rowValidating: function(editData, validate) { var that = this, brokenRules = validate ? validate.brokenRules || validate.brokenRule && [validate.brokenRule] : [], isValid = validate ? validate.isValid : editData.isValid, parameters = { brokenRules: brokenRules, isValid: isValid, key: editData.key, newData: editData.data, oldData: editData.oldData, errorText: null }; that.executeAction("onRowValidating", parameters); editData.isValid = parameters.isValid; editData.errorText = parameters.errorText; return parameters }, validate: function(isFull) { var that = this, isValid = true, editingController = that._editingController; isFull = isFull || editingController.getEditMode() === EDIT_MODE_ROW; if (that._isValidationInProgress) { return false } that._isValidationInProgress = true; if (isFull) { $.each(editingController._editData, function(index, editData) { var validationResult; if (editData.type && "remove" !== editData.type) { validationResult = that.validateGroup(editData); if (!validationResult.isValid) { $.each(validationResult.brokenRules, function() { var value = this.validator.option("adapter").getValue(); if (void 0 === value) { value = null } if (this.column) { editingController.updateFieldValue({ key: editData.key, column: this.column }, value, null, true) } }) } isValid = isValid && validationResult.isValid } }) } else { if (that._currentCellValidator) { isValid = that.validateGroup(that._currentCellValidator._findGroup()).isValid } } that._isValidationInProgress = false; return isValid }, validateGroup: function(editData) { var validationResults, that = this, validateGroup = ValidationEngine.getGroupConfig(editData); if (validateGroup && validateGroup.validators.length) { validationResults = ValidationEngine.validateGroup(editData) } return that._rowValidating(editData, validationResults) }, updateEditData: function(editData) { var editMode = this._editingController.getEditMode(); if (FORM_BASED_MODES.indexOf(editMode) === -1) { this.setDisableApplyValidationResults(true); editData.isValid = ValidationEngine.getGroupConfig(editData) ? ValidationEngine.validateGroup(editData).isValid : true; this.setDisableApplyValidationResults(false) } else { editData.isValid = true } }, setValidator: function(validator) { this._currentCellValidator = validator }, getValidator: function() { return this._currentCellValidator }, removeValidators: function(editIndex) { var that = this, editingController = that._editingController; $.each(editingController._editData, function(index, editData) { var validateGroup = ValidationEngine.getGroupConfig(editData); if (!commonUtils.isDefined(editIndex) || editIndex === index) { if (validateGroup) { for (var i = 0; i < validateGroup.validators.length; i++) { validateGroup.validators[i]._dispose(); i-- } } } }) }, createValidator: function(parameters, $container) { var editData, editIndex, visibleColumns, columnsController, that = this, editingController = that._editingController, column = parameters.column, defaultValidationResult = function(options) { if (options.brokenRule) { options.brokenRule.columnIndex = column.index; options.brokenRule.column = column } if ($container && !that.getDisableApplyValidationResults()) { if (!options.isValid) { var $focus = $container.find(":focus"); editingController.showHighlighting($container, true); if (!$focus.is(":focus")) { $focus.focus().trigger(pointerEvents.down) } } $container.toggleClass(that.addWidgetPrefix(INVALIDATE_CLASS), !options.isValid) } }, getValue = function() { var value = column.calculateCellValue(editData.data || {}); return void 0 !== value ? value : parameters.value }, showEditorAlways = column.showEditorAlways; if (!column.validationRules || !Array.isArray(column.validationRules) || commonUtils.isDefined(column.command)) { return } editIndex = editingController.getIndexByKey(parameters.key, editingController._editData); if (editIndex < 0) { if (!showEditorAlways) { columnsController = that.getController("columns"); visibleColumns = columnsController && columnsController.getVisibleColumns() || []; showEditorAlways = visibleColumns.some(function(column) { return column.showEditorAlways }) } if (showEditorAlways) { editIndex = editingController._addEditData({ key: parameters.key }) } } if (editIndex >= 0) { editData = editingController._editData[editIndex]; var useDefaultValidator = $container && $container.hasClass("dx-widget"); var validator = new Validator($container || {}, { name: column.caption, validationRules: extend(true, [], column.validationRules), validationGroup: editData, adapter: useDefaultValidator ? null : { getValue: getValue, applyValidationResults: defaultValidationResult } }); if (useDefaultValidator) { var adapter = validator.option("adapter"); if (adapter) { adapter.getValue = getValue } } return validator } }, setDisableApplyValidationResults: function(flag) { this._disableApplyValidationResults = flag }, getDisableApplyValidationResults: function() { return this._disableApplyValidationResults } } }()); module.exports = { defaultOptions: function() { return { editing: { texts: { validationCancelChanges: messageLocalization.format("dxDataGrid-validationCancelChanges") } } } }, controllers: { validating: ValidatingController }, extenders: { controllers: { editing: { _addEditData: function(options, row) { var editData, that = this, validatingController = that.getController("validating"), editDataIndex = that.callBase(options, row); if (editDataIndex >= 0) { editData = that._editData[editDataIndex]; validatingController.updateEditData(editData) } return editDataIndex }, _updateRowAndPageIndices: function() { var that = this, startInsertIndex = that.getView("rowsView").getTopVisibleItemIndex(), rowIndex = startInsertIndex; $.each(that._editData, function(_, editData) { if (!editData.isValid && editData.pageIndex !== that._pageIndex) { editData.pageIndex = that._pageIndex; if ("insert" === editData.type) { editData.rowIndex = startInsertIndex } else { editData.rowIndex = rowIndex } rowIndex++ } }) }, _needInsertItem: function(editData) { var result = this.callBase.apply(this, arguments); if (result && !editData.isValid) { result = editData.key.pageIndex === this._pageIndex } return result }, processItems: function(items, changeType) { var i, itemsCount, that = this, insertCount = 0, editData = that._editData, dataController = that.getController("data"), getIndexByEditData = function(editData, items) { var index = -1, isInsert = "insert" === editData.type, key = editData.key; $.each(items, function(i, item) { if (equalByValue(key, isInsert ? item : dataController.keyOf(item))) { index = i; return false } }); return index }, addInValidItem = function(editData) { var rowIndex, data = { key: editData.key }, index = getIndexByEditData(editData, items); if (index >= 0) { return } editData.rowIndex = editData.rowIndex > itemsCount ? editData.rowIndex % itemsCount : editData.rowIndex; rowIndex = editData.rowIndex; data[INSERT_INDEX] = 1; items.splice(rowIndex, 0, data); insertCount++ }; items = that.callBase(items, changeType); itemsCount = items.length; if (that.getEditMode() === EDIT_MODE_BATCH && "prepend" !== changeType && "append" !== changeType) { for (i = 0; i < editData.length; i++) { if (editData[i].type && editData[i].pageIndex === that._pageIndex && editData[i].key.pageIndex !== that._pageIndex) { addInValidItem(editData[i]) } } } return items }, processDataItem: function(item) { var editIndex, editData, that = this, isInserted = item.data[INSERT_INDEX], key = isInserted ? item.data.key : item.key, editMode = that.getEditMode(); if (editMode === EDIT_MODE_BATCH && isInserted && key) { editIndex = gridCoreUtils.getIndexByKey(key, that._editData); if (editIndex >= 0) { editData = that._editData[editIndex]; if ("insert" !== editData.type) { item.data = extend(true, {}, editData.oldData, editData.data); item.key = key } } } that.callBase.apply(that, arguments) }, _afterInsertRow: function(options) { var validatingController = this.getController("validating"), invisibleColumns = commonUtils.grep(this.getController("columns").getInvisibleColumns(), function(column) { return !column.isBand }); if (FORM_BASED_MODES.indexOf(this.getEditMode()) === -1) { $.each(invisibleColumns, function(_, column) { validatingController.createValidator({ column: column, key: options.key, value: column.calculateCellValue(options.data) }) }) } this.callBase(options) }, _beforeSaveEditData: function(editData, editIndex) { var isValid, isFullValid, that = this, result = that.callBase.apply(that, arguments), validatingController = that.getController("validating"); if (editData) { isValid = "remove" === editData.type || editData.isValid; if (isValid) { validatingController.removeValidators(editIndex) } result = result || !isValid } else { isFullValid = validatingController.validate(true); that._updateRowAndPageIndices(); switch (that.getEditMode()) { case EDIT_MODE_CELL: if (!isFullValid) { that._focusEditingCell(); result = true } break; case EDIT_MODE_BATCH: if (!isFullValid) { that._editRowIndex = -1; that._editColumnIndex = -1; that.getController("data").updateItems(); result = true } break; case EDIT_MODE_ROW: case EDIT_MODE_POPUP: result = !isFullValid } } return result }, _beforeEditCell: function(rowIndex, columnIndex, item) { var result = this.callBase(rowIndex, columnIndex, item), $cell = this.component.getCellElement(rowIndex, columnIndex), validator = $cell && $cell.data("dxValidator"), value = validator && validator.option("adapter").getValue(); if (this.getEditMode(this) === EDIT_MODE_CELL && (!validator || void 0 !== value && validator.validate().isValid)) { return result } }, _afterSaveEditData: function() { var that = this; $.each(that._editData, function(_, editData) { that._showErrorRow(editData) }) }, _beforeCancelEditData: function() { var validatingController = this.getController("validating"); validatingController.removeValidators(); this.callBase() }, _showErrorRow: function(editData) { var $popupContent, errorHandling = this.getController("errorHandling"), items = this.getController("data").items(), rowIndex = this.getIndexByKey(editData.key, items); if (!editData.isValid && editData.errorText && rowIndex >= 0) { $popupContent = this.getPopupContent(); errorHandling && errorHandling.renderErrorRow(editData.errorText, rowIndex, $popupContent) } }, updateFieldValue: function() { var that = this; that.callBase.apply(that, arguments); if (that.getEditMode() === EDIT_MODE_ROW) { var currentValidator = that.getController("validating").getValidator(); currentValidator && currentValidator.validate() } }, showHighlighting: function($cell, skipValidation) { var validator, isValid = true; if (!skipValidation) { validator = $cell.data("dxValidator"); if (validator) { isValid = validator.validate().isValid } } if (isValid) { this.callBase($cell) } }, getEditDataByKey: function(key) { return this._editData[gridCoreUtils.getIndexByKey(key, this._editData)] } }, editorFactory: { _showRevertButton: function($container, $targetElement) { var that = this; if ($targetElement && $targetElement.length) { return new Tooltip($("<div>").addClass(that.addWidgetPrefix(REVERT_TOOLTIP_CLASS)).appendTo($container), { animation: null, visible: true, target: $targetElement, container: $container, closeOnOutsideClick: false, closeOnTargetScroll: false, boundary: that._rowsView.element(), contentTemplate: function() { return new Button($("<div>").addClass(REVERT_BUTTON_CLASS), { icon: "revert", hint: that.option("editing.texts.validationCancelChanges"), onClick: function() { that._editingController.cancelEditData() } }).element() }, position: { my: "left top", at: "right top", of: $targetElement, offset: "1 0", collision: "flip" } }) } }, _showValidationMessage: function($cell, message, alignment, revertTooltip) { var needRepaint, that = this, $highlightContainer = $cell.find("." + CELL_HIGHLIGHT_OUTLINE), isOverlayVisible = $cell.find(".dx-dropdowneditor-overlay:visible").length, myPosition = isOverlayVisible ? "top right" : "top " + alignment, atPosition = isOverlayVisible ? "top left" : "bottom " + alignment; new Overlay($("<div/>").addClass(INVALID_MESSAGE_CLASS).addClass(INVALID_MESSAGE_ALWAYS_CLASS).text(message).appendTo($cell), { target: $highlightContainer.length ? $highlightContainer : $cell, container: $cell, shading: false, width: "auto", height: "auto", visible: true, animation: false, closeOnOutsideClick: false, closeOnTargetScroll: false, position: { collision: "flip", boundary: that._rowsView.element(), boundaryOffset: "0 0", my: myPosition, at: atPosition }, onPositioned: function(e) { if (!needRepaint) { needRepaint = that._rowsView.updateFreeSpaceRowHeight(); if (needRepaint) { e.component.repaint() } } that._shiftValidationMessageIfNeed(e.component.content(), revertTooltip && revertTooltip.content(), $cell) } }) }, _shiftValidationMessageIfNeed: function($content, $revertContent, $cell) { if (!$revertContent) { return } var contentOffset = $content.offset(), revertContentOffset = $revertContent.offset(); if (contentOffset.top === revertContentOffset.top && contentOffset.left + $content.width() > revertContentOffset.left) { var left = $revertContent.width() + PADDING_BETWEEN_TOOLTIPS; $content.css("left", revertContentOffset.left < $cell.offset().left ? -left : left) } }, _getTooltipsSelector: function() { return ".dx-editor-cell .dx-tooltip, .dx-editor-cell .dx-invalid-message" }, init: function() { this.callBase(); this._editingController = this.getController("editing"); this._rowsView = this.getView("rowsView") }, loseFocus: function(skipValidator) { if (!skipValidator) { this.getController("validating").setValidator(null) } this.callBase() }, focus: function($element, hideBorder) { var validationResult, revertTooltip, that = this, $focus = $element && $element.closest(that._getFocusCellSelector()), validator = $focus && ($focus.data("dxValidator") || $element.find(".dx-validator").eq(0).data("dxValidator")), rowOptions = $focus && $focus.closest(".dx-row").data("options"), editData = rowOptions ? that.getController("editing").getEditDataByKey(rowOptions.key) : null, $tooltips = $focus && $focus.closest("." + that.addWidgetPrefix(ROWS_VIEW_CLASS)).find(that._getTooltipsSelector()), $cell = $focus && $focus.is("td") ? $focus : null, showValidationMessage = false, column = $cell && that.getController("columns").getVisibleColumns()[$cell.index()]; if (!arguments.length) { return that.callBase() } $tooltips && $tooltips.remove(); if (validator) { that.getController("validating").setValidator(validator); if (void 0 !== validator.option("adapter").getValue()) { validationResult = validator.validate(); if (!validationResult.isValid) { hideBorder = true; showValidationMessage = true } } } if (validationResult && !validationResult.isValid || editData && "update" === editData.type) { if (that._editingController.getEditMode() === EDIT_MODE_CELL) { revertTooltip = that._showRevertButton($focus, $cell ? $focus.find("." + CELL_HIGHLIGHT_OUTLINE).first() : $focus) } } if (showValidationMessage && $cell && column) { that._showValidationMessage($focus, validationResult.brokenRule.message, column.alignment, revertTooltip) }!hideBorder && that._rowsView.element() && that._rowsView.updateFreeSpaceRowHeight(); return that.callBase($element, hideBorder) } } }, views: { rowsView: { updateFreeSpaceRowHeight: function($table) { var $rowElements, $freeSpaceRowElement, $freeSpaceRowElements, that = this, $element = that.element(), $tooltipContent = $element && $element.find(".dx-invalid-message .dx-overlay-content"); that.callBase($table); if ($tooltipContent && $tooltipContent.length) { $rowElements = that._getRowElements(); $freeSpaceRowElements = that._getFreeSpaceRowElements($table); $freeSpaceRowElement = $freeSpaceRowElements.first(); if ($freeSpaceRowElement && 1 === $rowElements.length && (!$freeSpaceRowElement.is(":visible") || $tooltipContent.outerHeight() > $freeSpaceRowElement.outerHeight())) { $freeSpaceRowElements.show(); $freeSpaceRowElements.height($tooltipContent.outerHeight()); return true } } }, _formItemPrepared: function(cellOptions, $container) { this.callBase.apply(this, arguments); this.getController("validating").createValidator(cellOptions, $container.children(".dx-widget")) }, _cellPrepared: function($cell, parameters) { this.getController("validating").createValidator(parameters, $cell); this.callBase.apply(this, arguments) } } } } } }, /*!***********************************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.virtual_scrolling.js ***! \***********************************************************/ function(module, exports, __webpack_require__) { var gridCore = __webpack_require__( /*! ./ui.data_grid.core */ 348), dataSourceAdapter = __webpack_require__( /*! ./ui.data_grid.data_source_adapter */ 358), virtualScrollingModule = __webpack_require__( /*! ../grid_core/ui.grid_core.virtual_scrolling */ 394); gridCore.registerModule("virtualScrolling", virtualScrollingModule); dataSourceAdapter.extend(virtualScrollingModule.extenders.dataSourceAdapter) }, /*!***********************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.virtual_scrolling.js ***! \***********************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), virtualScrollingCore = __webpack_require__( /*! ./ui.grid_core.virtual_scrolling_core */ 395), gridCoreUtils = __webpack_require__( /*! ./ui.grid_core.utils */ 349), browser = __webpack_require__( /*! ../../core/utils/browser */ 23), translator = __webpack_require__( /*! ../../animation/translator */ 69), LoadIndicator = __webpack_require__( /*! ../load_indicator */ 238); var TABLE_CLASS = "table", BOTTOM_LOAD_PANEL_CLASS = "bottom-load-panel", TABLE_CONTENT_CLASS = "table-content", GROUP_SPACE_CLASS = "group-space", CONTENT_CLASS = "content", ROW_CLASS = "dx-row", FREESPACE_CLASS = "dx-freespace-row", COLUMN_LINES_CLASS = "dx-column-lines", SCROLLING_MODE_INFINITE = "infinite", SCROLLING_MODE_VIRTUAL = "virtual", PIXELS_LIMIT = 25e4; var isVirtualMode = function(that) { return that.option("scrolling.mode") === SCROLLING_MODE_VIRTUAL }; var isAppendMode = function(that) { return that.option("scrolling.mode") === SCROLLING_MODE_INFINITE }; var VirtualScrollingDataSourceAdapterExtender = function() { var updateLoading = function(that) { var beginPageIndex = that._virtualScrollController.beginPageIndex(-1); if (isVirtualMode(that)) { if (beginPageIndex < 0 || that.viewportSize() >= 0 && that.getViewportItemIndex() >= 0 && (beginPageIndex * that.pageSize() > that.getViewportItemIndex() || beginPageIndex * that.pageSize() + that.itemsCount() < that.getViewportItemIndex() + that.viewportSize()) && that._dataSource.isLoading()) { if (!that._isLoading) { that._isLoading = true; that.loadingChanged.fire(true) } } else { if (that._isLoading) { that._isLoading = false; that.loadingChanged.fire(false) } } } }; return { init: function(dataSource) { var that = this; that.callBase.apply(that, arguments); that._items = []; that._isLoaded = true; that._virtualScrollController = new virtualScrollingCore.VirtualScrollController(that.component, { pageSize: function() { return that.pageSize() }, totalItemsCount: function() { return that.totalItemsCount() }, hasKnownLastPage: function() { return that.hasKnownLastPage() }, pageIndex: function(index) { return dataSource.pageIndex(index) }, isLoading: function() { return dataSource.isLoading() }, pageCount: function() { return that.pageCount() }, load: function() { return dataSource.load() }, updateLoading: function() { updateLoading(that) }, itemsCount: function() { return that.itemsCount(true) }, items: function() { return dataSource.items() }, viewportItems: function(items) { if (items) { that._items = items } return that._items }, onChanged: function(e) { that.changed.fire(e) } }) }, _handleLoadingChanged: function(isLoading) { var that = this; if (!isVirtualMode(that)) { that._isLoading = isLoading; that.callBase.apply(that, arguments) } }, _handleLoadError: function() { var that = this; that._isLoading = false; that.loadingChanged.fire(false); that.callBase.apply(that, arguments) }, _handleDataChanged: function() { var callBase = this.callBase.bind(this); this._virtualScrollController.handleDataChanged(callBase) }, items: function() { return this._items }, itemsCount: function(isBase) { if (isBase) { return this.callBase() } return this._virtualScrollController.itemsCount() }, virtualItemsCount: function() { return this._virtualScrollController.virtualItemsCount() }, getViewportItemIndex: function() { return this._virtualScrollController.getViewportItemIndex() }, setViewportItemIndex: function(itemIndex) { return this._virtualScrollController.setViewportItemIndex(itemIndex) }, viewportSize: function(size) { return this._virtualScrollController.viewportSize(size) }, pageIndex: function(pageIndex) { return this._virtualScrollController.pageIndex(pageIndex) }, beginPageIndex: function() { return this._virtualScrollController.beginPageIndex() }, endPageIndex: function() { return this._virtualScrollController.endPageIndex() }, load: function(loadOptions) { if (loadOptions) { return this.callBase(loadOptions) } return this._virtualScrollController.load() }, loadIfNeed: function() { return this._virtualScrollController.loadIfNeed() }, isLoading: function() { return this._isLoading }, isLoaded: function() { return this._dataSource.isLoaded() && this._isLoaded }, _changeRowExpandCore: function() { var result = this.callBase.apply(this, arguments); this._virtualScrollController.reset(); updateLoading(this); return result }, reload: function() { this._dataSource.pageIndex(this.pageIndex()); return this.callBase.apply(this, arguments) }, refresh: function(options, isReload, operationTypes) { var that = this, storeLoadOptions = options.storeLoadOptions, dataSource = that._dataSource; if (isReload || operationTypes.reload) { that._virtualScrollController.reset(); that._isLoaded = false; updateLoading(that); that._isLoaded = true; if (isAppendMode(that)) { that.pageIndex(0); dataSource.pageIndex(0); storeLoadOptions.pageIndex = 0; storeLoadOptions.skip = 0 } else { dataSource.pageIndex(that.pageIndex()); if (dataSource.paginate()) { storeLoadOptions.skip = that.pageIndex() * that.pageSize() } } } return that.callBase.apply(that, arguments) } } }(); var VirtualScrollingRowsViewExtender = function() { return { init: function() { var that = this, dataController = that.getController("data"); that.callBase(); dataController.pageChanged.add(function() { that.scrollToPage(dataController.pageIndex()) }) }, scrollToPage: function(pageIndex) { var scrollPosition, that = this, dataController = that._dataController, pageSize = dataController ? dataController.pageSize() : 0; if (isVirtualMode(that) || isAppendMode(that)) { scrollPosition = pageIndex * that._rowHeight * pageSize } else { scrollPosition = 0 } that.scrollTo({ y: scrollPosition, x: that._scrollLeft }) }, _renderCore: function() { var that = this, startRenderDate = new Date; that.callBase.apply(that, arguments); that._updateContentPosition(); that._renderTime = new Date - startRenderDate }, _renderContent: function(contentElement, tableElement) { var that = this, virtualItemsCount = that._dataController.virtualItemsCount(); if (virtualItemsCount) { tableElement.addClass(that.addWidgetPrefix(TABLE_CONTENT_CLASS)); if (!contentElement.children().length) { contentElement.append(tableElement) } else { contentElement.children().first().replaceWith(tableElement) } if (1 === contentElement.children("table").length) { contentElement.append(that._createTable()); that._contentHeight = 0 } return contentElement } else { return that.callBase.apply(that, arguments) } }, _updateContent: function(tableElement, change) { var contentTable, that = this, contentElement = that._findContentElement(), changeType = change && change.changeType; if ("append" === changeType || "prepend" === changeType) { contentTable = contentElement.children().first(); tableElement.children("tbody")["append" === changeType ? "appendTo" : "prependTo"](contentTable); tableElement.remove(); var $rowElements = that._getFreeSpaceRowElements(contentTable); for (var i = 0; i < $rowElements.length - 1; i++) { $rowElements.eq(i).remove() } } else { that.callBase.apply(that, arguments) } that._updateBottomLoading() }, _updateContentPosition: commonUtils.deferUpdater(function() { var contentElement, contentHeight, $tables, $contentTable, virtualTable, isRenderVirtualTableContentRequired, that = this, rowHeight = that._rowHeight || 20, virtualItemsCount = that._dataController.virtualItemsCount(); if (virtualItemsCount) { contentElement = that._findContentElement(); $tables = contentElement.children(); $contentTable = $tables.eq(0); virtualTable = $tables.eq(1); that._contentTableHeight = $contentTable[0].offsetHeight; contentHeight = (virtualItemsCount.begin + virtualItemsCount.end + that._dataController.itemsCount()) * that._rowHeight; var contentHeightLimit = virtualScrollingCore.getContentHeightLimit(browser); if (contentHeight > contentHeightLimit) { that._heightRatio = contentHeightLimit / contentHeight } else { that._heightRatio = 1 } contentHeight = (virtualItemsCount.begin + virtualItemsCount.end) * rowHeight * that._heightRatio + that._contentTableHeight; var top = Math.floor(virtualItemsCount.begin * rowHeight * that._heightRatio); commonUtils.deferRender(function() { translator.move($contentTable, { left: 0, top: top }); isRenderVirtualTableContentRequired = that._contentHeight !== contentHeight || 0 === contentHeight || !that._isTableLinesDisplaysCorrect(virtualTable) || !that._isColumnElementsEqual($contentTable.find("col"), virtualTable.find("col")); if (isRenderVirtualTableContentRequired) { that._contentHeight = contentHeight; that._renderVirtualTableContent(virtualTable, contentHeight) } if (that._scrollTop < top && !that._isScrollByEvent && that._dataController.pageIndex() > 0) { that.scrollTo({ top: top, left: that._scrollLeft }) } }) } }), _isTableLinesDisplaysCorrect: function(table) { var hasColumnLines = table.find("." + COLUMN_LINES_CLASS).length > 0; return hasColumnLines === this.option("showColumnLines") }, _isColumnElementsEqual: function($columns, $virtualColumns) { var result = $columns.length === $virtualColumns.length; if (result) { $.each($columns, function(index, element) { if (element.style.width !== $virtualColumns[index].style.width) { result = false; return result } }) } return result }, _renderVirtualTableContent: function(container, height) { var i, that = this, columns = that._columnsController.getVisibleColumns(), html = that._createColGroup(columns).prop("outerHTML"), freeSpaceCellsHtml = "", columnLinesClass = that.option("showColumnLines") ? COLUMN_LINES_CLASS : "", createFreeSpaceRowHtml = function(height) { return "<tr style='height:" + height + "px;' class='" + FREESPACE_CLASS + " " + ROW_CLASS + " " + columnLinesClass + "' >" + freeSpaceCellsHtml + "</tr>" }; for (i = 0; i < columns.length; i++) { var classes = that._getCellClasses(columns[i]), classString = classes.length ? " class='" + classes.join(" ") + "'" : ""; freeSpaceCellsHtml += "<td" + classString + "/>" } while (height > PIXELS_LIMIT) { html += createFreeSpaceRowHtml(PIXELS_LIMIT); height -= PIXELS_LIMIT } html += createFreeSpaceRowHtml(height); container.addClass(that.addWidgetPrefix(TABLE_CLASS)); container.html(html) }, _getCellClasses: function(column) { var classes = [], cssClass = column.cssClass, isExpandColumn = "expand" === column.command; cssClass && classes.push(cssClass); isExpandColumn && classes.push(this.addWidgetPrefix(GROUP_SPACE_CLASS)); return classes }, _findBottomLoadPanel: function() { var $element = this.element(); var $bottomLoadPanel = $element && $element.find("." + this.addWidgetPrefix(BOTTOM_LOAD_PANEL_CLASS)); if ($bottomLoadPanel && $bottomLoadPanel.length) { return $bottomLoadPanel } }, _updateBottomLoading: function() { var that = this, scrollingMode = that.option("scrolling.mode"), virtualMode = scrollingMode === SCROLLING_MODE_VIRTUAL, appendMode = scrollingMode === SCROLLING_MODE_INFINITE, showBottomLoading = !that._dataController.hasKnownLastPage() && that._dataController.isLoaded() && (virtualMode || appendMode), bottomLoadPanelElement = that._findBottomLoadPanel(); if (showBottomLoading) { if (!bottomLoadPanelElement) { $("<div>").addClass(that.addWidgetPrefix(BOTTOM_LOAD_PANEL_CLASS)).append(that._createComponent($("<div>"), LoadIndicator).element()).appendTo(that._findContentElement()) } } else { if (bottomLoadPanelElement) { bottomLoadPanelElement.remove() } } }, _handleScroll: function(e) { var that = this; if (that._hasHeight && that._rowHeight) { that._setViewportScrollTop(e.scrollOffset.top) } that.callBase.apply(that, arguments) }, _setViewportScrollTop: function(scrollTop) { var that = this, scrollingTimeout = Math.min(that.option("scrolling.timeout") || 0, that._renderTime || 0); clearTimeout(that._scrollTimeoutID); if (scrollingTimeout > 0) { that._scrollTimeoutID = setTimeout(function() { that._setViewportScrollTopCore(scrollTop) }, scrollingTimeout) } else { that._setViewportScrollTopCore(scrollTop) } }, _setViewportScrollTopCore: function(scrollTop) { var that = this, virtualItemsCount = that._dataController.virtualItemsCount(), heightRatio = that._heightRatio || 1, rowHeight = that._rowHeight, beginHeight = virtualItemsCount ? Math.floor(virtualItemsCount.begin * rowHeight * heightRatio) : 0; if (virtualItemsCount && scrollTop >= beginHeight && scrollTop <= beginHeight + that._contentTableHeight) { that._dataController.setViewportItemIndex(virtualItemsCount.begin + (scrollTop - beginHeight) / rowHeight) } else { that._dataController.setViewportItemIndex(scrollTop / (rowHeight * heightRatio)) } }, _needUpdateRowHeight: function(itemsCount) { var that = this; return that.callBase.apply(that, arguments) || itemsCount > 0 && that.option("scrolling.mode") === SCROLLING_MODE_INFINITE }, _updateRowHeight: function() { var viewportHeight, that = this; that.callBase.apply(that, arguments); if (that._rowHeight) { that._updateContentPosition(); viewportHeight = that._hasHeight ? that.element().outerHeight() : $(window).outerHeight(); that._dataController.viewportSize(Math.round(viewportHeight / that._rowHeight)) } }, setLoading: function(isLoading, messageText) { var that = this, callBase = that.callBase, dataController = that._dataController, hasBottomLoadPanel = dataController.pageIndex() > 0 && dataController.isLoaded() && !!that._findBottomLoadPanel(); if (hasBottomLoadPanel) { isLoading = false } callBase.call(that, isLoading, messageText) }, _resizeCore: function() { var that = this, $element = that.element(); that.callBase(); if (that.component.element() && !that._windowScroll && $element.closest(document).length) { that._windowScroll = virtualScrollingCore.subscribeToExternalScrollers($element, function(scrollPos) { if (!that._hasHeight && that._rowHeight) { that._setViewportScrollTop(scrollPos) } }, that.component.element()); that.on("disposing", function() { that._windowScroll.dispose() }) } var dataSource = that._dataController.dataSource(); if (dataSource && dataSource.loadIfNeed) { dataSource.loadIfNeed() } }, setColumnWidths: function(widths) { var $content, scrollable = this.getScrollable(); this.callBase.apply(this, arguments); if ("virtual" === this.option("scrolling.mode")) { $content = scrollable ? scrollable.content() : this.element(); this.callBase(widths, $content.children("." + this.addWidgetPrefix(CONTENT_CLASS)).children(":not(." + this.addWidgetPrefix(TABLE_CONTENT_CLASS) + ")")) } }, dispose: function() { clearTimeout(this._scrollTimeoutID); this.callBase() } } }(); module.exports = { defaultOptions: function() { return { scrolling: { timeout: 300, mode: "standard", preloadEnabled: false } } }, extenders: { dataSourceAdapter: VirtualScrollingDataSourceAdapterExtender, controllers: { data: function() { var members = { getRowIndexOffset: function() { var offset = 0, dataSource = this.dataSource(); if ("virtual" === this.option("scrolling.mode") && dataSource) { offset = dataSource.beginPageIndex() * dataSource.pageSize() } return offset } }; gridCoreUtils.proxyMethod(members, "virtualItemsCount"); gridCoreUtils.proxyMethod(members, "viewportSize"); gridCoreUtils.proxyMethod(members, "setViewportItemIndex"); return members }() }, views: { rowsView: VirtualScrollingRowsViewExtender } } } }, /*!****************************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.virtual_scrolling_core.js ***! \****************************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), browser = __webpack_require__( /*! ../../core/utils/browser */ 23), positionUtils = __webpack_require__( /*! ../../animation/position */ 70), Class = __webpack_require__( /*! ../../core/class */ 25); var SCROLLING_MODE_INFINITE = "infinite", SCROLLING_MODE_VIRTUAL = "virtual"; var isVirtualMode = function(that) { return that.option("scrolling.mode") === SCROLLING_MODE_VIRTUAL }; var isAppendMode = function(that) { return that.option("scrolling.mode") === SCROLLING_MODE_INFINITE }; exports.getContentHeightLimit = function(browser) { if (browser.msie) { return 4e6 } else { if (browser.mozilla) { return 8e6 } } return 15e6 }; exports.subscribeToExternalScrollers = function($element, scrollChangedHandler, $targetElement) { var $scrollElement, scrollableArray = [], scrollToArray = [], disposeArray = []; $targetElement = $targetElement || $element; function getElementOffset(scrollable) { var $scrollableElement = scrollable.element ? scrollable.element() : scrollable, scrollableOffset = positionUtils.offset($scrollableElement); if (!scrollableOffset) { return $element.offset().top } return scrollable.scrollTop() - (scrollableOffset.top - $element.offset().top) } function createWindowScrollHandler(scrollable) { return function() { var scrollTop = scrollable.scrollTop() - getElementOffset(scrollable); scrollTop = scrollTop > 0 ? scrollTop : 0; scrollChangedHandler(scrollTop) } } function subscribeToScrollEvents($scrollElement) { var handler, isDocument = "#document" === $scrollElement.get(0).nodeName, scrollable = $scrollElement.data("dxScrollable") || isDocument && $(window) || "auto" === $scrollElement.css("overflow-y") && $scrollElement; if (scrollable) { handler = createWindowScrollHandler(scrollable); scrollable.on("scroll", handler); scrollToArray.push(function(pos) { var topOffset = getElementOffset(scrollable), scrollMethod = scrollable.scrollTo ? "scrollTo" : "scrollTop"; if (pos - topOffset >= 0) { scrollable[scrollMethod](pos + topOffset) } }); scrollableArray.push(scrollable); disposeArray.push(function() { scrollable.off("scroll", handler) }) } } for ($scrollElement = $targetElement.parent(); $scrollElement.length; $scrollElement = $scrollElement.parent()) { subscribeToScrollEvents($scrollElement) } return { scrollTo: function(pos) { $.each(scrollToArray, function(_, scrollTo) { scrollTo(pos) }) }, dispose: function() { $.each(disposeArray, function(_, dispose) { dispose() }) } } }; exports.VirtualScrollController = Class.inherit(function() { var getViewportPageCount = function(that) { var pageSize = that._dataSource.pageSize(), preventPreload = that.option("scrolling.preventPreload"); if (preventPreload) { return 0 } return pageSize && that._viewportSize > 0 ? Math.ceil(that._viewportSize / pageSize) : 1 }; var getPreloadPageCount = function(that, previous) { var preloadEnabled = that.option("scrolling.preloadEnabled"), pageCount = getViewportPageCount(that); if (pageCount) { if (previous) { pageCount = preloadEnabled ? 1 : 0 } else { if (preloadEnabled) { pageCount++ } if (isAppendMode(that)) { pageCount-- } } } return pageCount }; var getPageIndexForLoad = function(that) { var needToLoadNextPage, needToLoadPrevPage, needToLoadPageBeforeLast, result = -1, beginPageIndex = getBeginPageIndex(that), dataSource = that._dataSource; if (beginPageIndex < 0 || !that._cache[that._pageIndex - beginPageIndex]) { result = that._pageIndex } else { if (beginPageIndex >= 0 && that._viewportSize >= 0) { if (beginPageIndex > 0) { needToLoadPageBeforeLast = getEndPageIndex(that) + 1 === dataSource.pageCount() && that._cache.length < getPreloadPageCount(that) + 1; needToLoadPrevPage = needToLoadPageBeforeLast || that._pageIndex === beginPageIndex && getPreloadPageCount(that, true); if (needToLoadPrevPage) { result = beginPageIndex - 1 } } if (result < 0) { needToLoadNextPage = beginPageIndex + that._cache.length <= that._pageIndex + getPreloadPageCount(that); if (needToLoadNextPage) { result = beginPageIndex + that._cache.length } } } } return result }; var getBeginPageIndex = function(that) { return that._cache.length ? that._cache[0].pageIndex : -1 }; var getEndPageIndex = function(that) { return that._cache.length ? that._cache[that._cache.length - 1].pageIndex : -1 }; var fireChanged = function(that, changed, args) { that._isChangedFiring = true; changed(args); that._isChangedFiring = false }; var processDelayChanged = function(that, changed, args) { if (that._isDelayChanged) { that._isDelayChanged = false; fireChanged(that, changed, args); return true } }; var processChanged = function(that, changed, changeType, isDelayChanged) { var change, dataSource = that._dataSource, items = dataSource.items(); if (changeType && !that._isDelayChanged) { change = { changeType: changeType, items: items } } var viewportItems = that._dataSource.viewportItems(); if ("append" === changeType) { viewportItems.push.apply(viewportItems, items) } else { if ("prepend" === changeType) { viewportItems.unshift.apply(viewportItems, items) } else { that._dataSource.viewportItems(items) } } dataSource.updateLoading(); that._lastPageIndex = that.pageIndex(); that._isDelayChanged = isDelayChanged; if (!isDelayChanged) { fireChanged(that, changed, change) } }; var loadCore = function(that, pageIndex) { var dataSource = that._dataSource; if (pageIndex === that.pageIndex() || !dataSource.isLoading() && pageIndex < dataSource.pageCount() || !dataSource.hasKnownLastPage() && pageIndex === dataSource.pageCount()) { dataSource.pageIndex(pageIndex); return dataSource.load() } }; return { ctor: function(component, dataSource) { var that = this; that._dataSource = dataSource; that.component = component; that._pageIndex = that._lastPageIndex = dataSource.pageIndex(); that._viewportSize = 0; that._viewportItemSize = 20; that._viewportItemIndex = -1; that._sizeRatio = 1; that._items = []; that._cache = [] }, option: function() { return this.component.option.apply(this.component, arguments) }, virtualItemsCount: function() { var pageIndex, beginItemsCount, endItemsCount, that = this, itemsCount = 0; if (isVirtualMode(that)) { pageIndex = getBeginPageIndex(that); if (pageIndex < 0) { pageIndex = that._dataSource.pageIndex() } beginItemsCount = pageIndex * that._dataSource.pageSize(); itemsCount = that._cache.length * that._dataSource.pageSize(); endItemsCount = Math.max(0, that._dataSource.totalItemsCount() - itemsCount - beginItemsCount); return { begin: beginItemsCount, end: endItemsCount } } }, _setViewportPositionCore: function(position, isNear) { var that = this, scrollingTimeout = Math.min(that.option("scrolling.timeout") || 0, that._dataSource.changingDuration()); if (isNear && scrollingTimeout < that.option("scrolling.renderingThreshold")) { scrollingTimeout = 10 } clearTimeout(that._scrollTimeoutID); if (scrollingTimeout > 0) { that._scrollTimeoutID = setTimeout(function() { that.setViewportItemIndex(position) }, scrollingTimeout) } else { that.setViewportItemIndex(position) } }, getViewportPosition: function() { return this._position || 0 }, setViewportPosition: function(position) { var that = this, virtualItemsCount = that.virtualItemsCount(), sizeRatio = that._sizeRatio || 1, itemSize = that._viewportItemSize, offset = virtualItemsCount ? Math.floor(virtualItemsCount.begin * itemSize * sizeRatio) : 0; that._position = position; if (virtualItemsCount && position >= offset && position <= offset + that._contentSize) { that._setViewportPositionCore(virtualItemsCount.begin + (position - offset) / itemSize, true) } else { that._setViewportPositionCore(position / (itemSize * sizeRatio)) } }, setContentSize: function(size) { var that = this, virtualItemsCount = that.virtualItemsCount(); that._contentSize = size; if (virtualItemsCount) { var virtualContentSize = (virtualItemsCount.begin + virtualItemsCount.end + that.itemsCount()) * that._viewportItemSize; var contentHeightLimit = exports.getContentHeightLimit(browser); if (virtualContentSize > contentHeightLimit) { that._sizeRatio = contentHeightLimit / virtualContentSize } else { that._sizeRatio = 1 } } }, getContentOffset: function() { var that = this, virtualItemsCount = that.virtualItemsCount(); return virtualItemsCount ? Math.floor(virtualItemsCount.begin * that._viewportItemSize * that._sizeRatio) : 0 }, getVirtualContentSize: function() { var that = this, virtualItemsCount = that.virtualItemsCount(); return virtualItemsCount ? (virtualItemsCount.begin + virtualItemsCount.end) * that._viewportItemSize * that._sizeRatio + that._contentSize : 0 }, getViewportItemIndex: function() { return this._viewportItemIndex }, setViewportItemIndex: function(itemIndex) { var lastPageSize, maxPageIndex, newPageIndex, that = this, pageSize = that._dataSource.pageSize(), pageCount = that._dataSource.pageCount(), virtualMode = isVirtualMode(that), appendMode = isAppendMode(that), totalItemsCount = that._dataSource.totalItemsCount(), needLoad = that._viewportItemIndex < 0; that._viewportItemIndex = itemIndex; if (pageSize && (virtualMode || appendMode) && totalItemsCount >= 0) { if (that._viewportSize && itemIndex + that._viewportSize >= totalItemsCount) { if (that._dataSource.hasKnownLastPage()) { newPageIndex = pageCount - 1; lastPageSize = totalItemsCount % pageSize; if (newPageIndex > 0 && lastPageSize > 0 && lastPageSize < pageSize / 2) { newPageIndex-- } } else { newPageIndex = pageCount } } else { newPageIndex = Math.floor(itemIndex / pageSize); maxPageIndex = pageCount - 1; newPageIndex = Math.max(newPageIndex, 0); newPageIndex = Math.min(newPageIndex, maxPageIndex) } if (that.pageIndex() !== newPageIndex || needLoad) { that.pageIndex(newPageIndex); that.load() } } }, viewportItemSize: function(size) { if (void 0 !== size) { this._viewportItemSize = size } return this._viewportItemSize }, viewportSize: function(size) { if (void 0 !== size) { this._viewportSize = size } return this._viewportSize }, pageIndex: function(pageIndex) { if (isVirtualMode(this) || isAppendMode(this)) { if (void 0 !== pageIndex) { this._pageIndex = pageIndex } return this._pageIndex } else { return this._dataSource.pageIndex(pageIndex) } }, beginPageIndex: function(defaultPageIndex) { var beginPageIndex = getBeginPageIndex(this); if (beginPageIndex < 0) { beginPageIndex = void 0 !== defaultPageIndex ? defaultPageIndex : this.pageIndex() } return beginPageIndex }, endPageIndex: function() { var endPageIndex = getEndPageIndex(this); return endPageIndex > 0 ? endPageIndex : this._lastPageIndex }, load: function() { var pageIndexForLoad, result, dataSource = this._dataSource; if (isVirtualMode(this) || isAppendMode(this)) { pageIndexForLoad = getPageIndexForLoad(this); if (pageIndexForLoad >= 0) { result = loadCore(this, pageIndexForLoad) } dataSource.updateLoading() } else { result = dataSource.load() } if (!result && this._lastPageIndex !== this.pageIndex()) { this._dataSource.onChanged({ changeType: "pageIndex" }) } return result || $.Deferred().resolve() }, loadIfNeed: function() { var that = this; if ((isVirtualMode(that) || isAppendMode(that)) && !that._dataSource.isLoading() && !that._isChangedFiring) { that.load() } }, handleDataChanged: function(callBase) { var beginPageIndex, changeType, removeInvisiblePages, cacheItem, that = this, dataSource = that._dataSource, lastCacheLength = that._cache.length; if (isVirtualMode(that) || isAppendMode(that)) { beginPageIndex = getBeginPageIndex(that); if (beginPageIndex >= 0) { if (isVirtualMode(that) && beginPageIndex + that._cache.length !== dataSource.pageIndex() && beginPageIndex - 1 !== dataSource.pageIndex()) { that._cache = [] } if (isAppendMode(that)) { if (0 === dataSource.pageIndex()) { that._cache = [] } else { if (dataSource.pageIndex() < getEndPageIndex(that)) { fireChanged(that, callBase, { changeType: "append", items: [] }); return } } } } cacheItem = { pageIndex: dataSource.pageIndex(), itemsCount: that.itemsCount(true) }; if (that.option("scrolling.removeInvisiblePages")) { removeInvisiblePages = that._cache.length > Math.max(getPreloadPageCount(this), 2) } else { processDelayChanged(that, callBase, { isDelayed: true }) } if (beginPageIndex === dataSource.pageIndex() + 1) { if (removeInvisiblePages) { that._cache.pop() } else { changeType = "prepend" } that._cache.unshift(cacheItem) } else { if (removeInvisiblePages) { that._cache.shift() } else { changeType = "append" } that._cache.push(cacheItem) } processChanged(that, callBase, that._cache.length > 1 ? changeType : void 0, 0 === lastCacheLength); that.load().done(function() { if (processDelayChanged(that, callBase)) { that.load() } }) } else { processChanged(that, callBase) } }, itemsCount: function(isBase) { var itemsCount = 0; if (!isBase && isVirtualMode(this)) { $.each(this._cache, function() { itemsCount += this.itemsCount }) } else { itemsCount = this._dataSource.itemsCount() } return itemsCount }, reset: function() { this._cache = [] }, subscribeToWindowScrollEvents: function($element) { var that = this; that._windowScroll = that._windowScroll || exports.subscribeToExternalScrollers($element, function(scrollTop) { if (that.viewportItemSize()) { that.setViewportPosition(scrollTop) } }) }, dispose: function() { clearTimeout(this._scrollTimeoutID); this._windowScroll && this._windowScroll.dispose(); this._windowScroll = null }, scrollTo: function(pos) { this._windowScroll && this._windowScroll.scrollTo(pos) } } }()) }, /*!****************************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.filter_row.js ***! \****************************************************/ function(module, exports, __webpack_require__) { var core = __webpack_require__( /*! ./ui.data_grid.core */ 348), filterRowModule = __webpack_require__( /*! ../grid_core/ui.grid_core.filter_row */ 397); core.registerModule("filterRow", filterRowModule) }, /*!****************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.filter_row.js ***! \****************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, modules = __webpack_require__( /*! ./ui.grid_core.modules */ 350), gridCoreUtils = __webpack_require__( /*! ./ui.grid_core.utils */ 349), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), Editor = __webpack_require__( /*! ../editor/editor */ 106), Overlay = __webpack_require__( /*! ../overlay */ 109), Menu = __webpack_require__( /*! ../menu */ 398); var OPERATION_ICONS = { "=": "filter-operation-equals", "<>": "filter-operation-not-equals", "<": "filter-operation-less", "<=": "filter-operation-less-equal", ">": "filter-operation-greater", ">=": "filter-operation-greater-equal", "default": "filter-operation-default", notcontains: "filter-operation-not-contains", contains: "filter-operation-contains", startswith: "filter-operation-starts-with", endswith: "filter-operation-ends-with", between: "filter-operation-between" }; var OPERATION_DESCRIPTORS = { "=": "equal", "<>": "notEqual", "<": "lessThan", "<=": "lessThanOrEqual", ">": "greaterThan", ">=": "greaterThanOrEqual", startswith: "startsWith", contains: "contains", notcontains: "notContains", endswith: "endsWith", between: "between" }; var FILTERING_TIMEOUT = 700, CORRECT_FILTER_RANGE_OVERLAY_WIDTH = 1, FILTER_ROW_CLASS = "filter-row", FILTER_RANGE_OVERLAY_CLASS = "filter-range-overlay", FILTER_RANGE_START_CLASS = "filter-range-start", FILTER_RANGE_END_CLASS = "filter-range-end", MENU_CLASS = "dx-menu", EDITOR_WITH_MENU_CLASS = "dx-editor-with-menu", EDITOR_CONTAINER_CLASS = "dx-editor-container", EDITOR_CELL_CLASS = "dx-editor-cell", FILTER_MENU = "dx-filter-menu", APPLY_BUTTON_CLASS = "dx-apply-button", HIGHLIGHT_OUTLINE_CLASS = "dx-highlight-outline", FOCUSED_CLASS = "dx-focused", CELL_FOCUS_DISABLED_CLASS = "dx-cell-focus-disabled", FILTER_RANGE_CONTENT_CLASS = "dx-filter-range-content", EDITORS_INPUT_SELECTOR = "input:not([type='hidden'])"; function isOnClickApplyFilterMode(that) { return "onClick" === that.option("filterRow.applyFilter") } var ColumnHeadersViewFilterRowExtender = function() { var getEditorInstance = function($editorContainer) { var $editor = $editorContainer && $editorContainer.children(), componentNames = $editor && $editor.data("dxComponents"), editor = componentNames && componentNames.length && $editor.data(componentNames[0]); if (editor instanceof Editor) { return editor } }; var getRangeTextByFilterValue = function(that, column) { var result = "", rangeEnd = "", filterValue = getColumnFilterValue(that, column), formatOptions = gridCoreUtils.getFormatOptionsByColumn(column, "filterRow"); if (Array.isArray(filterValue)) { result = gridCoreUtils.formatValue(filterValue[0], formatOptions); rangeEnd = gridCoreUtils.formatValue(filterValue[1], formatOptions); if ("" !== rangeEnd) { result += " - " + rangeEnd } } else { if (commonUtils.isDefined(filterValue)) { result = gridCoreUtils.formatValue(filterValue, formatOptions) } } return result }; var getColumnFilterValue = function(that, column) { if (column) { return isOnClickApplyFilterMode(that) && void 0 !== column.bufferedFilterValue ? column.bufferedFilterValue : column.filterValue } }; var getColumnSelectedFilterOperation = function(that, column) { if (column) { return isOnClickApplyFilterMode(that) && void 0 !== column.bufferedSelectedFilterOperation ? column.bufferedSelectedFilterOperation : column.selectedFilterOperation } }; var getFilterValue = function(that, columnIndex, $editorContainer) { var column = that._columnsController.columnOption(columnIndex), filterValue = getColumnFilterValue(that, column), isFilterRange = $editorContainer.closest("." + that.addWidgetPrefix(FILTER_RANGE_OVERLAY_CLASS)).length, isRangeStart = $editorContainer.hasClass(that.addWidgetPrefix(FILTER_RANGE_START_CLASS)); if (filterValue && Array.isArray(filterValue) && "between" === getColumnSelectedFilterOperation(that, column)) { if (isRangeStart) { return filterValue[0] } else { return filterValue[1] } } return !isFilterRange && void 0 !== filterValue ? filterValue : null }; var normalizeFilterValue = function(that, filterValue, column, $editorContainer) { if ("between" === getColumnSelectedFilterOperation(that, column)) { var columnFilterValue = getColumnFilterValue(that, column); if ($editorContainer.hasClass(that.addWidgetPrefix(FILTER_RANGE_START_CLASS))) { return [filterValue, Array.isArray(columnFilterValue) ? columnFilterValue[1] : void 0] } else { return [Array.isArray(columnFilterValue) ? columnFilterValue[0] : columnFilterValue, filterValue] } } return filterValue }; var updateFilterValue = function(that, options) { var value = "" === options.value ? null : options.value, $editorContainer = options.container, column = that._columnsController.columnOption(options.column.index), filterValue = getFilterValue(that, column.index, $editorContainer); if (!commonUtils.isDefined(filterValue) && !commonUtils.isDefined(value)) { return } that._applyFilterViewController.setHighLight($editorContainer, filterValue !== value); that._columnsController.columnOption(column.index, isOnClickApplyFilterMode(that) ? "bufferedFilterValue" : "filterValue", normalizeFilterValue(that, value, column, $editorContainer), options.notFireEvent) }; return { _updateEditorValue: function(column, $editorContainer) { var that = this, editor = getEditorInstance($editorContainer); editor && editor.option("value", getFilterValue(that, column.index, $editorContainer)) }, _columnOptionChanged: function(e) { var overlayInstance, visibleIndex, column, $cell, $editorContainer, $editorRangeElements, $menu, that = this, optionNames = e.optionNames; if (gridCoreUtils.checkChanges(optionNames, ["filterValue", "bufferedFilterValue", "selectedFilterOperation", "bufferedSelectedFilterOperation"]) && void 0 !== e.columnIndex) { visibleIndex = that._columnsController.getVisibleIndex(e.columnIndex); column = that._columnsController.columnOption(e.columnIndex); $cell = that.getCellElement(that.element().find("." + that.addWidgetPrefix(FILTER_ROW_CLASS)).index(), visibleIndex) || $(); $editorContainer = $cell.find("." + EDITOR_CONTAINER_CLASS).first(); if (optionNames.filterValue || optionNames.bufferedFilterValue) { that._updateEditorValue(column, $editorContainer); overlayInstance = $cell.find("." + that.addWidgetPrefix(FILTER_RANGE_OVERLAY_CLASS)).data("dxOverlay"); if (overlayInstance) { $editorRangeElements = overlayInstance.content().find("." + EDITOR_CONTAINER_CLASS); that._updateEditorValue(column, $editorRangeElements.first()); that._updateEditorValue(column, $editorRangeElements.last()) } if (!overlayInstance || !overlayInstance.option("visible")) { that._updateFilterRangeContent($cell, getRangeTextByFilterValue(that, column)) } } if (optionNames.selectedFilterOperation || optionNames.bufferedSelectedFilterOperation) { if (visibleIndex >= 0 && column) { $menu = $cell.find("." + MENU_CLASS); if ($menu.length) { that._updateFilterOperationChooser($menu, column, $editorContainer); if ("between" === getColumnSelectedFilterOperation(that, column)) { that._renderFilterRangeContent($cell, column) } else { if ($editorContainer.find("." + FILTER_RANGE_CONTENT_CLASS).length) { that._renderEditor($editorContainer, that._getEditorOptions($editorContainer, column)); that._hideFilterRange() } } } } } return } that.callBase(e) }, _renderCore: function() { this._filterRangeOverlayInstance = null; this.callBase.apply(this, arguments) }, _resizeCore: function() { this.callBase.apply(this, arguments); this._filterRangeOverlayInstance && this._filterRangeOverlayInstance.repaint() }, isFilterRowVisible: function() { return this._isElementVisible(this.option("filterRow")) }, isVisible: function() { return this.callBase() || this.isFilterRowVisible() }, init: function() { this.callBase(); this._applyFilterViewController = this.getController("applyFilter") }, _initFilterRangeOverlay: function($cell, column) { var that = this, sharedData = {}, $editorContainer = $cell.find(".dx-editor-container"), $overlay = $("<div>").addClass(that.addWidgetPrefix(FILTER_RANGE_OVERLAY_CLASS)).appendTo($cell); return that._createComponent($overlay, Overlay, { height: "auto", shading: false, showTitle: false, focusStateEnabled: false, closeOnTargetScroll: true, closeOnOutsideClick: true, animation: false, position: { my: "top", at: "top", of: $editorContainer.length && $editorContainer || $cell, offset: "0 -1" }, contentTemplate: function(contentElement) { var editorOptions, $editor = $("<div>").addClass(EDITOR_CONTAINER_CLASS + " " + that.addWidgetPrefix(FILTER_RANGE_START_CLASS)).appendTo(contentElement); column = that._columnsController.columnOption(column.index); editorOptions = that._getEditorOptions($editor, column); editorOptions.sharedData = sharedData; that._renderEditor($editor, editorOptions); $editor.find(EDITORS_INPUT_SELECTOR).on("keydown", function(e) { var $prevElement = $cell.find("[tabindex]").not(e.target).first(); if (9 === e.which && e.shiftKey) { e.preventDefault(); that._hideFilterRange(); if (!$prevElement.length) { $prevElement = $cell.prev().find("[tabindex]").last() } $prevElement.focus() } }); $editor = $("<div>").addClass(EDITOR_CONTAINER_CLASS + " " + that.addWidgetPrefix(FILTER_RANGE_END_CLASS)).appendTo(contentElement); editorOptions = that._getEditorOptions($editor, column); editorOptions.sharedData = sharedData; that._renderEditor($editor, editorOptions); $editor.find(EDITORS_INPUT_SELECTOR).on("keydown", function(e) { if (9 === e.which && !e.shiftKey) { e.preventDefault(); that._hideFilterRange(); $cell.next().find("[tabindex]").first().focus() } }); return contentElement.addClass(that.getWidgetContainerClass()) }, onShown: function(e) { var $editor = e.component.content().find("." + EDITOR_CONTAINER_CLASS).first(); $editor.find(EDITORS_INPUT_SELECTOR).focus() }, onHidden: function() { column = that._columnsController.columnOption(column.index); $cell.find("." + MENU_CLASS).parent().addClass(EDITOR_WITH_MENU_CLASS); if ("between" === getColumnSelectedFilterOperation(that, column)) { that._updateFilterRangeContent($cell, getRangeTextByFilterValue(that, column)); that.component.updateDimensions() } } }) }, _updateFilterRangeOverlay: function(options) { var overlayInstance = this._filterRangeOverlayInstance; overlayInstance && overlayInstance.option(options) }, _showFilterRange: function($cell, column) { var that = this, $overlay = $cell.children("." + that.addWidgetPrefix(FILTER_RANGE_OVERLAY_CLASS)), overlayInstance = $overlay.length && $overlay.data("dxOverlay"); if (!overlayInstance && column) { overlayInstance = that._initFilterRangeOverlay($cell, column) } if (!overlayInstance.option("visible")) { that._filterRangeOverlayInstance && that._filterRangeOverlayInstance.hide(); that._filterRangeOverlayInstance = overlayInstance; that._updateFilterRangeOverlay({ width: $cell.outerWidth(true) + CORRECT_FILTER_RANGE_OVERLAY_WIDTH }); that._filterRangeOverlayInstance && that._filterRangeOverlayInstance.show() } }, _hideFilterRange: function() { var overlayInstance = this._filterRangeOverlayInstance; overlayInstance && overlayInstance.hide() }, getFilterRangeOverlayInstance: function() { return this._filterRangeOverlayInstance }, _createRow: function(row) { var $row = this.callBase(row); if ("filter" === row.rowType) { $row.addClass(this.addWidgetPrefix(FILTER_ROW_CLASS)) } return $row }, _getRows: function() { var result = this.callBase(); if (this.isFilterRowVisible()) { result.push({ rowType: "filter" }) } return result }, _renderCellContent: function($cell, options) { var $container, $editorContainer, that = this, column = options.column; if ("filter" === options.rowType) { if (column.command) { $cell.html(" ") } else { if (column.allowFiltering) { that.setAria("label", messageLocalization.format("dxDataGrid-ariaColumn") + " " + column.caption + ", " + messageLocalization.format("dxDataGrid-ariaFilterCell"), $cell); $cell.addClass(EDITOR_CELL_CLASS); $container = $("<div>").appendTo($cell); $editorContainer = $("<div>").addClass(EDITOR_CONTAINER_CLASS).appendTo($container); if ("between" === getColumnSelectedFilterOperation(that, column)) { that._renderFilterRangeContent($cell, column) } else { that._renderEditor($editorContainer, that._getEditorOptions($editorContainer, column)) } if (column.alignment) { $cell.find(EDITORS_INPUT_SELECTOR).first().css("text-align", column.alignment) } if (column.filterOperations && column.filterOperations.length) { that._renderFilterOperationChooser($container, column, $editorContainer) } } } } that.callBase($cell, options) }, _getEditorOptions: function($editorContainer, column) { var that = this, result = extend({}, column, { value: getFilterValue(that, column.index, $editorContainer), parentType: "filterRow", showAllText: that.option("filterRow.showAllText"), updateValueTimeout: "onClick" === that.option("filterRow.applyFilter") ? 0 : FILTERING_TIMEOUT, width: null, setValue: function(value, notFireEvent) { updateFilterValue(that, { column: column, value: value, container: $editorContainer, notFireEvent: notFireEvent }) } }); if ("between" === getColumnSelectedFilterOperation(that, column)) { if ($editorContainer.hasClass(that.addWidgetPrefix(FILTER_RANGE_START_CLASS))) { result.placeholder = that.option("filterRow.betweenStartText") } else { result.placeholder = that.option("filterRow.betweenEndText") } } return result }, _renderEditor: function($editorContainer, options) { $editorContainer.empty(); return this.getController("editorFactory").createEditor($("<div>").appendTo($editorContainer), options) }, _renderFilterRangeContent: function($cell, column) { var that = this, $editorContainer = $cell.find("." + EDITOR_CONTAINER_CLASS).first(); $editorContainer.empty(); $("<div>").addClass(FILTER_RANGE_CONTENT_CLASS).attr("tabindex", this.option("tabIndex")).on("focusin", function() { that._showFilterRange($cell, column) }).appendTo($editorContainer); that._updateFilterRangeContent($cell, getRangeTextByFilterValue(that, column)) }, _updateFilterRangeContent: function($cell, value) { var $filterRangeContent = $cell.find("." + FILTER_RANGE_CONTENT_CLASS); if ($filterRangeContent.length) { if ("" === value) { $filterRangeContent.html(" ") } else { $filterRangeContent.text(value) } } }, _updateFilterOperationChooser: function($menu, column, $editorContainer) { var isCellWasFocused, that = this; that._createComponent($menu, Menu, { integrationOptions: {}, activeStateEnabled: false, selectionMode: "single", cssClass: that.getWidgetContainerClass() + " " + CELL_FOCUS_DISABLED_CLASS + " " + FILTER_MENU, showFirstSubmenuMode: "onHover", hideSubmenuOnMouseLeave: true, items: [{ disabled: column.filterOperations && column.filterOperations.length ? false : true, icon: OPERATION_ICONS[getColumnSelectedFilterOperation(that, column) || "default"], selectable: false, items: that._getFilterOperationMenuItems(column) }], onItemClick: function(properties) { var selectedFilterOperation = properties.itemData.name, columnSelectedFilterOperation = getColumnSelectedFilterOperation(that, column), notFocusEditor = false, isOnClickMode = isOnClickApplyFilterMode(that), options = {}; if (properties.itemData.items || selectedFilterOperation && selectedFilterOperation === columnSelectedFilterOperation) { return } if (selectedFilterOperation) { options[isOnClickMode ? "bufferedSelectedFilterOperation" : "selectedFilterOperation"] = selectedFilterOperation; if ("between" === selectedFilterOperation || "between" === columnSelectedFilterOperation) { notFocusEditor = "between" === selectedFilterOperation; options[isOnClickMode ? "bufferedFilterValue" : "filterValue"] = null } } else { options[isOnClickMode ? "bufferedSelectedFilterOperation" : "selectedFilterOperation"] = column.defaultSelectedFilterOperation || null; options[isOnClickMode ? "bufferedFilterValue" : "filterValue"] = null } that._columnsController.columnOption(column.index, options); that._applyFilterViewController.setHighLight($editorContainer, true); if (!selectedFilterOperation) { var editor = getEditorInstance($editorContainer); if (editor && "dxDateBox" === editor.NAME && !editor.option("isValid")) { editor.reset(); editor.option("isValid", true) } } if (!notFocusEditor) { that._focusEditor($editorContainer) } else { that._showFilterRange($editorContainer.closest("." + EDITOR_CELL_CLASS), column) } }, onSubmenuShown: function() { isCellWasFocused = that._isEditorFocused($editorContainer); that.getController("editorFactory").loseFocus() }, onSubmenuHiding: function() { $menu.blur(); Menu.getInstance($menu).option("focusedElement", null); isCellWasFocused && that._focusEditor($editorContainer) }, rtlEnabled: that.option("rtlEnabled") }) }, _isEditorFocused: function($container) { return $container.hasClass(FOCUSED_CLASS) || $container.parents("." + FOCUSED_CLASS).length }, _focusEditor: function($container) { this.getController("editorFactory").focus($container); $container.find(EDITORS_INPUT_SELECTOR).focus() }, _renderFilterOperationChooser: function($container, column, $editorContainer) { var $menu, that = this; if (that.option("filterRow.showOperationChooser")) { $container.addClass(EDITOR_WITH_MENU_CLASS); $menu = $("<div>").prependTo($container); that._updateFilterOperationChooser($menu, column, $editorContainer) } }, _getFilterOperationMenuItems: function(column) { var that = this, result = [{}], filterRowOptions = that.option("filterRow"), operationDescriptions = filterRowOptions && filterRowOptions.operationDescriptions || {}; if (column.filterOperations && column.filterOperations.length) { result = $.map(column.filterOperations, function(value) { var descriptionName = OPERATION_DESCRIPTORS[value]; return { name: value, selected: (getColumnSelectedFilterOperation(that, column) || column.defaultFilterOperation) === value, text: operationDescriptions[descriptionName], icon: OPERATION_ICONS[value] } }); result.push({ name: null, text: filterRowOptions && filterRowOptions.resetOperationText, icon: OPERATION_ICONS.default }) } return result }, optionChanged: function(args) { var that = this; switch (args.name) { case "filterRow": case "showColumnLines": this._invalidate(true, true); args.handled = true; break; default: that.callBase(args) } } } }(); var DataControllerFilterRowExtender = { _calculateAdditionalFilter: function() { var that = this, filters = [that.callBase()], columns = that._columnsController.getVisibleColumns(); $.each(columns, function() { var filter; if (this.allowFiltering && this.calculateFilterExpression && commonUtils.isDefined(this.filterValue)) { filter = this.createFilterExpression(this.filterValue, this.selectedFilterOperation || this.defaultFilterOperation, "filterRow"); filters.push(filter) } }); return gridCoreUtils.combineFilters(filters) } }; exports.ApplyFilterViewController = modules.ViewController.inherit({ _getHeaderPanel: function() { if (!this._headerPanel) { this._headerPanel = this.getView("headerPanel") } return this._headerPanel }, setHighLight: function($element, value) { if (isOnClickApplyFilterMode(this)) { $element && $element.toggleClass(HIGHLIGHT_OUTLINE_CLASS, value); this._getHeaderPanel().enableApplyButton(value) } }, applyFilter: function() { var columnsController = this.getController("columns"), columns = columnsController.getColumns(); columnsController.beginUpdate(); for (var i = 0; i < columns.length; i++) { if (void 0 !== columns[i].bufferedFilterValue) { columnsController.columnOption(i, "filterValue", columns[i].bufferedFilterValue); columns[i].bufferedFilterValue = void 0 } if (void 0 !== columns[i].bufferedSelectedFilterOperation) { columnsController.columnOption(i, "selectedFilterOperation", columns[i].bufferedSelectedFilterOperation); columns[i].bufferedSelectedFilterOperation = void 0 } } columnsController.endUpdate(); this.removeHighLights() }, removeHighLights: function() { if (isOnClickApplyFilterMode(this)) { var columnHeadersView = this.getView("columnHeadersView"); columnHeadersView.element().find("." + this.addWidgetPrefix(FILTER_ROW_CLASS) + " ." + HIGHLIGHT_OUTLINE_CLASS).removeClass(HIGHLIGHT_OUTLINE_CLASS); this._getHeaderPanel().enableApplyButton(false) } } }); module.exports = { defaultOptions: function() { return { filterRow: { visible: false, showOperationChooser: true, showAllText: messageLocalization.format("dxDataGrid-filterRowShowAllText"), resetOperationText: messageLocalization.format("dxDataGrid-filterRowResetOperationText"), applyFilter: "auto", applyFilterText: messageLocalization.format("dxDataGrid-applyFilterText"), operationDescriptions: { equal: messageLocalization.format("dxDataGrid-filterRowOperationEquals"), notEqual: messageLocalization.format("dxDataGrid-filterRowOperationNotEquals"), lessThan: messageLocalization.format("dxDataGrid-filterRowOperationLess"), lessThanOrEqual: messageLocalization.format("dxDataGrid-filterRowOperationLessOrEquals"), greaterThan: messageLocalization.format("dxDataGrid-filterRowOperationGreater"), greaterThanOrEqual: messageLocalization.format("dxDataGrid-filterRowOperationGreaterOrEquals"), startsWith: messageLocalization.format("dxDataGrid-filterRowOperationStartsWith"), contains: messageLocalization.format("dxDataGrid-filterRowOperationContains"), notContains: messageLocalization.format("dxDataGrid-filterRowOperationNotContains"), endsWith: messageLocalization.format("dxDataGrid-filterRowOperationEndsWith"), between: messageLocalization.format("dxDataGrid-filterRowOperationBetween") }, betweenStartText: messageLocalization.format("dxDataGrid-filterRowOperationBetweenStartText"), betweenEndText: messageLocalization.format("dxDataGrid-filterRowOperationBetweenEndText") } } }, controllers: { applyFilter: exports.ApplyFilterViewController }, extenders: { controllers: { data: DataControllerFilterRowExtender, columnsResizer: { _startResizing: function() { var cellIndex, overlayInstance, that = this; that.callBase.apply(that, arguments); if (that.isResizing()) { overlayInstance = that._columnHeadersView.getFilterRangeOverlayInstance(); if (overlayInstance) { cellIndex = overlayInstance.element().closest("td").index(); if (cellIndex === that._targetPoint.columnIndex || cellIndex === that._targetPoint.columnIndex + 1) { overlayInstance.content().hide() } } } }, _endResizing: function() { var $cell, overlayInstance, that = this; if (that.isResizing()) { overlayInstance = that._columnHeadersView.getFilterRangeOverlayInstance(); if (overlayInstance) { $cell = overlayInstance.element().closest("td"); that._columnHeadersView._updateFilterRangeOverlay({ width: $cell.outerWidth(true) + CORRECT_FILTER_RANGE_OVERLAY_WIDTH }); overlayInstance.content().show() } } that.callBase.apply(that, arguments) } } }, views: { columnHeadersView: ColumnHeadersViewFilterRowExtender, headerPanel: { _getToolbarItems: function() { var items = this.callBase(), filterItem = this._prepareFilterItem(items); return filterItem.concat(items) }, _prepareFilterItem: function() { var that = this, filterItem = []; if (that._isShowApplyFilterButton()) { var hintText = that.option("filterRow.applyFilterText"), columns = that._columnsController.getColumns(), disabled = !columns.filter(function(column) { return void 0 !== column.bufferedFilterValue }).length, onInitialized = function(e) { e.element.addClass(that._getToolbarButtonClass(APPLY_BUTTON_CLASS)) }, onClickHandler = function() { that._applyFilterViewController.applyFilter() }, toolbarItem = { widget: "dxButton", options: { icon: "apply-filter", disabled: disabled, onClick: onClickHandler, hint: hintText, text: hintText, onInitialized: onInitialized }, showText: "inMenu", name: "applyFilterButton", location: "after", locateInMenu: "auto", sortIndex: 10 }; filterItem.push(toolbarItem) } return filterItem }, _isShowApplyFilterButton: function() { var filterRowOptions = this.option("filterRow"); return filterRowOptions && filterRowOptions.visible && "onClick" === filterRowOptions.applyFilter }, init: function() { this.callBase(); this._dataController = this.getController("data"); this._applyFilterViewController = this.getController("applyFilter") }, enableApplyButton: function(value) { this.setToolbarItemDisabled("applyFilterButton", !value) }, isVisible: function() { return this.callBase() || this._isShowApplyFilterButton() }, optionChanged: function(args) { if ("filterRow" === args.name) { this._invalidate(); args.handled = true } else { this.callBase(args) } } } } } } }, /*!***********************!*\ !*** ./js/ui/menu.js ***! \***********************/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__( /*! ./menu/ui.menu */ 399) }, /*!*******************************!*\ !*** ./js/ui/menu/ui.menu.js ***! \*******************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), typeUtils = __webpack_require__( /*! ../../core/utils/type */ 12), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, eventUtils = __webpack_require__( /*! ../../events/utils */ 71), pointerEvents = __webpack_require__( /*! ../../events/pointer */ 76), hoverEvents = __webpack_require__( /*! ../../events/hover */ 103), MenuBase = __webpack_require__( /*! ../context_menu/ui.menu_base */ 340), Overlay = __webpack_require__( /*! ../overlay */ 109), Submenu = __webpack_require__( /*! ./ui.submenu */ 400), Button = __webpack_require__( /*! ../button */ 201), TreeView = __webpack_require__( /*! ../tree_view */ 380); var DX_MENU_CLASS = "dx-menu", DX_MENU_VERTICAL_CLASS = DX_MENU_CLASS + "-vertical", DX_MENU_HORIZONTAL_CLASS = DX_MENU_CLASS + "-horizontal", DX_MENU_ITEM_CLASS = DX_MENU_CLASS + "-item", DX_MENU_ITEMS_CONTAINER_CLASS = DX_MENU_CLASS + "-items-container", DX_MENU_ITEM_EXPANDED_CLASS = DX_MENU_ITEM_CLASS + "-expanded", DX_CONTEXT_MENU_CLASS = "dx-context-menu", DX_CONTEXT_MENU_CONTAINER_BORDER_CLASS = DX_CONTEXT_MENU_CLASS + "-container-border", DX_CONTEXT_MENU_CONTENT_DELIMITER_CLASS = "dx-context-menu-content-delimiter", DX_SUBMENU_CLASS = "dx-submenu", DX_STATE_DISABLED_CLASS = "dx-state-disabled", DX_STATE_HOVER_CLASS = "dx-state-hover", DX_STATE_ACTIVE_CLASS = "dx-state-active", DX_ADAPTIVE_MODE_CLASS = DX_MENU_CLASS + "-adaptive-mode", DX_ADAPTIVE_HAMBURGER_BUTTON_CLASS = DX_MENU_CLASS + "-hamburger-button", FOCUS_UP = "up", FOCUS_DOWN = "down", FOCUS_LEFT = "left", FOCUS_RIGHT = "right", SHOW_SUBMENU_OPERATION = "showSubmenu", NEXTITEM_OPERATION = "nextItem", PREVITEM_OPERATION = "prevItem", DEFAULT_DELAY = { show: 50, hide: 300 }, ACTIONS = ["onSubmenuShowing", "onSubmenuShown", "onSubmenuHiding", "onSubmenuHidden", "onItemContextMenu", "onItemClick", "onSelectionChanged"]; var Menu = MenuBase.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { orientation: "horizontal", submenuDirection: "auto", showFirstSubmenuMode: { name: "onClick", delay: { show: 50, hide: 300 } }, hideSubmenuOnMouseLeave: false, onSubmenuShowing: null, onSubmenuShown: null, onSubmenuHiding: null, onSubmenuHidden: null, adaptivityEnabled: false }) }, _setOptionsByReference: function() { this.callBase(); extend(this._optionsByReference, { animation: true, selectedItem: true }) }, _itemElements: function() { var rootMenuElements = this.callBase(), submenuElements = this._submenuItemElements(); return rootMenuElements.add(submenuElements) }, _submenuItemElements: function() { var elements = [], itemSelector = "." + DX_MENU_ITEM_CLASS, currentSubmenu = this._submenus.length && this._submenus[0]; if (currentSubmenu && currentSubmenu.itemsContainer()) { elements = currentSubmenu.itemsContainer().find(itemSelector) } return elements }, _focusTarget: function() { return this.element() }, _isMenuHorizontal: function() { return "horizontal" === this.option("orientation") }, _moveFocus: function(location) { var argument, operation, navigationAction, $newTarget, $items = this._getAvailableItems(), isMenuHorizontal = this._isMenuHorizontal(), $activeItem = this._getActiveItem(true); switch (location) { case FOCUS_UP: operation = isMenuHorizontal ? SHOW_SUBMENU_OPERATION : this._getItemsNavigationOperation(PREVITEM_OPERATION); argument = isMenuHorizontal ? $activeItem : $items; navigationAction = this._getKeyboardNavigationAction(operation, argument); $newTarget = navigationAction(); break; case FOCUS_DOWN: operation = isMenuHorizontal ? SHOW_SUBMENU_OPERATION : this._getItemsNavigationOperation(NEXTITEM_OPERATION); argument = isMenuHorizontal ? $activeItem : $items; navigationAction = this._getKeyboardNavigationAction(operation, argument); $newTarget = navigationAction(); break; case FOCUS_RIGHT: operation = isMenuHorizontal ? this._getItemsNavigationOperation(NEXTITEM_OPERATION) : SHOW_SUBMENU_OPERATION; argument = isMenuHorizontal ? $items : $activeItem; navigationAction = this._getKeyboardNavigationAction(operation, argument); $newTarget = navigationAction(); break; case FOCUS_LEFT: operation = isMenuHorizontal ? this._getItemsNavigationOperation(PREVITEM_OPERATION) : SHOW_SUBMENU_OPERATION; argument = isMenuHorizontal ? $items : $activeItem; navigationAction = this._getKeyboardNavigationAction(operation, argument); $newTarget = navigationAction(); break; default: return this.callBase(location) } if ($newTarget && 0 !== $newTarget.length) { this.option("focusedElement", $newTarget) } }, _getItemsNavigationOperation: function(operation) { var navOperation = operation; if (this.option("rtlEnabled")) { navOperation = operation === PREVITEM_OPERATION ? NEXTITEM_OPERATION : PREVITEM_OPERATION } return navOperation }, _getKeyboardNavigationAction: function(operation, argument) { var action = commonUtils.noop; switch (operation) { case SHOW_SUBMENU_OPERATION: if (!argument.hasClass(DX_STATE_DISABLED_CLASS)) { action = this._showSubmenu.bind(this, argument) } break; case NEXTITEM_OPERATION: action = this._nextItem.bind(this, argument); break; case PREVITEM_OPERATION: action = this._prevItem.bind(this, argument) } return action }, _clean: function() { this.callBase(); this.option("templatesRenderAsynchronously") && clearTimeout(this._resizeEventTimer) }, _visibilityChanged: function(visible) { if (visible) { this._dimensionChanged() } }, _isAdaptivityEnabled: function() { return this.option("adaptivityEnabled") && "horizontal" === this.option("orientation") }, _dimensionChanged: function() { if (!this._isAdaptivityEnabled()) { return } var $menuItems = this.element().find("ul").first().children("li").children("." + DX_MENU_ITEM_CLASS), menuItemsWidth = 0, containerWidth = this.element().outerWidth(); $menuItems.each(function(_, menuItem) { menuItemsWidth += $(menuItem).outerWidth(true) }); this._toggleAdaptiveMode(menuItemsWidth > containerWidth) }, _init: function() { this.callBase(); this._submenus = [] }, _initActions: function() { this._actions = {}; $.each(ACTIONS, function(index, action) { this._actions[action] = this._createActionByOption(action) }.bind(this)) }, _render: function() { this._visibleSubmenu = null; this.callBase(); this.element().addClass(DX_MENU_CLASS); this._isAdaptivityEnabled() && this._initAdaptivity(); this.setAria("role", "menubar") }, _renderHamburgerButton: function() { this._hamburger = new Button($("<div>", { "class": DX_ADAPTIVE_HAMBURGER_BUTTON_CLASS }), { icon: "menu", activeStateEnabled: false, onClick: this._toggleTreeView.bind(this) }); return this._hamburger.element() }, _toggleTreeView: function(state) { if (typeUtils.isPlainObject(state)) { state = !this._overlay.option("visible") } this._overlay.option("visible", state); this._toggleHamburgerActiveState(state) }, _toggleHamburgerActiveState: function(state) { this._hamburger && this._hamburger.element().toggleClass(DX_STATE_ACTIVE_CLASS, state) }, _toggleAdaptiveMode: function(state) { var $menuItemsContainer = this.element().find("." + DX_MENU_HORIZONTAL_CLASS), $adaptiveElements = this.element().find("." + DX_ADAPTIVE_MODE_CLASS); if (state) { this._hideVisibleSubmenu() } else { this._treeView && this._treeView.collapseAll(); this._overlay && this._toggleTreeView(state) } $menuItemsContainer.toggle(!state); $adaptiveElements.toggle(state) }, _removeAdaptivity: function() { if (!this._$adaptiveContainer) { return } this._toggleAdaptiveMode(false); this._$adaptiveContainer.remove(); this._$adaptiveContainer = null; this._treeView = null; this._hamburger = null; this._overlay = null }, _treeviewItemClickHandler: function(e) { this._actions.onItemClick(e); if (!e.node.children.length) { this._toggleTreeView(false) } }, _getAdaptiveOverlayOptions: function() { var rtl = this.option("rtlEnabled"), position = rtl ? "right" : "left"; return { deferRendering: false, shading: false, animation: false, closeOnTargetScroll: true, onHidden: function() { this._toggleHamburgerActiveState(false) }.bind(this), height: "auto", closeOnOutsideClick: function(e) { return !!!$(e.target).closest("." + DX_ADAPTIVE_HAMBURGER_BUTTON_CLASS).length }, position: { collision: "flipfit", at: "bottom " + position, my: "top " + position, of: this._hamburger.element() } } }, _getTreeViewOptions: function() { var menuOptions = {}, that = this, optionsToTransfer = ["rtlEnabled", "width", "accessKey", "activeStateEnabled", "animation", "dataSource", "disabled", "displayExpr", "displayExpr", "focusStateEnabled", "hint", "hoverStateEnabled", "itemsExpr", "items", "itemTemplate", "selectedExpr", "selectionMode", "tabIndex", "visible"], actionsToTransfer = ["onItemContextMenu", "onSelectionChanged"]; $.each(optionsToTransfer, function(_, option) { menuOptions[option] = that.option(option) }); $.each(actionsToTransfer, function(_, actionName) { menuOptions[actionName] = function(e) { this._actions[actionName](e) }.bind(that) }); return extend(menuOptions, { animationEnabled: !!this.option("animation"), onItemClick: that._treeviewItemClickHandler.bind(that), onItemExpanded: function(e) { this._overlay.repaint(); this._actions.onSubmenuShown(e) }.bind(that), onItemCollapsed: function(e) { this._overlay.repaint(); this._actions.onSubmenuHidden(e) }.bind(that), selectNodesRecursive: false, selectByClick: this.option("selectByClick"), expandEvent: "click" }) }, _initAdaptivity: function() { if (!this._isAdaptivityEnabled()) { return } this._$adaptiveContainer = $("<div>", { "class": DX_ADAPTIVE_MODE_CLASS }); var $hamburger = this._renderHamburgerButton(); this._treeView = this._createComponent($("<div>"), TreeView, this._getTreeViewOptions()); this._overlay = this._createComponent($("<div>"), Overlay, this._getAdaptiveOverlayOptions()); this._overlay.content().append(this._treeView.element()).addClass(DX_ADAPTIVE_MODE_CLASS).addClass(this.option("cssClass")); this._$adaptiveContainer.append($hamburger); this._$adaptiveContainer.append(this._overlay.element()); this.element().append(this._$adaptiveContainer); if (this.option("templatesRenderAsynchronously")) { this._resizeEventTimer = setTimeout(function() { this._dimensionChanged() }.bind(this), 0) } else { this._dimensionChanged() } }, _getDelay: function(delayType) { var delay = this.option("showFirstSubmenuMode").delay; if (!commonUtils.isDefined(delay)) { return DEFAULT_DELAY[delayType] } else { return commonUtils.isObject(delay) ? delay[delayType] : delay } }, _renderContainer: function() { var $wrapper = $("<div>"); $wrapper.appendTo(this.element()).addClass(this._isMenuHorizontal() ? DX_MENU_HORIZONTAL_CLASS : DX_MENU_VERTICAL_CLASS); return this.callBase($wrapper) }, _renderSubmenuItems: function(node, $itemFrame) { var submenu = this._createSubmenu(node, $itemFrame); this._submenus.push(submenu); this._renderBorderElement($itemFrame); return submenu }, _createSubmenu: function(node, $rootItem) { var $submenuContainer = $("<div>").addClass(DX_CONTEXT_MENU_CLASS).appendTo($rootItem); var items = this._getChildNodes(node), result = this._createComponent($submenuContainer, Submenu, extend(this._getSubmenuOptions(), { _dataAdapter: this._dataAdapter, _parentKey: node.internalFields.key, items: items, onHoverStart: this._clearTimeouts.bind(this), position: this.getSubmenuPosition($rootItem) })); this._attachSubmenuHandlers($rootItem, result); return result }, _getSubmenuOptions: function() { var $submenuTarget = $("<div>"), isMenuHorizontal = this._isMenuHorizontal(); return { itemTemplate: this.option("itemTemplate"), target: $submenuTarget, orientation: this.option("orientation"), selectionMode: this.option("selectionMode"), cssClass: this.option("cssClass"), selectByClick: this.option("selectByClick"), hoverStateEnabled: this.option("hoverStateEnabled"), activeStateEnabled: this.option("activeStateEnabled"), focusStateEnabled: this.option("focusStateEnabled"), animation: this.option("animation"), showSubmenuMode: this.option("showSubmenuMode"), displayExpr: this.option("displayExpr"), disabledExpr: this.option("disabledExpr"), selectedExpr: this.option("selectedExpr"), itemsExpr: this.option("itemsExpr"), onSelectionChanged: this._nestedItemOnSelectionChangedHandler.bind(this), onItemClick: this._nestedItemOnItemClickHandler.bind(this), onItemRendered: this.option("onItemRendered"), onLeftFirstItem: isMenuHorizontal ? null : this._moveMainMenuFocus.bind(this, PREVITEM_OPERATION), onLeftLastItem: isMenuHorizontal ? null : this._moveMainMenuFocus.bind(this, NEXTITEM_OPERATION), onCloseRootSubmenu: this._moveMainMenuFocus.bind(this, isMenuHorizontal ? PREVITEM_OPERATION : null), onExpandLastSubmenu: isMenuHorizontal ? this._moveMainMenuFocus.bind(this, NEXTITEM_OPERATION) : null, _hideDelimiter: this.option("_hideDelimiter") } }, _getShowFirstSubmenuMode: function() { if (!this._isDesktopDevice()) { return "onClick" } var optionValue = this.option("showFirstSubmenuMode"); return commonUtils.isObject(optionValue) ? optionValue.name : optionValue }, _moveMainMenuFocus: function(direction) { var $items = this._getAvailableItems(), itemCount = $items.length, $currentItem = $items.filter("." + DX_MENU_ITEM_EXPANDED_CLASS).eq(0), itemIndex = $items.index($currentItem); itemIndex += direction === PREVITEM_OPERATION ? -1 : 1; if (itemIndex >= itemCount) { itemIndex = 0 } else { if (itemIndex < 0) { itemIndex = itemCount - 1 } } var $newItem = $items.eq(itemIndex); this._hideSubmenu(this._visibleSubmenu); this.focus(); this.option("focusedElement", $newItem) }, _nestedItemOnSelectionChangedHandler: function(args) { var selectedItem = args.addedItems.length && args.addedItems[0], submenu = Submenu.getInstance(args.element), onSelectionChanged = this._actions.onSelectionChanged; onSelectionChanged(args); selectedItem && this._clearSelectionInSubmenus(selectedItem[0], submenu); this._clearRootSelection(); this._setOptionSilent("selectedItem", selectedItem) }, _clearSelectionInSubmenus: function(item, targetSubmenu) { var that = this, cleanAllSubmenus = !arguments.length; $.each(this._submenus, function(index, submenu) { var $submenu = submenu._itemContainer(), isOtherItem = !$submenu.is(targetSubmenu && targetSubmenu._itemContainer()), $selectedItem = $submenu.find("." + that._selectedItemClass()); if (isOtherItem && $selectedItem.length || cleanAllSubmenus) { var selectedItemData; $selectedItem.removeClass(that._selectedItemClass()); selectedItemData = that._getItemData($selectedItem); if (selectedItemData) { selectedItemData.selected = false } submenu._clearSelectedItems() } }) }, _clearRootSelection: function() { var $prevSelectedItem = this.element().find("." + DX_MENU_ITEMS_CONTAINER_CLASS).first().children().children().filter("." + this._selectedItemClass()); if ($prevSelectedItem.length) { var prevSelectedItemData; prevSelectedItemData = this._getItemData($prevSelectedItem); prevSelectedItemData.selected = false; $prevSelectedItem.removeClass(this._selectedItemClass()) } }, _nestedItemOnItemClickHandler: function(e) { this._actions.onItemClick(e) }, _attachSubmenuHandlers: function($rootItem, submenu) { var that = this, $submenuOverlayContent = submenu.getOverlayContent(), submenus = $submenuOverlayContent.find("." + DX_SUBMENU_CLASS), submenuMouseLeaveName = eventUtils.addNamespace(hoverEvents.end, this.NAME + "_submenu"); submenu.option({ onShowing: this._submenuOnShowingHandler.bind(this, $rootItem, submenu), onShown: this._submenuOnShownHandler.bind(this, $rootItem, submenu), onHiding: this._submenuOnHidingHandler.bind(this, $rootItem, submenu), onHidden: this._submenuOnHiddenHandler.bind(this, $rootItem, submenu) }); $.each(submenus, function(index, submenu) { $(submenu).off(submenuMouseLeaveName).on(submenuMouseLeaveName, null, that._submenuMouseLeaveHandler.bind(that, $rootItem)) }) }, _submenuOnShowingHandler: function($rootItem, submenu) { var $border = $rootItem.children("." + DX_CONTEXT_MENU_CONTAINER_BORDER_CLASS); this._actions.onSubmenuShowing({ rootItem: $rootItem, submenu: submenu }); $border.show(); $rootItem.addClass(DX_MENU_ITEM_EXPANDED_CLASS) }, _submenuOnShownHandler: function($rootItem, submenu) { this._actions.onSubmenuShown({ rootItem: $rootItem, submenu: submenu }) }, _submenuOnHidingHandler: function($rootItem, submenu, eventArgs) { var $border = $rootItem.children("." + DX_CONTEXT_MENU_CONTAINER_BORDER_CLASS), args = eventArgs; args.rootItem = $rootItem; args.submenu = submenu; this._actions.onSubmenuHiding(args); eventArgs = args; if (!eventArgs.cancel) { if (this._visibleSubmenu === submenu) { this._visibleSubmenu = null } $border.hide(); $rootItem.removeClass(DX_MENU_ITEM_EXPANDED_CLASS) } }, _submenuOnHiddenHandler: function($rootItem, submenu) { this._actions.onSubmenuHidden({ rootItem: $rootItem, submenu: submenu }) }, _submenuMouseLeaveHandler: function($rootItem, eventArgs) { var that = this, target = $(eventArgs.relatedTarget).parents("." + DX_CONTEXT_MENU_CLASS)[0], contextMenu = that._getSubmenuByRootElement($rootItem).getOverlayContent()[0]; if (that.option("hideSubmenuOnMouseLeave") && target !== contextMenu) { that._clearTimeouts(); setTimeout(that._hideSubmenuAfterTimeout.bind(that), that._getDelay("hide")) } }, _hideSubmenuAfterTimeout: function() { if (!this._visibleSubmenu) { return } var isRootItemHovered = $(this._visibleSubmenu.element().context).hasClass(DX_STATE_HOVER_CLASS), isSubmenuItemHovered = this._visibleSubmenu.getOverlayContent().find("." + DX_STATE_HOVER_CLASS).length; if (!isSubmenuItemHovered && !isRootItemHovered) { this._visibleSubmenu.hide() } }, _getSubmenuByRootElement: function($rootItem) { if (!$rootItem) { return false } var $submenu = $rootItem.children("." + DX_CONTEXT_MENU_CLASS); return $submenu.length && Submenu.getInstance($submenu) }, getSubmenuPosition: function($rootItem) { var isHorizontalMenu = this._isMenuHorizontal(), submenuDirection = this.option("submenuDirection").toLowerCase(), rtlEnabled = this.option("rtlEnabled"), submenuPosition = { collision: "flip", of: $rootItem }; switch (submenuDirection) { case "leftortop": submenuPosition.at = "left top"; submenuPosition.my = isHorizontalMenu ? "left bottom" : "right top"; break; case "rightorbottom": submenuPosition.at = isHorizontalMenu ? "left bottom" : "right top"; submenuPosition.my = "left top"; break; default: if (isHorizontalMenu) { submenuPosition.at = rtlEnabled ? "right bottom" : "left bottom"; submenuPosition.my = rtlEnabled ? "right top" : "left top" } else { submenuPosition.at = rtlEnabled ? "left top" : "right top"; submenuPosition.my = rtlEnabled ? "right top" : "left top" } } return submenuPosition }, _renderBorderElement: function($item) { $("<div>").appendTo($item).addClass(DX_CONTEXT_MENU_CONTAINER_BORDER_CLASS).hide() }, _itemPointerDownHandler: function(e) { var $target = $(e.target), $closestItem = $target.closest(this._itemElements()); if ($closestItem.hasClass("dx-menu-item-has-submenu")) { this.option("focusedElement", null); return } this.callBase(e) }, _hoverStartHandler: function(e) { var mouseMoveEventName = eventUtils.addNamespace(pointerEvents.move, this.NAME), $item = this._getItemElementByEventArgs(e), node = this._dataAdapter.getNodeByItem(this._getItemData($item)), isSelectionActive = commonUtils.isDefined(e.buttons) && 1 === e.buttons || !commonUtils.isDefined(e.buttons) && 1 === e.which; if (this._isItemDisabled($item)) { return } $item.off(mouseMoveEventName); if (!this._hasChildren(node)) { this._showSubmenuTimer = setTimeout(this._hideSubmenuAfterTimeout.bind(this), this._getDelay("hide")); return } if ("onHover" === this._getShowFirstSubmenuMode() && !isSelectionActive) { var submenu = this._getSubmenuByElement($item); this._clearTimeouts(); if (!submenu.isOverlayVisible()) { $item.on(mouseMoveEventName, this._itemMouseMoveHandler.bind(this)); this._showSubmenuTimer = this._getDelay("hide") } } }, _hoverEndHandler: function(eventArg) { var that = this, $item = that._getItemElementByEventArgs(eventArg), relatedTarget = $(eventArg.relatedTarget); that.callBase(eventArg); that._clearTimeouts(); if (that._isItemDisabled($item)) { return } if (relatedTarget.hasClass(DX_CONTEXT_MENU_CONTENT_DELIMITER_CLASS)) { return } if (that.option("hideSubmenuOnMouseLeave") && !relatedTarget.hasClass(DX_MENU_ITEMS_CONTAINER_CLASS)) { that._hideSubmenuTimer = setTimeout(function() { that._hideSubmenuAfterTimeout() }, that._getDelay("hide")) } }, _hideVisibleSubmenu: function() { if (!this._visibleSubmenu) { return false } this._hideSubmenu(this._visibleSubmenu); return true }, _showSubmenu: function($itemElement) { var submenu = this._getSubmenuByElement($itemElement); if (this._visibleSubmenu !== submenu) { this._hideVisibleSubmenu() } submenu && submenu.show(); this._visibleSubmenu = submenu; this._hoveredRootItem = $itemElement }, _hideSubmenu: function(submenu) { submenu && submenu.hide(); if (this._visibleSubmenu === submenu) { this._visibleSubmenu = null } this._hoveredRootItem = null }, _itemMouseMoveHandler: function(e) { if (e.pointers && e.pointers.length) { return } var that = this, $item = $(e.currentTarget); if (!commonUtils.isDefined(that._showSubmenuTimer)) { return } that._clearTimeouts(); that._showSubmenuTimer = setTimeout(function() { var submenu = that._getSubmenuByElement($item); if (submenu && !submenu.isOverlayVisible()) { that._showSubmenu($item) } }, that._getDelay("show")) }, _clearTimeouts: function() { clearTimeout(this._hideSubmenuTimer); clearTimeout(this._showSubmenuTimer) }, _getSubmenuByElement: function($itemElement, itemData) { var submenu = this._getSubmenuByRootElement($itemElement); if (submenu) { return submenu } else { itemData = itemData || this._getItemData($itemElement); var node = this._dataAdapter.getNodeByItem(itemData); return this._hasChildren(node) && this._renderSubmenuItems(node, $itemElement) } }, _updateSubmenuVisibilityOnClick: function(actionArgs) { var currentSubmenu, args = actionArgs.args.length && actionArgs.args[0]; if (!args || this._disabledGetter(args.itemData)) { return } args.jQueryEvent.stopPropagation(); currentSubmenu = this._getSubmenuByElement(args.itemElement, args.itemData); this._updateSelectedItemOnClick(actionArgs); if (this._visibleSubmenu) { if (this._visibleSubmenu === currentSubmenu) { if ("onClick" === this.option("showFirstSubmenuMode")) { this._hideSubmenu(this._visibleSubmenu) } return } else { this._hideSubmenu(this._visibleSubmenu) } } if (!currentSubmenu) { return } if (!currentSubmenu.isOverlayVisible()) { this._showSubmenu(args.itemElement); return } }, _optionChanged: function(args) { if (this._cancelOptionChange === args.name) { return } switch (args.name) { case "orientation": case "submenuDirection": this._invalidate(); break; case "showFirstSubmenuMode": case "hideSubmenuOnMouseLeave": break; case "showSubmenuMode": this._changeSubmenusOption(args.name, args.value); break; case "onSubmenuShowing": case "onSubmenuShown": case "onSubmenuHiding": case "onSubmenuHidden": this._initActions(); break; case "adaptivityEnabled": args.value ? this._initAdaptivity() : this._removeAdaptivity(); break; case "width": if (this._isAdaptivityEnabled()) { this._treeView.option(args.name, args.value); this._overlay.option(args.name, args.value) } this.callBase(args); this._dimensionChanged(); break; case "animation": if (this._isAdaptivityEnabled()) { this._treeView.option("animationEnabled", !!args.value) } this.callBase(args); break; default: if (this._isAdaptivityEnabled()) { this._treeView.option(args.name, args.value) } this.callBase(args) } }, _changeSubmenusOption: function(name, value) { $.each(this._submenus, function(index, submenu) { submenu.option(name, value) }) }, selectItem: function(itemElement) { this._hideSubmenu(this._visibleSubmenu); this.callBase(itemElement) }, unselectItem: function(itemElement) { this._hideSubmenu(this._visibleSubmenu); this.callBase(itemElement) } }); registerComponent("dxMenu", Menu); module.exports = Menu }, /*!**********************************!*\ !*** ./js/ui/menu/ui.submenu.js ***! \**********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, positionUtils = __webpack_require__( /*! ../../animation/position */ 70), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, ContextMenu = __webpack_require__( /*! ../context_menu */ 338); var DX_CONTEXT_MENU_CONTENT_DELIMITER_CLASS = "dx-context-menu-content-delimiter", DX_SUBMENU_CLASS = "dx-submenu"; var Submenu = ContextMenu.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { orientation: "horizontal", onHoverStart: noop }) }, _initDataAdapter: function() { this._dataAdapter = this.option("_dataAdapter"); if (!this._dataAdapter) { this.callBase() } }, _renderContentImpl: function() { this._renderContextMenuOverlay(); this._detachShowContextMenuEvents(this._getTarget()); this._attachShowContextMenuEvents(); var node = this._dataAdapter.getNodeByKey(this.option("_parentKey")); node && this._renderItems(this._getChildNodes(node)); if (!this.option("_hideDelimiter")) { this._renderDelimiter() } }, _renderDelimiter: function() { this.$contentDelimiter = $("<div>").appendTo(this._itemContainer()).addClass(DX_CONTEXT_MENU_CONTENT_DELIMITER_CLASS) }, _getOverlayOptions: function() { return extend(this.callBase(), { onPositioned: this._overlayPositionedActionHandler.bind(this) }) }, _overlayPositionedActionHandler: function(arg) { this._showDelimiter(arg) }, _hoverEndHandler: function(e) { this.callBase(e); this._toggleFocusClass(false, e.currentTarget) }, _isMenuHorizontal: function() { return "horizontal" === this.option("orientation") }, _hoverStartHandler: function(e) { var hoverStartAction = this.option("onHoverStart"); hoverStartAction(e); this.callBase(e); this._toggleFocusClass(true, e.currentTarget) }, _showDelimiter: function(arg) { var containerOffset, rootOffset, $submenu = this._itemContainer().children("." + DX_SUBMENU_CLASS).eq(0), $rootItem = this.option("position").of, position = { of: $submenu }; if (this.$contentDelimiter) { containerOffset = arg.position; rootOffset = $rootItem.offset(); this.$contentDelimiter.css("display", "block"); if (this._isMenuHorizontal()) { this.$contentDelimiter.width($rootItem.width() < $submenu.width() ? $rootItem.width() - 2 : $submenu.width()); this.$contentDelimiter.height(2); if (containerOffset.v.location > rootOffset.top) { if (Math.round(containerOffset.h.location) === Math.round(rootOffset.left)) { position.offset = "1 -1"; position.at = "left top"; position.my = "left top" } else { position.offset = "-1 -1"; position.at = "right top"; position.my = "right top" } } else { this.$contentDelimiter.height(5); if (Math.round(containerOffset.h.location) === Math.round(rootOffset.left)) { position.offset = "1 4"; position.at = "left bottom"; position.my = "left bottom" } else { position.offset = "-1 2"; position.at = "right bottom"; position.my = "right bottom" } } } else { this.$contentDelimiter.width(2); this.$contentDelimiter.height($rootItem.height() < $submenu.height() ? $rootItem.height() - 2 : $submenu.height()); if (containerOffset.h.location > rootOffset.left) { if (Math.round(containerOffset.v.location) === Math.round(rootOffset.top)) { position.offset = "-1 1"; position.at = "left top"; position.my = "left top" } else { position.offset = "-1 -1"; position.at = "left bottom"; position.my = "left bottom" } } else { if (Math.round(containerOffset.v.location) === Math.round(rootOffset.top)) { position.offset = "1 1"; position.at = "right top"; position.my = "right top" } else { position.offset = "1 -1"; position.at = "right bottom"; position.my = "right bottom" } } } positionUtils.setup(this.$contentDelimiter, position) } }, _getContextMenuPosition: function() { return this.option("position") }, isOverlayVisible: function() { return this._overlay.option("visible") }, getOverlayContent: function() { return this._overlay.content() } }); module.exports = Submenu }, /*!*******************************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.header_filter.js ***! \*******************************************************/ function(module, exports, __webpack_require__) { var core = __webpack_require__( /*! ./ui.data_grid.core */ 348), headerFilterModule = __webpack_require__( /*! ../grid_core/ui.grid_core.header_filter */ 402); core.registerModule("headerFilter", headerFilterModule) }, /*!*******************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.header_filter.js ***! \*******************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), modules = __webpack_require__( /*! ./ui.grid_core.modules */ 350), gridCoreUtils = __webpack_require__( /*! ./ui.grid_core.utils */ 349), headerFilterCore = __webpack_require__( /*! ./ui.grid_core.header_filter_core */ 403), headerFilterMixin = headerFilterCore.headerFilterMixin, messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), allowHeaderFiltering = headerFilterCore.allowHeaderFiltering, clickEvent = __webpack_require__( /*! ../../events/click */ 75), dataUtils = __webpack_require__( /*! ../../data/utils */ 137), dataCoreUtils = __webpack_require__( /*! ../../core/utils/data */ 50), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), getDefaultAlignment = __webpack_require__( /*! ../../core/utils/position */ 107).getDefaultAlignment, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, normalizeDataSourceOptions = __webpack_require__( /*! ../../data/data_source/data_source */ 153).normalizeDataSourceOptions, dateLocalization = __webpack_require__( /*! ../../localization/date */ 33), isWrapped = __webpack_require__( /*! ../../core/utils/variable_wrapper */ 28).isWrapped; var DATE_INTERVAL_FORMATS = { month: function(value) { return dateLocalization.getMonthNames()[value - 1] }, quarter: function(value) { return dateLocalization.format(new Date(2e3, 3 * value - 1), "quarter") } }; var HeaderFilterController = modules.ViewController.inherit(function() { var getFormatOptions = function(value, column, currentLevel) { var groupInterval = gridCoreUtils.getGroupInterval(column), result = gridCoreUtils.getFormatOptionsByColumn(column, "headerFilter"); if (groupInterval) { result.groupInterval = groupInterval[currentLevel]; if ("date" === column.dataType) { result.format = DATE_INTERVAL_FORMATS[groupInterval[currentLevel]] } else { if ("number" === column.dataType) { result.getDisplayFormat = function() { var formatOptions = { format: column.format, precision: column.precision, target: "headerFilter" }, firstValueText = gridCoreUtils.formatValue(value, formatOptions), secondValue = value + groupInterval[currentLevel], secondValueText = gridCoreUtils.formatValue(secondValue, formatOptions); return firstValueText && secondValueText ? firstValueText + " - " + secondValueText : "" } } } } return result }; return { init: function() { this._columnsController = this.getController("columns"); this._dataController = this.getController("data"); this._headerFilterView = this.getView("headerFilterView") }, _updateSelectedState: function(items, column) { var i = items.length, isExclude = "exclude" === column.filterType; while (i--) { var item = items[i]; if ("items" in items[i]) { this._updateSelectedState(items[i].items, column) } headerFilterCore.updateHeaderFilterItemSelectionState(item, gridCoreUtils.getIndexByKey(items[i].value, column.filterValues, null) > -1, isExclude) } }, _normalizeGroupItem: function(item, currentLevel, options) { var value, displayValue, path = options.path, valueSelector = options.valueSelector, displaySelector = options.displaySelector, column = options.column; if (valueSelector && displaySelector) { value = valueSelector(item); displayValue = displaySelector(item) } else { value = item.key; displayValue = value } item = commonUtils.isObject(item) ? item : {}; path.push(value); if (1 === path.length) { item.value = path[0] } else { item.value = path.join("/") } item.text = gridCoreUtils.formatValue(displayValue, getFormatOptions(displayValue, column, currentLevel)); if (!item.text) { item.text = options.headerFilterOptions.texts.emptyValue } delete item.key; return item }, _processGroupItems: function(groupItems, currentLevel, path, options) { var displaySelector, valueSelector, that = this, column = options.column, lookup = column.lookup, level = options.level; path = path || []; currentLevel = currentLevel || 0; if (lookup) { displaySelector = dataCoreUtils.compileGetter(lookup.displayExpr); valueSelector = dataCoreUtils.compileGetter(lookup.valueExpr) } for (var i = 0; i < groupItems.length; i++) { groupItems[i] = that._normalizeGroupItem(groupItems[i], currentLevel, { column: options.column, headerFilterOptions: options.headerFilterOptions, displaySelector: displaySelector, valueSelector: valueSelector, path: path }); if ("items" in groupItems[i]) { if (currentLevel === level || !commonUtils.isDefined(groupItems[i].value)) { delete groupItems[i].items } else { that._processGroupItems(groupItems[i].items, currentLevel + 1, path, options) } } path.pop() } }, getDataSource: function(column) { var filter, cutoffLevel, origPostProcess, that = this, dataSource = that._dataController.dataSource(), group = gridCoreUtils.getHeaderFilterGroupParameters(column, dataSource && dataSource.remoteOperations().grouping), headerFilterDataSource = column.headerFilter && column.headerFilter.dataSource, headerFilterOptions = that.option("headerFilter"), options = { component: that.component }; if (!dataSource) { return } if (commonUtils.isDefined(headerFilterDataSource) && !commonUtils.isFunction(headerFilterDataSource)) { dataSource = normalizeDataSourceOptions(headerFilterDataSource); dataSource.postProcess = function(items) { that._updateSelectedState(items, column); return items }; return dataSource } if (column.lookup) { dataSource = column.lookup.dataSource; if (commonUtils.isFunction(dataSource) && !isWrapped(dataSource)) { dataSource = dataSource({}) } dataSource = normalizeDataSourceOptions(dataSource); dataSource.postProcess = function(items) { if (0 === this.pageIndex()) { items = items.slice(0); items.unshift(null) } that._processGroupItems(items, null, null, { level: 0, column: column, headerFilterOptions: headerFilterOptions }); that._updateSelectedState(items, column); return items }; options.dataSource = dataSource } else { cutoffLevel = Array.isArray(group) ? group.length - 1 : 0; that._currentColumn = column; filter = that._dataController.getCombinedFilter(); that._currentColumn = null; options.dataSource = { filter: filter, group: group, load: function(options) { var d = $.Deferred(); options.dataField = column.dataField || column.name; dataSource.load(options).done(function(data) { that._processGroupItems(data, null, null, { level: cutoffLevel, column: column, headerFilterOptions: headerFilterOptions }); that._updateSelectedState(data, column); d.resolve(data) }).fail(d.reject); return d } } } if (commonUtils.isFunction(headerFilterDataSource)) { headerFilterDataSource.call(column, options); origPostProcess = options.dataSource.postProcess; options.dataSource.postProcess = function(data) { var items = origPostProcess && origPostProcess.apply(this, arguments) || data; that._updateSelectedState(items, column); return items } } return options.dataSource }, getCurrentColumn: function() { return this._currentColumn }, showHeaderFilterMenu: function(columnIndex, isGroupPanel) { var that = this, column = extend(true, {}, that._columnsController.getColumns()[columnIndex]); if (column) { var visibleIndex = that._columnsController.getVisibleIndex(columnIndex), view = isGroupPanel ? that.getView("headerPanel") : that.getView("columnHeadersView"), $columnElement = view.getColumnElements().eq(isGroupPanel ? column.groupIndex : visibleIndex), groupInterval = gridCoreUtils.getGroupInterval(column); var options = extend(column, { type: groupInterval && groupInterval.length > 1 ? "tree" : "list", apply: function() { that._columnsController.columnOption(columnIndex, { filterValues: this.filterValues, filterType: this.filterType }) }, onShowing: function(e) { var dxResizableInstance = e.component.overlayContent().dxResizable("instance"); dxResizableInstance && dxResizableInstance.option("onResizeEnd", function(e) { var columnsController = that.getController("columns"), headerFilterByColumn = columnsController.columnOption(options.dataField, "headerFilter"); headerFilterByColumn = headerFilterByColumn || {}; headerFilterByColumn.width = e.width; headerFilterByColumn.height = e.height; columnsController.columnOption(options.dataField, "headerFilter", headerFilterByColumn, true) }) } }); options.dataSource = that.getDataSource(options); that._headerFilterView.showHeaderFilterMenu($columnElement, options) } }, hideHeaderFilterMenu: function() { this._headerFilterView.hideHeaderFilterMenu() } } }()); var ColumnHeadersViewHeaderFilterExtender = extend({}, headerFilterCore.headerFilterMixin, { _renderCellContent: function($cell, options) { var $headerFilterIndicator, that = this, column = options.column; if (!column.command && allowHeaderFiltering(column) && that.option("headerFilter.visible") && "header" === options.rowType) { $headerFilterIndicator = that._applyColumnState({ name: "headerFilter", rootElement: $cell, column: column, showColumnLines: that.option("showColumnLines") }); $headerFilterIndicator && that._subscribeToIndicatorEvent($headerFilterIndicator, column, "headerFilter") } that.callBase($cell, options) }, _subscribeToIndicatorEvent: function($indicator, column, indicatorName) { var that = this; if ("headerFilter" === indicatorName) { $indicator.on(clickEvent.name, that.createAction(function(e) { var event = e.jQueryEvent; event.stopPropagation(); that.getController("headerFilter").showHeaderFilterMenu(column.index, false) })) } }, _updateIndicator: function($cell, column, indicatorName) { var $indicator = this.callBase($cell, column, indicatorName); $indicator && this._subscribeToIndicatorEvent($indicator, column, indicatorName) }, _columnOptionChanged: function(e) { var optionNames = e.optionNames; if (gridCoreUtils.checkChanges(optionNames, ["filterValues", "filterType"])) { if (this.option("headerFilter.visible")) { this._updateIndicators("headerFilter") } return } this.callBase(e) } }); var HeaderPanelHeaderFilterExtender = extend({}, headerFilterMixin, { _createGroupPanelItem: function($rootElement, groupColumn) { var $headerFilterIndicator, that = this, $item = that.callBase.apply(that, arguments); if (!groupColumn.command && allowHeaderFiltering(groupColumn) && that.option("headerFilter.visible")) { $headerFilterIndicator = that._applyColumnState({ name: "headerFilter", rootElement: $item, column: { alignment: getDefaultAlignment(that.option("rtlEnabled")), filterValues: groupColumn.filterValues, allowHeaderFiltering: true }, showColumnLines: true }); $headerFilterIndicator && $headerFilterIndicator.on(clickEvent.name, that.createAction(function(e) { var event = e.jQueryEvent; event.stopPropagation(); that.getController("headerFilter").showHeaderFilterMenu(groupColumn.index, true) })) } return $item } }); var INVERTED_BINARY_OPERATIONS = { "=": "<>", "<>": "=", ">": "<=", ">=": "<", "<": ">=", "<=": ">", contains: "notcontains", notcontains: "contains", startswith: "notcontains", endswith: "notcontains" }; function invertFilterExpression(filter) { var i, currentGroupOperation, result; if (Array.isArray(filter[0])) { result = []; for (i = 0; i < filter.length; i++) { if (Array.isArray(filter[i])) { if (currentGroupOperation) { result.push(currentGroupOperation) } result.push(invertFilterExpression(filter[i])); currentGroupOperation = "or" } else { currentGroupOperation = dataUtils.isConjunctiveOperator(filter[i]) ? "or" : "and" } } return result } result = dataUtils.normalizeBinaryCriterion(filter); result[1] = INVERTED_BINARY_OPERATIONS[result[1]] || result[1]; return result } var DataControllerFilterRowExtender = { _calculateAdditionalFilter: function() { var that = this, filters = [that.callBase()], columns = that._columnsController.getVisibleColumns(), headerFilterController = that.getController("headerFilter"), currentColumn = headerFilterController.getCurrentColumn(); $.each(columns, function(_, column) { var filter; if (currentColumn && currentColumn.index === column.index) { return } if (allowHeaderFiltering(column) && column.calculateFilterExpression && Array.isArray(column.filterValues) && column.filterValues.length) { var filterValues = [], isExclude = "exclude" === column.filterType; $.each(column.filterValues, function(_, filterValue) { if (Array.isArray(filterValue)) { filter = isExclude ? invertFilterExpression(filterValue) : filterValue } else { if (column.deserializeValue && "date" !== column.dataType && "number" !== column.dataType) { filterValue = column.deserializeValue(filterValue) } filter = column.createFilterExpression(filterValue, isExclude ? "<>" : "=", "headerFilter") } if (filter) { filter.columnIndex = column.index } filterValues.push(filter) }); filterValues = gridCoreUtils.combineFilters(filterValues, isExclude ? "and" : "or"); filters.push(filterValues) } }); return gridCoreUtils.combineFilters(filters) } }; module.exports = { invertFilterExpression: invertFilterExpression, defaultOptions: function() { return { headerFilter: { visible: false, width: 252, height: 325, texts: { emptyValue: messageLocalization.format("dxDataGrid-headerFilterEmptyValue"), ok: messageLocalization.format("dxDataGrid-headerFilterOK"), cancel: messageLocalization.format("dxDataGrid-headerFilterCancel") } } } }, controllers: { headerFilter: HeaderFilterController }, views: { headerFilterView: headerFilterCore.HeaderFilterView }, extenders: { controllers: { data: DataControllerFilterRowExtender }, views: { columnHeadersView: ColumnHeadersViewHeaderFilterExtender, headerPanel: HeaderPanelHeaderFilterExtender } } } }, /*!************************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.header_filter_core.js ***! \************************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), modules = __webpack_require__( /*! ./ui.grid_core.modules */ 350), gridCoreUtils = __webpack_require__( /*! ./ui.grid_core.utils */ 349), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, Popup = __webpack_require__( /*! ../popup */ 200), TreeView = __webpack_require__( /*! ../tree_view */ 380), List = __webpack_require__( /*! ../list */ 218); var HEADER_FILTER_CLASS = "dx-header-filter", HEADER_FILTER_MENU_CLASS = "dx-header-filter-menu"; function resetChildrenItemSelection(items) { items = items || []; for (var i = 0; i < items.length; i++) { items[i].selected = false; resetChildrenItemSelection(items[i].items) } } function updateSelectAllState($listContainer, filterValues) { var selectAllCheckBox = $listContainer.find(".dx-list-select-all-checkbox").data("dxCheckBox"); if (selectAllCheckBox && filterValues && filterValues.length) { selectAllCheckBox.option("value", void 0) } } exports.updateHeaderFilterItemSelectionState = function(item, filterValuesMatch, isExcludeFilter) { if (filterValuesMatch ^ isExcludeFilter) { item.selected = true; if (isExcludeFilter && item.items) { for (var j = 0; j < item.items.length; j++) { if (!item.items[j].selected) { item.selected = void 0; break } } } } else { if (isExcludeFilter) { item.selected = false; resetChildrenItemSelection(item.items) } } }; exports.HeaderFilterView = modules.View.inherit({ getPopupContainer: function() { return this._popupContainer }, getListContainer: function() { return this._listContainer }, applyHeaderFilter: function(options) { var that = this, list = that.getListContainer(), isSelectAll = list.element().find(".dx-checkbox").eq(0).hasClass("dx-checkbox-checked"), filterValues = []; var fillSelectedItemKeys = function(filterValues, items, isExclude) { $.each(items, function(_, item) { if (void 0 !== item.selected && !!item.selected ^ isExclude) { filterValues.push(item.value) } else { if (item.items && item.items.length) { fillSelectedItemKeys(filterValues, item.items, isExclude) } } }) }; if (!isSelectAll) { if ("tree" === options.type) { fillSelectedItemKeys(filterValues, list.option("items"), "exclude" === options.filterType); options.filterValues = filterValues } } else { if (Array.isArray(options.filterValues)) { options.filterValues = [] } } if (options.filterValues && !options.filterValues.length) { options.filterValues = null } options.apply(); that.hideHeaderFilterMenu() }, showHeaderFilterMenu: function($columnElement, options) { var popupContainer, that = this; if (options) { that._initializePopupContainer(options); popupContainer = that.getPopupContainer(); that.hideHeaderFilterMenu(); that.updatePopup($columnElement, options); popupContainer.show() } }, hideHeaderFilterMenu: function() { var headerFilterMenu = this.getPopupContainer(); headerFilterMenu && headerFilterMenu.hide() }, updatePopup: function($element, options) { var that = this, alignment = "right" === options.alignment ? "left" : "right"; if (that._popupContainer) { that._cleanPopupContent(); that._popupContainer.option("position", { my: alignment + " top", at: alignment + " bottom", of: $element, collision: "flip fit" }) } }, _cleanPopupContent: function() { this._popupContainer && this._popupContainer.content().empty() }, _initializePopupContainer: function(options) { var that = this, $element = that.element(), headerFilterOptions = that.option("headerFilter"), width = options.headerFilter && options.headerFilter.width || headerFilterOptions && headerFilterOptions.width, height = options.headerFilter && options.headerFilter.height || headerFilterOptions && headerFilterOptions.height, dxPopupOptions = { width: width, height: height, visible: false, shading: false, showTitle: false, showCloseButton: false, closeOnTargetScroll: true, dragEnabled: false, closeOnOutsideClick: true, toolbarItems: [{ toolbar: "bottom", location: "after", widget: "dxButton", options: { text: headerFilterOptions.texts.ok, onClick: function() { that.applyHeaderFilter(options) } } }, { toolbar: "bottom", location: "after", widget: "dxButton", options: { text: headerFilterOptions.texts.cancel, onClick: function() { that.hideHeaderFilterMenu() } } }], resizeEnabled: true, onShowing: function(e) { that._initializeListContainer(options); options.onShowing && options.onShowing(e) }, onInitialized: function(e) { var component = e.component; component.option("animation", component._getDefaultOptions().animation) } }; if (!commonUtils.isDefined(that._popupContainer)) { that._popupContainer = that._createComponent($element, Popup, dxPopupOptions) } else { that._popupContainer.option(dxPopupOptions) } }, _initializeListContainer: function(options) { var that = this, $content = that._popupContainer.content(), widgetOptions = { dataSource: options.dataSource, onContentReady: function() { that.renderCompleted.fire() }, itemTemplate: function(data, _, $element) { if (options.encodeHtml) { return $element.text(data.text) } return $element.html(data.text) } }; if ("tree" === options.type) { that._listContainer = that._createComponent($("<div>").appendTo($content), TreeView, extend(widgetOptions, { showCheckBoxesMode: "selectAll", keyExpr: "id" })) } else { that._listContainer = that._createComponent($("<div>").appendTo($content), List, extend(widgetOptions, { pageLoadMode: "scrollBottom", showSelectionControls: true, selectionMode: "all", onSelectionChanged: function(e) { var items = e.component.option("items"), selectedItems = e.component.option("selectedItems"); if (!e.component._selectedItemsUpdating) { if (0 === selectedItems.length && items.length && (!options.filterValues || options.filterValues.length <= 1)) { options.filterType = "include"; options.filterValues = [] } else { if (selectedItems.length === items.length) { options.filterType = "exclude"; options.filterValues = [] } } } $.each(items, function(index, item) { var filterValueIndex, selected = gridCoreUtils.getIndexByKey(item, selectedItems, null) >= 0, oldSelected = !!item.selected; if (oldSelected !== selected) { item.selected = selected; options.filterValues = options.filterValues || []; filterValueIndex = gridCoreUtils.getIndexByKey(item.value, options.filterValues, null); if (filterValueIndex >= 0) { options.filterValues.splice(filterValueIndex, 1) } if (selected ^ "exclude" === options.filterType) { options.filterValues.push(item.value) } } }); updateSelectAllState(e.element, options.filterValues) }, onContentReady: function(e) { var component = e.component, items = component.option("items"), selectedItems = []; $.each(items, function() { if (this.selected) { selectedItems.push(this) } }); component._selectedItemsUpdating = true; component.option("selectedItems", selectedItems); component._selectedItemsUpdating = false; updateSelectAllState(e.element, options.filterValues) } })) } }, _renderCore: function() { this.element().addClass(HEADER_FILTER_MENU_CLASS) } }); var allowHeaderFiltering = exports.allowHeaderFiltering = function(column) { return commonUtils.isDefined(column.allowHeaderFiltering) ? column.allowHeaderFiltering : column.allowFiltering }; exports.headerFilterMixin = { _applyColumnState: function(options) { var $headerFilterIndicator, rootElement = options.rootElement, column = options.column; if ("headerFilter" === options.name) { rootElement.find("." + HEADER_FILTER_CLASS).remove(); if (allowHeaderFiltering(column)) { $headerFilterIndicator = this.callBase(options).toggleClass("dx-header-filter-empty", !column.filterValues || !column.filterValues.length) } return $headerFilterIndicator } return this.callBase(options) }, _getIndicatorClassName: function(name) { if ("headerFilter" === name) { return HEADER_FILTER_CLASS } return this.callBase(name) }, _renderIndicator: function(options) { var rtlEnabled, $container = options.container, $indicator = options.indicator; if ("headerFilter" === options.name) { rtlEnabled = this.option("rtlEnabled"); if ($container.children().length && (!rtlEnabled && "right" === options.columnAlignment || rtlEnabled && "left" === options.columnAlignment)) { $container.prepend($indicator); return } } this.callBase(options) }, optionChanged: function(args) { if ("headerFilter" === args.name) { this._invalidate(); args.handled = true } else { this.callBase(args) } } } }, /*!************************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.search.js ***! \************************************************/ function(module, exports, __webpack_require__) { var gridCore = __webpack_require__( /*! ./ui.data_grid.core */ 348), searchModule = __webpack_require__( /*! ../grid_core/ui.grid_core.search */ 405); gridCore.registerModule("search", searchModule) }, /*!************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.search.js ***! \************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), compileGetter = __webpack_require__( /*! ../../core/utils/data */ 50).compileGetter, gridCoreUtils = __webpack_require__( /*! ./ui.grid_core.utils */ 349), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), dataQuery = __webpack_require__( /*! ../../data/query */ 159); var SEARCH_PANEL_CLASS = "search-panel", SEARCH_TEXT_CLASS = "search-text", FILTERING_TIMEOUT = 700; function allowSearch(column) { return commonUtils.isDefined(column.allowSearch) ? column.allowSearch : column.allowFiltering } function parseValue(column, text) { var lookup = column.lookup; if (lookup) { return column.parseValue.call(lookup, text) } else { return column.parseValue ? column.parseValue(text) : text } } module.exports = { defaultOptions: function() { return { searchPanel: { visible: false, width: 160, placeholder: messageLocalization.format("dxDataGrid-searchPanelPlaceholder"), highlightSearchText: true, highlightCaseSensitive: false, text: "", searchVisibleColumnsOnly: false } } }, extenders: { controllers: { data: function() { var calculateSearchFilter = function(that, text) { var i, column, filterValue, lookup, columns = that._columnsController.getColumns(), searchVisibleColumnsOnly = that.option("searchPanel.searchVisibleColumnsOnly"), filters = []; if (!text) { return null } function onQueryDone(items) { var i, value, valueGetter = compileGetter(lookup.valueExpr); for (i = 0; i < items.length; i++) { value = valueGetter(items[i]); filters.push(column.createFilterExpression(value, null, "search")) } } for (i = 0; i < columns.length; i++) { column = columns[i]; if (searchVisibleColumnsOnly && !column.visible) { continue } if (allowSearch(column) && column.calculateFilterExpression) { lookup = column.lookup; filterValue = parseValue(column, text); if (lookup && lookup.items) { dataQuery(lookup.items).filter(column.createFilterExpression.call({ dataField: lookup.displayExpr, dataType: lookup.dataType, calculateFilterExpression: column.calculateFilterExpression }, filterValue, null, "search")).enumerate().done(onQueryDone) } else { if (void 0 !== filterValue) { filters.push(column.createFilterExpression(filterValue, null, "search")) } } } } return gridCoreUtils.combineFilters(filters, "or") }; return { publicMethods: function() { return this.callBase().concat(["searchByText"]) }, _calculateAdditionalFilter: function() { var that = this, filter = that.callBase(), searchFilter = calculateSearchFilter(that, that.option("searchPanel.text")); return gridCoreUtils.combineFilters([filter, searchFilter]) }, _loadDataSource: function() { var result, that = this, callBase = that.callBase, searchText = that.option("searchPanel.text"), columnsController = that._columnsController, columns = columnsController.getColumns(), hasLookup = columns.filter(function(column) { return !!column.lookup }).length; if (searchText && hasLookup) { result = $.Deferred(); columnsController.refresh(true).always(function() { callBase.apply(that, arguments).then(result.resolve, result.reject) }) } else { result = callBase.apply(that, arguments) } return result }, searchByText: function(text) { this.option("searchPanel.text", text) }, optionChanged: function(args) { var that = this; switch (args.fullName) { case "searchPanel.text": case "searchPanel": that._applyFilter(); args.handled = true; break; default: that.callBase(args) } } } }() }, views: { headerPanel: function() { var getSearchPanelOptions = function(that) { return that.option("searchPanel") }; return { _getToolbarItems: function() { var items = this.callBase(); return this._prepareSearchItem(items) }, _prepareSearchItem: function(items) { var that = this, dataController = that.getController("data"), searchPanelOptions = getSearchPanelOptions(that); if (searchPanelOptions && searchPanelOptions.visible) { var toolbarItem = { template: function(data, index, $container) { var $search = $("<div>").addClass(that.addWidgetPrefix(SEARCH_PANEL_CLASS)).appendTo($container); that.setAria("label", messageLocalization.format("dxDataGrid-ariaSearchInGrid"), $search); that.getController("editorFactory").createEditor($search, { width: searchPanelOptions.width, placeholder: searchPanelOptions.placeholder, parentType: "searchPanel", value: that.option("searchPanel.text"), updateValueTimeout: FILTERING_TIMEOUT, setValue: function(value) { dataController.searchByText(value) } }); that.resize() }, name: "searchPanel", location: "after", locateInMenu: "never", sortIndex: 40 }; items.push(toolbarItem) } return items }, _getSearchTextEditor: function() { var $searchPanel = this.element().find("." + this.addWidgetPrefix(SEARCH_PANEL_CLASS)); if ($searchPanel.length) { return $searchPanel.dxTextBox("instance") } return null }, isVisible: function() { var searchPanelOptions = getSearchPanelOptions(this); return this.callBase() || searchPanelOptions && searchPanelOptions.visible }, optionChanged: function(args) { if ("searchPanel" === args.name) { if ("searchPanel.text" === args.fullName) { var editor = this._getSearchTextEditor(); if (editor) { editor.option("value", args.value) } } else { this._invalidate() } args.handled = true } else { this.callBase(args) } } } }(), rowsView: { _highlightSearchText: function(cellElement, isEquals, column) { var $parent, that = this, searchText = that.option("searchPanel.text"); if (searchText && that.option("searchPanel.highlightSearchText")) { var normalizeString = that.option("searchPanel.highlightCaseSensitive") ? function(str) { return str } : function(str) { return str.toLowerCase() }; if (isEquals && column) { var value = parseValue(column, searchText), formatOptions = gridCoreUtils.getFormatOptionsByColumn(column, "search"); searchText = gridCoreUtils.formatValue(value, formatOptions); if (!searchText) { return } } $parent = cellElement.parent(); if (!$parent.length) { $parent = $("<div>").append(cellElement) } var $items = $parent.find("*").filter(function(index, element) { var $contents = $(element).contents(); for (var i = 0; i < $contents.length; i++) { var node = $contents.get(i); if (3 === node.nodeType) { return (node.textContent || node.nodeValue || "").toLowerCase().indexOf(searchText.toLowerCase()) > -1 } return false } }); $.each($items, function(index, element) { $.each($(element).contents(), function(index, content) { if (3 !== content.nodeType) { return } var highlightSearchTextInTextNode = function($content, searchText) { var $searchTextSpan = $("<span />").addClass(that.addWidgetPrefix(SEARCH_TEXT_CLASS)), text = $content.text(), index = normalizeString(text).indexOf(normalizeString(searchText)); if (index >= 0) { if ($content[0].textContent) { $content[0].textContent = text.substr(0, index) } else { $content[0].nodeValue = text.substr(0, index) } $content.after($searchTextSpan.text(text.substr(index, searchText.length))); $content = $(document.createTextNode(text.substr(index + searchText.length))).insertAfter($searchTextSpan); return highlightSearchTextInTextNode($content, searchText) } }; if (isEquals) { if (normalizeString($(content).text()) === normalizeString(searchText)) { $(this).replaceWith($("<span />").addClass(that.addWidgetPrefix(SEARCH_TEXT_CLASS)).text($(content).text())) } } else { highlightSearchTextInTextNode($(content), searchText) } }) }) } }, _renderCore: function() { this.callBase.apply(this, arguments); if (this.option("rowTemplate")) { this._highlightSearchText(this._getTableElement()) } }, _updateCell: function($cell, parameters) { var that = this, column = parameters.column, dataType = column.lookup && column.lookup.dataType || column.dataType, isEquals = "string" !== dataType; if (allowSearch(column)) { that._highlightSearchText($cell, isEquals, column) } that.callBase($cell, parameters) } } } } } }, /*!***********************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.pager.js ***! \***********************************************/ function(module, exports, __webpack_require__) { var gridCore = __webpack_require__( /*! ./ui.data_grid.core */ 348), Pager = __webpack_require__( /*! ./pager */ 407), inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14); var DATAGRID_PAGER_CLASS = "dx-datagrid-pager", MAX_PAGES_COUNT = 10; exports.PagerView = gridCore.View.inherit({ init: function() { var that = this, dataController = that.getController("data"); that._isVisible = false; dataController.changed.add(function(e) { if (!e || "update" !== e.changeType) { that.render() } }) }, _getPager: function() { var $element = this.element(); return $element && $element.data("dxPager") }, _renderCore: function() { var that = this, $element = that.element().addClass(DATAGRID_PAGER_CLASS), pagerOptions = that.option("pager") || {}, dataController = that.getController("data"), options = { maxPagesCount: MAX_PAGES_COUNT, pageIndex: 1 + (parseInt(dataController.pageIndex()) || 0), pageCount: dataController.pageCount(), pageSize: dataController.pageSize(), showPageSizes: pagerOptions.showPageSizeSelector, showInfo: pagerOptions.showInfo, pagesNavigatorVisible: pagerOptions.visible, showNavigationButtons: pagerOptions.showNavigationButtons, pageSizes: that.getPageSizes(), totalCount: dataController.totalCount(), hasKnownLastPage: dataController.hasKnownLastPage(), pageIndexChanged: function(pageIndex) { if (dataController.pageIndex() !== pageIndex - 1) { setTimeout(function() { dataController.pageIndex(pageIndex - 1) }) } }, pageSizeChanged: function(pageSize) { setTimeout(function() { dataController.pageSize(pageSize) }) } }; if (commonUtils.isDefined(pagerOptions.infoText)) { options.infoText = pagerOptions.infoText } that._createComponent($element, Pager, options) }, getPageSizes: function() { var that = this, dataController = that.getController("data"), pagerOptions = that.option("pager"), allowedPageSizes = pagerOptions && pagerOptions.allowedPageSizes, pageSize = dataController.pageSize(); if (!commonUtils.isDefined(that._pageSizes) || inArray(pageSize, that._pageSizes) === -1) { that._pageSizes = []; if (pagerOptions) { if (Array.isArray(allowedPageSizes)) { that._pageSizes = allowedPageSizes } else { if (allowedPageSizes && pageSize > 1) { that._pageSizes = [Math.floor(pageSize / 2), pageSize, 2 * pageSize] } } } } return that._pageSizes }, isVisible: function() { var that = this, dataController = that.getController("data"), pagerOptions = that.option("pager"), pagerVisible = pagerOptions && pagerOptions.visible, scrolling = that.option("scrolling"); if (that._isVisible) { return true } if ("auto" === pagerVisible) { if (scrolling && ("virtual" === scrolling.mode || "infinite" === scrolling.mode)) { pagerVisible = false } else { pagerVisible = dataController.pageCount() > 1 || dataController.isLoaded() && !dataController.hasKnownLastPage() } } that._isVisible = pagerVisible; return pagerVisible }, getHeight: function() { return this.getElementHeight() }, optionChanged: function(args) { var that = this, name = args.name, isPager = "pager" === name, isPaging = "paging" === name, isDataSource = "dataSource" === name, isScrolling = "scrolling" === name; if (isPager || isPaging || isScrolling || isDataSource) { if (isPager || isPaging) { that._pageSizes = null } if (isPager || isPaging || isScrolling) { that._isVisible = false } if (!isDataSource) { that._invalidate(); if (isPager && that.component) { that.component.resize() } } args.handled = true } } }); gridCore.registerModule("pager", { defaultOptions: function() { return { pager: { visible: "auto", showPageSizeSelector: false, allowedPageSizes: "auto" } } }, views: { pagerView: exports.PagerView } }) }, /*!**********************************!*\ !*** ./js/ui/data_grid/pager.js ***! \**********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), stringUtils = __webpack_require__( /*! ../../core/utils/string */ 18), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, clickEvent = __webpack_require__( /*! ../../events/click */ 75), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), Widget = __webpack_require__( /*! ../widget/ui.widget */ 95), SelectBox = __webpack_require__( /*! ../select_box */ 317), NumberBox = __webpack_require__( /*! ../number_box */ 263), eventUtils = __webpack_require__( /*! ../../events/utils */ 71); var PAGES_LIMITER = 4, PAGER_CLASS = "dx-pager", PAGER_PAGE_CLASS = "dx-page", PAGER_PAGES_CLASS = "dx-pages", LIGHT_MODE_CLASS = "dx-light-mode", LIGHT_PAGES_CLASS = "dx-light-pages", PAGER_PAGE_INDEX_CLASS = "dx-page-index", PAGER_PAGES_COUNT_CLASS = "dx-pages-count", PAGER_SELECTION_CLASS = "dx-selection", PAGER_PAGE_SEPARATOR_CLASS = "dx-separator", PAGER_PAGE_SIZES_CLASS = "dx-page-sizes", PAGER_PAGE_SIZE_CLASS = "dx-page-size", PAGER_NAVIGATE_BUTTON = "dx-navigate-button", PAGER_PREV_BUTTON_CLASS = "dx-prev-button", PAGER_NEXT_BUTTON_CLASS = "dx-next-button", PAGER_INFO_CLASS = "dx-info", PAGER_INFO_TEXT_CLASS = "dx-info-text", PAGER_BUTTON_DISABLE_CLASS = "dx-button-disable"; var Page = Class.inherit({ ctor: function(value, index) { var that = this; that.index = index; that._$page = $("<div />").text(value).addClass(PAGER_PAGE_CLASS) }, value: function(value) { var that = this; if (commonUtils.isDefined(value)) { that._$page.text(value) } else { var text = that._$page.text(); if (commonUtils.isNumeric(text)) { return parseInt(text) } else { return text } } }, element: function() { return this._$page }, select: function(value) { this._$page.toggleClass(PAGER_SELECTION_CLASS, value) }, render: function(rootElement, rtlEnabled) { rtlEnabled ? this._$page.prependTo(rootElement) : this._$page.appendTo(rootElement) } }); var Pager = Widget.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { visible: true, pagesNavigatorVisible: "auto", pageIndex: 1, maxPagesCount: 10, pageCount: 10, totalCount: 0, pageSize: 5, showPageSizes: true, pageSizes: [5, 10], hasKnownLastPage: true, showNavigationButtons: false, showInfo: false, infoText: messageLocalization.getFormatter("dxPager-infoText"), pagesCountText: messageLocalization.getFormatter("dxPager-pagesCountText"), rtlEnabled: false, lightModeEnabled: false, pageIndexChanged: commonUtils.noop, pageSizeChanged: commonUtils.noop }) }, _toggleVisibility: function(value) { var $element = this.element(); if ($element) { $element.css("display", value ? "" : "none") } }, _getPages: function(currentPage, count) { var firstValue, i, pages = [], showMoreButton = !this.option("hasKnownLastPage"); this._testPagesCount = count; this._testShowMoreButton = showMoreButton; if (count > 0 || showMoreButton) { if (count <= this.option("maxPagesCount")) { for (i = 1; i <= count; i++) { pages.push(new Page(i, i - 1)) } if (showMoreButton) { pages.push(new Page(">", i - 1)) } } else { pages.push(new Page(1, 0)); firstValue = currentPage ? currentPage.value() - currentPage.index : 1; for (i = 1; i <= PAGES_LIMITER; i++) { pages.push(new Page(firstValue + i, i)) } pages.push(new Page(count, PAGES_LIMITER + 1)); if (showMoreButton) { pages.push(new Page(">", PAGES_LIMITER + 1)) } } } return pages }, _getPageByValue: function(value) { var page, i, that = this; for (i = 0; i < that._pages.length; i++) { page = that._pages[i]; if (page.value() === value) { return page } } }, _processSelectedPage: function(maxPagesCount, pageIndex, pageCount) { var selectedPageIndex, that = this, isPageIndexValid = false; if (that._pages) { $.each(that._pages, function(key, page) { if (pageIndex === page.value()) { isPageIndexValid = true } }); if (!isPageIndexValid) { that.selectedPage = null } } if (commonUtils.isDefined(that.selectedPage)) { if (pageIndex === pageCount && pageCount > maxPagesCount && that.selectedPage.index !== PAGES_LIMITER + 1) { that.selectedPage.index = PAGES_LIMITER + 1 } } else { if (pageIndex > PAGES_LIMITER && pageIndex < pageCount) { selectedPageIndex = pageCount - PAGES_LIMITER < pageIndex ? PAGES_LIMITER - (pageCount - pageIndex) + 1 : 2; that.selectedPage = new Page(pageIndex, selectedPageIndex) } } }, _selectPageByValue: function(value) { var i, prevPage, nextPage, morePage, that = this, page = that._getPageByValue(value), pages = that._pages, pagesLength = pages.length; if (!commonUtils.isDefined(page)) { return } prevPage = that._pages[page.index - 1]; nextPage = that._pages[page.index + 1]; if (nextPage && ">" === nextPage.value()) { morePage = nextPage; nextPage = void 0; pagesLength--; pages.pop() } if (that.selectedPage) { that.selectedPage.select(false) } page.select(true); that.selectedPage = page; if (nextPage && nextPage.value() - value > 1) { if (0 !== page.index) { prevPage.value(value + 1); that._pages.splice(page.index, 1); that._pages.splice(page.index - 1, 0, page); that._pages[page.index].index = page.index; page.index = page.index - 1; for (i = page.index - 1; i > 0; i--) { that._pages[i].value(that._pages[i + 1].value() - 1) } } else { for (i = 0; i < pagesLength - 1; i++) { that._pages[i].value(i + 1) } } } if (prevPage && value - prevPage.value() > 1) { if (page.index !== pagesLength - 1) { nextPage.value(value - 1); that._pages.splice(page.index, 1); that._pages.splice(page.index + 1, 0, page); that._pages[page.index].index = page.index; page.index = page.index + 1; for (i = page.index + 1; i < pagesLength - 1; i++) { that._pages[i].value(that._pages[i - 1].value() + 1) } } else { for (i = 1; i <= pagesLength - 2; i++) { that._pages[pagesLength - 1 - i].value(that._pages[pagesLength - 1].value() - i) } } } if (morePage) { pages.push(morePage) } }, _nextPage: function(direction) { var pageIndex = this.option("pageIndex"), pageCount = this.option("pageCount"); if (commonUtils.isDefined(pageIndex)) { pageIndex = "next" === direction ? ++pageIndex : --pageIndex; if (pageIndex > 0 && pageIndex <= pageCount) { this.option("pageIndex", pageIndex) } } }, _renderPages: function(pages) { var $separator, page, that = this, pagesLength = pages.length, clickPagesIndexAction = that._createAction(function(args) { var e = args.jQueryEvent, pageNumber = $(e.target).text(), pageIndex = ">" === pageNumber ? that.option("pageCount") + 1 : Number(pageNumber); that._testPageIndex = pageIndex; that.option("pageIndex", pageIndex) }); if (pagesLength > 1) { that._pageClickHandler = function(e) { clickPagesIndexAction({ jQueryEvent: e }) }; that._$pagesChooser.on(eventUtils.addNamespace(clickEvent.name, that.Name + "Pages"), "." + PAGER_PAGE_CLASS, that._pageClickHandler) } for (var i = 0; i < pagesLength; i++) { page = pages[i]; page.render(that._$pagesChooser, that.option("rtlEnabled")); that.setAria({ role: "button", label: "Page " + page.value() }, page.element()); if (pages[i + 1] && pages[i + 1].value() - page.value() > 1) { $separator = $("<div>. . .</div>").addClass(PAGER_PAGE_SEPARATOR_CLASS); that.option("rtlEnabled") ? $separator.prependTo(that._$pagesChooser) : $separator.appendTo(that._$pagesChooser) } } }, _calculateLightPagesWidth: function($pageIndex, pageCount) { return Number($pageIndex.css("min-width").replace("px", "")) + 10 * pageCount.toString().length }, _renderLightPages: function() { var $pageCount, $pageIndex, that = this, pageCount = this.option("pageCount"), pageIndex = this.option("pageIndex"), clickAction = that._createAction(function() { that.option("pageIndex", pageCount) }), pagesCountText = this.option("pagesCountText"); var $container = $("<div/>").addClass(LIGHT_PAGES_CLASS).appendTo(this._$pagesChooser); $pageIndex = $("<div/>").addClass(PAGER_PAGE_INDEX_CLASS).appendTo($container); that._pageIndexEditor = that._createComponent($pageIndex, NumberBox, { value: pageIndex, min: 1, max: pageCount, width: that._calculateLightPagesWidth($pageIndex, pageCount), onValueChanged: function(e) { that.option("pageIndex", e.value) } }); $("<span/>").text(pagesCountText).addClass(PAGER_INFO_TEXT_CLASS + " " + PAGER_INFO_CLASS).appendTo($container); $pageCount = $("<span/>").addClass(PAGER_PAGES_COUNT_CLASS).text(pageCount).on(eventUtils.addNamespace(clickEvent.name, that.Name + "PagesCount"), function(e) { clickAction({ jQueryEvent: e }) }).appendTo($container); that.setAria({ role: "button", label: "Navigates to the last page" }, $pageCount) }, _renderPagesChooser: function() { var that = this, lightModeEnabled = that.option("lightModeEnabled"), pagesNavigatorVisible = that.option("pagesNavigatorVisible"), $element = that.element(); that._$pagesChooser && that._$pagesChooser.remove(); if (!pagesNavigatorVisible) { return } if (that._pages && 0 === that._pages.length) { that.selectedPage = null; return } that._$pagesChooser = $("<div />").addClass(PAGER_PAGES_CLASS).appendTo($element); if ("auto" === pagesNavigatorVisible) { that._$pagesChooser.css("visibility", 1 === that.option("pageCount") ? "hidden" : "") } if (!lightModeEnabled) { that._renderInfo() } that._renderNavigateButton("prev"); if (lightModeEnabled) { that._renderLightPages() } else { that._renderPages(that._pages) } that._renderNavigateButton("next"); that._updatePagesChooserWidth() }, _renderPageSizes: function() { var i, pageSizeValue, $pageSize, that = this, pageSizes = that.option("pageSizes"), pagesSizesLength = pageSizes && pageSizes.length, currentPageSize = that.option("pageSize"), clickPagesSizeAction = that._createAction(function(args) { var e = args.jQueryEvent; pageSizeValue = parseInt($(e.target).text()); that._testPageSizeIndex = pageSizeValue; that.option("pageSize", pageSizeValue) }); that._testCurrentPageSize = currentPageSize; that._$pagesSizeChooser.on(eventUtils.addNamespace(clickEvent.name, that.Name + "PageSize"), "." + PAGER_PAGE_SIZE_CLASS, function(e) { clickPagesSizeAction({ jQueryEvent: e }) }); for (i = 0; i < pagesSizesLength; i++) { $pageSize = $("<div />").text(pageSizes[i]).addClass(PAGER_PAGE_SIZE_CLASS); that.setAria({ role: "button", label: "Display " + pageSizes[i] + " items on page" }, $pageSize); if (currentPageSize === pageSizes[i]) { $pageSize.addClass(PAGER_SELECTION_CLASS) } that._$pagesSizeChooser.append($pageSize) } }, _calculateLightPageSizesWidth: function(pageSizes) { return Number(this._$pagesSizeChooser.css("min-width").replace("px", "")) + 10 * Math.max.apply(Math, pageSizes).toString().length }, _renderLightPageSizes: function() { var $editor, that = this, pageSizes = that.option("pageSizes"); $editor = $("<div/>").appendTo(that._$pagesSizeChooser); that._pageSizeEditor = that._createComponent($editor, SelectBox, { dataSource: pageSizes, value: that.option("pageSize"), onSelectionChanged: function(e) { that._testPageSizeIndex = e.selectedItem; that.option("pageSize", e.selectedItem) }, width: that._calculateLightPageSizesWidth(pageSizes) }) }, _renderPagesSizeChooser: function() { var that = this, pageSizes = that.option("pageSizes"), showPageSizes = that.option("showPageSizes"), pagesSizesLength = pageSizes && pageSizes.length, $element = that.element(); if (!showPageSizes || !pagesSizesLength) { return } that._$pagesSizeChooser && that._$pagesSizeChooser.remove(); that._$pagesSizeChooser = $("<div />").addClass(PAGER_PAGE_SIZES_CLASS).appendTo($element); if (that.option("lightModeEnabled")) { that._renderLightPageSizes() } else { that._renderPageSizes() } that._pagesSizeChooserWidth = that._$pagesSizeChooser.width() }, _renderInfo: function() { var infoText = this.option("infoText"); if (this.option("showInfo") && commonUtils.isDefined(infoText)) { this._$info = $("<div>").css("display", this._isInfoHide ? "none" : "").addClass(PAGER_INFO_CLASS).text(stringUtils.format(infoText, this.selectedPage && this.selectedPage.value(), this.option("pageCount"), this.option("totalCount"))).appendTo(this._$pagesChooser); if (!this._isInfoHide) { this._infoWidth = this._$info.outerWidth(true) } } }, _renderNavigateButton: function(direction) { var $button, that = this, clickAction = that._createAction(function() { that._nextPage(direction) }); if (that.option("showNavigationButtons") || that.option("lightModeEnabled")) { $button = $("<div>").addClass(PAGER_NAVIGATE_BUTTON).on(eventUtils.addNamespace(clickEvent.name, that.Name + "Pages"), function(e) { clickAction({ jQueryEvent: e }) }); that.setAria({ role: "button", label: "prev" === direction ? "Previous page" : " Next page" }, $button); if (that.option("rtlEnabled")) { $button.addClass("prev" === direction ? PAGER_NEXT_BUTTON_CLASS : PAGER_PREV_BUTTON_CLASS); $button.prependTo(this._$pagesChooser) } else { $button.addClass("prev" === direction ? PAGER_PREV_BUTTON_CLASS : PAGER_NEXT_BUTTON_CLASS); $button.appendTo(this._$pagesChooser) } } }, _renderContentImpl: function() { this.element().addClass(PAGER_CLASS).toggleClass(LIGHT_MODE_CLASS, this.option("lightModeEnabled")); this._toggleVisibility(this.option("visible")); this._updatePageSizes(true); this._updatePages(true) }, _render: function() { this.callBase(); this._updateLightMode() }, _updatePageSizes: function(forceRender) { var lightModeEnabled = this.option("lightModeEnabled"), pageSize = this.option("pageSize"), pageSizes = this.option("pageSizes"); if (lightModeEnabled) { this._pageSizeEditor && this._pageSizeEditor.option({ value: pageSize, dataSource: pageSizes, width: this._calculateLightPageSizesWidth(pageSizes) }) } if (!lightModeEnabled || forceRender) { this._renderPagesSizeChooser() } }, _updatePages: function(forceRender) { var pageCount = this.option("pageCount"), pageIndex = this.option("pageIndex"), lightModeEnabled = this.option("lightModeEnabled"); if (!lightModeEnabled) { this._processSelectedPage(this.option("maxPagesCount"), pageIndex, pageCount); this._pages = this._getPages(this.selectedPage, pageCount); this._selectPageByValue(pageIndex) } else { this._pageIndexEditor && this._pageIndexEditor.option({ value: pageIndex, width: this._calculateLightPagesWidth(this._pageIndexEditor.element(), pageCount) }) } if (!lightModeEnabled || forceRender) { this._renderPagesChooser() } this._updateButtonsState(pageIndex) }, _isPageIndexInvalid: function(direction, pageIndex) { var isNextDirection = "next" === direction, rtlEnabled = this.option("rtlEnabled"); if (rtlEnabled && isNextDirection || !rtlEnabled && !isNextDirection) { return pageIndex <= 1 } return pageIndex >= this.option("pageCount") }, _updateButtonsState: function(pageIndex) { var nextButton = this.element().find("." + PAGER_NEXT_BUTTON_CLASS), prevButton = this.element().find("." + PAGER_PREV_BUTTON_CLASS); nextButton.toggleClass(PAGER_BUTTON_DISABLE_CLASS, this._isPageIndexInvalid("next", pageIndex)); prevButton.toggleClass(PAGER_BUTTON_DISABLE_CLASS, this._isPageIndexInvalid("prev", pageIndex)) }, _optionChanged: function(args) { switch (args.name) { case "visible": this._toggleVisibility(args.value); break; case "pageIndex": var pageIndexChanged = this.option("pageIndexChanged"); if (pageIndexChanged) { pageIndexChanged(args.value) } this._updatePages(); break; case "maxPagesCount": case "pageCount": case "totalCount": case "hasKnownLastPage": case "pagesNavigatorVisible": case "showNavigationButtons": this._updatePages(); break; case "pageSize": var pageSizeChanged = this.option("pageSizeChanged"); if (pageSizeChanged) { pageSizeChanged(args.value) } this._updatePageSizes(); break; case "pageSizes": this._updatePageSizes(); break; case "lightModeEnabled": this._renderContentImpl(); !args.value && this._updateLightMode(); break; default: this._invalidate() } }, _clean: function() { this._$pagesChooser && this._$pagesChooser.off(eventUtils.addNamespace(clickEvent.name, this.Name + "Pages"), "." + PAGER_PAGE_CLASS, this._pageClickHandler); this.callBase() }, _getMinPagerWidth: function() { var pagesChooserWidth = commonUtils.isDefined(this._pagesChooserWidth) ? this._pagesChooserWidth : 0, pagesSizeChooserWidth = commonUtils.isDefined(this._pagesSizeChooserWidth) ? this._pagesSizeChooserWidth : 0; return pagesChooserWidth + pagesSizeChooserWidth }, _updatePagesChooserWidth: commonUtils.deferUpdater(function() { var lastPageWidth = this._pages && this._pages.length > 0 ? this._pages[this._pages.length - 1]._$page.width() : 0; this._pagesChooserWidth = this._$pagesChooser.width() + lastPageWidth }), _updateLightMode: commonUtils.deferUpdater(function() { var that = this, width = this.element().width(), infoWidth = commonUtils.isDefined(this._infoWidth) ? this._infoWidth : 0; commonUtils.deferRender(function() { if (that._isInfoHide && width > that._getMinPagerWidth() + infoWidth) { that._$info.show(); that._updatePagesChooserWidth(); that._isInfoHide = false } if (!that._isInfoHide && width > that._getMinPagerWidth() - infoWidth && width < that._getMinPagerWidth()) { that._$info.hide(); that._updatePagesChooserWidth(); that._isInfoHide = true } commonUtils.deferUpdate(function() { commonUtils.deferRender(function() { if (that.option("lightModeEnabled") && width >= that._previousWidth) { that.option("lightModeEnabled", false) } else { if (width < that._getMinPagerWidth()) { that.option("lightModeEnabled", true) } } that._previousWidth = width }) }) }) }), _dimensionChanged: function() { this._updateLightMode() }, getHeight: function() { return this.option("visible") ? this.element().outerHeight() : 0 } }); module.exports = Pager; registerComponent("dxPager", Pager) }, /*!*********************************************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.columns_resizing_reordering.js ***! \*********************************************************************/ function(module, exports, __webpack_require__) { var gridCore = __webpack_require__( /*! ./ui.data_grid.core */ 348), columnsResizingReorderingModule = __webpack_require__( /*! ../grid_core/ui.grid_core.columns_resizing_reordering */ 409); exports.DraggingHeaderView = columnsResizingReorderingModule.views.draggingHeaderView; exports.DraggingHeaderViewController = columnsResizingReorderingModule.controllers.draggingHeader; exports.ColumnsSeparatorView = columnsResizingReorderingModule.views.columnsSeparatorView; exports.TablePositionViewController = columnsResizingReorderingModule.controllers.tablePosition; exports.ColumnsResizerViewController = columnsResizingReorderingModule.controllers.columnsResizer; exports.TrackerView = columnsResizingReorderingModule.views.trackerView; gridCore.registerModule("columnsResizingReordering", columnsResizingReorderingModule) }, /*!*********************************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.columns_resizing_reordering.js ***! \*********************************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, eventUtils = __webpack_require__( /*! ../../events/utils */ 71), pointerEvents = __webpack_require__( /*! ../../events/pointer */ 76), dragEvents = __webpack_require__( /*! ../../events/drag */ 110), addNamespace = eventUtils.addNamespace, modules = __webpack_require__( /*! ./ui.grid_core.modules */ 350), gridCoreUtils = __webpack_require__( /*! ./ui.grid_core.utils */ 349), fx = __webpack_require__( /*! ../../animation/fx */ 68); var COLUMNS_SEPARATOR_CLASS = "columns-separator", COLUMNS_SEPARATOR_TRANSPARENT = "columns-separator-transparent", DRAGGING_HEADER_CLASS = "drag-header", CELL_CONTENT_CLASS = "text-content", HEADERS_DRAG_ACTION_CLASS = "drag-action", TRACKER_CLASS = "tracker", HEADERS_DROP_HIGHLIGHT_CLASS = "drop-highlight", BLOCK_SEPARATOR_CLASS = "dx-block-separator", HEADER_ROW_CLASS = "dx-header-row", WIDGET_CLASS = "dx-widget", MODULE_NAMESPACE = "dxDataGridResizingReordering", COLUMNS_SEPARATOR_TOUCH_TRACKER_WIDTH = 10, DRAGGING_DELTA = 5; var allowResizing = function(that) { return that.option("allowColumnResizing") || that.getController("columns").isColumnOptionUsed("allowResizing") }; var allowReordering = function(that) { return that.option("allowColumnReordering") || that.getController("columns").isColumnOptionUsed("allowReordering") }; var TrackerView = modules.View.inherit({ _renderCore: function() { this.callBase(); this.element().addClass(this.addWidgetPrefix(TRACKER_CLASS)); this.hide() }, _unsubscribeFromCallback: function() { if (this._positionChanged) { this._tablePositionController.positionChanged.remove(this._positionChanged) } }, _subscribeToCallback: function() { var that = this; that._positionChanged = function(position) { var $element = that.element(); if ($element && $element.hasClass(that.addWidgetPrefix(TRACKER_CLASS))) { $element.css({ top: position.top }); $element.height(position.height) } }; this._tablePositionController.positionChanged.add(that._positionChanged) }, optionChanged: function(args) { if ("allowColumnResizing" === args.name) { this._unsubscribeFromCallback(); if (args.value) { this._subscribeToCallback(); this._invalidate() } } this.callBase(args) }, init: function() { this.callBase(); this._tablePositionController = this.getController("tablePosition"); this._subscribeToCallback() }, isVisible: function() { return allowResizing(this) }, show: function() { this.element().show() }, hide: function() { this.element().hide() }, setHeight: function(value) { this.element().height(value) }, dispose: function() { this._unsubscribeFromCallback(); this.callBase() } }); var SeparatorView = modules.View.inherit({ _renderSeparator: function() {}, _renderCore: function(options) { this.callBase(options); this._isShown = true; this._renderSeparator(); this.hide() }, show: function() { this._isShown = true }, hide: function() { this._isShown = false }, height: function(value) { var $element = this.element(); if ($element) { if (commonUtils.isDefined(value)) { $element.height(value) } else { return $element.height() } } }, width: function(value) { var $element = this.element(); if ($element) { if (commonUtils.isDefined(value)) { $element.width(value) } else { return $element.width() } } } }); var ColumnsSeparatorView = SeparatorView.inherit({ _renderSeparator: function() { this.callBase(); var $element = this.element(); $element.addClass(this.addWidgetPrefix(COLUMNS_SEPARATOR_CLASS)) }, _subscribeToCallback: function() { var $element, that = this; that._positionChanged = function(position) { $element = that.element(); if ($element) { $element.css({ top: position.top }); $element.height(position.height) } }; that._tablePositionController.positionChanged.add(that._positionChanged) }, _unsubscribeFromCallback: function() { this._positionChanged && this._tablePositionController.positionChanged.remove(this._positionChanged) }, _init: function() { this._isTransparent = allowResizing(this); if (this.isVisible()) { this._subscribeToCallback() } }, isVisible: function() { return this.option("showColumnHeaders") && (allowReordering(this) || allowResizing(this)) }, optionChanged: function(args) { if ("allowColumnResizing" === args.name) { if (args.value) { this._init(); this._invalidate(); this.hide(true) } else { this._unsubscribeFromCallback(); this._isTransparent = allowResizing(this); this.hide(true) } } this.callBase(args) }, init: function() { this.callBase(); this._tablePositionController = this.getController("tablePosition"); this._init() }, show: function() { var that = this, $element = this.element(); if ($element && !that._isShown) { if (that._isTransparent) { $element.removeClass(that.addWidgetPrefix(COLUMNS_SEPARATOR_TRANSPARENT)) } else { $element.show() } } this.callBase() }, hide: function(force) { var $element = this.element(), columnsSeparatorTransparent = this.addWidgetPrefix(COLUMNS_SEPARATOR_TRANSPARENT); if ($element && (this._isShown || force)) { if (this._isTransparent) { $element.addClass(columnsSeparatorTransparent); if ("none" === $element.css("display")) { $element.show() } } else { if ($element.hasClass(columnsSeparatorTransparent)) { $element.removeClass(columnsSeparatorTransparent) } $element.hide() } } this.callBase() }, moveByX: function(outerX) { var $element = this.element(); if ($element) { $element.css("left", outerX - this._parentElement().offset().left); this._testPosX = outerX } }, changeCursor: function(cursorName) { cursorName = commonUtils.isDefined(cursorName) ? cursorName : ""; var $element = this.element(); if ($element) { $element.css("cursor", cursorName); this._testCursorName = cursorName } }, dispose: function() { this._unsubscribeFromCallback(); this.callBase() } }); var BlockSeparatorView = SeparatorView.inherit({ init: function() { var that = this; this.callBase(); this.getController("data").loadingChanged.add(function(isLoading) { var element = that.element(); if (!isLoading && element && "none" !== element.css("display")) { that.hide() } }) }, _renderSeparator: function() { this.callBase(); this.element().addClass(BLOCK_SEPARATOR_CLASS).html(" ") }, hide: function() { var that = this, $parent = this._parentElement(), $element = this.element(); if ($element && this._isShown) { $element.hide() } if ($parent && !$parent.children("." + BLOCK_SEPARATOR_CLASS).length) { $parent.prepend(that.element()) } that.callBase() }, isVisible: function() { var groupPanelOptions = this.option("groupPanel"), columnChooserOptions = this.option("columnChooser"); return groupPanelOptions && groupPanelOptions.visible || columnChooserOptions && columnChooserOptions.enabled }, show: function(targetLocation) { var that = this, $element = this.element(), startAnimate = function(toOptions) { fx.stop($element, true); fx.animate($element, { type: "slide", from: { width: 0, display: toOptions.display }, to: toOptions, duration: 300, easing: "swing" }) }; if ($element && !that._isShown) { switch (targetLocation) { case "group": startAnimate({ width: "50px", display: "inline-block" }); break; case "columnChooser": startAnimate({ width: "100%", display: "block" }); break; default: $element.show() } } that.callBase() } }); var DraggingHeaderView = modules.View.inherit({ _isDragging: false, _getDraggingPanelByPos: function(pos) { var result, that = this; $.each(that._dragOptions.draggingPanels, function(index, draggingPanel) { if (draggingPanel) { var boundingRect = draggingPanel.getBoundingRect(); if (boundingRect && (void 0 === boundingRect.bottom || pos.y < boundingRect.bottom) && (void 0 === boundingRect.top || pos.y > boundingRect.top) && (void 0 === boundingRect.left || pos.x > boundingRect.left) && (void 0 === boundingRect.right || pos.x < boundingRect.right)) { result = draggingPanel; return false } } }); return result }, _renderCore: function() { this.element().addClass(this.addWidgetPrefix(DRAGGING_HEADER_CLASS) + " " + this.addWidgetPrefix(CELL_CONTENT_CLASS) + " " + WIDGET_CLASS).css("display", "none") }, _resetTargetColumnOptions: function() { var params = this._dropOptions; params.targetColumnIndex = -1; delete params.targetColumnElement; delete params.isLast; delete params.posX; delete params.posY }, _getVisibleIndexObject: function(rowIndex, visibleIndex) { if (commonUtils.isDefined(rowIndex)) { return { columnIndex: visibleIndex, rowIndex: rowIndex } } return visibleIndex }, dispose: function() { var element = this.element(); this._dragOptions = null; element && element.parent().find("." + this.addWidgetPrefix(DRAGGING_HEADER_CLASS)).remove() }, isVisible: function() { var columnsController = this.getController("columns"), commonColumnSettings = columnsController.getCommonSettings(); return this.option("showColumnHeaders") && (allowReordering(this) || commonColumnSettings.allowGrouping || commonColumnSettings.allowHiding) }, init: function() { var that = this; this.callBase(); this._controller = this.getController("draggingHeader"); this._columnsResizerViewController = this.getController("columnsResizer"); this.getController("data").loadingChanged.add(function(isLoading) { var element = that.element(); if (!isLoading && element && "none" !== element.css("display")) { element.hide() } }) }, dragHeader: function(options) { var that = this, columnElement = options.columnElement; that._isDragging = true; that._dragOptions = options; that._dropOptions = { sourceIndex: options.index, sourceColumnIndex: that._getVisibleIndexObject(options.rowIndex, options.columnIndex), sourceColumnElement: options.columnElement, sourceLocation: options.sourceLocation }; that._onSelectStart = document.onselectstart; document.onselectstart = function() { return false }; that.element().css({ textAlign: columnElement && columnElement.css("text-align"), height: columnElement && columnElement.height(), width: columnElement && columnElement.width(), whiteSpace: columnElement && columnElement.css("white-space") }).addClass(that.addWidgetPrefix(HEADERS_DRAG_ACTION_CLASS)).text(options.sourceColumn.caption); that.element().appendTo($(document.body)) }, moveHeader: function(args) { var newLeft, newTop, moveDeltaX, moveDeltaY, e = args.jQueryEvent, that = e.data.that, eventData = eventUtils.eventData(e), isResizing = that._columnsResizerViewController ? that._columnsResizerViewController.isResizing() : false, dragOptions = that._dragOptions; if (that._isDragging && !isResizing) { moveDeltaX = Math.abs(eventData.x - dragOptions.columnElement.offset().left - dragOptions.deltaX); moveDeltaY = Math.abs(eventData.y - dragOptions.columnElement.offset().top - dragOptions.deltaY); if (that.element().is(":visible") || moveDeltaX > DRAGGING_DELTA || moveDeltaY > DRAGGING_DELTA) { that.element().show(); newLeft = eventData.x - dragOptions.deltaX; newTop = eventData.y - dragOptions.deltaY; that.element().offset({ left: newLeft, top: newTop }); that.dockHeader(eventData) } e.preventDefault() } }, dockHeader: function(eventData) { var i, centerPosition, that = this, targetDraggingPanel = that._getDraggingPanelByPos(eventData), controller = that._controller, params = that._dropOptions; if (targetDraggingPanel) { var rtlEnabled = that.option("rtlEnabled"), isVerticalOrientation = "columnChooser" === targetDraggingPanel.getName(), axisName = isVerticalOrientation ? "y" : "x", targetLocation = targetDraggingPanel.getName(), rowIndex = "headers" === targetLocation ? that._dragOptions.rowIndex : void 0, sourceColumn = that._dragOptions.sourceColumn, columnElements = targetDraggingPanel.getColumnElements(rowIndex, sourceColumn && sourceColumn.ownerBand) || [], pointsByColumns = controller._generatePointsByColumns(extend({}, that._dragOptions, { targetDraggingPanel: targetDraggingPanel, columns: targetDraggingPanel.getColumns(rowIndex), columnElements: columnElements, isVerticalOrientation: isVerticalOrientation, startColumnIndex: "headers" === targetLocation && $(columnElements[0]).index() })); this._testPointsByColumns = pointsByColumns; params.targetLocation = targetLocation; if (pointsByColumns.length > 0) { for (i = 0; i < pointsByColumns.length; i++) { centerPosition = pointsByColumns[i + 1] && (pointsByColumns[i][axisName] + pointsByColumns[i + 1][axisName]) / 2; if (void 0 === centerPosition || (rtlEnabled && "x" === axisName ? eventData[axisName] > centerPosition : eventData[axisName] < centerPosition)) { params.targetColumnIndex = that._getVisibleIndexObject(rowIndex, pointsByColumns[i].columnIndex); if (columnElements[i]) { params.targetColumnElement = columnElements.eq(i); params.isLast = false } else { params.targetColumnElement = columnElements.last(); params.isLast = true } params.posX = pointsByColumns[i].x; params.posY = pointsByColumns[i].y; controller.dock(params); break } } } else { that._resetTargetColumnOptions(); controller.dock(params) } } }, dropHeader: function(args) { var e = args.jQueryEvent, that = e.data.that, controller = that._controller; that.element().hide(); if (controller && that._isDragging) { controller.drop(that._dropOptions) } that.element().appendTo(that._parentElement()); that._dragOptions = null; that._dropOptions = null; that._isDragging = false; document.onselectstart = that._onSelectStart || null } }); var isNextColumnResizingMode = function(that) { return "widget" !== that.option("columnResizingMode") }; var ColumnsResizerViewController = modules.ViewController.inherit({ _isHeadersRowArea: function(posY) { if (this._columnHeadersView) { var headersRowHeight, offsetTop, element = this._columnHeadersView.element(); if (element) { offsetTop = element.offset().top; headersRowHeight = this._columnHeadersView.getHeadersRowHeight(); return posY >= offsetTop && posY <= offsetTop + headersRowHeight } } return false }, _pointCreated: function(point, cellsLength, columns) { var currentColumn, nextColumn, isNextColumnMode = isNextColumnResizingMode(this), rtlEnabled = this.option("rtlEnabled"), firstPointColumnIndex = !isNextColumnMode && rtlEnabled ? 0 : 1; if (point.index >= firstPointColumnIndex && point.index < cellsLength + (!isNextColumnMode && !rtlEnabled ? 1 : 0)) { point.columnIndex -= firstPointColumnIndex; currentColumn = columns[point.columnIndex] || {}; nextColumn = columns[point.columnIndex + 1] || {}; return !(isNextColumnMode ? currentColumn.allowResizing && nextColumn.allowResizing : currentColumn.allowResizing) } return true }, _getTargetPoint: function(pointsByColumns, currentX, deltaX) { if (pointsByColumns) { for (var i = 0; i < pointsByColumns.length; i++) { if (pointsByColumns[i].x === pointsByColumns[0].x && pointsByColumns[i + 1] && pointsByColumns[i].x === pointsByColumns[i + 1].x) { continue } if (pointsByColumns[i].x - deltaX <= currentX && currentX <= pointsByColumns[i].x + deltaX) { return pointsByColumns[i] } } } return null }, _moveSeparator: function(args) { var e = args.jQueryEvent, that = e.data, columnsSeparatorWidth = that._columnsSeparatorView.width(), columnsSeparatorOffset = that._columnsSeparatorView.element().offset(), isNextColumnMode = isNextColumnResizingMode(that), deltaX = columnsSeparatorWidth / 2, parentOffset = that._$parentContainer.offset(), parentOffsetLeft = parentOffset.left, eventData = eventUtils.eventData(e); if (that._isResizing) { if (parentOffsetLeft <= eventData.x && (!isNextColumnMode || eventData.x <= parentOffsetLeft + that._$parentContainer.width())) { if (that._updateColumnsWidthIfNeeded(eventData.x)) { var $cell = that._columnHeadersView.getColumnElements().eq(that._resizingInfo.currentColumnIndex); that._columnsSeparatorView.moveByX($cell.offset().left + (isNextColumnMode && that.option("rtlEnabled") ? 0 : $cell.outerWidth())); that._tablePositionController.update(that._targetPoint.y); e.preventDefault() } } } else { if (that._isHeadersRowArea(eventData.y)) { if (that._previousParentOffset) { if (that._previousParentOffset.left !== parentOffset.left || that._previousParentOffset.top !== parentOffset.top) { that.pointsByColumns(null) } } that._targetPoint = that._getTargetPoint(that.pointsByColumns(), eventData.x, columnsSeparatorWidth); that._previousParentOffset = parentOffset; that._isReadyResizing = false; if (that._targetPoint && that._targetPoint.y <= eventData.y && columnsSeparatorOffset.top + that._columnsSeparatorView.height() >= eventData.y) { that._columnsSeparatorView.changeCursor("col-resize"); that._columnsSeparatorView.moveByX(that._targetPoint.x - deltaX); that._tablePositionController.update(that._targetPoint.y); that._isReadyResizing = true; e.preventDefault() } else { that._columnsSeparatorView.changeCursor() } } else { that.pointsByColumns(null); that._isReadyResizing = false; that._columnsSeparatorView.changeCursor() } } }, _endResizing: function(args) { var e = args.jQueryEvent, that = e.data; if (that._isResizing) { that.pointsByColumns(null); that._resizingInfo = null; that._columnsSeparatorView.hide(); that._columnsSeparatorView.changeCursor(); that._trackerView.hide(); that._isReadyResizing = false; that._isResizing = false } }, _getNextColumnIndex: function(currentColumnIndex) { return currentColumnIndex + 1 }, _setupResizingInfo: function(posX) { var that = this, currentColumnIndex = that._targetPoint.columnIndex, nextColumnIndex = that._getNextColumnIndex(currentColumnIndex), currentHeader = that._columnHeadersView.getHeaderElement(currentColumnIndex), nextHeader = that._columnHeadersView.getHeaderElement(nextColumnIndex); that._resizingInfo = { startPosX: posX, currentColumnIndex: currentColumnIndex, currentColumnWidth: currentHeader && currentHeader.length > 0 ? currentHeader.outerWidth() : 0, nextColumnIndex: nextColumnIndex, nextColumnWidth: nextHeader && nextHeader.length > 0 ? nextHeader.outerWidth() : 0 } }, _startResizing: function(args) { var e = args.jQueryEvent, that = e.data, eventData = eventUtils.eventData(e), editingController = that.getController("editing"), editingMode = that.option("editing.mode"), isCellEditing = editingController.isEditing() && ("batch" === editingMode || "cell" === editingMode); if (eventUtils.isTouchEvent(e)) { if (that._isHeadersRowArea(eventData.y)) { that._targetPoint = that._getTargetPoint(that.pointsByColumns(), eventData.x, COLUMNS_SEPARATOR_TOUCH_TRACKER_WIDTH); if (that._targetPoint) { that._columnsSeparatorView.moveByX(that._targetPoint.x - that._columnsSeparatorView.width() / 2); that._isReadyResizing = true } } else { that._isReadyResizing = false } } if (that._isReadyResizing && !isCellEditing) { if (that._targetPoint) { that._testColumnIndex = that._targetPoint.columnIndex } that._setupResizingInfo(eventData.x); that._tablePositionController.update(that._targetPoint.y); that._columnsSeparatorView.show(); that._trackerView.show(); that._isResizing = true; e.preventDefault(); e.stopPropagation() } }, _generatePointsByColumns: function() { var that = this, columns = that._columnsController ? that._columnsController.getVisibleColumns() : [], cells = that._columnHeadersView.getColumnElements(), pointsByColumns = []; if (cells && cells.length > 0) { pointsByColumns = gridCoreUtils.getPointsByColumns(cells, function(point) { return that._pointCreated(point, cells.length, columns) }) } that._pointsByColumns = pointsByColumns }, _unsubscribeFromEvents: function() { this._moveSeparatorHandler && $(document).off(addNamespace(pointerEvents.move, MODULE_NAMESPACE), this._moveSeparatorHandler); this._startResizingHandler && this._$parentContainer.off(addNamespace(pointerEvents.down, MODULE_NAMESPACE), this._startResizingHandler); if (this._endResizingHandler) { this._columnsSeparatorView.element().off(addNamespace(pointerEvents.up, MODULE_NAMESPACE), this._endResizingHandler); $(document).off(addNamespace(pointerEvents.up, MODULE_NAMESPACE), this._endResizingHandler) } }, _subscribeToEvents: function() { this._moveSeparatorHandler = this.createAction(this._moveSeparator); this._startResizingHandler = this.createAction(this._startResizing); this._endResizingHandler = this.createAction(this._endResizing); $(document).on(addNamespace(pointerEvents.move, MODULE_NAMESPACE), this, this._moveSeparatorHandler); this._$parentContainer.on(addNamespace(pointerEvents.down, MODULE_NAMESPACE), this, this._startResizingHandler); this._columnsSeparatorView.element().on(addNamespace(pointerEvents.up, MODULE_NAMESPACE), this, this._endResizingHandler); $(document).on(addNamespace(pointerEvents.up, MODULE_NAMESPACE), this, this._endResizingHandler) }, _updateColumnsWidthIfNeeded: function(posX) { var deltaX, nextCellWidth, column, minWidth, nextColumn, cellWidth, needUpdate = false, columnsController = this._columnsController, visibleColumns = columnsController.getVisibleColumns(), columnsSeparatorWidth = this._columnsSeparatorView.width(), contentWidth = this._rowsView.contentWidth(), isNextColumnMode = isNextColumnResizingMode(this), adaptColumnWidthByRatio = isNextColumnMode && this.option("adaptColumnWidthByRatio") && !this.option("columnAutoWidth"); function setColumnWidth(column, columnWidth, contentWidth, adaptColumnWidthByRatio) { if (column) { var oldColumnWidth = column.width; if (oldColumnWidth) { adaptColumnWidthByRatio = commonUtils.isString(oldColumnWidth) && "%" === oldColumnWidth.slice(-1) } if (adaptColumnWidthByRatio) { column && columnsController.columnOption(column.index, "visibleWidth", columnWidth); column && columnsController.columnOption(column.index, "width", (columnWidth / contentWidth * 100).toFixed(3) + "%") } else { column && columnsController.columnOption(column.index, "visibleWidth", void 0); column && columnsController.columnOption(column.index, "width", columnWidth) } } } deltaX = posX - this._resizingInfo.startPosX; if (isNextColumnMode && this.option("rtlEnabled")) { deltaX = -deltaX } cellWidth = this._resizingInfo.currentColumnWidth + deltaX; column = visibleColumns[this._resizingInfo.currentColumnIndex]; minWidth = column && column.minWidth || columnsSeparatorWidth; needUpdate = cellWidth >= minWidth; if (isNextColumnMode) { nextCellWidth = this._resizingInfo.nextColumnWidth - deltaX; nextColumn = visibleColumns[this._resizingInfo.nextColumnIndex]; minWidth = nextColumn && nextColumn.minWidth || columnsSeparatorWidth; needUpdate = needUpdate && nextCellWidth >= minWidth } if (needUpdate) { columnsController.beginUpdate(); cellWidth = Math.floor(cellWidth); setColumnWidth(column, cellWidth, contentWidth, adaptColumnWidthByRatio); if (isNextColumnMode) { nextCellWidth = Math.floor(nextCellWidth); setColumnWidth(nextColumn, nextCellWidth, contentWidth, adaptColumnWidthByRatio) } else { var columnWidths = this._columnHeadersView.getColumnWidths(); for (var i = 0; i < columnWidths.length; i++) { if (visibleColumns[i] && visibleColumns[i] !== column && void 0 === visibleColumns[i].width) { columnsController.columnOption(visibleColumns[i].index, "width", columnWidths[i]) } } } columnsController.endUpdate(); if (!isNextColumnMode) { this.component.updateDimensions() } } return needUpdate }, _subscribeToCallback: function(callback, handler) { callback.add(handler); this._subscribesToCallbacks.push({ callback: callback, handler: handler }) }, _unsubscribeFromCallbacks: function() { var i, subscribe; for (i = 0; i < this._subscribesToCallbacks.length; i++) { subscribe = this._subscribesToCallbacks[i]; subscribe.callback.remove(subscribe.handler) } this._subscribesToCallbacks = [] }, _unsubscribes: function() { this._unsubscribeFromEvents(); this._unsubscribeFromCallbacks() }, _init: function() { var that = this, generatePointsByColumnsHandler = function() { if (!that._isResizing) { that.pointsByColumns(null) } }, generatePointsByColumnsScrollHandler = function(offset) { if (that._scrollLeft !== offset.left) { that._scrollLeft = offset.left; that.pointsByColumns(null) } }; that._columnsSeparatorView = that.getView("columnsSeparatorView"); that._columnHeadersView = that.getView("columnHeadersView"); that._trackerView = that.getView("trackerView"); that._rowsView = that.getView("rowsView"); that._columnsController = that.getController("columns"); that._tablePositionController = that.getController("tablePosition"); that._$parentContainer = that._columnsSeparatorView.component.element(); that._subscribeToCallback(that._columnHeadersView.renderCompleted, generatePointsByColumnsHandler); that._subscribeToCallback(that._columnHeadersView.resizeCompleted, generatePointsByColumnsHandler); that._subscribeToCallback(that._columnsSeparatorView.renderCompleted, function() { that._unsubscribeFromEvents(); that._subscribeToEvents() }); that._subscribeToCallback(that._rowsView.renderCompleted, function() { that._rowsView.scrollChanged.remove(generatePointsByColumnsScrollHandler); that._rowsView.scrollChanged.add(generatePointsByColumnsScrollHandler) }); var previousScrollbarVisibility = 0 !== that._rowsView.getScrollbarWidth(); var previousTableHeight = 0; that._subscribeToCallback(that.getController("tablePosition").positionChanged, function(e) { if (that._isResizing && !that._rowsView.isResizing) { var scrollbarVisibility = 0 !== that._rowsView.getScrollbarWidth(); if (previousScrollbarVisibility !== scrollbarVisibility || previousTableHeight && previousTableHeight !== e.height) { previousScrollbarVisibility = scrollbarVisibility; previousTableHeight = e.height; that.component.updateDimensions() } else { that._rowsView.updateFreeSpaceRowHeight() } } previousTableHeight = e.height }) }, optionChanged: function(args) { this.callBase(args); if ("allowColumnResizing" === args.name) { if (args.value) { this._init(); this._subscribeToEvents() } else { this._unsubscribes() } } }, isResizing: function() { return this._isResizing }, init: function() { this._subscribesToCallbacks = []; if (allowResizing(this)) { this._init() } }, pointsByColumns: function(value) { if (void 0 !== value) { this._pointsByColumns = value } else { if (!this._pointsByColumns) { this._generatePointsByColumns() } return this._pointsByColumns } }, dispose: function() { this._unsubscribes(); this.callBase() } }); var TablePositionViewController = modules.ViewController.inherit({ update: function(top) { var that = this, $element = that._columnHeadersView.element(), offset = $element && $element.offset(), offsetTop = offset && offset.top || 0, diffOffsetTop = commonUtils.isDefined(top) ? Math.abs(top - offsetTop) : 0, columnsHeadersHeight = that._columnHeadersView ? that._columnHeadersView.getHeight() : 0, rowsHeight = that._rowsView ? that._rowsView.height() - that._rowsView.getScrollbarWidth(true) : 0; that.positionChanged.fire({ height: columnsHeadersHeight + rowsHeight - diffOffsetTop, top: $element && $element.length && $element[0].offsetTop + diffOffsetTop }) }, init: function() { var that = this; that.callBase(); that._columnHeadersView = this.getView("columnHeadersView"); that._rowsView = this.getView("rowsView"); that._pagerView = this.getView("pagerView"); that._rowsView.resizeCompleted.add(function() { that.update() }) }, ctor: function(component) { this.callBase(component); this.positionChanged = $.Callbacks() } }); var DraggingHeaderViewController = modules.ViewController.inherit({ _generatePointsByColumns: function(options) { var that = this; return gridCoreUtils.getPointsByColumns(options.columnElements, function(point) { return that._pointCreated(point, options.columns, options.targetDraggingPanel.getName(), options.sourceColumn) }, options.isVerticalOrientation, options.startColumnIndex) }, _pointCreated: function(point, columns, location, sourceColumn) { var targetColumn = columns[point.columnIndex], prevColumn = columns[point.columnIndex - 1]; switch (location) { case "columnChooser": return true; case "headers": return sourceColumn && !sourceColumn.allowReordering || (!targetColumn || !targetColumn.allowReordering) && (!prevColumn || !prevColumn.allowReordering); default: return 0 === columns.length } }, _subscribeToEvents: function(draggingHeader, draggingPanels) { var that = this; $.each(draggingPanels, function(_, draggingPanel) { if (draggingPanel) { var i, columns, columnElements, rowCount = draggingPanel.getRowCount ? draggingPanel.getRowCount() : 1, nameDraggingPanel = draggingPanel.getName(), subscribeToEvents = function(index, columnElement) { var $columnElement = $(columnElement), column = columns[index]; if (draggingPanel.allowDragging(columns[index], nameDraggingPanel, draggingPanels)) { $columnElement.addClass(that.addWidgetPrefix(HEADERS_DRAG_ACTION_CLASS)); $columnElement.on(addNamespace(dragEvents.start, MODULE_NAMESPACE), that.createAction(function(args) { var e = args.jQueryEvent, eventData = eventUtils.eventData(e); draggingHeader.dragHeader({ deltaX: eventData.x - $(e.currentTarget).offset().left, deltaY: eventData.y - $(e.currentTarget).offset().top, sourceColumn: column, index: column.index, columnIndex: index, columnElement: $columnElement, sourceLocation: nameDraggingPanel, draggingPanels: draggingPanels, rowIndex: that._columnsController.getRowIndex(column.index, true) }) })); $columnElement.on(addNamespace(dragEvents.move, MODULE_NAMESPACE), { that: draggingHeader }, that.createAction(draggingHeader.moveHeader)); $columnElement.on(addNamespace(dragEvents.end, MODULE_NAMESPACE), { that: draggingHeader }, that.createAction(draggingHeader.dropHeader)) } }; for (i = 0; i < rowCount; i++) { columnElements = draggingPanel.getColumnElements(i) || []; if (columnElements.length) { columns = draggingPanel.getColumns(i) || []; $.each(columnElements, subscribeToEvents) } } } }) }, _unsubscribeFromEvents: function(draggingHeader, draggingPanels) { var that = this; $.each(draggingPanels, function(_, draggingPanel) { if (draggingPanel) { var columnElements = draggingPanel.getColumnElements() || []; $.each(columnElements, function(index, columnElement) { var $columnElement = $(columnElement); $columnElement.off(addNamespace(dragEvents.start, MODULE_NAMESPACE)); $columnElement.off(addNamespace(dragEvents.move, MODULE_NAMESPACE)); $columnElement.off(addNamespace(dragEvents.end, MODULE_NAMESPACE)); $columnElement.removeClass(that.addWidgetPrefix(HEADERS_DRAG_ACTION_CLASS)) }) } }) }, _getSeparator: function(targetLocation) { return "headers" === targetLocation ? this._columnsSeparatorView : this._blockSeparatorView }, hideSeparators: function() { var blockSeparator = this._blockSeparatorView, columnsSeparator = this._columnsSeparatorView; this._animationColumnIndex = null; blockSeparator && blockSeparator.hide(); columnsSeparator && columnsSeparator.hide() }, init: function() { var subscribeToEvents, that = this; that.callBase(); that._columnsController = that.getController("columns"); that._columnHeadersView = that.getView("columnHeadersView"); that._columnsSeparatorView = that.getView("columnsSeparatorView"); that._draggingHeaderView = that.getView("draggingHeaderView"); that._rowsView = that.getView("rowsView"); that._blockSeparatorView = that.getView("blockSeparatorView"); that._headerPanelView = that.getView("headerPanel"); that._columnChooserView = that.getView("columnChooserView"); subscribeToEvents = function() { if (that._draggingHeaderView) { var draggingPanels = [that._columnChooserView, that._columnHeadersView, that._headerPanelView]; that._unsubscribeFromEvents(that._draggingHeaderView, draggingPanels); that._subscribeToEvents(that._draggingHeaderView, draggingPanels) } }; that._columnHeadersView.renderCompleted.add(subscribeToEvents); that._headerPanelView && that._headerPanelView.renderCompleted.add(subscribeToEvents); that._columnChooserView && that._columnChooserView.renderCompleted.add(subscribeToEvents) }, allowDrop: function(parameters) { return this._columnsController.allowMoveColumn(parameters.sourceColumnIndex, parameters.targetColumnIndex, parameters.sourceLocation, parameters.targetLocation) }, dock: function(parameters) { var that = this, targetColumnIndex = commonUtils.isObject(parameters.targetColumnIndex) ? parameters.targetColumnIndex.columnIndex : parameters.targetColumnIndex, sourceLocation = parameters.sourceLocation, sourceIndex = parameters.sourceIndex, sourceColumnElement = parameters.sourceColumnElement, targetLocation = parameters.targetLocation, separator = that._getSeparator(targetLocation), hasTargetVisibleIndex = targetColumnIndex >= 0; var showSeparator = function() { if (that._animationColumnIndex !== targetColumnIndex) { that.hideSeparators(); separator.element()[parameters.isLast ? "insertAfter" : "insertBefore"](parameters.targetColumnElement); that._animationColumnIndex = targetColumnIndex; separator.show(targetLocation) } }; that._columnHeadersView.element().find("." + HEADER_ROW_CLASS).toggleClass(that.addWidgetPrefix(HEADERS_DROP_HIGHLIGHT_CLASS), "headers" !== sourceLocation && "headers" === targetLocation && !hasTargetVisibleIndex); if (separator) { if (sourceColumnElement) { sourceColumnElement.css({ opacity: .5 }); if ("headers" === sourceLocation) { that._columnHeadersView.setRowsOpacity(sourceIndex, .5); that._rowsView.setRowsOpacity(sourceIndex, .5) } } if (that.allowDrop(parameters) && hasTargetVisibleIndex) { if ("group" === targetLocation || "columnChooser" === targetLocation) { showSeparator() } else { that.hideSeparators(); that.getController("tablePosition").update(parameters.posY); separator.moveByX(parameters.posX - separator.width()); separator.show() } } else { that.hideSeparators() } } }, drop: function(parameters) { var sourceColumnElement = parameters.sourceColumnElement; if (sourceColumnElement) { sourceColumnElement.css({ opacity: "" }); this._columnHeadersView.setRowsOpacity(parameters.sourceIndex, ""); this._rowsView.setRowsOpacity(parameters.sourceIndex, ""); this._columnHeadersView.element().find("." + HEADER_ROW_CLASS).removeClass(this.addWidgetPrefix(HEADERS_DROP_HIGHLIGHT_CLASS)) } if (this.allowDrop(parameters)) { var separator = this._getSeparator(parameters.targetLocation); if (separator) { separator.hide() } this._columnsController.moveColumn(parameters.sourceColumnIndex, parameters.targetColumnIndex, parameters.sourceLocation, parameters.targetLocation) } }, dispose: function() { if (this._draggingHeaderView) { this._unsubscribeFromEvents(this._draggingHeaderView, [this._columnChooserView, this._columnHeadersView, this._headerPanelView]) } } }); module.exports = { views: { columnsSeparatorView: ColumnsSeparatorView, blockSeparatorView: BlockSeparatorView, draggingHeaderView: DraggingHeaderView, trackerView: TrackerView }, controllers: { draggingHeader: DraggingHeaderViewController, tablePosition: TablePositionViewController, columnsResizer: ColumnsResizerViewController } } }, /*!*************************************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.keyboard_navigation.js ***! \*************************************************************/ function(module, exports, __webpack_require__) { var gridCore = __webpack_require__( /*! ./ui.data_grid.core */ 348), keyboardNavigationModule = __webpack_require__( /*! ../grid_core/ui.grid_core.keyboard_navigation */ 411); gridCore.registerModule("keyboardNavigation", keyboardNavigationModule) }, /*!*************************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.keyboard_navigation.js ***! \*************************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), core = __webpack_require__( /*! ./ui.grid_core.modules */ 350), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, KeyboardProcessor = __webpack_require__( /*! ../widget/ui.keyboard_processor */ 101), eventUtils = __webpack_require__( /*! ../../events/utils */ 71), pointerEvents = __webpack_require__( /*! ../../events/pointer */ 76); var ROWS_VIEW_CLASS = "rowsview", EDIT_FORM_CLASS = "edit-form", GROUP_FOOTER_CLASS = "group-footer", ROW_CLASS = "dx-row", DATA_ROW_CLASS = "dx-data-row", GROUP_ROW_CLASS = "dx-group-row", EDIT_FORM_ITEM_CLASS = "edit-form-item", MASTER_DETAIL_ROW_CLASS = "dx-master-detail-row", MASTER_DETAIL_CELL_CLASS = "dx-master-detail-cell", DROPDOWN_EDITOR_OVERLAY_CLASS = "dx-dropdowneditor-overlay", COMMAND_EXPAND_CLASS = "dx-command-expand", INTERACTIVE_ELEMENTS_SELECTOR = "input:not([type='hidden']), textarea, a, [tabindex]", VIEWS = ["rowsView"], EDIT_MODE_ROW = "row", EDIT_MODE_FORM = "form"; function isGroupRow($row) { return $row && $row.hasClass(GROUP_ROW_CLASS) } function isDetailRow($row) { return $row && $row.hasClass(MASTER_DETAIL_ROW_CLASS) } function isCellElement($element) { return $element.length && "TD" === $element[0].tagName } var KeyboardNavigationController = core.ViewController.inherit({ _isRowEditMode: function() { var editMode = this._editingController.getEditMode(); return editMode === EDIT_MODE_ROW || editMode === EDIT_MODE_FORM }, _focusView: function(view, viewIndex) { this._focusedViews.viewIndex = viewIndex; this._focusedView = view }, _getInteractiveElement: function($cell, isLast) { var $focusedElement = $cell.find(INTERACTIVE_ELEMENTS_SELECTOR).filter(":visible"); return isLast ? $focusedElement.last() : $focusedElement.first() }, _focusInteractiveElement: function($cell, isLast) { if (!$cell) { return } var $focusedElement = this._getInteractiveElement($cell, isLast); this._testInteractiveElement = $focusedElement; $focusedElement.focus() }, _updateFocus: function() { var that = this, $cell = that._getFocusedCell(); if ($cell) { if (that._hasSkipRow($cell.parent())) { $cell = that._getNextCell(this._focusedCellPosition && this._focusedCellPosition.rowIndex > 0 ? "upArrow" : "downArrow") } if ($cell && $cell.length > 0) { setTimeout(function() { if ($cell.is("td") || $cell.hasClass(that.addWidgetPrefix(EDIT_FORM_ITEM_CLASS))) { if (that.getController("editorFactory").focus()) { that._focus($cell) } if (that._editingController.isEditing()) { $.proxy(that._focusInteractiveElement, that)($cell) } } else { $cell.focus() } }) } } }, _applyTabIndexToElement: function($element) { var tabIndex = this.option("tabIndex"); $element.attr("tabIndex", commonUtils.isDefined(tabIndex) ? tabIndex : 0) }, _clickHandler: function(e) { var event = e.jQueryEvent, $cell = $(event.currentTarget), $grid = $(event.target).closest("." + this.getWidgetContainerClass()).parent(), data = event.data; if ($grid.is(this.component.element()) && this._isCellValid($cell)) { this._focusView(data.view, data.viewIndex); this._updateFocusedCellPosition($cell); if (!this._editingController.isEditing()) { this._applyTabIndexToElement(data.view.element()); data.view.element().find(".dx-row > td[tabIndex]").attr("tabIndex", null); $cell.focus() } } else { this._resetFocusedCell() } }, _initFocusedViews: function() { var that = this, clickAction = that.createAction(that._clickHandler); that._focusedViews = []; $.each(VIEWS, function(key, viewName) { var view = that.getView(viewName); if (view && view.isVisible()) { that._focusedViews.push(view) } }); $.each(that._focusedViews, function(index, view) { if (view) { view.renderCompleted.add(function() { var $element = view.element(); $element.off(eventUtils.addNamespace(pointerEvents.down, "dxDataGridKeyboardNavigation"), clickAction); $element.on(eventUtils.addNamespace(pointerEvents.down, "dxDataGridKeyboardNavigation"), "." + ROW_CLASS + " td", { viewIndex: index, view: view }, clickAction); that._initKeyDownProcessor(that, $element, that._keyDownHandler); if (that._focusedView && that._focusedView.name === view.name && that._isNeedFocus) { that._updateFocus() } }) } }) }, _initKeyDownProcessor: function(context, element, handler) { if (this._keyDownProcessor) { this._keyDownProcessor.dispose(); this._keyDownProcessor = null } this._keyDownProcessor = new KeyboardProcessor({ element: element, context: context, handler: handler }) }, _getCell: function(cellPosition) { if (this._focusedView && cellPosition) { return this._focusedView.getCell({ rowIndex: cellPosition.rowIndex - this._dataController.getRowIndexOffset(), columnIndex: cellPosition.columnIndex }) } }, _getFocusedCell: function() { return this._getCell(this._focusedCellPosition) }, _getRowIndex: function($row) { var that = this, focusedView = that._focusedView, rowIndex = -1; if (focusedView) { rowIndex = focusedView.getRowIndex($row) } if (rowIndex >= 0) { rowIndex += that._dataController.getRowIndexOffset() } return rowIndex }, _updateFocusedCellPosition: function($cell, direction) { var rowIndex, columnIndex, that = this, $rowElement = $cell.closest("tr"); if ($rowElement.length > 0 && that._focusedView) { rowIndex = $rowElement.length > 0 && that._getRowIndex($rowElement); columnIndex = that._focusedView.getCellIndex($cell, rowIndex); if (direction) { columnIndex = "previous" === direction ? columnIndex - 1 : columnIndex + 1; columnIndex = that._applyColumnIndexBoundaries(columnIndex) } this._focusedCellPosition = { columnIndex: columnIndex, rowIndex: rowIndex } } }, _applyColumnIndexBoundaries: function(columnIndex) { var visibleColumnsCount = this._getVisibleColumnCount(); if (columnIndex < 0) { columnIndex = 0 } else { if (columnIndex >= visibleColumnsCount) { columnIndex = visibleColumnsCount - 1 } } return columnIndex }, _isCellValid: function($cell) { if (commonUtils.isDefined($cell)) { var rowsView = this.getView("rowsView"), visibleColumns = this._columnsController.getVisibleColumns(), visibleRowIndex = rowsView.getRowIndex($cell.parent()), columnIndex = rowsView.getCellIndex($cell), column = visibleColumns[columnIndex], visibleColumnCount = this._getVisibleColumnCount(), editingController = this._editingController, editMode = editingController && editingController.getEditMode(), isEditingCurrentRow = editingController && (editMode === EDIT_MODE_ROW ? editingController.isEditRow(visibleRowIndex) : editingController.isEditing()), isMasterDetailRow = isDetailRow($cell.parent()), isValidGroupSpaceColumn = function() { return !isMasterDetailRow && column && !commonUtils.isDefined(column.groupIndex) || parseInt($cell.attr("colspan")) > 1 }; if (this._isMasterDetailCell($cell)) { return true } if (visibleColumnCount > columnIndex && isValidGroupSpaceColumn()) { var isExpandColumn = "expand" === column.command; return column && !column.command && (!isEditingCurrentRow || column.allowEditing) || isExpandColumn } } }, _isCellByPositionValid: function(cellPosition) { var $cell = this._getCell(cellPosition); return this._isCellValid($cell) }, _focus: function($cell) { var $focusElement, $row = $cell.parent(), $focusedCell = this._getFocusedCell(), focusedView = this._focusedView; $focusedCell && $focusedCell.is("td") && $focusedCell.attr("tabIndex", null); if (isGroupRow($row)) { $focusElement = $row; if (focusedView) { this._focusedCellPosition.rowIndex = this._getRowIndex($row) } } else { if (isCellElement($cell)) { $focusElement = $cell; this._updateFocusedCellPosition($cell) } } focusedView && focusedView.element().attr("tabIndex", null); if ($focusElement) { this._applyTabIndexToElement($focusElement); $focusElement.focus() } this.getController("editorFactory").focus($focusElement) }, _hasSkipRow: function($row) { return $row && ("none" === $row.css("display") || $row.hasClass(this.addWidgetPrefix(GROUP_FOOTER_CLASS)) || isDetailRow($row) && !$row.hasClass(this.addWidgetPrefix(EDIT_FORM_CLASS))) }, _enterKeyHandler: function(eventArgs, isEditing) { var $cell = this._getFocusedCell(), editingOptions = this.option("editing"), rowIndex = this._getFocusedRowIndex(), $row = this._focusedView && this._focusedView.getRow(rowIndex); if (this.option("grouping.allowCollapsing") && isGroupRow($row) || this.option("masterDetail.enabled") && $cell && $cell.hasClass(COMMAND_EXPAND_CLASS)) { var key = this._dataController.getKeyByRowIndex(rowIndex), item = this._dataController.items()[rowIndex]; if (void 0 !== key && item && item.data && !item.data.isContinuation) { this._dataController.changeRowExpand(key) } } else { if (isEditing) { $cell = this._getCellElementFromTarget(eventArgs.originalEvent.target); this._updateFocusedCellPosition($cell); if (this._isRowEditMode()) { this._focusEditFormCell($cell); setTimeout(this._editingController.saveEditData.bind(this._editingController)) } else { this._editingController.closeEditCell() } } else { var column = this._columnsController.getVisibleColumns()[this._focusedCellPosition.columnIndex]; if (editingOptions.allowUpdating && column && column.allowEditing) { if (this._isRowEditMode()) { this._editingController.editRow(rowIndex) } else { this._focusedCellPosition && this._editingController.editCell(rowIndex, this._focusedCellPosition.columnIndex) } } } } }, _getFocusedRowIndex: function() { if (this._focusedCellPosition) { return this._focusedCellPosition.rowIndex - this._dataController.getRowIndexOffset() } return null }, _leftRightKeysHandler: function(eventArgs, isEditing) { var key, directionCode, $cell, rowIndex = this._getFocusedRowIndex(), $row = this._focusedView && this._focusedView.getRow(rowIndex), dataController = this._dataController; if (eventArgs.ctrl) { directionCode = this._getDirectionCodeByKey(eventArgs.key); key = dataController.getKeyByRowIndex(rowIndex); if ("nextInRow" === directionCode) { dataController.expandRow(key) } else { dataController.collapseRow(key) } } else { if (!isEditing && $row && !isGroupRow($row) && !isDetailRow($row)) { directionCode = this._getDirectionCodeByKey(eventArgs.key); $cell = this._getNextCell(directionCode); if ($cell && this._isCellValid($cell)) { this._focus($cell) } eventArgs.originalEvent.preventDefault() } } }, _getDirectionCodeByKey: function(key) { var directionCode; if (this.option("rtlEnabled")) { directionCode = "leftArrow" === key ? "nextInRow" : "previousInRow" } else { directionCode = "leftArrow" === key ? "previousInRow" : "nextInRow" } return directionCode }, _upDownKeysHandler: function(eventArgs, isEditing) { var $cell, rowIndex = this._getFocusedRowIndex(), $row = this._focusedView && this._focusedView.getRow(rowIndex); if (!isEditing && !isDetailRow($row)) { $cell = this._getNextCell(eventArgs.key); if ($cell && this._isCellValid($cell)) { this._focus($cell) } eventArgs.originalEvent.preventDefault() } }, _isVirtualScrolling: function() { var scrollingMode = this.option("scrolling.mode"); return "virtual" === scrollingMode || "infinite" === scrollingMode }, _scrollBy: function(top) { var that = this, scrollable = this.getView("rowsView").getScrollable(); if (that._focusedCellPosition) { var scrollHandler = function() { scrollable.off(scrollHandler); setTimeout(function() { var columnIndex = that._focusedCellPosition.columnIndex; var rowIndex = that.getView("rowsView").getTopVisibleItemIndex() + that._dataController.getRowIndexOffset(); that.getController("editorFactory").loseFocus(); var $rowsView = that.getView("rowsView").element(); that._applyTabIndexToElement($rowsView); $rowsView.focus(); that._focusedCellPosition.rowIndex = rowIndex; that._focusedCellPosition.columnIndex = columnIndex }) }; scrollable.on("scroll", scrollHandler) } scrollable.scrollBy({ left: 0, top: top }) }, _pageUpDownKeyHandler: function(eventArgs) { var pageIndex = this._dataController.pageIndex(), pageCount = this._dataController.pageCount(), pagingEnabled = this.option("paging.enabled"), isPageUp = "pageUp" === eventArgs.key, pageStep = isPageUp ? -1 : 1, scrollable = this.getView("rowsView").getScrollable(); if (pagingEnabled && !this._isVirtualScrolling()) { if ((isPageUp ? pageIndex > 0 : pageIndex < pageCount - 1) && !this._isVirtualScrolling()) { this._dataController.pageIndex(pageIndex + pageStep); eventArgs.originalEvent.preventDefault() } } else { if (scrollable && scrollable._container().height() < scrollable.content().height()) { this._scrollBy(scrollable._container().height() * pageStep); eventArgs.originalEvent.preventDefault() } } }, _spaceKeyHandler: function(eventArgs, isEditing) { var rowIndex = this._getFocusedRowIndex(), $target = $(eventArgs.originalEvent && eventArgs.originalEvent.target); if (this.option("selection") && "none" !== this.option("selection").mode && !isEditing && ($target.parent().hasClass(DATA_ROW_CLASS) || $target.hasClass(this.addWidgetPrefix(ROWS_VIEW_CLASS)))) { this._selectionController.changeItemSelection(rowIndex, { shift: eventArgs.shift, control: eventArgs.ctrl }); eventArgs.originalEvent.preventDefault() } }, _ctrlAKeyHandler: function(eventArgs, isEditing) { if (!isEditing && eventArgs.ctrl && !eventArgs.alt && "multiple" === this.option("selection.mode") && this.option("selection.allowSelectAll")) { this._selectionController.selectAll(); eventArgs.originalEvent.preventDefault() } }, _isInsideEditForm: function(element) { return $(element).closest("." + this.addWidgetPrefix(EDIT_FORM_CLASS)).length > 0 }, _isMasterDetailCell: function(element) { var $masterDetailCell = $(element).closest("." + MASTER_DETAIL_CELL_CLASS), $masterDetailGrid = $masterDetailCell.closest("." + this.getWidgetContainerClass()).parent(); return $masterDetailCell.length && $masterDetailGrid.is(this.component.element()) }, _handleTabKeyOnMasterDetailCell: function(target, direction) { if (this._isMasterDetailCell(target)) { this._updateFocusedCellPosition($(target), direction); var $nextCell = this._getNextCell(direction, "row"); if (!this._isInsideEditForm($nextCell)) { $nextCell && this._applyTabIndexToElement($nextCell) } return true } return false }, _tabKeyHandler: function(eventArgs, isEditing) { var $cell, editingOptions = this.option("editing"), direction = eventArgs.shift ? "previous" : "next", isOriginalHandlerRequired = !eventArgs.shift && this._isLastValidCell(this._focusedCellPosition) || eventArgs.shift && this._isFirstValidCell(this._focusedCellPosition), eventTarget = eventArgs.originalEvent.target; if (this._handleTabKeyOnMasterDetailCell(eventTarget, direction)) { return } if (editingOptions && eventTarget && !isOriginalHandlerRequired) { if ($(eventTarget).hasClass(this.addWidgetPrefix(ROWS_VIEW_CLASS))) { this._resetFocusedCell() } if (isEditing) { var column, row, isEditingAllowed; this._updateFocusedCellPosition(this._getCellElementFromTarget(eventTarget)); $cell = this._getNextCell(direction); if (this._handleTabKeyOnMasterDetailCell($cell, direction)) { return } column = this._columnsController.getVisibleColumns()[this.getView("rowsView").getCellIndex($cell)]; row = this._dataController.items()[this._getRowIndex($cell && $cell.parent())]; isEditingAllowed = (editingOptions.allowUpdating || row && row.inserted) && column.allowEditing; if (!isEditingAllowed) { this._editingController.closeEditCell() } if (this._focusCell($cell)) { if (!this._isRowEditMode() && isEditingAllowed) { this._editingController.editCell(this._getFocusedRowIndex(), this._focusedCellPosition.columnIndex) } else { this._focusInteractiveElement($cell, eventArgs.shift) } } } else { $cell = $(eventTarget).closest(".dx-row > td"); var $lastInteractiveElement = this._getInteractiveElement($cell, !eventArgs.shift); if ($lastInteractiveElement.length && eventTarget !== $lastInteractiveElement.get(0)) { isOriginalHandlerRequired = true } else { $cell = this._getNextCell(direction, this._getElementType(eventTarget)); this._focusCell($cell); this._focusInteractiveElement($cell, eventArgs.shift) } } } if (isOriginalHandlerRequired) { this.getController("editorFactory").loseFocus(); if (this._editingController.isEditing() && !this._isRowEditMode()) { this._resetFocusedCell(); this._editingController.closeEditCell() } } else { eventArgs.originalEvent.preventDefault() } }, _focusCell: function($cell) { if (this._isCellValid($cell)) { this._focus($cell); return true } }, _getElementType: function(target) { return $(target).is("tr") ? "row" : "cell" }, _focusEditFormCell: function($cell) { if ($cell.hasClass(MASTER_DETAIL_CELL_CLASS)) { this.getController("editorFactory").focus($cell, true) } }, _escapeKeyHandler: function(eventArgs, isEditing) { if (isEditing) { var $cell = this._getCellElementFromTarget(eventArgs.originalEvent.target); this._updateFocusedCellPosition($cell); if (!this._isRowEditMode()) { if ("cell" === this._editingController.getEditMode()) { this._editingController.cancelEditData() } else { this._editingController.closeEditCell() } } else { this._focusEditFormCell($cell); this._editingController.cancelEditData() } eventArgs.originalEvent.preventDefault() } }, _ctrlFKeyHandler: function(eventArgs) { if (eventArgs.ctrl && this.option("searchPanel") && this.option("searchPanel").visible) { this._testHeaderPanelFocused = true; this._headerPanel.focus(); eventArgs.originalEvent.preventDefault() } }, _keyDownHandler: function(e) { var isEditing = this._editingController.isEditing(), needStopPropagation = true, args = { handled: false, jQueryEvent: e.originalEvent }; this.executeAction("onKeyDown", args); if (e.originalEvent.isDefaultPrevented()) { return } this._isNeedFocus = true; this._isNeedScroll = true; this._updateFocusedCellPosition(this._getCellElementFromTarget(args.jQueryEvent.target)); if (!args.handled) { switch (e.key) { case "leftArrow": case "rightArrow": this._leftRightKeysHandler(e, isEditing); break; case "upArrow": case "downArrow": this._upDownKeysHandler(e, isEditing); break; case "pageUp": case "pageDown": this._pageUpDownKeyHandler(e); break; case "space": this._spaceKeyHandler(e, isEditing); break; case "A": this._ctrlAKeyHandler(e, isEditing); break; case "tab": this._tabKeyHandler(e, isEditing); break; case "enter": this._enterKeyHandler(e, isEditing); break; case "escape": this._escapeKeyHandler(e, isEditing); break; case "F": this._ctrlFKeyHandler(e); break; default: this._isNeedFocus = false; this._isNeedScroll = false; needStopPropagation = false } if (needStopPropagation) { e.originalEvent.stopPropagation() } } }, _isLastRow: function(rowIndex) { if (this._isVirtualScrolling()) { return rowIndex >= this._dataController.totalItemsCount() - 1 } return rowIndex === this.getController("data").items().length - 1 }, _getNextCell: function(keyCode, elementType, cellPosition) { var rowIndex, newFocusedCellPosition, $cell, $row, focusedCellPosition = cellPosition || this._focusedCellPosition, includeCommandCells = inArray(keyCode, ["next", "previous"]) > -1, isLastCellOnDirection = "previous" === keyCode ? this._isFirstValidCell(focusedCellPosition) : this._isLastValidCell(focusedCellPosition); if (this._focusedView && focusedCellPosition) { newFocusedCellPosition = this._getNewPositionByCode(focusedCellPosition, elementType, keyCode); $cell = this._getCell(newFocusedCellPosition); if (!this._isCellValid($cell) && this._isCellInRow(newFocusedCellPosition, includeCommandCells) && !isLastCellOnDirection) { $cell = this._getNextCell(keyCode, "cell", newFocusedCellPosition) } $row = $cell && $cell.parent(); if (this._hasSkipRow($row)) { rowIndex = this._getRowIndex($row); if (!this._isLastRow(rowIndex)) { $cell = this._getNextCell(keyCode, "row", { columnIndex: focusedCellPosition.columnIndex, rowIndex: rowIndex }) } else { return null } } return $cell } return null }, _getNewPositionByCode: function(cellPosition, elementType, code) { var visibleColumnsCount, columnIndex = cellPosition.columnIndex, rowIndex = cellPosition.rowIndex; if (void 0 === cellPosition.rowIndex && "next" === code) { return { columnIndex: 0, rowIndex: 0 } } switch (code) { case "nextInRow": case "next": visibleColumnsCount = this._getVisibleColumnCount(); if (columnIndex < visibleColumnsCount - 1 && !this._isLastValidCell({ columnIndex: columnIndex, rowIndex: rowIndex }) && "row" !== elementType) { columnIndex++ } else { if (!this._isLastRow(rowIndex) && "next" === code) { columnIndex = 0; rowIndex++ } } break; case "previousInRow": case "previous": if (columnIndex > 0 && !this._isFirstValidCell({ columnIndex: columnIndex, rowIndex: rowIndex }) && "row" !== elementType) { columnIndex-- } else { if (rowIndex > 0 && "previous" === code) { rowIndex--; visibleColumnsCount = this._getVisibleColumnCount(); columnIndex = visibleColumnsCount - 1 } } break; case "upArrow": rowIndex = rowIndex > 0 ? rowIndex - 1 : rowIndex; break; case "downArrow": rowIndex = !this._isLastRow(rowIndex) ? rowIndex + 1 : rowIndex } return { columnIndex: columnIndex, rowIndex: rowIndex } }, _isFirstValidCell: function(cellPosition) { var isFirstValidCell = false; if (0 === cellPosition.rowIndex && cellPosition.columnIndex >= 0) { isFirstValidCell = isFirstValidCell || !this._haveValidCellBeforePosition(cellPosition) } return isFirstValidCell }, _haveValidCellBeforePosition: function(cellPosition) { var columnIndex = cellPosition.columnIndex, hasValidCells = false; while (columnIndex > 0 && !hasValidCells) { var checkingPosition = { columnIndex: --columnIndex, rowIndex: cellPosition.rowIndex }; hasValidCells = this._isCellByPositionValid(checkingPosition) } return hasValidCells }, _isLastValidCell: function(cellPosition) { var checkingPosition = { columnIndex: cellPosition.columnIndex + 1, rowIndex: cellPosition.rowIndex }, visibleColumnsCount = this._getVisibleColumnCount(), isCheckingCellValid = this._isCellByPositionValid(checkingPosition); if (!this._isLastRow(cellPosition.rowIndex)) { return false } if (cellPosition.columnIndex === visibleColumnsCount - 1) { return true } if (isCheckingCellValid) { return false } return this._isLastValidCell(checkingPosition) }, _getVisibleColumnCount: function() { return this.getController("columns").getVisibleColumns().length }, _isCellInRow: function(cellPosition, includeCommandCells) { var columnIndex = cellPosition.columnIndex, visibleColumnsCount = this._getVisibleColumnCount(); return includeCommandCells ? columnIndex >= 0 && columnIndex <= visibleColumnsCount - 1 : columnIndex > 0 && columnIndex < visibleColumnsCount - 1 }, _resetFocusedCell: function() { var that = this, $cell = that._getFocusedCell(); $cell && $cell.attr("tabIndex", null); that._focusedView && that._focusedView.renderFocusState && that._focusedView.renderFocusState(); that._isNeedFocus = false; that._isNeedScroll = false; that._focusedCellPosition = {} }, _getCellElementFromTarget: function(target) { return $(target).closest("." + ROW_CLASS + "> td") }, init: function() { var that = this; if (that.option("useKeyboard")) { that._dataController = that.getController("data"); that._selectionController = that.getController("selection"); that._editingController = that.getController("editing"); that._headerPanel = that.getView("headerPanel"); that._columnsController = that.getController("columns"); that.getController("editorFactory").focused.add(function($element) { that.setupFocusedView(); if (that._isNeedScroll) { if ($element.is(":visible") && that._focusedView && that._focusedView.getScrollable) { that._scrollToElement($element); that._isNeedScroll = false } } }); that._focusedCellPosition = {}; that._initFocusedViews(); that._documentClickHandler = that.createAction(function(e) { var $target = $(e.jQueryEvent.target); if (!$target.closest("." + that.addWidgetPrefix(ROWS_VIEW_CLASS)).length && !$target.closest("." + DROPDOWN_EDITOR_OVERLAY_CLASS).length) { that._resetFocusedCell() } }); that.createAction("onKeyDown"); $(document).on(eventUtils.addNamespace(pointerEvents.down, "dxDataGridKeyboardNavigation"), that._documentClickHandler) } }, _scrollToElement: function($element, offset) { var scrollable = this._focusedView.getScrollable(); scrollable && scrollable.scrollToElement($element, offset) }, focus: function($element) { var focusView = this._getFocusedViewByElement($element); if (focusView) { this._focusView(focusView.view, focusView.viewIndex); this._isNeedFocus = true; this._isNeedScroll = true; this._focus($element); this._focusInteractiveElement($element) } }, getFocusedView: function() { return this._focusedView }, _getFocusedViewByElement: function($element) { var condition = function(view) { return $element.closest(view._$element).length }; return this._getFocusedViewByCondition(condition) }, _getFocusedViewByCondition: function(conditionFunction) { var focusView; $.each(this._focusedViews, function(index, view) { if (conditionFunction(view)) { focusView = { viewIndex: index, view: view }; return false } }); return focusView }, focusViewByName: function(viewName) { var view = this._getFocusedViewByName(viewName); this._focusView(view.view, view.viewIndex) }, setupFocusedView: function() { if (!commonUtils.isDefined(this._focusedView)) { this.focusViewByName("rowsView") } }, _getFocusedViewByName: function(viewName) { var condition = function(view) { return view.name === viewName }; return this._getFocusedViewByCondition(condition) }, optionChanged: function(args) { var that = this; switch (args.name) { case "useKeyboard": args.handled = true; break; default: that.callBase(args) } }, dispose: function() { this.callBase(); this._focusedView = null; this._focusedViews = null; this._keyDownProcessor && this._keyDownProcessor.dispose(); $(document).off(eventUtils.addNamespace(pointerEvents.down, "dxDataGridKeyboardNavigation"), this._documentClickHandler) } }); module.exports = { defaultOptions: function() { return { useKeyboard: true } }, controllers: { keyboardNavigation: KeyboardNavigationController }, extenders: { views: { rowsView: { renderFocusState: function() { var $row, $cell, that = this, cellElements = that.getCellElements(0), keyboardNavigation = that.getController("keyboardNavigation"), tabIndex = that.option("tabIndex"), oldFocusedView = keyboardNavigation._focusedView; if (!that.element().is(":focus")) { that.element().attr("tabIndex", null) } if (that.option("useKeyboard") && cellElements) { $row = cellElements.eq(0).parent(); if (isGroupRow($row)) { $row.attr("tabIndex", tabIndex) } else { keyboardNavigation._focusedView = that; for (var i = 0; i < cellElements.length; i++) { $cell = cellElements.eq(i); if (keyboardNavigation._isCellValid($cell)) { if (isCellElement($cell)) { $cell.attr("tabIndex", tabIndex) } break } } keyboardNavigation._focusedView = oldFocusedView } } }, renderDelayedTemplates: function() { this.callBase.apply(this, arguments); this.renderFocusState() }, _renderCore: function(change) { this.callBase(change); this.renderFocusState() } } }, controllers: { editing: { editCell: function(rowIndex, columnIndex) { var isCellEditing = this.callBase(rowIndex, columnIndex), keyboardNavigationController = this.getController("keyboardNavigation"); if (isCellEditing) { keyboardNavigationController.setupFocusedView() } return isCellEditing }, addRow: function(parentKey) { this.getController("keyboardNavigation").setupFocusedView(); this.callBase.apply(this, arguments) }, getFocusedCellInRow: function(rowIndex) { var keyboardNavigationController = this.getController("keyboardNavigation"), $cell = this.callBase(rowIndex); if (this.option("useKeyboard") && keyboardNavigationController._focusedCellPosition.rowIndex === rowIndex) { $cell = keyboardNavigationController._getFocusedCell() || $cell } return $cell } } } } } }, /*!*************************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.summary.js ***! \*************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), isEmptyObject = __webpack_require__( /*! ../../core/utils/type */ 12).isEmptyObject, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, compileGetter = __webpack_require__( /*! ../../core/utils/data */ 50).compileGetter, errors = __webpack_require__( /*! ../widget/ui.errors */ 22), gridCore = __webpack_require__( /*! ./ui.data_grid.core */ 348), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), dataSourceAdapter = __webpack_require__( /*! ./ui.data_grid.data_source_adapter */ 358), columnsView = __webpack_require__( /*! ../grid_core/ui.grid_core.columns_view */ 353), AggregateCalculator = __webpack_require__( /*! ./aggregate_calculator */ 413), dataQuery = __webpack_require__( /*! ../../data/query */ 159), dataUtils = __webpack_require__( /*! ../../data/utils */ 137); var DATAGRID_TOTAL_FOOTER_CLASS = "dx-datagrid-total-footer", DATAGRID_SUMMARY_ITEM_CLASS = "dx-datagrid-summary-item", DATAGRID_TEXT_CONTENT_CLASS = "dx-datagrid-text-content", DATAGRID_GROUP_FOOTER_CLASS = "dx-datagrid-group-footer", DATAGRID_GROUP_TEXT_CONTENT_CLASS = "dx-datagrid-group-text-content", DATAGRID_NOWRAP_CLASS = "dx-datagrid-nowrap", DATAGRID_GROUP_FOOTER_ROW_TYPE = "groupFooter"; var renderSummaryCell = function($cell, options) { var i, summaryItem, column = options.column, summaryItems = options.summaryItems, $summaryItems = []; if (!column.command && summaryItems) { for (i = 0; i < summaryItems.length; i++) { summaryItem = summaryItems[i]; $summaryItems.push($("<div>").css("text-align", summaryItem.alignment || column.alignment).addClass(DATAGRID_SUMMARY_ITEM_CLASS).addClass(DATAGRID_TEXT_CONTENT_CLASS).addClass(summaryItem.cssClass).toggleClass(DATAGRID_GROUP_TEXT_CONTENT_CLASS, "group" === options.rowType).text(gridCore.getSummaryText(summaryItem, options.summaryTexts))) } $cell.append($summaryItems) } }, getSummaryCellOptions = function(that, options) { var summaryTexts = that.option("summary.texts") || {}; return { totalItem: options.row, summaryItems: options.row.summaryCells[options.columnIndex], summaryTexts: summaryTexts } }; var getGroupAggregates = function(data) { return data.summary || data.aggregates || [] }; exports.FooterView = columnsView.ColumnsView.inherit(function() { return { _getRows: function() { return this._dataController.footerItems() }, _getCellOptions: function(options) { return extend(this.callBase(options), getSummaryCellOptions(this, options)) }, _renderCellContent: function($cell, options) { renderSummaryCell($cell, options); this.callBase($cell, options) }, _renderCore: function() { var totalItem = this._dataController.footerItems()[0]; this.element().empty().addClass(DATAGRID_TOTAL_FOOTER_CLASS).toggleClass(DATAGRID_NOWRAP_CLASS, !this.option("wordWrapEnabled")); if (totalItem && totalItem.summaryCells && totalItem.summaryCells.length) { this._updateContent(this._renderTable()) } }, _rowClick: function(e) { var item = this._dataController.footerItems()[e.rowIndex] || {}; this.executeAction("onRowClick", extend({}, e, item)) }, _columnOptionChanged: function(e) { var optionNames = e.optionNames; if (e.changeTypes.grouping) { return } if (optionNames.width || optionNames.visibleWidth) { this.callBase(e) } }, _handleDataChanged: function(e) { if ("refresh" === e.changeType) { this.render() } }, getHeight: function() { return this.getElementHeight() }, isVisible: function() { return !!this._dataController.footerItems().length } } }()); var SummaryDataSourceAdapterExtender = function() { return { init: function() { this.callBase.apply(this, arguments); this._totalAggregates = []; this._summaryGetter = commonUtils.noop }, summaryGetter: function(summaryGetter) { if (!arguments.length) { return this._summaryGetter } if (commonUtils.isFunction(summaryGetter)) { this._summaryGetter = summaryGetter } }, summary: function(summary) { if (!arguments.length) { return this._summaryGetter() } this._summaryGetter = function() { return summary } }, totalAggregates: function() { return this._totalAggregates } } }(); var SummaryDataSourceAdapterClientExtender = function() { var calculateAggregates = function(that, summary, data, groupLevel) { var calculator; if (summary) { calculator = new AggregateCalculator({ totalAggregates: summary.totalAggregates, groupAggregates: summary.groupAggregates, data: data, groupLevel: groupLevel }); calculator.calculate() } return calculator ? calculator.totalAggregates() : [] }; var sortGroupsBySummaryCore = function(items, groups, sortByGroups) { if (!items || !groups.length) { return items } var query, group = groups[0], sorts = sortByGroups[0]; if (group && sorts && sorts.length) { query = dataQuery(items); $.each(sorts, function(index) { if (0 === index) { query = query.sortBy(this.selector, this.desc) } else { query = query.thenBy(this.selector, this.desc) } }); query.enumerate().done(function(sortedItems) { items = sortedItems }) } groups = groups.slice(1); sortByGroups = sortByGroups.slice(1); if (groups.length && sortByGroups.length) { $.each(items, function() { this.items = sortGroupsBySummaryCore(this.items, groups, sortByGroups) }) } return items }; var sortGroupsBySummary = function(data, group, summary) { var sortByGroups = summary && summary.sortByGroups && summary.sortByGroups(); if (sortByGroups && sortByGroups.length) { return sortGroupsBySummaryCore(data, group, sortByGroups) } return data }; return { _customizeRemoteOperations: function(options) { var summary = this.summary(); if (summary) { if (options.remoteOperations.summary) { if (!options.isCustomLoading || options.storeLoadOptions.isLoadingAll) { if (options.storeLoadOptions.group) { if (options.remoteOperations.grouping) { options.storeLoadOptions.groupSummary = summary.groupAggregates } else { if (summary.groupAggregates.length) { options.remoteOperations.paging = false } } } options.storeLoadOptions.totalSummary = summary.totalAggregates } } else { if (summary.totalAggregates.length || summary.groupAggregates.length && options.storeLoadOptions.group) { options.remoteOperations.paging = false } } } this.callBase.apply(this, arguments) }, _handleDataLoadedCore: function(options) { var totalAggregates, that = this, groups = dataUtils.normalizeSortingInfo(options.storeLoadOptions.group || options.loadOptions.group || []), remoteOperations = options.remoteOperations || {}, summary = that.summaryGetter()(remoteOperations); if (remoteOperations.summary) { if (!remoteOperations.paging && groups.length && summary) { if (!remoteOperations.grouping) { calculateAggregates(that, { groupAggregates: summary.groupAggregates }, options.data, groups.length) } options.data = sortGroupsBySummary(options.data, groups, summary) } } else { if (!remoteOperations.paging) { totalAggregates = calculateAggregates(that, summary, options.data, groups.length); options.data = sortGroupsBySummary(options.data, groups, summary); options.extra = options.extra || {}; options.extra.summary = totalAggregates } } if (!options.isCustomLoading) { that._totalAggregates = options.extra && options.extra.summary || that._totalAggregates } that.callBase(options) } } }(); dataSourceAdapter.extend(SummaryDataSourceAdapterExtender); dataSourceAdapter.extend(SummaryDataSourceAdapterClientExtender); exports.renderSummaryCell = renderSummaryCell; gridCore.registerModule("summary", { defaultOptions: function() { return { summary: { groupItems: void 0, totalItems: void 0, calculateCustomSummary: void 0, skipEmptyValues: true, texts: { sum: messageLocalization.getFormatter("dxDataGrid-summarySum"), sumOtherColumn: messageLocalization.getFormatter("dxDataGrid-summarySumOtherColumn"), min: messageLocalization.getFormatter("dxDataGrid-summaryMin"), minOtherColumn: messageLocalization.getFormatter("dxDataGrid-summaryMinOtherColumn"), max: messageLocalization.getFormatter("dxDataGrid-summaryMax"), maxOtherColumn: messageLocalization.getFormatter("dxDataGrid-summaryMaxOtherColumn"), avg: messageLocalization.getFormatter("dxDataGrid-summaryAvg"), avgOtherColumn: messageLocalization.getFormatter("dxDataGrid-summaryAvgOtherColumn"), count: messageLocalization.getFormatter("dxDataGrid-summaryCount") } }, sortByGroupSummaryInfo: void 0 } }, views: { footerView: exports.FooterView }, extenders: { controllers: { data: function() { return { _isDataColumn: function(column) { return column && (!commonUtils.isDefined(column.groupIndex) || column.showWhenGrouped) }, _isGroupFooterVisible: function() { var groupItem, column, i, groupItems = this.option("summary.groupItems") || []; for (i = 0; i < groupItems.length; i++) { groupItem = groupItems[i]; column = this._columnsController.columnOption(groupItem.showInColumn || groupItem.column); if (groupItem.showInGroupFooter && this._isDataColumn(column)) { return true } } return false }, _processGroupItems: function(items, groupCount, options) { var data = options && options.data, result = this.callBase.apply(this, arguments); if (options) { if (void 0 === options.isGroupFooterVisible) { options.isGroupFooterVisible = this._isGroupFooterVisible() } if (data && data.items && options.isGroupFooterVisible && (options.collectContinuationItems || !data.isContinuationOnNextPage)) { result.push({ rowType: DATAGRID_GROUP_FOOTER_ROW_TYPE, data: data, groupIndex: options.path.length - 1, values: [] }) } } return result }, _processGroupItem: function(groupItem, options) { var that = this; if (!options.summaryGroupItems) { options.summaryGroupItems = that.option("summary.groupItems") || [] } if ("group" === groupItem.rowType) { var groupColumnIndex = -1, afterGroupColumnIndex = -1; $.each(options.visibleColumns, function(visibleIndex) { var prevColumn = options.visibleColumns[visibleIndex - 1]; if (groupItem.groupIndex === this.groupIndex) { groupColumnIndex = this.index } if (visibleIndex > 0 && "expand" === prevColumn.command && "expand" !== this.command) { afterGroupColumnIndex = this.index } }); groupItem.summaryCells = this._calculateSummaryCells(options.summaryGroupItems, getGroupAggregates(groupItem.data), options.visibleColumns, function(summaryItem, column) { if (summaryItem.showInGroupFooter) { return -1 } if (summaryItem.alignByColumn && column && !commonUtils.isDefined(column.groupIndex) && column.index !== afterGroupColumnIndex) { return column.index } else { return groupColumnIndex } }) } if (groupItem.rowType === DATAGRID_GROUP_FOOTER_ROW_TYPE) { groupItem.summaryCells = this._calculateSummaryCells(options.summaryGroupItems, getGroupAggregates(groupItem.data), options.visibleColumns, function(summaryItem, column) { return summaryItem.showInGroupFooter && that._isDataColumn(column) ? column.index : -1 }) } return groupItem }, _calculateSummaryCells: function(summaryItems, aggregates, visibleColumns, calculateTargetColumnIndex) { var that = this, summaryCells = [], summaryCellsByColumns = {}; $.each(summaryItems, function(summaryIndex, summaryItem) { var aggregate, column = that._columnsController.columnOption(summaryItem.column), showInColumn = summaryItem.showInColumn && that._columnsController.columnOption(summaryItem.showInColumn) || column, columnIndex = calculateTargetColumnIndex(summaryItem, showInColumn); if (columnIndex >= 0) { if (!summaryCellsByColumns[columnIndex]) { summaryCellsByColumns[columnIndex] = [] } aggregate = aggregates[summaryIndex]; if (aggregate === aggregate) { summaryCellsByColumns[columnIndex].push(extend({}, summaryItem, { value: commonUtils.isString(aggregate) && column && column.deserializeValue ? column.deserializeValue(aggregate) : aggregate, valueFormat: !commonUtils.isDefined(summaryItem.valueFormat) ? gridCore.getFormatByDataType(column && column.dataType) : summaryItem.valueFormat, columnCaption: column && column.index !== columnIndex ? column.caption : void 0 })) } } }); if (!isEmptyObject(summaryCellsByColumns)) { $.each(visibleColumns, function() { summaryCells.push(summaryCellsByColumns[this.index] || []) }) } return summaryCells }, _getSummaryCells: function(summaryTotalItems, totalAggregates) { var that = this, columnsController = that._columnsController; return that._calculateSummaryCells(summaryTotalItems, totalAggregates, columnsController.getVisibleColumns(), function(summaryItem, column) { return that._isDataColumn(column) ? column.index : -1 }) }, _updateItemsCore: function(change) { var summaryCells, totalAggregates, that = this, dataSource = that._dataSource, summaryTotalItems = that.option("summary.totalItems"); that.callBase(change); that._footerItems = []; if (dataSource && summaryTotalItems && summaryTotalItems.length) { totalAggregates = dataSource.totalAggregates(); summaryCells = this._getSummaryCells(summaryTotalItems, totalAggregates); if (summaryCells.length) { that._footerItems.push({ rowType: "totalFooter", summaryCells: summaryCells }) } } }, _getAggregates: function(summaryItems, remoteOperations) { var that = this, columnsController = that.getController("columns"), calculateCustomSummary = that.option("summary.calculateCustomSummary"), commonSkipEmptyValues = that.option("summary.skipEmptyValues"); return $.map(summaryItems || [], function(summaryItem) { var options, column = columnsController.columnOption(summaryItem.column), calculateCellValue = column && column.calculateCellValue ? column.calculateCellValue.bind(column) : compileGetter(column ? column.dataField : summaryItem.column), aggregator = summaryItem.summaryType || "count", selector = summaryItem.column, skipEmptyValues = commonUtils.isDefined(summaryItem.skipEmptyValues) ? summaryItem.skipEmptyValues : commonSkipEmptyValues; if (remoteOperations) { return { selector: summaryItem.column, summaryType: summaryItem.summaryType } } else { if ("avg" === aggregator || "sum" === aggregator) { selector = function(data) { var value = calculateCellValue(data); return commonUtils.isDefined(value) ? Number(value) : value } } else { selector = calculateCellValue } if ("custom" === aggregator) { if (!calculateCustomSummary) { errors.log("E1026"); calculateCustomSummary = function() {} } options = { component: that.component, name: summaryItem.name }; calculateCustomSummary(options); options.summaryProcess = "calculate"; aggregator = { seed: function() { options.summaryProcess = "start"; options.totalValue = void 0; delete options.value; calculateCustomSummary(options); return options.totalValue }, step: function(totalValue, value) { options.summaryProcess = "calculate"; options.totalValue = totalValue; options.value = value; calculateCustomSummary(options); return options.totalValue }, finalize: function(totalValue) { options.summaryProcess = "finalize"; options.totalValue = totalValue; delete options.value; calculateCustomSummary(options); return options.totalValue } } } return { selector: selector, aggregator: aggregator, skipEmptyValues: skipEmptyValues } } }) }, _addSortInfo: function(sortByGroups, groupColumn, selector, sortOrder) { var groupIndex; if (groupColumn) { groupIndex = groupColumn.groupIndex; sortOrder = sortOrder || groupColumn.sortOrder; if (commonUtils.isDefined(groupIndex)) { sortByGroups[groupIndex] = sortByGroups[groupIndex] || []; sortByGroups[groupIndex].push({ selector: selector, desc: "desc" === sortOrder }) } } }, _findSummaryItem: function(summaryItems, name) { var summaryItemIndex = -1; var getFullName = function(summaryItem) { var summaryType = summaryItem.summaryType, column = summaryItem.column; return summaryType && column && summaryType + "_" + column }; if (commonUtils.isDefined(name)) { $.each(summaryItems || [], function(index) { if (this.name === name || index === name || this.summaryType === name || this.column === name || getFullName(this) === name) { summaryItemIndex = index; return false } }) } return summaryItemIndex }, _getSummarySortByGroups: function(sortByGroupSummaryInfo, groupSummaryItems) { var that = this, columnsController = that._columnsController, groupColumns = columnsController.getGroupColumns(), sortByGroups = []; if (!groupSummaryItems || !groupSummaryItems.length) { return } $.each(sortByGroupSummaryInfo || [], function() { var sortOrder = this.sortOrder, groupColumn = this.groupColumn, summaryItemIndex = that._findSummaryItem(groupSummaryItems, this.summaryItem); if (summaryItemIndex < 0) { return } var selector = function(data) { return getGroupAggregates(data)[summaryItemIndex] }; if (commonUtils.isDefined(groupColumn)) { groupColumn = columnsController.columnOption(groupColumn); that._addSortInfo(sortByGroups, groupColumn, selector, sortOrder) } else { $.each(groupColumns, function(groupIndex, groupColumn) { that._addSortInfo(sortByGroups, groupColumn, selector, sortOrder) }) } }); return sortByGroups }, _createDataSourceAdapterCore: function(dataSource, remoteOperations) { var that = this, dataSourceAdapter = this.callBase(dataSource, remoteOperations); dataSourceAdapter.summaryGetter(function(currentRemoteOperations) { return that._getSummaryOptions(currentRemoteOperations || remoteOperations) }); return dataSourceAdapter }, _getSummaryOptions: function(remoteOperations) { var that = this, groupSummaryItems = that.option("summary.groupItems"), totalSummaryItems = that.option("summary.totalItems"), sortByGroupSummaryInfo = that.option("sortByGroupSummaryInfo"), groupAggregates = that._getAggregates(groupSummaryItems, remoteOperations && remoteOperations.grouping && remoteOperations.summary), totalAggregates = that._getAggregates(totalSummaryItems, remoteOperations && remoteOperations.summary), sortByGroups = function() { return that._getSummarySortByGroups(sortByGroupSummaryInfo, groupSummaryItems) }; if (groupAggregates.length || totalAggregates.length) { return { groupAggregates: groupAggregates, totalAggregates: totalAggregates, sortByGroups: sortByGroups } } }, publicMethods: function() { var methods = this.callBase(); methods.push("getTotalSummaryValue"); return methods }, getTotalSummaryValue: function(summaryItemName) { var summaryItemIndex = this._findSummaryItem(this.option("summary.totalItems"), summaryItemName), aggregates = this._dataSource.totalAggregates(); if (aggregates.length && summaryItemIndex > -1) { return aggregates[summaryItemIndex] } }, optionChanged: function(args) { if ("summary" === args.name || "sortByGroupSummaryInfo" === args.name) { args.name = "dataSource" } this.callBase(args) }, init: function() { this._footerItems = []; this.callBase() }, footerItems: function() { return this._footerItems } } }() }, views: { rowsView: function() { return { _createRow: function(row) { var $row = this.callBase(row); row && $row.addClass(row.rowType === DATAGRID_GROUP_FOOTER_ROW_TYPE ? DATAGRID_GROUP_FOOTER_CLASS : ""); return $row }, _renderCells: function($row, options) { this.callBase.apply(this, arguments); if ("group" === options.row.rowType && options.row.summaryCells && options.row.summaryCells.length) { this._renderGroupSummaryCells($row, options) } }, _hasAlignByColumnSummaryItems: function(columnIndex, options) { return !commonUtils.isDefined(options.columns[columnIndex].groupIndex) && options.row.summaryCells[columnIndex].length }, _getAlignByColumnCellCount: function(groupCellColSpan, options) { var columnIndex, alignByColumnCellCount = 0; for (var i = 1; i < groupCellColSpan; i++) { columnIndex = options.row.summaryCells.length - i; alignByColumnCellCount = this._hasAlignByColumnSummaryItems(columnIndex, options) ? i : alignByColumnCellCount } return alignByColumnCellCount }, _renderGroupSummaryCells: function($row, options) { var $groupCell = $row.children().last(), groupCellColSpan = Number($groupCell.attr("colspan")) || 1, alignByColumnCellCount = this._getAlignByColumnCellCount(groupCellColSpan, options); this._renderGroupSummaryCellsCore($groupCell, options, groupCellColSpan, alignByColumnCellCount) }, _renderGroupSummaryCellsCore: function($groupCell, options, groupCellColSpan, alignByColumnCellCount) { if (alignByColumnCellCount > 0) { $groupCell.attr("colspan", groupCellColSpan - alignByColumnCellCount); for (var i = 0; i < alignByColumnCellCount; i++) { var columnIndex = options.columns.length - alignByColumnCellCount + i; this._renderCell($groupCell.parent(), extend({ column: options.columns[columnIndex], columnIndex: this._getSummaryCellIndex(columnIndex, options.columns) }, options)) } } }, _getSummaryCellIndex: function(columnIndex) { return columnIndex }, _getCellTemplate: function(options) { if (!options.column.command && !commonUtils.isDefined(options.column.groupIndex) && options.summaryItems && options.summaryItems.length) { return renderSummaryCell } else { return this.callBase(options) } }, _getCellOptions: function(options) { var that = this, parameters = that.callBase(options); if (options.row.summaryCells) { return extend(parameters, getSummaryCellOptions(that, options)) } else { return parameters } } } }() } } }) }, /*!*************************************************!*\ !*** ./js/ui/data_grid/aggregate_calculator.js ***! \*************************************************/ function(module, exports, __webpack_require__) { var Class = __webpack_require__( /*! ../../core/class */ 25), compileGetter = __webpack_require__( /*! ../../core/utils/data */ 50).compileGetter, isFunction = __webpack_require__( /*! ../../core/utils/common */ 14).isFunction, errors = __webpack_require__( /*! ../../data/errors */ 155).errors, dataUtils = __webpack_require__( /*! ../../data/utils */ 137); function depthFirstSearch(i, depth, root, callback) { var j = 0; if (i < depth) { for (; j < root.items.length; j++) { depthFirstSearch(i + 1, depth, root.items[j], callback) } } if (i === depth) { callback(root) } } function map(array, callback) { var i, result; if ("map" in array) { return array.map(callback) } result = new Array(array.length); for (i in array) { result[i] = callback(array[i], i) } return result } function isEmpty(x) { return x !== x || "" === x || null === x || void 0 === x } function isCount(aggregator) { return aggregator === dataUtils.aggregators.count } function normalizeAggregate(aggregate) { var selector = compileGetter(aggregate.selector), skipEmptyValues = "skipEmptyValues" in aggregate ? aggregate.skipEmptyValues : true, aggregator = aggregate.aggregator; if ("string" === typeof aggregator) { aggregator = dataUtils.aggregators[aggregator]; if (!aggregator) { throw errors.Error("E4001", aggregate.aggregator) } } return { selector: selector, aggregator: aggregator, skipEmptyValues: skipEmptyValues } } module.exports = Class.inherit({ ctor: function(options) { this._data = options.data; this._groupLevel = options.groupLevel || 0; this._totalAggregates = map(options.totalAggregates || [], normalizeAggregate); this._groupAggregates = map(options.groupAggregates || [], normalizeAggregate); this._totals = [] }, calculate: function() { if (this._totalAggregates.length) { this._calculateTotals(0, { items: this._data }) } if (this._groupAggregates.length && this._groupLevel > 0) { this._calculateGroups({ items: this._data }) } }, totalAggregates: function() { return this._totals }, _aggregate: function(aggregates, data, container) { var i, j; for (i = 0; i < aggregates.length; i++) { if (isCount(aggregates[i].aggregator)) { container[i] = (container[i] || 0) + data.items.length; continue } for (j = 0; j < data.items.length; j++) { this._accumulate(i, aggregates[i], container, data.items[j]) } } }, _calculateTotals: function(level, data) { var i; if (0 === level) { this._totals = this._seed(this._totalAggregates) } if (level === this._groupLevel) { this._aggregate(this._totalAggregates, data, this._totals) } else { for (i = 0; i < data.items.length; i++) { this._calculateTotals(level + 1, data.items[i]) } } if (0 === level) { this._totals = this._finalize(this._totalAggregates, this._totals) } }, _calculateGroups: function(root) { var maxLevel = this._groupLevel, currentLevel = maxLevel + 1, seedFn = this._seed.bind(this, this._groupAggregates), stepFn = this._aggregate.bind(this, this._groupAggregates), finalizeFn = this._finalize.bind(this, this._groupAggregates); function aggregator(node) { node.aggregates = seedFn(); if (currentLevel === maxLevel) { stepFn(node, node.aggregates) } else { depthFirstSearch(currentLevel, maxLevel, node, function(innerNode) { stepFn(innerNode, node.aggregates) }) } node.aggregates = finalizeFn(node.aggregates) } while (--currentLevel > 0) { depthFirstSearch(0, currentLevel, root, aggregator) } }, _seed: function(aggregates) { return map(aggregates, function(aggregate) { var aggregator = aggregate.aggregator, seed = "seed" in aggregator ? isFunction(aggregator.seed) ? aggregator.seed() : aggregator.seed : NaN; return seed }) }, _accumulate: function(aggregateIndex, aggregate, results, item) { var value = aggregate.selector(item), aggregator = aggregate.aggregator, skipEmptyValues = aggregate.skipEmptyValues; if (skipEmptyValues && isEmpty(value)) { return } if (results[aggregateIndex] !== results[aggregateIndex]) { results[aggregateIndex] = value } else { results[aggregateIndex] = aggregator.step(results[aggregateIndex], value) } }, _finalize: function(aggregates, results) { return map(aggregates, function(aggregate, index) { var fin = aggregate.aggregator.finalize; return fin ? fin(results[index]) : results[index] }) } }) }, /*!*******************************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.column_fixing.js ***! \*******************************************************/ function(module, exports, __webpack_require__) { var gridCore = __webpack_require__( /*! ./ui.data_grid.core */ 348), columnFixingModule = __webpack_require__( /*! ../grid_core/ui.grid_core.column_fixing */ 415); gridCore.registerModule("columnFixing", columnFixingModule) }, /*!*******************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.column_fixing.js ***! \*******************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), browser = __webpack_require__( /*! ../../core/utils/browser */ 23), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, wheelEvent = __webpack_require__( /*! ../../events/core/wheel */ 85), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), gridCoreUtils = __webpack_require__( /*! ../grid_core/ui.grid_core.utils */ 349); var CONTENT_CLASS = "content", CONTENT_FIXED_CLASS = "content-fixed", MASTER_DETAIL_CELL_CLASS = "dx-master-detail-cell", FIRST_CELL_CLASS = "dx-first-cell", LAST_CELL_CLASS = "dx-last-cell", HOVER_STATE_CLASS = "dx-state-hover", FIXED_COL_CLASS = "dx-col-fixed", POINTER_EVENTS_TARGET_CLASS = "dx-pointer-events-target", POINTER_EVENTS_NONE_CLASS = "dx-pointer-events-none", getTransparentColumnIndex = function(fixedColumns) { var transparentColumnIndex = -1; $.each(fixedColumns, function(index, column) { if ("transparent" === column.command) { transparentColumnIndex = index; return false } }); return transparentColumnIndex }, normalizeColumnWidths = function(fixedColumns, widths, fixedWidths) { var i, fixedColumnIndex = 0; if (fixedColumns && widths && fixedWidths) { for (i = 0; i < fixedColumns.length; i++) { if ("transparent" === fixedColumns[i].command) { fixedColumnIndex += fixedColumns[i].colspan } else { if (widths[fixedColumnIndex] < fixedWidths[i]) { widths[fixedColumnIndex] = fixedWidths[i] } fixedColumnIndex++ } } } return widths }; var baseFixedColumns = { init: function() { this.callBase(); this._isFixedTableRendering = false; this._isFixedColumns = false }, _createCol: function(column) { return this.callBase(column).toggleClass(FIXED_COL_CLASS, !!(this._isFixedTableRendering && (column.fixed || column.command && "transparent" !== column.command))) }, _renderTable: function(options) { var $fixedTable, $table, that = this, fixedColumns = that.getFixedColumns(); that._isFixedColumns = !!fixedColumns.length; $table = that.callBase(options); if (that._isFixedColumns) { that._isFixedTableRendering = true; $fixedTable = that._createTable(fixedColumns); that._renderRows($fixedTable, extend({}, options, { columns: fixedColumns })); that._updateContent($fixedTable, options && options.change); that._isFixedTableRendering = false } else { that._fixedTableElement && that._fixedTableElement.remove(); that._fixedTableElement = null } return $table }, _createCell: function(options) { var fixedColumns, prevFixedColumn, transparentColumnIndex, that = this, column = options.column, columnCommand = column && column.command, rowType = options.rowType, $cell = that.callBase.apply(that, arguments); if (that._isFixedTableRendering || "filter" === rowType) { fixedColumns = that.getFixedColumns(); transparentColumnIndex = getTransparentColumnIndex(fixedColumns); prevFixedColumn = fixedColumns[transparentColumnIndex - 1] } if (that._isFixedTableRendering) { if ("transparent" === columnCommand) { $cell.addClass(POINTER_EVENTS_NONE_CLASS).toggleClass(FIRST_CELL_CLASS, 0 === transparentColumnIndex || prevFixedColumn && "expand" === prevFixedColumn.command).toggleClass(LAST_CELL_CLASS, fixedColumns.length && transparentColumnIndex === fixedColumns.length - 1).html("freeSpace" !== rowType ? " " : "") } } else { if ("filter" === rowType) { $cell.toggleClass(FIRST_CELL_CLASS, options.columnIndex === transparentColumnIndex) } } return $cell }, _wrapTableInScrollContainer: function() { var $scrollContainer = this.callBase.apply(this, arguments); if (this._isFixedTableRendering) { $scrollContainer.addClass(this.addWidgetPrefix(CONTENT_FIXED_CLASS) + " " + POINTER_EVENTS_TARGET_CLASS) } return $scrollContainer }, _renderCellContent: function($cell, options) { var columns, isEmptyCell, transparentColumnIndex, alignByFixedColumnCellCount, that = this, column = options.column; if (!that._isFixedTableRendering && that._isFixedColumns) { isEmptyCell = column.fixed || column.command; if ("group" === options.rowType && commonUtils.isDefined(column.groupIndex)) { isEmptyCell = false; if (options.row.summaryCells && options.row.summaryCells.length) { columns = that._columnsController.getVisibleColumns(); alignByFixedColumnCellCount = that._getAlignByColumnCellCount ? that._getAlignByColumnCellCount(column.colspan, { columns: columns, row: options.row, isFixed: true }) : 0; if (alignByFixedColumnCellCount > 0) { transparentColumnIndex = getTransparentColumnIndex(that._columnsController.getFixedColumns()); isEmptyCell = columns.length - alignByFixedColumnCellCount < transparentColumnIndex } } } if (isEmptyCell) { $cell.html(" ").addClass(column.cssClass); return } } if ("transparent" !== column.command) { that.callBase($cell, options) } }, _getCellElementsCore: function(rowIndex) { var fixedColumns, fixedColumnIndex, fixedCellElements, that = this, cellElements = that.callBase(rowIndex), index = "columnHeadersView" === that.name ? rowIndex : void 0; if (that._fixedTableElement && cellElements) { fixedColumns = that.getFixedColumns(index); fixedCellElements = that._getRowElements(that._fixedTableElement).eq(rowIndex).children("td"); $.each(fixedColumns, function(columnIndex, column) { if ("transparent" === column.command) { if (fixedCellElements.eq(columnIndex).hasClass(MASTER_DETAIL_CELL_CLASS)) { cellElements[columnIndex] = fixedCellElements.get(columnIndex) || cellElements[columnIndex] } } else { fixedColumnIndex = that._columnsController.getVisibleIndex(column.index, index); cellElements[fixedColumnIndex] = fixedCellElements.get(columnIndex) || cellElements[fixedColumnIndex] } }) } return cellElements }, getColumnWidths: function() { var fixedWidths, that = this, result = that.callBase(), fixedColumns = that.getFixedColumns(); if (that._fixedTableElement && result.length) { fixedWidths = that.callBase(that._fixedTableElement) } return normalizeColumnWidths(fixedColumns, result, fixedWidths) }, _getTableElement: function() { var tableElement = this._isFixedTableRendering ? this._fixedTableElement : this.callBase(); return tableElement }, _setTableElement: function(tableElement) { if (this._isFixedTableRendering) { this._fixedTableElement = tableElement.addClass(POINTER_EVENTS_NONE_CLASS) } else { this.callBase(tableElement) } }, getColumns: function(rowIndex, $tableElement) { $tableElement = $tableElement || this._getTableElement(); if (this._isFixedTableRendering || $tableElement && $tableElement.closest("table").parent("." + this.addWidgetPrefix(CONTENT_FIXED_CLASS)).length) { return this.getFixedColumns(rowIndex) } return this.callBase(rowIndex, $tableElement) }, getRowIndex: function($row) { var $fixedTable = this._fixedTableElement; if ($fixedTable && $fixedTable.find($row).length) { return this._getRowElements($fixedTable).index($row) } return this.callBase($row) }, getTableElements: function() { var result = this.callBase.apply(this, arguments); if (this._fixedTableElement) { result = result.add(this._fixedTableElement) } return result }, getFixedColumns: function(rowIndex) { return this._columnsController.getFixedColumns(rowIndex) }, getFixedColumnsOffset: function() { var $transparentColumn, positionTransparentColumn, offset = { left: 0, right: 0 }; if (this._fixedTableElement) { $transparentColumn = this.getTransparentColumnElement(); positionTransparentColumn = $transparentColumn.position(); offset = { left: positionTransparentColumn.left, right: this.element().outerWidth(true) - ($transparentColumn.outerWidth(true) + positionTransparentColumn.left) } } return offset }, getTransparentColumnElement: function() { return this._fixedTableElement && this._fixedTableElement.find("." + POINTER_EVENTS_NONE_CLASS).first() }, getFixedTableElement: function() { return this._fixedTableElement }, isFixedColumns: function() { return this._isFixedColumns }, _resizeCore: function() { this.callBase(); this.synchronizeRows() }, setColumnWidths: function(widths) { var columns; this.callBase.apply(this, arguments); if (this._fixedTableElement) { if (widths && widths.length && !this.isScrollbarVisible(true)) { columns = this._columnsController.getVisibleColumns() } this.callBase(widths, this._fixedTableElement, columns) } this.synchronizeRows() }, _getClientHeight: function(element) { var boundingClientRectElement = element.getBoundingClientRect && element.getBoundingClientRect(); return boundingClientRectElement && boundingClientRectElement.height ? boundingClientRectElement.height : element.clientHeight }, synchronizeRows: function() { var rowHeight, fixedRowHeight, rowIndex, heightTable, heightFixedTable, $rowElements, $fixedRowElements, that = this, rowHeights = [], fixedRowHeights = []; if (that._isFixedColumns && that._tableElement && that._fixedTableElement) { heightTable = that._getClientHeight(that._tableElement.get(0)); heightFixedTable = that._getClientHeight(that._fixedTableElement.get(0)); $rowElements = that._getRowElements(that._tableElement); $fixedRowElements = that._getRowElements(that._fixedTableElement); if (heightTable !== heightFixedTable) { $rowElements.css("height", ""); $fixedRowElements.css("height", ""); for (rowIndex = 0; rowIndex < $rowElements.length; rowIndex++) { rowHeights.push(that._getClientHeight($rowElements.get(rowIndex))); fixedRowHeights.push(that._getClientHeight($fixedRowElements.get(rowIndex))) } for (rowIndex = 0; rowIndex < $rowElements.length; rowIndex++) { rowHeight = rowHeights[rowIndex]; fixedRowHeight = fixedRowHeights[rowIndex]; if (rowHeight > fixedRowHeight) { $fixedRowElements.eq(rowIndex).css("height", rowHeight) } else { if (rowHeight < fixedRowHeight) { $rowElements.eq(rowIndex).css("height", fixedRowHeight) } } } } } } }; var ColumnHeadersViewFixedColumnsExtender = extend({}, baseFixedColumns, { _getRowVisibleColumns: function(rowIndex) { if (this._isFixedTableRendering) { return this.getFixedColumns(rowIndex) } return this.callBase(rowIndex) }, getContextMenuItems: function(options) { var onItemClick, that = this, column = options.column, columnFixingOptions = that.option("columnFixing"), items = that.callBase(options); if (options.row && "header" === options.row.rowType) { if (column && column.allowFixing) { onItemClick = function(params) { switch (params.itemData.value) { case "none": that._columnsController.columnOption(column.index, "fixed", false); break; case "left": that._columnsController.columnOption(column.index, { fixed: true, fixedPosition: "left" }); break; case "right": that._columnsController.columnOption(column.index, { fixed: true, fixedPosition: "right" }) } }; items = items || []; items.push({ text: columnFixingOptions.texts.fix, beginGroup: true, items: [{ text: columnFixingOptions.texts.leftPosition, value: "left", disabled: column.fixed && (!column.fixedPosition || "left" === column.fixedPosition), onItemClick: onItemClick }, { text: columnFixingOptions.texts.rightPosition, value: "right", disabled: column.fixed && "right" === column.fixedPosition, onItemClick: onItemClick }] }, { text: columnFixingOptions.texts.unfix, value: "none", disabled: !column.fixed, onItemClick: onItemClick }) } } return items }, setScrollerSpacing: function(width) { var that = this, rtlEnabled = that.option("rtlEnabled"); that.callBase(width); that.element().children("." + this.addWidgetPrefix(CONTENT_FIXED_CLASS)).css(rtlEnabled ? { paddingLeft: width } : { paddingRight: width }) }, getFixedColumnElements: function(rowIndex) { var columnElements, transparentColumnIndex, $transparentColumnElement, that = this; if (commonUtils.isDefined(rowIndex)) { return this._fixedTableElement && this._getRowElements(this._fixedTableElement).eq(rowIndex).children() } columnElements = that.getColumnElements(); $transparentColumnElement = that.getTransparentColumnElement(); if (columnElements && $transparentColumnElement && $transparentColumnElement.length) { transparentColumnIndex = getTransparentColumnIndex(that.getFixedColumns()); columnElements.splice(transparentColumnIndex, $transparentColumnElement.get(0).colSpan, $transparentColumnElement.get(0)) } return columnElements }, getColumnWidths: function() { var fixedWidths, that = this, result = that.callBase(), $fixedColumnElements = that.getFixedColumnElements(), fixedColumns = that.getFixedColumns(); if (that._fixedTableElement) { if ($fixedColumnElements && $fixedColumnElements.length) { fixedWidths = that._getWidths($fixedColumnElements) } else { fixedWidths = that.callBase(that._fixedTableElement) } } return normalizeColumnWidths(fixedColumns, result, fixedWidths) } }); var RowsViewFixedColumnsExtender = extend({}, baseFixedColumns, { _detachHoverEvents: function() { this._fixedTableElement && this._fixedTableElement.off("mouseover mouseout", ".dx-data-row"); this._tableElement && this._tableElement.off("mouseover mouseout", ".dx-data-row") }, _attachHoverEvents: function() { var that = this, attachHoverEvent = function($table) { $table.on("mouseover mouseout", ".dx-data-row", that.createAction(function(args) { var event = args.jQueryEvent, rowIndex = that.getRowIndex($(event.target).closest(".dx-row")), isHover = "mouseover" === event.type; if (rowIndex >= 0) { that._tableElement && that._getRowElements(that._tableElement).eq(rowIndex).toggleClass(HOVER_STATE_CLASS, isHover); that._fixedTableElement && that._getRowElements(that._fixedTableElement).eq(rowIndex).toggleClass(HOVER_STATE_CLASS, isHover) } })) }; if (that._fixedTableElement && that._tableElement) { attachHoverEvent(that._fixedTableElement); attachHoverEvent(that._tableElement) } }, _findContentElement: function() { var $content, scrollable, scrollTop, that = this, contentClass = that.addWidgetPrefix(CONTENT_CLASS), element = that.element(); if (element && that._isFixedTableRendering) { $content = element.children("." + contentClass); scrollable = that.getScrollable(); if (!$content.length && scrollable) { $content = $("<div/>").addClass(contentClass).on("scroll", function(e) { scrollTop = $(e.target).scrollTop(); if (scrollTop) { $(e.target).scrollTop(0); scrollable.scrollTo({ y: that._scrollTop + scrollTop }) } }).on(wheelEvent.name, function(e) { if (scrollable) { scrollTop = scrollable.scrollTop(); scrollable.scrollTo({ y: scrollTop - e.delta }); if (scrollable.scrollTop() > 0 && scrollable.scrollTop() + scrollable.clientHeight() < scrollable.scrollHeight() + that.getScrollbarWidth()) { return false } } }).appendTo(element) } return $content } return that.callBase() }, _updateBottomLoading: function() { if (!this._isFixedTableRendering) { this.callBase() } }, _updateScrollable: function() { this.callBase(); var scrollable = this.getScrollable(), scrollTop = scrollable && scrollable.scrollOffset().top; this._updateFixedTablePosition(-scrollTop) }, _renderContent: function(contentElement, tableElement) { if (this._isFixedTableRendering) { return contentElement.empty().addClass(this.addWidgetPrefix(CONTENT_CLASS) + " " + this.addWidgetPrefix(CONTENT_FIXED_CLASS) + " " + POINTER_EVENTS_TARGET_CLASS).append(tableElement) } return this.callBase(contentElement, tableElement) }, _getGroupCellOptions: function(options) { if (this._isFixedTableRendering) { return this.callBase(extend({}, options, { columns: this._columnsController.getVisibleColumns() })) } return this.callBase(options) }, _renderGroupSummaryCells: function($row, options) { if (this._isFixedTableRendering) { this.callBase($row, extend({}, options, { columns: this._columnsController.getVisibleColumns() })) } else { this.callBase($row, options) } }, _hasAlignByColumnSummaryItems: function(columnIndex, options) { var result = this.callBase.apply(this, arguments), column = options.columns[columnIndex]; if (options.isFixed) { return column.fixed && (result || "right" === column.fixedPosition) || "edit" === column.command } return result && !column.fixed }, _renderGroupSummaryCellsCore: function($groupCell, options, groupCellColSpan, alignByColumnCellCount) { var startColumnIndex, transparentColumnIndex, alignByFixedColumnCellCount; if (this._isFixedTableRendering) { options.isFixed = true; alignByFixedColumnCellCount = this._getAlignByColumnCellCount(groupCellColSpan, options); options.isFixed = false; startColumnIndex = options.columns.length - alignByFixedColumnCellCount; options = extend({}, options, { columns: this.getFixedColumns() }); transparentColumnIndex = getTransparentColumnIndex(options.columns); if (startColumnIndex < transparentColumnIndex) { alignByFixedColumnCellCount -= options.columns[transparentColumnIndex].colspan - 1 || 0; groupCellColSpan -= options.columns[transparentColumnIndex].colspan - 1 || 0 } else { if (alignByColumnCellCount > 0) { if (browser.mozilla) { $groupCell.css("display", "none") } else { $groupCell.css("visibility", "hidden") } } } alignByColumnCellCount = alignByFixedColumnCellCount } this.callBase($groupCell, options, groupCellColSpan, alignByColumnCellCount) }, _getSummaryCellIndex: function(columnIndex, columns) { var transparentColumnIndex; if (this._isFixedTableRendering) { transparentColumnIndex = getTransparentColumnIndex(columns); if (columnIndex > transparentColumnIndex) { columnIndex += columns[transparentColumnIndex].colspan - 1 } return columnIndex } return this.callBase.apply(this, arguments) }, _renderCore: function(change) { this._detachHoverEvents(); this.callBase(change); if (this.option("hoverStateEnabled") && this._isFixedColumns) { this._attachHoverEvents() } }, optionChanged: function(args) { var that = this; that.callBase(args); if ("hoverStateEnabled" === args.name && that._isFixedColumns) { args.value ? this._attachHoverEvents() : this._detachHoverEvents() } }, getCellIndex: function($cell) { var columns, $fixedTable = this._fixedTableElement, cellIndex = 0; if ($fixedTable && $fixedTable.find($cell).length) { columns = this.getFixedColumns(); $.each(columns, function(index, column) { if (index === $cell[0].cellIndex) { return false } if (column.colspan) { cellIndex += column.colspan; return } cellIndex++ }); return cellIndex } return this.callBase.apply(this, arguments) }, _updateFixedTablePosition: function(scrollTop) { if (this._fixedTableElement && this._tableElement) { var editorFactory = this.getController("editorFactory"), $focusedElement = editorFactory.focus(); this._fixedTableElement.css("top", scrollTop + this._tableElement.position().top); if ($focusedElement) { editorFactory.focus($focusedElement) } } }, setScrollerSpacing: function(vWidth, hWidth) { var styles, that = this; var $fixedContent = that.element().children("." + this.addWidgetPrefix(CONTENT_FIXED_CLASS)); if ($fixedContent.length) { styles = that.option("rtlEnabled") ? { marginLeft: vWidth } : { marginRight: vWidth }; styles.marginBottom = hWidth; $fixedContent.css(styles) } }, _handleScroll: function(e) { this._updateFixedTablePosition(-e.scrollOffset.top); this.callBase(e) }, _updateContentPosition: function() { var isUpdated = this.callBase(); if (isUpdated) { this._updateFixedTablePosition(-this._scrollTop) } return isUpdated }, _afterRowPrepared: function(e) { if (this._isFixedTableRendering) { return } this.callBase(e) } }); var FooterViewFixedColumnsExtender = baseFixedColumns; module.exports = { defaultOptions: function() { return { columnFixing: { enabled: false, texts: { fix: messageLocalization.format("dxDataGrid-columnFixingFix"), unfix: messageLocalization.format("dxDataGrid-columnFixingUnfix"), leftPosition: messageLocalization.format("dxDataGrid-columnFixingLeftPosition"), rightPosition: messageLocalization.format("dxDataGrid-columnFixingRightPosition") } } } }, extenders: { views: { columnHeadersView: ColumnHeadersViewFixedColumnsExtender, rowsView: RowsViewFixedColumnsExtender, footerView: FooterViewFixedColumnsExtender }, controllers: function() { var normalizeColumnIndicesByPoints = function(columns, fixedColumns, pointsByColumns) { var transparentColumnIndex = getTransparentColumnIndex(fixedColumns), correctIndex = columns.length - fixedColumns.length; $.each(pointsByColumns, function(_, point) { if (point.index > transparentColumnIndex) { point.columnIndex += correctIndex; point.index += correctIndex } }); return pointsByColumns }; return { draggingHeader: { _generatePointsByColumns: function(options) { var pointsByColumns, visibleColumns = options.columns, targetDraggingPanel = options.targetDraggingPanel; if (targetDraggingPanel && "headers" === targetDraggingPanel.getName() && targetDraggingPanel.isFixedColumns()) { if (options.sourceColumn.fixed) { if (!options.rowIndex) { options.columnElements = targetDraggingPanel.getFixedColumnElements(0) } options.columns = targetDraggingPanel.getFixedColumns(options.rowIndex); pointsByColumns = this.callBase(options); normalizeColumnIndicesByPoints(visibleColumns, options.columns, pointsByColumns); return pointsByColumns } } return this.callBase(options) }, _pointCreated: function(point, columns, location, sourceColumn) { var boundingRect, result = this.callBase.apply(this, arguments), $transparentColumn = this._columnHeadersView.getTransparentColumnElement(); if (!result && "headers" === location && $transparentColumn && $transparentColumn.length) { boundingRect = $transparentColumn.get(0).getBoundingClientRect(); if (sourceColumn && sourceColumn.fixed) { return "right" === sourceColumn.fixedPosition ? point.x < boundingRect.right : point.x > boundingRect.left } else { return point.x < boundingRect.left || point.x > boundingRect.right } } return result } }, columnsResizer: { _generatePointsByColumns: function() { var that = this, columnsController = that._columnsController, columns = columnsController && that._columnsController.getVisibleColumns(), fixedColumns = columnsController && that._columnsController.getFixedColumns(), cells = that._columnHeadersView.getFixedColumnElements(), pointsByFixedColumns = []; that.callBase(); if (cells && cells.length > 0) { pointsByFixedColumns = gridCoreUtils.getPointsByColumns(cells, function(point) { return that._pointCreated(point, cells.length, fixedColumns) }); that._pointsByFixedColumns = normalizeColumnIndicesByPoints(columns, fixedColumns, pointsByFixedColumns) } }, _pointCreated: function(point, cellsLength, columns) { var currentColumn, nextColumn; if (point.index > 0 && point.index < cellsLength) { currentColumn = columns[point.columnIndex - 1] || {}; nextColumn = columns[point.columnIndex] || {}; if (currentColumn.fixed || nextColumn.fixed) { point.columnIndex -= 1; return !((currentColumn.allowResizing || "transparent" === currentColumn.command) && (nextColumn.allowResizing || "transparent" === nextColumn.command)) } } return this.callBase.apply(this, arguments) }, _getTargetPoint: function(pointsByColumns, currentX, deltaX) { var boundingRect, $transparentColumn = this._columnHeadersView.getTransparentColumnElement(); if ($transparentColumn && $transparentColumn.length) { boundingRect = $transparentColumn.get(0).getBoundingClientRect(); if (currentX <= boundingRect.left || currentX >= boundingRect.right) { return this.callBase(this._pointsByFixedColumns, currentX, deltaX) } } return this.callBase(pointsByColumns, currentX, deltaX) } }, keyboardNavigation: { _scrollToElement: function($element) { var focusedView = this.getFocusedView(); this.callBase($element, focusedView && focusedView.getFixedColumnsOffset()) } } } }() } } }, /*!****************************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.adaptivity.js ***! \****************************************************/ function(module, exports, __webpack_require__) { var gridCore = __webpack_require__( /*! ./ui.data_grid.core */ 348), adaptivityModule = __webpack_require__( /*! ../grid_core/ui.grid_core.adaptivity */ 417); gridCore.registerModule("adaptivity", adaptivityModule) }, /*!****************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.adaptivity.js ***! \****************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), eventUtils = __webpack_require__( /*! ../../events/utils */ 71), clickEvent = __webpack_require__( /*! ../../events/click */ 75), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, equalByValue = commonUtils.equalByValue, Guid = __webpack_require__( /*! ../../core/guid */ 151), modules = __webpack_require__( /*! ./ui.grid_core.modules */ 350), Form = __webpack_require__( /*! ../form */ 285), gridCoreUtils = __webpack_require__( /*! ./ui.grid_core.utils */ 349), COLUMN_HEADERS_VIEW = "columnHeadersView", ROWS_VIEW = "rowsView", FOOTER_VIEW = "footerView", COLUMN_VIEWS = [COLUMN_HEADERS_VIEW, ROWS_VIEW, FOOTER_VIEW], ADAPTIVE_NAMESPACE = "dxDataGridAdaptivity", HIDDEN_COLUMNS_WIDTH = "adaptiveHidden", ADAPTIVE_ROW_TYPE = "detailAdaptive", FORM_ITEM_CONTENT_CLASS = "dx-field-item-content", FORM_ITEM_MODIFIED = "dx-item-modified", HIDDEN_COLUMN_CLASS = "hidden-column", ADAPTIVE_COLUMN_BUTTON_CLASS = "adaptive-more", ADAPTIVE_COLUMN_NAME_CLASS = "dx-command-adaptive", COMMAND_ADAPTIVE_HIDDEN_CLASS = "dx-command-adaptive-hidden", ADAPTIVE_DETAIL_ROW_CLASS = "dx-adaptive-detail-row", ADAPTIVE_ITEM_TEXT_CLASS = "dx-adaptive-item-text", MASTER_DETAIL_CELL_CLASS = "dx-master-detail-cell", ADAPTIVE_COLUMN_NAME = "adaptive", EDIT_MODE_BATCH = "batch", EDIT_MODE_ROW = "row", EDIT_MODE_FORM = "form", EDIT_MODE_POPUP = "popup"; function getColumnId(column) { return column.command ? "command:" + column.command : column.index } var AdaptiveColumnsController = modules.ViewController.inherit({ _isRowEditMode: function() { var editMode = this._editingController.getEditMode(); return editMode === EDIT_MODE_ROW }, _isItemModified: function(item, cellOptions) { var columnIndex = this._columnsController.getVisibleIndex(item.column.index), rowIndex = this._dataController.getRowIndexByKey(cellOptions.key), row = this._dataController.items()[rowIndex + 1]; return row && row.modifiedValues && commonUtils.isDefined(row.modifiedValues[columnIndex]) }, _renderFormViewTemplate: function(item, cellOptions, $container) { var cellText, that = this, column = item.column, cellValue = column.calculateCellValue(cellOptions.data); cellValue = gridCoreUtils.getDisplayValue(column, cellValue, cellOptions.data, cellOptions.rowType); cellText = gridCoreUtils.formatValue(cellValue, column); if (column.cellTemplate) { var templateOptions = extend({}, cellOptions, { value: cellValue, text: cellText, column: column }); that._rowsView.renderTemplate($container, column.cellTemplate, templateOptions, !!$container.closest(document).length) } else { var container = $container.get(0); if (column.encodeHtml) { container.textContent = cellText } else { container.innerHTML = cellText } $container.addClass(ADAPTIVE_ITEM_TEXT_CLASS); if (!commonUtils.isDefined(cellText) || "" === cellText) { $container.html(" ") } if (!that._isRowEditMode()) { if (that._isItemModified(item, cellOptions)) { $container.addClass(FORM_ITEM_MODIFIED) } } } }, _getTemplate: function(item, cellOptions) { var that = this, column = item.column, editingController = this.getController("editing"); return function(options, $container) { var isItemEdited = that._isItemEdited(item), columnIndex = that._columnsController.getVisibleIndex(column.visibleIndex), templateOptions = extend({}, cellOptions); templateOptions.value = cellOptions.row.values[columnIndex]; if (isItemEdited || column.showEditorAlways) { editingController.renderFormEditTemplate(templateOptions, item, options.component, $container, !isItemEdited) } else { templateOptions.column = column; templateOptions.columnIndex = columnIndex; that._renderFormViewTemplate(item, templateOptions, $container); that.getView("rowsView")._cellPrepared($container, templateOptions) } } }, _isVisibleColumnsValid: function(visibleColumns) { var getCommandColumnsCount = function() { var j, visibleColumn, result = 0; for (j = 0; j < visibleColumns.length; j++) { visibleColumn = visibleColumns[j]; if (visibleColumn.command) { result++ } } return result }; if (visibleColumns < 2) { return false } if (visibleColumns.length - getCommandColumnsCount() <= 1) { return false } return true }, _calculatePercentWidths: function(widths, visibleColumns) { var that = this, percentWidths = 0; visibleColumns.forEach(function(item, index) { if (widths[index] !== HIDDEN_COLUMNS_WIDTH) { percentWidths += that._getItemPercentWidth(item) } }); return percentWidths }, _isPercentWidth: function(width) { return commonUtils.isString(width) && "%" === width.slice(-1) }, _isColumnHidden: function(column) { return this._hiddenColumns.filter(function(hiddenColumn) { return hiddenColumn.index === column.index }).length > 0 }, _getAverageColumnsWidth: function(containerWidth, columns) { var that = this, fixedColumnsWidth = 0, columnsWithoutWidthCount = 0; columns.forEach(function(column) { if (!that._isColumnHidden(column)) { if (commonUtils.isDefined(column.width)) { fixedColumnsWidth += column.width } else { columnsWithoutWidthCount++ } } }); return (containerWidth - fixedColumnsWidth) / columnsWithoutWidthCount }, _getNotTruncatedColumnWidth: function(column, containerWidth, contentColumns, columnsCanFit) { var colWidth, columnId = getColumnId(column), widthOption = this._columnsController.columnOption(columnId, "width"), bestFitWidth = this._columnsController.columnOption(columnId, "bestFitWidth"), columnsCount = contentColumns.length; if (widthOption && "auto" !== widthOption) { if (this._isPercentWidth(widthOption)) { var columnFitted = column.visibleIndex < columnsCount - 1 && columnsCanFit, partialWidth = containerWidth * parseFloat(widthOption) / 100, resultWidth = columnsCanFit && partialWidth < bestFitWidth ? bestFitWidth : partialWidth; colWidth = columnFitted ? this.component.element().width() * parseFloat(widthOption) / 100 : resultWidth } else { return widthOption } } else { var columnAutoWidth = this.option("columnAutoWidth"); colWidth = columnAutoWidth || !!column.command ? bestFitWidth : this._getAverageColumnsWidth(containerWidth, contentColumns) } var isTruncated = colWidth < bestFitWidth; return isTruncated ? null : colWidth }, _getItemPercentWidth: function(item) { var result = 0; if (item.width && this._isPercentWidth(item.width)) { result = parseFloat(item.width) } return result }, _getCommandColumnsWidth: function() { var that = this, columns = that._columnsController.getVisibleColumns(), colWidth = 0; $.each(columns, function(index, column) { if (column.index < 0 || column.command) { colWidth += that._columnsController.columnOption(getColumnId(column), "bestFitWidth") || 0 } }); return colWidth }, _isItemEdited: function(item) { if (this.isFormEditMode()) { return false } if (this._isRowEditMode()) { var editRowKey = this._editingController.getEditRowKey(); if (equalByValue(editRowKey, this._dataController.adaptiveExpandedKey())) { return true } } else { var rowIndex = this._dataController.getRowIndexByKey(this._dataController.adaptiveExpandedKey()) + 1, columnIndex = this._columnsController.getVisibleIndex(item.column.index); return this._editingController.isEditCell(rowIndex, columnIndex) } }, _getFormItemsByHiddenColumns: function(hiddenColumns) { var items = []; $.each(hiddenColumns, function(_, column) { items.push({ column: column, name: column.name, dataField: column.dataField, visibleIndex: column.visibleIndex }) }); return items }, _getAdaptiveColumnVisibleIndex: function(visibleColumns) { var i, column; for (i = 0; i < visibleColumns.length; i++) { column = visibleColumns[i]; if (column.command === ADAPTIVE_COLUMN_NAME) { return i } } }, _hideAdaptiveColumn: function(resultWidths, visibleColumns) { var visibleIndex = this._getAdaptiveColumnVisibleIndex(visibleColumns); if (commonUtils.isDefined(visibleIndex)) { resultWidths[visibleIndex] = HIDDEN_COLUMNS_WIDTH; this._addCssClassToColumn(COMMAND_ADAPTIVE_HIDDEN_CLASS, visibleIndex) } }, _removeCssClassFromColumn: function(cssClassName) { var i, view, $cells; for (i = 0; i < COLUMN_VIEWS.length; i++) { view = this.getView(COLUMN_VIEWS[i]); if (view && view.isVisible() && view.element()) { $cells = view.element().find("." + cssClassName); $cells.removeClass(cssClassName) } } }, _removeCssClassesFromColumns: function() { this._removeCssClassFromColumn(COMMAND_ADAPTIVE_HIDDEN_CLASS); this._removeCssClassFromColumn(this.addWidgetPrefix(HIDDEN_COLUMN_CLASS)) }, _isCellValid: function($cell) { return !$cell.hasClass(MASTER_DETAIL_CELL_CLASS) }, _addCssClassToColumn: function(cssClassName, visibleIndex) { var i, view, viewName, rowsCount, rowIndex, $cellElement, currentVisibleIndex, column = this._columnsController.getVisibleColumns()[visibleIndex], editFormRowIndex = this._editingController && this._editingController.getEditFormRowIndex(); for (i = 0; i < COLUMN_VIEWS.length; i++) { viewName = COLUMN_VIEWS[i]; view = this.getView(viewName); if (view && view.isVisible() && column) { rowsCount = view.getRowsCount(); for (rowIndex = 0; rowIndex < rowsCount; rowIndex++) { if (rowIndex !== editFormRowIndex || viewName !== ROWS_VIEW) { currentVisibleIndex = viewName === COLUMN_HEADERS_VIEW ? this._columnsController.getVisibleIndex(column.index, rowIndex) : visibleIndex; if (currentVisibleIndex >= 0) { $cellElement = view.getCellElements(rowIndex).eq(currentVisibleIndex); this._isCellValid($cellElement) && $cellElement.addClass(cssClassName) } } } } } }, isFormEditMode: function() { var editMode = this._editingController.getEditMode(); return editMode === EDIT_MODE_FORM || editMode === EDIT_MODE_POPUP }, hideRedundantColumns: function(resultWidths, visibleColumns, hiddenQueue) { var visibleColumn, that = this; this._hiddenColumns = []; if (that._isVisibleColumnsValid(visibleColumns) && hiddenQueue.length) { var percentWidths, columnsCanFit, i, needHideColumn, totalWidth = 0, $rootElement = that.component.element(), rootElementWidth = $rootElement.width() - that._getCommandColumnsWidth(), contentColumns = visibleColumns.filter(function(item) { return !item.command }), contentColumnCount = contentColumns.length; do { needHideColumn = false; totalWidth = 0; percentWidths = that._calculatePercentWidths(resultWidths, visibleColumns); columnsCanFit = percentWidths < 100 && 0 !== percentWidths; for (i = 0; i < visibleColumns.length; i++) { visibleColumn = visibleColumns[i]; var columnWidth = that._getNotTruncatedColumnWidth(visibleColumn, rootElementWidth, contentColumns, columnsCanFit), columnId = getColumnId(visibleColumn), widthOption = that._columnsController.columnOption(columnId, "width"), columnBestFitWidth = that._columnsController.columnOption(columnId, "bestFitWidth"); if (resultWidths[i] === HIDDEN_COLUMNS_WIDTH) { continue } if (!columnWidth && !visibleColumn.command && !visibleColumn.fixed) { needHideColumn = true; break } if (widthOption && "auto" !== widthOption) { totalWidth += columnWidth } else { totalWidth += columnBestFitWidth || 0 } } needHideColumn = needHideColumn || totalWidth > $rootElement.width(); if (needHideColumn) { var column = hiddenQueue.pop(), visibleIndex = that._columnsController.getVisibleIndex(column.index); that._addCssClassToColumn(that.addWidgetPrefix(HIDDEN_COLUMN_CLASS), visibleIndex); resultWidths[visibleIndex] = HIDDEN_COLUMNS_WIDTH; contentColumnCount--; this._hiddenColumns.push(column) } } while (needHideColumn && contentColumnCount > 1 && hiddenQueue.length); if (contentColumnCount === contentColumns.length) { that._hideAdaptiveColumn(resultWidths, visibleColumns) } } else { that._hideAdaptiveColumn(resultWidths, visibleColumns) } }, getItemContentByColumnIndex: function(visibleColumnIndex) { var $itemContent, i, item; for (i = 0; i < this._$itemContents.length; i++) { $itemContent = this._$itemContents.eq(i); item = $itemContent.data("dx-form-item"); if (item && item.column && this._columnsController.getVisibleIndex(item.column.index) === visibleColumnIndex) { return $itemContent } } }, toggleExpandAdaptiveDetailRow: function(key) { if (!(this.isFormEditMode() && this._editingController.isEditing())) { this.getController("data").toggleExpandAdaptiveDetailRow(key) } }, createFormByHiddenColumns: function($container, options) { var that = this, userFormOptions = { items: that._getFormItemsByHiddenColumns(that._hiddenColumns), formID: "dx-" + new Guid }; this.executeAction("onAdaptiveDetailRowPreparing", { formOptions: userFormOptions }); that._$itemContents = null; that._form = that._createComponent($("<div>").appendTo($container), Form, extend({}, userFormOptions, { customizeItem: function(item) { var column = item.column || that._columnsController.columnOption(item.name || item.dataField); if (column) { item.label = item.label || {}; item.label.text = item.label.text || column.caption; item.column = column; item.template = that._getTemplate(item, options, that.updateForm.bind(that)) } userFormOptions.customizeItem && userFormOptions.customizeItem.call(this, item) }, onContentReady: function(e) { userFormOptions.onContentReady && userFormOptions.onContentReady.call(this, e); that._$itemContents = $container.find("." + FORM_ITEM_CONTENT_CLASS) } })) }, hasAdaptiveDetailRowExpanded: function() { return commonUtils.isDefined(this._dataController.adaptiveExpandedKey()) }, updateForm: function(hiddenColumns) { if (this.hasAdaptiveDetailRowExpanded()) { if (this._form && commonUtils.isDefined(this._form._contentReadyAction)) { if (hiddenColumns && hiddenColumns.length) { this._form.option("items", this._getFormItemsByHiddenColumns(hiddenColumns)) } else { this._form.repaint() } } } }, updateHidingQueue: function(columns) { var columnsHasHidingPriority, i, that = this, hideableColumns = columns.filter(function(column) { return column.visible && !column.fixed && !(commonUtils.isDefined(column.groupIndex) && column.groupIndex >= 0) }); that._hidingColumnsQueue = []; if (that.option("allowColumnResizing") && "widget" === that.option("columnResizingMode")) { return that._hidingColumnsQueue } for (i = 0; i < hideableColumns.length; i++) { if (commonUtils.isDefined(hideableColumns[i].hidingPriority) && hideableColumns[i].hidingPriority >= 0) { columnsHasHidingPriority = true; that._hidingColumnsQueue[hideableColumns[i].hidingPriority] = hideableColumns[i] } } if (columnsHasHidingPriority) { that._hidingColumnsQueue.reverse() } else { if (that.option("columnHidingEnabled")) { for (i = 0; i < hideableColumns.length; i++) { var visibleIndex = that._columnsController.getVisibleIndex(hideableColumns[i].index); that._hidingColumnsQueue[visibleIndex] = hideableColumns[i] } } } that._hidingColumnsQueue = that._hidingColumnsQueue.filter(Object); return that._hidingColumnsQueue }, getHiddenColumns: function() { return this._hiddenColumns }, hasHiddenColumns: function() { return this._hiddenColumns.length > 0 }, getHidingColumnsQueue: function() { return this._hidingColumnsQueue }, init: function() { var that = this; that._columnsController = that.getController("columns"); that._dataController = that.getController("data"); that._rowsView = that.getView("rowsView"); that._columnsController.addCommandColumn({ command: ADAPTIVE_COLUMN_NAME, visible: true, adaptiveHidden: true, cssClass: ADAPTIVE_COLUMN_NAME_CLASS, width: "auto" }); that._columnsController.columnsChanged.add(function() { var isAdaptiveVisible = !!that.updateHidingQueue(that._columnsController.getColumns()).length; that._columnsController.columnOption("command:adaptive", "adaptiveHidden", !isAdaptiveVisible, true) }); that._editingController = that.getController("editing"); that._hidingColumnsQueue = []; that._hiddenColumns = []; that.createAction("onAdaptiveDetailRowPreparing"); that.callBase() }, optionChanged: function(args) { if ("columnHidingEnabled" === args.name) { this._columnsController.columnOption("command:adaptive", "adaptiveHidden", !args.value) } this.callBase(args) }, publicMethods: function() { return ["isAdaptiveDetailRowExpanded", "expandAdaptiveDetailRow", "collapseAdaptiveDetailRow"] }, isAdaptiveDetailRowExpanded: function(key) { return this._dataController.adaptiveExpandedKey() && commonUtils.equalByValue(this._dataController.adaptiveExpandedKey(), key) }, expandAdaptiveDetailRow: function(key) { if (!this.hasAdaptiveDetailRowExpanded()) { this.toggleExpandAdaptiveDetailRow(key) } }, collapseAdaptiveDetailRow: function() { if (this.hasAdaptiveDetailRowExpanded()) { this.toggleExpandAdaptiveDetailRow() } } }); module.exports = { defaultOptions: function() { return { columnHidingEnabled: false, onAdaptiveDetailRowPreparing: null } }, controllers: { adaptiveColumns: AdaptiveColumnsController }, extenders: { views: { rowsView: { _getCellTemplate: function(options) { var that = this, column = options.column; if (column.command === ADAPTIVE_COLUMN_NAME && "groupFooter" !== options.rowType) { return function(container) { $("<span/>").addClass(that.addWidgetPrefix(ADAPTIVE_COLUMN_BUTTON_CLASS)).on(eventUtils.addNamespace(clickEvent.name, ADAPTIVE_NAMESPACE), that.createAction(function() { that._adaptiveColumnsController.toggleExpandAdaptiveDetailRow(options.key) })).appendTo(container) } } if (options.rowType === ADAPTIVE_ROW_TYPE && "detail" === column.command) { return function(container, options) { that._adaptiveColumnsController.createFormByHiddenColumns(container, options) } } return that.callBase(options) }, _createRow: function(row) { var $row = this.callBase(row); if (row && row.rowType === ADAPTIVE_ROW_TYPE && row.key === this._dataController.adaptiveExpandedKey()) { $row.addClass(ADAPTIVE_DETAIL_ROW_CLASS) } return $row }, _getColumnIndexByElementCore: function($element) { var $itemContent = $element.closest("." + FORM_ITEM_CONTENT_CLASS); if ($itemContent.length && $itemContent.closest(this.component.element()).length) { var formItem = $itemContent.length ? $itemContent.first().data("dx-form-item") : null; return formItem && formItem.column && this._columnsController.getVisibleIndex(formItem.column.index) } else { return this.callBase($element) } }, getCellElement: function(rowIndex, columnIdentifier) { var item = this._dataController.items()[rowIndex]; if (item && item.rowType === ADAPTIVE_ROW_TYPE) { return this._adaptiveColumnsController.getItemContentByColumnIndex(columnIdentifier) } else { return this.callBase(rowIndex, columnIdentifier) } }, isClickableElement: function($target) { var isClickable = this.callBase ? this.callBase($target) : false; return isClickable || !!$target.closest("." + ADAPTIVE_COLUMN_NAME_CLASS).length }, init: function() { this.callBase(); this._adaptiveColumnsController = this.getController("adaptiveColumns") } } }, controllers: { "export": { _updateColumnWidth: function(column, width) { this.callBase(column, column.visibleWidth === HIDDEN_COLUMNS_WIDTH ? column.bestFitWidth : width) } }, columnsResizer: { _pointCreated: function(point, cellsLength, columns) { var result = this.callBase(point, cellsLength, columns), currentColumn = columns[point.columnIndex] || {}, nextColumnIndex = this._getNextColumnIndex(point.columnIndex), nextColumn = columns[nextColumnIndex] || {}, hasHiddenColumnsOnly = nextColumnIndex !== point.columnIndex + 1 && nextColumn.command, hasAdaptiveHiddenWidth = currentColumn.visibleWidth === HIDDEN_COLUMNS_WIDTH || hasHiddenColumnsOnly; return result || hasAdaptiveHiddenWidth }, _getNextColumnIndex: function(currentColumnIndex) { var visibleColumns = this._columnsController.getVisibleColumns(), index = this.callBase(currentColumnIndex); while (visibleColumns[index] && visibleColumns[index].visibleWidth === HIDDEN_COLUMNS_WIDTH) { index++ } return index } }, draggingHeader: { _pointCreated: function(point, columns, location, sourceColumn) { var result = this.callBase(point, columns, location, sourceColumn), column = columns[point.columnIndex] || {}, hasAdaptiveHiddenWidth = column.visibleWidth === HIDDEN_COLUMNS_WIDTH; return result || hasAdaptiveHiddenWidth } }, editing: { _getFormEditItemTemplate: function(cellOptions, column) { if (this.getEditMode() !== EDIT_MODE_ROW && "detailAdaptive" === cellOptions.rowType) { cellOptions.columnIndex = this._columnsController.getVisibleIndex(column.index); return this.getColumnTemplate(cellOptions) } return this.callBase(cellOptions, column) }, _closeEditItem: function($targetElement) { var $itemContents = $targetElement.closest("." + FORM_ITEM_CONTENT_CLASS), rowIndex = this._dataController.getRowIndexByKey(this._dataController.adaptiveExpandedKey()) + 1, formItem = $itemContents.length ? $itemContents.first().data("dx-form-item") : null, columnIndex = formItem && formItem.column && this._columnsController.getVisibleIndex(formItem.column.index); if (!this.isEditCell(rowIndex, columnIndex)) { this.callBase($targetElement) } }, _beforeUpdateItems: function(rowIndices, rowIndex) { if (!this._adaptiveController.isFormEditMode() && this._adaptiveController.hasHiddenColumns()) { var items = this._dataController.items(), item = items[rowIndex], oldExpandRowIndex = gridCoreUtils.getIndexByKey(this._dataController.adaptiveExpandedKey(), items); this._isForceRowAdaptiveExpand = !this._adaptiveController.hasAdaptiveDetailRowExpanded(); if (oldExpandRowIndex >= 0 && rowIndex > oldExpandRowIndex) { this._editRowIndex-- } if (oldExpandRowIndex >= 0) { rowIndices.push(oldExpandRowIndex + 1) } rowIndices.push(rowIndex + 1); this._dataController.adaptiveExpandedKey(item.key) } }, _afterInsertRow: function(options) { this.callBase(options); if (this._adaptiveController.hasHiddenColumns()) { this._adaptiveController.expandAdaptiveDetailRow(options.key); this._isForceRowAdaptiveExpand = true } }, _collapseAdaptiveDetailRow: function() { if (this.getEditMode() === EDIT_MODE_ROW && this._isForceRowAdaptiveExpand) { this._adaptiveController.collapseAdaptiveDetailRow(); this._isForceRowAdaptiveExpand = false } }, _cancelEditAdaptiveDetailRow: function() { if (this._adaptiveController.hasHiddenColumns()) { this._collapseAdaptiveDetailRow() } }, _afterSaveEditData: function() { this.callBase(); if (this.getController("validating").validate(true)) { this._cancelEditAdaptiveDetailRow() } }, _beforeCancelEditData: function() { this.callBase(); this._cancelEditAdaptiveDetailRow() }, _getRowIndicesForCascadeUpdating: function(row) { var rowIndices = this.callBase.apply(this, arguments); if (this._adaptiveController.isAdaptiveDetailRowExpanded(row.key)) { rowIndices.push(row.rowType === ADAPTIVE_ROW_TYPE ? row.rowIndex - 1 : row.rowIndex + 1) } return rowIndices }, _beforeCloseEditCellInBatchMode: function(rowIndices) { var rowIndex, expandedKey = this._dataController._adaptiveExpandedKey; if (expandedKey) { rowIndex = gridCoreUtils.getIndexByKey(expandedKey, this._dataController.items()); if (rowIndex > -1) { rowIndices.unshift(rowIndex) } } }, editRow: function(rowIndex) { if (this._adaptiveController.isFormEditMode()) { this._adaptiveController.collapseAdaptiveDetailRow() } this.callBase(rowIndex) }, deleteRow: function(rowIndex) { var rowKey = this._dataController.getKeyByRowIndex(rowIndex); if (this.getEditMode() === EDIT_MODE_BATCH && this._adaptiveController.isAdaptiveDetailRowExpanded(rowKey)) { this._adaptiveController.collapseAdaptiveDetailRow() } this.callBase(rowIndex) }, init: function() { this.callBase(); this._adaptiveController = this.getController("adaptiveColumns") } }, resizing: { _needBestFit: function() { return this.callBase() || !!this._adaptiveColumnsController.getHidingColumnsQueue().length }, _correctColumnWidths: function(resultWidths, visibleColumns) { var hiddenColumns, adaptiveController = this._adaptiveColumnsController, oldHiddenColumns = adaptiveController.getHiddenColumns(), hidingColumnsQueue = adaptiveController.updateHidingQueue(this._columnsController.getColumns()); adaptiveController.hideRedundantColumns(resultWidths, visibleColumns, hidingColumnsQueue); hiddenColumns = adaptiveController.getHiddenColumns(); if (adaptiveController.hasAdaptiveDetailRowExpanded()) { if (oldHiddenColumns.length !== hiddenColumns.length) { adaptiveController.updateForm(hiddenColumns) } }!hiddenColumns.length && adaptiveController.collapseAdaptiveDetailRow(); return this.callBase(resultWidths, visibleColumns) }, _toggleBestFitMode: function(isBestFit) { isBestFit && this._adaptiveColumnsController._removeCssClassesFromColumns(); this.callBase(isBestFit) }, init: function() { this._adaptiveColumnsController = this.getController("adaptiveColumns"); this.callBase() } }, data: { _processItems: function(items, changeType) { var item, expandRowIndex, that = this; items = that.callBase.apply(that, arguments); if ("loadingAll" === changeType || !commonUtils.isDefined(that._adaptiveExpandedKey)) { return items } expandRowIndex = gridCoreUtils.getIndexByKey(that._adaptiveExpandedKey, items); if (expandRowIndex >= 0) { item = items[expandRowIndex]; items.splice(expandRowIndex + 1, 0, { visible: true, rowType: ADAPTIVE_ROW_TYPE, key: item.key, data: item.data, modifiedValues: item.modifiedValues, inserted: item.inserted, values: item.values }) } else { that._adaptiveExpandedKey = void 0 } return items }, _getRowIndicesForExpand: function(key) { var lastRowIndex, rowIndices = this.callBase.apply(this, arguments); if (this.getController("adaptiveColumns").isAdaptiveDetailRowExpanded(key)) { lastRowIndex = rowIndices[rowIndices.length - 1]; rowIndices.push(lastRowIndex + 1) } return rowIndices }, adaptiveExpandedKey: function(value) { if (commonUtils.isDefined(value)) { this._adaptiveExpandedKey = value } else { return this._adaptiveExpandedKey } }, toggleExpandAdaptiveDetailRow: function(key) { var that = this; var oldExpandRowIndex = gridCoreUtils.getIndexByKey(that._adaptiveExpandedKey, that._items); var newExpandRowIndex = gridCoreUtils.getIndexByKey(key, that._items); if (oldExpandRowIndex >= 0 && oldExpandRowIndex === newExpandRowIndex) { key = void 0; newExpandRowIndex = -1 } that._adaptiveExpandedKey = key; if (oldExpandRowIndex >= 0) { oldExpandRowIndex++ } if (newExpandRowIndex >= 0) { newExpandRowIndex++ } that.updateItems({ changeType: "update", rowIndices: [oldExpandRowIndex, newExpandRowIndex] }) }, init: function() { this.callBase(); this._adaptiveExpandedKey = void 0 } }, editorFactory: { _getFocusCellSelector: function() { return this.callBase() + ", .dx-adaptive-detail-row .dx-field-item > .dx-field-item-content" }, _getTooltipsSelector: function() { return this.callBase() + ", .dx-field-item-content .dx-tooltip" } }, columns: { _isColumnVisible: function(column) { return this.callBase(column) && !column.adaptiveHidden } } } } } }, /*!************************************************!*\ !*** ./js/ui/data_grid/ui.data_grid.export.js ***! \************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, getDefaultAlignment = __webpack_require__( /*! ../../core/utils/position */ 107).getDefaultAlignment, dataGridCore = __webpack_require__( /*! ./ui.data_grid.core */ 348), exportMixin = __webpack_require__( /*! ../grid_core/ui.grid_core.export_mixin */ 419), clientExporter = __webpack_require__( /*! ../../client_exporter */ 20), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), excelExporter = clientExporter.excel, Button = __webpack_require__( /*! ../button */ 201), List = __webpack_require__( /*! ../list */ 218), ContextMenu = __webpack_require__( /*! ../context_menu */ 338), when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when; var DATAGRID_EXPORT_MENU_CLASS = "dx-datagrid-export-menu", DATAGRID_EXPORT_BUTTON_CLASS = "dx-datagrid-export-button", DATAGRID_EXPORT_ICON = "export-to", DATAGRID_EXPORT_EXCEL_ICON = "exportxlsx", DATAGRID_EXPORT_SELECTED_ICON = "exportselected", DATAGRID_EXPORT_EXCEL_BUTTON_ICON = "export-excel-button", DATA_STYLE_OFFSET = 3; exports.DataProvider = Class.inherit({ _getGroupValue: function(item) { var visibleIndex, groupColumn = this._options.groupColumns[item.groupIndex], value = dataGridCore.getDisplayValue(groupColumn, item.values[item.groupIndex], item.data, item.rowType), result = groupColumn.caption + ": " + dataGridCore.formatValue(value, groupColumn); visibleIndex = this._options.getVisibleIndex(groupColumn.index); if (item.summaryCells && item.summaryCells.length && item.summaryCells[visibleIndex].length) { result += " " + dataGridCore.getGroupRowSummaryText(item.summaryCells[visibleIndex], this._options.summaryTexts) } return result }, _correctCellIndex: function(cellIndex) { var startIndex = this._options.startValueIndex, endIndex = this._options.endValueIndex; return cellIndex <= endIndex ? startIndex + cellIndex : null }, _initOptions: function() { var exportController = this._exportController, groupColumns = exportController._columnsController.getGroupColumns(), startEndIndexes = exportController._getStartEndValueIndexes(exportController._columnsController.getVisibleColumns()), excelWrapTextEnabled = exportController.option("export.excelWrapTextEnabled"); this._options = { columns: exportController._getColumns(), groupColumns: groupColumns, items: !!exportController._selectionOnly ? exportController._getSelectedItems() : exportController._getAllItems(), getVisibleIndex: exportController._columnsController.getVisibleIndex.bind(exportController._columnsController), startValueIndex: startEndIndexes.startIndex, endValueIndex: startEndIndexes.endIndex, isHeadersVisible: exportController.option("showColumnHeaders"), summaryTexts: exportController.option("summary.texts"), customizeExportData: exportController.option("customizeExportData"), rtlEnabled: exportController.option("rtlEnabled"), wrapTextEnabled: commonUtils.isDefined(excelWrapTextEnabled) ? excelWrapTextEnabled : !!exportController.option("wordWrapEnabled") } }, ctor: function(exportController) { this._exportController = exportController }, getStyles: function() { var wrapTextEnabled = this._options.wrapTextEnabled, styles = ["center", "left", "right"].map(function(alignment) { return { bold: true, alignment: alignment, wrapText: true } }); this.getColumns().forEach(function(column) { styles.push({ alignment: column.alignment || "left", format: column.format, precision: column.precision, wrapText: wrapTextEnabled, dataType: column.dataType }) }); styles.push({ bold: true, wrapText: false, alignment: getDefaultAlignment(this._options.rtlEnabled) }); return styles }, _getTotalCellStyleId: function(cellIndex) { var alignment = this.getColumns()[cellIndex] && this.getColumns()[cellIndex].alignment || "right"; return ["center", "left", "right"].indexOf(alignment) }, getStyleId: function(rowIndex, cellIndex) { if (rowIndex < this.getHeaderRowCount()) { return 0 } else { if (this.isTotalCell(rowIndex - this.getHeaderRowCount(), cellIndex)) { return this._getTotalCellStyleId(cellIndex) } else { if (this.isGroupRow(rowIndex - this.getHeaderRowCount())) { return DATA_STYLE_OFFSET + this.getColumns().length } else { return cellIndex + DATA_STYLE_OFFSET } } } }, getColumns: function(getColumnsByAllRows) { var columns = this._options.columns; return getColumnsByAllRows ? columns : columns[columns.length - 1] }, getRowsCount: function() { return this._options.items.length + this.getHeaderRowCount() }, getHeaderRowCount: function() { if (this.isHeadersVisible()) { return this._options.columns.length - 1 } return 0 }, isGroupRow: function(rowIndex) { return rowIndex < this._options.items.length && "group" === this._options.items[rowIndex].rowType }, getGroupLevel: function(rowIndex) { var item = this._options.items[rowIndex - this.getHeaderRowCount()], groupIndex = item && item.groupIndex; if (item && "totalFooter" === item.rowType) { return 0 } return commonUtils.isDefined(groupIndex) ? groupIndex : this._options.groupColumns.length }, getCellType: function(rowIndex, cellIndex) { var columns = this.getColumns(); if (rowIndex < this.getHeaderRowCount()) { return "string" } else { rowIndex -= this.getHeaderRowCount() } if (cellIndex < columns.length) { var item = this._options.items.length && this._options.items[rowIndex], column = columns[cellIndex]; if (item && "data" === item.rowType) { if (isFinite(item.values[this._correctCellIndex(cellIndex)]) && !commonUtils.isDefined(column.customizeText)) { return commonUtils.isDefined(column.lookup) ? column.lookup.dataType : column.dataType } } return "string" } }, ready: function() { var options, that = this; that._initOptions(); options = this._options; return when(options.items).done(function(items) { options.customizeExportData && options.customizeExportData(that.getColumns(that.getHeaderRowCount() > 1), items); options.items = items }).fail(function() { options.items = [] }) }, _getHeaderCellValue: function(rowIndex, cellIndex) { var row = this.getColumns(true)[rowIndex]; return row[cellIndex] && row[cellIndex].caption }, getCellValue: function(rowIndex, cellIndex) { var column, value, i, summaryItems, itemValues, item, columns = this.getColumns(), correctedCellIndex = this._correctCellIndex(cellIndex); if (rowIndex < this.getHeaderRowCount()) { return this._getHeaderCellValue(rowIndex, cellIndex) } else { rowIndex -= this.getHeaderRowCount() } item = this._options.items.length && this._options.items[rowIndex]; if (item) { itemValues = item.values; switch (item.rowType) { case "groupFooter": case "totalFooter": if (correctedCellIndex < itemValues.length) { value = itemValues[correctedCellIndex]; if (commonUtils.isDefined(value)) { return dataGridCore.getSummaryText(value, this._options.summaryTexts) } } break; case "group": if (cellIndex < 1) { return this._getGroupValue(item) } else { summaryItems = item.values[correctedCellIndex]; if (Array.isArray(summaryItems)) { value = ""; for (i = 0; i < summaryItems.length; i++) { value += (i > 0 ? " \n " : "") + dataGridCore.getSummaryText(summaryItems[i], this._options.summaryTexts) } return value } } break; default: column = columns[cellIndex]; if (column) { value = dataGridCore.getDisplayValue(column, itemValues[correctedCellIndex], item.data, item.rowType); return !isFinite(value) || column.customizeText ? dataGridCore.formatValue(value, column) : value } } } }, isHeadersVisible: function() { return this._options.isHeadersVisible }, isTotalCell: function(rowIndex, cellIndex) { var items = this._options.items, item = items[rowIndex], correctCellIndex = this._correctCellIndex(cellIndex), isSummaryAlignByColumn = item.summaryCells && item.summaryCells[correctCellIndex] && item.summaryCells[correctCellIndex].length > 0 && item.summaryCells[correctCellIndex][0].alignByColumn; return item && "groupFooter" === item.rowType || "totalFooter" === item.rowType || isSummaryAlignByColumn }, getCellMerging: function(rowIndex, cellIndex) { var columns = this._options.columns, column = columns[rowIndex] && columns[rowIndex][cellIndex]; return column ? { colspan: (column.colspan || 1) - 1, rowspan: (column.rowspan || 1) - 1 } : { colspan: 0, rowspan: 0 } }, getFrozenArea: function() { var that = this; return { x: 0, y: that.getHeaderRowCount() } } }); exports.ExportController = dataGridCore.ViewController.inherit({}).include(exportMixin).inherit({ _getEmptyCell: function() { return { caption: "", colspan: 1, rowspan: 1 } }, _updateColumnWidth: function(column, width) { column.width = width }, _getColumns: function() { var i, j, column, columns, result = [], columnsController = this._columnsController, rowCount = columnsController.getRowCount(), columnWidths = this._headersView && this._headersView.isVisible() ? this._headersView.getColumnWidths() : this._rowsView.getColumnWidths(); for (i = 0; i <= rowCount; i++) { result.push([]); columns = columnsController.getVisibleColumns(i); for (j = 0; j < columns.length; j++) { column = extend({}, columns[j]); if (column.allowExporting && !column.command) { if (i === rowCount && columnWidths && columnWidths.length) { this._updateColumnWidth(column, columnWidths[j]) } result[i].push(column) } } } columns = result[rowCount]; result = this._prepareItems(0, result.slice(0, -1)); result.push(columns); return result }, _getFooterSummaryItems: function(summaryCells, isTotal) { var values, itemsLength, summaryCell, j, result = [], estimatedItemsCount = 1, i = 0; do { values = []; for (j = 0; j < summaryCells.length; j++) { summaryCell = summaryCells[j]; itemsLength = summaryCell.length; if (estimatedItemsCount < itemsLength) { estimatedItemsCount = itemsLength } values.push(summaryCell[i]) } result.push({ values: values, rowType: isTotal ? "totalFooter" : "groupFooter" }) } while (i++ < estimatedItemsCount - 1); return result }, _hasSummaryGroupFooters: function() { var i, groupItems = this.option("summary.groupItems"); if (commonUtils.isDefined(groupItems)) { for (i = 0; i < groupItems.length; i++) { if (groupItems[i].showInGroupFooter) { return true } } } return false }, _getItemsWithSummaryGroupFooters: function(sourceItems) { var item, i, result = [], beforeGroupFooterItems = [], groupFooterItems = []; for (i = 0; i < sourceItems.length; i++) { item = sourceItems[i]; if ("groupFooter" === item.rowType) { groupFooterItems = this._getFooterSummaryItems(item.summaryCells); result = result.concat(beforeGroupFooterItems, groupFooterItems); beforeGroupFooterItems = [] } else { beforeGroupFooterItems.push(item) } } return result.length ? result : beforeGroupFooterItems }, _updateGroupValuesWithSummaryByColumn: function(sourceItems) { var item, summaryCells, summaryItem, groupColumnCount, k, j, i, summaryValues = []; for (i = 0; i < sourceItems.length; i++) { item = sourceItems[i]; summaryCells = item.summaryCells; if ("group" === item.rowType && summaryCells && summaryCells.length > 1) { groupColumnCount = item.values.length; for (j = 1; j < summaryCells.length; j++) { for (k = 0; k < summaryCells[j].length; k++) { summaryItem = summaryCells[j][k]; if (summaryItem && summaryItem.alignByColumn) { if (!Array.isArray(summaryValues[j - groupColumnCount])) { summaryValues[j - groupColumnCount] = [] } summaryValues[j - groupColumnCount].push(summaryItem) } } } if (summaryValues.length > 0) { $.merge(item.values, summaryValues); summaryValues = [] } } } }, _processUnExportedItems: function(items) { var item, column, values, i, j, columns = this._columnsController.getVisibleColumns(); for (i = 0; i < items.length; i++) { item = items[i]; values = []; if ("group" === item.rowType) { continue } for (j = 0; j < columns.length; j++) { column = columns[j]; if ((commonUtils.isDefined(column.command) || column.allowExporting) && item.values) { values.push(item.values[j]) } } if (values.length) { item.values = values } } }, _getAllItems: function(data) { var summaryCells, summaryItems, that = this, d = $.Deferred(), dataController = this.getController("data"), footerItems = dataController.footerItems(), totalItem = footerItems.length && footerItems[0], summaryTotalItems = that.option("summary.totalItems"); when(data).done(function(data) { dataController.loadAll(data).done(function(sourceItems, totalAggregates) { that._updateGroupValuesWithSummaryByColumn(sourceItems); if (that._hasSummaryGroupFooters()) { sourceItems = that._getItemsWithSummaryGroupFooters(sourceItems) } summaryCells = totalItem && totalItem.summaryCells; if (commonUtils.isDefined(totalAggregates) && summaryTotalItems) { summaryCells = dataController._getSummaryCells(summaryTotalItems, totalAggregates) } summaryItems = totalItem && that._getFooterSummaryItems(summaryCells, true); if (summaryItems) { sourceItems = sourceItems.concat(summaryItems) } that._processUnExportedItems(sourceItems); d.resolve(sourceItems) }).fail(d.reject) }).fail(d.reject); return d }, _getSelectedItems: function() { var selectionController = this.getController("selection"), selectedRowData = selectionController.getSelectedRowsData(); return this._getAllItems(selectedRowData) }, _getStartEndValueIndexes: function(visibleColumns) { var i, startIndex, endIndex, visibleColumnsLength = visibleColumns.length; for (i = 0; i < visibleColumnsLength; i++) { if (!commonUtils.isDefined(visibleColumns[i].command)) { startIndex = i; break } } for (i = visibleColumnsLength - 1; i >= 0; i--) { if (!commonUtils.isDefined(visibleColumns[i].command)) { endIndex = i; break } } return { startIndex: startIndex, endIndex: endIndex } }, init: function() { this._columnsController = this.getController("columns"); this._rowsView = this.getView("rowsView"); this._headersView = this.getView("columnHeadersView"); this.createAction("onExporting", { excludeValidators: ["disabled", "readOnly"] }); this.createAction("onExported", { excludeValidators: ["disabled", "readOnly"] }); this.createAction("onFileSaving", { excludeValidators: ["disabled", "readOnly"] }) }, callbackNames: function() { return ["selectionOnlyChanged"] }, getExportFormat: function() { return ["EXCEL"] }, getDataProvider: function() { return new exports.DataProvider(this) }, exportToExcel: function(selectionOnly) { var that = this; that._selectionOnly = selectionOnly; clientExporter.export(that.component.getDataProvider(), { fileName: that.option("export.fileName"), proxyUrl: that.option("export.proxyUrl"), format: "EXCEL", autoFilterEnabled: !!that.option("export.excelFilterEnabled"), rtlEnabled: that.option("rtlEnabled"), exportingAction: that.getAction("onExporting"), exportedAction: that.getAction("onExported"), fileSavingAction: that.getAction("onFileSaving") }, excelExporter.getData) }, publicMethods: function() { return ["getDataProvider", "getExportFormat", "exportToExcel"] }, selectionOnly: function(value) { if (commonUtils.isDefined(value)) { this._isSelectedRows = value; this.selectionOnlyChanged.fire() } else { return this._isSelectedRows } } }); dataGridCore.registerModule("export", { defaultOptions: function() { return { "export": { enabled: false, fileName: "DataGrid", excelFilterEnabled: false, excelWrapTextEnabled: void 0, proxyUrl: void 0, allowExportSelectedData: false, texts: { exportTo: messageLocalization.format("dxDataGrid-exportTo"), exportAll: messageLocalization.format("dxDataGrid-exportAll"), exportSelectedRows: messageLocalization.format("dxDataGrid-exportSelectedRows") } } } }, controllers: { "export": exports.ExportController }, extenders: { controllers: { editing: { callbackNames: function() { var callbackList = this.callBase(); return commonUtils.isDefined(callbackList) ? callbackList.push("editingChanged") : ["editingChanged"] }, _updateEditButtons: function() { this.callBase(); this.editingChanged.fire(this.hasChanges()) } } }, views: { headerPanel: { _getToolbarItems: function() { var items = this.callBase(); return this._appendExportItems(items) }, _appendExportItems: function(items) { var that = this, exportOptions = that.option("export"); if (exportOptions.enabled) { var exportItems = []; if (exportOptions.allowExportSelectedData) { exportItems.push({ template: function(data, index, $container) { that._renderButton(data, $container); that._renderExportMenu($container) }, menuItemTemplate: function(data, index, $container) { that._renderList(data, $container) }, name: "exportButton", allowExportSelected: true, location: "after", locateInMenu: "auto", sortIndex: 30 }) } else { exportItems.push({ template: function(data, index, $container) { that._renderButton(data, $container) }, menuItemTemplate: function(data, index, $container) { that._renderButton(data, $container, true) }, name: "exportButton", location: "after", locateInMenu: "auto", sortIndex: 30 }) } items = items.concat(exportItems); that._correctItemsPosition(items) } return items }, _renderButton: function(data, $container, withText) { var that = this, buttonOptions = that._getButtonOptions(data.allowExportSelected), $buttonContainer = that._getButtonContainer().addClass(DATAGRID_EXPORT_BUTTON_CLASS).appendTo($container); if (withText) { $container.wrapInner("<div class='dx-toolbar-item-auto-hide'></div>").parent().addClass("dx-toolbar-menu-action dx-toolbar-menu-button dx-toolbar-hidden-button"); buttonOptions.text = buttonOptions.hint } that._createComponent($buttonContainer, Button, buttonOptions) }, _renderList: function(data, $container) { var that = this, texts = that.option("export.texts"), renderFakeButton = function(data, $container, iconName) { var $icon = $("<div />").addClass("dx-icon dx-icon-" + iconName), $text = $("<span class='dx-button-text'/>").text(data.text), $content = $("<div class='dx-button-content' />").append($icon).append($text), $button = $("<div class='dx-button dx-button-has-text dx-button-has-icon dx-datagrid-toolbar-button'>").append($content), $toolbarItem = $("<div class ='dx-toolbar-item-auto-hide' />").append($button); $container.append($toolbarItem).parent().addClass("dx-toolbar-menu-custom dx-toolbar-hidden-button") }, items = [{ template: function(data, index, $container) { renderFakeButton(data, $container, DATAGRID_EXPORT_EXCEL_ICON) }, text: texts.exportAll }, { template: function(data, index, $container) { renderFakeButton(data, $container, DATAGRID_EXPORT_SELECTED_ICON) }, text: texts.exportSelectedRows, exportSelected: true }]; that._createComponent($container, List, { items: items, onItemClick: function(e) { that._exportController.exportToExcel(e.itemData.exportSelected) }, scrollingEnabled: false }) }, _correctItemsPosition: function(items) { items.sort(function(itemA, itemB) { return itemA.sortIndex - itemB.sortIndex }) }, _renderExportMenu: function($buttonContainer) { var that = this, $button = $buttonContainer.find(".dx-button"), texts = that.option("export.texts"), menuItems = [{ text: texts.exportAll, icon: DATAGRID_EXPORT_EXCEL_ICON }, { text: texts.exportSelectedRows, exportSelected: true, icon: DATAGRID_EXPORT_SELECTED_ICON }], $menuContainer = $("<div>").appendTo($buttonContainer); that._contextMenu = that._createComponent($menuContainer, ContextMenu, { showEvent: "dxclick", items: menuItems, cssClass: DATAGRID_EXPORT_MENU_CLASS, onItemClick: function(e) { that._exportController.exportToExcel(e.itemData.exportSelected) }, target: $button, position: { at: "left bottom", my: "left top", offset: "0 3", collision: "fit", boundary: that._$parent, boundaryOffset: "1 1" } }) }, _isExportButtonVisible: function() { return this.option("export.enabled") }, _getButtonOptions: function(allowExportSelected) { var options, that = this, texts = that.option("export.texts"); if (allowExportSelected) { options = { hint: texts.exportTo, icon: DATAGRID_EXPORT_ICON } } else { options = { hint: texts.exportAll, icon: DATAGRID_EXPORT_EXCEL_BUTTON_ICON, onClick: function() { that._exportController.exportToExcel() } } } return options }, optionChanged: function(args) { this.callBase(args); if ("export" === args.name) { args.handled = true; this._invalidate() } }, init: function() { var that = this; this.callBase(); this._exportController = this.getController("export"); this._editingController = this.getController("editing"); this._editingController.editingChanged.add(function(hasChanges) { that.setToolbarItemDisabled("exportButton", hasChanges) }) }, isVisible: function() { return this.callBase() || this._isExportButtonVisible() } } } } }) }, /*!******************************************************!*\ !*** ./js/ui/grid_core/ui.grid_core.export_mixin.js ***! \******************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend; module.exports = { _getEmptyCell: function() { return { text: "", value: void 0, colspan: 1, rowspan: 1 } }, _defaultSetter: function(value) { value = parseInt(value, 10); return !value ? 1 : value }, _makeRowOffset: function(resultItems) { var offset = 0, rowIndex = resultItems.length - 1, row = resultItems[rowIndex], cellIndex = row.length; $.each(resultItems, function(rowIndex) { if (this[cellIndex] && this[cellIndex].rowspan + rowIndex > resultItems.length - 1) { offset = Math.max.apply(this, [this[cellIndex].colspan, offset]) } }); for (var i = 0; i < offset; i++) { row.push(this._cloneItem(resultItems[resultItems.length - 2][cellIndex && cellIndex - 1 || 0])) } if (offset > 0) { this._makeRowOffset(resultItems) } }, _cloneItem: function(item) { return extend({}, item, this._getEmptyCell()) }, _prepareItems: function(cols, items) { var i, row, cellIndex, rowIndex, that = this, resultItems = []; for (rowIndex = 0; rowIndex < items.length; rowIndex++) { row = []; resultItems.push(row); do { that._makeRowOffset(resultItems); cellIndex = row.length; row.push(items[rowIndex].shift()); if (row[row.length - 1]) { row[row.length - 1].colspan = that._defaultSetter(row[row.length - 1].colspan); row[row.length - 1].rowspan = that._defaultSetter(row[row.length - 1].rowspan) } else { row[row.length - 1] = $({}, that._getEmptyCell()) } for (i = 1; i < row[cellIndex].colspan; i++) { row.push(that._cloneItem(row[row.length - 1])) } } while (items[rowIndex].length); while (row.length < cols) { row.push(that._cloneItem(row[row.length - 1])) } } return resultItems } } }, /*!****************************!*\ !*** ./js/ui/tree_list.js ***! \****************************/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__( /*! ./tree_list/ui.tree_list */ 421) }, /*!*****************************************!*\ !*** ./js/ui/tree_list/ui.tree_list.js ***! \*****************************************/ function(module, exports, __webpack_require__) { var TreeList = __webpack_require__( /*! ./ui.tree_list.base */ 422); module.exports = TreeList; __webpack_require__( /*! ./ui.tree_list.column_chooser */ 434); __webpack_require__( /*! ./ui.tree_list.master_detail */ 435); __webpack_require__( /*! ./ui.tree_list.editing */ 436); __webpack_require__( /*! ./ui.tree_list.validating */ 438); __webpack_require__( /*! ./ui.tree_list.virtual_scrolling */ 439); __webpack_require__( /*! ./ui.tree_list.filter_row */ 440); __webpack_require__( /*! ./ui.tree_list.header_filter */ 441); __webpack_require__( /*! ./ui.tree_list.columns_resizing_reordering */ 442); __webpack_require__( /*! ./ui.tree_list.column_fixing */ 443); __webpack_require__( /*! ./ui.tree_list.adaptivity */ 444); __webpack_require__( /*! ./ui.tree_list.selection */ 445); __webpack_require__( /*! ./ui.tree_list.search */ 446); __webpack_require__( /*! ./ui.tree_list.keyboard_navigation */ 447) }, /*!**********************************************!*\ !*** ./js/ui/tree_list/ui.tree_list.base.js ***! \**********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, Widget = __webpack_require__( /*! ../widget/ui.widget */ 95), treeListCore = __webpack_require__( /*! ./ui.tree_list.core */ 423), callModuleItemsMethod = treeListCore.callModuleItemsMethod; var DATAGRID_ROW_SELECTOR = ".dx-row", TREELIST_CLASS = "dx-treelist"; __webpack_require__( /*! ./ui.tree_list.column_headers */ 424); __webpack_require__( /*! ./ui.tree_list.columns_controller */ 425); __webpack_require__( /*! ./ui.tree_list.data_controller */ 426); __webpack_require__( /*! ./ui.tree_list.sorting */ 428); __webpack_require__( /*! ./ui.tree_list.rows */ 429); __webpack_require__( /*! ./ui.tree_list.context_menu */ 430); __webpack_require__( /*! ./ui.tree_list.error_handling */ 431); __webpack_require__( /*! ./ui.tree_list.grid_view */ 432); __webpack_require__( /*! ./ui.tree_list.header_panel */ 433); treeListCore.registerModulesOrder(["stateStoring", "columns", "selection", "editorFactory", "columnChooser", "editing", "grouping", "masterDetail", "validating", "adaptivity", "data", "virtualScrolling", "columnHeaders", "filterRow", "headerPanel", "headerFilter", "sorting", "search", "rows", "pager", "columnsResizingReordering", "contextMenu", "keyboardNavigation", "errorHandling", "summary", "columnFixing", "export", "gridView"]); var TreeList = Widget.inherit({ _activeStateUnit: DATAGRID_ROW_SELECTOR, _getDefaultOptions: function() { var that = this, result = that.callBase(); $.each(treeListCore.modules, function() { if (commonUtils.isFunction(this.defaultOptions)) { extend(true, result, this.defaultOptions()) } }); return result }, _init: function() { var that = this; that.callBase(); treeListCore.processModules(that, treeListCore); callModuleItemsMethod(that, "init") }, _clean: commonUtils.noop, _optionChanged: function(args) { var that = this; callModuleItemsMethod(that, "optionChanged", [args]); if (!args.handled) { that.callBase(args) } }, _dimensionChanged: function() { this.updateDimensions(true) }, _visibilityChanged: function(visible) { if (visible) { this.updateDimensions() } }, _renderContentImpl: function() { var $element = this.element().addClass(TREELIST_CLASS); this.getView("gridView").render($element) }, _renderContent: function() { var that = this; commonUtils.deferRender(function() { that._renderContentImpl() }) }, _dispose: function() { var that = this; that.callBase(); callModuleItemsMethod(that, "dispose") }, isReady: function() { return this.getController("data").isReady() }, beginUpdate: function() { var that = this; that.callBase(); callModuleItemsMethod(that, "beginUpdate") }, endUpdate: function() { var that = this; callModuleItemsMethod(that, "endUpdate"); that.callBase() }, getController: function(name) { return this._controllers[name] }, getView: function(name) { return this._views[name] }, focus: function(element) { this.callBase(); if (commonUtils.isDefined(element)) { this.getController("keyboardNavigation").focus(element) } } }); TreeList.registerModule = treeListCore.registerModule.bind(treeListCore); registerComponent("dxTreeList", TreeList); module.exports = TreeList }, /*!**********************************************!*\ !*** ./js/ui/tree_list/ui.tree_list.core.js ***! \**********************************************/ function(module, exports, __webpack_require__) { var extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, modules = __webpack_require__( /*! ../grid_core/ui.grid_core.modules */ 350); extend(exports, modules, { modules: [] }) }, /*!********************************************************!*\ !*** ./js/ui/tree_list/ui.tree_list.column_headers.js ***! \********************************************************/ function(module, exports, __webpack_require__) { var treeListCore = __webpack_require__( /*! ./ui.tree_list.core */ 423), columnHeadersViewModule = __webpack_require__( /*! ../grid_core/ui.grid_core.column_headers */ 352); treeListCore.registerModule("columnHeaders", columnHeadersViewModule) }, /*!************************************************************!*\ !*** ./js/ui/tree_list/ui.tree_list.columns_controller.js ***! \************************************************************/ function(module, exports, __webpack_require__) { var commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), treeListCore = __webpack_require__( /*! ./ui.tree_list.core */ 423), columnsControllerModule = __webpack_require__( /*! ../grid_core/ui.grid_core.columns_controller */ 356); exports.ColumnsController = columnsControllerModule.controllers.columns.inherit(function() { return { _getFirstItems: function(dataSourceAdapter) { return this.callBase(dataSourceAdapter).map(function(node) { return node.data }) }, getFirstDataColumnIndex: function() { var visibleColumns = this.getVisibleColumns(), visibleColumnsLength = visibleColumns.length, firstDataColumnIndex = 0; for (var i = 0; i <= visibleColumnsLength - 1; i++) { if (!commonUtils.isDefined(visibleColumns[i].command)) { firstDataColumnIndex = visibleColumns[i].index; break } } return firstDataColumnIndex } } }()); treeListCore.registerModule("columns", { defaultOptions: columnsControllerModule.defaultOptions, controllers: { columns: exports.ColumnsController } }) }, /*!*********************************************************!*\ !*** ./js/ui/tree_list/ui.tree_list.data_controller.js ***! \*********************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, treeListCore = __webpack_require__( /*! ./ui.tree_list.core */ 423), dataSourceAdapterProvider = __webpack_require__( /*! ./ui.tree_list.data_source_adapter */ 427), dataControllerModule = __webpack_require__( /*! ../grid_core/ui.grid_core.data_controller */ 360); exports.DataController = dataControllerModule.controllers.data.inherit(function() { return { _getDataSourceAdapter: function() { return dataSourceAdapterProvider }, _getNodeLevel: function(node) { var level = -1; while (node.parent) { if (node.visible) { level++ } node = node.parent } return level }, _generateDataItem: function(node) { return { rowType: "data", node: node, key: node.key, data: node.data, isExpanded: this.isRowExpanded(node.key), level: this._getNodeLevel(node) } }, _setPagingOptions: function(dataSource) { var isVirtualScrolling = "virtual" === this.option("scrolling.mode"); dataSource.paginate(isVirtualScrolling); dataSource.requireTotalCount(true) }, init: function() { this.createAction("onRowExpanding"); this.createAction("onRowExpanded"); this.createAction("onRowCollapsing"); this.createAction("onRowCollapsed"); this.callBase.apply(this, arguments) }, keyOf: function(data) { var dataSource = this._dataSource; if (dataSource) { return dataSource.keyOf(data) } }, key: function() { var dataSource = this._dataSource; if (dataSource) { return dataSource.getKeyExpr() } }, publicMethods: function() { return this.callBase().concat(["expandRow", "collapseRow", "isRowExpanded", "getRootNode", "getNodeByKey"]) }, changeRowExpand: function(key) { if (this._dataSource) { var that = this, args = { key: key }, isExpanded = this.isRowExpanded(key); that.executeAction(isExpanded ? "onRowCollapsing" : "onRowExpanding", args); if (!args.cancel) { return that._dataSource.changeRowExpand(key).done(function() { that.executeAction(isExpanded ? "onRowCollapsed" : "onRowExpanded", args) }) } } return $.Deferred().resolve() }, isRowExpanded: function(key) { return this._dataSource && this._dataSource.isRowExpanded(key) }, expandRow: function(key) { if (!this.isRowExpanded(key)) { return this.changeRowExpand(key) } return $.Deferred().resolve() }, collapseRow: function(key) { if (this.isRowExpanded(key)) { return this.changeRowExpand(key) } return $.Deferred().resolve() }, getRootNode: function() { return this._dataSource && this._dataSource.getRootNode() }, optionChanged: function(args) { switch (args.name) { case "rootValue": case "parentIdExpr": case "itemsExpr": case "filterMode": case "expandNodesOnFiltering": case "autoExpandAll": case "hasItemsExpr": case "dataStructure": this._columnsController.reset(); this._items = []; this._refreshDataSource(); args.handled = true; break; case "expandedRowKeys": case "onNodesInitialized": this._dataSource && !this._dataSource._isNodesInitializing && this._dataSource.load(); args.handled = true; break; case "maxFilterLengthInRequest": args.handled = true; break; default: this.callBase(args) } }, getNodeByKey: function(key) { if (!this._dataSource) { return } return this._dataSource.getNodeByKey(key) } } }()); treeListCore.registerModule("data", { defaultOptions: function() { return extend({}, dataControllerModule.defaultOptions(), { itemsExpr: "items", parentIdExpr: "parentId", rootValue: 0, dataStructure: "plain", expandedRowKeys: [], filterMode: "extended", expandNodesOnFiltering: true, autoExpandAll: false, onNodesInitialized: null, maxFilterLengthInRequest: 1500 }) }, controllers: { data: exports.DataController } }) }, /*!*************************************************************!*\ !*** ./js/ui/tree_list/ui.tree_list.data_source_adapter.js ***! \*************************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), errors = __webpack_require__( /*! ../widget/ui.errors */ 22), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), dataCoreUtils = __webpack_require__( /*! ../../core/utils/data */ 50), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, gridCoreUtils = __webpack_require__( /*! ../grid_core/ui.grid_core.utils */ 349), ArrayStore = __webpack_require__( /*! ../../data/array_store */ 158), query = __webpack_require__( /*! ../../data/query */ 159), DataSourceAdapter = __webpack_require__( /*! ../grid_core/ui.grid_core.data_source_adapter */ 359); var DEFAULT_KEY_EXPRESSION = "id"; DataSourceAdapter = DataSourceAdapter.inherit(function() { return { _createKeyGetter: function() { var keyExpr = this.getKeyExpr(); return dataCoreUtils.compileGetter(keyExpr) }, _createKeySetter: function() { var keyExpr = this.getKeyExpr(); return dataCoreUtils.compileSetter(keyExpr) }, _createParentIdGetter: function() { return dataCoreUtils.compileGetter(this.option("parentIdExpr")) }, createParentIdSetter: function() { return dataCoreUtils.compileSetter(this.option("parentIdExpr")) }, _createItemsGetter: function() { return dataCoreUtils.compileGetter(this.option("itemsExpr")) }, _createHasItemsGetter: function() { var hasItemsExpr = this.option("hasItemsExpr"); return hasItemsExpr && dataCoreUtils.compileGetter(hasItemsExpr) }, _updateIndexByKeyObject: function(items) { var that = this; that._indexByKey = {}; $.each(items, function(index, item) { that._indexByKey[item.key] = index }) }, _calculateHasItems: function(node, options) { var hasItems, that = this; if (that._hasItemsGetter) { hasItems = that._hasItemsGetter(node.data) } if (void 0 === hasItems) { var hasItemsByMap = that._hasItemsMap[node.key]; if (void 0 !== hasItemsByMap) { hasItems = hasItemsByMap } else { if (options.remoteOperations.filtering && options.storeLoadOptions.parentIds) { hasItems = true } else { hasItems = node.hasChildren } } } return !!hasItems }, _createVisibleItemsByNodes: function(nodes, options) { var that = this, result = []; for (var i = 0; i < nodes.length; i++) { if (nodes[i].visible) { result.push(nodes[i]) } if ((that.isRowExpanded(nodes[i].key) || !nodes[i].visible) && nodes[i].hasChildren && nodes[i].children.length) { result = result.concat(that._createVisibleItemsByNodes(nodes[i].children, options)) } } return result }, _convertItemToNode: function(item, rootValue, nodeByKey) { var parentNode, node, key = this._keyGetter(item), parentId = this._parentIdGetter(item); parentId = commonUtils.isDefined(parentId) ? parentId : rootValue; parentNode = nodeByKey[parentId] = nodeByKey[parentId] || { key: parentId, children: [] }; node = nodeByKey[key] = nodeByKey[key] || { key: key, children: [] }; node.data = item; node.parent = parentNode; return node }, _createNodesByItems: function(items, visibleItems) { var i, that = this, rootValue = that.option("rootValue"), visibleByKey = {}, nodeByKey = that._nodeByKey = {}; if (visibleItems) { for (i = 0; i < visibleItems.length; i++) { visibleByKey[this._keyGetter(visibleItems[i])] = true } } for (i = 0; i < items.length; i++) { var node = that._convertItemToNode(items[i], rootValue, nodeByKey); if (void 0 === node.key) { return } node.visible = !visibleItems || !!visibleByKey[node.key]; if (node.parent) { node.parent.children.push(node) } } var rootNode = nodeByKey[rootValue] || { key: rootValue, children: [] }; rootNode.level = -1; return rootNode }, _convertDataToPlainStructure: function(data, parentId, result) { var key, item, itemsExpr, childItems; if (this._itemsGetter) { result = result || []; for (var i = 0; i < data.length; i++) { item = extend({}, data[i]); key = this._keyGetter(item); if (void 0 === key) { key = result.length + 1; this._keySetter(item, key) } if (void 0 === this._parentIdGetter(item)) { this._parentIdSetter(item, void 0 === parentId ? this.option("rootValue") : parentId) } result.push(item); childItems = this._itemsGetter(item); if (childItems && childItems.length) { this._convertDataToPlainStructure(childItems, key, result); itemsExpr = this.option("itemsExpr"); if (!commonUtils.isFunction(itemsExpr)) { delete item[itemsExpr] } } } return result } return data }, _createIdFilter: function(field, keys) { var parentIdFilters = []; for (var i = 0; i < keys.length; i++) { parentIdFilters.push([field, "=", keys[i]]) } return gridCoreUtils.combineFilters(parentIdFilters, "or") }, _customizeRemoteOperations: function(options, isReload, operationTypes) { this.callBase.apply(this, arguments); options.remoteOperations.paging = false; var expandVisibleNodes = false; if (this.option("autoExpandAll")) { options.remoteOperations.sorting = false; options.remoteOperations.filtering = false; if (isReload && !options.isCustomLoading) { expandVisibleNodes = true } } this._isReload = this._isReload || isReload || operationTypes.reload; if ((isReload || operationTypes.filtering) && !options.isCustomLoading) { this._hasItemsMap = {}; if ((options.storeLoadOptions.filter || operationTypes.filtering && this.option("autoExpandAll")) && this.option("expandNodesOnFiltering")) { expandVisibleNodes = true } } options.expandVisibleNodes = expandVisibleNodes }, _getParentIdsToLoad: function(parentIds) { var parentIdsToLoad = []; for (var i = 0; i < parentIds.length; i++) { if (!this._hasItemsMap[parentIds[i]]) { parentIdsToLoad.push(parentIds[i]) } } return parentIdsToLoad }, _handleDataLoading: function(options) { var combinedParentIdFilter, rootValue = this.option("rootValue"), parentIdExpr = this.option("parentIdExpr"), expandedRowKeys = this.option("expandedRowKeys"), filterMode = this.option("filterMode"); this.callBase.apply(this, arguments); if (options.remoteOperations.filtering && !options.isCustomLoading) { if ("standard" === filterMode || !options.storeLoadOptions.filter) { var parentIds = [rootValue].concat(expandedRowKeys), parentIdsToLoad = options.data ? this._getParentIdsToLoad(parentIds) : parentIds; if (parentIdsToLoad.length) { options.cachedPagingData = void 0; options.data = void 0; options.mergeStoreLoadData = true } options.storeLoadOptions.parentIds = parentIdsToLoad; combinedParentIdFilter = this._createIdFilter(parentIdExpr, parentIdsToLoad); options.storeLoadOptions.filter = gridCoreUtils.combineFilters([combinedParentIdFilter, options.storeLoadOptions.filter]) } } }, _generateParentInfoToLoad: function(data) { var i, that = this, keyMap = {}, parentIdMap = {}, parentIds = [], rootValue = that.option("rootValue"); for (i = 0; i < data.length; i++) { keyMap[that._keyGetter(data[i])] = true } for (i = 0; i < data.length; i++) { var parentId = that._parentIdGetter(data[i]); if (!parentIdMap[parentId] && !keyMap[parentId] && parentId !== rootValue) { parentIdMap[parentId] = true; parentIds.push(parentId) } } return { parentIdMap: parentIdMap, parentIds: parentIds } }, _loadParents: function(data, options) { var store, filter, filterLength, needLocalFiltering, that = this, parentInfo = that._generateParentInfoToLoad(data), parentIds = parentInfo.parentIds, parentIdMap = parentInfo.parentIdMap, d = $.Deferred(), isRemoteFiltering = options.remoteOperations.filtering, maxFilterLengthInRequest = that.option("maxFilterLengthInRequest"), loadOptions = isRemoteFiltering ? options.storeLoadOptions : options.loadOptions; if (!parentIds.length) { return d.resolve(data) } filter = that._createIdFilter(that.getKeyExpr(), parentIds); filterLength = encodeURI(JSON.stringify(filter)).length; if (filterLength > maxFilterLengthInRequest) { filter = function(itemData) { return parentIdMap[that._keyGetter(itemData)] }; needLocalFiltering = isRemoteFiltering } loadOptions = extend({}, loadOptions, { filter: !needLocalFiltering ? filter : null }); store = options.fullData ? new ArrayStore(options.fullData) : that._dataSource.store(); store.load(loadOptions).done(function(loadedData) { if (loadedData.length) { if (needLocalFiltering) { loadedData = query(loadedData).filter(filter).toArray() } that._loadParents(data.concat(loadedData), options).done(d.resolve).fail(d.reject) } else { d.resolve(data) } }).fail(d.reject); return d }, _updateHasItemsMap: function(options) { var data = options.data, parentIds = options.storeLoadOptions.parentIds; if (parentIds) { for (var i = 0; i < parentIds.length; i++) { for (var dataIndex = 0; dataIndex < data.length; dataIndex++) { var parentId = this._parentIdGetter(data[dataIndex]); if (parentId === parentIds[i]) { this._hasItemsMap[parentIds[i]] = true; break } } if (dataIndex === data.length) { this._hasItemsMap[parentIds[i]] = false } } } }, _handleDataLoaded: function(options) { options.data = this._convertDataToPlainStructure(options.data); if (!options.remoteOperations.filtering) { options.fullData = options.data } this._updateHasItemsMap(options); this.callBase(options) }, _fillNodes: function(nodes, options, expandedRowKeys, level) { level = level || 0; for (var i = 0; i < nodes.length; i++) { var node = nodes[i]; this._fillNodes(nodes[i].children, options, expandedRowKeys, level + 1); node.level = level; node.hasChildren = this._calculateHasItems(node, options); if (node.visible && node.hasChildren && options.expandVisibleNodes) { expandedRowKeys.push(node.key) } if (node.visible || node.hasChildren) { node.parent.hasChildren = true } } }, _processTreeStructure: function(options, visibleItems) { var data = options.data, expandedRowKeys = []; if (!options.fullData || this._isReload) { if (options.fullData && options.fullData.length > options.data.length) { data = options.fullData; visibleItems = visibleItems || options.data } this._rootNode = this._createNodesByItems(data, visibleItems); if (!this._rootNode) { options.data = $.Deferred().reject(errors.Error("E1046", this.getKeyExpr())); return } this._fillNodes(this._rootNode.children, options, expandedRowKeys); this._isNodesInitializing = true; if (expandedRowKeys.length) { this.option("expandedRowKeys", expandedRowKeys) } this.executeAction("onNodesInitialized", { root: this._rootNode }); this._isNodesInitializing = false; this._isReload = false } data = this._createVisibleItemsByNodes(this._rootNode.children, options); options.data = data; this._totalItemsCount = data.length }, _handleDataLoadedCore: function(options) { var visibleItems, that = this, data = options.data, callBase = that.callBase, filter = options.storeLoadOptions.filter || options.loadOptions.filter, filterMode = that.option("filterMode"); if (!options.isCustomLoading) { if (filter && !options.storeLoadOptions.parentIds && "standard" !== filterMode) { var d = options.data = $.Deferred(); if ("smart" === filterMode) { visibleItems = data } return that._loadParents(data, options).done(function(data) { options.data = data; that._processTreeStructure(options, visibleItems); callBase.call(that, options); d.resolve(options.data) }).fail(d.reject) } else { that._processTreeStructure(options) } } that.callBase(options) }, init: function(dataSource, remoteOperations) { this.callBase.apply(this, arguments); var dataStructure = this.option("dataStructure"); this._keyGetter = this._createKeyGetter(); this._parentIdGetter = this._createParentIdGetter(); this._hasItemsGetter = this._createHasItemsGetter(); if ("tree" === dataStructure) { this._itemsGetter = this._createItemsGetter(); this._keySetter = this._createKeySetter(); this._parentIdSetter = this.createParentIdSetter() } this._nodeByKey = {}; this._hasItemsMap = {}; this._totalItemsCount = 0; this.createAction("onNodesInitialized") }, getKeyExpr: function() { var store = this.store(), key = store && store.key(), keyExpr = this.option("keyExpr"); if (commonUtils.isDefined(key) && commonUtils.isDefined(keyExpr)) { if (!commonUtils.equalByValue(key, keyExpr)) { throw errors.Error("E1044") } } return key || keyExpr || DEFAULT_KEY_EXPRESSION }, keyOf: function(data) { return this._keyGetter && this._keyGetter(data) }, getRootNode: function() { return this._rootNode }, totalItemsCount: function() { return this._totalItemsCount }, isRowExpanded: function(key) { var indexExpandedNodeKey = gridCoreUtils.getIndexByKey(key, this.option("expandedRowKeys"), null); return indexExpandedNodeKey >= 0 }, _changeRowExpandCore: function(key) { var expandedRowKeys = this.option("expandedRowKeys"), indexExpandedNodeKey = gridCoreUtils.getIndexByKey(key, expandedRowKeys, null); if (indexExpandedNodeKey < 0) { expandedRowKeys.push(key) } else { expandedRowKeys.splice(indexExpandedNodeKey, 1) } this.option("expandedRowKeys", expandedRowKeys) }, changeRowExpand: function(key) { this._changeRowExpandCore(key); return this._isNodesInitializing ? $.Deferred().resolve() : this.load() }, getNodeByKey: function(key) { if (this._nodeByKey) { return this._nodeByKey[key] } } } }()); module.exports = { extend: function(extender) { DataSourceAdapter = DataSourceAdapter.inherit(extender) }, create: function(component) { return new DataSourceAdapter(component) } } }, /*!*************************************************!*\ !*** ./js/ui/tree_list/ui.tree_list.sorting.js ***! \*************************************************/ function(module, exports, __webpack_require__) { var treeListCore = __webpack_require__( /*! ./ui.tree_list.core */ 423), sortingModule = __webpack_require__( /*! ../grid_core/ui.grid_core.sorting */ 362); treeListCore.registerModule("sorting", sortingModule) }, /*!**********************************************!*\ !*** ./js/ui/tree_list/ui.tree_list.rows.js ***! \**********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), treeListCore = __webpack_require__( /*! ./ui.tree_list.core */ 423), rowsViewModule = __webpack_require__( /*! ../grid_core/ui.grid_core.rows */ 365); var TREELIST_TEXT_CONTENT = "dx-treelist-text-content", TREELIST_EXPAND_ICON_CONTAINER_CLASS = "dx-treelist-icon-container", TREELIST_CELL_EXPANDABLE_CLASS = "dx-treelist-cell-expandable", TREELIST_EMPTY_SPACE = "dx-treelist-empty-space", TREELIST_EXPANDED_CLASS = "dx-treelist-expanded", TREELIST_COLLAPSED_CLASS = "dx-treelist-collapsed"; exports.RowsView = rowsViewModule.views.rowsView.inherit(function() { var createCellContent = function($container) { return $("<div />").addClass(TREELIST_TEXT_CONTENT).appendTo($container) }; var createIcon = function(hasIcon, isExpanded) { var $iconElement = $("<div/>").addClass(TREELIST_EMPTY_SPACE); if (hasIcon) { $iconElement.toggleClass(TREELIST_EXPANDED_CLASS, isExpanded).toggleClass(TREELIST_COLLAPSED_CLASS, !isExpanded).append($("<span/>")) } return $iconElement }; return { _renderExpandIcon: function($container, options) { var level = options.row.level, $iconContainer = $("<div/>").addClass(TREELIST_EXPAND_ICON_CONTAINER_CLASS).appendTo($container); for (var i = 0; i <= level; i++) { $iconContainer.append(createIcon(i === level && options.row.node.hasChildren, options.row.isExpanded)) } $container.addClass(TREELIST_CELL_EXPANDABLE_CLASS); return $iconContainer }, _renderCellCommandContent: function(container, model) { this._renderExpandIcon(container, model); return true }, _processTemplate: function(template, options) { var resultTemplate, that = this, renderingTemplate = this.callBase(template); var firstDataColumnIndex = that._columnsController.getFirstDataColumnIndex(); if (renderingTemplate && options.column.index === firstDataColumnIndex) { resultTemplate = { render: function(options) { var $container = options.container; if (that._renderCellCommandContent($container, options.model)) { options.container = createCellContent($container) } renderingTemplate.render(options) } } } else { resultTemplate = renderingTemplate } return resultTemplate }, _updateCell: function($cell, options) { $cell = $cell.hasClass(TREELIST_TEXT_CONTENT) ? $cell.parent() : $cell; this.callBase($cell, options) }, _rowClick: function(e) { var dataController = this._dataController, $targetElement = $(e.jQueryEvent.target), isExpandIcon = this.isExpandIcon($targetElement), item = dataController && dataController.items()[e.rowIndex]; if (isExpandIcon && item) { dataController.changeRowExpand(item.key) } this.callBase(e) }, _createRow: function(row) { var node = row && row.node, $rowElement = this.callBase.apply(this, arguments); if (node) { this.setAria("level", row.level, $rowElement); if (node.hasChildren) { this.setAria("expanded", row.isExpanded, $rowElement) } } return $rowElement }, _getTableRoleName: function() { return "treegrid" }, isExpandIcon: function($targetElement) { return !!$targetElement.closest("." + TREELIST_EXPANDED_CLASS + ", ." + TREELIST_COLLAPSED_CLASS).length } } }()); treeListCore.registerModule("rows", { defaultOptions: rowsViewModule.defaultOptions, views: { rowsView: exports.RowsView } }) }, /*!******************************************************!*\ !*** ./js/ui/tree_list/ui.tree_list.context_menu.js ***! \******************************************************/ function(module, exports, __webpack_require__) { var treeListCore = __webpack_require__( /*! ./ui.tree_list.core */ 423), contextMenuModule = __webpack_require__( /*! ../grid_core/ui.grid_core.context_menu */ 367); treeListCore.registerModule("contextMenu", contextMenuModule) }, /*!********************************************************!*\ !*** ./js/ui/tree_list/ui.tree_list.error_handling.js ***! \********************************************************/ function(module, exports, __webpack_require__) { var treeListCore = __webpack_require__( /*! ./ui.tree_list.core */ 423), errorHandlingModule = __webpack_require__( /*! ../grid_core/ui.grid_core.error_handling */ 369); treeListCore.registerModule("errorHandling", errorHandlingModule) }, /*!***************************************************!*\ !*** ./js/ui/tree_list/ui.tree_list.grid_view.js ***! \***************************************************/ function(module, exports, __webpack_require__) { var treeListCore = __webpack_require__( /*! ./ui.tree_list.core */ 423), gridViewModule = __webpack_require__( /*! ../grid_core/ui.grid_core.grid_view */ 371); var GridView = gridViewModule.views.gridView.inherit(function() { return { _getWidgetAriaLabel: function() { return "dxTreeList-ariaTreeList" } } }()); treeListCore.registerModule("gridView", { defaultOptions: gridViewModule.defaultOptions, controllers: gridViewModule.controllers, views: { gridView: GridView } }) }, /*!******************************************************!*\ !*** ./js/ui/tree_list/ui.tree_list.header_panel.js ***! \******************************************************/ function(module, exports, __webpack_require__) { var treeListCore = __webpack_require__( /*! ./ui.tree_list.core */ 423), headerPanelModule = __webpack_require__( /*! ../grid_core/ui.grid_core.header_panel */ 373); treeListCore.registerModule("headerPanel", headerPanelModule) }, /*!********************************************************!*\ !*** ./js/ui/tree_list/ui.tree_list.column_chooser.js ***! \********************************************************/ function(module, exports, __webpack_require__) { var treeListCore = __webpack_require__( /*! ./ui.tree_list.core */ 423), columnChooserModule = __webpack_require__( /*! ../grid_core/ui.grid_core.column_chooser */ 379); treeListCore.registerModule("columnChooser", columnChooserModule) }, /*!*******************************************************!*\ !*** ./js/ui/tree_list/ui.tree_list.master_detail.js ***! \*******************************************************/ function(module, exports, __webpack_require__) { var treeListCore = __webpack_require__( /*! ./ui.tree_list.core */ 423), masterDetailModule = __webpack_require__( /*! ../grid_core/ui.grid_core.master_detail */ 386), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend; treeListCore.registerModule("masterDetail", extend(true, {}, masterDetailModule, { extenders: { controllers: { data: { isRowExpanded: function() { return this.callBase.apply(this, arguments) }, _processItems: function() { return this.callBase.apply(this, arguments) }, _processDataItem: function() { return this.callBase.apply(this, arguments) } } } } })) }, /*!*************************************************!*\ !*** ./js/ui/tree_list/ui.tree_list.editing.js ***! \*************************************************/ function(module, exports, __webpack_require__) { __webpack_require__( /*! ./ui.tree_list.editor_factory */ 437); var $ = __webpack_require__( /*! ../../core/renderer */ 9), errors = __webpack_require__( /*! ../widget/ui.errors */ 22), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), treeListCore = __webpack_require__( /*! ./ui.tree_list.core */ 423), gridCoreUtils = __webpack_require__( /*! ../grid_core/ui.grid_core.utils */ 349), editingModule = __webpack_require__( /*! ../grid_core/ui.grid_core.editing */ 390); var TREELIST_EXPAND_ICON_CONTAINER_CLASS = "dx-treelist-icon-container", SELECT_CHECKBOX_CLASS = "dx-select-checkbox", DATA_EDIT_DATA_INSERT_TYPE = "insert"; var EditingController = editingModule.controllers.editing.inherit(function() { return { _generateNewItem: function(key) { var item = this.callBase(key); item.data = { key: key }; item.children = []; item.level = 0; item.parentKey = this.option("rootValue"); return item }, _needInsertItem: function(editData, changeType, items, item) { var parentKey = editData.key.parentKey; if (void 0 !== parentKey && parentKey !== this.option("rootValue")) { var rowIndex = gridCoreUtils.getIndexByKey(parentKey, items); if (rowIndex >= 0 && this._dataController.isRowExpanded(parentKey)) { items.splice(rowIndex + 1, 0, item) } return false } return this.callBase.apply(this, arguments) }, _isEditColumnVisible: function() { var result = this.callBase.apply(this, arguments), editingOptions = this.option("editing"); return result || editingOptions && editingOptions.allowAdding }, _createEditingLinks: function(container, options, editingOptions) { var callBase = this.callBase, editingTexts = editingOptions.texts || {}; if (editingOptions.allowAdding && !(options.row.removed || options.row.inserted)) { this._createLink(container, editingTexts.addRowToNode, "addRowByRowIndex", options, "dx-link-add") } callBase.apply(this, arguments) }, _beforeSaveEditData: function(editData) { var key, store, dataController = this._dataController, result = this.callBase.apply(this, arguments); if (editData && editData.type !== DATA_EDIT_DATA_INSERT_TYPE) { store = dataController && dataController.store(); key = store && store.key(); if (!commonUtils.isDefined(key)) { throw errors.Error("E1045") } } return result }, addRowByRowIndex: function(rowIndex) { var dataController = this.getController("data"), row = dataController.getVisibleRows()[rowIndex]; return this.addRow(row ? row.key : void 0) }, addRow: function(key) { var that = this, callBase = this.callBase, dataController = this.getController("data"); if (void 0 !== key && !dataController.isRowExpanded(key)) { var d = $.Deferred(); dataController.expandRow(key).done(function() { setTimeout(function() { callBase.call(that, key); d.resolve() }) }).fail(d.reject); return d } callBase.call(that, key) }, _initNewRow: function(options, insertKey) { var parentKey = insertKey.parentKey, dataController = this.getController("data"), dataSourceAdapter = dataController.dataSource(), parentIdSetter = dataSourceAdapter.createParentIdSetter(); if (void 0 === parentKey) { parentKey = this.option("rootValue"); insertKey.parentKey = parentKey } parentIdSetter(options.data, parentKey); this.callBase.apply(this, arguments) } } }()); var originalRowClick = editingModule.extenders.views.rowsView._rowClick; var RowsViewExtender = extend({}, editingModule.extenders.views.rowsView, { _renderCellCommandContent: function($container, options) { var editingController = this._editingController, isEditRow = options.row && editingController.isEditRow(options.row.rowIndex), isEditing = options.isEditing || isEditRow; if (!isEditing) { return this.callBase.apply(this, arguments) } return false }, _rowClick: function(e) { var $targetElement = $(e.jQueryEvent.target); if ($targetElement.closest("." + SELECT_CHECKBOX_CLASS).length) { return } if ($targetElement.closest("." + TREELIST_EXPAND_ICON_CONTAINER_CLASS).length) { this.callBase.apply(this, arguments) } else { originalRowClick.apply(this, arguments) } } }); treeListCore.registerModule("editing", { defaultOptions: function() { return extend(true, editingModule.defaultOptions(), { editing: { texts: { addRowToNode: messageLocalization.format("dxTreeList-editingAddRowToNode") } } }) }, controllers: { editing: EditingController }, extenders: { controllers: extend(true, {}, editingModule.extenders.controllers, { data: { changeRowExpand: function() { this._editingController.refresh(); return this.callBase.apply(this, arguments) } } }), views: { rowsView: RowsViewExtender, headerPanel: editingModule.extenders.views.headerPanel } } }) }, /*!********************************************************!*\ !*** ./js/ui/tree_list/ui.tree_list.editor_factory.js ***! \********************************************************/ function(module, exports, __webpack_require__) { var treeListCore = __webpack_require__( /*! ./ui.tree_list.core */ 423), editorFactoryModule = __webpack_require__( /*! ../grid_core/ui.grid_core.editor_factory */ 389); treeListCore.registerModule("editorFactory", editorFactoryModule) }, /*!****************************************************!*\ !*** ./js/ui/tree_list/ui.tree_list.validating.js ***! \****************************************************/ function(module, exports, __webpack_require__) { var extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, treeListCore = __webpack_require__( /*! ./ui.tree_list.core */ 423), validatingModule = __webpack_require__( /*! ../grid_core/ui.grid_core.validating */ 392); var EditingControllerExtender = extend({}, validatingModule.extenders.controllers.editing); delete EditingControllerExtender.processItems; delete EditingControllerExtender.processDataItem; treeListCore.registerModule("validating", { defaultOptions: validatingModule.defaultOptions, controllers: validatingModule.controllers, extenders: { controllers: { editing: EditingControllerExtender, editorFactory: validatingModule.extenders.controllers.editorFactory }, views: validatingModule.extenders.views } }) }, /*!***********************************************************!*\ !*** ./js/ui/tree_list/ui.tree_list.virtual_scrolling.js ***! \***********************************************************/ function(module, exports, __webpack_require__) { var gridCore = __webpack_require__( /*! ./ui.tree_list.core */ 423), dataSourceAdapter = __webpack_require__( /*! ./ui.tree_list.data_source_adapter */ 427), virtualScrollingModule = __webpack_require__( /*! ../grid_core/ui.grid_core.virtual_scrolling */ 394), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend; var oldDefaultOptions = virtualScrollingModule.defaultOptions; gridCore.registerModule("virtualScrolling", extend({}, virtualScrollingModule, { defaultOptions: function() { return extend(true, oldDefaultOptions(), { scrolling: { mode: "virtual" } }) } })); dataSourceAdapter.extend(virtualScrollingModule.extenders.dataSourceAdapter) }, /*!****************************************************!*\ !*** ./js/ui/tree_list/ui.tree_list.filter_row.js ***! \****************************************************/ function(module, exports, __webpack_require__) { var core = __webpack_require__( /*! ./ui.tree_list.core */ 423), filterRowModule = __webpack_require__( /*! ../grid_core/ui.grid_core.filter_row */ 397); core.registerModule("filterRow", filterRowModule) }, /*!*******************************************************!*\ !*** ./js/ui/tree_list/ui.tree_list.header_filter.js ***! \*******************************************************/ function(module, exports, __webpack_require__) { var core = __webpack_require__( /*! ./ui.tree_list.core */ 423), headerFilterModule = __webpack_require__( /*! ../grid_core/ui.grid_core.header_filter */ 402); core.registerModule("headerFilter", headerFilterModule) }, /*!*********************************************************************!*\ !*** ./js/ui/tree_list/ui.tree_list.columns_resizing_reordering.js ***! \*********************************************************************/ function(module, exports, __webpack_require__) { var treeListCore = __webpack_require__( /*! ./ui.tree_list.core */ 423), columnsResizingReorderingModule = __webpack_require__( /*! ../grid_core/ui.grid_core.columns_resizing_reordering */ 409); treeListCore.registerModule("columnsResizingReordering", columnsResizingReorderingModule) }, /*!*******************************************************!*\ !*** ./js/ui/tree_list/ui.tree_list.column_fixing.js ***! \*******************************************************/ function(module, exports, __webpack_require__) { var core = __webpack_require__( /*! ./ui.tree_list.core */ 423), columnFixingModule = __webpack_require__( /*! ../grid_core/ui.grid_core.column_fixing */ 415); core.registerModule("columnFixing", columnFixingModule) }, /*!****************************************************!*\ !*** ./js/ui/tree_list/ui.tree_list.adaptivity.js ***! \****************************************************/ function(module, exports, __webpack_require__) { var treeListCore = __webpack_require__( /*! ./ui.tree_list.core */ 423), adaptivityModule = __webpack_require__( /*! ../grid_core/ui.grid_core.adaptivity */ 417); treeListCore.registerModule("adaptivity", adaptivityModule) }, /*!***************************************************!*\ !*** ./js/ui/tree_list/ui.tree_list.selection.js ***! \***************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), treeListCore = __webpack_require__( /*! ./ui.tree_list.core */ 423), noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, selectionModule = __webpack_require__( /*! ../grid_core/ui.grid_core.selection */ 377), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend; var TREELIST_SELECT_ALL_CLASS = "dx-treelist-select-all"; var originalRowClick = selectionModule.extenders.views.rowsView._rowClick; function foreachNodes(nodes, func) { for (var i = 0; i < nodes.length; i++) { if (false !== func(nodes[i]) && nodes[i].hasChildren && nodes[i].children.length) { foreachNodes(nodes[i].children, func) } } } treeListCore.registerModule("selection", extend(true, {}, selectionModule, { defaultOptions: function() { return extend(true, selectionModule.defaultOptions(), { selection: { showCheckBoxesMode: "always" } }) }, extenders: { controllers: { selection: { renderSelectCheckBoxContainer: function($container, model) { var that = this, rowsView = that.component.getView("rowsView"); var $checkbox = rowsView._renderSelectCheckBox($container, model.row.isSelected); rowsView._attachCheckBoxClickEvent($checkbox) }, _updateSelectColumn: noop, _getVisibleNodeKeys: function() { var component = this.component, root = component.getRootNode(), keys = []; root && foreachNodes(root.children, function(node) { if (void 0 !== node.key && node.visible) { keys.push(node.key) } return component.isRowExpanded(node.key) }); return keys }, isSelectAll: function() { var component = this.component, visibleKeys = this._getVisibleNodeKeys(); var selectedVisibleKeys = visibleKeys.filter(function(key) { return component.isRowSelected(key) }); if (!selectedVisibleKeys.length) { return false } else { if (selectedVisibleKeys.length === visibleKeys.length) { return true } } }, selectAll: function() { var visibleKeys = this._getVisibleNodeKeys(); return this.selectRows(visibleKeys, true) }, deselectAll: function() { var visibleKeys = this._getVisibleNodeKeys(); return this.deselectRows(visibleKeys) } } }, views: { columnHeadersView: { _processTemplate: function(template, options) { var resultTemplate, that = this, renderingTemplate = this.callBase(template, options); var firstDataColumnIndex = that._columnsController.getFirstDataColumnIndex(); if (renderingTemplate && options.column.index === firstDataColumnIndex) { resultTemplate = { render: function(options) { if ("multiple" === that.option("selection.mode")) { that.renderSelectAll(options.container, options.model) } renderingTemplate.render(options) } } } else { resultTemplate = renderingTemplate } return resultTemplate }, renderSelectAll: function($cell, options) { $cell.addClass(TREELIST_SELECT_ALL_CLASS); var $checkbox = this._renderSelectAllCheckBox($cell); this._attachSelectAllCheckBoxClickEvent($checkbox) } }, rowsView: { _renderExpandIcon: function($container, options) { var $iconContainer = this.callBase($container, options); if ("multiple" === this.option("selection.mode")) { this.getController("selection").renderSelectCheckBoxContainer($iconContainer, options) } return $iconContainer }, _rowClick: function(e) { var $targetElement = $(e.jQueryEvent.target); if (this.isExpandIcon($targetElement)) { this.callBase.apply(this, arguments) } else { originalRowClick.apply(this, arguments) } } } } } })) }, /*!************************************************!*\ !*** ./js/ui/tree_list/ui.tree_list.search.js ***! \************************************************/ function(module, exports, __webpack_require__) { var core = __webpack_require__( /*! ./ui.tree_list.core */ 423), searchModule = __webpack_require__( /*! ../grid_core/ui.grid_core.search */ 405); core.registerModule("search", searchModule) }, /*!*************************************************************!*\ !*** ./js/ui/tree_list/ui.tree_list.keyboard_navigation.js ***! \*************************************************************/ function(module, exports, __webpack_require__) { var core = __webpack_require__( /*! ./ui.tree_list.core */ 423), keyboardNavigationModule = __webpack_require__( /*! ../grid_core/ui.grid_core.keyboard_navigation */ 411); core.registerModule("keyboardNavigation", keyboardNavigationModule) }, /*!*****************************!*\ !*** ./js/ui/pivot_grid.js ***! \*****************************/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__( /*! ./pivot_grid/ui.pivot_grid */ 449) }, /*!*******************************************!*\ !*** ./js/ui/pivot_grid/ui.pivot_grid.js ***! \*******************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), stringUtils = __webpack_require__( /*! ../../core/utils/string */ 18), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, clickEvent = __webpack_require__( /*! ../../events/click */ 75), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), Widget = __webpack_require__( /*! ../widget/ui.widget */ 95), eventUtils = __webpack_require__( /*! ../../events/utils */ 71), gridCoreUtils = __webpack_require__( /*! ../grid_core/ui.grid_core.utils */ 349), pivotGridUtils = __webpack_require__( /*! ./ui.pivot_grid.utils */ 450), pivotGridDataController = __webpack_require__( /*! ./ui.pivot_grid.data_controller */ 451), PivotGridDataSource = __webpack_require__( /*! ./data_source */ 452), dataAreaNamespace = __webpack_require__( /*! ./ui.pivot_grid.data_area */ 457), headersArea = __webpack_require__( /*! ./ui.pivot_grid.headers_area */ 459), fieldsArea = __webpack_require__( /*! ./ui.pivot_grid.fields_area */ 460), PivotGridFieldChooser = __webpack_require__( /*! ./ui.pivot_grid.field_chooser */ 463), PivotGridFieldChooserBase = __webpack_require__( /*! ./ui.pivot_grid.field_chooser_base */ 461), ExportMixin = __webpack_require__( /*! ./ui.pivot_grid.export */ 464).ExportMixin, chartIntegrationMixin = __webpack_require__( /*! ./ui.pivot_grid.chart_integration */ 465), isDefined = commonUtils.isDefined, Popup = __webpack_require__( /*! ../popup */ 200), ContextMenu = __webpack_require__( /*! ../context_menu */ 338), when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when, DATA_AREA_CELL_CLASS = "dx-area-data-cell", ROW_AREA_CELL_CLASS = "dx-area-row-cell", COLUMN_AREA_CELL_CLASS = "dx-area-column-cell", DESCRIPTION_AREA_CELL_CLASS = "dx-area-description-cell", BORDERS_CLASS = "dx-pivotgrid-border", PIVOTGRID_CLASS = "dx-pivotgrid", ROW_LINES_CLASS = "dx-row-lines", BOTTOM_ROW_CLASS = "dx-bottom-row", BOTTOM_BORDER_CLASS = "dx-bottom-border", FIELDS_CONTAINER_CLASS = "dx-pivotgrid-fields-container", FIELDS_CLASS = "dx-area-fields", FIELD_CHOOSER_POPUP_CLASS = "dx-fieldchooser-popup", INCOMPRESSIBLE_FIELDS_CLASS = "dx-incompressible-fields", OVERFLOW_HIDDEN_CLASS = "dx-overflow-hidden", TR = "<tr>", TD = "<td>", DIV = "<div>", TEST_HEIGHT = 66666; function getArraySum(array) { var sum = 0; $.each(array, function(_, value) { sum += value || 0 }); return sum } function adjustSizeArray(sizeArray, space) { var delta = space / sizeArray.length; for (var i = 0; i < sizeArray.length; i++) { sizeArray[i] -= delta } } function subscribeToScrollEvent(area, handler) { area.off("scroll").off("stop").on("scroll", handler).on("stop", handler) } var scrollBarInfoCache = {}; function getScrollBarInfo(useNativeScrolling) { if (scrollBarInfoCache[useNativeScrolling]) { return scrollBarInfoCache[useNativeScrolling] } var scrollBarUseNative, scrollBarWidth = 0, options = {}; var container = $(DIV).css({ position: "absolute", visibility: "hidden", top: -1e3, left: -1e3, width: 100, height: 100 }).appendTo("body"); var content = $("<p>").css({ width: "100%", height: 200 }).appendTo(container); if ("auto" !== useNativeScrolling) { options.useNative = !!useNativeScrolling; options.useSimulatedScrollbar = !useNativeScrolling } container.dxScrollable(options); scrollBarUseNative = container.dxScrollable("instance").option("useNative"); scrollBarWidth = scrollBarUseNative ? container.width() - content.width() : 0; container.remove(); scrollBarInfoCache[useNativeScrolling] = { scrollBarWidth: scrollBarWidth, scrollBarUseNative: scrollBarUseNative }; return scrollBarInfoCache[useNativeScrolling] } function getCommonBorderWidth(elements, direction) { var outerSize = "width" === direction ? "outerWidth" : "outerHeight", width = 0; $.each(elements, function(_, elem) { width += elem[outerSize]() - elem[direction]() }); return width } function clickedOnFieldsArea($targetElement) { return $targetElement.closest("." + FIELDS_CLASS).length || $targetElement.find("." + FIELDS_CLASS).length } var PivotGrid = Widget.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { scrolling: { timeout: 300, renderingThreshold: 150, mode: "standard", useNative: "auto", removeInvisiblePages: true }, encodeHtml: true, dataSource: null, activeStateEnabled: false, fieldChooser: { minWidth: 250, minHeight: 250, enabled: true, layout: 0, title: messageLocalization.format("dxPivotGrid-fieldChooserTitle"), width: 600, height: 600 }, onContextMenuPreparing: null, allowSorting: false, allowSortingBySummary: false, allowFiltering: false, allowExpandAll: false, wordWrapEnabled: true, fieldPanel: { showColumnFields: true, showFilterFields: true, showDataFields: true, showRowFields: true, allowFieldDragging: true, visible: false, texts: { columnFieldArea: messageLocalization.format("dxPivotGrid-columnFieldArea"), rowFieldArea: messageLocalization.format("dxPivotGrid-rowFieldArea"), filterFieldArea: messageLocalization.format("dxPivotGrid-filterFieldArea"), dataFieldArea: messageLocalization.format("dxPivotGrid-dataFieldArea") } }, dataFieldArea: "column", "export": { enabled: false, fileName: "PivotGrid", proxyUrl: void 0 }, showRowTotals: true, showRowGrandTotals: true, showColumnTotals: true, showColumnGrandTotals: true, hideEmptySummaryCells: true, showTotalsPrior: "none", rowHeaderLayout: "standard", loadPanel: { enabled: true, text: messageLocalization.format("Loading"), width: 200, height: 70, showIndicator: true, indicatorSrc: "", showPane: true }, texts: { grandTotal: messageLocalization.format("dxPivotGrid-grandTotal"), total: messageLocalization.getFormatter("dxPivotGrid-total"), noData: messageLocalization.format("dxDataGrid-noDataText"), showFieldChooser: messageLocalization.format("dxPivotGrid-showFieldChooser"), expandAll: messageLocalization.format("dxPivotGrid-expandAll"), collapseAll: messageLocalization.format("dxPivotGrid-collapseAll"), sortColumnBySummary: messageLocalization.getFormatter("dxPivotGrid-sortColumnBySummary"), sortRowBySummary: messageLocalization.getFormatter("dxPivotGrid-sortRowBySummary"), removeAllSorting: messageLocalization.format("dxPivotGrid-removeAllSorting"), exportToExcel: messageLocalization.format("dxDataGrid-exportToExcel"), dataNotAvailable: messageLocalization.format("dxPivotGrid-dataNotAvailable") }, onCellClick: null, onCellPrepared: null, showBorders: false, stateStoring: { enabled: false, storageKey: null, type: "localStorage", customLoad: null, customSave: null, savingTimeout: 2e3 }, onExpandValueChanging: null, renderCellCountLimit: 2e4, onExporting: null, onExported: null, onFileSaving: null }) }, _setDeprecatedOptions: function() { this.callBase(); extend(this._deprecatedOptions, { useNativeScrolling: { since: "15.2", alias: "scrolling.useNative" } }) }, _getDataControllerOptions: function() { var that = this; return { component: that, dataSource: that.option("dataSource"), texts: that.option("texts"), showRowTotals: that.option("showRowTotals"), showRowGrandTotals: that.option("showRowGrandTotals"), showColumnTotals: that.option("showColumnTotals"), showTotalsPrior: that.option("showTotalsPrior"), showColumnGrandTotals: that.option("showColumnGrandTotals"), dataFieldArea: that.option("dataFieldArea"), rowHeaderLayout: that.option("rowHeaderLayout"), hideEmptySummaryCells: that.option("hideEmptySummaryCells"), onFieldsPrepared: function(fields) { $.each(fields, function(index, field) { $.each(["allowSorting", "allowSortingBySummary", "allowFiltering", "allowExpandAll"], function(_, optionName) { if (void 0 === field[optionName]) { pivotGridUtils.setFieldProperty(field, optionName, that.option(optionName)) } }) }) } } }, _initDataController: function() { var that = this; that._dataController && that._dataController.dispose(); that._dataController = new pivotGridDataController.DataController(that._getDataControllerOptions()); that._dataController.changed.add(function() { that._render() }); that._dataController.scrollChanged.add(function(options) { that._scrollLeft = options.left; that._scrollTop = options.top }); that._dataController.loadingChanged.add(function(isLoading, progress) { that._updateLoading(progress) }); that._dataController.dataSourceChanged.add(function() { that._trigger("onChanged") }); var expandValueChanging = that.option("onExpandValueChanging"); if (expandValueChanging) { that._dataController.expandValueChanging.add(function(e) { expandValueChanging(e) }) } }, _init: function() { var that = this; that.callBase(); that._initDataController(); that._scrollLeft = that._scrollTop = null; that._initActions() }, _initActions: function() { var that = this; that._actions = { onChanged: that._createActionByOption("onChanged"), onContextMenuPreparing: that._createActionByOption("onContextMenuPreparing"), onCellClick: that._createActionByOption("onCellClick"), onExporting: that._createActionByOption("onExporting"), onExported: that._createActionByOption("onExported"), onFileSaving: that._createActionByOption("onFileSaving"), onCellPrepared: that._createActionByOption("onCellPrepared") } }, _trigger: function(eventName, eventArg) { this._actions[eventName](eventArg) }, _optionValuesEqual: function(name, oldValue, newValue) { if ("dataSource" === name && newValue instanceof PivotGridDataSource && oldValue instanceof PivotGridDataSource) { return newValue === oldValue } return this.callBase.apply(this, arguments) }, _optionChanged: function(args) { var that = this; switch (args.name) { case "dataSource": case "allowSorting": case "allowFiltering": case "allowExpandAll": case "allowSortingBySummary": case "scrolling": case "stateStoring": that._initDataController(); that._fieldChooserPopup.hide(); that._renderFieldChooser(); that._invalidate(); break; case "texts": case "showTotalsPrior": case "showRowTotals": case "showRowGrandTotals": case "showColumnTotals": case "showColumnGrandTotals": case "hideEmptySummaryCells": case "dataFieldArea": that._dataController.updateViewOptions(that._getDataControllerOptions()); break; case "useNativeScrolling": case "encodeHtml": case "renderCellCountLimit": break; case "rtlEnabled": that.callBase(args); that._renderFieldChooser(); that._renderContextMenu(); that._renderLoadPanel(that._dataArea.groupElement(), that.element()); that._invalidate(); break; case "export": that._renderDescriptionArea(); break; case "onExpandValueChanging": break; case "onCellClick": case "onContextMenuPreparing": case "onExporting": case "onExported": case "onFileSaving": case "onCellPrepared": that._actions[args.name] = that._createActionByOption(args.name); break; case "fieldChooser": that._renderFieldChooser(); that._renderDescriptionArea(); break; case "loadPanel": that._renderLoadPanel(that._dataArea.groupElement(), that.element()); that._invalidate(); break; case "fieldPanel": that._renderDescriptionArea(); that._invalidate(); break; case "showBorders": that._tableElement().toggleClass(BORDERS_CLASS, !!args.value); that.updateDimensions(); break; case "wordWrapEnabled": that._tableElement().toggleClass("dx-word-wrap", !!args.value); that.updateDimensions(); break; case "rowHeaderLayout": that._tableElement().find("." + ROW_AREA_CELL_CLASS).toggleClass("dx-area-tree-view", "tree" === args.value); that._dataController.updateViewOptions(that._getDataControllerOptions()); break; case "height": case "width": that._hasHeight = null; that.callBase(args); that.resize(); break; default: that.callBase(args) } }, _updateScrollPosition: function(columnsArea, rowsArea, dataArea) { var scrollTop, scrollLeft, that = this, scrolled = that._scrollTop || that._scrollLeft; if (rowsArea && !rowsArea.hasScroll() && that._hasHeight) { that._scrollTop = null } if (columnsArea && !columnsArea.hasScroll()) { that._scrollLeft = null } if (null !== that._scrollTop || null !== that._scrollLeft || scrolled || that.option("rtlEnabled")) { scrollTop = that._scrollTop || 0; scrollLeft = that._scrollLeft || 0; dataArea.scrollTo({ x: scrollLeft, y: scrollTop }); columnsArea.scrollTo(scrollLeft); rowsArea.scrollTo(scrollTop); that._dataController.updateWindowScrollPosition(that._scrollTop) } }, _subscribeToEvents: function(columnsArea, rowsArea, dataArea) { var that = this, scrollHandler = function(e) { var scrollOffset = e.scrollOffset, leftOffset = isDefined(scrollOffset.left) ? scrollOffset.left : that._scrollLeft, topOffset = isDefined(scrollOffset.top) && that._hasHeight ? scrollOffset.top : that._scrollTop; if ((that._scrollLeft || 0) !== (leftOffset || 0) || (that._scrollTop || 0) !== (topOffset || 0)) { that._scrollLeft = leftOffset; that._scrollTop = topOffset; that._updateScrollPosition(columnsArea, rowsArea, dataArea); if ("virtual" === that.option("scrolling.mode")) { that._dataController.setViewportPosition(that._scrollLeft, that._scrollTop) } } }; $.each([columnsArea, rowsArea, dataArea], function(_, area) { subscribeToScrollEvent(area, scrollHandler) }); !that._hasHeight && that._dataController.subscribeToWindowScrollEvents(dataArea.groupElement()) }, _clean: commonUtils.noop, _needDelayResizing: function(cellsInfo) { var cellsCount = cellsInfo.length * (cellsInfo.length ? cellsInfo[0].length : 0); return cellsCount > this.option("renderCellCountLimit") }, _renderFieldChooser: function() { var that = this, container = that._pivotGridContainer, fieldChooserOptions = that.option("fieldChooser") || {}, fieldChooserComponentOptions = { layout: fieldChooserOptions.layout, texts: fieldChooserOptions.texts || {}, dataSource: that.getDataSource(), width: void 0, height: void 0 }, popupOptions = { shading: false, title: fieldChooserOptions.title, width: fieldChooserOptions.width, height: fieldChooserOptions.height, showCloseButton: true, resizeEnabled: true, minWidth: fieldChooserOptions.minWidth, minHeight: fieldChooserOptions.minHeight, onResize: function(e) { e.component.content().dxPivotGridFieldChooser("updateDimensions") }, onShown: function(e) { that._createComponent(e.component.content(), PivotGridFieldChooser, fieldChooserComponentOptions) } }; if (that._fieldChooserPopup) { that._fieldChooserPopup.option(popupOptions); that._fieldChooserPopup.content().dxPivotGridFieldChooser(fieldChooserComponentOptions) } else { that._fieldChooserPopup = that._createComponent($(DIV).addClass(FIELD_CHOOSER_POPUP_CLASS).appendTo(container), Popup, popupOptions) } }, _renderContextMenu: function() { var that = this, $container = that._pivotGridContainer; if (that._contextMenu) { that._contextMenu.element().remove() } that._contextMenu = that._createComponent($(DIV).appendTo($container), ContextMenu, { onPositioning: function(actionArgs) { var targetElement, args, items, event = actionArgs.jQueryEvent; actionArgs.cancel = true; if (!event) { return } targetElement = event.target.cellIndex >= 0 ? event.target : $(event.target).closest("td").get(0); if (!targetElement) { return } args = that._createEventArgs(targetElement, event); items = that._getContextMenuItems(args); if (items) { actionArgs.component.option("items", items); actionArgs.cancel = false; return } }, onItemClick: function(params) { params.itemData.onItemClick && params.itemData.onItemClick(params) }, cssClass: PIVOTGRID_CLASS, target: that.element() }) }, _getContextMenuItems: function(e) { var that = this, items = [], texts = that.option("texts"); if ("row" === e.area || "column" === e.area) { var areaFields = e[e.area + "Fields"], oppositeAreaFields = e["column" === e.area ? "rowFields" : "columnFields"], field = e.cell.path && areaFields[e.cell.path.length - 1], dataSource = that.getDataSource(); if (field && field.allowExpandAll && e.cell.path.length < e[e.area + "Fields"].length) { items.push({ beginGroup: true, icon: "none", text: texts.expandAll, onItemClick: function() { dataSource.expandAll(field.index) } }); items.push({ text: texts.collapseAll, icon: "none", onItemClick: function() { dataSource.collapseAll(field.index) } }) } if (e.cell.isLast) { var sortingBySummaryItemCount = 0; $.each(oppositeAreaFields, function(index, field) { if (!field.allowSortingBySummary) { return } $.each(e.dataFields, function(dataIndex, dataField) { if (isDefined(e.cell.dataIndex) && e.cell.dataIndex !== dataIndex) { return } var showDataFieldCaption = !isDefined(e.cell.dataIndex) && e.dataFields.length > 1, textFormat = "column" === e.area ? texts.sortColumnBySummary : texts.sortRowBySummary, checked = pivotGridUtils.findField(e.dataFields, field.sortBySummaryField) === dataIndex && (e.cell.path || []).join("/") === (field.sortBySummaryPath || []).join("/"), text = stringUtils.format(textFormat, showDataFieldCaption ? field.caption + " - " + dataField.caption : field.caption); items.push({ beginGroup: 0 === sortingBySummaryItemCount, icon: checked ? "desc" === field.sortOrder ? "sortdowntext" : "sortuptext" : "none", text: text, onItemClick: function() { dataSource.field(field.index, { sortBySummaryField: dataField.caption || dataField.dataField, sortBySummaryPath: e.cell.path, sortOrder: "desc" === field.sortOrder ? "asc" : "desc" }); dataSource.load() } }); sortingBySummaryItemCount++ }) }); $.each(oppositeAreaFields, function(index, field) { if (!field.allowSortingBySummary || !isDefined(field.sortBySummaryField)) { return } items.push({ beginGroup: 0 === sortingBySummaryItemCount, icon: "none", text: texts.removeAllSorting, onItemClick: function() { $.each(oppositeAreaFields, function(index, field) { dataSource.field(field.index, { sortBySummaryField: void 0, sortBySummaryPath: void 0, sortOrder: void 0 }) }); dataSource.load() } }); return false }) } } if (that.option("fieldChooser.enabled")) { items.push({ beginGroup: true, icon: "columnchooser", text: texts.showFieldChooser, onItemClick: function() { that._fieldChooserPopup.show() } }) } if (that.option("export.enabled")) { items.push({ beginGroup: true, icon: "exportxlsx", text: texts.exportToExcel, onItemClick: function() { that.exportToExcel() } }) } e.items = items; that._trigger("onContextMenuPreparing", e); items = e.items; if (items && items.length) { return items } }, _createEventArgs: function(targetElement, jQueryEvent) { var that = this, dataSource = that.getDataSource(), args = { rowFields: dataSource.getAreaFields("row"), columnFields: dataSource.getAreaFields("column"), dataFields: dataSource.getAreaFields("data"), jQueryEvent: jQueryEvent }; if (clickedOnFieldsArea($(targetElement))) { return extend(that._createFieldArgs(targetElement), args) } else { return extend(that._createCellArgs(targetElement), args) } }, _createFieldArgs: function(targetElement) { var field = $(targetElement).children().data("field"), args = { field: field }; return commonUtils.isDefined(field) ? args : {} }, _createCellArgs: function(cellElement) { var $cellElement = $(cellElement), columnIndex = cellElement.cellIndex, rowIndex = cellElement.parentElement.rowIndex, $table = $cellElement.closest("table"), data = $table.data("data"), cell = data && data[rowIndex] && data[rowIndex][columnIndex], args = { area: $table.data("area"), rowIndex: rowIndex, columnIndex: columnIndex, cellElement: $cellElement, cell: cell }; return args }, _handleCellClick: function(e) { var that = this, args = that._createEventArgs(e.currentTarget, e), cell = args.cell; if (!cell || !args.area && (args.rowIndex || args.columnIndex)) { return } that._trigger("onCellClick", args); cell && !args.cancel && isDefined(cell.expanded) && setTimeout(function() { that._dataController[cell.expanded ? "collapseHeaderItem" : "expandHeaderItem"](args.area, cell.path) }) }, _getNoDataText: function() { return this.option("texts.noData") }, _renderNoDataText: gridCoreUtils.renderNoDataText, _renderLoadPanel: gridCoreUtils.renderLoadPanel, _updateLoading: function(progress) { var loadPanelVisible, that = this, isLoading = that._dataController.isLoading(); if (!that._loadPanel) { return } loadPanelVisible = that._loadPanel.option("visible"); if (!loadPanelVisible) { that._startLoadingTime = new Date } if (isLoading) { if (progress) { if (new Date - that._startLoadingTime >= 1e3) { that._loadPanel.option("message", Math.floor(100 * progress) + "%") } } else { that._loadPanel.option("message", that.option("loadPanel.text")) } } clearTimeout(that._hideLoadingTimeoutID); if (loadPanelVisible && !isLoading) { that._hideLoadingTimeoutID = setTimeout(function() { that._loadPanel.option("visible", false); that.element().removeClass(OVERFLOW_HIDDEN_CLASS) }) } else { that._loadPanel.option("visible", isLoading); that.element().toggleClass(OVERFLOW_HIDDEN_CLASS, !isLoading) } }, _renderDescriptionArea: function() { var that = this, $element = that.element(), $descriptionCell = $element.find("." + DESCRIPTION_AREA_CELL_CLASS), $toolbarContainer = $(DIV).addClass("dx-pivotgrid-toolbar"), fieldPanel = that.option("fieldPanel"), $filterHeader = $element.find(".dx-filter-header"), $columnHeader = $element.find(".dx-column-header"); var $targetContainer; if (fieldPanel.visible && fieldPanel.showFilterFields) { $targetContainer = $filterHeader } else { if (fieldPanel.visible && (fieldPanel.showDataFields || fieldPanel.showColumnFields)) { $targetContainer = $columnHeader } else { $targetContainer = $descriptionCell } } $columnHeader.toggleClass(BOTTOM_BORDER_CLASS, !!(fieldPanel.visible && (fieldPanel.showDataFields || fieldPanel.showColumnFields))); $filterHeader.toggleClass(BOTTOM_BORDER_CLASS, !!(fieldPanel.visible && fieldPanel.showFilterFields)); $descriptionCell.toggleClass("dx-pivotgrid-background", fieldPanel.visible && (fieldPanel.showDataFields || fieldPanel.showColumnFields || fieldPanel.showRowFields)); that.element().find(".dx-pivotgrid-toolbar").remove(); $toolbarContainer.prependTo($targetContainer); if (that.option("fieldChooser.enabled")) { that._createComponent($(DIV).appendTo($toolbarContainer).addClass("dx-pivotgrid-field-chooser-button"), "dxButton", { icon: "columnchooser", hint: that.option("texts.showFieldChooser"), onClick: function() { that.getFieldChooserPopup().show() } }) } if (that.option("export.enabled")) { that._createComponent($(DIV).appendTo($toolbarContainer).addClass("dx-pivotgrid-export-button"), "dxButton", { icon: "exportxlsx", hint: that.option("texts.exportToExcel"), onClick: function() { that.exportToExcel() } }) } }, _detectHasContainerHeight: function() { var testElement, that = this, element = that.element(); if (commonUtils.isDefined(that._hasHeight) || element.is(":hidden")) { return } that._pivotGridContainer.addClass("dx-hidden"); testElement = $(DIV).height(TEST_HEIGHT); element.append(testElement); that._hasHeight = element.height() !== TEST_HEIGHT; that._pivotGridContainer.removeClass("dx-hidden"); testElement.remove() }, _renderHeaders: function(rowHeaderContainer, columnHeaderContainer, filterHeaderContainer, dataHeaderContainer) { var that = this, dataSource = that.getDataSource(), FieldsArea = fieldsArea.FieldsArea; that._rowFields = that._rowFields || new FieldsArea(that, "row"); that._rowFields.render(rowHeaderContainer, dataSource.getAreaFields("row")); that._columnFields = that._columnFields || new FieldsArea(that, "column"); that._columnFields.render(columnHeaderContainer, dataSource.getAreaFields("column")); that._filterFields = that._filterFields || new FieldsArea(that, "filter"); that._filterFields.render(filterHeaderContainer, dataSource.getAreaFields("filter")); that._dataFields = that._dataFields || new FieldsArea(that, "data"); that._dataFields.render(dataHeaderContainer, dataSource.getAreaFields("data")); that.element().dxPivotGridFieldChooserBase("instance").renderSortable() }, _createTableElement: function() { var that = this; return $("<table>").css({ width: "100%" }).toggleClass(BORDERS_CLASS, !!that.option("showBorders")).toggleClass("dx-word-wrap", !!that.option("wordWrapEnabled")).on(eventUtils.addNamespace(clickEvent.name, "dxPivotGrid"), "td", that._handleCellClick.bind(that)) }, _renderDataArea: function(dataAreaElement) { var that = this, dataArea = that._dataArea || new dataAreaNamespace.DataArea(that); that._dataArea = dataArea; dataArea.render(dataAreaElement, that._dataController.getCellsInfo()); return dataArea }, _renderRowsArea: function(rowsAreaElement) { var that = this, rowsArea = that._rowsArea || new headersArea.VerticalHeadersArea(that); that._rowsArea = rowsArea; rowsArea.render(rowsAreaElement, that._dataController.getRowsInfo()); return rowsArea }, _renderColumnsArea: function(columnsAreaElement) { var that = this, columnsArea = that._columnsArea || new headersArea.HorizontalHeadersArea(that); that._columnsArea = columnsArea; columnsArea.render(columnsAreaElement, that._dataController.getColumnsInfo()); return columnsArea }, _renderContentImpl: function() { var columnsAreaElement, rowsAreaElement, dataAreaElement, tableElement, dataArea, rowsArea, columnsArea, rowHeaderContainer, columnHeaderContainer, filterHeaderContainer, dataHeaderContainer, updateHandler, that = this, isFirstDrawing = !that._pivotGridContainer; tableElement = !isFirstDrawing && that._tableElement(); if (!tableElement) { that.element().addClass(PIVOTGRID_CLASS).addClass(ROW_LINES_CLASS).addClass(FIELDS_CONTAINER_CLASS); that._pivotGridContainer = $(DIV).addClass("dx-pivotgrid-container"); that._renderFieldChooser(); that._renderContextMenu(); columnsAreaElement = $(TD).addClass(COLUMN_AREA_CELL_CLASS); rowsAreaElement = $(TD).addClass(ROW_AREA_CELL_CLASS); dataAreaElement = $(TD).addClass(DATA_AREA_CELL_CLASS); tableElement = that._createTableElement(); dataHeaderContainer = $(TD).addClass("dx-data-header"); filterHeaderContainer = $("<td colspan='2'>").addClass("dx-filter-header"); columnHeaderContainer = $(TD).addClass("dx-column-header"); rowHeaderContainer = $(TD).addClass(DESCRIPTION_AREA_CELL_CLASS); $(TR).append(filterHeaderContainer).appendTo(tableElement); $(TR).append(dataHeaderContainer).append(columnHeaderContainer).appendTo(tableElement); $(TR).append(rowHeaderContainer).append(columnsAreaElement).appendTo(tableElement); $(TR).addClass(BOTTOM_ROW_CLASS).append(rowsAreaElement).append(dataAreaElement).appendTo(tableElement); that._pivotGridContainer.append(tableElement); that.element().append(that._pivotGridContainer); if ("tree" === that.option("rowHeaderLayout")) { rowsAreaElement.addClass("dx-area-tree-view") } } that.element().addClass(OVERFLOW_HIDDEN_CLASS); that._createComponent(that.element(), PivotGridFieldChooserBase, { dataSource: that.getDataSource(), allowFieldDragging: that.option("fieldPanel.allowFieldDragging") }); dataArea = that._renderDataArea(dataAreaElement); rowsArea = that._renderRowsArea(rowsAreaElement); columnsArea = that._renderColumnsArea(columnsAreaElement); dataArea.tableElement().prepend(columnsArea.headElement()); if (isFirstDrawing) { that._renderLoadPanel(dataArea.groupElement().parent(), that.element()); that._renderDescriptionArea(); rowsArea.processScroll(); columnsArea.processScroll() } updateHandler = function() { that.updateDimensions().done(function() { that._subscribeToEvents(columnsArea, rowsArea, dataArea) }) }; that._renderHeaders(rowHeaderContainer, columnHeaderContainer, filterHeaderContainer, dataHeaderContainer); if (that._needDelayResizing(dataArea.getData()) && isFirstDrawing) { setTimeout(updateHandler) } else { updateHandler() } }, _fireContentReadyAction: function() { if (!this._dataController.isLoading()) { this.callBase() } }, getScrollPath: function(area) { var that = this; if ("column" === area) { return that._columnsArea.getScrollPath(that._scrollLeft) } else { return that._rowsArea.getScrollPath(that._scrollTop) } }, getDataSource: function() { return this._dataController.getDataSource() }, getFieldChooserPopup: function() { return this._fieldChooserPopup }, hasScroll: function(area) { var that = this; return "column" === area ? that._columnsArea.hasScroll() : that._rowsArea.hasScroll() }, _dimensionChanged: function() { this.updateDimensions() }, _visibilityChanged: function(visible) { if (visible) { this.updateDimensions() } }, _dispose: function() { var that = this; clearTimeout(that._hideLoadingTimeoutID); that.callBase.apply(that, arguments); if (that._dataController) { that._dataController.dispose() } }, _tableElement: function() { return this.element().find("table").first() }, addWidgetPrefix: function(className) { return "dx-pivotgrid-" + className }, resize: function() { this.updateDimensions() }, isReady: function() { return this.callBase() && !this._dataController.isLoading() }, updateDimensions: function() { var groupWidth, groupHeight, dataAreaHeights, rowsAreaHeights, resultHeights, resultWidths, rowsAreaColumnWidths, bordersWidth, hasRowsScroll, hasColumnsScroll, elementWidth, columnsAreaHeight, descriptionCellHeight, columnsAreaRowHeights, rowHeights, columnsAreaRowCount, that = this, tableElement = that._tableElement(), rowsArea = that._rowsArea, columnsArea = that._columnsArea, dataArea = that._dataArea, totalWidth = 0, totalHeight = 0, rowsAreaWidth = 0, scrollBarInfo = getScrollBarInfo(that.option("scrolling.useNative")), scrollBarWidth = scrollBarInfo.scrollBarWidth, dataAreaCell = tableElement.find("." + DATA_AREA_CELL_CLASS), rowAreaCell = tableElement.find("." + ROW_AREA_CELL_CLASS), columnAreaCell = tableElement.find("." + COLUMN_AREA_CELL_CLASS), descriptionCell = tableElement.find("." + DESCRIPTION_AREA_CELL_CLASS), filterHeaderCell = tableElement.find(".dx-filter-header"), rowFieldsHeader = that._rowFields, needSynchronizeFieldPanel = rowFieldsHeader.isVisible() && "tree" !== that.option("rowHeaderLayout"), d = $.Deferred(); that.__scrollBarUseNative = scrollBarInfo.scrollBarUseNative; that.__scrollBarWidth = scrollBarWidth; that._detectHasContainerHeight(); if (!dataArea.headElement().length) { dataArea.tableElement().prepend(columnsArea.headElement()) } if (needSynchronizeFieldPanel) { rowsArea.updateColspans(rowFieldsHeader.getColumnsCount()); rowsArea.tableElement().prepend(rowFieldsHeader.headElement()) } tableElement.addClass(INCOMPRESSIBLE_FIELDS_CLASS); dataArea.reset(); rowsArea.reset(); columnsArea.reset(); rowFieldsHeader.reset(); commonUtils.deferUpdate(function() { resultWidths = dataArea.getColumnsWidth(); rowHeights = rowsArea.getRowsHeight(); rowsAreaHeights = needSynchronizeFieldPanel ? rowHeights.slice(1) : rowHeights; dataAreaHeights = dataArea.getRowsHeight(); descriptionCellHeight = descriptionCell.outerHeight() + (needSynchronizeFieldPanel ? rowHeights[0] : 0); columnsAreaRowCount = that._dataController.getColumnsInfo().length; resultHeights = pivotGridUtils.mergeArraysByMaxValue(rowsAreaHeights, dataAreaHeights.slice(columnsAreaRowCount)); columnsAreaRowHeights = dataAreaHeights.slice(0, columnsAreaRowCount); columnsAreaHeight = getArraySum(columnsAreaRowHeights); rowsAreaColumnWidths = rowsArea.getColumnsWidth(); if (that._hasHeight) { bordersWidth = getCommonBorderWidth([columnAreaCell, dataAreaCell, tableElement, tableElement.find(".dx-column-header"), filterHeaderCell], "height"); groupHeight = that.element().height() - filterHeaderCell.height() - tableElement.find(".dx-data-header").height() - (Math.max(dataArea.headElement().height(), columnAreaCell.height(), descriptionCellHeight) + bordersWidth) } totalWidth = dataArea.tableElement().width(); totalHeight = getArraySum(resultHeights); rowsAreaWidth = getArraySum(rowsAreaColumnWidths); elementWidth = that.element().width(); bordersWidth = getCommonBorderWidth([rowAreaCell, dataAreaCell, tableElement], "width"); groupWidth = elementWidth - rowsAreaWidth - bordersWidth; groupWidth = groupWidth > 0 ? groupWidth : totalWidth; hasRowsScroll = that._hasHeight && totalHeight - groupHeight >= 1; hasColumnsScroll = totalWidth - groupWidth >= 1; if (!hasRowsScroll) { groupHeight = totalHeight + (hasColumnsScroll ? scrollBarWidth : 0) } commonUtils.deferRender(function() { columnsArea.tableElement().append(dataArea.headElement()); rowFieldsHeader.tableElement().append(rowsArea.headElement()); if (!hasColumnsScroll && hasRowsScroll && scrollBarWidth) { adjustSizeArray(resultWidths, scrollBarWidth); totalWidth -= scrollBarWidth } if (descriptionCellHeight > columnsAreaHeight) { adjustSizeArray(columnsAreaRowHeights, columnsAreaHeight - descriptionCellHeight); columnsArea.setRowsHeight(columnsAreaRowHeights) } tableElement.removeClass(INCOMPRESSIBLE_FIELDS_CLASS); columnsArea.groupWidth(groupWidth); columnsArea.processScrollBarSpacing(hasRowsScroll ? scrollBarWidth : 0); columnsArea.setColumnsWidth(resultWidths); rowsArea.groupHeight(that._hasHeight ? groupHeight : "auto"); rowsArea.processScrollBarSpacing(hasColumnsScroll ? scrollBarWidth : 0); rowsArea.setColumnsWidth(rowsAreaColumnWidths); rowsArea.setRowsHeight(resultHeights); dataArea.setColumnsWidth(resultWidths); dataArea.setRowsHeight(resultHeights); dataArea.groupWidth(groupWidth); dataArea.groupHeight(that._hasHeight ? groupHeight : "auto"); needSynchronizeFieldPanel && rowFieldsHeader.setColumnsWidth(rowsAreaColumnWidths); dataAreaCell.toggleClass(BOTTOM_BORDER_CLASS, !(hasRowsScroll || scrollBarWidth)); rowAreaCell.toggleClass(BOTTOM_BORDER_CLASS, !(hasRowsScroll && !scrollBarWidth)); if (!that._hasHeight && elementWidth !== that.element().width()) { var diff = elementWidth - that.element().width(); if (!hasColumnsScroll) { adjustSizeArray(resultWidths, diff); columnsArea.setColumnsWidth(resultWidths); dataArea.setColumnsWidth(resultWidths) } dataArea.groupWidth(groupWidth - diff); columnsArea.groupWidth(groupWidth - diff) } if ("virtual" === that.option("scrolling.mode") && !that._dataController.isEmpty()) { var virtualContentParams = that._dataController.calculateVirtualContentParams({ contentWidth: totalWidth, contentHeight: totalHeight, rowCount: resultHeights.length, columnCount: resultWidths.length, viewportWidth: groupWidth, viewportHeight: that._hasHeight ? groupHeight : $(window).outerHeight() }); dataArea.setVirtualContentParams({ top: virtualContentParams.contentTop, left: virtualContentParams.contentLeft, width: virtualContentParams.width, height: virtualContentParams.height }); rowsArea.setVirtualContentParams({ top: virtualContentParams.contentTop, width: rowsAreaWidth, height: virtualContentParams.height }); columnsArea.setVirtualContentParams({ left: virtualContentParams.contentLeft, width: virtualContentParams.width, height: columnsArea.groupElement().height() }) } var updateScrollableResults = []; dataArea.processScroll(scrollBarInfo.scrollBarUseNative); $.each([columnsArea, rowsArea, dataArea], function(_, area) { updateScrollableResults.push(area && area.updateScrollable()) }); that._updateLoading(); that._renderNoDataText(dataAreaCell); that._testResultWidths = resultWidths; that._testResultHeights = resultHeights; when.apply($, updateScrollableResults).done(function() { that._updateScrollPosition(columnsArea, rowsArea, dataArea); d.resolve() }) }) }); return d }, applyPartialDataSource: function(area, path, dataSource) { this._dataController.applyPartialDataSource(area, path, dataSource) } }).inherit(ExportMixin).include(chartIntegrationMixin); registerComponent("dxPivotGrid", PivotGrid); module.exports = PivotGrid }, /*!*************************************************!*\ !*** ./js/ui/pivot_grid/ui.pivot_grid.utils.js ***! \*************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), dataCoreUtils = __webpack_require__( /*! ../../core/utils/data */ 50), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, dateLocalization = __webpack_require__( /*! ../../localization/date */ 33), formatHelper = __webpack_require__( /*! ../../format_helper */ 66), DataSourceModule = __webpack_require__( /*! ../../data/data_source/data_source */ 153), ArrayStore = __webpack_require__( /*! ../../data/array_store */ 158), when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when; var setFieldProperty = exports.setFieldProperty = function(field, property, value, isInitialization) { var initProperties = field._initProperties = field._initProperties || {}, initValue = isInitialization ? value : field[property]; if (!initProperties.hasOwnProperty(property) || isInitialization) { initProperties[property] = initValue } field[property] = value }; exports.sendRequest = function(options) { return $.ajax(options) }; var foreachTreeAsyncDate = new Date; function createForeachTreeFunc(isAsync) { var foreachTreeFunc = function(items, callback, parentAtFirst, members, index, isChildrenProcessing) { members = members || []; items = items || []; var item, i, deferred, childrenDeferred; index = index || 0; function createForeachTreeAsyncHandler(deferred, i, isChildrenProcessing) { when(foreachTreeFunc(items, callback, parentAtFirst, members, i, isChildrenProcessing)).done(deferred.resolve) } for (i = index; i < items.length; i++) { if (isAsync && i > index && i % 1e4 === 0 && new Date - foreachTreeAsyncDate >= 300) { foreachTreeAsyncDate = new Date; deferred = $.Deferred(); setTimeout(createForeachTreeAsyncHandler(deferred, i, false), 0); return deferred } item = items[i]; if (!isChildrenProcessing) { members.unshift(item); if (parentAtFirst && false === callback(members, i)) { return } if (item.children) { childrenDeferred = foreachTreeFunc(item.children, callback, parentAtFirst, members); if (isAsync && childrenDeferred) { deferred = $.Deferred(); childrenDeferred.done(createForeachTreeAsyncHandler(deferred, i, true)); return deferred } } } isChildrenProcessing = false; if (!parentAtFirst && false === callback(members, i)) { return } members.shift(); if (items[i] !== item) { i-- } } }; return foreachTreeFunc } exports.foreachTree = createForeachTreeFunc(false); exports.foreachTreeAsync = createForeachTreeFunc(true); exports.findField = function(fields, id) { var i, field; if (fields && commonUtils.isDefined(id)) { for (i = 0; i < fields.length; i++) { field = fields[i]; if (field.name === id || field.caption === id || field.dataField === id || field.index === id) { return i } } } return -1 }; exports.formatValue = function(value, options) { var formatObject = { value: value, valueText: formatHelper.format(value, options.format, options.precision) || "" }; return options.customizeText ? options.customizeText.call(options, formatObject) : formatObject.valueText }; exports.getCompareFunction = function(valueSelector) { return function(a, b) { var result = 0; if (valueSelector(a) > valueSelector(b)) { result = 1 } else { if (valueSelector(a) < valueSelector(b)) { result = -1 } } return result } }; exports.createPath = function(items) { var i, result = []; for (i = items.length - 1; i >= 0; i--) { result.push(items[i].key || items[i].value) } return result }; exports.foreachDataLevel = function foreachDataLevel(data, callback, index, childrenField) { var item, i; index = index || 0; childrenField = childrenField || "children"; if (data.length) { callback(data, index) } for (i = 0; i < data.length; i++) { item = data[i]; if (item[childrenField] && item[childrenField].length) { foreachDataLevel(item[childrenField], callback, index + 1, childrenField) } } }; exports.mergeArraysByMaxValue = function(values1, values2) { var i, result = []; for (i = 0; i < values1.length; i++) { result.push(Math.max(values1[i] || 0, values2[i] || 0)) } return result }; exports.getExpandedLevel = function(options, axisName) { var dimensions = options[axisName], expandLevel = 0, expandedPaths = ("columns" === axisName ? options.columnExpandedPaths : options.rowExpandedPaths) || []; if (options.headerName === axisName) { expandLevel = options.path.length } else { $.each(expandedPaths, function(_, path) { expandLevel = Math.max(expandLevel, path.length) }) } while (dimensions[expandLevel + 1] && dimensions[expandLevel].expanded) { expandLevel++ } return expandLevel }; function createGroupFields(item) { return $.map(["year", "quarter", "month"], function(value, index) { return extend({}, item, { groupInterval: value, groupIndex: index }) }) } function parseFields(dataSource, fieldsList, path, fieldsDataType) { var result = []; $.each(fieldsList || [], function(field, value) { var items, dataIndex = 1, currentPath = path.length ? path + "." + field : field, dataType = fieldsDataType[currentPath], getter = dataCoreUtils.compileGetter(currentPath); while (!commonUtils.isDefined(value) && dataSource[dataIndex]) { value = getter(dataSource[dataIndex]); dataIndex++ } if (!dataType && commonUtils.isDefined(value)) { dataType = commonUtils.type(value) } items = [{ dataField: currentPath, dataType: dataType, groupName: "date" === dataType ? field : void 0, groupInterval: void 0, displayFolder: path }]; if ("date" === dataType) { items = items.concat(createGroupFields(items[0])) } else { if ("object" === dataType) { items = parseFields(dataSource, value, currentPath, fieldsDataType) } } result.push.apply(result, items) }); return result } exports.discoverObjectFields = function(items, fields) { var fieldsDataType = exports.getFieldsDataType(fields); return parseFields(items, items[0], "", fieldsDataType) }; exports.getFieldsDataType = function(fields) { var result = {}; $.each(fields, function(_, field) { result[field.dataField] = result[field.dataField] || field.dataType }); return result }; var DATE_INTERVAL_FORMATS = { month: function(value) { return dateLocalization.getMonthNames()[value - 1] }, quarter: function(value) { return dateLocalization.format(new Date(2e3, 3 * value - 1), "quarter") }, dayOfWeek: function(value) { return dateLocalization.getDayNames()[value] } }; exports.setDefaultFieldValueFormatting = function(field) { if ("date" === field.dataType) { if (!field.format) { setFieldProperty(field, "format", DATE_INTERVAL_FORMATS[field.groupInterval]) } } else { if ("number" === field.dataType) { var groupInterval = commonUtils.isNumeric(field.groupInterval) && field.groupInterval > 0 && field.groupInterval; if (groupInterval && !field.customizeText) { setFieldProperty(field, "customizeText", function(formatObject) { var secondValue = formatObject.value + groupInterval, secondValueText = formatHelper.format(secondValue, field.format, field.precision); return formatObject.valueText && secondValueText ? formatObject.valueText + " - " + secondValueText : "" }) } } } }; exports.getFiltersByPath = function(fields, path) { var result = []; path = path || []; for (var i = 0; i < path.length; i++) { result.push(extend({}, fields[i], { groupIndex: null, groupName: null, filterType: "include", filterValues: [path[i]] })) } return result }; exports.storeDrillDownMixin = { createDrillDownDataSource: function(descriptions, params) { function createCustomStoreMethod(methodName) { return function(options) { var d; if (arrayStore) { d = arrayStore[methodName](options) } else { d = $.Deferred(); when(items).done(function(data) { arrayStore = new ArrayStore(data); arrayStore[methodName](options).done(d.resolve).fail(d.reject) }).fail(d.reject) } return d } } var arrayStore, items = this.getDrillDownItems(descriptions, params), dataSource = new DataSourceModule.DataSource({ load: createCustomStoreMethod("load"), totalCount: createCustomStoreMethod("totalCount"), key: this.key() }); return dataSource } }; exports.capitalizeFirstLetter = function(string) { return string.charAt(0).toUpperCase() + string.slice(1) } }, /*!***********************************************************!*\ !*** ./js/ui/pivot_grid/ui.pivot_grid.data_controller.js ***! \***********************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, Class = __webpack_require__( /*! ../../core/class */ 25), stringUtils = __webpack_require__( /*! ../../core/utils/string */ 18), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), virtualScrolling = __webpack_require__( /*! ../grid_core/ui.grid_core.virtual_scrolling_core */ 395), stateStoring = __webpack_require__( /*! ../grid_core/ui.grid_core.state_storing */ 375), PivotGridDataSource = __webpack_require__( /*! ./data_source */ 452), pivotGridUtils = __webpack_require__( /*! ./ui.pivot_grid.utils */ 450), foreachTree = pivotGridUtils.foreachTree, foreachTreeAsync = pivotGridUtils.foreachTreeAsync, createPath = pivotGridUtils.createPath, formatValue = pivotGridUtils.formatValue, math = Math, GRAND_TOTAL_TYPE = "GT", TOTAL_TYPE = "T", DATA_TYPE = "D", NOT_AVAILABLE = "#N/A"; var proxyMethod = function(instance, methodName, defaultResult) { if (!instance[methodName]) { instance[methodName] = function() { var dataSource = this._dataSource; return dataSource ? dataSource[methodName].apply(dataSource, arguments) : defaultResult } } }; exports.DataController = Class.inherit(function() { function getHeaderItemText(item, description, options) { var text = item.text; if (commonUtils.isDefined(item.displayText)) { text = item.displayText } else { if (commonUtils.isDefined(item.caption)) { text = item.caption } else { if (item.type === GRAND_TOTAL_TYPE) { text = options.texts.grandTotal } } } if (item.isAdditionalTotal) { text = stringUtils.format(options.texts.total || "", text) } return text } function formatCellValue(value, dataField, errorText) { return value === NOT_AVAILABLE ? errorText : formatValue(value, dataField) } var createHeaderInfo = function() { var getHeaderItemsDepth = function(headerItems) { var depth = 0; foreachTree(headerItems, function(items) { depth = math.max(depth, items.length) }); return depth }; var createInfoItem = function(headerItem, breadth, isHorizontal, isTree) { var infoItem = { type: headerItem.type, text: headerItem.text }; if (headerItem.path) { infoItem.path = headerItem.path } if (headerItem.width) { infoItem.width = headerItem.width } if (commonUtils.isDefined(headerItem.wordWrapEnabled)) { infoItem.wordWrapEnabled = headerItem.wordWrapEnabled } if (headerItem.isLast) { infoItem.isLast = true } if (headerItem.sorted) { infoItem.sorted = true } if (headerItem.isMetric) { infoItem.dataIndex = headerItem.dataIndex } if (commonUtils.isDefined(headerItem.expanded)) { infoItem.expanded = headerItem.expanded } if (breadth > 1) { infoItem[isHorizontal ? "colspan" : "rowspan"] = breadth } if (headerItem.depthSize && headerItem.depthSize > 1) { infoItem[isHorizontal ? "rowspan" : "colspan"] = headerItem.depthSize } if (headerItem.index >= 0) { infoItem.dataSourceIndex = headerItem.index } if (isTree && headerItem.children && headerItem.children.length && !headerItem.children[0].isMetric) { infoItem.width = null; infoItem.isWhiteSpace = true } return infoItem }; var addInfoItem = function(info, options) { var itemInfo, breadth = options.lastIndex - options.index || 1, addInfoItemCore = function(info, infoItem, itemIndex, depthIndex, isHorizontal) { var index = isHorizontal ? depthIndex : itemIndex; while (!info[index]) { info.push([]) } if (isHorizontal) { info[index].push(infoItem) } else { info[index].unshift(infoItem) } }; itemInfo = createInfoItem(options.headerItem, breadth, options.isHorizontal, options.isTree); addInfoItemCore(info, itemInfo, options.index, options.depth, options.isHorizontal); if (!options.headerItem.children || 0 === options.headerItem.children.length) { return options.lastIndex + 1 } return options.lastIndex }; var isItemSorted = function(items, sortBySummaryPath) { var path, item = items[0], stringValuesUsed = commonUtils.isString(sortBySummaryPath[0]), headerItem = item.dataIndex >= 0 ? items[1] : item; if (stringValuesUsed && sortBySummaryPath[0].indexOf("&[") !== -1 && headerItem.key || !headerItem.key) { path = createPath(items) } else { path = $.map(items, function(item) { return item.dataIndex >= 0 ? item.value : item.text }).reverse() } if (item.type === GRAND_TOTAL_TYPE) { path = path.slice(1) } return path.join("/") === sortBySummaryPath.join("/") }; var getViewHeaderItems = function(headerItems, headerDescriptions, cellDescriptions, depthSize, options) { var cellDescriptionsCount = cellDescriptions.length, viewHeaderItems = createViewHeaderItems(headerItems, headerDescriptions), dataFields = options.dataFields, d = $.Deferred(); when(viewHeaderItems).done(function(viewHeaderItems) { options.notifyProgress(.5); if (options.showGrandTotals || 0 === headerDescriptions.length) { viewHeaderItems[!options.showTotalsPrior ? "push" : "unshift"]({ type: GRAND_TOTAL_TYPE, isEmpty: options.isEmptyGrandTotal }) } var hideTotals = false === options.showTotals || dataFields.length > 0 && dataFields.length === options.hiddenTotals.length, hideData = dataFields.length > 0 && options.hiddenValues.length === dataFields.length; if (hideData && hideTotals) { depthSize = 1 } if (!hideTotals || "tree" === options.layout) { addAdditionalTotalHeaderItems(viewHeaderItems, headerDescriptions, options.showTotalsPrior, "tree" === options.layout) } when(foreachTreeAsync(viewHeaderItems, function(items) { var item = items[0]; if (!item.children || 0 === item.children.length) { item.depthSize = depthSize - items.length + 1 } })).done(function() { if (cellDescriptionsCount > 1) { addMetricHeaderItems(viewHeaderItems, cellDescriptions, options) }!options.showEmpty && removeHiddenItems(viewHeaderItems); options.notifyProgress(.75); when(foreachTreeAsync(viewHeaderItems, function(items) { var item = items[0], isMetric = item.isMetric, field = headerDescriptions[items.length - 1] || {}; if (item.type === DATA_TYPE && !isMetric) { item.width = field.width } if (true === hideData && item.type === DATA_TYPE) { var parentChildren = (items[1] ? items[1].children : viewHeaderItems) || []; parentChildren.splice(inArray(item, parentChildren), 1); return } if (isMetric) { item.wordWrapEnabled = cellDescriptions[item.dataIndex].wordWrapEnabled } else { item.wordWrapEnabled = field.wordWrapEnabled } item.isLast = !item.children || !item.children.length; if (item.isLast) { $.each(options.sortBySummaryPaths, function(index, sortBySummaryPath) { if (!commonUtils.isDefined(item.dataIndex)) { sortBySummaryPath = sortBySummaryPath.slice(0); sortBySummaryPath.pop() } if (isItemSorted(items, sortBySummaryPath)) { item.sorted = true; return false } }) } item.text = getHeaderItemText(item, field, options) })).done(function() { if (!viewHeaderItems.length) { viewHeaderItems.push({}) } options.notifyProgress(1); d.resolve(viewHeaderItems) }) }) }); return d }; function createHeaderItem(childrenStack, depth, index) { var parent = childrenStack[depth] = childrenStack[depth] || [], node = parent[index] = {}; if (childrenStack[depth + 1]) { node.children = childrenStack[depth + 1]; childrenStack.length = depth + 1 } return node } function createViewHeaderItems(headerItems, headerDescriptions) { var headerItem, headerDescriptionsCount = headerDescriptions && headerDescriptions.length || 0, childrenStack = [], d = $.Deferred(); when(foreachTreeAsync(headerItems, function(items, index) { var item = items[0], path = createPath(items); headerItem = createHeaderItem(childrenStack, path.length, index); headerItem.type = DATA_TYPE; headerItem.value = item.value; headerItem.path = path; headerItem.text = item.text; headerItem.index = item.index; headerItem.displayText = item.displayText; headerItem.key = item.key; headerItem.isEmpty = item.isEmpty; if (path.length < headerDescriptionsCount && (!item.children || 0 !== item.children.length)) { headerItem.expanded = !!item.children } })).done(function() { d.resolve(createHeaderItem(childrenStack, 0, 0).children || []) }); return d } var addMetricHeaderItems = function(headerItems, cellDescriptions, options) { foreachTree(headerItems, function(items) { var i, item = items[0]; if (!item.children || 0 === item.children.length) { item.children = []; for (i = 0; i < cellDescriptions.length; i++) { var isGrandTotal = item.type === GRAND_TOTAL_TYPE, isTotal = item.type === TOTAL_TYPE, isValue = item.type === DATA_TYPE, columnIsHidden = false === cellDescriptions[i].visible || isGrandTotal && inArray(i, options.hiddenGrandTotals) !== -1 || isTotal && inArray(i, options.hiddenTotals) !== -1 || isValue && inArray(i, options.hiddenValues) !== -1; if (columnIsHidden) { continue } item.children.push({ caption: cellDescriptions[i].caption, path: item.path, type: item.type, value: i, index: item.index, dataIndex: i, isMetric: true, isEmpty: item.isEmpty && item.isEmpty[i] }) } } }) }; var addAdditionalTotalHeaderItems = function(headerItems, headerDescriptions, showTotalsPrior, isTree) { showTotalsPrior = showTotalsPrior || isTree; foreachTree(headerItems, function(items, index) { var item = items[0], parentChildren = (items[1] ? items[1].children : headerItems) || [], dataField = headerDescriptions[items.length - 1]; if (item.type === DATA_TYPE && item.expanded && (false !== dataField.showTotals || isTree)) { index !== -1 && parentChildren.splice(showTotalsPrior ? index : index + 1, 0, extend({}, item, { children: null, type: TOTAL_TYPE, expanded: showTotalsPrior ? true : null, isAdditionalTotal: true })); if (showTotalsPrior) { item.expanded = null } } }) }; var removeEmptyParent = function(items, index) { var parent = items[index + 1]; if (!items[index].children.length && parent && parent.children) { parent.children.splice(inArray(items[index], parent.children), 1); removeEmptyParent(items, index + 1) } }; var removeHiddenItems = function(headerItems) { foreachTree([{ children: headerItems }], function(items, index) { var item = items[0], parentChildren = (items[1] ? items[1].children : headerItems) || []; if (item && !item.children && (item.isEmpty && item.isEmpty.length ? item.isEmpty[0] : item.isEmpty)) { parentChildren.splice(index, 1); removeEmptyParent(items, 1) } }) }; var fillHeaderInfo = function(info, viewHeaderItems, depthSize, isHorizontal, isTree) { var index, depth, lastIndex = 0, indexesByDepth = [0]; foreachTree(viewHeaderItems, function(items) { var headerItem = items[0]; depth = headerItem.isMetric ? depthSize : items.length - 1; while (indexesByDepth.length - 1 < depth) { indexesByDepth.push(indexesByDepth[indexesByDepth.length - 1]) } index = indexesByDepth[depth] || 0; lastIndex = addInfoItem(info, { headerItem: headerItem, index: index, lastIndex: lastIndex, depth: depth, isHorizontal: isHorizontal, isTree: isTree }); indexesByDepth.length = depth; indexesByDepth.push(lastIndex) }) }; return function(headerItems, headerDescriptions, cellDescriptions, isHorizontal, options) { var info = [], depthSize = getHeaderItemsDepth(headerItems) || 1, d = $.Deferred(); getViewHeaderItems(headerItems, headerDescriptions, cellDescriptions, depthSize, options).done(function(viewHeaderItems) { fillHeaderInfo(info, viewHeaderItems, depthSize, isHorizontal, "tree" === options.layout); options.notifyProgress(1); d.resolve(info) }); return d } }(); function createSortPaths(headerFields, dataFields) { var sortBySummaryPaths = []; $.each(headerFields, function(index, headerField) { var fieldIndex = pivotGridUtils.findField(dataFields, headerField.sortBySummaryField); if (fieldIndex >= 0) { sortBySummaryPaths.push((headerField.sortBySummaryPath || []).concat([fieldIndex])) } }); return sortBySummaryPaths } function foreachRowInfo(rowsInfo, callback) { var columnOffset = 0, columnOffsetResetIndexes = []; for (var i = 0; i < rowsInfo.length; i++) { for (var j = 0; j < rowsInfo[i].length; j++) { var rowSpanOffset = (rowsInfo[i][j].rowspan || 1) - 1, visibleIndex = i + rowSpanOffset; if (columnOffsetResetIndexes[i]) { columnOffset -= columnOffsetResetIndexes[i]; columnOffsetResetIndexes[i] = 0 } if (false === callback(rowsInfo[i][j], visibleIndex, i, j, columnOffset)) { break } columnOffsetResetIndexes[i + (rowsInfo[i][j].rowspan || 1)] = (columnOffsetResetIndexes[i + (rowsInfo[i][j].rowspan || 1)] || 0) + 1; columnOffset++ } } } function foreachColumnInfo(info, callback, rowIndex, offsets, columnCount, lastProcessedIndexes) { rowIndex = rowIndex || 0; offsets = offsets || []; lastProcessedIndexes = lastProcessedIndexes || []; offsets[rowIndex] = offsets[rowIndex] || 0; var row = info[rowIndex], startIndex = lastProcessedIndexes[rowIndex] + 1 || 0, processedColumnCount = 0; if (!row) { return } for (var colIndex = startIndex; colIndex < row.length; colIndex++) { var cell = row[colIndex], visibleIndex = colIndex + offsets[rowIndex], colspan = cell.colspan || 1; foreachColumnInfo(info, callback, rowIndex + (cell.rowspan || 1), offsets, colspan, lastProcessedIndexes); offsets[rowIndex] += colspan - 1; processedColumnCount += colspan; if (cell.rowspan) { for (var i = rowIndex + 1; i < rowIndex + cell.rowspan; i++) { offsets[i] = offsets[i] || 0; offsets[i] += cell.colspan || 1 } } if (false === callback(cell, visibleIndex, rowIndex, colIndex)) { break } if (void 0 !== columnCount && processedColumnCount >= columnCount) { break } } lastProcessedIndexes[rowIndex] = colIndex } function createCellsInfo(rowsInfo, columnsInfo, data, dataFields, dataFieldArea, errorText) { var info = [], dataFieldAreaInRows = "row" === dataFieldArea, dataSourceCells = data.values; dataSourceCells.length && foreachRowInfo(rowsInfo, function(rowInfo, rowIndex) { var row = info[rowIndex] = [], dataRow = dataSourceCells[rowInfo.dataSourceIndex >= 0 ? rowInfo.dataSourceIndex : data.grandTotalRowIndex] || []; rowInfo.isLast && foreachColumnInfo(columnsInfo, function(columnInfo, columnIndex) { var dataIndex = (dataFieldAreaInRows ? rowInfo.dataIndex : columnInfo.dataIndex) || 0, dataField = dataFields[dataIndex]; if (columnInfo.isLast && dataField) { var cellValue, cell = dataRow[columnInfo.dataSourceIndex >= 0 ? columnInfo.dataSourceIndex : data.grandTotalColumnIndex]; if (!Array.isArray(cell)) { cell = [cell] } cellValue = cell[dataIndex]; row[columnIndex] = { text: formatCellValue(cellValue, dataField, errorText), value: cellValue, format: dataField.format, precision: dataField.precision, dataType: dataField.dataType, columnType: columnInfo.type, rowType: rowInfo.type, rowPath: rowInfo.path || [], columnPath: columnInfo.path || [], dataIndex: dataIndex }; if (dataField.width) { row[columnIndex].width = dataField.width } } }) }); return info } function getHeaderIndexedItems(headerItems, options) { var visibleIndex = 0, indexedItems = []; foreachTree(headerItems, function(items) { var headerItem = items[0], path = createPath(items); if (headerItem.children && false === options.showTotals) { return } var indexedItem = extend(true, {}, headerItem, { visibleIndex: visibleIndex++, path: path }); if (commonUtils.isDefined(indexedItem.index)) { indexedItems[indexedItem.index] = indexedItem } else { indexedItems.push(indexedItem) } }); return indexedItems } function createScrollController(dataController, component, dataAdapter) { if (component && "virtual" === component.option("scrolling.mode")) { return new virtualScrolling.VirtualScrollController(component, extend({ hasKnownLastPage: function() { return true }, pageCount: function() { return math.ceil(this.totalItemsCount() / this.pageSize()) }, updateLoading: function() {}, itemsCount: function() { if (this.pageIndex() < this.pageCount() - 1) { return this.pageSize() } else { return this.totalItemsCount() % this.pageSize() } }, items: function() { return [] }, viewportItems: function() { return [] }, onChanged: function() {}, isLoading: function() { return dataController.isLoading() }, changingDuration: function() { return dataController._changingDuration || 0 } }, dataAdapter)) } } function getHiddenTotals(dataFields) { var result = []; $.each(dataFields, function(index, field) { if (false === field.showTotals) { result.push(index) } }); return result } function getHiddenValues(dataFields) { var result = []; dataFields.forEach(function(field, index) { if (void 0 === field.showValues && false === field.showTotals || false === field.showValues) { result.push(index) } }); return result } function getHiddenGrandTotalsTotals(dataFields, columnFields) { var result = []; $.each(dataFields, function(index, field) { if (false === field.showGrandTotals) { result.push(index) } }); if (0 === columnFields.length && result.length === dataFields.length) { result = [] } return result } var members = { ctor: function(options) { var that = this, virtualScrollControllerChanged = that._fireChanged.bind(that); options = that._options = options || {}; that.dataSourceChanged = $.Callbacks(); that._dataSource = that._createDataSource(options); that._rowsScrollController = createScrollController(that, options.component, { totalItemsCount: function() { return that.totalRowCount() }, pageIndex: function(index) { return that.rowPageIndex(index) }, pageSize: function() { return that.rowPageSize() }, load: function() { if (that._rowsScrollController.pageIndex() >= this.pageCount()) { that._rowsScrollController.pageIndex(this.pageCount() - 1) } return that._rowsScrollController.handleDataChanged(virtualScrollControllerChanged) } }); that._columnsScrollController = createScrollController(that, options.component, { totalItemsCount: function() { return that.totalColumnCount() }, pageIndex: function(index) { return that.columnPageIndex(index) }, pageSize: function() { return that.columnPageSize() }, load: function() { if (that._columnsScrollController.pageIndex() >= this.pageCount()) { that._columnsScrollController.pageIndex(this.pageCount() - 1) } return that._columnsScrollController.handleDataChanged(virtualScrollControllerChanged) } }); that._stateStoringController = new stateStoring.StateStoringController(options.component).init(); that._columnsInfo = []; that._rowsInfo = []; that._cellsInfo = []; that.expandValueChanging = $.Callbacks(); that.loadingChanged = $.Callbacks(); that.scrollChanged = $.Callbacks(); that.load(); that._update(); that.changed = $.Callbacks() }, _fireChanged: function() { var that = this, startChanging = new Date; that.changed && !that._lockChanged && that.changed.fire(); that._changingDuration = new Date - startChanging }, load: function() { var that = this, stateStoringController = this._stateStoringController; if (stateStoringController.isEnabled() && !stateStoringController.isLoaded()) { stateStoringController.load().always(function(state) { if (state) { that._dataSource.state(state) } else { that._dataSource.load() } }) } else { that._dataSource.load() } }, calculateVirtualContentParams: function(contentParams) { var oldColumnViewportItemSize, oldRowViewportItemSize, newLeftPosition, newTopPosition, that = this, rowsScrollController = that._rowsScrollController, columnsScrollController = that._columnsScrollController, rowViewportItemSize = contentParams.contentHeight / contentParams.rowCount, columnViewportItemSize = contentParams.contentWidth / contentParams.columnCount; if (rowsScrollController && columnsScrollController) { oldColumnViewportItemSize = columnsScrollController.viewportItemSize(); oldRowViewportItemSize = rowsScrollController.viewportItemSize(); rowsScrollController.viewportItemSize(rowViewportItemSize); columnsScrollController.viewportItemSize(columnViewportItemSize); rowsScrollController.viewportSize(contentParams.viewportHeight / rowsScrollController.viewportItemSize()); rowsScrollController.setContentSize(contentParams.contentHeight); columnsScrollController.viewportSize(contentParams.viewportWidth / columnsScrollController.viewportItemSize()); columnsScrollController.setContentSize(contentParams.contentWidth); commonUtils.deferUpdate(function() { columnsScrollController.loadIfNeed(); rowsScrollController.loadIfNeed() }); newLeftPosition = columnsScrollController.getViewportPosition() * columnViewportItemSize / oldColumnViewportItemSize; newTopPosition = rowsScrollController.getViewportPosition() * rowViewportItemSize / oldRowViewportItemSize; that.setViewportPosition(newLeftPosition, newTopPosition); that.scrollChanged.fire({ left: newLeftPosition, top: newTopPosition }); return { contentTop: rowsScrollController.getContentOffset(), contentLeft: columnsScrollController.getContentOffset(), width: columnsScrollController.getVirtualContentSize(), height: rowsScrollController.getVirtualContentSize() } } }, setViewportPosition: function(left, top) { this._rowsScrollController.setViewportPosition(top || 0); this._columnsScrollController.setViewportPosition(left || 0) }, subscribeToWindowScrollEvents: function($element) { this._rowsScrollController && this._rowsScrollController.subscribeToWindowScrollEvents($element) }, updateWindowScrollPosition: function(position) { this._rowsScrollController && this._rowsScrollController.scrollTo(position) }, updateViewOptions: function(options) { extend(this._options, options); this._update() }, _handleExpandValueChanging: function(e) { this.expandValueChanging.fire(e) }, _handleLoadingChanged: function(isLoading, progress) { this.loadingChanged.fire(isLoading, progress) }, _handleFieldsPrepared: function(e) { this._options.onFieldsPrepared && this._options.onFieldsPrepared(e) }, _createDataSource: function(options) { var dataSource, that = this, dataSourceOptions = options.dataSource; that._isSharedDataSource = dataSourceOptions instanceof PivotGridDataSource; if (that._isSharedDataSource) { dataSource = dataSourceOptions } else { dataSource = new PivotGridDataSource(dataSourceOptions) } that._expandValueChangingHandler = that._handleExpandValueChanging.bind(that); that._loadingChangedHandler = that._handleLoadingChanged.bind(that); that._fieldsPreparedHandler = that._handleFieldsPrepared.bind(that); that._changedHandler = function() { that._update(); that.dataSourceChanged.fire() }; dataSource.on("changed", that._changedHandler); dataSource.on("expandValueChanging", that._expandValueChangingHandler); dataSource.on("loadingChanged", that._loadingChangedHandler); dataSource.on("fieldsPrepared", that._fieldsPreparedHandler); return dataSource }, getDataSource: function() { return this._dataSource }, isLoading: function() { return this._dataSource.isLoading() }, beginLoading: function() { this._dataSource._changeLoadingCount(1) }, endLoading: function() { this._dataSource._changeLoadingCount(-1) }, isEmpty: function() { var dataFields = this._dataSource.getAreaFields("data"), data = this._dataSource.getData(); return !dataFields.length || !data.values.length }, _update: function() { var that = this, dataSource = that._dataSource, options = that._options, columnFields = dataSource.getAreaFields("column"), rowFields = dataSource.getAreaFields("row"), dataFields = dataSource.getAreaFields("data"), dataFieldsForRows = "row" === options.dataFieldArea ? dataFields : [], dataFieldsForColumns = "row" !== options.dataFieldArea ? dataFields : [], data = dataSource.getData(), hiddenTotals = getHiddenTotals(dataFields), hiddenValues = getHiddenValues(dataFields), hiddenGrandTotals = getHiddenGrandTotalsTotals(dataFields, columnFields), grandTotalsAreHiddenForNotAllDataFields = dataFields.length > 0 ? hiddenGrandTotals.length !== dataFields.length : true, notifyProgress = function(progress) { this.progress = progress; dataSource._changeLoadingCount(0, .8 + .1 * rowOptions.progress + .1 * columnOptions.progress) }, rowOptions = { isEmptyGrandTotal: data.isEmptyGrandTotalRow, texts: options.texts || {}, hiddenTotals: hiddenTotals, hiddenValues: hiddenValues, hiddenGrandTotals: [], showTotals: options.showRowTotals, showGrandTotals: false !== options.showRowGrandTotals && grandTotalsAreHiddenForNotAllDataFields, sortBySummaryPaths: createSortPaths(columnFields, dataFields), showTotalsPrior: "rows" === options.showTotalsPrior || "both" === options.showTotalsPrior, showEmpty: !options.hideEmptySummaryCells, layout: options.rowHeaderLayout, fields: rowFields, dataFields: dataFields, progress: 0, notifyProgress: notifyProgress }, columnOptions = { isEmptyGrandTotal: data.isEmptyGrandTotalColumn, texts: options.texts || {}, hiddenTotals: hiddenTotals, hiddenValues: hiddenValues, hiddenGrandTotals: hiddenGrandTotals, showTotals: options.showColumnTotals, showTotalsPrior: "columns" === options.showTotalsPrior || "both" === options.showTotalsPrior, showGrandTotals: false !== options.showColumnGrandTotals && grandTotalsAreHiddenForNotAllDataFields, sortBySummaryPaths: createSortPaths(rowFields, dataFields), showEmpty: !options.hideEmptySummaryCells, fields: columnFields, dataFields: dataFields, progress: 0, notifyProgress: notifyProgress }; if (!commonUtils.isDefined(data.grandTotalRowIndex)) { data.grandTotalRowIndex = getHeaderIndexedItems(data.rows, rowOptions).length } if (!commonUtils.isDefined(data.grandTotalColumnIndex)) { data.grandTotalColumnIndex = getHeaderIndexedItems(data.columns, columnOptions).length } dataSource._changeLoadingCount(1, .8); when(createHeaderInfo(data.columns, columnFields, dataFieldsForColumns, true, columnOptions), createHeaderInfo(data.rows, rowFields, dataFieldsForRows, false, rowOptions)).always(function() { dataSource._changeLoadingCount(-1) }).done(function(columnsInfo, rowsInfo) { that._columnsInfo = columnsInfo; that._rowsInfo = rowsInfo; if (that._rowsScrollController && that._columnsScrollController && that.changed) { that._rowsScrollController.reset(); that._columnsScrollController.reset(); that._lockChanged = true; that._rowsScrollController.load(); that._columnsScrollController.load(); that._lockChanged = false } }).done(function() { that._fireChanged(); if (that._stateStoringController.isEnabled() && !that._dataSource.isLoading()) { that._stateStoringController.state(that._dataSource.state()); that._stateStoringController.save() } }) }, getRowsInfo: function(getAllData) { var rowspan, i, that = this, rowsInfo = that._rowsInfo, scrollController = that._rowsScrollController; if (scrollController && !getAllData) { var startIndex = scrollController.beginPageIndex() * that.rowPageSize(), endIndex = scrollController.endPageIndex() * that.rowPageSize() + that.rowPageSize(), newRowsInfo = [], maxDepth = 1; foreachRowInfo(rowsInfo, function(rowInfo, visibleIndex, rowIndex, _, columnIndex) { var isVisible = visibleIndex >= startIndex && rowIndex < endIndex, index = rowIndex < startIndex ? 0 : rowIndex - startIndex, cell = rowInfo; if (isVisible) { newRowsInfo[index] = newRowsInfo[index] || []; rowspan = rowIndex < startIndex ? rowInfo.rowspan - (startIndex - rowIndex) || 1 : rowInfo.rowspan; if (startIndex + index + rowspan > endIndex) { rowspan = endIndex - (index + startIndex) || 1 } if (rowspan !== rowInfo.rowspan) { cell = extend({}, cell, { rowspan: rowspan }) } newRowsInfo[index].push(cell); maxDepth = math.max(maxDepth, columnIndex + 1) } else { if (i > endIndex) { return false } } }); foreachRowInfo(newRowsInfo, function(rowInfo, visibleIndex, rowIndex, columnIndex, realColumnIndex) { var colspan = rowInfo.colspan || 1; if (realColumnIndex + colspan > maxDepth) { newRowsInfo[rowIndex][columnIndex] = extend({}, rowInfo, { colspan: maxDepth - realColumnIndex || 1 }) } }); return newRowsInfo } return rowsInfo }, getColumnsInfo: function(getAllData) { var that = this, info = that._columnsInfo, scrollController = that._columnsScrollController; if (scrollController && !getAllData) { var startIndex = scrollController.beginPageIndex() * that.columnPageSize(), endIndex = scrollController.endPageIndex() * that.columnPageSize() + that.columnPageSize(), newInfo = []; foreachColumnInfo(info, function(columnInfo, visibleIndex, rowIndex) { var colspan, cell = columnInfo, cellColspan = cell.colspan || 1, isVisible = visibleIndex + cellColspan - 1 >= startIndex && visibleIndex < endIndex; newInfo[rowIndex] = newInfo[rowIndex] || []; if (isVisible) { if (visibleIndex < startIndex) { colspan = cellColspan - (startIndex - visibleIndex); visibleIndex = startIndex } else { colspan = cellColspan } if (visibleIndex + colspan > endIndex) { colspan = endIndex - visibleIndex } if (colspan !== cellColspan) { cell = extend({}, cell, { colspan: colspan }) } newInfo[rowIndex].push(cell) } else { if (visibleIndex > endIndex) { return false } } }); for (var i = 0; i < newInfo.length; i++) { newInfo[i] = newInfo[i] || [] } info = newInfo } return info }, totalRowCount: function() { return this._rowsInfo.length }, rowPageIndex: function(index) { if (void 0 !== index) { this._rowPageIndex = index } return this._rowPageIndex || 0 }, totalColumnCount: function() { var count = 0; if (this._columnsInfo && this._columnsInfo.length) { for (var i = 0; i < this._columnsInfo[0].length; i++) { count += this._columnsInfo[0][i].colspan || 1 } } return count }, rowPageSize: function(size) { if (void 0 !== size) { this._rowPageSize = size } return this._rowPageSize || 20 }, columnPageSize: function(size) { if (void 0 !== size) { this._columnPageSize = size } return this._columnPageSize || 20 }, columnPageIndex: function(index) { if (void 0 !== index) { this._columnPageIndex = index } return this._columnPageIndex || 0 }, getCellsInfo: function(getAllData) { var rowsInfo = this.getRowsInfo(getAllData), columnsInfo = this.getColumnsInfo(getAllData), data = this._dataSource.getData(), texts = this._options.texts || {}; return createCellsInfo(rowsInfo, columnsInfo, data, this._dataSource.getAreaFields("data"), this._options.dataFieldArea, texts.dataNotAvailable) }, dispose: function() { var that = this; if (that._isSharedDataSource) { that._dataSource.off("changed", that._changedHandler); that._dataSource.off("expandValueChanging", that._expandValueChangingHandler); that._dataSource.off("loadingChanged", that._loadingChangedHandler) } else { that._dataSource.dispose() } that._columnsScrollController && that._columnsScrollController.dispose(); that._rowsScrollController && that._rowsScrollController.dispose(); that._stateStoringController.dispose(); that.expandValueChanging.empty(); that.changed.empty(); that.loadingChanged.empty(); that.scrollChanged.empty(); that.dataSourceChanged.empty() } }; proxyMethod(members, "applyPartialDataSource"); proxyMethod(members, "collapseHeaderItem"); proxyMethod(members, "expandHeaderItem"); proxyMethod(members, "getData"); return members }()) }, /*!*****************************************!*\ !*** ./js/ui/pivot_grid/data_source.js ***! \*****************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), DataSourceModule = __webpack_require__( /*! ../../data/data_source/data_source */ 153), Store = __webpack_require__( /*! ../../data/abstract_store */ 154), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), typeUtils = __webpack_require__( /*! ../../core/utils/type */ 12), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, isDefined = commonUtils.isDefined, each = $.each, when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when, Class = __webpack_require__( /*! ../../core/class */ 25), EventsMixin = __webpack_require__( /*! ../../core/events_mixin */ 51), inflector = __webpack_require__( /*! ../../core/utils/inflector */ 39), normalizeIndexes = __webpack_require__( /*! ../../core/utils/array */ 26).normalizeIndexes, localStore = __webpack_require__( /*! ./local_store */ 453), RemoteStore = __webpack_require__( /*! ./remote_store */ 454), xmlaStore = __webpack_require__( /*! ./xmla_store/xmla_store */ 455), summaryDisplayModes = __webpack_require__( /*! ./ui.pivot_grid.summary_display_modes */ 456), pivotGridUtils = __webpack_require__( /*! ./ui.pivot_grid.utils */ 450), foreachTree = pivotGridUtils.foreachTree, foreachTreeAsync = pivotGridUtils.foreachTreeAsync, findField = pivotGridUtils.findField, formatValue = pivotGridUtils.formatValue, getCompareFunction = pivotGridUtils.getCompareFunction, createPath = pivotGridUtils.createPath, foreachDataLevel = pivotGridUtils.foreachDataLevel, setFieldProperty = pivotGridUtils.setFieldProperty, DESCRIPTION_NAME_BY_AREA = { row: "rows", column: "columns", data: "values", filter: "filters" }, STATE_PROPERTIES = ["area", "areaIndex", "sortOrder", "filterType", "filterValues", "sortBy", "sortBySummaryField", "sortBySummaryPath", "expanded", "summaryType", "summaryDisplayMode"], CALCULATED_PROPERTIES = ["format", "selector", "customizeText", "caption"], ALL_CALCULATED_PROPERTIES = CALCULATED_PROPERTIES.concat(["allowSorting", "allowSortingBySummary", "allowFiltering", "allowExpandAll"]); function createCaption(field) { var caption = field.dataField || field.groupName || "", summaryType = (field.summaryType || "").toLowerCase(); if (commonUtils.isString(field.groupInterval)) { caption += "_" + field.groupInterval } if (summaryType && "custom" !== summaryType) { summaryType = summaryType.replace(/^./, summaryType[0].toUpperCase()); if (caption.length) { summaryType = " (" + summaryType + ")" } } else { summaryType = "" } return inflector.titleize(caption) + summaryType } function resetFieldState(field, properties) { var initialProperties = field._initProperties || {}; $.each(properties, function(_, prop) { if (initialProperties.hasOwnProperty(prop)) { field[prop] = initialProperties[prop] } }) } function updateCalculatedFieldProperties(field, calculatedProperties) { resetFieldState(field, calculatedProperties); if (!isDefined(field.caption)) { setFieldProperty(field, "caption", createCaption(field)) } } function areExpressionsUsed(dataFields) { return dataFields.some(function(field) { return field.summaryDisplayMode || field.calculateSummaryValue }) } function isRunningTotalUsed(dataFields) { return dataFields.some(function(field) { return !!field.runningTotal }) } module.exports = Class.inherit(function() { var findHeaderItem = function(headerItems, path) { if (headerItems._cacheByPath) { return headerItems._cacheByPath[path.join(".")] || null } }; var getHeaderItemsLastIndex = function(headerItems, grandTotalIndex) { var i, headerItem, lastIndex = -1; if (headerItems) { for (i = 0; i < headerItems.length; i++) { headerItem = headerItems[i]; lastIndex = Math.max(lastIndex, headerItem.index); if (headerItem.children) { lastIndex = Math.max(lastIndex, getHeaderItemsLastIndex(headerItem.children)) } else { if (headerItem.collapsedChildren) { lastIndex = Math.max(lastIndex, getHeaderItemsLastIndex(headerItem.collapsedChildren)) } } } } if (isDefined(grandTotalIndex)) { lastIndex = Math.max(lastIndex, grandTotalIndex) } return lastIndex }; var updateHeaderItemChildren = function(headerItems, headerItem, children, grandTotalIndex) { var index, applyingHeaderItemsCount = getHeaderItemsLastIndex(children) + 1, emptyIndex = getHeaderItemsLastIndex(headerItems, grandTotalIndex) + 1, applyingItemIndexesToCurrent = [], d = $.Deferred(); for (index = 0; index < applyingHeaderItemsCount; index++) { applyingItemIndexesToCurrent[index] = emptyIndex++ } headerItem.children = children; when(foreachTreeAsync(headerItem.children, function(items) { items[0].index = applyingItemIndexesToCurrent[items[0].index] })).done(function() { d.resolve(applyingItemIndexesToCurrent) }); return d }; var updateHeaderItems = function(headerItems, newHeaderItems) { var d = $.Deferred(); var applyingItemIndexesToCurrent = []; when(foreachTreeAsync(headerItems, function(items) { delete items[0].collapsedChildren })).done(function() { when(foreachTreeAsync(newHeaderItems, function(items) { var headerItem = findHeaderItem(headerItems, createPath(items)); if (headerItem) { applyingItemIndexesToCurrent[items[0].index] = headerItem.index } })).done(function() { d.resolve(applyingItemIndexesToCurrent) }) }); return d }; var updateDataSourceCells = function(dataSource, newDataSourceCells, newRowItemIndexesToCurrent, newColumnItemIndexesToCurrent) { var newRowIndex, newColumnIndex, newRowCells, newCell, rowIndex, columnIndex, dataSourceCells = dataSource.values; if (newDataSourceCells) { for (newRowIndex = 0; newRowIndex <= newDataSourceCells.length; newRowIndex++) { newRowCells = newDataSourceCells[newRowIndex]; rowIndex = newRowItemIndexesToCurrent[newRowIndex]; if (!isDefined(rowIndex)) { rowIndex = dataSource.grandTotalRowIndex } if (newRowCells && isDefined(rowIndex)) { if (!dataSourceCells[rowIndex]) { dataSourceCells[rowIndex] = [] } for (newColumnIndex = 0; newColumnIndex <= newRowCells.length; newColumnIndex++) { newCell = newRowCells[newColumnIndex]; columnIndex = newColumnItemIndexesToCurrent[newColumnIndex]; if (!isDefined(columnIndex)) { columnIndex = dataSource.grandTotalColumnIndex } if (isDefined(newCell) && isDefined(columnIndex)) { dataSourceCells[rowIndex][columnIndex] = newCell } } } } } }; function createLocalOrRemoteStore(dataSourceOptions) { var StoreConstructor = dataSourceOptions.remoteOperations ? RemoteStore : localStore.LocalStore; return new StoreConstructor(extend(DataSourceModule.normalizeDataSourceOptions(dataSourceOptions), { onChanged: null })) } function createStore(dataSourceOptions) { var store, storeOptions; if (typeUtils.isPlainObject(dataSourceOptions) && dataSourceOptions.load) { store = createLocalOrRemoteStore(dataSourceOptions) } else { if (dataSourceOptions && !dataSourceOptions.store) { dataSourceOptions = { store: dataSourceOptions } } storeOptions = dataSourceOptions.store; if ("xmla" === storeOptions.type) { store = new xmlaStore.XmlaStore(storeOptions) } else { if (typeUtils.isPlainObject(storeOptions) && storeOptions.type || storeOptions instanceof Store || Array.isArray(storeOptions)) { store = createLocalOrRemoteStore(dataSourceOptions) } else { if (storeOptions instanceof Class) { store = storeOptions } } } } return store } function equalFields(fields, prevFields, count) { for (var i = 0; i < count; i++) { if (!fields[i] || !prevFields[i] || fields[i].index !== prevFields[i].index) { return false } } return true } function getExpandedPaths(dataSource, loadOptions, dimensionName, prevLoadOptions) { var result = [], fields = loadOptions && loadOptions[dimensionName] || [], prevFields = prevLoadOptions && prevLoadOptions[dimensionName] || []; foreachTree(dataSource[dimensionName], function(items) { var item = items[0], path = createPath(items); if (item.children && fields[path.length - 1] && !fields[path.length - 1].expanded) { if (path.length < fields.length && (!prevLoadOptions || equalFields(fields, prevFields, path.length))) { result.push(path.slice()) } } }, true); return result } function setFieldProperties(field, srcField, skipInitPropertySave, properties) { if (srcField) { each(properties, function(_, name) { if (skipInitPropertySave) { field[name] = srcField[name] } else { if (("summaryType" === name || "summaryDisplayMode" === name) && void 0 === srcField[name]) { return } setFieldProperty(field, name, srcField[name]) } }) } else { resetFieldState(field, properties) } return field } function getFieldsState(fields, properties) { var result = []; each(fields, function(_, field) { result.push(setFieldProperties({ dataField: field.dataField, name: field.name }, field, true, properties)) }); return result } function getFieldStateId(field) { if (field.name) { return field.name } return field.dataField + "" } function getFieldsById(fields, id) { var result = []; each(fields || [], function(_, field) { if (getFieldStateId(field) === id) { result.push(field) } }); return result } function setFieldsStateCore(stateFields, fields) { stateFields = stateFields || []; each(fields, function(index, field) { setFieldProperties(field, stateFields[index], false, STATE_PROPERTIES); updateCalculatedFieldProperties(field, CALCULATED_PROPERTIES) }); return fields } function setFieldsState(stateFields, fields) { stateFields = stateFields || []; var id, fieldsById = {}; each(fields, function(_, field) { id = getFieldStateId(field); if (!fieldsById[id]) { fieldsById[id] = getFieldsById(fields, getFieldStateId(field)) } }); each(fieldsById, function(id, fields) { setFieldsStateCore(getFieldsById(stateFields, id), fields) }); return fields } function getFieldsByGroup(fields, groupingField) { return $.map(fields, function(field) { if (field.groupName === groupingField.groupName && commonUtils.isNumeric(field.groupIndex) && false !== field.visible) { return extend(field, { areaIndex: groupingField.areaIndex, area: groupingField.area, expanded: isDefined(field.expanded) ? field.expanded : groupingField.expanded, dataField: field.dataField || groupingField.dataField, dataType: field.dataType || groupingField.dataType, sortBy: field.sortBy || groupingField.sortBy, sortOrder: field.sortOrder || groupingField.sortOrder, sortBySummaryField: field.sortBySummaryField || groupingField.sortBySummaryField, sortBySummaryPath: field.sortBySummaryPath || groupingField.sortBySummaryPath, visible: field.visible || groupingField.visible, showTotals: isDefined(field.showTotals) ? field.showTotals : groupingField.showTotals, showGrandTotals: isDefined(field.showGrandTotals) ? field.showGrandTotals : groupingField.showGrandTotals }) } return null }).sort(function(a, b) { return a.groupIndex - b.groupIndex }) } function sortFieldsByAreaIndex(fields) { fields.sort(function(field1, field2) { return field1.areaIndex - field2.areaIndex || field1.groupIndex - field2.groupIndex }) } function isAreaField(field, area) { var canAddFieldInArea = "data" === area || false !== field.visible; return field.area === area && !isDefined(field.groupIndex) && canAddFieldInArea } function getFieldId(field, retrieveFieldsOptionValue) { var groupName = field.groupName || ""; return (field.dataField || groupName) + (field.groupInterval ? groupName + field.groupInterval : "NOGROUP") + (retrieveFieldsOptionValue ? "" : groupName) } function mergeFields(fields, storeFields, retrieveFieldsOptionValue) { var result = [], fieldsDictionary = {}, removedFields = {}, mergedGroups = [], dataTypes = pivotGridUtils.getFieldsDataType(fields); if (storeFields) { each(storeFields, function(_, field) { fieldsDictionary[getFieldId(field, retrieveFieldsOptionValue)] = field }); each(fields, function(_, field) { var mergedField, fieldKey = getFieldId(field, retrieveFieldsOptionValue), storeField = fieldsDictionary[fieldKey] || removedFields[fieldKey]; if (storeField) { if (storeField._initProperties) { resetFieldState(storeField, ALL_CALCULATED_PROPERTIES) } mergedField = extend({}, storeField, field, { _initProperties: null }) } else { fieldsDictionary[fieldKey] = mergedField = field } extend(mergedField, { dataType: dataTypes[field.dataField] }); delete fieldsDictionary[fieldKey]; removedFields[fieldKey] = storeField; result.push(mergedField) }); if (retrieveFieldsOptionValue) { each(fieldsDictionary, function(_, field) { result.push(field) }) } } else { result = fields } result.push.apply(result, mergedGroups); return result } function getFields(that) { var mergedFields, result = $.Deferred(), store = that._store, storeFields = store && store.getFields(that._fields); when(storeFields).done(function(storeFields) { that._storeFields = storeFields; mergedFields = mergeFields(that._fields, storeFields, that._retrieveFields); result.resolve(mergedFields) }).fail(function() { result.resolve(that._fields) }); return result } function getSliceIndex(items, path) { var index = null, pathValue = (path || []).join("."); if (pathValue.length) { foreachTree(items, function(items) { var item = items[0], itemPath = createPath(items).join("."), textPath = $.map(items, function(item) { return item.text }).reverse().join("."); if (pathValue === itemPath || item.key && textPath === pathValue) { index = items[0].index; return false } }) } return index } function getFieldSummaryValueSelector(field, dataSource, loadOptions, dimensionName) { var values = dataSource.values, sortBySummaryFieldIndex = findField(loadOptions.values, field.sortBySummaryField), areRows = "rows" === dimensionName, sortByDimension = areRows ? dataSource.columns : dataSource.rows, grandTotalIndex = areRows ? dataSource.grandTotalRowIndex : dataSource.grandTotalColumnIndex, sortBySummaryPath = field.sortBySummaryPath || [], sliceIndex = sortBySummaryPath.length ? getSliceIndex(sortByDimension, sortBySummaryPath) : grandTotalIndex; if (values && values.length && sortBySummaryFieldIndex >= 0 && isDefined(sliceIndex)) { return function(field) { var rowIndex = areRows ? field.index : sliceIndex, columnIndex = areRows ? sliceIndex : field.index; return ((values[rowIndex] || [ [] ])[columnIndex] || [])[sortBySummaryFieldIndex] || null } } } function getSortingMethod(field, dataSource, loadOptions, dimensionName, getAscOrder) { var sortOrder = getAscOrder ? "asc" : field.sortOrder, sortBy = getAscOrder ? "value" : "displayText" === field.sortBy ? "text" : "value", defaultCompare = field.sortingMethod ? function(a, b) { return field.sortingMethod(a, b) } : getCompareFunction(function(item) { return item[sortBy] }), summaryValueSelector = !getAscOrder && getFieldSummaryValueSelector(field, dataSource, loadOptions, dimensionName), summaryCompare = summaryValueSelector && getCompareFunction(summaryValueSelector), sortingMethod = function(a, b) { var result = summaryCompare && summaryCompare(a, b) || 0; if (0 === result) { result = defaultCompare(a, b) } return "desc" === sortOrder ? -result : result }; return sortingMethod } function sortDimension(dataSource, loadOptions, dimensionName, getAscOrder) { var fields = loadOptions[dimensionName] || [], baseIndex = loadOptions.headerName === dimensionName ? loadOptions.path.length : 0, sortingMethodByLevel = []; foreachDataLevel(dataSource[dimensionName], function(item, index) { var field = fields[index] || {}, sortingMethod = sortingMethodByLevel[index] = sortingMethodByLevel[index] || getSortingMethod(field, dataSource, loadOptions, dimensionName, getAscOrder); item.sort(sortingMethod) }, baseIndex) } function sort(loadOptions, dataSource, getAscOrder) { sortDimension(dataSource, loadOptions, "rows", getAscOrder); sortDimension(dataSource, loadOptions, "columns", getAscOrder) } function formatHeaderItems(data, loadOptions, headerName) { return foreachTreeAsync(data[headerName], function(items) { var item = items[0]; item.text = item.text || formatValue(item.value, loadOptions[headerName][createPath(items).length - 1]) }) } function formatHeaders(loadOptions, data) { return when(formatHeaderItems(data, loadOptions, "columns"), formatHeaderItems(data, loadOptions, "rows")) } function updateCache(headerItems) { var d = $.Deferred(); var cacheByPath = {}; when(foreachTreeAsync(headerItems, function(items) { var path = createPath(items).join("."); cacheByPath[path] = items[0] })).done(d.resolve); headerItems._cacheByPath = cacheByPath; return d } function getAreaFields(fields, area) { var areaFields = []; each(fields, function() { if (isAreaField(this, area)) { areaFields.push(this) } }); return areaFields } exports.sort = sort; return { ctor: function(options) { options = options || {}; var that = this, store = createStore(options); that._store = store; that._data = { rows: [], columns: [], values: [] }; that._loadingCount = 0; each(["changed", "loadError", "loadingChanged", "fieldsPrepared", "expandValueChanging"], function(_, eventName) { var optionName = "on" + eventName[0].toUpperCase() + eventName.slice(1); if (options.hasOwnProperty(optionName)) { this.on(eventName, options[optionName]) } }.bind(this)); that._retrieveFields = isDefined(options.retrieveFields) ? options.retrieveFields : true; that._fields = options.fields || []; that._descriptions = options.descriptions ? extend(that._createDescriptions(), options.descriptions) : void 0; if (!store) { extend(true, that._data, options.store || options) } }, getData: function() { return this._data }, getAreaFields: function(area, collectGroups) { var descriptions, areaFields = []; if (collectGroups || "data" === area) { areaFields = getAreaFields(this._fields, area); sortFieldsByAreaIndex(areaFields) } else { descriptions = this._descriptions || {}; areaFields = descriptions[DESCRIPTION_NAME_BY_AREA[area]] || [] } return areaFields }, fields: function(fields) { var that = this; if (fields) { that._fields = mergeFields(fields, that._storeFields, that._retrieveFields); that._fieldsPrepared(that._fields) } return that._fields }, field: function(id, options) { var levels, that = this, fields = that._fields, field = fields && fields[commonUtils.isNumeric(id) ? id : findField(fields, id)]; if (field && options) { each(options, function(optionName, optionValue) { var isInitialization = inArray(optionName, STATE_PROPERTIES) < 0; setFieldProperty(field, optionName, optionValue, isInitialization); if ("sortOrder" === optionName) { levels = field.levels || []; for (var i = 0; i < levels.length; i++) { levels[i][optionName] = optionValue } } }); updateCalculatedFieldProperties(field, CALCULATED_PROPERTIES); that._descriptions = that._createDescriptions(field) } return field }, getFieldValues: function(index) { var that = this, field = this._fields && this._fields[index], store = this.store(), loadFields = [], loadOptions = { columns: loadFields, rows: [], values: this.getAreaFields("data"), filters: [] }, d = $.Deferred(); if (field && store) { each(field.levels || [field], function() { loadFields.push(extend({}, this, { expanded: true, filterValues: null, sortOrder: "asc", sortBySummaryField: null })) }); store.load(loadOptions).done(function(data) { formatHeaders(loadOptions, data); that._sort(loadOptions, data); d.resolve(data.columns) }).fail(d) } else { d.reject() } return d }, reload: function() { return this.load({ reload: true }) }, filter: function() { var store = this._store; return store.filter.apply(store, arguments) }, load: function(options) { var that = this, d = $.Deferred(); options = options || {}; that._changeLoadingCount(1); d.progress(function(progress) { that._changeLoadingCount(0, .8 * progress) }); d.fail(function(e) { that.fireEvent("loadError", [e]) }).always(function() { that._changeLoadingCount(-1) }); function loadTask() { that._delayedLoadTask = void 0; if (!that._descriptions) { when(getFields(that)).done(function(fields) { that._fieldsPrepared(fields); that._loadCore(options, d) }).fail(d.reject).fail(that._loadErrorHandler) } else { that._loadCore(options, d) } } if (that.store()) { that._delayedLoadTask = commonUtils.executeAsync(loadTask) } else { loadTask() } return d }, createDrillDownDataSource: function(params) { return this._store.createDrillDownDataSource(this._descriptions, params) }, _createDescriptions: function(currentField) { var that = this, fields = that.fields(), descriptions = { rows: [], columns: [], values: [], filters: [] }; each(["row", "column", "data", "filter"], function(_, areaName) { normalizeIndexes(getAreaFields(fields, areaName), "areaIndex", currentField) }); each(fields || [], function(_, field) { var descriptionName = DESCRIPTION_NAME_BY_AREA[field.area], dimension = descriptions[descriptionName], groupName = field.groupName; if (groupName && !commonUtils.isNumeric(field.groupIndex)) { field.levels = getFieldsByGroup(fields, field) } if (!dimension || groupName && commonUtils.isNumeric(field.groupIndex) || false === field.visible && "data" !== field.area && "filter" !== field.area) { return } if (field.levels && dimension !== descriptions.filters && dimension !== descriptions.values) { dimension.push.apply(dimension, field.levels); if (field.filterValues && field.filterValues.length) { descriptions.filters.push(field) } } else { dimension.push(field) } }); each(descriptions, function(_, fields) { sortFieldsByAreaIndex(fields) }); var indices = {}; each(descriptions.values, function(_, field) { var expression = field.calculateSummaryValue; if (commonUtils.isFunction(expression)) { var summaryCell = summaryDisplayModes.createMockSummaryCell(descriptions, fields, indices); expression(summaryCell) } }); return descriptions }, _fieldsPrepared: function(fields) { var that = this; that._fields = fields; each(fields, function(index, field) { field.index = index; updateCalculatedFieldProperties(field, ALL_CALCULATED_PROPERTIES) }); var currentFieldState = getFieldsState(fields, ["caption"]); that.fireEvent("fieldsPrepared", [fields]); for (var i = 0; i < fields.length; i++) { if (fields[i].caption !== currentFieldState[i].caption) { setFieldProperty(fields[i], "caption", fields[i].caption, true) } } that._descriptions = that._createDescriptions() }, isLoading: function() { return this._loadingCount > 0 }, state: function(state) { var that = this; if (arguments.length) { state = extend({ rowExpandedPaths: [], columnExpandedPaths: [] }, state); if (!that._descriptions) { that._changeLoadingCount(1); when(getFields(that)).done(function(fields) { that._fields = setFieldsState(state.fields, fields); that._fieldsPrepared(fields); that.load(state) }).always(function() { that._changeLoadingCount(-1) }) } else { that._fields = setFieldsState(state.fields, that._fields); that._descriptions = that._createDescriptions(); that.load(state) } } else { return { fields: getFieldsState(that._fields, STATE_PROPERTIES), columnExpandedPaths: getExpandedPaths(that._data, that._descriptions, "columns"), rowExpandedPaths: getExpandedPaths(that._data, that._descriptions, "rows") } } }, _changeLoadingCount: function(increment, progress) { var newLoading, oldLoading = this.isLoading(); this._loadingCount += increment; newLoading = this.isLoading(); if (oldLoading ^ newLoading || progress) { this.fireEvent("loadingChanged", [newLoading, progress]) } }, _loadCore: function(options, deferred) { var that = this, store = this._store, descriptions = this._descriptions, headerName = DESCRIPTION_NAME_BY_AREA[options.area]; options = options || {}; if (store) { extend(options, descriptions); options.columnExpandedPaths = options.columnExpandedPaths || getExpandedPaths(this._data, options, "columns", that._lastLoadOptions); options.rowExpandedPaths = options.rowExpandedPaths || getExpandedPaths(this._data, options, "rows", that._lastLoadOptions); if (headerName) { options.headerName = headerName } that._changeLoadingCount(1); deferred.always(function() { that._changeLoadingCount(-1) }); when(store.load(options)).progress(deferred.notify).done(function(data) { if (options.path) { that.applyPartialDataSource(options.area, options.path, data, deferred) } else { extend(that._data, data); that._lastLoadOptions = options; that._update(deferred) } }).fail(deferred.reject) } else { that._update(deferred) } }, _sort: function(descriptions, data, getAscOrder) { var store = this._store; if (store) { sort(descriptions, data, getAscOrder) } }, _update: function(deferred) { var that = this, descriptions = that._descriptions, loadedData = that._data, dataFields = descriptions.values, expressionsUsed = areExpressionsUsed(dataFields); when(formatHeaders(descriptions, loadedData), updateCache(loadedData.rows), updateCache(loadedData.columns)).done(function() { if (expressionsUsed) { that._sort(descriptions, loadedData, expressionsUsed); summaryDisplayModes.applyDisplaySummaryMode(descriptions, loadedData) } that._sort(descriptions, loadedData); isRunningTotalUsed(dataFields) && summaryDisplayModes.applyRunningTotal(descriptions, loadedData); that._data = loadedData; when(deferred).done(function() { that.fireEvent("changed"); if (isDefined(that._data.grandTotalRowIndex)) { loadedData.grandTotalRowIndex = that._data.grandTotalRowIndex } if (isDefined(that._data.grandTotalColumnIndex)) { loadedData.grandTotalColumnIndex = that._data.grandTotalColumnIndex } }); deferred && deferred.resolve(that._data) }) }, store: function() { return this._store }, collapseHeaderItem: function(area, path) { var that = this, headerItems = "column" === area ? that._data.columns : that._data.rows, headerItem = findHeaderItem(headerItems, path), field = that.getAreaFields(area)[path.length - 1]; if (headerItem && headerItem.children) { that.fireEvent("expandValueChanging", [{ area: area, path: path, expanded: false }]); if (field) { field.expanded = false } headerItem.collapsedChildren = headerItem.children; delete headerItem.children; that._update(); return true } return false }, collapseAll: function(id) { var dataChanged = false, field = this.field(id) || {}, areaOffset = inArray(field, this.getAreaFields(field.area)); field.expanded = false; foreachTree(this._data[field.area + "s"], function(items) { var item = items[0], path = createPath(items); if (item && item.children && areaOffset === path.length - 1) { item.collapsedChildren = item.children; delete item.children; dataChanged = true } }, true); dataChanged && this._update() }, expandAll: function(id) { var field = this.field(id); if (field && field.area) { field.expanded = true; this.load() } }, expandHeaderItem: function(area, path) { var hasCache, options, that = this, headerItems = "column" === area ? that._data.columns : that._data.rows, headerItem = findHeaderItem(headerItems, path); if (headerItem && !headerItem.children) { hasCache = !!headerItem.collapsedChildren; options = { area: area, path: path, expanded: true, needExpandData: !hasCache }; that.fireEvent("expandValueChanging", [options]); if (hasCache) { headerItem.children = headerItem.collapsedChildren; delete headerItem.collapsedChildren; that._update() } else { that.load(options) } return hasCache } return false }, applyPartialDataSource: function(area, path, dataSource, deferred) { var headerItem, newRowItemIndexesToCurrent, newColumnItemIndexesToCurrent, that = this, loadedData = that._data, headerItems = "column" === area ? loadedData.columns : loadedData.rows; if (dataSource && dataSource.values) { dataSource.rows = dataSource.rows || []; dataSource.columns = dataSource.columns || []; headerItem = findHeaderItem(headerItems, path); if (headerItem) { if ("column" === area) { newColumnItemIndexesToCurrent = updateHeaderItemChildren(headerItems, headerItem, dataSource.columns, loadedData.grandTotalColumnIndex); newRowItemIndexesToCurrent = updateHeaderItems(loadedData.rows, dataSource.rows) } else { newRowItemIndexesToCurrent = updateHeaderItemChildren(headerItems, headerItem, dataSource.rows, loadedData.grandTotalRowIndex); newColumnItemIndexesToCurrent = updateHeaderItems(loadedData.columns, dataSource.columns) } when(newRowItemIndexesToCurrent, newColumnItemIndexesToCurrent).done(function(newRowItemIndexesToCurrent, newColumnItemIndexesToCurrent) { updateDataSourceCells(loadedData, dataSource.values, newRowItemIndexesToCurrent, newColumnItemIndexesToCurrent); that._update(deferred) }) } } }, dispose: function() { var that = this, delayedLoadTask = that._delayedLoadTask; this._disposeEvents(); if (delayedLoadTask) { delayedLoadTask.abort() } this._isDisposed = true }, isDisposed: function() { return !!this._isDisposed } } }()).include(EventsMixin); module.exports.sort = exports.sort }, /*!*****************************************!*\ !*** ./js/ui/pivot_grid/local_store.js ***! \*****************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when, dataUtils = __webpack_require__( /*! ../../data/utils */ 137), dataQuery = __webpack_require__( /*! ../../data/query */ 159), dateSerialization = __webpack_require__( /*! ../../core/utils/date_serialization */ 259), DataSourceModule = __webpack_require__( /*! ../../data/data_source/data_source */ 153), CustomStore = __webpack_require__( /*! ../../data/custom_store */ 162), dataCoreUtils = __webpack_require__( /*! ../../core/utils/data */ 50), Class = __webpack_require__( /*! ../../core/class */ 25), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), pivotGridUtils = __webpack_require__( /*! ./ui.pivot_grid.utils */ 450), getFiltersByPath = pivotGridUtils.getFiltersByPath, setFieldProperty = pivotGridUtils.setFieldProperty, ArrayStore = __webpack_require__( /*! ../../data/array_store */ 158); exports.LocalStore = Class.inherit(function() { var DATE_INTERVAL_SELECTORS = { year: function(date) { return date && date.getFullYear() }, quarter: function(date) { return date && Math.floor(date.getMonth() / 3) + 1 }, month: function(date) { return date && date.getMonth() + 1 }, day: function(date) { return date && date.getDate() }, dayOfWeek: function(date) { return date && date.getDay() } }; function getDataSelector(dataField) { return dataField.indexOf(".") !== -1 ? dataCoreUtils.compileGetter(dataField) : function(data) { return data[dataField] } } function getDateValue(dataSelector) { return function(data) { var value = dataSelector(data); if (value && !(value instanceof Date)) { value = dateSerialization.deserializeDate(value) } return value } } function prepareFields(fields) { $.each(fields || [], function(_, field) { var fieldSelector, intervalSelector, groupInterval, dataSelector, dataField = field.dataField, levels = field.levels; if (!field.selector) { if (!dataField) { dataSelector = function(data) { return data } } else { dataSelector = getDataSelector(dataField) } if (levels) { prepareFields(levels) } if ("date" === field.dataType) { intervalSelector = DATE_INTERVAL_SELECTORS[field.groupInterval]; var valueSelector = getDateValue(dataSelector); fieldSelector = function(data) { var value = valueSelector(data); return intervalSelector ? intervalSelector(value) : value } } else { if ("number" === field.dataType) { groupInterval = commonUtils.isNumeric(field.groupInterval) && field.groupInterval > 0 && field.groupInterval; fieldSelector = function(data) { var value = dataSelector(data); if (commonUtils.isString(value)) { value = Number(value) } return groupInterval ? Math.floor(value / groupInterval) * groupInterval : value } } else { fieldSelector = dataSelector } } pivotGridUtils.setDefaultFieldValueFormatting(field); setFieldProperty(field, "selector", fieldSelector) } }) } var addHierarchyItem = function(value, hierarchyItems, pathHash, childrenHash) { var hierarchyItem = childrenHash[pathHash]; if (!hierarchyItem) { hierarchyItem = { value: value, index: childrenHash.length++ }; childrenHash[pathHash] = hierarchyItem; hierarchyItems.push(hierarchyItem) } return hierarchyItem }; function fillHierarchyItemIndexesCore(indexes, options, children, expandIndex, pathHash) { var dimensionValue, hierarchyItem, dimension = options.dimensions[expandIndex], expandedPathsHash = options.expandedPathsHash; if (dimension) { dimensionValue = dimension.selector(options.data); pathHash = void 0 !== pathHash ? pathHash + "." + dimensionValue : dimensionValue + ""; hierarchyItem = addHierarchyItem(dimensionValue, children, pathHash, options.childrenHash); indexes.push(hierarchyItem.index); if (expandedPathsHash && expandedPathsHash[pathHash] || dimension.expanded) { if (!hierarchyItem.children) { hierarchyItem.children = [] } fillHierarchyItemIndexesCore(indexes, options, hierarchyItem.children, expandIndex + 1, pathHash) } } } function generateHierarchyItems(data, loadOptions, headers, headerName) { var result = [0], expandIndex = loadOptions.headerName === headerName ? loadOptions.path.length : 0, expandedPaths = "rows" === headerName ? loadOptions.rowExpandedPaths : loadOptions.columnExpandedPaths, options = { data: data, childrenHash: headers[headerName + "Hash"], dimensions: loadOptions[headerName], expandedPathsHash: loadOptions.headerName !== headerName && expandedPaths && expandedPaths.hash }; fillHierarchyItemIndexesCore(result, options, headers[headerName], expandIndex); return result } function generateAggregationCells(data, cells, headers, options) { var x, y, rowIndex, columnIndex, cellSet = []; var rowIndexes = generateHierarchyItems(data, options, headers, "rows"); var columnIndexes = generateHierarchyItems(data, options, headers, "columns"); for (y = 0; y < rowIndexes.length; y++) { rowIndex = rowIndexes[y]; cells[rowIndex] = cells[rowIndex] || []; for (x = 0; x < columnIndexes.length; x++) { columnIndex = columnIndexes[x]; cellSet.push(cells[rowIndex][columnIndex] = cells[rowIndex][columnIndex] || []) } } return cellSet } function fillHashExpandedPath(expandedPaths) { if (expandedPaths) { var hash = expandedPaths.hash = {}; expandedPaths.forEach(function(path) { var pathValue = path.map(function(value) { return value + "" }).join("."); hash[pathValue] = true }) } } function prepareLoadOption(options) { options.rows = options.rows || []; options.columns = options.columns || []; options.filters = options.filters || []; fillHashExpandedPath(options.columnExpandedPaths); fillHashExpandedPath(options.rowExpandedPaths); prepareFields(options.columns); prepareFields(options.rows); prepareFields(options.values); prepareFields(options.filters) } function getAggregator(field) { if ("custom" === field.summaryType) { field.calculateCustomSummary = field.calculateCustomSummary || commonUtils.noop; return { seed: function() { var options = { summaryProcess: "start", totalValue: void 0 }; field.calculateCustomSummary(options); return options }, step: function(options, value) { options.summaryProcess = "calculate"; options.value = value; field.calculateCustomSummary(options); return options }, finalize: function(options) { options.summaryProcess = "finalize"; delete options.value; field.calculateCustomSummary(options); return options.totalValue } } } return dataUtils.aggregators[field.summaryType] || dataUtils.aggregators.count } function aggregationStep(measures, aggregationCells, data) { for (var aggregatorIndex = 0; aggregatorIndex < measures.length; aggregatorIndex++) { var cellField = measures[aggregatorIndex]; var cellValue = cellField.selector(data); var aggregator = getAggregator(cellField), isAggregatorSeedFunction = "function" === typeof aggregator.seed; for (var cellSetIndex = 0; cellSetIndex < aggregationCells.length; cellSetIndex++) { var cell = aggregationCells[cellSetIndex]; if (cell.length <= aggregatorIndex) { cell[aggregatorIndex] = isAggregatorSeedFunction ? aggregator.seed() : aggregator.seed } if (void 0 === cell[aggregatorIndex]) { cell[aggregatorIndex] = cellValue } else { if (commonUtils.isDefined(cellValue)) { cell[aggregatorIndex] = aggregator.step(cell[aggregatorIndex], cellValue) } } } } } function aggregationFinalize(measures, cells) { $.each(measures, function(aggregatorIndex, cellField) { var aggregator = getAggregator(cellField); if (aggregator.finalize) { $.each(cells, function(_, row) { $.each(row, function(_, cell) { if (cell && void 0 !== cell[aggregatorIndex]) { cell[aggregatorIndex] = aggregator.finalize(cell[aggregatorIndex]) } }) }) } }) } function areValuesEqual(filterValue, fieldValue) { var valueOfFilter = filterValue && filterValue.valueOf(), valueOfField = fieldValue && fieldValue.valueOf(); if (Array.isArray(filterValue)) { fieldValue = fieldValue || []; for (var i = 0; i < filterValue.length; i++) { valueOfFilter = filterValue[i] && filterValue[i].valueOf(); valueOfField = fieldValue[i] && fieldValue[i].valueOf(); if (valueOfFilter !== valueOfField) { return false } } return true } else { return valueOfFilter === valueOfField } } function getGroupValue(levels, data) { var value = []; $.each(levels, function(_, field) { value.push(field.selector(data)) }); return value } function createDimensionFilters(dimension) { var filters = []; $.each(dimension, function(_, field) { var filter, filterValues = field.filterValues || [], groupName = field.groupName; if (groupName && commonUtils.isNumeric(field.groupIndex)) { return } filter = function(dataItem) { var value = field.levels ? getGroupValue(field.levels, dataItem) : field.selector(dataItem), result = false; for (var i = 0; i < filterValues.length; i++) { if (areValuesEqual(filterValues[i], value)) { result = true; break } } return "exclude" === field.filterType ? !result : result }; filterValues.length && filters.push(filter) }); return filters } function createFilter(options) { var filters = createDimensionFilters(options.rows).concat(createDimensionFilters(options.columns)).concat(createDimensionFilters(options.filters)), expandedDimensions = options[options.headerName], path = options.path; if (expandedDimensions) { filters.push(function(dataItem) { var expandValue; for (var i = 0; i < path.length; i++) { expandValue = expandedDimensions[i].selector(dataItem); if (dataCoreUtils.toComparable(expandValue, true) !== dataCoreUtils.toComparable(path[i], true)) { return false } } return true }) } return function(dataItem) { for (var i = 0; i < filters.length; i++) { if (!filters[i](dataItem)) { return false } } return true } } function loadCore(items, options) { var aggregationCells, filter, data, headers = { columns: [], rows: [], columnsHash: { length: 1 }, rowsHash: { length: 1 } }, values = [], d = $.Deferred(), i = 0; filter = createFilter(options); function processData() { var t = new Date, startIndex = i; for (; i < items.length; i++) { if (i > startIndex && i % 1e4 === 0) { if (new Date - t >= 300) { d.notify(i / items.length); setTimeout(processData, 0); return } } data = items[i]; if (filter(data)) { aggregationCells = generateAggregationCells(data, values, headers, options); aggregationStep(options.values, aggregationCells, data) } } aggregationFinalize(options.values, values); d.notify(1); d.resolve({ rows: headers.rows, columns: headers.columns, values: values, grandTotalRowIndex: 0, grandTotalColumnIndex: 0 }) } processData(); return d } function filterDataSource(dataSource, fieldSelectors) { var filter = dataSource.filter(); if (dataSource.store() instanceof CustomStore && filter) { filter = processFilter(filter, fieldSelectors); return dataQuery(dataSource.items()).filter(filter).toArray() } return dataSource.items() } function loadDataSource(dataSource, fieldSelectors, reload) { var d = $.Deferred(); var customizeStoreLoadOptionsHandler = function(options) { if (dataSource.store() instanceof ArrayStore) { options.storeLoadOptions.filter = processFilter(options.storeLoadOptions.filter, fieldSelectors) } }; dataSource.on("customizeStoreLoadOptions", customizeStoreLoadOptionsHandler); if (!dataSource.isLoaded() || reload) { var loadDeferred = reload ? dataSource.load() : dataSource.reload(); when(loadDeferred).done(function() { loadDataSource(dataSource, fieldSelectors).done(function() { d.resolve(filterDataSource(dataSource, fieldSelectors)) }).fail(d.reject) }).fail(d.reject) } else { d.resolve(filterDataSource(dataSource, fieldSelectors)) } return d.always(function() { dataSource.off("customizeStoreLoadOptions", customizeStoreLoadOptionsHandler) }) } function fillSelectorsByFields(selectors, fields) { fields.forEach(function(field) { if (field.dataField && "date" === field.dataType) { var valueSelector = getDateValue(getDataSelector(field.dataField)); selectors[field.dataField] = function(data) { return valueSelector(data) } } }) } function getFieldSelectors(options) { var selectors = {}; if (Array.isArray(options)) { fillSelectorsByFields(selectors, options) } else { if (options) { ["rows", "columns", "filters"].forEach(function(area) { options[area] && fillSelectorsByFields(selectors, options[area]) }) } } return selectors } function processFilter(filter, fieldSelectors) { if (!Array.isArray(filter)) { return filter } filter = filter.slice(0); if (commonUtils.isString(filter[0]) && (filter[1] instanceof Date || filter[2] instanceof Date)) { filter[0] = fieldSelectors[filter[0]] } for (var i = 0; i < filter.length; i++) { filter[i] = processFilter(filter[i], fieldSelectors) } return filter } return { ctor: function(options) { this._dataSource = new DataSourceModule.DataSource(options); this._dataSource.paginate(false) }, getFields: function(fields) { var that = this, dataSource = that._dataSource, d = $.Deferred(); loadDataSource(dataSource, getFieldSelectors(fields)).done(function(data) { d.resolve(pivotGridUtils.discoverObjectFields(data, fields)) }).fail(d.reject); return d }, key: function() { return this._dataSource.key() }, load: function(options) { var that = this, dataSource = that._dataSource, d = $.Deferred(); prepareLoadOption(options); loadDataSource(dataSource, getFieldSelectors(options), options.reload).done(function(data) { when(loadCore(data, options)).progress(d.notify).done(d.resolve) }).fail(d.reject); return d }, filter: function() { var dataSource = this._dataSource; return dataSource.filter.apply(dataSource, arguments) }, supportSorting: function() { return false }, getDrillDownItems: function(loadOptions, params) { loadOptions = loadOptions || {}; params = params || {}; prepareLoadOption(loadOptions); var item, drillDownItems = [], items = this._dataSource.items(), maxRowCount = params.maxRowCount, customColumns = params.customColumns, filter = createFilter(loadOptions), pathFilter = createFilter({ rows: getFiltersByPath(loadOptions.rows, params.rowPath), columns: getFiltersByPath(loadOptions.columns, params.columnPath), filters: [] }); for (var i = 0; i < items.length; i++) { if (pathFilter(items[i]) && filter(items[i])) { if (customColumns) { item = {}; for (var j = 0; j < customColumns.length; j++) { item[customColumns[j]] = items[i][customColumns[j]] } } else { item = items[i] } drillDownItems.push(item) } if (maxRowCount > 0 && drillDownItems.length === maxRowCount) { break } } return drillDownItems } } }()).include(pivotGridUtils.storeDrillDownMixin) }, /*!******************************************!*\ !*** ./js/ui/pivot_grid/remote_store.js ***! \******************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, DataSourceModule = __webpack_require__( /*! ../../data/data_source/data_source */ 153), when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when, pivotGridUtils = __webpack_require__( /*! ./ui.pivot_grid.utils */ 450), getFiltersByPath = pivotGridUtils.getFiltersByPath; function createGroupingOptions(dimensionOptions) { var groupingOptions = []; $.each(dimensionOptions, function(index, dimensionOption) { groupingOptions.push({ selector: dimensionOption.dataField, groupInterval: dimensionOption.groupInterval, isExpanded: index < dimensionOptions.length - 1 }) }); return groupingOptions } function getFieldFilterSelector(field) { var selector = field.dataField, groupInterval = field.groupInterval; if ("date" === field.dataType && "string" === typeof groupInterval) { if ("quarter" === groupInterval.toLowerCase()) { groupInterval = "Month" } selector = selector + "." + pivotGridUtils.capitalizeFirstLetter(groupInterval) } return selector } function getIntervalFilterExpression(selector, numericInterval, numericValue, isExcludedFilterType) { var startFilterValue = [selector, isExcludedFilterType ? "<" : ">=", numericValue], endFilterValue = [selector, isExcludedFilterType ? ">=" : "<", numericValue + numericInterval]; return [startFilterValue, isExcludedFilterType ? "or" : "and", endFilterValue] } function getFilterExpressionForFilterValue(field, filterValue) { var selector = getFieldFilterSelector(field), isExcludedFilterType = "exclude" === field.filterType, expression = [selector, isExcludedFilterType ? "<>" : "=", filterValue]; if (commonUtils.isDefined(field.groupInterval)) { if ("string" === typeof field.groupInterval && "quarter" === field.groupInterval.toLowerCase()) { expression = getIntervalFilterExpression(selector, 3, 3 * (filterValue - 1) + 1, isExcludedFilterType) } else { if ("number" === typeof field.groupInterval && "date" !== field.dataType) { expression = getIntervalFilterExpression(selector, field.groupInterval, filterValue, isExcludedFilterType) } } } return expression } function createFieldFilterExpressions(field, operation) { var fieldFilterExpressions = []; if ("exclude" === field.filterType) { operation = operation || "and" } else { operation = operation || "or" } $.each(field.filterValues, function(index, filterValue) { var currentExpression = [], currentField = field.levels ? field.levels[index] : field; if (Array.isArray(filterValue)) { var parseLevelsRecursive = field.levels && field.levels.length; if (parseLevelsRecursive) { currentExpression = createFieldFilterExpressions({ filterValues: filterValue, filterType: currentField.filterType, levels: field.levels }, "and") } } else { currentExpression = getFilterExpressionForFilterValue(currentField, filterValue) } if (!currentExpression.length) { return } if (fieldFilterExpressions.length) { fieldFilterExpressions.push(operation) } fieldFilterExpressions.push(currentExpression) }); return fieldFilterExpressions } function createFilterExpressions(fields) { var filterExpressions = []; $.each(fields, function(_, field) { var fieldExpressions = createFieldFilterExpressions(field); if (!fieldExpressions.length) { return [] } if (filterExpressions.length) { filterExpressions.push("and") } filterExpressions.push(fieldExpressions) }); if (1 === filterExpressions.length) { filterExpressions = filterExpressions[0] } return filterExpressions } function mergeFilters(filter1, filter2) { var mergedFilter, notEmpty = function(filter) { return filter && filter.length }; if (notEmpty(filter1) && notEmpty(filter2)) { mergedFilter = [filter1, "and", filter2] } else { mergedFilter = notEmpty(filter1) ? filter1 : filter2 } return mergedFilter } function createLoadOptions(options, externalFilterExpr) { var filterExpressions = createFilterExpressions(options.filters), groupingOptions = createGroupingOptions(options.rows).concat(createGroupingOptions(options.columns)), loadOptions = { groupSummary: [], totalSummary: [], group: groupingOptions.length ? groupingOptions : void 0, take: groupingOptions.length ? void 0 : 1 }; if (externalFilterExpr) { filterExpressions = mergeFilters(filterExpressions, externalFilterExpr) } if (filterExpressions.length) { loadOptions.filter = filterExpressions } $.each(options.values, function(_, value) { var summaryOption = { selector: value.dataField, summaryType: value.summaryType || "count" }; loadOptions.groupSummary.push(summaryOption); options.includeTotalSummary && loadOptions.totalSummary.push(summaryOption) }); return loadOptions } function forEachGroup(data, callback, level) { data = data || []; level = level || 0; $.each(data, function(_, group) { callback(group, level); if (group.items && group.items.length) { forEachGroup(group.items, callback, level + 1) } }) } function setValue(valuesArray, value, rowIndex, columnIndex, dataIndex) { valuesArray[rowIndex] = valuesArray[rowIndex] || []; valuesArray[rowIndex][columnIndex] = valuesArray[rowIndex][columnIndex] || []; valuesArray[rowIndex][columnIndex][dataIndex] = value } function parseResult(data, total, descriptions, result) { var rowPath = [], columnPath = [], rowHash = result.rowHash, columnHash = result.columnHash; if (total && total.summary) { $.each(total.summary, function(index, summary) { setValue(result.values, summary, result.grandTotalRowIndex, result.grandTotalColumnIndex, index) }) } function getItem(dataItem, dimensionName, path, level) { var parentItem, parentItemChildren, item, parentPathValue, dimensionHash = result[dimensionName + "Hash"], pathValue = path.slice(0, level + 1).join("/"); if (void 0 !== dimensionHash[pathValue]) { item = dimensionHash[pathValue] } else { item = { value: dataItem.key, index: result[dimensionName + "Index"]++ }; parentPathValue = path.slice(0, level).join("/"); if (level > 0 && void 0 !== dimensionHash[parentPathValue]) { parentItem = dimensionHash[parentPathValue]; parentItemChildren = parentItem.children = parentItem.children || [] } else { parentItemChildren = result[dimensionName + "s"] } parentItemChildren.push(item); dimensionHash[pathValue] = item } return item } forEachGroup(data, function(item, level) { var columnItem, rowItem, rowLevel = level >= descriptions.rows.length ? descriptions.rows.length : level, columnLevel = level >= descriptions.rows.length ? level - descriptions.rows.length : 0; if (level >= descriptions.rows.length && columnLevel >= descriptions.columns.length) { return } if (level < descriptions.rows.length) { columnPath = [] } if (level >= descriptions.rows.length) { columnPath[columnLevel] = item.key + ""; columnItem = getItem(item, "column", columnPath, columnLevel); rowItem = rowHash[rowPath.slice(0, rowLevel + 1).join("/")] } else { rowPath[rowLevel] = item.key + ""; rowItem = getItem(item, "row", rowPath, rowLevel); columnItem = columnHash[columnPath.slice(0, columnLevel + 1).join("/")] } var currentRowIndex = rowItem && rowItem.index || result.grandTotalRowIndex, currentColumnIndex = columnItem && columnItem.index || result.grandTotalColumnIndex; $.each(item.summary || [], function(i, summary) { setValue(result.values, summary, currentRowIndex, currentColumnIndex, i) }) }); return result } function getFiltersForDimension(dimensionOptions) { return commonUtils.grep(dimensionOptions || [], function(field) { return field.filterValues && field.filterValues.length }) } function getExpandedIndex(options, axis) { if (axis === options.headerName) { return options.path.length } return 0 } function getFiltersForExpandedDimension(options) { return getFiltersByPath(options[options.headerName], options.path) } function getExpandedPathSliceFilter(options, dimensionName, level, firstCollapsedFieldIndex) { var result = [], startSliceIndex = level > firstCollapsedFieldIndex ? 0 : firstCollapsedFieldIndex, fields = options.headerName !== dimensionName ? options[dimensionName].slice(startSliceIndex, level) : [], paths = "rows" === dimensionName ? options.rowExpandedPaths : options.columnExpandedPaths; $.each(fields, function(index, field) { var filterValues = []; $.each(paths, function(_, path) { path = path.slice(startSliceIndex, level); if (index < path.length) { filterValues.push(path[index]) } }); if (filterValues.length) { result.push(extend({}, field, { filterType: "include", filterValues: filterValues })) } }); return result } function getGrandTotalRequest(options, dimensionName, expandedIndex, expandedLevel, commonFilters, firstCollapsedFieldIndex) { var newOptions, expandedPaths = ("columns" === dimensionName ? options.columnExpandedPaths : options.rowExpandedPaths) || [], oppositeDimensionName = "columns" === dimensionName ? "rows" : "columns", fields = options[dimensionName], result = []; if (expandedPaths.length) { for (var i = expandedIndex; i < expandedLevel + 1; i++) { newOptions = { filters: commonFilters.concat(getExpandedPathSliceFilter(options, dimensionName, i, firstCollapsedFieldIndex)) }; newOptions[dimensionName] = fields.slice(expandedIndex, i + 1); newOptions[oppositeDimensionName] = []; if (i === expandedLevel) { newOptions.includeTotalSummary = true } result.push(extend({}, options, newOptions)) } } else { newOptions = { filters: commonFilters, includeTotalSummary: true }; newOptions[dimensionName] = fields.slice(expandedIndex, expandedLevel + 1); newOptions[oppositeDimensionName] = []; result.push(extend({}, options, newOptions)) } return result } function getFirstCollapsedIndex(fields) { var firstCollapsedIndex = 0; $.each(fields, function(index, field) { if (!field.expanded) { firstCollapsedIndex = index; return false } }); return firstCollapsedIndex } function getRequestsData(options) { var columnTotalsOptions, rowExpandedLevel = pivotGridUtils.getExpandedLevel(options, "rows"), columnExpandedLevel = pivotGridUtils.getExpandedLevel(options, "columns"), filters = options.filters || [], columnExpandedIndex = getExpandedIndex(options, "columns"), firstCollapsedColumnIndex = getFirstCollapsedIndex(options.columns), firstCollapsedRowIndex = getFirstCollapsedIndex(options.rows), rowExpandedIndex = getExpandedIndex(options, "rows"), data = []; filters = filters.concat(getFiltersForDimension(options.rows)).concat(getFiltersForDimension(options.columns)).concat(getFiltersForExpandedDimension(options)); columnTotalsOptions = getGrandTotalRequest(options, "columns", columnExpandedIndex, columnExpandedLevel, filters, firstCollapsedColumnIndex); if (options.rows.length && options.columns.length) { data = data.concat(columnTotalsOptions); for (var i = rowExpandedIndex; i < rowExpandedLevel + 1; i++) { var rows = options.rows.slice(rowExpandedIndex, i + 1), rowFilterByExpandedPaths = getExpandedPathSliceFilter(options, "rows", i, firstCollapsedRowIndex); for (var j = columnExpandedIndex; j < columnExpandedLevel + 1; j++) { var preparedOptions = extend({}, options, { columns: options.columns.slice(columnExpandedIndex, j + 1), rows: rows, filters: filters.concat(getExpandedPathSliceFilter(options, "columns", j, firstCollapsedColumnIndex)).concat(rowFilterByExpandedPaths) }); data.push(preparedOptions) } } } else { data = options.columns.length ? columnTotalsOptions : getGrandTotalRequest(options, "rows", rowExpandedIndex, rowExpandedLevel, filters, firstCollapsedRowIndex) } return data } function prepareFields(fields) { $.each(fields || [], function(_, field) { var levels = field.levels; if (levels) { prepareFields(levels) } pivotGridUtils.setDefaultFieldValueFormatting(field) }) } module.exports = Class.inherit(function() { return { ctor: function(options) { this._dataSource = new DataSourceModule.DataSource(options); this._store = this._dataSource.store() }, getFields: function(fields) { var d = $.Deferred(); this._store.load({ skip: 0, take: 20 }).done(function(data) { d.resolve(pivotGridUtils.discoverObjectFields(data, fields)) }).fail(d.reject); return d }, key: function() { return this._store.key() }, load: function(options) { var that = this, d = $.Deferred(), result = { rows: [], columns: [], values: [ [ [] ] ], grandTotalRowIndex: 0, grandTotalColumnIndex: 0, rowHash: {}, columnHash: {}, rowIndex: 1, columnIndex: 1 }, requestsData = getRequestsData(options), deferreds = []; prepareFields(options.rows); prepareFields(options.columns); prepareFields(options.filters); $.each(requestsData, function(_, dataItem) { deferreds.push(that._store.load(createLoadOptions(dataItem, that.filter()))) }); when.apply(null, deferreds).done(function() { var args = deferreds.length > 1 ? arguments : [arguments]; $.each(args, function(index, argument) { parseResult(argument[0], argument[1], requestsData[index], result) }); d.resolve({ rows: result.rows, columns: result.columns, values: result.values, grandTotalRowIndex: result.grandTotalRowIndex, grandTotalColumnIndex: result.grandTotalColumnIndex }) }).fail(d.reject); return d }, filter: function() { return this._dataSource.filter.apply(this._dataSource, arguments) }, supportSorting: function() { return false }, createDrillDownDataSource: function(loadOptions, params) { loadOptions = loadOptions || {}; params = params || {}; var store = this._store, filters = getFiltersByPath(loadOptions.rows, params.rowPath).concat(getFiltersByPath(loadOptions.columns, params.columnPath)).concat(getFiltersForDimension(loadOptions.rows)).concat(loadOptions.filters || []).concat(getFiltersForDimension(loadOptions.columns)), filterExp = createFilterExpressions(filters); return new DataSourceModule.DataSource({ load: function(loadOptions) { return store.load(extend({}, loadOptions, { filter: mergeFilters(filterExp, loadOptions.filter), select: params.customColumns })) } }) } } }()); module.exports.__forEachGroup = forEachGroup }, /*!***************************************************!*\ !*** ./js/ui/pivot_grid/xmla_store/xmla_store.js ***! \***************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../../core/renderer */ 9), Class = __webpack_require__( /*! ../../../core/class */ 25), stringFormat = __webpack_require__( /*! ../../../core/utils/string */ 18).format, errors = __webpack_require__( /*! ../../../data/errors */ 155).errors, commonUtils = __webpack_require__( /*! ../../../core/utils/common */ 14), inArray = __webpack_require__( /*! ../../../core/utils/array */ 26).inArray, pivotGridUtils = __webpack_require__( /*! ../ui.pivot_grid.utils */ 450), when = __webpack_require__( /*! ../../../integration/jquery/deferred */ 16).when, getLanguageId = __webpack_require__( /*! ../../../localization/language_codes */ 35).getLanguageId; exports.XmlaStore = Class.inherit(function() { var discover = '<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/"><Body><Discover xmlns="urn:schemas-microsoft-com:xml-analysis"><RequestType>{2}</RequestType><Restrictions><RestrictionList><CATALOG_NAME>{0}</CATALOG_NAME><CUBE_NAME>{1}</CUBE_NAME></RestrictionList></Restrictions><Properties><PropertyList><Catalog>{0}</Catalog>{3}</PropertyList></Properties></Discover></Body></Envelope>', execute = '<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/"><Body><Execute xmlns="urn:schemas-microsoft-com:xml-analysis"><Command><Statement>{0}</Statement></Command><Properties><PropertyList><Catalog>{1}</Catalog><ShowHiddenCubes>True</ShowHiddenCubes><SspropInitAppName>Microsoft SQL Server Management Studio</SspropInitAppName><Timeout>3600</Timeout>{2}</PropertyList></Properties></Execute></Body></Envelope>', mdx = "SELECT {2} FROM {0} {1} CELL PROPERTIES VALUE, FORMAT_STRING, LANGUAGE, BACK_COLOR, FORE_COLOR, FONT_FLAGS", mdxFilterSelect = "(SELECT {0} FROM {1})", mdxWith = "{0} {1} as {2}", mdxSlice = "WHERE ({0})", mdxNonEmpty = "NonEmpty({0}, {1})", mdxAxis = "{0} DIMENSION PROPERTIES PARENT_UNIQUE_NAME,HIERARCHY_UNIQUE_NAME, MEMBER_VALUE ON {1}", mdxCrossJoin = "CrossJoin({0})", mdxSet = "{{0}}", each = $.each, MEASURE_DEMENSION_KEY = "DX_MEASURES", MD_DIMTYPE_MEASURE = "2"; function execXMLA(requestOptions, data) { var deferred = $.Deferred(), beforeSend = requestOptions.beforeSend, ajaxSettings = { url: requestOptions.url, dataType: "text", data: data, headers: { "Content-Type": "text/xml" }, xhrFields: {}, method: "POST" }; if (commonUtils.isFunction(beforeSend)) { beforeSend(ajaxSettings) } pivotGridUtils.sendRequest(ajaxSettings).fail(function() { deferred.reject(arguments) }).done(function(text) { var xml; try { xml = $.parseXML(text) } catch (e) { deferred.reject({ statusText: e.message, stack: e.stack, responseText: text }) } deferred.resolve(xml) }); return deferred } function getLocaleIdProperty() { var languageId = getLanguageId(); if (void 0 !== languageId) { return stringFormat("<LocaleIdentifier>{0}</LocaleIdentifier>", languageId) } return "" } function mdxDescendants(level, levelMember, nextLevel) { levelMember = levelMember ? "." + levelMember : ""; return "Descendants({" + level + levelMember + "}, " + nextLevel + ", SELF_AND_BEFORE)" } function getAllMember(dimension) { return (dimension.hierarchyName || dimension.dataField) + ".[All]" } function getAllMembers(field) { return field.dataField + ".allMembers" } function crossJoinElements(elements) { var elementsString = elements.join(","); return elements.length > 1 ? stringFormat(mdxCrossJoin, elementsString) : elementsString } function union(elements) { var elementsString = elements.join(","); return elements.length > 1 ? "Union(" + elementsString + ")" : elementsString } function generateCrossJoin(path, expandLevel, expandAllCount, expandIndex, slicePath, options, axisName) { var dataField, allMember, hierarchyName, arg, prevDimension, prevHierarchyName, isLastDimensionInGroup, isFirstDimensionInGroup, expandAllIndex, field, member, i, crossJoinArgs = [], dimensions = options[axisName], fields = []; for (i = expandIndex; i <= expandLevel; i++) { field = dimensions[i]; dataField = field.dataField; prevHierarchyName = dimensions[i - 1] && dimensions[i - 1].hierarchyName; hierarchyName = field.hierarchyName; isLastDimensionInGroup = !hierarchyName || !dimensions[i + 1] || dimensions[i + 1].hierarchyName !== hierarchyName; expandAllIndex = path.length + expandAllCount + expandIndex; arg = null; fields.push(field); if (i < path.length) { if (isLastDimensionInGroup) { arg = "(" + dataField + "." + preparePathValue(path[i]) + ")" } } else { if (i <= expandAllIndex) { if (0 === i && 0 === expandAllCount) { allMember = getAllMember(dimensions[expandIndex]); if (!hierarchyName) { arg = getAllMembers(dimensions[expandIndex]) } else { arg = allMember + "," + dimensions[expandIndex].dataField } } else { if (hierarchyName) { member = preparePathValue(slicePath[slicePath.length - 1]); if (isLastDimensionInGroup || i === expandAllIndex) { if (prevHierarchyName === hierarchyName) { if (slicePath.length) { prevDimension = dimensions[slicePath.length - 1] } if (!prevDimension || prevDimension.hierarchyName !== hierarchyName) { prevDimension = dimensions[i - 1]; member = "" } arg = mdxDescendants(prevDimension.dataField, member, dataField) } else { arg = getAllMembers(field) } } } else { arg = getAllMembers(field) } } } else { isFirstDimensionInGroup = !hierarchyName || prevHierarchyName !== hierarchyName; if (isFirstDimensionInGroup) { arg = "(" + getAllMember(field) + ")" } } } if (arg) { arg = stringFormat(mdxSet, arg); crossJoinArgs.push(arg) } } return crossJoinElements(crossJoinArgs) } function fillCrossJoins(crossJoins, path, expandLevel, expandIndex, slicePath, options, axisName, cellsString) { var dimensionIndex, expandAllCount = -1, dimensions = options[axisName]; do { expandAllCount++; dimensionIndex = path.length + expandAllCount + expandIndex; crossJoins.push(stringFormat(mdxNonEmpty, generateCrossJoin(path, expandLevel, expandAllCount, expandIndex, slicePath, options, axisName), cellsString)) } while (dimensions[dimensionIndex] && dimensions[dimensionIndex + 1] && dimensions[dimensionIndex].expanded) } function declare(expression, withArray, name, type) { name = name || "[DX_Set_" + withArray.length + "]"; type = type || "set"; withArray.push(stringFormat(mdxWith, type, name, expression)); return name } function generateAxisMdx(options, axisName, cells, withArray, parseOptions) { var dimensions = options[axisName], crossJoins = [], path = [], expandedPaths = [], expandIndex = 0, expandLevel = 0, result = [], cellsString = stringFormat(mdxSet, cells.join(",")); if (dimensions && dimensions.length) { if (options.headerName === axisName) { path = options.path; expandIndex = path.length } else { expandedPaths = ("columns" === axisName ? options.columnExpandedPaths : options.rowExpandedPaths) || expandedPaths } expandLevel = pivotGridUtils.getExpandedLevel(options, axisName); fillCrossJoins(crossJoins, [], expandLevel, expandIndex, path, options, axisName, cellsString); each(expandedPaths, function(_, expandedPath) { fillCrossJoins(crossJoins, expandedPath, expandLevel, expandIndex, expandedPath, options, axisName, cellsString) }); for (var i = expandLevel; i >= path.length; i--) { if (dimensions[i].hierarchyName) { parseOptions.visibleLevels[dimensions[i].hierarchyName] = parseOptions.visibleLevels[dimensions[i].hierarchyName] || []; parseOptions.visibleLevels[dimensions[i].hierarchyName].push(dimensions[i].dataField) } } } if (crossJoins.length) { result.push(declare(union(crossJoins), withArray, "[DX_" + axisName + "]")) } if ("columns" === axisName && cells.length) { result.push(cellsString) } return stringFormat(mdxAxis, crossJoinElements(result), axisName) } function generateAxisFieldsFilter(fields) { var filterMembers = []; each(fields, function(_, field) { var filterStringExpression, dataField = field.dataField, filterExpression = [], filterValues = field.filterValues || []; if (field.hierarchyName && commonUtils.isNumeric(field.groupIndex)) { return } each(filterValues, function(_, filterValue) { var filterMdx = dataField + "." + preparePathValue(Array.isArray(filterValue) ? filterValue[filterValue.length - 1] : filterValue); if ("exclude" === field.filterType) { filterExpression.push(filterMdx + ".parent"); filterMdx = "Descendants(" + filterMdx + ")" } filterExpression.push(filterMdx) }); if (filterValues.length) { filterStringExpression = stringFormat(mdxSet, filterExpression.join(",")); if ("exclude" === field.filterType) { filterStringExpression = "Except(" + getAllMembers(field) + "," + filterStringExpression + ")" } filterMembers.push(filterStringExpression) } }); return filterMembers.length ? crossJoinElements(filterMembers) : "" } function generateFrom(columnsFilter, rowsFilter, filter, cubeName) { var from = "[" + cubeName + "]"; each([columnsFilter, rowsFilter, filter], function(_, filter) { if (filter) { from = stringFormat(mdxFilterSelect, filter + "on 0", from) } }); return from } function generateMdxCore(axisStrings, withArray, columns, rows, filters, slice, cubeName) { var mdxString = "", withString = (withArray.length ? "with " + withArray.join(" ") : "") + " "; if (axisStrings.length) { mdxString = withString + stringFormat(mdx, generateFrom(generateAxisFieldsFilter(columns), generateAxisFieldsFilter(rows), generateAxisFieldsFilter(filters || []), cubeName), slice.length ? stringFormat(mdxSlice, slice.join(",")) : "", axisStrings.join(",")) } return mdxString } function prepareDataFields(withArray, valueFields) { return $.map(valueFields, function(cell) { if (commonUtils.isString(cell.expression)) { declare(cell.expression, withArray, cell.dataField, "member") } return cell.dataField }) } function generateMDX(options, cubeName, parseOptions) { var columns = options.columns || [], rows = options.rows || [], values = options.values && options.values.length ? options.values : [{ dataField: "[Measures]" }], slice = [], withArray = [], axisStrings = [], dataFields = prepareDataFields(withArray, values); parseOptions.measureCount = values.length; parseOptions.visibleLevels = {}; if (options.headerName && options.path) { each(options.path, function(index, value) { var dimension = options[options.headerName][index]; if (!dimension.hierarchyName || dimension.hierarchyName !== options[options.headerName][index + 1].hierarchyName) { slice.push(dimension.dataField + "." + preparePathValue(value)) } }) } if (columns.length || dataFields.length) { axisStrings.push(generateAxisMdx(options, "columns", dataFields, withArray, parseOptions)) } if (rows.length) { axisStrings.push(generateAxisMdx(options, "rows", dataFields, withArray, parseOptions)) } return generateMdxCore(axisStrings, withArray, columns, rows, options.filters, slice, cubeName) } function createDrillDownAxisSlice(slice, fields, path) { each(path, function(index, value) { var field = fields[index]; if (field.hierarchyName && (fields[index + 1] || {}).hierarchyName === field.hierarchyName) { return } slice.push(field.dataField + "." + preparePathValue(value)) }) } function generateDrillDownMDX(options, cubeName, params) { var coreMDX, columns = options.columns || [], rows = options.rows || [], values = options.values && options.values.length ? options.values : [{ dataField: "[Measures]" }], slice = [], withArray = [], axisStrings = [], dataFields = prepareDataFields(withArray, values), maxRowCount = params.maxRowCount, customColumns = params.customColumns || [], customColumnsString = customColumns.length > 0 ? " return " + customColumns.join(",") : ""; createDrillDownAxisSlice(slice, columns, params.columnPath || []); createDrillDownAxisSlice(slice, rows, params.rowPath || []); if (columns.length || columns.length || dataFields.length) { axisStrings.push([(dataFields[params.dataIndex] || dataFields[0]) + " on 0"]) } coreMDX = generateMdxCore(axisStrings, withArray, columns, rows, options.filters, slice, cubeName); return coreMDX ? "drillthrough" + (maxRowCount > 0 ? " maxrows " + maxRowCount : "") + coreMDX + customColumnsString : coreMDX } function getNumber(str) { return parseInt(str, 10) } function parseValue(valueText) { return commonUtils.isNumeric(valueText) ? parseFloat(valueText) : valueText } function getFirstChild(node, tagName) { return (node.getElementsByTagName(tagName) || [])[0] } function getFirstChildText(node, childTagName) { return getNodeText(getFirstChild(node, childTagName)) } function parseAxes(xml) { var axes = []; each(xml.getElementsByTagName("Axis"), function(_, axisElement) { var name = axisElement.getAttribute("name"), axis = [], index = 0; if (0 === name.indexOf("Axis") && commonUtils.isNumeric(getNumber(name.substr(4)))) { axes.push(axis); each(axisElement.getElementsByTagName("Tuple"), function(_, tupleElement) { var tuple, level, i, tupleMembers = tupleElement.childNodes, levelSum = 0, members = [], membersCount = tupleMembers.length - 1, isAxisWithMeasure = 1 === axes.length; if (isAxisWithMeasure) { membersCount-- } axis.push(members); for (i = membersCount; i >= 0; i--) { tuple = tupleMembers[i]; level = getNumber(getFirstChildText(tuple, "LNum")); members[i] = { caption: getFirstChildText(tuple, "Caption"), value: parseValue(getFirstChildText(tuple, "MEMBER_VALUE")), level: level, index: index++, hasValue: !levelSum && (!!level || 0 === i), name: getFirstChildText(tuple, "UName"), hierarchyName: tupleMembers[i].getAttribute("Hierarchy"), parentName: getFirstChildText(tuple, "PARENT_UNIQUE_NAME"), levelName: getFirstChildText(tuple, "LName") }; levelSum += level } }) } }); while (axes.length < 2) { axes.push([ [{ level: 0 }] ]) } return axes } function getNodeText(node) { return node && node && (node.textContent || node.text || node.innerHTML) || "" } function parseCells(xml, axes, measureCount) { var measureIndex, row, cells = [], cell = [], index = 0, cellsOriginal = [], cellElements = xml.getElementsByTagName("Cell"), errorDictionary = {}; for (var i = 0; i < cellElements.length; i++) { var xmlCell = cellElements[i], valueElement = xmlCell.getElementsByTagName("Value")[0], errorElements = valueElement && valueElement.getElementsByTagName("Error") || [], text = 0 === errorElements.length ? getNodeText(valueElement) : "#N/A", value = parseFloat(text), isNumeric = text - value + 1 > 0, cellOrdinal = getNumber(xmlCell.getAttribute("CellOrdinal")); if (errorElements.length) { errorDictionary[getNodeText(errorElements[0].getElementsByTagName("ErrorCode")[0])] = getNodeText(errorElements[0].getElementsByTagName("Description")[0]) } cellsOriginal[cellOrdinal] = { value: isNumeric ? value : text || null } } each(axes[1], function() { row = []; cells.push(row); each(axes[0], function() { measureIndex = index % measureCount; if (0 === measureIndex) { cell = []; row.push(cell) } cell.push(cellsOriginal[index] ? cellsOriginal[index].value : null); index++ }) }); Object.keys(errorDictionary).forEach(function(key) { errors.log("W4002", errorDictionary[key]) }); return cells } function preparePathValue(pathValue) { if (pathValue) { return commonUtils.isString(pathValue) && pathValue.indexOf("&[") !== -1 ? pathValue : "[" + pathValue + "]" } } function getItem(hash, name, member, index) { var item = hash[name]; if (!item) { item = {}; hash[name] = item } if (!item.value && member) { item.text = member.caption; item.value = member.value; item.key = name ? name.slice(name.indexOf("&[")) : ""; item.levelName = member.levelName; item.hierarchyName = member.hierarchyName; item.parentName = member.parentName; item.index = index; item.level = member.level } return item } function getVisibleChildren(item, visibleLevels) { var result = [], children = item.children && (item.children.length ? item.children : $.map(item.children.grandTotalHash || [], function(e) { return e.children })), firstChild = children && children[0]; if (firstChild && (visibleLevels[firstChild.hierarchyName] && inArray(firstChild.levelName, visibleLevels[firstChild.hierarchyName]) !== -1 || !visibleLevels[firstChild.hierarchyName] || 0 === firstChild.level)) { var newChildren = $.map(children, function(child) { return child.hierarchyName === firstChild.hierarchyName ? child : null }); newChildren.grandTotalHash = children.grandTotalHash; return newChildren } else { if (firstChild) { for (var i = 0; i < children.length; i++) { if (children[i].hierarchyName === firstChild.hierarchyName) { result.push.apply(result, getVisibleChildren(children[i], visibleLevels)) } } } } return result } function processMember(dataIndex, member, parentItem) { var currentItem, children = parentItem.children = parentItem.children || [], hash = children.hash = children.hash || {}, grandTotalHash = children.grandTotalHash = children.grandTotalHash || {}; if (member.parentName) { parentItem = getItem(hash, member.parentName); children = parentItem.children = parentItem.children || [] } currentItem = getItem(hash, member.name, member, dataIndex); if (member.hasValue && !currentItem.added) { currentItem.index = dataIndex; currentItem.added = true; children.push(currentItem) } if ((!parentItem.value || !parentItem.parentName) && member.parentName) { grandTotalHash[member.parentName] = parentItem } else { if (grandTotalHash[parentItem.name]) { delete grandTotalHash[member.parentName] } } return currentItem } function getGrandTotalIndex(parentItem, visibleLevels) { var grandTotalIndex; if (1 === parentItem.children.length && "" === parentItem.children[0].parentName) { grandTotalIndex = parentItem.children[0].index; var grandTotalHash = parentItem.children.grandTotalHash; parentItem.children = parentItem.children[0].children || []; parentItem.children.grandTotalHash = grandTotalHash; parentItem.children = getVisibleChildren(parentItem, visibleLevels) } else { if (0 === parentItem.children.length) { grandTotalIndex = 0 } } return grandTotalIndex } function fillDataSourceAxes(dataSourceAxis, axisTuples, measureCount, visibleLevels) { var grandTotalIndex, result = []; each(axisTuples, function(tupleIndex, members) { var parentItem = { children: result }, dataIndex = commonUtils.isDefined(measureCount) ? Math.floor(tupleIndex / measureCount) : tupleIndex; each(members, function(_, member) { parentItem = processMember(dataIndex, member, parentItem) }) }); var parentItem = { children: result }; parentItem.children = getVisibleChildren(parentItem, visibleLevels); grandTotalIndex = getGrandTotalIndex(parentItem, visibleLevels); pivotGridUtils.foreachTree(parentItem.children, function(items) { var item = items[0], children = getVisibleChildren(item, visibleLevels); if (children.length) { item.children = children } else { delete item.children } delete item.levelName; delete item.hierarchyName; delete item.added; delete item.parentName; delete item.level }, true); each(parentItem.children || [], function(_, e) { dataSourceAxis.push(e) }); return grandTotalIndex } function checkError(xml) { var description, error, faultElementNS = xml.getElementsByTagName("soap:Fault"), faultElement = xml.getElementsByTagName("Fault"), errorElement = $(faultElement.length ? faultElement : faultElementNS).find("Error"); if (errorElement.length) { description = errorElement.attr("Description"); error = new errors.Error("E4000", description); errors.log("E4000", description); return error } return null } function parseResult(xml, parseOptions) { var axes, dataSource = { columns: [], rows: [] }, measureCount = parseOptions.measureCount; axes = parseAxes(xml); dataSource.grandTotalColumnIndex = fillDataSourceAxes(dataSource.columns, axes[0], measureCount, parseOptions.visibleLevels); dataSource.grandTotalRowIndex = fillDataSourceAxes(dataSource.rows, axes[1], void 0, parseOptions.visibleLevels); dataSource.values = parseCells(xml, axes, measureCount); return dataSource } function parseDiscoverRowSet(xml, schema, dimensions) { var result = [], isMeasure = "MEASURE" === schema, displayFolderField = isMeasure ? "MEASUREGROUP_NAME" : schema + "_DISPLAY_FOLDER"; each(xml.getElementsByTagName("row"), function(_, row) { var hierarchyName = "LEVEL" === schema ? getFirstChildText(row, "HIERARCHY_UNIQUE_NAME") : void 0, levelNumber = getFirstChildText(row, "LEVEL_NUMBER"); if (("0" !== levelNumber || "true" !== getFirstChildText(row, schema + "_IS_VISIBLE")) && getFirstChildText(row, "DIMENSION_TYPE") !== MD_DIMTYPE_MEASURE) { var dimension = isMeasure ? MEASURE_DEMENSION_KEY : getFirstChildText(row, "DIMENSION_UNIQUE_NAME"), dataField = getFirstChildText(row, schema + "_UNIQUE_NAME"); result.push({ dimension: dimensions.names[dimension] || dimension, groupIndex: levelNumber ? getNumber(levelNumber) - 1 : void 0, dataField: dataField, caption: getFirstChildText(row, schema + "_CAPTION"), hierarchyName: hierarchyName, groupName: hierarchyName, displayFolder: getFirstChildText(row, displayFolderField), isMeasure: isMeasure, isDefault: !!dimensions.defaultHierarchies[dataField] }) } }); return result } function parseDimensionsDiscoverRowSet(xml) { var result = { names: {}, defaultHierarchies: {} }; each($(xml).find("row"), function() { var $row = $(this), type = $row.children("DIMENSION_TYPE").text(), dimensionName = type === MD_DIMTYPE_MEASURE ? MEASURE_DEMENSION_KEY : $row.children("DIMENSION_UNIQUE_NAME").text(); result.names[dimensionName] = $row.children("DIMENSION_CAPTION").text(); result.defaultHierarchies[$row.children("DEFAULT_HIERARCHY").text()] = true }); return result } function parseStringWithUnicodeSymbols(str) { str = str.replace(/_x(....)_/g, function(whole, group1) { return String.fromCharCode(parseInt(group1, 16)) }); var stringArray = str.match(/\[.+?\]/gi); if (stringArray && stringArray.length) { str = stringArray[stringArray.length - 1] } return str.replace(/\[/gi, "").replace(/\]/gi, "").replace(/\$/gi, "").replace(/\./gi, " ") } function parseDrillDownRowSet(xml) { var rows = xml.getElementsByTagName("row"), result = [], columnNames = {}; for (var i = 0; i < rows.length; i++) { var children = rows[i].childNodes, item = {}; for (var j = 0; j < children.length; j++) { var tagName = children[j].tagName, name = columnNames[tagName] = columnNames[tagName] || parseStringWithUnicodeSymbols(tagName); item[name] = getNodeText(children[j]) } result.push(item) } return result } function sendQuery(storeOptions, mdxString) { mdxString = $("<div>").text(mdxString).html(); return execXMLA(storeOptions, stringFormat(execute, mdxString, storeOptions.catalog, getLocaleIdProperty())) } return { ctor: function(options) { this._options = options }, getFields: function() { var options = this._options, catalog = options.catalog, cube = options.cube, localeIdProperty = getLocaleIdProperty(), dimensionsRequest = execXMLA(options, stringFormat(discover, catalog, cube, "MDSCHEMA_DIMENSIONS", localeIdProperty)), measuresRequest = execXMLA(options, stringFormat(discover, catalog, cube, "MDSCHEMA_MEASURES", localeIdProperty)), hierarchiesRequest = execXMLA(options, stringFormat(discover, catalog, cube, "MDSCHEMA_HIERARCHIES", localeIdProperty)), levelsRequest = execXMLA(options, stringFormat(discover, catalog, cube, "MDSCHEMA_LEVELS", localeIdProperty)), result = $.Deferred(); when(dimensionsRequest, measuresRequest, hierarchiesRequest, levelsRequest).done(function(dimensionsResponse, measuresResponse, hierarchiesResponse, levelsResponse) { var dimensions = parseDimensionsDiscoverRowSet(dimensionsResponse), hierarchies = parseDiscoverRowSet(hierarchiesResponse, "HIERARCHY", dimensions), levels = parseDiscoverRowSet(levelsResponse, "LEVEL", dimensions), fields = parseDiscoverRowSet(measuresResponse, "MEASURE", dimensions).concat(hierarchies), levelsByHierarchy = {}; each(levels, function(_, level) { levelsByHierarchy[level.hierarchyName] = levelsByHierarchy[level.hierarchyName] || []; levelsByHierarchy[level.hierarchyName].push(level) }); each(hierarchies, function(_, hierarchy) { if (levelsByHierarchy[hierarchy.dataField] && levelsByHierarchy[hierarchy.dataField].length > 1) { hierarchy.groupName = hierarchy.hierarchyName = hierarchy.dataField; fields.push.apply(fields, levelsByHierarchy[hierarchy.hierarchyName]) } }); result.resolve(fields) }).fail(result.reject); return result }, load: function(options) { var result = $.Deferred(), storeOptions = this._options, parseOptions = {}, mdxString = generateMDX(options, storeOptions.cube, parseOptions); if (mdxString) { when(sendQuery(storeOptions, mdxString)).done(function(executeXml) { var error = checkError(executeXml); if (!error) { result.resolve(parseResult(executeXml, parseOptions)) } else { result.reject(error) } }).fail(result.reject) } else { result.resolve({ columns: [], rows: [], values: [], grandTotalColumnIndex: 0, grandTotalRowIndex: 0 }) } return result }, supportSorting: function() { return true }, getDrillDownItems: function(options, params) { var result = $.Deferred(), storeOptions = this._options, mdxString = generateDrillDownMDX(options, storeOptions.cube, params); if (mdxString) { when(sendQuery(storeOptions, mdxString)).done(function(executeXml) { var error = checkError(executeXml); if (!error) { result.resolve(parseDrillDownRowSet(executeXml)) } else { result.reject(error) } }).fail(result.reject) } else { result.resolve([]) } return result }, key: commonUtils.noop, filter: commonUtils.noop } }()).include(pivotGridUtils.storeDrillDownMixin) }, /*!*****************************************************************!*\ !*** ./js/ui/pivot_grid/ui.pivot_grid.summary_display_modes.js ***! \*****************************************************************/ function(module, exports, __webpack_require__) { var commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, isDefined = commonUtils.isDefined, pivotGridUtils = __webpack_require__( /*! ./ui.pivot_grid.utils */ 450), findField = pivotGridUtils.findField, foreachTree = pivotGridUtils.foreachTree, COLUMN = "column", ROW = "row", NULL = null, calculatePercentValue = function(value, totalValue) { var result = value / totalValue; if (!isDefined(value) || isNaN(result)) { result = NULL } return result }, percentOfGrandTotal = function(e, dimension) { return calculatePercentValue(e.value(), e.grandTotal(dimension).value()) }, percentOfParent = function(e, dimension) { var parent = e.parent(dimension), parentValue = parent ? parent.value() : e.value(); return calculatePercentValue(e.value(), parentValue) }, createAbsoluteVariationExp = function(allowCrossGroup) { return function(e) { var prevCell = e.prev(COLUMN, allowCrossGroup), prevValue = prevCell && prevCell.value(); if (isDefined(prevValue) && isDefined(e.value())) { return e.value() - prevValue } return NULL } }, createPercentVariationExp = function(allowCrossGroup) { var absoluteExp = createAbsoluteVariationExp(allowCrossGroup); return function(e) { var absVar = absoluteExp(e), prevCell = e.prev(COLUMN, allowCrossGroup), prevValue = prevCell && prevCell.value(); return absVar !== NULL && prevValue ? absVar / prevValue : NULL } }, summaryDictionary = { percentOfColumnTotal: function(e) { return percentOfParent(e, ROW) }, percentOfRowTotal: function(e) { return percentOfParent(e, COLUMN) }, percentOfColumnGrandTotal: function(e) { return percentOfGrandTotal(e, ROW) }, percentOfRowGrandTotal: function(e) { return percentOfGrandTotal(e, COLUMN) }, percentOfGrandTotal: function(e) { return percentOfGrandTotal(e) } }, getPrevCellCrossGroup = function(cell, direction) { if (!cell || !cell.parent(direction)) { return } var prevCell = cell.prev(direction); if (!prevCell) { prevCell = getPrevCellCrossGroup(cell.parent(direction), direction) } return prevCell }, createRunningTotalExpr = function(field) { if (!field.runningTotal) { return } var direction = field.runningTotal === COLUMN ? ROW : COLUMN; return function(e) { var prevCell = field.allowCrossGroupCalculation ? getPrevCellCrossGroup(e, direction) : e.prev(direction, false), value = e.value(true), prevValue = prevCell && prevCell.value(true); if (isDefined(prevValue) && isDefined(value)) { value = prevValue + value } else { if (isDefined(prevValue)) { value = prevValue } } return value } }; function createCache() { return { fields: {}, positions: {} } } function getFieldPos(descriptions, field, cache) { var fieldIndex, allFields, fieldParams = { index: -1 }; if (!commonUtils.isObject(field)) { if (cache.fields[field]) { field = cache[field] } else { allFields = descriptions.columns.concat(descriptions.rows).concat(descriptions.values); fieldIndex = findField(allFields, field); field = cache[field] = allFields[fieldIndex] } } if (field) { var area = field.area || "data"; fieldParams = cache.positions[field.index] = cache.positions[field.index] || { area: area, index: inArray(field, descriptions["data" === area ? "values" : area + "s"]) } } return fieldParams } function getPathFieldName(dimension) { return dimension === ROW ? "_rowPath" : "_columnPath" } var SummaryCell = function(columnPath, rowPath, data, descriptions, fieldIndex, fieldsCache) { this._columnPath = columnPath; this._rowPath = rowPath; this._fieldIndex = fieldIndex; this._fieldsCache = fieldsCache || createCache(); this._data = data; this._descriptions = descriptions; var cell = data.values && data.values[rowPath[0].index] && data.values[rowPath[0].index][columnPath[0].index]; if (cell) { cell.originalCell = cell.originalCell || cell.slice(); this._cell = cell } }; SummaryCell.prototype = extend(SummaryCell.prototype, { _getPath: function(dimension) { return this[getPathFieldName(dimension)] }, _getDimension: function(dimension) { dimension = dimension === ROW ? "rows" : "columns"; return this._descriptions[dimension] }, _createCell: function(config) { var that = this; return new SummaryCell(config._columnPath || that._columnPath, config._rowPath || that._rowPath, that._data, that._descriptions, that._fieldIndex) }, parent: function(direction) { var path = this._getPath(direction).slice(), config = {}; path.shift(); if (path.length) { config[getPathFieldName(direction)] = path; return this._createCell(config) } return NULL }, children: function(direction) { var path = this._getPath(direction).slice(), item = path[0], result = [], cellConfig = {}; if (item.children) { for (var i = 0; i < item.children.length; i++) { cellConfig[getPathFieldName(direction)] = [item.children[i]].concat(path.slice()); result.push(this._createCell(cellConfig)) } } return result }, grandTotal: function(direction) { var config = {}, rowPath = this._rowPath, columnPath = this._columnPath, dimensionPath = this._getPath(direction), pathFieldName = getPathFieldName(direction); if (!direction) { config._rowPath = [rowPath[rowPath.length - 1]]; config._columnPath = [columnPath[columnPath.length - 1]] } else { config[pathFieldName] = [dimensionPath[dimensionPath.length - 1]] } return this._createCell(config) }, next: function(direction, allowCrossGroup) { var siblings, index, currentPath = this._getPath(direction), item = currentPath[0], parent = this.parent(direction); if (parent) { index = inArray(item, currentPath[1].children); siblings = parent.children(direction); if (siblings[index + 1]) { return siblings[index + 1] } } if (allowCrossGroup && parent) { do { parent = parent.next(direction, allowCrossGroup); siblings = parent ? parent.children(direction) : [] } while (parent && !siblings.length); return siblings[0] || NULL } return NULL }, prev: function(direction, allowCrossGroup) { var siblings, index, currentPath = this._getPath(direction), item = currentPath[0], parent = this.parent(direction); if (parent) { index = inArray(item, currentPath[1].children); siblings = parent.children(direction); if (siblings[index - 1]) { return siblings[index - 1] } } if (allowCrossGroup && parent) { do { parent = parent.prev(direction, allowCrossGroup); siblings = parent ? parent.children(direction) : [] } while (parent && !siblings.length); return siblings[siblings.length - 1] || NULL } return NULL }, cell: function() { return this._cell }, field: function(area) { var path = this._getPath(area), descriptions = this._getDimension(area), field = descriptions[path.length - 2]; return field || NULL }, child: function(direction, fieldValue) { var childLevelField, children = this.children(direction); for (var i = 0; i < children.length; i++) { childLevelField = childLevelField || children[i].field(direction); if (children[i].value(childLevelField) === fieldValue) { return children[i] } } return NULL }, slice: function(field, value) { var childItems, path, currentValue, level, that = this, config = {}, fieldPos = getFieldPos(this._descriptions, field, this._fieldsCache), area = fieldPos.area, fieldIndex = fieldPos.index, sliceCell = NULL, newPath = []; if (area === ROW || area === COLUMN) { path = this._getPath(area).slice(); level = fieldIndex !== -1 && path.length - 2 - fieldIndex; if (path[level]) { newPath[path.length - 1] = path[path.length - 1]; for (var i = level; i >= 0; i--) { if (path[i + 1]) { childItems = path[i + 1].children || []; currentValue = i === level ? value : path[i].value; path[i] = void 0; for (var childIndex = 0; childIndex < childItems.length; childIndex++) { if (childItems[childIndex].value === currentValue) { path[i] = childItems[childIndex]; break } } } if (void 0 === path[i]) { return sliceCell } } config[getPathFieldName(area)] = path; sliceCell = that._createCell(config) } } return sliceCell }, value: function(arg1, arg2) { var path, level, cell = this._cell, fieldIndex = this._fieldIndex, fistArgIsBoolean = true === arg1 || false === arg1, field = !fistArgIsBoolean ? arg1 : NULL, needCalculatedValue = fistArgIsBoolean && arg1 || arg2; if (isDefined(field)) { var fieldPos = getFieldPos(this._descriptions, field, this._fieldsCache); fieldIndex = fieldPos.index; if ("data" !== fieldPos.area) { path = this._getPath(fieldPos.area); level = fieldIndex !== -1 && path.length - 2 - fieldIndex; return path[level] && path[level].value } } if (cell && cell.originalCell) { return needCalculatedValue ? cell[fieldIndex] : cell.originalCell[fieldIndex] } return NULL } }); function getExpression(field) { var summaryDisplayMode = field.summaryDisplayMode, crossGroupCalculation = field.allowCrossGroupCalculation, expression = NULL; if (commonUtils.isFunction(field.calculateSummaryValue)) { expression = field.calculateSummaryValue } else { if (summaryDisplayMode) { if ("absoluteVariation" === summaryDisplayMode) { expression = createAbsoluteVariationExp(crossGroupCalculation) } else { if ("percentVariation" === summaryDisplayMode) { expression = createPercentVariationExp(crossGroupCalculation) } else { expression = summaryDictionary[summaryDisplayMode] } } if (expression && !field.format && summaryDisplayMode.indexOf("percent") !== -1) { pivotGridUtils.setFieldProperty(field, "format", "percent") } } } return expression } exports.applyDisplaySummaryMode = function(descriptions, data) { var expressions = [], columnElements = [{ index: data.grandTotalColumnIndex, children: data.columns }], rowElements = [{ index: data.grandTotalRowIndex, children: data.rows }], valueFields = descriptions.values, fieldsCache = createCache(); data.values = data.values || []; foreachTree(rowElements, function(rowPath) { var rowItem = rowPath[0]; rowItem.isEmpty = true; data.values[rowItem.index] = data.values[rowItem.index] || []; foreachTree(columnElements, function(columnPath) { var expression, expressionArg, cell, field, isEmptyCell, value, columnItem = columnPath[0]; columnItem.isEmpty = columnItem.isEmpty || []; data.values[rowItem.index][columnItem.index] = data.values[rowItem.index][columnItem.index] || []; for (var i = 0; i < valueFields.length; i++) { field = valueFields[i]; expression = expressions[i] = void 0 === expressions[i] ? getExpression(field) : expressions[i]; isEmptyCell = false; if (expression) { expressionArg = new SummaryCell(columnPath, rowPath, data, descriptions, i, fieldsCache); cell = expressionArg.cell(); value = cell[i] = expression(expressionArg); isEmptyCell = null === value || void 0 === value } if (void 0 === columnItem.isEmpty[i]) { columnItem.isEmpty[i] = true } if (!isEmptyCell) { columnItem.isEmpty[i] = false; rowItem.isEmpty = false } } }, false) }, false); data.isEmptyGrandTotalRow = rowElements[0].isEmpty; data.isEmptyGrandTotalColumn = columnElements[0].isEmpty }; exports.applyRunningTotal = function(descriptions, data) { var expressions = [], columnElements = [{ index: data.grandTotalColumnIndex, children: data.columns }], rowElements = [{ index: data.grandTotalRowIndex, children: data.rows }], valueFields = descriptions.values, fieldsCache = createCache(); data.values = data.values || []; foreachTree(rowElements, function(rowPath) { var rowItem = rowPath[0]; data.values[rowItem.index] = data.values[rowItem.index] || []; foreachTree(columnElements, function(columnPath) { var expression, expressionArg, cell, field, value, columnItem = columnPath[0]; data.values[rowItem.index][columnItem.index] = data.values[rowItem.index][columnItem.index] || []; for (var i = 0; i < valueFields.length; i++) { field = valueFields[i]; expression = expressions[i] = void 0 === expressions[i] ? createRunningTotalExpr(field) : expressions[i]; if (expression) { expressionArg = new SummaryCell(columnPath, rowPath, data, descriptions, i, fieldsCache); cell = expressionArg.cell(); value = cell[i] = expression(expressionArg) } } }, false) }, false) }; exports.createMockSummaryCell = function(descriptions, fields, indices) { var summaryCell = new SummaryCell([], [], {}, descriptions, 0); summaryCell.value = function(fieldId) { if (commonUtils.isDefined(fieldId)) { var index = findField(fields, fieldId), field = fields[index]; if (!indices[index] && field && !commonUtils.isDefined(field.area)) { descriptions.values.push(field); indices[index] = true } } }; summaryCell.grandTotal = function() { return this }; summaryCell.children = function() { return [] }; return summaryCell }; exports.Cell = SummaryCell; exports.summaryDictionary = summaryDictionary; exports.getExpression = getExpression }, /*!*****************************************************!*\ !*** ./js/ui/pivot_grid/ui.pivot_grid.data_area.js ***! \*****************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), areaItem = __webpack_require__( /*! ./ui.pivot_grid.area_item */ 458); var PIVOTGRID_AREA_CLASS = "dx-pivotgrid-area", PIVOTGRID_AREA_DATA_CLASS = "dx-pivotgrid-area-data", PIVOTGRID_TOTAL_CLASS = "dx-total", PIVOTGRID_GRAND_TOTAL_CLASS = "dx-grandtotal", PIVOTGRID_ROW_TOTAL_CLASS = "dx-row-total"; exports.DataArea = areaItem.AreaItem.inherit({ _getAreaName: function() { return "data" }, _createGroupElement: function() { return $("<div>").addClass(PIVOTGRID_AREA_CLASS).addClass(PIVOTGRID_AREA_DATA_CLASS) }, _applyCustomStyles: function(options) { var cell = options.cell, classArray = options.classArray; if ("T" === cell.rowType || "T" === cell.columnType) { classArray.push(PIVOTGRID_TOTAL_CLASS) } if ("GT" === cell.rowType || "GT" === cell.columnType) { classArray.push(PIVOTGRID_GRAND_TOTAL_CLASS) } if ("T" === cell.rowType || "GT" === cell.rowType) { classArray.push(PIVOTGRID_ROW_TOTAL_CLASS) } if (options.rowIndex === options.rowsCount - 1) { options.cssArray.push("border-bottom: 0px") } this.callBase(options) }, _moveFakeTable: function(scrollPos) { this._moveFakeTableHorizontally(scrollPos.x); this._moveFakeTableTop(scrollPos.y); this.callBase() }, processScroll: function(useNativeScrolling) { this._groupElement.css("border-top-width", 0).dxScrollable({ useNative: !!useNativeScrolling, useSimulatedScrollbar: !useNativeScrolling, direction: "both", bounceEnabled: false, updateManually: true }) }, reset: function() { this.callBase(); if (this._virtualContent) { this._virtualContent.parent().css("height", "auto") } }, setVirtualContentParams: function(params) { this.callBase(params); this._virtualContent.parent().css("height", params.height); this._setTableCss({ top: params.top, left: params.left }) } }) }, /*!*****************************************************!*\ !*** ./js/ui/pivot_grid/ui.pivot_grid.area_item.js ***! \*****************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14); var PIVOTGRID_EXPAND_CLASS = "dx-expand"; var getRealElementWidth = function(element) { var clientRect, width = 0; if (element.getBoundingClientRect) { clientRect = element.getBoundingClientRect(); width = clientRect.width; if (!width) { width = clientRect.right - clientRect.left } } if (width > 0) { return width } else { return element.offsetWidth } }; function getFakeTableOffset(scrollPos, elementOffset, tableSize, viewPortSize) { var offset = 0, halfTableCount = 0, halfTableSize = tableSize / 2; if (scrollPos + viewPortSize - (elementOffset + tableSize) > 1) { if (scrollPos >= elementOffset + tableSize + halfTableSize) { halfTableCount = parseInt((scrollPos - (elementOffset + tableSize)) / halfTableSize, 10) } offset = elementOffset + tableSize + halfTableSize * halfTableCount } else { if (scrollPos < elementOffset) { if (scrollPos <= elementOffset - halfTableSize) { halfTableCount = parseInt((scrollPos - (elementOffset - halfTableSize)) / halfTableSize, 10) } offset = elementOffset - (tableSize - halfTableSize * halfTableCount) } else { offset = elementOffset } } return offset } exports.getRealElementWidth = getRealElementWidth; exports.AreaItem = Class.inherit({ _getRowElement: function(index) { var that = this; if (that._tableElement && that._tableElement.length > 0) { return that._tableElement[0].rows[index] } return null }, _createGroupElement: function() { return $("<div>") }, _createTableElement: function() { return $("<table>") }, _getCellText: function(cell, encodeHtml) { var cellText = cell.isWhiteSpace ? "" : cell.text || ""; if (encodeHtml && (cellText.indexOf("<") !== -1 || cellText.indexOf(">") !== -1)) { cellText = $("<div>").text(cellText).html() } return cellText }, _getRowClassNames: function() {}, _applyCustomStyles: function(options) { if (options.cell.width) { options.cssArray.push("min-width:" + options.cell.width + "px") } if (options.cell.sorted) { options.classArray.push("dx-pivotgrid-sorted") } }, _getMainElementMarkup: function() { return "<tbody>" }, _getCloseMainElementMarkup: function() { return "</tbody>" }, _renderTableContent: function(tableElement, data) { var row, cell, i, j, rowElement, cellElement, cellText, rowClassNames, that = this, rowsCount = data.length, rtlEnabled = that.option("rtlEnabled"), markupArray = [], encodeHtml = that.option("encodeHtml"), colspan = "colspan='", rowspan = "rowspan='"; tableElement.data("area", that._getAreaName()); tableElement.data("data", data); tableElement.css("width", ""); markupArray.push(that._getMainElementMarkup()); for (i = 0; i < rowsCount; i++) { row = data[i]; var columnMarkupArray = []; rowClassNames = []; markupArray.push("<tr "); for (j = 0; j < row.length; j++) { cell = row[j]; this._getRowClassNames(i, cell, rowClassNames); columnMarkupArray.push("<td "); if (cell) { cell.rowspan && columnMarkupArray.push(rowspan + (cell.rowspan || 1) + "'"); cell.colspan && columnMarkupArray.push(colspan + (cell.colspan || 1) + "'"); var styleOptions = { cellElement: cellElement, cell: cell, cellsCount: row.length, cellIndex: j, rowElement: rowElement, rowIndex: i, rowsCount: rowsCount, rtlEnabled: rtlEnabled, classArray: [], cssArray: [] }; that._applyCustomStyles(styleOptions); if (styleOptions.cssArray.length) { columnMarkupArray.push("style='"); columnMarkupArray.push(styleOptions.cssArray.join(";")); columnMarkupArray.push("'") } if (styleOptions.classArray.length) { columnMarkupArray.push("class='"); columnMarkupArray.push(styleOptions.classArray.join(" ")); columnMarkupArray.push("'") } columnMarkupArray.push(">"); if (commonUtils.isDefined(cell.expanded)) { columnMarkupArray.push("<div class='dx-expand-icon-container'><span class='" + PIVOTGRID_EXPAND_CLASS + "'></span></div>") } cellText = this._getCellText(cell, encodeHtml) } else { cellText = "" } columnMarkupArray.push("<span "); if (commonUtils.isDefined(cell.wordWrapEnabled)) { columnMarkupArray.push("style='white-space:", cell.wordWrapEnabled ? "normal" : "nowrap", ";'") } columnMarkupArray.push(">" + cellText + "</span>"); if (cell.sorted) { columnMarkupArray.push("<span class='dx-icon-sorted'></span>") } columnMarkupArray.push("</td>") } if (rowClassNames.length) { markupArray.push("class='"); markupArray.push(rowClassNames.join(" ")); markupArray.push("'") } markupArray.push(">"); markupArray.push(columnMarkupArray.join("")); markupArray.push("</tr>") } markupArray.push(this._getCloseMainElementMarkup()); tableElement.append(markupArray.join("")); this._triggerOnCellPrepared(tableElement, data) }, _triggerOnCellPrepared: function(tableElement, data) { var rowElement, cellElement, onCellPreparedArgs, row, cell, rowIndex, columnIndex, that = this, rowElements = tableElement.find("tr"), areaName = that._getAreaName(), onCellPrepared = that.option("onCellPrepared"), hasEvent = that.component.hasEvent("cellPrepared"), defaultActionArgs = this.component._defaultActionArgs(); if (onCellPrepared || hasEvent) { for (rowIndex = 0; rowIndex < data.length; rowIndex++) { row = data[rowIndex]; rowElement = rowElements.eq(rowIndex); for (columnIndex = 0; columnIndex < row.length; columnIndex++) { cell = row[columnIndex]; cellElement = rowElement.children().eq(columnIndex); onCellPreparedArgs = { area: areaName, rowIndex: rowIndex, columnIndex: columnIndex, cellElement: cellElement, cell: cell }; if (hasEvent) { that.component._trigger("onCellPrepared", onCellPreparedArgs) } else { onCellPrepared(extend(onCellPreparedArgs, defaultActionArgs)) } } } } }, _getRowHeight: function(index) { var clientRect, row = this._getRowElement(index), height = 0; if (row && row.lastChild) { if (row.getBoundingClientRect) { clientRect = row.getBoundingClientRect(); height = clientRect.height } if (height > 0) { return height } else { return row.offsetHeight } } return 0 }, _setRowHeight: function(index, value) { var row = this._getRowElement(index); if (row) { row.style.height = value + "px" } }, ctor: function(component) { this.component = component }, option: function() { return this.component.option.apply(this.component, arguments) }, getRowsLength: function() { var that = this; if (that._tableElement && that._tableElement.length > 0) { return that._tableElement[0].rows.length } return 0 }, getRowsHeight: function() { var i, that = this, result = [], rowsLength = that.getRowsLength(); for (i = 0; i < rowsLength; i++) { result.push(that._getRowHeight(i)) } return result }, setRowsHeight: function(values) { var i, that = this, totalHeight = 0, valuesLength = values.length; for (i = 0; i < valuesLength; i++) { totalHeight += values[i]; that._setRowHeight(i, values[i]) } this._tableHeight = totalHeight; this._tableElement[0].style.height = totalHeight + "px" }, getColumnsWidth: function() { var rowIndex, row, i, columnIndex, rowsLength = this.getRowsLength(), processedCells = [], result = [], fillCells = function(cells, rowIndex, columnIndex, rowSpan, colSpan) { var rowOffset, columnOffset; for (rowOffset = 0; rowOffset < rowSpan; rowOffset++) { for (columnOffset = 0; columnOffset < colSpan; columnOffset++) { cells[rowIndex + rowOffset] = cells[rowIndex + rowOffset] || []; cells[rowIndex + rowOffset][columnIndex + columnOffset] = true } } }; if (rowsLength) { for (rowIndex = 0; rowIndex < rowsLength; rowIndex++) { processedCells[rowIndex] = processedCells[rowIndex] || []; row = this._getRowElement(rowIndex); for (i = 0; i < row.cells.length; i++) { for (columnIndex = 0; processedCells[rowIndex][columnIndex]; columnIndex++) {} fillCells(processedCells, rowIndex, columnIndex, row.cells[i].rowSpan, row.cells[i].colSpan); if (1 === row.cells[i].colSpan) { result[columnIndex] = result[columnIndex] || getRealElementWidth(row.cells[i]) } } } } return result }, setColumnsWidth: function(values) { var i, totalWidth = 0, tableElement = this._tableElement[0], colgroupElementHTML = "", columnsCount = this.getColumnsCount(), columnWidth = []; for (i = 0; i < columnsCount; i++) { columnWidth.push(values[i] || 0) } for (i = columnsCount; i < values.length && values; i++) { columnWidth[columnsCount - 1] += values[i] } for (i = 0; i < columnsCount; i++) { totalWidth += columnWidth[i]; colgroupElementHTML += '<col style="width: ' + columnWidth[i] + 'px">' } this._colgroupElement.html(colgroupElementHTML); this._tableWidth = totalWidth; tableElement.style.width = totalWidth + "px"; tableElement.style.tableLayout = "fixed" }, resetColumnsWidth: function() { this._colgroupElement.find("col").width("auto"); this._tableElement.css({ width: "", tableLayout: "" }) }, groupWidth: function(value) { if (void 0 === value) { return this._groupElement.width() } else { if (value >= 0) { this._groupWidth = value; return this._groupElement[0].style.width = value + "px" } else { return this._groupElement[0].style.width = value } } }, groupHeight: function(value) { if (void 0 === value) { return this._groupElement.height() } this._groupHeight = null; if (value >= 0) { this._groupHeight = value; this._groupElement[0].style.height = value + "px" } else { this._groupElement[0].style.height = value } }, groupElement: function() { return this._groupElement }, tableElement: function() { return this._tableElement }, element: function() { return this._rootElement }, headElement: function() { return this._tableElement.find("thead") }, _setTableCss: function(styles) { if (this.option("rtlEnabled")) { styles.right = styles.left; delete styles.left } this.tableElement().css(styles) }, setVirtualContentParams: function(params) { this._virtualContent.css({ width: params.width, height: params.height }); this.groupElement().addClass("dx-virtual-mode") }, disableVirtualMode: function() { this.groupElement().removeClass("dx-virtual-mode") }, _renderVirtualContent: function() { var that = this; if (!that._virtualContent && "virtual" === that.option("scrolling.mode")) { that._virtualContent = $("<div>").addClass("dx-virtual-content").insertBefore(that._tableElement) } }, reset: function() { var that = this, tableElement = that._tableElement[0]; that._fakeTable && that._fakeTable.detach(); that._fakeTable = null; that.disableVirtualMode(); that.groupWidth("100%"); that.groupHeight("auto"); that.resetColumnsWidth(); if (tableElement) { for (var i = 0; i < tableElement.rows.length; i++) { tableElement.rows[i].style.height = "" } tableElement.style.height = ""; tableElement.style.width = "100%" } }, _updateFakeTableVisibility: function() { var that = this, tableElement = that.tableElement()[0], horizontalOffsetName = that.option("rtlEnabled") ? "right" : "left", fakeTableElement = that._fakeTable[0]; if (tableElement.style.top === fakeTableElement.style.top && fakeTableElement.style[horizontalOffsetName] === tableElement.style[horizontalOffsetName]) { that._fakeTable.addClass("dx-hidden") } else { that._fakeTable.removeClass("dx-hidden") } }, _moveFakeTableHorizontally: function(scrollPos) { var that = this, rtlEnabled = that.option("rtlEnabled"), offsetStyleName = rtlEnabled ? "right" : "left", tableElementOffset = parseFloat(that.tableElement()[0].style[offsetStyleName]), offset = getFakeTableOffset(scrollPos, tableElementOffset, that._tableWidth, that._groupWidth); if (parseFloat(that._fakeTable[0].style[offsetStyleName]) !== offset) { that._fakeTable[0].style[offsetStyleName] = offset + "px" } }, _moveFakeTableTop: function(scrollPos) { var that = this, tableElementOffsetTop = parseFloat(that.tableElement()[0].style.top), offsetTop = getFakeTableOffset(scrollPos, tableElementOffsetTop, that._tableHeight, that._groupHeight); if (parseFloat(that._fakeTable[0].style.top) !== offsetTop) { that._fakeTable[0].style.top = offsetTop + "px" } }, _moveFakeTable: function() { this._updateFakeTableVisibility() }, _createFakeTable: function() { var that = this; if (!that._fakeTable) { that._fakeTable = that.tableElement().clone().addClass("dx-pivot-grid-fake-table").appendTo(that._virtualContent) } }, render: function(rootElement, data) { var that = this; if (that._tableElement) { try { that._tableElement[0].innerHTML = "" } catch (e) { that._tableElement.empty() } that._tableElement.attr("style", "") } else { that._groupElement = that._createGroupElement(); that._tableElement = that._createTableElement(); that._tableElement.appendTo(that._groupElement); that._groupElement.appendTo(rootElement); that._rootElement = rootElement } that._colgroupElement = $("<colgroup>").appendTo(that._tableElement); that._renderTableContent(that._tableElement, data); that._renderVirtualContent() }, _getScrollable: function() { return this.groupElement().data("dxScrollable") }, on: function(eventName, handler) { var that = this, scrollable = that._getScrollable(); if (scrollable) { scrollable.on(eventName, function(e) { if (that.option("rtlEnabled")) { e.scrollOffset.left = scrollable.content().width() - scrollable._container().width() - e.scrollOffset.left } handler(e) }) } return this }, off: function(eventName) { var scrollable = this._getScrollable(); if (scrollable) { scrollable.off(eventName) } return this }, scrollTo: function(pos) { var scrollable = this._getScrollable(), scrollablePos = pos; if (scrollable) { if (this.option("rtlEnabled")) { if ("column" === this._getAreaName()) { scrollablePos = scrollable.content().width() - scrollable._container().width() - pos } else { if ("data" === this._getAreaName()) { scrollablePos = { x: scrollable.content().width() - scrollable._container().width() - pos.x, y: pos.y } } } } scrollable.scrollTo(scrollablePos); if (this._virtualContent) { this._createFakeTable(); this._moveFakeTable(pos) } } }, updateScrollable: function() { var scrollable = this._getScrollable(); if (scrollable) { return scrollable.update() } }, getColumnsCount: function() { var cells, columnCount = 0, row = this._getRowElement(0); if (row) { cells = row.cells; for (var i = 0, len = cells.length; i < len; ++i) { columnCount += cells[i].colSpan } } return columnCount }, getData: function() { var tableElement = this._tableElement; return tableElement ? tableElement.data("data") : [] } }) }, /*!********************************************************!*\ !*** ./js/ui/pivot_grid/ui.pivot_grid.headers_area.js ***! \********************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, areaItem = __webpack_require__( /*! ./ui.pivot_grid.area_item */ 458); var PIVOTGRID_AREA_CLASS = "dx-pivotgrid-area", PIVOTGRID_AREA_COLUMN_CLASS = "dx-pivotgrid-horizontal-headers", PIVOTGRID_AREA_ROW_CLASS = "dx-pivotgrid-vertical-headers", PIVOTGRID_TOTAL_CLASS = "dx-total", PIVOTGRID_GRAND_TOTAL_CLASS = "dx-grandtotal", PIVOTGRID_ROW_TOTAL_CLASS = "dx-row-total", PIVOTGRID_EXPANDED_CLASS = "dx-pivotgrid-expanded", PIVOTGRID_COLLAPSED_CLASS = "dx-pivotgrid-collapsed", PIVOTGRID_LAST_CELL_CLASS = "dx-last-cell", PIVOTGRID_VERTICAL_SCROLL_CLASS = "dx-vertical-scroll", PIVOTGRID_EXPAND_BORDER = "dx-expand-border"; function getCellPath(tableElement, cell) { if (cell) { var data = tableElement.data().data, rowIndex = cell.parentNode.rowIndex, cellIndex = cell.cellIndex; return data[rowIndex] && data[rowIndex][cellIndex] && data[rowIndex][cellIndex].path } } exports.HorizontalHeadersArea = areaItem.AreaItem.inherit({ _getAreaName: function() { return "column" }, _getAreaClassName: function() { return PIVOTGRID_AREA_COLUMN_CLASS }, _createGroupElement: function() { return $("<div>").addClass(this._getAreaClassName()).addClass(PIVOTGRID_AREA_CLASS) }, _applyCustomStyles: function(options) { var cssArray = options.cssArray, cell = options.cell, rowsCount = options.rowsCount, classArray = options.classArray; if (options.cellIndex === options.cellsCount - 1) { cssArray.push((options.rtlEnabled ? "border-left:" : "border-right:") + "0px") } if (cell.rowspan === rowsCount - options.rowIndex || options.rowIndex + 1 === rowsCount) { cssArray.push("border-bottom-width:0px") } if ("T" === cell.type || "GT" === cell.type) { classArray.push(PIVOTGRID_ROW_TOTAL_CLASS) } if ("T" === options.cell.type) { classArray.push(PIVOTGRID_TOTAL_CLASS) } if ("GT" === options.cell.type) { classArray.push(PIVOTGRID_GRAND_TOTAL_CLASS) } if (commonUtils.isDefined(cell.expanded)) { classArray.push(cell.expanded ? PIVOTGRID_EXPANDED_CLASS : PIVOTGRID_COLLAPSED_CLASS) } this.callBase(options) }, _getMainElementMarkup: function() { return "<thead class='" + this._getAreaClassName() + "'>" }, _getCloseMainElementMarkup: function() { return "</thead>" }, setVirtualContentParams: function(params) { this.callBase(params); this._setTableCss({ left: params.left, top: 0 }); this._virtualContentWidth = params.width }, hasScroll: function() { var tableWidth = this._virtualContent ? this._virtualContentWidth : this._tableWidth; if (this._groupWidth && tableWidth) { return tableWidth - this._groupWidth >= 1 } return false }, processScroll: function() { if (!this._getScrollable()) { this._groupElement.dxScrollable({ useNative: false, useSimulatedScrollbar: false, showScrollbar: false, bounceEnabled: false, direction: "horizontal", updateManually: true }) } }, processScrollBarSpacing: function(scrollBarWidth) { var that = this, groupAlignment = that.option("rtlEnabled") ? "right" : "left"; if (that._groupWidth) { that.groupWidth(that._groupWidth - scrollBarWidth) } if (that._scrollBarWidth) { that._groupElement.next().remove() } that._groupElement.toggleClass(PIVOTGRID_VERTICAL_SCROLL_CLASS, scrollBarWidth > 0); that._groupElement.css("float", groupAlignment).width(that._groupHeight); that._scrollBarWidth = scrollBarWidth }, ctor: function(component) { this.callBase(component); this._scrollBarWidth = 0 }, getScrollPath: function(offset) { var cell, tableElement = this.tableElement(); offset -= parseInt(tableElement[0].style.left, 10) || 0; $.each(tableElement.find("td"), function(_, td) { if (1 === td.colSpan && td.offsetLeft < offset && td.offsetWidth + td.offsetLeft > offset) { cell = td; return false } }); return getCellPath(tableElement, cell) }, _moveFakeTable: function(scrollPos) { this._moveFakeTableHorizontally(scrollPos); this.callBase() } }); exports.VerticalHeadersArea = exports.HorizontalHeadersArea.inherit({ _getAreaClassName: function() { return PIVOTGRID_AREA_ROW_CLASS }, _applyCustomStyles: function(options) { this.callBase(options); if (options.cellIndex === options.cellsCount - 1) { options.classArray.push(PIVOTGRID_LAST_CELL_CLASS) } if (options.rowIndex === options.rowsCount - 1) { options.cssArray.push("border-bottom: 0px") } if (options.cell.isWhiteSpace) { options.classArray.push("dx-white-space-column") } }, _getAreaName: function() { return "row" }, setVirtualContentParams: function(params) { this.callBase(params); this._setTableCss({ top: params.top, left: 0 }); this._virtualContentHeight = params.height }, hasScroll: function() { var tableHeight = this._virtualContent ? this._virtualContentHeight : this._tableHeight; if (this._groupHeight && tableHeight) { return tableHeight - this._groupHeight >= 1 } return false }, processScroll: function() { if (!this._getScrollable()) { this._groupElement.dxScrollable({ useNative: false, useSimulatedScrollbar: false, showScrollbar: false, bounceEnabled: false, direction: "vertical", updateManually: true }) } }, processScrollBarSpacing: function(scrollBarWidth) { var that = this; if (that._groupHeight) { that.groupHeight(that._groupHeight - scrollBarWidth) } if (that._scrollBarWidth) { that._groupElement.next().remove() } if (scrollBarWidth) { that._groupElement.after($("<div>").width("100%").height(scrollBarWidth - 1)) } that._scrollBarWidth = scrollBarWidth }, getScrollPath: function(offset) { var cell, tableElement = this.tableElement(); offset -= parseInt(tableElement[0].style.top, 10) || 0; $.each(tableElement.find("tr"), function(_, tr) { var td = tr.childNodes[tr.childNodes.length - 1]; if (td && 1 === td.rowSpan && td.offsetTop < offset && td.offsetHeight + td.offsetTop > offset) { cell = td; return false } }); return getCellPath(tableElement, cell) }, _moveFakeTable: function(scrollPos) { this._moveFakeTableTop(scrollPos); this.callBase() }, _getRowClassNames: function(rowIndex, cell, rowClassNames) { if (0 !== rowIndex & cell.expanded && inArray(PIVOTGRID_EXPAND_BORDER, rowClassNames) === -1) { rowClassNames.push(PIVOTGRID_EXPAND_BORDER) } }, _getMainElementMarkup: function() { return "<tbody class='" + this._getAreaClassName() + "'>" }, _getCloseMainElementMarkup: function() { return "</tbody>" }, updateColspans: function(columnCount) { var diff, i, j, rows = this.tableElement()[0].rows, columnOffset = 0, columnOffsetResetIndexes = []; if (this.getColumnsCount() - columnCount > 0) { return } for (i = 0; i < rows.length; i++) { for (j = 0; j < rows[i].cells.length; j++) { var cell = rows[i].cells[j], rowSpan = cell.rowSpan; if (columnOffsetResetIndexes[i]) { columnOffset -= columnOffsetResetIndexes[i]; columnOffsetResetIndexes[i] = 0 } diff = columnCount - (columnOffset + cell.colSpan); if (j === rows[i].cells.length - 1 && diff > 0) { cell.colSpan = cell.colSpan + diff } columnOffsetResetIndexes[i + rowSpan] = (columnOffsetResetIndexes[i + rowSpan] || 0) + cell.colSpan; columnOffset += cell.colSpan } } } }) }, /*!*******************************************************!*\ !*** ./js/ui/pivot_grid/ui.pivot_grid.fields_area.js ***! \*******************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, areaItem = __webpack_require__( /*! ./ui.pivot_grid.area_item */ 458), pivotGridUtils = __webpack_require__( /*! ./ui.pivot_grid.utils */ 450), Popup = __webpack_require__( /*! ../popup */ 200), Button = __webpack_require__( /*! ../button */ 201), DIV = "<div>"; __webpack_require__( /*! ./ui.pivot_grid.field_chooser_base */ 461); function renderGroupConnector(field, nextField, prevField, $container) { if (prevField && prevField.groupName && prevField.groupName === field.groupName) { $(DIV).addClass("dx-group-connector").addClass("dx-group-connector-prev").appendTo($container) } if (nextField && nextField.groupName && nextField.groupName === field.groupName) { $(DIV).addClass("dx-group-connector").addClass("dx-group-connector-next").appendTo($container) } } exports.FieldsArea = areaItem.AreaItem.inherit({ ctor: function(component, area) { this.callBase(component); this._area = area }, _getAreaName: function() { return "fields" }, _createGroupElement: function() { return $(DIV).addClass("dx-pivotgrid-fields-area").addClass("dx-area-fields").attr("group", this._area) }, isVisible: function() { return !!this.option("fieldPanel.visible") && this.option("fieldPanel.show" + pivotGridUtils.capitalizeFirstLetter(this._area) + "Fields") }, _renderButton: function(element) { var that = this, container = $("<td>").appendTo($("<tr>").appendTo(element)), button = that.component._createComponent($(DIV).appendTo(container), Button, { text: "Fields", icon: "menu", width: "auto", onClick: function() { var popup = that.tableElement().find(".dx-fields-area-popup").dxPopup("instance"); if (!popup.option("visible")) { popup.show() } } }); button.element().addClass("dx-pivotgrid-fields-area-hamburger") }, _getPopupOptions: function(row, button) { return { contentTemplate: function() { return $("<table>").addClass("dx-area-field-container").append($("<thead>").addClass("dx-pivotgrid-fields-area-head").append(row)) }, height: "auto", width: "auto", position: { at: "left", my: "left", of: button }, dragEnabled: false, animation: { show: { type: "pop", duration: 200 } }, shading: false, showTitle: false, closeOnOutsideClick: true, container: button.parent() } }, _renderPopup: function(tableElement, row) { var that = this, button = tableElement.find(".dx-button"), popupOptions = that._getPopupOptions(row, button), FieldChooserBase = that.component.element().dxPivotGridFieldChooserBase("instance"); if (that._rowPopup) { that._rowPopup.element().remove() } that._rowPopup = that.component._createComponent($(DIV).appendTo(tableElement), Popup, popupOptions); that._rowPopup.element().addClass("dx-fields-area-popup"); that._rowPopup.content().addClass("dx-pivotgrid-fields-container"); that._rowPopup.content().parent().attr("group", "row"); FieldChooserBase.subscribeToEvents(that._rowPopup.content()); FieldChooserBase.renderSortable(that._rowPopup.content()) }, _shouldCreateButton: function() { return false }, _renderTableContent: function(tableElement, data) { var that = this, groupElement = this.groupElement(), isVisible = this.isVisible(), fieldChooserBase = that.component.element().dxPivotGridFieldChooserBase("instance"), head = $("<thead>").addClass("dx-pivotgrid-fields-area-head").appendTo(tableElement), area = that._area, row = $("<tr>"); groupElement.toggleClass("dx-hidden", !isVisible); tableElement.addClass("dx-area-field-container"); if (!isVisible) { return } $.each(data, function(index, field) { if (field.area === area && false !== field.visible) { var td = $("<td>").append(fieldChooserBase.renderField(field, "row" === field.area)), indicators = td.find(".dx-column-indicators"); if (indicators.length && that._shouldCreateButton()) { indicators.insertAfter(indicators.next()) } td.appendTo(row); renderGroupConnector(field, data[index + 1], data[index - 1], td) } }); if (!row.children().length) { $("<td>").append($(DIV).addClass("dx-empty-area-text").text(this.option("fieldPanel.texts." + area + "FieldArea"))).appendTo(row) } if (that._shouldCreateButton()) { that._renderButton(head); that._renderPopup(tableElement, row) } else { head.append(row) } }, _renderVirtualContent: noop }) }, /*!**************************************************************!*\ !*** ./js/ui/pivot_grid/ui.pivot_grid.field_chooser_base.js ***! \**************************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), ArrayStore = __webpack_require__( /*! ../../data/array_store */ 158), clickEvent = __webpack_require__( /*! ../../events/click */ 75), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), Widget = __webpack_require__( /*! ../widget/ui.widget */ 95), headerFilter = __webpack_require__( /*! ../grid_core/ui.grid_core.header_filter_core */ 403), columnStateMixin = __webpack_require__( /*! ../grid_core/ui.grid_core.column_state_mixin */ 354), sortingMixin = __webpack_require__( /*! ../grid_core/ui.grid_core.sorting_mixin */ 363), pivotGridUtils = __webpack_require__( /*! ./ui.pivot_grid.utils */ 450), Sortable = __webpack_require__( /*! ./ui.sortable */ 462), inArray = inArray, each = $.each, IE_FIELD_WIDTH_CORRECTION = 1, DIV = "<div>", HeaderFilterView = headerFilter.HeaderFilterView; var processItems = function(groupItems, field) { var filterValues = [], isTree = !!field.groupName, isExcludeFilterType = "exclude" === field.filterType; if (field.filterValues) { each(field.filterValues, function(_, filterValue) { filterValues.push(Array.isArray(filterValue) ? filterValue.join("/") : filterValue && filterValue.valueOf()) }) } pivotGridUtils.foreachTree(groupItems, function(items) { var preparedFilterValue, item = items[0], path = pivotGridUtils.createPath(items), preparedFilterValueByText = isTree ? $.map(items, function(item) { return item.text }).reverse().join("/") : item.text; item.value = isTree ? path.slice(0) : item.key || item.value; preparedFilterValue = isTree ? path.join("/") : item.value && item.value.valueOf(); if (item.children) { item.items = item.children; item.children = null } headerFilter.updateHeaderFilterItemSelectionState(item, item.key && inArray(preparedFilterValueByText, filterValues) > -1 || inArray(preparedFilterValue, filterValues) > -1, isExcludeFilterType) }) }; function getMainGroupField(dataSource, sourceField) { var field = sourceField; if (commonUtils.isDefined(sourceField.groupIndex)) { field = dataSource.getAreaFields(sourceField.area, true)[sourceField.areaIndex] } return field } var FieldChooserBase = Widget.inherit(columnStateMixin).inherit(sortingMixin).inherit(headerFilter.headerFilterMixin).inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { allowFieldDragging: true, headerFilter: { width: 252, height: 325, texts: { emptyValue: messageLocalization.format("dxDataGrid-headerFilterEmptyValue"), ok: messageLocalization.format("dxDataGrid-headerFilterOK"), cancel: messageLocalization.format("dxDataGrid-headerFilterCancel") } } }) }, _init: function() { this.callBase(); this._headerFilterView = new HeaderFilterView(this); this._refreshDataSource(); this.subscribeToEvents() }, _refreshDataSource: function() { var dataSource = this.option("dataSource"); if (dataSource && dataSource.fields && dataSource.load) { this._dataSource = dataSource } }, _optionChanged: function(args) { switch (args.name) { case "dataSource": this._refreshDataSource(); break; case "headerFilter": case "allowFieldDragging": this._invalidate(); break; default: this.callBase(args) } }, renderField: function(field, showColumnLines) { var that = this, $fieldContent = $(DIV).addClass("dx-area-field-content").text(field.caption || field.dataField), $fieldElement = $(DIV).addClass("dx-area-field").addClass("dx-area-box").data("field", field).append($fieldContent), mainGroupField = getMainGroupField(that._dataSource, field); if ("data" !== field.area) { if (field.allowSorting) { that._applyColumnState({ name: "sort", rootElement: $fieldElement, column: { alignment: that.option("rtlEnabled") ? "right" : "left", sortOrder: "desc" === field.sortOrder ? "desc" : "asc" }, showColumnLines: showColumnLines }) } that._applyColumnState({ name: "headerFilter", rootElement: $fieldElement, column: { alignment: that.option("rtlEnabled") ? "right" : "left", filterValues: mainGroupField.filterValues, allowFiltering: mainGroupField.allowFiltering && !field.groupIndex }, showColumnLines: showColumnLines }) } if (field.groupName) { $fieldElement.attr("item-group", field.groupName) } return $fieldElement }, _clean: function() {}, _renderContentImpl: function() { this._headerFilterView.render(this.element()) }, renderSortable: function() { var that = this; that._createComponent(that.element(), Sortable, extend({ allowDragging: that.option("allowFieldDragging"), itemSelector: ".dx-area-field", itemContainerSelector: ".dx-area-field-container", groupSelector: ".dx-area-fields", groupFilter: function() { var dataSource = that._dataSource, $sortable = $(this).closest(".dx-sortable"), pivotGrid = $sortable.data("dxPivotGrid"), pivotGridFieldChooser = $sortable.data("dxPivotGridFieldChooser"); if (pivotGrid) { return pivotGrid.getDataSource() === dataSource } if (pivotGridFieldChooser) { return pivotGridFieldChooser.option("dataSource") === dataSource } return false }, itemRender: function($sourceItem, target) { var $item; if ($sourceItem.hasClass("dx-area-box")) { $item = $sourceItem.clone(); if ("drag" === target) { $.each($sourceItem, function(index, sourceItem) { $item.eq(index).css("width", parseInt($(sourceItem).css("width"), 10) + IE_FIELD_WIDTH_CORRECTION) }) } } else { $item = $(DIV).addClass("dx-area-field").addClass("dx-area-box").text($sourceItem.text()) } if ("drag" === target) { var wrapperContainer = $(DIV); $.each($item, function(_, item) { var wrapper = $("<div>").addClass("dx-pivotgrid-fields-container").addClass("dx-widget").append($(item)); wrapperContainer.append(wrapper) }); return wrapperContainer.children() } return $item }, onDragging: function(e) { var field = e.sourceElement.data("field"), targetGroup = e.targetGroup; e.cancel = false; if (true === field.isMeasure) { if ("column" === targetGroup || "row" === targetGroup || "filter" === targetGroup) { e.cancel = true } } else { if (false === field.isMeasure && "data" === targetGroup) { e.cancel = true } } }, useIndicator: true, onChanged: function(e) { var dataSource = that._dataSource, field = e.sourceElement.data("field"); e.removeSourceElement = !!e.sourceGroup; that._adjustSortableOnChangedArgs(e); if (field) { dataSource.field(getMainGroupField(dataSource, field).index, { area: e.targetGroup, areaIndex: e.targetIndex }); dataSource.load() } } }, that._getSortableOptions())) }, _adjustSortableOnChangedArgs: function(e) { e.removeSourceElement = false; e.removeTargetElement = true; e.removeSourceClass = false }, _getSortableOptions: function() { return { direction: "auto" } }, subscribeToEvents: function(element) { var that = this, func = function(e) { var field = $(e.currentTarget).data("field"), mainGroupField = extend(true, {}, getMainGroupField(that._dataSource, field)), isHeaderFilter = $(e.target).hasClass("dx-header-filter"), dataSource = that._dataSource; if (isHeaderFilter) { that._headerFilterView.showHeaderFilterMenu($(e.currentTarget), extend(mainGroupField, { type: mainGroupField.groupName ? "tree" : "list", dataSource: { load: function(options) { var userData = options.userData; if (userData.store) { return userData.store.load(options) } else { var d = $.Deferred(); dataSource.getFieldValues(mainGroupField.index).done(function(data) { userData.store = new ArrayStore(data); userData.store.load(options).done(d.resolve).fail(d.reject) }).fail(d.reject); return d } }, postProcess: function(data) { processItems(data, mainGroupField); return data } }, apply: function() { dataSource.field(mainGroupField.index, { filterValues: this.filterValues, filterType: this.filterType }); dataSource.load() } })) } else { if (field.allowSorting && "data" !== field.area) { dataSource.field(field.index, { sortOrder: "desc" === field.sortOrder ? "asc" : "desc" }); dataSource.load() } } }; if (element) { element.on(clickEvent.name, ".dx-area-field.dx-area-box", func); return } that.element().on(clickEvent.name, ".dx-area-field.dx-area-box", func) }, _initTemplates: commonUtils.noop, addWidgetPrefix: function(className) { return "dx-pivotgrid-" + className } }); registerComponent("dxPivotGridFieldChooserBase", FieldChooserBase); module.exports = FieldChooserBase }, /*!*****************************************!*\ !*** ./js/ui/pivot_grid/ui.sortable.js ***! \*****************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, eventUtils = __webpack_require__( /*! ../../events/utils */ 71), addNamespace = eventUtils.addNamespace, registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), DOMComponent = __webpack_require__( /*! ../../core/dom_component */ 43), dragEvents = __webpack_require__( /*! ../../events/drag */ 110); var SORTABLE_NAMESPACE = "dxSortable", SORTABLE_CLASS = "dx-sortable", SCROLL_STEP = 2, START_SCROLL_OFFSET = 20, SCROLL_TIMEOUT = 10; function elementHasPoint(element, x, y) { var $item = $(element), offset = $item.offset(); if (x >= offset.left && x <= offset.left + $item.outerWidth(true)) { if (y >= offset.top && y <= offset.top + $item.outerHeight(true)) { return true } } } function checkHorizontalPosition(position, itemOffset, rtl) { if (commonUtils.isDefined(itemOffset.posHorizontal)) { return rtl ? position > itemOffset.posHorizontal : position < itemOffset.posHorizontal } else { return true } } function getIndex($items, $item) { var index = -1, itemElement = $item.get(0); $.each($items, function(elementIndex, element) { var $element = $(element); if (!($element.attr("item-group") && $element.attr("item-group") === $items.eq(elementIndex - 1).attr("item-group"))) { index++ } if (element === itemElement) { return false } }); return index === $items.length ? -1 : index } function getTargetGroup(e, $groups) { var result; $.each($groups, function() { if (elementHasPoint(this, e.pageX, e.pageY)) { result = $(this) } }); return result } function getItemsOffset($elements, isVertical, $itemsContainer) { var result = [], $item = []; for (var i = 0; i < $elements.length; i += $item.length) { $item = $elements.eq(i); if ($item.attr("item-group")) { $item = $itemsContainer.find("[item-group='" + $item.attr("item-group") + "']") } if ($item.is(":visible")) { var offset = { item: $item, index: result.length, posHorizontal: isVertical ? void 0 : ($item.last().outerWidth(true) + $item.last().offset().left + $item.offset().left) / 2 }; if (isVertical) { offset.posVertical = ($item.last().offset().top + $item.offset().top + $item.last().outerHeight(true)) / 2 } else { offset.posVertical = $item.last().outerHeight(true) + $item.last().offset().top } result.push(offset) } } return result } function getScrollWrapper(scrollable) { var timeout = null, scrollTop = scrollable.scrollTop(), $element = scrollable.element(), top = $element.offset().top, height = $element.height(), delta = 0; function onScroll(e) { scrollTop = e.scrollOffset.top } scrollable.on("scroll", onScroll); function move() { stop(); scrollable.scrollTo(scrollTop += delta); timeout = setTimeout(move, SCROLL_TIMEOUT) } function stop() { clearTimeout(timeout) } function moveIfNeed(event) { if (event.pageY <= top + START_SCROLL_OFFSET) { delta = -SCROLL_STEP } else { if (event.pageY >= top + height - START_SCROLL_OFFSET) { delta = SCROLL_STEP } else { delta = 0; stop(); return } } move() } return { moveIfNeed: moveIfNeed, element: function() { return $element }, dispose: function() { stop(); scrollable.off("scroll", onScroll) } } } var Sortable = DOMComponent.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { onChanged: null, onDragging: null, itemRender: null, groupSelector: null, itemSelector: ".dx-sort-item", itemContainerSelector: ".dx-sortable", sourceClass: "dx-drag-source", dragClass: "dx-drag", targetClass: "dx-drag-target", direction: "vertical", allowDragging: true, groupFilter: null, useIndicator: false }) }, _renderItem: function($sourceItem, target) { var $item, itemRender = this.option("itemRender"); if (itemRender) { $item = itemRender($sourceItem, target) } else { $item = $sourceItem.clone(); $item.css({ width: $sourceItem.width(), height: $sourceItem.height() }) } return $item }, _renderIndicator: function($item, isVertical, $targetGroup, isLast) { var height = $item.outerHeight(true), width = $item.outerWidth(true), top = $item.offset().top - $targetGroup.offset().top, left = $item.offset().left - $targetGroup.offset().left; this._indicator.css({ position: "absolute", top: isLast && isVertical ? top + height : top, left: isLast && !isVertical ? left + width : left }).toggleClass("dx-position-indicator-horizontal", !isVertical).toggleClass("dx-position-indicator-vertical", !!isVertical).toggleClass("dx-position-indicator-last", !!isLast).height("").width("").appendTo($targetGroup); isVertical ? this._indicator.width(width) : this._indicator.height(height) }, _renderDraggable: function($sourceItem) { this._$draggable && this._$draggable.remove(); this._$draggable = this._renderItem($sourceItem, "drag").addClass(this.option("dragClass")).appendTo("body").css({ zIndex: 1e6, position: "absolute" }) }, _detachEventHandlers: function() { this._getEventListener().off(addNamespace([dragEvents.move, dragEvents.start, dragEvents.end, dragEvents.enter, dragEvents.leave, dragEvents.drop].join(" "), SORTABLE_NAMESPACE)) }, _getItemOffset: function(isVertical, itemsOffset, e) { for (var i = 0; i < itemsOffset.length; i++) { var shouldInsert = isVertical ? e.pageY < itemsOffset[i].posVertical : checkHorizontalPosition(e.pageX, itemsOffset[i], this.option("rtlEnabled")); if (shouldInsert) { return itemsOffset[i] } } }, _getEventListener: function() { var groupSelector = this.option("groupSelector"), element = this.element(); return groupSelector ? element.find(groupSelector) : element }, _attachEventHandlers: function() { var $sourceItem, sourceIndex, $targetItem, $targetGroup, startPositions, sourceGroup, $groups, that = this, itemSelector = that.option("itemSelector"), itemContainerSelector = that.option("itemContainerSelector"), groupSelector = that.option("groupSelector"), sourceClass = that.option("sourceClass"), targetClass = that.option("targetClass"), onDragging = that.option("onDragging"), groupFilter = that.option("groupFilter"), element = that.element(), scrollWrapper = null, targetIndex = -1; var setStartPositions = function() { startPositions = []; $.each($sourceItem, function(_, item) { startPositions.push($(item).offset()) }) }; var createGroups = function() { if (!groupSelector) { return element } else { return groupFilter ? $(groupSelector).filter(groupFilter) : element.find(groupSelector) } }; var disposeScrollWrapper = function() { scrollWrapper && scrollWrapper.dispose(); scrollWrapper = null }; var invokeOnDraggingEvent = function() { var draggingArgs = { sourceGroup: sourceGroup, sourceIndex: sourceIndex, sourceElement: $sourceItem, targetGroup: $targetGroup.attr("group"), targetIndex: $targetGroup.find(itemSelector).index($targetItem) }; onDragging && onDragging(draggingArgs); if (draggingArgs.cancel) { $targetGroup = void 0 } }; that._detachEventHandlers(); that.option("allowDragging") && that._getEventListener().on(addNamespace(dragEvents.start, SORTABLE_NAMESPACE), itemSelector, function(e) { $sourceItem = $(e.currentTarget); var $sourceGroup = $sourceItem.closest(groupSelector); sourceGroup = $sourceGroup.attr("group"); sourceIndex = getIndex((groupSelector ? $sourceGroup : element).find(itemSelector), $sourceItem); if ($sourceItem.attr("item-group")) { $sourceItem = $sourceGroup.find("[item-group='" + $sourceItem.attr("item-group") + "']") } that._renderDraggable($sourceItem); $targetItem = that._renderItem($sourceItem, "target").addClass(targetClass); $sourceItem.addClass(sourceClass); setStartPositions(); $groups = createGroups(); that._indicator = $("<div>").addClass("dx-position-indicator") }).on(addNamespace(dragEvents.move, SORTABLE_NAMESPACE), function(e) { var $item, $itemContainer, $items, $lastItem, isVertical, itemOffset, $prevItem, itemsOffset = []; if (!$sourceItem) { return } targetIndex = -1; that._indicator.detach(); $.each(that._$draggable, function(index, draggableElement) { $(draggableElement).css({ top: startPositions[index].top + e.offset.y, left: startPositions[index].left + e.offset.x }) }); $targetGroup && $targetGroup.removeClass(targetClass); $targetGroup = getTargetGroup(e, $groups); $targetGroup && invokeOnDraggingEvent(); if ($targetGroup && scrollWrapper && $targetGroup.get(0) !== scrollWrapper.element().get(0)) { disposeScrollWrapper() } scrollWrapper && scrollWrapper.moveIfNeed(e); if (!$targetGroup) { $targetItem.detach(); return } if (!scrollWrapper && $targetGroup.attr("allow-scrolling")) { scrollWrapper = getScrollWrapper($targetGroup.dxScrollable("instance")) } $targetGroup.addClass(targetClass); $itemContainer = $targetGroup.find(itemContainerSelector); $items = $itemContainer.find(itemSelector); var targetSortable = $targetGroup.closest("." + SORTABLE_CLASS).data("dxSortable"), useIndicator = targetSortable.option("useIndicator"); isVertical = "vertical" === (targetSortable || that).option("direction"); itemsOffset = getItemsOffset($items, isVertical, $itemContainer); itemOffset = that._getItemOffset(isVertical, itemsOffset, e); if (itemOffset) { $item = itemOffset.item; $prevItem = itemsOffset[itemOffset.index - 1] && itemsOffset[itemOffset.index - 1].item; if ($item.hasClass(sourceClass) || $prevItem && $prevItem.hasClass(sourceClass) && $prevItem.is(":visible")) { $targetItem.detach(); return } targetIndex = itemOffset.index; if (!useIndicator) { $targetItem.insertBefore($item); return } var isAnotherGroup = $targetGroup.attr("group") !== sourceGroup, isSameIndex = targetIndex === sourceIndex, isNextIndex = targetIndex === sourceIndex + 1; if (isAnotherGroup) { that._renderIndicator($item, isVertical, $targetGroup, that.option("rtlEnabled") && !isVertical); return } if (!isSameIndex && !isNextIndex) { that._renderIndicator($item, isVertical, $targetGroup, that.option("rtlEnabled") && !isVertical) } } else { $lastItem = $items.last(); if ($lastItem.is(":visible") && $lastItem.hasClass(sourceClass)) { return } if ($itemContainer.length) { targetIndex = itemsOffset.length ? itemsOffset[itemsOffset.length - 1].index + 1 : 0 } if (useIndicator) { $items.length && that._renderIndicator($lastItem, isVertical, $targetGroup, !that.option("rtlEnabled") || isVertical) } else { $targetItem.appendTo($itemContainer) } } }).on(addNamespace(dragEvents.end, SORTABLE_NAMESPACE), function() { disposeScrollWrapper(); if (!$sourceItem) { return } var onChanged = that.option("onChanged"), changedArgs = { sourceIndex: sourceIndex, sourceElement: $sourceItem, sourceGroup: sourceGroup, targetIndex: targetIndex, removeSourceElement: true, removeTargetElement: false, removeSourceClass: true }; if ($targetGroup) { $targetGroup.removeClass(targetClass); changedArgs.targetGroup = $targetGroup.attr("group"); if (sourceGroup !== changedArgs.targetGroup || targetIndex > -1) { onChanged && onChanged(changedArgs); changedArgs.removeSourceElement && $sourceItem.remove() } } that._indicator.detach(); changedArgs.removeSourceClass && $sourceItem.removeClass(sourceClass); $sourceItem = null; that._$draggable.remove(); that._$draggable = null; changedArgs.removeTargetElement && $targetItem.remove(); $targetItem.removeClass(targetClass); $targetItem = null }) }, _init: function() { this.callBase(); this._attachEventHandlers() }, _render: function() { this.callBase(); this.element().addClass(SORTABLE_CLASS) }, _dispose: function() { var that = this; that.callBase.apply(that, arguments); that._$draggable && that._$draggable.detach(); that._indicator && that._indicator.detach() }, _optionChanged: function(args) { var that = this; switch (args.name) { case "onDragging": case "onChanged": case "itemRender": case "groupSelector": case "itemSelector": case "itemContainerSelector": case "sourceClass": case "targetClass": case "dragClass": case "allowDragging": case "groupFilter": case "useIndicator": that._attachEventHandlers(); break; case "direction": break; default: that.callBase(args) } } }); Sortable.prototype.__SCROLL_STEP = SCROLL_STEP; registerComponent("dxSortable", Sortable); module.exports = Sortable }, /*!*********************************************************!*\ !*** ./js/ui/pivot_grid/ui.pivot_grid.field_chooser.js ***! \*********************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), iconUtils = __webpack_require__( /*! ../../core/utils/icon */ 115), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), pivotGridUtils = __webpack_require__( /*! ./ui.pivot_grid.utils */ 450), TreeView = __webpack_require__( /*! ../tree_view */ 380), ContextMenu = __webpack_require__( /*! ../context_menu */ 338), BaseFieldChooser = __webpack_require__( /*! ./ui.pivot_grid.field_chooser_base */ 461), inArray = inArray, each = $.each, DIV = "<div>"; __webpack_require__( /*! ./data_source */ 452); var FIELDCHOOSER_CLASS = "dx-pivotgridfieldchooser", FIELDCHOOSER_CONTAINER_CLASS = "dx-pivotgridfieldchooser-container", FIELDS_CONTAINER_CLASS = "dx-pivotgrid-fields-container"; function getDimensionFields(item, fields) { var result = []; if (item.items) { for (var i = 0; i < item.items.length; i++) { result.push.apply(result, getDimensionFields(item.items[i], fields)) } } else { if (commonUtils.isDefined(item.index)) { result.push(fields[item.index]) } } return result } function getFirstItem(item, condition) { if (item.items) { for (var i = 0; i < item.items.length; i++) { var childrenItem = getFirstItem(item.items[i], condition); if (childrenItem) { return childrenItem } } } if (condition(item)) { return item } } var compareOrder = [function(a, b) { var aValue = -!!a.isMeasure, bValue = +!!b.isMeasure; return aValue + bValue }, function(a, b) { var aValue = -!!(a.items && a.items.length), bValue = +!!(b.items && b.items.length); return aValue + bValue }, function(a, b) { var aValue = +!!(a.field && a.field.levels && a.field.levels.length), bValue = -!!(b.field && b.field.levels && b.field.levels.length); return aValue + bValue }, pivotGridUtils.getCompareFunction(function(item) { return item.text })]; function compareItems(a, b) { var result = 0, i = 0; while (!result && compareOrder[i]) { result = compareOrder[i++](a, b) } return result } function getScrollable(container) { return container.find(".dx-scrollable").dxScrollable("instance") } var FieldChooser = BaseFieldChooser.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { height: 400, layout: 0, dataSource: null, onContextMenuPreparing: null, texts: { columnFields: messageLocalization.format("dxPivotGrid-columnFields"), rowFields: messageLocalization.format("dxPivotGrid-rowFields"), dataFields: messageLocalization.format("dxPivotGrid-dataFields"), filterFields: messageLocalization.format("dxPivotGrid-filterFields"), allFields: messageLocalization.format("dxPivotGrid-allFields") } }) }, _refreshDataSource: function() { var that = this; that._expandedPaths = []; that._changedHandler = that._changedHandler || function() { each(that._dataChangedHandlers, function(_, func) { func() }); that._fireContentReadyAction() }; if (that._dataSource) { that._dataSource.off("changed", that._changedHandler); that._dataSource = void 0 } that.callBase(); that._dataSource && that._dataSource.on("changed", that._changedHandler) }, _init: function() { this.callBase(); this._refreshDataSource(); this._dataChangedHandlers = []; this._initActions() }, _initActions: function() { this._actions = { onContextMenuPreparing: this._createActionByOption("onContextMenuPreparing") } }, _trigger: function(eventName, eventArg) { this._actions[eventName](eventArg) }, _setOptionsByReference: function() { this.callBase(); extend(this._optionsByReference, { dataSource: true }) }, _optionChanged: function(args) { var that = this; switch (args.name) { case "dataSource": that._refreshDataSource(); that._invalidate(); break; case "layout": case "texts": that._invalidate(); break; case "onContextMenuPreparing": that._actions[args.name] = that._createActionByOption(args.name); break; default: that.callBase(args) } }, _clean: function() { this.element().children("." + FIELDCHOOSER_CONTAINER_CLASS).remove() }, _renderContentImpl: function() { var $col1, $col2, that = this, element = this.element(), $container = $(DIV).addClass(FIELDCHOOSER_CONTAINER_CLASS).appendTo(element), layout = that.option("layout"); element.addClass(FIELDCHOOSER_CLASS).addClass(FIELDS_CONTAINER_CLASS); that._dataChangedHandlers = []; that.callBase(); if (0 === layout) { $col1 = $(DIV).addClass("dx-col").appendTo($container); $col2 = $(DIV).addClass("dx-col").appendTo($container); that._renderArea($col1, "all"); that._renderArea($col1, "filter"); that._renderArea($col2, "row"); that._renderArea($col2, "column"); that._renderArea($col2, "data") } else { if (1 === layout) { $col1 = $(DIV).addClass("dx-col").appendTo($container); $col2 = $(DIV).addClass("dx-col").appendTo($container); that._renderArea($col1, "all"); that._renderArea($col2, "filter"); that._renderArea($col2, "row"); that._renderArea($col2, "column"); that._renderArea($col2, "data") } else { this._renderArea($container, "all"); $col1 = $(DIV).addClass("dx-col").appendTo($container); $col2 = $(DIV).addClass("dx-col").appendTo($container); that._renderArea($col1, "filter"); that._renderArea($col1, "row"); that._renderArea($col2, "column"); that._renderArea($col2, "data") } } that.renderSortable(); that.updateDimensions(); that._renderContextMenu() }, _fireContentReadyAction: function() { if (!this._dataSource || !this._dataSource.isLoading()) { this.callBase() } }, _getContextMenuArgs: function(jQueryEvent) { var field, area, targetFieldElement = $(jQueryEvent.target).closest(".dx-area-field"), targetGroupElement = $(jQueryEvent.target).closest(".dx-area-fields"); if (targetFieldElement.length) { field = targetFieldElement.data("field") } if (targetGroupElement.length) { area = targetGroupElement.attr("group") } return { jQueryEvent: jQueryEvent, field: field, area: area, items: [] } }, _renderContextMenu: function() { var that = this, $container = that.element(); if (that._contextMenu) { that._contextMenu.element().remove() } that._contextMenu = that._createComponent($(DIV).appendTo($container), ContextMenu, { onPositioning: function(actionArgs) { var args, event = actionArgs.jQueryEvent; if (!event) { return } args = that._getContextMenuArgs(event); that._trigger("onContextMenuPreparing", args); if (args.items && args.items.length) { actionArgs.component.option("items", args.items) } else { actionArgs.cancel = true } }, target: $container, onItemClick: function(params) { params.itemData.onItemClick && params.itemData.onItemClick(params) }, cssClass: "dx-pivotgridfieldchooser-context-menu" }) }, _createTreeItems: function(fields, groupFieldNames, path) { var isMeasure, that = this, resultItems = [], groupedItems = [], groupFieldName = groupFieldNames[0], fieldsByGroup = {}; if (!groupFieldName) { each(fields, function(index, field) { var icon; if (true === field.isMeasure) { icon = "measure" } if (false === field.isMeasure) { icon = field.groupName ? "hierarchy" : "dimension" } resultItems.push({ index: field.index, field: field, key: field.dataField, selected: commonUtils.isDefined(field.area), text: field.caption || field.dataField, icon: icon, isMeasure: field.isMeasure, isDefault: field.isDefault }) }) } else { each(fields, function(index, field) { var groupName = field[groupFieldName] || ""; fieldsByGroup[groupName] = fieldsByGroup[groupName] || []; fieldsByGroup[groupName].push(field); if (void 0 === isMeasure) { isMeasure = true } isMeasure = isMeasure && true === field.isMeasure }); each(fieldsByGroup, function(groupName, fields) { var currentPath = path ? path + "." + groupName : groupName; var items = that._createTreeItems(fields, groupFieldNames.slice(1), currentPath); if (groupName) { groupedItems.push({ key: groupName, text: groupName, path: currentPath, isMeasure: items.isMeasure, expanded: inArray(currentPath, that._expandedPaths) >= 0, items: items }) } else { resultItems = items } }); resultItems = groupedItems.concat(resultItems); resultItems.isMeasure = isMeasure } return resultItems }, _createFieldsDataSource: function(dataSource) { var treeItems, fields = dataSource && dataSource.fields() || []; fields = $.map(fields, function(field) { return false === field.visible || commonUtils.isDefined(field.groupIndex) ? null : field }); treeItems = this._createTreeItems(fields, ["dimension", "displayFolder"]); pivotGridUtils.foreachDataLevel(treeItems, function(items) { items.sort(compareItems) }, 0, "items"); return treeItems }, _renderFieldsTreeView: function(container) { var that = this, dataSource = that._dataSource, treeView = that._createComponent(container, TreeView, { dataSource: that._createFieldsDataSource(dataSource), showCheckBoxesMode: "normal", itemTemplate: function(itemData, itemIndex, itemElement) { if (itemData.icon) { iconUtils.getImageContainer(itemData.icon).appendTo(itemElement) } $("<span>").toggleClass("dx-area-field", !itemData.items).data("field", itemData.field).text(itemData.text).appendTo(itemElement) }, onItemCollapsed: function(e) { var index = inArray(e.itemData.path, that._expandedPaths); if (index >= 0) { that._expandedPaths.splice(index, 1) } }, onItemExpanded: function(e) { var index = inArray(e.itemData.path, that._expandedPaths); if (index < 0) { that._expandedPaths.push(e.itemData.path) } }, onItemSelectionChanged: function(e) { var field, fields, area, data = e.itemData, needSelectDefaultItem = true; if (data.items) { if (data.selected) { treeView.unselectItem(data); return } fields = getDimensionFields(data, dataSource.fields()); for (var i = 0; i < fields.length; i++) { if (fields[i].area) { needSelectDefaultItem = false; break } } if (needSelectDefaultItem) { var item = getFirstItem(data, function(item) { return item.isDefault }) || getFirstItem(data, function(item) { return commonUtils.isDefined(item.index) }); item && treeView.selectItem(item); return } } else { field = dataSource.fields()[data.index]; if (data.selected) { area = field.isMeasure ? "data" : "column" } if (field) { fields = [field] } } each(fields, function(_, field) { dataSource.field(field.index, { area: area, areaIndex: void 0 }) }); dataSource.load() } }), dataChanged = function() { var scrollable = getScrollable(container), scrollTop = scrollable ? scrollable.scrollTop() : 0; treeView.option({ dataSource: that._createFieldsDataSource(dataSource) }); scrollable = getScrollable(container); if (scrollable) { scrollable.scrollTo({ y: scrollTop }); scrollable.update() } }; that._dataChangedHandlers.push(dataChanged) }, _renderAreaFields: function($container, area) { var that = this, dataSource = that._dataSource, fields = dataSource ? dataSource.getAreaFields(area, true) : []; $container.empty(); each(fields, function(_, field) { if (false !== field.visible) { that.renderField(field, true).appendTo($container) } }) }, _renderArea: function(container, area) { var $fieldsContainer, $fieldsContent, render, that = this, $areaContainer = $(DIV).addClass("dx-area").appendTo(container), caption = that.option("texts." + area + "Fields"); $("<span>").addClass("dx-area-icon").addClass("dx-area-icon-" + area).appendTo($areaContainer); $("<span>").html(" ").appendTo($areaContainer); $("<span>").addClass("dx-area-caption").text(caption).appendTo($areaContainer); $fieldsContainer = $(DIV).addClass("dx-area-fields").height(0).appendTo($areaContainer); if ("all" !== area) { $fieldsContent = $(DIV).addClass("dx-area-field-container").appendTo($fieldsContainer); render = function() { that._renderAreaFields($fieldsContent, area) }; that._dataChangedHandlers.push(render); render(); $fieldsContainer.attr("group", area).attr("allow-scrolling", true).dxScrollable() } else { $fieldsContainer.addClass("dx-treeview-border-visible"); that._renderFieldsTreeView($fieldsContainer) } }, _getSortableOptions: function() { return {} }, _adjustSortableOnChangedArgs: function() {}, getDataSource: function() { return this._dataSource }, updateDimensions: function() { var areaHeight, $element = this.element(), $container = $element.children(".dx-pivotgridfieldchooser-container"), $cols = $element.find(".dx-col"), $areaElements = $element.find(".dx-area-fields"), $scrollableElements = $element.find(".dx-area .dx-scrollable"); $areaElements.height(0); if (0 === this.option("layout")) { areaHeight = Math.floor(($element.height() - $container.height()) / 3); $areaElements.height(areaHeight); $areaElements.eq(0).height($cols.eq(1).height() - $cols.eq(0).height() + areaHeight) } else { if (1 === this.option("layout")) { areaHeight = Math.floor(($element.height() - $container.height()) / 4); $areaElements.height(areaHeight); $areaElements.eq(0).height($cols.eq(1).height() - $cols.eq(0).height() + areaHeight) } else { areaHeight = Math.floor(($element.height() - $container.height()) / 4); $areaElements.height(areaHeight); $areaElements.eq(0).height(2 * areaHeight) } } $scrollableElements.dxScrollable("update") }, _visibilityChanged: function(visible) { if (visible) { this.updateDimensions() } } }); registerComponent("dxPivotGridFieldChooser", FieldChooser); module.exports = FieldChooser }, /*!**************************************************!*\ !*** ./js/ui/pivot_grid/ui.pivot_grid.export.js ***! \**************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), utils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, formatHelper = __webpack_require__( /*! ../../format_helper */ 66), clientExporter = __webpack_require__( /*! ../../client_exporter */ 20), excelExporter = clientExporter.excel, DEFAULT_DATA_TYPE = "string", exportMixin = __webpack_require__( /*! ../grid_core/ui.grid_core.export_mixin */ 419), when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when, COLUMN_HEADER_STYLE_ID = 0, ROW_HEADER_STYLE_ID = 1, DATA_STYLE_OFFSET = 2, DEFAUL_COLUMN_WIDTH = 100; exports.ExportMixin = extend({}, exportMixin, { exportToExcel: function() { var that = this; clientExporter.export(that.getDataProvider(), { fileName: that.option("export.fileName"), proxyUrl: that.option("export.proxyUrl"), format: "EXCEL", rtlEnabled: that.option("rtlEnabled"), exportingAction: that._actions.onExporting, exportedAction: that._actions.onExported, fileSavingAction: that._actions.onFileSaving }, excelExporter.getData) }, _getLength: function(items) { var i, itemCount = items[0].length, cellCount = 0; for (i = 0; i < itemCount; i++) { cellCount += items[0][i].colspan || 1 } return cellCount }, _getAllItems: function(columnsInfo, rowsInfoItems, cellsInfo) { var cellIndex, rowIndex, sourceItems = columnsInfo.concat(cellsInfo), rowsLength = this._getLength(rowsInfoItems), colsLength = this._getLength(columnsInfo), headerRowsCount = columnsInfo.length; for (rowIndex = 0; rowIndex < rowsInfoItems.length; rowIndex++) { for (cellIndex = rowsInfoItems[rowIndex].length - 1; cellIndex >= 0; cellIndex--) { if (!utils.isDefined(sourceItems[rowIndex + headerRowsCount])) { sourceItems[rowIndex + headerRowsCount] = [] } sourceItems[rowIndex + headerRowsCount].splice(0, 0, extend({}, rowsInfoItems[rowIndex][cellIndex])) } } sourceItems[0].splice(0, 0, extend({}, this._getEmptyCell(), { alignment: this._options.rtlEnabled ? "right" : "left", colspan: rowsLength, rowspan: headerRowsCount })); return this._prepareItems(rowsLength + colsLength, sourceItems) }, getDataProvider: function() { var that = this, dataController = this._dataController, items = $.Deferred(); dataController.beginLoading(); setTimeout(function() { var columnsInfo = extend(true, [], dataController.getColumnsInfo(true)), rowsInfoItems = extend(true, [], dataController.getRowsInfo(true)), cellsInfo = dataController.getCellsInfo(true); items.resolve(that._getAllItems(columnsInfo, rowsInfoItems, cellsInfo)); dataController.endLoading() }); return new exports.DataProvider({ items: items, rtlEnabled: this.option("rtlEnabled"), dataFields: this.getDataSource().getAreaFields("data") }) } }); function getCellDataType(field) { if (field && field.customizeText) { return "string" } if (field.dataType) { return field.dataType } if (field.format) { if (formatHelper.format(1, field.format)) { return "number" } if (formatHelper.format(new Date, field.format)) { return "date" } } return DEFAULT_DATA_TYPE } exports.DataProvider = Class.inherit({ ctor: function(options) { this._options = options; this._styles = [] }, ready: function() { var that = this, options = that._options, dataFields = options.dataFields; return when(options.items).done(function(items) { var headerSize = items[0][0].rowspan, columns = items[headerSize - 1], dataItemStyle = { alignment: options.rtlEnabled ? "left" : "right" }; that._styles = [{ alignment: "center", dataType: "string" }, { alignment: options.rtlEnabled ? "right" : "left", dataType: "string" }]; dataFields.forEach(function(dataField) { that._styles.push(extend({}, dataItemStyle, { format: dataField.format, precision: dataField.precision, dataType: getCellDataType(dataField) })) }); $.each(columns, function(columnIndex, column) { column.width = DEFAUL_COLUMN_WIDTH }); options.columns = columns; options.items = items }) }, getColumns: function() { return this._options.columns }, getRowsCount: function() { return this._options.items.length }, getGroupLevel: function() { return 0 }, getCellMerging: function(rowIndex, cellIndex) { var items = this._options.items, item = items[rowIndex] && items[rowIndex][cellIndex]; return item ? { colspan: item.colspan - 1, rowspan: item.rowspan - 1 } : { colspan: 0, rowspan: 0 } }, getFrozenArea: function() { var items = this._options.items; return { x: items[0][0].colspan, y: items[0][0].rowspan } }, getCellType: function(rowIndex, cellIndex) { var style = this._styles[this.getStyleId(rowIndex, cellIndex)]; return style && style.dataType || "string" }, getCellValue: function(rowIndex, cellIndex) { var items = this._options.items, item = items[rowIndex] && items[rowIndex][cellIndex] || {}; if ("string" === this.getCellType(rowIndex, cellIndex)) { return item.text } else { return item.value } }, getStyles: function() { return this._styles }, getStyleId: function(rowIndex, cellIndex) { var items = this._options.items, columnHeaderSize = items[0][0].rowspan, rowHeaderSize = items[0][0].colspan, item = items[rowIndex] && items[rowIndex][cellIndex] || {}; if (cellIndex >= rowHeaderSize && rowIndex < columnHeaderSize) { return COLUMN_HEADER_STYLE_ID } else { if (rowIndex >= columnHeaderSize && cellIndex < rowHeaderSize) { return ROW_HEADER_STYLE_ID } else { return DATA_STYLE_OFFSET + (item.dataIndex || 0) } } } }) }, /*!*************************************************************!*\ !*** ./js/ui/pivot_grid/ui.pivot_grid.chart_integration.js ***! \*************************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, pivotUtils = __webpack_require__( /*! ./ui.pivot_grid.utils */ 450), foreachTree = pivotUtils.foreachTree, FORMAT_DICTIONARY = { number: "numeric", date: "datetime" }, UNBIND_KEY = "dxPivotGridUnbinding"; function getFormattedValue(path, fields) { var value = [], lastFieldIndex = fields.length - 1; $.each(path, function(i, item) { value.push(item.text || pivotUtils.formatValue(item.value, fields[lastFieldIndex - i])) }); return value.reverse() } function getExpandedLevel(node) { var level = 0; foreachTree(node, function(members) { level = Math.max(level, members.length - 1) }); return level } function processDataCell(processCellArgs, processCell) { var chartDataItem = processCellArgs.chartDataItem, processedCell = processCell && processCell(processCellArgs); if (processedCell) { chartDataItem = extend({}, chartDataItem, processedCell.chartDataItem); processedCell = extend({}, processCellArgs, processedCell, { chartDataItem: chartDataItem }); return processedCell } return processCellArgs } function createChartDataSource(pivotGridDataSource, mapOptions, axisDictionary) { var measureIndex, dataField, rowMemberIndex, rowVisibility, rowPathFormatted, rowPath, columnMemberIndex, columnVisibility, columnPath, columnPathFormatted, data = pivotGridDataSource.getData(), dataSource = [], dataFields = pivotGridDataSource.getAreaFields("data"), rowFields = pivotGridDataSource.getAreaFields("row"), columnFields = pivotGridDataSource.getAreaFields("column"), columnElements = [{ index: data.grandTotalColumnIndex, children: data.columns }], rowElements = [{ index: data.grandTotalRowIndex, children: data.rows }], rowLevel = getExpandedLevel(rowElements), columnLevel = getExpandedLevel(columnElements); function createDataItem() { var axis, dataCell = (data.values[rowMemberIndex] || [])[columnMemberIndex] || [], value = dataCell[measureIndex], processCellArgs = { rowPath: rowPath, maxRowLevel: rowLevel, rowPathFormatted: rowPathFormatted, rowFields: rowFields, columnPathFormatted: columnPathFormatted, maxColumnLevel: columnLevel, columnPath: columnPath, columnFields: columnFields, dataFields: dataFields, dataIndex: measureIndex, dataValues: dataCell, visible: columnVisibility && rowVisibility }, seriesName = (mapOptions.inverted ? columnPathFormatted : rowPathFormatted).join(" - "), argument = (mapOptions.inverted ? rowPathFormatted : columnPathFormatted).join("/"); if (dataFields.length > 1) { if ("args" === mapOptions.putDataFieldsInto || "both" === mapOptions.putDataFieldsInto) { argument += " | " + dataField.caption } if ("args" !== mapOptions.putDataFieldsInto) { seriesName += " | " + dataField.caption; if ("singleAxis" !== mapOptions.dataFieldsDisplayMode) { axis = dataField.caption } } } processCellArgs.chartDataItem = { val: void 0 === value ? null : value, series: seriesName, arg: argument }; processCellArgs = processDataCell(processCellArgs, mapOptions.processCell); if (processCellArgs.visible) { axisDictionary[processCellArgs.chartDataItem.series] = axisDictionary[processCellArgs.chartDataItem.series] || axis; dataSource.push(processCellArgs.chartDataItem) } } function foreachRowColumn(callBack) { foreachTree(rowElements, function(rowMembers) { rowMemberIndex = rowMembers[0].index; rowMembers = rowMembers.slice(0, rowMembers.length - 1); rowVisibility = rowLevel === rowMembers.length; rowPath = pivotUtils.createPath(rowMembers); rowPathFormatted = getFormattedValue(rowMembers, rowFields); if (0 === rowPath.length) { rowPathFormatted = [mapOptions.grandTotalText] } foreachTree(columnElements, function(columnMembers) { columnMemberIndex = columnMembers[0].index; columnMembers = columnMembers.slice(0, columnMembers.length - 1); columnVisibility = columnLevel === columnMembers.length; columnPath = pivotUtils.createPath(columnMembers); columnPathFormatted = getFormattedValue(columnMembers, columnFields); if (0 === columnPath.length) { columnPathFormatted = [mapOptions.grandTotalText] } callBack() }) }) } function foreachDataField(callback) { $.each(dataFields, function(index, field) { dataField = field; measureIndex = index; callback() }) } if (false === mapOptions.alternateDataFields) { foreachDataField(function() { foreachRowColumn(createDataItem) }) } else { foreachRowColumn(function() { foreachDataField(createDataItem) }) } return dataSource } function createValueAxisOptions(dataSource, options) { var dataFields = dataSource.getAreaFields("data"); if ("args" !== options.putDataFieldsInto && "singleAxis" !== options.dataFieldsDisplayMode || 1 === dataFields.length) { var valueAxisSettings = []; $.each(dataFields, function(_, dataField) { var valueAxisOptions = { name: dataField.caption, title: dataField.caption, valueType: FORMAT_DICTIONARY[dataField.dataType] || dataField.dataType, label: { format: dataField.format, precision: dataField.precision } }; if (dataField.customizeText) { valueAxisOptions.label.customizeText = function(formatObject) { return dataField.customizeText.call(dataField, formatObject) } } if ("splitPanes" === options.dataFieldsDisplayMode) { valueAxisOptions.pane = dataField.caption } valueAxisSettings.push(valueAxisOptions) }); return valueAxisSettings } return [{}] } function createPanesOptions(dataSource, options) { var panes = []; var dataFields = dataSource.getAreaFields("data"); if (dataFields.length > 1 && "splitPanes" === options.dataFieldsDisplayMode && "args" !== options.putDataFieldsInto) { $.each(dataFields, function(_, dataField) { panes.push({ name: dataField.caption }) }) } if (!panes.length) { panes.push({}) } return panes } function createChartOptions(dataSource, options) { var customizeSeries = options.customizeSeries, customizeChart = options.customizeChart, chartOptions = { valueAxis: createValueAxisOptions(dataSource, options), panes: createPanesOptions(dataSource, options) }, axisDictionary = {}; if (customizeChart) { chartOptions = extend(true, {}, chartOptions, customizeChart(chartOptions)) } chartOptions.dataSource = createChartDataSource(dataSource, options, axisDictionary); chartOptions.seriesTemplate = { nameField: "series", customizeSeries: function(seriesName) { var seriesOptions = {}; if ("splitPanes" === options.dataFieldsDisplayMode) { seriesOptions.pane = axisDictionary[seriesName] } else { if ("singleAxis" !== options.dataFieldsDisplayMode) { seriesOptions.axis = axisDictionary[seriesName] } } if (customizeSeries) { seriesOptions = extend(seriesOptions, customizeSeries(seriesName, seriesOptions)) } return seriesOptions } }; return chartOptions } function getChartInstance(chartElement) { if (!chartElement) { return false } if (chartElement.NAME) { return "dxChart" === chartElement.NAME && chartElement } var element = $(chartElement); return element.data("dxChart") && element.dxChart("instance") } function removeBinding(chart) { var unbind = chart.element().data(UNBIND_KEY); unbind && unbind() } module.exports = { bindChart: function(chart, integrationOptions) { integrationOptions = extend({}, integrationOptions); var disposeBinding, that = this, updateChart = function() { integrationOptions.grandTotalText = that.option("texts.grandTotal"); var chartOptions = createChartOptions(that.getDataSource(), integrationOptions); chart.option(chartOptions) }; chart = getChartInstance(chart); if (!chart) { return null } removeBinding(chart); that.on("changed", updateChart); updateChart(); disposeBinding = function() { chart.element().removeData(UNBIND_KEY); that.off("changed", updateChart) }; chart.on("disposing", disposeBinding); this.on("disposing", disposeBinding); chart.element().data(UNBIND_KEY, disposeBinding); return disposeBinding } } }, /*!*******************************************!*\ !*** ./js/ui/pivot_grid_field_chooser.js ***! \*******************************************/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__( /*! ./pivot_grid/ui.pivot_grid.field_chooser */ 463) }, /*!****************************************!*\ !*** ./js/ui/pivot_grid/xmla_store.js ***! \****************************************/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__( /*! ./xmla_store/xmla_store */ 455).XmlaStore }, /*!****************************!*\ !*** ./js/ui/scheduler.js ***! \****************************/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__( /*! ./scheduler/ui.scheduler */ 469) }, /*!*****************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.js ***! \*****************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), translator = __webpack_require__( /*! ../../animation/translator */ 69), errors = __webpack_require__( /*! ../widget/ui.errors */ 22), dialog = __webpack_require__( /*! ../dialog */ 199), recurrenceUtils = __webpack_require__( /*! ./utils.recurrence */ 470), domUtils = __webpack_require__( /*! ../../core/utils/dom */ 56), dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, dateSerialization = __webpack_require__( /*! ../../core/utils/date_serialization */ 259), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), devices = __webpack_require__( /*! ../../core/devices */ 53), config = __webpack_require__( /*! ../../core/config */ 15), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), dateSerialization = __webpack_require__( /*! ../../core/utils/date_serialization */ 259), Widget = __webpack_require__( /*! ../widget/ui.widget */ 95), subscribes = __webpack_require__( /*! ./ui.scheduler.subscribes */ 471), FunctionTemplate = __webpack_require__( /*! ../widget/function_template */ 98), appointmentTooltip = __webpack_require__( /*! ./ui.scheduler.appointment_tooltip */ 474), SchedulerHeader = __webpack_require__( /*! ./ui.scheduler.header */ 475), SchedulerWorkSpaceDay = __webpack_require__( /*! ./ui.scheduler.work_space_day */ 478), SchedulerWorkSpaceWeek = __webpack_require__( /*! ./ui.scheduler.work_space_week */ 481), SchedulerWorkSpaceWorkWeek = __webpack_require__( /*! ./ui.scheduler.work_space_work_week */ 482), SchedulerWorkSpaceMonth = __webpack_require__( /*! ./ui.scheduler.work_space_month */ 483), SchedulerTimelineDay = __webpack_require__( /*! ./ui.scheduler.timeline_day */ 484), SchedulerTimelineWeek = __webpack_require__( /*! ./ui.scheduler.timeline_week */ 486), SchedulerTimelineWorkWeek = __webpack_require__( /*! ./ui.scheduler.timeline_work_week */ 487), SchedulerTimelineMonth = __webpack_require__( /*! ./ui.scheduler.timeline_month */ 488), SchedulerAgenda = __webpack_require__( /*! ./ui.scheduler.agenda */ 489), SchedulerResourceManager = __webpack_require__( /*! ./ui.scheduler.resource_manager */ 490), SchedulerAppointmentModel = __webpack_require__( /*! ./ui.scheduler.appointment_model */ 491), SchedulerAppointments = __webpack_require__( /*! ./ui.scheduler.appointments */ 492), SchedulerLayoutManager = __webpack_require__( /*! ./ui.scheduler.appointments.layout_manager */ 494), DropDownAppointments = __webpack_require__( /*! ./ui.scheduler.appointments.drop_down */ 501), SchedulerTimezones = __webpack_require__( /*! ./ui.scheduler.timezones */ 472), DataHelperMixin = __webpack_require__( /*! ../../data_helper */ 152), loading = __webpack_require__( /*! ./ui.loading */ 502), AppointmentForm = __webpack_require__( /*! ./ui.scheduler.appointment_form */ 503), Popup = __webpack_require__( /*! ../popup */ 200), when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when, EmptyTemplate = __webpack_require__( /*! ../widget/empty_template */ 99), BindableTemplate = __webpack_require__( /*! ../widget/bindable_template */ 166); var WIDGET_CLASS = "dx-scheduler", WIDGET_SMALL_CLASS = "dx-scheduler-small", WIDGET_READONLY_CLASS = "dx-scheduler-readonly", APPOINTMENT_POPUP_CLASS = "dx-scheduler-appointment-popup", RECURRENCE_EDITOR_ITEM_CLASS = "dx-scheduler-recurrence-rule-item", RECURRENCE_EDITOR_OPENED_ITEM_CLASS = "dx-scheduler-recurrence-rule-item-opened", WIDGET_SMALL_WIDTH = 400, APPOINTEMENT_POPUP_WIDTH = 610; var VIEWS_CONFIG = { day: { workSpace: SchedulerWorkSpaceDay, renderingStrategy: "vertical" }, week: { workSpace: SchedulerWorkSpaceWeek, renderingStrategy: "vertical" }, workWeek: { workSpace: SchedulerWorkSpaceWorkWeek, renderingStrategy: "vertical" }, month: { workSpace: SchedulerWorkSpaceMonth, renderingStrategy: "horizontalMonth" }, timelineDay: { workSpace: SchedulerTimelineDay, renderingStrategy: "horizontal" }, timelineWeek: { workSpace: SchedulerTimelineWeek, renderingStrategy: "horizontal" }, timelineWorkWeek: { workSpace: SchedulerTimelineWorkWeek, renderingStrategy: "horizontal" }, timelineMonth: { workSpace: SchedulerTimelineMonth, renderingStrategy: "horizontalMonthLine" }, agenda: { workSpace: SchedulerAgenda, renderingStrategy: "agenda" } }; var Scheduler = Widget.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { views: ["day", "week"], currentView: "day", currentDate: dateUtils.trimTime(new Date), min: void 0, max: void 0, dateSerializationFormat: void 0, firstDayOfWeek: void 0, groups: [], resources: [], dataSource: null, appointmentTemplate: "item", dataCellTemplate: null, timeCellTemplate: null, resourceCellTemplate: null, dateCellTemplate: null, startDayHour: 0, endDayHour: 24, editing: { allowAdding: true, allowDeleting: true, allowDragging: true, allowResizing: true, allowUpdating: true }, showAllDayPanel: true, recurrenceEditMode: "dialog", cellDuration: 30, onAppointmentRendered: null, onAppointmentClick: null, onAppointmentDblClick: null, onCellClick: null, onAppointmentAdding: null, onAppointmentAdded: null, onAppointmentUpdating: null, onAppointmentUpdated: null, onAppointmentDeleting: null, onAppointmentDeleted: null, onAppointmentFormCreated: null, appointmentTooltipTemplate: "appointmentTooltip", appointmentPopupTemplate: "appointmentPopup", crossScrollingEnabled: false, useDropDownViewSwitcher: false, startDateExpr: "startDate", endDateExpr: "endDate", textExpr: "text", descriptionExpr: "description", allDayExpr: "allDay", recurrenceRuleExpr: "recurrenceRule", recurrenceExceptionExpr: "recurrenceException", remoteFiltering: false, timeZone: "", startDateTimeZoneExpr: "startDateTimeZone", endDateTimeZoneExpr: "endDateTimeZone", noDataText: messageLocalization.format("dxCollectionWidget-noDataText"), allowMultipleCellSelection: true }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function() { return "desktop" === devices.real().deviceType && !devices.isSimulator() }, options: { focusStateEnabled: true } }, { device: function() { return !devices.current().generic }, options: { useDropDownViewSwitcher: true, editing: { allowDragging: false, allowResizing: false } } }]) }, _setDeprecatedOptions: function() { this.callBase(); extend(this._deprecatedOptions, { horizontalScrollingEnabled: { since: "16.1", alias: "crossScrollingEnabled" } }) }, _optionChanged: function(args) { var value = args.value, name = args.name; switch (args.name) { case "firstDayOfWeek": this._updateOption("workSpace", name, value); this._updateOption("header", name, value); break; case "currentDate": value = this._dateOption(name); value = dateUtils.trimTime(new Date(value)); this._workSpace.option(name, value); this._header.option(name, value); this._appointments.option("items", []); this._filterAppointmentsByDate(); this._reloadDataSource(); break; case "dataSource": this._initDataSource(); this._customizeStoreLoadOptions(); this._appointmentModel.setDataSource(this._dataSource); this._loadResources().done(function() { this._filterAppointmentsByDate(); this._updateOption("workSpace", "showAllDayPanel", this.option("showAllDayPanel")); this._reloadDataSource() }.bind(this)); break; case "min": case "max": value = this._dateOption(name); this._updateOption("header", name, new Date(value)); this._updateOption("workSpace", name, new Date(value)); break; case "views": if (!!this._getCurrentViewOptions()) { this.repaint() } else { this._header.option(name, value) } break; case "useDropDownViewSwitcher": this._header.option(name, value); break; case "currentView": this._appointments.option({ items: [], allowDrag: this._allowDragging(), allowResize: this._allowResizing(), appointmentDurationInMinutes: this._getCurrentViewOption("cellDuration") }); this._header.option("min", this._dateOption("min")); this._header.option("max", this._dateOption("max")); this._header.option("currentDate", this._dateOption("currentDate")); this._header.option("firstDayOfWeek", this._getCurrentViewOption("firstDayOfWeek")); this._header.option(name, value); this._loadResources().done(function(resources) { this.getLayoutManager().initRenderingStrategy(this._getAppointmentsRenderingStrategy()); this._refreshWorkSpace(resources); this._filterAppointmentsByDate(); this._appointments.option("allowAllDayResize", "day" !== value); this._reloadDataSource() }.bind(this)); break; case "appointmentTemplate": this._appointments.option("itemTemplate", value); break; case "dateCellTemplate": case "resourceCellTemplate": case "dataCellTemplate": case "timeCellTemplate": this._updateOption("workSpace", name, value); this.repaint(); break; case "groups": this._loadResources().done(function(resources) { this._workSpace.option(name, resources); this._filterAppointmentsByDate(); this._reloadDataSource() }.bind(this)); break; case "resources": this._resourcesManager.setResources(this.option("resources")); this._appointmentModel.setDataAccessors(this._combineDataAccessors()); this._loadResources().done(function(resources) { this._workSpace.option("groups", resources); this._filterAppointmentsByDate(); this._reloadDataSource() }.bind(this)); break; case "startDayHour": case "endDayHour": this._appointments.option("items", []); this._updateOption("workSpace", name, value); this._appointments.repaint(); this._filterAppointmentsByDate(); this._reloadDataSource(); break; case "onAppointmentAdding": case "onAppointmentAdded": case "onAppointmentUpdating": case "onAppointmentUpdated": case "onAppointmentDeleting": case "onAppointmentDeleted": case "onAppointmentFormCreated": this._actions[name] = this._createActionByOption(name); break; case "onAppointmentRendered": this._appointments.option("onItemRendered", this._getAppointmentRenderedAction()); break; case "onAppointmentClick": this._appointments.option("onItemClick", this._createActionByOption(name)); break; case "onAppointmentDblClick": this._appointments.option(name, this._createActionByOption(name)); break; case "noDataText": case "allowMultipleCellSelection": case "accessKey": case "onCellClick": this._workSpace.option(name, value); break; case "crossScrollingEnabled": this._loadResources().done(function(resources) { this._refreshWorkSpace(resources); this._appointments.repaint() }.bind(this)); break; case "cellDuration": this._updateOption("workSpace", "hoursInterval", value / 60); this._appointments.option("appointmentDurationInMinutes", value); break; case "tabIndex": case "focusStateEnabled": this._updateOption("header", name, value); this._updateOption("workSpace", name, value); this._appointments.option(name, value); this.callBase(args); break; case "width": this._updateOption("header", name, value); if (this.option("crossScrollingEnabled")) { this._updateOption("workSpace", "width", value) } this.callBase(args); this._dimensionChanged(); break; case "height": this.callBase(args); this._dimensionChanged(); break; case "editing": this._initEditing(); var editing = this._editing; this._bringEditingModeToAppointments(editing); this.hideAppointmentTooltip(); this._cleanPopup(); break; case "showAllDayPanel": this._loadResources().done(function() { this._filterAppointmentsByDate(); this._updateOption("workSpace", "allDayExpanded", value); this._updateOption("workSpace", name, value); this._reloadDataSource() }.bind(this)); break; case "appointmentTooltipTemplate": case "appointmentPopupTemplate": case "recurrenceEditMode": case "remoteFiltering": case "timeZone": this.repaint(); break; case "dateSerializationFormat": break; case "startDateExpr": case "endDateExpr": case "startDateTimeZoneExpr": case "endDateTimeZoneExpr": case "textExpr": case "descriptionExpr": case "allDayExpr": case "recurrenceRuleExpr": case "recurrenceExceptionExpr": this._updateExpression(name, value); this._initAppointmentTemplate(); this.repaint(); break; default: this.callBase(args) } }, _dateOption: function(optionName) { var optionValue = this._getCurrentViewOption(optionName); return dateSerialization.deserializeDate(optionValue) }, _getSerializationFormat: function(optionName) { var value = this._getCurrentViewOption(optionName); if ("number" === typeof value) { return "number" } if (!commonUtils.isString(value)) { return } return dateSerialization.getDateSerializationFormat(value) }, _bringEditingModeToAppointments: function(editing) { var currentView = this.option("currentView"); var editingConfig = { allowDelete: editing.allowUpdating && editing.allowDeleting }; if ("agenda" !== currentView) { editingConfig.allowDrag = editing.allowDragging; editingConfig.allowResize = editing.allowResizing; editingConfig.allowAllDayResize = editing.allowResizing && "day" !== currentView } this._appointments.option(editingConfig); this._dropDownAppointments.repaintExisting(this.element()) }, _allowDragging: function() { return this._editing.allowDragging && "agenda" !== this.option("currentView") }, _allowResizing: function() { return this._editing.allowResizing && "agenda" !== this.option("currentView") }, _allowAllDayResizing: function() { return this._editing.allowResizing && "day" !== this.option("currentView") }, _isAllDayExpanded: function(items) { return this.option("showAllDayPanel") && this._appointmentModel.hasAllDayAppointments(items, this._getCurrentViewOption("startDayHour"), this._getCurrentViewOption("endDayHour")) }, _getTimezoneOffsetByOption: function(date) { return this._calculateTimezoneByValue(this.option("timeZone"), date) }, _calculateTimezoneByValue: function(timezone, date) { var result = timezone; if ("string" === typeof timezone) { date = date || new Date; result = SchedulerTimezones.getTimezoneOffsetById(timezone, Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes())) } return result }, _filterAppointmentsByDate: function() { var dateRange = this._workSpace.getDateRange(); this._appointmentModel.filterByDate(dateRange[0], dateRange[1], this.option("remoteFiltering"), this.option("dateSerializationFormat")) }, _loadResources: function() { var groups = this._getCurrentViewOption("groups"), result = $.Deferred(); this._resourcesManager.loadResources(groups).done(function(resources) { this._loadedResources = resources; result.resolve(resources) }.bind(this)); return result.promise() }, _dataSourceLoadedCallback: $.Callbacks(), _reloadDataSource: function() { if (this._dataSource) { this._dataSource.load().done(function() { loading.hide(); this._fireContentReadyAction() }.bind(this)).fail(function() { loading.hide() }); this._dataSource.isLoading() && loading.show({ container: this.element(), position: { of: this.element() } }) } }, _dimensionChanged: function() { var filteredItems = this.getFilteredItems(); this._toggleSmallClass(); if ("agenda" !== this.option("currentView") && filteredItems && this._isVisible()) { this._workSpace._cleanAllowedPositions(); this._workSpace.option("allDayExpanded", this._isAllDayExpanded(filteredItems)); var appointments = this._layoutManager.createAppointmentsMap(filteredItems); this._appointments.option("items", appointments) } this.hideAppointmentTooltip() }, _clean: function() { this._cleanPopup(); this.callBase() }, _toggleSmallClass: function() { var width = this.element().outerWidth(); this.element().toggleClass(WIDGET_SMALL_CLASS, width < WIDGET_SMALL_WIDTH) }, _visibilityChanged: function(visible) { visible && this._dimensionChanged() }, _dataSourceOptions: function() { return { paginate: false } }, _init: function() { this._initExpressions({ startDate: this.option("startDateExpr"), endDate: this.option("endDateExpr"), startDateTimeZone: this.option("startDateTimeZoneExpr"), endDateTimeZone: this.option("endDateTimeZoneExpr"), allDay: this.option("allDayExpr"), text: this.option("textExpr"), description: this.option("descriptionExpr"), recurrenceRule: this.option("recurrenceRuleExpr"), recurrenceException: this.option("recurrenceExceptionExpr") }); this.callBase(); this._initDataSource(); this._loadedResources = []; this._proxiedCustomizeStoreLoadOptionsHandler = this._customizeStoreLoadOptionsHandler.bind(this); this._customizeStoreLoadOptions(); this.element().addClass(WIDGET_CLASS); this._initEditing(); this._resourcesManager = new SchedulerResourceManager(this.option("resources")); var combinedDataAccessors = this._combineDataAccessors(); this._appointmentModel = new SchedulerAppointmentModel(this._dataSource, { startDateExpr: this.option("startDateExpr"), endDateExpr: this.option("endDateExpr"), allDayExpr: this.option("allDayExpr"), recurrenceRuleExpr: this.option("recurrenceRuleExpr"), recurrenceExceptionExpr: this.option("recurrenceExceptionExpr") }, combinedDataAccessors); this._initActions(); this._dropDownAppointments = new DropDownAppointments; this._subscribes = subscribes }, _initTemplates: function() { this.callBase(); this._initAppointmentTemplate(); this._defaultTemplates.appointmentTooltip = new EmptyTemplate(this); this._defaultTemplates.appointmentPopup = new EmptyTemplate(this) }, _initAppointmentTemplate: function() { var that = this; this._defaultTemplates.item = new BindableTemplate(function($container, data, model) { var appointmentsInst = that.getAppointmentsInstance(); appointmentsInst._renderAppointmentTemplate.call(appointmentsInst, $container, data, model) }, ["html", "text", "startDate", "endDate", "allDay", "description", "recurrenceRule", "recurrenceException", "startDateTimeZone", "endDateTimeZone"], this.option("integrationOptions.watchMethod"), { text: this._dataAccessors.getter.text, startDate: this._dataAccessors.getter.startDate, endDate: this._dataAccessors.getter.endDate, startDateTimeZone: this._dataAccessors.getter.startDateTimeZone, endDateTimeZone: this._dataAccessors.getter.endDateTimeZone, allDay: this._dataAccessors.getter.allDay, recurrenceRule: this._dataAccessors.getter.recurrenceRule }) }, _combineDataAccessors: function() { var resourcesDataAccessors = this._resourcesManager._dataAccessors, result = extend(true, {}, this._dataAccessors); $.each(resourcesDataAccessors, function(type, accessor) { result[type].resources = accessor }.bind(this)); return result }, _renderContent: function() { this._renderContentImpl() }, _dataSourceChangedHandler: function(result) { this._workSpaceRecalculation.done(function() { var isAgenda = "agenda" === this._getAppointmentsRenderingStrategy(), appointmentsToRepaint = result; this._filteredItems = this.fire("prerenderFilter"); this._workSpace.option("allDayExpanded", this._isAllDayExpanded(this._filteredItems)); if (isAgenda) { this.getRenderingStrategyInstance().calculateRows(this._filteredItems, 7, this.option("currentDate"), true) } if (this._filteredItems.length && this._isVisible()) { var appointments = this._layoutManager.createAppointmentsMap(this._filteredItems); appointmentsToRepaint = this._layoutManager.markRepaintedAppointments(appointments, this.getAppointmentsInstance().option("items")); this._appointments.option("items", appointmentsToRepaint); delete this.instance._updatedAppointment } else { this._appointments.option("items", []) } if (isAgenda) { this._workSpace._renderView(); this._dataSourceLoadedCallback.fireWith(this, [result]) } }.bind(this)) }, _initExpressions: function(fields) { var dataCoreUtils = __webpack_require__( /*! ../../core/utils/data */ 50), isDateField = function(field) { return "startDate" === field || "endDate" === field }; if (!this._dataAccessors) { this._dataAccessors = { getter: {}, setter: {} } } $.each(fields, function(name, expr) { if (!!expr) { var getter = dataCoreUtils.compileGetter(expr), setter = dataCoreUtils.compileSetter(expr); var dateGetter, dateSetter; if (isDateField(name)) { var that = this; dateGetter = function() { var value = getter.apply(this, arguments); if (config().forceIsoDateParsing) { if (!that.option("dateSerializationFormat")) { that.option("dateSerializationFormat", dateSerialization.getDateSerializationFormat(value)) } value = dateSerialization.deserializeDate(value) } return value }; dateSetter = function(object, value) { if (config().forceIsoDateParsing || that.option("dateSerializationFormat")) { value = dateSerialization.serializeDate(value, that.option("dateSerializationFormat")) } setter.call(this, object, value) } } this._dataAccessors.getter[name] = dateGetter || getter; this._dataAccessors.setter[name] = dateSetter || setter } else { delete this._dataAccessors.getter[name]; delete this._dataAccessors.setter[name] } }.bind(this)) }, _updateExpression: function(name, value) { var exprObj = {}; exprObj[name.replace("Expr", "")] = value; this._initExpressions(exprObj) }, _initEditing: function() { var editing = this.option("editing"); this._editing = { allowAdding: !!editing, allowUpdating: !!editing, allowDeleting: !!editing, allowResizing: !!editing, allowDragging: !!editing }; if (commonUtils.isObject(editing)) { this._editing = extend(this._editing, editing) } this._editing.allowDragging = this._editing.allowDragging && this._editing.allowUpdating; this._editing.allowResizing = this._editing.allowResizing && this._editing.allowUpdating; this.element().toggleClass(WIDGET_READONLY_CLASS, this._isReadOnly()) }, _isReadOnly: function() { var result = true, editing = this._editing; for (var prop in editing) { if (editing.hasOwnProperty(prop)) { result = result && !editing[prop] } } return result }, _customizeStoreLoadOptions: function() { this._dataSource && this._dataSource.on("customizeStoreLoadOptions", this._proxiedCustomizeStoreLoadOptionsHandler) }, _dispose: function() { this.hideAppointmentPopup(); this.hideAppointmentTooltip(); this.option("templatesRenderAsynchronously") && clearTimeout(this._recalculateTimeout); clearTimeout(this._repaintTimer); this._dataSource && this._dataSource.off("customizeStoreLoadOptions", this._proxiedCustomizeStoreLoadOptionsHandler); this.callBase() }, _customizeStoreLoadOptionsHandler: function(options) { options.storeLoadOptions.dxScheduler = { startDate: this.getStartViewDate(), endDate: this.getEndViewDate(), resources: this.option("resources") } }, _initActions: function() { this._actions = { onAppointmentAdding: this._createActionByOption("onAppointmentAdding"), onAppointmentAdded: this._createActionByOption("onAppointmentAdded"), onAppointmentUpdating: this._createActionByOption("onAppointmentUpdating"), onAppointmentUpdated: this._createActionByOption("onAppointmentUpdated"), onAppointmentDeleting: this._createActionByOption("onAppointmentDeleting"), onAppointmentDeleted: this._createActionByOption("onAppointmentDeleted"), onAppointmentFormCreated: this._createActionByOption("onAppointmentFormCreated") } }, _getAppointmentRenderedAction: function() { return this._createActionByOption("onAppointmentRendered", { excludeValidators: ["designMode", "disabled", "readOnly"] }) }, _renderFocusTarget: commonUtils.noop, _render: function() { this.callBase(); this._renderHeader(); this._layoutManager = new SchedulerLayoutManager(this, this._getAppointmentsRenderingStrategy()); this._appointments = this._createComponent("<div>", SchedulerAppointments, this._appointmentsConfig()); this._appointments.option("itemTemplate", this._getAppointmentTemplate("appointmentTemplate")); this._toggleSmallClass(); this._loadResources().done(function(resources) { this._renderWorkSpace(resources); var $fixedContainer = this._workSpace.getFixedContainer(), $allDayContainer = this._workSpace.getAllDayContainer(); this._appointments.option({ fixedContainer: $fixedContainer, allDayContainer: $allDayContainer }); this._filterAppointmentsByDate(); this._reloadDataSource() }.bind(this)) }, _renderHeader: function() { var $header = $("<div>").appendTo(this.element()); this._header = this._createComponent($header, SchedulerHeader, this._headerConfig()) }, _headerConfig: function() { var result, currentViewOptions = this._getCurrentViewOptions(), viewNames = $.map(this.option("views"), function(view) { return commonUtils.isObject(view) ? view.type : view }); result = extend({ firstDayOfWeek: this.option("firstDayOfWeek"), currentView: this.option("currentView"), tabIndex: this.option("tabIndex"), focusStateEnabled: this.option("focusStateEnabled"), width: this.option("width"), rtlEnabled: this.option("rtlEnabled"), useDropDownViewSwitcher: this.option("useDropDownViewSwitcher") }, currentViewOptions); result.observer = this; result.views = viewNames; result.min = new Date(this._dateOption("min")); result.max = new Date(this._dateOption("max")); result.currentDate = dateUtils.trimTime(new Date(this._dateOption("currentDate"))); return result }, _appointmentsConfig: function() { var that = this; var config = { observer: this, onItemRendered: this._getAppointmentRenderedAction(), onItemClick: this._createActionByOption("onAppointmentClick"), onAppointmentDblClick: this._createActionByOption("onAppointmentDblClick"), tabIndex: this.option("tabIndex"), focusStateEnabled: this.option("focusStateEnabled"), appointmentDurationInMinutes: this._getCurrentViewOption("cellDuration"), allowDrag: this._allowDragging(), allowDelete: this._editing.allowUpdating && this._editing.allowDeleting, allowResize: this._allowResizing(), allowAllDayResize: this._allowAllDayResizing(), rtlEnabled: this.option("rtlEnabled"), onContentReady: function() { that._workSpace && that._workSpace.option("allDayExpanded", that._isAllDayExpanded(that.getFilteredItems())) } }; return config }, getAppointmentDurationInMinutes: function() { return this._getCurrentViewOption("cellDuration") }, _getAppointmentsRenderingStrategy: function() { return VIEWS_CONFIG[this.option("currentView")].renderingStrategy }, _getDayDuration: function() { return this._getCurrentViewOption("endDayHour") - this._getCurrentViewOption("startDayHour") }, _renderWorkSpace: function(groups) { var $workSpace = $("<div>").appendTo(this.element()); this._workSpace = this._createComponent($workSpace, VIEWS_CONFIG[this.option("currentView")].workSpace, this._workSpaceConfig(groups)); this._workSpace.getWorkArea().append(this._appointments.element()); this._recalculateWorkspace() }, _recalculateWorkspace: function() { this._workSpaceRecalculation = $.Deferred(); var recalculateHandler = function() { domUtils.triggerResizeEvent(this._workSpace.element()); this._workSpaceRecalculation.resolve() }.bind(this); if (this.option("templatesRenderAsynchronously")) { this._recalculateTimeout = setTimeout(recalculateHandler) } else { recalculateHandler() } }, _workSpaceConfig: function(groups) { var result, currentViewOptions = this._getCurrentViewOptions(); result = extend({ noDataText: this.option("noDataText"), firstDayOfWeek: this.option("firstDayOfWeek"), startDayHour: this.option("startDayHour"), endDayHour: this.option("endDayHour"), tabIndex: this.option("tabIndex"), accessKey: this.option("accessKey"), focusStateEnabled: this.option("focusStateEnabled"), cellDuration: this.option("cellDuration"), showAllDayPanel: this.option("showAllDayPanel"), allDayExpanded: this._appointments.option("items"), crossScrollingEnabled: this.option("crossScrollingEnabled"), dataCellTemplate: this.option("dataCellTemplate"), timeCellTemplate: this.option("timeCellTemplate"), resourceCellTemplate: this.option("resourceCellTemplate"), dateCellTemplate: this.option("dateCellTemplate"), allowMultipleCellSelection: this.option("allowMultipleCellSelection") }, currentViewOptions); result.observer = this; result.groups = groups; result.onCellClick = this._createActionByOption("onCellClick"); result.min = new Date(this._dateOption("min")); result.max = new Date(this._dateOption("max")); result.currentDate = dateUtils.trimTime(new Date(this._dateOption("currentDate"))); result.hoursInterval = result.cellDuration / 60; result.allDayExpanded = this._isAllDayExpanded(this.getFilteredItems()); result.dataCellTemplate = result.dataCellTemplate ? this._getTemplate(result.dataCellTemplate) : null; result.timeCellTemplate = result.timeCellTemplate ? this._getTemplate(result.timeCellTemplate) : null; result.resourceCellTemplate = result.resourceCellTemplate ? this._getTemplate(result.resourceCellTemplate) : null; result.dateCellTemplate = result.dateCellTemplate ? this._getTemplate(result.dateCellTemplate) : null; return result }, _getCurrentViewOptions: function() { var result, currentView = this.option("currentView"); $.each(this.option("views"), function(_, view) { if (commonUtils.isObject(view) && view.type === currentView) { result = view; return false } }); return result }, _getCurrentViewOption: function(optionName) { var currentViewOptions = this._getCurrentViewOptions(); if (currentViewOptions && currentViewOptions[optionName]) { return currentViewOptions[optionName] } return this.option(optionName) }, _getAppointmentTemplate: function(optionName) { var currentViewOptions = this._getCurrentViewOptions(); if (currentViewOptions && currentViewOptions[optionName]) { return this._getTemplate(currentViewOptions[optionName]) } return this._getTemplateByOption(optionName) }, _updateOption: function(viewName, optionName, value) { var currentViewOptions = this._getCurrentViewOptions(); if (!currentViewOptions || !commonUtils.isDefined(currentViewOptions[optionName])) { this["_" + viewName].option(optionName, value) } }, _refreshWorkSpace: function(groups) { this._appointments.element().detach(); this._workSpace._dispose(); this._workSpace.element().remove(); delete this._workSpace; this._renderWorkSpace(groups); this._appointments.option({ fixedContainer: this._workSpace.getFixedContainer(), allDayContainer: this._workSpace.getAllDayContainer() }) }, getWorkSpaceScrollable: function() { return this._workSpace.getScrollable() }, getWorkSpaceScrollableScrollTop: function() { return this._workSpace.getScrollableScrollTop() }, getWorkSpaceScrollableScrollLeft: function() { return this._workSpace.getScrollableScrollLeft() }, getWorkSpaceScrollableContainer: function() { return this._workSpace.getScrollableContainer() }, getWorkSpaceAllDayHeight: function() { return this._workSpace.getAllDayHeight() }, getWorkSpaceHeaderPanelHeight: function() { return this._workSpace.getHeaderPanelHeight() }, getWorkSpaceDateTableOffset: function() { return !this.option("crossScrollingEnabled") || this.option("rtlEnabled") ? this._workSpace.getTimePanelWidth() : 0 }, getWorkSpace: function() { return this._workSpace }, getHeader: function() { return this._header }, _createPopup: function(appointmentData, processTimeZone) { this._$popup = $("<div>").addClass(APPOINTMENT_POPUP_CLASS).appendTo(this.element()); this._initDynamicPopupTemplate(appointmentData, processTimeZone); this._popup = this._createComponent(this._$popup, Popup, this._popupConfig(appointmentData)) }, _popupContent: function(appointmentData, processTimeZone) { var $popupContent = this._popup.content(); this._createAppointmentForm(appointmentData, $popupContent, processTimeZone); return $popupContent }, _createAppointmentForm: function(appointmentData, $content, processTimeZone) { var allDay = this.fire("getField", "allDay", appointmentData), resources = this.option("resources"), startDate = this.fire("getField", "startDate", appointmentData), endDate = this.fire("getField", "endDate", appointmentData); $.each(this._resourcesManager.getResourcesFromItem(appointmentData, true) || {}, function(resourceName, resourceValue) { appointmentData[resourceName] = resourceValue }); var formData = extend(true, {}, appointmentData); if (processTimeZone) { startDate = this.fire("convertDateByTimezone", startDate); endDate = this.fire("convertDateByTimezone", endDate); this.fire("setField", "startDate", formData, startDate); this.fire("setField", "endDate", formData, endDate) } if (this._appointmentForm) { var startDateExpr = this.option("startDateExpr"), endDateExpr = this.option("endDateExpr"); this._appointmentForm.option("formData", formData); var startDateFormItem = this._appointmentForm.itemOption(startDateExpr), endDateFormItem = this._appointmentForm.itemOption(endDateExpr); if (startDateFormItem && endDateFormItem) { var startDateEditorOptions = startDateFormItem.editorOptions, endDateEditorOptions = endDateFormItem.editorOptions; if (allDay) { startDateEditorOptions.type = endDateEditorOptions.type = "date" } else { startDateEditorOptions.type = endDateEditorOptions.type = "datetime" } this._appointmentForm.itemOption(startDateExpr, "editorOptions", startDateEditorOptions); this._appointmentForm.itemOption(endDateExpr, "editorOptions", endDateEditorOptions) } } else { AppointmentForm.prepareAppointmentFormEditors(allDay, { textExpr: this.option("textExpr"), allDayExpr: this.option("allDayExpr"), startDateExpr: this.option("startDateExpr"), endDateExpr: this.option("endDateExpr"), descriptionExpr: this.option("descriptionExpr"), recurrenceRuleExpr: this.option("recurrenceRuleExpr"), startDateTimeZoneExpr: this.option("startDateTimeZoneExpr"), endDateTimeZoneExpr: this.option("endDateTimeZoneExpr") }, this); if (resources && resources.length) { this._resourcesManager.setResources(this.option("resources")); AppointmentForm.concatResources(this._resourcesManager.getEditors()) } this._appointmentForm = AppointmentForm.create(this._createComponent.bind(this), $content, this._editAppointmentData ? !this._editing.allowUpdating : false, formData) } var recurrenceRuleExpr = this.option("recurrenceRuleExpr"), recurrentEditorItem = recurrenceRuleExpr ? this._appointmentForm.itemOption(recurrenceRuleExpr) : null; if (recurrentEditorItem) { var options = recurrentEditorItem.editorOptions || {}; options.startDate = startDate; this._appointmentForm.itemOption(recurrenceRuleExpr, "editorOptions", options) } this._actions.onAppointmentFormCreated({ form: this._appointmentForm, appointmentData: appointmentData }) }, _initDynamicPopupTemplate: function(appointmentData, processTimeZone) { var that = this; this._defaultTemplates.appointmentPopup = new FunctionTemplate(function(options) { var $popupContent = that._popupContent(appointmentData, processTimeZone); options.container.append($popupContent); return options.container }) }, _popupConfig: function(appointmentData) { var template = this._getTemplateByOption("appointmentPopupTemplate"); return { maxWidth: APPOINTEMENT_POPUP_WIDTH, onHiding: function() { this.focus() }.bind(this), contentTemplate: new FunctionTemplate(function(options) { return template.render({ model: appointmentData, container: options.container }) }), defaultOptionsRules: [{ device: function() { return !devices.current().generic }, options: { fullScreen: true } }] } }, _getPopupToolbarItems: function() { return [{ shortcut: "done", location: "after", onClick: this._doneButtonClickHandler.bind(this) }, { shortcut: "cancel", location: "after" }] }, _cleanPopup: function() { if (this._$popup) { this._popup.element().remove(); delete this._$popup; delete this._popup; delete this._appointmentForm } }, _doneButtonClickHandler: function(args) { args.cancel = true; this._saveChanges(); var startDate = this.fire("getField", "startDate", this._appointmentForm.option("formData")); this._workSpace.updateScrollPosition(startDate) }, _saveChanges: function() { var validation = this._appointmentForm.validate(); if (validation && !validation.isValid) { return false } var formData = this._appointmentForm.option("formData"), oldData = this._editAppointmentData, recData = this._updatedRecAppointment; function convert(obj, dateFieldName) { var date = new Date(this.fire("getField", dateFieldName, obj)); var tzDiff = 36e5 * this._getTimezoneOffsetByOption() + this.fire("getClientTimezoneOffset", date); return new Date(date.getTime() + tzDiff) } if (oldData) { var processedStartDate = this.fire("convertDateByTimezoneBack", this.fire("getField", "startDate", formData)); var processedEndDate = this.fire("convertDateByTimezoneBack", this.fire("getField", "endDate", formData)); this.fire("setField", "startDate", formData, processedStartDate); this.fire("setField", "endDate", formData, processedEndDate) } if (oldData && !recData) { this.updateAppointment(oldData, formData) } else { recData && this.updateAppointment(oldData, recData); delete this._updatedRecAppointment; if ("number" === typeof this._getTimezoneOffsetByOption()) { this.fire("setField", "startDate", formData, convert.call(this, formData, "startDate")); this.fire("setField", "endDate", formData, convert.call(this, formData, "endDate")) } this.addAppointment(formData) } return true }, _checkRecurringAppointment: function(targetAppointment, singleAppointment, exceptionDate, callback, isDeleted, isPopupEditing) { delete this._updatedRecAppointment; var recurrenceRule = this.fire("getField", "recurrenceRule", targetAppointment); if (!recurrenceUtils.getRecurrenceRule(recurrenceRule).isValid || !this._editing.allowUpdating) { callback(); return } var editMode = this.option("recurrenceEditMode"); switch (editMode) { case "series": callback(); break; case "occurrence": this._singleAppointmentChangesHandler(targetAppointment, singleAppointment, exceptionDate, isDeleted, isPopupEditing); break; default: this._showRecurrenceChangeConfirm(isDeleted).done(function(result) { result && callback(); !result && this._singleAppointmentChangesHandler(targetAppointment, singleAppointment, exceptionDate, isDeleted, isPopupEditing) }.bind(this)).fail(function() { this._appointments.moveAppointmentBack() }.bind(this)) } }, _singleAppointmentChangesHandler: function(targetAppointment, singleAppointment, exceptionDate, isDeleted, isPopupEditing) { exceptionDate = new Date(exceptionDate); function processAppointmentDates(appointment, commonTimezoneOffset) { var startDate = this.fire("getField", "startDate", appointment); var processedStartDate = this.fire("convertDateByTimezoneBack", startDate, this.fire("getField", "startDateTimeZone", appointment)); var endDate = this.fire("getField", "endDate", appointment); var processedEndDate = this.fire("convertDateByTimezoneBack", endDate, this.fire("getField", "endDateTimeZone", appointment)); if ("number" === typeof commonTimezoneOffset && !isNaN(commonTimezoneOffset)) { var startDateClientTzOffset = -(this._subscribes.getClientTimezoneOffset(startDate) / 36e5); var endDateClientTzOffset = -(this._subscribes.getClientTimezoneOffset(endDate) / 36e5); var processedStartDateInUTC = processedStartDate.getTime() - 36e5 * startDateClientTzOffset, processedEndDateInUTC = processedEndDate.getTime() - 36e5 * endDateClientTzOffset; processedStartDate = new Date(processedStartDateInUTC + 36e5 * commonTimezoneOffset); processedEndDate = new Date(processedEndDateInUTC + 36e5 * commonTimezoneOffset) } this.fire("setField", "startDate", appointment, processedStartDate); this.fire("setField", "endDate", appointment, processedEndDate) } this.fire("setField", "recurrenceRule", singleAppointment, ""); this.fire("setField", "recurrenceException", singleAppointment, ""); if (!isDeleted && !isPopupEditing) { processAppointmentDates.call(this, singleAppointment, this._getTimezoneOffsetByOption()); this.addAppointment(singleAppointment) } var recurrenceException = this._getRecurrenceException(exceptionDate, targetAppointment), updatedAppointment = extend({}, targetAppointment, { recurrenceException: recurrenceException }); if (isPopupEditing) { this._updatedRecAppointment = updatedAppointment; processAppointmentDates.call(this, singleAppointment); this._showAppointmentPopup(singleAppointment, true, true); this._editAppointmentData = targetAppointment } else { this._updateAppointment(targetAppointment, updatedAppointment) } }, _getRecurrenceException: function(exceptionDate, targetAppointment) { var startDate = this._getStartDate(targetAppointment, true), exceptionByDate = this._getRecurrenceExceptionDate(exceptionDate, startDate), recurrenceException = this.fire("getField", "recurrenceException", targetAppointment); return recurrenceException ? recurrenceException + "," + exceptionByDate : exceptionByDate }, _getRecurrenceExceptionDate: function(exceptionDate, targetStartDate) { exceptionDate.setHours(targetStartDate.getHours()); exceptionDate.setMinutes(targetStartDate.getMinutes()); exceptionDate.setSeconds(targetStartDate.getSeconds()); return dateSerialization.serializeDate(exceptionDate, "yyyyMMddTHHmmss") }, _showRecurrenceChangeConfirm: function(isDeleted) { var message = messageLocalization.format(isDeleted ? "dxScheduler-confirmRecurrenceDeleteMessage" : "dxScheduler-confirmRecurrenceEditMessage"), seriesText = messageLocalization.format(isDeleted ? "dxScheduler-confirmRecurrenceDeleteSeries" : "dxScheduler-confirmRecurrenceEditSeries"), occurrenceText = messageLocalization.format(isDeleted ? "dxScheduler-confirmRecurrenceDeleteOccurrence" : "dxScheduler-confirmRecurrenceEditOccurrence"); return dialog.custom({ message: message, showCloseButton: true, showTitle: true, buttons: [{ text: seriesText, onClick: function() { return true } }, { text: occurrenceText, onClick: function() { return false } }] }).show() }, _getUpdatedData: function(options) { var target = options.data || options, cellData = this.getTargetCellData(), targetAllDay = this.fire("getField", "allDay", target), targetStartDate = new Date(this.fire("getField", "startDate", target)), targetEndDate = new Date(this.fire("getField", "endDate", target)), date = cellData.date || targetStartDate, duration = targetEndDate.getTime() - targetStartDate.getTime(); if (this._workSpace.keepOriginalHours()) { var diff = targetStartDate.getTime() - dateUtils.trimTime(targetStartDate).getTime(); date = new Date(dateUtils.trimTime(date).getTime() + diff) } var updatedData = {}, allDay = cellData.allDay; this.fire("setField", "allDay", updatedData, allDay); this.fire("setField", "startDate", updatedData, date); var endDate = new Date(date.getTime() + duration); if (this.appointmentTakesAllDay(target) && !updatedData.allDay && this._workSpace.supportAllDayRow()) { endDate = this._workSpace.calculateEndDate(date) } if (targetAllDay && !this._workSpace.supportAllDayRow() && !this._workSpace.keepOriginalHours()) { var dateCopy = new Date(date); dateCopy.setHours(0); endDate = new Date(dateCopy.getTime() + duration); if (0 !== endDate.getHours()) { endDate.setHours(this._getCurrentViewOption("endDayHour")) } } this.fire("setField", "endDate", updatedData, endDate); var groups = cellData.groups; for (var name in groups) { if (groups.hasOwnProperty(name)) { updatedData[name] = groups[name] } } return updatedData }, _getCoordinates: function(dates, appointmentResources, allDay) { var result = []; for (var i = 0; i < dates.length; i++) { var currentCoords = this._workSpace.getCoordinatesByDateInGroup(dates[i], appointmentResources, allDay); for (var j = 0; j < currentCoords.length; j++) { extend(currentCoords[j], { startDate: dates[i] }) } result = result.concat(currentCoords) } return result }, _getSingleAppointmentData: function(appointmentData, options) { options = options || {}; var updatedStartDate, $appointment = options.$appointment, updatedData = options.skipDateCalculation ? {} : this._getUpdatedData(options), resultAppointmentData = extend({}, appointmentData, updatedData), allDay = this.fire("getField", "allDay", appointmentData), isAllDay = this._workSpace.supportAllDayRow() && allDay, startDate = new Date(this.fire("getField", "startDate", resultAppointmentData)), endDate = new Date(this.fire("getField", "endDate", resultAppointmentData)), appointmentDuration = endDate.getTime() - startDate.getTime(); if (commonUtils.isDefined($appointment)) { var apptDataCalculator = this.getRenderingStrategyInstance().getAppointmentDataCalculator(); if (commonUtils.isFunction(apptDataCalculator)) { updatedStartDate = apptDataCalculator($appointment, startDate).startDate } else { if (this._needUpdateAppointmentData($appointment)) { var coordinates = translator.locate($appointment); updatedStartDate = new Date(this._workSpace.getCellDataByCoordinates(coordinates, isAllDay).startDate); if ($appointment.hasClass("dx-scheduler-appointment-reduced")) { var appointmentStartDate = $appointment.data("dxAppointmentStartDate"); if (appointmentStartDate) { updatedStartDate = appointmentStartDate } } if (!options.skipHoursProcessing) { updatedStartDate.setHours(startDate.getHours()); updatedStartDate.setMinutes(startDate.getMinutes()) } } } } if (updatedStartDate) { this.fire("setField", "startDate", resultAppointmentData, updatedStartDate); this.fire("setField", "endDate", resultAppointmentData, new Date(updatedStartDate.getTime() + appointmentDuration)) } return resultAppointmentData }, _needUpdateAppointmentData: function($appointment) { return $appointment.hasClass("dx-scheduler-appointment-compact") || $appointment.hasClass("dx-scheduler-appointment-recurrence") }, subscribe: function(subject, action) { this._subscribes[subject] = subscribes[subject] = action }, fire: function(subject) { var callback = this._subscribes[subject], args = Array.prototype.slice.call(arguments); if (!commonUtils.isFunction(callback)) { throw errors.Error("E1031", subject) } return callback.apply(this, args.slice(1)) }, getTargetCellData: function() { return this._workSpace.getDataByDroppableCell() }, _updateAppointment: function(target, appointment, onUpdatePrevented) { var updatingOptions = { newData: appointment, oldData: target, cancel: false }; var performFailAction = function(err) { if (commonUtils.isFunction(onUpdatePrevented)) { onUpdatePrevented.call(this) } if (err && "Error" === err.name) { throw err } }.bind(this); this._actions.onAppointmentUpdating(updatingOptions); this._processActionResult(updatingOptions, function(canceled) { if (!canceled) { this._expandAllDayPanel(appointment); try { this._updatedAppointment = appointment; this._appointmentModel.update(target, appointment).always(function(e) { this._executeActionWhenOperationIsCompleted(this._actions.onAppointmentUpdated, appointment, e) }.bind(this)).fail(function() { performFailAction() }) } catch (err) { performFailAction(err) } } else { performFailAction() } }) }, _processActionResult: function(actionOptions, callback) { when(actionOptions.cancel).done(callback.bind(this)) }, _expandAllDayPanel: function(appointment) { if (!this._isAllDayExpanded(this.getFilteredItems()) && this.appointmentTakesAllDay(appointment)) { this._workSpace.option("allDayExpanded", true) } }, _executeActionWhenOperationIsCompleted: function(action, appointment, e) { var options = { appointmentData: appointment }, isError = e && "Error" === e.name; if (isError) { options.error = e } else { if (this._popup && this._popup.option("visible")) { this._popup.hide() } } action(options); this._fireContentReadyAction() }, _showAppointmentPopup: function(data, showButtons, processTimeZone) { if (!this._popup) { this._createPopup(data, processTimeZone); var toolbarItems = [], showCloseButton = true; if (!commonUtils.isDefined(showButtons) || showButtons) { toolbarItems = this._getPopupToolbarItems(); showCloseButton = this._popup.initialOption("showCloseButton") } this._popup.option({ toolbarItems: toolbarItems, showCloseButton: showCloseButton }) } this._initDynamicPopupTemplate(data, processTimeZone); this._popup.option(this._popupConfig(data)); this._popup.show() }, getAppointmentPopup: function() { return this._popup }, getAppointmentDetailsForm: function() { return this._appointmentForm }, getUpdatedAppointment: function() { return this._updatedAppointment }, getAppointmentsInstance: function() { return this._appointments }, getResourceManager: function() { return this._resourcesManager }, getLayoutManager: function() { return this._layoutManager }, getRenderingStrategyInstance: function() { return this._layoutManager.getRenderingStrategyInstance() }, getFilteredItems: function() { return this._filteredItems }, getActions: function() { return this._actions }, appointmentTakesAllDay: function(appointment) { return this._appointmentModel.appointmentTakesAllDay(appointment, this._getCurrentViewOption("startDayHour"), this._getCurrentViewOption("endDayHour")) }, _getStartDate: function(appointment, skipNormalize) { var startDate = this.fire("getField", "startDate", appointment), startDateTimeZone = this.fire("getField", "startDateTimeZone", appointment); startDate = dateUtils.makeDate(startDate); startDate = this.fire("convertDateByTimezone", startDate, startDateTimeZone); !skipNormalize && this.fire("updateAppointmentStartDate", { startDate: startDate, appointment: appointment, callback: function(result) { startDate = result } }); return startDate }, _getEndDate: function(appointment) { var endDate = this.fire("getField", "endDate", appointment); if (endDate) { var endDateTimeZone = this.fire("getField", "endDateTimeZone", appointment); endDate = dateUtils.makeDate(endDate); endDate = this.fire("convertDateByTimezone", endDate, endDateTimeZone); this.fire("updateAppointmentEndDate", { endDate: endDate, callback: function(result) { endDate = result } }) } return endDate }, recurrenceEditorVisibilityChanged: function(visible) { if (this._appointmentForm) { this._appointmentForm.element().find("." + RECURRENCE_EDITOR_ITEM_CLASS).toggleClass(RECURRENCE_EDITOR_OPENED_ITEM_CLASS, visible) } }, dayHasAppointment: function(day, appointment, trimTime) { var startDate = new Date(this.fire("getField", "startDate", appointment)), endDate = new Date(this.fire("getField", "endDate", appointment)), startDateTimeZone = this.fire("getField", "startDateTimeZone", appointment), endDateTimeZone = this.fire("getField", "endDateTimeZone", appointment); startDate = this.fire("convertDateByTimezone", startDate, startDateTimeZone); endDate = this.fire("convertDateByTimezone", endDate, endDateTimeZone); if (day.getTime() === endDate.getTime()) { return startDate.getTime() === endDate.getTime() } if (trimTime) { day = dateUtils.trimTime(day); startDate = dateUtils.trimTime(startDate); endDate = dateUtils.trimTime(endDate) } var dayTimeStamp = day.getTime(), startDateTimeStamp = startDate.getTime(), endDateTimeStamp = endDate.getTime(); return inArray(dayTimeStamp, [startDateTimeStamp, endDateTimeStamp]) > -1 || startDateTimeStamp < dayTimeStamp && endDateTimeStamp > dayTimeStamp }, setTargetedAppointmentResources: function(targetedAppointment, appointmentElement, appointmentIndex) { var groups = this._getCurrentViewOption("groups"); if (groups && groups.length) { var getGroups, setResourceCallback, resourcesSetter = this._resourcesManager._dataAccessors.setter, workSpace = this._workSpace; if ("agenda" === this.option("currentView")) { getGroups = function() { var apptSettings = this.getLayoutManager()._positionMap[appointmentIndex]; return workSpace._getCellGroups(apptSettings[0].groupIndex) }; setResourceCallback = function(_, group) { resourcesSetter[group.name](targetedAppointment, group.id) } } else { getGroups = function() { var apptPosition = appointmentElement.position(); return workSpace.getCellDataByCoordinates(apptPosition).groups }; setResourceCallback = function(field, value) { resourcesSetter[field](targetedAppointment, value) } } $.each(getGroups.call(this), setResourceCallback) } }, getStartViewDate: function() { return this._workSpace.getStartViewDate() }, getEndViewDate: function() { return this._workSpace.getEndViewDate() }, showAppointmentPopup: function(appointmentData, createNewAppointment, currentAppointmentData) { var singleAppointment = !currentAppointmentData && appointmentData.length ? this._getSingleAppointmentData(appointmentData) : currentAppointmentData; var startDate; if (currentAppointmentData) { startDate = this.fire("getField", "startDate", currentAppointmentData) } else { startDate = this.fire("getField", "startDate", appointmentData) } this._checkRecurringAppointment(appointmentData, singleAppointment, startDate, function() { var editing = this._editing; if (createNewAppointment) { delete this._editAppointmentData; editing.allowAdding && this._showAppointmentPopup(appointmentData, true, false) } else { this._editAppointmentData = appointmentData; this._showAppointmentPopup(appointmentData, editing.allowUpdating, true) } }.bind(this), false, true) }, hideAppointmentPopup: function(saveChanges) { if (!this._popup || !this._popup.option("visible")) { return } if (saveChanges) { this._saveChanges() } this._popup.hide() }, showAppointmentTooltip: function(appointmentData, target, currentAppointmentData) { if (!appointmentData) { return } currentAppointmentData = currentAppointmentData || appointmentData; appointmentTooltip.show(appointmentData, currentAppointmentData, target, this) }, hideAppointmentTooltip: function() { appointmentTooltip.hide() }, scrollToTime: function(hours, minutes, date) { this._workSpace.scrollToTime(hours, minutes, date) }, addAppointment: function(appointment) { var text = this.fire("getField", "text", appointment); if (!text) { this.fire("setField", "text", appointment, "") } var addingOptions = { appointmentData: appointment, cancel: false }; this._actions.onAppointmentAdding(addingOptions); this._processActionResult(addingOptions, function(canceled) { if (!canceled) { this._expandAllDayPanel(appointment); this._appointmentModel.add(appointment, { value: this._getTimezoneOffsetByOption(), clientOffset: this.fire("getClientTimezoneOffset") }).always(function(e) { this._executeActionWhenOperationIsCompleted(this._actions.onAppointmentAdded, appointment, e) }.bind(this)) } }) }, updateAppointment: function(target, appointment) { this._updateAppointment(target, appointment) }, deleteAppointment: function(appointment) { var deletingOptions = { appointmentData: appointment, cancel: false }; this._actions.onAppointmentDeleting(deletingOptions); this._processActionResult(deletingOptions, function(canceled) { if (!canceled) { this._appointmentModel.remove(appointment).always(function(e) { this._executeActionWhenOperationIsCompleted(this._actions.onAppointmentDeleted, appointment, e) }.bind(this)) } }) }, focus: function() { if (this._editAppointmentData) { this._appointments.focus() } else { this._workSpace.focus() } } }).include(DataHelperMixin); registerComponent("dxScheduler", Scheduler); module.exports = Scheduler }, /*!*********************************************!*\ !*** ./js/ui/scheduler/utils.recurrence.js ***! \*********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), errors = __webpack_require__( /*! ../../core/errors */ 7), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63); var toMs = dateUtils.dateToMilliseconds; var leastDaysInWeek = 4; var intervalMap = { secondly: "seconds", minutely: "minutes", hourly: "hours", daily: "days", weekly: "weeks", monthly: "months", yearly: "years" }; var dateSetterMap = { bysecond: function(date, value) { date.setSeconds(value) }, byminute: function(date, value) { date.setMinutes(value) }, byhour: function(date, value) { date.setHours(value) }, bymonth: function(date, value) { date.setMonth(value) }, bymonthday: function(date, value) { if (value < 0) { var initialDate = new Date(date); setDateByNegativeValue(initialDate, 1, -1); var daysInMonth = initialDate.getDate(); if (daysInMonth >= Math.abs(value)) { setDateByNegativeValue(date, 1, value) } else { setDateByNegativeValue(date, 2, value) } } else { date.setDate(value); correctDate(date, value) } }, byday: function(date, byDay, weekStart, frequency) { var dayOfWeek = byDay; if ("DAILY" === frequency && 0 === byDay) { dayOfWeek = 7 } byDay += days[weekStart] > dayOfWeek ? 7 : 0; date.setDate(date.getDate() - date.getDay() + byDay) }, byweekno: function(date, weekNumber, weekStart) { var initialDate = new Date(date), firstYearDate = new Date(initialDate.setMonth(0, 1)), dayShift = firstYearDate.getDay() - days[weekStart], firstDayOfYear = firstYearDate.getTime() - dayShift * toMs("day"), newFirstYearDate = dayShift + 1; if (newFirstYearDate > leastDaysInWeek) { date.setTime(firstDayOfYear + 7 * weekNumber * toMs("day")) } else { date.setTime(firstDayOfYear + 7 * (weekNumber - 1) * toMs("day")) } var timezoneDiff = (date.getTimezoneOffset() - firstYearDate.getTimezoneOffset()) * toMs("minute"); timezoneDiff && date.setTime(date.getTime() + timezoneDiff) }, byyearday: function(date, dayOfYear) { date.setMonth(0, 1); date.setDate(dayOfYear) } }; var setDateByNegativeValue = function(date, month, value) { var initialDate = new Date(date); date.setMonth(date.getMonth() + month); if (date.getMonth() - initialDate.getMonth() > month) { date.setDate(value + 1) } date.setDate(value + 1) }; var dateGetterMap = { bysecond: function(date) { return date.getSeconds() }, byminute: function(date) { return date.getMinutes() }, byhour: function(date) { return date.getHours() }, bymonth: function(date) { return date.getMonth() }, bymonthday: function(date) { return date.getDate() }, byday: function(date) { return date.getDay() }, byweekno: function(date, weekStart) { var daysFromYearStart, current = new Date(date), diff = leastDaysInWeek - current.getDay() + days[weekStart] - 1, dayInMilliseconds = toMs("day"); if (date.getDay() < days[weekStart]) { diff -= 7 } current.setHours(0, 0, 0); current.setDate(current.getDate() + diff); daysFromYearStart = 1 + (current - new Date(current.getFullYear(), 0, 1)) / dayInMilliseconds; return Math.ceil(daysFromYearStart / 7) }, byyearday: function(date) { var yearStart = new Date(date.getFullYear(), 0, 0), timezoneDiff = date.getTimezoneOffset() - yearStart.getTimezoneOffset(), diff = date - yearStart - timezoneDiff * toMs("minute"), dayLength = toMs("day"); return Math.floor(diff / dayLength) } }; var ruleNames = ["freq", "interval", "byday", "byweekno", "byyearday", "bymonth", "bymonthday", "count", "until", "byhour", "byminute", "bysecond", "bysetpos", "wkst"], freqNames = ["DAILY", "WEEKLY", "MONTHLY", "YEARLY", "SECONDLY", "MINUTELY", "HOURLY"], days = { SU: 0, MO: 1, TU: 2, WE: 3, TH: 4, FR: 5, SA: 6 }; var getTimeZoneOffset = function() { return (new Date).getTimezoneOffset() }; var dateInRecurrenceRange = function(options) { var result = []; if (options.rule) { result = getDatesByRecurrence(options) } return !!result.length }; var normalizeInterval = function(freq, interval) { var intervalObject = {}, intervalField = intervalMap[freq.toLowerCase()]; intervalObject[intervalField] = interval; return intervalObject }; var getDatesByRecurrenceException = function(ruleValues) { var result = []; for (var i = 0, len = ruleValues.length; i < len; i++) { result[i] = getDateByAsciiString(ruleValues[i]) } return result }; var dateIsRecurrenceException = function(date, recurrenceException) { var result = false; if (!recurrenceException) { return result } var splitDates = recurrenceException.split(","), exceptDates = getDatesByRecurrenceException(splitDates), shortFormat = /\d{8}$/; for (var i = 0, len = exceptDates.length; i < len; i++) { if (splitDates[i].match(shortFormat)) { var diffs = getDatePartDiffs(date, exceptDates[i]); if (0 === diffs.years && 0 === diffs.months && 0 === diffs.days) { result = true } } else { if (date.getTime() === exceptDates[i].getTime()) { result = true } } } return result }; var doNextIteration = function(date, startIntervalDate, endIntervalDate, recurrenceRule, iterationCount) { var dateInInterval, matchCountIsCorrect = true; endIntervalDate = endIntervalDate.getTime(); if (recurrenceRule.until) { if (recurrenceRule.until.getTime() < endIntervalDate) { endIntervalDate = recurrenceRule.until.getTime() } } if (recurrenceRule.count) { if (iterationCount === recurrenceRule.count) { matchCountIsCorrect = false } } dateInInterval = date.getTime() <= endIntervalDate; return dateInInterval && matchCountIsCorrect }; var getDatesByRecurrence = function(options) { var dateRules, result = [], recurrenceRule = getRecurrenceRule(options.rule), iterationResult = {}, rule = recurrenceRule.rule, recurrenceStartDate = options.start; if (!recurrenceRule.isValid || !rule.freq) { return result } rule.interval = normalizeInterval(rule.freq, rule.interval); dateRules = splitDateRules(rule); var duration = options.end ? options.end.getTime() - options.start.getTime() : toMs("day"); var config = { exception: options.exception, min: options.min, dateRules: dateRules, rule: rule, recurrenceStartDate: recurrenceStartDate, recurrenceEndDate: options.end, duration: duration }; if (dateRules.length && rule.count) { var iteration = 0; getDatesByCount(dateRules, new Date(recurrenceStartDate), new Date(recurrenceStartDate), rule).forEach(function(currentDate, i) { if (currentDate.getTime() < options.max.getTime()) { iteration++; iterationResult = pushToResult(iteration, iterationResult, currentDate, i, config, true) } }) } else { getDatesByRules(dateRules, new Date(recurrenceStartDate), rule).forEach(function(currentDate, i) { var iteration = 0; while (doNextIteration(currentDate, recurrenceStartDate, options.max, rule, iteration)) { iteration++; iterationResult = pushToResult(iteration, iterationResult, currentDate, i, config); currentDate = incrementDate(currentDate, recurrenceStartDate, rule, i) } }) } if (rule.bysetpos) { $.each(iterationResult, function(iterationIndex, iterationDates) { iterationResult[iterationIndex] = filterDatesBySetPos(iterationDates, rule.bysetpos) }) } $.each(iterationResult, function(_, iterationDates) { result = result.concat(iterationDates) }); result.sort(function(a, b) { return a - b }); return result }; var pushToResult = function(iteration, iterationResult, currentDate, i, config, verifiedField) { if (!iterationResult[iteration]) { iterationResult[iteration] = [] } if (checkDate(currentDate, i, config, verifiedField)) { iterationResult[iteration].push(currentDate) } return iterationResult }; var checkDate = function(currentDate, i, config, verifiedField) { if (!dateIsRecurrenceException(currentDate, config.exception)) { var duration = dateUtils.sameDate(currentDate, config.recurrenceEndDate) ? config.recurrenceEndDate.getTime() - currentDate.getTime() : config.duration; if (currentDate.getTime() >= config.recurrenceStartDate.getTime() && currentDate.getTime() + duration > config.min.getTime()) { return verifiedField || checkDateByRule(currentDate, [config.dateRules[i]], config.rule.wkst) } } return false }; var filterDatesBySetPos = function(dates, bySetPos) { var resultArray = []; bySetPos.split(",").forEach(function(index) { index = Number(index); var dateIndex = index > 0 ? index - 1 : dates.length + index; if (dates[dateIndex]) { resultArray.push(dates[dateIndex]) } }); return resultArray }; var correctDate = function(originalDate, date) { if (originalDate.getDate() !== date) { originalDate.setDate(date) } }; var incrementDate = function(date, originalStartDate, rule, iterationStep) { var initialDate = new Date(date), needCorrect = true; date = dateUtils.addInterval(date, rule.interval); if ("MONTHLY" === rule.freq) { var expectedDate = originalStartDate.getDate(); if (rule.bymonthday) { expectedDate = Number(rule.bymonthday.split(",")[iterationStep]); if (expectedDate < 0) { initialDate.setMonth(initialDate.getMonth() + 1, 1); dateSetterMap.bymonthday(initialDate, expectedDate); date = initialDate; needCorrect = false } } needCorrect && correctDate(date, expectedDate) } if ("YEARLY" === rule.freq) { if (rule.byyearday) { var dayNumber = Number(rule.byyearday.split(",")[iterationStep]); dateSetterMap.byyearday(date, dayNumber) } var dateRules = splitDateRules(rule); for (var field in dateRules[iterationStep]) { dateSetterMap[field] && dateSetterMap[field](date, dateRules[iterationStep][field], rule.wkst) } } return date }; var getDatePartDiffs = function(date1, date2) { return { years: date1.getFullYear() - date2.getFullYear(), months: date1.getMonth() - date2.getMonth(), days: date1.getDate() - date2.getDate(), hours: date1.getHours() - date2.getHours(), minutes: date1.getMinutes() - date2.getMinutes(), seconds: date1.getSeconds() - date2.getSeconds() } }; var getRecurrenceRule = function(recurrence) { var result = { rule: {}, isValid: false }; if (recurrence) { result.rule = parseRecurrenceRule(recurrence); result.isValid = validateRRule(result.rule, recurrence) } return result }; var loggedWarnings = []; var validateRRule = function(rule, recurrence) { if (brokenRuleNameExists(rule) || inArray(rule.freq, freqNames) === -1 || wrongCountRule(rule) || wrongIntervalRule(rule) || wrongDayOfWeek(rule) || wrongByMonthDayRule(rule) || wrongByMonth(rule) || wrongUntilRule(rule)) { logBrokenRule(recurrence); return false } return true }; var wrongUntilRule = function(rule) { var wrongUntil = false, until = rule.until; if (void 0 !== until && !(until instanceof Date)) { wrongUntil = true } return wrongUntil }; var wrongCountRule = function(rule) { var wrongCount = false, count = rule.count; if (count && "string" === typeof count) { wrongCount = true } return wrongCount }; var wrongByMonthDayRule = function(rule) { var wrongByMonthDay = false, byMonthDay = rule.bymonthday; if (byMonthDay && isNaN(parseInt(byMonthDay))) { wrongByMonthDay = true } return wrongByMonthDay }; var wrongByMonth = function(rule) { var wrongByMonth = false, byMonth = rule.bymonth; if (byMonth && isNaN(parseInt(byMonth))) { wrongByMonth = true } return wrongByMonth }; var wrongIntervalRule = function(rule) { var wrongInterval = false, interval = rule.interval; if (interval && "string" === typeof interval) { wrongInterval = true } return wrongInterval }; var wrongDayOfWeek = function(rule) { var daysByRule = daysFromByDayRule(rule), brokenDaysExist = false; $.each(daysByRule, function(_, day) { if (!days.hasOwnProperty(day)) { brokenDaysExist = true; return false } }); return brokenDaysExist }; var brokenRuleNameExists = function(rule) { var brokenRuleExists = false; $.each(rule, function(ruleName) { if (inArray(ruleName, ruleNames) === -1) { brokenRuleExists = true; return false } }); return brokenRuleExists }; var logBrokenRule = function(recurrence) { if (inArray(recurrence, loggedWarnings) === -1) { errors.log("W0006", recurrence); loggedWarnings.push(recurrence) } }; var parseRecurrenceRule = function(recurrence) { var ruleObject = {}, ruleParts = recurrence.split(";"); for (var i = 0, len = ruleParts.length; i < len; i++) { var rule = ruleParts[i].split("="), ruleName = rule[0].toLowerCase(), ruleValue = rule[1]; ruleObject[ruleName] = ruleValue } var count = parseInt(ruleObject.count); if (!isNaN(count)) { ruleObject.count = count } if (ruleObject.interval) { var interval = parseInt(ruleObject.interval); if (!isNaN(interval)) { ruleObject.interval = interval } } else { ruleObject.interval = 1 } if (ruleObject.freq && ruleObject.until) { ruleObject.until = getDateByAsciiString(ruleObject.until) } return ruleObject }; var getDateByAsciiString = function(string) { if ("string" !== typeof string) { return string } var arrayDate = string.match(/(\d{4})(\d{2})(\d{2})(T(\d{2})(\d{2})(\d{2}))?(Z)?/); if (!arrayDate) { return null } var isUTC = void 0 !== arrayDate[8], currentOffset = 6e4 * resultUtils.getTimeZoneOffset(), date = new(Function.prototype.bind.apply(Date, prepareDateArrayToParse(arrayDate))); if (isUTC) { date = new Date(date.getTime() - currentOffset) } return date }; var prepareDateArrayToParse = function(arrayDate) { arrayDate.shift(); if (void 0 === arrayDate[3]) { arrayDate.splice(3) } else { arrayDate.splice(3, 1); arrayDate.splice(6) } arrayDate[1]--; arrayDate.unshift(null); return arrayDate }; var daysFromByDayRule = function(rule) { var result = []; if (rule.byday) { result = rule.byday.split(",") } return result }; var getAsciiStringByDate = function(date) { var currentOffset = 6e4 * resultUtils.getTimeZoneOffset(); date = new Date(date.getTime() + currentOffset); return date.getFullYear() + ("0" + (date.getMonth() + 1)).slice(-2) + ("0" + date.getDate()).slice(-2) + "T" + ("0" + date.getHours()).slice(-2) + ("0" + date.getMinutes()).slice(-2) + ("0" + date.getSeconds()).slice(-2) + "Z" }; var splitDateRules = function(rule) { var result = []; if (!rule.wkst) { rule.wkst = "MO" } if (rule.byweekno && !rule.byday) { var dayNames = Object.keys(days); for (var i = 0; i < days[rule.wkst]; i++) { dayNames.push(dayNames.shift()) } rule.byday = dayNames.join(",") } for (var field in dateSetterMap) { if (!rule[field]) { continue } var ruleFieldValues = rule[field].split(","), ruleArray = getDateRuleArray(field, ruleFieldValues); result = result.length ? extendObjectArray(ruleArray, result) : ruleArray } return result }; var getDateRuleArray = function(field, values) { var result = []; for (var i = 0, length = values.length; i < length; i++) { var dateRule = {}; dateRule[field] = handleRuleFieldValue(field, values[i]); result.push(dateRule) } return result }; var handleRuleFieldValue = function(field, value) { var result = parseInt(value); if ("bymonth" === field) { result -= 1 } if ("byday" === field) { result = days[value] } return result }; var extendObjectArray = function(firstArray, secondArray) { var result = []; for (var i = 0, firstArrayLength = firstArray.length; i < firstArrayLength; i++) { for (var j = 0, secondArrayLength = secondArray.length; j < secondArrayLength; j++) { result.push(extend({}, firstArray[i], secondArray[j])) } } return result }; var getDatesByRules = function(dateRules, startDate, rule) { var result = []; for (var i = 0, len = dateRules.length; i < len; i++) { var current = dateRules[i], updatedDate = new Date(startDate); for (var field in current) { dateSetterMap[field] && dateSetterMap[field](updatedDate, current[field], rule.wkst, rule.freq) } if (Array.isArray(updatedDate)) { result = result.concat(updatedDate) } else { result.push(new Date(updatedDate)) } } if (!result.length) { result.push(startDate) } return result }; var getDatesByCount = function(dateRules, startDate, recurrenceStartDate, rule) { var result = [], count = rule.count, counter = 0, date = new Date(startDate); while (counter < count) { var dates = getDatesByRules(dateRules, date, rule); var checkedDates = []; for (var i = 0; i < dates.length; i++) { if (dates[i].getTime() >= recurrenceStartDate.getTime()) { checkedDates.push(dates[i]) } } var length = checkedDates.length; counter += length; var delCount = counter - count; if (counter > count) { checkedDates.splice(length - delCount, delCount) } for (i = 0; i < checkedDates.length; i++) { result.push(checkedDates[i]) } date = dateUtils.addInterval(date, rule.interval) } return result }; var checkDateByRule = function(date, rules, weekStart) { var result = false; for (var i = 0; i < rules.length; i++) { var current = rules[i], currentRuleResult = true; for (var field in current) { var processNegative = "bymonthday" === field && current[field] < 0; if (dateGetterMap[field] && !processNegative && current[field] !== dateGetterMap[field](date, weekStart)) { currentRuleResult = false } } result = result || currentRuleResult } return result || !rules.length }; var getRecurrenceString = function(object) { if (!object || !object.freq) { return } var result = ""; for (var field in object) { var value = object[field]; if ("interval" === field && value < 2) { continue } if ("until" === field) { value = getAsciiStringByDate(value) } result += field + "=" + value + ";" } result = result.substring(0, result.length - 1); return result.toUpperCase() }; var resultUtils = { getRecurrenceString: getRecurrenceString, getRecurrenceRule: getRecurrenceRule, getAsciiStringByDate: getAsciiStringByDate, getDatesByRecurrence: getDatesByRecurrence, dateInRecurrenceRange: dateInRecurrenceRange, getDateByAsciiString: getDateByAsciiString, daysFromByDayRule: daysFromByDayRule, getTimeZoneOffset: getTimeZoneOffset }; module.exports = resultUtils }, /*!****************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.subscribes.js ***! \****************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), array = __webpack_require__( /*! ../../core/utils/array */ 26), recurrenceUtils = __webpack_require__( /*! ./utils.recurrence */ 470), dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63), translator = __webpack_require__( /*! ../../animation/translator */ 69), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), typeUtils = __webpack_require__( /*! ../../core/utils/type */ 12), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, dateLocalization = __webpack_require__( /*! ../../localization/date */ 33), SchedulerTimezones = __webpack_require__( /*! ./ui.scheduler.timezones */ 472); var toMs = dateUtils.dateToMilliseconds; var subscribes = { currentViewUpdated: function(currentView) { this.option("currentView", currentView) }, currentDateUpdated: function(date) { this.option("currentDate", date) }, setCellDataCacheAlias: function(appointment, geometry) { this._workSpace.setCellDataCacheAlias(appointment, geometry) }, needCoordinates: function(options) { var appointmentData = options.appointmentData, startDate = options.startDate, endDate = this._getEndDate(appointmentData), recurrenceRule = this.fire("getField", "recurrenceRule", appointmentData), recurrenceException = this.fire("getField", "recurrenceException", appointmentData), dateRange = this._workSpace.getDateRange(), startViewDate = this.appointmentTakesAllDay(appointmentData) ? dateUtils.trimTime(new Date(dateRange[0])) : dateRange[0], originalStartDate = options.originalStartDate || startDate; var recurrenceOptions = { rule: recurrenceRule, exception: recurrenceException, start: originalStartDate, end: endDate, min: startViewDate, max: dateRange[1] }; var dates = recurrenceUtils.getDatesByRecurrence(recurrenceOptions); if (!dates.length) { dates.push(startDate) } var itemResources = this._resourcesManager.getResourcesFromItem(appointmentData), allDay = this.appointmentTakesAllDay(appointmentData) && this._workSpace.supportAllDayRow(); options.callback(this._getCoordinates(dates, itemResources, allDay)) }, showAppointmentTooltip: function(options) { options.skipDateCalculation = true; options.$appointment = $(options.target); var appointmentData = options.data, singleAppointmentData = this._getSingleAppointmentData(appointmentData, options); this.showAppointmentTooltip(appointmentData, options.target, singleAppointmentData) }, hideAppointmentTooltip: function() { this.hideAppointmentTooltip() }, showAddAppointmentPopup: function(appointmentData) { var processedData = {}; $.each(["startDate", "endDate", "allDay"], function(_, field) { if (void 0 !== appointmentData[field]) { this.fire("setField", field, processedData, appointmentData[field]); delete appointmentData[field] } }.bind(this)); this.showAppointmentPopup(extend(processedData, appointmentData), true) }, showEditAppointmentPopup: function(options) { var appointmentData = options.data; options.$appointment = $(options.target); options.skipHoursProcessing = true; var singleAppointmentData = this._getSingleAppointmentData(appointmentData, options), startDate = this.fire("getField", "startDate", singleAppointmentData); this.showAppointmentPopup(appointmentData, false, singleAppointmentData, startDate) }, updateAppointmentAfterResize: function(options) { var targetAppointment = options.target, singleAppointment = this._getSingleAppointmentData(targetAppointment, options), startDate = this.fire("getField", "startDate", singleAppointment), updatedData = extend(true, {}, options.data); var processedStartDate = this.fire("convertDateByTimezoneBack", this.fire("getField", "startDate", updatedData), this.fire("getField", "startDateTimeZone", updatedData)); var processedEndDate = this.fire("convertDateByTimezoneBack", this.fire("getField", "endDate", updatedData), this.fire("getField", "endDateTimeZone", updatedData)); this.fire("setField", "startDate", updatedData, processedStartDate); this.fire("setField", "endDate", updatedData, processedEndDate); this._checkRecurringAppointment(targetAppointment, singleAppointment, startDate, function() { this._updateAppointment(targetAppointment, updatedData, function() { this._appointments.moveAppointmentBack() }) }.bind(this)) }, updateAppointmentAfterDrag: function(options) { var target = options.data, updatedData = this._getUpdatedData(options), newCellIndex = this._workSpace.getDroppableCellIndex(), oldCellIndex = this._workSpace.getCellIndexByCoordinates(options.coordinates), becomeAllDay = this.fire("getField", "allDay", updatedData), wasAllDay = this.fire("getField", "allDay", target); var appointment = extend({}, target, updatedData); var movedToAllDay = this._workSpace.supportAllDayRow() && becomeAllDay, cellData = this._workSpace.getCellDataByCoordinates(options.coordinates, movedToAllDay), movedBetweenAllDayAndSimple = this._workSpace.supportAllDayRow() && (wasAllDay && !becomeAllDay || !wasAllDay && becomeAllDay); if (newCellIndex !== oldCellIndex || movedBetweenAllDayAndSimple) { this._checkRecurringAppointment(target, appointment, cellData.startDate, function() { var processedStartDate = this.fire("convertDateByTimezoneBack", this.fire("getField", "startDate", updatedData), this.fire("getField", "startDateTimeZone", updatedData)); var processedEndDate = this.fire("convertDateByTimezoneBack", this.fire("getField", "endDate", updatedData), this.fire("getField", "endDateTimeZone", updatedData)); this.fire("setField", "startDate", appointment, processedStartDate); this.fire("setField", "endDate", appointment, processedEndDate); this._updateAppointment(target, appointment, function() { this._appointments.moveAppointmentBack() }) }.bind(this)) } else { this._appointments.moveAppointmentBack() } }, deleteAppointment: function(options) { options.$appointment = $(options.target); var appointmentData = options.data, singleAppointmentData = this._getSingleAppointmentData(appointmentData, options), startDate = this.fire("getField", "startDate", singleAppointmentData); this._checkRecurringAppointment(appointmentData, singleAppointmentData, startDate, function() { this.deleteAppointment(appointmentData) }.bind(this), true) }, getResourceForPainting: function() { return this._resourcesManager.getResourceForPainting(this._getCurrentViewOption("groups")) }, getAppointmentColor: function(options) { var resourcesManager = this._resourcesManager, resourceForPainting = resourcesManager.getResourceForPainting(this._getCurrentViewOption("groups")), response = $.Deferred().resolve().promise(); if (resourceForPainting) { var field = resourcesManager.getField(resourceForPainting), groupIndex = options.groupIndex, groups = this._workSpace._getCellGroups(groupIndex), resourceValues = array.wrapToArray(resourcesManager.getDataAccessors(field, "getter")(options.itemData)), groupId = resourceValues.length ? resourceValues[0] : void 0; for (var i = 0; i < groups.length; i++) { if (groups[i].name === field) { groupId = groups[i].id; break } } response = resourcesManager.getResourceColor(field, groupId) } options.callback(response) }, getHeaderHeight: function() { return this._header._$element && parseInt(this._header._$element.css("height"), 10) }, getResourcesFromItem: function(options) { options.callback(this._resourcesManager.getResourcesFromItem(options.itemData)) }, getBoundOffset: function(options) { options.callback({ top: -this.getWorkSpaceAllDayHeight() }) }, appointmentTakesAllDay: function(options) { options.callback(this.appointmentTakesAllDay(options.appointment)) }, appointmentTakesSeveralDays: function(appointment) { return this._appointmentModel.appointmentTakesSeveralDays(appointment) }, appointmentFocused: function() { this._workSpace.restoreScrollTop() }, getResizableAppointmentArea: function(options) { var area, allDay = options.allDay, groups = this._getCurrentViewOption("groups"); if (groups && groups.length && (allDay || "month" === this.option("currentView"))) { var groupBounds = this._workSpace.getGroupBounds(options.coordinates); area = { left: groupBounds.left, right: groupBounds.right, top: 0, bottom: 0 } } options.callback(area) }, getDraggableAppointmentArea: function(options) { options.callback(this.getWorkSpaceScrollableContainer()) }, getDragEventTargetElements: function(options) { options.callback(this.element) }, getAppointmentGeometry: function(settings) { return this.getLayoutManager().getRenderingStrategyInstance().getAppointmentGeometry(settings) }, isAllDay: function(appointmentData) { return this.getLayoutManager().getRenderingStrategyInstance().isAllDay(appointmentData) }, getDeltaTime: function(e, initialSize, itemData) { return this.getLayoutManager().getRenderingStrategyInstance().getDeltaTime(e, initialSize, itemData) }, getCompactAppointmentGroupMaxWidth: function() { return this.getLayoutManager().getRenderingStrategyInstance().getCompactAppointmentGroupMaxWidth() }, getStartDate: function(appointmentData, skipNormalize) { return this._getStartDate(appointmentData, skipNormalize) }, getCellWidth: function() { return this._cellWidth }, getCellHeight: function() { return this._cellHeight }, getEndDate: function(appointmentData) { return this._getEndDate(appointmentData) }, getRenderingStrategy: function() { return this._getAppointmentsRenderingStrategy() }, correctAppointmentCoordinates: function(options) { var isAllDay = options.allDay, containerSign = options.isFixedContainer ? -1 : 1; var scrollTop = !isAllDay ? this.getWorkSpaceScrollableScrollTop() : 0, allDayPanelTopOffset = !isAllDay ? this.getWorkSpaceAllDayHeight() : 0, headerHeight = this.getWorkSpaceHeaderPanelHeight(), scrollLeft = this.getWorkSpaceScrollableScrollLeft(), tableLeftOffset = this.getWorkSpaceDateTableOffset(); var topOffset = -scrollTop + allDayPanelTopOffset + headerHeight, leftOffset = -scrollLeft - tableLeftOffset; options.callback({ top: options.coordinates.top + containerSign * topOffset, left: options.coordinates.left + containerSign * leftOffset }) }, allDayPanelToggled: function() { this._appointments.updateDraggablesBoundOffsets() }, formatDates: function(options) { var startDate = options.startDate, endDate = options.endDate, formatType = options.formatType; var formatTypes = { DATETIME: function() { var dateTimeFormat = "mediumdatemediumtime", startDateString = dateLocalization.format(startDate, dateTimeFormat) + " - "; var endDateString = startDate.getDate() === endDate.getDate() ? dateLocalization.format(endDate, "shorttime") : dateLocalization.format(endDate, dateTimeFormat); return startDateString + endDateString }, TIME: function() { return dateLocalization.format(startDate, "shorttime") + " - " + dateLocalization.format(endDate, "shorttime") }, DATE: function() { var dateTimeFormat = "monthAndDay", startDateString = dateLocalization.format(startDate, dateTimeFormat), isDurationMoreThanDay = endDate.getTime() - startDate.getTime() > 864e5; var endDateString = isDurationMoreThanDay || endDate.getDate() !== startDate.getDate() ? " - " + dateLocalization.format(endDate, dateTimeFormat) : ""; return startDateString + endDateString } }; options.callback(formatTypes[formatType]()) }, getFullWeekAppointmentWidth: function(options) { var groupIndex = options.groupIndex, groupWidth = this._workSpace.getGroupWidth(groupIndex); options.callback(groupWidth) }, getMaxAppointmentWidth: function(options) { var cellCountToLastViewDate = this._workSpace.getCellCountToLastViewDate(options.date); options.callback(cellCountToLastViewDate * this._workSpace.getCellWidth()) }, updateAppointmentStartDate: function(options) { var updatedStartDate, appointment = options.appointment, firstViewDate = this._workSpace.getStartViewDate(), startDate = new Date(options.startDate), startDayHour = this._getCurrentViewOption("startDayHour"); if (this.appointmentTakesAllDay(appointment)) { updatedStartDate = dateUtils.normalizeDate(startDate, firstViewDate) } else { if (startDate.getTime() < firstViewDate.getTime()) { startDate = firstViewDate } updatedStartDate = dateUtils.normalizeDate(options.startDate, new Date(startDate)) } if (updatedStartDate.getHours() < startDayHour) { updatedStartDate.setHours(startDayHour); updatedStartDate.setMinutes(0) } options.callback(updatedStartDate) }, updateAppointmentEndDate: function(options) { var endDate = new Date(options.endDate), endDayHour = this._getCurrentViewOption("endDayHour"), updatedEndDate = endDate; if (endDate.getHours() >= endDayHour) { updatedEndDate.setHours(endDayHour); updatedEndDate.setMinutes(0) } options.callback(updatedEndDate) }, renderDropDownAppointments: function(options) { this._dropDownAppointments.render(options, this) }, getGroupCount: function(options) { var groupCount = this._workSpace._getGroupCount(); options.callback(groupCount) }, updateResizableArea: function() { var $allResizableElements = this.element().find(".dx-scheduler-appointment.dx-resizable"); var horizontalResizables = commonUtils.grep($allResizableElements, function(el) { var $el = $(el), resizableInst = $el.dxResizable("instance"), area = resizableInst.option("area"); return inArray(resizableInst.option("handles"), ["right left", "left right"]) > -1 && typeUtils.isPlainObject(area) }); $.each(horizontalResizables, function(_, el) { var $el = $(el), position = translator.locate($el), appointmentData = this._appointments._getItemData($el); var area = this._appointments._calculateResizableArea({ left: position.left }, appointmentData); $el.dxResizable("instance").option("area", area) }.bind(this)) }, recurrenceEditorVisibilityChanged: function(options) { this.recurrenceEditorVisibilityChanged(options.visible) }, getField: function(field, obj) { if (!commonUtils.isDefined(this._dataAccessors.getter[field])) { return } return this._dataAccessors.getter[field](obj) }, setField: function(field, obj, value) { if (!commonUtils.isDefined(this._dataAccessors.setter[field])) { return } var splitExprStr = this.option(field + "Expr").split("."), rootField = splitExprStr[0]; if (void 0 === obj[rootField] && splitExprStr.length > 1) { var emptyChain = function(arr) { var result = {}, tmp = result, arrLength = arr.length - 1; for (var i = 1; i < arrLength; i++) { tmp = tmp[arr[i]] = {} } return result }(splitExprStr); obj[rootField] = emptyChain } this._dataAccessors.setter[field](obj, value); return obj }, prerenderFilter: function() { var allDay, dateRange = this.getWorkSpace().getDateRange(), resources = this._resourcesManager.getResourcesData(); if (!this.option("showAllDayPanel") && this._workSpace.supportAllDayRow()) { allDay = false } return this._appointmentModel.filterLoadedAppointments({ startDayHour: this._getCurrentViewOption("startDayHour"), endDayHour: this._getCurrentViewOption("endDayHour"), min: dateRange[0], max: dateRange[1], resources: resources, allDay: allDay }, this._subscribes.convertDateByTimezone.bind(this)) }, dayHasAppointment: function(day, appointment, trimTime) { return this.dayHasAppointment(day, appointment, trimTime) }, createResourcesTree: function() { return this._resourcesManager.createResourcesTree(this._loadedResources) }, getResourceTreeLeaves: function(tree, appointmentResources) { return this._resourcesManager.getResourceTreeLeaves(tree, appointmentResources) }, createReducedResourcesTree: function() { var tree = this._resourcesManager.createResourcesTree(this._loadedResources); return this._resourcesManager.reduceResourcesTree(tree, this.getFilteredItems()) }, groupAppointmentsByResources: function(appointments) { var result = { 0: appointments }, groups = this._getCurrentViewOption("groups"); if (groups && groups.length && this._resourcesManager.getResourcesData().length) { result = this._resourcesManager.groupAppointmentsByResources(appointments, this._loadedResources) } var totalResourceCount = 0; $.each(this._loadedResources, function(i, resource) { if (!i) { totalResourceCount = resource.items.length } else { totalResourceCount *= resource.items.length } }); for (var j = 0; j < totalResourceCount; j++) { var index = j.toString(); if (result[index]) { continue } result[index] = [] } return result }, getAgendaRows: function(options) { var renderingStrategy = this._layoutManager.getRenderingStrategyInstance(), calculateRows = renderingStrategy.calculateRows.bind(renderingStrategy), d = $.Deferred(); function rowsCalculated(appointments) { var result = calculateRows(appointments, options.agendaDuration, options.currentDate); this._dataSourceLoadedCallback.remove(rowsCalculated); d.resolve(result) } this._dataSourceLoadedCallback.add(rowsCalculated); return d.promise() }, getAgendaVerticalStepHeight: function() { return this.getWorkSpace().getAgendaVerticalStepHeight() }, getAgendaDuration: function() { return this._getCurrentViewOption("agendaDuration") }, getStartViewDate: function() { return this.getStartViewDate() }, getEndViewDate: function() { return this.getEndViewDate() }, agendaIsReady: function(rows, innerRowOffset, outerRowOffset) { var $appts = this.getAppointmentsInstance()._itemElements(), total = 0; $appts.css("margin-bottom", innerRowOffset); var applyOffset = function(_, count) { var index = count + total - 1; $appts.eq(index).css("margin-bottom", outerRowOffset); total += count }; for (var i = 0; i < rows.length; i++) { $.each(rows[i], applyOffset) } }, getTimezone: function() { return this._getTimezoneOffsetByOption() }, getClientTimezoneOffset: function(date) { date = date || new Date; return SchedulerTimezones.getClientTimezoneOffset(date) }, convertDateByTimezone: function(date, appointmentTimezone) { date = new Date(date); var clientTzOffset = -(this._subscribes.getClientTimezoneOffset(date) / 36e5); var commonTimezoneOffset = this._getTimezoneOffsetByOption(date); var appointmentTimezoneOffset = this._calculateTimezoneByValue(appointmentTimezone, date); if ("number" !== typeof appointmentTimezoneOffset) { appointmentTimezoneOffset = clientTzOffset } var dateInUTC = date.getTime() - 36e5 * clientTzOffset; date = new Date(dateInUTC + 36e5 * appointmentTimezoneOffset); if ("number" === typeof commonTimezoneOffset) { date = new Date(date.getTime() + 36e5 * (commonTimezoneOffset - appointmentTimezoneOffset)) } return date }, convertDateByTimezoneBack: function(date, appointmentTimezone) { date = new Date(date); var clientTzOffset = -(this._subscribes.getClientTimezoneOffset(date) / 36e5); var commonTimezoneOffset = this._getTimezoneOffsetByOption(date); var appointmentTimezoneOffset = this._calculateTimezoneByValue(appointmentTimezone, date); if ("number" !== typeof appointmentTimezoneOffset) { appointmentTimezoneOffset = clientTzOffset } var dateInUTC = date.getTime() + 36e5 * clientTzOffset; date = new Date(dateInUTC - 36e5 * appointmentTimezoneOffset); if ("number" === typeof commonTimezoneOffset) { date = new Date(date.getTime() - 36e5 * (commonTimezoneOffset - appointmentTimezoneOffset)) } return date }, getTimezonesDisplayName: function() { return SchedulerTimezones.getTimezonesDisplayName() }, getTimezoneDisplayNameById: function(id) { return SchedulerTimezones.getTimezoneDisplayNameById(id) }, getSimilarTimezones: function(id) { return SchedulerTimezones.getSimilarTimezones(id) }, getTimezonesIdsByDisplayName: function(displayName) { return SchedulerTimezones.getTimezonesIdsByDisplayName(displayName) }, getTargetedAppointmentData: function(appointmentData, appointmentElement, appointmentIndex) { var recurringData = this._getSingleAppointmentData(appointmentData, { skipDateCalculation: true, $appointment: appointmentElement }), result = {}; extend(true, result, appointmentData, recurringData); this.setTargetedAppointmentResources(result, appointmentElement, appointmentIndex); return result }, getAppointmentDurationInMs: function(options) { var startDate = options.startDate, endDate = options.endDate, allDay = options.allDay, appointmentDuration = endDate.getTime() - startDate.getTime(), dayDuration = toMs("day"), visibleDayDuration = this._getDayDuration() * toMs("hour"), result = 0; if (allDay) { var ceilQuantityOfDays = Math.ceil(appointmentDuration / dayDuration); result = ceilQuantityOfDays * visibleDayDuration } else { var tailDuration, isDifferentDate = !dateUtils.sameDate(startDate, new Date(endDate.getTime() - 1)), floorQuantityOfDays = Math.floor(appointmentDuration / dayDuration); if (isDifferentDate) { var hiddenDayDuration = dayDuration - visibleDayDuration; tailDuration = appointmentDuration - (floorQuantityOfDays ? floorQuantityOfDays * dayDuration : hiddenDayDuration); var startDayTime = this.option("startDayHour") * toMs("hour"), endPartDuration = endDate - dateUtils.trimTime(endDate); if (endPartDuration < startDayTime) { if (floorQuantityOfDays) { tailDuration -= hiddenDayDuration } tailDuration += startDayTime - endPartDuration } } else { tailDuration = appointmentDuration % dayDuration } if (tailDuration > visibleDayDuration) { tailDuration = visibleDayDuration } result = floorQuantityOfDays * visibleDayDuration + tailDuration } options.callback(result) }, getEndDayHour: function() { return this.option("endDayHour") }, getStartDayHour: function() { return this.option("startDayHour") } }; module.exports = subscribes }, /*!***************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.timezones.js ***! \***************************************************/ function(module, exports, __webpack_require__) { var query = __webpack_require__( /*! ../../data/query */ 159), errors = __webpack_require__( /*! ../../core/errors */ 7), tzData = __webpack_require__( /*! ./ui.scheduler.timezones_data */ 473); var SchedulerTimezones = { _displayNames: tzData.displayNames, _list: tzData.timezones, getTimezones: function() { return this._list }, getDisplayNames: function() { return this._displayNames }, queryableTimezones: function() { return query(this.getTimezones()) }, getTimezoneById: function(id) { var result, i = 0, tzList = this.getTimezones(); if (id) { while (!result) { if (!tzList[i]) { errors.log("W0009", id); return } var currentId = tzList[i].id; if (currentId === id) { result = tzList[i] } i++ } } return result }, getTimezoneOffsetById: function(id, dateTimeStamp) { var offsets, offsetIndices, untils, result, tz = this.getTimezoneById(id); if (tz) { if (tz.link) { var rootTz = this.getTimezones()[tz.link]; offsets = rootTz.offsets; untils = rootTz.untils; offsetIndices = rootTz.offsetIndices } else { offsets = tz.offsets; untils = tz.untils; offsetIndices = tz.offsetIndices } result = this.getUtcOffset(offsets, offsetIndices, untils, dateTimeStamp) } return result }, getUtcOffset: function(offsets, offsetIndices, untils, dateTimeStamp) { var index = 0; var offsetIndicesList = offsetIndices.split(""); var untilsList = untils.split("|").map(function(until) { if ("Infinity" === until) { return null } return 1e3 * parseInt(until, 36) }); var currentUntil = 0; for (var i = 0, listLength = untilsList.length; i < listLength; i++) { currentUntil += untilsList[i]; if (dateTimeStamp >= currentUntil) { index = i; continue } else { break } } if (untilsList[index + 1]) { index++ } return offsets[Number(offsetIndicesList[index])] }, getTimezoneShortDisplayNameById: function(id) { var result, tz = this.getTimezoneById(id); if (tz) { result = tz.DisplayName.substring(0, 11) } return result }, getTimezonesDisplayName: function() { return query(this.getDisplayNames()).sortBy().toArray() }, getTimezoneDisplayNameById: function(id) { var tz = this.getTimezoneById(id); return tz ? this.getDisplayNames()[tz.winIndex] : "" }, getSimilarTimezones: function(id) { if (!id) { return [] } var tz = this.getTimezoneById(id); return this.getTimezonesIdsByWinIndex(tz.winIndex) }, getTimezonesIdsByWinIndex: function(winIndex) { return this.queryableTimezones().filter(["winIndex", winIndex]).sortBy("title").toArray().map(function(item) { return { id: item.id, displayName: item.title } }) }, getTimezonesIdsByDisplayName: function(displayName) { var displayNameIndex = this.getDisplayNames().indexOf(displayName); return this.getTimezonesIdsByWinIndex(displayNameIndex) }, getClientTimezoneOffset: function(date) { return 6e4 * date.getTimezoneOffset() }, processDateDependOnTimezone: function(date, tzOffset) { var result = new Date(date); if (tzOffset) { var tzDiff = tzOffset + this.getClientTimezoneOffset(date) / 36e5; result = new Date(result.setHours(result.getHours() + tzDiff)) } return result } }; module.exports = SchedulerTimezones }, /*!********************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.timezones_data.js ***! \********************************************************/ function(module, exports) { var displayNames = ["(UTC) Monrovia, Reykjavik", "(UTC+03:00) Nairobi", "(UTC+02:00) Harare, Pretoria", "(UTC+01:00) West Central Africa", "(UTC+02:00) Athens, Bucharest", "(UTC+03:00) Kuwait, Riyadh", "(UTC+07:00) Bangkok, Hanoi, Jakarta", "(UTC+04:00) Abu Dhabi, Muscat", "(UTC+12:00) Auckland, Wellington", "(UTC-03:00) City of Buenos Aires", "(UTC-05:00) Bogota, Lima, Quito, Rio Branco", "(UTC-08:00) Pacific Time (US & Canada)", "(UTC-05:00) Indiana (East)", "(UTC-06:00) Central Time (US & Canada)", "(UTC-05:00) Eastern Time (US & Canada)", "(UTC-07:00) Mountain Time (US & Canada)", "(UTC-04:00) Georgetown, La Paz, Manaus, San Juan", "(UTC+05:00) Ashgabat, Tashkent", "(UTC+05:30) Chennai, Kolkata, Mumbai, New Delhi", "(UTC+08:00) Beijing, Chongqing, Hong Kong, Urumqi", "(UTC+06:00) Dhaka", "(UTC+06:00) Astana", "(UTC+05:45) Kathmandu", "(UTC+02:00) Jerusalem", "(UTC+08:00) Kuala Lumpur, Singapore", "(UTC+08:00) Ulaanbaatar", "(UTC) Dublin, Edinburgh, Lisbon, London", "(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna", "(UTC+10:00) Canberra, Melbourne, Sydney", "(UTC+09:30) Darwin", "(UTC+10:00) Brisbane", "(UTC+09:30) Adelaide", "(UTC+10:00) Hobart", "(UTC+08:00) Perth", "(UTC-02:00) Coordinated Universal Time-02", "(UTC-03:00) Brasilia", "(UTC-04:00) Atlantic Time (Canada)", "(UTC-06:00) Saskatchewan", "(UTC-03:30) Newfoundland", "(UTC-03:00) Santiago", "(UTC+02:00) Cairo", "UTC", "(UTC+03:30) Tehran", "(UTC+09:00) Osaka, Sapporo, Tokyo", "(UTC+12:00) Coordinated Universal Time+12", "(UTC+02:00) Tripoli", "(UTC-07:00) Chihuahua, La Paz, Mazatlan", "(UTC-06:00) Guadalajara, Mexico City, Monterrey", "(UTC+11:00) Solomon Is., New Caledonia", "(UTC-11:00) Coordinated Universal Time-11", "(UTC+10:00) Guam, Port Moresby", "(UTC+01:00) Sarajevo, Skopje, Warsaw, Zagreb", "(UTC+08:00) Taipei", "(UTC+09:00) Seoul", "(UTC+02:00) Istanbul", "(UTC-09:00) Alaska", "(UTC-07:00) Arizona", "(UTC-10:00) Hawaii", "(UTC+03:00) Moscow, St. Petersburg, Volgograd", "(UTC+02:00) Helsinki, Kyiv, Riga, Sofia, Tallinn, Vilnius", "(UTC+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague", "(UTC) Casablanca", "(UTC+01:00) Brussels, Copenhagen, Madrid, Paris", "(UTC+01:00) Windhoek", "(UTC-03:00) Cayenne, Fortaleza", "(UTC-04:00) Asuncion", "(UTC-03:00) Salvador", "(UTC-06:00) Central America", "(UTC-04:00) Cuiaba", "(UTC-04:30) Caracas", "(UTC-03:00) Greenland", "(UTC-03:00) Montevideo", "(UTC-08:00) Baja California", "(UTC-01:00) Azores", "(UTC+02:00) Amman", "(UTC+10:00) Magadan", "(UTC+03:00) Baghdad", "(UTC+04:00) Baku", "(UTC+02:00) Beirut", "(UTC+09:00) Yakutsk", "(UTC+05:30) Sri Jayawardenepura", "(UTC+02:00) Damascus", "(UTC+08:00) Irkutsk", "(UTC+04:30) Kabul", "(UTC+05:00) Islamabad, Karachi", "(UTC+07:00) Krasnoyarsk", "(UTC+06:00) Novosibirsk", "(UTC+06:30) Yangon (Rangoon)", "(UTC+10:00) Vladivostok", "(UTC+04:00) Tbilisi", "(UTC+05:00) Ekaterinburg", "(UTC+04:00) Yerevan", "(UTC-01:00) Cabo Verde Is.", "(UTC-12:00) International Date Line West", "(UTC+13:00) Nuku'alofa", "(UTC+14:00) Kiritimati Island", "(UTC+02:00) Kaliningrad", "(UTC+04:00) Port Louis", "(UTC+13:00) Samoa", "(UTC+12:00) Fiji"]; var timezones = [{ id: "Africa/Bamako", title: "Bamako", winIndex: 0, link: 185 }, { id: "Africa/Banjul", title: "Banjul", winIndex: 0, link: 185 }, { id: "Africa/Conakry", title: "Conakry", winIndex: 0, link: 185 }, { id: "Africa/Dakar", title: "Dakar", winIndex: 0, link: 185 }, { id: "Africa/Freetown", title: "Freetown", winIndex: 0, link: 185 }, { id: "Africa/Lome", title: "Lome", winIndex: 0, link: 185 }, { id: "Africa/Nouakchott", title: "Nouakchott", winIndex: 0, link: 185 }, { id: "Africa/Ouagadougou", title: "Ouagadougou", winIndex: 0, link: 185 }, { id: "Africa/Sao_Tome", title: "Sao Tome", winIndex: 0, link: 185 }, { id: "Atlantic/St_Helena", title: "St Helena", winIndex: 0, link: 185 }, { id: "Africa/Addis_Ababa", title: "Addis Ababa", winIndex: 1, link: 198 }, { id: "Africa/Asmara", title: "Asmara", winIndex: 1, link: 198 }, { id: "Africa/Dar_es_Salaam", title: "Dar es Salaam", winIndex: 1, link: 198 }, { id: "Africa/Djibouti", title: "Djibouti", winIndex: 1, link: 198 }, { id: "Africa/Kampala", title: "Kampala", winIndex: 1, link: 198 }, { id: "Africa/Mogadishu", title: "Mogadishu", winIndex: 1, link: 198 }, { id: "Indian/Antananarivo", title: "Antananarivo", winIndex: 1, link: 198 }, { id: "Indian/Comoro", title: "Comoro", winIndex: 1, link: 198 }, { id: "Indian/Mayotte", title: "Mayotte", winIndex: 1, link: 198 }, { id: "Africa/Blantyre", title: "Blantyre", winIndex: 2, link: 196 }, { id: "Africa/Bujumbura", title: "Bujumbura", winIndex: 2, link: 196 }, { id: "Africa/Gaborone", title: "Gaborone", winIndex: 2, link: 196 }, { id: "Africa/Harare", title: "Harare", winIndex: 2, link: 196 }, { id: "Africa/Kigali", title: "Kigali", winIndex: 2, link: 196 }, { id: "Africa/Lubumbashi", title: "Lubumbashi", winIndex: 2, link: 196 }, { id: "Africa/Lusaka", title: "Lusaka", winIndex: 2, link: 196 }, { id: "Africa/Bangui", title: "Bangui", winIndex: 3, link: 195 }, { id: "Africa/Brazzaville", title: "Brazzaville", winIndex: 3, link: 195 }, { id: "Africa/Douala", title: "Douala", winIndex: 3, link: 195 }, { id: "Africa/Kinshasa", title: "Kinshasa", winIndex: 3, link: 195 }, { id: "Africa/Libreville", title: "Libreville", winIndex: 3, link: 195 }, { id: "Africa/Luanda", title: "Luanda", winIndex: 3, link: 195 }, { id: "Africa/Malabo", title: "Malabo", winIndex: 3, link: 195 }, { id: "Africa/Niamey", title: "Niamey", winIndex: 3, link: 195 }, { id: "Africa/Porto-Novo", title: "Porto-Novo", winIndex: 3, link: 195 }, { id: "Africa/Maseru", title: "Maseru", winIndex: 2, link: 193 }, { id: "Africa/Mbabane", title: "Mbabane", winIndex: 2, link: 193 }, { id: "Africa/Juba", title: "Juba", winIndex: 1, link: 194 }, { id: "Europe/Nicosia", title: "Nicosia", winIndex: 4, link: 381 }, { id: "Asia/Bahrain", title: "Bahrain", winIndex: 5, link: 388 }, { id: "Asia/Aden", title: "Aden", winIndex: 5, link: 391 }, { id: "Asia/Kuwait", title: "Kuwait", winIndex: 5, link: 391 }, { id: "Asia/Phnom_Penh", title: "Phnom Penh", winIndex: 6, link: 349 }, { id: "Asia/Vientiane", title: "Vientiane", winIndex: 6, link: 349 }, { id: "Asia/Muscat", title: "Muscat", winIndex: 7, link: 359 }, { id: "Antarctica/McMurdo", title: "McMurdo", winIndex: 8, link: 511 }, { id: "Africa/Asmera", title: "Asmera", winIndex: 1, link: 198 }, { id: "Africa/Timbuktu", title: "Timbuktu", winIndex: 0, link: 185 }, { id: "America/Buenos_Aires", title: "Buenos Aires", winIndex: 9, link: 206 }, { id: "America/Catamarca", title: "Catamarca", winIndex: 9, link: 207 }, { id: "America/Coral_Harbour", title: "Coral Harbour", winIndex: 10, link: 219 }, { id: "America/Cordoba", title: "Cordoba", winIndex: 9, link: 208 }, { id: "America/Ensenada", title: "Ensenada", winIndex: 11, link: 325 }, { id: "America/Indianapolis", title: "Indianapolis", winIndex: 12 }, { id: "America/Jujuy", title: "Jujuy", winIndex: 9, link: 209 }, { id: "America/Knox_IN", title: "Knox IN", winIndex: 13, link: 261 }, { id: "America/Louisville", title: "Louisville", winIndex: 14, link: 272 }, { id: "America/Mendoza", title: "Mendoza", winIndex: 9, link: 211 }, { id: "America/Porto_Acre", title: "Porto Acre", winIndex: 10, link: 312 }, { id: "America/Shiprock", title: "Shiprock", winIndex: 15, link: 244 }, { id: "America/Virgin", title: "Virgin", winIndex: 16, link: 303 }, { id: "Antarctica/South_Pole", title: "South Pole", winIndex: 8, link: 511 }, { id: "Asia/Ashkhabad", title: "Ashkhabad", winIndex: 17, link: 346 }, { id: "Asia/Calcutta", title: "Calcutta", winIndex: 18, link: 373 }, { id: "Asia/Chongqing", title: "Chongqing", winIndex: 19, link: 395 }, { id: "Asia/Chungking", title: "Chungking", winIndex: 19, link: 395 }, { id: "Asia/Dacca", title: "Dacca", winIndex: 20, link: 357 }, { id: "Asia/Harbin", title: "Harbin", winIndex: 19, link: 395 }, { id: "Asia/Kashgar", title: "Kashgar", winIndex: 21, link: 405 }, { id: "Asia/Katmandu", title: "Katmandu", winIndex: 22, link: 371 }, { id: "Asia/Macao", title: "Macao", winIndex: 19, link: 377 }, { id: "Asia/Saigon", title: "Saigon", winIndex: 6, link: 361 }, { id: "Asia/Tel_Aviv", title: "Tel Aviv", winIndex: 23, link: 367 }, { id: "Asia/Thimbu", title: "Thimbu", winIndex: 20, link: 402 }, { id: "Asia/Ujung_Pandang", title: "Ujung Pandang", winIndex: 24, link: 379 }, { id: "Asia/Ulan_Bator", title: "Ulan Bator", winIndex: 25, link: 404 }, { id: "Atlantic/Faeroe", title: "Faeroe", winIndex: 26, link: 415 }, { id: "Atlantic/Jan_Mayen", title: "Jan Mayen", winIndex: 27, link: 483 }, { id: "Australia/ACT", title: "ACT", winIndex: 28, link: 429 }, { id: "Australia/Canberra", title: "Canberra", winIndex: 28, link: 429 }, { id: "Australia/NSW", title: "NSW", winIndex: 28, link: 429 }, { id: "Australia/North", title: "North", winIndex: 29, link: 424 }, { id: "Australia/Queensland", title: "Queensland", winIndex: 30, link: 421 }, { id: "Australia/South", title: "South", winIndex: 31, link: 420 }, { id: "Australia/Tasmania", title: "Tasmania", winIndex: 32, link: 425 }, { id: "Australia/Victoria", title: "Victoria", winIndex: 28, link: 427 }, { id: "Australia/West", title: "West", winIndex: 33, link: 428 }, { id: "Australia/Yancowinna", title: "Yancowinna", winIndex: 31, link: 422 }, { id: "Brazil/Acre", title: "Acre", winIndex: 10, link: 312 }, { id: "Brazil/DeNoronha", title: "DeNoronha", winIndex: 34, link: 294 }, { id: "Brazil/East", title: "East", winIndex: 35, link: 317 }, { id: "Brazil/West", title: "West", winIndex: 16, link: 279 }, { id: "Canada/Atlantic", title: "Atlantic", winIndex: 36, link: 257 }, { id: "Canada/Central", title: "Central", winIndex: 13, link: 329 }, { id: "Canada/East-Saskatchewan", title: "East-Saskatchewan", winIndex: 37, link: 310 }, { id: "Canada/Eastern", title: "Eastern", winIndex: 14, link: 326 }, { id: "Canada/Mountain", title: "Mountain", winIndex: 15, link: 246 }, { id: "Canada/Newfoundland", title: "Newfoundland", winIndex: 38, link: 320 }, { id: "Canada/Pacific", title: "Pacific", winIndex: 11, link: 327 }, { id: "Canada/Saskatchewan", title: "Saskatchewan", winIndex: 37, link: 310 }, { id: "Canada/Yukon", title: "Yukon", winIndex: 11, link: 328 }, { id: "Chile/Continental", title: "Continental", winIndex: 39, link: 315 }, { id: "Cuba", title: "Cuba", winIndex: 14, link: 258 }, { id: "Egypt", title: "Egypt", winIndex: 40, link: 189 }, { id: "Eire", title: "Eire", winIndex: 26, link: 469 }, { id: "Europe/Belfast", title: "Belfast", winIndex: 26, link: 476 }, { id: "Europe/Tiraspol", title: "Tiraspol", winIndex: 4, link: 467 }, { id: "GB", title: "GB", winIndex: 26, link: 476 }, { id: "GB-Eire", title: "GB-Eire", winIndex: 26, link: 476 }, { id: "GMT+0", title: "GMT+0", winIndex: 41, link: 150 }, { id: "GMT-0", title: "GMT-0", winIndex: 41, link: 150 }, { id: "GMT0", title: "GMT0", winIndex: 41, link: 150 }, { id: "Greenwich", title: "Greenwich", winIndex: 41, link: 150 }, { id: "Hongkong", title: "Hongkong", winIndex: 19, link: 362 }, { id: "Iceland", title: "Iceland", winIndex: 0, link: 417 }, { id: "Iran", title: "Iran", winIndex: 42, link: 401 }, { id: "Israel", title: "Israel", winIndex: 23, link: 367 }, { id: "Jamaica", title: "Jamaica", winIndex: 10, link: 270 }, { id: "Japan", title: "Japan", winIndex: 43, link: 403 }, { id: "Kwajalein", title: "Kwajalein", winIndex: 44, link: 524 }, { id: "Libya", title: "Libya", winIndex: 45, link: 200 }, { id: "Mexico/BajaNorte", title: "BajaNorte", winIndex: 11, link: 325 }, { id: "Mexico/BajaSur", title: "BajaSur", winIndex: 46, link: 282 }, { id: "Mexico/General", title: "General", winIndex: 47, link: 285 }, { id: "NZ", title: "NZ", winIndex: 8, link: 511 }, { id: "Navajo", title: "Navajo", winIndex: 15, link: 244 }, { id: "PRC", title: "PRC", winIndex: 19, link: 395 }, { id: "Pacific/Ponape", title: "Ponape", winIndex: 48, link: 532 }, { id: "Pacific/Samoa", title: "Samoa", winIndex: 49, link: 530 }, { id: "Pacific/Truk", title: "Truk", winIndex: 50, link: 512 }, { id: "Poland", title: "Poland", winIndex: 51, link: 498 }, { id: "Portugal", title: "Portugal", winIndex: 26, link: 475 }, { id: "ROC", title: "ROC", winIndex: 52, link: 398 }, { id: "ROK", title: "ROK", winIndex: 53, link: 394 }, { id: "Singapore", title: "Singapore", winIndex: 24, link: 396 }, { id: "Turkey", title: "Turkey", winIndex: 54, link: 472 }, { id: "US/Alaska", title: "Alaska", winIndex: 55, link: 203 }, { id: "US/Arizona", title: "Arizona", winIndex: 56, link: 302 }, { id: "US/Central", title: "Central", winIndex: 13, link: 235 }, { id: "US/Eastern", title: "Eastern", winIndex: 14, link: 291 }, { id: "US/Hawaii", title: "Hawaii", winIndex: 57, link: 521 }, { id: "US/Indiana-Starke", title: "Indiana-Starke", winIndex: 13, link: 261 }, { id: "US/Michigan", title: "Michigan", winIndex: 14, link: 245 }, { id: "US/Mountain", title: "Mountain", winIndex: 15, link: 244 }, { id: "US/Pacific", title: "Pacific", winIndex: 11, link: 276 }, { id: "US/Samoa", title: "Samoa", winIndex: 49, link: 530 }, { id: "W-SU", title: "W-SU", winIndex: 58, link: 482 }, { id: "GMT", title: "GMT", winIndex: 41, link: 150 }, { id: "Etc/Greenwich", title: "Greenwich", winIndex: 41, link: 150 }, { id: "Etc/GMT-0", title: "GMT-0", winIndex: 41, link: 150 }, { id: "Etc/GMT+0", title: "GMT+0", winIndex: 41, offsets: [0], offsetIndices: "0", untils: "Infinity" }, { id: "Etc/GMT0", title: "GMT0", winIndex: 41, link: 150 }, { id: "Europe/Jersey", title: "Jersey", winIndex: 26, link: 476 }, { id: "Europe/Guernsey", title: "Guernsey", winIndex: 26, link: 476 }, { id: "Europe/Isle_of_Man", title: "Isle of Man", winIndex: 26, link: 476 }, { id: "Europe/Mariehamn", title: "Mariehamn", winIndex: 59, link: 471 }, { id: "Europe/Busingen", title: "Busingen", winIndex: 27, link: 500 }, { id: "Europe/Vatican", title: "Vatican", winIndex: 27, link: 487 }, { id: "Europe/San_Marino", title: "San Marino", winIndex: 27, link: 487 }, { id: "Europe/Vaduz", title: "Vaduz", winIndex: 27, link: 500 }, { id: "Arctic/Longyearbyen", title: "Longyearbyen", winIndex: 27, link: 483 }, { id: "Europe/Ljubljana", title: "Ljubljana", winIndex: 60, link: 462 }, { id: "Europe/Podgorica", title: "Podgorica", winIndex: 60, link: 462 }, { id: "Europe/Sarajevo", title: "Sarajevo", winIndex: 60, link: 462 }, { id: "Europe/Skopje", title: "Skopje", winIndex: 60, link: 462 }, { id: "Europe/Zagreb", title: "Zagreb", winIndex: 60, link: 462 }, { id: "Europe/Bratislava", title: "Bratislava", winIndex: 60, link: 485 }, { id: "Asia/Istanbul", title: "Istanbul", winIndex: 54, link: 472 }, { id: "Pacific/Johnston", title: "Johnston", winIndex: 57, link: 521 }, { id: "US/Pacific-New", title: "Pacific-New", winIndex: 11, link: 276 }, { id: "America/Aruba", title: "Aruba", winIndex: 16, link: 240 }, { id: "America/Lower_Princes", title: "Lower Princes", winIndex: 16, link: 240 }, { id: "America/Kralendijk", title: "Kralendijk", winIndex: 16, link: 240 }, { id: "America/Anguilla", title: "Anguilla", winIndex: 16, link: 303 }, { id: "America/Dominica", title: "Dominica", winIndex: 16, link: 303 }, { id: "America/Grenada", title: "Grenada", winIndex: 16, link: 303 }, { id: "America/Guadeloupe", title: "Guadeloupe", winIndex: 16, link: 303 }, { id: "America/Marigot", title: "Marigot", winIndex: 16, link: 303 }, { id: "America/Montserrat", title: "Montserrat", winIndex: 16, link: 303 }, { id: "America/St_Barthelemy", title: "St Barthelemy", winIndex: 16, link: 303 }, { id: "America/St_Kitts", title: "St Kitts", winIndex: 16, link: 303 }, { id: "America/St_Lucia", title: "St Lucia", winIndex: 16, link: 303 }, { id: "America/St_Thomas", title: "St Thomas", winIndex: 16, link: 303 }, { id: "America/St_Vincent", title: "St Vincent", winIndex: 16, link: 303 }, { id: "America/Tortola", title: "Tortola", winIndex: 16, link: 303 }, { id: "Africa/Abidjan", title: "Abidjan", winIndex: 0, offsets: [-.2688888888888889, 0], offsetIndices: "01", untils: "-u9rgl4|Infinity" }, { id: "Africa/Accra", title: "Accra", winIndex: 0, offsets: [-.014444444444444446, 0, .3333333333333333], offsetIndices: "012121212121212121212121212121212121212121212121", untils: "-r507yk|1e3pak|681qo|cjvlc|681qo|cjvlc|681qo|cjvlc|681qo|clq9c|681qo|cjvlc|681qo|cjvlc|681qo|cjvlc|681qo|clq9c|681qo|cjvlc|681qo|cjvlc|681qo|cjvlc|681qo|clq9c|681qo|cjvlc|681qo|cjvlc|681qo|cjvlc|681qo|clq9c|681qo|cjvlc|681qo|cjvlc|681qo|cjvlc|681qo|clq9c|681qo|cjvlc|681qo|cjvlc|681qo|Infinity" }, { id: "Africa/Algiers", title: "Algiers", winIndex: 3, offsets: [.15583333333333332, 0, 1, 2], offsetIndices: "0121212121212121232321212122321212", untils: "-uozn3l|2qx1nl|5luo0|8y800|a4tc0|7vc00|auqo0|7idc0|b7pc0|6sg00|cyo00|7ayo0|53c00|9idxc0|3i040|51mw0|253uk0|9o2k0|92040|8l3s0|jutc0|4uy840|3rdzw0|46xc00|7x6o0|2xco40|8n180|7x9g0|9d440|kiqg0|9d440|9q2s0|9cyk0|Infinity" }, { id: "Africa/Bissau", title: "Bissau", winIndex: 0, offsets: [-1.038888888888889, -1, 0], offsetIndices: "012", untils: "-u9reg4|wvoyk4|Infinity" }, { id: "Africa/Cairo", title: "Cairo", winIndex: 40, offsets: [2, 3], offsetIndices: "0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010", untils: "-fdls80|40d80|a31g0|7x3w0|a4w40|aqyk0|80ys0|b07w0|7tk40|b07w0|8jhg0|a8fw0|60go40|7el80|awo40|7v980|awqw0|7tk40|b07w0|7tk40|ayd80|7tk40|ayd80|7tk40|ayd80|7tk40|b07w0|7tk40|ayd80|7tk40|ayd80|7ves0|awik0|7ves0|ayd80|7ves0|awik0|7ves0|awik0|7ves0|awik0|7ves0|ayd80|7ves0|awik0|7ves0|awik0|7ves0|awik0|7ves0|ayd80|7ves0|awik0|7ves0|awik0|7ves0|awik0|7ves0|ayd80|7ves0|awik0|7ves0|f9x80|3i040|eluk0|462s0|ayd80|7ves0|awik0|7ves0|awik0|7ves0|awik0|7ves0|ayd80|7ves0|b5rw0|7m5g0|awik0|7ves0|awik0|7ves0|ayd80|7ves0|awik0|7ves0|awik0|7ves0|aqvs0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7x3w0|asys0|7x3w0|asys0|7k580|b5xg0|6u7w0|bvus0|6h980|c8tg0|64ak0|cyqs0|5anw0|1jms0|12t80|1w22s0|25p80|1sw40|2vmk0|Infinity" }, { id: "Africa/Casablanca", title: "Casablanca", winIndex: 61, offsets: [-.5055555555555555, 0, 1], offsetIndices: "0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-tblt9g|di7nxg|3huk0|51k40|2znuk0|2dp9g0|776k0|8nt2s0|657w0|3ifxg0|3jp80|va040|4qak0|e1ms0|7pp80|cnms0|3afw0|2xi840|xqqk0|bp56s0|4qak0|e1ms0|45x80|d2g40|51ek0|c8tg0|64ak0|e1sc0|47uo0|1leo0|23xc0|asw00|3lmo0|1qyo0|40g00|7x6o0|4mo00|1stc0|4deo0|7x6o0|3ylc0|1stc0|51hc0|7x6o0|3lmo0|1stc0|5reo0|7k800|2vpc0|25s00|64dc0|7k800|2iqo0|1stc0|6uao0|7x6o0|1stc0|1stc0|779c0|7x6o0|12w00|1stc0|7x6o0|7x6o0|pxc0|1stc0|8n400|9q000|902o0|902o0|9q000|8n400|a2yo0|8a5c0|afxc0|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|afxc0|8a5c0|9q000|Infinity" }, { id: "Africa/Ceuta", title: "Ceuta", winIndex: 62, offsets: [0, 1, 2], offsetIndices: "010101010101010101010121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-qyiys0|7x3w0|2vt440|8so00|st1c0|8n400|9q000|902o0|a2yo0|902o0|k69g40|657w0|3ifxg0|3jp80|va040|4qak0|e1ms0|7pp80|cnms0|3afw0|2xi840|129us0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Africa/El_Aaiun", title: "El Aaiun", winIndex: 61, offsets: [-.88, -1, 0, 1], offsetIndices: "01232323232323232323232323232323232323232323232323232323232323232323232323232323232323232", untils: "-isdxk0|m2g0c0|vek0|4qak0|e1ms0|7pp80|cnms0|3afw0|fke5g0|4qak0|e1ms0|45x80|d2g40|51ek0|c8tg0|64ak0|e1sc0|47uo0|1leo0|23xc0|asw00|3lmo0|1qyo0|40g00|7x6o0|4mo00|1stc0|4deo0|7x6o0|3ylc0|1stc0|51hc0|7x6o0|3lmo0|1stc0|5reo0|7k800|2vpc0|25s00|64dc0|7k800|2iqo0|1stc0|6uao0|7x6o0|1stc0|1stc0|779c0|7x6o0|12w00|1stc0|7x6o0|7x6o0|pxc0|1stc0|8n400|9q000|902o0|902o0|9q000|8n400|a2yo0|8a5c0|afxc0|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|afxc0|8a5c0|9q000|Infinity" }, { id: "Africa/Johannesburg", title: "Johannesburg", winIndex: 2, offsets: [1.5, 2, 3], offsetIndices: "012121", untils: "-yvtdi0|kn7o60|9cyk0|9d440|9cyk0|Infinity" }, { id: "Africa/Khartoum", title: "Khartoum", winIndex: 1, offsets: [2.1688888888888886, 2, 3], offsetIndices: "01212121212121212121212121212121212", untils: "-kcrsow|kixv4w|8l6k0|a4w40|8n180|a6qs0|8n180|a31g0|8ovw0|a16s0|8qqk0|9zc40|8sl80|9xhg0|8wak0|9ts40|8y580|a4w40|8n180|a31g0|8ovw0|a16s0|8sl80|9xhg0|8ufw0|9vms0|8wak0|9ts40|8y580|a4w40|8ovw0|a16s0|8qqk0|7frw40|Infinity" }, { id: "Africa/Lagos", title: "Lagos", winIndex: 3, offsets: [.22666666666666666, 1], offsetIndices: "01", untils: "-q9qbao|Infinity" }, { id: "Africa/Maputo", title: "Maputo", winIndex: 2, offsets: [2.1722222222222225, 2], offsetIndices: "01", untils: "-yvtfd8|Infinity" }, { id: "Africa/Monrovia", title: "Monrovia", winIndex: 0, offsets: [-.7188888888888889, -.7416666666666667, 0], offsetIndices: "012", untils: "-qj6zc4|rqyyqa|Infinity" }, { id: "Africa/Nairobi", title: "Nairobi", winIndex: 1, offsets: [2.454444444444445, 3, 2.5, 2.75], offsetIndices: "01231", untils: "-lnsetg|s8mhg|57v020|afrrb0|Infinity" }, { id: "Africa/Ndjamena", title: "Ndjamena", winIndex: 3, offsets: [1.0033333333333334, 1, 2], offsetIndices: "0121", untils: "-u9rk4c|zdk5cc|7iak0|Infinity" }, { id: "Africa/Tripoli", title: "Tripoli", winIndex: 45, offsets: [.8788888888888889, 1, 2], offsetIndices: "012121212121212121212121212122122", untils: "-q3gfrw|gl6ajw|422c0|xado0|4bbo0|wrpg0|4s580|1kdpg0|c05bw0|4mqs0|9et80|9d440|9et80|9eys0|9et80|9mdg0|95jw0|9io40|9cyk0|99es0|9et80|9eys0|9et80|9d440|9et80|b2840|3cf3w0|9kis0|9et80|7vqyw0|75eo0|asw00|Infinity" }, { id: "Africa/Tunis", title: "Tunis", winIndex: 3, offsets: [.15583333333333332, 1, 2], offsetIndices: "0121212121212121212121212121212121", untils: "-uozn3l|enxevl|b5uo0|53c00|u8w00|7x9g0|c8w80|7k800|z3w0|ew40|8bx80|9d440|9nx00|925o0|8l100|gi3440|7k800|b9k00|7vc00|51mw00|5ytc0|9d1c0|9d1c0|b9k00|7thc0|7m0tc0|7tk40|93us0|b5uo0|7k800|b5uo0|7x6o0|asw00|Infinity" }, { id: "Africa/Windhoek", title: "Windhoek", winIndex: 63, offsets: [1.5, 2, 3, 1], offsetIndices: "012113131313131313131313131313131313131313131313131313131313131313131313131313131313131313131", untils: "-yvtdi0|kn7o60|9cyk0|oj2nw0|23tmo0|7xf00|ast80|7x9g0|b5rw0|7kas0|b5rw0|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|b5rw0|7kas0|b5rw0|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|b5rw0|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|b5rw0|7kas0|b5rw0|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|b5rw0|7kas0|b5rw0|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|b5rw0|7kas0|b5rw0|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|b5rw0|7kas0|b5rw0|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|b5rw0|7x9g0|ast80|7x9g0|Infinity" }, { id: "America/Anchorage", title: "Anchorage", winIndex: 55, offsets: [-10, -9, -8], offsetIndices: "011001010101010101010101010101010111212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-ek1qo0|1tyx80|2e400|b7yik0|12y080|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|3lpg0|f4d80|64g40|clmk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|1l940|7rs80|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Antigua", title: "Antigua", winIndex: 16, link: 303 }, { id: "America/Araguaina", title: "Araguaina", winIndex: 64, offsets: [-3.2133333333333334, -3, -2], offsetIndices: "0121212121212121212121212121212121212121212121212121", untils: "-t85j2o|99k8mo|9a9c0|9io40|99980|8p65g0|6zuo0|bs2o0|67zw0|cjxg0|69uk0|cjxg0|4ml80|5mf440|49mk0|haas0|316k0|cls40|4ml80|cls40|66580|cls40|67zw0|981s40|6u7w0|biw40|5rbw0|d0lg0|5ed80|cyqs0|5ed80|dbpg0|64ak0|2yl440|64ak0|c8tg0|6u7w0|bxpg0|7iak0|biw40|6u7w0|biw40|7k580|biw40|6u7w0|c8tg0|6h980|dbpg0|5ed80|51udg0|64ak0|Infinity" }, { id: "America/Argentina/Buenos_Aires", title: "Buenos Aires", winIndex: 9, offsets: [-4.28, -4, -3, -2], offsetIndices: "0121212121212121212121212121212121212121212323232323232223232", untils: "-px7ys0|5iv8k0|67zw0|a4w40|73h80|cls40|66580|cls40|66580|cls40|66580|cls40|67zw0|cls40|66580|cls40|66580|cls40|66580|cls40|67zw0|6a040|hy7w0|6a040|xovw0|3uys0|18nbw0|b0dg0|8ve2k0|3uys0|3yik0|bqas0|71mk0|bqas0|71mk0|bqas0|8ovw0|9d440|9px80|9d440|9cyk0|9d440|28t6k0|51ek0|7m2qs0|4tzw0|biw40|776k0|bvus0|6u7w0|bvus0|6u7w0|bvus0|776k0|3fidg0|7thc0|430lc0|3yik0|b5xg0|7k580|Infinity" }, { id: "America/Argentina/Catamarca", title: "Catamarca", winIndex: 9, offsets: [-4.28, -4, -3, -2], offsetIndices: "0121212121212121212121212121212121212121212323232313232221232", untils: "-px7ys0|5iv8k0|67zw0|a4w40|73h80|cls40|66580|cls40|66580|cls40|66580|cls40|67zw0|cls40|66580|cls40|66580|cls40|66580|cls40|67zw0|6a040|hy7w0|6a040|xovw0|3uys0|18nbw0|b0dg0|8ve2k0|3uys0|3yik0|bqas0|71mk0|bqas0|71mk0|bqas0|8ovw0|9d440|9px80|9d440|9cyk0|9d440|28t6k0|51ek0|7m2qs0|4tzw0|biw40|776k0|bvus0|6u7w0|bvxk0|6u540|bvus0|776k0|3fidg0|7thc0|27s800|z9g0|1u93w0|3yik0|Infinity" }, { id: "America/Argentina/Cordoba", title: "Cordoba", winIndex: 9, offsets: [-4.28, -4, -3, -2], offsetIndices: "0121212121212121212121212121212121212121212323232313232223232", untils: "-px7ys0|5iv8k0|67zw0|a4w40|73h80|cls40|66580|cls40|66580|cls40|66580|cls40|67zw0|cls40|66580|cls40|66580|cls40|66580|cls40|67zw0|6a040|hy7w0|6a040|xovw0|3uys0|18nbw0|b0dg0|8ve2k0|3uys0|3yik0|bqas0|71mk0|bqas0|71mk0|bqas0|8ovw0|9d440|9px80|9d440|9cyk0|9d440|28t6k0|51ek0|7m2qs0|4tzw0|biw40|776k0|bvus0|6u7w0|bvxk0|6u540|bvus0|776k0|3fidg0|7thc0|430lc0|3yik0|b5xg0|7k580|Infinity" }, { id: "America/Argentina/Jujuy", title: "Jujuy", winIndex: 9, offsets: [-4.28, -4, -3, -2], offsetIndices: "01212121212121212121212121212121212121212123232312132322232", untils: "-px7ys0|5iv8k0|67zw0|a4w40|73h80|cls40|66580|cls40|66580|cls40|66580|cls40|67zw0|cls40|66580|cls40|66580|cls40|66580|cls40|67zw0|6a040|hy7w0|6a040|xovw0|3uys0|18nbw0|b0dg0|8ve2k0|3uys0|3yik0|bqas0|71mk0|bqas0|71mk0|bqas0|8ovw0|9d440|9px80|9d440|9cyk0|9d440|28t6k0|51ek0|7m2qs0|4tzw0|biw40|776k0|c8w80|776k0|ag040|7k2g0|bvus0|776k0|3fidg0|7thc0|430lc0|3yik0|Infinity" }, { id: "America/Argentina/La_Rioja", title: "La Rioja", winIndex: 9, offsets: [-4.28, -4, -3, -2], offsetIndices: "01212121212121212121212121212121212121212123232323123232221232", untils: "-px7ys0|5iv8k0|67zw0|a4w40|73h80|cls40|66580|cls40|66580|cls40|66580|cls40|67zw0|cls40|66580|cls40|66580|cls40|66580|cls40|67zw0|6a040|hy7w0|6a040|xovw0|3uys0|18nbw0|b0dg0|8ve2k0|3uys0|3yik0|bqas0|71mk0|bqas0|71mk0|bqas0|8ovw0|9d440|9px80|9d440|9cyk0|9d440|28t6k0|51ek0|7m2qs0|4tzw0|biw40|776k0|bvus0|6qik0|3g880|8jbw0|6u7w0|bvus0|776k0|3fidg0|7thc0|27s800|z9g0|1u93w0|3yik0|Infinity" }, { id: "America/Argentina/Mendoza", title: "Mendoza", winIndex: 9, offsets: [-4.28, -4, -3, -2], offsetIndices: "0121212121212121212121212121212121212121212323231212132221232", untils: "-px7ys0|5iv8k0|67zw0|a4w40|73h80|cls40|66580|cls40|66580|cls40|66580|cls40|67zw0|cls40|66580|cls40|66580|cls40|66580|cls40|67zw0|6a040|hy7w0|6a040|xovw0|3uys0|18nbw0|b0dg0|8ve2k0|3uys0|3yik0|bqas0|71mk0|bqas0|71mk0|bqas0|8ovw0|9d440|9px80|9d440|9cyk0|9d440|28t6k0|51ek0|7m2qs0|4tzw0|biw40|776k0|bktk0|71mk0|bqas0|73h80|bvus0|773s0|3fidg0|7thc0|27bk00|6hes0|1p7mk0|3yik0|Infinity" }, { id: "America/Argentina/Rio_Gallegos", title: "Rio Gallegos", winIndex: 9, offsets: [-4.28, -4, -3, -2], offsetIndices: "0121212121212121212121212121212121212121212323232323232221232", untils: "-px7ys0|5iv8k0|67zw0|a4w40|73h80|cls40|66580|cls40|66580|cls40|66580|cls40|67zw0|cls40|66580|cls40|66580|cls40|66580|cls40|67zw0|6a040|hy7w0|6a040|xovw0|3uys0|18nbw0|b0dg0|8ve2k0|3uys0|3yik0|bqas0|71mk0|bqas0|71mk0|bqas0|8ovw0|9d440|9px80|9d440|9cyk0|9d440|28t6k0|51ek0|7m2qs0|4tzw0|biw40|776k0|bvus0|6u7w0|bvus0|6u7w0|bvus0|776k0|3fidg0|7thc0|27s800|z9g0|1u93w0|3yik0|Infinity" }, { id: "America/Argentina/Salta", title: "Salta", winIndex: 9, offsets: [-4.28, -4, -3, -2], offsetIndices: "01212121212121212121212121212121212121212123232323132322232", untils: "-px7ys0|5iv8k0|67zw0|a4w40|73h80|cls40|66580|cls40|66580|cls40|66580|cls40|67zw0|cls40|66580|cls40|66580|cls40|66580|cls40|67zw0|6a040|hy7w0|6a040|xovw0|3uys0|18nbw0|b0dg0|8ve2k0|3uys0|3yik0|bqas0|71mk0|bqas0|71mk0|bqas0|8ovw0|9d440|9px80|9d440|9cyk0|9d440|28t6k0|51ek0|7m2qs0|4tzw0|biw40|776k0|bvus0|6u7w0|bvxk0|6u540|bvus0|776k0|3fidg0|7thc0|430lc0|3yik0|Infinity" }, { id: "America/Argentina/San_Juan", title: "San Juan", winIndex: 9, offsets: [-4.28, -4, -3, -2], offsetIndices: "01212121212121212121212121212121212121212123232323123232221232", untils: "-px7ys0|5iv8k0|67zw0|a4w40|73h80|cls40|66580|cls40|66580|cls40|66580|cls40|67zw0|cls40|66580|cls40|66580|cls40|66580|cls40|67zw0|6a040|hy7w0|6a040|xovw0|3uys0|18nbw0|b0dg0|8ve2k0|3uys0|3yik0|bqas0|71mk0|bqas0|71mk0|bqas0|8ovw0|9d440|9px80|9d440|9cyk0|9d440|28t6k0|51ek0|7m2qs0|4tzw0|biw40|776k0|bvus0|6qik0|3g880|8jbw0|6u7w0|bvus0|776k0|3fidg0|7thc0|27qdc0|2txg0|1sgak0|3yik0|Infinity" }, { id: "America/Argentina/San_Luis", title: "San Luis", winIndex: 9, offsets: [-4.28, -4, -3, -2], offsetIndices: "01212121212121212121212121212121212121212123232312122212321212", untils: "-px7ys0|5iv8k0|67zw0|a4w40|73h80|cls40|66580|cls40|66580|cls40|66580|cls40|67zw0|cls40|66580|cls40|66580|cls40|66580|cls40|67zw0|6a040|hy7w0|6a040|xovw0|3uys0|18nbw0|b0dg0|8ve2k0|3uys0|3yik0|bqas0|71mk0|bqas0|71mk0|bqas0|8ovw0|9d440|9px80|9d440|9cyk0|9d440|28t6k0|51ek0|7m2qs0|4tzw0|biw40|7pp80|b2aw0|71mk0|4qg40|4conw0|7thc0|27qdc0|2txg0|1sgak0|14nw0|2gys0|b5xg0|7k580|b5xg0|Infinity" }, { id: "America/Argentina/Tucuman", title: "Tucuman", winIndex: 9, offsets: [-4.28, -4, -3, -2], offsetIndices: "012121212121212121212121212121212121212121232323231323222123232", untils: "-px7ys0|5iv8k0|67zw0|a4w40|73h80|cls40|66580|cls40|66580|cls40|66580|cls40|67zw0|cls40|66580|cls40|66580|cls40|66580|cls40|67zw0|6a040|hy7w0|6a040|xovw0|3uys0|18nbw0|b0dg0|8ve2k0|3uys0|3yik0|bqas0|71mk0|bqas0|71mk0|bqas0|8ovw0|9d440|9px80|9d440|9cyk0|9d440|28t6k0|51ek0|7m2qs0|4tzw0|biw40|776k0|bvus0|6u7w0|bvxk0|6u540|bvus0|776k0|3fidg0|7thc0|27s800|mas0|1um2k0|3yik0|b5xg0|7k580|Infinity" }, { id: "America/Argentina/Ushuaia", title: "Ushuaia", winIndex: 9, offsets: [-4.28, -4, -3, -2], offsetIndices: "0121212121212121212121212121212121212121212323232323232221232", untils: "-px7ys0|5iv8k0|67zw0|a4w40|73h80|cls40|66580|cls40|66580|cls40|66580|cls40|67zw0|cls40|66580|cls40|66580|cls40|66580|cls40|67zw0|6a040|hy7w0|6a040|xovw0|3uys0|18nbw0|b0dg0|8ve2k0|3uys0|3yik0|bqas0|71mk0|bqas0|71mk0|bqas0|8ovw0|9d440|9px80|9d440|9cyk0|9d440|28t6k0|51ek0|7m2qs0|4tzw0|biw40|776k0|bvus0|6u7w0|bvus0|6u7w0|bvus0|776k0|3fidg0|7thc0|27oio0|12ys0|1u93w0|3yik0|Infinity" }, { id: "America/Asuncion", title: "Asuncion", winIndex: 65, offsets: [-3.844444444444444, -4, -3], offsetIndices: "012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212", untils: "-jy93zk|ldwofk|s4vw0|s6w40|7tek0|b0dg0|7rjw0|b0dg0|7rjw0|b0dg0|9cyk0|9eys0|9et80|9eys0|9cyk0|9eys0|9cyk0|9eys0|9cyk0|9eys0|9et80|9eys0|9cyk0|9eys0|9cyk0|9eys0|9cyk0|9eys0|9et80|9eys0|9cyk0|ahus0|8a2k0|9eys0|9cyk0|9o840|7k580|b7s40|93p80|9gtg0|7nuk0|b42s0|7lzw0|b5xg0|7tek0|b9ms0|776k0|biw40|7k580|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|9cyk0|7kas0|b5rw0|7x9g0|ast80|a31g0|7k580|b5xg0|7k580|b5xg0|7k580|biw40|776k0|biw40|776k0|biw40|8zzw0|905g0|9px80|905g0|9px80|9d440|8n180|a31g0|8n180|a31g0|8n180|a31g0|8zzw0|9q2s0|8zzw0|9q2s0|8zzw0|a31g0|8n180|a31g0|8n180|a31g0|8zzw0|9q2s0|8zzw0|9q2s0|8zzw0|9q2s0|8zzw0|a31g0|8n180|a31g0|8n180|a31g0|8zzw0|9q2s0|8zzw0|9q2s0|8zzw0|a31g0|8n180|a31g0|8n180|a31g0|8zzw0|9q2s0|8zzw0|9q2s0|8zzw0|9q2s0|8zzw0|a31g0|8n180|a31g0|8n180|a31g0|Infinity" }, { id: "America/Atikokan", title: "Atikokan", winIndex: 10, offsets: [-6, -5], offsetIndices: "0101111", untils: "-qzov40|a2vw0|bfxjw0|pmdk0|1tz8c0|2dsw0|Infinity" }, { id: "America/Bahia", title: "Bahia", winIndex: 66, offsets: [-2.5677777777777777, -3, -2], offsetIndices: "01212121212121212121212121212121212121212121212121212121212121", untils: "-t85kv8|99kaf8|9a9c0|9io40|99980|8p65g0|6zuo0|bs2o0|67zw0|cjxg0|69uk0|cjxg0|4ml80|5mf440|49mk0|haas0|316k0|cls40|4ml80|cls40|66580|cls40|67zw0|981s40|6u7w0|biw40|5rbw0|d0lg0|5ed80|cyqs0|5ed80|dbpg0|64ak0|cyqs0|64ak0|cls40|5rbw0|dbpg0|51ek0|dbpg0|6h980|c8tg0|6h980|c8tg0|64ak0|c8tg0|6u7w0|bxpg0|7iak0|biw40|6u7w0|biw40|7k580|biw40|6u7w0|c8tg0|6h980|dbpg0|5ed80|4irc40|6u7w0|Infinity" }, { id: "America/Bahia_Banderas", title: "Bahia Banderas", winIndex: 47, offsets: [-7.016666666666667, -7, -6, -8, -5], offsetIndices: "0121212131212121212121212121212121212142424242424242424242424242424242424242424242424242424242", untils: "-p1u4k0|2u7jw0|1sgdc0|8n400|7thc0|9eys0|591h80|3ie2s0|axvpg0|dpgw40|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|9q2s0|7k580|9q2s0|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|asqg0|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|Infinity" }, { id: "America/Barbados", title: "Barbados", winIndex: 16, offsets: [-3.974722222222222, -4, -3], offsetIndices: "00121212121", untils: "-o0aiaj|46b400|npv1mj|5rbw0|a31g0|8n180|a31g0|8n180|ag040|84ik0|Infinity" }, { id: "America/Belem", title: "Belem", winIndex: 64, offsets: [-3.232222222222222, -3, -2], offsetIndices: "012121212121212121212121212121", untils: "-t85j0s|99k8ks|9a9c0|9io40|99980|8p65g0|6zuo0|bs2o0|67zw0|cjxg0|69uk0|cjxg0|4ml80|5mf440|49mk0|haas0|316k0|cls40|4ml80|cls40|66580|cls40|67zw0|981s40|6u7w0|biw40|5rbw0|d0lg0|5ed80|Infinity" }, { id: "America/Belize", title: "Belize", winIndex: 67, offsets: [-5.88, -6, -5.5, -5], offsetIndices: "01212121212121212121212121212121212121212121212121213131", untils: "-u52ic0|3edkc0|6ham0|c8s20|6u9a0|bvte0|6u9a0|bvte0|6u9a0|c8s20|6ham0|c8s20|6ham0|c8s20|6u9a0|bvte0|6u9a0|bvte0|6u9a0|bvte0|6u9a0|c8s20|6ham0|c8s20|6ham0|c8s20|6u9a0|bvte0|6u9a0|bvte0|6u9a0|c8s20|6ham0|c8s20|6ham0|c8s20|6ham0|c8s20|6u9a0|bvte0|6u9a0|bvte0|6u9a0|c8s20|6ham0|c8s20|6ham0|c8s20|6u9a0|bvte0|6u9a0|g2t2q0|3e580|4mcys0|2vmk0|Infinity" }, { id: "America/Blanc-Sablon", title: "Blanc-Sablon", winIndex: 16, offsets: [-4, -3], offsetIndices: "010110", untils: "-qzp0o0|a2vw0|c5jxg0|1tzdw0|2dnc0|Infinity" }, { id: "America/Boa_Vista", title: "Boa Vista", winIndex: 16, offsets: [-4.044444444444444, -4, -3], offsetIndices: "0121212121212121212121212121212121", untils: "-t85grk|99k93k|9a9c0|9io40|99980|8p65g0|6zuo0|bs2o0|67zw0|cjxg0|69uk0|cjxg0|4ml80|5mf440|49mk0|haas0|316k0|cls40|4ml80|cls40|66580|cls40|67zw0|981s40|6u7w0|biw40|5rbw0|d0lg0|5ed80|62xk40|7k580|biw40|cvw0|Infinity" }, { id: "America/Bogota", title: "Bogota", winIndex: 10, offsets: [-4.937777777777778, -5, -4], offsetIndices: "0121", untils: "-srdoy8|14f1hi8|ha580|Infinity" }, { id: "America/Boise", title: "Boise", winIndex: 15, offsets: [-8, -7, -6], offsetIndices: "0101012212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-r0emw0|ast80|7x9g0|ast80|1um840|9s7jw0|1tz5k0|2dvo0|b9gdg0|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|51k40|doik0|64g40|clmk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Cambridge_Bay", title: "Cambridge Bay", winIndex: 15, offsets: [0, -7, -6, -5], offsetIndices: "0122131212121212121212121212121212121212121212233221212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-q3gdc0|bjeec0|1tz5k0|2dvo0|a7n3w0|9q000|7k85k0|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x6o0|ast80|ct40|7kj40|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Campo_Grande", title: "Campo Grande", winIndex: 68, offsets: [-3.641111111111111, -4, -3], offsetIndices: "012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212", untils: "-t85hvw|99ka7w|9a9c0|9io40|99980|8p65g0|6zuo0|bs2o0|67zw0|cjxg0|69uk0|cjxg0|4ml80|5mf440|49mk0|haas0|316k0|cls40|4ml80|cls40|66580|cls40|67zw0|981s40|6u7w0|biw40|5rbw0|d0lg0|5ed80|cyqs0|5ed80|dbpg0|64ak0|cyqs0|64ak0|cls40|5rbw0|dbpg0|51ek0|dbpg0|6h980|c8tg0|6h980|c8tg0|64ak0|c8tg0|6u7w0|bxpg0|7iak0|biw40|6u7w0|biw40|7k580|biw40|6u7w0|c8tg0|6h980|dbpg0|5ed80|cls40|64ak0|dfes0|5nmk0|c8tg0|6h980|dbpg0|5rbw0|bvus0|6h980|cls40|64ak0|cls40|6h980|c8tg0|6h980|c8tg0|6u7w0|c8tg0|64ak0|cls40|64ak0|cls40|6h980|c8tg0|6h980|c8tg0|6h980|c8tg0|6h980|cls40|64ak0|cls40|64ak0|cls40|6h980|c8tg0|6h980|c8tg0|6u7w0|bvus0|6h980|cls40|64ak0|cls40|6h980|c8tg0|6h980|c8tg0|6h980|c8tg0|6h980|cls40|64ak0|cls40|64ak0|cls40|64ak0|cls40|6h980|c8tg0|6u7w0|bvus0|6h980|cls40|64ak0|cls40|6h980|c8tg0|Infinity" }, { id: "America/Cancun", title: "Cancun", winIndex: 47, offsets: [-5.7844444444444445, -6, -5, -4], offsetIndices: "0123232321212121212121212121212121212121212", untils: "-p1u7c0|vauo00|7ggw40|afuk0|8a840|afuk0|8a840|64ak0|4bms0|8a840|ast80|7x9g0|ast80|9q2s0|7k580|9q2s0|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|51k40|Infinity" }, { id: "America/Caracas", title: "Caracas", winIndex: 69, offsets: [-4.461111111111111, -4.5, -4], offsetIndices: "01212", untils: "-u7lcxw|rlo83w|meoxm0|4dps00|Infinity" }, { id: "America/Cayenne", title: "Cayenne", winIndex: 64, offsets: [-3.488888888888889, -4, -3], offsetIndices: "012", untils: "-uj7yb4|tcw6r4|Infinity" }, { id: "America/Cayman", title: "Cayman", winIndex: 10, link: 299 }, { id: "America/Chicago", title: "Chicago", winIndex: 13, offsets: [-6, -5], offsetIndices: "01010101010101010101010101010101010101010101010101101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010", untils: "-r0esg0|ast80|7x9g0|ast80|bvus0|776k0|7kas0|b5rw0|9d440|7k580|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7k580|b5xg0|7x3w0|asys0|7x3w0|7x9g0|dbjw0|8a840|7x3w0|asys0|7x3w0|b5xg0|7k580|b5xg0|7x3w0|asys0|7x3w0|6w840|1tz8c0|2dsw0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7k580|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|3lpg0|f4d80|64g40|clmk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Chihuahua", title: "Chihuahua", winIndex: 46, offsets: [-7.072222222222222, -7, -6, -5], offsetIndices: "0121212323221212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-p1u4k0|2u7jw0|1sgdc0|8n400|7thc0|9eys0|xes2s0|afuk0|8a840|afuk0|8aaw0|afuk0|8a840|ast80|7x9g0|ast80|9q2s0|7k580|9q2s0|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|Infinity" }, { id: "America/Costa_Rica", title: "Costa Rica", winIndex: 67, offsets: [-5.60361111111111, -6, -5], offsetIndices: "0121212121", untils: "-pjw8fn|ubtl3n|51ek0|doo40|51ek0|5jso40|8drw0|acas0|2xh80|Infinity" }, { id: "America/Creston", title: "Creston", winIndex: 56, offsets: [-7, -8], offsetIndices: "010", untils: "-rshz80|vbus0|Infinity" }, { id: "America/Cuiaba", title: "Cuiaba", winIndex: 68, offsets: [-3.738888888888889, -4, -3], offsetIndices: "0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212", untils: "-t85hm4|99k9y4|9a9c0|9io40|99980|8p65g0|6zuo0|bs2o0|67zw0|cjxg0|69uk0|cjxg0|4ml80|5mf440|49mk0|haas0|316k0|cls40|4ml80|cls40|66580|cls40|67zw0|981s40|6u7w0|biw40|5rbw0|d0lg0|5ed80|cyqs0|5ed80|dbpg0|64ak0|cyqs0|64ak0|cls40|5rbw0|dbpg0|51ek0|dbpg0|6h980|c8tg0|6h980|c8tg0|64ak0|c8tg0|6u7w0|bxpg0|7iak0|biw40|6u7w0|biw40|7k580|biw40|6u7w0|c8tg0|6h980|dbpg0|5ed80|w5hg0|5nmk0|c8tg0|6h980|dbpg0|5rbw0|bvus0|6h980|cls40|64ak0|cls40|6h980|c8tg0|6h980|c8tg0|6u7w0|c8tg0|64ak0|cls40|64ak0|cls40|6h980|c8tg0|6h980|c8tg0|6h980|c8tg0|6h980|cls40|64ak0|cls40|64ak0|cls40|6h980|c8tg0|6h980|c8tg0|6u7w0|bvus0|6h980|cls40|64ak0|cls40|6h980|c8tg0|6h980|c8tg0|6h980|c8tg0|6h980|cls40|64ak0|cls40|64ak0|cls40|64ak0|cls40|6h980|c8tg0|6u7w0|bvus0|6h980|cls40|64ak0|cls40|6h980|c8tg0|Infinity" }, { id: "America/Curacao", title: "Curacao", winIndex: 16, offsets: [-4.59638888888889, -4.5, -4], offsetIndices: "012", untils: "-u7lckd|rlo7qd|Infinity" }, { id: "America/Danmarkshavn", title: "Danmarkshavn", winIndex: 41, offsets: [-1.2444444444444445, -3, -2, 0], offsetIndices: "01212121212121212121212121212121213", untils: "-rvusjk|x8nx3k|8zrk0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|53hk0|Infinity" }, { id: "America/Dawson", title: "Dawson", winIndex: 11, offsets: [-9, -8, -7], offsetIndices: "0101011020121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-qzoms0|a2vw0|asys0|882c0|bmiwc0|1tz000|2e180|a7n3w0|9q000|465k00|3e2is0|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Dawson_Creek", title: "Dawson Creek", winIndex: 56, offsets: [-8, -7], offsetIndices: "0101101010101010101010101010101010101010101010101010101011", untils: "-qzopk0|a2vw0|c5jxg0|1tz2s0|2dyg0|tj1g0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7k580|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7k580|b5xg0|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|69uk0|Infinity" }, { id: "America/Denver", title: "Denver", winIndex: 15, offsets: [-7, -6], offsetIndices: "01010101011010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010", untils: "-r0epo0|ast80|7x9g0|ast80|7x9g0|b5rw0|7kas0|2vmk0|ataw40|1tz5k0|2dvo0|a7n9g0|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|3lpg0|f4d80|64g40|clmk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Detroit", title: "Detroit", winIndex: 14, offsets: [-5.536388888888889, -6, -5, -4], offsetIndices: "01233232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232", untils: "-xx8dyd|5eraud|dyeyk0|1tzb40|2dq40|1c9440|7x3w0|9rlhg0|71mk0|2vcg40|9cyk0|3lpg0|f4d80|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Edmonton", title: "Edmonton", winIndex: 15, offsets: [-7.564444444444445, -7, -6], offsetIndices: "01212121212121221212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-x1yazk|629ink|a2vw0|8n6s0|29ek0|h6lg0|9px80|905g0|7x3w0|b5xg0|7k580|b5xg0|7x3w0|9l0g40|1tz5k0|2dvo0|tj1g0|7x3w0|a80840|9cyk0|s36s0|9cyk0|1b6840|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Eirunepe", title: "Eirunepe", winIndex: 10, offsets: [-4.657777777777778, -5, -4], offsetIndices: "0121212121212121212121212121212121", untils: "-t85f28|99ka68|9a9c0|9io40|99980|8p65g0|6zuo0|bs2o0|67zw0|cjxg0|69uk0|cjxg0|4ml80|5mf440|49mk0|haas0|316k0|cls40|4ml80|cls40|66580|cls40|67zw0|981s40|6u7w0|biw40|5rbw0|d0lg0|5ed80|2yy2s0|6h980|7hg2s0|2t2t80|Infinity" }, { id: "America/El_Salvador", title: "El Salvador", winIndex: 67, offsets: [-5.946666666666667, -6, -5], offsetIndices: "012121", untils: "-pkm4tc|ymao5c|7k580|b5xg0|7k580|Infinity" }, { id: "America/Fortaleza", title: "Fortaleza", winIndex: 64, offsets: [-2.566666666666667, -3, -2], offsetIndices: "0121212121212121212121212121212121212121", untils: "-t85kvc|99kafc|9a9c0|9io40|99980|8p65g0|6zuo0|bs2o0|67zw0|cjxg0|69uk0|cjxg0|4ml80|5mf440|49mk0|haas0|316k0|cls40|4ml80|cls40|66580|cls40|67zw0|981s40|6u7w0|biw40|5rbw0|d0lg0|5ed80|cyqs0|5ed80|dbpg0|64ak0|514g40|7k580|biw40|puk0|id6s0|6h980|Infinity" }, { id: "America/Glace_Bay", title: "Glace Bay", winIndex: 36, offsets: [-3.996666666666667, -4, -3], offsetIndices: "012122121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-z94kwc|89fk8c|a2vw0|c5jxg0|1tzdw0|2dnc0|3y8g40|7x3w0|9pa5g0|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Godthab", title: "Godthab", winIndex: 70, offsets: [-3.448888888888889, -3, -2], offsetIndices: "0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-rvumf4|x8nqz4|8zrk0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "America/Goose_Bay", title: "Goose Bay", winIndex: 36, offsets: [-3.5144444444444445, -2.5144444444444445, -3.5, -2.5, -4, -3, -2], offsetIndices: "010232323232323233232323232323232323232323232323232323232324545454545454545454545454545454545454545454546454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454", untils: "-qzp20k|a2vw0|8kjbw0|kzjyk|7k580|b5xg0|7k580|b5xg0|7k580|biw40|776k0|biw40|7k580|b5xg0|7k580|b5xg0|1pb260|2dly0|biw40|7k580|b5xg0|7k580|b5xg0|7k580|b5xg0|7k580|biw40|7k580|ag040|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|6y2s0|22420|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a2lo|afuk0|8a840|asqg0|7xc80|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8tec|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Grand_Turk", title: "Grand Turk", winIndex: 16, offsets: [-5.119722222222222, -5, -4], offsetIndices: "0121212121212121212121212121212121212121212121212121212121212121212121212122", untils: "-u85og1|z3brw1|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Guatemala", title: "Guatemala", winIndex: 67, offsets: [-6.0344444444444445, -6, -5], offsetIndices: "0121212121", untils: "-qqqskk|ss0akk|4ofw0|4tidg0|6djw0|3wwas0|8n180|7n5ms0|7x3w0|Infinity" }, { id: "America/Guayaquil", title: "Guayaquil", winIndex: 10, offsets: [-5.233333333333333, -5], offsetIndices: "01", untils: "-kcr84o|Infinity" }, { id: "America/Guyana", title: "Guyana", winIndex: 16, offsets: [-3.8777777777777778, -3.75, -3, -4], offsetIndices: "01123", untils: "-smcak8|qqnjn8|4sh9c0|81rf90|Infinity" }, { id: "America/Halifax", title: "Halifax", winIndex: 36, offsets: [-4.24, -4, -3], offsetIndices: "0121212121212121212121212121212121212121212121212122121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-z94k80|777go0|9et80|st9o0|a2vw0|ssyk0|5rbw0|cv1g0|69uk0|c6ys0|6kyk0|ci2s0|67zw0|ci2s0|6w2k0|bu040|7lzw0|bu040|66580|bu040|7lzw0|bu040|64ak0|cls40|5v180|cv1g0|6j3w0|c6ys0|79180|b42s0|7lzw0|b42s0|7yyk0|bu040|64ak0|dbpg0|66580|cls40|5ed80|bu040|7lzw0|b42s0|7lzw0|cjxg0|66580|bh1g0|7lzw0|b42s0|7lzw0|6uj00|1tzdw0|2dnc0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|tw040|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|tw040|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|1cm2s0|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Havana", title: "Havana", winIndex: 14, offsets: [-5.493333333333334, -5, -4], offsetIndices: "012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-n7762o|1icfyo|69uk0|62s040|4ofw0|e1ms0|51ek0|e1ms0|4ofw0|1fhs40|4ofw0|e1ms0|4ofw0|9s9k40|67zw0|cedg0|6h980|9o840|7yyk0|b5xg0|7k580|bvus0|9cyk0|9d440|9cyk0|9d440|9px80|9d440|8a2k0|ag040|8bx80|ae5g0|8drw0|acas0|9cyk0|9d440|9px80|905g0|9px80|9q2s0|7x3w0|8a840|ast80|7x9g0|ast80|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|8a2k0|ag040|8a2k0|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|905g0|a2vw0|905g0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|9d1c0|9d1c0|9d1c0|9q000|8n400|asw00|7x6o0|b5uo0|7x6o0|asw00|7x6o0|asw00|8a5c0|afxc0|8a5c0|afxc0|7x6o0|1cm000|6uao0|bvs00|779c0|bitc0|6uao0|bvs00|779c0|bvs00|779c0|c8qo0|779c0|b5uo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6uao0|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6uao0|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6uao0|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6uao0|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|Infinity" }, { id: "America/Hermosillo", title: "Hermosillo", winIndex: 56, offsets: [-7.397777777777778, -7, -6, -8], offsetIndices: "0121212131212121", untils: "-p1u4k0|2u7jw0|1sgdc0|8n400|7thc0|9eys0|591h80|3ie2s0|axvpg0|dpgw40|afuk0|8a840|afuk0|8a840|afuk0|Infinity" }, { id: "America/Indiana/Indianapolis", title: "Indianapolis", winIndex: 12 }, { id: "America/Indiana/Knox", title: "Knox", winIndex: 13, offsets: [-6, -5], offsetIndices: "0101011010101010101010101010101010101010101010101010101010101010101010101010101010101010111010101010101010101010101010101010101010101010101010101010101010", untils: "-r0esg0|ast80|7x9g0|ast80|bmtus0|1tz8c0|2dsw0|tj1g0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7k580|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|9px80|9d440|9cyk0|9d440|7x3w0|asys0|7x3w0|asys0|9cyk0|9d440|9px80|9d440|9cyk0|9d440|s3180|1twas0|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|3lpg0|f4d80|64g40|clmk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|7j5400|asw00|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Indiana/Marengo", title: "Marengo", winIndex: 12, offsets: [-6, -5, -4], offsetIndices: "0101011010101010101010101212121212111212121212121212121212121212121212121212121212121212121212121212121", untils: "-r0esg0|ast80|7x9g0|ast80|bmtus0|1tz8c0|2dsw0|2wsas0|7x3w0|1c9440|7x3w0|asys0|7x3w0|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|465h80|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|3lpg0|f4g00|64dc0|clmk0|fvt9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Indiana/Petersburg", title: "Petersburg", winIndex: 14, offsets: [-6, -5, -4], offsetIndices: "01010110101010101010101010101010101010101010101010111011212121212121212121212121212121212121212121212121212121212121", untils: "-r0esg0|ast80|7x9g0|ast80|bmtus0|1tz8c0|2dsw0|501ek0|7kas0|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|sfzw0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|3lpg0|f4d80|64g40|clmk0|9d440|9px80|905g0|9px80|eu02o0|asw00|6udg0|c8nw0|6hc00|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Indiana/Tell_City", title: "Tell City", winIndex: 13, offsets: [-6, -5, -4], offsetIndices: "01010110101010101010101010101010121211010101010101010101010101010101010101010101010101010101010101010", untils: "-r0esg0|ast80|7x9g0|ast80|bmtus0|1tz8c0|2dsw0|asys0|7x3w0|3fidg0|7x3w0|asys0|7x3w0|b5rw0|7kas0|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|9px80|9d440|7k580|b5xg0|9cyk0|9d440|9cyk0|9d440|2lz980|9cyk0|9d440|9cyk0|ihslg0|asw00|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Indiana/Vevay", title: "Vevay", winIndex: 12, offsets: [-6, -5, -4], offsetIndices: "010101101212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-r0esg0|ast80|7x9g0|ast80|bmtus0|1tz8c0|2dsw0|4gyis0|7txx80|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|hfzhg0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Indiana/Vincennes", title: "Vincennes", winIndex: 14, offsets: [-6, -5, -4], offsetIndices: "01010110101010101010101010101010121211011212121212121212121212121212121212121212121212121212121212121", untils: "-r0esg0|ast80|7x9g0|ast80|bmtus0|1tz8c0|2dsw0|asys0|7x3w0|3fidg0|7x3w0|asys0|7x3w0|b5rw0|7kas0|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|9px80|9d440|7k580|b5xg0|9cyk0|9d440|9cyk0|9d440|2lz980|9cyk0|9d440|9cyk0|ihslg0|asw00|6udg0|c8nw0|6hc00|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Indiana/Winamac", title: "Winamac", winIndex: 14, offsets: [-6, -5, -4], offsetIndices: "01010110101010101010101010101010101010121211021212121212121212121212121212121212121212121212121212121212121", untils: "-r0esg0|ast80|7x9g0|ast80|bmtus0|1tz8c0|2dsw0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7k580|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|9px80|9d440|9cyk0|9d440|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|465h80|9cyk0|9d440|9cyk0|ihslg0|asw00|6udg0|c8l40|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Inuvik", title: "Inuvik", winIndex: 15, offsets: [0, -8, -6, -7], offsetIndices: "0121323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323", untils: "-8ve5c0|6fce80|9q000|71i2w0|ipzw0|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Iqaluit", title: "Iqaluit", winIndex: 14, offsets: [0, -4, -5, -3, -6], offsetIndices: "01123212121212121212121212121212121212121212142212121212121212121212121212121212121212121212121212121212121212121212121212", untils: "-eb6ao0|1l3h80|2dq40|a7n3w0|9q000|7k85k0|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7xc80|ast80|7x6o0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Jamaica", title: "Jamaica", winIndex: 10, offsets: [-5.119722222222222, -5, -4], offsetIndices: "0121212121212121212121", untils: "-u85og1|wbl181|f4d80|64g40|clmk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|Infinity" }, { id: "America/Juneau", title: "Juneau", winIndex: 55, offsets: [-8, -7, -9], offsetIndices: "01101010101010101010101010001010122020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202", untils: "-ek1w80|1tz2s0|2dyg0|cawis0|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|3lpg0|f4d80|64g40|clmk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9d1c0|9d1c0|9cyk0|9d440|9px80|905g0|9px80|1leo0|7rs80|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Kentucky/Louisville", title: "Louisville", winIndex: 14, offsets: [-6, -5, -4], offsetIndices: "0101010101101010101010101010101010101121212121212111212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-r0esg0|ast80|7x9g0|ast80|sg5g0|6bp80|a98o40|7x3w0|6w840|1tz8c0|2dsw0|4s580|7tk40|gxc40|1s3bw0|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|4bh80|3j3xc0|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|3lpg0|f4g00|64dc0|clmk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Kentucky/Monticello", title: "Monticello", winIndex: 14, offsets: [-6, -5, -4], offsetIndices: "0101011010101010101010101010101010101010101010101010101010101010101010101121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-r0esg0|ast80|7x9g0|ast80|bmtus0|1tz8c0|2dsw0|bs6g40|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|3lpg0|f4d80|64g40|clmk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x6o0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/La_Paz", title: "La Paz", winIndex: 16, offsets: [-4.543333333333334, -3.5433333333333334, -4], offsetIndices: "012", untils: "-jxzspo|84ik0|Infinity" }, { id: "America/Lima", title: "Lima", winIndex: 10, offsets: [-5.1433333333333335, -5, -4], offsetIndices: "0121212121212121", untils: "-w25lpo|fcxjlo|4ml80|93us0|9cyk0|9d440|9cyk0|nw16s0|4ml80|e5c40|4ml80|1fr1g0|4ml80|1yiys0|4ml80|Infinity" }, { id: "America/Los_Angeles", title: "Los Angeles", winIndex: 11, offsets: [-8, -7], offsetIndices: "010101101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010", untils: "-r0emw0|ast80|7x9g0|ast80|bmtus0|1tz2s0|2dyg0|1a3c40|f2ik0|owdg0|7k580|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7k580|b5xg0|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|3lpg0|f4d80|64g40|clmk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Maceio", title: "Maceio", winIndex: 64, offsets: [-2.381111111111111, -3, -2], offsetIndices: "012121212121212121212121212121212121212121", untils: "-t85ldw|99kaxw|9a9c0|9io40|99980|8p65g0|6zuo0|bs2o0|67zw0|cjxg0|69uk0|cjxg0|4ml80|5mf440|49mk0|haas0|316k0|cls40|4ml80|cls40|66580|cls40|67zw0|981s40|6u7w0|biw40|5rbw0|d0lg0|5ed80|cyqs0|5ed80|dbpg0|64ak0|2yl440|64ak0|1wf1g0|7k580|biw40|puk0|id6s0|6h980|Infinity" }, { id: "America/Managua", title: "Managua", winIndex: 67, offsets: [-5.753333333333333, -6, -5], offsetIndices: "0121212121212121", untils: "-ijh6oo|ka1i0o|xqqk0|24p6s0|53980|dmtg0|53980|60itw0|dq240|53es0|235h80|4beis0|8zzw0|at4c0|7x140|Infinity" }, { id: "America/Manaus", title: "Manaus", winIndex: 16, offsets: [-4.001111111111111, -4, -3], offsetIndices: "01212121212121212121212121212121", untils: "-t85gvw|99k97w|9a9c0|9io40|99980|8p65g0|6zuo0|bs2o0|67zw0|cjxg0|69uk0|cjxg0|4ml80|5mf440|49mk0|haas0|316k0|cls40|4ml80|cls40|66580|cls40|67zw0|981s40|6u7w0|biw40|5rbw0|d0lg0|5ed80|2yy2s0|6h980|Infinity" }, { id: "America/Martinique", title: "Martinique", winIndex: 16, offsets: [-4.072222222222222, -4, -3], offsetIndices: "0121", untils: "-umcvcs|zz5x4s|8zzw0|Infinity" }, { id: "America/Matamoros", title: "Matamoros", winIndex: 13, offsets: [-6.666666666666667, -6, -5], offsetIndices: "0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-p1u7c0|ykt480|ast80|3vppg0|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|9q2s0|7k580|9q2s0|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|77c40|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Mazatlan", title: "Mazatlan", winIndex: 46, offsets: [-7.094444444444445, -7, -6, -8], offsetIndices: "0121212131212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-p1u4k0|2u7jw0|1sgdc0|8n400|7thc0|9eys0|591h80|3ie2s0|axvpg0|dpgw40|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|9q2s0|7k580|9q2s0|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|Infinity" }, { id: "America/Menominee", title: "Menominee", winIndex: 13, offsets: [-6, -5], offsetIndices: "01010110101011010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010", untils: "-r0esg0|ast80|7x9g0|ast80|bmtus0|1tz8c0|2dsw0|asys0|7x3w0|a7n9g0|9px80|1at9g0|2396k0|9d1c0|3lpg0|f4d80|64g40|clmk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Merida", title: "Merida", winIndex: 47, offsets: [-5.974444444444444, -6, -5], offsetIndices: "0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-p1u7c0|vauo00|hoyk0|6ys0c0|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|9q2s0|7k580|9q2s0|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|Infinity" }, { id: "America/Mexico_City", title: "Mexico City", winIndex: 47, offsets: [-6.61, -7, -6, -5], offsetIndices: "012121232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232", untils: "-p1u4k0|2u7jw0|1sgdc0|8n400|7thc0|9eys0|3knek0|776k0|rf440|5t6k0|1evk40|71mk0|30p1g0|8n180|nufxo0|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|9q2s0|7k580|9q2s0|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|Infinity" }, { id: "America/Moncton", title: "Moncton", winIndex: 36, offsets: [-5, -4, -3], offsetIndices: "012121212121212121212122121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-z94i40|89fhg0|a2vw0|7mqqo0|4ofw0|e1ms0|4ofw0|e1ms0|4ofw0|e1ms0|4ofw0|e1ms0|4ofw0|e1ms0|4ofw0|dmtg0|64ak0|cao40|6fek0|bkqs0|7iak0|6y5k0|1tzdw0|2dnc0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7k580|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7x3w0|asys0|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|s36s0|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a2lo|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6uiyc|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Monterrey", title: "Monterrey", winIndex: 47, offsets: [-6.687777777777778, -6, -5], offsetIndices: "0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-p1u7c0|ykt480|ast80|3vppg0|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|9q2s0|7k580|9q2s0|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|Infinity" }, { id: "America/Montevideo", title: "Montevideo", winIndex: 71, offsets: [-3.7455555555555553, -3.5, -3, -2, -2.5], offsetIndices: "012121212121212121212121213232323232324242423243232323232323232323232323232323232323232", untils: "-px809g|1s8xzg|9czy0|9exe0|9czy0|9exe0|9czy0|3ydyq0|7x5a0|asxe0|7x5a0|asxe0|7x5a0|b5w20|7k6m0|b5w20|7k6m0|b5w20|7k6m0|b5w20|7x5a0|asxe0|7x5a0|6do20|7vam0|humq0|4mju0|8g9s40|8zzw0|38qs0|2inw0|2nf9g0|8zzw0|9q2s0|aunw0|7ves0|awik0|ar440|9pym0|91yq0|9pym0|91yq0|9pym0|q6mq0|5t6k0|tfc40|erfy0|xdta0|m2is0|62fw0|s6w40|ayd80|3z5s40|4ofw0|dzs40|4ofw0|bvus0|6h980|bvus0|6u7w0|c8tg0|6h980|bvus0|6u7w0|614qs0|9q2s0|a31g0|7x3w0|ag040|8a2k0|asys0|7x3w0|asys0|7x3w0|asys0|8a2k0|ag040|8a2k0|ag040|8a2k0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|Infinity" }, { id: "America/Montreal", title: "Montreal", winIndex: 14, link: 326 }, { id: "America/Nassau", title: "Nassau", winIndex: 14, offsets: [-5.158333333333333, -5, -4], offsetIndices: "012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-u6m4c6|r7u7s6|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/New_York", title: "New York", winIndex: 14, offsets: [-5, -4], offsetIndices: "01010101010101010101010101010101010101010101010101101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010", untils: "-r0ev80|ast80|7x9g0|ast80|7x9g0|b5rw0|905g0|7x3w0|b5xg0|7k580|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7k580|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7k580|b5xg0|7x3w0|asys0|7x3w0|6w840|1tzb40|2dq40|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7k580|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|3lpg0|f4d80|64g40|clmk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Nipigon", title: "Nipigon", winIndex: 14, offsets: [-5, -4], offsetIndices: "010111010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010", untils: "-qzoxw0|a2vw0|bfxjw0|pmdk0|1tzb40|2dq40|ewvus0|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Nome", title: "Nome", winIndex: 55, offsets: [-11, -10, -9, -8], offsetIndices: "011001010101010101010101010101010122323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232", untils: "-ek1nw0|1tyug0|2e6s0|b7yik0|12y080|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|3lpg0|f4d80|64g40|clmk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|1l6c0|7rs80|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Noronha", title: "Noronha", winIndex: 34, offsets: [-2.161111111111111, -2, -1], offsetIndices: "0121212121212121212121212121212121212121", untils: "-t85lzw|99k8rw|9a9c0|9io40|99980|8p65g0|6zuo0|bs2o0|67zw0|cjxg0|69uk0|cjxg0|4ml80|5mf440|49mk0|haas0|316k0|cls40|4ml80|cls40|66580|cls40|67zw0|981s40|6u7w0|biw40|5rbw0|d0lg0|5ed80|cyqs0|5ed80|dbpg0|64ak0|514g40|7k580|biw40|cvw0|iq5g0|6h980|Infinity" }, { id: "America/North_Dakota/Beulah", title: "Beulah", winIndex: 13, offsets: [-7, -6, -5], offsetIndices: "010101101010101010101010101010101010101010101010101010101010101010101010101010101010101010101011212121212121212121212121212121212121212121212121212121", untils: "-r0epo0|ast80|7x9g0|ast80|bmtus0|1tz5k0|2dvo0|b9gdg0|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|3lpg0|f4d80|64g40|clmk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hc00|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/North_Dakota/Center", title: "Center", winIndex: 13, offsets: [-7, -6, -5], offsetIndices: "010101101010101010101010101010101010101010101010101010101011212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-r0epo0|ast80|7x9g0|ast80|bmtus0|1tz5k0|2dvo0|b9gdg0|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|3lpg0|f4d80|64g40|clmk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a5c0|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/North_Dakota/New_Salem", title: "New Salem", winIndex: 13, offsets: [-7, -6, -5], offsetIndices: "010101101010101010101010101010101010101010101010101010101010101010101010101010101121212121212121212121212121212121212121212121212121212121212121212121", untils: "-r0epo0|ast80|7x9g0|ast80|bmtus0|1tz5k0|2dvo0|b9gdg0|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|3lpg0|f4d80|64g40|clmk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a5c0|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Ojinaga", title: "Ojinaga", winIndex: 15, offsets: [-6.961111111111111, -7, -6, -5], offsetIndices: "0121212323221212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-p1u4k0|2u7jw0|1sgdc0|8n400|7thc0|9eys0|xes2s0|afuk0|8a840|afuk0|8aaw0|afuk0|8a840|ast80|7x9g0|ast80|9q2s0|7k580|9q2s0|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|77c40|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Panama", title: "Panama", winIndex: 10, offsets: [-5.326666666666667, -5], offsetIndices: "01", untils: "-w757vc|Infinity" }, { id: "America/Pangnirtung", title: "Pangnirtung", winIndex: 14, offsets: [0, -4, -3, -2, -5, -6], offsetIndices: "012213121212121212121212121212121212114141414154414141414141414141414141414141414141414141414141414141414141414141414141414", untils: "-pkmlc0|b0ke00|1tzdw0|2dnc0|a7n3w0|9q000|7k85k0|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|asw00|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7xc80|ast80|7x6o0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Paramaribo", title: "Paramaribo", winIndex: 64, offsets: [-3.6777777777777776, -3.6811111111111114, -3.6766666666666667, -3.5, -3], offsetIndices: "012334", untils: "-usj4g8|cixc0c|5lydbk|fq7bic|4mkao0|Infinity" }, { id: "America/Phoenix", title: "Phoenix", winIndex: 56, offsets: [-7, -6], offsetIndices: "01010101010", untils: "-r0epo0|ast80|7x9g0|ast80|bmtus0|zjedo|4olg0|9et80|bs6lmc|9cyk0|Infinity" }, { id: "America/Port_of_Spain", title: "Port of Spain", winIndex: 16, offsets: [-4.101111111111111, -4], offsetIndices: "01", untils: "-u6m79w|Infinity" }, { id: "America/Port-au-Prince", title: "Port-au-Prince", winIndex: 14, offsets: [-4.816666666666666, -5, -4], offsetIndices: "01212121212121212121212121212121212121212121", untils: "-rmk9ac|ylcf6c|8zzw0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8aaw0|asw00|7x6o0|asw00|7x6o0|asw00|8a5c0|afxc0|8a5c0|afxc0|8a5c0|asw00|7x6o0|asw00|7x6o0|asw00|8a5c0|afxc0|8a5c0|afxc0|3vpjw0|ast80|7x9g0|ast80|2stv00|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Porto_Velho", title: "Porto Velho", winIndex: 16, offsets: [-4.26, -4, -3], offsetIndices: "012121212121212121212121212121", untils: "-t85g60|99k8i0|9a9c0|9io40|99980|8p65g0|6zuo0|bs2o0|67zw0|cjxg0|69uk0|cjxg0|4ml80|5mf440|49mk0|haas0|316k0|cls40|4ml80|cls40|66580|cls40|67zw0|981s40|6u7w0|biw40|5rbw0|d0lg0|5ed80|Infinity" }, { id: "America/Puerto_Rico", title: "Puerto Rico", winIndex: 16, offsets: [-4, -3], offsetIndices: "0110", untils: "-efsnk0|1ppu40|2dnc0|Infinity" }, { id: "America/Rainy_River", title: "Rainy River", winIndex: 13, offsets: [-6, -5], offsetIndices: "010111010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010", untils: "-qzov40|a2vw0|bfxjw0|pmdk0|1tz8c0|2dsw0|ewvus0|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Rankin_Inlet", title: "Rankin Inlet", winIndex: 13, offsets: [0, -6, -4, -5], offsetIndices: "012131313131313131313131313131313131313131313331313131313131313131313131313131313131313131313131313131313131313131313131", untils: "-6s8lc0|4c6oo0|9q000|7k85k0|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Recife", title: "Recife", winIndex: 64, offsets: [-2.3266666666666667, -3, -2], offsetIndices: "0121212121212121212121212121212121212121", untils: "-t85ljc|99kb3c|9a9c0|9io40|99980|8p65g0|6zuo0|bs2o0|67zw0|cjxg0|69uk0|cjxg0|4ml80|5mf440|49mk0|haas0|316k0|cls40|4ml80|cls40|66580|cls40|67zw0|981s40|6u7w0|biw40|5rbw0|d0lg0|5ed80|cyqs0|5ed80|dbpg0|64ak0|514g40|7k580|biw40|cvw0|iq5g0|6h980|Infinity" }, { id: "America/Regina", title: "Regina", winIndex: 37, offsets: [-6.9766666666666675, -7, -6], offsetIndices: "012121212121212121212121221212121212121212121212121212", untils: "-xkq9yc|6l1hmc|a2vw0|60enw0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7k580|b5xg0|7x3w0|1b6840|9cyk0|9d440|8zzw0|9q2s0|9cyk0|9q2s0|9cyk0|9d440|9cyk0|66gc0|1tz5k0|2dvo0|a31g0|9cyk0|a31g0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7k580|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7x3w0|asys0|7x3w0|tj1g0|9cyk0|9d440|Infinity" }, { id: "America/Resolute", title: "Resolute", winIndex: 13, offsets: [0, -6, -4, -5], offsetIndices: "012131313131313131313131313131313131313131313331313131313331313131313131313131313131313131313131313131313131313131313131", untils: "-bnp9c0|97nco0|9q000|7k85k0|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Rio_Branco", title: "Rio Branco", winIndex: 10, offsets: [-4.52, -5, -4], offsetIndices: "01212121212121212121212121212121", untils: "-t85fg0|99kak0|9a9c0|9io40|99980|8p65g0|6zuo0|bs2o0|67zw0|cjxg0|69uk0|cjxg0|4ml80|5mf440|49mk0|haas0|316k0|cls40|4ml80|cls40|66580|cls40|67zw0|981s40|6u7w0|biw40|5rbw0|d0lg0|5ed80|amves0|2t2t80|Infinity" }, { id: "America/Santa_Isabel", title: "Santa Isabel", winIndex: 72, link: 325 }, { id: "America/Santarem", title: "Santarem", winIndex: 64, offsets: [-3.646666666666667, -4, -3], offsetIndices: "0121212121212121212121212121212", untils: "-t85hvc|99ka7c|9a9c0|9io40|99980|8p65g0|6zuo0|bs2o0|67zw0|cjxg0|69uk0|cjxg0|4ml80|5mf440|49mk0|haas0|316k0|cls40|4ml80|cls40|66580|cls40|67zw0|981s40|6u7w0|biw40|5rbw0|d0lg0|5ed80|amves0|Infinity" }, { id: "America/Santiago", title: "Santiago", winIndex: 39, offsets: [-4.712777777777777, -5, -4, -3], offsetIndices: "010202121212121212321232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323", untils: "-vauawq|3dlssq|157b7a|f4e0q|49hzba|aye0q|7ves0|awik0|7ves0|awik0|7ves0|awik0|7ves0|ayd80|7ves0|534ik0|351g0|229zw0|2gt80|awo40|2mg00|b73400|7k580|c8tg0|6h980|a31g0|7x3w0|asys0|7x3w0|b5xg0|7k580|ag040|8a2k0|b5xg0|7k580|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7k580|b5xg0|7k580|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7k580|b5xg0|7k580|b5xg0|9cyk0|9d440|7x3w0|asys0|7x3w0|b5xg0|7k580|9q2s0|8zzw0|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7k580|b5xg0|8n180|a31g0|7x3w0|a31g0|9px80|9q2s0|7x3w0|b5xg0|7k580|b5xg0|7k580|b5xg0|7k580|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7k580|b5xg0|8n180|a31g0|7x3w0|asys0|8zzw0|9q2s0|ast80|5eis0|cyl80|6hes0|c8nw0|6udg0|bvp80|6udg0|vonw0|4olg0|e1h80|4olg0|e1h80|4olg0|e1h80|4olg0|e1h80|4olg0|e1h80|51k40|e1h80|4olg0|e1h80|4olg0|e1h80|4olg0|e1h80|4olg0|e1h80|4olg0|e1h80|51k40|e1h80|4olg0|e1h80|4olg0|e1h80|4olg0|e1h80|4olg0|e1h80|51k40|e1h80|4olg0|e1h80|4olg0|e1h80|4olg0|e1h80|4olg0|e1h80|4olg0|Infinity" }, { id: "America/Santo_Domingo", title: "Santo Domingo", winIndex: 16, offsets: [-4.666666666666667, -5, -4, -4.5], offsetIndices: "01213131313131212", untils: "-j6hz1c|hiw29c|67zw0|1dy840|62ha0|cnle0|4h2m0|elyq0|47ta0|ei9e0|4bim0|eek20|4dda0|ecpe0|dkmtg0|1stc0|Infinity" }, { id: "America/Sao_Paulo", title: "Sao Paulo", winIndex: 35, offsets: [-3.1077777777777778, -3, -2], offsetIndices: "012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212", untils: "-t85jd8|99k8x8|9a9c0|9io40|99980|8p65g0|6zuo0|bs2o0|67zw0|cjxg0|69uk0|cjxg0|4ml80|5k02s0|6onw0|haas0|316k0|cls40|4ml80|cls40|66580|cls40|67zw0|981s40|6u7w0|biw40|5rbw0|d0lg0|5ed80|cyqs0|5ed80|dbpg0|64ak0|cyqs0|64ak0|cls40|5rbw0|dbpg0|51ek0|dbpg0|6h980|c8tg0|6h980|c8tg0|64ak0|c8tg0|6u7w0|bxpg0|7iak0|biw40|6u7w0|biw40|7k580|biw40|6u7w0|c8tg0|6h980|dbpg0|5ed80|cls40|64ak0|dfes0|5nmk0|c8tg0|6h980|dbpg0|5rbw0|bvus0|6h980|cls40|64ak0|cls40|6h980|c8tg0|6h980|c8tg0|6u7w0|c8tg0|64ak0|cls40|64ak0|cls40|6h980|c8tg0|6h980|c8tg0|6h980|c8tg0|6h980|cls40|64ak0|cls40|64ak0|cls40|6h980|c8tg0|6h980|c8tg0|6u7w0|bvus0|6h980|cls40|64ak0|cls40|6h980|c8tg0|6h980|c8tg0|6h980|c8tg0|6h980|cls40|64ak0|cls40|64ak0|cls40|64ak0|cls40|6h980|c8tg0|6u7w0|bvus0|6h980|cls40|64ak0|cls40|6h980|c8tg0|Infinity" }, { id: "America/Scoresbysund", title: "Scoresbysund", winIndex: 73, offsets: [-1.4644444444444444, -2, -1, 0], offsetIndices: "0121323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232", untils: "-rvurxk|x8ntpk|902o0|9cvs0|9cyk0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "America/Sitka", title: "Sitka", winIndex: 55, offsets: [-8, -7, -9], offsetIndices: "01101010101010101010101010101010122020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202", untils: "-ek1w80|1tz2s0|2dyg0|cawis0|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|3lpg0|f4d80|64g40|clmk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|1leo0|7rs80|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/St_Johns", title: "St Johns", winIndex: 38, offsets: [-3.5144444444444445, -2.5144444444444445, -3.5, -2.5, -1.5], offsetIndices: "01010101010101010101010101010101010102323232323232323323232323232323232323232323232323232323232323232323232323232323232323232323232323232324232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232", untils: "-ris3ck|8bx80|ar440|a2vw0|9tjs0|53980|dkys0|9cyk0|9d440|9cyk0|9q2s0|8zzw0|9q2s0|8zzw0|9q2s0|8zzw0|9q2s0|8zzw0|9q2s0|9cyk0|9d440|9cyk0|9q2s0|8zzw0|9q2s0|8zzw0|9q2s0|8zzw0|9q2s0|8zzw0|9q2s0|9cyk0|9q2s0|8zzw0|9q2s0|8zzw0|7tmw0|1wfuk|8zzw0|a3480|7k580|b5xg0|7k580|b5xg0|7k580|biw40|776k0|biw40|7k580|b5xg0|7k580|b5xg0|1pb260|2dly0|biw40|7k580|b5xg0|7k580|b5xg0|7k580|b5xg0|7k580|biw40|7k580|ag040|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a2lo|afuk0|8a840|asqg0|7xc80|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8tec|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Swift_Current", title: "Swift Current", winIndex: 37, offsets: [-7.188888888888888, -7, -6], offsetIndices: "012122121212121212121212", untils: "-xkq9d4|6l1h14|a2vw0|c5jxg0|1tz5k0|2dvo0|asys0|8n180|a31g0|7x3w0|asys0|7x3w0|asys0|7x3w0|3yles0|9cyk0|s36s0|9cyk0|9d440|7x3w0|b5xg0|7k580|5j4lg0|Infinity" }, { id: "America/Tegucigalpa", title: "Tegucigalpa", winIndex: 67, offsets: [-5.814444444444445, -6, -5], offsetIndices: "01212121", untils: "-pfzh6k|yho0ik|7k580|b5xg0|7k580|96x1g0|4qak0|Infinity" }, { id: "America/Thule", title: "Thule", winIndex: 36, offsets: [-4.585555555555556, -4, -3], offsetIndices: "012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-rvuj9g|12yzilg|9cyk0|9d440|9cyk0|9q2s0|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Thunder_Bay", title: "Thunder Bay", winIndex: 14, offsets: [-6, -5, -4], offsetIndices: "0122121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-vbavc0|gr8qs0|1tzb40|2dq40|ctmlg0|9cyk0|9d440|9px80|9d440|9cyk0|s36s0|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Tijuana", title: "Tijuana", winIndex: 11, offsets: [-7.801111111111111, -7, -8], offsetIndices: "012121211212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212", untils: "-p1u1s0|11jrw0|1sns00|1sgdc0|71s40|9cyk0|5iidg0|1q6700|4lfk0|190g40|eluk0|2r4r00|7x3w0|asys0|7x3w0|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|84qys0|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|77c40|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Toronto", title: "Toronto", winIndex: 14, offsets: [-5, -4], offsetIndices: "01010101010101010101010101010101010101010101011101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010", untils: "-qzoxw0|a2vw0|7yx60|aqzy0|9q8c0|7jzo0|bw0c0|6bp80|cedg0|6h980|c8tg0|6h980|bvus0|776k0|biw40|776k0|biw40|776k0|biw40|7k580|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7k580|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7k580|b5xg0|xjeo0|1tzb40|2dq40|asys0|7x3w0|ast80|7x3w0|asys0|7x3w0|asys0|b5rw0|7xf00|ast80|7x9g0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7x3w0|asys0|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Vancouver", title: "Vancouver", winIndex: 11, offsets: [-8, -7], offsetIndices: "0101101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010", untils: "-qzopk0|a2vw0|c5jxg0|1tz2s0|2dyg0|asys0|8n180|a31g0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7k580|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7k580|b5xg0|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Whitehorse", title: "Whitehorse", winIndex: 11, offsets: [-9, -8, -7], offsetIndices: "0101011020121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-qzoms0|a2vw0|asys0|882c0|bmiwc0|1tz000|2e180|a7n3w0|9q000|tiyo0|6qp440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Winnipeg", title: "Winnipeg", winIndex: 13, offsets: [-6, -5], offsetIndices: "010101011010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010", untils: "-s0s7c0|7k580|tj700|a2vw0|9ok840|6u7w0|2a5hg0|1tz8c0|2dsw0|biw40|7x3w0|a31g0|7x3w0|asys0|7x3w0|asys0|7x3w0|b7s40|7tek0|autg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|9cyk0|9d440|7x3w0|1cm2s0|7k580|1cm2s0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|902o0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|902o0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|8a5c0|afxc0|8a5c0|asw00|7x6o0|asw00|7x6o0|asw00|8a5c0|afxc0|8a5c0|afxc0|8a5c0|asw00|7x6o0|asw00|7x6o0|asw00|8a5c0|afxc0|8a5c0|afxc0|8a5c0|afxc0|8a5c0|asw00|7x6o0|asw00|7x6o0|asw00|8a5c0|afxc0|8a5c0|afxc0|8a5c0|asw00|7x6o0|asw00|7x6o0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Yakutat", title: "Yakutat", winIndex: 55, offsets: [-9, -8], offsetIndices: "01101010101010101010101010101010100101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010", untils: "-ek1tg0|1tz000|2e180|cawis0|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|3lpg0|f4d80|64g40|clmk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|1lbw0|7rs80|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "America/Yellowknife", title: "Yellowknife", winIndex: 15, offsets: [0, -7, -6, -5], offsetIndices: "012213121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-i9m2o0|3pk3o0|1tz5k0|2dvo0|a7n3w0|9q000|7k85k0|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "Antarctica/Casey", title: "Casey", winIndex: 33, offsets: [0, 8, 11], offsetIndices: "012121", untils: "-irxc0|lag4o0|73bo0|uz1o0|60l80|Infinity" }, { id: "Antarctica/Davis", title: "Davis", winIndex: 6, offsets: [0, 7, 5], offsetIndices: "01012121", untils: "-6rmdc0|42jdw0|27wgs0|l8uss0|7eqs0|unmk0|60qs0|Infinity" }, { id: "Antarctica/DumontDUrville", title: "DumontDUrville", winIndex: 50, offsets: [0, 10], offsetIndices: "0101", untils: "-c05eo0|2mks80|2i72g0|Infinity" }, { id: "Antarctica/Macquarie", title: "Macquarie", winIndex: 48, offsets: [10, 11, 0], offsetIndices: "0102010101010101010101010101010101010101010101010101010101010101010101010101010101010101011", untils: "-rsj4w0|8zzw0|11wqk0|f4kh40|a6p8g0|9d1c0|asw00|6uao0|bvs00|6uao0|bvs00|779c0|bvs00|64dc0|clpc0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6uao0|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|7x6o0|b5uo0|7k800|b5uo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|bvs00|7k800|bitc0|7k800|bitc0|779c0|bitc0|779c0|bitc0|7x6o0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|9d1c0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|902o0|7x6o0|asw00|a2yo0|902o0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|9d1c0|9d1c0|902o0|a2yo0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|Infinity" }, { id: "Antarctica/Mawson", title: "Mawson", winIndex: 17, offsets: [0, 6, 5], offsetIndices: "012", untils: "-8aelc0|t22y80|Infinity" }, { id: "Antarctica/Palmer", title: "Palmer", winIndex: 39, offsets: [0, -3, -4, -2], offsetIndices: "0121212121213121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-2lxhc0|31ho0|bqas0|71mk0|bqas0|8ovw0|9d440|9px80|9d440|9cyk0|9d440|28t6k0|51ek0|46b6s0|8c2s0|7x3w0|asys0|7x3w0|b5xg0|7k580|b5xg0|7k580|b5xg0|9cyk0|9d440|7x3w0|asys0|7x3w0|b5xg0|7k580|9q2s0|8zzw0|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7k580|b5xg0|8n180|a31g0|7x3w0|a31g0|9px80|9q2s0|7x3w0|b5xg0|7k580|b5xg0|7k580|b5xg0|7k580|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7k580|b5xg0|8n180|a31g0|7x3w0|asys0|8zzw0|9q2s0|ast80|5eis0|cyl80|6hes0|c8nw0|6udg0|bvp80|6udg0|vonw0|4olg0|e1h80|4olg0|e1h80|4olg0|e1h80|4olg0|e1h80|4olg0|e1h80|51k40|e1h80|4olg0|e1h80|4olg0|e1h80|4olg0|e1h80|4olg0|e1h80|4olg0|e1h80|51k40|e1h80|4olg0|e1h80|4olg0|e1h80|4olg0|e1h80|4olg0|e1h80|51k40|e1h80|4olg0|e1h80|4olg0|e1h80|4olg0|e1h80|4olg0|e1h80|4olg0|Infinity" }, { id: "Antarctica/Rothera", title: "Rothera", winIndex: 64, offsets: [0, -3], offsetIndices: "01", untils: "3lxs00|Infinity" }, { id: "Antarctica/Syowa", title: "Syowa", winIndex: 1, offsets: [0, 3], offsetIndices: "01", untils: "-6qsqo0|Infinity" }, { id: "Antarctica/Vostok", title: "Vostok", winIndex: 21, offsets: [0, 6], offsetIndices: "01", untils: "-6aaao0|Infinity" }, { id: "Asia/Almaty", title: "Almaty", winIndex: 21, offsets: [5.13, 5, 6, 7], offsetIndices: "012323232323232323232321232323232323232323232323232", untils: "-nu1a90|37a0d0|qi27w0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|iq5g0|5reo0|3ljw0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|Infinity" }, { id: "Asia/Amman", title: "Amman", winIndex: 74, offsets: [2.395555555555555, 2, 3], offsetIndices: "0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-kcrtbk|m566fk|60l80|awo40|7v980|awo40|7v980|ayis0|9gnw0|9b9g0|7v980|autg0|7v980|3e6840|9et80|9io40|9cyk0|9d440|9cyk0|9d440|9px80|ayis0|7rjw0|ag040|8a2k0|9zc40|8drw0|a31g0|8zzw0|9d440|9cyk0|9d440|8n180|ag040|8a5c0|afxc0|8n400|a2yo0|8n400|a2yo0|8n400|epmo0|4deo0|9o5c0|9ew00|9b6o0|9ew00|9d1c0|9d1c0|9d1c0|asw00|7x6o0|afxc0|8n400|9d1c0|9d1c0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|wel80|51k40|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|Infinity" }, { id: "Asia/Anadyr", title: "Anadyr", winIndex: 75, offsets: [11.83222222222222, 12, 13, 14, 11], offsetIndices: "01232212121212121212121141212121212121212121212121212121212121141", untils: "-nu1sv8|379zj8|qi27w0|9et80|9d440|9ew00|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d440|5reo0|3ljw0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5xg0|7k800|Infinity" }, { id: "Asia/Aqtau", title: "Aqtau", winIndex: 17, offsets: [3.351111111111111, 4, 5, 6], offsetIndices: "012323232323232323232123232312121212121212121212", untils: "-nu15b4|379y74|qrh3w0|iruk0|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|iq5g0|5reo0|3ljw0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d440|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|Infinity" }, { id: "Asia/Aqtobe", title: "Aqtobe", winIndex: 17, offsets: [3.811111111111111, 4, 5, 6], offsetIndices: "0123232323232323232321232323232323232323232323232", untils: "-nu16l4|379zh4|qi27w0|s6qk0|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|iq5g0|5reo0|3ljw0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|Infinity" }, { id: "Asia/Ashgabat", title: "Ashgabat", winIndex: 17, offsets: [3.8922222222222222, 4, 5, 6], offsetIndices: "012323232323232323232322112", untils: "-nu16t8|379zp8|qi27w0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d440|1fp40|4bpk0|Infinity" }, { id: "Asia/Baghdad", title: "Baghdad", winIndex: 76, offsets: [2.96, 3, 4], offsetIndices: "012121212121212121212121212121212121212121212121212121", untils: "-r50g80|xkn3w0|7v980|9b9g0|9gnw0|9eys0|9et80|9d440|9b9g0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9f1k0|9ew00|9ew00|9ew00|9d1c0|9ew00|9d1c0|9ew00|9d1c0|9ew00|9ew00|9ew00|9d1c0|9ew00|9d1c0|9ew00|9d1c0|9ew00|9ew00|9ew00|9d1c0|9ew00|9d1c0|9ew00|9d1c0|9ew00|9ew00|9ew00|9d1c0|9ew00|9d1c0|9ew00|9d1c0|9ew00|Infinity" }, { id: "Asia/Baku", title: "Baku", winIndex: 77, offsets: [3.3233333333333333, 3, 4, 5], offsetIndices: "01232323232323232323232221223232323232323232323232323232323232323232", untils: "-nu158c|h4tkwc|ckinw0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|7tbs0|1jsc0|9d1c0|9cq80|1twoo0|asw00|7x3w0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Asia/Bangkok", title: "Bangkok", winIndex: 6, offsets: [6.7011111111111115, 7], offsetIndices: "01", untils: "-pysda4|Infinity" }, { id: "Asia/Beirut", title: "Beirut", winIndex: 78, offsets: [2, 3], offsetIndices: "010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010", untils: "-pyzew0|aunw0|88dg0|9et80|8yas0|a2vw0|a31g0|7k580|hjqo40|7v980|awo40|7v980|awo40|7v980|ayis0|7v980|awo40|7v980|5lhs40|56yk0|awo40|7v980|awo40|7v980|awo40|7v980|ayis0|7v980|awo40|7v980|autg0|7v980|2wxus0|8n180|a4w40|8n180|a4w40|8n180|a4w40|8n180|bs5g0|71mk0|alk40|86d80|a4w40|8n180|a4w40|8n180|a6qs0|80t80|905g0|9cyk0|9d440|9cyk0|9d440|9cyk0|9q2s0|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|b5rw0|7kas0|b5rw0|7kas0|b5rw0|7x9g0|ast80|7x9g0|ast80|7x9g0|b5rw0|7kas0|b5rw0|7kas0|b5rw0|7kas0|b5rw0|7x9g0|ast80|7x9g0|ast80|7x9g0|b5rw0|7kas0|b5rw0|7kas0|b5rw0|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|b5rw0|7kas0|b5rw0|7kas0|b5rw0|7x9g0|ast80|7x9g0|ast80|7x9g0|b5rw0|7kas0|b5rw0|7kas0|b5rw0|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|b5rw0|7kas0|b5rw0|7kas0|b5rw0|7x9g0|ast80|7x9g0|ast80|7x9g0|b5rw0|7kas0|b5rw0|7kas0|b5rw0|7kas0|b5rw0|7x9g0|ast80|7x9g0|ast80|Infinity" }, { id: "Asia/Bishkek", title: "Bishkek", winIndex: 21, offsets: [4.973333333333333, 5, 6, 7], offsetIndices: "01232323232323232323232212121212121212121212121212122", untils: "-nu19tc|379zxc|qi27w0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|7vc00|bkl80|8n180|a31g0|8n180|a31g0|8n180|a31g0|8n180|a31g0|8zzw0|9db20|ast80|7x9g0|ast80|7x9g0|b5rw0|7kas0|b5rw0|7kas0|b5rw0|7x9g0|ast80|7x9g0|ast80|7x9g0|b5rw0|7kas0|73aa0|Infinity" }, { id: "Asia/Brunei", title: "Brunei", winIndex: 24, offsets: [7.661111111111111, 7.5, 8], offsetIndices: "012", untils: "-mvofy4|3khxs4|Infinity" }, { id: "Asia/Chita", title: "Chita", winIndex: 79, offsets: [7.564444444444445, 8, 9, 10], offsetIndices: "0123232323232323232323221232323232323232323232323232323232323232312", untils: "-q4cfog|5hkxgg|qi27w0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d440|5reo0|3ljw0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|1vbzw0|qnew0|Infinity" }, { id: "Asia/Choibalsan", title: "Choibalsan", winIndex: 25, offsets: [7.633333333333334, 7, 8, 10, 9], offsetIndices: "0123434343434343434343434343434343434343434343424242424242424242424242424242424242424242424242", untils: "-xmct7c|11sndrc|2qk2k0|9eqg0|9eys0|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9q2s0|9cyk0|9d440|9cyk0|9d440|9cyk0|1ckdo0|7x3w0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|s6qk0|3nc0c0|9ct00|9d9o0|9ct00|9d9o0|9pro0|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9pro0|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9pro0|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9pro0|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9ct00|Infinity" }, { id: "Asia/Colombo", title: "Colombo", winIndex: 80, offsets: [5.325555555555556, 5.5, 6, 6.5], offsetIndices: "01231321", untils: "-xehask|isle6k|cajy0|1mp2u0|qetjw0|7x5a0|4xvqq0|Infinity" }, { id: "Asia/Damascus", title: "Damascus", winIndex: 81, offsets: [2.42, 2, 3], offsetIndices: "01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-q3gk20|5k6q0|8n180|a31g0|8n180|a31g0|8n180|a31g0|8zzw0|k4hk40|7yyk0|awo40|7tek0|b0dg0|7v980|awo40|7tek0|alk40|887w0|awo40|7v980|ayis0|7v980|awo40|7v980|awo40|7v980|awo40|7v980|ayis0|7v980|awo40|7v980|awo40|7v980|awo40|7v980|ayis0|7v980|awo40|6bp80|cg840|6bp80|2eh1g0|8zzw0|9ts40|8zzw0|pvk40|c33w0|7cw40|cjrw0|6zxg0|btuk0|7rpg0|9gnw0|9d440|9cyk0|9et80|9et80|9rxg0|91uk0|92040|9et80|9o840|9et80|9d440|9et80|9eys0|9et80|9b9g0|9gnw0|99es0|9iik0|9d440|9et80|9eys0|9et80|9d440|9et80|9d440|9et80|9d440|9et80|9eys0|9et80|9d440|9et80|9d440|8y580|9q2s0|b5rw0|7x9g0|aunw0|7ig40|b5rw0|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|b5rw0|7kas0|b5rw0|7kas0|b5rw0|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|b5rw0|7kas0|b5rw0|7kas0|b5rw0|7x9g0|ast80|7x9g0|ast80|7x9g0|b5rw0|7kas0|b5rw0|7kas0|b5rw0|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|7x9g0|b5rw0|7kas0|b5rw0|7kas0|b5rw0|7x9g0|ast80|7x9g0|ast80|7x9g0|b5rw0|7kas0|b5rw0|Infinity" }, { id: "Asia/Dhaka", title: "Dhaka", winIndex: 20, offsets: [5.888888888888888, 6.5, 5.5, 6, 7], offsetIndices: "01213343", untils: "-eqtpow|bmgyw|5lxg0|4qknw0|a63o20|jyevw0|a1400|Infinity" }, { id: "Asia/Dili", title: "Dili", winIndex: 43, offsets: [8.372222222222222, 8, 9], offsetIndices: "012212", untils: "-u9s4l8|fqcu98|1vc2o0|fz3pc0|cpz440|Infinity" }, { id: "Asia/Dubai", title: "Dubai", winIndex: 7, offsets: [3.6866666666666665, 4], offsetIndices: "01", untils: "-q3gnko|Infinity" }, { id: "Asia/Dushanbe", title: "Dushanbe", winIndex: 17, offsets: [4.586666666666667, 5, 6, 7], offsetIndices: "0123232323232323232323221", untils: "-nu18qo|379yuo|qi27w0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|8c2s0|Infinity" }, { id: "Asia/Ho_Chi_Minh", title: "Ho Chi Minh", winIndex: 6, offsets: [7.111111111111112, 7.108333333333333, 7, 8, 9], offsetIndices: "0123423232", untils: "-x56934|2isioa|gj25iu|15ct80|8so00|tmtk0|4azjw0|2cmao0|8285c0|Infinity" }, { id: "Asia/Hong_Kong", title: "Hong Kong", winIndex: 19, offsets: [7.611666666666666, 8, 9], offsetIndices: "0121212121212121212121212121212121212121212121212121212121212121212121", untils: "-y0i2h6|j09kn6|9cyk0|4f2e0|1xyfw0|b6760|bkl80|6udg0|df980|6dpg0|9cyk0|7x9g0|ast80|7x9g0|ast80|7x9g0|ast80|8a840|adzw0|8c2s0|ast80|77c40|biqk0|77c40|bvp80|6udg0|bvp80|77c40|biqk0|77c40|biqk0|77c40|biqk0|77c40|bvp80|6udg0|bvp80|6udg0|bvp80|77c40|biqk0|77c40|biqk0|8n6s0|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|3lpg0|f4d80|9d440|9cyk0|9d440|9cyk0|1c9440|8a2k0|Infinity" }, { id: "Asia/Hovd", title: "Hovd", winIndex: 6, offsets: [6.11, 6, 7, 8], offsetIndices: "012323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232", untils: "-xmcoz0|11sncb0|2qk2k0|9et80|9eys0|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9q2s0|9cyk0|9d440|9cyk0|9d440|9cyk0|1ckdo0|7x3w0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|4fio40|9ct00|9d9o0|9ct00|9d9o0|9pro0|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9pro0|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9pro0|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9pro0|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9ct00|Infinity" }, { id: "Asia/Irkutsk", title: "Irkutsk", winIndex: 82, offsets: [6.951388888888888, 7, 8, 9], offsetIndices: "012323232323232323232322123232323232323232323232323232323232323232", untils: "-q28gn5|5fh175|qi27w0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d440|5reo0|3ljw0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|1vbzw0|Infinity" }, { id: "Asia/Jakarta", title: "Jakarta", winIndex: 6, offsets: [7.12, 7.333333333333333, 7.5, 9, 8, 7], offsetIndices: "01232425", untils: "-o0bdpc|4lzxc0|4wdzjc|1tu960|1cx860|11jta0|74uc20|Infinity" }, { id: "Asia/Jayapura", title: "Jayapura", winIndex: 43, offsets: [9.379999999999999, 9, 9.5], offsetIndices: "0121", untils: "-jebm20|66bqe0|a37vy0|Infinity" }, { id: "Asia/Jerusalem", title: "Jerusalem", winIndex: 23, offsets: [2.344444444444444, 2, 3, 4], offsetIndices: "01212121212132121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-r50eig|bp54yg|19f3w0|7rv00|b02c0|7tk40|b07w0|8jhg0|a8lg0|8jhg0|a8ac0|t9s40|56vs0|35700|9b3w0|9gtg0|8jbw0|7tmw0|a6ig0|biyw0|8a5c0|9d1c0|902o0|7x6o0|e1eg0|4ofw0|dzxo0|4q500|doo40|64iw0|auqo0|7i500|8rfms0|51ek0|9q2s0|6u7w0|50rhg0|7x3w0|cls40|5rbw0|bbhg0|7rjw0|asys0|7k580|c8tg0|6h980|ag040|7x3w0|asys0|8a2k0|asys0|8a2k0|ap9g0|80t80|ap9g0|7nuk0|b2840|80t80|9zc40|9iik0|9kis0|93p80|9mdg0|8qqk0|apf00|7x3w0|biw40|8zx40|9io40|8n180|9kis0|9vh80|8ulg0|9px80|9mdg0|8n180|9tuw0|9tmk0|8wg40|9gnw0|99es0|8qqk0|9zc40|9tmk0|8wg40|9gnw0|99es0|8qqk0|acas0|9gnw0|99es0|93p80|9mdg0|awik0|7tk40|awik0|7tk40|awik0|7tk40|b9h80|7glg0|b9h80|7glg0|b9h80|7tk40|awik0|7tk40|awik0|7tk40|b9h80|7glg0|b9h80|7glg0|b9h80|7tk40|awik0|7tk40|awik0|7tk40|awik0|7tk40|b9h80|7glg0|b9h80|7glg0|b9h80|7tk40|awik0|7tk40|awik0|7tk40|b9h80|7glg0|b9h80|7glg0|b9h80|7glg0|b9h80|7tk40|awik0|7tk40|awik0|Infinity" }, { id: "Asia/Kabul", title: "Kabul", winIndex: 83, offsets: [4, 4.5], offsetIndices: "01", untils: "-d1pkg0|Infinity" }, { id: "Asia/Kamchatka", title: "Kamchatka", winIndex: 75, offsets: [10.576666666666666, 11, 12, 13], offsetIndices: "01232323232323232323232212323232323232323232323232323232323232212", untils: "-olrupo|3z045o|qi27w0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d440|5reo0|3ljw0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5xg0|7k800|Infinity" }, { id: "Asia/Karachi", title: "Karachi", winIndex: 84, offsets: [4.47, 5.5, 6.5, 5, 6], offsetIndices: "012133434343", untils: "-wvpb30|im3zt0|1mn180|33xpg0|a63o20|g72qo0|9cyk0|2y85g0|7v980|8hms0|aaak0|Infinity" }, { id: "Asia/Kathmandu", title: "Kathmandu", winIndex: 22, offsets: [5.687777777777778, 5.5, 5.75], offsetIndices: "012", untils: "-q3gt4s|yg2lus|Infinity" }, { id: "Asia/Khandyga", title: "Khandyga", winIndex: 79, offsets: [9.036944444444446, 8, 9, 10, 11], offsetIndices: "01232323232323232323232212323232323232323232323232343434343434343432", untils: "-q4cjrp|5hl1jp|qi27w0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d440|5reo0|3ljw0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|3fx40|4h6s0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|8ql00|1mlho0|Infinity" }, { id: "Asia/Kolkata", title: "Kolkata", winIndex: 18, offsets: [5.888888888888888, 6.5, 5.5], offsetIndices: "01212", untils: "-eqtpow|bmgyw|5lxg0|1mn180|Infinity" }, { id: "Asia/Krasnoyarsk", title: "Krasnoyarsk", winIndex: 85, offsets: [6.190555555555556, 6, 7, 8], offsetIndices: "012323232323232323232322123232323232323232323232323232323232323232", untils: "-q37l72|5gg8j2|qi27w0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d440|5reo0|3ljw0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|1vbzw0|Infinity" }, { id: "Asia/Kuala_Lumpur", title: "Kuala Lumpur", winIndex: 24, offsets: [6.923611111111112, 7, 7.333333333333333, 7.5, 9, 8], offsetIndices: "01223435", untils: "-xphpwd|eeb94d|1kbr2o|2yhc00|8n3jc|1v2p60|iy3o60|Infinity" }, { id: "Asia/Kuching", title: "Kuching", winIndex: 24, offsets: [7.355555555555555, 7.5, 8, 8.333333333333334, 9], offsetIndices: "01232323232323232422", untils: "-mvof3k|3khwxk|1epvy0|4ohqo|e5a9c|4ohqo|e3flc|4ohqo|e3flc|4ohqo|e3flc|4ohqo|e5a9c|4ohqo|e3flc|4ohqo|3ajlc|1v2qk0|iy3ms0|Infinity" }, { id: "Asia/Macau", title: "Macau", winIndex: 19, offsets: [7.572222222222222, 8, 9], offsetIndices: "0121212121212121212121212121212121212121211", untils: "-u9s2d8|pon9v8|bvp80|6udg0|bvp80|6u3q0|bvyy0|77c40|biqk0|772e0|biqk0|8ngi0|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9cue0|9cyk0|9d440|9px80|9d440|9d8a0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9cue0|9cyk0|9d440|9px80|9d440|9cyk0|a04w40|Infinity" }, { id: "Asia/Magadan", title: "Magadan", winIndex: 75, offsets: [10.053333333333335, 10, 11, 12], offsetIndices: "0123232323232323232323221232323232323232323232323232323232323232312", untils: "-nu1nxc|37a05c|qi27w0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d440|5reo0|3ljw0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|1vbzw0|s39k0|Infinity" }, { id: "Asia/Makassar", title: "Makassar", winIndex: 24, offsets: [7.96, 8, 9], offsetIndices: "00121", untils: "-q3gzg0|6p5hc0|4u87w0|1w02k0|Infinity" }, { id: "Asia/Manila", title: "Manila", winIndex: 24, offsets: [8, 9], offsetIndices: "010101010", untils: "-hb5y80|4qak0|2qidg0|1b2d80|4xf440|442k0|cdqdg0|9et80|Infinity" }, { id: "Asia/Nicosia", title: "Nicosia", winIndex: 4, offsets: [2.2244444444444444, 2, 3], offsetIndices: "01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-p4bq6g|rvhxyg|9cyk0|b42s0|7nuk0|8yas0|8zzw0|9q2s0|9et80|9b9g0|9cyk0|9q2s0|8zzw0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9q2s0|9cyk0|9d440|9cyk0|9d440|at4c0|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Asia/Novokuznetsk", title: "Novokuznetsk", winIndex: 86, offsets: [5.8133333333333335, 6, 7, 8], offsetIndices: "012323232323232323232322123232323232323232323232323232323232322122", untils: "-nu36tc|37bu5c|qi27w0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d440|5reo0|3ljw0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5xg0|7k800|1vbzw0|Infinity" }, { id: "Asia/Novosibirsk", title: "Novosibirsk", winIndex: 86, offsets: [5.527777777777778, 6, 7, 8], offsetIndices: "0123232323232323232323221232321212121212121212121212121212121212121", untils: "-q4do0s|5hmbcs|qi27w0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d440|5reo0|3ljw0|9d1c0|9d1c0|2vh00|6hn40|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|1vbzw0|Infinity" }, { id: "Asia/Omsk", title: "Omsk", winIndex: 86, offsets: [4.891666666666667, 5, 6, 7], offsetIndices: "012323232323232323232322123232323232323232323232323232323232323232", untils: "-q5xmx6|5j6d16|qi27w0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d440|5reo0|3ljw0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|1vbzw0|Infinity" }, { id: "Asia/Oral", title: "Oral", winIndex: 17, offsets: [3.4233333333333333, 4, 5, 6], offsetIndices: "01232323232323232121212121212121212121212121212", untils: "-nu15ic|379yec|qi27w0|s6qk0|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|iq5g0|9d1c0|9q000|9d1c0|9d1c0|5reo0|cyo00|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|Infinity" }, { id: "Asia/Pontianak", title: "Pontianak", winIndex: 6, offsets: [7.288888888888889, 7.5, 9, 8, 7], offsetIndices: "001213134", untils: "-w6piww|cse2o0|4tnu2w|1wkei0|1cx860|11jta0|74uc20|cixam0|Infinity" }, { id: "Asia/Pyongyang", title: "Pyongyang", winIndex: 53, offsets: [8.383333333333333, 8.5, 9], offsetIndices: "012221", untils: "-w895yc|1yh10c|dfsmm0|44cqo0|10ipmo0|Infinity" }, { id: "Asia/Qatar", title: "Qatar", winIndex: 5, offsets: [3.4355555555555553, 4, 3], offsetIndices: "012", untils: "-q3gmvk|rctnrk|Infinity" }, { id: "Asia/Qyzylorda", title: "Qyzylorda", winIndex: 21, offsets: [4.364444444444445, 4, 5, 6], offsetIndices: "0123232323232323232323232323232323232323232323", untils: "-nu184g|37a10g|qi27w0|s6qk0|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|ohhc0|cyo00|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|Infinity" }, { id: "Asia/Rangoon", title: "Rangoon", winIndex: 87, offsets: [6.411111111111111, 6.5, 9], offsetIndices: "0121", untils: "-q3gv54|bnjp34|1kh520|Infinity" }, { id: "Asia/Riyadh", title: "Riyadh", winIndex: 5, offsets: [3.1144444444444446, 3], offsetIndices: "01", untils: "-bwgbbg|Infinity" }, { id: "Asia/Sakhalin", title: "Sakhalin", winIndex: 88, offsets: [9.513333333333332, 9, 11, 12, 10], offsetIndices: "01123232323232323232323224232323232322424242424242424242424242424242", untils: "-xl87rc|gr8pfc|44elc0|ikvh40|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d440|5reo0|3ljw0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asys0|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|1vbzw0|qnc40|Infinity" }, { id: "Asia/Samarkand", title: "Samarkand", winIndex: 17, offsets: [4.464722222222222, 4, 5, 6], offsetIndices: "01233323232323232323232332", untils: "-nu18eh|37a1ah|qi27w0|9et80|9d1c0|9ew00|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|7wyc0|1g300|Infinity" }, { id: "Asia/Seoul", title: "Seoul", winIndex: 53, offsets: [8.464444444444444, 8.5, 9, 9.5, 10], offsetIndices: "01222131313131313124242", untils: "-w8966g|1yh18g|dfsmm0|454io0|4gadc0|l3aq0|6j3w0|d2g40|6u7w0|b5xg0|776k0|biw40|776k0|biw40|776k0|biw40|776k0|grs40|dfqxi0|7x6o0|asw00|7x6o0|Infinity" }, { id: "Asia/Shanghai", title: "Shanghai", winIndex: 19, offsets: [8, 9], offsetIndices: "01010101010101010", untils: "-ffs0w0|66580|8jhg0|a8fw0|n9rc40|6u7w0|asys0|7x3w0|asys0|7x3w0|b5xg0|7x3w0|asys0|7x3w0|asys0|7x3w0|Infinity" }, { id: "Asia/Singapore", title: "Singapore", winIndex: 24, offsets: [6.923611111111112, 7, 7.333333333333333, 7.5, 9, 8], offsetIndices: "012234335", untils: "-xphpwd|eeb94d|1kbr2o|2yhc00|8n3jc|1v2p60|ae0xi0|8k2qo0|Infinity" }, { id: "Asia/Srednekolymsk", title: "Srednekolymsk", winIndex: 75, offsets: [10.247777777777777, 10, 11, 12], offsetIndices: "012323232323232323232322123232323232323232323232323232323232323232", untils: "-nu1ogs|37a0os|qi27w0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d440|5reo0|3ljw0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|1vbzw0|Infinity" }, { id: "Asia/Taipei", title: "Taipei", winIndex: 52, offsets: [8, 9], offsetIndices: "01010101010101010101010101010101010101010", untils: "-gtzfk0|45slc0|c51c0|75bw0|a31g0|aaak0|9d440|7v980|awo40|7v980|awo40|7v980|awo40|7v980|7tk40|clmk0|7rpg0|b07w0|7rpg0|b07w0|7rpg0|9et80|9eys0|9et80|9d440|9et80|9d440|9et80|9d440|9et80|cjxg0|69uk0|ci2s0|69uk0|6its40|9et80|9d440|9et80|1yf9g0|4qak0|Infinity" }, { id: "Asia/Tashkent", title: "Tashkent", winIndex: 17, offsets: [4.619722222222222, 5, 6, 7], offsetIndices: "01232323232323232323232221", untils: "-nu18tz|379yxz|qi27w0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|7x140|1g300|Infinity" }, { id: "Asia/Tbilisi", title: "Tbilisi", winIndex: 89, offsets: [2.986388888888889, 3, 4, 5], offsetIndices: "0123232323232323232323222121212232323232323232323212", untils: "-nu14an|h4tjyn|ckinw0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|gig0|8wlo0|9cvs0|9cyk0|9d440|9cyk0|9d440|9cyk0|9d1c0|9cyk0|9q2s0|tivw0|7x9g0|ast80|7x9g0|b5rw0|7kas0|b5rw0|7kas0|b5rw0|7x9g0|ast80|7x9g0|ast80|7x9g0|4ofw0|6hn40|7k800|Infinity" }, { id: "Asia/Tehran", title: "Tehran", winIndex: 42, offsets: [3.428888888888889, 3.5, 4, 5, 4.5], offsetIndices: "00123214141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141", untils: "-s6m6uw|fnolc0|gm3h4w|777y0|b07w0|3pes0|42c20|9cyk0|9gtg0|9kd80|5ja5g0|7avw0|9d440|9gnw0|9b9g0|9gnw0|9b9g0|9gnw0|9b9g0|9gnw0|9b9g0|9gnw0|9d440|9gnw0|9b9g0|9gnw0|9b9g0|9gnw0|9b9g0|9gnw0|9d440|9gnw0|9b9g0|9gnw0|9b9g0|9gnw0|9b9g0|9gnw0|9d440|9gnw0|1av440|9gnw0|9d440|9gnw0|9b9g0|9gnw0|9b9g0|9gnw0|9b9g0|9gnw0|9d440|9gnw0|9b9g0|9gnw0|9b9g0|9gnw0|9b9g0|9gnw0|9d440|9gnw0|9b9g0|9gnw0|9b9g0|9gnw0|9b9g0|9gnw0|9d440|9gnw0|9b9g0|9gnw0|9b9g0|9gnw0|9b9g0|9gnw0|9d440|9gnw0|9b9g0|9gnw0|9b9g0|9gnw0|9b9g0|9gnw0|9b9g0|9gnw0|9d440|9gnw0|9b9g0|9gnw0|9b9g0|9gnw0|9b9g0|9gnw0|9d440|9gnw0|9b9g0|9gnw0|9b9g0|9gnw0|9b9g0|9gnw0|Infinity" }, { id: "Asia/Thimphu", title: "Thimphu", winIndex: 20, offsets: [5.9766666666666675, 5.5, 6], offsetIndices: "012", untils: "-bojclo|kxymno|Infinity" }, { id: "Asia/Tokyo", title: "Tokyo", winIndex: 43, offsets: [9, 10], offsetIndices: "0010101010", untils: "-gtzic0|5ivew0|6sd80|ahus0|887w0|cao40|6fek0|cao40|6fek0|Infinity" }, { id: "Asia/Ulaanbaatar", title: "Ulaanbaatar", winIndex: 25, offsets: [7.125555555555556, 7, 8, 9], offsetIndices: "012323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232", untils: "-xmcrsk|11sncck|2qk2k0|9et80|9eys0|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9q2s0|9cyk0|9d440|9cyk0|9d440|9cyk0|1ckdo0|7x3w0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|4fio40|9ct00|9d9o0|9ct00|9d9o0|9pro0|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9pro0|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9pro0|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9pro0|9d9o0|9ct00|9d9o0|9ct00|9d9o0|9ct00|Infinity" }, { id: "Asia/Urumqi", title: "Urumqi", winIndex: 21, offsets: [5.838888888888889, 6], offsetIndices: "01", untils: "-lx5pjw|Infinity" }, { id: "Asia/Ust-Nera", title: "Ust-Nera", winIndex: 88, offsets: [9.548333333333334, 8, 9, 12, 11, 10], offsetIndices: "0123434343434343434343445434343434343434343434343434343434343434345", untils: "-q4cl6u|5hl2yu|qi27w0|9eno0|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d440|5reo0|3ljw0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|8ql00|1mlho0|Infinity" }, { id: "Asia/Vladivostok", title: "Vladivostok", winIndex: 88, offsets: [8.791944444444445, 9, 10, 11], offsetIndices: "012323232323232323232322123232323232323232323232323232323232323232", untils: "-oligf7|3yqvf7|qi27w0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d440|5reo0|3ljw0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|1vbzw0|Infinity" }, { id: "Asia/Yakutsk", title: "Yakutsk", winIndex: 79, offsets: [8.649444444444445, 8, 9, 10], offsetIndices: "012323232323232323232322123232323232323232323232323232323232323232", untils: "-q4cioy|5hl0gy|qi27w0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d440|5reo0|3ljw0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|1vbzw0|Infinity" }, { id: "Asia/Yekaterinburg", title: "Yekaterinburg", winIndex: 90, offsets: [4.0425, 3.751388888888889, 4, 5, 6], offsetIndices: "0123434343434343434343433234343434343434343434343434343434343434343", untils: "-rx5hw9|1kybx4|5pfyv5|qi27w0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d440|5reo0|3ljw0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|1vbzw0|Infinity" }, { id: "Asia/Yerevan", title: "Yerevan", winIndex: 91, offsets: [2.966666666666667, 3, 4, 5], offsetIndices: "0123232323232323232323222121212122323232323232323232323232323232", untils: "-nu148o|h4tjwo|ckinw0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|91rs0|bcc0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|sfzw0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|Infinity" }, { id: "Atlantic/Azores", title: "Azores", winIndex: 73, offsets: [-1.9088888888888889, -2, -1, 0], offsetIndices: "01212121212121212121212121212121212121212121232123212321232121212121212121212121212121212121212121232323232323232323232323232323233323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232", untils: "-u9rc14|2bug54|6zxg0|66580|bq800|73k00|bodc0|71pc0|bq800|73k00|bq800|71pc0|bq800|1b2g00|9b6o0|saio0|8n400|9q000|902o0|a2yo0|902o0|a2yo0|8n400|st1c0|8n400|9d1c0|9d1c0|sg2o0|9d1c0|902o0|9q000|a2yo0|8n400|9d1c0|9d1c0|902o0|9q000|a2yo0|b5uo0|51hc0|bitc0|9d1c0|9ew00|88ao0|25p80|5reo0|3lpg0|779c0|1sqk0|6uao0|38qs0|6uao0|25p80|6hc00|38qs0|6uao0|25p80|6hc00|38qs0|8a5c0|9d1c0|9d9o0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|s3400|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|5qbjo0|9d1c0|9q000|9d1c0|9d1c0|9d440|9cyk0|9d440|9d1c0|9d1c0|9d1c0|9d1c0|9d440|9cyk0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9cyk0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Atlantic/Bermuda", title: "Bermuda", winIndex: 36, offsets: [-4.321666666666667, -4, -3], offsetIndices: "0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-kvj2fu|n4pr3u|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "Atlantic/Canary", title: "Canary", winIndex: 26, offsets: [-1.0266666666666666, -1, 0, 1], offsetIndices: "01232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232", untils: "-oytbtc|ctvupc|hhq7s0|905g0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Atlantic/Cape_Verde", title: "Cape Verde", winIndex: 92, offsets: [-1.5677777777777777, -2, -1], offsetIndices: "01212", untils: "-wvoub8|im43v8|1mn180|fpqwc0|Infinity" }, { id: "Atlantic/Faroe", title: "Faroe", winIndex: 26, offsets: [-.45111111111111113, 0, 1], offsetIndices: "01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-wcehew|127keuw|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Atlantic/Madeira", title: "Madeira", winIndex: 26, offsets: [-1.1266666666666665, -1, 0, 1], offsetIndices: "01212121212121212121212121212121212121212121232123212321232121212121212121212121212121212121212121232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232", untils: "-u9re7c|2bufjc|6zxg0|66580|bq800|73k00|bodc0|71pc0|bq800|73k00|bq800|71pc0|bq800|1b2g00|9b6o0|saio0|8n400|9q000|902o0|a2yo0|902o0|a2yo0|8n400|st1c0|8n400|9d1c0|9d1c0|sg2o0|9d1c0|902o0|9q000|a2yo0|8n400|9d1c0|9d1c0|902o0|9q000|a2yo0|b5uo0|51hc0|bitc0|9d1c0|9ew00|88ao0|25p80|5reo0|3lpg0|779c0|1sqk0|6uao0|38qs0|6uao0|25p80|6hc00|38qs0|6uao0|25p80|6hc00|38qs0|8a5c0|9d1c0|9d9o0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|s3400|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|5qbjo0|9d1c0|9q000|9d1c0|9d1c0|9d440|9cyk0|9d440|9d1c0|9d1c0|9d1c0|9d1c0|9d440|9cyk0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Atlantic/Reykjavik", title: "Reykjavik", winIndex: 0, offsets: [-1.4666666666666666, -1, 0], offsetIndices: "012121212121212121212121212121212121212121212121212121212121212121212", untils: "-wcwx9c|4rpd9c|ci2s0|69uk0|du840|4xp80|du840|p7bw0|4w040|9bdzw0|9d6w0|64g40|cyl80|64dc0|clpc0|6hc00|bvs00|6uao0|bvs00|6uao0|bvs00|6uao0|c8qo0|6hc00|c8qo0|8a5c0|afxc0|8a5c0|afxc0|8a5c0|asw00|7x6o0|afxc0|8a5c0|asw00|8a5c0|afxc0|8a5c0|afxc0|8a5c0|afxc0|8a5c0|afxc0|8a5c0|asw00|8a5c0|afxc0|8a5c0|afxc0|8a5c0|afxc0|8a5c0|afxc0|8a5c0|afxc0|8a5c0|asw00|8a5c0|afxc0|8a5c0|afxc0|8a5c0|afxc0|8a5c0|afxc0|8a5c0|asw00|8a5c0|Infinity" }, { id: "Atlantic/South_Georgia", title: "South Georgia", winIndex: 34, offsets: [-2], offsetIndices: "0", untils: "Infinity" }, { id: "Atlantic/Stanley", title: "Stanley", winIndex: 64, offsets: [-3.856666666666667, -4, -3, -2], offsetIndices: "0121212121212123232212121212121212121212121212121212121212121212121212", untils: "-u63pac|dbvxqc|8zzw0|9q2s0|8zzw0|a31g0|8zzw0|9q2s0|8zzw0|9q2s0|8zzw0|9q2s0|4xp80|l1pus0|7k580|b5rw0|77c40|biqk0|77c40|b5uo0|7kas0|b5rw0|7kas0|b5rw0|7kas0|b5rw0|7kas0|biqk0|77c40|biqk0|7kas0|b5rw0|7kas0|b5rw0|7kas0|b5rw0|7kas0|b5rw0|7kas0|biqk0|7kas0|b5rw0|7kas0|b5rw0|7kas0|b5rw0|7kas0|b5rw0|7kas0|b5xg0|77c40|bvp80|6udg0|bvp80|77c40|biqk0|77c40|biqk0|77c40|biqk0|77c40|biqk0|77c40|bvp80|77c40|biqk0|77c40|biqk0|77c40|Infinity" }, { id: "Australia/Adelaide", title: "Adelaide", winIndex: 31, offsets: [9.5, 10.5], offsetIndices: "0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101", untils: "-rnsvoc|49s2c|cxfms0|4h180|9d440|9cyk0|9q2s0|8zzw0|eeiqs0|64dc0|clpc0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6uao0|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6uao0|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|779c0|b5uo0|7k800|bitc0|7k800|bitc0|779c0|bitc0|779c0|bitc0|6hc00|c8qo0|7k800|b5uo0|6uao0|c8qo0|779c0|bitc0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7x6o0|asw00|7k800|b5uo0|8a5c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|Infinity" }, { id: "Australia/Brisbane", title: "Brisbane", winIndex: 30, offsets: [10, 11], offsetIndices: "01010101010101010", untils: "-rnsx2c|49s2c|cxfms0|4h180|9d440|9cyk0|9q2s0|8zzw0|eeiqs0|64dc0|97zuo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|Infinity" }, { id: "Australia/Broken_Hill", title: "Broken Hill", winIndex: 31, offsets: [9.5, 10.5], offsetIndices: "0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101", untils: "-rnsvoc|49s2c|cxfms0|4h180|9d440|9cyk0|9q2s0|8zzw0|eeiqs0|64dc0|clpc0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6uao0|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|8a5c0|asw00|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|779c0|b5uo0|7k800|bitc0|7k800|bitc0|779c0|bitc0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6uao0|c8qo0|6hc00|c8qo0|6hc00|c8qo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7x6o0|asw00|7k800|b5uo0|8a5c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|Infinity" }, { id: "Australia/Currie", title: "Currie", winIndex: 32, offsets: [10, 11], offsetIndices: "0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101", untils: "-rsj4w0|8zzw0|cxfms0|4h180|9d440|9cyk0|9q2s0|8zzw0|eeiqs0|64dc0|clpc0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6uao0|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|7x6o0|b5uo0|7k800|b5uo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|bvs00|7k800|bitc0|7k800|bitc0|779c0|bitc0|779c0|bitc0|7x6o0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|9d1c0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|902o0|7x6o0|asw00|a2yo0|902o0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|9d1c0|9d1c0|902o0|a2yo0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|Infinity" }, { id: "Australia/Darwin", title: "Darwin", winIndex: 29, offsets: [9.5, 10.5], offsetIndices: "010101010", untils: "-rnsvoc|49s2c|cxfms0|4h180|9d440|9cyk0|9q2s0|8zzw0|Infinity" }, { id: "Australia/Hobart", title: "Hobart", winIndex: 32, offsets: [10, 11], offsetIndices: "010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101", untils: "-rsj4w0|8zzw0|cxfms0|4h180|9d440|9cyk0|9q2s0|8zzw0|c9tms0|9d1c0|asw00|6uao0|bvs00|6uao0|bvs00|779c0|bvs00|64dc0|clpc0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6uao0|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|7x6o0|b5uo0|7k800|b5uo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|bvs00|7k800|bitc0|7k800|bitc0|779c0|bitc0|779c0|bitc0|7x6o0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|9d1c0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|902o0|7x6o0|asw00|a2yo0|902o0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|9d1c0|9d1c0|902o0|a2yo0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|Infinity" }, { id: "Australia/Lindeman", title: "Lindeman", winIndex: 30, offsets: [10, 11], offsetIndices: "010101010101010101010", untils: "-rnsx2c|49s2c|cxfms0|4h180|9d440|9cyk0|9q2s0|8zzw0|eeiqs0|64dc0|97zuo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6uao0|c8qo0|6hc00|Infinity" }, { id: "Australia/Melbourne", title: "Melbourne", winIndex: 28, offsets: [10, 11], offsetIndices: "0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101", untils: "-rnsx2c|49s2c|cxfms0|4h180|9d440|9cyk0|9q2s0|8zzw0|eeiqs0|64dc0|clpc0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6uao0|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6uao0|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|779c0|b5uo0|7k800|b5uo0|7x6o0|bitc0|779c0|bitc0|779c0|bitc0|6hc00|c8qo0|6hc00|c8qo0|6uao0|c8qo0|6hc00|c8qo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|7x6o0|asw00|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7x6o0|asw00|7k800|b5uo0|8a5c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|Infinity" }, { id: "Australia/Perth", title: "Perth", winIndex: 33, offsets: [8, 9], offsetIndices: "0101010101010101010", untils: "-rnsric|49s2c|cxfms0|4h180|9d440|9cyk0|ghf1g0|6hc00|4ir9c0|6hc00|40r400|5eg00|7p9hc0|5reo0|b5uo0|7x6o0|asw00|7x6o0|Infinity" }, { id: "Australia/Sydney", title: "Sydney", winIndex: 28, offsets: [10, 11], offsetIndices: "0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101", untils: "-rnsx2c|49s2c|cxfms0|4h180|9d440|9cyk0|9q2s0|8zzw0|eeiqs0|64dc0|clpc0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6uao0|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|8a5c0|asw00|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|779c0|b5uo0|7k800|bitc0|7k800|bitc0|779c0|bitc0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6uao0|c8qo0|6hc00|c8qo0|6hc00|c8qo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|7x6o0|asw00|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7x6o0|asw00|7k800|b5uo0|8a5c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|Infinity" }, { id: "CST6CDT", title: "CST6CDT", winIndex: 13, offsets: [-6, -5], offsetIndices: "010101101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010", untils: "-r0esg0|ast80|7x9g0|ast80|bmtus0|1tz8c0|2dsw0|b9gdg0|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|3lpg0|f4d80|64g40|clmk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "EST5EDT", title: "EST5EDT", winIndex: 14, offsets: [-5, -4], offsetIndices: "010101101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010", untils: "-r0ev80|ast80|7x9g0|ast80|bmtus0|1tzb40|2dq40|b9gdg0|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|3lpg0|f4d80|64g40|clmk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "Etc/GMT", title: "GMT", winIndex: 41, link: 150 }, { id: "Etc/GMT+1", title: "GMT+1", winIndex: 92, offsets: [-1], offsetIndices: "0", untils: "Infinity" }, { id: "Etc/GMT+10", title: "GMT+10", winIndex: 57, offsets: [-10], offsetIndices: "0", untils: "Infinity" }, { id: "Etc/GMT+11", title: "GMT+11", winIndex: 49, offsets: [-11], offsetIndices: "0", untils: "Infinity" }, { id: "Etc/GMT+12", title: "GMT+12", winIndex: 93, offsets: [-12], offsetIndices: "0", untils: "Infinity" }, { id: "Etc/GMT+2", title: "GMT+2", winIndex: 34, offsets: [-2], offsetIndices: "0", untils: "Infinity" }, { id: "Etc/GMT+3", title: "GMT+3", winIndex: 64, offsets: [-3], offsetIndices: "0", untils: "Infinity" }, { id: "Etc/GMT+4", title: "GMT+4", winIndex: 16, offsets: [-4], offsetIndices: "0", untils: "Infinity" }, { id: "Etc/GMT+5", title: "GMT+5", winIndex: 10, offsets: [-5], offsetIndices: "0", untils: "Infinity" }, { id: "Etc/GMT+6", title: "GMT+6", winIndex: 67, offsets: [-6], offsetIndices: "0", untils: "Infinity" }, { id: "Etc/GMT+7", title: "GMT+7", winIndex: 56, offsets: [-7], offsetIndices: "0", untils: "Infinity" }, { id: "Etc/GMT-1", title: "GMT-1", winIndex: 3, offsets: [1], offsetIndices: "0", untils: "Infinity" }, { id: "Etc/GMT-10", title: "GMT-10", winIndex: 50, offsets: [10], offsetIndices: "0", untils: "Infinity" }, { id: "Etc/GMT-11", title: "GMT-11", winIndex: 48, offsets: [11], offsetIndices: "0", untils: "Infinity" }, { id: "Etc/GMT-12", title: "GMT-12", winIndex: 44, offsets: [12], offsetIndices: "0", untils: "Infinity" }, { id: "Etc/GMT-13", title: "GMT-13", winIndex: 94, offsets: [13], offsetIndices: "0", untils: "Infinity" }, { id: "Etc/GMT-14", title: "GMT-14", winIndex: 95, offsets: [14], offsetIndices: "0", untils: "Infinity" }, { id: "Etc/GMT-2", title: "GMT-2", winIndex: 2, offsets: [2], offsetIndices: "0", untils: "Infinity" }, { id: "Etc/GMT-3", title: "GMT-3", winIndex: 1, offsets: [3], offsetIndices: "0", untils: "Infinity" }, { id: "Etc/GMT-4", title: "GMT-4", winIndex: 7, offsets: [4], offsetIndices: "0", untils: "Infinity" }, { id: "Etc/GMT-5", title: "GMT-5", winIndex: 17, offsets: [5], offsetIndices: "0", untils: "Infinity" }, { id: "Etc/GMT-6", title: "GMT-6", winIndex: 21, offsets: [6], offsetIndices: "0", untils: "Infinity" }, { id: "Etc/GMT-7", title: "GMT-7", winIndex: 6, offsets: [7], offsetIndices: "0", untils: "Infinity" }, { id: "Etc/GMT-8", title: "GMT-8", winIndex: 24, offsets: [8], offsetIndices: "0", untils: "Infinity" }, { id: "Etc/GMT-9", title: "GMT-9", winIndex: 43, offsets: [9], offsetIndices: "0", untils: "Infinity" }, { id: "Etc/UCT", title: "UCT", winIndex: 41, offsets: [0], offsetIndices: "0", untils: "Infinity" }, { id: "Etc/UTC", title: "UTC", winIndex: 41, offsets: [0], offsetIndices: "0", untils: "Infinity" }, { id: "Europe/Amsterdam", title: "Amsterdam", winIndex: 27, offsets: [.3255555555555556, 1.3255555555555556, 1.3333333333333333, .3333333333333333, 2, 1], offsetIndices: "010101010101010101010101010101010101010101012323234545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545", untils: "-s0dvkk|7v980|a51o0|7x6o0|a2yo0|9d1c0|9q000|902o0|9q000|902o0|9q000|902o0|9b6o0|a2yo0|c51c0|6l1c0|902o0|9q000|ci000|682o0|bgyo0|79400|bitc0|779c0|bmio0|7gio0|bbeo0|7eo00|bd9c0|7ctc0|bf400|7ayo0|bvs00|6uao0|bko00|7idc0|b9k00|7gio0|bbeo0|7eo00|bf400|7ayo0|btxc0|21uc0|4uaz8|bitc0|779c0|bko00|7idc0|bd3s0|1aarpc|7k800|9q000|9d1c0|9d1c0|9d1c0|8l9c0|ggp1c0|902o0|9q000|9d1c0|9d1c0|9d1c0|9q000|902o0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Andorra", title: "Andorra", winIndex: 27, offsets: [0, 1, 2], offsetIndices: "012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-c4xmo0|k3ctg0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Athens", title: "Athens", winIndex: 4, offsets: [1.581111111111111, 2, 3, 1], offsetIndices: "012121313121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-rvv0cg|8bjasg|2vmk0|4hiw40|16ik0|scog0|7lx40|9o2k0|9eys0|4atzw0|6djw0|bplus0|bq800|71uw0|9d1c0|902o0|91xc0|9o5c0|905g0|9qgo0|9akg0|9iik0|99980|9dcg0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Belgrade", title: "Belgrade", winIndex: 60, offsets: [1, 2], offsetIndices: "01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010", untils: "-ezayw0|swz00|7k800|9q000|9d1c0|9d1c0|b7pc0|6qlc0|jl1hc0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Berlin", title: "Berlin", winIndex: 27, offsets: [1, 2, 3], offsetIndices: "01010101010101210101210101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010", untils: "-s0e080|7ves0|a4yw0|7x6o0|asw00|7x6o0|b8qdc0|1cm000|7k800|9q000|9d1c0|9d1c0|9d1c0|2o7w0|6bs00|2txg0|7k800|91xc0|9b9g0|1sqk0|2inw0|51k40|a2yo0|8n400|9q000|902o0|fx91c0|902o0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Brussels", title: "Brussels", winIndex: 62, offsets: [0, 1, 2], offsetIndices: "0121212101010101010101010101010101010101010101010101212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-ss5uo0|rrx80|7vc00|a4yw0|7x6o0|asw00|7x6o0|2wh40|5omo0|b5uo0|6uao0|cyo00|7ayo0|bko00|7rmo0|a2yo0|a2yo0|8n400|902o0|9q000|9d1c0|9d1c0|a2yo0|8n400|9q000|902o0|a2yo0|90b00|a2yo0|8n400|9q000|902o0|a2yo0|8n400|9d1c0|9d1c0|902o0|a2yo0|9d1c0|9d1c0|902o0|9q000|a2yo0|8n400|9d1c0|9d1c0|902o0|9q000|a2yo0|b5uo0|51hc0|4deo0|1a36k0|7k800|9q000|9d1c0|8l9c0|a4tc0|8l9c0|clpc0|79400|fwu800|902o0|9q000|9d1c0|9d1c0|9d1c0|9q000|902o0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Bucharest", title: "Bucharest", winIndex: 4, offsets: [1.74, 2, 3], offsetIndices: "0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-k29zi0|fj8m0|6w5c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|kp0dc0|6h980|9q000|905g0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9cvs0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9cyk0|9d440|9cyk0|9q2s0|ast80|7xhs0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Budapest", title: "Budapest", winIndex: 60, offsets: [1, 2], offsetIndices: "0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010", untils: "-s0e080|7ves0|a4yw0|7x6o0|a31g0|8n180|autg0|bgvw0|b5jeg0|th9k0|7k800|9q000|9d1c0|9d1c0|awd00|9ew00|7q0c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9q000|902o0|a4tc0|9q000|1va2g0|6u7w0|bxpg0|6u7w0|cjxg0|64ak0|cluw0|64g40|br3ek0|905g0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Chisinau", title: "Chisinau", winIndex: 4, offsets: [1.9166666666666667, 1.74, 2, 3, 1, 4], offsetIndices: "012323232323232323232424235353535353535353535323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232", untils: "-r2p1bo|70f1to|fj8m0|6w5c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|geqo0|ha580|oc8g0|7k800|9q000|9d1c0|7cl00|j3pbw0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|25p80|7kdk0|9d1c0|9d1c0|9cvs0|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9q2s0|ast80|7xf00|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Copenhagen", title: "Copenhagen", winIndex: 62, offsets: [1, 2], offsetIndices: "0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010", untils: "-rzo2w0|75bw0|cbs2w0|1aco80|7k800|9q000|9d1c0|9d1c0|9d1c0|6y000|dbmo0|6bs00|clpc0|51hc0|e1k00|4oio0|giutc0|902o0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Dublin", title: "Dublin", winIndex: 26, offsets: [-.42250000000000004, .5775, 0, 1], offsetIndices: "01232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232", untils: "-rzcmlr|6uao0|9pytr|8c000|9o5c0|9ruo0|9b6o0|9ew00|9b6o0|auqo0|88ao0|9ew00|8y800|a2yo0|a2yo0|7k800|asw00|8a5c0|asw00|8n400|a2yo0|8n400|9q000|902o0|afxc0|8n400|a2yo0|8n400|9q000|902o0|a2yo0|8n400|a2yo0|8n400|9q000|9d1c0|a2yo0|8n400|9q000|902o0|a2yo0|8n400|a2yo0|8n400|9q000|902o0|a2yo0|b5uo0|51hc0|3g8580|8a840|bvp80|8n6s0|a2yo0|7x6o0|asw00|8n400|9q000|902o0|9q000|9d1c0|9q000|902o0|8n400|9q000|902o0|a2yo0|8n400|afxc0|8n400|9q000|902o0|a2yo0|8n400|a2yo0|8n400|9q000|902o0|902o0|b5uo0|7k800|b5uo0|7x6o0|asw00|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|bitc0|5reo0|1xhuo0|779c0|bitc0|779c0|bitc0|779c0|bitc0|779c0|bitc0|7k800|b5uo0|7k800|b5uo0|7k800|bitc0|779c0|bitc0|779c0|bitc0|7x3w0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|8a5c0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Gibraltar", title: "Gibraltar", winIndex: 27, offsets: [0, 1, 2], offsetIndices: "010101010101010101010101010101010101010101010101012121212121010121010101010101010101012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-rzcns0|6uao0|9q000|8c000|9o5c0|9ruo0|9b6o0|9ew00|9b6o0|auqo0|88ao0|9ew00|8y800|a2yo0|a2yo0|7k800|asw00|8a5c0|asw00|8n400|a2yo0|8n400|9q000|902o0|afxc0|8n400|a2yo0|8n400|9q000|902o0|a2yo0|8n400|a2yo0|8n400|9q000|9d1c0|a2yo0|8n400|9q000|902o0|a2yo0|8n400|a2yo0|8n400|9q000|902o0|a2yo0|b5uo0|51hc0|mbmk0|51hc0|c8qo0|6hc00|c8qo0|6uao0|bvs00|8n400|a4tc0|5clc0|4bms0|9q000|902o0|8a5c0|1frw0|64dc0|4bms0|6uao0|bvs00|7x6o0|asw00|8n400|9q000|902o0|9q000|9d1c0|9q000|902o0|8n400|9q000|902o0|a2yo0|8n400|afxc0|8n400|9q000|d0tp80|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Helsinki", title: "Helsinki", winIndex: 59, offsets: [1.6636111111111112, 2, 3], offsetIndices: "0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-peghyd|ax3tqd|9gqo0|k31s80|9d1c0|9d1c0|9d1c0|9d440|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Istanbul", title: "Istanbul", winIndex: 54, offsets: [1.948888888888889, 2, 3, 4], offsetIndices: "012121212121212121212121212121212121212121212121212121232323232322121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-ux9xew|2wvx6w|7v980|1tjc40|aunw0|88dg0|9et80|8yas0|a2vw0|tzpg0|79180|awo40|7v980|7p25g0|4zjw0|2xms0|f4d80|9vms0|b07w0|19f9g0|9px80|c5440|69uk0|acas0|8n180|a31g0|8n180|9q2s0|8zzw0|a8lg0|8ufw0|a31g0|8ovw0|5mbes0|4dbw0|u3es0|75bw0|2wxus0|7x3w0|asys0|7x3w0|b5xg0|7x3w0|c8w80|7x9g0|7k800|b6080|7jww0|ast80|b9ms0|7tek0|7x9g0|a2vw0|8n6s0|a2vw0|iruk0|8yj40|9rjk0|8lkg0|a4i80|8lkg0|a4i80|f2o40|38l80|t4840|8a5c0|9f4c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9cyk0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7kdk0|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7m2o0|b4000|7k800|b5uo0|7x6o0|asw00|7z1c0|ar1c0|7x6o0|bitc0|779c0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Kaliningrad", title: "Kaliningrad", winIndex: 96, offsets: [1, 2, 3, 4], offsetIndices: "0101010101010121232323232323232322121212121212121212121212121212121212121212121", untils: "-s0e080|7ves0|a4yw0|7x6o0|asw00|7x6o0|b8qdc0|1cm000|7k800|9q000|9d1c0|9d1c0|4od40|62fw0|9kd80|351g0|ie8nw0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d440|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|1vbzw0|Infinity" }, { id: "Europe/Kiev", title: "Kiev", winIndex: 59, offsets: [2.0344444444444445, 2, 3, 1, 4], offsetIndices: "0121313242424242424242424242121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-nu11ng|37a03g|5vd6k0|kzv40|7k800|9q000|1oyg0|jipzs0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|51ek0|neqw0|9cvs0|9cyk0|9d440|9cyk0|9d440|9cyk0|9dcg0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Lisbon", title: "Lisbon", winIndex: 26, offsets: [-.6125, 0, 1, 2], offsetIndices: "012121212121212121212121212121212121212121212321232123212321212121212121212121212121212121212121212121212121212121212121212121212122323232212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-u9rfmr|2bue6r|6zxg0|66580|bq800|73k00|bodc0|71pc0|bq800|73k00|bq800|71pc0|bq800|1b2g00|9b6o0|saio0|8n400|9q000|902o0|a2yo0|902o0|a2yo0|8n400|st1c0|8n400|9d1c0|9d1c0|sg2o0|9d1c0|902o0|9q000|a2yo0|8n400|9d1c0|9d1c0|902o0|9q000|a2yo0|b5uo0|51hc0|bitc0|9d1c0|9ew00|88ao0|25p80|5reo0|3lpg0|779c0|1sqk0|6uao0|38qs0|6uao0|25p80|6hc00|38qs0|6uao0|25p80|6hc00|38qs0|8a5c0|9d1c0|9d9o0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|s3400|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|5gyl40|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d440|9cyk0|9d440|9d1c0|9d1c0|9d1c0|9d1c0|9d440|9cyk0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/London", title: "London", winIndex: 26, offsets: [0, 1, 2], offsetIndices: "0101010101010101010101010101010101010101010101010121212121210101210101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010", untils: "-rzcns0|6uao0|9q000|8c000|9o5c0|9ruo0|9b6o0|9ew00|9b6o0|auqo0|88ao0|9ew00|8y800|a2yo0|a2yo0|7k800|asw00|8a5c0|asw00|8n400|a2yo0|8n400|9q000|902o0|afxc0|8n400|a2yo0|8n400|9q000|902o0|a2yo0|8n400|a2yo0|8n400|9q000|9d1c0|a2yo0|8n400|9q000|902o0|a2yo0|8n400|a2yo0|8n400|9q000|902o0|a2yo0|b5uo0|51hc0|mbmk0|51hc0|c8qo0|6hc00|c8qo0|6uao0|bvs00|8n400|a4tc0|5clc0|4bms0|9q000|902o0|8a5c0|1frw0|64dc0|4bms0|6uao0|bvs00|7x6o0|asw00|8n400|9q000|902o0|9q000|9d1c0|9q000|902o0|8n400|9q000|902o0|a2yo0|8n400|afxc0|8n400|9q000|902o0|a2yo0|8n400|a2yo0|8n400|9q000|902o0|902o0|b5uo0|7k800|b5uo0|7x6o0|asw00|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|bitc0|5reo0|1xhuo0|779c0|bitc0|779c0|bitc0|779c0|bitc0|779c0|bitc0|7k800|b5uo0|7k800|b5uo0|7k800|bitc0|779c0|bitc0|779c0|bitc0|7x3w0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|8a5c0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Luxembourg", title: "Luxembourg", winIndex: 27, offsets: [.41000000000000003, 1, 2, 0], offsetIndices: "0121212131313131313131313131313131313131313131313131212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-y89550|68l290|75hg0|ast80|796s0|at1k0|7x6o0|3lh40|4zmo0|b6300|6u2c0|cytk0|7at40|bktk0|7rh40|a31g0|a2vw0|8n9k0|8zx40|9q2s0|9et80|9b9g0|a2vw0|8n6s0|9px80|905g0|a2vw0|905g0|a2vw0|8ncc0|9q000|902o0|a2yo0|8n400|9d1c0|9d1c0|902o0|a2yo0|9d1c0|9d1c0|902o0|9q000|a2yo0|8n400|9d1c0|9d1c0|902o0|9q000|a2yo0|b5uo0|51hc0|42ao0|1aeak0|7k800|9q000|9d1c0|8n400|a2yo0|8l9c0|clpc0|79400|fwu800|902o0|9q000|9d1c0|9d1c0|9d1c0|9q000|902o0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Madrid", title: "Madrid", winIndex: 62, offsets: [0, 1, 2], offsetIndices: "01010101010101010101010121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-rhcqs0|7x6o0|9tpc0|8y800|9b6o0|9gqo0|2d2yo0|8so00|st1c0|8n400|9q000|902o0|a2yo0|902o0|a2yo0|8n400|3zb9c0|6uao0|8so00|9xeo0|a2yo0|902o0|8a5c0|13yt80|69xc0|bq800|8oyo0|a1400|95mo0|9kg00|8n6s0|a2vw0|8oyo0|1ck5c0|7tk40|ct07w0|905g0|a2vw0|8n6s0|8zzw0|9d440|9px80|905g0|9rrw0|9b9g0|9d6w0|9d1c0|9q000|902o0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Malta", title: "Malta", winIndex: 27, offsets: [1, 2], offsetIndices: "0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010", untils: "-ryotg0|66800|9d1c0|9d1c0|8a5c0|asw00|7k800|b5uo0|8n400|9d1c0|aau000|18r9k0|7k800|9q000|9d1c0|9d1c0|9d1c0|8j940|9f1k0|afxc0|89zs0|afxc0|7kdk0|b5uo0|979rs0|6h980|cls40|64ak0|cls40|64ak0|cyqs0|64ak0|cls40|64ak0|c8tg0|6hc00|clpc0|6h980|9b9g0|9d1c0|ahs00|7m2o0|b45k0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|asys0|7x3w0|a4w40|8y580|9q2s0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Minsk", title: "Minsk", winIndex: 96, offsets: [1.8333333333333333, 2, 3, 1, 4], offsetIndices: "012131312424242424242424242212121212121212121212121212121212121212122", untils: "-nu113c|379zjc|5r1mk0|pbf40|7k800|9q000|9d1c0|4oac0|j6dmk0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|sg2o0|9d440|9cvs0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|1vbx40|Infinity" }, { id: "Europe/Monaco", title: "Monaco", winIndex: 27, offsets: [.15583333333333332, 0, 1, 2], offsetIndices: "01212121212121212121212121212121212121212121212121232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232", untils: "-uozn3l|2qx1nl|5luo0|8y800|a4tc0|7vc00|auqo0|7idc0|b7pc0|6sg00|cyo00|7ayo0|bko00|7rmo0|a2yo0|bvs00|6uao0|902o0|9q000|9d1c0|9d1c0|a2yo0|8n400|9q000|902o0|a2yo0|902o0|a2yo0|8n400|9q000|902o0|a2yo0|8n400|9d1c0|9d1c0|902o0|a2yo0|9d1c0|9d1c0|902o0|9q000|a2yo0|8n400|9d1c0|9d1c0|902o0|9q000|a2yo0|b5uo0|51po0|mdbo0|7x3w0|7x9g0|c8w80|7k800|9q000|9d1c0|9nzs0|922w0|8l9c0|fxlx80|9cyk0|9q5k0|902o0|9q000|9d1c0|9d1c0|9d1c0|9q000|902o0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Moscow", title: "Moscow", winIndex: 58, offsets: [2.504722222222222, 2.5219444444444443, 3.5219444444444443, 4.521944444444444, 4, 3, 5, 2], offsetIndices: "012132345464575454545454545454545455754545454545454545454545454545454545454545", untils: "-rx5dmh|ipzua|97hc0|7yyk0|5i840|d9p80|1jpk0|2d2k7|s8o00|1qvw0|8fpc0|1jms0|is040|412as0|qi27w0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d440|5reo0|3ljw0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|1vbzw0|Infinity" }, { id: "Europe/Oslo", title: "Oslo", winIndex: 27, offsets: [1, 2], offsetIndices: "010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010", untils: "-rzayo0|6qfs0|cgcqo0|15tsc0|7k800|9q000|9d1c0|9d1c0|9d1c0|9d1c0|70q5c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|b5uo0|7k800|7law00|902o0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Paris", title: "Paris", winIndex: 62, offsets: [.15583333333333332, 0, 1, 2], offsetIndices: "0121212121212121212121212121212121212121212121212123232332323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232", untils: "-uozn1x|2qx1lx|5luo0|8y800|a4tc0|7vc00|auqo0|7idc0|b7pc0|6sg00|cyo00|7ayo0|bko00|7rmo0|a2yo0|bvs00|6uao0|902o0|9q000|9d1c0|9d1c0|a2yo0|8n400|9q000|902o0|a2yo0|902o0|a2yo0|8n400|9q000|902o0|a2yo0|8n400|9d1c0|9d1c0|902o0|a2yo0|9d1c0|9d1c0|902o0|9q000|a2yo0|8n400|9d1c0|9d1c0|902o0|9q000|a2yo0|b5uo0|51po0|5p8w0|18rcc0|7k800|9q000|9d1c0|7efo0|29k40|922w0|8l9c0|fxlx80|9cyk0|9q5k0|902o0|9q000|9d1c0|9d1c0|9d1c0|9q000|902o0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Prague", title: "Prague", winIndex: 60, offsets: [1, 2], offsetIndices: "010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010", untils: "-s0e080|7ves0|a4yw0|7x6o0|asw00|7x6o0|b8qdc0|1cm000|7k800|9q000|9d1c0|8l9c0|afxc0|bitc0|8oyo0|7vc00|a2yo0|8n400|a2yo0|8n400|9o5c0|91xc0|fe6000|9d1c0|9q000|902o0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Riga", title: "Riga", winIndex: 59, offsets: [1.6094444444444445, 2.6094444444444442, 2, 3, 1, 4], offsetIndices: "010102324242435353535353535353323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232", untils: "-qznlky|7x6o0|a4tc0|2mg00|3myns0|7fhlky|gz180|p5v40|7k800|9q000|9d1c0|9d1c0|k7s0|j14ns0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d440|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d440|asw00|7x6o0|asw00|7x6o0|b5uo0|qaao0|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Rome", title: "Rome", winIndex: 27, offsets: [1, 2], offsetIndices: "0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010", untils: "-ryotg0|66800|9d1c0|9d1c0|8a5c0|asw00|7k800|b5uo0|8n400|9d1c0|aau000|18r9k0|7k800|9q000|9d1c0|8l3s0|a4yw0|8j940|9f1k0|afxc0|89zs0|afxc0|7kdk0|b5uo0|979rs0|6h980|cls40|64ak0|cls40|64ak0|cyqs0|64ak0|cls40|64ak0|c8tg0|6hc00|clpc0|6h980|cls40|64ak0|c8tg0|6h980|cls40|64dc0|clpc0|64dc0|c8qo0|6hc00|clpc0|6hc00|c8qo0|6hc00|9q5k0|902o0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Samara", title: "Samara", winIndex: 58, offsets: [3.338888888888889, 3, 4, 5], offsetIndices: "012232323232323232322121112323232323232323232323232323232323232212", untils: "-qcx7pw|5q63dw|2egvw0|o3lc00|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d440|9d1c0|9q000|9d1c0|9d440|12w00|89zs0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5xg0|7k800|Infinity" }, { id: "Europe/Simferopol", title: "Simferopol", winIndex: 58, offsets: [2.2666666666666666, 2, 3, 1, 4], offsetIndices: "012131312424242424242424242121212424242212121212121212121212121212121212142", untils: "-nu12ao|37a0qo|5xiyk0|iu340|7k800|9q000|9d1c0|iac0|jajmk0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|eeio0|wrjw0|9cyk0|9d440|9cyk0|9d440|1sqk0|7k580|9d440|9cyk0|9q2s0|at4c0|7x9g0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x3w0|asqg0|Infinity" }, { id: "Europe/Sofia", title: "Sofia", winIndex: 59, offsets: [2, 1, 3], offsetIndices: "01010102020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020", untils: "-e6dzw0|7k800|9q000|9d1c0|9d1c0|9d440|hqq240|9eys0|9o2k0|92040|9o2k0|90880|9pug0|90b00|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9cvs0|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9q2s0|ast80|7xhs0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Stockholm", title: "Stockholm", winIndex: 27, offsets: [1, 2], offsetIndices: "01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010", untils: "-rzo2w0|75hg0|x5bew0|902o0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Tallinn", title: "Tallinn", winIndex: 59, offsets: [1.65, 1, 2, 3, 4], offsetIndices: "012102321212343434343434343433232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232", untils: "-r3exx0|3re10|7x6o0|et6g0|ygov0|a1zgd0|ktx80|l94g0|7k800|9q000|9d1c0|8uac0|j27mk0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d440|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asys0|7x6o0|b5uo0|19dc00|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Tirane", title: "Tirane", winIndex: 60, offsets: [1.3222222222222222, 1, 2], offsetIndices: "01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-t85vo8|dt2gw8|18pew0|7k800|m800|g7ot40|7rjw0|autg0|7x3w0|ayis0|7x3w0|b5xg0|7k580|b42s0|7lzw0|b42s0|7lzw0|b42s0|7x3w0|ahus0|7x3w0|b5xg0|7x3w0|a4w40|8jbw0|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Uzhgorod", title: "Uzhgorod", winIndex: 59, offsets: [1, 2, 3, 4], offsetIndices: "010101023232323232323232320121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-fizzw0|1cm000|7k800|9q000|9d1c0|al900|cnms0|int140|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|eeio0|e1sc0|iprk0|9cyk0|9d440|9cyk0|9d440|9cyk0|9dcg0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Vienna", title: "Vienna", winIndex: 27, offsets: [1, 2], offsetIndices: "0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010", untils: "-s0e080|7ves0|a4yw0|7x6o0|asw00|7x6o0|t6000|8a5c0|a7a800|1cm000|7k800|9q000|9d1c0|9d1c0|9d1c0|iio0|ivmo0|902o0|9d1c0|9d1c0|a2yo0|8n400|gfyyg0|8zzw0|9d9o0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Vilnius", title: "Vilnius", winIndex: 59, offsets: [1.4, 1.5933333333333333, 1, 2, 3, 4], offsetIndices: "012324323234545454545454545443434343434343434332334343434343434343434343434343434343434343434343434343434343434343434343", untils: "-rns980|1g224o|e75nc|4kqk0|acbs40|gpp40|pits0|7k800|9q000|9d1c0|65zo0|j4vx80|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d440|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x9g0|asw00|7x6o0|b5uo0|1s3eo0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Volgograd", title: "Volgograd", winIndex: 58, offsets: [2.961111111111111, 3, 4, 5], offsetIndices: "011223232323232323221212122121212121212121212121212121212121212121", untils: "-q3cw84|2qrjw4|2pu800|gdt980|a48yo0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d440|9d1c0|9d1c0|9d1c0|9q000|9d1c0|ipzw0|9d440|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|1vbzw0|Infinity" }, { id: "Europe/Warsaw", title: "Warsaw", winIndex: 51, offsets: [1.4, 1, 2, 3], offsetIndices: "012121223212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-se9yk0|dvyc0|7ves0|a4yw0|7x6o0|asw00|7x6o0|aunw0|7x6o0|1evbs0|9fcwc0|18cao0|7k800|9q000|9d1c0|9gnw0|an980|9kd80|8fs40|922w0|ar1c0|7x6o0|a2yo0|8n400|9q000|902o0|4013w0|64dc0|9d1c0|9d1c0|clpc0|6hc00|9d1c0|9d1c0|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|clpc0|64dc0|6j4tc0|902o0|9q000|9d1c0|9d1c0|9d1c0|9q000|902o0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d440|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Zaporozhye", title: "Zaporozhye", winIndex: 59, offsets: [2.3333333333333335, 2, 3, 1, 4], offsetIndices: "01213132424242424242424242422121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121", untils: "-nu12hc|37a0xc|5u1180|mc0g0|7k800|9q000|12qg0|jjc7s0|9et80|9d440|9et80|9d440|9et80|9eys0|9d6w0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9cvs0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9dcg0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Europe/Zurich", title: "Zurich", winIndex: 27, offsets: [1, 2], offsetIndices: "01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010", untils: "-eyh6o0|7x6o0|asw00|7x6o0|k2zus0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9d1c0|9q000|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|7x6o0|b5uo0|7k800|b5uo0|7k800|b5uo0|7k800|b5uo0|7x6o0|asw00|7x6o0|asw00|Infinity" }, { id: "Indian/Chagos", title: "Chagos", winIndex: 21, offsets: [4.827777777777778, 5, 6], offsetIndices: "012", untils: "-wvpc2s|1ag64us|Infinity" }, { id: "Indian/Christmas", title: "Christmas", winIndex: 6, offsets: [7], offsetIndices: "0", untils: "Infinity" }, { id: "Indian/Cocos", title: "Cocos", winIndex: 87, offsets: [6.5], offsetIndices: "0", untils: "Infinity" }, { id: "Indian/Kerguelen", title: "Kerguelen", winIndex: 17, offsets: [0, 5], offsetIndices: "01", untils: "-afrs00|Infinity" }, { id: "Indian/Mahe", title: "Mahe", winIndex: 97, offsets: [3.6966666666666668, 4], offsetIndices: "01", untils: "-x6pjlo|Infinity" }, { id: "Indian/Maldives", title: "Maldives", winIndex: 17, offsets: [4.9, 5], offsetIndices: "01", untils: "-57x6y0|Infinity" }, { id: "Indian/Mauritius", title: "Mauritius", winIndex: 97, offsets: [3.8333333333333335, 4, 5], offsetIndices: "012121", untils: "-wvp9bc|13jnu7c|8bx80|dd0wc0|7x3w0|Infinity" }, { id: "Indian/Reunion", title: "Reunion", winIndex: 97, offsets: [3.697777777777778, 4], offsetIndices: "01", untils: "-uks29s|Infinity" }, { id: "MST7MDT", title: "MST7MDT", winIndex: 15, offsets: [-7, -6], offsetIndices: "010101101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010", untils: "-r0epo0|ast80|7x9g0|ast80|bmtus0|1tz5k0|2dvo0|b9gdg0|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|3lpg0|f4d80|64g40|clmk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }, { id: "Pacific/Apia", title: "Apia", winIndex: 98, offsets: [-11.448888888888888, -11.5, -11, -10, 14, 13], offsetIndices: "01232345454545454545454545454545454545454545454545454545454", untils: "-usiiv4|kcrmt4|vp3la0|9odo0|902o0|4zbk0|4qog0|9d1c0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|9d1c0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|902o0|a2yo0|902o0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|9d1c0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|9d1c0|9q000|902o0|9q000|902o0|Infinity" }, { id: "Pacific/Auckland", title: "Auckland", winIndex: 8, offsets: [11.5, 12.5, 12, 13], offsetIndices: "01020202020202020202020202023232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323", untils: "-m01p20|64ak0|biw40|7x5a0|asxe0|7x5a0|asxe0|7x5a0|asxe0|8a3y0|afyq0|8a3y0|afyq0|afvy0|7x820|asum0|7x820|asum0|7x820|asum0|7x820|asum0|7x820|b5ta0|7k9e0|b5ta0|7x820|hsl2m0|5reo0|clpc0|6uao0|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6uao0|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6hc00|c8qo0|6uao0|c8qo0|6hc00|b5uo0|8a5c0|afxc0|8a5c0|afxc0|8a5c0|afxc0|8n400|a2yo0|8n400|a2yo0|8n400|a2yo0|8n400|afxc0|8a5c0|afxc0|8a5c0|afxc0|8n400|a2yo0|8n400|a2yo0|8n400|afxc0|8a5c0|afxc0|8a5c0|afxc0|8n400|a2yo0|8n400|a2yo0|8n400|a2yo0|8n400|a2yo0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|9d1c0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|9d1c0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|902o0|a2yo0|902o0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|9d1c0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|902o0|9q000|9d1c0|9q000|902o0|9q000|902o0|Infinity" }, { id: "Pacific/Chuuk", title: "Chuuk", winIndex: 50, offsets: [10], offsetIndices: "0", untils: "Infinity" }, { id: "Pacific/Efate", title: "Efate", winIndex: 48, offsets: [11.22111111111111, 11, 12], offsetIndices: "0121212121212121212121", untils: "-u964i4|11f4ba4|9cyk0|awo40|7tek0|9q2s0|8zzw0|9q2s0|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9q2s0|64ak0|e1ms0|4ofw0|Infinity" }, { id: "Pacific/Enderbury", title: "Enderbury", winIndex: 94, offsets: [-12, -11, 13], offsetIndices: "012", untils: "535io0|7ykl80|Infinity" }, { id: "Pacific/Fakaofo", title: "Fakaofo", winIndex: 94, offsets: [-11, 13], offsetIndices: "01", untils: "lx0jw0|Infinity" }, { id: "Pacific/Fiji", title: "Fiji", winIndex: 99, offsets: [11.928888888888888, 12, 13], offsetIndices: "0121212121212121212121212121212121212121212121212121212121212121", untils: "-sa2x4w|17bs00w|64dc0|cyo00|5reo0|53a5c0|64dc0|asw00|6uao0|bvs00|4oio0|e1k00|4oio0|eeio0|4bh80|erk40|3ylc0|erhc0|3ylc0|f4g00|3lmo0|f4g00|3ylc0|erhc0|3ylc0|erhc0|3ylc0|erhc0|3ylc0|f4g00|3lmo0|f4g00|3lmo0|f4g00|3ylc0|erhc0|3ylc0|erhc0|3ylc0|erhc0|3ylc0|f4g00|3lmo0|f4g00|3ylc0|erhc0|3ylc0|erhc0|3ylc0|erhc0|3ylc0|f4g00|3lmo0|f4g00|3lmo0|f4g00|3ylc0|erhc0|3ylc0|erhc0|3ylc0|erhc0|3ylc0|Infinity" }, { id: "Pacific/Funafuti", title: "Funafuti", winIndex: 44, offsets: [12], offsetIndices: "0", untils: "Infinity" }, { id: "Pacific/Galapagos", title: "Galapagos", winIndex: 67, offsets: [-5.973333333333333, -5, -6], offsetIndices: "012", untils: "-kcr62o|spdryo|Infinity" }, { id: "Pacific/Guadalcanal", title: "Guadalcanal", winIndex: 48, offsets: [10.663333333333332, 11], offsetIndices: "01", untils: "-tvowac|Infinity" }, { id: "Pacific/Guam", title: "Guam", winIndex: 50, offsets: [10], offsetIndices: "00", untils: "g5z2w0|Infinity" }, { id: "Pacific/Honolulu", title: "Honolulu", winIndex: 57, offsets: [-10.5, -9.5, -10], offsetIndices: "010102", untils: "-j50la0|13l00|4jvb00|1wd180|votg0|Infinity" }, { id: "Pacific/Kiritimati", title: "Kiritimati", winIndex: 95, offsets: [-10.666666666666666, -10, 14], offsetIndices: "012", untils: "535eyo|7ykm5c|Infinity" }, { id: "Pacific/Kosrae", title: "Kosrae", winIndex: 48, offsets: [11, 12], offsetIndices: "010", untils: "-4r7w0|f9l3w0|Infinity" }, { id: "Pacific/Kwajalein", title: "Kwajalein", winIndex: 44, offsets: [11, -12, 12], offsetIndices: "012", untils: "-4r7w0|cgtbw0|Infinity" }, { id: "Pacific/Majuro", title: "Majuro", winIndex: 44, offsets: [11, 12], offsetIndices: "01", untils: "-4r7w0|Infinity" }, { id: "Pacific/Midway", title: "Midway", winIndex: 49, link: 530 }, { id: "Pacific/Nauru", title: "Nauru", winIndex: 44, offsets: [11.127777777777776, 11.5, 9, 12], offsetIndices: "01213", untils: "-pjxiws|b1kxms|19h8a0|i43qe0|Infinity" }, { id: "Pacific/Niue", title: "Niue", winIndex: 49, offsets: [-11.333333333333334, -11.5, -11], offsetIndices: "012", untils: "-9wyz6o|ehcj4o|Infinity" }, { id: "Pacific/Noumea", title: "Noumea", winIndex: 48, offsets: [11.096666666666666, 11, 12], offsetIndices: "01212121", untils: "-u9645o|ye0ixo|4dbw0|ecqs0|4f6k0|99p700|4oio0|Infinity" }, { id: "Pacific/Pago_Pago", title: "Pago Pago", winIndex: 49, offsets: [-11.379999999999999, -11], offsetIndices: "0111", untils: "-usij20|tcsey0|8p4800|Infinity" }, { id: "Pacific/Palau", title: "Palau", winIndex: 43, offsets: [9], offsetIndices: "0", untils: "Infinity" }, { id: "Pacific/Pohnpei", title: "Pohnpei", winIndex: 48, offsets: [11], offsetIndices: "0", untils: "Infinity" }, { id: "Pacific/Port_Moresby", title: "Port Moresby", winIndex: 50, offsets: [10], offsetIndices: "0", untils: "Infinity" }, { id: "Pacific/Rarotonga", title: "Rarotonga", winIndex: 57, offsets: [-10.5, -9.5, -10], offsetIndices: "012121212121212121212121212", untils: "4mj960|5rbw0|c8s20|6ham0|c8s20|6ham0|c8s20|6u9a0|c8s20|6ham0|c8s20|6ham0|c8s20|6ham0|c8s20|6ham0|c8s20|6ham0|c8s20|6u9a0|c8s20|6ham0|c8s20|6ham0|c8s20|6ham0|Infinity" }, { id: "Pacific/Saipan", title: "Saipan", winIndex: 50, link: 520 }, { id: "Pacific/Tahiti", title: "Tahiti", winIndex: 57, offsets: [-9.97111111111111, -10], offsetIndices: "01", untils: "-tvnayw|Infinity" }, { id: "Pacific/Tarawa", title: "Tarawa", winIndex: 44, offsets: [12], offsetIndices: "0", untils: "Infinity" }, { id: "Pacific/Tongatapu", title: "Tongatapu", winIndex: 94, offsets: [12.333333333333334, 13, 14], offsetIndices: "01212121", untils: "-f4vrlc|uo2edc|8fpc0|bvs00|4bh80|eelg0|4bh80|Infinity" }, { id: "Pacific/Wake", title: "Wake", winIndex: 44, offsets: [12], offsetIndices: "0", untils: "Infinity" }, { id: "Pacific/Wallis", title: "Wallis", winIndex: 44, offsets: [12], offsetIndices: "0", untils: "Infinity" }, { id: "PST8PDT", title: "PST8PDT", winIndex: 11, offsets: [-8, -7], offsetIndices: "010101101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010", untils: "-r0emw0|ast80|7x9g0|ast80|bmtus0|1tz2s0|2dyg0|b9gdg0|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|9d440|9cyk0|9d440|9cyk0|3lpg0|f4d80|64g40|clmk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|9d440|9px80|905g0|9px80|9d440|9cyk0|9d440|9cyk0|9d440|9cyk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|8a840|afuk0|8a840|afuk0|8a840|ast80|7x9g0|ast80|7x9g0|ast80|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6udg0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|6hes0|c8nw0|Infinity" }]; module.exports = { displayNames: displayNames, timezones: timezones } }, /*!*************************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.appointment_tooltip.js ***! \*************************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Tooltip = __webpack_require__( /*! ../tooltip */ 314), tooltip = __webpack_require__( /*! ../tooltip/ui.tooltip */ 316), Button = __webpack_require__( /*! ../button */ 201), FunctionTemplate = __webpack_require__( /*! ../widget/function_template */ 98), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63); var APPOINTMENT_TOOLTIP_CLASS = "dx-scheduler-appointment-tooltip", APPOINTMENT_TOOLTIP_TITLE_CLASS = "dx-scheduler-appointment-tooltip-title", APPOINTMENT_TOOLTIP_DATE_CLASS = "dx-scheduler-appointment-tooltip-date", APPOINTMENT_TOOLTIP_BUTTONS_CLASS = "dx-scheduler-appointment-tooltip-buttons"; var appointmentTooltip = { show: function(appointmentData, singleAppointmentData, $appointment, instance) { if (this._tooltip) { if (this._tooltip.option("visible") && $(this._tooltip.option("target")).get(0) === $($appointment).get(0)) { return } } this.instance = instance; var isAllDay = instance.appointmentTakesAllDay(appointmentData); this._initDynamicTemplate(appointmentData, singleAppointmentData); var template = instance._getAppointmentTemplate("appointmentTooltipTemplate"); this.hide(); this._$tooltip = $("<div>").appendTo(instance.element()); this._tooltip = instance._createComponent(this._$tooltip, Tooltip, { visible: true, target: $appointment, rtlEnabled: instance.option("rtlEnabled"), contentTemplate: new FunctionTemplate(function(options) { return template.render({ model: appointmentData, container: options.container }) }), position: { my: "bottom", at: "top", of: $appointment, boundary: isAllDay ? instance.element() : instance.getWorkSpaceScrollableContainer(), collision: "fit flipfit" } }) }, hide: function() { if (!this._$tooltip) { return } this._$tooltip.remove(); delete this._$tooltip; delete this._tooltip; tooltip.hide() }, _initDynamicTemplate: function(appointmentData, singleAppointmentData) { var that = this; this.instance._defaultTemplates.appointmentTooltip = new FunctionTemplate(function(options) { var $container = options.container, $tooltip = that._tooltipContent(appointmentData, singleAppointmentData); $tooltip.addClass($container.attr("class")); $container.replaceWith($tooltip); return $container }) }, _tooltipContent: function(appointmentData, singleAppointmentData) { var $tooltip = $("<div>").addClass(APPOINTMENT_TOOLTIP_CLASS); var isAllDay = this.instance.fire("getField", "allDay", appointmentData), startDate = this.instance.fire("getField", "startDate", singleAppointmentData), endDate = this.instance.fire("getField", "endDate", singleAppointmentData), text = this.instance.fire("getField", "text", appointmentData), startDateTimeZone = this.instance.fire("getField", "startDateTimeZone", appointmentData), endDateTimeZone = this.instance.fire("getField", "endDateTimeZone", appointmentData); startDate = this.instance.fire("convertDateByTimezone", startDate, startDateTimeZone); endDate = this.instance.fire("convertDateByTimezone", endDate, endDateTimeZone); $("<div>").text(text).addClass(APPOINTMENT_TOOLTIP_TITLE_CLASS).appendTo($tooltip); $("<div>").addClass(APPOINTMENT_TOOLTIP_DATE_CLASS).text(this._formatTooltipDate(startDate, endDate, isAllDay)).appendTo($tooltip); var $buttons = $("<div>").addClass(APPOINTMENT_TOOLTIP_BUTTONS_CLASS).appendTo($tooltip); if (this.instance._editing.allowDeleting) { this._getDeleteButton(appointmentData, singleAppointmentData).appendTo($buttons) } this._getOpenButton(appointmentData, singleAppointmentData).appendTo($buttons); return $tooltip }, _formatTooltipDate: function(startDate, endDate, isAllDay) { var formatType = "month" !== this.instance.option("currentView") && dateUtils.sameDate(startDate, endDate) ? "TIME" : "DATETIME", formattedString = ""; if (isAllDay) { formatType = "DATE" } this.instance.fire("formatDates", { startDate: startDate, endDate: endDate, formatType: formatType, callback: function(result) { formattedString = result } }); return formattedString }, _getDeleteButton: function(appointmentData, singleAppointmentData) { var that = this; return new Button($("<div>"), { icon: "trash", onClick: function() { var startDate = that.instance.fire("getField", "startDate", singleAppointmentData); that.instance._checkRecurringAppointment(appointmentData, singleAppointmentData, startDate, function() { that.instance.deleteAppointment(appointmentData) }, true); that.hide() } }).element() }, _getOpenButton: function(appointmentData, singleAppointmentData) { var that = this, allowUpdating = that.instance._editing.allowUpdating; return new Button($("<div>"), { icon: allowUpdating ? "edit" : "", text: messageLocalization.format("dxScheduler-openAppointment"), onClick: function() { that.instance.showAppointmentPopup(appointmentData, false, singleAppointmentData); that.hide() } }).element() } }; module.exports = appointmentTooltip }, /*!************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.header.js ***! \************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, camelize = __webpack_require__( /*! ../../core/utils/inflector */ 39).camelize, registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), Widget = __webpack_require__( /*! ../widget/ui.widget */ 95), publisherMixin = __webpack_require__( /*! ./ui.scheduler.publisher_mixin */ 476), SchedulerNavigator = __webpack_require__( /*! ./ui.scheduler.navigator */ 477), DropDownMenu = __webpack_require__( /*! ../drop_down_menu */ 281), Tabs = __webpack_require__( /*! ../tabs */ 293), errors = __webpack_require__( /*! ../../core/errors */ 7), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89); var COMPONENT_CLASS = "dx-scheduler-header", VIEW_SWITCHER_CLASS = "dx-scheduler-view-switcher", VIEW_SWITCHER_LABEL_CLASS = "dx-scheduler-view-switcher-label"; var STEP_MAP = { day: "day", week: "week", workWeek: "workWeek", month: "month", timelineDay: "day", timelineWeek: "week", timelineWorkWeek: "workWeek", timelineMonth: "month", agenda: "agenda" }; var VIEWS = ["day", "week", "workWeek", "month", "timelineDay", "timelineWeek", "timelineWorkWeek", "timelineMonth", "agenda"]; var SchedulerHeader = Widget.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { views: [], currentView: "day", firstDayOfWeek: void 0, currentDate: new Date, min: void 0, max: void 0, useDropDownViewSwitcher: false }) }, _optionChanged: function(args) { var value = args.value; switch (args.name) { case "views": var currentView = this.option("currentView"); this._viewSwitcher.option({ items: value, selectedItem: currentView }); break; case "currentView": this._viewSwitcher.option("selectedItem", value); this._navigator.option("step", STEP_MAP[value]); this._changeViewSwitcherLabelText(); break; case "currentDate": this._navigator.option("date", value); break; case "min": case "max": case "firstDayOfWeek": this._navigator.option(args.name, value); break; case "tabIndex": case "focusStateEnabled": this._viewSwitcher.option(args.name, value); this._navigator.option(args.name, value); this.callBase(args); break; case "useDropDownViewSwitcher": this._refreshViewSwitcher(); break; default: this.callBase(args) } }, _init: function() { this.callBase(); this.element().addClass(COMPONENT_CLASS) }, _render: function() { this.callBase(); this._renderNavigator(); this._renderViewSwitcher() }, _renderNavigator: function() { this._navigator = this._createComponent("<div>", SchedulerNavigator, { min: this.option("min"), max: this.option("max"), date: this.option("currentDate"), step: STEP_MAP[this.option("currentView")], firstDayOfWeek: this.option("firstDayOfWeek"), tabIndex: this.option("tabIndex"), focusStateEnabled: this.option("focusStateEnabled"), observer: this.option("observer") }); this._navigator.element().appendTo(this.element()) }, _renderViewSwitcher: function() { this._validateViews(); var $viewSwitcher = $("<div>").addClass(VIEW_SWITCHER_CLASS).appendTo(this.element()); if (!this.option("useDropDownViewSwitcher")) { this._renderViewSwitcherTabs($viewSwitcher) } else { this._renderViewSwitcherDropDownMenu($viewSwitcher) } }, _validateViews: function() { var views = this.option("views"); $.each(views, function(_, viewName) { if (inArray(viewName, VIEWS) === -1) { errors.log("W0008", viewName) } }) }, _renderViewSwitcherTabs: function($element) { this._viewSwitcher = this._createComponent($element, Tabs, { selectionRequired: true, scrollingEnabled: true, onSelectionChanged: this._updateCurrentView.bind(this), items: this.option("views"), itemTemplate: function(item) { return $("<span>").addClass("dx-tab-text").text(messageLocalization.format("dxScheduler-switcher" + camelize(item, true))) }, selectedItem: this.option("currentView"), tabIndex: this.option("tabIndex"), focusStateEnabled: this.option("focusStateEnabled") }) }, _refreshViewSwitcher: function() { this._viewSwitcher._dispose(); this._viewSwitcher.element().remove(); delete this._viewSwitcher; this._removeViewSwitcherLabel(); this._renderViewSwitcher() }, _removeViewSwitcherLabel: function() { if (commonUtils.isDefined(this._$viewSwitcherLabel)) { this._$viewSwitcherLabel.detach(); this._$viewSwitcherLabel.remove(); delete this._$viewSwitcherLabel } }, _renderViewSwitcherDropDownMenu: function($element) { this._$viewSwitcherLabel = $("<div>").addClass(VIEW_SWITCHER_LABEL_CLASS).appendTo(this.element()); this._changeViewSwitcherLabelText(); this._viewSwitcher = this._createComponent($element, DropDownMenu, { onItemClick: this._updateCurrentView.bind(this), items: this.option("views"), itemTemplate: function(item) { return $("<span>").addClass("dx-dropdownmenu-item-text").text(messageLocalization.format("dxScheduler-switcher" + camelize(item, true))) } }) }, _changeViewSwitcherLabelText: function() { if (!commonUtils.isDefined(this._$viewSwitcherLabel)) { return } var currentViewText = messageLocalization.format("dxScheduler-switcher" + camelize(this.option("currentView"), true)); this._$viewSwitcherLabel.text(currentViewText) }, _updateCurrentView: function(e) { var selectedItem = e.itemData || e.component.option("selectedItem"); this.notifyObserver("currentViewUpdated", selectedItem) }, _renderFocusTarget: commonUtils.noop }).include(publisherMixin); registerComponent("dxSchedulerHeader", SchedulerHeader); module.exports = SchedulerHeader }, /*!*********************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.publisher_mixin.js ***! \*********************************************************/ function(module, exports) { var publisherMixin = { notifyObserver: function(subject, args) { var observer = this.option("observer"); if (observer) { observer.fire(subject, args) } }, invoke: function() { var observer = this.option("observer"); if (observer) { return observer.fire.apply(observer, arguments) } } }; module.exports = publisherMixin }, /*!***************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.navigator.js ***! \***************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), errors = __webpack_require__( /*! ../widget/ui.errors */ 22), dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), devices = __webpack_require__( /*! ../../core/devices */ 53), Widget = __webpack_require__( /*! ../widget/ui.widget */ 95), Button = __webpack_require__( /*! ../button */ 201), Calendar = __webpack_require__( /*! ../calendar */ 253), Popover = __webpack_require__( /*! ../popover */ 207), Popup = __webpack_require__( /*! ../popup */ 200), publisherMixin = __webpack_require__( /*! ./ui.scheduler.publisher_mixin */ 476), dateLocalization = __webpack_require__( /*! ../../localization/date */ 33), isNumeric = commonUtils.isNumeric, noop = commonUtils.noop; var ELEMENT_CLASS = "dx-scheduler-navigator", CALENDAR_CLASS = "dx-scheduler-navigator-calendar", NEXT_BUTTON_CLASS = "dx-scheduler-navigator-next", CAPTION_BUTTON_CLASS = "dx-scheduler-navigator-caption", PREVIOUS_BUTTON_CLASS = "dx-scheduler-navigator-previous", MONDAY_INDEX = 1; var getDefaultFirstDayOfWeekIndex = function(shift) { return shift ? MONDAY_INDEX : dateLocalization.firstDayOfWeekIndex() }; var getDateMonthFormat = function(short) { return function(date) { var monthName = dateLocalization.getMonthNames(short ? "abbreviated" : "wide")[date.getMonth()]; return [dateLocalization.format(date, "day"), monthName].join(" ") } }; var getCaptionFormat = function(short) { var dateMonthFormat = getDateMonthFormat(short); return function(date) { return [dateMonthFormat(date), dateLocalization.format(date, "year")].join(" ") } }; var getWeekCaption = function(date, shift, rejectWeekend) { var firstWeekDate = dateUtils.getFirstWeekDate(date, this.option("firstDayOfWeek") || getDefaultFirstDayOfWeekIndex(shift)), weekendDuration = 2; if (rejectWeekend) { firstWeekDate = dateUtils.normalizeDateByWeek(firstWeekDate, date) } if (this.option("firstDayOfWeek") >= 6 && rejectWeekend) { firstWeekDate.setDate(firstWeekDate.getDate() + (7 - this.option("firstDayOfWeek") + 1)) } var lastWeekDate = new Date(firstWeekDate); shift = shift || 6; lastWeekDate = new Date(lastWeekDate.setDate(lastWeekDate.getDate() + shift)); if (lastWeekDate.getDay() % 6 === 0 && rejectWeekend) { lastWeekDate.setDate(lastWeekDate.getDate() + weekendDuration) } var isDifferentMonthDates = firstWeekDate.getMonth() !== lastWeekDate.getMonth(), useShortFormat = isDifferentMonthDates || this.option("_useShortDateFormat"), firstWeekDateText = dateLocalization.format(firstWeekDate, isDifferentMonthDates ? getDateMonthFormat(useShortFormat) : "d"), lastWeekDateText = dateLocalization.format(lastWeekDate, getCaptionFormat(useShortFormat)); return firstWeekDateText + "-" + lastWeekDateText }; var dateGetter = function(date, offset) { return new Date(date[this.setter](date[this.getter]() + offset)) }; var getConfig = function(step) { var agendaDuration; switch (step) { case "day": return { duration: 1, setter: "setDate", getter: "getDate", getDate: dateGetter, getCaption: getCaptionFormat() }; case "week": return { duration: 7, setter: "setDate", getter: "getDate", getDate: dateGetter, getCaption: getWeekCaption }; case "workWeek": return { duration: 7, setter: "setDate", getter: "getDate", getDate: dateGetter, getCaption: function(date) { return getWeekCaption.call(this, date, 4, true) } }; case "month": return { duration: 1, setter: "setMonth", getter: "getMonth", getDate: function(date, offset) { var currentDate = date.getDate(); date.setDate(1); date = dateGetter.call(this, date, offset); var lastDate = dateUtils.getLastMonthDay(date); date.setDate(currentDate < lastDate ? currentDate : lastDate); return date }, getCaption: function(date) { return dateLocalization.format(date, "monthandyear") } }; case "agenda": agendaDuration = this.invoke("getAgendaDuration"); agendaDuration = isNumeric(agendaDuration) && agendaDuration > 0 ? agendaDuration : 7; return { duration: agendaDuration, setter: "setDate", getter: "getDate", getDate: dateGetter, getCaption: function(date) { var format = getCaptionFormat(this.option("_useShortDateFormat")); if (agendaDuration > 1) { var lastDate = new Date(date); lastDate.setDate(lastDate.getDate() + agendaDuration - 1); return dateLocalization.format(date, "d") + "-" + dateLocalization.format(lastDate, format) } else { return dateLocalization.format(date, format) } } } } }; var SchedulerNavigator = Widget.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { date: new Date, step: "day", min: void 0, max: void 0, firstDayOfWeek: void 0, _useShortDateFormat: false }) }, _defaultOptionsRules: function() { return this.callBase().concat([{ device: function() { return !devices.real().generic || devices.isSimulator() }, options: { _useShortDateFormat: true } }]) }, _optionChanged: function(args) { switch (args.name) { case "step": case "date": this._updateButtonsState(); this._renderCaption(); this._setCalendarOption("value", this.option("date")); break; case "min": case "max": this._updateButtonsState(); this._setCalendarOption(args.name, args.value); break; case "firstDayOfWeek": this._setCalendarOption(args.name, args.value); break; case "tabIndex": case "focusStateEnabled": this._next.option(args.name, args.value); this._caption.option(args.name, args.value); this._prev.option(args.name, args.value); this._setCalendarOption(args.name, args.value); this.callBase(args); break; case "_useShortDateFormat": break; default: this.callBase(args) } }, _init: function() { this.callBase(); this.element().addClass(ELEMENT_CLASS); this._initButtons() }, _initButtons: function() { var $next = $("<div>").addClass(NEXT_BUTTON_CLASS); this._next = this._createComponent($next, Button, { icon: "chevronnext", onClick: this._updateCurrentDate.bind(this, 1), focusStateEnabled: this.option("focusStateEnabled"), tabIndex: this.option("tabIndex"), integrationOptions: {} }); var $caption = $("<div>").addClass(CAPTION_BUTTON_CLASS); this._caption = this._createComponent($caption, Button, { focusStateEnabled: this.option("focusStateEnabled"), tabIndex: this.option("tabIndex"), integrationOptions: {} }); var $prev = $("<div>").addClass(PREVIOUS_BUTTON_CLASS); this._prev = this._createComponent($prev, Button, { icon: "chevronprev", onClick: this._updateCurrentDate.bind(this, -1), focusStateEnabled: this.option("focusStateEnabled"), tabIndex: this.option("tabIndex"), integrationOptions: {} }); this.setAria("label", "Next period", $next); this.setAria("label", "Previous period", $prev); this._updateButtonsState(); this.element().append($prev, $caption, $next) }, _updateButtonsState: function() { var min = this.option("min"), max = this.option("max"); this._prev.option("disabled", min && this._getNextDate(-1) <= min); this._next.option("disabled", max && this._getNextDate(1) >= max) }, _updateCurrentDate: function(direction) { var date = this._getNextDate(direction); dateUtils.normalizeDate(date, this.option("min"), this.option("max")); this.notifyObserver("currentDateUpdated", date) }, _getNextDate: function(direction) { var stepConfig = this._getConfig(), offset = stepConfig.duration * direction, date = stepConfig.getDate(new Date(this.option("date")), offset); return date }, _renderFocusTarget: noop, _render: function() { this.callBase(); this._renderPopover(); this._renderCaption(); this._renderCaptionKeys() }, _renderPopover: function() { var overlayType = !devices.current().generic ? Popup : Popover; this._popover = this._createComponent("<div>", overlayType, { onContentReady: this._popoverContentReadyHandler.bind(this), defaultOptionsRules: [{ device: function() { return !devices.current().generic }, options: { fullScreen: true, showCloseButton: false, toolbarItems: [{ shortcut: "cancel" }] } }, { device: function() { return devices.current().generic }, options: { target: this._caption.element() } }] }); this._popover.element().appendTo(this.element()) }, _popoverContentReadyHandler: function() { this._calendar = this._createComponent($("<div>"), Calendar, this._calendarOptions()); this._calendar.element().addClass(CALENDAR_CLASS); this._popover.content().append(this._calendar.element()) }, _calendarOptions: function() { return { min: this.option("min"), max: this.option("max"), firstDayOfWeek: this.option("firstDayOfWeek"), value: this.option("date"), focusStateEnabled: this.option("focusStateEnabled"), onValueChanged: function(e) { if (!this.option("visible")) { return } this.notifyObserver("currentDateUpdated", e.value); this._popover.hide() }.bind(this), hasFocus: function() { return true }, tabIndex: null, _keyboardProcessor: this._calendarKeyboardProcessor } }, _renderCaption: function() { var date = this.option("date"), caption = this._getConfig().getCaption.call(this, date); this._caption.option({ text: caption, onClick: function() { this._popover.toggle() }.bind(this) }) }, _renderCaptionKeys: function() { if (!this.option("focusStateEnabled") || this.option("disabled")) { return } this._calendarKeyboardProcessor = this._caption._keyboardProcessor.attachChildProcessor(); this._setCalendarOption("_keyboardProcessor", this._calendarKeyboardProcessor); var that = this, executeHandler = function() { if (that._popover.content().is(":hidden")) { that._popover.show() } else { return true } }, tabHandler = function() { that._popover.hide() }; this._caption.registerKeyHandler("enter", executeHandler); this._caption.registerKeyHandler("space", executeHandler); this._caption.registerKeyHandler("tab", tabHandler) }, _setCalendarOption: function(name, value) { if (this._calendar) { this._calendar.option(name, value) } }, _getConfig: function() { var step = this.option("step"), config = getConfig.call(this, step); if (!config) { throw errors.Error("E1033", step) } return config } }).include(publisherMixin); registerComponent("dxSchedulerNavigator", SchedulerNavigator); module.exports = SchedulerNavigator }, /*!********************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.work_space_day.js ***! \********************************************************/ function(module, exports, __webpack_require__) { var noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), SchedulerWorkSpace = __webpack_require__( /*! ./ui.scheduler.work_space */ 479); var DAY_CLASS = "dx-scheduler-work-space-day"; var SchedulerWorkSpaceDay = SchedulerWorkSpace.inherit({ _getElementClass: function() { return DAY_CLASS }, _getRowCount: function() { return this._getCellCountInDay() }, _getCellCount: function() { return 1 }, _setFirstViewDate: function() { this._firstViewDate = this.option("currentDate"); this._setStartDayHour(this._firstViewDate) }, _getDateByIndex: function() { return this._firstViewDate }, _getFormat: function() { return "longdate" }, _renderDateHeader: noop, _getRightCell: function(isMultiSelection) { if (!isMultiSelection) { return this.callBase(isMultiSelection) } return this._$focusedCell }, _getLeftCell: function(isMultiSelection) { if (!isMultiSelection) { return this.callBase(isMultiSelection) } return this._$focusedCell } }); registerComponent("dxSchedulerWorkSpaceDay", SchedulerWorkSpaceDay); module.exports = SchedulerWorkSpaceDay }, /*!****************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.work_space.js ***! \****************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), dateLocalization = __webpack_require__( /*! ../../localization/date */ 33), toMs = dateUtils.dateToMilliseconds, Widget = __webpack_require__( /*! ../widget/ui.widget */ 95), abstract = Widget.abstract, commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), publisherMixin = __webpack_require__( /*! ./ui.scheduler.publisher_mixin */ 476), eventUtils = __webpack_require__( /*! ../../events/utils */ 71), pointerEvents = __webpack_require__( /*! ../../events/pointer */ 76), errors = __webpack_require__( /*! ../widget/ui.errors */ 22), clickEvent = __webpack_require__( /*! ../../events/click */ 75), dragEvents = __webpack_require__( /*! ../../events/drag */ 110), Scrollable = __webpack_require__( /*! ../scroll_view/ui.scrollable */ 244), tableCreator = __webpack_require__( /*! ./ui.scheduler.table_creator */ 480); var COMPONENT_CLASS = "dx-scheduler-work-space", GROUPED_WORKSPACE_CLASS = "dx-scheduler-work-space-grouped", WORKSPACE_WITH_BOTH_SCROLLS_CLASS = "dx-scheduler-work-space-both-scrollbar", TIME_PANEL_CLASS = "dx-scheduler-time-panel", TIME_PANEL_CELL_CLASS = "dx-scheduler-time-panel-cell", TIME_PANEL_ROW_CLASS = "dx-scheduler-time-panel-row", TIME_PANEL_ODD_ROW_COUNT_CLASS = "dx-scheduler-time-panel-odd-row-count", ALL_DAY_PANEL_CLASS = "dx-scheduler-all-day-panel", ALL_DAY_TABLE_CLASS = "dx-scheduler-all-day-table", FIXED_CONTAINER_CLASS = "dx-scheduler-fixed-appointments", ALL_DAY_CONTAINER_CLASS = "dx-scheduler-all-day-appointments", ALL_DAY_TITLE_CLASS = "dx-scheduler-all-day-title", ALL_DAY_TITLE_HIDDEN_CLASS = "dx-scheduler-all-day-title-hidden", ALL_DAY_TABLE_CELL_CLASS = "dx-scheduler-all-day-table-cell", ALL_DAY_TABLE_ROW_CLASS = "dx-scheduler-all-day-table-row", WORKSPACE_WITH_ALL_DAY_CLASS = "dx-scheduler-work-space-all-day", WORKSPACE_WITH_COLLAPSED_ALL_DAY_CLASS = "dx-scheduler-work-space-all-day-collapsed", WORKSPACE_WITH_MOUSE_SELECTION_CLASS = "dx-scheduler-work-space-mouse-selection", HEADER_PANEL_CLASS = "dx-scheduler-header-panel", HEADER_PANEL_CELL_CLASS = "dx-scheduler-header-panel-cell", HEADER_ROW_CLASS = "dx-scheduler-header-row", GROUP_ROW_CLASS = "dx-scheduler-group-row", GROUP_HEADER_CLASS = "dx-scheduler-group-header", GROUP_HEADER_CONTENT_CLASS = "dx-scheduler-group-header-content", DATE_TABLE_CLASS = "dx-scheduler-date-table", DATE_TABLE_CELL_CLASS = "dx-scheduler-date-table-cell", DATE_TABLE_ROW_CLASS = "dx-scheduler-date-table-row", DATE_TABLE_FOCUSED_CELL_CLASS = "dx-scheduler-focused-cell", DATE_TABLE_DROPPABLE_CELL_CLASS = "dx-scheduler-date-table-droppable-cell", SCHEDULER_HEADER_SCROLLABLE_CLASS = "dx-scheduler-header-scrollable", SCHEDULER_SIDEBAR_SCROLLABLE_CLASS = "dx-scheduler-sidebar-scrollable", SCHEDULER_DATE_TABLE_SCROLLABLE_CLASS = "dx-scheduler-date-table-scrollable", SCHEDULER_WORKSPACE_DXPOINTERDOWN_EVENT_NAME = eventUtils.addNamespace(pointerEvents.down, "dxSchedulerWorkSpace"), SCHEDULER_CELL_DXDRAGENTER_EVENT_NAME = eventUtils.addNamespace(dragEvents.enter, "dxSchedulerDateTable"), SCHEDULER_CELL_DXDROP_EVENT_NAME = eventUtils.addNamespace(dragEvents.drop, "dxSchedulerDateTable"), SCHEDULER_CELL_DXCLICK_EVENT_NAME = eventUtils.addNamespace(clickEvent.name, "dxSchedulerDateTable"), SCHEDULER_CELL_DXPOINTERDOWN_EVENT_NAME = eventUtils.addNamespace(pointerEvents.down, "dxSchedulerDateTable"), SCHEDULER_CELL_DXPOINTERUP_EVENT_NAME = eventUtils.addNamespace(pointerEvents.up, "dxSchedulerDateTable"), SCHEDULER_CELL_DXPOINTERMOVE_EVENT_NAME = eventUtils.addNamespace(pointerEvents.move, "dxSchedulerDateTable"), CELL_DATA = "dxCellData", DATE_TABLE_CELL_WIDTH = 75, DAY_MS = toMs("day"), HOUR_MS = toMs("hour"); var formatWeekday = function(date) { return dateLocalization.getDayNames("abbreviated")[date.getDay()] }; var SchedulerWorkSpace = Widget.inherit({ _supportedKeys: function() { var clickHandler = function(e) { e.preventDefault(); e.stopPropagation(); if (this._focusedCells && this._focusedCells.length) { this._showAddAppointmentPopup($(this._focusedCells)) } }, arrowPressHandler = function(e, cell) { e.preventDefault(); e.stopPropagation(); this._moveToCell(cell, e.shiftKey) }; return extend(this.callBase(), { enter: clickHandler, space: clickHandler, downArrow: function(e) { var $cell = this._getCellFromNextRow("next", e.shiftKey); arrowPressHandler.call(this, e, $cell) }, upArrow: function(e) { var $cell = this._getCellFromNextRow("prev", e.shiftKey); arrowPressHandler.call(this, e, $cell) }, rightArrow: function(e) { var $rightCell = this._getRightCell(e.shiftKey); arrowPressHandler.call(this, e, $rightCell) }, leftArrow: function(e) { var $leftCell = this._getLeftCell(e.shiftKey); arrowPressHandler.call(this, e, $leftCell) } }) }, _isRTL: function() { return this.option("rtlEnabled") }, _getFocusedCell: function() { return this._$focusedCell || this._$dateTable.find("." + this._getDateTableCellClass()).eq(0) }, _getCellFromNextRow: function(direction) { var $currentCell = this._$focusedCell, cellIndex = $currentCell.index(), $row = $currentCell.parent(), $cell = $row[direction]().children().eq(cellIndex); $cell = this._checkForViewBounds($cell); return $cell }, _checkForViewBounds: function($item) { if (!$item.length) { $item = this._$focusedCell } return $item }, _getRightCell: function(isMultiSelection) { var $rightCell, $focusedCell = this._$focusedCell, groupCount = this._getGroupCount(), rowCellCount = isMultiSelection ? this._getCellCount() : this._getTotalCellCount(groupCount), lastIndexInRow = rowCellCount - 1, edgeCellIndex = this._isRTL() ? 0 : lastIndexInRow, currentIndex = $focusedCell.index(), direction = this._isRTL() ? "prev" : "next"; if (currentIndex === edgeCellIndex || isMultiSelection && this._isGroupEndCell($focusedCell)) { var $row = $focusedCell.parent(), sign = this._isRTL() ? 1 : -1; $rightCell = $row[direction]().children().eq(currentIndex + sign * lastIndexInRow); $rightCell = this._checkForViewBounds($rightCell) } else { $rightCell = $focusedCell[direction]() } return $rightCell }, _isGroupEndCell: function($cell) { var cellsInRow = this._getCellCount(), currentCellIndex = $cell.index(), result = currentCellIndex % cellsInRow; return this._isRTL() ? 0 === result : result === cellsInRow - 1 }, _getLeftCell: function(isMultiSelection) { var $leftCell, $focusedCell = this._$focusedCell, groupCount = this._getGroupCount(), rowCellCount = isMultiSelection ? this._getCellCount() : this._getTotalCellCount(groupCount), lastIndexInRow = rowCellCount - 1, edgeCellIndex = this._isRTL() ? lastIndexInRow : 0, currentIndex = $focusedCell.index(), direction = this._isRTL() ? "next" : "prev"; if (currentIndex === edgeCellIndex || isMultiSelection && this._isGroupStartCell($focusedCell)) { var $row = $focusedCell.parent(), sign = this._isRTL() ? -1 : 1; $leftCell = $row[direction]().children().eq(currentIndex + sign * lastIndexInRow); $leftCell = this._checkForViewBounds($leftCell) } else { $leftCell = $focusedCell[direction]() } return $leftCell }, _isGroupStartCell: function($cell) { var cellsInRow = this._getCellCount(), currentCellIndex = $cell.index(), result = currentCellIndex % cellsInRow; return this._isRTL() ? result === cellsInRow - 1 : 0 === result }, _moveToCell: function($cell, isMultiSelection) { isMultiSelection = isMultiSelection && this.option("allowMultipleCellSelection"); this._setFocusedCell($cell, isMultiSelection); this._dateTableScrollable.scrollToElement($cell) }, _setFocusedCell: function($cell, isMultiSelection) { if (!$cell.length) { return } this._releaseFocusedCell(); this._focusedCells = []; if (isMultiSelection) { $cell = this._correctCellForGroup($cell); var $targetCells = this._getCellsBetween($cell, this._$prevCell); this._focusedCells = $targetCells.toArray() } else { this._focusedCells = [$cell.get(0)]; this._$prevCell = $cell } var $focusedCells = $(this._focusedCells); this._toggleFocusClass(true, $focusedCells); this.setAria("label", "Add appointment", $focusedCells); this._toggleFocusedCellClass(true, $cell); this._$focusedCell = $cell }, _correctCellForGroup: function($cell) { var $focusedCell = this._$focusedCell, cellGroupIndex = this._getGroupIndexByCell($cell), focusedCellGroupIndex = this._getGroupIndexByCell($focusedCell), isDifferentTables = this._hasAllDayClass($cell) !== this._hasAllDayClass($focusedCell); return focusedCellGroupIndex !== cellGroupIndex || isDifferentTables ? $focusedCell : $cell }, _getCellsBetween: function($first, $last) { var isAllDayTable = this._hasAllDayClass($last), $cells = this._getCells(isAllDayTable), firstIndex = $cells.index($first), lastIndex = $cells.index($last); if (firstIndex > lastIndex) { var buffer = firstIndex; firstIndex = lastIndex; lastIndex = buffer } $cells = $cells.slice(firstIndex, lastIndex + 1); if (this._getGroupCount() > 1) { var result = [], focusedGroupIndex = this._getGroupIndexByCell($first); $.each($cells, function(_, cell) { var groupIndex = this._getGroupIndexByCell($(cell)); if (focusedGroupIndex === groupIndex) { result.push(cell) } }.bind(this)); $cells = $(result) } return $cells }, _hasAllDayClass: function($cell) { return $cell.hasClass(ALL_DAY_TABLE_CELL_CLASS) }, _getGroupIndexByCell: function($cell) { var cellsInRow = this._getCellCount(), currentCellIndex = $cell.index() + 1, groupIndex = Math.ceil(currentCellIndex / cellsInRow); return groupIndex }, _toggleFocusedCellClass: function(isFocused, $element) { var $focusTarget = $element && $element.length ? $element : this._focusTarget(); $focusTarget.toggleClass(DATE_TABLE_FOCUSED_CELL_CLASS, isFocused) }, _releaseFocusedCell: function($cell) { $cell = $cell || $(this._focusedCells); if (commonUtils.isDefined($cell)) { this._toggleFocusClass(false, $cell); this._toggleFocusedCellClass(false, $cell); this.setAria("label", void 0, $cell) } }, _focusInHandler: function(e) { if ($(e.target).is(this._focusTarget()) && false !== this._isCellClick) { delete this._isCellClick; this.callBase.apply(this, arguments); var $cell = this._getFocusedCell(); this._setFocusedCell($cell) } }, _focusOutHandler: function() { this.callBase.apply(this, arguments); this._releaseFocusedCell() }, _focusTarget: function() { return this.element() }, _activeStateUnit: "." + DATE_TABLE_CELL_CLASS + ", ." + ALL_DAY_TABLE_CELL_CLASS, _getDefaultOptions: function() { return extend(this.callBase(), { currentDate: new Date, firstDayOfWeek: void 0, startDayHour: 0, endDayHour: 24, hoursInterval: .5, activeStateEnabled: true, hoverStateEnabled: true, groups: [], showAllDayPanel: true, allDayExpanded: false, onCellClick: null, crossScrollingEnabled: false, dataCellTemplate: null, timeCellTemplate: null, resourceCellTemplate: null, dateCellTemplate: null, allowMultipleCellSelection: true }) }, _optionChanged: function(args) { switch (args.name) { case "dateCellTemplate": case "resourceCellTemplate": case "dataCellTemplate": case "timeCellTemplate": case "startDayHour": case "endDayHour": case "hoursInterval": case "firstDayOfWeek": case "currentDate": case "groups": this._cleanView(); this._toggleGroupedClass(); this._renderView(); break; case "showAllDayPanel": this._toggleAllDayVisibility(); break; case "allDayExpanded": this._changeAllDayVisibility(); this.notifyObserver("allDayPanelToggled"); this._attachTablesEvents(); this.headerPanelOffsetRecalculate(); break; case "onCellClick": this._createCellClickAction(); break; case "crossScrollingEnabled": this._toggleHorizontalScrollClass(); this._dateTableScrollable.option(this._dateTableScrollableConfig()); break; case "width": this.callBase(args); this._dimensionChanged(); break; case "allowMultipleCellSelection": break; default: this.callBase(args) } }, _init: function() { this.callBase(); this._toggleHorizontalScrollClass(); this.element().addClass(COMPONENT_CLASS).addClass(this._getElementClass()); this._initWorkSpaceUnits(); this._initDateTableScrollable(); this._createWorkSpaceElements() }, _toggleHorizontalScrollClass: function() { this.element().toggleClass(WORKSPACE_WITH_BOTH_SCROLLS_CLASS, this.option("crossScrollingEnabled")) }, _getTimePanelClass: function() { return TIME_PANEL_CLASS }, _getDateTableClass: function() { return DATE_TABLE_CLASS }, _getDateTableRowClass: function() { return DATE_TABLE_ROW_CLASS }, _getDateTableCellClass: function() { return DATE_TABLE_CELL_CLASS }, _getGroupRowClass: function() { return GROUP_ROW_CLASS }, _getGroupHeaderClass: function() { return GROUP_HEADER_CLASS }, _getGroupHeaderContentClass: function() { return GROUP_HEADER_CONTENT_CLASS }, _initWorkSpaceUnits: function() { this._$headerPanel = $("<table>"); this._$thead = $("<thead>").appendTo(this._$headerPanel); this._$fixedContainer = $("<div>").addClass(FIXED_CONTAINER_CLASS); this._$allDayContainer = $("<div>").addClass(ALL_DAY_CONTAINER_CLASS); this._$allDayTitle = $("<div>").addClass(ALL_DAY_TITLE_CLASS).text(messageLocalization.format("dxScheduler-allDay")).appendTo(this.element()); this._$allDayTable = $("<table>"); this._$allDayPanel = $("<div>").addClass(ALL_DAY_PANEL_CLASS).append(this._$allDayTable); this._$timePanel = $("<table>").addClass(this._getTimePanelClass()); this._$dateTable = $("<table>") }, _initDateTableScrollable: function() { var $dateTableScrollable = $("<div>").addClass(SCHEDULER_DATE_TABLE_SCROLLABLE_CLASS); this._dateTableScrollable = this._createComponent($dateTableScrollable, Scrollable, this._dateTableScrollableConfig()) }, _dateTableScrollableConfig: function() { var config = { useKeyboard: false, useNative: false, bounceEnabled: false, updateManually: true, pushBackValue: 0 }; if (this.option("crossScrollingEnabled")) { config = extend(config, this._createCrossScrollingConfig()) } return config }, _createCrossScrollingConfig: function() { var config = {}; config.direction = "both"; config.onScroll = function(e) { if (!this._dateTableScrollWasHandled) { this._headerScrollWasHandled = true; this._sideBarScrollWasHandled = true; this._sidebarScrollable.scrollTo({ top: e.scrollOffset.top }); this._headerScrollable.scrollTo({ left: e.scrollOffset.left }) } else { this._dateTableScrollWasHandled = false } }.bind(this); config.onEnd = function() { this.notifyObserver("updateResizableArea", {}) }.bind(this); return config }, _createWorkSpaceElements: function() { if (this.option("crossScrollingEnabled")) { this._createWorkSpaceScrollableElements() } else { this._createWorkSpaceStaticElements() } }, _createWorkSpaceStaticElements: function() { this._dateTableScrollable.content().append(this._$timePanel, this._$dateTable); this.element().append(this._$fixedContainer, this._$headerPanel, this._$allDayContainer, this._$allDayPanel, this._dateTableScrollable.element()) }, _createWorkSpaceScrollableElements: function() { this.element().append(this._$fixedContainer); this._createHeaderScrollable(); this._createSidebarScrollable(); this.element().append(this._dateTableScrollable.element()); this._headerScrollable.content().append(this._$headerPanel, this._$allDayContainer, this._$allDayPanel); this._dateTableScrollable.content().append(this._$dateTable); this._sidebarScrollable.content().append(this._$timePanel) }, _createHeaderScrollable: function() { var $headerScrollable = $("<div>").addClass(SCHEDULER_HEADER_SCROLLABLE_CLASS).appendTo(this.element()); this._headerScrollable = this._createComponent($headerScrollable, Scrollable, { useKeyboard: false, showScrollbar: false, direction: "horizontal", useNative: false, updateManually: true, bounceEnabled: false, pushBackValue: 0, onScroll: function(e) { if (!this._headerScrollWasHandled) { this._dateTableScrollWasHandled = true; this._dateTableScrollable.scrollTo({ left: e.scrollOffset.left }) } else { this._headerScrollWasHandled = false } }.bind(this) }) }, _createSidebarScrollable: function() { var $timePanelScrollable = $("<div>").addClass(SCHEDULER_SIDEBAR_SCROLLABLE_CLASS).appendTo(this.element()); this._sidebarScrollable = this._createComponent($timePanelScrollable, Scrollable, { useKeyboard: false, showScrollbar: false, direction: "vertical", useNative: false, updateManually: true, bounceEnabled: false, pushBackValue: 0, onScroll: function(e) { if (!this._sideBarScrollWasHandled) { this._dateTableScrollWasHandled = true; this._dateTableScrollable.scrollTo({ top: e.scrollOffset.top }) } else { this._sideBarScrollWasHandled = false } }.bind(this) }) }, _visibilityChanged: function(visible) { if (visible && this.option("crossScrollingEnabled")) { this._setTableSizes() } }, _attachTableClasses: function() { function addClass($el, className) { $el && !$el.hasClass(className) && $el.addClass(className) } addClass(this._$headerPanel, HEADER_PANEL_CLASS); addClass(this._$dateTable, this._getDateTableClass()); addClass(this._$allDayTable, ALL_DAY_TABLE_CLASS) }, _setTableSizes: function() { var cellWidth = DATE_TABLE_CELL_WIDTH, minWidth = this._getWorkSpaceMinWidth(), $headerCells = this._$headerPanel.find("tr").last().find("th"); var width = cellWidth * $headerCells.length; if (width < minWidth) { width = minWidth } this._$headerPanel.width(width); this._$dateTable.width(width); this._$allDayTable.width(width); if (this.option("crossScrollingEnabled")) { this._attachTableClasses() } }, _getWorkSpaceMinWidth: function() { var minWidth = this._getWorkSpaceWidth(), workspaceContainerWidth = this.element().outerWidth() - this.getTimePanelWidth(); if (minWidth < workspaceContainerWidth) { minWidth = workspaceContainerWidth } return minWidth }, _dimensionChanged: function() { if (this.option("crossScrollingEnabled")) { this._setTableSizes() } this.headerPanelOffsetRecalculate(); this._cleanCellDataCache(); this._cleanAllowedPositions() }, _getElementClass: commonUtils.noop, _getRowCount: commonUtils.noop, _getCellCount: commonUtils.noop, _render: function() { this.callBase(); if (!this.option("crossScrollingEnabled")) { this._attachTableClasses() } this._toggleGroupedClass(); this._renderView(); this._attachEvents() }, _toggleGroupedClass: function() { this.element().toggleClass(GROUPED_WORKSPACE_CLASS, this._getGroupCount() > 0) }, _renderView: function() { this._setFirstViewDate(); this._applyCellTemplates(this._renderGroupHeader()); this._renderDateHeader(); this._renderAllDayPanel(); this._renderTimePanel(); this._renderDateTable() }, _setFirstViewDate: function() { this._firstViewDate = dateUtils.getFirstWeekDate(this.option("currentDate"), this._firstDayOfWeek() || dateLocalization.firstDayOfWeekIndex()); this._setStartDayHour(this._firstViewDate) }, _setStartDayHour: function(date) { var startDayHour = this.option("startDayHour"); if (commonUtils.isDefined(startDayHour)) { date.setHours(startDayHour, startDayHour % 1 * 60, 0, 0) } }, _firstDayOfWeek: function() { return this.option("firstDayOfWeek") }, _attachEvents: function() { var that = this, pointerDownAction = this._createAction(function(e) { that._pointerDownHandler(e.jQueryEvent) }); this._createCellClickAction(); var cellSelector = "." + this._getDateTableCellClass() + ",." + ALL_DAY_TABLE_CELL_CLASS; this.element().off(SCHEDULER_WORKSPACE_DXPOINTERDOWN_EVENT_NAME).off(SCHEDULER_CELL_DXCLICK_EVENT_NAME).on(SCHEDULER_WORKSPACE_DXPOINTERDOWN_EVENT_NAME, function(e) { if (eventUtils.isMouseEvent(e) && e.which > 1) { e.preventDefault(); return } pointerDownAction({ jQueryEvent: e }) }).on(SCHEDULER_CELL_DXCLICK_EVENT_NAME, cellSelector, function(e) { var $cell = $(e.target); that._cellClickAction({ jQueryEvent: e, cellElement: $cell, cellData: that.getCellData($cell) }) }) }, _createCellClickAction: function() { var that = this; this._cellClickAction = this._createActionByOption("onCellClick", { afterExecute: function(e) { that._clickHandler(e.args[0].jQueryEvent) } }) }, _clickHandler: function(e) { var $target = $(e.target); if (this._showPopup && this._hasFocusClass($target)) { delete this._showPopup; this._showAddAppointmentPopup($target) } }, _pointerDownHandler: function(e) { var $target = $(e.target); if (!$target.hasClass(this._getDateTableCellClass()) && !$target.hasClass(ALL_DAY_TABLE_CELL_CLASS)) { this._isCellClick = false; return } this._isCellClick = true; if ($target.hasClass(DATE_TABLE_FOCUSED_CELL_CLASS)) { this._showPopup = true } else { this._setFocusedCell($target) } }, _showAddAppointmentPopup: function($cell) { var firstCellData = this.getCellData($cell.first()), lastCellData = this.getCellData($cell.last()); var args = { startDate: firstCellData.startDate, endDate: lastCellData.endDate }; if (commonUtils.isDefined(lastCellData.allDay)) { args.allDay = lastCellData.allDay } extend(args, lastCellData.groups); this.notifyObserver("showAddAppointmentPopup", args) }, _getGroupHeaderContainer: function() { return this._$thead }, _getDateHeaderContainer: function() { return this._$thead }, _renderGroupHeader: function() { var $container = this._getGroupHeaderContainer(), groupCount = this._getGroupCount(), cellTemplates = []; if (groupCount) { var groupRows = this._makeGroupRows(this.option("groups")); this._attachGroupCountAttr(groupRows.elements.length); $container.append(groupRows.elements); cellTemplates = groupRows.cellTemplates } return cellTemplates }, _applyCellTemplates: function(templates) { templates.forEach(function(template) { template() }) }, _attachGroupCountAttr: function(groupRowCount) { this.element().attr("dx-group-row-count", groupRowCount) }, headerPanelOffsetRecalculate: function() { if (!this.option("resourceCellTemplate") && !this.option("dateCellTemplate")) { return } var headerPanelHeight = this.getHeaderPanelHeight(), headerHeight = this.invoke("getHeaderHeight"), allDayPanelHeight = this.supportAllDayRow() && this.option("showAllDayPanel") ? this.getAllDayHeight() : 0; headerPanelHeight && this._dateTableScrollable.element().css({ "padding-bottom": allDayPanelHeight + headerPanelHeight + "px", "margin-bottom": -1 * (parseInt(headerPanelHeight, 10) + allDayPanelHeight) + "px" }); this._$allDayTitle && this._$allDayTitle.css("top", headerHeight + headerPanelHeight + "px") }, _makeGroupRows: function(groups) { return tableCreator.makeGroupedTable(tableCreator.HORIZONTAL, groups, { groupRowClass: this._getGroupRowClass(), groupHeaderClass: this._getGroupHeaderClass(), groupHeaderContentClass: this._getGroupHeaderContentClass() }, this._getCellCount() || 1, this.option("resourceCellTemplate")) }, _getDateHeaderTemplate: function() { return this.option("dateCellTemplate") }, _renderDateHeader: function() { var $container = this._getDateHeaderContainer(), $headerRow = $("<tr>").addClass(HEADER_ROW_CLASS), count = this._getCellCount(), cellTemplate = this._getDateHeaderTemplate(), repeatCount = this._calculateHeaderCellRepeatCount(), templateCallbacks = []; for (var j = 0; j < repeatCount; j++) { for (var i = 0; i < count; i++) { var text = this._getHeaderText(i), $cell = $("<th>").addClass(HEADER_PANEL_CELL_CLASS).attr("title", text); if (cellTemplate && cellTemplate.render) { templateCallbacks.push(cellTemplate.render.bind(cellTemplate, { model: { text: text, date: this._getDateByIndex(i) }, index: j * repeatCount + i, container: $cell })) } else { $cell.text(text) } $headerRow.append($cell) } } $container.append($headerRow); this._applyCellTemplates(templateCallbacks); return $headerRow }, _calculateHeaderCellRepeatCount: function() { return this._getGroupCount() || 1 }, _renderAllDayPanel: function() { var cellCount = this._getCellCount() * (this._getGroupCount() || 1); var cellTemplates = this._renderTableBody({ container: this._$allDayTable, rowCount: 1, cellCount: cellCount, cellClass: ALL_DAY_TABLE_CELL_CLASS, rowClass: ALL_DAY_TABLE_ROW_CLASS, cellTemplate: this.option("dataCellTemplate"), getCellData: this._getAllDayCellData.bind(this) }, true); this._toggleAllDayVisibility(); this._applyCellTemplates(cellTemplates) }, _getAllDayCellData: function(cell, rowIndex, cellIndex) { var startDate = this._getDateByCellIndexes(rowIndex, cellIndex); startDate = dateUtils.trimTime(startDate); var data = { startDate: startDate, endDate: new Date(startDate.getTime() + DAY_MS), allDay: true }; var groups = this._getCellGroups(this._getGroupIndex(rowIndex, cellIndex)); if (groups.length) { data.groups = {} } for (var i = 0; i < groups.length; i++) { data.groups[groups[i].name] = groups[i].id } return { key: CELL_DATA, value: data } }, _toggleAllDayVisibility: function() { var showAllDayPanel = this.option("showAllDayPanel"); this._$allDayPanel.toggle(showAllDayPanel); this._$allDayTitle.toggleClass(ALL_DAY_TITLE_HIDDEN_CLASS, !showAllDayPanel); this.element().toggleClass(WORKSPACE_WITH_ALL_DAY_CLASS, showAllDayPanel); this._changeAllDayVisibility() }, _changeAllDayVisibility: function() { this.element().toggleClass(WORKSPACE_WITH_COLLAPSED_ALL_DAY_CLASS, !this.option("allDayExpanded") && this.option("showAllDayPanel")) }, _renderTimePanel: function() { var rowCount = this._getTimePanelRowCount(); this._$timePanel.toggleClass(TIME_PANEL_ODD_ROW_COUNT_CLASS, rowCount % 1 > 0); this._renderTableBody({ container: this._$timePanel, rowCount: rowCount, cellCount: 1, cellClass: TIME_PANEL_CELL_CLASS, rowClass: TIME_PANEL_ROW_CLASS, cellTemplate: this.option("timeCellTemplate"), getCellText: this._getTimeText.bind(this) }) }, _getTimePanelRowCount: function() { return .5 * this._getCellCountInDay() }, _getCellCountInDay: function() { return Math.floor(this._calculateDayDuration() / this.option("hoursInterval")) }, _calculateDayDuration: function() { return this.option("endDayHour") - this.option("startDayHour") }, _getTimeText: function(i) { var startViewDate = new Date(this.getStartViewDate()), timeCellDuration = 2 * this.getCellDuration(); startViewDate.setMilliseconds(startViewDate.getMilliseconds() + timeCellDuration * i); return dateLocalization.format(startViewDate, "shorttime") }, _renderDateTable: function() { var groupCount = this._getGroupCount(); this._renderTableBody({ container: this._$dateTable, rowCount: this._getTotalRowCount(groupCount), cellCount: this._getTotalCellCount(groupCount), cellClass: this._getDateTableCellClass(), rowClass: this._getDateTableRowClass(), cellTemplate: this.option("dataCellTemplate"), getCellData: this._getCellData.bind(this) }); this._attachTablesEvents() }, _getTotalCellCount: function(groupCount) { groupCount = groupCount || 1; return this._getCellCount() * groupCount }, _getTotalRowCount: function() { return this._getRowCount() }, _getCellData: function(cell, rowIndex, cellIndex) { var data = this._prepareCellData(rowIndex, cellIndex, cell); return { key: CELL_DATA, value: data } }, _prepareCellData: function(rowIndex, cellIndex) { var startDate = this._getDateByCellIndexes(rowIndex, cellIndex), endDate = this.calculateEndDate(startDate), data = { startDate: startDate, endDate: endDate, allDay: this._getTableAllDay() }, groups = this._getCellGroups(this._getGroupIndex(rowIndex, cellIndex)); if (groups.length) { data.groups = {} } for (var i = 0; i < groups.length; i++) { data.groups[groups[i].name] = groups[i].id } return data }, _getGroupIndex: function(rowIndex, cellIndex) { return Math.floor(cellIndex / this._getCellCount()) }, _getTableAllDay: function() { return false }, calculateEndDate: function(startDate) { var result = new Date(startDate); result.setMilliseconds(result.getMilliseconds() + this._getInterval()); return result }, _getGroupCount: function() { var groups = this.option("groups"), result = 0; for (var i = 0, len = groups.length; i < len; i++) { if (!i) { result = groups[i].items.length } else { result *= groups[i].items.length } } return result }, _getPathToLeaf: function(leafIndex) { var tree = this.invoke("createResourcesTree", this.option("groups")); function findLeafByIndex(data, index) { for (var i = 0; i < data.length; i++) { if (data[i].leafIndex === index) { return data[i] } else { var leaf = findLeafByIndex(data[i].children, index); if (leaf) { return leaf } } } } function makeBranch(leaf, result) { result = result || []; result.push(leaf.value); if (leaf.parent) { makeBranch(leaf.parent, result) } return result } var leaf = findLeafByIndex(tree, leafIndex); return makeBranch(leaf).reverse() }, _getCellGroups: function(groupIndex) { var result = []; if (this._getGroupCount()) { var groups = this.option("groups"); if (groupIndex < 0) { return } var path = this._getPathToLeaf(groupIndex); for (var i = 0; i < groups.length; i++) { result.push({ name: groups[i].name, id: path[i] }) } } return result }, _attachTablesEvents: function() { this._attachTableEvents(this._getDateTable()); this._attachTableEvents(this._getAllDayTable()) }, _attachTableEvents: function($table) { var cellHeight, cellWidth, that = this, isPointerDown = false; $table.off(SCHEDULER_CELL_DXDRAGENTER_EVENT_NAME).off(SCHEDULER_CELL_DXDROP_EVENT_NAME).off(SCHEDULER_CELL_DXPOINTERMOVE_EVENT_NAME).off(SCHEDULER_CELL_DXPOINTERDOWN_EVENT_NAME).on(SCHEDULER_CELL_DXDRAGENTER_EVENT_NAME, "td", { itemSizeFunc: function($element) { if (!cellHeight) { cellHeight = $element.height() } if (!cellWidth) { cellWidth = $element.width() } return { width: cellWidth, height: cellHeight } } }, function(e) { if (that._$currentTableTarget) { that._$currentTableTarget.removeClass(DATE_TABLE_DROPPABLE_CELL_CLASS) } that._$currentTableTarget = $(e.target); that._$currentTableTarget.addClass(DATE_TABLE_DROPPABLE_CELL_CLASS) }).on(SCHEDULER_CELL_DXDROP_EVENT_NAME, "td", function(e) { $(e.target).removeClass(DATE_TABLE_DROPPABLE_CELL_CLASS); cellHeight = 0; cellWidth = 0 }).on(SCHEDULER_CELL_DXPOINTERDOWN_EVENT_NAME, "td", function(e) { if (eventUtils.isMouseEvent(e) && 1 === e.which) { isPointerDown = true; that.element().addClass(WORKSPACE_WITH_MOUSE_SELECTION_CLASS); $(document).off(SCHEDULER_CELL_DXPOINTERUP_EVENT_NAME).on(SCHEDULER_CELL_DXPOINTERUP_EVENT_NAME, function() { isPointerDown = false; that.element().removeClass(WORKSPACE_WITH_MOUSE_SELECTION_CLASS) }) } }).on(SCHEDULER_CELL_DXPOINTERMOVE_EVENT_NAME, "td", function(e) { if (isPointerDown) { e.preventDefault(); e.stopPropagation(); that._moveToCell($(e.target), true) } }) }, _getDateTables: function() { return this._$dateTable.add(this._$allDayTable) }, _getDateTable: function() { return this._$dateTable }, _getAllDayTable: function() { return this._$allDayTable }, _getInterval: function() { if (void 0 === this._interval) { this._interval = this.option("hoursInterval") * HOUR_MS } return this._interval }, _getHeaderText: function(headerIndex) { return dateLocalization.format(this._getDateByIndex(headerIndex), this._getFormat()) }, _getDateByIndex: abstract, _getFormat: abstract, _calculateCellIndex: function(rowIndex, cellIndex) { cellIndex %= this._getCellCount(); return this._getRowCount() * cellIndex + rowIndex }, _renderTableBody: function(options, delayCellTemplateRendering) { var result = []; if (!delayCellTemplateRendering) { this._applyCellTemplates(tableCreator.makeTable(options)) } else { result = tableCreator.makeTable(options) } return result }, _cleanView: function() { this._cleanCellDataCache(); this._cleanAllowedPositions(); this._$thead.empty(); this._$dateTable.empty(); this._$timePanel.empty(); this._$allDayTable.empty(); delete this._hiddenInterval; delete this._interval }, getWorkArea: function() { return this._dateTableScrollable.content() }, getScrollable: function() { return this._dateTableScrollable }, getScrollableScrollTop: function() { return this._dateTableScrollable.scrollTop() }, getScrollableScrollLeft: function() { return this._dateTableScrollable.scrollLeft() }, getScrollableOuterWidth: function() { return this._dateTableScrollable.scrollWidth() }, getScrollableContainer: function() { return this._dateTableScrollable._container() }, getHeaderPanelHeight: function() { return this._$headerPanel && this._$headerPanel.outerHeight(true) }, getTimePanelWidth: function() { return this._$timePanel.outerWidth() }, _getCellCoordinatesByIndex: function(index) { var cellIndex = Math.floor(index / this._getRowCount()), rowIndex = index - this._getRowCount() * cellIndex; return { cellIndex: cellIndex, rowIndex: rowIndex } }, _getDateByCellIndexes: function(rowIndex, cellIndex) { var firstViewDate = this.getStartViewDate(), currentDate = new Date(firstViewDate.getTime() + this._getMillisecondsOffset(rowIndex, cellIndex)); currentDate.setTime(currentDate.getTime() + dateUtils.getTimezonesDifference(firstViewDate, currentDate)); return currentDate }, _getMillisecondsOffset: function(rowIndex, cellIndex) { return this._getInterval() * this._calculateCellIndex(rowIndex, cellIndex) + this._calculateHiddenInterval(rowIndex, cellIndex) }, _calculateHiddenInterval: function(rowIndex, cellIndex) { var dayCount = cellIndex % this._getCellCount(); return dayCount * this._getHiddenInterval() }, _getHiddenInterval: function() { if (void 0 === this._hiddenInterval) { this._hiddenInterval = DAY_MS - this.option("hoursInterval") * this._getCellCountInDay() * HOUR_MS } return this._hiddenInterval }, _getIntervalBetween: function(currentDate, allDay) { var startDayTime = this.option("startDayHour") * HOUR_MS, firstViewDate = this.getStartViewDate(), timeZoneOffset = dateUtils.getTimezonesDifference(firstViewDate, currentDate), fullInterval = currentDate.getTime() - firstViewDate.getTime() - timeZoneOffset, days = Math.floor((fullInterval + startDayTime) / DAY_MS), result = days * DAY_MS; if (!allDay) { result = fullInterval - days * this._getHiddenInterval() } return result }, _getGroupIndexes: function(appointmentResources) { var result = []; if (appointmentResources && this.option("groups").length) { var tree = this.invoke("createResourcesTree", this.option("groups")); result = this.invoke("getResourceTreeLeaves", tree, appointmentResources) } return result }, _updateIndex: function(index) { return index * this._getRowCount() }, _getDroppableCell: function() { return this._getDateTables().find("." + DATE_TABLE_DROPPABLE_CELL_CLASS) }, _getWorkSpaceWidth: function() { if (this.option("crossScrollingEnabled")) { return this._$dateTable.outerWidth() } return this.element().outerWidth() - this.getTimePanelWidth() }, _getCellPositionByIndex: function(index, groupIndex) { var cellCoordinates = this._getCellCoordinatesByIndex(index), $cell = this._getCellByCoordinates(cellCoordinates, groupIndex), result = this._getCellPosition($cell); this.setCellDataCache(cellCoordinates, groupIndex, $cell); if (result) { result.rowIndex = cellCoordinates.rowIndex; result.cellIndex = cellCoordinates.cellIndex } return result }, _getCellPosition: function($cell) { var isRtl = this.option("rtlEnabled"), position = $cell.position(); if (isRtl) { position.left += $cell.outerWidth() } return position }, _getCellByCoordinates: function(cellCoordinates, groupIndex) { return this._$dateTable.find("tr").eq(cellCoordinates.rowIndex).find("td").eq(cellCoordinates.cellIndex + groupIndex * this._getCellCount()) }, _getCells: function(allDay) { var cellClass = allDay ? ALL_DAY_TABLE_CELL_CLASS : this._getDateTableCellClass(); return this.element().find("." + cellClass) }, _getGroupHeaderCellsContent: function() { return this.element().find("." + GROUP_HEADER_CONTENT_CLASS) }, _getGroupHeaderCells: function() { return this.element().find("." + GROUP_HEADER_CLASS) }, _getScrollCoordinates: function(hours, minutes, date) { var currentDate = date || new Date(this.option("currentDate")), startDayHour = this.option("startDayHour"), endDayHour = this.option("endDayHour"); if (hours < startDayHour) { hours = startDayHour } if (hours >= endDayHour) { hours = endDayHour - 1 } currentDate.setHours(hours); currentDate.setMinutes(minutes); return this.getCoordinatesByDate(currentDate) }, setCellDataCache: function(cellCoordinates, groupIndex, $cell) { var cache = this.getCellDataCache(), data = this.getCellData($cell); var key = JSON.stringify({ rowIndex: cellCoordinates.rowIndex, cellIndex: cellCoordinates.cellIndex, groupIndex: groupIndex }); cache[key] = data }, setCellDataCacheAlias: function(appointment, geometry) { var key = JSON.stringify({ rowIndex: appointment.rowIndex, cellIndex: appointment.cellIndex, groupIndex: appointment.groupIndex }), aliasKey = JSON.stringify({ top: geometry.top, left: geometry.left }), cache = this.getCellDataCache(); if (cache[key]) { cache[aliasKey] = cache[key] } }, getCellDataCache: function(key) { if (!this._cache) { this._cache = {} } return key ? this._cache[key] : this._cache }, _cleanCellDataCache: function() { delete this._cache }, _cleanAllowedPositions: function() { delete this._maxAllowedVerticalPosition; delete this._maxAllowedPosition }, supportAllDayRow: function() { return true }, keepOriginalHours: function() { return false }, getCellData: function($cell) { var data = $cell[0] ? $.data($cell[0], CELL_DATA) : void 0; return extend(true, {}, data) }, getCoordinatesByDate: function(date, groupIndex, inAllDayRow) { groupIndex = groupIndex || 0; var index = this.getCellIndexByDate(date, inAllDayRow), position = this._getCellPositionByIndex(index, groupIndex), shift = this.getPositionShift(inAllDayRow ? 0 : this.getTimeShift(date)); if (!position) { throw errors.Error("E1039") } return { top: position.top + shift.top, left: position.left + shift.left, rowIndex: position.rowIndex, cellIndex: position.cellIndex, hMax: this.getMaxAllowedPosition()[groupIndex], vMax: this.getMaxAllowedVerticalPosition(), groupIndex: groupIndex } }, getCellIndexByDate: function(date, inAllDayRow) { var timeInterval = inAllDayRow ? 864e5 : this._getInterval(), dateTimeStamp = this._getIntervalBetween(date, inAllDayRow); var index = Math.floor(dateTimeStamp / timeInterval); if (inAllDayRow) { index = this._updateIndex(index) } if (index < 0) { index = 0 } return index }, getPositionShift: function(timeShift) { return { top: timeShift * this.getCellHeight(), left: 0 } }, getTimeShift: function(date) { var cellDuration = this.getCellDuration(), currentDayStart = new Date(date); currentDayStart.setMinutes(0, 0, 0); currentDayStart.setHours(this.option("startDayHour")); return (date.getTime() - currentDayStart.getTime()) % cellDuration / cellDuration }, getCoordinatesByDateInGroup: function(date, appointmentResources, inAllDayRow) { var indexes = this._getGroupIndexes(appointmentResources), result = []; if (indexes.length) { for (var i = 0; i < indexes.length; i++) { result.push(this.getCoordinatesByDate(date, indexes[i], inAllDayRow)) } } else { result.push(this.getCoordinatesByDate(date, 0, inAllDayRow)) } return result }, getDroppableCellIndex: function() { var $droppableCell = this._getDroppableCell(), $row = $droppableCell.parent(), rowIndex = $row.index(); return rowIndex * $row.find("td").length + $droppableCell.index() }, getDataByDroppableCell: function() { var cellData = this.getCellData(this._getDroppableCell()); return { date: cellData.startDate, allDay: cellData.allDay, groups: cellData.groups } }, getDateRange: function() { return [this.getStartViewDate(), this.getEndViewDate()] }, getCellWidth: function() { return this._getCells().first().outerWidth() }, getCellHeight: function() { return this._getCells().first().outerHeight() }, getAllDayHeight: function() { return this.option("showAllDayPanel") ? this._getCells(true).first().outerHeight() || 0 : 0 }, getMaxAllowedPosition: function() { if (!this._maxAllowedPosition) { var isRtl = this.option("rtlEnabled"), that = this; this._maxAllowedPosition = []; this._$dateTable.find("tr").first().find("td:nth-child(" + this._getCellCount() + "n)").each(function(_, cell) { var maxPosition = $(cell).position().left; if (!isRtl) { maxPosition += $(cell).outerWidth() } that._maxAllowedPosition.push(Math.round(maxPosition)) }) } return this._maxAllowedPosition }, getMaxAllowedVerticalPosition: function() { if (!this._maxAllowedVerticalPosition) { var rows = this._getRowCount(), row = this._$dateTable.find("tr:nth-child(" + rows + "n)"), maxPosition = $(row).position().top + $(row).outerHeight(); this._maxAllowedVerticalPosition = Math.round(maxPosition) } return this._maxAllowedVerticalPosition }, getFixedContainer: function() { return this._$fixedContainer }, getAllDayContainer: function() { return this._$allDayContainer }, getCellIndexByCoordinates: function(coordinates, allDay) { var cellCount = this._getTotalCellCount(this._getGroupCount()), timePanelWidth = this.getTimePanelWidth(), cellWidth = Math.floor(this._getWorkSpaceWidth() / cellCount), leftOffset = this._isRTL() || this.option("crossScrollingEnabled") ? 0 : timePanelWidth, topIndex = Math.floor(coordinates.top / (allDay ? this.getAllDayHeight() : this.getCellHeight())), leftIndex = Math.floor((coordinates.left + 5 - leftOffset) / cellWidth); if (this._isRTL()) { leftIndex = cellCount - leftIndex - 1 } return cellCount * topIndex + leftIndex }, getStartViewDate: function() { return this._firstViewDate }, getEndViewDate: function() { var dateOfLastViewCell = this._getDateByCellIndexes(this._getRowCount() - 1, this._getCellCount() - 1); return new Date(dateOfLastViewCell.getTime() + this.getCellDuration() - 6e4) }, getCellDuration: function() { return 36e5 * this.option("hoursInterval") }, getGroupBounds: function(coordinates) { var cellIndex = this.getCellIndexByCoordinates(coordinates), cellCount = this._getCellCount(), groupIndex = Math.floor(cellIndex / cellCount), $cells = this._getCells(), cellWidth = this.getCellWidth(), startCellIndex = groupIndex * cellCount, startOffset = $cells.eq(startCellIndex).offset().left - cellWidth / 2, endOffset = $cells.eq(startCellIndex + cellCount - 1).offset().left + cellWidth + cellWidth / 2; var result = { left: startOffset, right: endOffset }; if (this._isRTL()) { result.left = endOffset - 2 * cellWidth; result.right = startOffset + 2 * cellWidth } return result }, getCellDataByCoordinates: function(coordinates, allDay) { var key = JSON.stringify({ top: coordinates.top, left: coordinates.left }), data = this.getCellDataCache(key); if (data) { return data } var $cells = this._getCells(allDay), cellIndex = this.getCellIndexByCoordinates(coordinates, allDay), $cell = $cells.eq(cellIndex); return this.getCellData($cell) }, getVisibleBounds: function() { var result = {}, $scrollable = this.getScrollable().element(), cellHeight = this.getCellHeight(), scrolledCellCount = this.getScrollableScrollTop() / cellHeight, totalCellCount = scrolledCellCount + $scrollable.height() / cellHeight; result.top = { hours: Math.floor(scrolledCellCount * this.option("hoursInterval")) + this.option("startDayHour"), minutes: scrolledCellCount % 2 ? 30 : 0 }; result.bottom = { hours: Math.floor(totalCellCount * this.option("hoursInterval")) + this.option("startDayHour"), minutes: Math.floor(totalCellCount) % 2 ? 30 : 0 }; return result }, updateScrollPosition: function(date) { date = this.invoke("convertDateByTimezone", date); var bounds = this.getVisibleBounds(), startDateHour = date.getHours(), startDateMinutes = date.getMinutes(); if (this.needUpdateScrollPosition(startDateHour, startDateMinutes, bounds, date)) { this.scrollToTime(startDateHour, startDateMinutes, date) } }, needUpdateScrollPosition: function(hours, minutes, bounds) { var isUpdateNeeded = false; if (hours < bounds.top.hours || hours > bounds.bottom.hours) { isUpdateNeeded = true } if (hours === bounds.top.hours && minutes < bounds.top.minutes) { isUpdateNeeded = true } if (hours === bounds.bottom.hours && minutes > bounds.top.minutes) { isUpdateNeeded = true } return isUpdateNeeded }, getGroupWidth: function(groupIndex) { var result = this._getCellCount() * this.getCellWidth(), position = this.getMaxAllowedPosition(), currentPosition = position[groupIndex]; if (position.length && currentPosition) { if (this._isRTL()) { result = currentPosition - position[groupIndex + 1] } else { if (0 === groupIndex) { result = currentPosition } else { result = currentPosition - position[groupIndex - 1] } } } return result }, restoreScrollTop: function() { this.element().scrollTop(0) }, scrollToTime: function(hours, minutes, date) { var min = this.getStartViewDate(), max = this.getEndViewDate(); if (date < min || date > max) { errors.log("W1008", date); return } var coordinates = this._getScrollCoordinates(hours, minutes, date), scrollable = this.getScrollable(); scrollable.scrollBy(coordinates.top - scrollable.scrollTop()) }, getDistanceBetweenCells: function(startIndex, endIndex) { var result = 0; this.element().find("." + this._getDateTableRowClass()).first().find("." + this._getDateTableCellClass()).each(function(index) { if (index < startIndex || index > endIndex) { return true } result += $(this).outerWidth() }); return result }, _formatWeekday: function(date) { return formatWeekday(date) }, _formatWeekdayAndDay: function(date) { return formatWeekday(date) + " " + dateLocalization.format(date, "day") } }).include(publisherMixin); registerComponent("dxSchedulerWorkSpace", SchedulerWorkSpace); module.exports = SchedulerWorkSpace }, /*!*******************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.table_creator.js ***! \*******************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9); var SchedulerTableCreator = { VERTICAL: "vertical", HORIZONTAL: "horizontal", makeTable: function(options) { var tableBody = document.createElement("tbody"), templateCallbacks = []; options.container.append(tableBody); for (var i = 0; i < options.rowCount; i++) { var row = document.createElement("tr"); tableBody.appendChild(row); if (options.rowClass) { row.className = options.rowClass } for (var j = 0; j < options.cellCount; j++) { var td = document.createElement("td"); row.appendChild(td); if (options.cellClass) { td.className = options.cellClass } var cellDataObject, dataKey, dataValue; if (options.getCellData) { cellDataObject = options.getCellData(td, i, j); dataKey = cellDataObject.key; dataValue = cellDataObject.value; dataKey && $.data(td, dataKey, dataValue) } if (options.cellTemplate && options.cellTemplate.render) { var templateOptions = { model: { text: options.getCellText ? options.getCellText(i, j, td) : "" }, container: $(td), index: i * options.cellCount + j }; if (dataValue) { if (dataValue.startDate) { templateOptions.model.startDate = dataValue.startDate } if (dataValue.endDate) { templateOptions.model.endDate = dataValue.endDate } if (dataValue.groups) { templateOptions.model.groups = dataValue.groups } if (dataValue.allDay) { templateOptions.model.allDay = dataValue.allDay } } templateCallbacks.push(options.cellTemplate.render.bind(options.cellTemplate, templateOptions)) } else { if (options.getCellText) { td.innerHTML = "<div>" + options.getCellText(i, j) + "</div>" } } } } return templateCallbacks }, makeGroupedTable: function(type, groups, cssClasses, cellCount, cellTemplate) { var rows = []; if (type === this.VERTICAL) { rows = this._makeVerticalGroupedRows(groups, cssClasses, cellTemplate) } else { rows = this._makeHorizontalGroupedRows(groups, cssClasses, cellCount, cellTemplate) } return rows }, makeGroupedTableFromJSON: function(type, data, config) { var table, cellStorage = [], rowIndex = 0; config = config || {}; var cellTag = config.cellTag || "td", childrenField = config.childrenField || "children", titleField = config.titleField || "title", groupTableClass = config.groupTableClass, groupRowClass = config.groupRowClass, groupCellClass = config.groupCellClass, groupCellCustomContent = config.groupCellCustomContent; function createTable() { table = document.createElement("table"); if (groupTableClass) { table.className = groupTableClass } } function getChildCount(item) { if (item[childrenField]) { return item[childrenField].length } return 0 } function createCell(text, childCount, index, data) { var cell = { element: document.createElement(cellTag), childCount: childCount }; if (groupCellClass) { cell.element.className = groupCellClass } var cellText = document.createTextNode(text); if ("function" === typeof groupCellCustomContent) { groupCellCustomContent(cell.element, cellText, index, data) } else { cell.element.appendChild(cellText) } return cell } function generateCells(data) { for (var i = 0; i < data.length; i++) { var childCount = getChildCount(data[i]), cell = createCell(data[i][titleField], childCount, i, data[i]); if (!cellStorage[rowIndex]) { cellStorage[rowIndex] = [] } cellStorage[rowIndex].push(cell); if (childCount) { generateCells(data[i][childrenField]) } else { rowIndex++ } } } function putCellsToRows() { cellStorage.forEach(function(cells) { var row = document.createElement("tr"); if (groupRowClass) { row.className = groupRowClass } var rowspans = []; for (var i = cells.length - 1; i >= 0; i--) { var prev = cells[i + 1], rowspan = cells[i].childCount; if (prev && prev.childCount) { rowspan *= prev.childCount } rowspans.push(rowspan) } rowspans.reverse(); cells.forEach(function(cell, index) { if (rowspans[index]) { cell.element.setAttribute("rowspan", rowspans[index]) } row.appendChild(cell.element) }); table.appendChild(row) }) } createTable(); generateCells(data); putCellsToRows(); return table }, _makeVerticalGroupedRows: function(groups, cssClasses, cellTemplate) { var i, cellTemplates = [], repeatCount = 1, arr = []; var cellIterator = function(cell) { if (cell.template) { cellTemplates.push(cell.template) } }; for (i = 0; i < groups.length; i++) { if (i > 0) { repeatCount = groups[i - 1].items.length * repeatCount } var cells = this._makeGroupedRowCells(groups[i], repeatCount, cssClasses, cellTemplate); cells.forEach(cellIterator); arr.push(cells) } var rows = [], groupCount = arr.length, maxCellCount = arr[groupCount - 1].length; for (i = 0; i < maxCellCount; i++) { rows.push($("<tr>").addClass(cssClasses.groupHeaderRowClass)) } for (i = groupCount - 1; i >= 0; i--) { var currentColumnLength = arr[i].length, rowspan = maxCellCount / currentColumnLength; for (var j = 0; j < currentColumnLength; j++) { var currentRowIndex = j * rowspan, row = rows[currentRowIndex]; row.prepend(arr[i][j].element.attr("rowspan", rowspan)) } } return { elements: rows, cellTemplates: cellTemplates } }, _makeHorizontalGroupedRows: function(groups, cssClasses, cellCount, cellTemplate) { var repeatCount = 1, groupCount = groups.length, rows = [], cellTemplates = []; var cellIterator = function(cell) { if (cell.template) { cellTemplates.push(cell.template) } return cell.element }; for (var i = 0; i < groupCount; i++) { if (i > 0) { repeatCount = groups[i - 1].items.length * repeatCount } var cells = this._makeGroupedRowCells(groups[i], repeatCount, cssClasses, cellTemplate); rows.push($("<tr>").addClass(cssClasses.groupRowClass).append(cells.map(cellIterator))) } var maxCellCount = rows[groupCount - 1].find("th").length; for (var j = 0; j < groupCount; j++) { var $cell = rows[j].find("th"), colspan = maxCellCount / $cell.length * cellCount; if (colspan > 1) { $cell.attr("colspan", colspan) } } return { elements: rows, cellTemplates: cellTemplates } }, _makeGroupedRowCells: function(group, repeatCount, cssClasses, cellTemplate) { var cells = [], items = group.items, itemCount = items.length; for (var i = 0; i < repeatCount; i++) { for (var j = 0; j < itemCount; j++) { var $container = $("<div/>"), cell = {}; if (cellTemplate && cellTemplate.render) { var templateOptions = { model: items[j], container: $container, index: i * itemCount + j }; if (group.data) { templateOptions.model.data = group.data[j] } cell.template = cellTemplate.render.bind(cellTemplate, templateOptions) } else { $container.text(items[j].text); $container = $("<div/>").append($container) } $container.addClass(cssClasses.groupHeaderContentClass); cell.element = $("<th>").addClass(cssClasses.groupHeaderClass).append($container); cells.push(cell) } } return cells } }; module.exports = SchedulerTableCreator }, /*!*********************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.work_space_week.js ***! \*********************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), SchedulerWorkSpace = __webpack_require__( /*! ./ui.scheduler.work_space */ 479); var WEEK_CLASS = "dx-scheduler-work-space-week"; var SchedulerWorkSpaceWeek = SchedulerWorkSpace.inherit({ _getElementClass: function() { return WEEK_CLASS }, _getRowCount: function() { return this._getCellCountInDay() }, _getCellCount: function() { return 7 }, _getDateByIndex: function(headerIndex) { var resultDate = new Date(this._firstViewDate); resultDate.setDate(this._firstViewDate.getDate() + headerIndex); return resultDate }, _getFormat: function() { return this._formatWeekdayAndDay }, _getCellsBetween: function($first, $last) { if (this._hasAllDayClass($last)) { return this.callBase($first, $last) } var $cells = this._getCells(), firstColumn = $first.index(), firstRow = $first.parent().index(), lastColumn = $last.index(), lastRow = $last.parent().index(), groupCount = this._getGroupCount(), cellCount = groupCount > 0 ? this._getTotalCellCount(groupCount) : this._getCellCount(), rowCount = this._getTotalRowCount(groupCount), result = []; for (var i = 0; i < cellCount; i++) { for (var j = 0; j < rowCount; j++) { var cell = $cells.get(cellCount * j + i); result.push(cell) } } var newFirstIndex = rowCount * firstColumn + firstRow, newLastIndex = rowCount * lastColumn + lastRow; if (newFirstIndex > newLastIndex) { var buffer = newFirstIndex; newFirstIndex = newLastIndex; newLastIndex = buffer } $cells = $(result).slice(newFirstIndex, newLastIndex + 1); if (!!this._getGroupCount()) { var arr = [], focusedGroupIndex = this._getGroupIndexByCell($first); $.each($cells, function(_, cell) { var groupIndex = this._getGroupIndexByCell($(cell)); if (focusedGroupIndex === groupIndex) { arr.push(cell) } }.bind(this)); $cells = $(arr) } return $cells }, _getRightCell: function(isMultiSelection) { if (!isMultiSelection) { return this.callBase(isMultiSelection) } var $rightCell, $focusedCell = this._$focusedCell, groupCount = this._getGroupCount(), rowCellCount = isMultiSelection ? this._getCellCount() : this._getTotalCellCount(groupCount), edgeCellIndex = this._isRTL() ? 0 : rowCellCount - 1, direction = this._isRTL() ? "prev" : "next"; if ($focusedCell.index() === edgeCellIndex || this._isGroupEndCell($focusedCell)) { $rightCell = $focusedCell } else { $rightCell = $focusedCell[direction](); $rightCell = this._checkForViewBounds($rightCell) } return $rightCell }, _getLeftCell: function(isMultiSelection) { if (!isMultiSelection) { return this.callBase(isMultiSelection) } var $leftCell, $focusedCell = this._$focusedCell, groupCount = this._getGroupCount(), rowCellCount = isMultiSelection ? this._getCellCount() : this._getTotalCellCount(groupCount), edgeCellIndex = this._isRTL() ? rowCellCount - 1 : 0, direction = this._isRTL() ? "next" : "prev"; if ($focusedCell.index() === edgeCellIndex || this._isGroupStartCell($focusedCell)) { $leftCell = $focusedCell } else { $leftCell = $focusedCell[direction](); $leftCell = this._checkForViewBounds($leftCell) } return $leftCell } }); registerComponent("dxSchedulerWorkSpaceWeek", SchedulerWorkSpaceWeek); module.exports = SchedulerWorkSpaceWeek }, /*!**************************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.work_space_work_week.js ***! \**************************************************************/ function(module, exports, __webpack_require__) { var registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), SchedulerWorkSpaceWeek = __webpack_require__( /*! ./ui.scheduler.work_space_week */ 481), dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63), dateLocalization = __webpack_require__( /*! ../../localization/date */ 33); var WORK_WEEK_CLASS = "dx-scheduler-work-space-work-week"; var weekendCounter = 0; var SchedulerWorkSpaceWorkWeek = SchedulerWorkSpaceWeek.inherit({ _getElementClass: function() { return WORK_WEEK_CLASS }, _getCellCount: function() { return 5 }, _firstDayOfWeek: function() { return this.option("firstDayOfWeek") || 1 }, _getDateByIndex: function(headerIndex) { var resultDate = new Date(this._firstViewDate); resultDate.setDate(this._firstViewDate.getDate() + headerIndex + weekendCounter); var day = resultDate.getDay(); if (day % 6 === 0) { weekendCounter = Math.floor(day / 6 + 1); resultDate.setDate(resultDate.getDate() + weekendCounter) } return resultDate }, _renderView: function() { weekendCounter = 0; this.callBase() }, _setFirstViewDate: function() { this._firstViewDate = dateUtils.getFirstWeekDate(this.option("currentDate"), this._firstDayOfWeek() || dateLocalization.firstDayOfWeekIndex()); this._firstViewDate = dateUtils.normalizeDateByWeek(this._firstViewDate, this.option("currentDate")); this._setStartDayHour(this._firstViewDate) } }); registerComponent("dxSchedulerWorkSpaceWorkWeek", SchedulerWorkSpaceWorkWeek); module.exports = SchedulerWorkSpaceWorkWeek }, /*!**********************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.work_space_month.js ***! \**********************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), SchedulerWorkSpace = __webpack_require__( /*! ./ui.scheduler.work_space */ 479), dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63), dateLocalization = __webpack_require__( /*! ../../localization/date */ 33); var MONTH_CLASS = "dx-scheduler-work-space-month", DATE_TABLE_CURRENT_DATE_CLASS = "dx-scheduler-date-table-current-date", DATE_TABLE_OTHER_MONTH_DATE_CLASS = "dx-scheduler-date-table-other-month"; var DAYS_IN_WEEK = 7, DAY_IN_MILLISECONDS = 864e5; var SchedulerWorkSpaceMonth = SchedulerWorkSpace.inherit({ _getElementClass: function() { return MONTH_CLASS }, _getRowCount: function() { return 6 }, _getCellCount: function() { return DAYS_IN_WEEK }, _getDateByIndex: function(headerIndex) { var resultDate = new Date(this._firstViewDate); resultDate.setDate(this._firstViewDate.getDate() + headerIndex); return resultDate }, _getFormat: function() { return this._formatWeekday }, _calculateCellIndex: function(rowIndex, cellIndex) { cellIndex %= this._getCellCount(); return rowIndex * this._getCellCount() + cellIndex }, _getInterval: function() { return DAY_IN_MILLISECONDS }, _getIntervalBetween: function(currentDate) { var firstViewDate = this.getStartViewDate(), timeZoneOffset = dateUtils.getTimezonesDifference(firstViewDate, currentDate); return currentDate.getTime() - (firstViewDate.getTime() - 36e5 * this.option("startDayHour")) - timeZoneOffset }, _getDateByCellIndexes: function(rowIndex, cellIndex) { var date = this.callBase(rowIndex, cellIndex); this._setStartDayHour(date); return date }, _calculateHiddenInterval: function() { return 0 }, _getCellCoordinatesByIndex: function(index) { var rowIndex = Math.floor(index / this._getCellCount()), cellIndex = index - this._getCellCount() * rowIndex; return { rowIndex: rowIndex, cellIndex: cellIndex } }, _renderTimePanel: noop, _renderAllDayPanel: noop, _getTableAllDay: noop, _toggleAllDayVisibility: noop, _changeAllDayVisibility: noop, _setFirstViewDate: function() { var firstMonthDate = dateUtils.getFirstMonthDate(this.option("currentDate")); this._firstViewDate = dateUtils.getFirstWeekDate(firstMonthDate, this.option("firstDayOfWeek") || dateLocalization.firstDayOfWeekIndex()); this._setStartDayHour(this._firstViewDate) }, _renderTableBody: function(options) { options.getCellText = this._getCellText.bind(this); this.callBase(options) }, _getCellText: function(rowIndex, cellIndex) { cellIndex %= this._getCellCount(); var date = this._getDate(rowIndex, cellIndex); return dateLocalization.format(date, "dd") }, _getDate: function(week, day) { var result = new Date(this._firstViewDate); result.setDate(result.getDate() + week * DAYS_IN_WEEK + day); return result }, _updateIndex: function(index) { return index }, _prepareCellData: function(rowIndex, cellIndex, cell) { var data = this.callBase(rowIndex, cellIndex, cell), $cell = $(cell); $cell.toggleClass(DATE_TABLE_CURRENT_DATE_CLASS, this._isCurrentDate(data.startDate)).toggleClass(DATE_TABLE_OTHER_MONTH_DATE_CLASS, this._isOtherMonth(data.startDate)); return data }, _isCurrentDate: function(cellDate) { var today = new Date; return dateUtils.sameDate(cellDate, today) }, _isOtherMonth: function(cellDate) { return cellDate.getMonth() !== this.option("currentDate").getMonth() }, getCellDuration: function() { return 36e5 * this._calculateDayDuration() }, getTimePanelWidth: function() { return 0 }, getPositionShift: function() { return { top: 0, left: 0 } }, getCoordinatesByDates: function(startDate, endDate) { var result = [], date = new Date(startDate); while (date <= endDate) { result.push(this.getCoordinatesByDate(date)); date.setDate(date.getDate() + 7); date = dateUtils.getFirstWeekDate(date, this.option("firstDayOfWeek") || dateLocalization.firstDayOfWeekIndex()) } return result }, getCellCountToLastViewDate: function(date) { var firstDateTime = date.getTime(), lastDateTime = this.getEndViewDate().getTime(), dayDurationInMs = this.getCellDuration(); return Math.ceil((lastDateTime - firstDateTime) / dayDurationInMs) }, supportAllDayRow: function() { return false }, keepOriginalHours: function() { return true }, calculateEndDate: function(startDate) { var startDateCopy = new Date(startDate); return new Date(startDateCopy.setHours(this.option("endDayHour"))) }, _getCellPositionByIndex: function(index, groupIndex) { var position = this.callBase(index, groupIndex), rowIndex = this._getCellCoordinatesByIndex(index).rowIndex, calculatedTopOffset = this.getCellHeight() * rowIndex; if (calculatedTopOffset) { position.top = calculatedTopOffset } return position }, scrollToTime: noop }); registerComponent("dxSchedulerWorkSpaceMonth", SchedulerWorkSpaceMonth); module.exports = SchedulerWorkSpaceMonth }, /*!******************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.timeline_day.js ***! \******************************************************/ function(module, exports, __webpack_require__) { var registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), SchedulerTimeline = __webpack_require__( /*! ./ui.scheduler.timeline */ 485); var TIMELINE_CLASS = "dx-scheduler-timeline-day"; var SchedulerTimelineDay = SchedulerTimeline.inherit({ _getElementClass: function() { return TIMELINE_CLASS }, _setFirstViewDate: function() { this._firstViewDate = this.option("currentDate"); this._setStartDayHour(this._firstViewDate) } }); registerComponent("dxSchedulerTimelineDay", SchedulerTimelineDay); module.exports = SchedulerTimelineDay }, /*!**************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.timeline.js ***! \**************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), SchedulerWorkSpace = __webpack_require__( /*! ./ui.scheduler.work_space */ 479), dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63), tableCreator = __webpack_require__( /*! ./ui.scheduler.table_creator */ 480); var TIMELINE_CLASS = "dx-scheduler-timeline", GROUP_TABLE_CLASS = "dx-scheduler-group-table"; var HORIZONTAL = "horizontal", DATE_TABLE_CELL_HEIGHT = 75, DATE_TABLE_CELL_BORDER = 1, toMs = dateUtils.dateToMilliseconds; var SchedulerTimeline = SchedulerWorkSpace.inherit({ _init: function() { this.callBase(); this.element().addClass(TIMELINE_CLASS); this._$sidebarTable = $("<table>").addClass(GROUP_TABLE_CLASS) }, _getCellFromNextRow: function(direction, isMultiSelection) { if (!isMultiSelection) { return this.callBase(direction, isMultiSelection) } return this._$focusedCell }, _getRightCell: function() { var $rightCell, $focusedCell = this._$focusedCell, rowCellCount = this._getCellCount(), edgeCellIndex = this._isRTL() ? 0 : rowCellCount - 1, direction = this._isRTL() ? "prev" : "next"; if ($focusedCell.index() === edgeCellIndex) { $rightCell = $focusedCell } else { $rightCell = $focusedCell[direction](); $rightCell = this._checkForViewBounds($rightCell) } return $rightCell }, _getLeftCell: function() { var $leftCell, $focusedCell = this._$focusedCell, rowCellCount = this._getCellCount(), edgeCellIndex = this._isRTL() ? rowCellCount - 1 : 0, direction = this._isRTL() ? "next" : "prev"; if ($focusedCell.index() === edgeCellIndex) { $leftCell = $focusedCell } else { $leftCell = $focusedCell[direction](); $leftCell = this._checkForViewBounds($leftCell) } return $leftCell }, _getRowCount: function() { return 1 }, _getCellCount: function() { return this._getCellCountInDay() }, _getTotalCellCount: function() { return this._getCellCount() }, _getTotalRowCount: function(groupCount) { groupCount = groupCount || 1; return this._getRowCount() * groupCount }, _getDateByIndex: function(index) { var resultDate = new Date(this._firstViewDate), dayIndex = Math.floor(index / this._getCellCountInDay()); resultDate.setTime(this._firstViewDate.getTime() + this._calculateCellIndex(0, index) * this._getInterval() + dayIndex * this._getHiddenInterval()); return resultDate }, _getFormat: function() { return "shorttime" }, _calculateHiddenInterval: function(rowIndex, cellIndex) { var dayIndex = Math.floor(cellIndex / this._getCellCountInDay()); return dayIndex * this._getHiddenInterval() }, _createWorkSpaceElements: function() { this._createWorkSpaceScrollableElements() }, _getWorkSpaceHeight: function() { if (this.option("crossScrollingEnabled")) { return this._$dateTable.outerHeight() } return this.element().outerHeight() }, _dateTableScrollableConfig: function() { var that = this, config = this.callBase(), timelineConfig = { direction: HORIZONTAL, onScroll: function(e) { if (!that._dateTableScrollWasHandled) { that._headerScrollWasHandled = true; that._headerScrollable.scrollTo({ left: e.scrollOffset.left }) } else { that._dateTableScrollWasHandled = false } } }; return this.option("crossScrollingEnabled") ? config : extend(config, timelineConfig) }, _renderTimePanel: noop, _renderAllDayPanel: noop, _getTableAllDay: function() { return false }, _getDateHeaderTemplate: function() { return this.option("timeCellTemplate") }, _toggleAllDayVisibility: noop, _changeAllDayVisibility: noop, supportAllDayRow: function() { return false }, _getGroupHeaderContainer: function() { return this._$sidebarTable }, _renderView: function() { this._setFirstViewDate(); var groupCellTemplates = this._renderGroupHeader(); this._renderDateHeader(); this._renderAllDayPanel(); this._renderTimePanel(); this._renderDateTable(); this._$sidebarTable.appendTo(this._sidebarScrollable.content()); this._setGroupHeaderCellsHeight(); this._applyCellTemplates(groupCellTemplates) }, _cleanView: function() { this.callBase(); this._$sidebarTable.empty() }, _visibilityChanged: function(visible) { this._setGroupHeaderCellsHeight(); this.callBase(visible) }, _setTableSizes: function() { this.callBase(); var cellHeight = DATE_TABLE_CELL_HEIGHT, minHeight = this._getWorkSpaceMinHeight(), $groupCells = this._$sidebarTable.find("tr"); var height = cellHeight * $groupCells.length; if (height < minHeight) { height = minHeight } this._$sidebarTable.height(height); this._$dateTable.height(height) }, _getWorkSpaceMinHeight: function() { var minHeight = this._getWorkSpaceHeight(), workspaceContainerHeight = this.element().outerHeight(true) - this.getHeaderPanelHeight(); if (minHeight < workspaceContainerHeight) { minHeight = workspaceContainerHeight } return minHeight }, _makeGroupRows: function(groups) { return tableCreator.makeGroupedTable(tableCreator.VERTICAL, groups, { groupHeaderRowClass: this._getGroupRowClass(), groupHeaderClass: this._getGroupHeaderClass(), groupHeaderContentClass: this._getGroupHeaderContentClass() }, void 0, this.option("resourceCellTemplate")) }, _setGroupHeaderCellsHeight: function() { var cellHeight = this.getCellHeight() - 2 * DATE_TABLE_CELL_BORDER; cellHeight = this._ensureGroupHeaderCellsHeight(cellHeight); this._getGroupHeaderCellsContent().css("height", cellHeight) }, _ensureGroupHeaderCellsHeight: function(cellHeight) { var minCellHeight = this._calculateMinCellHeight(); if (cellHeight < minCellHeight) { return minCellHeight } return cellHeight }, _calculateMinCellHeight: function() { var dateTable = this._getDateTable(), dateTableRowSelector = "." + this._getDateTableRowClass(); return dateTable.outerHeight() / dateTable.find(dateTableRowSelector).length - 2 * DATE_TABLE_CELL_BORDER }, _attachGroupCountAttr: function() { this.element().attr("dx-group-column-count", this.option("groups").length) }, _getCellCoordinatesByIndex: function(index) { return { cellIndex: index % this._getCellCount(), rowIndex: 0 } }, _getCellByCoordinates: function(cellCoordinates, groupIndex) { return this._$dateTable.find("tr").eq(cellCoordinates.rowIndex + groupIndex).find("td").eq(cellCoordinates.cellIndex) }, _calculateCellIndex: function(rowIndex, cellIndex) { return cellIndex }, _getGroupIndex: function(rowIndex) { return rowIndex }, _getWorkSpaceWidth: function() { return this._$dateTable.outerWidth(true) }, _calculateHeaderCellRepeatCount: function() { return 1 }, _getGroupIndexByCell: function($cell) { return $cell.parent().index() }, _getIntervalBetween: function(currentDate, allDay) { var startDayHour = this.option("startDayHour"), endDayHour = this.option("endDayHour"), firstViewDate = this.getStartViewDate(), firstViewDateTime = firstViewDate.getTime(), hiddenInterval = (24 - endDayHour + startDayHour) * toMs("hour"), timeZoneOffset = dateUtils.getTimezonesDifference(firstViewDate, currentDate), apptStart = currentDate.getTime(), fullInterval = apptStart - firstViewDateTime - timeZoneOffset, fullDays = Math.floor(fullInterval / toMs("day")), tailDuration = fullInterval - fullDays * toMs("day"), tailDelta = 0, cellCount = this._getCellCountInDay() * fullDays, gapBeforeAppt = apptStart - dateUtils.trimTime(new Date(currentDate)).getTime(), result = cellCount * this.option("hoursInterval") * toMs("hour"); if (!allDay) { if (currentDate.getHours() < startDayHour) { tailDelta = tailDuration - hiddenInterval + gapBeforeAppt } else { if (currentDate.getHours() >= startDayHour && currentDate.getHours() < endDayHour) { tailDelta = tailDuration } else { if (currentDate.getHours() >= startDayHour && currentDate.getHours() >= endDayHour) { tailDelta = tailDuration - (gapBeforeAppt - endDayHour * toMs("hour")) } else { if (!fullDays) { result = fullInterval } } } } result += tailDelta } return result }, getAllDayContainer: function() { return null }, getTimePanelWidth: function() { return 0 }, getPositionShift: function(timeShift) { var positionShift = this.callBase(timeShift), left = this.getCellWidth() * timeShift; if (this.option("rtlEnabled")) { left *= -1 } left += positionShift.left; return { top: 0, left: left } }, getVisibleBounds: function() { var isRtl = this.option("rtlEnabled"); var result = {}, $scrollable = this.getScrollable().element(), cellWidth = this.getCellWidth(), scrollableOffset = isRtl ? this.getScrollableOuterWidth() - this.getScrollableScrollLeft() : this.getScrollableScrollLeft(), scrolledCellCount = scrollableOffset / cellWidth, visibleCellCount = $scrollable.width() / cellWidth, totalCellCount = isRtl ? scrolledCellCount - visibleCellCount : scrolledCellCount + visibleCellCount, leftDate = this._getDateByIndex(scrolledCellCount), rightDate = this._getDateByIndex(totalCellCount); if (isRtl) { leftDate = this._getDateByIndex(totalCellCount); rightDate = this._getDateByIndex(scrolledCellCount) } result.left = { hours: leftDate.getHours(), minutes: leftDate.getMinutes() >= 30 ? 30 : 0, date: dateUtils.trimTime(leftDate) }; result.right = { hours: rightDate.getHours(), minutes: rightDate.getMinutes() >= 30 ? 30 : 0, date: dateUtils.trimTime(rightDate) }; return result }, needUpdateScrollPosition: function(hours, minutes, bounds, date) { var isUpdateNeeded = false; isUpdateNeeded = this._dateWithinBounds(bounds, date); if (hours < bounds.left.hours || hours > bounds.right.hours) { isUpdateNeeded = true } if (hours === bounds.left.hours && minutes < bounds.left.minutes) { isUpdateNeeded = true } if (hours === bounds.right.hours && minutes > bounds.right.minutes) { isUpdateNeeded = true } return isUpdateNeeded }, _dateWithinBounds: function(bounds, date) { var trimmedDate = dateUtils.trimTime(new Date(date)), isUpdateNeeded = false; if (trimmedDate.getTime() < bounds.left.date.getTime() || trimmedDate.getTime() > bounds.right.date.getTime()) { isUpdateNeeded = true } return isUpdateNeeded }, scrollToTime: function(hours, minutes, date) { var coordinates = this._getScrollCoordinates(hours, minutes, date), scrollable = this.getScrollable(), offset = this.option("rtlEnabled") ? this.getScrollableContainer().outerWidth() : 0; scrollable.scrollBy({ left: coordinates.left - scrollable.scrollLeft() - offset, top: 0 }) } }); registerComponent("dxSchedulerTimeline", SchedulerTimeline); module.exports = SchedulerTimeline }, /*!*******************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.timeline_week.js ***! \*******************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), SchedulerTimeline = __webpack_require__( /*! ./ui.scheduler.timeline */ 485); var TIMELINE_CLASS = "dx-scheduler-timeline-week", HEADER_PANEL_CELL_CLASS = "dx-scheduler-header-panel-cell", HEADER_ROW_CLASS = "dx-scheduler-header-row", CELL_WIDTH = 200; var SchedulerTimelineWeek = SchedulerTimeline.inherit({ _getElementClass: function() { return TIMELINE_CLASS }, _getCellCount: function() { return this.callBase() * this._getWeekDuration() }, _renderDateHeader: function() { var $headerRow = this.callBase(), firstViewDate = new Date(this._firstViewDate), $cells = [], colspan = this._getCellCountInDay(), cellTemplate = this.option("dateCellTemplate"), headerCellWidth = colspan * CELL_WIDTH; for (var i = 0; i < this._getWeekDuration(); i++) { var $th = $("<th>"), text = this._formatWeekdayAndDay(firstViewDate); if (cellTemplate) { var templateOptions = { model: { text: text, date: firstViewDate }, container: $th, index: i }; cellTemplate.render(templateOptions) } else { $th.text(text) } $th.addClass(HEADER_PANEL_CELL_CLASS).attr("colspan", colspan).width(headerCellWidth); $cells.push($th); firstViewDate.setDate(firstViewDate.getDate() + 1) } var $row = $("<tr>").addClass(HEADER_ROW_CLASS).append($cells); $headerRow.before($row) }, _getWeekDuration: function() { return 7 } }); registerComponent("dxSchedulerTimelineWeek", SchedulerTimelineWeek); module.exports = SchedulerTimelineWeek }, /*!************************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.timeline_work_week.js ***! \************************************************************/ function(module, exports, __webpack_require__) { var registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), SchedulerTimelineWeek = __webpack_require__( /*! ./ui.scheduler.timeline_week */ 486), dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63); var TIMELINE_CLASS = "dx-scheduler-timeline-work-week", MONDAY_INDEX = 1; var SchedulerTimelineWorkWeek = SchedulerTimelineWeek.inherit({ _getElementClass: function() { return TIMELINE_CLASS }, _getWeekDuration: function() { return 5 }, _firstDayOfWeek: function() { return this.option("firstDayOfWeek") || MONDAY_INDEX }, _setFirstViewDate: function() { this._firstViewDate = dateUtils.getFirstWeekDate(this.option("currentDate"), this._firstDayOfWeek()); this._firstViewDate = dateUtils.normalizeDateByWeek(this._firstViewDate, this.option("currentDate")); this._setStartDayHour(this._firstViewDate) } }); registerComponent("dxSchedulerTimelineWorkWeek", SchedulerTimelineWorkWeek); module.exports = SchedulerTimelineWorkWeek }, /*!********************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.timeline_month.js ***! \********************************************************/ function(module, exports, __webpack_require__) { var registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), SchedulerTimeline = __webpack_require__( /*! ./ui.scheduler.timeline */ 485), dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63); var TIMELINE_CLASS = "dx-scheduler-timeline-month", DAY_IN_MILLISECONDS = 864e5; var SchedulerTimelineMonth = SchedulerTimeline.inherit({ _getElementClass: function() { return TIMELINE_CLASS }, _getDateHeaderTemplate: function() { return this.option("dateCellTemplate") }, _getCellCount: function() { var currentDate = this.option("currentDate"); return new Date(currentDate.getFullYear(), currentDate.getMonth() + 1, 0).getDate() }, _setFirstViewDate: function() { this._firstViewDate = dateUtils.getFirstMonthDate(this.option("currentDate")); this._setStartDayHour(this._firstViewDate) }, _getFormat: function() { return this._formatWeekdayAndDay }, _getDateByIndex: function(headerIndex) { var resultDate = new Date(this._firstViewDate); resultDate.setDate(this._firstViewDate.getDate() + headerIndex); return resultDate }, _getInterval: function() { return DAY_IN_MILLISECONDS }, _getIntervalBetween: function(currentDate) { var firstViewDate = this.getStartViewDate(), timeZoneOffset = dateUtils.getTimezonesDifference(firstViewDate, currentDate); return currentDate.getTime() - (firstViewDate.getTime() - 36e5 * this.option("startDayHour")) - timeZoneOffset }, calculateEndDate: function(startDate) { var startDateCopy = new Date(startDate); return new Date(startDateCopy.setHours(this.option("endDayHour"))) }, _calculateHiddenInterval: function() { return 0 }, _getDateByCellIndexes: function(rowIndex, cellIndex) { var date = this.callBase(rowIndex, cellIndex); this._setStartDayHour(date); return date }, needUpdateScrollPosition: function(hours, minutes, bounds, date) { return this._dateWithinBounds(bounds, date) }, getPositionShift: function() { return { top: 0, left: 0 } } }); registerComponent("dxSchedulerTimelineMonth", SchedulerTimelineMonth); module.exports = SchedulerTimelineMonth }, /*!************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.agenda.js ***! \************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), SchedulerWorkSpace = __webpack_require__( /*! ./ui.scheduler.work_space */ 479), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, dateLocalization = __webpack_require__( /*! ../../localization/date */ 33), tableCreator = __webpack_require__( /*! ./ui.scheduler.table_creator */ 480); var AGENDA_CLASS = "dx-scheduler-agenda", AGENDA_DATE_CLASS = "dx-scheduler-agenda-date", AGENDA_WEEK_DAY_CLASS = "dx-scheduler-agenda-week-day", GROUP_TABLE_CLASS = "dx-scheduler-group-table", TIME_PANEL_ROW_CLASS = "dx-scheduler-time-panel-row", TIME_PANEL_CELL_CLASS = "dx-scheduler-time-panel-cell", NODATA_CONTAINER_CLASS = "dx-scheduler-agenda-nodata", LAST_ROW_CLASS = "dx-scheduler-date-table-last-row", INNER_CELL_MARGIN = 5, OUTER_CELL_MARGIN = 20; var SchedulerAgenda = SchedulerWorkSpace.inherit({ _activeStateUnit: void 0, _getDefaultOptions: function() { return extend(this.callBase(), { agendaDuration: 7, rowHeight: 60, noDataText: "" }) }, _optionChanged: function(args) { var name = args.name, value = args.value; switch (name) { case "agendaDuration": break; case "noDataText": case "rowHeight": this._cleanView(); this._renderView(); break; case "groups": if (!value || !value.length) { if (this._$groupTable) { this._$groupTable.remove(); this._$groupTable = null } } else { if (!this._$groupTable) { this._initGroupTable(); this._dateTableScrollable.content().prepend(this._$groupTable) } } this.callBase(args); break; default: this.callBase(args) } }, _renderFocusState: noop, _cleanFocusState: noop, _getElementClass: function() { return AGENDA_CLASS }, _setFirstViewDate: function() { this._firstViewDate = new Date(this.option("currentDate")); this._setStartDayHour(this._firstViewDate) }, _getRowCount: function() { return this.option("agendaDuration") }, _getCellCount: function() { return 1 }, _getTimePanelRowCount: function() { return this.option("agendaDuration") }, _getDateByIndex: noop, _getFormat: function() { return "d ddd" }, _renderAllDayPanel: noop, _toggleAllDayVisibility: noop, _initWorkSpaceUnits: function() { this._initGroupTable(); this._$timePanel = $("<table>").addClass(this._getTimePanelClass()); this._$dateTable = $("<table>").addClass(this._getDateTableClass()) }, _initGroupTable: function() { var groups = this.option("groups"); if (groups && groups.length) { this._$groupTable = $("<table>").addClass(GROUP_TABLE_CLASS) } }, _renderView: function() { var cellTemplates = []; this._setFirstViewDate(); this._rows = []; this.invoke("getAgendaRows", { agendaDuration: this.option("agendaDuration"), currentDate: new Date(this.option("currentDate")) }).done(function(rows) { this._cleanView(); if (this._rowsIsEmpty(rows)) { this._renderNoData(); return } this._rows = rows; if (this._$groupTable) { cellTemplates = this._renderGroupHeader(); this._setGroupHeaderCellsHeight() } this._renderTimePanel(); this._renderDateTable(); this.invoke("agendaIsReady", rows, INNER_CELL_MARGIN, OUTER_CELL_MARGIN); this._applyCellTemplates(cellTemplates); this._dateTableScrollable.update() }.bind(this)) }, _renderNoData: function() { this._$noDataContainer = $("<div>").addClass(NODATA_CONTAINER_CLASS).html(this.option("noDataText")); this._dateTableScrollable.content().append(this._$noDataContainer) }, _setTableSizes: noop, _toggleHorizontalScrollClass: noop, _createCrossScrollingConfig: noop, _setGroupHeaderCellsHeight: function() { var $cells = this._getGroupHeaderCells().filter(function(_, element) { return !element.getAttribute("rowspan") }), rows = this._removeEmptyRows(this._rows); if (!rows.length) { return } for (var i = 0; i < $cells.length; i++) { var $cellContent = $cells.eq(i).find(".dx-scheduler-group-header-content"); $cellContent.outerHeight(this._getGroupRowHeight(rows[i])) } }, _rowsIsEmpty: function(rows) { var result = true; for (var i = 0; i < rows.length; i++) { var groupRow = rows[i]; for (var j = 0; j < groupRow.length; j++) { if (groupRow[j]) { result = false; break } } } return result }, _attachGroupCountAttr: function() { this.element().attr("dx-group-column-count", this.option("groups").length) }, _removeEmptyRows: function(rows) { var result = [], isEmpty = function(data) { return !data.some(function(value) { return value > 0 }) }; for (var i = 0; i < rows.length; i++) { if (rows[i].length && !isEmpty(rows[i])) { result.push(rows[i]) } } return result }, _getGroupHeaderContainer: function() { return this._$groupTable }, _makeGroupRows: function() { var tree = this.invoke("createReducedResourcesTree"), cellTemplate = this.option("resourceCellTemplate"), getGroupHeaderContentClass = this._getGroupHeaderContentClass(), cellTemplates = []; var table = tableCreator.makeGroupedTableFromJSON(tableCreator.VERTICAL, tree, { cellTag: "th", groupTableClass: GROUP_TABLE_CLASS, groupRowClass: this._getGroupRowClass(), groupCellClass: this._getGroupHeaderClass(), groupCellCustomContent: function(cell, cellText, index, data) { var container = document.createElement("div"), contentWrapper = document.createElement("div"); container.className = getGroupHeaderContentClass; contentWrapper.appendChild(cellText); container.appendChild(contentWrapper); container.className = getGroupHeaderContentClass; if (cellTemplate && cellTemplate.render) { cellTemplates.push(cellTemplate.render.bind(cellTemplate, { model: { data: data.data, id: data.value, color: data.color, text: cellText.textContent }, container: $(container), index: index })) } else { contentWrapper.appendChild(cellText); container.appendChild(contentWrapper) } cell.appendChild(container) }, cellTemplate: cellTemplate }); return { elements: $(table).find("." + this._getGroupRowClass()), cellTemplates: cellTemplates } }, _cleanView: function() { this._$dateTable.empty(); this._$timePanel.empty(); if (this._$groupTable) { this._$groupTable.empty() } if (this._$noDataContainer) { this._$noDataContainer.empty(); this._$noDataContainer.remove(); delete this._$noDataContainer } }, _createWorkSpaceElements: function() { this._createWorkSpaceStaticElements() }, _createWorkSpaceStaticElements: function() { if (this._$groupTable) { this._dateTableScrollable.content().prepend(this._$groupTable) } this._dateTableScrollable.content().append(this._$timePanel, this._$dateTable); this.element().append(this._dateTableScrollable.element()) }, _renderDateTable: function() { this._renderTableBody({ container: this._$dateTable, rowClass: this._getDateTableRowClass(), cellClass: this._getDateTableCellClass() }) }, _attachTablesEvents: noop, _attachEvents: noop, _cleanCellDataCache: noop, _prepareCellTemplateOptions: function(text, date, rowIndex, $cell) { var groupsOpt = this.option("groups"), groups = {}, path = groupsOpt.length && this._getPathToLeaf(rowIndex) || []; path.forEach(function(resourceValue, resourceIndex) { var resourceName = groupsOpt[resourceIndex].name; groups[resourceName] = resourceValue }); return { model: { text: text, date: date, groups: groups }, container: $cell, index: rowIndex } }, _renderTableBody: function(options) { var cellTemplates = [], cellTemplateOpt = options.cellTemplate; this._$rows = []; var fillTableBody = function(rowIndex, rowSize) { if (rowSize) { var date, cellDateNumber, cellDayName, $row = $("<tr>"), $td = $("<td>").height(this._getRowHeight(rowSize)); if (options.getStartDate) { date = options.getStartDate && options.getStartDate(rowIndex); cellDateNumber = dateLocalization.format(date, "d"); cellDayName = dateLocalization.format(date, this._formatWeekday) } if (cellTemplateOpt && cellTemplateOpt.render) { var templateOptions = this._prepareCellTemplateOptions(cellDateNumber + " " + cellDayName, date, i, $td); cellTemplates.push(cellTemplateOpt.render.bind(cellTemplateOpt, templateOptions)) } else { if (cellDateNumber && cellDayName) { $td.append([$("<span />").addClass(AGENDA_DATE_CLASS).text(cellDateNumber), $("<span />").addClass(AGENDA_WEEK_DAY_CLASS).text(cellDayName)]) } } if (options.rowClass) { $row.addClass(options.rowClass) } if (options.cellClass) { $td.addClass(options.cellClass) } $row.append($td); this._$rows.push($row) } }.bind(this); for (var i = 0; i < this._rows.length; i++) { $.each(this._rows[i], fillTableBody); this._setLastRowClass() } options.container.append($("<tbody>").append(this._$rows)); this._applyCellTemplates(cellTemplates) }, _setLastRowClass: function() { if (this._rows.length > 1 && this._$rows.length) { var $lastRow = this._$rows[this._$rows.length - 1]; $lastRow.addClass(LAST_ROW_CLASS) } }, _renderTimePanel: function() { this._renderTableBody({ container: this._$timePanel, rowCount: this._getTimePanelRowCount(), cellCount: 1, rowClass: TIME_PANEL_ROW_CLASS, cellClass: TIME_PANEL_CELL_CLASS, cellTemplate: this.option("dateCellTemplate"), getStartDate: this._getTimePanelStartDate.bind(this) }) }, _getTimePanelStartDate: function(rowIndex) { var current = new Date(this.option("currentDate")), cellDate = new Date(current.setDate(current.getDate() + rowIndex)); return cellDate }, _getRowHeight: function(rowSize) { var baseHeight = this.option("rowHeight"), innerOffset = (rowSize - 1) * INNER_CELL_MARGIN; return rowSize ? baseHeight * rowSize + innerOffset + OUTER_CELL_MARGIN : 0 }, _getGroupRowHeight: function(groupRows) { if (!groupRows) { return } var result = 0; for (var i = 0; i < groupRows.length; i++) { result += this._getRowHeight(groupRows[i]) } return result }, getAgendaVerticalStepHeight: function() { return this.option("rowHeight") }, getEndViewDate: function() { var currentDate = new Date(this.option("currentDate")), agendaDuration = this.option("agendaDuration"); currentDate.setHours(this.option("endDayHour")); var result = currentDate.setDate(currentDate.getDate() + agendaDuration - 1) - 6e4; return new Date(result) }, getCoordinatesByDate: function() { return { top: 0, left: 0, max: 0, groupIndex: 0 } }, getCellDataByCoordinates: function() { return { startDate: null, endDate: null } } }); registerComponent("dxSchedulerAgenda", SchedulerAgenda); module.exports = SchedulerAgenda }, /*!**********************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.resource_manager.js ***! \**********************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), arrayUtils = __webpack_require__( /*! ../../core/utils/array */ 26), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), objectUtils = __webpack_require__( /*! ../../core/utils/object */ 27), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, query = __webpack_require__( /*! ../../data/query */ 159), dataCoreUtils = __webpack_require__( /*! ../../core/utils/data */ 50), DataSourceModule = __webpack_require__( /*! ../../data/data_source/data_source */ 153), when = __webpack_require__( /*! ../../integration/jquery/deferred */ 16).when; var getValueExpr = function(resource) { return resource.valueExpr || "id" }, getDisplayExpr = function(resource) { return resource.displayExpr || "text" }; var ResourceManager = Class.inherit({ _wrapDataSource: function(dataSource) { if (dataSource instanceof DataSourceModule.DataSource) { return dataSource } else { return new DataSourceModule.DataSource({ store: DataSourceModule.normalizeDataSourceOptions(dataSource).store, pageSize: 0 }) } }, _mapResourceData: function(resource, data) { var valueGetter = dataCoreUtils.compileGetter(getValueExpr(resource)), displayGetter = dataCoreUtils.compileGetter(getDisplayExpr(resource)); return $.map(data, function(item) { var result = { id: valueGetter(item), text: displayGetter(item) }; if (item.color) { result.color = item.color } return result }) }, _isMultipleResource: function(resourceField) { var result = false; $.each(this.getResources(), function(_, resource) { var field = this.getField(resource); if (field === resourceField) { result = resource.allowMultiple; return false } }.bind(this)); return result }, ctor: function(resources) { this.setResources(resources) }, getDataAccessors: function(field, type) { var result = null; $.each(this._dataAccessors[type], function(accessorName, accessors) { if (field === accessorName) { result = accessors; return false } }); return result }, getField: function(resource) { return resource.fieldExpr || resource.field }, setResources: function(resources) { this._resources = resources; this._dataAccessors = { getter: {}, setter: {} }; this._resourceFields = $.map(resources || [], function(resource) { var field = this.getField(resource); this._dataAccessors.getter[field] = dataCoreUtils.compileGetter(field); this._dataAccessors.setter[field] = dataCoreUtils.compileSetter(field); return field }.bind(this)) }, getResources: function() { return this._resources || [] }, getResourcesData: function() { return this._resourcesData || [] }, getEditors: function() { var result = [], that = this; $.each(this.getResources(), function(i, resource) { var field = that.getField(resource), currentResourceItems = that._getResourceDataByField(field); result.push({ editorOptions: { dataSource: currentResourceItems.length ? currentResourceItems : that._wrapDataSource(resource.dataSource), displayExpr: getDisplayExpr(resource), valueExpr: getValueExpr(resource) }, dataField: field, editorType: resource.allowMultiple ? "dxTagBox" : "dxSelectBox", label: { text: resource.label || field } }) }); return result }, _resourceLoader: {}, getResourceDataByValue: function(field, value) { var that = this, result = $.Deferred(); $.each(this.getResources(), function(_, resource) { var resourceField = that.getField(resource); if (resourceField === field) { var dataSource = that._wrapDataSource(resource.dataSource), valueExpr = getValueExpr(resource); if (!that._resourceLoader[field]) { that._resourceLoader[field] = dataSource.load() } that._resourceLoader[field].done(function(data) { var filteredData = query(data).filter(valueExpr, value).toArray(); delete that._resourceLoader[field]; result.resolve(filteredData[0]) }).fail(function() { delete that._resourceLoader[field]; result.reject() }); return false } }); return result.promise() }, getResourcesFromItem: function(itemData, wrapOnlyMultipleResources) { var that = this, result = null; if (!commonUtils.isDefined(wrapOnlyMultipleResources)) { wrapOnlyMultipleResources = false } $.each(that._resourceFields, function(index, field) { $.each(itemData, function(fieldName, fieldValue) { var tmp = {}; tmp[fieldName] = fieldValue; var resourceData = that.getDataAccessors(field, "getter")(tmp); if (resourceData) { if (!result) { result = {} } if (1 === resourceData.length) { resourceData = resourceData[0] } if (!wrapOnlyMultipleResources || wrapOnlyMultipleResources && that._isMultipleResource(field)) { that.getDataAccessors(field, "setter")(tmp, arrayUtils.wrapToArray(resourceData)) } else { that.getDataAccessors(field, "setter")(tmp, resourceData) } extend(result, tmp); return true } }) }); return result }, loadResources: function(groups) { var result = $.Deferred(), that = this, deferreds = []; $.each(this.getResourcesByFields(groups), function(i, resource) { var deferred = $.Deferred(), field = that.getField(resource); deferreds.push(deferred); that._wrapDataSource(resource.dataSource).load().done(function(data) { deferred.resolve({ name: field, items: that._mapResourceData(resource, data), data: data }) }).fail(function() { deferred.reject() }) }); if (!deferreds.length) { return result.resolve([]) } when.apply(null, deferreds).done(function() { var data = Array.prototype.slice.call(arguments), mapFunction = function(obj) { return { name: obj.name, items: obj.items, data: obj.data } }; that._resourcesData = data; result.resolve(data.map(mapFunction)) }).fail(function() { result.reject() }); return result.promise() }, getResourcesByFields: function(fields) { return commonUtils.grep(this.getResources(), function(resource) { var field = this.getField(resource); return inArray(field, fields) > -1 }.bind(this)) }, getResourceByField: function(field) { return this.getResourcesByFields([field])[0] || {} }, getResourceColor: function(field, value) { var valueExpr = this.getResourceByField(field).valueExpr || "id", valueGetter = dataCoreUtils.compileGetter(valueExpr), colorExpr = this.getResourceByField(field).colorExpr || "color", colorGetter = dataCoreUtils.compileGetter(colorExpr); var color, result = $.Deferred(), resourceData = this._getResourceDataByField(field), resourceDataLength = resourceData.length; if (resourceDataLength) { for (var i = 0; i < resourceDataLength; i++) { if (valueGetter(resourceData[i]) === value) { color = colorGetter(resourceData[i]); break } } result.resolve(color) } else { this.getResourceDataByValue(field, value).done(function(resourceData) { if (resourceData) { color = colorGetter(resourceData) } result.resolve(color) }).fail(function() { result.reject() }) } return result.promise() }, getResourceForPainting: function(groups) { var result, resources = this.getResources(); $.each(resources, function(index, resource) { if (resource.useColorAsDefault || resource.mainColor) { result = resource; return false } }); if (!result) { if (Array.isArray(groups) && groups.length) { resources = this.getResourcesByFields(groups) } result = resources[resources.length - 1] } return result }, createResourcesTree: function(groups) { var leafIndex = 0, groupIndex = groupIndex || 0; function make(group, groupIndex, result, parent) { result = result || []; for (var i = 0; i < group.items.length; i++) { var currentGroupItem = group.items[i]; var resultItem = { name: group.name, value: currentGroupItem.id, title: currentGroupItem.text, data: group.data && group.data[i], children: [], parent: parent ? parent : null }; result.push(resultItem); var nextGroupIndex = groupIndex + 1; if (groups[nextGroupIndex]) { make.call(this, groups[nextGroupIndex], nextGroupIndex, resultItem.children, resultItem) } if (!resultItem.children.length) { resultItem.leafIndex = leafIndex; leafIndex++ } } return result } return make.call(this, groups[0], 0) }, _hasGroupItem: function(appointmentResources, groupName, itemValue) { var group = this.getDataAccessors(groupName, "getter")(appointmentResources); if (group) { if (inArray(itemValue, group) > -1) { return true } } return false }, _getResourceDataByField: function(fieldName) { var loadedResources = this.getResourcesData(), currentResourceData = []; for (var i = 0, resourceCount = loadedResources.length; i < resourceCount; i++) { if (loadedResources[i].name === fieldName) { currentResourceData = loadedResources[i].data; break } } return currentResourceData }, getResourceTreeLeaves: function(tree, appointmentResources, result) { result = result || []; for (var i = 0; i < tree.length; i++) { if (!this._hasGroupItem(appointmentResources, tree[i].name, tree[i].value)) { continue } if (commonUtils.isDefined(tree[i].leafIndex)) { result.push(tree[i].leafIndex) } if (tree[i].children) { this.getResourceTreeLeaves(tree[i].children, appointmentResources, result) } } return result }, groupAppointmentsByResources: function(appointments, resources) { var tree = this.createResourcesTree(resources), result = {}; $.each(appointments, function(_, appointment) { var appointmentResources = this.getResourcesFromItem(appointment), treeLeaves = this.getResourceTreeLeaves(tree, appointmentResources); for (var i = 0; i < treeLeaves.length; i++) { if (!result[treeLeaves[i]]) { result[treeLeaves[i]] = [] } result[treeLeaves[i]].push(objectUtils.deepExtendArraySafe({}, appointment, true)) } }.bind(this)); return result }, reduceResourcesTree: function(tree, existingAppointments, _result) { _result = _result ? _result.children : []; var that = this; tree.forEach(function(node, index) { var ok = false, resourceName = node.name, resourceValue = node.value, resourceTitle = node.title, resourceData = node.data, resourceGetter = that.getDataAccessors(resourceName, "getter"); existingAppointments.forEach(function(appointment) { if (!ok) { var resourceFromAppointment = resourceGetter(appointment); if (Array.isArray(resourceFromAppointment)) { if (resourceFromAppointment.indexOf(resourceValue) > -1) { _result.push({ name: resourceName, value: resourceValue, title: resourceTitle, data: resourceData, children: [] }); ok = true } } else { if (resourceFromAppointment === resourceValue) { _result.push({ name: resourceName, value: resourceValue, title: resourceTitle, data: resourceData, children: [] }); ok = true } } } }); if (ok && node.children && node.children.length) { that.reduceResourcesTree(node.children, existingAppointments, _result[index]) } }); return _result } }); module.exports = ResourceManager }, /*!***********************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.appointment_model.js ***! \***********************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), config = __webpack_require__( /*! ../../core/config */ 15), dateSerialization = __webpack_require__( /*! ../../core/utils/date_serialization */ 259), recurrenceUtils = __webpack_require__( /*! ./utils.recurrence */ 470), dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, arrayUtils = __webpack_require__( /*! ../../core/utils/array */ 26), query = __webpack_require__( /*! ../../data/query */ 159); var DATE_FILTER_POSITION = 0, USER_FILTER_POSITION = 1; var FilterMaker = Class.inherit({ ctor: function(dataExpressions, dataAccessors) { this._filterRegistry = null; this._dataAccessors = dataAccessors; this._dataExpressions = dataExpressions }, isRegistered: function() { return !!this._filterRegistry }, clearRegistry: function() { delete this._filterRegistry }, make: function(type, args) { if (!this._filterRegistry) { this._filterRegistry = {} } this._make[type].apply(this, args) }, _make: { date: function(min, max, useAccessors) { var startDate = useAccessors ? this._dataAccessors.getter.startDate : this._dataExpressions.startDateExpr, endDate = useAccessors ? this._dataAccessors.getter.endDate : this._dataExpressions.endDateExpr, recurrenceRule = this._dataExpressions.recurrenceRuleExpr; this._filterRegistry.date = [ [ [endDate, ">", min], [startDate, "<", max] ], "or", [recurrenceRule, "startswith", "freq"], "or", [ [endDate, min], [startDate, min] ] ]; if (!recurrenceRule) { this._filterRegistry.date.splice(1, 2) } }, user: function(userFilter) { this._filterRegistry.user = userFilter } }, combine: function() { var filter = []; this._filterRegistry.date && filter.push(this._filterRegistry.date); this._filterRegistry.user && filter.push(this._filterRegistry.user); return filter }, dateFilter: function() { return this._filterRegistry.date } }); var AppointmentModel = Class.inherit({ _createFilter: function(min, max, remoteFiltering, dateSerializationFormat) { this._filterMaker.make("date", [min, max]); var userFilterPosition = this._excessFiltering() ? this._dataSource.filter()[USER_FILTER_POSITION] : this._dataSource.filter(); this._filterMaker.make("user", [userFilterPosition]); if (remoteFiltering) { this._dataSource.filter(this._combineRemoteFilter(dateSerializationFormat)) } }, _excessFiltering: function() { var dateFilter = this._filterMaker.dateFilter(), dataSourceFilter = this._dataSource.filter(); return dataSourceFilter && (commonUtils.equalByValue(dataSourceFilter, dateFilter) || dataSourceFilter.length && commonUtils.equalByValue(dataSourceFilter[DATE_FILTER_POSITION], dateFilter)) }, _combineFilter: function() { return this._filterMaker.combine() }, _getStoreKey: function(target) { var store = this._dataSource.store(); return store.keyOf(target) }, _filterAppointmentByResources: function(appointment, resources) { var result = false; function checkAppointmentResourceValues() { var resource, resourceGetter = this._dataAccessors.getter.resources[resourceName]; if (commonUtils.isFunction(resourceGetter)) { resource = resourceGetter(appointment) } var appointmentResourceValues = arrayUtils.wrapToArray(resource), resourceData = $.map(resources[i].items, function(item) { return item.id }); for (var j = 0, itemDataCount = appointmentResourceValues.length; j < itemDataCount; j++) { if (inArray(appointmentResourceValues[j], resourceData) > -1) { return true } } return false } for (var i = 0, len = resources.length; i < len; i++) { var resourceName = resources[i].name; result = checkAppointmentResourceValues.call(this); if (!result) { return false } } return result }, _filterAppointmentByRRule: function(appointment, min, max, startDayHour, endDayHour) { var recurrenceRule = appointment.recurrenceRule, recurrenceException = appointment.recurrenceException, allDay = appointment.allDay, result = true, appointmentStartDate = appointment.startDate, appointmentEndDate = appointment.endDate; if (allDay || this._appointmentPartInInterval(appointmentStartDate, appointmentEndDate, startDayHour, endDayHour)) { var trimmedDates = this._trimDates(min, max); min = trimmedDates.min; max = new Date(trimmedDates.max.getTime() - 6e4) } if (recurrenceRule && !recurrenceUtils.getRecurrenceRule(recurrenceRule).isValid) { result = appointmentEndDate > min && appointmentStartDate <= max } if (result && recurrenceUtils.getRecurrenceRule(recurrenceRule).isValid) { result = recurrenceUtils.dateInRecurrenceRange({ rule: recurrenceRule, exception: recurrenceException, start: appointmentStartDate, end: appointmentEndDate, min: min, max: max }) } return result }, _appointmentPartInInterval: function(startDate, endDate, startDayHour, endDayHour) { var apptStartDayHour = startDate.getHours(), apptEndDayHour = endDate.getHours(); return apptStartDayHour <= startDayHour && apptEndDayHour <= endDayHour && apptEndDayHour >= startDayHour || apptEndDayHour >= endDayHour && apptStartDayHour <= endDayHour && apptStartDayHour >= startDayHour }, _createCombinedFilter: function(filterOptions, timeZoneProcessor) { var dataAccessors = this._dataAccessors, startDayHour = filterOptions.startDayHour, endDayHour = filterOptions.endDayHour, min = new Date(filterOptions.min), max = new Date(filterOptions.max), resources = filterOptions.resources, that = this; return [ [function(appointment) { var recurrenceRule, result = true, startDate = new Date(dataAccessors.getter.startDate(appointment)), endDate = new Date(dataAccessors.getter.endDate(appointment)), appointmentTakesAllDay = that.appointmentTakesAllDay(appointment, startDayHour, endDayHour), isAllDay = dataAccessors.getter.allDay(appointment), apptStartHour = startDate.getHours(), hiddenInterval = 36e5 * (24 - endDayHour + startDayHour), apptDuration = endDate.getTime() - startDate.getTime(), delta = (hiddenInterval - apptDuration) / 36e5, useRecurrence = commonUtils.isDefined(dataAccessors.getter.recurrenceRule); if (useRecurrence) { recurrenceRule = dataAccessors.getter.recurrenceRule(appointment) } if (resources && resources.length) { result = that._filterAppointmentByResources(appointment, resources) } if (appointmentTakesAllDay && false === filterOptions.allDay) { result = false } if (result && useRecurrence) { result = that._filterAppointmentByRRule({ startDate: startDate, endDate: endDate, recurrenceRule: recurrenceRule, recurrenceException: dataAccessors.getter.recurrenceException(appointment), allDay: appointmentTakesAllDay }, min, max, startDayHour, endDayHour) } var startDateTimeZone = dataAccessors.getter.startDateTimeZone(appointment), endDateTimeZone = dataAccessors.getter.endDateTimeZone(appointment), comparableStartDate = timeZoneProcessor(startDate, startDateTimeZone), comparableEndDate = timeZoneProcessor(endDate, endDateTimeZone); if (result && void 0 !== startDayHour) { result = comparableStartDate.getHours() >= startDayHour || comparableEndDate.getHours() >= startDayHour || appointmentTakesAllDay } if (result && void 0 !== endDayHour) { result = comparableStartDate.getHours() < endDayHour || appointmentTakesAllDay && comparableStartDate <= max; if (apptDuration < hiddenInterval) { if (apptStartHour > endDayHour && delta <= apptStartHour - endDayHour) { result = false } } } if (result && useRecurrence && !recurrenceRule) { if (comparableEndDate.getTime() < min.getTime() && !isAllDay) { result = false } } return result }] ] }, ctor: function(dataSource, dataExpressions, dataAccessors) { this._dataExpressions = dataExpressions; this.setDataSource(dataSource); this._filterMaker = new FilterMaker(dataExpressions, dataAccessors); this.setDataAccessors(dataAccessors) }, setDataSource: function(dataSource) { this._dataSource = dataSource; this._filterMaker && this._filterMaker.clearRegistry() }, setDataAccessors: function(dataAccessors) { this._dataAccessors = dataAccessors }, filterByDate: function(min, max, remoteFiltering, dateSerializationFormat) { if (!this._dataSource) { return } var trimmedDates = this._trimDates(min, max); if (!this._filterMaker.isRegistered()) { this._createFilter(trimmedDates.min, trimmedDates.max, remoteFiltering, dateSerializationFormat) } else { this._filterMaker.make("date", [trimmedDates.min, trimmedDates.max]); if (this._dataSource.filter() && this._dataSource.filter().length > 1) { this._filterMaker.make("user", [this._dataSource.filter()[1]]) } if (remoteFiltering) { this._dataSource.filter(this._combineRemoteFilter(dateSerializationFormat)) } } }, _combineRemoteFilter: function(dateSerializationFormat) { var combinedFilter = this._filterMaker.combine(); return this._serializeRemoteFilter(combinedFilter, dateSerializationFormat) }, _serializeRemoteFilter: function(filter, dateSerializationFormat) { var that = this; if (!Array.isArray(filter)) { return filter } filter = extend([], filter); var startDate = that._dataExpressions.startDateExpr, endDate = that._dataExpressions.endDateExpr; if (commonUtils.isString(filter[0])) { if (config().forceIsoDateParsing && filter.length > 1) { if (filter[0] === startDate || filter[0] === endDate) { filter[filter.length - 1] = dateSerialization.serializeDate(filter[filter.length - 1], dateSerializationFormat) } } } for (var i = 0; i < filter.length; i++) { filter[i] = that._serializeRemoteFilter(filter[i], dateSerializationFormat) } return filter }, filterLoadedAppointments: function(filterOptions, timeZoneProcessor) { if (!commonUtils.isFunction(timeZoneProcessor)) { timeZoneProcessor = function(date) { return date } } var combinedFilter = this._createCombinedFilter(filterOptions, timeZoneProcessor); if (this._filterMaker.isRegistered()) { var trimmedDates = this._trimDates(filterOptions.min, filterOptions.max); this._filterMaker.make("date", [trimmedDates.min, trimmedDates.max, true]); var dateFilter = this.customizeDateFilter(this._filterMaker.combine(), timeZoneProcessor); combinedFilter.push([dateFilter]) } return query(this._dataSource.items()).filter(combinedFilter).toArray() }, _trimDates: function(min, max) { var minCopy = dateUtils.trimTime(new Date(min)), maxCopy = dateUtils.trimTime(new Date(max)); maxCopy.setDate(maxCopy.getDate() + 1); return { min: minCopy, max: maxCopy } }, hasAllDayAppointments: function(items, startDayHour, endDayHour) { if (!items) { return false } var that = this; var result = false; $.each(items, function(index, item) { if (that.appointmentTakesAllDay(item, startDayHour, endDayHour)) { result = true; return false } }); return result }, appointmentTakesAllDay: function(appointment, startDayHour, endDayHour) { var dataAccessors = this._dataAccessors, startDate = dataAccessors.getter.startDate(appointment), endDate = dataAccessors.getter.endDate(appointment), allDay = dataAccessors.getter.allDay(appointment); return allDay || this._appointmentHasAllDayDuration(startDate, endDate, startDayHour, endDayHour) }, _appointmentHasAllDayDuration: function(startDate, endDate, startDayHour, endDayHour) { startDate = new Date(startDate); endDate = new Date(endDate); var etalonDayDurationInHours = endDayHour - startDayHour, appointmentDurationInHours = (endDate.getTime() - startDate.getTime()) / 36e5; return appointmentDurationInHours >= etalonDayDurationInHours }, appointmentTakesSeveralDays: function(appointment) { var dataAccessors = this._dataAccessors, startDate = dataAccessors.getter.startDate(appointment), endDate = dataAccessors.getter.endDate(appointment); var startDateCopy = dateUtils.trimTime(new Date(startDate)), endDateCopy = dateUtils.trimTime(new Date(endDate)); return startDateCopy.getTime() !== endDateCopy.getTime() }, _mapDateFieldsDependOnTZ: function(appointment, tz) { function convert(date) { date = dateUtils.makeDate(date); var tzDiff = 36e5 * tz.value + tz.clientOffset; return new Date(date.getTime() - tzDiff) } var startDate = this._dataAccessors.getter.startDate(appointment), endDate = this._dataAccessors.getter.endDate(appointment); this._dataAccessors.setter.startDate(appointment, convert(startDate)); this._dataAccessors.setter.endDate(appointment, convert(endDate)) }, customizeDateFilter: function(dateFilter, timeZoneProcessor) { var currentFilter = extend(true, [], dateFilter); return function(appointment) { appointment = extend(true, {}, appointment); var startDate = this._dataAccessors.getter.startDate(appointment), endDate = this._dataAccessors.getter.endDate(appointment), startDateTimeZone = this._dataAccessors.getter.startDateTimeZone(appointment), endDateTimeZone = this._dataAccessors.getter.endDateTimeZone(appointment); var comparableStartDate = timeZoneProcessor(startDate, startDateTimeZone), comparableEndDate = timeZoneProcessor(endDate, endDateTimeZone); this._dataAccessors.setter.startDate(appointment, comparableStartDate); this._dataAccessors.setter.endDate(appointment, comparableEndDate); return query([appointment]).filter(currentFilter).toArray().length > 0 }.bind(this) }, add: function(data, tz) { if (tz && void 0 !== tz.value) { this._mapDateFieldsDependOnTZ(data, tz) } return this._dataSource.store().insert(data).done(function() { this._dataSource.load() }.bind(this)) }, update: function(target, data) { var key = this._getStoreKey(target); return this._dataSource.store().update(key, data).done(function() { this._dataSource.load() }.bind(this)) }, remove: function(target) { var key = this._getStoreKey(target); return this._dataSource.store().remove(key).done(function() { this._dataSource.load() }.bind(this)) } }); module.exports = AppointmentModel }, /*!******************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.appointments.js ***! \******************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), translator = __webpack_require__( /*! ../../animation/translator */ 69), dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), typeUtils = __webpack_require__( /*! ../../core/utils/type */ 12), objectUtils = __webpack_require__( /*! ../../core/utils/object */ 27), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, recurrenceUtils = __webpack_require__( /*! ./utils.recurrence */ 470), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), publisherMixin = __webpack_require__( /*! ./ui.scheduler.publisher_mixin */ 476), Appointment = __webpack_require__( /*! ./ui.scheduler.appointment */ 493), eventUtils = __webpack_require__( /*! ../../events/utils */ 71), dblclickEvent = __webpack_require__( /*! ../../events/double_click */ 182), dateLocalization = __webpack_require__( /*! ../../localization/date */ 33), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), CollectionWidget = __webpack_require__( /*! ../collection/ui.collection_widget.edit */ 149), Draggable = __webpack_require__( /*! ../draggable */ 266); var COMPONENT_CLASS = "dx-scheduler-scrollable-appointments", APPOINTMENT_ITEM_CLASS = "dx-scheduler-appointment", APPOINTMENT_TITLE_CLASS = "dx-scheduler-appointment-title", APPOINTMENT_CONTENT_DETAILS_CLASS = "dx-scheduler-appointment-content-details", APPOINTMENT_DATE_CLASS = "dx-scheduler-appointment-content-date", RECURRING_ICON_CLASS = "dx-scheduler-appointment-recurrence-icon", ALL_DAY_CONTENT_CLASS = "dx-scheduler-appointment-content-allday", DBLCLICK_EVENT_NAME = eventUtils.addNamespace(dblclickEvent.name, "dxSchedulerAppointment"); var toMs = dateUtils.dateToMilliseconds; var SchedulerAppointments = CollectionWidget.inherit({ _supportedKeys: function() { var parent = this.callBase(); var tabHandler = function(e) { var appointments = this._getAccessAppointments(), focusedAppointment = appointments.filter(".dx-state-focused"), index = focusedAppointment.data("dxAppointmentSettings").sortedIndex, lastIndex = appointments.length - 1; if (index > 0 && e.shiftKey || index < lastIndex && !e.shiftKey) { e.preventDefault(); e.shiftKey ? index-- : index++; var $nextAppointment = this._getAppointmentByIndex(index); this._resetTabIndex($nextAppointment); $nextAppointment.focus() } }; return extend(parent, { escape: function() { this.moveAppointmentBack(); this._escPressed = true }.bind(this), del: function(e) { if (this.option("allowDelete")) { e.preventDefault(); var data = this._getItemData(e.target); this.notifyObserver("deleteAppointment", { data: data, target: e.target }); this.notifyObserver("hideAppointmentTooltip") } }.bind(this), tab: tabHandler }) }, _getAppointmentByIndex: function(sortedIndex) { var appointments = this._getAccessAppointments(); return appointments.filter(function(_, $item) { return $.data($item, "dxAppointmentSettings").sortedIndex === sortedIndex }).eq(0) }, _getAccessAppointments: function() { return this._itemElements().filter(":visible").not(".dx-state-disabled") }, _resetTabIndex: function($appointment) { this._focusTarget().attr("tabindex", -1); $appointment.attr("tabindex", this.option("tabIndex")) }, _moveFocus: commonUtils.noop, _focusTarget: function() { return this._itemElements() }, _renderFocusTarget: function() { var $appointment = this._getAppointmentByIndex(0); this._resetTabIndex($appointment) }, _focusInHandler: function(e) { if (this._targetIsDisabled(e)) { e.stopPropagation(); return } clearTimeout(this._appointmentFocusedTimeout); this.callBase.apply(this, arguments); this._$currentAppointment = $(e.target); this.option("focusedElement", $(e.target)); var that = this; this._appointmentFocusedTimeout = setTimeout(function() { that.notifyObserver("appointmentFocused") }) }, _targetIsDisabled: function(e) { return $(e.currentTarget).is(".dx-state-disabled, .dx-state-disabled *") }, _focusOutHandler: function() { var $appointment = this._getAppointmentByIndex(0); this.option("focusedElement", $appointment); this.callBase.apply(this, arguments) }, _eventBindingTarget: function() { return this._itemContainer() }, _getDefaultOptions: function() { return extend(this.callBase(), { noDataText: null, activeStateEnabled: true, hoverStateEnabled: true, tabIndex: 0, appointmentDurationInMinutes: 30, fixedContainer: null, allDayContainer: null, allowDrag: true, allowResize: true, allowAllDayResize: true, onAppointmentDblClick: null }) }, _optionChanged: function(args) { switch (args.name) { case "items": this._cleanFocusState(); this._clearDropDownItems(); this._repaintAppointments(args.value); this._renderDropDownAppointments(); this._attachAppointmentsEvents(); break; case "fixedContainer": case "allDayContainer": case "onAppointmentDblClick": break; case "allowDrag": case "allowResize": case "allowAllDayResize": case "appointmentDurationInMinutes": this._invalidate(); break; case "focusedElement": this._resetTabIndex($(args.value)); this.callBase(args); break; case "allowDelete": break; default: this.callBase(args) } }, _repaintAppointments: function(appointments) { var itemsLength = appointments.length; if (!itemsLength) { this._cleanItemContainer() } for (var i = 0; i < itemsLength; i++) { var item = appointments[i]; if (item && true === item.needRemove) { this._clearItem(item); appointments.splice(i, 1); i--; continue } if (item && false === item.needRepaint) { this._processRenderedAppointment(item) } if (item && (!commonUtils.isDefined(item.needRepaint) || true === item.needRepaint)) { item.needRepaint = false; this._clearItem(item); this._renderItem(i, item) } } }, _attachAppointmentsEvents: function() { this._attachClickEvent(); this._attachHoldEvent(); this._attachContextMenuEvent(); this._attachAppointmentDblClick(); this._renderFocusState(); this._attachFeedbackEvents(); this._attachHoverEvents() }, _processRenderedAppointment: function(item) { var resourceForPainting = this.invoke("getResourceForPainting"); if (!resourceForPainting) { return } var $items = this._findItemElementByItem(item.itemData), that = this; if (!$items.length) { return } $.each($items, function(index, $item) { that._applyAppointmentColor($item, item.itemData, item.settings[index]) }) }, _clearItem: function(item) { var $items = this._findItemElementByItem(item.itemData); if (!$items.length) { return } $.each($items, function(_, $item) { $item.detach(); $item.remove() }) }, _clearDropDownItems: function() { this._virtualAppointments = {}; var $items = this.element().find(".dx-scheduler-dropdown-appointments"); if (!$items.length) { return } $.each($items, function(_, $item) { $($item).detach(); $($item).remove() }) }, _findItemElementByItem: function(item) { var result = [], that = this; this.itemElements().each(function() { var $item = $(this); if ($item.data(that._itemDataKey()) === item) { result.push($item) } }); return result }, _itemClass: function() { return APPOINTMENT_ITEM_CLASS }, _itemContainer: function() { var $container = this.callBase(), $result = $container, $allDayContainer = this.option("allDayContainer"); if ($allDayContainer) { $result = $container.add($allDayContainer) } return $result }, _cleanItemContainer: function() { this.callBase(); var $allDayContainer = this.option("allDayContainer"); if ($allDayContainer) { $allDayContainer.empty() } this._virtualAppointments = {} }, _clean: function() { this.callBase(); delete this._$currentAppointment; delete this._initialSize; delete this._initialCoordinates }, _init: function() { this.callBase(); this.element().addClass(COMPONENT_CLASS); this._preventSingleAppointmentClick = false }, _createItemByTemplate: function(itemTemplate, renderArgs) { return itemTemplate.render({ model: renderArgs.itemData, container: renderArgs.container, index: renderArgs.index }) }, _renderAppointmentTemplate: function($container, data, model) { var startDate = model.settings ? new Date(this.invoke("getField", "startDate", model.settings)) : data.startDate, endDate = model.settings ? new Date(this.invoke("getField", "endDate", model.settings)) : data.endDate; $("<div>").text(this._createAppointmentTitle(data)).addClass(APPOINTMENT_TITLE_CLASS).appendTo($container); if (typeUtils.isPlainObject(data)) { if (data.html) { $container.html(data.html) } } var recurrenceRule = data.recurrenceRule, allDay = data.allDay, $contentDetails = $("<div>").addClass(APPOINTMENT_CONTENT_DETAILS_CLASS); var apptStartTz = data.startDateTimeZone, apptEndTz = data.endDateTimeZone; startDate = this.invoke("convertDateByTimezone", startDate, apptStartTz); endDate = this.invoke("convertDateByTimezone", endDate, apptEndTz); $("<div>").addClass(APPOINTMENT_DATE_CLASS).text(dateLocalization.format(startDate, "shorttime")).appendTo($contentDetails); $("<div>").addClass(APPOINTMENT_DATE_CLASS).text(" - ").appendTo($contentDetails); $("<div>").addClass(APPOINTMENT_DATE_CLASS).text(dateLocalization.format(endDate, "shorttime")).appendTo($contentDetails); $contentDetails.appendTo($container); if (recurrenceRule) { $("<span>").addClass(RECURRING_ICON_CLASS + " dx-icon-repeat").appendTo($container) } if (allDay) { $("<div>").text(" " + messageLocalization.format("dxScheduler-allDay") + ": ").addClass(ALL_DAY_CONTENT_CLASS).prependTo($contentDetails) } }, _createAppointmentTitle: function(data) { if (typeUtils.isPlainObject(data)) { return data.text } return String(data) }, _executeItemRenderAction: function(index, itemData, itemElement) { var action = this._getItemRenderAction(); if (action) { action({ appointmentElement: itemElement, appointmentData: itemData, targetedAppointmentData: this.invoke("getTargetedAppointmentData", itemData, itemElement, index) }) } delete this._currentAppointmentSettings }, _itemClickHandler: function(e) { this.callBase(e, {}, { afterExecute: function(e) { this._processItemClick(e.args[0].jQueryEvent) }.bind(this) }) }, _processItemClick: function(e) { var $target = $(e.currentTarget), data = this._getItemData($target); if (this._targetIsDisabled(e)) { e.stopPropagation(); return } if ("keydown" === e.type || eventUtils.isFakeClickEvent(e)) { this.notifyObserver("showEditAppointmentPopup", { data: data, target: $target }); return } this._appointmentClickTimeout = setTimeout(function() { if (!this._preventSingleAppointmentClick && $.contains(document, $target[0])) { this.notifyObserver("showAppointmentTooltip", { data: data, target: $target }) } this._preventSingleAppointmentClick = false }.bind(this), 300) }, _extendActionArgs: function() { var args = this.callBase.apply(this, arguments); return this._mapAppointmentFields(args) }, _mapAppointmentFields: function(args) { var result = { appointmentData: args.itemData, appointmentElement: args.itemElement }; if (args.itemData) { result.targetedAppointmentData = this.invoke("getTargetedAppointmentData", args.itemData, args.itemElement, args.itemIndex) } return result }, _render: function() { this.callBase.apply(this, arguments); this._attachAppointmentDblClick() }, _attachAppointmentDblClick: function() { var that = this, itemSelector = that._itemSelector(); this._itemContainer().off(DBLCLICK_EVENT_NAME, itemSelector).on(DBLCLICK_EVENT_NAME, itemSelector, function(e) { that._itemJQueryEventHandler(e, "onAppointmentDblClick", {}, { afterExecute: function(e) { that._dblClickHandler(e.args[0].jQueryEvent) } }) }) }, _dblClickHandler: function(e) { var $targetAppointment = $(e.currentTarget), appointmentData = this._getItemData($targetAppointment); clearTimeout(this._appointmentClickTimeout); this._preventSingleAppointmentClick = true; this.notifyObserver("showEditAppointmentPopup", { data: appointmentData, target: $targetAppointment }) }, _renderItem: function(index, item) { var allDay = item.settings.length && item.settings[0].allDay, $container = this._getAppointmentContainer(allDay), coordinateCount = item.settings.length; for (var i = 0; i < coordinateCount; i++) { this._currentAppointmentSettings = item.settings[i]; var $item = this.callBase(index, item.itemData, $container); $item.data("dxAppointmentSettings", item.settings[i]) } }, _getAppointmentContainer: function(allDay) { var $allDayContainer = this.option("allDayContainer"), $container = this.itemsContainer().not($allDayContainer); if (allDay && $allDayContainer) { $container = $allDayContainer } return $container }, _postprocessRenderItem: function(args) { this._renderAppointment(args.itemElement, this._currentAppointmentSettings) }, _renderAppointment: function($appointment, settings) { this._applyResourceDataAttr($appointment); var data = this._getItemData($appointment), geometry = this.invoke("getAppointmentGeometry", settings), allowResize = !settings.isCompact && this.option("allowResize") && (!commonUtils.isDefined(settings.skipResizing) || commonUtils.isString(settings.skipResizing)), allowDrag = this.option("allowDrag"), allDay = settings.allDay; this.invoke("setCellDataCacheAlias", this._currentAppointmentSettings, geometry); this._createComponent($appointment, Appointment, { observer: this.option("observer"), data: data, geometry: geometry, direction: settings.direction || "vertical", allowResize: allowResize, allowDrag: allowDrag, allDay: allDay, reduced: settings.appointmentReduced, isCompact: settings.isCompact, startDate: settings.startDate, cellWidth: this.invoke("getCellWidth"), cellHeight: this.invoke("getCellHeight"), resizableConfig: this._resizableConfig(data, settings) }); this._applyAppointmentColor($appointment, data, settings); this._renderDraggable($appointment, allDay) }, _applyAppointmentColor: function($appointment, appointmentData, settings) { var deferredColor = this._paintAppointment($appointment, settings.groupIndex); if (settings.virtual) { deferredColor.done(function(color) { this._processVirtualAppointment(settings, $appointment, appointmentData, color) }.bind(this)) } }, _applyResourceDataAttr: function($appointment) { this.notifyObserver("getResourcesFromItem", { itemData: this._getItemData($appointment), callback: function(resources) { if (resources) { $.each(resources, function(name, values) { var attr = "data-" + commonUtils.normalizeKey(name.toLowerCase()) + "-"; for (var i = 0; i < values.length; i++) { $appointment.attr(attr + commonUtils.normalizeKey(values[i]), true) } }) } } }) }, _resizableConfig: function(appointmentData, itemSetting) { return { area: this._calculateResizableArea(itemSetting, appointmentData), onResizeStart: function(e) { this._$currentAppointment = $(e.element); this._initialSize = { width: e.width, height: e.height }; this._initialCoordinates = translator.locate(e.element) }.bind(this), onResizeEnd: function(e) { if (this._escPressed) { e.jQueryEvent.cancel = true; return } this._resizeEndHandler(e) }.bind(this) } }, _calculateResizableArea: function(itemSetting, appointmentData) { var area = this.element().closest(".dx-scrollable-content"), allDay = itemSetting.allDay; this.notifyObserver("getResizableAppointmentArea", { coordinates: { left: itemSetting.left, top: 0 }, allDay: allDay, callback: function(result) { if (result) { area = result } } }); return area }, _resizeEndHandler: function(e) { var itemData = this._getItemData(e.element), startDate = this.invoke("getStartDate", itemData, true), endDate = this.invoke("getEndDate", itemData); var dateRange = this._getDateRange(e, startDate, endDate); var updatedDates = {}; this.invoke("setField", "startDate", updatedDates, new Date(dateRange[0])); this.invoke("setField", "endDate", updatedDates, new Date(dateRange[1])); var data = extend({}, itemData, updatedDates); this.notifyObserver("updateAppointmentAfterResize", { target: itemData, data: data, $appointment: e.element }) }, _getDateRange: function(e, startDate, endDate) { var startTime, endTime, itemData = this._getItemData(e.element), deltaTime = this.invoke("getDeltaTime", e, this._initialSize, itemData), renderingStrategy = this.invoke("getRenderingStrategy"), cond = false, isAllDay = this.invoke("isAllDay", itemData), needCorrectDates = "horizontalMonth" !== renderingStrategy && !isAllDay; if ("vertical" !== renderingStrategy || isAllDay) { cond = this.option("rtlEnabled") ? e.handles.right : e.handles.left } else { cond = e.handles.top } if (cond) { startTime = needCorrectDates ? this._correctStartDateByDelta(startDate, deltaTime) : startDate.getTime() - deltaTime; endTime = endDate.getTime() } else { startTime = startDate.getTime(); endTime = needCorrectDates ? this._correctEndDateByDelta(endDate, deltaTime) : endDate.getTime() + deltaTime } return [startTime, endTime] }, _correctEndDateByDelta: function(endDate, deltaTime) { var endDayHour = this.invoke("getEndDayHour"), startDayHour = this.invoke("getStartDayHour"), result = endDate.getTime() + deltaTime, visibleDayDuration = (endDayHour - startDayHour) * toMs("hour"); var daysCount = Math.ceil(deltaTime / visibleDayDuration), maxDate = new Date(endDate); maxDate.setHours(endDayHour); if (result > maxDate.getTime()) { var tailOfCurrentDay = maxDate.getTime() - endDate.getTime(), tailOfPrevDays = deltaTime - tailOfCurrentDay; var lastDay = new Date(endDate.setDate(endDate.getDate() + daysCount)); lastDay.setHours(startDayHour); result = lastDay.getTime() + tailOfPrevDays - visibleDayDuration * (daysCount - 1) } return result }, _correctStartDateByDelta: function(startDate, deltaTime) { var endDayHour = this.invoke("getEndDayHour"), startDayHour = this.invoke("getStartDayHour"), result = startDate.getTime() - deltaTime, visibleDayDuration = (endDayHour - startDayHour) * toMs("hour"); var daysCount = Math.ceil(deltaTime / visibleDayDuration), minDate = new Date(startDate); minDate.setHours(startDayHour); if (result < minDate.getTime()) { var tailOfCurrentDay = startDate.getTime() - minDate.getTime(), tailOfPrevDays = deltaTime - tailOfCurrentDay; var firstDay = new Date(startDate.setDate(startDate.getDate() - daysCount)); firstDay.setHours(endDayHour); result = firstDay.getTime() - tailOfPrevDays + visibleDayDuration * (daysCount - 1) } return result }, _paintAppointment: function($appointment, groupIndex) { var res = $.Deferred(); this.notifyObserver("getAppointmentColor", { itemData: this._getItemData($appointment), groupIndex: groupIndex, callback: function(d) { d.done(function(color) { if (color) { $appointment.css("background-color", color) } res.resolve(color) }) } }); return res.promise() }, _renderDraggable: function($appointment, allDay) { if (!this.option("allowDrag")) { return } var draggableArea, that = this, $fixedContainer = this.option("fixedContainer"), correctCoordinates = function($element, isFixedContainer) { var coordinates = translator.locate($element); that.notifyObserver("correctAppointmentCoordinates", { coordinates: coordinates, allDay: allDay, isFixedContainer: isFixedContainer, callback: function(result) { if (result) { coordinates = result } } }); translator.move($appointment, coordinates) }; this.notifyObserver("getDraggableAppointmentArea", { callback: function(result) { if (result) { draggableArea = result } } }); this._createComponent($appointment, Draggable, { area: draggableArea, boundOffset: that._calculateBoundOffset(), immediate: false, onDragStart: function(args) { var e = args.jQueryEvent; that._skipDraggableRestriction(e); that.notifyObserver("hideAppointmentTooltip"); that.notifyObserver("getDragEventTargetElements", { callback: function(result) { if (result) { e.targetElements = result } } }); $fixedContainer.append($appointment); that._$currentAppointment = $(args.element); that._initialSize = { width: args.width, height: args.height }; that._initialCoordinates = translator.locate(args.element) }, onDrag: function(args) { correctCoordinates(args.element) }, onDragEnd: function(args) { correctCoordinates(args.element, true); var $container = that._getAppointmentContainer(allDay); $container.append($appointment); if (this._escPressed) { args.jQueryEvent.cancel = true; return } that._dragEndHandler(args) } }) }, _calculateBoundOffset: function() { var result = { top: 0 }; this.notifyObserver("getBoundOffset", { callback: function(offset) { result = offset } }); return result }, _skipDraggableRestriction: function(e) { if (this.option("rtlEnabled")) { e.maxLeftOffset = null } else { e.maxRightOffset = null } e.maxBottomOffset = null }, _dragEndHandler: function(e) { var itemData = this._getItemData(e.element), coordinates = this._initialCoordinates; this.notifyObserver("updateAppointmentAfterDrag", { data: itemData, $appointment: e.element, coordinates: coordinates }) }, _virtualAppointments: {}, _processVirtualAppointment: function(appointmentSetting, $appointment, appointmentData, color) { var virtualAppointment = appointmentSetting.virtual, virtualGroupIndex = virtualAppointment.index; if (!commonUtils.isDefined(this._virtualAppointments[virtualGroupIndex])) { this._virtualAppointments[virtualGroupIndex] = { coordinates: { top: virtualAppointment.top, left: virtualAppointment.left }, items: { data: [], colors: [] }, isAllDay: virtualAppointment.isAllDay, buttonColor: color } } this._virtualAppointments[virtualGroupIndex].items.data.push(appointmentData); this._virtualAppointments[virtualGroupIndex].items.colors.push(color); $appointment.remove() }, _renderContentImpl: function() { this.callBase(); this._renderDropDownAppointments() }, _renderDropDownAppointments: function() { var buttonWidth = this.invoke("getCompactAppointmentGroupMaxWidth"), rtlOffset = 0, that = this; if (this.option("rtlEnabled")) { rtlOffset = buttonWidth } $.each(this._virtualAppointments, function(groupIndex) { var virtualGroup = this._virtualAppointments[groupIndex], virtualItems = virtualGroup.items, virtualCoordinates = virtualGroup.coordinates, $container = virtualGroup.isAllDay ? this.option("allDayContainer") : this.element(), left = virtualCoordinates.left; this.notifyObserver("renderDropDownAppointments", { $container: $container, coordinates: { top: virtualCoordinates.top, left: left + rtlOffset }, items: virtualItems, buttonColor: virtualGroup.buttonColor, itemTemplate: this.option("itemTemplate"), buttonWidth: buttonWidth, onAppointmentClick: function(args) { var mappedAppointmentFields = that._mapAppointmentFields(args); that._itemJQueryEventHandler(args.jQueryEvent, "onItemClick", mappedAppointmentFields) } }) }.bind(this)) }, _sortAppointmentsByStartDate: function(appointments) { appointments.sort(function(a, b) { var result = 0, firstDate = new Date(this.invoke("getField", "startDate", a.settings || a)).getTime(), secondDate = new Date(this.invoke("getField", "startDate", b.settings || b)).getTime(); if (firstDate < secondDate) { result = -1 } if (firstDate > secondDate) { result = 1 } return result }.bind(this)) }, _processRecurrenceAppointment: function(appointment, index, skipLongAppointments) { var recurrenceRule = this.invoke("getField", "recurrenceRule", appointment), result = { parts: [], indexes: [] }; if (recurrenceRule) { var dates = appointment.settings || appointment; var startDate = new Date(this.invoke("getField", "startDate", dates)), endDate = new Date(this.invoke("getField", "endDate", dates)), appointmentDuration = endDate.getTime() - startDate.getTime(), recurrenceException = this.invoke("getField", "recurrenceException", appointment), startViewDate = this.invoke("getStartViewDate"), endViewDate = this.invoke("getEndViewDate"), recurrentDates = recurrenceUtils.getDatesByRecurrence({ rule: recurrenceRule, exception: recurrenceException, start: startDate, end: endDate, min: startViewDate, max: endViewDate }), recurrentDateCount = appointment.settings ? 1 : recurrentDates.length; for (var i = 0; i < recurrentDateCount; i++) { var appointmentPart = extend({}, appointment, true); if (recurrentDates[i]) { var appointmentSettings = this._applyStartDateToObj(recurrentDates[i], {}); this._applyEndDateToObj(new Date(recurrentDates[i].getTime() + appointmentDuration), appointmentSettings); appointmentPart.settings = appointmentSettings } else { appointmentPart.settings = dates } result.parts.push(appointmentPart); if (!skipLongAppointments) { this._processLongAppointment(appointmentPart, result) } } result.indexes.push(index) } return result }, _processLongAppointment: function(appointment, result) { var parts = this.splitAppointmentByDay(appointment), partCount = parts.length, endViewDate = this.invoke("getEndViewDate").getTime(), startViewDate = this.invoke("getStartViewDate").getTime(), startDateTimeZone = this.invoke("getField", "startDateTimeZone", appointment); result = result || { parts: [] }; if (partCount > 1) { extend(appointment, parts[0]); for (var i = 1; i < partCount; i++) { var startDate = this.invoke("getField", "startDate", parts[i].settings).getTime(); startDate = this.invoke("convertDateByTimezone", startDate, startDateTimeZone); if (startDate < endViewDate && startDate > startViewDate) { result.parts.push(parts[i]) } } } return result }, _reduceRecurrenceAppointments: function(recurrenceIndexes, appointments) { $.each(recurrenceIndexes, function(i, index) { appointments.splice(index - i, 1) }) }, _combineAppointments: function(appointments, additionalAppointments) { if (additionalAppointments.length) { $.merge(appointments, additionalAppointments) } this._sortAppointmentsByStartDate(appointments) }, _applyStartDateToObj: function(startDate, obj) { this.invoke("setField", "startDate", obj, startDate); return obj }, _applyEndDateToObj: function(endDate, obj) { this.invoke("setField", "endDate", obj, endDate); return obj }, updateDraggablesBoundOffsets: function() { if (this.option("allowDrag")) { this.element().find("." + APPOINTMENT_ITEM_CLASS).each(function(_, appointmentElement) { var $appointment = $(appointmentElement), appointmentData = this._getItemData($appointment); if (!this.invoke("isAllDay", appointmentData)) { Draggable.getInstance($appointment).option("boundOffset", this._calculateBoundOffset()) } }.bind(this)) } }, moveAppointmentBack: function() { var $appointment = this._$currentAppointment, size = this._initialSize, coords = this._initialCoordinates; if ($appointment) { if (coords) { translator.move($appointment, coords); delete this._initialSize } if (size) { $appointment.outerWidth(size.width); $appointment.outerHeight(size.height); delete this._initialCoordinates } } }, focus: function() { var $appointment = this._$currentAppointment; if ($appointment) { this.option("focusedElement", $appointment); this.option("focusedElement").focus() } }, splitAppointmentByDay: function(appointment) { var dates = appointment.settings || appointment; var originalStartDate = new Date(this.invoke("getField", "startDate", dates)), startDate = dateUtils.makeDate(originalStartDate), endDate = dateUtils.makeDate(this.invoke("getField", "endDate", dates)), startDateTimeZone = this.invoke("getField", "startDateTimeZone", appointment), endDateTimeZone = this.invoke("getField", "endDateTimeZone", appointment), maxAllowedDate = this.invoke("getEndViewDate"), startDayHour = this.invoke("getStartDayHour"), endDayHour = this.invoke("getEndDayHour"), appointmentIsLong = this.invoke("appointmentTakesSeveralDays", appointment), result = []; startDate = this.invoke("convertDateByTimezone", startDate, startDateTimeZone); endDate = this.invoke("convertDateByTimezone", endDate, endDateTimeZone); if (startDate.getHours() <= endDayHour && startDate.getHours() >= startDayHour && !appointmentIsLong) { result.push(this._applyStartDateToObj(new Date(startDate), { appointmentData: appointment })); startDate.setDate(startDate.getDate() + 1) } while (appointmentIsLong && startDate.getTime() < endDate.getTime() - 1 && startDate.getTime() < maxAllowedDate.getTime()) { var currentStartDate = new Date(startDate), currentEndDate = new Date(startDate); this._checkStartDate(currentStartDate, originalStartDate, startDayHour); this._checkEndDate(currentEndDate, endDate, endDayHour); var appointmentData = objectUtils.deepExtendArraySafe({}, appointment, true), appointmentSettings = {}; this._applyStartDateToObj(currentStartDate, appointmentSettings); this._applyEndDateToObj(currentEndDate, appointmentSettings); appointmentData.settings = appointmentSettings; result.push(appointmentData); startDate.setDate(startDate.getDate() + 1) } return result }, _checkStartDate: function(currentDate, originalDate, startDayHour) { if (!dateUtils.sameDate(currentDate, originalDate) || currentDate.getHours() <= startDayHour) { currentDate.setHours(startDayHour); currentDate.setMinutes(0) } else { currentDate.setHours(originalDate.getHours()); currentDate.setMinutes(originalDate.getMinutes()) } }, _checkEndDate: function(currentDate, originalDate, endDayHour) { if (!dateUtils.sameDate(currentDate, originalDate) || currentDate.getHours() > endDayHour) { currentDate.setHours(endDayHour); currentDate.setMinutes(0) } else { currentDate.setHours(originalDate.getHours()); currentDate.setMinutes(originalDate.getMinutes()) } } }).include(publisherMixin); registerComponent("dxSchedulerAppointments", SchedulerAppointments); module.exports = SchedulerAppointments }, /*!*****************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.appointment.js ***! \*****************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), translator = __webpack_require__( /*! ../../animation/translator */ 69), recurrenceUtils = __webpack_require__( /*! ./utils.recurrence */ 470), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), tooltip = __webpack_require__( /*! ../tooltip/ui.tooltip */ 316), publisherMixin = __webpack_require__( /*! ./ui.scheduler.publisher_mixin */ 476), eventUtils = __webpack_require__( /*! ../../events/utils */ 71), pointerEvents = __webpack_require__( /*! ../../events/pointer */ 76), DOMComponent = __webpack_require__( /*! ../../core/dom_component */ 43), Resizable = __webpack_require__( /*! ../resizable */ 111), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), dateLocalization = __webpack_require__( /*! ../../localization/date */ 33); var REDUCED_APPOINTMENT_POINTERENTER_EVENT_NAME = eventUtils.addNamespace(pointerEvents.enter, "dxSchedulerAppointment"), REDUCED_APPOINTMENT_POINTERLEAVE_EVENT_NAME = eventUtils.addNamespace(pointerEvents.leave, "dxSchedulerAppointment"); var EMPTY_APPOINTMENT_CLASS = "dx-scheduler-appointment-empty", EMPTY_APPOINTMENT_MAX_WIDTH = 40, EMPTY_APPOINTMENT_MAX_HEIGHT = 15, APPOINTMENT_ALL_DAY_ITEM_CLASS = "dx-scheduler-all-day-appointment", DIRECTION_APPOINTMENT_CLASSES = { horizontal: "dx-scheduler-appointment-horizontal", vertical: "dx-scheduler-appointment-vertical" }, RECURRENCE_APPOINTMENT_CLASS = "dx-scheduler-appointment-recurrence", COMPACT_APPOINTMENT_CLASS = "dx-scheduler-appointment-compact", REDUCED_APPOINTMENT_CLASS = "dx-scheduler-appointment-reduced", REDUCED_APPOINTMENT_ICON = "dx-scheduler-appointment-reduced-icon", REDUCED_APPOINTMENT_PARTS_CLASSES = { head: "dx-scheduler-appointment-head", body: "dx-scheduler-appointment-body", tail: "dx-scheduler-appointment-tail" }; var Appointment = DOMComponent.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { data: {}, geometry: { top: 0, left: 0, width: 0, height: 0 }, allowDrag: true, allowResize: true, reduced: null, isCompact: false, direction: "vertical", resizableConfig: {}, cellHeight: 0, cellWidth: 0 }) }, _optionChanged: function(args) { switch (args.name) { case "data": case "geometry": case "allowDrag": case "allowResize": case "reduced": case "sortedIndex": case "isCompact": case "direction": case "resizableConfig": case "cellHeight": case "cellWidth": this._invalidate(); break; default: this.callBase(args) } }, _resizingRules: { horizontal: function() { var width = this.invoke("getCellWidth"), isRTL = this.option("rtlEnabled"), reducedHandles = { head: isRTL ? "right" : "left", body: "", tail: isRTL ? "left" : "right" }, handles = "left right", reducedPart = this.option("reduced"); if (reducedPart) { handles = reducedHandles[reducedPart] } return { handles: handles, minHeight: 0, minWidth: width, step: width } }, vertical: function() { var height = this.invoke("getCellHeight"); return { handles: "top bottom", minWidth: 0, minHeight: height, step: height } } }, _render: function() { this.callBase(); this._renderAppointmentGeometry(); this._renderEmptyClass(); this._renderCompactClass(); this._renderReducedAppointment(); this._renderAllDayClass(); this._renderDirection(); this.element().data("dxAppointmentStartDate", this.option("startDate")); this.element().attr("title", this.invoke("getField", "text", this.option("data"))); this.element().attr("role", "button"); this._renderRecurrenceClass(); this._renderResizable() }, _renderAppointmentGeometry: function() { var geometry = this.option("geometry"), $element = this.element(); translator.move($element, { top: geometry.top, left: geometry.left }); $element.css({ width: geometry.width, height: geometry.height }) }, _renderEmptyClass: function() { var geometry = this.option("geometry"); if (geometry.width < EMPTY_APPOINTMENT_MAX_WIDTH || geometry.height < EMPTY_APPOINTMENT_MAX_HEIGHT) { this.element().addClass(EMPTY_APPOINTMENT_CLASS) } }, _renderReducedAppointment: function() { var reducedPart = this.option("reduced"); if (!reducedPart) { return } this.element().toggleClass(REDUCED_APPOINTMENT_CLASS, true).toggleClass(REDUCED_APPOINTMENT_PARTS_CLASSES[reducedPart], true); this._renderAppointmentReducedIcon() }, _renderAppointmentReducedIcon: function() { var $icon = $("<div>").addClass(REDUCED_APPOINTMENT_ICON).appendTo(this.element()), endDate = this._getEndDate(); var tooltipLabel = messageLocalization.format("dxScheduler-editorLabelEndDate"), tooltipText = [tooltipLabel, ": ", dateLocalization.format(endDate, "monthAndDay"), ", ", dateLocalization.format(endDate, "year")].join(""); $icon.off(REDUCED_APPOINTMENT_POINTERENTER_EVENT_NAME).on(REDUCED_APPOINTMENT_POINTERENTER_EVENT_NAME, function() { tooltip.show({ target: $icon, content: tooltipText }) }).off(REDUCED_APPOINTMENT_POINTERLEAVE_EVENT_NAME).on(REDUCED_APPOINTMENT_POINTERLEAVE_EVENT_NAME, function() { tooltip.hide() }) }, _getEndDate: function() { var result = this.invoke("getField", "endDate", this.option("data")); if (result) { return new Date(result) } return result }, _renderAllDayClass: function() { this.element().toggleClass(APPOINTMENT_ALL_DAY_ITEM_CLASS, !!this.option("allDay")) }, _renderRecurrenceClass: function() { var rule = this.invoke("getField", "recurrenceRule", this.option("data")); if (recurrenceUtils.getRecurrenceRule(rule).isValid) { this.element().addClass(RECURRENCE_APPOINTMENT_CLASS) } }, _renderCompactClass: function() { this.element().toggleClass(COMPACT_APPOINTMENT_CLASS, !!this.option("isCompact")) }, _renderDirection: function() { this.element().addClass(DIRECTION_APPOINTMENT_CLASSES[this.option("direction")]) }, _renderResizable: function() { if (!this.option("allowResize") || this.option("isCompact")) { return } var config = this._resizingRules[this.option("direction")].apply(this); config.stepPrecision = "strict"; this._createComponent(this.element(), Resizable, extend(config, this.option("resizableConfig"))) } }).include(publisherMixin); registerComponent("dxSchedulerAppointment", Appointment); module.exports = Appointment }, /*!*********************************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.appointments.layout_manager.js ***! \*********************************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), VerticalAppointmentsStrategy = __webpack_require__( /*! ./ui.scheduler.appointments.strategy.vertical */ 495), HorizontalAppointmentsStrategy = __webpack_require__( /*! ./ui.scheduler.appointments.strategy.horizontal */ 497), HorizontalMonthLineAppointmentsStrategy = __webpack_require__( /*! ./ui.scheduler.appointments.strategy.horizontal_month_line */ 498), HorizontalMonthAppointmentsStrategy = __webpack_require__( /*! ./ui.scheduler.appointments.strategy.horizontal_month */ 499), AgendaAppointmentsStrategy = __webpack_require__( /*! ./ui.scheduler.appointments.strategy.agenda */ 500); var RENDERING_STRATEGIES = { horizontal: HorizontalAppointmentsStrategy, horizontalMonth: HorizontalMonthAppointmentsStrategy, horizontalMonthLine: HorizontalMonthLineAppointmentsStrategy, vertical: VerticalAppointmentsStrategy, agenda: AgendaAppointmentsStrategy }; var AppointmentLayoutManager = Class.inherit({ ctor: function(instance, renderingStrategy) { this.instance = instance; renderingStrategy && this.initRenderingStrategy(renderingStrategy) }, getCellDimensions: function(options) { if (this.instance._workSpace) { options.callback(this.instance._workSpace.getCellWidth(), this.instance._workSpace.getCellHeight(), this.instance._workSpace.getAllDayHeight()) } }, initRenderingStrategy: function(renderingStrategy) { var Strategy = RENDERING_STRATEGIES[renderingStrategy]; this._renderingStrategyInstance = new Strategy(this.instance); this.renderingStrategy = renderingStrategy }, createAppointmentsMap: function(items) { var result = []; this.getCellDimensions({ callback: function(width, height, allDayHeight) { this.instance._cellWidth = width; this.instance._cellHeight = height; this.instance._allDayCellHeight = allDayHeight }.bind(this) }); this._positionMap = this._renderingStrategyInstance.createTaskPositionMap(items); $.each(items, function(index, itemData) { var appointmentSettings = this._positionMap[index]; $.each(appointmentSettings, function(_, settings) { settings.direction = "vertical" === this.renderingStrategy && !settings.allDay ? "vertical" : "horizontal" }.bind(this)); result.push({ itemData: itemData, settings: appointmentSettings }) }.bind(this)); return result }, _markDeletedAppointments: function(renderedItems, appointments) { var itemFound, result = []; $.each(renderedItems, function(i, currentItem) { itemFound = false; $.each(appointments, function(i, item) { if (currentItem.itemData === item.itemData) { itemFound = true } }.bind(this)); if (!itemFound) { currentItem.needRemove = true; currentItem.needRepaint = false; result.push(currentItem) } }.bind(this)); return result }, markRepaintedAppointments: function(appointments, renderedItems) { var itemFound, isAgenda = "agenda" === this.renderingStrategy, updatedAppointment = this.instance.getUpdatedAppointment(), result = []; result = this._markDeletedAppointments(renderedItems, appointments); $.each(appointments, function(_, currentItem) { itemFound = false; currentItem.needRepaint = false; $.each(renderedItems, function(_, item) { if (currentItem.itemData === item.itemData) { item.needRepaint = false; itemFound = true; if (updatedAppointment && commonUtils.equalByValue(item.itemData, updatedAppointment)) { item.needRepaint = true } var settingsLength = currentItem.settings.length; for (var k = 0; k < settingsLength; k++) { var currentItemSettings = currentItem.settings[k], itemSettings = item.settings[k]; if (!isAgenda) { itemSettings.sortedIndex = currentItemSettings.sortedIndex } if (!commonUtils.equalByValue(currentItemSettings, itemSettings)) { item.settings = currentItem.settings; item.needRepaint = true; item.needRemove = false; isAgenda && result.push(item); break } } } }.bind(this)); if (!itemFound) { currentItem.needRepaint = true; currentItem.needRemove = false; renderedItems.push(currentItem); isAgenda && result.push(currentItem) } }.bind(this)); return isAgenda && result.length ? result : renderedItems }, getRenderingStrategyInstance: function() { return this._renderingStrategyInstance } }); module.exports = AppointmentLayoutManager }, /*!************************************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.appointments.strategy.vertical.js ***! \************************************************************************/ function(module, exports, __webpack_require__) { var BaseAppointmentsStrategy = __webpack_require__( /*! ./ui.scheduler.appointments.strategy.base */ 496), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63); var WEEK_APPOINTMENT_DEFAULT_OFFSET = 25; var VerticalRenderingStrategy = BaseAppointmentsStrategy.inherit({ getDeltaTime: function(args, initialSize, appointment) { var deltaTime = 0; if (this.isAllDay(appointment)) { deltaTime = 24 * this._getDeltaWidth(args, initialSize) * 60 * 6e4 } else { var deltaHeight = args.height - initialSize.height; if (deltaHeight < 0) { deltaHeight = this._correctOnePxGap(deltaHeight) } deltaTime = 6e4 * Math.round(deltaHeight / this._defaultHeight * this.instance.getAppointmentDurationInMinutes()) } return deltaTime }, getAppointmentGeometry: function(coordinates) { var result, allDay = coordinates.allDay; if (allDay) { result = this._getAllDayAppointmentGeometry(coordinates) } else { result = this._getSimpleAppointmentGeometry(coordinates) } return this.callBase(result) }, _getItemPosition: function(item) { var allDay = this.isAllDay(item); if (allDay) { return this.callBase(item) } var position = this._getAppointmentCoordinates(item), result = []; for (var j = 0; j < position.length; j++) { var height = this.calculateAppointmentHeight(item, position[j]), width = this.calculateAppointmentWidth(item, position[j]), resultHeight = height, appointmentReduced = null, multiDaysAppointmentParts = [], currentMaxAllowedPosition = position[j].vMax; if (this._isMultiDayAppointment(position[j], height)) { appointmentReduced = "head"; resultHeight = this._reduceMultiDayAppointment(height, { top: position[j].top, bottom: currentMaxAllowedPosition }); multiDaysAppointmentParts = this._getAppointmentParts({ sourceAppointmentHeight: height, reducedHeight: resultHeight, width: width }, position[j]) } extend(position[j], { height: resultHeight, width: width, allDay: allDay, appointmentReduced: appointmentReduced }); result = this._getAppointmentPartsPosition(multiDaysAppointmentParts, position[j], result) } return result }, _isMultiDayAppointment: function(position, height) { var maxTop = position.vMax, result = height > maxTop - position.top; return result }, _reduceMultiDayAppointment: function(sourceAppointmentHeight, bound) { sourceAppointmentHeight = bound.bottom - Math.floor(bound.top); return sourceAppointmentHeight }, _getAppointmentParts: function(appointmentGeometry, appointmentSettings) { var tailHeight = appointmentGeometry.sourceAppointmentHeight - appointmentGeometry.reducedHeight, width = appointmentGeometry.width, result = [], currentPartTop = 0, left = appointmentSettings.left + this._defaultWidth; if (tailHeight) { result.push(extend(true, {}, appointmentSettings, { top: currentPartTop, left: left, height: tailHeight, width: width, appointmentReduced: "tail", rowIndex: ++appointmentSettings.rowIndex })) } return result }, _correctOnePxGap: function(deltaHeight) { if (Math.abs(deltaHeight) % this._defaultHeight) { deltaHeight-- } return deltaHeight }, _getMinuteHeight: function() { return this._defaultHeight / this.instance.getAppointmentDurationInMinutes() }, _getCompactLeftCoordinate: function(itemLeft, index) { var cellBorderSize = 1, cellWidth = this._defaultWidth || this.getAppointmentMinSize(); return itemLeft + (cellBorderSize + cellWidth) * index }, _checkLongCompactAppointment: function(item, result) { if (item.allDay) { this._splitLongCompactAppointment(item, result) } return result }, _getAllDayAppointmentGeometry: function(coordinates) { var maxHeight = this._allDayHeight || this.getAppointmentMinSize(), index = coordinates.index, count = coordinates.count, height = maxHeight / (count > 3 ? 3 : count), width = coordinates.width, top = coordinates.top + index * height, left = coordinates.left, compactAppointmentDefaultSize = this.getCompactAppointmentDefaultSize(), compactAppointmentDefaultOffset = this.getCompactAppointmentDefaultOffset(); if (!this.instance._allowResizing() || !this.instance._allowAllDayResizing()) { coordinates.skipResizing = true } if (count > 2) { if (coordinates.isCompact) { top = coordinates.top + compactAppointmentDefaultOffset; left = coordinates.left + (index - 2) * (compactAppointmentDefaultSize + compactAppointmentDefaultOffset) + compactAppointmentDefaultOffset; height = compactAppointmentDefaultSize; width = compactAppointmentDefaultSize; this._markAppointmentAsVirtual(coordinates, true) } else { top += height } } return { height: height, width: width, top: top, left: left } }, _getSimpleAppointmentGeometry: function(coordinates) { var width = this._getAppointmentMaxWidth() / coordinates.count, height = coordinates.height, top = coordinates.top, left = coordinates.left + coordinates.index * width; return { height: height, width: width, top: top, left: left } }, isAllDay: function(appointmentData) { var allDay = this.instance.fire("getField", "allDay", appointmentData); if (allDay) { return true } return this.instance.appointmentTakesAllDay(appointmentData) }, _getAppointmentMaxWidth: function() { return this._defaultWidth - WEEK_APPOINTMENT_DEFAULT_OFFSET || this.getAppointmentMinSize() }, calculateAppointmentWidth: function(appointment, position) { if (!this.isAllDay(appointment)) { return 0 } var startDate = new Date(this._startDate(appointment, false, position)), endDate = this._endDate(appointment, position), cellWidth = this._defaultWidth || this.getAppointmentMinSize(); startDate = dateUtils.trimTime(startDate); var durationInHours = (endDate.getTime() - startDate.getTime()) / 36e5; var width = Math.ceil(durationInHours / 24) * cellWidth; return width }, calculateAppointmentHeight: function(appointment, position) { var endDate = this._endDate(appointment, position), startDate = this._startDate(appointment, false, position), allDay = this.instance.fire("getField", "allDay", appointment); if (this.isAllDay(appointment)) { return 0 } var durationInMinutes = this._getAppointmentDurationInMs(startDate, endDate, allDay) / 6e4; var minHeight = this.getAppointmentMinSize(), height = Math.round(durationInMinutes * this._getMinuteHeight()); if (height < minHeight) { height = minHeight } return height }, _sortCondition: function(a, b) { var allDayCondition = a.allDay - b.allDay, result = allDayCondition ? allDayCondition : this._rowCondition(a, b); return this._fixUnstableSorting(result, a, b) } }); module.exports = VerticalRenderingStrategy }, /*!********************************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.appointments.strategy.base.js ***! \********************************************************************/ function(module, exports, __webpack_require__) { var noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, Class = __webpack_require__( /*! ../../core/class */ 25), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, errors = __webpack_require__( /*! ../widget/ui.errors */ 22), dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63); var abstract = Class.abstract; var APPOINTMENT_MIN_SIZE = 2, COMPACT_APPOINTMENT_DEFAULT_SIZE = 15, COMPACT_APPOINTMENT_DEFAULT_OFFSET = 3; var BaseRenderingStrategy = Class.inherit({ ctor: function(instance) { this.instance = instance }, getAppointmentMinSize: function() { return APPOINTMENT_MIN_SIZE }, getDeltaTime: abstract, getAppointmentGeometry: function(coordinates) { return coordinates }, createTaskPositionMap: function(items) { var length = items.length; if (!length) { return } this._defaultWidth = this.instance._cellWidth; this._defaultHeight = this.instance._cellHeight; this._allDayHeight = this.instance._allDayCellHeight; var map = []; for (var i = 0; i < length; i++) { var coordinates = this._getItemPosition(items[i]); if (this._isRtl()) { coordinates = this._correctRtlCoordinates(coordinates) } map.push(coordinates) } var positionArray = this._getSortedPositions(map), resultPositions = this._getResultPositions(positionArray); return this._getExtendedPositionMap(map, resultPositions) }, _getDeltaWidth: function(args, initialSize) { var cellWidth = this._defaultWidth || this.getAppointmentMinSize(), initialWidth = initialSize.width; return Math.round((args.width - initialWidth) / cellWidth) }, _correctRtlCoordinates: function(coordinates) { var width = coordinates[0].width || this._getAppointmentMaxWidth(); if (!coordinates[0].appointmentReduced) { coordinates[0].left -= width } this._correctRtlCoordinatesParts(coordinates, width); return coordinates }, _correctRtlCoordinatesParts: noop, _getAppointmentMaxWidth: function() { return this._defaultWidth }, _getItemPosition: function(item) { var position = this._getAppointmentCoordinates(item), allDay = this.isAllDay(item), result = [], startDate = new Date(this.instance.fire("getField", "startDate", item)); for (var j = 0; j < position.length; j++) { var height = this.calculateAppointmentHeight(item, position[j]), width = this.calculateAppointmentWidth(item, position[j]), resultWidth = width, appointmentReduced = null, multiWeekAppointmentParts = [], initialRowIndex = position[j].rowIndex, initialCellIndex = position[j].cellIndex; if (this._needVerifyItemSize() || allDay) { var currentMaxAllowedPosition = position[j].hMax; if (this.isAppointmentGreaterThan(currentMaxAllowedPosition, { left: position[j].left, width: width })) { appointmentReduced = "head"; initialRowIndex = position[j].rowIndex; initialCellIndex = position[j].cellIndex; resultWidth = this._reduceMultiWeekAppointment(width, { left: position[j].left, right: currentMaxAllowedPosition }); multiWeekAppointmentParts = this._getAppointmentParts({ sourceAppointmentWidth: width, reducedWidth: resultWidth, height: height }, position[j], startDate, j); if (this._isRtl()) { position[j].left = currentMaxAllowedPosition } } } extend(position[j], { height: height, width: resultWidth, allDay: allDay, rowIndex: initialRowIndex, cellIndex: initialCellIndex, appointmentReduced: appointmentReduced }); result = this._getAppointmentPartsPosition(multiWeekAppointmentParts, position[j], result) } return result }, _getAppointmentPartsPosition: function(appointmentParts, position, result) { if (appointmentParts.length) { appointmentParts.unshift(position); result = result.concat(appointmentParts) } else { result.push(position) } return result }, _getAppointmentCoordinates: function(itemData) { var coordinates = [{ top: 0, left: 0 }]; this.instance.fire("needCoordinates", { startDate: this._startDate(itemData), originalStartDate: this._startDate(itemData, true), appointmentData: itemData, callback: function(value) { coordinates = value } }); return coordinates }, _needVerifyItemSize: function() { return false }, _isRtl: function() { return this.instance.option("rtlEnabled") }, _getAppointmentParts: function() { return [] }, _getCompactAppointmentParts: function(appointmentWidth) { var cellWidth = this._defaultWidth || this.getAppointmentMinSize(); return Math.round(appointmentWidth / cellWidth) }, _reduceMultiWeekAppointment: function(sourceAppointmentWidth, bound) { if (this._isRtl()) { sourceAppointmentWidth = Math.floor(bound.left - bound.right) } else { sourceAppointmentWidth = bound.right - Math.floor(bound.left) } return sourceAppointmentWidth }, calculateAppointmentHeight: function() { return 0 }, calculateAppointmentWidth: function() { return 0 }, isAppointmentGreaterThan: function(etalon, comparisonParameters) { var result = comparisonParameters.left + comparisonParameters.width - etalon; if (this._isRtl()) { result = etalon + comparisonParameters.width - comparisonParameters.left } return result > this._defaultWidth / 2 }, isAllDay: function() { return false }, _getSortedPositions: function(arr) { var result = [], __tmpIndex = 0; for (var i = 0, arrLength = arr.length; i < arrLength; i++) { for (var j = 0, itemLength = arr[i].length; j < itemLength; j++) { var item = arr[i][j]; var start = { i: i, j: j, top: item.top, left: item.left, isStart: true, allDay: item.allDay, __tmpIndex: __tmpIndex }; __tmpIndex++; var end = { i: i, j: j, top: item.top + item.height, left: item.left + item.width, isStart: false, allDay: item.allDay, __tmpIndex: __tmpIndex }; result.push(start, end); __tmpIndex++ } } result.sort(function(a, b) { return this._sortCondition(a, b) }.bind(this)); return result }, _fixUnstableSorting: function(comparisonResult, a, b) { if (0 === comparisonResult) { if (a.__tmpIndex < b.__tmpIndex) { return -1 } if (a.__tmpIndex > b.__tmpIndex) { return 1 } } return comparisonResult }, _sortCondition: abstract, _rowCondition: function(a, b) { var columnCondition = this._normalizeCondition(a.left, b.left), rowCondition = this._normalizeCondition(a.top, b.top); return columnCondition ? columnCondition : rowCondition ? rowCondition : a.isStart - b.isStart }, _columnCondition: function(a, b) { var columnCondition = this._normalizeCondition(a.left, b.left), rowCondition = this._normalizeCondition(a.top, b.top); return rowCondition ? rowCondition : columnCondition ? columnCondition : a.isStart - b.isStart }, _normalizeCondition: function(first, second) { var result = first - second; return Math.abs(result) > 1.001 ? result : 0 }, _getResultPositions: function(sortedArray) { var position, stack = [], indexes = [], result = [], intersectPositions = [], intersectPositionCount = 0, sortedIndex = 0; for (var i = 0; i < sortedArray.length; i++) { var j, current = sortedArray[i]; if (current.isStart) { position = void 0; for (j = 0; j < indexes.length; j++) { if (!indexes[j]) { position = j; indexes[j] = true; break } } if (void 0 === position) { position = indexes.length; indexes.push(true); for (j = 0; j < stack.length; j++) { stack[j].count++ } } stack.push({ index: position, count: indexes.length, i: current.i, j: current.j, sortedIndex: sortedIndex++ }); if (intersectPositionCount < indexes.length) { intersectPositionCount = indexes.length } } else { var removeIndex = this._findIndexByKey(stack, "i", "j", current.i, current.j), resultItem = stack[removeIndex]; stack.splice(removeIndex, 1); indexes[resultItem.index] = false; intersectPositions.push(resultItem); if (!stack.length) { indexes = []; for (var k = 0; k < intersectPositions.length; k++) { intersectPositions[k].count = intersectPositionCount } intersectPositions = []; intersectPositionCount = 0 } result.push(resultItem) } } return result.sort(function(a, b) { var columnCondition = a.j - b.j, rowCondition = a.i - b.i; return rowCondition ? rowCondition : columnCondition }) }, _findIndexByKey: function(arr, iKey, jKey, iValue, jValue) { var result = 0; for (var i = 0, len = arr.length; i < len; i++) { if (arr[i][iKey] === iValue && arr[i][jKey] === jValue) { result = i; break } } return result }, _getExtendedPositionMap: function(map, positions) { var positionCounter = 0, result = []; for (var i = 0, mapLength = map.length; i < mapLength; i++) { var resultString = []; for (var j = 0, itemLength = map[i].length; j < itemLength; j++) { map[i][j].index = positions[positionCounter].index; map[i][j].sortedIndex = positions[positionCounter].sortedIndex; map[i][j].count = positions[positionCounter++].count; resultString.push(map[i][j]); this._checkLongCompactAppointment(map[i][j], resultString) } result.push(resultString) } return result }, _checkLongCompactAppointment: noop, _splitLongCompactAppointment: function(item, result) { var compactCount = 0; if (item.index > 1) { item.isCompact = true; compactCount = this._getCompactAppointmentParts(item.width); for (var k = 1; k < compactCount; k++) { var compactPart = extend(true, {}, item); compactPart.left = this._getCompactLeftCoordinate(item.left, k); compactPart.cellIndex = compactPart.cellIndex + k; compactPart.sortedIndex = null; result.push(compactPart) } } return result }, _startDate: function(appointment, skipNormalize, position) { var startDate = position && position.startDate, viewStartDate = this.instance._getStartDate(appointment, skipNormalize), text = this.instance.fire("getField", "text", appointment); if (startDate && viewStartDate > startDate || !startDate) { startDate = viewStartDate } if (isNaN(startDate.getTime())) { throw errors.Error("E1032", text) } return startDate }, _endDate: function(appointment, position) { var endDate = this.instance._getEndDate(appointment), realStartDate = this._startDate(appointment, true), viewStartDate = this._startDate(appointment, false, position); if (!endDate || realStartDate.getTime() >= endDate.getTime()) { endDate = new Date(realStartDate.getTime() + 6e4 * this.instance.getAppointmentDurationInMinutes()); this.instance.fire("setField", "endDate", appointment, endDate) } if (viewStartDate >= endDate) { var recurrencePartStartDate = position ? position.startDate : realStartDate, fullDuration = endDate.getTime() - realStartDate.getTime(); endDate = new Date(viewStartDate.getTime() + fullDuration); if (!dateUtils.sameDate(realStartDate, endDate) && recurrencePartStartDate < viewStartDate) { var headDuration = dateUtils.trimTime(endDate).getTime() - recurrencePartStartDate.getTime(), tailDuration = fullDuration - headDuration || fullDuration; endDate = new Date(dateUtils.trimTime(viewStartDate).getTime() + tailDuration) } } var viewEndDate = dateUtils.roundToHour(this.instance.fire("getEndViewDate")); if (endDate > viewEndDate) { endDate = viewEndDate } return endDate }, _getAppointmentDurationInMs: function(startDate, endDate, allDay) { var result; this.instance.fire("getAppointmentDurationInMs", { startDate: startDate, endDate: endDate, allDay: allDay, callback: function(duration) { result = duration } }); return result }, _getMaxNeighborAppointmentCount: function() { var outerAppointmentWidth = this.getCompactAppointmentDefaultSize() + this.getCompactAppointmentDefaultOffset(); return Math.floor(this.getCompactAppointmentGroupMaxWidth() / outerAppointmentWidth) }, _markAppointmentAsVirtual: function(coordinates, isAllDay) { var countFullWidthAppointmentInCell = 2; if (coordinates.count - countFullWidthAppointmentInCell > this._getMaxNeighborAppointmentCount()) { coordinates.virtual = { top: coordinates.top, left: coordinates.left, index: coordinates.groupIndex + "-" + coordinates.rowIndex + "-" + coordinates.cellIndex, isAllDay: isAllDay } } }, getCompactAppointmentGroupMaxWidth: function() { var widthInPercents = 75; return widthInPercents * this.getDefaultCellWidth() / 100 }, getDefaultCellWidth: function() { return this._defaultWidth }, getCompactAppointmentDefaultSize: function() { return COMPACT_APPOINTMENT_DEFAULT_SIZE }, getCompactAppointmentDefaultOffset: function() { return COMPACT_APPOINTMENT_DEFAULT_OFFSET }, getAppointmentDataCalculator: noop }); module.exports = BaseRenderingStrategy }, /*!**************************************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.appointments.strategy.horizontal.js ***! \**************************************************************************/ function(module, exports, __webpack_require__) { var BaseAppointmentsStrategy = __webpack_require__( /*! ./ui.scheduler.appointments.strategy.base */ 496), dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63); var MAX_APPOINTMENT_HEIGHT = 100, BOTTOM_CELL_GAP = 20, toMs = dateUtils.dateToMilliseconds; var HorizontalRenderingStrategy = BaseAppointmentsStrategy.inherit({ _needVerifyItemSize: function() { return true }, calculateAppointmentWidth: function(appointment, position) { var width, cellWidth = this._defaultWidth || this.getAppointmentMinSize(), allDay = this.instance.fire("getField", "allDay", appointment), minWidth = this.getAppointmentMinSize(); var startDate = this._startDate(appointment, false, position), endDate = this._endDate(appointment, position), appointmentDuration = this._getAppointmentDurationInMs(startDate, endDate, allDay); var cellDuration = this.instance.getAppointmentDurationInMinutes() * toMs("minute"), durationInCells = appointmentDuration / cellDuration; width = durationInCells * cellWidth; if (width < minWidth) { width = minWidth } return width }, getAppointmentGeometry: function(coordinates) { var result = this._customizeAppointmentGeometry(coordinates); return this.callBase(result) }, _customizeAppointmentGeometry: function(coordinates) { var cellHeight = (this._defaultHeight || this.getAppointmentMinSize()) - BOTTOM_CELL_GAP, height = cellHeight / coordinates.count; if (height > MAX_APPOINTMENT_HEIGHT) { height = MAX_APPOINTMENT_HEIGHT } var top = coordinates.top + coordinates.index * height; return { height: height, width: coordinates.width, top: top, left: coordinates.left } }, _correctRtlCoordinatesParts: function(coordinates, width) { for (var i = 1; i < coordinates.length; i++) { coordinates[i].left -= width } return coordinates }, _sortCondition: function(a, b) { var result = this._columnCondition(a, b); return this._fixUnstableSorting(result, a, b) }, _getMaxAppointmentWidth: function(startDate) { var result; this.instance.fire("getMaxAppointmentWidth", { date: startDate, callback: function(width) { result = width } }); return result }, getDeltaTime: function(args, initialSize) { var deltaTime = 0, deltaWidth = args.width - initialSize.width; deltaTime = 6e4 * Math.round(deltaWidth / this._defaultWidth * this.instance.getAppointmentDurationInMinutes()); return deltaTime }, isAllDay: function(appointmentData) { return this.instance.fire("getField", "allDay", appointmentData) } }); module.exports = HorizontalRenderingStrategy }, /*!*************************************************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.appointments.strategy.horizontal_month_line.js ***! \*************************************************************************************/ function(module, exports, __webpack_require__) { var HorizontalAppointmentsStrategy = __webpack_require__( /*! ./ui.scheduler.appointments.strategy.horizontal */ 497), dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63), query = __webpack_require__( /*! ../../data/query */ 159); var HorizontalMonthLineRenderingStrategy = HorizontalAppointmentsStrategy.inherit({ calculateAppointmentWidth: function(appointment, position) { var startDate = new Date(this._startDate(appointment, false, position)), endDate = new Date(this._endDate(appointment, position)), cellWidth = this._defaultWidth || this.getAppointmentMinSize(); startDate = dateUtils.trimTime(startDate); var durationInHours = (endDate.getTime() - startDate.getTime()) / 36e5; return Math.ceil(durationInHours / 24) * cellWidth }, getDeltaTime: function(args, initialSize) { var deltaWidth = this._getDeltaWidth(args, initialSize); return 864e5 * deltaWidth }, isAllDay: function() { return false }, createTaskPositionMap: function(items, skipSorting) { if (!skipSorting) { this.instance.getAppointmentsInstance()._sortAppointmentsByStartDate(items) } return this.callBase(items) }, _getSortedPositions: function(map, skipSorting) { var result = this.callBase(map); if (!skipSorting) { result = query(result).sortBy("top").thenBy("left").thenBy("i").toArray() } return result } }); module.exports = HorizontalMonthLineRenderingStrategy }, /*!********************************************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.appointments.strategy.horizontal_month.js ***! \********************************************************************************/ function(module, exports, __webpack_require__) { var noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, HorizontalMonthLineAppointmentsStrategy = __webpack_require__( /*! ./ui.scheduler.appointments.strategy.horizontal_month_line */ 498); var MONTH_APPOINTMENT_HEIGHT_RATIO = .6; var HorizontalMonthRenderingStrategy = HorizontalMonthLineAppointmentsStrategy.inherit({ _getAppointmentParts: function(appointmentGeometry, appointmentSettings, startDate, groupIndex) { var deltaWidth = appointmentGeometry.sourceAppointmentWidth - appointmentGeometry.reducedWidth, height = appointmentGeometry.height, fullWeekAppointmentWidth = this._getFullWeekAppointmentWidth(groupIndex), maxAppointmentWidth = this._getMaxAppointmentWidth(startDate), longPartCount = Math.ceil(deltaWidth / fullWeekAppointmentWidth) - 1, tailWidth = Math.floor(deltaWidth % fullWeekAppointmentWidth) || fullWeekAppointmentWidth, result = [], totalWidth = appointmentGeometry.reducedWidth + tailWidth, currentPartTop = appointmentSettings.top + this._defaultHeight, left = this._calculateMultiWeekAppointmentLeftOffset(appointmentSettings.hMax, fullWeekAppointmentWidth); for (var i = 0; i < longPartCount; i++) { if (totalWidth > maxAppointmentWidth) { break } result.push(extend(true, {}, appointmentSettings, { top: currentPartTop, left: left, height: height, width: fullWeekAppointmentWidth, appointmentReduced: "body", rowIndex: ++appointmentSettings.rowIndex, cellIndex: 0 })); currentPartTop += this._defaultHeight; totalWidth += fullWeekAppointmentWidth } if (tailWidth) { if (this._isRtl()) { left += fullWeekAppointmentWidth - tailWidth } result.push(extend(true, {}, appointmentSettings, { top: currentPartTop, left: left, height: height, width: tailWidth, appointmentReduced: "tail", rowIndex: ++appointmentSettings.rowIndex, cellIndex: 0 })) } return result }, _calculateMultiWeekAppointmentLeftOffset: function(max, width) { return this._isRtl() ? max : max - width }, _correctRtlCoordinatesParts: noop, _getFullWeekAppointmentWidth: function(groupIndex) { this.instance.fire("getFullWeekAppointmentWidth", { groupIndex: groupIndex, callback: function(width) { this._maxFullWeekAppointmentWidth = width }.bind(this) }); return this._maxFullWeekAppointmentWidth }, _getCompactLeftCoordinate: function(itemLeft, index) { var cellWidth = this._defaultWidth || this.getAppointmentMinSize(); return itemLeft + cellWidth * index }, _checkLongCompactAppointment: function(item, result) { this._splitLongCompactAppointment(item, result); return result }, _customizeAppointmentGeometry: function(coordinates) { var compactAppointmentDefaultSize, compactAppointmentDefaultOffset, maxHeight = this._defaultHeight || this.getAppointmentMinSize(), index = coordinates.index, height = MONTH_APPOINTMENT_HEIGHT_RATIO * maxHeight / 2, top = (1 - MONTH_APPOINTMENT_HEIGHT_RATIO) * maxHeight + coordinates.top + index * height, width = coordinates.width, left = coordinates.left; if (coordinates.isCompact) { compactAppointmentDefaultSize = this.getCompactAppointmentDefaultSize(); compactAppointmentDefaultOffset = this.getCompactAppointmentDefaultOffset(); top = coordinates.top + compactAppointmentDefaultOffset; left = coordinates.left + (index - 2) * (compactAppointmentDefaultSize + compactAppointmentDefaultOffset) + compactAppointmentDefaultOffset; height = compactAppointmentDefaultSize; width = compactAppointmentDefaultSize; this._markAppointmentAsVirtual(coordinates) } return { height: height, width: width, top: top, left: left } }, createTaskPositionMap: function(items) { return this.callBase(items, true) }, _getSortedPositions: function(map) { return this.callBase(map, true) } }); module.exports = HorizontalMonthRenderingStrategy }, /*!**********************************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.appointments.strategy.agenda.js ***! \**********************************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63), BaseAppointmentsStrategy = __webpack_require__( /*! ./ui.scheduler.appointments.strategy.base */ 496); var AgendaRenderingStrategy = BaseAppointmentsStrategy.inherit({ ctor: function(instance) { this.instance = instance }, getAppointmentMinSize: noop, getDeltaTime: noop, getAppointmentGeometry: function(geometry) { return geometry }, createTaskPositionMap: function(appointments) { if (appointments.length) { var height = this.instance.fire("getAgendaVerticalStepHeight"), appointmentsByResources = this.instance.fire("groupAppointmentsByResources", appointments), groupedAppts = []; $.each(appointmentsByResources, function(i, appts) { var additionalAppointments = [], recurrentIndexes = []; $.each(appts, function(index, appointment) { var recurrenceBatch = this.instance.getAppointmentsInstance()._processRecurrenceAppointment(appointment, index), appointmentBatch = null; if (!recurrenceBatch.indexes.length) { appointmentBatch = { parts: [] }; appointmentBatch = this.instance.getAppointmentsInstance()._processLongAppointment(appointment); additionalAppointments = additionalAppointments.concat(appointmentBatch.parts) } additionalAppointments = additionalAppointments.concat(recurrenceBatch.parts); recurrentIndexes = recurrentIndexes.concat(recurrenceBatch.indexes) }.bind(this)); this.instance.getAppointmentsInstance()._reduceRecurrenceAppointments(recurrentIndexes, appts); this.instance.getAppointmentsInstance()._combineAppointments(appts, additionalAppointments); groupedAppts = groupedAppts.concat(appts) }.bind(this)); Array.prototype.splice.apply(appointments, [0, appointments.length].concat(groupedAppts)) } var result = [], sortedIndex = 0; appointments.forEach(function(appt, index) { result.push([{ height: height, width: "100%", sortedIndex: sortedIndex++, groupIndex: this._calculateGroupIndex(index, appointmentsByResources), appointmentReduced: this._calculateIfApptReduced(appt) }]) }.bind(this)); return result }, _calculateIfApptReduced: function(appointment) { var isRecurrence = !!this.instance.fire("getField", "recurrenceRule", appointment), result = false; if (this.instance.fire("appointmentTakesSeveralDays", appointment) && !isRecurrence) { result = "head" } return result }, _calculateGroupIndex: function(apptIndex, appointmentsByResources) { var resultInd, counter = 0; for (var i in appointmentsByResources) { var countApptInGroup = appointmentsByResources[i].length; if (apptIndex >= counter && apptIndex < counter + countApptInGroup) { resultInd = Number(i); break } counter += countApptInGroup } return resultInd }, _getDeltaWidth: noop, _correctRtlCoordinatesParts: noop, _getAppointmentMaxWidth: function() { return this._defaultWidth }, _needVerifyItemSize: function() { return false }, _isRtl: function() { return this.instance.option("rtlEnabled") }, _getAppointmentParts: noop, _reduceMultiWeekAppointment: noop, calculateAppointmentHeight: function() { return 0 }, calculateAppointmentWidth: function() { return 0 }, isAppointmentGreaterThan: noop, isAllDay: function() { return false }, _sortCondition: noop, _rowCondition: noop, _columnCondition: noop, _findIndexByKey: noop, _getMaxNeighborAppointmentCount: noop, _markAppointmentAsVirtual: noop, getCompactAppointmentGroupMaxWidth: noop, getDefaultCellWidth: function() { return this._defaultWidth }, getCompactAppointmentDefaultSize: noop, getCompactAppointmentDefaultOffset: noop, calculateRows: function(appointments, agendaDuration, currentDate, needClearSettings) { this._rows = []; var appts = { indexes: [], parts: [] }; var groupedAppointments = this.instance.fire("groupAppointmentsByResources", appointments); currentDate = dateUtils.trimTime(new Date(currentDate)); $.each(groupedAppointments, function(groupIndex, currentAppointments) { var groupResult = []; if (!currentAppointments.length) { this._rows.push([]); return true } $.each(currentAppointments, function(index, appointment) { needClearSettings && delete appointment.settings; var result = this.instance.getAppointmentsInstance()._processRecurrenceAppointment(appointment, index, false); appts.parts = appts.parts.concat(result.parts); appts.indexes = appts.indexes.concat(result.indexes) }.bind(this)); this.instance.getAppointmentsInstance()._reduceRecurrenceAppointments(appts.indexes, currentAppointments); $.merge(currentAppointments, appts.parts); var appointmentCount = currentAppointments.length; for (var i = 0; i < agendaDuration; i++) { var day = new Date(currentDate); day.setMilliseconds(day.getMilliseconds() + 864e5 * i); if (void 0 === groupResult[i]) { groupResult[i] = 0 } for (var j = 0; j < appointmentCount; j++) { var appointmentData = currentAppointments[j].settings || currentAppointments[j], appointmentIsLong = this.instance.fire("appointmentTakesSeveralDays", currentAppointments[j]); if (this.instance.fire("dayHasAppointment", day, appointmentData, true) || appointmentIsLong && this.instance.fire("dayHasAppointment", day, currentAppointments[j], true)) { groupResult[i] += 1 } } } this._rows.push(groupResult) }.bind(this)); return this._rows }, _iterateRow: function(row, obj, index) { for (var i = 0; i < row.length; i++) { obj.counter = obj.counter + row[i]; if (obj.counter >= index) { obj.indexInRow = i; break } } }, getDateByIndex: function(index, rows, startViewDate) { var obj = { counter: 0, indexInRow: 0 }; index++; for (var i = 0; i < rows.length; i++) { this._iterateRow(rows[i], obj, index); if (obj.indexInRow) { break } } return new Date(new Date(startViewDate).setDate(startViewDate.getDate() + obj.indexInRow)) }, getAppointmentDataCalculator: function() { return function($appointment, originalStartDate) { var apptIndex = $appointment.index(), startViewDate = this.instance.getStartViewDate(), calculatedStartDate = this.getDateByIndex(apptIndex, this._rows, startViewDate), wrappedOriginalStartDate = new Date(originalStartDate); return { startDate: new Date(calculatedStartDate.setHours(wrappedOriginalStartDate.getHours(), wrappedOriginalStartDate.getMinutes(), wrappedOriginalStartDate.getSeconds(), wrappedOriginalStartDate.getMilliseconds())) } }.bind(this) } }); module.exports = AgendaRenderingStrategy }, /*!****************************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.appointments.drop_down.js ***! \****************************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), translator = __webpack_require__( /*! ../../animation/translator */ 69), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), Button = __webpack_require__( /*! ../button */ 201), DropDownMenu = __webpack_require__( /*! ../drop_down_menu */ 281); var DROPDOWN_APPOINTMENTS_CLASS = "dx-scheduler-dropdown-appointments", DROPDOWN_APPOINTMENTS_CONTENT_CLASS = "dx-scheduler-dropdown-appointments-content", DROPDOWN_APPOINTMENT_CLASS = "dx-scheduler-dropdown-appointment", DROPDOWN_APPOINTMENT_TITLE_CLASS = "dx-scheduler-dropdown-appointment-title", DROPDOWN_APPOINTMENT_DATE_CLASS = "dx-scheduler-dropdown-appointment-date", DROPDOWN_APPOINTMENT_REMOVE_BUTTON_CLASS = "dx-scheduler-dropdown-appointment-remove-button", DROPDOWN_APPOINTMENT_EDIT_BUTTON_CLASS = "dx-scheduler-dropdown-appointment-edit-button", DROPDOWN_APPOINTMENT_INFO_BLOCK_CLASS = "dx-scheduler-dropdown-appointment-info-block", DROPDOWN_APPOINTMENT_BUTTONS_BLOCK_CLASS = "dx-scheduler-dropdown-appointment-buttons-block"; var dropDownAppointments = Class.inherit({ render: function(options, instance) { var coordinates = options.coordinates, items = options.items; this.instance = instance; var $menu = $("<div>").addClass(DROPDOWN_APPOINTMENTS_CLASS).appendTo(options.$container); this._createDropDownMenu({ $element: $menu, items: items, itemTemplate: options.itemTemplate, buttonWidth: options.buttonWidth, onAppointmentClick: options.onAppointmentClick }); this._paintMenuButton($menu, options.buttonColor, items); this._applyInnerShadow($menu, options.buttonWidth); translator.move($menu, { top: coordinates.top, left: coordinates.left }); return $menu }, repaintExisting: function($container) { var appointmentsSelector = ["", DROPDOWN_APPOINTMENTS_CLASS, "dx-dropdownmenu"].join("."); $container.find(appointmentsSelector).each(function() { DropDownMenu.getInstance(this).repaint() }) }, _paintMenuButton: function($menu, color, menuItems) { var currentItemColor, paintButton = true, itemsColors = menuItems.colors, itemColorCount = itemsColors.length; if (itemColorCount) { currentItemColor = itemsColors[0]; for (var i = 1; i < itemColorCount; i++) { if (currentItemColor !== itemsColors[i]) { paintButton = false; break } currentItemColor = itemsColors[i] } } if (color && paintButton) { $menu.css("background-color", color) } }, _createButtonTemplate: function(appointmentCount) { return $("<div />").html([$("<span />").text(appointmentCount), $("<span />").text("...")]).addClass(DROPDOWN_APPOINTMENTS_CONTENT_CLASS) }, _applyInnerShadow: function($element) { $element.css("box-shadow", "inset " + $element.outerWidth() + "px 0 0 0 rgba(0, 0, 0, 0.3)") }, _createDropDownMenu: function(config) { var itemTemplate, $element = config.$element, items = config.items, onAppointmentClick = config.onAppointmentClick; if (!DropDownMenu.getInstance($element)) { itemTemplate = function(appointmentData, index, appointmentElement) { this._createDropDownAppointmentTemplate(appointmentData, appointmentElement, items.colors[index]) }.bind(this); var instance = this.instance; this.instance._createComponent($element, DropDownMenu, { buttonIcon: null, usePopover: true, popupHeight: 200, items: items.data, buttonTemplate: this._createButtonTemplate(items.data.length), buttonWidth: config.buttonWidth, onItemClick: function(args) { args.component.open(); if (commonUtils.isFunction(onAppointmentClick)) { onAppointmentClick.call(instance._appointments, args) } }, activeStateEnabled: false, focusStateEnabled: false, itemTemplate: itemTemplate }) } }, _createDropDownAppointmentTemplate: function(appointmentData, appointmentElement, color) { var $title, $date, $infoBlock, dateString = "", appointmentMarkup = [], borderSide = "left", text = this.instance.fire("getField", "text", appointmentData); appointmentElement.addClass(DROPDOWN_APPOINTMENT_CLASS); if (this.instance.option("rtlEnabled")) { borderSide = "right" } if (color) { appointmentElement.css("border-" + borderSide + "-color", color) } var startDate = this.instance.fire("getField", "startDate", appointmentData), endDate = this.instance.fire("getField", "endDate", appointmentData); this.instance.fire("formatDates", { startDate: startDate, endDate: endDate, formatType: "DATETIME", callback: function(result) { dateString = result } }); $infoBlock = $("<div />").addClass(DROPDOWN_APPOINTMENT_INFO_BLOCK_CLASS); $title = $("<div>").addClass(DROPDOWN_APPOINTMENT_TITLE_CLASS).text(text); $date = $("<div>").addClass(DROPDOWN_APPOINTMENT_DATE_CLASS).text(dateString); $infoBlock.append([$title, $date]); appointmentMarkup.push($infoBlock); appointmentMarkup.push(this._createButtons(appointmentData)); appointmentElement.append(appointmentMarkup) }, _createButtons: function(appointmentData) { var editing = this.instance.option("editing"), allowDeleting = false, allowUpdating = false; if (!editing) { return "" } if (true === editing) { allowDeleting = true; allowUpdating = true } if (commonUtils.isObject(editing)) { allowDeleting = editing.allowDeleting; allowUpdating = editing.allowUpdating } var $container = $("<div />").addClass(DROPDOWN_APPOINTMENT_BUTTONS_BLOCK_CLASS), $removeButton = $("<div>").addClass(DROPDOWN_APPOINTMENT_REMOVE_BUTTON_CLASS), $editButton = $("<div>").addClass(DROPDOWN_APPOINTMENT_EDIT_BUTTON_CLASS); if (allowDeleting) { $container.append($removeButton); this.instance._createComponent($removeButton, Button, { icon: "trash", height: 25, width: 25, onClick: function(e) { e.jQueryEvent.stopPropagation(); this.instance.deleteAppointment(appointmentData) }.bind(this) }) } if (allowUpdating) { $container.append($editButton); this.instance._createComponent($editButton, Button, { icon: "edit", height: 25, width: 25, onClick: function(e) { e.jQueryEvent.stopPropagation(); this.instance.fire("showEditAppointmentPopup", { data: appointmentData }) }.bind(this) }) } return $container } }); module.exports = dropDownAppointments }, /*!***************************************!*\ !*** ./js/ui/scheduler/ui.loading.js ***! \***************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), viewPortUtils = __webpack_require__( /*! ../../core/utils/view_port */ 55), LoadPanel = __webpack_require__( /*! ../load_panel */ 246); var loading = null; var createLoadPanel = function(options) { return new LoadPanel($("<div>").appendTo(options && options.container || viewPortUtils.value()), options) }; var removeLoadPanel = function() { if (!loading) { return } loading.element().remove(); loading = null }; exports.show = function(options) { removeLoadPanel(); loading = createLoadPanel(options); return loading.show() }; exports.hide = function() { if (!loading) { return $.Deferred().resolve() } return loading.hide().done(removeLoadPanel).promise() } }, /*!**********************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.appointment_form.js ***! \**********************************************************/ function(module, exports, __webpack_require__) { var Form = __webpack_require__( /*! ../form */ 285), dateSerialization = __webpack_require__( /*! ../../core/utils/date_serialization */ 259), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), clickEvent = __webpack_require__( /*! ../../events/click */ 75); __webpack_require__( /*! ./ui.scheduler.recurrence_editor */ 504); __webpack_require__( /*! ./ui.scheduler.timezone_editor */ 505); __webpack_require__( /*! ../text_area */ 320); __webpack_require__( /*! ../tag_box */ 319); var RECURRENCE_EDITOR_ITEM_CLASS = "dx-scheduler-recurrence-rule-item"; var SchedulerAppointmentForm = { _appointmentForm: {}, _validateAppointmentFormDate: function(editor, value, previousValue) { var isCorrectDate = !!value; if (!isCorrectDate) { editor.option("value", previousValue) } }, _getAllDayStartDate: function(startDate) { startDate.setHours(0); startDate.setMinutes(0); return startDate }, _getAllDayEndDate: function(startDate) { var endDate = new Date(startDate); endDate.setDate(startDate.getDate() + 1); return endDate }, create: function(componentCreator, $container, isReadOnly, formData) { this._appointmentForm = componentCreator($container, Form, { items: this._editors, readOnly: isReadOnly, showValidationSummary: true, scrollingEnabled: true, formData: formData }); return this._appointmentForm }, prepareAppointmentFormEditors: function(allDay, dataExprs, schedulerInst) { var that = this; this._editors = [{ dataField: dataExprs.textExpr, editorType: "dxTextBox", label: { text: messageLocalization.format("dxScheduler-editorLabelTitle") } }, { itemType: "empty" }, { dataField: dataExprs.allDayExpr, editorType: "dxSwitch", label: { text: messageLocalization.format("dxScheduler-allDay") }, editorOptions: { onValueChanged: function(args) { var value = args.value, startDateEditor = that._appointmentForm.getEditor(dataExprs.startDateExpr), endDateEditor = that._appointmentForm.getEditor(dataExprs.endDateExpr); if (startDateEditor && endDateEditor) { startDateEditor.option("type", value ? "date" : "datetime"); endDateEditor.option("type", value ? "date" : "datetime"); if (!startDateEditor.option("value")) { return } var startDate = dateSerialization.deserializeDate(startDateEditor.option("value")); if (value) { startDateEditor.option("value", that._getAllDayStartDate(startDate)); endDateEditor.option("value", that._getAllDayEndDate(startDate)) } else { startDate.setHours(schedulerInst.option("startDayHour")); startDateEditor.option("value", startDate); endDateEditor.option("value", schedulerInst._workSpace.calculateEndDate(dateSerialization.deserializeDate(startDateEditor.option("value")))) } } } } }, { dataField: dataExprs.startDateExpr, editorType: "dxDateBox", label: { text: messageLocalization.format("dxScheduler-editorLabelStartDate") }, validationRules: [{ type: "required" }], editorOptions: { type: allDay ? "date" : "datetime", width: "100%", calendarOptions: { firstDayOfWeek: schedulerInst.option("firstDayOfWeek") }, onValueChanged: function(args) { that._validateAppointmentFormDate(args.component, args.value, args.previousValue); var value = dateSerialization.deserializeDate(args.value), previousValue = dateSerialization.deserializeDate(args.previousValue), endDateEditor = that._appointmentForm.getEditor(dataExprs.endDateExpr), endValue = dateSerialization.deserializeDate(endDateEditor.option("value")); if (endValue < value) { var duration = endValue.getTime() - previousValue.getTime(); endDateEditor.option("value", new Date(value.getTime() + duration)) } } } }, { dataField: dataExprs.startDateTimeZoneExpr, editorType: "dxSchedulerTimezoneEditor", label: { text: " ", showColon: false }, editorOptions: { observer: schedulerInst }, visible: false }, { dataField: dataExprs.endDateExpr, editorType: "dxDateBox", label: { text: messageLocalization.format("dxScheduler-editorLabelEndDate") }, validationRules: [{ type: "required" }], editorOptions: { type: allDay ? "date" : "datetime", width: "100%", calendarOptions: { firstDayOfWeek: schedulerInst.option("firstDayOfWeek") }, onValueChanged: function(args) { that._validateAppointmentFormDate(args.component, args.value, args.previousValue); var value = dateSerialization.deserializeDate(args.value), previousValue = dateSerialization.deserializeDate(args.previousValue), startDateEditor = that._appointmentForm.getEditor(dataExprs.startDateExpr), startValue = dateSerialization.deserializeDate(startDateEditor.option("value")); if (value && startValue > value) { var duration = previousValue ? previousValue.getTime() - startValue.getTime() : 0; startDateEditor.option("value", new Date(value.getTime() - duration)) } } } }, { dataField: dataExprs.endDateTimeZoneExpr, editorType: "dxSchedulerTimezoneEditor", label: { text: " ", showColon: false }, editorOptions: { observer: schedulerInst }, visible: false }, { itemType: "empty" }, { dataField: dataExprs.descriptionExpr, editorType: "dxTextArea", label: { text: messageLocalization.format("dxScheduler-editorLabelDescription") } }, { dataField: dataExprs.recurrenceRuleExpr, editorType: "dxSchedulerRecurrenceEditor", editorOptions: { observer: schedulerInst, firstDayOfWeek: schedulerInst.option("firstDayOfWeek"), onContentReady: function(args) { var $editorField = args.element.closest(".dx-field-item"), $editorLabel = $editorField.find(".dx-field-item-label"); $editorLabel.off(clickEvent.name).on(clickEvent.name, function() { args.component.toggle() }) } }, cssClass: RECURRENCE_EDITOR_ITEM_CLASS, label: { text: messageLocalization.format("dxScheduler-editorLabelRecurrence") } }]; if (!dataExprs.recurrenceRuleExpr) { this._editors.splice(9, 1) } return this._editors }, concatResources: function(resources) { this._editors = this._editors.concat(resources) } }; module.exports = SchedulerAppointmentForm }, /*!***********************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.recurrence_editor.js ***! \***********************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), Guid = __webpack_require__( /*! ../../core/guid */ 151), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), recurrenceUtils = __webpack_require__( /*! ./utils.recurrence */ 470), domUtils = __webpack_require__( /*! ../../core/utils/dom */ 56), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, Editor = __webpack_require__( /*! ../editor/editor */ 106), CheckBox = __webpack_require__( /*! ../check_box */ 248), RadioGroup = __webpack_require__( /*! ../radio_group */ 308), Switch = __webpack_require__( /*! ../switch */ 318), NumberBox = __webpack_require__( /*! ../number_box */ 263), SelectBox = __webpack_require__( /*! ../select_box */ 317), DateBox = __webpack_require__( /*! ../date_box */ 267), publisherMixin = __webpack_require__( /*! ./ui.scheduler.publisher_mixin */ 476), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), dateLocalization = __webpack_require__( /*! ../../localization/date */ 33), dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63); var clickEvent = __webpack_require__( /*! ../../events/click */ 75); var RECURRENCE_EDITOR = "dx-recurrence-editor", LABEL_POSTFIX = "-label", RECURRENCE_EDITOR_CONTAINER = "dx-recurrence-editor-container", SWITCH_EDITOR = "dx-recurrence-switch", SWITCH_REPEAT_END_EDITOR = "dx-recurrence-switch-repeat-end", FREQUENCY_EDITOR = "dx-recurrence-radiogroup-freq", INTERVAL_EDITOR = "dx-recurrence-numberbox-interval", INTERVAL_EDITOR_FIELD = "dx-recurrence-interval-field", REPEAT_END_EDITOR = "dx-recurrence-repeat-end", REPEAT_END_EDITOR_FIELD = "dx-recurrence-repeat-end-field", REPEAT_END_EDITOR_CONTAINER = "dx-recurrence-repeat-end-container", REPEAT_TYPE_EDITOR = "dx-recurrence-radiogroup-repeat-type", REPEAT_COUNT_EDITOR = "dx-recurrence-numberbox-repeat-count", REPEAT_UNTIL_DATE_EDITOR = "dx-recurrence-datebox-until-date", REPEAT_ON_EDITOR = "dx-recurrence-repeat-on", REPEAT_ON_WEEK_EDITOR = "dx-recurrence-repeat-on-week", DAY_OF_WEEK = "dx-recurrence-checkbox-day-of-week", REPEAT_ON_MONTH_EDITOR = "dx-recurrence-repeat-on-month", DAY_OF_MONTH = "dx-recurrence-numberbox-day-of-month", REPEAT_ON_YEAR_EDITOR = "dx-recurrence-repeat-on-year", MONTH_OF_YEAR = "dx-recurrence-selectbox-month-of-year", FIELD_CLASS = "dx-field", FIELD_LABEL_CLASS = "dx-field-label", FIELD_VALUE_CLASS = "dx-field-value", frequencies = [{ text: function() { return messageLocalization.format("dxScheduler-recurrenceDaily") }, value: "DAILY" }, { text: function() { return messageLocalization.format("dxScheduler-recurrenceWeekly") }, value: "WEEKLY" }, { text: function() { return messageLocalization.format("dxScheduler-recurrenceMonthly") }, value: "MONTHLY" }, { text: function() { return messageLocalization.format("dxScheduler-recurrenceYearly") }, value: "YEARLY" }], repeatEndTypes = [{ text: function() { return messageLocalization.format("dxScheduler-recurrenceRepeatCount") }, value: "count" }, { text: function() { return messageLocalization.format("dxScheduler-recurrenceRepeatOnDate") }, value: "until" }], days = ["SU", "MO", "TU", "WE", "TH", "FR", "SA"]; var RecurrenceRule = Class.inherit({ ctor: function(recurrence) { this._recurrenceRule = recurrenceUtils.getRecurrenceRule(recurrence).rule }, makeRules: function(string) { var that = this; that._recurrenceRule = recurrenceUtils.getRecurrenceRule(string).rule }, makeRule: function(field, value) { if (!value) { delete this._recurrenceRule[field]; return } if (commonUtils.isDefined(field)) { if ("until" === field) { delete this._recurrenceRule.count } if ("count" === field) { delete this._recurrenceRule.until } this._recurrenceRule[field] = value } }, repeatableRule: function() { var rules = this._recurrenceRule; if ("count" in rules) { return "count" } if ("until" in rules) { return "until" } return null }, recurrenceString: function() { return recurrenceUtils.getRecurrenceString(this._recurrenceRule) }, rules: function() { return this._recurrenceRule }, daysFromByDayRule: function() { return recurrenceUtils.daysFromByDayRule(this._recurrenceRule) } }); var SchedulerRecurrenceEditor = Editor.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { value: null, onValueChanged: null, startDate: new Date, firstDayOfWeek: void 0 }) }, _getFirstDayOfWeek: function() { return this.option("firstDayOfWeek") || dateLocalization.firstDayOfWeekIndex() }, _createComponent: function(element, name, config) { config = config || {}; this._extendConfig(config, { readOnly: this.option("readOnly") }); return this.callBase(element, name, config) }, _init: function() { this.callBase(); this._recurrenceRule = new RecurrenceRule(this.option("value")) }, _render: function() { this.callBase(); this.element().addClass(RECURRENCE_EDITOR); this._renderSwitch(); this._$container = $("<div>").addClass(RECURRENCE_EDITOR_CONTAINER).appendTo(this.element()); this._renderEditors(); this._renderContainerVisibility(!!this.option("value")) }, _renderSwitch: function() { var $switchEditor = $("<div>").addClass(SWITCH_EDITOR).appendTo(this.element()); this._switchEditor = this._createComponent($switchEditor, Switch, { value: !!this.option("value"), onValueChanged: this._switchValueChangeHandler.bind(this) }) }, _switchValueChangeHandler: function(args) { var value = args.value; this._renderContainerVisibility(value); if (!this.option("value") && value) { this._handleDefaults() } else { if (!value) { this._recurrenceRule.makeRules(""); this.option("value", "") } } }, _renderContainerVisibility: function(value) { if (value) { this._$container.show(); this.notifyObserver("recurrenceEditorVisibilityChanged", { visible: true }); domUtils.triggerShownEvent(this._$container) } else { this._$container.hide(); this.notifyObserver("recurrenceEditorVisibilityChanged", { visible: false }) } }, _handleDefaults: function() { this._recurrenceRule.makeRule("freq", "DAILY"); this._changeEditorValue() }, _changeEditorValue: function() { this.option("value", this._recurrenceRule.recurrenceString() || "") }, _renderEditors: function() { this._renderFreqEditor(); this._renderIntervalEditor(); this._renderRepeatOnEditor(); this._renderRepeatEndSwitch(); this._renderRepeatEndEditor(); this._renderRepeatEndVisibility(!!this._recurrenceRule.repeatableRule()) }, _renderFreqEditor: function() { var freq = this._recurrenceRule.rules().freq || "DAILY"; var $freqEditor = $("<div>").addClass(FREQUENCY_EDITOR).addClass(FIELD_VALUE_CLASS); this._freqEditor = this._createComponent($freqEditor, RadioGroup, { field: "freq", items: frequencies, value: freq, valueExpr: "value", displayExpr: "text", layout: "horizontal", onValueChanged: this._valueChangedHandler.bind(this) }); var $field = $("<div>").addClass(FIELD_CLASS).append($freqEditor); this._$container.append($field) }, _renderIntervalEditor: function() { var freq = this._recurrenceRule.rules().freq || "DAILY"; var $intervalEditor = $("<div>").addClass(INTERVAL_EDITOR).addClass(FIELD_VALUE_CLASS); var $intervalEditorLabel = $("<div>").text(messageLocalization.format("dxScheduler-recurrenceEvery") + ":").addClass(INTERVAL_EDITOR + LABEL_POSTFIX).addClass(FIELD_LABEL_CLASS); this._$intervalTypeLabel = $("<div>").text(messageLocalization.format("dxScheduler-recurrenceRepeat" + freq.charAt(0).toUpperCase() + freq.substr(1).toLowerCase())).addClass(REPEAT_TYPE_EDITOR + LABEL_POSTFIX); var interval = this._recurrenceRule.rules().interval || 1; this._intervalEditor = this._createComponent($intervalEditor, NumberBox, { field: "interval", min: 1, value: interval, showSpinButtons: true, useLargeSpinButtons: false, onValueChanged: this._valueChangedHandler.bind(this) }); var $field = $("<div>").addClass(FIELD_CLASS).addClass(INTERVAL_EDITOR_FIELD).append($intervalEditorLabel, $intervalEditor, this._$intervalTypeLabel); this._$container.append($field); this._setAriaDescribedBy(this._intervalEditor, $intervalEditorLabel) }, _renderRepeatOnEditor: function() { var freq = this._recurrenceRule.rules().freq; if (!commonUtils.isDefined(this._$repeatOnEditor)) { this._$repeatOnEditor = $("<div>").addClass(REPEAT_ON_EDITOR).addClass(FIELD_CLASS).appendTo(this._$container) } if (!freq || "DAILY" === freq) { this._clearRepeatOnEditor(); this._clearRepeatOnLabel(); return } if (!commonUtils.isDefined(this._$repeatOnLabel)) { this._renderRepeatOnLabel(this._$repeatOnEditor) } if ("WEEKLY" === freq && !this._$repeatOnWeek) { this._renderRepeatOnWeekEditor(); return } if ("MONTHLY" === freq && !this._$repeatOnMonth) { this._renderRepeatOnMonthEditor(); return } if ("YEARLY" === freq && !this._$repeatOnYear) { this._renderRepeatOnYearEditor(); return } }, _renderRepeatOnLabel: function($element) { this._$repeatOnLabel = $("<div>").text(messageLocalization.format("dxScheduler-recurrenceOn") + ":").addClass(REPEAT_ON_EDITOR + LABEL_POSTFIX).addClass(FIELD_LABEL_CLASS); $element.append(this._$repeatOnLabel) }, _clearRepeatOnEditor: function() { if (commonUtils.isDefined(this._$repeatOnWeek)) { this._$repeatOnWeek.detach(); this._$repeatOnWeek.remove(); delete this._$repeatOnWeek } if (commonUtils.isDefined(this._$repeatOnMonth)) { this._$repeatOnMonth.detach(); this._$repeatOnMonth.remove(); delete this._$repeatOnMonth } if (commonUtils.isDefined(this._$repeatOnYear)) { this._$repeatOnYear.detach(); this._$repeatOnYear.remove(); delete this._$repeatOnYear } }, _clearRepeatOnEditorValues: function() { this._recurrenceRule.makeRule("bymonth", ""); this._recurrenceRule.makeRule("bymonthday", ""); this._recurrenceRule.makeRule("byday", "") }, _clearRepeatOnLabel: function() { if (commonUtils.isDefined(this._$repeatOnLabel)) { this._$repeatOnLabel.detach(); this._$repeatOnLabel.remove(); delete this._$repeatOnLabel } }, _renderRepeatOnWeekEditor: function() { this._clearRepeatOnEditor(); this._$repeatOnWeek = $("<div>").addClass(REPEAT_ON_WEEK_EDITOR).addClass(FIELD_VALUE_CLASS).appendTo(this._$repeatOnEditor); var localDaysNames = dateLocalization.getDayNames("short"), daysFromRules = this._daysOfWeekByRules(); this._daysOfWeek = []; for (var i = 0; i < 7; i++) { var daysOffset = this._getFirstDayOfWeek() + i, dayIndex = daysOffset % 7, checkBoxText = localDaysNames[dayIndex].toUpperCase(), dayName = days[dayIndex]; var $day = $("<div>").addClass(DAY_OF_WEEK), day = this._createComponent($day, CheckBox, { text: checkBoxText, value: inArray(dayName, daysFromRules) > -1 ? true : false, onValueChanged: this._repeatByDayValueChangeHandler.bind(this) }); this._daysOfWeek[dayIndex] = day; this._$repeatOnWeek.append($day) } }, _daysOfWeekByRules: function() { var daysByRule = this._recurrenceRule.daysFromByDayRule(); if (!daysByRule.length) { daysByRule = [days[this.option("startDate").getDay()]] } return daysByRule }, _repeatByDayValueChangeHandler: function() { var byDayRule = ""; $.each(this._daysOfWeek, function(index, day) { if (day.option("value")) { var dayName = days[index]; if (!byDayRule) { byDayRule = dayName } else { byDayRule = byDayRule + "," + dayName } } }); this._recurrenceRule.makeRule("byday", byDayRule); this._changeEditorValue() }, _renderRepeatOnMonthEditor: function() { this._clearRepeatOnEditor(); this._$repeatOnMonth = $("<div>").addClass(REPEAT_ON_MONTH_EDITOR).addClass(FIELD_VALUE_CLASS).appendTo(this._$repeatOnEditor); this._renderDayOfMonthEditor(this._$repeatOnMonth) }, _renderRepeatOnYearEditor: function() { this._clearRepeatOnEditor(); this._$repeatOnYear = $("<div>").addClass(REPEAT_ON_YEAR_EDITOR).addClass(FIELD_VALUE_CLASS).appendTo(this._$repeatOnEditor); var months = [], monthsNames = dateLocalization.getMonthNames("wide"); for (var i = 0; i < 12; i++) { months[i] = { value: String(i + 1), text: monthsNames[i] } } var byMonth = this._monthOfYearByRules(); var $monthOfYear = $("<div>").addClass(MONTH_OF_YEAR).appendTo(this._$repeatOnYear); var monthChanged = function(args) { this._valueChangedHandler.call(this, args); var monthValue = parseInt(args.component.option("value")); if (this._dayEditor && monthValue) { var maxAllowedDay = new Date((new Date).getFullYear(), parseInt(monthValue), 0).getDate(); if (2 === monthValue) { maxAllowedDay = 29 } this._dayEditor.option("max", maxAllowedDay) } }; this._monthEditor = this._createComponent($monthOfYear, SelectBox, { field: "bymonth", items: months, value: byMonth, displayExpr: "text", valueExpr: "value", onValueChanged: monthChanged.bind(this) }); this._renderDayOfMonthEditor(this._$repeatOnYear) }, _monthOfYearByRules: function() { var monthByRule = this._recurrenceRule.rules().bymonth; if (!monthByRule) { monthByRule = this.option("startDate").getMonth() + 1 } return monthByRule }, _renderDayOfMonthEditor: function($element) { var byMonthDay = this._dayOfMonthByRules(); var $dayEditor = $("<div>").addClass(DAY_OF_MONTH); this._dayEditor = this._createComponent($dayEditor, NumberBox, { field: "bymonthday", min: 1, max: 31, showSpinButtons: true, useLargeSpinButtons: false, value: byMonthDay, onValueChanged: this._valueChangedHandler.bind(this) }); $element.append($dayEditor) }, _dayOfMonthByRules: function() { var dayByRule = this._recurrenceRule.rules().bymonthday; if (!dayByRule) { dayByRule = this.option("startDate").getDate() } return dayByRule }, _setAriaDescribedBy: function(editor, $label) { var labelId = "label-" + new Guid; editor.setAria("describedby", labelId); editor.setAria("id", labelId, $label) }, _renderRepeatEndSwitch: function() { var that = this; var $switchEndEditor = $("<div>").addClass(SWITCH_REPEAT_END_EDITOR).addClass(FIELD_VALUE_CLASS), $switchEndLabel = $("<div>").text(messageLocalization.format("dxScheduler-recurrenceEnd") + ":").addClass(INTERVAL_EDITOR + LABEL_POSTFIX).addClass(FIELD_LABEL_CLASS); $("<div>").addClass(FIELD_CLASS).addClass(REPEAT_END_EDITOR_FIELD).append($switchEndLabel, $switchEndEditor).appendTo(this._$container); this._switchEndEditor = this._createComponent($switchEndEditor, Switch, { value: that._recurrenceRule.repeatableRule() ? true : false, onValueChanged: this._repeatEndSwitchValueChangeHandler.bind(this) }); this._setAriaDescribedBy(this._switchEndEditor, $switchEndLabel) }, _repeatEndSwitchValueChangeHandler: function(args) { var value = args.value; this._renderRepeatEndVisibility(value); if (!this._recurrenceRule.rules().count && !this._recurrenceRule.rules().until && value) { this._handleRepeatEndDefaults() } else { if (!value) { this._recurrenceRule.makeRule("count", ""); this._recurrenceRule.makeRule("until", ""); this._changeEditorValue() } } }, _renderRepeatEndVisibility: function(value) { if (!value) { this._$repeatEndEditor.hide() } else { this._$repeatEndEditor.show() } }, _handleRepeatEndDefaults: function() { this._recurrenceRule.makeRule("count", 1); this._changeEditorValue() }, _renderRepeatEndEditor: function(rule) { rule = commonUtils.isDefined(rule) ? rule : this._recurrenceRule.repeatableRule(); if (!rule) { rule = "count" } if (!commonUtils.isDefined(this._$repeatEndEditor)) { this._$repeatEndEditor = $("<div>").addClass(REPEAT_END_EDITOR_CONTAINER).addClass(FIELD_CLASS).appendTo(this._$container); this._renderRepeatEndTypeEditor() } }, _renderRepeatEndTypeEditor: function() { var repeatType = this._recurrenceRule.repeatableRule() || "count", that = this; this._$repeatTypeEditor = $("<div>").addClass(REPEAT_TYPE_EDITOR).addClass(FIELD_VALUE_CLASS).appendTo(this._$repeatEndEditor); this._repeatTypeEditor = this._createComponent(this._$repeatTypeEditor, RadioGroup, { items: repeatEndTypes, value: repeatType, displayExpr: "text", valueExpr: "value", itemTemplate: function(itemData) { if ("count" === itemData.value) { return that._renderRepeatCountEditor() } else { return that._renderRepeatUntilEditor() } }, layout: "vertical", onValueChanged: this._repeatTypeValueChangedHandler.bind(this) }); this._disableRepeatEndParts(repeatType) }, _repeatTypeValueChangedHandler: function(args) { var value = args.value; this._disableRepeatEndParts(value); if ("until" === value) { this._recurrenceRule.makeRule(value, this._getUntilValue()) } else { if ("count" === value) { this._recurrenceRule.makeRule(value, this._repeatCountEditor.option("value")) } } this._changeEditorValue() }, _disableRepeatEndParts: function(value) { if ("until" === value) { this._repeatCountEditor.option("disabled", true); this._repeatUntilDate.option("disabled", false) } else { if ("count" === value) { this._repeatCountEditor.option("disabled", false); this._repeatUntilDate.option("disabled", true) } } }, _renderRepeatCountEditor: function() { var repeatCount = this._recurrenceRule.rules().count || 1, $editorTemplate = $("<div>"); $("<div>").text(messageLocalization.format("dxScheduler-recurrenceAfter") + ":").addClass(REPEAT_END_EDITOR + LABEL_POSTFIX).appendTo($editorTemplate); this._$repeatCountEditor = $("<div>").addClass(REPEAT_COUNT_EDITOR).addClass(FIELD_VALUE_CLASS).appendTo($editorTemplate); $("<div>").text(messageLocalization.format("dxScheduler-recurrenceRepeatCount")).addClass(REPEAT_END_EDITOR + LABEL_POSTFIX).appendTo($editorTemplate); this._repeatCountEditor = this._createComponent(this._$repeatCountEditor, NumberBox, { field: "count", min: 1, showSpinButtons: true, useLargeSpinButtons: false, value: repeatCount, onValueChanged: this._repeatCountValueChangeHandler.bind(this) }); return $editorTemplate }, _repeatCountValueChangeHandler: function(args) { if ("count" !== this._recurrenceRule.repeatableRule()) { return } var value = args.value; this._recurrenceRule.makeRule("count", value); this._changeEditorValue() }, _formatUntilDate: function(date) { var result = dateUtils.trimTime(date); result.setDate(result.getDate() + 1); return new Date(result.getTime() - 1) }, _renderRepeatUntilEditor: function() { var repeatUntil = this._recurrenceRule.rules().until || this._formatUntilDate(new Date), $editorTemplate = $("<div>"); $("<div>").text(messageLocalization.format("dxScheduler-recurrenceOn") + ":").addClass(REPEAT_END_EDITOR + LABEL_POSTFIX).appendTo($editorTemplate); this._$repeatDateEditor = $("<div>").addClass(REPEAT_UNTIL_DATE_EDITOR).addClass(FIELD_VALUE_CLASS).appendTo($editorTemplate); this._repeatUntilDate = this._createComponent(this._$repeatDateEditor, DateBox, { field: "until", value: repeatUntil, type: "date", onValueChanged: this._repeatUntilValueChangeHandler.bind(this), calendarOptions: { firstDayOfWeek: this._getFirstDayOfWeek() } }); return $editorTemplate }, _repeatUntilValueChangeHandler: function(args) { if ("until" !== this._recurrenceRule.repeatableRule()) { return } var untilDate = this._formatUntilDate(new Date(args.value)); this._repeatUntilDate.option("value", untilDate); this._recurrenceRule.makeRule("until", untilDate); this._changeEditorValue() }, _valueChangedHandler: function(args) { var value = args.component.option("value"), field = args.component.option("field"); if ("freq" === field) { this._clearRepeatOnEditorValues() } this._recurrenceRule.makeRule(field, value); this._makeRepeatOnRule(field, value); this._changeEditorValue() }, _makeRepeatOnRule: function(field, value) { if ("freq" !== field || "DAILY" === value) { return } if ("WEEKLY" === value) { this._recurrenceRule.makeRule("byday", this._daysOfWeekByRules()) } if ("MONTHLY" === value) { this._recurrenceRule.makeRule("bymonthday", this._dayOfMonthByRules()) } if ("YEARLY" === value) { this._recurrenceRule.makeRule("bymonthday", this._dayOfMonthByRules()); this._recurrenceRule.makeRule("bymonth", this._monthOfYearByRules()) } }, _optionChanged: function(args) { switch (args.name) { case "value": this._recurrenceRule.makeRules(args.value); this._switchEditor.option("value", !!args.value); this._switchEndEditor.option("value", !!this._recurrenceRule.repeatableRule()); this._repeatTypeEditor.option("value", this._recurrenceRule.repeatableRule() || "count"); this._renderRepeatEndEditor(); this._renderRepeatOnEditor(); this._changeEditorsValues(this._recurrenceRule.rules()); this.callBase(args); break; case "startDate": this._clearRepeatOnEditor(); this._renderRepeatOnEditor(); this._makeRepeatOnRule("freq", this._recurrenceRule.rules().freq); if (commonUtils.isDefined(this._recurrenceRule.recurrenceString())) { this._changeEditorValue() } break; case "firstDayOfWeek": this._clearRepeatOnEditor(); this._renderRepeatOnEditor(); if (this._$repeatDateEditor) { this._repeatUntilDate.option("calendarOptions.firstDayOfWeek", this._getFirstDayOfWeek()) } break; default: this.callBase(args) } }, _changeEditorsValues: function(rules) { this._freqEditor.option("value", rules.freq); this._changeRepeatTypeLabel(); this._intervalEditor.option("value", rules.interval); this._changeRepeatCountValue(); this._changeRepeatUntilValue(); this._changeCheckBoxesValue(); this._changeDayOfMonthValue(); this._changeMonthOfYearValue() }, _changeRepeatTypeLabel: function() { var $labels = this.element().find("." + REPEAT_TYPE_EDITOR + LABEL_POSTFIX); if (!$labels.length) { return } var freq = this._recurrenceRule.rules().freq || "DAILY"; $.each($labels, function(_, $label) { $($label).text(messageLocalization.format("dxScheduler-recurrenceRepeat" + freq.charAt(0).toUpperCase() + freq.substr(1).toLowerCase())) }) }, _changeRepeatCountValue: function() { if (!this._$repeatCountEditor) { return } var count = this._recurrenceRule.rules().count || 1; this._repeatCountEditor.option("value", count) }, _changeRepeatUntilValue: function() { if (!this._$repeatDateEditor) { return } this._repeatUntilDate.option("value", this._getUntilValue()) }, _getUntilValue: function() { return this._recurrenceRule.rules().until || this._formatUntilDate(new Date) }, _changeCheckBoxesValue: function() { if (!this._$repeatOnWeek) { return } var daysByRule = this._daysOfWeekByRules(); $.each(this._daysOfWeek, function(index, day) { var dayName = days[index]; day.option("value", inArray(dayName, daysByRule) > -1) }) }, _changeDayOfMonthValue: function() { if (!this._$repeatOnMonth && !this._$repeatOnYear) { return } var day = this._dayOfMonthByRules() || 1; this._dayEditor.option("value", day) }, _changeMonthOfYearValue: function() { if (!this._$repeatOnYear) { return } var month = this._monthOfYearByRules() || 1; this._monthEditor.option("value", month) }, toggle: function() { this._switchEditor.element().trigger(clickEvent.name) }, setAria: function() { if (this._switchEditor) { this._switchEditor.setAria(arguments[0], arguments[1]) } } }).include(publisherMixin); registerComponent("dxSchedulerRecurrenceEditor", SchedulerRecurrenceEditor); module.exports = SchedulerRecurrenceEditor }, /*!*********************************************************!*\ !*** ./js/ui/scheduler/ui.scheduler.timezone_editor.js ***! \*********************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, publisherMixin = __webpack_require__( /*! ./ui.scheduler.publisher_mixin */ 476), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), Editor = __webpack_require__( /*! ../editor/editor */ 106), SelectBox = __webpack_require__( /*! ../select_box */ 317); var TIMEZONE_EDITOR_CLASS = "dx-timezone-editor", TIMEZONE_DISPLAY_NAME_SELECTBOX_CLASS = "dx-timezone-display-name", TIMEZONE_IANA_ID_SELECTBOX_CLASS = "dx-timezone-iana-id"; var SchedulerTimezoneEditor = Editor.inherit({ _getDefaultOptions: function() { return extend(this.callBase(), { value: null }) }, _createComponent: function(element, name, config) { config = config || {}; this._extendConfig(config, { readOnly: this.option("readOnly") }); return this.callBase(element, name, config) }, _init: function() { this.callBase(); this.element().addClass(TIMEZONE_EDITOR_CLASS) }, _render: function() { this._renderDisplayNameEditor(); this._renderIanaIdEditor(); this.callBase() }, _renderDisplayNameEditor: function() { var noTzTitle = messageLocalization.format("dxScheduler-noTimezoneTitle"), value = this.invoke("getTimezoneDisplayNameById", this.option("value")) || noTzTitle; this._displayNameEditor = this._renderSelectBox(TIMEZONE_DISPLAY_NAME_SELECTBOX_CLASS, { items: [noTzTitle].concat(this.invoke("getTimezonesDisplayName")), value: value, onOptionChanged: function(e) { if ("value" === e.name) { this._processDisplayNameChanging(e.value) } }.bind(this) }) }, _renderIanaIdEditor: function() { this._ianaIdEditor = this._renderSelectBox(TIMEZONE_IANA_ID_SELECTBOX_CLASS, { items: this._idsDataSource(), value: this.option("value"), onOptionChanged: function(e) { if ("value" === e.name) { this.option("value", e.value) } }.bind(this), valueExpr: "id", displayExpr: "displayName", disabled: this._calculateIanaIdEditorDisabledState() }) }, _renderSelectBox: function(cssClass, options) { options = options || {}; var $element = $("<div />").addClass(cssClass), selectBox = this._createComponent($element, SelectBox, options); this.element().append($element); return selectBox }, _idsDataSource: function() { return this.invoke("getSimilarTimezones", this.option("value")) }, _calculateIanaIdEditorDisabledState: function() { return !this.option("value") }, _processDisplayNameChanging: function(displayName) { var tzIds = this.invoke("getTimezonesIdsByDisplayName", displayName), tzId = tzIds.length ? tzIds[0].id : null; this.option("value", tzId); this._ianaIdEditor.option({ value: tzId, items: this._idsDataSource(tzIds), disabled: this._calculateIanaIdEditorDisabledState() }) }, _optionChanged: function(args) { var value = args.value; switch (args.name) { case "value": this._ianaIdEditor.option({ value: value, items: this._idsDataSource() }); if (value) { this._displayNameEditor.option("value", this.invoke("getTimezoneDisplayNameById", value)) } else { this._displayNameEditor.option("value", messageLocalization.format("dxScheduler-noTimezoneTitle")) } this.callBase(args); break; case "readOnly": this._displayNameEditor && this._displayNameEditor.option("readOnly", value); this._ianaIdEditor && this._ianaIdEditor.option("readOnly", value); break; default: this.callBase(args) } } }).include(publisherMixin); registerComponent("dxSchedulerTimezoneEditor", {}, SchedulerTimezoneEditor); module.exports = SchedulerTimezoneEditor }, /*!*****************************************!*\ !*** ./js/bundles/modules/parts/viz.js ***! \*****************************************/ function(module, exports, __webpack_require__) { var DevExpress = __webpack_require__( /*! ./core */ 5); __webpack_require__( /*! ./data */ 185); var viz = DevExpress.viz = __webpack_require__( /*! ../../../bundles/modules/viz */ 507); viz.currentTheme = __webpack_require__( /*! ../../../viz/themes */ 508).currentTheme; viz.registerTheme = __webpack_require__( /*! ../../../viz/themes */ 508).registerTheme; viz.exportFromMarkup = __webpack_require__( /*! ../../../viz/export */ 510).exportFromMarkup; viz.getMarkup = __webpack_require__( /*! ../../../viz/export */ 510).getMarkup; viz.currentPalette = __webpack_require__( /*! ../../../viz/palette */ 512).currentPalette; viz.getPalette = __webpack_require__( /*! ../../../viz/palette */ 512).getPalette; viz.registerPalette = __webpack_require__( /*! ../../../viz/palette */ 512).registerPalette; viz.refreshTheme = __webpack_require__( /*! ../../../viz/themes */ 508).refreshTheme; viz.dxChart = __webpack_require__( /*! ../../../viz/chart */ 513); viz.dxPieChart = __webpack_require__( /*! ../../../viz/pie_chart */ 584); viz.dxPolarChart = __webpack_require__( /*! ../../../viz/polar_chart */ 586); viz.dxLinearGauge = __webpack_require__( /*! ../../../viz/linear_gauge */ 587); viz.dxCircularGauge = __webpack_require__( /*! ../../../viz/circular_gauge */ 597); viz.dxBarGauge = __webpack_require__( /*! ../../../viz/bar_gauge */ 601); viz.dxRangeSelector = __webpack_require__( /*! ../../../viz/range_selector */ 603); viz.dxVectorMap = __webpack_require__( /*! ../../../viz/vector_map */ 613); viz.map = {}; viz.map.sources = {}; viz.map.projection = __webpack_require__( /*! ../../../viz/vector_map/projection */ 626).projection; viz.dxSparkline = __webpack_require__( /*! ../../../viz/sparkline */ 627); viz.dxBullet = __webpack_require__( /*! ../../../viz/bullet */ 630); viz.dxTreeMap = __webpack_require__( /*! ../../../viz/tree_map */ 632); var core = {}; viz.core = core; core.currentTheme = __webpack_require__( /*! ../../../viz/themes */ 508).currentTheme; core.registerTheme = __webpack_require__( /*! ../../../viz/themes */ 508).registerTheme; core.currentPalette = __webpack_require__( /*! ../../../viz/palette */ 512).currentPalette; core.getPalette = __webpack_require__( /*! ../../../viz/palette */ 512).getPalette; core.registerPalette = __webpack_require__( /*! ../../../viz/palette */ 512).registerPalette; viz.BaseWidget = __webpack_require__( /*! ../../../viz/core/base_widget */ 515); viz.findTheme = __webpack_require__( /*! ../../../viz/themes */ 508).findTheme; viz.refreshAll = __webpack_require__( /*! ../../../viz/themes */ 508).refreshTheme; viz.refreshPaths = __webpack_require__( /*! ../../../viz/utils */ 655).refreshPaths; viz.gauges = { __internals: {} }; viz._dashboard = {}; viz._dashboard.Renderer = __webpack_require__( /*! ../../../viz/core/renderers/renderer */ 518).Renderer; viz._dashboard.SvgElement = __webpack_require__( /*! ../../../viz/core/renderers/renderer */ 518).SvgElement; viz._dashboard.patchFontOptions = __webpack_require__( /*! ../../../viz/core/utils */ 509).patchFontOptions; module.exports = viz }, /*!***********************************!*\ !*** ./js/bundles/modules/viz.js ***! \***********************************/ function(module, exports, __webpack_require__) { __webpack_require__( /*! ./core */ 6); module.exports = DevExpress.viz = DevExpress.viz || {} }, /*!**************************!*\ !*** ./js/viz/themes.js ***! \**************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, vizUtils = __webpack_require__( /*! ./core/utils */ 509), themes = {}, themesMapping = {}, themesSchemeMapping = {}, _extend = extend, _each = $.each, _normalizeEnum = vizUtils.normalizeEnum, currentThemeName = null, nextCacheUid = 0, widgetsCache = {}; function findTheme(themeName) { var name = _normalizeEnum(themeName); return themes[name] || themes[themesMapping[name] || currentThemeName] } function findThemeNameByName(name, scheme) { return themesMapping[name + "." + scheme] || themesSchemeMapping[name + "." + scheme] || themesMapping[name] } function findThemeNameByPlatform(platform, version, scheme) { return findThemeNameByName(platform + version, scheme) || findThemeNameByName(platform, scheme) } function currentTheme(themeName, colorScheme) { if (!arguments.length) { return currentThemeName } var scheme = _normalizeEnum(colorScheme); currentThemeName = (themeName && themeName.platform ? findThemeNameByPlatform(_normalizeEnum(themeName.platform), themeName.version, scheme) : findThemeNameByName(_normalizeEnum(themeName), scheme)) || currentThemeName; return this } function getThemeInfo(themeName, splitter) { var k = themeName.indexOf(splitter); return k > 0 ? { name: themeName.substring(0, k), scheme: themeName.substring(k + 1) } : null } function registerThemeName(themeName, targetThemeName) { var themeInfo = getThemeInfo(themeName, ".") || getThemeInfo(themeName, "-") || { name: themeName }, name = themeInfo.name, scheme = themeInfo.scheme; if (scheme) { themesMapping[name] = themesMapping[name] || targetThemeName; themesMapping[name + "." + scheme] = themesMapping[name + "-" + scheme] = targetThemeName } else { themesMapping[name] = targetThemeName } } function registerTheme(theme, baseThemeName) { var themeName = _normalizeEnum(theme && theme.name); if (themeName) { registerThemeName(themeName, themeName); themes[themeName] = _extend(true, {}, findTheme(baseThemeName), patchTheme(theme)) } } function registerThemeAlias(alias, theme) { registerThemeName(_normalizeEnum(alias), _normalizeEnum(theme)) } function registerThemeSchemeAlias(from, to) { themesSchemeMapping[from] = to } function mergeScalar(target, field, source, sourceValue) { var _value = source ? source[field] : sourceValue; if (void 0 !== _value && void 0 === target[field]) { target[field] = _value } } function mergeObject(target, field, source, sourceValue) { var _value = source ? source[field] : sourceValue; if (void 0 !== _value) { target[field] = _extend(true, {}, _value, target[field]) } } function patchTheme(theme) { theme = _extend(true, { loadingIndicator: { font: {} }, "export": { font: {} }, legend: { font: {}, border: {} }, title: { font: {} }, tooltip: { font: {} }, "chart:common": {}, "chart:common:axis": { grid: {}, minorGrid: {}, tick: {}, minorTick: {}, title: { font: {} }, label: { font: {} } }, chart: { commonSeriesSettings: { candlestick: {} } }, pie: {}, polar: {}, gauge: { scale: { tick: {}, minorTick: {}, label: { font: {} } } }, barGauge: {}, map: { background: {} }, treeMap: { tile: { selectionStyle: { border: {} } }, group: { border: {}, selectionStyle: { border: {} }, label: { font: {} } } }, rangeSelector: { scale: { tick: {}, minorTick: {}, label: { font: {} } }, chart: {} }, sparkline: {}, bullet: {} }, theme); mergeScalar(theme.loadingIndicator, "backgroundColor", theme); mergeScalar(theme.chart.commonSeriesSettings.candlestick, "innerColor", null, theme.backgroundColor); mergeScalar(theme.map.background, "color", null, theme.backgroundColor); mergeScalar(theme.title.font, "color", null, theme.primaryTitleColor); mergeObject(theme.title, "subtitle", null, theme.title); mergeScalar(theme.legend.font, "color", null, theme.secondaryTitleColor); mergeScalar(theme.legend.border, "color", null, theme.axisColor); patchAxes(theme); _each(["chart", "pie", "polar", "gauge", "barGauge", "map", "treeMap", "rangeSelector", "sparkline", "bullet"], function(_, section) { mergeScalar(theme[section], "redrawOnResize", theme); mergeScalar(theme[section], "containerBackgroundColor", null, theme.backgroundColor); mergeObject(theme[section], "tooltip", theme) }); _each(["chart", "pie", "polar", "gauge", "barGauge", "map", "treeMap", "rangeSelector"], function(_, section) { mergeObject(theme[section], "loadingIndicator", theme); mergeObject(theme[section], "export", theme); mergeObject(theme[section], "legend", theme); mergeObject(theme[section], "title", theme) }); _each(["chart", "pie", "polar"], function(_, section) { mergeObject(theme, section, null, theme["chart:common"]) }); _each(["chart", "polar"], function(_, section) { theme[section] = theme[section] || {}; mergeObject(theme[section], "commonAxisSettings", null, theme["chart:common:axis"]) }); mergeObject(theme.rangeSelector.chart, "commonSeriesSettings", theme.chart); mergeObject(theme.rangeSelector.chart, "dataPrepareSettings", theme.chart); mergeScalar(theme.treeMap.group.border, "color", null, theme.axisColor); mergeScalar(theme.treeMap.tile.selectionStyle.border, "color", null, theme.primaryTitleColor); mergeScalar(theme.treeMap.group.selectionStyle.border, "color", null, theme.primaryTitleColor); mergeScalar(theme.treeMap.group.label.font, "color", null, theme.secondaryTitleColor); mergeScalar(theme.map.legend, "backgroundColor", theme); patchMapLayers(theme); return theme } function patchAxes(theme) { var commonAxisSettings = theme["chart:common:axis"], colorFieldName = "color"; _each([commonAxisSettings, commonAxisSettings.grid, commonAxisSettings.minorGrid, commonAxisSettings.tick, commonAxisSettings.minorTick], function(_, obj) { mergeScalar(obj, colorFieldName, null, theme.axisColor) }); mergeScalar(commonAxisSettings.title.font, colorFieldName, null, theme.secondaryTitleColor); mergeScalar(commonAxisSettings.label.font, colorFieldName, null, theme.axisLabelColor); mergeScalar(theme.gauge.scale.label.font, colorFieldName, null, theme.axisLabelColor); mergeScalar(theme.gauge.scale.tick, colorFieldName, null, theme.backgroundColor); mergeScalar(theme.gauge.scale.minorTick, colorFieldName, null, theme.backgroundColor); mergeScalar(theme.rangeSelector.scale.tick, colorFieldName, null, theme.axisColor); mergeScalar(theme.rangeSelector.scale.minorTick, colorFieldName, null, theme.axisColor); mergeScalar(theme.rangeSelector.scale.label.font, colorFieldName, null, theme.axisLabelColor) } function patchMapLayers(theme) { var map = theme.map; _each(["area", "line", "marker"], function(_, section) { mergeObject(map, "layer:" + section, null, map.layer) }); _each(["dot", "bubble", "pie", "image"], function(_, section) { mergeObject(map, "layer:marker:" + section, null, map["layer:marker"]) }) } function addCacheItem(target) { var cacheUid = ++nextCacheUid; target._cache = cacheUid; widgetsCache[cacheUid] = target } function removeCacheItem(target) { delete widgetsCache[target._cache] } function refreshTheme() { _each(widgetsCache, function() { this.refresh() }); return this } _extend(exports, { currentTheme: currentTheme, registerTheme: registerTheme, findTheme: findTheme, registerThemeAlias: registerThemeAlias, registerThemeSchemeAlias: registerThemeSchemeAlias, refreshTheme: refreshTheme, addCacheItem: addCacheItem, removeCacheItem: removeCacheItem }); _extend(exports, { themes: themes, themesMapping: themesMapping, themesSchemeMapping: themesSchemeMapping, widgetsCache: widgetsCache, resetCurrentTheme: function() { currentThemeName = null } }) }, /*!******************************!*\ !*** ./js/viz/core/utils.js ***! \******************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, _isDefined = commonUtils.isDefined, _inArray = inArray, _each = $.each, _math = Math, _round = _math.round, _sqrt = Math.sqrt, _extend = extend; var PI = Math.PI, MAX_PIXEL_COUNT = 1e10, PI_DIV_180 = PI / 180, LN10 = Math.LN10; var cosFunc = Math.cos, sinFunc = Math.sin, abs = Math.abs, log = Math.log, floor = Math.floor, ceil = Math.ceil, max = Math.max, isNaN = window.isNaN, Number = window.Number, NaN = window.NaN; var isNumber = commonUtils.isNumeric, isExponential = commonUtils.isExponential; var getPrecision = function(value) { var stringFraction, startIndex, precision, stringValue = value.toString(), pointIndex = stringValue.indexOf("."); if (isExponential(value)) { precision = getDecimalOrder(value); if (precision < 0) { return Math.abs(precision) } else { return 0 } } if (pointIndex !== -1) { startIndex = pointIndex + 1; stringFraction = stringValue.substring(startIndex, startIndex + 20); return stringFraction.length } return 0 }; var getLog = function(value, base) { if (!value) { return NaN } return Math.log(value) / Math.log(base) }; var raiseTo = function(power, base) { return Math.pow(base, power) }; var normalizeAngle = function(angle) { return (angle % 360 + 360) % 360 }; var convertAngleToRendererSpace = function(angle) { return 90 - angle }; var degreesToRadians = function(value) { return PI * value / 180 }; var getCosAndSin = function(angle) { var angleInRadians = degreesToRadians(angle); return { cos: cosFunc(angleInRadians), sin: sinFunc(angleInRadians) } }; var DECIMAL_ORDER_THRESHOLD = 1e-14; var getDistance = function(x1, y1, x2, y2) { var diffX = x2 - x1, diffY = y2 - y1; return Math.sqrt(diffY * diffY + diffX * diffX) }; var getDecimalOrder = function(number) { var cn, n = abs(number); if (!isNaN(n)) { if (n > 0) { n = log(n) / LN10; cn = ceil(n); return cn - n < DECIMAL_ORDER_THRESHOLD ? cn : floor(n) } return 0 } return NaN }; var getAppropriateFormat = function(start, end, count) { var format, order = max(getDecimalOrder(start), getDecimalOrder(end)), precision = -getDecimalOrder(abs(end - start) / count); if (!isNaN(order) && !isNaN(precision)) { if (abs(order) <= 4) { format = "fixedPoint"; precision < 0 && (precision = 0); precision > 4 && (precision = 4) } else { format = "exponential"; precision += order - 1; precision > 3 && (precision = 3) } return { type: format, precision: precision } } return null }; var getFraction = function(value) { var valueString, dotIndex; if (isNumber(value)) { valueString = value.toString(); dotIndex = valueString.indexOf("."); if (dotIndex >= 0) { if (isExponential(value)) { return valueString.substr(dotIndex + 1, valueString.indexOf("e") - dotIndex - 1) } else { valueString = value.toFixed(20); return valueString.substr(dotIndex + 1, valueString.length - dotIndex + 1) } } } return "" }; var getSignificantDigitPosition = function(value) { var i, fraction = getFraction(value); if (fraction) { for (i = 0; i < fraction.length; i++) { if ("0" !== fraction.charAt(i)) { return i + 1 } } } return 0 }; var adjustValue = function(value) { var nextValue, i, fraction = getFraction(value); if (fraction) { for (i = 1; i <= fraction.length; i++) { nextValue = roundValue(value, i); if (0 !== nextValue && fraction[i - 2] && fraction[i - 1] && fraction[i - 2] === fraction[i - 1]) { return nextValue } } } return value }; var roundValue = function(value, precision) { if (precision > 20) { precision = 20 } if (isNumber(value)) { if (isExponential(value)) { return Number(value.toExponential(precision)) } else { return Number(value.toFixed(precision)) } } }; var applyPrecisionByMinDelta = function(min, delta, value) { var minPrecision = getPrecision(min), deltaPrecision = getPrecision(delta); return roundValue(value, minPrecision < deltaPrecision ? deltaPrecision : minPrecision) }; var getPower = function(value) { return value.toExponential().split("e")[1] }; function map(array, callback) { var value, i = 0, len = array.length, result = []; while (i < len) { value = callback(array[i], i); if (null !== value) { result.push(value) } i++ } return result } function selectByKeys(object, keys) { return map(keys, function(key) { return object[key] ? object[key] : null }) } function decreaseFields(object, keys, eachDecrease, decrease) { var dec = decrease; _each(keys, function(_, key) { if (object[key]) { object[key] -= eachDecrease; dec -= eachDecrease } }); return dec } function normalizeEnum(value) { return String(value).toLowerCase() } function setCanvasValues(canvas) { if (canvas) { canvas.originalTop = canvas.top; canvas.originalBottom = canvas.bottom; canvas.originalLeft = canvas.left; canvas.originalRight = canvas.right } } function normalizeBBoxField(value) { return -MAX_PIXEL_COUNT < value && value < +MAX_PIXEL_COUNT ? value : 0 } function normalizeBBox(bBox) { var xl = normalizeBBoxField(floor(bBox.x)), yt = normalizeBBoxField(floor(bBox.y)), xr = normalizeBBoxField(ceil(bBox.width + bBox.x)), yb = normalizeBBoxField(ceil(bBox.height + bBox.y)), result = { x: xl, y: yt, width: xr - xl, height: yb - yt }; result.isEmpty = !result.x && !result.y && !result.width && !result.height; return result } function rotateBBox(bBox, center, angle) { var cos = Number(cosFunc(angle * PI_DIV_180).toFixed(3)), sin = Number(sinFunc(angle * PI_DIV_180).toFixed(3)), w2 = bBox.width / 2, h2 = bBox.height / 2, centerX = bBox.x + w2, centerY = bBox.y + h2, w2_ = abs(w2 * cos) + abs(h2 * sin), h2_ = abs(w2 * sin) + abs(h2 * cos), centerX_ = center[0] + (centerX - center[0]) * cos + (centerY - center[1]) * sin, centerY_ = center[1] - (centerX - center[0]) * sin + (centerY - center[1]) * cos; return normalizeBBox({ x: centerX_ - w2_, y: centerY_ - h2_, width: 2 * w2_, height: 2 * h2_ }) } extend(exports, { decreaseGaps: function(object, keys, decrease) { var arrayGaps; do { arrayGaps = selectByKeys(object, keys); arrayGaps.push(_math.ceil(decrease / arrayGaps.length)); decrease = decreaseFields(object, keys, _math.min.apply(null, arrayGaps), decrease) } while (decrease > 0 && arrayGaps.length > 1); return decrease }, normalizeEnum: normalizeEnum, parseScalar: function(value, defaultValue) { return void 0 !== value ? value : defaultValue }, enumParser: function(values) { var i, ii, stored = {}; for (i = 0, ii = values.length; i < ii; ++i) { stored[normalizeEnum(values[i])] = 1 } return function(value, defaultValue) { var _value = normalizeEnum(value); return stored[_value] ? _value : defaultValue } }, patchFontOptions: function(options) { var fontOptions = {}; _each(options || {}, function(key, value) { if (/^(cursor|opacity)$/i.test(key)) {} else { if ("color" === key) { key = "fill" } else { key = "font-" + key } } fontOptions[key] = value }); return fontOptions }, convertPolarToXY: function(centerCoords, startAngle, angle, radius) { var cosSin, shiftAngle = 90; angle = _isDefined(angle) ? angle + startAngle - shiftAngle : 0; cosSin = getCosAndSin(angle); return { x: _round(centerCoords.x + radius * cosSin.cos), y: _round(centerCoords.y + radius * cosSin.sin) } }, convertXYToPolar: function(centerCoords, x, y) { var radius = getDistance(centerCoords.x, centerCoords.y, x, y), angle = _math.atan2(y - centerCoords.y, x - centerCoords.x); return { phi: _round(normalizeAngle(180 * angle / _math.PI)), r: _round(radius) } }, processSeriesTemplate: function(seriesTemplate, items) { var series, length, data, customizeSeries = commonUtils.isFunction(seriesTemplate.customizeSeries) ? seriesTemplate.customizeSeries : commonUtils.noop, nameField = seriesTemplate.nameField || "series", generatedSeries = {}, seriesOrder = [], i = 0; items = items || []; for (length = items.length; i < length; i++) { data = items[i]; if (nameField in data) { series = generatedSeries[data[nameField]]; if (!series) { series = generatedSeries[data[nameField]] = { name: data[nameField], data: [] }; seriesOrder.push(series.name) } series.data.push(data) } } return map(seriesOrder, function(orderedName) { var group = generatedSeries[orderedName]; return extend(group, customizeSeries.call(null, group.name)) }) }, getCategoriesInfo: function(categories, startValue, endValue) { if (!(categories && categories.length > 0)) { return {} } startValue = _isDefined(startValue) ? startValue : categories[0]; endValue = _isDefined(endValue) ? endValue : categories[categories.length - 1]; var visibleCategories, swapBuf, hasVisibleCategories, visibleCategoriesLen, categoriesValue = map(categories, function(category) { return _isDefined(category) ? category.valueOf() : null }), indexStartValue = _isDefined(startValue) ? _inArray(startValue.valueOf(), categoriesValue) : 0, indexEndValue = _isDefined(endValue) ? _inArray(endValue.valueOf(), categoriesValue) : categories.length - 1, inverted = false; indexStartValue < 0 && (indexStartValue = 0); indexEndValue < 0 && (indexEndValue = categories.length - 1); if (indexEndValue < indexStartValue) { swapBuf = indexEndValue; indexEndValue = indexStartValue; indexStartValue = swapBuf; inverted = true } visibleCategories = categories.slice(indexStartValue, indexEndValue + 1); visibleCategoriesLen = visibleCategories.length; hasVisibleCategories = visibleCategoriesLen > 0; return { categories: hasVisibleCategories ? visibleCategories : null, start: hasVisibleCategories ? visibleCategories[inverted ? visibleCategoriesLen - 1 : 0] : null, end: hasVisibleCategories ? visibleCategories[inverted ? 0 : visibleCategoriesLen - 1] : null, inverted: inverted } }, setCanvasValues: setCanvasValues, updatePanesCanvases: function(panes, canvas, rotated) { var weightSum = 0; _each(panes, function(_, pane) { pane.weight = pane.weight || 1; weightSum += pane.weight }); var distributedSpace = 0, padding = panes.padding || 10, paneSpace = rotated ? canvas.width - canvas.left - canvas.right : canvas.height - canvas.top - canvas.bottom, oneWeight = (paneSpace - padding * (panes.length - 1)) / weightSum, startName = rotated ? "left" : "top", endName = rotated ? "right" : "bottom"; _each(panes, function(_, pane) { var calcLength = _round(pane.weight * oneWeight); pane.canvas = pane.canvas || {}; _extend(pane.canvas, canvas); pane.canvas[startName] = canvas[startName] + distributedSpace; pane.canvas[endName] = canvas[endName] + (paneSpace - calcLength - distributedSpace); distributedSpace = distributedSpace + calcLength + padding; setCanvasValues(pane.canvas) }) }, unique: function(array) { var values = {}; return map(array, function(item) { var result = !values[item] ? item : null; values[item] = true; return result }) }, map: map, getVerticallyShiftedAngularCoords: function(bBox, dy, center) { var isPositive = bBox.x + bBox.width / 2 >= center.x, horizontalOffset1 = (isPositive ? bBox.x : bBox.x + bBox.width) - center.x, verticalOffset1 = bBox.y - center.y, verticalOffset2 = verticalOffset1 + dy, horizontalOffset2 = _round(_sqrt(horizontalOffset1 * horizontalOffset1 + verticalOffset1 * verticalOffset1 - verticalOffset2 * verticalOffset2)), dx = (isPositive ? +horizontalOffset2 : -horizontalOffset2) || horizontalOffset1; return { x: center.x + (isPositive ? dx : dx - bBox.width), y: bBox.y + dy } } }); exports.getPrecision = getPrecision; exports.getLog = getLog; exports.raiseTo = raiseTo; exports.normalizeAngle = normalizeAngle; exports.convertAngleToRendererSpace = convertAngleToRendererSpace; exports.degreesToRadians = degreesToRadians; exports.getCosAndSin = getCosAndSin; exports.getDecimalOrder = getDecimalOrder; exports.getAppropriateFormat = getAppropriateFormat; exports.getDistance = getDistance; exports.getFraction = getFraction; exports.adjustValue = adjustValue; exports.roundValue = roundValue; exports.applyPrecisionByMinDelta = applyPrecisionByMinDelta; exports.getSignificantDigitPosition = getSignificantDigitPosition; exports.getPower = getPower; exports.rotateBBox = rotateBBox; exports.normalizeBBox = normalizeBBox }, /*!**************************!*\ !*** ./js/viz/export.js ***! \**************************/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__( /*! ./core/export */ 511) }, /*!*******************************!*\ !*** ./js/viz/core/export.js ***! \*******************************/ function(module, exports, __webpack_require__) { var extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, patchFontOptions = __webpack_require__( /*! ./utils */ 509).patchFontOptions, _extend = extend, clientExporter = __webpack_require__( /*! ../../client_exporter */ 20), messageLocalization = __webpack_require__( /*! ../../localization/message */ 89), imageExporter = clientExporter.image, svgExporter = clientExporter.svg, pdfExporter = clientExporter.pdf, hoverEvent = __webpack_require__( /*! ../../events/hover */ 103), pointerEvents = __webpack_require__( /*! ../../events/pointer */ 76), pointerActions = [pointerEvents.down, pointerEvents.move].join(" "), BUTTON_SIZE = 35, ICON_COORDS = [ [9, 12, 26, 12, 26, 14, 9, 14], [9, 17, 26, 17, 26, 19, 9, 19], [9, 22, 26, 22, 26, 24, 9, 24] ], LIST_PADDING_TOP = 4, LIST_WIDTH = 120, VERTICAL_TEXT_MARGIN = 8, HORIZONTAL_TEXT_MARGIN = 15, MENU_ITEM_HEIGHT = 30, LIST_STROKE_WIDTH = 1, MARGIN = 10, SHADOW_OFFSET = 2, SHADOW_BLUR = 3, ALLOWED_EXPORT_FORMATS = ["PNG", "PDF", "JPEG", "SVG", "GIF"], EXPORT_CSS_CLASS = "dx-export-menu", EXPORT_DATA_KEY = "export-element-type", FORMAT_DATA_KEY = "export-element-format"; function validateFormat(format) { var validatedFormat = String(format).toUpperCase(); if (inArray(validatedFormat, ALLOWED_EXPORT_FORMATS) !== -1) { return validatedFormat } } function getCreatorFunc(format) { if ("SVG" === format) { return svgExporter.getData } else { if ("PDF" === format) { return pdfExporter.getData } else { return imageExporter.getData } } } function doExport(menu, markup, options) { menu && menu.hide(); clientExporter.export(markup(), options, getCreatorFunc(options.format)); menu && menu.show() } function print(data, backgroundColor) { var svg, vizWindow = window.open(); if (!vizWindow) { return } vizWindow.document.open(); vizWindow.document.write(data); vizWindow.document.close(); svg = vizWindow.document.body.getElementsByTagName("svg")[0]; svg && (svg.style.backgroundColor = backgroundColor); vizWindow.print(); vizWindow.close() } function getItemAttributes(options, type, itemIndex) { var path, attr = {}, x = BUTTON_SIZE - LIST_WIDTH, y = BUTTON_SIZE + LIST_PADDING_TOP + itemIndex * MENU_ITEM_HEIGHT; attr.rect = { width: LIST_WIDTH - 2 * LIST_STROKE_WIDTH, height: MENU_ITEM_HEIGHT, x: x + LIST_STROKE_WIDTH, y: y }; attr.text = { x: x + HORIZONTAL_TEXT_MARGIN, y: y + MENU_ITEM_HEIGHT - VERTICAL_TEXT_MARGIN, align: "left" }; if ("printing" === type) { path = "M " + x + " " + (y + MENU_ITEM_HEIGHT - LIST_STROKE_WIDTH) + " L " + (x + LIST_WIDTH) + " " + (y + MENU_ITEM_HEIGHT - LIST_STROKE_WIDTH); attr.separator = { stroke: options.button.default.borderColor, "stroke-width": LIST_STROKE_WIDTH, cursor: "pointer", sharp: "v", d: path } } return attr } function createMenuItem(renderer, options, settings) { var menuItem, itemData = {}, type = settings.type, format = settings.format, attr = getItemAttributes(options, type, settings.itemIndex), fontStyle = patchFontOptions(options.font), rect = renderer.rect(), text = renderer.text(settings.text); fontStyle["pointer-events"] = "none"; menuItem = renderer.g().attr({ "class": EXPORT_CSS_CLASS + "-list-item" }); itemData[EXPORT_DATA_KEY] = type; if (format) { itemData[FORMAT_DATA_KEY] = format } rect.attr(attr.rect).css({ cursor: "pointer", "pointer-events": "all" }).data(itemData); rect.on(hoverEvent.start + ".export", function() { rect.attr({ fill: options.button.hover.backgroundColor }) }).on(hoverEvent.end + ".export", function() { rect.attr({ fill: null }) }); rect.append(menuItem); text.css(fontStyle).attr(attr.text).append(menuItem); if ("printing" === type) { renderer.path(null, "line").attr(attr.separator).append(menuItem) } return { g: menuItem, rect: rect, resetState: function() { rect.attr({ fill: null }) } } } function createMenuItems(renderer, options) { var formats = options.formats, items = []; if (options.printingEnabled) { items.push(createMenuItem(renderer, options, { type: "printing", text: messageLocalization.format("vizExport-printingButtonText"), itemIndex: items.length })) } items = formats.reduce(function(r, format) { format = validateFormat(format); if (format) { r.push(createMenuItem(renderer, options, { type: "exporting", text: messageLocalization.getFormatter("vizExport-exportButtonText")(format), format: format, itemIndex: r.length })) } return r }, items); return items } exports.exportFromMarkup = function(markup, options) { options.format = validateFormat(options.format) || "PNG"; options.fileName = options.fileName || "file"; options.exportingAction = options.onExporting; options.exportedAction = options.onExported; options.fileSavingAction = options.onFileSaving; clientExporter.export(markup, options, getCreatorFunc(options.format)) }; exports.getMarkup = function(widgets) { var svgArr = [], height = 0, width = 0; widgets.forEach(function(widget) { var size = widget.getSize(); svgArr.push(widget.svg().replace("<svg", '<g transform="translate(0,' + height + ')" ').replace("</svg>", "</g>")); height += size.height; width = Math.max(width, size.width) }); return '<svg height="' + height + '" width="' + width + '" version="1.1" xmlns="http://www.w3.org/2000/svg">' + svgArr.join("") + "</svg>" }; exports.ExportMenu = function(params) { var that = this, renderer = that._renderer = params.renderer; that._incidentOccurred = params.incidentOccurred; that._svgMethod = params.svgMethod; that._shadow = renderer.shadowFilter("-50%", "-50%", "200%", "200%", SHADOW_OFFSET, 6, SHADOW_BLUR); that._shadow.attr({ opacity: .8 }); that._group = renderer.g().attr({ "class": EXPORT_CSS_CLASS }).linkOn(renderer.root, { name: "export-menu", after: "peripheral" }); that._buttonGroup = renderer.g().attr({ "class": EXPORT_CSS_CLASS + "-button" }).append(that._group); that._listGroup = renderer.g().attr({ "class": EXPORT_CSS_CLASS + "-list" }).append(that._group); that._overlay = renderer.rect(-LIST_WIDTH + BUTTON_SIZE, BUTTON_SIZE + LIST_PADDING_TOP, LIST_WIDTH, 0); that._overlay.attr({ "stroke-width": LIST_STROKE_WIDTH, cursor: "pointer", rx: 4, ry: 4, filter: that._shadow.id }); that._overlay.data({ "export-element-type": "list" }); that._subscribeEvents() }; _extend(exports.ExportMenu.prototype, { getLayoutOptions: function() { if (this._hiddenDueToLayout) { return { width: 0, height: 0 } } var bBox = this._buttonGroup.getBBox(); bBox.cutSide = "vertical"; bBox.cutLayoutSide = "top"; bBox.height += MARGIN; bBox.position = { vertical: "top", horizontal: "right" }; bBox.verticalAlignment = "top"; bBox.horizontalAlignment = "right"; return bBox }, probeDraw: function() { this._hiddenDueToLayout = false; this.show() }, shift: function(_, y) { this._group.attr({ translateY: this._group.attr("translateY") + y }) }, draw: function(width, height, canvas) { var layoutOptions; this._options.exportOptions.width = canvas.width; this._options.exportOptions.height = canvas.height; this._group.move(width - BUTTON_SIZE - SHADOW_OFFSET - SHADOW_BLUR + canvas.left, Math.floor(height / 2 - BUTTON_SIZE / 2)); layoutOptions = this.getLayoutOptions(); if (layoutOptions.width > width || layoutOptions.height > height) { this._incidentOccurred("W2107"); this._hiddenDueToLayout = true; this.hide() } return this }, show: function() { !this._hiddenDueToLayout && this._group.linkAppend() }, hide: function() { this._group.linkRemove() }, setOptions: function(options) { this._options = options; options.formats = options.formats || ALLOWED_EXPORT_FORMATS; options.printingEnabled = void 0 === options.printingEnabled ? true : options.printingEnabled; if (options.enabled && (options.formats.length || options.printingEnabled)) { this.show(); this._updateButton(); this._updateList(); this._hideList() } else { this.hide() } }, dispose: function() { var that = this; that._unsubscribeEvents(); that._group.linkRemove().linkOff(); that._group.dispose(); that._shadow.dispose(); that._shadow = that._group = that._listGroup = that._buttonGroup = that._button = null; that._options = null }, layoutOptions: function() { var options = this._options; return options.enabled && { horizontalAlignment: "right", verticalAlignment: "top", weak: true } }, measure: function() { return [BUTTON_SIZE + SHADOW_OFFSET, BUTTON_SIZE] }, move: function(rect) { this._group.attr({ translateX: Math.round(rect[0]), translateY: Math.round(rect[1]) }) }, _hideList: function() { this._listGroup.remove(); this._listShown = false; this._setButtonState("default"); this._menuItems.forEach(function(item) { item.resetState() }) }, _showList: function() { this._listGroup.append(this._group); this._listShown = true }, _setButtonState: function(state) { var that = this, style = that._options.button[state]; this._button.attr({ stroke: style.borderColor, fill: style.backgroundColor }); this._icon.attr({ fill: style.color }) }, _subscribeEvents: function() { var that = this; that._renderer.root.on(pointerEvents.up + ".export", function(e) { var exportOptions, elementType = e.target[EXPORT_DATA_KEY], options = that._options; if (!elementType) { if (that._button) { that._hideList() } return } if ("button" === elementType) { if (that._listShown) { that._setButtonState("default"); that._hideList() } else { that._setButtonState("focus"); that._showList() } } else { if ("printing" === elementType) { that.hide(); print(that._svgMethod(), options.backgroundColor); that.show(); that._hideList() } else { if ("exporting" === elementType) { exportOptions = _extend({}, options.exportOptions, { format: e.target[FORMAT_DATA_KEY] }); doExport(that, function() { return that._svgMethod() }, exportOptions); that._hideList() } } } }); that._listGroup.on(pointerActions, function(e) { e.stopPropagation() }); that._buttonGroup.on(pointerEvents.enter, function() { that._setButtonState("hover") }); that._buttonGroup.on(pointerEvents.leave, function() { that._setButtonState(that._listShown ? "focus" : "default") }); that._buttonGroup.on(pointerEvents.down + ".export", function() { that._setButtonState("active") }) }, _unsubscribeEvents: function() { this._renderer.root.off(".export"); this._listGroup.off(); this._buttonGroup.off() }, _updateButton: function() { var that = this, renderer = that._renderer, options = that._options, iconAttr = { fill: options.button.default.color, cursor: "pointer" }, exportData = { "export-element-type": "button" }; if (!that._button) { that._button = renderer.rect(0, 0, BUTTON_SIZE, BUTTON_SIZE).append(that._buttonGroup); that._button.attr({ rx: 4, ry: 4, fill: options.button.default.backgroundColor, stroke: options.button.default.borderColor, "stroke-width": 1, cursor: "pointer" }); that._button.data(exportData); that._icon = renderer.path(ICON_COORDS).append(that._buttonGroup); that._icon.attr(iconAttr); that._icon.data(exportData); that._buttonGroup.setTitle(messageLocalization.format("vizExport-titleMenuText")) } }, _updateList: function() { var that = this, options = that._options, buttonDefault = options.button.default, listGroup = that._listGroup, items = createMenuItems(that._renderer, options); that._shadow.attr({ color: options.shadowColor }); that._overlay.attr({ height: items.length * MENU_ITEM_HEIGHT, fill: buttonDefault.backgroundColor, stroke: buttonDefault.borderColor }); listGroup.clear(); that._overlay.append(listGroup); items.forEach(function(item) { item.g.append(listGroup) }); that._menuItems = items } }); function getExportOptions(widget, exportOptions, fileName, format) { return { format: validateFormat(format || exportOptions.format) || "PNG", fileName: fileName || exportOptions.fileName || "file", proxyUrl: exportOptions.proxyUrl, backgroundColor: exportOptions.backgroundColor, width: widget._canvas.width, height: widget._canvas.height, exportingAction: widget._createActionByOption("onExporting"), exportedAction: widget._createActionByOption("onExported"), fileSavingAction: widget._createActionByOption("onFileSaving") } } exports.plugin = { name: "export", init: function() { var that = this; that._exportMenu = new exports.ExportMenu({ renderer: that._renderer, svgMethod: function() { return that.svg() }, incidentOccurred: that._incidentOccurred }); that._layout.add(that._exportMenu) }, dispose: function() { this._exportMenu.dispose(); this._exportMenu = null }, members: { _getExportMenuOptions: function() { var userOptions = this._getOption("export") || {}, options = getExportOptions(this, userOptions); return _extend({}, userOptions, { exportOptions: options }) }, exportTo: function(fileName, format) { var that = this, exportOptions = getExportOptions(that, that._getOption("export") || {}, fileName, format); doExport(that._exportMenu, function() { return that.svg() }, exportOptions) }, print: function() { print(this.svg(), this._getOption("export").backgroundColor) } }, customize: function(constructor) { var proto = constructor.prototype; constructor.addChange({ code: "EXPORT", handler: function() { this._exportMenu.setOptions(this._getExportMenuOptions()); this._change(["LAYOUT"]) }, isThemeDependent: true, isOptionChange: true, option: "export" }); proto._optionChangesMap.onExporting = "EXPORT"; proto._optionChangesMap.onExported = "EXPORT"; proto._optionChangesMap.onFileSaving = "EXPORT" } } }, /*!***************************!*\ !*** ./js/viz/palette.js ***! \***************************/ function(module, exports, __webpack_require__) { var vizUtils = __webpack_require__( /*! ./core/utils */ 509), _floor = Math.floor, _ceil = Math.ceil, _Color = __webpack_require__( /*! ../color */ 38), commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, _isArray = Array.isArray, _isString = commonUtils.isString, _extend = extend, _normalizeEnum = vizUtils.normalizeEnum, HIGHLIGHTING_STEP = 50, DEFAULT = "default", currentPaletteName = DEFAULT; var palettes = { "default": { simpleSet: ["#5f8b95", "#ba4d51", "#af8a53", "#955f71", "#859666", "#7e688c"], indicatingSet: ["#a3b97c", "#e1b676", "#ec7f83"], gradientSet: ["#5f8b95", "#ba4d51"] }, "harmony light": { simpleSet: ["#fcb65e", "#679ec5", "#ad79ce", "#7abd5c", "#e18e92", "#b6d623", "#b7abea", "#85dbd5"], indicatingSet: ["#b6d623", "#fcb65e", "#e18e92"], gradientSet: ["#7abd5c", "#fcb65e"] }, "soft pastel": { simpleSet: ["#60a69f", "#78b6d9", "#6682bb", "#a37182", "#eeba69", "#90ba58", "#456c68", "#7565a4"], indicatingSet: ["#90ba58", "#eeba69", "#a37182"], gradientSet: ["#78b6d9", "#eeba69"] }, pastel: { simpleSet: ["#bb7862", "#70b3a1", "#bb626a", "#057d85", "#ab394b", "#dac599", "#153459", "#b1d2c6"], indicatingSet: ["#70b3a1", "#dac599", "#bb626a"], gradientSet: ["#bb7862", "#70b3a1"] }, bright: { simpleSet: ["#70c92f", "#f8ca00", "#bd1550", "#e97f02", "#9d419c", "#7e4452", "#9ab57e", "#36a3a6"], indicatingSet: ["#70c92f", "#f8ca00", "#bd1550"], gradientSet: ["#e97f02", "#f8ca00"] }, soft: { simpleSet: ["#cbc87b", "#9ab57e", "#e55253", "#7e4452", "#e8c267", "#565077", "#6babac", "#ad6082"], indicatingSet: ["#9ab57e", "#e8c267", "#e55253"], gradientSet: ["#9ab57e", "#e8c267"] }, ocean: { simpleSet: ["#75c099", "#acc371", "#378a8a", "#5fa26a", "#064970", "#38c5d2", "#00a7c6", "#6f84bb"], indicatingSet: ["#c8e394", "#7bc59d", "#397c8b"], gradientSet: ["#acc371", "#38c5d2"] }, vintage: { simpleSet: ["#dea484", "#efc59c", "#cb715e", "#eb9692", "#a85c4c", "#f2c0b5", "#c96374", "#dd956c"], indicatingSet: ["#ffe5c6", "#f4bb9d", "#e57660"], gradientSet: ["#efc59c", "#cb715e"] }, violet: { simpleSet: ["#d1a1d1", "#eeacc5", "#7b5685", "#7e7cad", "#a13d73", "#5b41ab", "#e287e2", "#689cc1"], indicatingSet: ["#d8e2f6", "#d0b2da", "#d56a8a"], gradientSet: ["#eeacc5", "#7b5685"] } }; function currentPalette(name) { if (void 0 === name) { return currentPaletteName } else { name = _normalizeEnum(name); currentPaletteName = name in palettes ? name : DEFAULT } } function getPalette(palette, parameters) { var result, type = parameters && parameters.type; if (_isArray(palette)) { return palette.slice(0) } else { if (_isString(palette)) { result = palettes[_normalizeEnum(palette)] } if (!result) { result = palettes[currentPaletteName] } } result = result || null; return type ? result ? result[type].slice(0) : result : result } function registerPalette(name, palette) { var paletteName, item = {}; if (_isArray(palette)) { item.simpleSet = palette.slice(0) } else { if (palette) { item.simpleSet = _isArray(palette.simpleSet) ? palette.simpleSet.slice(0) : void 0; item.indicatingSet = _isArray(palette.indicatingSet) ? palette.indicatingSet.slice(0) : void 0; item.gradientSet = _isArray(palette.gradientSet) ? palette.gradientSet.slice(0) : void 0 } } if (item.simpleSet || item.indicatingSet || item.gradientSet) { paletteName = _normalizeEnum(name); _extend(palettes[paletteName] = palettes[paletteName] || {}, item) } } function RingBuf(buf) { var ind = 0; this.next = function() { var res = buf[ind++]; if (ind === buf.length) { this.reset() } return res }; this.reset = function() { ind = 0 } } function Palette(palette, parameters) { parameters = parameters || {}; var stepHighlight = parameters.useHighlight ? HIGHLIGHTING_STEP : 0; this._originalPalette = getPalette(palette, { type: parameters.type || "simpleSet" }); this._paletteSteps = new RingBuf([0, stepHighlight, -stepHighlight]); this._resetPalette() } Palette.prototype = { constructor: Palette, dispose: function() { this._originalPalette = this._palette = this._paletteSteps = null }, getNextColor: function() { var that = this; if (that._currentColor >= that._palette.length) { that._resetPalette() } return that._palette[that._currentColor++] }, _resetPalette: function() { var that = this, step = that._paletteSteps.next(); that._palette = step ? getAlteredPalette(that._originalPalette, step) : that._originalPalette.slice(0); that._currentColor = 0 }, reset: function() { this._paletteSteps.reset(); this._resetPalette(); return this } }; function getAlteredPalette(originalPalette, step) { var i, palette = [], ii = originalPalette.length; for (i = 0; i < ii; ++i) { palette.push(getNewColor(originalPalette[i], step)) } return palette } function getNewColor(currentColor, step) { var newColor = new _Color(currentColor).alter(step), lightness = getLightness(newColor); if (lightness > 200 || lightness < 55) { newColor = new _Color(currentColor).alter(-step / 2) } return newColor.toHex() } function getLightness(color) { return .3 * color.r + .59 * color.g + .11 * color.b } function DiscretePalette(source, size) { var palette = size > 0 ? createDiscreteColors(getPalette(source, { type: "gradientSet" }), size) : []; this.getColor = function(index) { return palette[index] || null } } function createDiscreteColors(source, count) { var i, colorCount = count - 1, sourceCount = source.length - 1, colors = [], gradient = []; function addColor(pos) { var k = sourceCount * pos, kl = _floor(k), kr = _ceil(k); gradient.push(colors[kl].blend(colors[kr], k - kl).toHex()) } for (i = 0; i <= sourceCount; ++i) { colors.push(new _Color(source[i])) } if (colorCount > 0) { for (i = 0; i <= colorCount; ++i) { addColor(i / colorCount) } } else { addColor(.5) } return gradient } function GradientPalette(source) { var palette = getPalette(source, { type: "gradientSet" }), color1 = new _Color(palette[0]), color2 = new _Color(palette[1]); this.getColor = function(ratio) { return 0 <= ratio && ratio <= 1 ? color1.blend(color2, ratio).toHex() : null } } _extend(exports, { Palette: Palette, DiscretePalette: DiscretePalette, GradientPalette: GradientPalette, registerPalette: registerPalette, getPalette: getPalette, currentPalette: currentPalette }); exports._DEBUG_palettes = palettes }, /*!*************************!*\ !*** ./js/viz/chart.js ***! \*************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), _extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../core/utils/array */ 26).inArray, registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), vizUtils = __webpack_require__( /*! ./core/utils */ 509), overlapping = __webpack_require__( /*! ./chart_components/base_chart */ 514).overlapping, LayoutManagerModule = __webpack_require__( /*! ./chart_components/layout_manager */ 555), multiAxesSynchronizer = __webpack_require__( /*! ./chart_components/multi_axes_synchronizer */ 562), AdvancedChart = __webpack_require__( /*! ./chart_components/advanced_chart */ 563).AdvancedChart, scrollBarModule = __webpack_require__( /*! ./chart_components/scroll_bar */ 582), crosshairModule = __webpack_require__( /*! ./chart_components/crosshair */ 581), DEFAULT_PANE_NAME = "default", DEFAULT_PANES = [{ name: DEFAULT_PANE_NAME, border: {} }], _map = vizUtils.map, _each = $.each, _isArray = Array.isArray, _isDefined = commonUtils.isDefined; function getFirstAxisNameForPane(axes, paneName, defaultPane) { var result; for (var i = 0; i < axes.length; i++) { if (axes[i].pane === paneName || void 0 === axes[i].pane && paneName === defaultPane) { result = axes[i].name; break } } if (!result) { result = axes[0].name } return result } function hideGridsOnNonFirstValueAxisForPane(valAxes, paneName, synchronizeMultiAxes) { var firstShownAxis, axesForPane = []; _each(valAxes, function(_, axis) { if (axis.pane === paneName) { axesForPane.push(axis) } }); if (axesForPane.length > 1 && synchronizeMultiAxes) { _each(axesForPane, function(_, axis) { var gridOpt = axis.getOptions().grid, minorGridOpt = axis.getOptions().minorGrid; if (firstShownAxis && gridOpt && gridOpt.visible) { gridOpt.visible = false; minorGridOpt && (minorGridOpt.visible = false) } else { firstShownAxis = firstShownAxis ? firstShownAxis : gridOpt && gridOpt.visible } }) } } function findAxisOptions(valueAxes, valueAxesOptions, axisName) { var result, axInd; for (axInd = 0; axInd < valueAxesOptions.length; axInd++) { if (valueAxesOptions[axInd].name === axisName) { result = valueAxesOptions[axInd]; result.priority = axInd; break } } if (!result) { for (axInd = 0; axInd < valueAxes.length; axInd++) { if (valueAxes[axInd].name === axisName) { result = valueAxes[axInd].getOptions(); result.priority = valueAxes[axInd].priority; break } } } return result } function findAxis(paneName, axisName, axes) { var axis, i; for (i = 0; i < axes.length; i++) { axis = axes[i]; if (axis.name === axisName && axis.pane === paneName) { return axis } } if (paneName) { return findAxis(void 0, axisName, axes) } } function applyClipSettings(clipRects, settings) { _each(clipRects || [], function(_, c) { c && c.attr(settings) }) } function compareAxes(a, b) { return a.priority - b.priority } function doesPaneExist(panes, paneName) { var found = false; _each(panes, function(_, pane) { if (pane.name === paneName) { found = true; return false } }); return found } var prepareSegmentRectPoints = function(left, top, width, height, borderOptions) { var maxSW = ~~((width < height ? width : height) / 2), sw = borderOptions.width || 0, newSW = sw < maxSW ? sw : maxSW; left += newSW / 2; top += newSW / 2; width -= newSW; height -= newSW; var segmentSequence, right = left + width, bottom = top + height, points = [], segments = [], visiblyOpt = 0, prevSegmentVisibility = 0; var allSegment = { top: [ [left, top], [right, top] ], right: [ [right, top], [right, bottom] ], bottom: [ [right, bottom], [left, bottom] ], left: [ [left, bottom], [left, top] ] }; _each(allSegment, function(seg) { var visibility = !!borderOptions[seg]; visiblyOpt = 2 * visiblyOpt + ~~visibility }); switch (visiblyOpt) { case 13: case 9: segmentSequence = ["left", "top", "right", "bottom"]; break; case 11: segmentSequence = ["bottom", "left", "top", "right"]; break; default: segmentSequence = ["top", "right", "bottom", "left"] } _each(segmentSequence, function(_, seg) { var segmentVisibility = !!borderOptions[seg]; if (!prevSegmentVisibility && segments.length) { points.push(segments); segments = [] } if (segmentVisibility) { _each(allSegment[seg].slice(prevSegmentVisibility), function(_, segment) { segments = segments.concat(segment) }) } prevSegmentVisibility = ~~segmentVisibility }); segments.length && points.push(segments); 1 === points.length && (points = points[0]); return { points: points, pathType: 15 === visiblyOpt ? "area" : "line" } }; function accumulate(field, src1, src2, auxSpacing) { var val1 = src1[field] || 0, val2 = src2[field] || 0; return val1 + val2 + (val1 && val2 ? auxSpacing : 0) } function pickMax(field, src1, src2) { return pickMaxValue(src1[field], src2[field]) } function pickMaxValue(val1, val2) { return Math.max(val1 || 0, val2 || 0) } function getAxisMargins(axis) { return axis.getMargins() } function getHorizontalAxesMargins(axes, getMarginsFunc) { return axes.reduce(function(margins, axis) { var axisMargins = getMarginsFunc(axis), paneMargins = margins.panes[axis.pane] = margins.panes[axis.pane] || {}, spacing = axis.getMultipleAxesSpacing(); paneMargins.top = accumulate("top", paneMargins, axisMargins, spacing); paneMargins.bottom = accumulate("bottom", paneMargins, axisMargins, spacing); paneMargins.left = pickMax("left", paneMargins, axisMargins); paneMargins.right = pickMax("right", paneMargins, axisMargins); margins.top = pickMax("top", paneMargins, margins); margins.bottom = pickMax("bottom", paneMargins, margins); margins.left = pickMax("left", paneMargins, margins); margins.right = pickMax("right", paneMargins, margins); return margins }, { panes: {} }) } function getVerticalAxesMargins(axes) { return axes.reduce(function(margins, axis) { var axisMargins = axis.getMargins(), paneMargins = margins.panes[axis.pane] = margins.panes[axis.pane] || {}, spacing = axis.getMultipleAxesSpacing(); paneMargins.top = pickMax("top", paneMargins, axisMargins); paneMargins.bottom = pickMax("bottom", paneMargins, axisMargins); paneMargins.left = accumulate("left", paneMargins, axisMargins, spacing); paneMargins.right = accumulate("right", paneMargins, axisMargins, spacing); margins.top = pickMax("top", paneMargins, margins); margins.bottom = pickMax("bottom", paneMargins, margins); margins.left = pickMax("left", paneMargins, margins); margins.right = pickMax("right", paneMargins, margins); return margins }, { panes: {} }) } function performActionOnAxes(axes, action, actionArgument1, actionArgument2) { axes.forEach(function(axis) { axis[action](actionArgument1 && actionArgument1[axis.pane], actionArgument2 && actionArgument2[axis.pane]) }) } function shrinkCanvases(isRotated, canvases, verticalMargins, horizontalMargins) { function getMargin(side, margins, pane) { var m = (isRotated ? ["left", "right"] : ["top", "bottom"]).indexOf(side) === -1 ? margins : margins.panes[pane] || {}; return m[side] } function getMaxMargin(side, margins1, margins2, pane) { return pickMaxValue(getMargin(side, margins1, pane), getMargin(side, margins2, pane)) } for (var pane in canvases) { canvases[pane].top = canvases[pane].originalTop + getMaxMargin("top", verticalMargins, horizontalMargins, pane); canvases[pane].bottom = canvases[pane].originalBottom + getMaxMargin("bottom", verticalMargins, horizontalMargins, pane); canvases[pane].left = canvases[pane].originalLeft + getMaxMargin("left", verticalMargins, horizontalMargins, pane); canvases[pane].right = canvases[pane].originalRight + getMaxMargin("right", verticalMargins, horizontalMargins, pane) } return canvases } function drawAxesWithTicks(axes, condition, canvases, panesBorderOptions) { if (condition) { performActionOnAxes(axes, "createTicks", canvases); multiAxesSynchronizer.synchronize(axes) } performActionOnAxes(axes, "draw", !condition && canvases, panesBorderOptions) } function shiftAxis(side1, side2) { var shifts = {}; return function(axis) { var shift = shifts[axis.pane] = shifts[axis.pane] || { top: 0, left: 0, bottom: 0, right: 0 }, spacing = axis.getMultipleAxesSpacing(), margins = axis.getMargins(); axis.shift(shift); shift[side1] = accumulate(side1, shift, margins, spacing); shift[side2] = accumulate(side2, shift, margins, spacing) } } function getCommonSize(side, margins) { var pane, paneMargins, size = 0; for (pane in margins.panes) { paneMargins = margins.panes[pane]; size += "height" === side ? paneMargins.top + paneMargins.bottom : paneMargins.left + paneMargins.right } return size } function checkUsedSpace(sizeShortage, side, axes, getMarginFunc) { var size = 0; if (sizeShortage[side] > 0) { size = getCommonSize(side, getMarginFunc(axes, getAxisMargins)); performActionOnAxes(axes, "hideTitle"); sizeShortage[side] -= size - getCommonSize(side, getMarginFunc(axes, getAxisMargins)) } if (sizeShortage[side] > 0) { performActionOnAxes(axes, "hideOuterElements") } } var dxChart = AdvancedChart.inherit({ _chartType: "chart", _setDeprecatedOptions: function() { this.callBase.apply(this, arguments); _extend(this._deprecatedOptions, { "argumentAxis.label.overlappingBehavior.rotationAngle": { since: "17.1", message: "Use the 'argumentAxis.label.rotationAngle' option instead" }, "argumentAxis.label.overlappingBehavior.staggeringSpacing": { since: "17.1", message: "Use the 'argumentAxis.label.staggeringSpacing' option instead" }, "argumentAxis.label.overlappingBehavior.mode": { since: "17.1", message: "Use the 'overlappingBehavior' option directly" }, "valueAxis.label.overlappingBehavior.rotationAngle": { since: "17.1", message: "Use the 'valueAxis.label.rotationAngle' option instead" }, "valueAxis.label.overlappingBehavior.staggeringSpacing": { since: "17.1", message: "Use the 'valueAxis.label.staggeringSpacing' option instead" }, "valueAxis.label.overlappingBehavior.mode": { since: "17.1", message: "Use the 'overlappingBehavior' option directly" }, "commonAxisSettings.label.overlappingBehavior.rotationAngle": { since: "17.1", message: "Use the 'commonAxisSettings.label.rotationAngle' option instead" }, "commonAxisSettings.label.overlappingBehavior.staggeringSpacing": { since: "17.1", message: "Use the 'commonAxisSettings.label.staggeringSpacing' option instead" }, "commonAxisSettings.label.overlappingBehavior.mode": { since: "17.1", message: "Use the 'overlappingBehavior' option directly" } }) }, _initCore: function() { this.paneAxis = {}; this._panesClipRects = {}; this.callBase() }, _disposeCore: function() { var that = this, disposeObjectsInArray = this._disposeObjectsInArray, panesClipRects = that._panesClipRects; that.callBase(); disposeObjectsInArray.call(panesClipRects, "fixed"); disposeObjectsInArray.call(panesClipRects, "base"); disposeObjectsInArray.call(panesClipRects, "wide"); that._panesClipRects = null }, _correctAxes: function() { this._correctValueAxes() }, _getExtraOptions: commonUtils.noop, _processSingleSeries: commonUtils.noop, _cleanPanesClipRects: function(clipArrayName) { var that = this, clipArray = that._panesClipRects[clipArrayName]; _each(clipArray || [], function(_, clipRect) { clipRect && clipRect.dispose() }); that._panesClipRects[clipArrayName] = [] }, _createPanes: function() { var defaultPane, that = this, panes = that.option("panes"), panesNameCounter = 0; if (!panes || _isArray(panes) && !panes.length) { panes = DEFAULT_PANES } that._cleanPanesClipRects("fixed"); that._cleanPanesClipRects("base"); that._cleanPanesClipRects("wide"); defaultPane = that.option("defaultPane"); panes = _extend(true, [], _isArray(panes) ? panes : [panes]); _each(panes, function(_, pane) { pane.name = !_isDefined(pane.name) ? DEFAULT_PANE_NAME + panesNameCounter++ : pane.name }); if (_isDefined(defaultPane)) { if (!doesPaneExist(panes, defaultPane)) { that._incidentOccurred("W2101", [defaultPane]); defaultPane = panes[panes.length - 1].name } } else { defaultPane = panes[panes.length - 1].name } that.defaultPane = defaultPane; panes = that._isRotated() ? panes.reverse() : panes; return panes }, _getAxisRenderingOptions: function() { return { axisType: "xyAxes", drawingType: "linear" } }, _prepareAxisOptions: function(typeSelector, userOptions, rotated) { return { isHorizontal: "argumentAxis" === typeSelector !== rotated } }, _checkPaneName: function(seriesTheme) { var paneList = _map(this.panes, function(pane) { return pane.name }); seriesTheme.pane = seriesTheme.pane || this.defaultPane; return inArray(seriesTheme.pane, paneList) !== -1 }, _getValueAxis: function(paneName, axisName) { var axisOptions, axis, that = this, valueAxes = that._valueAxes, valueAxisOptions = that.option("valueAxis") || {}, valueAxesOptions = _isArray(valueAxisOptions) ? valueAxisOptions : [valueAxisOptions]; axisName = axisName || getFirstAxisNameForPane(valueAxes, paneName, that.defaultPane); axis = findAxis(paneName, axisName, valueAxes); if (!axis) { axisOptions = findAxisOptions(valueAxes, valueAxesOptions, axisName); if (!axisOptions) { that._incidentOccurred("W2102", [axisName]); axisOptions = { name: axisName, priority: valueAxes.length } } axis = that._createAxis("valueAxis", axisOptions, { pane: paneName, name: axisName }, that._isRotated()); valueAxes.push(axis) } axis.setPane(paneName); return axis }, _correctValueAxes: function() { var that = this, synchronizeMultiAxes = that._themeManager.getOptions("synchronizeMultiAxes"), valueAxes = that._valueAxes, paneWithAxis = {}; that.series.forEach(function(series) { var axis = series.getValueAxis(); paneWithAxis[axis.pane] = true }); that.panes.forEach(function(pane) { var paneName = pane.name; if (!paneWithAxis[paneName]) { that._getValueAxis(paneName) } hideGridsOnNonFirstValueAxisForPane(valueAxes, pane.name, synchronizeMultiAxes) }); that._valueAxes = valueAxes.filter(function(axis) { if (!axis.pane) { axis.setPane(that.defaultPane) } return doesPaneExist(that.panes, axis.pane) }).sort(compareAxes) }, _getSeriesForPane: function(paneName) { var paneSeries = []; _each(this.series, function(_, oneSeries) { if (oneSeries.pane === paneName) { paneSeries.push(oneSeries) } }); return paneSeries }, _createPanesBorderOptions: function() { var commonBorderOptions = this._themeManager.getOptions("commonPaneSettings").border, panesBorderOptions = {}; _each(this.panes, function(_, pane) { panesBorderOptions[pane.name] = _extend(true, {}, commonBorderOptions, pane.border) }); return panesBorderOptions }, _createScrollBar: function() { var that = this, scrollBarOptions = that._themeManager.getOptions("scrollBar") || {}, scrollBarGroup = that._scrollBarGroup; if (scrollBarOptions.visible) { scrollBarOptions.rotated = that._isRotated(); that._scrollBar = (that._scrollBar || new scrollBarModule.ScrollBar(that._renderer, scrollBarGroup)).update(scrollBarOptions) } else { scrollBarGroup.linkRemove(); that._scrollBar && that._scrollBar.dispose(); that._scrollBar = null } }, _prepareToRender: function(drawOptions) { var that = this, panesBorderOptions = that._createPanesBorderOptions(), useAggregation = that._options.useAggregation, canvas = that._canvas, canvasLength = that._isRotated() ? canvas.height - canvas.top - canvas.bottom : canvas.width - canvas.left - canvas.right; that._createPanesBackground(); that._appendAxesGroups(); that._transformed && that._resetTransform(); that._updatePanesCanvases(drawOptions); if (useAggregation) { that.series.forEach(function(series) { series.resamplePoints(canvasLength) }) } if ((useAggregation || _isDefined(that._zoomMinArg) || _isDefined(that._zoomMaxArg)) && that._themeManager.getOptions("adjustOnZoom")) { that._valueAxes.forEach(function(axis) { var viewport = that.series.filter(function(s) { return s.getValueAxis() === axis }).reduce(function(range, s) { var seriesRange = s.getViewport(); range.min = range.min < seriesRange.min ? range.min : seriesRange.min; range.max = range.max > seriesRange.max ? range.max : seriesRange.max; return range }, {}); axis.zoom(viewport.min, viewport.max) }) } return panesBorderOptions }, _isLegendInside: function() { return this._legend && "inside" === this._legend.getPosition() }, _renderAxes: function(drawOptions, panesBorderOptions, rotated) { if (drawOptions && drawOptions.recreateCanvas) { vizUtils.updatePanesCanvases(this.panes, this._canvas, rotated) } this._drawAxes(drawOptions, panesBorderOptions) }, _isRotated: function() { return this._themeManager.getOptions("rotated") }, _getLayoutTargets: function() { return this.panes }, _applyClipRects: function(panesBorderOptions) { var i, that = this, canvasClipRectID = that._getCanvasClipRectID(); that._drawPanesBorders(panesBorderOptions); that._createClipRectsForPanes(); for (i = 0; i < that._argumentAxes.length; i++) { that._argumentAxes[i].applyClipRects(that._getElementsClipRectID(that._argumentAxes[i].pane), canvasClipRectID) } for (i = 0; i < that._valueAxes.length; i++) { that._valueAxes[i].applyClipRects(that._getElementsClipRectID(that._valueAxes[i].pane), canvasClipRectID) } that._fillPanesBackground() }, _updateLegendPosition: function(drawOptions, legendHasInsidePosition) { var that = this; if (drawOptions.drawLegend && that._legend && legendHasInsidePosition) { var panes = that.panes, newCanvas = _extend({}, panes[0].canvas), layoutManager = new LayoutManagerModule.LayoutManager; newCanvas.right = panes[panes.length - 1].canvas.right; newCanvas.bottom = panes[panes.length - 1].canvas.bottom; layoutManager.setOptions({ width: 0, height: 0 }); layoutManager.layoutElements([that._legend], newCanvas, commonUtils.noop, [{ canvas: newCanvas }], void 0) } }, _applyExtraSettings: function(series) { var that = this, paneIndex = that._getPaneIndex(series.pane), panesClipRects = that._panesClipRects, wideClipRect = panesClipRects.wide[paneIndex]; series.setClippingParams(panesClipRects.base[paneIndex].id, wideClipRect && wideClipRect.id, that._getPaneBorderVisibility(paneIndex)) }, _updatePanesCanvases: function(drawOptions) { if (!drawOptions.recreateCanvas) { return } vizUtils.updatePanesCanvases(this.panes, this._canvas, this._isRotated()) }, _restoreOriginalBusinessRange: function() { this._argumentAxes.concat(this._valueAxes).forEach(function(axis) { axis.restoreBusinessRange() }) }, _prepareAxesAndDraw: function(drawOptions, panesBorderOptions) { var that = this, rotated = that._isRotated(), synchronizeMultiAxes = that._themeManager.getOptions("synchronizeMultiAxes"), extendedArgAxes = (that._scrollBar ? [that._scrollBar] : []).concat(that._argumentAxes), verticalAxes = rotated ? extendedArgAxes : that._valueAxes, horizontalAxes = rotated ? that._valueAxes : extendedArgAxes, allAxes = verticalAxes.concat(horizontalAxes); var panesCanvases = that.panes.reduce(function(canvases, pane) { canvases[pane.name] = _extend({}, pane.canvas); return canvases }, {}); if (!drawOptions.adjustAxes) { drawAxesWithTicks(verticalAxes, !rotated && synchronizeMultiAxes, panesCanvases, panesBorderOptions); drawAxesWithTicks(horizontalAxes, rotated && synchronizeMultiAxes, panesCanvases, panesBorderOptions); return } if (that._scrollBar) { that._scrollBar.setPane(that.panes) } var vAxesMargins = { panes: {} }, hAxesMargins = getHorizontalAxesMargins(horizontalAxes, function(axis) { return axis.estimateMargins(panesCanvases[axis.pane]) }); panesCanvases = shrinkCanvases(rotated, panesCanvases, vAxesMargins, hAxesMargins); drawAxesWithTicks(verticalAxes, !rotated && synchronizeMultiAxes, panesCanvases, panesBorderOptions); vAxesMargins = getVerticalAxesMargins(verticalAxes); panesCanvases = shrinkCanvases(rotated, panesCanvases, vAxesMargins, hAxesMargins); drawAxesWithTicks(horizontalAxes, rotated && synchronizeMultiAxes, panesCanvases, panesBorderOptions); hAxesMargins = getHorizontalAxesMargins(horizontalAxes, getAxisMargins); panesCanvases = shrinkCanvases(rotated, panesCanvases, vAxesMargins, hAxesMargins); performActionOnAxes(allAxes, "updateSize", panesCanvases); horizontalAxes.forEach(shiftAxis("top", "bottom")); verticalAxes.forEach(shiftAxis("left", "right")); that.panes.forEach(function(pane) { _extend(pane.canvas, panesCanvases[pane.name]) }) }, _shrinkAxes: function(drawOptions, sizeShortage) { var panesCanvases, that = this, rotated = that._isRotated(), extendedArgAxes = (that._scrollBar ? [that._scrollBar] : []).concat(that._argumentAxes), verticalAxes = rotated ? extendedArgAxes : that._valueAxes, horizontalAxes = rotated ? that._valueAxes : extendedArgAxes, allAxes = verticalAxes.concat(horizontalAxes); if (sizeShortage.width || sizeShortage.height) { panesCanvases = that.panes.reduce(function(canvases, pane) { canvases[pane.name] = _extend({}, pane.canvas); return canvases }, {}); checkUsedSpace(sizeShortage, "height", horizontalAxes, getHorizontalAxesMargins); checkUsedSpace(sizeShortage, "width", verticalAxes, getVerticalAxesMargins); panesCanvases = shrinkCanvases(rotated, panesCanvases, getVerticalAxesMargins(verticalAxes), getHorizontalAxesMargins(horizontalAxes, getAxisMargins)); performActionOnAxes(allAxes, "updateSize", panesCanvases); horizontalAxes.forEach(shiftAxis("top", "bottom")); verticalAxes.forEach(shiftAxis("left", "right")); that.panes.forEach(function(pane) { $.extend(pane.canvas, panesCanvases[pane.name]) }) } }, _getPanesParameters: function() { var i, that = this, panes = that.panes, params = []; for (i = 0; i < panes.length; i++) { if (that._getPaneBorderVisibility(i)) { params.push({ coords: panes[i].borderCoords, clipRect: that._panesClipRects.fixed[i] }) } } return params }, _createCrosshairCursor: function() { var that = this, options = that._themeManager.getOptions("crosshair") || {}, index = that._displayedArgumentAxisIndex, axes = !that._isRotated() ? [ [that._argumentAxes[index]], that._valueAxes ] : [that._valueAxes, [that._argumentAxes[index]]], parameters = { canvas: that._getCommonCanvas(), panes: that._getPanesParameters(), axes: axes }; if (!options || !options.enabled) { return } if (!that._crosshair) { that._crosshair = new crosshairModule.Crosshair(that._renderer, options, parameters, that._crosshairCursorGroup) } else { that._crosshair.update(options, parameters) } that._crosshair.render() }, _getCommonCanvas: function() { var i, canvas, commonCanvas, panes = this.panes; for (i = 0; i < panes.length; i++) { canvas = panes[i].canvas; if (!commonCanvas) { commonCanvas = _extend({}, canvas) } else { commonCanvas.right = canvas.right; commonCanvas.bottom = canvas.bottom } } return commonCanvas }, _createPanesBackground: function() { var backgroundColor, rect, i, that = this, defaultBackgroundColor = that._themeManager.getOptions("commonPaneSettings").backgroundColor, renderer = that._renderer, rects = []; that._panesBackgroundGroup.clear(); for (i = 0; i < that.panes.length; i++) { backgroundColor = that.panes[i].backgroundColor || defaultBackgroundColor; if (!backgroundColor || "none" === backgroundColor) { rects.push(null); continue } rect = renderer.rect(0, 0, 0, 0).attr({ fill: backgroundColor, "stroke-width": 0 }).append(that._panesBackgroundGroup); rects.push(rect) } that.panesBackground = rects }, _fillPanesBackground: function() { var bc, that = this; _each(that.panes, function(i, pane) { bc = pane.borderCoords; if (null !== that.panesBackground[i]) { that.panesBackground[i].attr({ x: bc.left, y: bc.top, width: bc.width, height: bc.height }) } }) }, _calcPaneBorderCoords: function(pane) { var canvas = pane.canvas, bc = pane.borderCoords = pane.borderCoords || {}; bc.left = canvas.left; bc.top = canvas.top; bc.right = canvas.width - canvas.right; bc.bottom = canvas.height - canvas.bottom; bc.width = Math.max(bc.right - bc.left, 0); bc.height = Math.max(bc.bottom - bc.top, 0) }, _drawPanesBorders: function(panesBorderOptions) { var that = this, rotated = that._isRotated(); that._panesBorderGroup.linkRemove().clear(); _each(that.panes, function(i, pane) { var bc, segmentRectParams, borderOptions = panesBorderOptions[pane.name], attr = { fill: "none", stroke: borderOptions.color, "stroke-opacity": borderOptions.opacity, "stroke-width": borderOptions.width, dashStyle: borderOptions.dashStyle, "stroke-linecap": "square" }; that._calcPaneBorderCoords(pane, rotated); if (!borderOptions.visible) { return } bc = pane.borderCoords; segmentRectParams = prepareSegmentRectPoints(bc.left, bc.top, bc.width, bc.height, borderOptions); that._renderer.path(segmentRectParams.points, segmentRectParams.pathType).attr(attr).append(that._panesBorderGroup) }); that._panesBorderGroup.linkAppend() }, _createClipRect: function(clipArray, index, left, top, width, height) { var that = this, clipRect = clipArray[index]; if (!clipRect) { clipRect = that._renderer.clipRect(left, top, width, height); clipArray[index] = clipRect } else { clipRect.attr({ x: left, y: top, width: width, height: height }) } }, _createClipRectsForPanes: function() { var that = this, canvas = that._canvas; _each(that.panes, function(i, pane) { var needWideClipRect = false, bc = pane.borderCoords, left = bc.left, top = bc.top, width = bc.width, height = bc.height, panesClipRects = that._panesClipRects; that._createClipRect(panesClipRects.fixed, i, left, top, width, height); that._createClipRect(panesClipRects.base, i, left, top, width, height); _each(that.series, function(_, series) { if (series.pane === pane.name && (series.isFinancialSeries() || series.areErrorBarsVisible())) { needWideClipRect = true } }); if (needWideClipRect) { if (that._isRotated()) { top = 0; height = canvas.height } else { left = 0; width = canvas.width } that._createClipRect(panesClipRects.wide, i, left, top, width, height) } else { panesClipRects.wide[i] = null } }) }, _getPaneIndex: function(paneName) { var paneIndex; _each(this.panes, function(index, pane) { if (pane.name === paneName) { paneIndex = index; return false } }); return paneIndex }, _getPaneBorderVisibility: function(paneIndex) { var commonPaneBorderVisible = this._themeManager.getOptions("commonPaneSettings").border.visible, pane = this.panes[paneIndex] || {}, paneBorder = pane.border || {}; return "visible" in paneBorder ? paneBorder.visible : commonPaneBorderVisible }, _getElementsClipRectID: function(paneName) { return this._panesClipRects.fixed[this._getPaneIndex(paneName)].id }, _getCanvasForPane: function(paneName) { var i, panes = this.panes, panesNumber = panes.length; for (i = 0; i < panesNumber; i++) { if (panes[i].name === paneName) { return panes[i].canvas } } }, _getBusinessRange: function(paneName, axisName) { var foundRange, i, ranges = this.businessRanges || [], rangesNumber = ranges.length; for (i = 0; i < rangesNumber; i++) { if (ranges[i].val.pane === paneName && ranges[i].val.axis === axisName) { foundRange = ranges[i]; break } } if (!foundRange) { for (i = 0; i < rangesNumber; i++) { if (ranges[i].val.pane === paneName) { foundRange = ranges[i]; break } } } return foundRange }, _transformArgument: function(translate, scale) { var settings, clipSettings, that = this, rotated = that._isRotated(), panesClipRects = that._panesClipRects; if (!that._transformed) { that._transformed = true; that._labelsGroup.remove(); that._resetIsReady(); _each(that.series || [], function(i, s) { s.applyClip() }) } if (rotated) { settings = { translateY: translate, scaleY: scale }; clipSettings = { translateY: -translate / scale, scaleY: 1 / scale } } else { settings = { translateX: translate, scaleX: scale }; clipSettings = { translateX: -translate / scale, scaleX: 1 / scale } } applyClipSettings(panesClipRects.base, clipSettings); applyClipSettings(panesClipRects.wide, clipSettings); that._seriesGroup.attr(settings); that._scrollBar && that._scrollBar.transform(-translate, scale) }, _resetTransform: function() { var that = this, settings = { translateX: 0, translateY: 0, scaleX: null, scaleY: null }, panesClipRects = that._panesClipRects; applyClipSettings(panesClipRects.base, settings); applyClipSettings(panesClipRects.wide, settings); that._seriesGroup.attr(settings); _each(that.series || [], function(i, s) { s.resetClip() }); that._transformed = false }, _getTrackerSettings: function() { var that = this, themeManager = that._themeManager; return _extend(this.callBase(), { chart: that, zoomingMode: themeManager.getOptions("zoomingMode"), scrollingMode: themeManager.getOptions("scrollingMode"), rotated: that._isRotated(), crosshair: that._getCrosshairOptions().enabled ? that._crosshair : null }) }, _resolveLabelOverlappingStack: function() { var that = this, isRotated = that._isRotated(), shiftDirection = isRotated ? function(box, length) { return { x: box.x - length, y: box.y } } : function(box, length) { return { x: box.x, y: box.y - length } }; _each(that._getStackPoints(), function(_, stacks) { _each(stacks, function(_, points) { overlapping.resolveLabelOverlappingInOneDirection(points, that._getCommonCanvas(), isRotated, shiftDirection) }) }) }, _getStackPoints: function() { var stackPoints = {}, visibleSeries = this._getVisibleSeries(); _each(visibleSeries, function(_, singleSeries) { var points = singleSeries.getPoints(), stackName = singleSeries.getStackName() || null; _each(points, function(_, point) { var argument = point.argument; if (!stackPoints[argument]) { stackPoints[argument] = {} } if (!stackPoints[argument][stackName]) { stackPoints[argument][stackName] = [] } stackPoints[argument][stackName].push(point) }) }); return stackPoints }, _getCrosshairOptions: function() { return this._getOption("crosshair") }, zoomArgument: function(min, max, gesturesUsed) { var bounds, zoomArg, that = this; if (!_isDefined(min) && !_isDefined(max)) { return } if (!gesturesUsed) { that._eventTrigger("zoomStart") } zoomArg = that._argumentAxes[0].zoom(min, max, gesturesUsed); that._zoomMinArg = zoomArg.min; that._zoomMaxArg = zoomArg.max; that._notApplyMargins = gesturesUsed; that._doRender({ force: true, drawTitle: false, drawLegend: false, adjustAxes: false, animate: false }); bounds = that.getVisibleArgumentBounds(); that._eventTrigger("zoomEnd", { rangeStart: bounds.minVisible, rangeEnd: bounds.maxVisible }) }, _resetZoom: function() { var that = this; that._zoomMinArg = that._zoomMaxArg = that._notApplyMargins = void 0; that._argumentAxes[0] && that._argumentAxes[0].resetZoom() }, getVisibleArgumentBounds: function() { var translator = this._argumentAxes[0].getTranslator(), range = translator.getBusinessRange(), isDiscrete = "discrete" === range.axisType, categories = range.categories; return { minVisible: isDiscrete ? range.minVisible || categories[0] : range.minVisible, maxVisible: isDiscrete ? range.maxVisible || categories[categories.length - 1] : range.maxVisible } } }); dxChart.addPlugin(__webpack_require__( /*! ./chart_components/shutter_zoom */ 583)); registerComponent("dxChart", dxChart); module.exports = dxChart; module.exports._test_prepareSegmentRectPoints = function() { var original = prepareSegmentRectPoints.original || prepareSegmentRectPoints; if (arguments[0]) { prepareSegmentRectPoints = arguments[0] } prepareSegmentRectPoints.original = original; prepareSegmentRectPoints.restore = function() { prepareSegmentRectPoints = original }; return prepareSegmentRectPoints } }, /*!***********************************************!*\ !*** ./js/viz/chart_components/base_chart.js ***! \***********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, eventUtils = __webpack_require__( /*! ../../events/utils */ 71), BaseWidget = __webpack_require__( /*! ../core/base_widget */ 515), legendModule = __webpack_require__( /*! ../components/legend */ 521), dataValidatorModule = __webpack_require__( /*! ../components/data_validator */ 523), seriesModule = __webpack_require__( /*! ../series/base_series */ 525), chartThemeManagerModule = __webpack_require__( /*! ../components/chart_theme_manager */ 549), LayoutManagerModule = __webpack_require__( /*! ./layout_manager */ 555), trackerModule = __webpack_require__( /*! ./tracker */ 556), headerBlockModule = __webpack_require__( /*! ./header_block */ 557), REINIT_REFRESH_ACTION = "_reinit", REINIT_DATA_SOURCE_REFRESH_ACTION = "_updateDataSource", DATA_INIT_REFRESH_ACTION = "_dataInit", FORCE_RENDER_REFRESH_ACTION = "_forceRender", RESIZE_REFRESH_ACTION = "_resize", ACTIONS_BY_PRIORITY = [REINIT_REFRESH_ACTION, REINIT_DATA_SOURCE_REFRESH_ACTION, DATA_INIT_REFRESH_ACTION, FORCE_RENDER_REFRESH_ACTION, RESIZE_REFRESH_ACTION], vizUtils = __webpack_require__( /*! ../core/utils */ 509), _noop = commonUtils.noop, _map = vizUtils.map, _each = $.each, _extend = extend, _isArray = Array.isArray, _isDefined = commonUtils.isDefined, _setCanvasValues = vizUtils.setCanvasValues, DEFAULT_OPACITY = .3, REFRESH_SERIES_DATA_INIT_ACTION_OPTIONS = ["series", "commonSeriesSettings", "containerBackgroundColor", "dataPrepareSettings", "seriesSelectionMode", "pointSelectionMode", "useAggregation", "synchronizeMultiAxes"], REFRESH_SERIES_FAMILIES_ACTION_OPTIONS = ["equalBarWidth", "minBubbleSize", "maxBubbleSize", "barWidth", "negativesAsZeroes", "negativesAsZeros"], FORCE_RENDER_REFRESH_ACTION_OPTIONS = ["adaptiveLayout", "crosshair", "resolveLabelOverlapping", "adjustOnZoom", "zoomingMode", "scrollingMode"]; function checkHeightLabelsInCanvas(points, canvas, isRotated) { var labels, label, allLabelsAreInvisible, commonLabelSize = 0, canvasSize = canvas.end - canvas.start; for (var i = 0; i < points.length; i++) { labels = points[i].getLabels(); allLabelsAreInvisible = true; for (var j = 0; j < labels.length; j++) { label = labels[j]; if (label.isVisible()) { commonLabelSize += label.getBoundingRect()[isRotated ? "width" : "height"]; allLabelsAreInvisible = false } } if (allLabelsAreInvisible) { points[i] = null } } if (canvasSize > 0) { while (commonLabelSize > canvasSize) { commonLabelSize -= killSmallValues(points, isRotated) } } } function killSmallValues(points, isRotated) { var indexOfPoint, smallestValuePoint = { originalValue: 1 / 0 }, bBox = 0; _each(points, function(index, point) { if (point && smallestValuePoint.originalValue >= point.originalValue) { smallestValuePoint = point; indexOfPoint = index } }); if (null !== indexOfPoint) { points[indexOfPoint].getLabels().forEach(function(label) { bBox += label.getBoundingRect()[isRotated ? "width" : "height"]; label.hide() }); points[indexOfPoint] = null; return bBox } return 0 } function resolveLabelOverlappingInOneDirection(points, canvas, isRotated, shiftFunction) { var rollingStocks = [], stubCanvas = { start: isRotated ? canvas.left : canvas.top, end: isRotated ? canvas.width - canvas.right : canvas.height - canvas.bottom }, hasStackedSeries = false; checkHeightLabelsInCanvas(points, stubCanvas, isRotated); points.forEach(function(p) { if (!p) { return } hasStackedSeries = hasStackedSeries || p.series.isStackedSeries() || p.series.isFullStackedSeries(); p.getLabels().forEach(function(l) { l.isVisible() && rollingStocks.push(new RollingStock(l, isRotated, shiftFunction)) }) }); if (hasStackedSeries) { !isRotated && rollingStocks.reverse() } else { rollingStocks.sort(function(a, b) { return a.getInitialPosition() - b.getInitialPosition() }) } if (!checkStackOverlap(rollingStocks)) { return } rollingStocks.reverse(); moveRollingStock(rollingStocks, stubCanvas) } function overlapRollingStock(firstRolling, secondRolling) { if (!firstRolling || !secondRolling) { return } return firstRolling.getBoundingRect().end > secondRolling.getBoundingRect().start } function checkStackOverlap(rollingStocks) { var i, currentRollingStock, overlap, root; for (i = 0; i < rollingStocks.length - 1; i++) { currentRollingStock = root || rollingStocks[i]; if (overlapRollingStock(currentRollingStock, rollingStocks[i + 1])) { currentRollingStock.toChain(rollingStocks[i + 1]); rollingStocks[i + 1] = null; root = currentRollingStock; overlap = true } else { root = null } } return overlap } function moveRollingStock(rollingStocks, canvas) { var i, j, currentRollingStock, nextRollingStock, currentBBox, nextBBox; for (i = 0; i < rollingStocks.length; i++) { currentRollingStock = rollingStocks[i]; if (rollingStocksIsOut(currentRollingStock, canvas)) { currentBBox = currentRollingStock.getBoundingRect(); for (j = i + 1; j < rollingStocks.length; j++) { nextRollingStock = rollingStocks[j]; if (!nextRollingStock) { continue } nextBBox = nextRollingStock.getBoundingRect(); if (nextBBox.end > currentBBox.start - (currentBBox.end - canvas.end)) { nextRollingStock.toChain(currentRollingStock); rollingStocks[i] = currentRollingStock = null; break } } } currentRollingStock && currentRollingStock.setRollingStockInCanvas(canvas) } } function rollingStocksIsOut(rollingStock, canvas) { return rollingStock && rollingStock.getBoundingRect().end > canvas.end } function RollingStock(label, isRotated, shiftFunction) { var bBox = label.getBoundingRect(); this.labels = [label]; this.shiftFunction = shiftFunction; this._bBox = { start: isRotated ? bBox.x : bBox.y, width: isRotated ? bBox.width : bBox.height, end: isRotated ? bBox.x + bBox.width : bBox.y + bBox.height }; this._initialPosition = isRotated ? bBox.x : bBox.y; return this } RollingStock.prototype = { toChain: function(nextRollingStock) { var nextRollingStockBBox = nextRollingStock.getBoundingRect(); nextRollingStock.shift(nextRollingStockBBox.start - this._bBox.end); this._changeBoxWidth(nextRollingStockBBox.width); this.labels = this.labels.concat(nextRollingStock.labels) }, getBoundingRect: function() { return this._bBox }, shift: function(shiftLength) { var shiftFunction = this.shiftFunction; _each(this.labels, function(index, label) { var bBox = label.getBoundingRect(), coords = shiftFunction(bBox, shiftLength); label.shift(coords.x, coords.y) }); this._bBox.end -= shiftLength; this._bBox.start -= shiftLength }, setRollingStockInCanvas: function(canvas) { if (this._bBox.end > canvas.end) { this.shift(this._bBox.end - canvas.end) } }, getInitialPosition: function() { return this._initialPosition }, _changeBoxWidth: function(width) { this._bBox.end += width; this._bBox.width += width } }; function getLegendFields(name) { return { nameField: name + "Name", colorField: name + "Color", indexField: name + "Index" } } function getLegendSettings(legendDataField) { var formatObjectFields = getLegendFields(legendDataField); return { getFormatObject: function(data) { var res = {}; res[formatObjectFields.indexField] = data.id; res[formatObjectFields.colorField] = data.states.normal.fill; res[formatObjectFields.nameField] = data.text; return res }, textField: formatObjectFields.nameField } } function setTemplateFields(data, templateData, series) { _each(data, function(_, data) { _each(series.getTemplateFields(), function(_, field) { data[field.templateField] = data[field.originalField] }); templateData.push(data) }); series.updateTemplateFieldNames() } function checkOverlapping(firstRect, secondRect) { return (firstRect.x <= secondRect.x && secondRect.x <= firstRect.x + firstRect.width || firstRect.x >= secondRect.x && firstRect.x <= secondRect.x + secondRect.width) && (firstRect.y <= secondRect.y && secondRect.y <= firstRect.y + firstRect.height || firstRect.y >= secondRect.y && firstRect.y <= secondRect.y + secondRect.height) } var overlapping = { resolveLabelOverlappingInOneDirection: resolveLabelOverlappingInOneDirection }; function suppressCommonLayout(layout) { layout.forward = function(rect) { return rect }; layout.backward = _noop } var BaseChart = BaseWidget.inherit({ _eventsMap: { onSeriesClick: { name: "seriesClick" }, onPointClick: { name: "pointClick" }, onArgumentAxisClick: { name: "argumentAxisClick" }, onLegendClick: { name: "legendClick" }, onSeriesSelectionChanged: { name: "seriesSelectionChanged" }, onPointSelectionChanged: { name: "pointSelectionChanged" }, onSeriesHoverChanged: { name: "seriesHoverChanged" }, onPointHoverChanged: { name: "pointHoverChanged" }, onDone: { name: "done" }, onZoomStart: { name: "zoomStart" }, onZoomEnd: { name: "zoomEnd" } }, _rootClassPrefix: "dxc", _rootClass: "dxc-chart", _init: function() { this._savedBusinessRange = {}; this.callBase.apply(this, arguments) }, _initialChanges: ["REINIT"], _themeDependentChanges: ["REFRESH_SERIES_REINIT"], _createThemeManager: function() { var option = this.option(), themeManager = new chartThemeManagerModule.ThemeManager(option, this._chartType); themeManager.setTheme(option.theme, option.rtlEnabled); return themeManager }, _initCore: function() { var that = this; suppressCommonLayout(that._layout); that._canvasClipRect = that._renderer.clipRect(); that._createHtmlStructure(); that._headerBlock = new headerBlockModule.HeaderBlock; that._createLegend(); that._createTracker(); that._needHandleRenderComplete = true; that.layoutManager = new LayoutManagerModule.LayoutManager; that._createScrollBar(); that._$element.on("contextmenu", function(event) { that.eventType = "contextmenu"; if (eventUtils.isTouchEvent(event) || eventUtils.isPointerEvent(event)) { event.preventDefault() } }).on("MSHoldVisual", function(event) { that.eventType = "MSHoldVisual"; event.preventDefault() }) }, _getLayoutItems: commonUtils.noop, _layoutManagerOptions: function() { return this._themeManager.getOptions("adaptiveLayout") }, _reinit: function() { var that = this; _setCanvasValues(that._canvas); that._reinitAxes(); that._skipRender = true; that._updateDataSource(); if (!that.series) { that._dataSpecificInit(false) } that._skipRender = false; that._correctAxes(); that._forceRender() }, _correctAxes: _noop, _createHtmlStructure: function() { var that = this, renderer = that._renderer, root = renderer.root; that._backgroundRect = renderer.rect().attr({ fill: "gray", opacity: 1e-4 }).append(root); that._panesBackgroundGroup = renderer.g().attr({ "class": "dxc-background" }).append(root); that._stripsGroup = renderer.g().attr({ "class": "dxc-strips-group" }).linkOn(root, "strips"); that._gridGroup = renderer.g().attr({ "class": "dxc-grids-group" }).linkOn(root, "grids"); that._axesGroup = renderer.g().attr({ "class": "dxc-axes-group" }).linkOn(root, "axes"); that._constantLinesGroup = renderer.g().attr({ "class": "dxc-constant-lines-group" }).linkOn(root, "constant-lines"); that._labelAxesGroup = renderer.g().attr({ "class": "dxc-strips-labels-group" }).linkOn(root, "strips-labels"); that._panesBorderGroup = renderer.g().attr({ "class": "dxc-border" }).linkOn(root, "border"); that._seriesGroup = renderer.g().attr({ "class": "dxc-series-group" }).linkOn(root, "series"); that._labelsGroup = renderer.g().attr({ "class": "dxc-labels-group" }).linkOn(root, "labels"); that._crosshairCursorGroup = renderer.g().attr({ "class": "dxc-crosshair-cursor" }).linkOn(root, "crosshair"); that._legendGroup = renderer.g().attr({ "class": "dxc-legend", "clip-path": that._getCanvasClipRectID() }).linkOn(root, "legend"); that._scrollBarGroup = renderer.g().attr({ "class": "dxc-scroll-bar" }).linkOn(root, "scroll-bar") }, _disposeObjectsInArray: function(propName, fieldNames) { _each(this[propName] || [], function(_, item) { if (fieldNames && item) { _each(fieldNames, function(_, field) { item[field] && item[field].dispose() }) } else { item && item.dispose() } }); this[propName] = null }, _disposeCore: function() { var that = this, disposeObject = function(propName) { if (that[propName]) { that[propName].dispose(); that[propName] = null } }, unlinkGroup = function(name) { that[name].linkOff() }, disposeObjectsInArray = this._disposeObjectsInArray; that._renderer.stopAllAnimations(); that.businessRanges = null; disposeObjectsInArray.call(that, "series"); disposeObject("_headerBlock"); disposeObject("_tracker"); disposeObject("_crosshair"); that.layoutManager = that._userOptions = that._canvas = that._groupsData = null; unlinkGroup("_stripsGroup"); unlinkGroup("_gridGroup"); unlinkGroup("_axesGroup"); unlinkGroup("_constantLinesGroup"); unlinkGroup("_labelAxesGroup"); unlinkGroup("_panesBorderGroup"); unlinkGroup("_seriesGroup"); unlinkGroup("_labelsGroup"); unlinkGroup("_crosshairCursorGroup"); unlinkGroup("_legendGroup"); unlinkGroup("_scrollBarGroup"); disposeObject("_canvasClipRect"); disposeObject("_panesBackgroundGroup"); disposeObject("_backgroundRect"); disposeObject("_stripsGroup"); disposeObject("_gridGroup"); disposeObject("_axesGroup"); disposeObject("_constantLinesGroup"); disposeObject("_labelAxesGroup"); disposeObject("_panesBorderGroup"); disposeObject("_seriesGroup"); disposeObject("_labelsGroup"); disposeObject("_crosshairCursorGroup"); disposeObject("_legendGroup"); disposeObject("_scrollBarGroup") }, _getAnimationOptions: function() { return this._themeManager.getOptions("animation") }, _getDefaultSize: function() { return { width: 400, height: 400 } }, _getOption: function(name) { return this._themeManager.getOptions(name) }, _applySize: function() { this._processRefreshData(RESIZE_REFRESH_ACTION) }, _resize: function() { this._doRender(this.__renderOptions || { animate: false, isResize: true }) }, _trackerType: "ChartTracker", _createTracker: function() { var that = this; that._tracker = new trackerModule[that._trackerType]({ seriesGroup: that._seriesGroup, renderer: that._renderer, tooltip: that._tooltip, legend: that._legend, eventTrigger: that._eventTrigger }) }, _getTrackerSettings: function() { return this._getSelectionModes() }, _getSelectionModes: function() { var themeManager = this._themeManager; return { seriesSelectionMode: themeManager.getOptions("seriesSelectionMode"), pointSelectionMode: themeManager.getOptions("pointSelectionMode") } }, _updateTracker: function(trackerCanvases) { var that = this; that._tracker.update(that._getTrackerSettings()); that._tracker.setCanvases({ left: 0, right: that._canvas.width, top: 0, bottom: that._canvas.height }, trackerCanvases) }, _doRender: function(_options) { var drawOptions, recreateCanvas, that = this; if ( /*!that._initialized || */ that._skipRender) { return } if (0 === that._canvas.width && 0 === that._canvas.height) { return } that._resetIsReady(); drawOptions = that._prepareDrawOptions(_options); recreateCanvas = drawOptions.recreateCanvas; that.__originalCanvas = that._canvas; that._canvas = extend({}, that._canvas); if (recreateCanvas) { that.__currentCanvas = that._canvas } else { that._canvas = that.__currentCanvas } that.DEBUG_canvas = that._canvas; recreateCanvas && that._updateCanvasClipRect(that._canvas); that._renderer.stopAllAnimations(true); _setCanvasValues(that._canvas); that._cleanGroups(); that._renderElements(drawOptions) }, _renderElements: function(drawOptions) { var argBusinessRange, zoomMinArg, zoomMaxArg, that = this, preparedOptions = that._prepareToRender(drawOptions), isRotated = that._isRotated(), isLegendInside = that._isLegendInside(), trackerCanvases = [], layoutTargets = that._getLayoutTargets(), dirtyCanvas = extend({}, that._canvas), drawElements = [], layoutCanvas = drawOptions.drawTitle && drawOptions.drawLegend && drawOptions.adjustAxes; that.DEBUG_dirtyCanvas = dirtyCanvas; if (layoutCanvas) { drawElements = that._getDrawElements(drawOptions, isLegendInside) } that._renderer.lock(); that.layoutManager.setOptions(that._layoutManagerOptions()); that.layoutManager.layoutElements(drawElements, that._canvas, function(sizeShortage) { that._renderAxes(drawOptions, preparedOptions, isRotated); sizeShortage && that._shrinkAxes(drawOptions, sizeShortage) }, layoutTargets, isRotated); layoutCanvas && that._updateCanvasClipRect(dirtyCanvas); that._applyClipRects(preparedOptions); that._appendSeriesGroups(); that._createCrosshairCursor(); _each(layoutTargets, function() { var canvas = this.canvas; trackerCanvases.push({ left: canvas.left, right: canvas.width - canvas.right, top: canvas.top, bottom: canvas.height - canvas.bottom }) }); if (that._scrollBar) { argBusinessRange = that._argumentAxes[0].getTranslator().getBusinessRange(); if ("discrete" === argBusinessRange.axisType && argBusinessRange.categories && argBusinessRange.categories.length <= 1) { zoomMinArg = zoomMaxArg = void 0 } else { zoomMinArg = argBusinessRange.minVisible; zoomMaxArg = argBusinessRange.maxVisible } that._scrollBar.init(argBusinessRange).setPosition(zoomMinArg, zoomMaxArg) } that._updateTracker(trackerCanvases); that._updateLegendPosition(drawOptions, isLegendInside); that._renderSeries(drawOptions, isRotated, isLegendInside); that._renderer.unlock() }, _createCrosshairCursor: _noop, _appendSeriesGroups: function() { this._seriesGroup.linkAppend(); this._labelsGroup.linkAppend(); this._appendAdditionalSeriesGroups() }, _renderSeries: function(drawOptions, isRotated, isLegendInside) { this._calculateSeriesLayout(drawOptions, isRotated); this._renderSeriesElements(drawOptions, isRotated, isLegendInside) }, _calculateSeriesLayout: function(drawOptions, isRotated) { drawOptions.hideLayoutLabels = this.layoutManager.needMoreSpaceForPanesCanvas(this._getLayoutTargets(), isRotated) && !this._themeManager.getOptions("adaptiveLayout").keepLabels; this._updateSeriesDimensions(drawOptions); this._canvas = this.__originalCanvas }, _renderSeriesElements: function(drawOptions, isRotated, isLegendInside) { var i, singleSeries, that = this, series = that.series, seriesLength = series.length, resolveLabelOverlapping = that._themeManager.getOptions("resolveLabelOverlapping"); for (i = 0; i < seriesLength; i++) { singleSeries = series[i]; that._applyExtraSettings(singleSeries, drawOptions); singleSeries.draw(drawOptions.animate && singleSeries.getPoints().length <= drawOptions.animationPointsLimit && that._renderer.animationEnabled(), drawOptions.hideLayoutLabels, that._getLegendCallBack(singleSeries)) } "none" !== resolveLabelOverlapping && that._resolveLabelOverlapping(resolveLabelOverlapping); that._adjustSeries(); that._renderTrackers(isLegendInside); that._tracker.repairTooltip(); that._drawn(); that._renderCompleteHandler() }, _resolveLabelOverlapping: function(resolveLabelOverlapping) { var func; switch (resolveLabelOverlapping) { case "stack": func = this._resolveLabelOverlappingStack; break; case "hide": func = this._resolveLabelOverlappingHide; break; case "shift": func = this._resolveLabelOverlappingShift } commonUtils.isFunction(func) && func.call(this) }, _getVisibleSeries: function() { return commonUtils.grep(this.getAllSeries(), function(series) { return series.isVisible() }) }, _resolveLabelOverlappingHide: function() { var currentLabel, nextLabel, currentLabelRect, nextLabelRect, i, j, points, labels = [], series = this._getVisibleSeries(); for (i = 0; i < series.length; i++) { points = series[i].getVisiblePoints(); for (j = 0; j < points.length; j++) { labels = labels.concat(points[j].getLabels()) } } for (i = 0; i < labels.length; i++) { currentLabel = labels[i]; currentLabelRect = currentLabel.getBoundingRect(); if (!currentLabel.isVisible()) { continue } for (j = i + 1; j < labels.length; j++) { nextLabel = labels[j]; nextLabelRect = nextLabel.getBoundingRect(); if (checkOverlapping(currentLabelRect, nextLabelRect)) { nextLabel.hide() } } } }, _cleanGroups: function() { var that = this; that._stripsGroup.linkRemove().clear(); that._gridGroup.linkRemove().clear(); that._axesGroup.linkRemove().clear(); that._constantLinesGroup.linkRemove().clear(); that._labelAxesGroup.linkRemove().clear(); that._labelsGroup.linkRemove().clear(); that._crosshairCursorGroup.linkRemove().clear() }, _createLegend: function() { var that = this, legendSettings = getLegendSettings(that._legendDataField); that._legend = new legendModule.Legend({ renderer: that._renderer, group: that._legendGroup, backgroundClass: "dxc-border", itemGroupClass: "dxc-item", textField: legendSettings.textField, getFormatObject: legendSettings.getFormatObject }) }, _updateLegend: function() { var that = this, themeManager = that._themeManager, legendOptions = themeManager.getOptions("legend"), legendData = that._getLegendData(); legendOptions.containerBackgroundColor = themeManager.getOptions("containerBackgroundColor"); legendOptions._incidentOccurred = that._incidentOccurred; that._legend.update(legendData, legendOptions) }, _prepareDrawOptions: function(drawOptions) { var options, animationOptions = this._getAnimationOptions(); options = extend({}, { force: false, adjustAxes: true, drawLegend: true, drawTitle: true, animate: animationOptions.enabled, animationPointsLimit: animationOptions.maxPointCountSupported }, drawOptions, this.__renderOptions); if (!_isDefined(options.recreateCanvas)) { options.recreateCanvas = options.adjustAxes && options.drawLegend && options.drawTitle } return options }, _processRefreshData: function(newRefreshAction) { var currentRefreshActionPosition = inArray(this._currentRefreshData, ACTIONS_BY_PRIORITY), newRefreshActionPosition = inArray(newRefreshAction, ACTIONS_BY_PRIORITY); if (!this._currentRefreshData || currentRefreshActionPosition >= 0 && newRefreshActionPosition < currentRefreshActionPosition) { this._currentRefreshData = newRefreshAction } }, _getLegendData: function() { return _map(this._getLegendTargets(), function(item) { var legendData = item.legendData, style = item.getLegendStyles, opacity = style.normal.opacity; if (!item.visible) { if (!_isDefined(opacity) || opacity > DEFAULT_OPACITY) { opacity = DEFAULT_OPACITY } legendData.textOpacity = DEFAULT_OPACITY } legendData.states = { hover: style.hover, selection: style.selection, normal: _extend({}, style.normal, { opacity: opacity }) }; return legendData }) }, _getLegendOptions: function(item) { return { legendData: { text: item[this._legendItemTextField], argument: item.argument, id: item.index, argumentIndex: item.argumentIndex }, getLegendStyles: item.getLegendStyles(), visible: item.isVisible() } }, _disposeSeries: function() { var that = this; _each(that.series || [], function(_, series) { series.dispose() }); that.series = null; _each(that.seriesFamilies || [], function(_, family) { family.dispose() }); that.seriesFamilies = null; that._needHandleRenderComplete = true }, _optionChanged: function(arg) { this._themeManager.resetOptions(arg.name); this.callBase.apply(this, arguments) }, _applyChanges: function() { var that = this; that._themeManager.update(that._options); that.callBase.apply(that, arguments); that._doRefresh() }, _optionChangesMap: { animation: "ANIMATION", dataSource: "DATA_SOURCE", palette: "PALETTE", legend: "DATA_INIT", seriesTemplate: "DATA_INIT", "export": "FORCE_RENDER", valueAxis: "AXES_AND_PANES", argumentAxis: "AXES_AND_PANES", commonAxisSettings: "AXES_AND_PANES", panes: "AXES_AND_PANES", defaultPane: "AXES_AND_PANES", rotated: "ROTATED", customizePoint: "REFRESH_SERIES_REINIT", customizeLabel: "REFRESH_SERIES_REINIT", scrollBar: "SCROLL_BAR" }, _customChangesOrder: ["ANIMATION", "DATA_SOURCE", "PALETTE", "REFRESH_SERIES_DATA_INIT", "DATA_INIT", "REFRESH_SERIES_FAMILIES", "FORCE_RENDER", "AXES_AND_PANES", "ROTATED", "REFRESH_SERIES_REINIT", "SCROLL_BAR", "CHART_TOOLTIP", "REINIT"], _change_ANIMATION: function() { this._renderer.updateAnimationOptions(this._getAnimationOptions()) }, _change_DATA_SOURCE: function() { this._needHandleRenderComplete = true; this._processRefreshData(REINIT_DATA_SOURCE_REFRESH_ACTION) }, _change_PALETTE: function() { this._themeManager.updatePalette(this.option("palette")); this._refreshSeries(DATA_INIT_REFRESH_ACTION) }, _change_REFRESH_SERIES_DATA_INIT: function() { this._refreshSeries(DATA_INIT_REFRESH_ACTION) }, _change_DATA_INIT: function() { this._processRefreshData(DATA_INIT_REFRESH_ACTION) }, _change_REFRESH_SERIES_FAMILIES: function() { this._processSeriesFamilies(); this._populateBusinessRange(); this._processRefreshData(FORCE_RENDER_REFRESH_ACTION) }, _change_FORCE_RENDER: function() { this._processRefreshData(FORCE_RENDER_REFRESH_ACTION) }, _change_AXES_AND_PANES: function() { this._refreshSeries(REINIT_REFRESH_ACTION) }, _change_ROTATED: function() { this._createScrollBar(); this._refreshSeries(REINIT_REFRESH_ACTION) }, _change_REFRESH_SERIES_REINIT: function() { this._refreshSeries(REINIT_REFRESH_ACTION) }, _change_SCROLL_BAR: function() { this._createScrollBar(); this._processRefreshData(FORCE_RENDER_REFRESH_ACTION) }, _change_CHART_TOOLTIP: function() { this._organizeStackPoints() }, _change_REINIT: function() { this._processRefreshData(REINIT_REFRESH_ACTION) }, _refreshSeries: function(actionName) { this._disposeSeries(); this._processRefreshData(actionName) }, _doRefresh: function() { var methodName = this._currentRefreshData; if (methodName) { this._currentRefreshData = null; this._renderer.stopAllAnimations(true); this[methodName]() } }, _updateCanvasClipRect: function(canvas) { var width, height, that = this; width = Math.max(canvas.width - canvas.left - canvas.right, 0); height = Math.max(canvas.height - canvas.top - canvas.bottom, 0); that._canvasClipRect.attr({ x: canvas.left, y: canvas.top, width: width, height: height }); that._backgroundRect.attr({ x: canvas.left, y: canvas.top, width: width, height: height }) }, _getCanvasClipRectID: function() { return this._canvasClipRect.id }, _dataSourceChangedHandler: function() { this._resetZoom(); this._dataInit() }, _dataInit: function() { this._dataSpecificInit(true) }, _dataSpecificInit: function(needRedraw) { var that = this; that.series = that.series || that._populateSeries(); that._repopulateSeries(); that._seriesPopulatedHandlerCore(); that._populateBusinessRange(); that._tracker.updateSeries(that.series); that._updateLegend(); needRedraw && that._forceRender() }, _forceRender: function() { this._doRender({ force: true }) }, _repopulateSeries: function() { var parsedData, that = this, themeManager = that._themeManager, data = that._dataSourceItems(), dataValidatorOptions = themeManager.getOptions("dataPrepareSettings"), seriesTemplate = themeManager.getOptions("seriesTemplate"); if (seriesTemplate) { that._templatedSeries = vizUtils.processSeriesTemplate(seriesTemplate, data); that._populateSeries(); delete that._templatedSeries; data = that.templateData || data } that._groupSeries(); parsedData = dataValidatorModule.validateData(data, that._groupsData, that._incidentOccurred, dataValidatorOptions); themeManager.resetPalette(); that.series.forEach(function(singleSeries) { singleSeries.updateData(parsedData[singleSeries.getArgumentField()]); that._processSingleSeries(singleSeries) }); that._organizeStackPoints() }, _organizeStackPoints: function() { var that = this, themeManager = that._themeManager, sharedTooltip = themeManager.getOptions("tooltip").shared, stackPoints = {}; _each(that.series || [], function(_, singleSeries) { that._resetStackPoints(singleSeries); sharedTooltip && that._prepareStackPoints(singleSeries, stackPoints) }) }, _renderCompleteHandler: function() { var that = this, allSeriesInited = true; if (that._needHandleRenderComplete) { _each(that.series, function(_, s) { allSeriesInited = allSeriesInited && s.canRenderCompleteHandle() }); if (allSeriesInited) { that._needHandleRenderComplete = false; that._eventTrigger("done", { target: that }) } } }, _getDrawElements: function(drawOptions, legendHasInsidePosition) { var legendOptions, that = this, drawElements = [], exportOptions = that._themeManager.getOptions("export"), titleOptions = that._title.getLayoutOptions() || {}, headerElements = []; if (that._exportMenu && exportOptions.enabled) { headerElements.push(that._exportMenu); drawElements.push(that._headerBlock) } if (drawOptions.drawTitle) { "bottom" !== titleOptions.verticalAlignment && headerElements.length ? headerElements.push(that._title) : drawElements.push(that._title) } if (drawOptions.drawLegend && that._legend) { that._legendGroup.linkAppend(); if (!legendHasInsidePosition) { legendOptions = that._legend.getLayoutOptions(); if (1 === headerElements.length && "bottom" !== legendOptions.verticalAlignment && "vertical" === legendOptions.cutSide) { headerElements.push(that._legend) } else { drawElements.push(that._legend) } } } if (headerElements.length) { that._headerBlock.update(headerElements, that._canvas) } return drawElements }, _resetZoom: _noop, _dataIsReady: function() { return _isDefined(this.option("dataSource")) && this._dataIsLoaded() }, _populateSeries: function() { var particularSeriesOptions, particularSeries, seriesTheme, data, i, eventPipe, that = this, themeManager = that._themeManager, hasSeriesTemplate = !!themeManager.getOptions("seriesTemplate"), seriesOptions = hasSeriesTemplate ? that._templatedSeries : that.option("series"), allSeriesOptions = _isArray(seriesOptions) ? seriesOptions : seriesOptions ? [seriesOptions] : [], extraOptions = that._getExtraOptions(), seriesVisibilityChanged = function() { that._specialProcessSeries(); that._populateBusinessRange(); that._renderer.stopAllAnimations(true); that._updateLegend(); that._doRender({ force: true }) }; that._disposeSeries(); that.series = []; that.templateData = []; themeManager.resetPalette(); eventPipe = function(data) { that.series.forEach(function(currentSeries) { currentSeries.notify(data) }) }; for (i = 0; i < allSeriesOptions.length; i++) { particularSeriesOptions = _extend(true, {}, allSeriesOptions[i], extraOptions); if (!particularSeriesOptions.name) { particularSeriesOptions.name = "Series " + (i + 1).toString() } data = particularSeriesOptions.data; particularSeriesOptions.data = null; particularSeriesOptions.rotated = that._isRotated(); particularSeriesOptions.customizePoint = themeManager.getOptions("customizePoint"); particularSeriesOptions.customizeLabel = themeManager.getOptions("customizeLabel"); particularSeriesOptions.visibilityChanged = seriesVisibilityChanged; particularSeriesOptions.incidentOccurred = that._incidentOccurred; seriesTheme = themeManager.getOptions("series", particularSeriesOptions); if (!that._checkPaneName(seriesTheme)) { continue } particularSeries = new seriesModule.Series({ renderer: that._renderer, seriesGroup: that._seriesGroup, labelsGroup: that._labelsGroup, eventTrigger: that._eventTrigger, commonSeriesModes: that._getSelectionModes(), eventPipe: eventPipe, argumentAxis: that._getArgumentAxis(), valueAxis: that._getValueAxis(seriesTheme.pane, seriesTheme.axis) }, seriesTheme); if (!particularSeries.isUpdated) { that._incidentOccurred("E2101", [seriesTheme.type]) } else { particularSeries.index = that.series.length; that._processSingleSeries(particularSeries); that.series.push(particularSeries); if (hasSeriesTemplate) { setTemplateFields(data, that.templateData, particularSeries) } } } return that.series }, getAllSeries: function() { return this.series.slice() }, getSeriesByName: function(name) { var found = null; _each(this.series, function(i, singleSeries) { if (singleSeries.name === name) { found = singleSeries; return false } }); return found }, getSeriesByPos: function(pos) { return this.series[pos] }, clearSelection: function() { this._tracker.clearSelection() }, hideTooltip: function() { this._tracker._hideTooltip() }, render: function(renderOptions) { var that = this; that.__renderOptions = renderOptions; that.__forceRender = renderOptions && renderOptions.force; that.callBase.apply(that, arguments); that.__renderOptions = that.__forceRender = null; return that } }); REFRESH_SERIES_DATA_INIT_ACTION_OPTIONS.forEach(function(name) { BaseChart.prototype._optionChangesMap[name] = "REFRESH_SERIES_DATA_INIT" }); FORCE_RENDER_REFRESH_ACTION_OPTIONS.forEach(function(name) { BaseChart.prototype._optionChangesMap[name] = "FORCE_RENDER" }); REFRESH_SERIES_FAMILIES_ACTION_OPTIONS.forEach(function(name) { BaseChart.prototype._optionChangesMap[name] = "REFRESH_SERIES_FAMILIES" }); exports.overlapping = overlapping; exports.BaseChart = BaseChart; BaseChart.addPlugin(__webpack_require__( /*! ../core/export */ 511).plugin); BaseChart.addPlugin(__webpack_require__( /*! ../core/title */ 558).plugin); BaseChart.addPlugin(__webpack_require__( /*! ../core/tooltip */ 559).plugin); BaseChart.addPlugin(__webpack_require__( /*! ../core/loading_indicator */ 560).plugin); BaseChart.addPlugin(__webpack_require__( /*! ../core/data_source */ 561).plugin); var _change_TITLE = BaseChart.prototype._change_TITLE; BaseChart.prototype._change_TITLE = function() { _change_TITLE.apply(this, arguments); this._change(["FORCE_RENDER"]) }; var _change_TOOLTIP = BaseChart.prototype._change_TOOLTIP; BaseChart.prototype._change_TOOLTIP = function() { _change_TOOLTIP.apply(this, arguments); this._change(["CHART_TOOLTIP"]) } }, /*!************************************!*\ !*** ./js/viz/core/base_widget.js ***! \************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, version = __webpack_require__( /*! ../../core/version */ 19), _windowResizeCallbacks = __webpack_require__( /*! ../../core/utils/window */ 44).resizeCallbacks, _stringFormat = __webpack_require__( /*! ../../core/utils/string */ 18).format, _isObject = __webpack_require__( /*! ../../core/utils/common */ 14).isObject, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, _floor = Math.floor, DOMComponent = __webpack_require__( /*! ../../core/dom_component */ 43), helpers = __webpack_require__( /*! ./helpers */ 516), _parseScalar = __webpack_require__( /*! ./utils */ 509).parseScalar, errors = __webpack_require__( /*! ./errors_warnings */ 517), _log = errors.log, rendererModule = __webpack_require__( /*! ./renderers/renderer */ 518), _Layout = __webpack_require__( /*! ./layout */ 520), OPTION_RTL_ENABLED = "rtlEnabled", _option = DOMComponent.prototype.option; function getTrue() { return true } function getFalse() { return false } function areCanvasesDifferent(canvas1, canvas2) { return !(canvas1.width === canvas2.width && canvas1.height === canvas2.height && canvas1.left === canvas2.left && canvas1.top === canvas2.top && canvas1.right === canvas2.right && canvas1.bottom === canvas2.bottom) } function createResizeHandler(callback) { var timeout, handler = function() { clearTimeout(timeout); timeout = setTimeout(callback, 100) }; handler.dispose = function() { clearTimeout(timeout); return this }; return handler } function defaultOnIncidentOccurred(e) { _log.apply(null, [e.target.id].concat(e.target.args || [])) } var createIncidentOccurred = function(widgetName, eventTrigger) { return incidentOccurred; function incidentOccurred(id, args) { eventTrigger("incidentOccurred", { target: { id: id, type: "E" === id[0] ? "error" : "warning", args: args, text: _stringFormat.apply(null, [errors.ERROR_MESSAGES[id]].concat(args || [])), widget: widgetName, version: version } }) } }; function pickPositiveValue(value, defaultValue) { return Number(value > 0 ? value : defaultValue || 0) } module.exports = DOMComponent.inherit({ _eventsMap: { onIncidentOccurred: { name: "incidentOccurred" }, onDrawn: { name: "drawn" } }, _getDefaultOptions: function() { return extend(this.callBase(), { onIncidentOccurred: defaultOnIncidentOccurred }) }, _useLinks: true, _init: function() { var linkTarget, that = this; that.callBase.apply(that, arguments); that._changesLocker = 0; that._changes = helpers.changes(); that._suspendChanges(); that._themeManager = that._createThemeManager(); that._themeManager.setCallback(function() { that._requestChange(that._themeDependentChanges) }); that._renderElementAttributes(); that._initRenderer(); linkTarget = that._useLinks && that._renderer.root; linkTarget && linkTarget.enableLinks().virtualLink("core").virtualLink("peripheral"); that._renderVisibilityChange(); that._initEventTrigger(); that._incidentOccurred = createIncidentOccurred(that.NAME, that._eventTrigger); that._layout = new _Layout; linkTarget && linkTarget.linkAfter("core"); that._initPlugins(); that._initCore(); linkTarget && linkTarget.linkAfter(); that._change(that._initialChanges); that._resumeChanges() }, _initialChanges: ["LAYOUT", "RESIZE_HANDLER", "THEME"], _initPlugins: function() { var that = this; $.each(that._plugins, function(_, plugin) { plugin.init.call(that) }) }, _disposePlugins: function() { var that = this; $.each(that._plugins.slice().reverse(), function(_, plugin) { plugin.dispose.call(that) }) }, _change: function(codes) { this._changes.add(codes) }, _suspendChanges: function() { ++this._changesLocker }, _resumeChanges: function() { var that = this; if (0 === --that._changesLocker && that._changes.count() > 0 && !that._applyingChanges) { that._renderer.lock(); that._applyingChanges = true; that._applyChanges(); that._changes.reset(); that._applyingChanges = false; that._renderer.unlock(); if (that._optionsQueue) { that._applyQueuedOptions() } } }, _applyQueuedOptions: function() { var that = this, queue = that._optionsQueue; that._optionsQueue = null; that.beginUpdate(); $.each(queue, function(_, action) { action() }); that.endUpdate() }, _requestChange: function(codes) { this._suspendChanges(); this._change(codes); this._resumeChanges() }, _applyChanges: function() { var i, that = this, changes = that._changes, order = that._totalChangesOrder, ii = order.length; for (i = 0; i < ii; ++i) { if (changes.has(order[i])) { that["_change_" + order[i]]() } } }, _optionChangesOrder: ["EVENTS", "THEME", "RENDERER", "RESIZE_HANDLER"], _layoutChangesOrder: ["ELEMENT_ATTR", "CONTAINER_SIZE", "LAYOUT"], _customChangesOrder: [], _change_EVENTS: function() { this._eventTrigger.applyChanges() }, _change_THEME: function() { this._setThemeAndRtl() }, _change_RENDERER: function() { this._setRendererOptions() }, _change_RESIZE_HANDLER: function() { this._setupResizeHandler() }, _change_ELEMENT_ATTR: function() { this._renderElementAttributes(); this._change(["CONTAINER_SIZE"]) }, _change_CONTAINER_SIZE: function() { this._updateSize() }, _change_LAYOUT: function() { this._setContentSize() }, _themeDependentChanges: ["RENDERER"], _initRenderer: function() { var that = this; that._canvas = that._calculateCanvas(); that._renderer = new rendererModule.Renderer({ cssClass: that._rootClassPrefix + " " + that._rootClass, pathModified: that.option("pathModified"), container: that._$element[0] }); that._renderer.resize(that._canvas.width, that._canvas.height) }, _disposeRenderer: function() { this._useLinks && this._renderer.root.checkLinks(); this._renderer.dispose() }, _getAnimationOptions: noop, render: function() { this._requestChange(["CONTAINER_SIZE"]); this._onRender() }, _onRender: noop, _dispose: function() { var that = this; that.callBase.apply(that, arguments); that._removeResizeHandler(); that._layout.dispose(); that._eventTrigger.dispose(); that._disposeCore(); that._disposePlugins(); that._disposeRenderer(); that._themeManager.dispose(); that._themeManager = that._renderer = that._eventTrigger = null }, _initEventTrigger: function() { var that = this; that._eventTrigger = createEventTrigger(that._eventsMap, function(name) { return that._createActionByOption(name) }) }, _calculateCanvas: function() { var that = this, size = that.option("size") || {}, margin = that.option("margin") || {}, defaultCanvas = that._getDefaultSize() || {}, canvas = { width: size.width <= 0 ? 0 : _floor(pickPositiveValue(size.width, that._$element.width() || defaultCanvas.width)), height: size.height <= 0 ? 0 : _floor(pickPositiveValue(size.height, that._$element.height() || defaultCanvas.height)), left: pickPositiveValue(margin.left, defaultCanvas.left || 0), top: pickPositiveValue(margin.top, defaultCanvas.top || 0), right: pickPositiveValue(margin.right, defaultCanvas.right || 0), bottom: pickPositiveValue(margin.bottom, defaultCanvas.bottom || 0) }; if (canvas.width - canvas.left - canvas.right <= 0 || canvas.height - canvas.top - canvas.bottom <= 0) { canvas = { width: 0, height: 0 } } return canvas }, _updateSize: function() { var that = this, canvas = that._calculateCanvas(); if (areCanvasesDifferent(that._canvas, canvas) || that.__forceRender) { that._canvas = canvas; that._renderer.resize(canvas.width, canvas.height); that._change(["LAYOUT"]) } }, _setContentSize: function() { var nextRect, canvas = this._canvas, layout = this._layout, rect = canvas.width > 0 && canvas.height > 0 ? [canvas.left, canvas.top, canvas.width - canvas.right, canvas.height - canvas.bottom] : [0, 0, 0, 0]; rect = layout.forward(rect); nextRect = this._applySize(rect) || rect; layout.backward(nextRect) }, DEBUG_getCanvas: function() { return this._canvas }, DEBUG_getEventTrigger: function() { return this._eventTrigger }, _getOption: function(name, isScalar) { var theme = this._themeManager.theme(name), option = this.option(name); return isScalar ? void 0 !== option ? option : theme : extend(true, {}, theme, option) }, _setupResizeHandler: function() { if (_parseScalar(this._getOption("redrawOnResize", true), true)) { this._addResizeHandler() } else { this._removeResizeHandler() } }, _addResizeHandler: function() { var that = this; if (!that._resizeHandler) { that._resizeHandler = createResizeHandler(function() { that._requestChange(["CONTAINER_SIZE"]) }); _windowResizeCallbacks.add(that._resizeHandler) } }, _removeResizeHandler: function() { if (this._resizeHandler) { _windowResizeCallbacks.remove(this._resizeHandler); this._resizeHandler.dispose(); this._resizeHandler = null } }, _onBeginUpdate: noop, beginUpdate: function() { var that = this; if (that._initialized && 0 === that._updateLockCount) { that._onBeginUpdate(); that._suspendChanges() } that.callBase.apply(that, arguments); return that }, endUpdate: function() { var that = this, initialized = that._initialized; that.callBase.apply(that, arguments); if (initialized && 0 === that._updateLockCount) { that._resumeChanges() } return that }, option: function(name) { var that = this; if (that._initialized && that._applyingChanges && (arguments.length > 1 || _isObject(name))) { that._optionsQueue = that._optionsQueue || []; that._optionsQueue.push(that._getActionForUpdating(arguments)) } else { return _option.apply(that, arguments) } }, _getActionForUpdating: function(args) { var that = this; return that._deprecatedOptionsSuppressed ? function() { that._suppressDeprecatedWarnings(); _option.apply(that, args); that._resumeDeprecatedWarnings() } : function() { _option.apply(that, args) } }, _clean: noop, _render: noop, _optionChanged: function(arg) { var that = this; if (that._eventTrigger.change(arg.name)) { that._change(["EVENTS"]) } else { if (that._optionChangesMap[arg.name]) { that._change([that._optionChangesMap[arg.name]]) } else { that.callBase.apply(that, arguments) } } }, _optionChangesMap: { size: "CONTAINER_SIZE", margin: "CONTAINER_SIZE", redrawOnResize: "RESIZE_HANDLER", theme: "THEME", rtlEnabled: "THEME", encodeHtml: "THEME", elementAttr: "ELEMENT_ATTR" }, _visibilityChanged: function() { this.render() }, _setThemeAndRtl: function() { this._themeManager.setTheme(this.option("theme"), this.option(OPTION_RTL_ENABLED)) }, _getRendererOptions: function() { return { rtl: this.option(OPTION_RTL_ENABLED), encodeHtml: this.option("encodeHtml"), animation: this._getAnimationOptions() } }, _setRendererOptions: function() { this._renderer.setOptions(this._getRendererOptions()) }, svg: function() { return this._renderer.svg() }, getSize: function() { var canvas = this._canvas || {}; return { width: canvas.width, height: canvas.height } }, isReady: getFalse, _dataIsReady: getTrue, _resetIsReady: function() { this.isReady = getFalse }, _drawn: function() { var that = this; that.isReady = getFalse; if (that._dataIsReady()) { that._renderer.onEndAnimation(function() { that.isReady = getTrue }) } that._eventTrigger("drawn", {}) } }); helpers.replaceInherit(module.exports); function createEventTrigger(eventsMap, callbackGetter) { var triggers = {}; $.each(eventsMap, function(name, info) { if (info.name) { createEvent(name) } }); var changes; triggerEvent.change = function(name) { var eventInfo = eventsMap[name]; if (eventInfo) { (changes = changes || {})[name] = eventInfo } return !!eventInfo }; triggerEvent.applyChanges = function() { if (changes) { $.each(changes, function(name, eventInfo) { createEvent(eventInfo.newName || name) }); changes = null } }; triggerEvent.dispose = function() { eventsMap = callbackGetter = triggers = null }; return triggerEvent; function createEvent(name) { var eventInfo = eventsMap[name]; triggers[eventInfo.name] = callbackGetter(name) } function triggerEvent(name, arg, complete) { triggers[name](arg); complete && complete() } } module.exports.DEBUG_createEventTrigger = createEventTrigger; module.exports.DEBUG_createIncidentOccurred = createIncidentOccurred; module.exports.DEBUG_stub_createIncidentOccurred = function(stub) { createIncidentOccurred = stub }; module.exports.DEBUG_restore_createIncidentOccurred = function() { createIncidentOccurred = module.exports.DEBUG_createIncidentOccurred }; module.exports.DEBUG_createResizeHandler = createResizeHandler }, /*!********************************!*\ !*** ./js/viz/core/helpers.js ***! \********************************/ function(module, exports, __webpack_require__) { var _extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend; function Flags() { this.reset() } Flags.prototype = { constructor: Flags, add: function(codes) { var i, ii = codes.length, flags = this._flags; for (i = 0; i < ii; ++i) { flags[codes[i]] = 1 } this._k += ii }, has: function(code) { return this._flags[code] > 0 }, count: function() { return this._k }, reset: function() { this._flags = {}; this._k = 0 } }; function combineMaps(baseMap, thisMap) { return baseMap !== thisMap ? _extend({}, baseMap, thisMap) : _extend({}, baseMap) } function combineLists(baseList, thisList) { return baseList !== thisList ? baseList.concat(thisList) : baseList.slice() } function buildTotalChanges(proto) { proto._totalChangesOrder = proto._optionChangesOrder.concat(proto._layoutChangesOrder, proto._customChangesOrder) } function addChange(settings) { var proto = this.prototype, code = settings.code; proto["_change_" + code] = settings.handler; if (settings.isThemeDependent) { proto._themeDependentChanges.push(code) } if (settings.option) { proto._optionChangesMap[settings.option] = code }(settings.isOptionChange ? proto._optionChangesOrder : proto._customChangesOrder).push(code); buildTotalChanges(proto) } function addPlugin(plugin) { this.prototype._plugins.push(plugin); if (plugin.members) { _extend(this.prototype, plugin.members) } if (plugin.customize) { plugin.customize(this) } } exports.replaceInherit = function(widget) { var _inherit = widget.inherit; widget.inherit = function() { var proto = this.prototype, plugins = proto._plugins, eventsMap = proto._eventsMap, initialChanges = proto._initialChanges, themeDependentChanges = proto._themeDependentChanges, optionChangesMap = proto._optionChangesMap, optionChangesOrder = proto._optionChangesOrder, layoutChangesOrder = proto._layoutChangesOrder, customChangesOrder = proto._customChangesOrder, result = _inherit.apply(this, arguments); proto = result.prototype; proto._plugins = combineLists(plugins, proto._plugins); proto._eventsMap = combineMaps(eventsMap, proto._eventsMap); proto._initialChanges = combineLists(initialChanges, proto._initialChanges); proto._themeDependentChanges = combineLists(themeDependentChanges, proto._themeDependentChanges); proto._optionChangesMap = combineMaps(optionChangesMap, proto._optionChangesMap); proto._optionChangesOrder = combineLists(optionChangesOrder, proto._optionChangesOrder); proto._layoutChangesOrder = combineLists(layoutChangesOrder, proto._layoutChangesOrder); proto._customChangesOrder = combineLists(customChangesOrder, proto._customChangesOrder); buildTotalChanges(proto); result.addPlugin = addPlugin; return result }; widget.prototype._plugins = []; widget.addChange = addChange; widget.addPlugin = addPlugin }; exports.changes = function() { return new Flags } }, /*!****************************************!*\ !*** ./js/viz/core/errors_warnings.js ***! \****************************************/ function(module, exports, __webpack_require__) { var errorUtils = __webpack_require__( /*! ../../core/utils/error */ 8), errors = __webpack_require__( /*! ../../core/errors */ 7); module.exports = errorUtils(errors.ERROR_MESSAGES, { E2001: "Invalid data source", E2002: "Axis type and data type are incompatible", E2003: 'The "{0}" data source field contains data of unsupported type', E2004: 'The "{0}" data source field is inconsistent', E2101: "Unknown series type: {0}", E2102: "Ambiguity occurred between two value axes with the same name", E2103: 'The "{0}" option is given an invalid value. Assign a function instead', E2104: "Invalid logarithm base", E2105: 'Invalid value of a "{0}"', E2106: "Invalid visible range", E2202: "Invalid {0} scale value", E2203: "The range you are trying to set is invalid", W2002: "The {0} data field is absent", W2003: "Tick interval is too small", W2101: 'The "{0}" pane does not exist; the last pane is used by default', W2102: 'A value axis with the "{0}" name was created automatically', W2103: "The chart title was hidden due to the container size", W2104: "The legend was hidden due to the container size", W2105: 'The title of the "{0}" axis was hidden due to the container size', W2106: 'The labels of the "{0}" axis were hidden due to the container size', W2107: "The export menu was hidden due to the container size", W2301: "Invalid value range" }) }, /*!*******************************************!*\ !*** ./js/viz/core/renderers/renderer.js ***! \*******************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../../core/renderer */ 9), jQuery = __webpack_require__( /*! jquery */ 10), commonUtils = __webpack_require__( /*! ../../../core/utils/common */ 14), getSvgMarkup = __webpack_require__( /*! ../../../core/utils/svg */ 42).getSvgMarkup, doc = document, animation = __webpack_require__( /*! ./animation */ 519), math = Math, mathMin = math.min, mathMax = math.max, mathFloor = math.floor, mathRound = math.round, mathSin = math.sin, mathCos = math.cos, mathAbs = math.abs, mathPI = math.PI, _isDefined = commonUtils.isDefined, vizUtils = __webpack_require__( /*! ../utils */ 509), _normalizeEnum = vizUtils.normalizeEnum, _normalizeBBox = vizUtils.normalizeBBox, _rotateBBox = vizUtils.rotateBBox, PI_DIV_180 = mathPI / 180, _parseInt = parseInt, SHARPING_CORRECTION = .5, ARC_COORD_PREC = 5; var pxAddingExceptions = { "column-count": true, "fill-opacity": true, "flex-grow": true, "flex-shrink": true, "font-weight": true, "line-height": true, opacity: true, order: true, orphans: true, widows: true, "z-index": true, zoom: true }; var KEY_TEXT = "text", KEY_STROKE = "stroke", KEY_STROKE_WIDTH = "stroke-width", KEY_STROKE_OPACITY = "stroke-opacity", KEY_FONT_SIZE = "font-size", KEY_FONT_STYLE = "font-style", KEY_FONT_WEIGHT = "font-weight", KEY_TEXT_DECORATION = "text-decoration", NONE = "none"; var objectCreate = function() { if (!Object.create) { return function(proto) { var F = function() {}; F.prototype = proto; return new F } } else { return function(proto) { return Object.create(proto) } } }(); var DEFAULTS = { scaleX: 1, scaleY: 1 }; var backupContainer = doc.createElement("div"), backupCounter = 0; backupContainer.style.left = "-9999px"; backupContainer.style.position = "absolute"; function backupRoot(root) { if (0 === backupCounter) { doc.body.appendChild(backupContainer) }++backupCounter; root.append({ element: backupContainer }) } function restoreRoot(root, container) { root.append({ element: container }); --backupCounter; if (0 === backupCounter) { doc.body.removeChild(backupContainer) } } var getNextDefsSvgId = function() { var numDefsSvgElements = 1; return function() { return "DevExpress_" + numDefsSvgElements++ } }(); function isObjectArgument(value) { return value && "string" !== typeof value } function createElement(tagName) { return doc.createElementNS("http://www.w3.org/2000/svg", tagName) } function getFuncIri(id, pathModified) { return null !== id ? "url(" + (pathModified ? window.location.href.split("#")[0] : "") + "#" + id + ")" : id } function extend(target, source) { var key; for (key in source) { target[key] = source[key] } return target } function roundValue(value, exp) { value = value.toString().split("e"); value = mathRound(+(value[0] + "e" + (value[1] ? +value[1] + exp : exp))); value = value.toString().split("e"); return +(value[0] + "e" + (value[1] ? +value[1] - exp : -exp)) } var preserveAspectRatioMap = { full: NONE, lefttop: "xMinYMin", leftcenter: "xMinYMid", leftbottom: "xMinYMax", centertop: "xMidYMin", center: "xMidYMid", centerbottom: "xMidYMax", righttop: "xMaxYMin", rightcenter: "xMaxYMid", rightbottom: "xMaxYMax" }; function normalizeArcParams(x, y, innerR, outerR, startAngle, endAngle) { var isCircle, noArc = true, angleDiff = roundValue(endAngle, 3) - roundValue(startAngle, 3); if (angleDiff) { if (mathAbs(angleDiff) % 360 === 0) { startAngle = 0; endAngle = 360; isCircle = true; endAngle -= .01 } if (startAngle > 360) { startAngle %= 360 } if (endAngle > 360) { endAngle %= 360 } if (startAngle > endAngle) { startAngle -= 360 } noArc = false } startAngle *= PI_DIV_180; endAngle *= PI_DIV_180; return [x, y, mathMin(outerR, innerR), mathMax(outerR, innerR), mathCos(startAngle), mathSin(startAngle), mathCos(endAngle), mathSin(endAngle), isCircle, mathFloor(mathAbs(endAngle - startAngle) / mathPI) % 2 ? "1" : "0", noArc] } var buildArcPath = function(x, y, innerR, outerR, startAngleCos, startAngleSin, endAngleCos, endAngleSin, isCircle, longFlag) { return ["M", (x + outerR * startAngleCos).toFixed(ARC_COORD_PREC), (y - outerR * startAngleSin).toFixed(ARC_COORD_PREC), "A", outerR.toFixed(ARC_COORD_PREC), outerR.toFixed(ARC_COORD_PREC), 0, longFlag, 0, (x + outerR * endAngleCos).toFixed(ARC_COORD_PREC), (y - outerR * endAngleSin).toFixed(ARC_COORD_PREC), isCircle ? "M" : "L", (x + innerR * endAngleCos).toFixed(5), (y - innerR * endAngleSin).toFixed(ARC_COORD_PREC), "A", innerR.toFixed(ARC_COORD_PREC), innerR.toFixed(ARC_COORD_PREC), 0, longFlag, 1, (x + innerR * startAngleCos).toFixed(ARC_COORD_PREC), (y - innerR * startAngleSin).toFixed(ARC_COORD_PREC), "Z"].join(" ") }; function buildPathSegments(points, type) { var list = [ ["M", 0, 0] ]; switch (type) { case "line": list = buildLineSegments(points); break; case "area": list = buildLineSegments(points, true); break; case "bezier": list = buildCurveSegments(points); break; case "bezierarea": list = buildCurveSegments(points, true) } return list } function buildLineSegments(points, close) { return buildSegments(points, buildSimpleLineSegment, close) } function buildCurveSegments(points, close) { return buildSegments(points, buildSimpleCurveSegment, close) } function buildSegments(points, buildSimpleSegment, close) { var i, ii, list = []; if (points[0] && points[0].length) { for (i = 0, ii = points.length; i < ii; ++i) { buildSimpleSegment(points[i], close, list) } } else { buildSimpleSegment(points, close, list) } return list } function buildSimpleLineSegment(points, close, list) { var i = 0, k0 = list.length, k = k0, ii = (points || []).length; if (ii) { if (void 0 !== points[0].x) { for (; i < ii;) { list[k++] = ["L", points[i].x, points[i++].y] } } else { for (; i < ii;) { list[k++] = ["L", points[i++], points[i++]] } } list[k0][0] = "M" } else { list[k] = ["M", 0, 0] } close && list.push(["Z"]); return list } function buildSimpleCurveSegment(points, close, list) { var i, k = list.length, ii = (points || []).length; if (ii) { if (void 0 !== points[0].x) { list[k++] = ["M", points[0].x, points[0].y]; for (i = 1; i < ii;) { list[k++] = ["C", points[i].x, points[i++].y, points[i].x, points[i++].y, points[i].x, points[i++].y] } } else { list[k++] = ["M", points[0], points[1]]; for (i = 2; i < ii;) { list[k++] = ["C", points[i++], points[i++], points[i++], points[i++], points[i++], points[i++]] } } } else { list[k] = ["M", 0, 0] } close && list.push(["Z"]); return list } function combinePathParam(segments) { var i, segment, j, jj, d = [], k = 0, ii = segments.length; for (i = 0; i < ii; ++i) { segment = segments[i]; for (j = 0, jj = segment.length; j < jj; ++j) { d[k++] = segment[j] } } return d.join(" ") } function compensateSegments(oldSegments, newSegments, type) { var i, originalNewSegments, oldLength = oldSegments.length, newLength = newSegments.length, makeEqualSegments = type.indexOf("area") !== -1 ? makeEqualAreaSegments : makeEqualLineSegments; if (0 === oldLength) { for (i = 0; i < newLength; i++) { oldSegments.push(newSegments[i].slice(0)) } } else { if (oldLength < newLength) { makeEqualSegments(oldSegments, newSegments, type) } else { if (oldLength > newLength) { originalNewSegments = newSegments.slice(0); makeEqualSegments(newSegments, oldSegments, type) } } } return originalNewSegments } function prepareConstSegment(constSeg, type) { var x = constSeg[constSeg.length - 2], y = constSeg[constSeg.length - 1]; switch (type) { case "line": case "area": constSeg[0] = "L"; break; case "bezier": case "bezierarea": constSeg[0] = "C"; constSeg[1] = constSeg[3] = constSeg[5] = x; constSeg[2] = constSeg[4] = constSeg[6] = y } } function makeEqualLineSegments(short, long, type) { var constSeg = short[short.length - 1].slice(), i = short.length; prepareConstSegment(constSeg, type); for (; i < long.length; i++) { short[i] = constSeg.slice(0) } } function makeEqualAreaSegments(short, long, type) { var i, head, constsSeg1, constsSeg2, shortLength = short.length, longLength = long.length; if ((shortLength - 1) % 2 === 0 && (longLength - 1) % 2 === 0) { i = (shortLength - 1) / 2 - 1; head = short.slice(0, i + 1); constsSeg1 = head[head.length - 1].slice(0); constsSeg2 = short.slice(i + 1)[0].slice(0); prepareConstSegment(constsSeg1, type); prepareConstSegment(constsSeg2, type); for (var j = i; j < (longLength - 1) / 2 - 1; j++) { short.splice(j + 1, 0, constsSeg1); short.splice(j + 3, 0, constsSeg2) } } } function baseCss(that, styles) { var key, value, elemStyles = that._styles, str = ""; styles = styles || {}; for (key in styles) { value = styles[key]; if (_isDefined(value)) { if ("number" === typeof value && !pxAddingExceptions[key]) { value += "px" } elemStyles[key] = "" !== value ? value : null } } for (key in elemStyles) { value = elemStyles[key]; if (value) { str += key + ":" + value + ";" } } str && that.element.setAttribute("style", str); return that } function fixFuncIri(wrapper, attribute) { var element = wrapper.element, id = wrapper.attr(attribute); if (id && id.indexOf("DevExpress") !== -1) { element.removeAttribute(attribute); element.setAttribute(attribute, getFuncIri(id, wrapper.renderer.pathModified)) } } function baseAttr(that, attrs) { attrs = attrs || {}; var key, value, hasTransformations, recalculateDashStyle, sw, i, settings = that._settings, attributes = {}, elem = that.element, renderer = that.renderer, rtl = renderer.rtl; if (!isObjectArgument(attrs)) { if (attrs in settings) { return settings[attrs] } if (attrs in DEFAULTS) { return DEFAULTS[attrs] } return 0 } extend(attributes, attrs); for (key in attributes) { value = attributes[key]; if (void 0 === value) { continue } settings[key] = value; if ("align" === key) { key = "text-anchor"; value = { left: rtl ? "end" : "start", center: "middle", right: rtl ? "start" : "end" }[value] || null } else { if ("dashStyle" === key) { recalculateDashStyle = true; continue } else { if (key === KEY_STROKE_WIDTH) { recalculateDashStyle = true } else { if (value && ("fill" === key || "clip-path" === key || "filter" === key) && value.indexOf("DevExpress") !== -1) { that._addFixIRICallback(); value = getFuncIri(value, renderer.pathModified) } else { if (/^(translate(X|Y)|rotate[XY]?|scale(X|Y)|sharp)$/i.test(key)) { hasTransformations = true; continue } else { if (/^(x|y|d)$/i.test(key)) { hasTransformations = true } } } } } } if (null === value) { elem.removeAttribute(key) } else { elem.setAttribute(key, value) } } if (recalculateDashStyle && "dashStyle" in settings) { value = settings.dashStyle; sw = ("_originalSW" in that ? that._originalSW : settings[KEY_STROKE_WIDTH]) || 1; key = "stroke-dasharray"; value = null === value ? "" : _normalizeEnum(value); if ("" === value || "solid" === value || value === NONE) { that.element.removeAttribute(key) } else { value = value.replace(/longdash/g, "8,3,").replace(/dash/g, "4,3,").replace(/dot/g, "1,3,").replace(/,$/, "").split(","); i = value.length; while (i--) { value[i] = _parseInt(value[i]) * sw } that.element.setAttribute(key, value.join(",")) } } if (hasTransformations) { that._applyTransformation() } return that } function pathAttr(attrs) { var segments, that = this; if (isObjectArgument(attrs)) { attrs = extend({}, attrs); segments = attrs.segments; if ("points" in attrs) { segments = buildPathSegments(attrs.points, that.type); delete attrs.points } if (segments) { attrs.d = combinePathParam(segments); that.segments = segments; delete attrs.segments } } return baseAttr(that, attrs) } function arcAttr(attrs) { var x, y, innerRadius, outerRadius, startAngle, endAngle, settings = this._settings; if (isObjectArgument(attrs)) { attrs = extend({}, attrs); if ("x" in attrs || "y" in attrs || "innerRadius" in attrs || "outerRadius" in attrs || "startAngle" in attrs || "endAngle" in attrs) { settings.x = x = "x" in attrs ? attrs.x : settings.x; delete attrs.x; settings.y = y = "y" in attrs ? attrs.y : settings.y; delete attrs.y; settings.innerRadius = innerRadius = "innerRadius" in attrs ? attrs.innerRadius : settings.innerRadius; delete attrs.innerRadius; settings.outerRadius = outerRadius = "outerRadius" in attrs ? attrs.outerRadius : settings.outerRadius; delete attrs.outerRadius; settings.startAngle = startAngle = "startAngle" in attrs ? attrs.startAngle : settings.startAngle; delete attrs.startAngle; settings.endAngle = endAngle = "endAngle" in attrs ? attrs.endAngle : settings.endAngle; delete attrs.endAngle; attrs.d = buildArcPath.apply(null, normalizeArcParams(x, y, innerRadius, outerRadius, startAngle, endAngle)) } } return baseAttr(this, attrs) } function rectAttr(attrs) { var x, y, width, height, sw, maxSW, newSW, that = this; if (isObjectArgument(attrs)) { attrs = extend({}, attrs); if (void 0 !== attrs.x || void 0 !== attrs.y || void 0 !== attrs.width || void 0 !== attrs.height || void 0 !== attrs[KEY_STROKE_WIDTH]) { void 0 !== attrs.x ? x = that._originalX = attrs.x : x = that._originalX || 0; void 0 !== attrs.y ? y = that._originalY = attrs.y : y = that._originalY || 0; void 0 !== attrs.width ? width = that._originalWidth = attrs.width : width = that._originalWidth || 0; void 0 !== attrs.height ? height = that._originalHeight = attrs.height : height = that._originalHeight || 0; void 0 !== attrs[KEY_STROKE_WIDTH] ? sw = that._originalSW = attrs[KEY_STROKE_WIDTH] : sw = that._originalSW; maxSW = ~~((width < height ? width : height) / 2); newSW = (sw || 0) < maxSW ? sw || 0 : maxSW; attrs.x = x + newSW / 2; attrs.y = y + newSW / 2; attrs.width = width - newSW; attrs.height = height - newSW; ((sw || 0) !== newSW || !(0 === newSW && void 0 === sw)) && (attrs[KEY_STROKE_WIDTH] = newSW) } if ("sharp" in attrs) { delete attrs.sharp } } return baseAttr(that, attrs) } function textAttr(attrs) { var settings, isResetRequired, wasStroked, isStroked, that = this; if (!isObjectArgument(attrs)) { return baseAttr(that, attrs) } attrs = extend({}, attrs); settings = that._settings; wasStroked = _isDefined(settings[KEY_STROKE]) && _isDefined(settings[KEY_STROKE_WIDTH]); if (void 0 !== attrs[KEY_TEXT]) { settings[KEY_TEXT] = attrs[KEY_TEXT]; delete attrs[KEY_TEXT]; isResetRequired = true } if (void 0 !== attrs[KEY_STROKE]) { settings[KEY_STROKE] = attrs[KEY_STROKE]; delete attrs[KEY_STROKE] } if (void 0 !== attrs[KEY_STROKE_WIDTH]) { settings[KEY_STROKE_WIDTH] = attrs[KEY_STROKE_WIDTH]; delete attrs[KEY_STROKE_WIDTH] } if (void 0 !== attrs[KEY_STROKE_OPACITY]) { settings[KEY_STROKE_OPACITY] = attrs[KEY_STROKE_OPACITY]; delete attrs[KEY_STROKE_OPACITY] } isStroked = _isDefined(settings[KEY_STROKE]) && _isDefined(settings[KEY_STROKE_WIDTH]); baseAttr(that, attrs); isResetRequired = isResetRequired || isStroked !== wasStroked && settings[KEY_TEXT]; if (isResetRequired) { createTextNodes(that, settings.text, isStroked); that._hasEllipsis = false } if (isResetRequired || void 0 !== attrs.x || void 0 !== attrs.y) { locateTextNodes(that) } if (isStroked) { strokeTextNodes(that) } return that } function textCss(styles) { styles = styles || {}; baseCss(this, styles); if (KEY_FONT_SIZE in styles) { locateTextNodes(this) } return this } function orderHtmlTree(list, line, node, parentStyle, parentClassName) { var style, realStyle, i, ii, nodes; if (void 0 !== node.wholeText) { list.push({ value: node.wholeText, style: parentStyle, className: parentClassName, line: line, height: parentStyle[KEY_FONT_SIZE] || 0 }) } else { if ("BR" === node.tagName) { ++line } else { if (node.nodeType === Node.ELEMENT_NODE) { extend(style = {}, parentStyle); switch (node.tagName) { case "B": case "STRONG": style[KEY_FONT_WEIGHT] = "bold"; break; case "I": case "EM": style[KEY_FONT_STYLE] = "italic"; break; case "U": style[KEY_TEXT_DECORATION] = "underline" } realStyle = node.style; realStyle.color && (style.fill = realStyle.color); realStyle.fontSize && (style[KEY_FONT_SIZE] = _parseInt(realStyle.fontSize, 10)); realStyle.fontStyle && (style[KEY_FONT_STYLE] = realStyle.fontStyle); realStyle.fontWeight && (style[KEY_FONT_WEIGHT] = realStyle.fontWeight); realStyle.textDecoration && (style[KEY_TEXT_DECORATION] = realStyle.textDecoration); for (i = 0, nodes = node.childNodes, ii = nodes.length; i < ii; ++i) { line = orderHtmlTree(list, line, nodes[i], style, node.className || parentClassName) } } } } return line } function adjustLineHeights(items) { var i, ii, item, currentItem = items[0]; for (i = 1, ii = items.length; i < ii; ++i) { item = items[i]; if (item.line === currentItem.line) { currentItem.height = mathMax(currentItem.height, item.height); currentItem.inherits = currentItem.inherits || 0 === item.height; item.height = NaN } else { currentItem = item } } } function removeExtraAttrs(html) { var findTagAttrs = /(?:<[a-z0-9])+(?:[\s\S]*?>)/gi, findStyleAttrWithValue = /(\S*\s*)=\s*(["'])(?:(?!\2).)*\2\s?/gi; return html.replace(findTagAttrs, function(allTagAttrs) { return allTagAttrs.replace(findStyleAttrWithValue, function(currentAttr, attrName) { var lowerCaseAttrName = attrName.toLowerCase(); return "style" === lowerCaseAttrName || "class" === lowerCaseAttrName ? currentAttr : "" }) }) } function parseHTML(text) { var items = [], div = doc.createElement("div"); div.innerHTML = text.replace(/\r/g, "").replace(/\n/g, "<br/>"); orderHtmlTree(items, 0, div, {}, ""); adjustLineHeights(items); return items } function parseMultiline(text) { var texts = text.replace(/\r/g, "").split("\n"), i = 0, items = []; for (; i < texts.length; i++) { items.push({ value: texts[i], height: 0 }) } return items } function createTspans(items, element, fieldName) { var i, ii, item; for (i = 0, ii = items.length; i < ii; ++i) { item = items[i]; item[fieldName] = createElement("tspan"); item[fieldName].appendChild(doc.createTextNode(item.value)); item.style && baseCss({ element: item[fieldName], _styles: {} }, item.style); item.className && item[fieldName].setAttribute("class", item.className); element.appendChild(item[fieldName]) } } function applyEllipsis(maxWidth) { var lines, i, ii, lineParts, j, jj, text, ellipsis, ellipsisWidth, that = this, hasEllipsis = false; if (that._hasEllipsis) { that.attr({ text: that._settings.text }) } ellipsis = that.renderer.text("...").attr(that._styles).append(that.renderer.root); ellipsisWidth = ellipsis.getBBox().width; if (that._getElementBBox().width > maxWidth) { if (maxWidth - ellipsisWidth < 0) { maxWidth = 0 } else { maxWidth -= ellipsisWidth } lines = prepareLines(that.element, that._texts, maxWidth); for (i = 0, ii = lines.length; i < ii; ++i) { lineParts = lines[i].parts; if (1 === lines[i].commonLength) { continue } for (j = 0, jj = lineParts.length; j < jj; ++j) { text = lineParts[j]; if (_isDefined(text.endIndex)) { setNewText(text, text.endIndex); hasEllipsis = true } else { if (text.startBox > maxWidth) { removeTextSpan(text) } } } } } ellipsis.remove(); that._hasEllipsis = hasEllipsis; return hasEllipsis } function getIndexForEllipsis(text, maxWidth, startBox, endBox) { var k, kk; if (startBox <= maxWidth && endBox > maxWidth) { for (k = 1, kk = text.value.length; k <= kk; ++k) { if (startBox + text.tspan.getSubStringLength(0, k) > maxWidth) { return k - 1 } } } } function prepareLines(element, texts, maxWidth) { var i, ii, text, startBox, endBox, lines = []; if (texts) { for (i = 0, ii = texts.length; i < ii; ++i) { text = texts[i]; if (!lines[text.line]) { text.startBox = startBox = 0; lines.push({ commonLength: text.value.length, parts: [text] }) } else { text.startBox = startBox; lines[text.line].parts.push(text); lines[text.line].commonLength += text.value.length } endBox = startBox + text.tspan.getSubStringLength(0, text.value.length); text.endIndex = getIndexForEllipsis(text, maxWidth, startBox, endBox); startBox = endBox } } else { text = { value: element.textContent, tspan: element }; text.startBox = startBox = 0; endBox = text.value.length ? startBox + text.tspan.getSubStringLength(0, text.value.length) : 0; text.endIndex = getIndexForEllipsis(text, maxWidth, startBox, endBox); lines = [{ commonLength: element.textContent.length, parts: [text] }] } return lines } function setNewText(text, index) { var newText = text.value.substr(0, index) + "..."; text.tspan.textContent = newText; text.stroke && (text.stroke.textContent = newText) } function removeTextSpan(text) { text.tspan.parentNode.removeChild(text.tspan); text.stroke && text.stroke.parentNode.removeChild(text.stroke) } function createTextNodes(wrapper, text, isStroked) { var items, parsedHtml; wrapper._texts = null; wrapper.clear(); if (null === text) { return } text = "" + text; if (!wrapper.renderer.encodeHtml && (/<[a-z][\s\S]*>/i.test(text) || text.indexOf("&") !== -1)) { parsedHtml = removeExtraAttrs(text); items = parseHTML(parsedHtml); wrapper.DEBUG_parsedHtml = parsedHtml } else { if (text.indexOf("\n") !== -1) { items = parseMultiline(text) } else { if (isStroked) { items = [{ value: text, height: 0 }] } } } if (items) { if (items.length) { wrapper._texts = items; if (isStroked) { createTspans(items, wrapper.element, KEY_STROKE) } createTspans(items, wrapper.element, "tspan") } } else { wrapper.element.appendChild(doc.createTextNode(text)) } } function setTextNodeAttribute(item, name, value) { item.tspan.setAttribute(name, value); item.stroke && item.stroke.setAttribute(name, value) } function locateTextNodes(wrapper) { if (!wrapper._texts) { return } var i, ii, items = wrapper._texts, x = wrapper._settings.x, lineHeight = _parseInt(wrapper._styles[KEY_FONT_SIZE], 10) || 12, item = items[0]; setTextNodeAttribute(item, "x", x); setTextNodeAttribute(item, "y", wrapper._settings.y); for (i = 1, ii = items.length; i < ii; ++i) { item = items[i]; if (item.height >= 0) { setTextNodeAttribute(item, "x", x); setTextNodeAttribute(item, "dy", item.inherits ? mathMax(item.height, lineHeight) : item.height || lineHeight) } } } function strokeTextNodes(wrapper) { if (!wrapper._texts) { return } var tspan, i, ii, items = wrapper._texts, stroke = wrapper._settings[KEY_STROKE], strokeWidth = wrapper._settings[KEY_STROKE_WIDTH], strokeOpacity = wrapper._settings[KEY_STROKE_OPACITY] || 1; for (i = 0, ii = items.length; i < ii; ++i) { tspan = items[i].stroke; tspan.setAttribute(KEY_STROKE, stroke); tspan.setAttribute(KEY_STROKE_WIDTH, strokeWidth); tspan.setAttribute(KEY_STROKE_OPACITY, strokeOpacity); tspan.setAttribute("stroke-linejoin", "round") } } function baseAnimate(that, params, options, complete) { options = options || {}; var key, value, renderer = that.renderer, settings = that._settings, animationParams = {}; var defaults = { translateX: 0, translateY: 0, scaleX: 1, scaleY: 1, rotate: 0, rotateX: 0, rotateY: 0 }; if (complete) { options.complete = complete } if (renderer.animationEnabled()) { for (key in params) { value = params[key]; if (/^(translate(X|Y)|rotate[XY]?|scale(X|Y))$/i.test(key)) { animationParams.transform = animationParams.transform || { from: {}, to: {} }; animationParams.transform.from[key] = key in settings ? Number(settings[key].toFixed(3)) : defaults[key]; animationParams.transform.to[key] = value } else { if ("arc" === key || "segments" === key) { animationParams[key] = value } else { animationParams[key] = { from: key in settings ? settings[key] : parseFloat(that.element.getAttribute(key) || 0), to: value } } } } renderer.animateElement(that, animationParams, extend(extend({}, renderer._animation), options)) } else { options.step && options.step.call(that, 1, 1); options.complete && options.complete.call(that); that.attr(params) } return that } function pathAnimate(params, options, complete) { var newSegments, endSegments, that = this, curSegments = that.segments || []; if (that.renderer.animationEnabled() && "points" in params) { newSegments = buildPathSegments(params.points, that.type); endSegments = compensateSegments(curSegments, newSegments, that.type); params.segments = { from: curSegments, to: newSegments, end: endSegments }; delete params.points } return baseAnimate(that, params, options, complete) } function arcAnimate(params, options, complete) { var that = this, settings = that._settings, arcParams = { from: {}, to: {} }; if (that.renderer.animationEnabled() && ("x" in params || "y" in params || "innerRadius" in params || "outerRadius" in params || "startAngle" in params || "endAngle" in params)) { arcParams.from.x = settings.x || 0; arcParams.from.y = settings.y || 0; arcParams.from.innerRadius = settings.innerRadius || 0; arcParams.from.outerRadius = settings.outerRadius || 0; arcParams.from.startAngle = settings.startAngle || 0; arcParams.from.endAngle = settings.endAngle || 0; arcParams.to.x = "x" in params ? params.x : settings.x; delete params.x; arcParams.to.y = "y" in params ? params.y : settings.y; delete params.y; arcParams.to.innerRadius = "innerRadius" in params ? params.innerRadius : settings.innerRadius; delete params.innerRadius; arcParams.to.outerRadius = "outerRadius" in params ? params.outerRadius : settings.outerRadius; delete params.outerRadius; arcParams.to.startAngle = "startAngle" in params ? params.startAngle : settings.startAngle; delete params.startAngle; arcParams.to.endAngle = "endAngle" in params ? params.endAngle : settings.endAngle; delete params.endAngle; params.arc = arcParams } return baseAnimate(that, params, options, complete) } exports.DEBUG_set_getNextDefsSvgId = function(newFunction) { getNextDefsSvgId = newFunction }; exports.DEBUG_removeBackupContainer = function() { if (backupCounter) { backupCounter = 0; doc.body.removeChild(backupContainer) } }; function buildLink(target, parameters) { var obj = { is: false, name: parameters.name || parameters, after: parameters.after }; if (target) { obj.to = target } else { obj.virtual = true } return obj } function SvgElement(renderer, tagName, type) { var that = this; that.renderer = renderer; that.element = createElement(tagName); that._settings = {}; that._styles = {}; if ("path" === tagName) { that.type = type || "line" } } exports.SvgElement = SvgElement; SvgElement.prototype = { constructor: SvgElement, _getJQElement: function() { return this._$element || (this._$element = jQuery(this.element)) }, _addFixIRICallback: function() { var that = this; that._fixFuncIri = function() { fixFuncIri(that, "fill"); fixFuncIri(that, "clip-path"); fixFuncIri(that, "filter") }; fixFuncIriCallbacks.add(that._fixFuncIri); that._addFixIRICallback = function() {} }, dispose: function() { fixFuncIriCallbacks.remove(this._fixFuncIri); this._getJQElement().remove(); return this }, append: function(parent) { (parent || this.renderer.root).element.appendChild(this.element); return this }, remove: function() { var element = this.element; element.parentNode && element.parentNode.removeChild(element); return this }, enableLinks: function() { this._links = []; return this }, checkLinks: function() { var i, count = 0, links = this._links, ii = links.length; for (i = 0; i < ii; ++i) { if (!links[i]._link.virtual) { ++count } } if (count > 0) { throw new Error("There are non disposed links!") } }, virtualLink: function(parameters) { linkItem({ _link: buildLink(null, parameters) }, this); return this }, linkAfter: function(name) { this._linkAfter = name; return this }, linkOn: function(target, parameters) { this._link = buildLink(target, parameters); linkItem(this, target); return this }, linkOff: function() { unlinkItem(this); this._link = null; return this }, linkAppend: function() { var i, next, link = this._link, items = link.to._links; for (i = link.i + 1; (next = items[i]) && !next._link.is; ++i) {} this._insert(link.to, next); link.is = true; return this }, _insert: function(parent, next) { parent.element.insertBefore(this.element, next ? next.element : null) }, linkRemove: function() { this.remove(); this._link.is = false; return this }, clear: function() { this._getJQElement().empty(); return this }, toBackground: function() { var elem = this.element, parent = elem.parentNode; parent && parent.insertBefore(elem, parent.firstChild); return this }, toForeground: function() { var elem = this.element, parent = elem.parentNode; parent && parent.appendChild(elem); return this }, attr: function(attrs) { return baseAttr(this, attrs) }, smartAttr: function(attrs) { var that = this; if (attrs.hatching) { attrs = extend({}, attrs); attrs.fill = that._hatching = that.renderer.lockHatching(attrs.fill, attrs.hatching, that._hatching); delete attrs.hatching } else { if (that._hatching) { that.renderer.releaseHatching(that._hatching); that._hatching = null } } return that.attr(attrs) }, css: function(styles) { return baseCss(this, styles) }, animate: function(params, options, complete) { return baseAnimate(this, params, options, complete) }, sharp: function(pos) { return this.attr({ sharp: pos || true }) }, _applyTransformation: function() { var scaleXDefined, scaleYDefined, rotateX, rotateY, tr = this._settings, transformations = [], sharpMode = tr.sharp, strokeOdd = tr[KEY_STROKE_WIDTH] % 2, correctionX = strokeOdd && ("h" === sharpMode || true === sharpMode) ? SHARPING_CORRECTION : 0, correctionY = strokeOdd && ("v" === sharpMode || true === sharpMode) ? SHARPING_CORRECTION : 0; transformations.push("translate(" + ((tr.translateX || 0) + correctionX) + "," + ((tr.translateY || 0) + correctionY) + ")"); if (tr.rotate) { if ("rotateX" in tr) { rotateX = tr.rotateX } else { rotateX = tr.x } if ("rotateY" in tr) { rotateY = tr.rotateY } else { rotateY = tr.y } transformations.push("rotate(" + tr.rotate + "," + (rotateX || 0) + "," + (rotateY || 0) + ")") } scaleXDefined = _isDefined(tr.scaleX); scaleYDefined = _isDefined(tr.scaleY); if (scaleXDefined || scaleYDefined) { transformations.push("scale(" + (scaleXDefined ? tr.scaleX : 1) + "," + (scaleYDefined ? tr.scaleY : 1) + ")") } if (transformations.length) { this.element.setAttribute("transform", transformations.join(" ")) } }, move: function(x, y, animate, animOptions) { var obj = {}; _isDefined(x) && (obj.translateX = x); _isDefined(y) && (obj.translateY = y); if (!animate) { this.attr(obj) } else { this.animate(obj, animOptions) } return this }, rotate: function(angle, x, y, animate, animOptions) { var obj = { rotate: angle || 0 }; _isDefined(x) && (obj.rotateX = x); _isDefined(y) && (obj.rotateY = y); if (!animate) { this.attr(obj) } else { this.animate(obj, animOptions) } return this }, _getElementBBox: function() { var bBox, elem = this.element; try { bBox = elem.getBBox && elem.getBBox() } catch (e) {} return bBox || { x: 0, y: 0, width: elem.offsetWidth || 0, height: elem.offsetHeight || 0 } }, getBBox: function() { var transformation = this._settings, bBox = this._getElementBBox(); if (transformation.rotate) { bBox = _rotateBBox(bBox, [("rotateX" in transformation ? transformation.rotateX : transformation.x) || 0, ("rotateY" in transformation ? transformation.rotateY : transformation.y) || 0], -transformation.rotate) } else { bBox = _normalizeBBox(bBox) } return bBox }, markup: function() { return getSvgMarkup(this.element) }, getOffset: function() { return this._getJQElement().offset() }, stopAnimation: function(disableComplete) { var animation = this.animation; animation && animation.stop(disableComplete); return this }, setTitle: function(text) { var titleElem = createElement("title"); titleElem.textContent = text || ""; this.element.appendChild(titleElem) }, data: function(obj, val) { var key, elem = this.element; if (void 0 !== val) { elem[obj] = val } else { for (key in obj) { elem[key] = obj[key] } } return this }, on: function() { jQuery.fn.on.apply(this._getJQElement(), arguments); return this }, off: function() { jQuery.fn.off.apply(this._getJQElement(), arguments); return this }, trigger: function() { jQuery.fn.trigger.apply(this._getJQElement(), arguments); return this } }; function PathSvgElement(renderer, type) { SvgElement.call(this, renderer, "path", type) } exports.PathSvgElement = PathSvgElement; PathSvgElement.prototype = objectCreate(SvgElement.prototype); extend(PathSvgElement.prototype, { constructor: PathSvgElement, attr: pathAttr, animate: pathAnimate }); function ArcSvgElement(renderer) { SvgElement.call(this, renderer, "path", "arc") } exports.ArcSvgElement = ArcSvgElement; ArcSvgElement.prototype = objectCreate(SvgElement.prototype); extend(ArcSvgElement.prototype, { constructor: ArcSvgElement, attr: arcAttr, animate: arcAnimate }); function RectSvgElement(renderer) { SvgElement.call(this, renderer, "rect") } exports.RectSvgElement = RectSvgElement; RectSvgElement.prototype = objectCreate(SvgElement.prototype); extend(RectSvgElement.prototype, { constructor: RectSvgElement, attr: rectAttr }); function TextSvgElement(renderer) { SvgElement.call(this, renderer, "text") } exports.TextSvgElement = TextSvgElement; TextSvgElement.prototype = objectCreate(SvgElement.prototype); extend(TextSvgElement.prototype, { constructor: TextSvgElement, attr: textAttr, css: textCss, applyEllipsis: applyEllipsis }); function updateIndexes(items, k) { var i, item; for (i = k; !!(item = items[i]); ++i) { item._link.i = i } } function linkItem(target, container) { var i, item, items = container._links, key = target._link.after = target._link.after || container._linkAfter; if (key) { for (i = 0; (item = items[i]) && item._link.name !== key; ++i) {} if (item) { for (++i; (item = items[i]) && item._link.after === key; ++i) {} } } else { i = items.length } items.splice(i, 0, target); updateIndexes(items, i) } function unlinkItem(target) { var i, items = target._link.to._links; for (i = 0; items[i] !== target; ++i) {} items.splice(i, 1); updateIndexes(items, i) } function Renderer(options) { var that = this; that.root = that._createElement("svg", { xmlns: "http://www.w3.org/2000/svg", "xmlns:xlink": "http://www.w3.org/1999/xlink", version: "1.1", fill: NONE, stroke: NONE, "stroke-width": 0 }).attr({ "class": options.cssClass }).css({ "line-height": "normal", "-ms-user-select": NONE, "-moz-user-select": NONE, "-webkit-user-select": NONE, "-webkit-tap-highlight-color": "rgba(0, 0, 0, 0)", display: "block", overflow: "hidden" }); that._init(); that.pathModified = !!options.pathModified; that._$container = $(options.container); that.root.append({ element: options.container }); that._locker = 0; that._backed = false } exports.Renderer = Renderer; Renderer.prototype = { constructor: Renderer, _init: function() { var that = this; that._defs = that._createElement("defs").append(that.root); that._animationController = new animation.AnimationController(that.root.element); that._animation = { enabled: true, duration: 1e3, easing: "easeOutCubic" } }, setOptions: function(options) { var that = this; that.rtl = !!options.rtl; that.encodeHtml = !!options.encodeHtml; that.updateAnimationOptions(options.animation || {}); that.root.attr({ direction: that.rtl ? "rtl" : "ltr" }); return that }, _createElement: function(tagName, attr, type) { var elem = new exports.SvgElement(this, tagName, type); attr && elem.attr(attr); return elem }, lock: function() { var that = this; if (0 === that._locker) { that._backed = !that._$container.is(":visible"); if (that._backed) { backupRoot(that.root) } }++that._locker; return that }, unlock: function() { var that = this; --that._locker; if (0 === that._locker) { if (that._backed) { restoreRoot(that.root, that._$container[0]) } that._backed = false } return that }, resize: function(width, height) { if (width >= 0 && height >= 0) { this.root.attr({ width: width, height: height }) } return this }, dispose: function() { var key, that = this; that.root.dispose(); that._defs.dispose(); that._animationController.dispose(); for (key in that) { that[key] = null } return that }, animationEnabled: function() { return !!this._animation.enabled }, updateAnimationOptions: function(newOptions) { extend(this._animation, newOptions); return this }, stopAllAnimations: function(lock) { this._animationController[lock ? "lock" : "stop"](); return this }, animateElement: function(element, params, options) { this._animationController.animateElement(element, params, options); return this }, svg: function() { return this.root.markup() }, getRootOffset: function() { return this.root.getOffset() }, onEndAnimation: function(endAnimation) { this._animationController.onEndAnimation(endAnimation) }, rect: function(x, y, width, height) { var elem = new exports.RectSvgElement(this); return elem.attr({ x: x || 0, y: y || 0, width: width || 0, height: height || 0 }) }, simpleRect: function() { return this._createElement("rect") }, circle: function(x, y, r) { return this._createElement("circle", { cx: x || 0, cy: y || 0, r: r || 0 }) }, g: function() { return this._createElement("g") }, image: function(x, y, w, h, href, location) { var image = this._createElement("image", { x: x || 0, y: y || 0, width: w || 0, height: h || 0, preserveAspectRatio: preserveAspectRatioMap[_normalizeEnum(location)] || NONE }); image.element.setAttributeNS("http://www.w3.org/1999/xlink", "href", href || ""); return image }, path: function(points, type) { var elem = new exports.PathSvgElement(this, type); return elem.attr({ points: points || [] }) }, arc: function(x, y, innerRadius, outerRadius, startAngle, endAngle) { var elem = new exports.ArcSvgElement(this); return elem.attr({ x: x || 0, y: y || 0, innerRadius: innerRadius || 0, outerRadius: outerRadius || 0, startAngle: startAngle || 0, endAngle: endAngle || 0 }) }, text: function(text, x, y) { var elem = new exports.TextSvgElement(this); return elem.attr({ text: text, x: x || 0, y: y || 0 }) }, pattern: function(color, hatching, _id) { hatching = hatching || {}; var id, d, pattern, rect, path, that = this, step = hatching.step || 6, stepTo2 = step / 2, stepBy15 = 1.5 * step, direction = _normalizeEnum(hatching.direction); if ("right" !== direction && "left" !== direction) { return { id: color, append: function() { return this }, clear: function() {}, dispose: function() {}, remove: function() {} } } id = _id || getNextDefsSvgId(); d = "right" === direction ? "M " + stepTo2 + " " + -stepTo2 + " L " + -stepTo2 + " " + stepTo2 + " M 0 " + step + " L " + step + " 0 M " + stepBy15 + " " + stepTo2 + " L " + stepTo2 + " " + stepBy15 : "M 0 0 L " + step + " " + step + " M " + -stepTo2 + " " + stepTo2 + " L " + stepTo2 + " " + stepBy15 + " M " + stepTo2 + " " + -stepTo2 + " L " + stepBy15 + " " + stepTo2; pattern = that._createElement("pattern", { id: id, width: step, height: step, patternUnits: "userSpaceOnUse" }).append(that._defs); pattern.id = id; rect = that.rect(0, 0, step, step).attr({ fill: color, opacity: hatching.opacity }).append(pattern); path = new exports.PathSvgElement(this).attr({ d: d, "stroke-width": hatching.width || 1, stroke: color }).append(pattern); pattern.rect = rect; pattern.path = path; return pattern }, clipRect: function(x, y, width, height) { var that = this, id = getNextDefsSvgId(), clipPath = that._createElement("clipPath", { id: id }).append(that._defs), rect = that.rect(x, y, width, height).append(clipPath); rect.id = id; rect.clipPath = clipPath; rect.remove = function() { throw "Not implemented" }; rect.dispose = function() { clipPath.dispose(); clipPath = null; return this }; return rect }, shadowFilter: function(x, y, width, height, offsetX, offsetY, blur, color, opacity) { var that = this, id = getNextDefsSvgId(), filter = that._createElement("filter", { id: id, x: x || 0, y: y || 0, width: width || 0, height: height || 0 }).append(that._defs), gaussianBlur = that._createElement("feGaussianBlur", { "in": "SourceGraphic", result: "gaussianBlurResult", stdDeviation: blur || 0 }).append(filter), offset = that._createElement("feOffset", { "in": "gaussianBlurResult", result: "offsetResult", dx: offsetX || 0, dy: offsetY || 0 }).append(filter), flood = that._createElement("feFlood", { result: "floodResult", "flood-color": color || "", "flood-opacity": opacity }).append(filter), composite = that._createElement("feComposite", { "in": "floodResult", in2: "offsetResult", operator: "in", result: "compositeResult" }).append(filter), finalComposite = that._createElement("feComposite", { "in": "SourceGraphic", in2: "compositeResult", operator: "over" }).append(filter); filter.id = id; filter.gaussianBlur = gaussianBlur; filter.offset = offset; filter.flood = flood; filter.composite = composite; filter.finalComposite = finalComposite; filter.attr = function(attrs) { var that = this, filterAttrs = {}, offsetAttrs = {}, floodAttrs = {}; "x" in attrs && (filterAttrs.x = attrs.x); "y" in attrs && (filterAttrs.y = attrs.y); "width" in attrs && (filterAttrs.width = attrs.width); "height" in attrs && (filterAttrs.height = attrs.height); baseAttr(that, filterAttrs); "blur" in attrs && that.gaussianBlur.attr({ stdDeviation: attrs.blur }); "offsetX" in attrs && (offsetAttrs.dx = attrs.offsetX); "offsetY" in attrs && (offsetAttrs.dy = attrs.offsetY); that.offset.attr(offsetAttrs); "color" in attrs && (floodAttrs["flood-color"] = attrs.color); "opacity" in attrs && (floodAttrs["flood-opacity"] = attrs.opacity); that.flood.attr(floodAttrs); return that }; return filter }, brightFilter: function(type, slope) { var that = this, id = getNextDefsSvgId(), filter = that._createElement("filter", { id: id }).append(that._defs), componentTransferElement = that._createElement("feComponentTransfer").append(filter), attrs = { type: type, slope: slope }; filter.id = id; that._createElement("feFuncR", attrs).append(componentTransferElement); that._createElement("feFuncG", attrs).append(componentTransferElement); that._createElement("feFuncB", attrs).append(componentTransferElement); return filter }, getGrayScaleFilter: function() { if (this._grayScaleFilter) { return this._grayScaleFilter } var that = this, id = getNextDefsSvgId(), filter = that._createElement("filter", { id: id }).append(that._defs); that._createElement("feColorMatrix").attr({ type: "matrix", values: "0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 0.6 0" }).append(filter); filter.id = id; that._grayScaleFilter = filter; return filter }, initHatching: function() { var name, storage = this._hatchingStorage = this._hatchingStorage || { byHash: {}, baseId: getNextDefsSvgId() }, byHash = storage.byHash; for (name in byHash) { byHash[name].pattern.dispose() } storage.byHash = {}; storage.refToHash = {}; storage.nextId = 0 }, lockHatching: function(color, hatching, ref) { var storageItem, pattern, storage = this._hatchingStorage, hash = getHatchingHash(color, hatching); if (storage.refToHash[ref] !== hash) { if (ref) { this.releaseHatching(ref) } storageItem = storage.byHash[hash]; if (!storageItem) { pattern = this.pattern(color, hatching, storage.baseId + "-hatching-" + storage.nextId++); storageItem = storage.byHash[hash] = { pattern: pattern, count: 0 }; storage.refToHash[pattern.id] = hash }++storageItem.count; ref = storageItem.pattern.id } return ref }, releaseHatching: function(ref) { var storage = this._hatchingStorage, hash = storage.refToHash[ref], storageItem = storage.byHash[hash]; if (0 === --storageItem.count) { storageItem.pattern.dispose(); delete storage.byHash[hash]; delete storage.refToHash[ref] } } }; function getHatchingHash(color, hatching) { return "@" + color + "::" + hatching.step + ":" + hatching.width + ":" + hatching.opacity + ":" + hatching.direction } var fixFuncIriCallbacks = function() { var callbacks = []; return { add: function(fn) { callbacks.push(fn) }, remove: function(fn) { callbacks = callbacks.filter(function(el) { return el !== fn }) }, fire: function() { callbacks.forEach(function(fn) { fn() }) } } }(); exports.refreshPaths = function() { fixFuncIriCallbacks.fire() } }, /*!********************************************!*\ !*** ./js/viz/core/renderers/animation.js ***! \********************************************/ function(module, exports, __webpack_require__) { var animationFrame = __webpack_require__( /*! ../../../animation/frame */ 59), noop = function() {}, easingFunctions = { easeOutCubic: function(pos, start, end) { return 1 === pos ? end : (1 - Math.pow(1 - pos, 3)) * (end - start) + +start }, linear: function(pos, start, end) { return 1 === pos ? end : pos * (end - start) + +start } }; exports.easingFunctions = easingFunctions; var animationSvgStep = { segments: function(elem, params, progress, easing, currentParams) { var curSeg, seg, i, j, from = params.from, to = params.to, segments = []; for (i = 0; i < from.length; i++) { curSeg = from[i]; seg = [curSeg[0]]; if (curSeg.length > 1) { for (j = 1; j < curSeg.length; j++) { seg.push(easing(progress, curSeg[j], to[i][j])) } } segments.push(seg) } currentParams.segments = params.end && 1 === progress ? params.end : segments; elem.attr({ segments: segments }) }, arc: function(elem, params, progress, easing) { var from = params.from, to = params.to, current = {}; for (var i in from) { current[i] = easing(progress, from[i], to[i]) } elem.attr(current) }, transform: function(elem, params, progress, easing, currentParams) { var from = params.from, to = params.to, current = {}; for (var i in from) { current[i] = currentParams[i] = easing(progress, from[i], to[i]) } elem.attr(current) }, base: function(elem, params, progress, easing, currentParams, attributeName) { var obj = {}; obj[attributeName] = currentParams[attributeName] = easing(progress, params.from, params.to); elem.attr(obj) }, _: noop, complete: function(element, currentSettings) { element.attr(currentSettings) } }; function step(now) { var attrName, that = this, animateStep = that._animateStep; that._progress = that._calcProgress(now); for (attrName in that.params) { var anim = animateStep[attrName] || animateStep.base; anim(that.element, that.params[attrName], that._progress, that._easing, that._currentParams, attrName) } that.options.step && that.options.step(that._easing(that._progress, 0, 1), that._progress); if (1 === that._progress) { return that.stop() } return true } function delayTick(now) { if (now - this._startTime >= this.delay) { this.tick = step } return true } function start(now) { this._startTime = now; this.tick = this.delay ? delayTick : step; return true } function Animation(element, params, options) { var that = this; that._progress = 0; that.element = element; that.params = params; that.options = options; that.duration = options.partitionDuration ? options.duration * options.partitionDuration : options.duration; that.delay = options.delay && options.duration * options.delay || 0; that._animateStep = options.animateStep || animationSvgStep; that._easing = easingFunctions[options.easing] || easingFunctions.easeOutCubic; that._currentParams = {}; that.tick = start } Animation.prototype = { _calcProgress: function(now) { return Math.min(1, (now - this.delay - this._startTime) / this.duration) }, stop: function(disableComplete) { var that = this, options = that.options, animateStep = that._animateStep; that.stop = that.tick = noop; animateStep.complete && animateStep.complete(that.element, that._currentParams); options.complete && !disableComplete && options.complete() } }; function AnimationController(element) { var that = this; that._animationCount = 0; that._timerId = null; that._animations = {}; that.element = element } exports.AnimationController = AnimationController; AnimationController.prototype = { _loop: function() { var an, that = this, animations = that._animations, activeAnimation = 0, now = (new Date).getTime(), endAnimation = that._endAnimation; for (an in animations) { if (!animations[an].tick(now)) { delete animations[an] } activeAnimation++ } if (0 === activeAnimation) { that.stop(); that._endAnimationTimer = endAnimation && setTimeout(function() { if (0 === that._animationCount) { endAnimation(); that._endAnimation = null } }); return } that._timerId = animationFrame.requestAnimationFrame.call(null, function() { that._loop() }, that.element) }, addAnimation: function(animation) { var that = this; that._animations[that._animationCount++] = animation; clearTimeout(that._endAnimationTimer); if (!that._timerId) { clearTimeout(that._startDelay); that._startDelay = setTimeout(function() { that._timerId = 1; that._loop() }, 0) } }, animateElement: function(elem, params, options) { if (elem && params && options) { elem.animation && elem.animation.stop(); this.addAnimation(elem.animation = new Animation(elem, params, options)) } }, onEndAnimation: function(endAnimation) { this._animationCount ? this._endAnimation = endAnimation : endAnimation() }, dispose: function() { this.stop(); this.element = null }, stop: function() { var that = this; that._animations = {}; that._animationCount = 0; animationFrame.cancelAnimationFrame(that._timerId); clearTimeout(that._startDelay); clearTimeout(that._endAnimationTimer); that._timerId = null }, lock: function() { var an, unstoppable, hasUnstoppableInAnimations, animations = this._animations; for (an in animations) { unstoppable = animations[an].options.unstoppable; hasUnstoppableInAnimations = hasUnstoppableInAnimations || unstoppable; if (!unstoppable) { animations[an].stop(true); delete animations[an] } }!hasUnstoppableInAnimations && this.stop() } }; exports.animationSvgStep = animationSvgStep; exports.Animation = Animation; exports.noop = noop }, /*!*******************************!*\ !*** ./js/viz/core/layout.js ***! \*******************************/ function(module, exports, __webpack_require__) { var _normalizeEnum = __webpack_require__( /*! ./utils */ 509).normalizeEnum, _min = Math.min, _max = Math.max, ALIGN_START = 0, ALIGN_MIDDLE = 1, ALIGN_END = 2, horizontalAlignmentMap = { left: ALIGN_START, center: ALIGN_MIDDLE, right: ALIGN_END }, verticalAlignmentMap = { top: ALIGN_START, center: ALIGN_MIDDLE, bottom: ALIGN_END }, sideMap = { horizontal: 0, vertical: 1 }, slicersMap = {}; slicersMap[ALIGN_START] = function(a, b, size) { return [a, _min(b, a + size)] }; slicersMap[ALIGN_MIDDLE] = function(a, b, size) { return [_max(a, (a + b - size) / 2), _min(b, (a + b + size) / 2)] }; slicersMap[ALIGN_END] = function(a, b, size) { return [_max(a, b - size), b] }; function pickValue(value, map, defaultValue) { var val = _normalizeEnum(value); return val in map ? map[val] : defaultValue } function normalizeLayoutOptions(options) { var side = pickValue(options.side, sideMap, 1), alignment = [pickValue(options.horizontalAlignment, horizontalAlignmentMap, ALIGN_MIDDLE), pickValue(options.verticalAlignment, verticalAlignmentMap, ALIGN_START)]; return { side: side, primary: bringToEdge(alignment[side]), secondary: alignment[1 - side], weak: options.weak } } function bringToEdge(primary) { return primary < 2 ? 0 : 2 } function getConjugateSide(side) { return 1 - side } function getOppositeAlignment(alignment) { return 2 - alignment } function getSlice(alignment, a, b, size) { return slicersMap[alignment](a, b, size) } function getShrink(alignment, size) { return (alignment > 0 ? -1 : 1) * size } function processForward(item, rect) { var side = item.side, size = item.element.measure([rect[2] - rect[0], rect[3] - rect[1]]), isValid = size[side] < rect[2 + side] - rect[side]; if (isValid) { rect[item.primary + side] += getShrink(item.primary, size[side]); item.size = size } return isValid } function processBackward(item, rect) { var primarySide = item.side, secondarySide = getConjugateSide(primarySide), itemRect = [], secondary = getSlice(item.secondary, rect[secondarySide], rect[2 + secondarySide], item.size[secondarySide]); itemRect[primarySide] = itemRect[2 + primarySide] = rect[item.primary + primarySide]; itemRect[item.primary + primarySide] = rect[item.primary + primarySide] -= getShrink(item.primary, item.size[primarySide]); itemRect[secondarySide] = secondary[0]; itemRect[2 + secondarySide] = secondary[1]; item.element.move(itemRect) } function Layout() { this._targets = [] } Layout.prototype = { constructor: Layout, dispose: function() { this._targets = null }, add: function(target) { this._targets.push(target) }, forward: function(targetRect) { var i, rect = targetRect.slice(), targets = createTargets(this._targets), ii = targets.length, cache = []; for (i = 0; i < ii; ++i) { if (processForward(targets[i], rect)) { cache.push(targets[i]) } } this._cache = cache.reverse(); return rect }, backward: function(targetRect) { var i, rect = targetRect.slice(), targets = this._cache, ii = targets.length; for (i = 0; i < ii; ++i) { processBackward(targets[i], rect) } this._cache = null } }; function createTargets(targets) { var i, layout, ii = targets.length, collection = []; for (i = 0; i < ii; ++i) { layout = targets[i].layoutOptions(); if (layout) { layout = normalizeLayoutOptions(layout); layout.element = targets[i]; collection.push(layout) } } processWeakItems(collection); return collection } function processWeakItems(collection) { var i, ii, j, weakItem, isProcessed = true; while (isProcessed) { isProcessed = false; ii = collection.length; for (i = 0; i < ii; ++i) { if (collection[i].weak) { weakItem = collection[i]; for (j = 0; j < ii; ++j) { if (i !== j && weakItem.side === collection[j].side && weakItem.primary === collection[j].primary) { collection[_min(i, j)] = makePair(collection[_min(i, j)], collection[_max(i, j)]); collection.splice(_max(i, j), 1); isProcessed = true; break } } if (isProcessed) { break } } } } } function makePair(first, second) { return { side: first.side, primary: first.primary, secondary: first.secondary === second.secondary ? first.secondary : bringToEdge(first.secondary) || bringToEdge(second.secondary), element: new PairElement(first, second) } } function PairElement(first, second) { this._first = first; this._second = second } PairElement.prototype.measure = function(targetSize) { var secondSize, first = this._first, second = this._second, size = targetSize.slice(), primarySide = first.side, secondarySide = getConjugateSide(primarySide), firstSize = first.element.measure(size.slice()); size[secondarySide] -= firstSize[secondarySide]; secondSize = second.element.measure(size.slice()); size[primarySide] = _max(firstSize[primarySide], secondSize[primarySide]); if (first.secondary === second.secondary) { size[secondarySide] = firstSize[secondarySide] + secondSize[secondarySide] } else { if (first.secondary === ALIGN_MIDDLE || second.secondary === ALIGN_MIDDLE) { size[secondarySide] = targetSize[secondarySide] / 2 + (first.secondary === ALIGN_MIDDLE ? firstSize : secondSize)[secondarySide] / 2 } else { size[secondarySide] = targetSize[secondarySide] } } first.size = firstSize; second.size = secondSize; return size }; PairElement.prototype.move = function(targetRect) { var primary, secondary, rect, first = this._first, second = this._second, primarySide = first.side, secondarySide = getConjugateSide(primarySide), alignment = first.secondary === second.secondary ? bringToEdge(first.secondary) : first.secondary === ALIGN_MIDDLE ? getOppositeAlignment(bringToEdge(second.secondary)) : bringToEdge(first.secondary); primary = getSlice(ALIGN_MIDDLE, targetRect[primarySide], targetRect[2 + primarySide], first.size[primarySide]); secondary = getSlice(alignment, targetRect[secondarySide], targetRect[2 + secondarySide], first.size[secondarySide]); rect = []; rect[primarySide] = primary[0]; rect[2 + primarySide] = primary[1]; rect[secondarySide] = secondary[0]; rect[2 + secondarySide] = secondary[1]; first.element.move(rect); primary = getSlice(ALIGN_MIDDLE, targetRect[primarySide], targetRect[2 + primarySide], second.size[primarySide]); secondary = getSlice(getOppositeAlignment(alignment), targetRect[secondarySide], targetRect[2 + secondarySide], targetRect[2 + secondarySide] - targetRect[secondarySide] - first.size[secondarySide]); secondary = getSlice(getOppositeAlignment(alignment), secondary[0], secondary[1], second.size[secondarySide]); rect = []; rect[primarySide] = primary[0]; rect[2 + primarySide] = primary[1]; rect[secondarySide] = secondary[0]; rect[2 + secondarySide] = secondary[1]; second.element.move(rect) }; module.exports = Layout }, /*!*************************************!*\ !*** ./js/viz/components/legend.js ***! \*************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), vizUtils = __webpack_require__( /*! ../core/utils */ 509), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, layoutElementModule = __webpack_require__( /*! ../core/layout_element */ 522), _Number = Number, _math = Math, _round = _math.round, _max = _math.max, _min = _math.min, _ceil = _math.ceil, objectUtils = __webpack_require__( /*! ../../core/utils/object */ 27), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), _isDefined = commonUtils.isDefined, _isFunction = commonUtils.isFunction, _enumParser = vizUtils.enumParser, _normalizeEnum = vizUtils.normalizeEnum, _extend = extend, _each = $.each, DEFAULT_MARGIN = 10, DEFAULT_MARKER_HATCHING_WIDTH = 2, DEFAULT_MARKER_HATCHING_STEP = 5, CENTER = "center", RIGHT = "right", LEFT = "left", TOP = "top", BOTTOM = "bottom", HORIZONTAL = "horizontal", VERTICAL = "vertical", INSIDE = "inside", OUTSIDE = "outside", NONE = "none", HEIGHT = "height", WIDTH = "width", parseHorizontalAlignment = _enumParser([LEFT, CENTER, RIGHT]), parseVerticalAlignment = _enumParser([TOP, BOTTOM]), parseOrientation = _enumParser([VERTICAL, HORIZONTAL]), parseItemTextPosition = _enumParser([LEFT, RIGHT, TOP, BOTTOM]), parsePosition = _enumParser([OUTSIDE, INSIDE]), parseItemsAlignment = _enumParser([LEFT, CENTER, RIGHT]); function getState(state, color) { if (!state) { return } var hatching, direction = state.hatching.direction, colorFromAction = state.fill; color = colorFromAction === NONE ? color : colorFromAction; direction = !direction || direction === NONE ? RIGHT : direction; hatching = _extend({}, state.hatching, { direction: direction, step: DEFAULT_MARKER_HATCHING_STEP, width: DEFAULT_MARKER_HATCHING_WIDTH }); return { fill: color, hatching: hatching } } function parseMargins(options) { var margin = options.margin; if (margin >= 0) { margin = _Number(options.margin); margin = { top: margin, bottom: margin, left: margin, right: margin } } else { margin = { top: margin.top >= 0 ? _Number(margin.top) : DEFAULT_MARGIN, bottom: margin.bottom >= 0 ? _Number(margin.bottom) : DEFAULT_MARGIN, left: margin.left >= 0 ? _Number(margin.left) : DEFAULT_MARGIN, right: margin.right >= 0 ? _Number(margin.right) : DEFAULT_MARGIN } } options.margin = margin } function getSizeItem(options, markerSize, labelBBox) { var width, height, defaultXMargin = 7, defaultTopMargin = 4; switch (options.itemTextPosition) { case LEFT: case RIGHT: width = markerSize + defaultXMargin + labelBBox.width; height = _max(markerSize, labelBBox.height); break; case TOP: case BOTTOM: width = _max(markerSize, labelBBox.width); height = markerSize + defaultTopMargin + labelBBox.height } return { width: width, height: height } } function calculateBBoxLabelAndMarker(markerBBox, labelBBox) { var bBox = {}; bBox.left = _min(markerBBox.x, labelBBox.x); bBox.top = _min(markerBBox.y, labelBBox.y); bBox.right = _max(markerBBox.x + markerBBox.width, labelBBox.x + labelBBox.width); bBox.bottom = _max(markerBBox.y + markerBBox.height, labelBBox.y + labelBBox.height); return bBox } function applyMarkerState(id, idToIndexMap, items, stateName) { var item = idToIndexMap && items[idToIndexMap[id]]; if (item) { item.marker.smartAttr(item.states[stateName]) } } function parseOptions(options, textField) { if (!options) { return null } var debug = __webpack_require__( /*! ../../core/utils/console */ 13).debug; debug.assertParam(options.visible, "Visibility was not passed"); debug.assertParam(options.markerSize, "markerSize was not passed"); debug.assertParam(options.font.color, "fontColor was not passed"); debug.assertParam(options.font.family, "fontFamily was not passed"); debug.assertParam(options.font.size, "fontSize was not passed"); debug.assertParam(options.paddingLeftRight, "paddingLeftRight was not passed"); debug.assertParam(options.paddingTopBottom, "paddingTopBottom was not passed"); debug.assertParam(options.columnItemSpacing, "columnItemSpacing was not passed"); debug.assertParam(options.rowItemSpacing, "rowItemSpacing was not passed"); parseMargins(options); options.horizontalAlignment = parseHorizontalAlignment(options.horizontalAlignment, RIGHT); options.verticalAlignment = parseVerticalAlignment(options.verticalAlignment, options.horizontalAlignment === CENTER ? BOTTOM : TOP); options.orientation = parseOrientation(options.orientation, options.horizontalAlignment === CENTER ? HORIZONTAL : VERTICAL); options.itemTextPosition = parseItemTextPosition(options.itemTextPosition, options.orientation === HORIZONTAL ? BOTTOM : RIGHT); options.position = parsePosition(options.position, OUTSIDE); options.itemsAlignment = parseItemsAlignment(options.itemsAlignment, null); options.hoverMode = _normalizeEnum(options.hoverMode); options.customizeText = _isFunction(options.customizeText) ? options.customizeText : function() { return this[textField] }; options.customizeHint = _isFunction(options.customizeHint) ? options.customizeHint : commonUtils.noop; options._incidentOccurred = options._incidentOccurred || commonUtils.noop; return options } function createSquareMarker(renderer, size) { return renderer.rect(0, 0, size, size) } function createCircleMarker(renderer, size) { return renderer.circle(size / 2, size / 2, size / 2) } function isCircle(type) { return "circle" === _normalizeEnum(type) } function inRect(rect, x, y) { return x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom } function checkLinesSize(lines, layoutOptions, countItems) { var position = { x: 0, y: 0 }, maxMeasureLength = 0, maxAltMeasureLength = 0; _each(lines, function(i, line) { var firstItem = line[0]; _each(line, function(_, item) { var offset = item.offset || layoutOptions.spacing; position[layoutOptions.direction] += item[layoutOptions.measure] + offset; maxMeasureLength = _max(maxMeasureLength, position[layoutOptions.direction]) }); position[layoutOptions.direction] = 0; position[layoutOptions.altDirection] += firstItem[layoutOptions.altMeasure] + firstItem.altOffset || layoutOptions.altSpacing; maxAltMeasureLength = _max(maxAltMeasureLength, position[layoutOptions.altDirection]) }); if (maxMeasureLength > layoutOptions.length) { layoutOptions.countItem = decreaseItemCount(layoutOptions, countItems); return true } } function decreaseItemCount(layoutOptions, countItems) { layoutOptions.altCountItem++; return _ceil(countItems / layoutOptions.altCountItem) } function getLineLength(line, layoutOptions) { var lineLength = 0; _each(line, function(_, item) { var offset = item.offset || layoutOptions.spacing; lineLength += item[layoutOptions.measure] + offset }); return lineLength } function getMaxLineLength(lines, layoutOptions) { var maxLineLength = 0; _each(lines, function(_, line) { maxLineLength = _max(maxLineLength, getLineLength(line, layoutOptions)) }); return maxLineLength } function getInitPositionForDirection(line, layoutOptions, maxLineLength) { var initPosition, lineLength = getLineLength(line, layoutOptions); switch (layoutOptions.itemsAlignment) { case RIGHT: initPosition = maxLineLength - lineLength; break; case CENTER: initPosition = (maxLineLength - lineLength) / 2; break; default: initPosition = 0 } return initPosition } function getPos(layoutOptions) { switch (layoutOptions.itemTextPosition) { case BOTTOM: return { horizontal: CENTER, vertical: TOP }; case TOP: return { horizontal: CENTER, vertical: BOTTOM }; case LEFT: return { horizontal: RIGHT, vertical: CENTER }; case RIGHT: return { horizontal: LEFT, vertical: CENTER } } } function getLines(lines, layoutOptions, itemIndex) { var tableLine = {}; if (itemIndex % layoutOptions.countItem === 0) { if (layoutOptions.markerOffset) { lines.push([], []) } else { lines.push([]) } } if (layoutOptions.markerOffset) { tableLine.firstLine = lines[lines.length - 1]; tableLine.secondLine = lines[lines.length - 2] } else { tableLine.firstLine = tableLine.secondLine = lines[lines.length - 1] } return tableLine } function setMaxInLine(line, measure) { var maxLineSize = 0; _each(line, function(_, item) { if (!item) { return } maxLineSize = _max(maxLineSize, item[measure]) }); _each(line, function(_, item) { if (!item) { return } item[measure] = maxLineSize }) } function transpose(array) { var i, j, width = array.length, height = array[0].length, transposeArray = []; for (i = 0; i < height; i++) { transposeArray[i] = []; for (j = 0; j < width; j++) { transposeArray[i][j] = array[j][i] } } return transposeArray } function getAlign(position) { switch (position) { case TOP: case BOTTOM: return CENTER; case LEFT: return RIGHT; case RIGHT: return LEFT } } var getMarkerCreator = function(type) { return isCircle(type) ? createCircleMarker : createSquareMarker }; var _Legend = exports.Legend = function(settings) { var that = this; that._renderer = settings.renderer; that._legendGroup = settings.group; that._backgroundClass = settings.backgroundClass; that._itemGroupClass = settings.itemGroupClass; that._textField = settings.textField; that._getCustomizeObject = settings.getFormatObject }; var legendPrototype = _Legend.prototype = objectUtils.clone(layoutElementModule.LayoutElement.prototype); extend(legendPrototype, { constructor: _Legend, getOptions: function() { return this._options }, update: function(data, options) { var that = this; that._data = data; that._boundingRect = { width: 0, height: 0, x: 0, y: 0 }; that._options = parseOptions(options, that._textField); return that }, draw: function(width, height) { var that = this, options = that._options, renderer = that._renderer, items = that._data; this._size = { width: width, height: height }; that.erase(); if (!(options && options.visible && items && items.length)) { return that } that._insideLegendGroup = renderer.g().append(that._legendGroup); that._createBackground(); that._createItems(that._getItemData()); that._locateElements(options); that._finalUpdate(options); if (that.getLayoutOptions().width > width || that.getLayoutOptions().height > height) { that._options._incidentOccurred("W2104"); that.erase() } return that }, probeDraw: function(width, height) { return this.draw(width, height) }, _createItems: function(items) { var bBox, that = this, options = that._options, initMarkerSize = options.markerSize, renderer = that._renderer, maxBBoxHeight = 0, createMarker = getMarkerCreator(options.markerShape || options.markerType); that._markersId = {}; that._items = vizUtils.map(items, function(dataItem, i) { var group = that._insideLegendGroup, markerSize = _Number(dataItem.size > 0 ? dataItem.size : initMarkerSize), stateOfDataItem = dataItem.states, normalState = stateOfDataItem.normal, normalStateFill = normalState.fill, marker = createMarker(renderer, markerSize).attr({ fill: normalStateFill || options.markerColor, opacity: normalState.opacity }).append(group), label = that._createLabel(dataItem, group), states = { normal: { fill: normalStateFill }, hovered: getState(stateOfDataItem.hover, normalStateFill), selected: getState(stateOfDataItem.selection, normalStateFill) }, labelBBox = label.getBBox(); if (void 0 !== dataItem.id) { that._markersId[dataItem.id] = i } bBox = getSizeItem(options, markerSize, labelBBox); maxBBoxHeight = _max(maxBBoxHeight, bBox.height); that._createHint(dataItem, label); return { label: label, labelBBox: labelBBox, group: group, bBox: bBox, marker: marker, markerSize: markerSize, tracker: { id: dataItem.id, argument: dataItem.argument, argumentIndex: dataItem.argumentIndex }, states: states, itemTextPosition: options.itemTextPosition, markerOffset: 0, bBoxes: [] } }); if (options.equalRowHeight) { _each(that._items, function(_, item) { item.bBox.height = maxBBoxHeight }) } }, _getItemData: function() { var items = this._data; if (this._options.inverted) { items = items.slice().reverse() } return items }, _finalUpdate: function(options) { this._adjustBackgroundSettings(options); this._setBoundingRect(options.margin) }, erase: function() { var that = this, insideLegendGroup = that._insideLegendGroup; insideLegendGroup && insideLegendGroup.dispose(); that._insideLegendGroup = that._x1 = that._x2 = that._y2 = that._y2 = null; return that }, _locateElements: function(locationOptions) { this._moveInInitialValues(); this._locateRowsColumns(locationOptions) }, _moveInInitialValues: function() { var that = this; that._legendGroup && that._legendGroup.move(0, 0); that._background && that._background.attr({ x: 0, y: 0, width: 0, height: 0 }) }, applySelected: function(id) { applyMarkerState(id, this._markersId, this._items, "selected"); return this }, applyHover: function(id) { applyMarkerState(id, this._markersId, this._items, "hovered"); return this }, resetItem: function(id) { applyMarkerState(id, this._markersId, this._items, "normal"); return this }, _createLabel: function(data, group) { var labelFormatObject = this._getCustomizeObject(data), align = getAlign(this._options.itemTextPosition), text = this._options.customizeText.call(labelFormatObject, labelFormatObject), fontStyle = _isDefined(data.textOpacity) ? _extend({}, this._options.font, { opacity: data.textOpacity }) : this._options.font; return this._renderer.text(text, 0, 0).css(vizUtils.patchFontOptions(fontStyle)).attr({ align: align }).append(group) }, _createHint: function(data, label) { var labelFormatObject = this._getCustomizeObject(data), text = this._options.customizeHint.call(labelFormatObject, labelFormatObject); if (_isDefined(text) && "" !== text) { label.setTitle(text) } }, _createBackground: function() { var that = this, isInside = that._options.position === INSIDE, color = that._options.backgroundColor, fill = color || (isInside ? that._options.containerBackgroundColor : NONE); if (that._options.border.visible || (isInside || color) && color !== NONE) { that._background = that._renderer.rect(0, 0, 0, 0).attr({ fill: fill, "class": that._backgroundClass }).append(that._insideLegendGroup) } }, _locateRowsColumns: function() { var lines, that = this, iteration = 0, layoutOptions = that._getItemsLayoutOptions(), countItems = that._items.length; do { lines = []; that._createLines(lines, layoutOptions); that._alignLines(lines, layoutOptions); iteration++ } while (checkLinesSize(lines, layoutOptions, countItems) && iteration < countItems); that._applyItemPosition(lines, layoutOptions) }, _createLines: function(lines, layoutOptions) { _each(this._items, function(i, item) { var firstItem, secondItem, tableLine = getLines(lines, layoutOptions, i), labelBox = { width: item.labelBBox.width, height: item.labelBBox.height, element: item.label, bBox: item.labelBBox, pos: getPos(layoutOptions), itemIndex: i }, markerBox = { width: item.markerSize, height: item.markerSize, element: item.marker, pos: { horizontal: CENTER, vertical: CENTER }, bBox: { width: item.markerSize, height: item.markerSize, x: 0, y: 0 }, itemIndex: i }, offsetDirection = layoutOptions.markerOffset ? "altOffset" : "offset"; if (layoutOptions.inverseLabelPosition) { firstItem = labelBox; secondItem = markerBox } else { firstItem = markerBox; secondItem = labelBox } firstItem[offsetDirection] = layoutOptions.labelOffset; tableLine.secondLine.push(firstItem); tableLine.firstLine.push(secondItem) }) }, _alignLines: function(lines, layoutOptions) { var i, measure = layoutOptions.altMeasure; _each(lines, processLine); measure = layoutOptions.measure; if (layoutOptions.itemsAlignment) { if (layoutOptions.markerOffset) { for (i = 0; i < lines.length;) { _each(transpose([lines[i++], lines[i++]]), processLine) } } } else { _each(transpose(lines), processLine) } function processLine(_, line) { setMaxInLine(line, measure) } }, _applyItemPosition: function(lines, layoutOptions) { var that = this, position = { x: 0, y: 0 }, maxLineLength = getMaxLineLength(lines, layoutOptions); _each(lines, function(i, line) { var firstItem = line[0], altOffset = firstItem.altOffset || layoutOptions.altSpacing; position[layoutOptions.direction] = getInitPositionForDirection(line, layoutOptions, maxLineLength); _each(line, function(_, item) { var offset = item.offset || layoutOptions.spacing, wrap = new layoutElementModule.WrapperLayoutElement(item.element, item.bBox), itemBBox = new layoutElementModule.WrapperLayoutElement(null, { x: position.x, y: position.y, width: item.width, height: item.height }), itemLegend = that._items[item.itemIndex]; wrap.position({ of: itemBBox, my: item.pos, at: item.pos }); itemLegend.bBoxes.push(itemBBox); position[layoutOptions.direction] += item[layoutOptions.measure] + offset }); position[layoutOptions.altDirection] += firstItem[layoutOptions.altMeasure] + altOffset }); _each(this._items, function(_, item) { var itemBBox = calculateBBoxLabelAndMarker(item.bBoxes[0].getLayoutOptions(), item.bBoxes[1].getLayoutOptions()), horizontal = that._options.columnItemSpacing / 2, vertical = that._options.rowItemSpacing / 2; item.tracker.left = itemBBox.left - horizontal; item.tracker.right = itemBBox.right + horizontal; item.tracker.top = itemBBox.top - vertical; item.tracker.bottom = itemBBox.bottom + vertical }) }, _getItemsLayoutOptions: function() { var that = this, options = that._options, orientation = options.orientation, layoutOptions = { itemsAlignment: options.itemsAlignment, orientation: options.orientation }, width = that._size.width - (that._background ? 2 * options.paddingLeftRight : 0), height = that._size.height - (that._background ? 2 * options.paddingTopBottom : 0); if (orientation === HORIZONTAL) { layoutOptions.length = width; layoutOptions.spacing = options.columnItemSpacing; layoutOptions.direction = "x"; layoutOptions.measure = WIDTH; layoutOptions.altMeasure = HEIGHT; layoutOptions.altDirection = "y"; layoutOptions.altSpacing = options.rowItemSpacing; layoutOptions.countItem = options.columnCount; layoutOptions.altCountItem = options.rowCount; layoutOptions.marginTextLabel = 4; layoutOptions.labelOffset = 7; if (options.itemTextPosition === BOTTOM || options.itemTextPosition === TOP) { layoutOptions.labelOffset = 4; layoutOptions.markerOffset = true } } else { layoutOptions.length = height; layoutOptions.spacing = options.rowItemSpacing; layoutOptions.direction = "y"; layoutOptions.measure = HEIGHT; layoutOptions.altMeasure = WIDTH; layoutOptions.altDirection = "x"; layoutOptions.altSpacing = options.columnItemSpacing; layoutOptions.countItem = options.rowCount; layoutOptions.altCountItem = options.columnCount; layoutOptions.marginTextLabel = 7; layoutOptions.labelOffset = 4; if (options.itemTextPosition === RIGHT || options.itemTextPosition === LEFT) { layoutOptions.labelOffset = 7; layoutOptions.markerOffset = true } } if (!layoutOptions.countItem) { if (layoutOptions.altCountItem) { layoutOptions.countItem = _ceil(that._items.length / layoutOptions.altCountItem) } else { layoutOptions.countItem = that._items.length } } if (options.itemTextPosition === TOP || options.itemTextPosition === LEFT) { layoutOptions.inverseLabelPosition = true } layoutOptions.itemTextPosition = options.itemTextPosition; layoutOptions.altCountItem = layoutOptions.altCountItem || _ceil(that._items.length / layoutOptions.countItem); return layoutOptions }, _adjustBackgroundSettings: function(locationOptions) { if (!this._background) { return } var border = locationOptions.border, legendBox = this._insideLegendGroup.getBBox(), backgroundSettings = { x: _round(legendBox.x - locationOptions.paddingLeftRight), y: _round(legendBox.y - locationOptions.paddingTopBottom), width: _round(legendBox.width) + 2 * locationOptions.paddingLeftRight, height: _round(legendBox.height) + 2 * locationOptions.paddingTopBottom, opacity: locationOptions.backgroundOpacity }; if (border.visible && border.width && border.color && border.color !== NONE) { backgroundSettings["stroke-width"] = border.width; backgroundSettings.stroke = border.color; backgroundSettings["stroke-opacity"] = border.opacity; backgroundSettings.dashStyle = border.dashStyle; backgroundSettings.rx = border.cornerRadius || 0; backgroundSettings.ry = border.cornerRadius || 0 } this._background.attr(backgroundSettings) }, _setBoundingRect: function(margin) { if (!this._insideLegendGroup) { return } var box = this._insideLegendGroup.getBBox(); box.height += margin.top + margin.bottom; box.width += margin.left + margin.right; box.x -= margin.left; box.y -= margin.top; this._boundingRect = box }, getActionCallback: function(point) { var that = this; if (that._options.visible) { return function(act) { that[act](point.index) } } else { return commonUtils.noop } }, getLayoutOptions: function() { var options = this._options, boundingRect = this._insideLegendGroup ? this._boundingRect : { width: 0, height: 0, x: 0, y: 0 }; if (options) { boundingRect.verticalAlignment = options.verticalAlignment; boundingRect.horizontalAlignment = options.horizontalAlignment; if (options.orientation === HORIZONTAL) { boundingRect.cutLayoutSide = options.verticalAlignment; boundingRect.cutSide = "vertical" } else { if (options.horizontalAlignment === CENTER) { boundingRect.cutLayoutSide = options.verticalAlignment; boundingRect.cutSide = "vertical" } else { boundingRect.cutLayoutSide = options.horizontalAlignment; boundingRect.cutSide = "horizontal" } } boundingRect.position = { horizontal: options.horizontalAlignment, vertical: options.verticalAlignment }; return boundingRect } return null }, shift: function(x, y) { var that = this, box = {}; if (that._insideLegendGroup) { that._insideLegendGroup.attr({ translateX: x - that._boundingRect.x, translateY: y - that._boundingRect.y }); box = that._legendGroup.getBBox() } that._x1 = box.x; that._y1 = box.y; that._x2 = box.x + box.width; that._y2 = box.y + box.height; return that }, getPosition: function() { return this._options.position }, coordsIn: function(x, y) { return x >= this._x1 && x <= this._x2 && y >= this._y1 && y <= this._y2 }, getItemByCoord: function(x, y) { var items = this._items, legendGroup = this._insideLegendGroup; x -= legendGroup.attr("translateX"); y -= legendGroup.attr("translateY"); for (var i = 0; i < items.length; i++) { if (inRect(items[i].tracker, x, y)) { return items[i].tracker } } return null }, dispose: function() { var that = this; that._legendGroup = that._insideLegendGroup = that._renderer = that._options = that._data = that._items = null; return that } }); var __getMarkerCreator = getMarkerCreator; exports._DEBUG_stubMarkerCreator = function(callback) { getMarkerCreator = function() { return callback } }; exports._DEBUG_restoreMarkerCreator = function() { getMarkerCreator = __getMarkerCreator } }, /*!***************************************!*\ !*** ./js/viz/core/layout_element.js ***! \***************************************/ function(module, exports, __webpack_require__) { var noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, _round = Math.round, objectUtils = __webpack_require__( /*! ../../core/utils/object */ 27), defaultOffset = { horizontal: 0, vertical: 0 }, alignFactors = { center: .5, right: 1, bottom: 1, left: 0, top: 0 }; function LayoutElement(options) { this._options = options } LayoutElement.prototype = { constructor: LayoutElement, position: function(options) { var that = this, ofBBox = options.of.getLayoutOptions(), myBBox = that.getLayoutOptions(), at = options.at, my = options.my, offset = options.offset || defaultOffset, shiftX = -alignFactors[my.horizontal] * myBBox.width + ofBBox.x + alignFactors[at.horizontal] * ofBBox.width + parseInt(offset.horizontal), shiftY = -alignFactors[my.vertical] * myBBox.height + ofBBox.y + alignFactors[at.vertical] * ofBBox.height + parseInt(offset.vertical); that.shift(_round(shiftX), _round(shiftY)) }, getLayoutOptions: noop }; function WrapperLayoutElement(renderElement, bBox) { this._renderElement = renderElement; this._cacheBBox = bBox } var wrapperLayoutElementPrototype = WrapperLayoutElement.prototype = objectUtils.clone(LayoutElement.prototype); wrapperLayoutElementPrototype.constructor = WrapperLayoutElement; wrapperLayoutElementPrototype.getLayoutOptions = function() { return this._cacheBBox || this._renderElement.getBBox() }; wrapperLayoutElementPrototype.shift = function(shiftX, shiftY) { var bBox = this.getLayoutOptions(); this._renderElement.move(_round(shiftX - bBox.x), _round(shiftY - bBox.y)) }; exports.LayoutElement = LayoutElement; exports.WrapperLayoutElement = WrapperLayoutElement }, /*!*********************************************!*\ !*** ./js/viz/components/data_validator.js ***! \*********************************************/ function(module, exports, __webpack_require__) { var commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), STRING = "string", NUMERIC = "numeric", DATETIME = "datetime", DISCRETE = "discrete", SEMIDISCRETE = "semidiscrete", CONTINUOUS = "continuous", LOGARITHMIC = "logarithmic", VALUE_TYPE = "valueType", ARGUMENT_TYPE = "argumentType", axisTypeParser = __webpack_require__( /*! ../core/utils */ 509).enumParser([STRING, NUMERIC, DATETIME]), _getParser = __webpack_require__( /*! ./parse_utils */ 524).getParser, _isDefined = commonUtils.isDefined, _isFunction = commonUtils.isFunction, _isArray = Array.isArray, _isString = commonUtils.isString, _isDate = commonUtils.isDate, _isNumber = commonUtils.isNumeric, _isObject = commonUtils.isObject; function groupingValues(data, others, valueField, index) { if (index >= 0) { data.slice(index).forEach(function(cell) { if (_isDefined(cell[valueField])) { others[valueField] += cell[valueField]; cell[valueField] = cell["original" + valueField] = void 0 } }) } } function processGroups(groups) { groups.forEach(function(group) { group.valueType = group.valueAxisType = null; group.series.forEach(function(series) { series.updateDataType({}) }); group.valueAxis && group.valueAxis.resetTypes(VALUE_TYPE) }) } function resetArgumentAxes(axes) { axes && axes.forEach(function(axis) { axis.resetTypes(ARGUMENT_TYPE) }) } function parseCategories(categories, parser) { var newArray = []; categories.forEach(function(category) { var parsedCategory = parser(category); void 0 !== parsedCategory && newArray.push(parsedCategory) }); return newArray } function parseAxisCategories(groupsData, parsers) { var argumentCategories = groupsData.argumentOptions && groupsData.argumentOptions.categories, valueParser = parsers[1]; groupsData.groups.forEach(function(valueGroup) { var categories = valueGroup.valueOptions && valueGroup.valueOptions.categories; if (categories) { valueGroup.valueOptions.categories = parseCategories(categories, valueParser) } }); if (argumentCategories) { groupsData.argumentOptions.categories = parseCategories(argumentCategories, parsers[0]) } } function filterForLogAxis(val, field, incidentOccurred) { if (val <= 0 && null !== val) { incidentOccurred("E2004", [field]); val = null } return val } function eigen(x) { return x } function getType(unit, type) { var result = type; if (type === STRING || _isString(unit)) { result = STRING } else { if (type === DATETIME || _isDate(unit)) { result = DATETIME } else { if (_isNumber(unit)) { result = NUMERIC } } } return result } function correctAxisType(type, axisType, hasCategories, incidentOccurred) { if (type === STRING && (axisType === CONTINUOUS || axisType === LOGARITHMIC || axisType === SEMIDISCRETE)) { incidentOccurred("E2002") } return axisType === LOGARITHMIC ? LOGARITHMIC : hasCategories || axisType === DISCRETE || type === STRING ? DISCRETE : axisType === SEMIDISCRETE ? SEMIDISCRETE : CONTINUOUS } function validUnit(unit, field, incidentOccurred) { if (unit) { incidentOccurred(!_isNumber(unit) && !_isDate(unit) && !_isString(unit) ? "E2003" : "E2004", [field]) } } function createParserUnit(type, axisType, ignoreEmptyPoints, skipFields, incidentOccurred) { var parser = type ? _getParser(type) : eigen, filter = axisType === LOGARITHMIC ? filterForLogAxis : eigen, filterInfinity = axisType !== DISCRETE ? function(x) { return isFinite(x) || void 0 === x ? x : null } : eigen, filterNulls = ignoreEmptyPoints ? function(x) { return null === x ? void 0 : x } : eigen; return function(unit, field) { var filterLogValues = function(x) { return filter(x, field, incidentOccurred) }, parseUnit = filterNulls(filterLogValues(filterInfinity(parser(unit)))); if (void 0 === parseUnit) { skipFields[field] = (skipFields[field] || 0) + 1; validUnit(unit, field, incidentOccurred) } return parseUnit } } function prepareParsers(groupsData, skipFields, incidentOccurred) { var sizeParser, valueParser, ignoreEmptyPoints, argumentParser = createParserUnit(groupsData.argumentType, groupsData.argumentAxisType, false, skipFields, incidentOccurred), categoryParsers = [argumentParser], cache = {}, list = []; groupsData.groups.forEach(function(group) { group.series.forEach(function(series) { ignoreEmptyPoints = series.getOptions().ignoreEmptyPoints; valueParser = createParserUnit(group.valueType, group.valueAxisType, ignoreEmptyPoints, skipFields, incidentOccurred); sizeParser = createParserUnit(NUMERIC, CONTINUOUS, ignoreEmptyPoints, skipFields, incidentOccurred); cache[series.getArgumentField()] = argumentParser; series.getValueFields().forEach(function(field) { !categoryParsers[1] && (categoryParsers[1] = valueParser); cache[field] = valueParser }); if (series.getSizeField()) { cache[series.getSizeField()] = sizeParser } if (series.getTagField()) { cache[series.getTagField()] = eigen } }) }); for (var field in cache) { list.push([field, cache[field]]) } list.length && parseAxisCategories(groupsData, categoryParsers); return list } function getParsedCell(cell, parsers) { var i, field, value, ii = parsers.length, obj = {}; for (i = 0; i < ii; ++i) { field = parsers[i][0]; value = cell[field]; obj[field] = parsers[i][1](value, field); obj["original" + field] = value } return obj } function parse(data, parsers) { var i, parsedData = [], ii = data.length; parsedData.length = ii; for (i = 0; i < ii; ++i) { parsedData[i] = getParsedCell(data[i], parsers) } return parsedData } function findIndexByThreshold(data, valueField, threshold) { var i, value, ii = data.length; for (i = 0; i < ii; ++i) { value = data[i][valueField]; if (_isDefined(value) && threshold > value) { break } } return i } function groupMinSlices(originalData, argumentField, valueField, smallValuesGrouping) { smallValuesGrouping = smallValuesGrouping || {}; var data, mode = smallValuesGrouping.mode, others = {}; if (!mode || "none" === mode) { return } others[argumentField] = String(smallValuesGrouping.groupName || "others"); others[valueField] = 0; data = originalData.slice(); data.sort(function(a, b) { var isA = _isDefined(a[valueField]) ? 1 : 0, isB = _isDefined(b[valueField]) ? 1 : 0; return isA && isB ? b[valueField] - a[valueField] : isB - isA }); groupingValues(data, others, valueField, "smallValueThreshold" === mode ? findIndexByThreshold(data, valueField, smallValuesGrouping.threshold) : smallValuesGrouping.topCount); others[valueField] && originalData.push(others) } function groupPieData(data, groupsData) { var firstSeries = groupsData.groups[0] && groupsData.groups[0].series[0], isPie = firstSeries && ("pie" === firstSeries.type || "doughnut" === firstSeries.type || "donut" === firstSeries.type); if (!isPie) { return } groupsData.groups.forEach(function(group) { group.series.forEach(function(series) { groupMinSlices(data, series.getArgumentField(), series.getValueFields()[0], series.getOptions().smallValuesGrouping) }) }) } function addUniqueItemToCollection(item, collection, itemsHash) { if (!itemsHash[item]) { collection.push(item); itemsHash[item] = true } } function getUniqueArgumentFields(groupsData) { var uniqueArgumentFields = [], hash = {}; groupsData.groups.forEach(function(group) { group.series.forEach(function(series) { addUniqueItemToCollection(series.getArgumentField(), uniqueArgumentFields, hash) }) }); return uniqueArgumentFields } function sort(a, b) { var result = a - b; if (isNaN(result)) { if (!_isDefined(a)) { return 1 } if (!_isDefined(b)) { return -1 } return 0 } return result } function sortByArgument(data, argumentField) { return data.slice().sort(function(a, b) { return sort(a[argumentField], b[argumentField]) }) } function sortByCallback(data, callback) { return data.slice().sort(callback) } function checkValueTypeOfGroup(group, cell) { group.series.forEach(function(series) { series.getValueFields().forEach(function(field) { group.valueType = getType(cell[field], group.valueType) }) }); return group.valueType } function getSortByCategories(categories) { var hash = {}; categories.forEach(function(value, i) { hash[value] = i }); return function(data, argumentField) { return data.slice().sort(function(a, b) { return hash[a[argumentField]] - hash[b[argumentField]] }) } } function sortData(data, groupsData, sortingMethodOption, uniqueArgumentFields) { var reSortCategories, dataByArguments = {}, isDiscrete = groupsData.argumentAxisType === DISCRETE, userCategories = isDiscrete && groupsData.argumentOptions && groupsData.argumentOptions.categories, sortFunction = function(data) { return data }; if (!userCategories && _isFunction(sortingMethodOption)) { data = sortByCallback(data, sortingMethodOption) } if (isDiscrete) { groupsData.categories = getCategories(data, uniqueArgumentFields, userCategories) } if (userCategories || !_isFunction(sortingMethodOption) && groupsData.argumentType === STRING) { sortFunction = getSortByCategories(groupsData.categories) } else { if (true === sortingMethodOption && groupsData.argumentType !== STRING) { sortFunction = sortByArgument; reSortCategories = isDiscrete } } uniqueArgumentFields.forEach(function(field) { dataByArguments[field] = sortFunction(data, field) }); if (reSortCategories) { groupsData.categories = groupsData.categories.sort(sort) } return dataByArguments } function checkItemExistence(collection, item) { return collection.map(function(collectionItem) { return collectionItem.valueOf() }).indexOf(item.valueOf()) === -1 } function getCategories(data, uniqueArgumentFields, userCategories) { var categories = userCategories ? userCategories.slice() : []; uniqueArgumentFields.forEach(function(field) { data.forEach(function(item) { var dataItem = item[field]; _isDefined(dataItem) && checkItemExistence(categories, dataItem) && categories.push(dataItem) }) }); return categories } function checkArgumentTypeOfGroup(series, cell, groupsData) { series.forEach(function(currentSeries) { groupsData.argumentType = getType(cell[currentSeries.getArgumentField()], groupsData.argumentType) }); return groupsData.argumentType } function checkType(data, groupsData, checkTypeForAllData) { var groupsIndexes, groupsWithUndefinedValueType = [], groupsWithUndefinedArgumentType = [], argumentTypeGroup = groupsData.argumentOptions && axisTypeParser(groupsData.argumentOptions.argumentType); groupsData.groups.forEach(function(group) { if (!group.series.length) { return } var valueTypeGroup = group.valueOptions && axisTypeParser(group.valueOptions.valueType); group.valueType = valueTypeGroup; groupsData.argumentType = argumentTypeGroup; !valueTypeGroup && groupsWithUndefinedValueType.push(group); !argumentTypeGroup && groupsWithUndefinedArgumentType.push(group) }); if (groupsWithUndefinedValueType.length || groupsWithUndefinedArgumentType.length) { groupsIndexes = groupsWithUndefinedValueType.map(function(_, index) { return index }); data.some(function(cell) { var defineArg; groupsWithUndefinedValueType.forEach(function(group, groupIndex) { if (checkValueTypeOfGroup(group, cell) && groupsIndexes.indexOf(groupIndex) >= 0) { groupsIndexes.splice(groupIndex, 1) } }); if (!defineArg) { groupsWithUndefinedArgumentType.forEach(function(group) { defineArg = checkArgumentTypeOfGroup(group.series, cell, groupsData) }) } if (!checkTypeForAllData && defineArg && 0 === groupsIndexes.length) { return true } }) } } function checkAxisType(groupsData, incidentOccurred) { var argumentOptions = groupsData.argumentOptions || {}, userArgumentCategories = argumentOptions && argumentOptions.categories || [], argumentAxisType = correctAxisType(groupsData.argumentType, argumentOptions.type, !!userArgumentCategories.length, incidentOccurred); groupsData.groups.forEach(function(group) { var valueOptions = group.valueOptions || {}, valueCategories = valueOptions.categories || [], valueAxisType = correctAxisType(group.valueType, valueOptions.type, !!valueCategories.length, incidentOccurred); group.series.forEach(function(series) { var optionsSeries = {}; optionsSeries.argumentAxisType = argumentAxisType; optionsSeries.valueAxisType = valueAxisType; groupsData.argumentAxisType = groupsData.argumentAxisType || optionsSeries.argumentAxisType; group.valueAxisType = group.valueAxisType || optionsSeries.valueAxisType; optionsSeries.argumentType = groupsData.argumentType; optionsSeries.valueType = group.valueType; optionsSeries.showZero = valueOptions.showZero; series.updateDataType(optionsSeries) }); group.valueAxisType = group.valueAxisType || valueAxisType; if (group.valueAxis) { group.valueAxis.setTypes(group.valueAxisType, group.valueType, VALUE_TYPE); group.valueAxis.validate(false) } }); groupsData.argumentAxisType = groupsData.argumentAxisType || argumentAxisType; if (groupsData.argumentAxes) { groupsData.argumentAxes.forEach(function(axis) { axis.setTypes(groupsData.argumentAxisType, groupsData.argumentType, ARGUMENT_TYPE); axis.validate(true) }) } } function verifyData(source, incidentOccurred) { var i, ii, k, item, data = [], sourceIsDefined = _isDefined(source), hasError = sourceIsDefined && !_isArray(source); if (sourceIsDefined && !hasError) { for (i = 0, ii = source.length, k = 0; i < ii; ++i) { item = source[i]; if (_isObject(item)) { data[k++] = item } else { if (item) { hasError = true } } } } if (hasError) { incidentOccurred("E2001") } return data } function validateData(data, groupsData, incidentOccurred, options) { var dataByArgumentFields, field, skipFields = {}; data = verifyData(data, incidentOccurred); groupsData.argumentType = groupsData.argumentAxisType = null; processGroups(groupsData.groups); resetArgumentAxes(groupsData.argumentAxes); checkType(data, groupsData, options.checkTypeForAllData); checkAxisType(groupsData, incidentOccurred); if (options.convertToAxisDataType) { data = parse(data, prepareParsers(groupsData, skipFields, incidentOccurred)) } groupPieData(data, groupsData); dataByArgumentFields = sortData(data, groupsData, options.sortingMethod, getUniqueArgumentFields(groupsData)); for (field in skipFields) { if (skipFields[field] === data.length) { incidentOccurred("W2002", [field]) } } return dataByArgumentFields } exports.validateData = validateData }, /*!******************************************!*\ !*** ./js/viz/components/parse_utils.js ***! \******************************************/ function(module, exports, __webpack_require__) { var commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), dateSerialization = __webpack_require__( /*! ../../core/utils/date_serialization */ 259), isDefined = commonUtils.isDefined, parsers = { string: function(val) { return isDefined(val) ? "" + val : val }, numeric: function(val) { if (!isDefined(val)) { return val } var parsedVal = Number(val); if (isNaN(parsedVal)) { parsedVal = void 0 } return parsedVal }, datetime: function(val) { if (!isDefined(val)) { return val } var parsedVal, numVal = Number(val); if (!isNaN(numVal)) { parsedVal = new Date(numVal) } else { parsedVal = dateSerialization.deserializeDate(val) } if (isNaN(Number(parsedVal))) { parsedVal = void 0 } return parsedVal } }; function correctValueType(type) { return "numeric" === type || "datetime" === type || "string" === type ? type : "" } module.exports = { correctValueType: correctValueType, getParser: function(valueType) { return parsers[correctValueType(valueType)] || commonUtils.noop } }; module.exports.parsers = parsers }, /*!**************************************!*\ !*** ./js/viz/series/base_series.js ***! \**************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), seriesNS = {}, commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), typeUtils = __webpack_require__( /*! ../../core/utils/type */ 12), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, pointModule = __webpack_require__( /*! ./points/base_point */ 526), _isDefined = commonUtils.isDefined, vizUtils = __webpack_require__( /*! ../core/utils */ 509), _map = vizUtils.map, _each = $.each, _extend = extend, _isEmptyObject = typeUtils.isEmptyObject, _normalizeEnum = vizUtils.normalizeEnum, _Event = $.Event, _noop = commonUtils.noop, _inArray = inArray, states = __webpack_require__( /*! ../components/consts */ 527).states, rangeCalculator = __webpack_require__( /*! ./helpers/range_data_calculator */ 539), scatterSeries = __webpack_require__( /*! ./scatter_series */ 540), lineSeries = __webpack_require__( /*! ./line_series */ 541), areaSeries = __webpack_require__( /*! ./area_series */ 542), barSeries = __webpack_require__( /*! ./bar_series */ 543), rangeSeries = __webpack_require__( /*! ./range_series */ 544), bubbleSeries = __webpack_require__( /*! ./bubble_series */ 545), pieSeries = __webpack_require__( /*! ./pie_series */ 546), financialSeries = __webpack_require__( /*! ./financial_series */ 547), stackedSeries = __webpack_require__( /*! ./stacked_series */ 548), DISCRETE = "discrete", SELECTED_STATE = states.selectedMark, HOVER_STATE = states.hoverMark, HOVER = states.hover, NORMAL = states.normal, SELECTION = states.selection, APPLY_SELECTED = states.applySelected, APPLY_HOVER = states.applyHover, RESET_ITEM = states.resetItem, NONE_MODE = "none", INCLUDE_POINTS = "includepoints", NEAREST_POINT = "nearestpoint", SERIES_SELECTION_CHANGED = "seriesSelectionChanged", POINT_SELECTION_CHANGED = "pointSelectionChanged", SERIES_HOVER_CHANGED = "seriesHoverChanged", POINT_HOVER_CHANGED = "pointHoverChanged", ALL_SERIES_POINTS = "allseriespoints", ALL_ARGUMENT_POINTS = "allargumentpoints", POINT_HOVER = "pointHover", CLEAR_POINT_HOVER = "clearPointHover", SERIES_SELECT = "seriesSelect", POINT_SELECT = "pointSelect", POINT_DESELECT = "pointDeselect", getEmptyBusinessRange = function() { return { arg: {}, val: {} } }; function triggerEvent(element, event, point) { element && element.trigger(event, point) } seriesNS.mixins = { chart: {}, pie: {}, polar: {} }; seriesNS.mixins.chart.scatter = scatterSeries.chart; seriesNS.mixins.polar.scatter = scatterSeries.polar; extend(seriesNS.mixins.pie, pieSeries); extend(seriesNS.mixins.chart, lineSeries.chart, areaSeries.chart, barSeries.chart, rangeSeries.chart, bubbleSeries.chart, financialSeries, stackedSeries.chart); extend(seriesNS.mixins.polar, lineSeries.polar, areaSeries.polar, barSeries.polar, rangeSeries.polar, bubbleSeries.polar, stackedSeries.polar); function includePointsMode(mode) { mode = _normalizeEnum(mode); return mode === INCLUDE_POINTS || mode === ALL_SERIES_POINTS } function getLabelOptions(labelOptions, defaultColor) { var opt = labelOptions || {}, labelFont = _extend({}, opt.font) || {}, labelBorder = opt.border || {}, labelConnector = opt.connector || {}, backgroundAttr = { fill: opt.backgroundColor || defaultColor, "stroke-width": labelBorder.visible ? labelBorder.width || 0 : 0, stroke: labelBorder.visible && labelBorder.width ? labelBorder.color : "none", dashStyle: labelBorder.dashStyle }, connectorAttr = { stroke: labelConnector.visible && labelConnector.width ? labelConnector.color || defaultColor : "none", "stroke-width": labelConnector.visible ? labelConnector.width || 0 : 0 }; labelFont.color = "none" === opt.backgroundColor && "#ffffff" === _normalizeEnum(labelFont.color) && "inside" !== opt.position ? defaultColor : labelFont.color; return { alignment: opt.alignment, format: opt.format, argumentFormat: opt.argumentFormat, precision: opt.precision, argumentPrecision: opt.argumentPrecision, percentPrecision: opt.percentPrecision, customizeText: commonUtils.isFunction(opt.customizeText) ? opt.customizeText : void 0, attributes: { font: labelFont }, visible: 0 !== labelFont.size ? opt.visible : false, showForZeroValues: opt.showForZeroValues, horizontalOffset: opt.horizontalOffset, verticalOffset: opt.verticalOffset, radialOffset: opt.radialOffset, background: backgroundAttr, position: opt.position, connector: connectorAttr, rotationAngle: opt.rotationAngle } } function setPointHoverState(point, legendCallback) { point.fullState |= HOVER_STATE; point.applyView(legendCallback) } function releasePointHoverState(point, legendCallback) { point.fullState &= ~HOVER_STATE; point.applyView(legendCallback); point.releaseHoverState() } function setPointSelectedState(point, legendCallback) { point.fullState |= SELECTED_STATE; point.applyView(legendCallback) } function releasePointSelectedState(point, legendCallback) { point.fullState &= ~SELECTED_STATE; point.applyView(legendCallback) } function mergePointOptionsCore(base, extra) { var options = _extend({}, base, extra); options.border = _extend({}, base && base.border, extra && extra.border); return options } function mergePointOptions(base, extra) { var options = mergePointOptionsCore(base, extra); options.image = _extend(true, {}, base.image, extra.image); options.selectionStyle = mergePointOptionsCore(base.selectionStyle, extra.selectionStyle); options.hoverStyle = mergePointOptionsCore(base.hoverStyle, extra.hoverStyle); return options } function Series(settings, options) { var that = this; that.fullState = 0; that._extGroups = settings; that._renderer = settings.renderer; that._group = settings.renderer.g().attr({ "class": "dxc-series" }); that._eventTrigger = settings.eventTrigger; that._eventPipe = settings.eventPipe; that._seriesModes = settings.commonSeriesModes; that._valueAxis = settings.valueAxis; that.axis = that._valueAxis && that._valueAxis.name; that._argumentAxis = settings.argumentAxis; that._legendCallback = _noop; that.updateOptions(options) } exports.Series = Series; exports.mixins = seriesNS.mixins; Series.prototype = { constructor: Series, _createLegendState: _noop, getLegendStyles: function() { return this._styles.legendStyles }, _createStyles: function(options) { var that = this, mainSeriesColor = options.mainSeriesColor; that._styles = { normal: that._parseStyle(options, mainSeriesColor, mainSeriesColor), hover: that._parseStyle(options.hoverStyle || {}, mainSeriesColor, mainSeriesColor), selection: that._parseStyle(options.selectionStyle || {}, mainSeriesColor, mainSeriesColor), legendStyles: { normal: that._createLegendState(options, mainSeriesColor), hover: that._createLegendState(options.hoverStyle || {}, mainSeriesColor), selection: that._createLegendState(options.selectionStyle || {}, mainSeriesColor) } } }, setClippingParams: function(baseId, wideId, forceClipping) { this._paneClipRectID = baseId; this._widePaneClipRectID = wideId; this._forceClipping = forceClipping }, applyClip: function() { this._group.attr({ "clip-path": this._paneClipRectID }) }, resetClip: function() { this._group.attr({ "clip-path": null }) }, getTagField: function() { return this._options.tagField || "tag" }, getValueFields: _noop, getSizeField: _noop, getArgumentField: _noop, getPoints: function() { return this._points }, _createPoint: function(data, pointsArray, index) { data.index = index; var options, arg, pointByArgument, that = this, point = pointsArray[index], pointsByArgument = that.pointsByArgument; if (that._checkData(data)) { options = that._getCreatingPointOptions(data); if (point) { point.update(data, options) } else { point = new pointModule.Point(that, data, options); if (that.isSelected() && includePointsMode(that.lastSelectionMode)) { point.setView(SELECTION) } pointsArray.push(point) } if (point.hasValue()) { that.customizePoint(point, data) } arg = point.argument.valueOf(); pointByArgument = pointsByArgument[arg]; if (pointByArgument) { pointByArgument.push(point) } else { pointsByArgument[arg] = [point] } return true } }, getRangeData: function(zoomArgs, calcIntervalFunction) { if (this._visible) { var range = this._getRangeData(); this._processRange(range); return range } return getEmptyBusinessRange() }, getViewport: function() { return rangeCalculator.getViewport(this) }, _deleteGroup: function(groupName) { var group = this[groupName]; if (group) { group.dispose(); this[groupName] = null } }, _saveOldAnimationMethods: function() { var that = this; that._oldClearingAnimation = that._clearingAnimation; that._oldUpdateElement = that._updateElement; that._oldGetAffineCoordOptions = that._getAffineCoordOptions }, _deleteOldAnimationMethods: function() { this._oldClearingAnimation = null; this._oldUpdateElement = null; this._oldGetAffineCoordOptions = null }, updateOptions: function(newOptions) { var that = this, widgetType = newOptions.widgetType, oldType = that.type, newType = newOptions.type; that.type = newType && _normalizeEnum(newType.toString()); if (!that._checkType(widgetType) || that._checkPolarBarType(widgetType, newOptions)) { that.dispose(); that.isUpdated = false; return } if (oldType !== that.type) { that._firstDrawing = true; that._saveOldAnimationMethods(); that._resetType(oldType, widgetType); that._setType(that.type, widgetType) } that._options = newOptions; that._pointOptions = null; that._renderer.initHatching(); that.name = newOptions.name; that.pane = newOptions.pane; that.tag = newOptions.tag; that._createStyles(newOptions); that._updateOptions(newOptions); that._visible = newOptions.visible; that.isUpdated = true; that._createGroups() }, _disposePoints: function(points) { _each(points || [], function(_, p) { p.dispose() }) }, _correctPointsLength: function(length, points) { this._disposePoints(this._oldPoints); this._oldPoints = points.splice(length, points.length) }, getErrorBarRangeCorrector: _noop, updateDataType: function(settings) { var that = this; that.argumentType = settings.argumentType; that.valueType = settings.valueType; that.argumentAxisType = settings.argumentAxisType; that.valueAxisType = settings.valueAxisType; that.showZero = settings.showZero; return that }, getOptions: function() { return this._options }, _resetRangeData: function() { this._rangeData = getEmptyBusinessRange() }, updateData: function(data) { var that = this, points = that._originalPoints || [], lastPointIndex = 0, options = that._options, i = 0, len = data.length; that.pointsByArgument = {}; that._resetRangeData(); if (data && data.length) { that._canRenderCompleteHandle = true } that._beginUpdateData(data); while (i < len) { if (that._createPoint(that._getPointData(data[i], options), points, lastPointIndex)) { lastPointIndex++ } i++ } that._disposePoints(that._aggregatedPoints); that._aggregatedPoints = null; that._points = that._originalPoints = points; that._correctPointsLength(lastPointIndex, points); that._endUpdateData() }, getTemplateFields: function() { return this.getValueFields().concat(this.getTagField(), this.getSizeField()).map(function(field) { return { templateField: field + this.name, originalField: field } }, this) }, resamplePoints: function(canvasLength) { var categories, discreteMin, discreteMax, count, tickInterval, that = this, sizePoint = that._getPointSize(), pointsLength = that.getAllPoints().length, argumentAxis = that.getArgumentAxis(), viewport = argumentAxis.getViewport(), min = viewport && viewport.min, max = viewport && viewport.max, argTranslator = argumentAxis.getTranslator(), isDiscrete = that.argumentAxisType === DISCRETE || that.valueAxisType === DISCRETE, businessRange = argTranslator.getBusinessRange(), minMaxDefined = _isDefined(min) && _isDefined(max); if (pointsLength && pointsLength > 1) { count = canvasLength / sizePoint; count = count <= 1 ? 1 : count; if (isDiscrete) { if (that.argumentAxisType === DISCRETE) { categories = businessRange.categories; discreteMin = _inArray(min, categories); discreteMax = _inArray(max, categories); if (discreteMin !== -1 && discreteMax !== -1) { categories = categories.slice(discreteMin, discreteMax + 1) } pointsLength = categories.length } tickInterval = Math.ceil(pointsLength / count) } else { tickInterval = (minMaxDefined ? max - min : businessRange.maxVisible - businessRange.minVisible) / count } that._points = that._resample(tickInterval, min - tickInterval, max + tickInterval, minMaxDefined) } }, _removeOldSegments: function(startIndex) { var that = this; _each(that._graphics.splice(startIndex, that._graphics.length) || [], function(_, elem) { that._removeElement(elem) }); if (that._trackers) { _each(that._trackers.splice(startIndex, that._trackers.length) || [], function(_, elem) { elem.remove() }) } }, draw: function(animationEnabled, hideLayoutLabels, legendCallback) { var drawComplete, that = this; if (that._oldClearingAnimation && animationEnabled && that._firstDrawing) { drawComplete = function() { that._draw(true, hideLayoutLabels) }; that._oldClearingAnimation(drawComplete) } else { that._draw(animationEnabled, hideLayoutLabels, legendCallback) } }, _draw: function(animationEnabled, hideLayoutLabels, legendCallback) { var groupForPoint, that = this, points = that._points || [], segment = [], segmentCount = 0, firstDrawing = that._firstDrawing, closeSegment = points[0] && points[0].hasValue() && that._options.closed; that._legendCallback = legendCallback || that._legendCallback; that._graphics = that._graphics || []; that._prepareSeriesToDrawing(); if (!that._visible) { animationEnabled = false; that._group.remove(); return } that._appendInGroup(); that._applyVisibleArea(); that._setGroupsSettings(animationEnabled, firstDrawing); that._segments = []; that._drawnPoints = []; that._firstDrawing = points.length ? false : true; groupForPoint = { markers: that._markersGroup, errorBars: that._errorBarGroup }; _each(points, function(i, p) { p.translate(); if (p.hasValue()) { that._drawPoint({ point: p, groups: groupForPoint, hasAnimation: animationEnabled, firstDrawing: firstDrawing }); segment.push(p) } else { if (segment.length) { that._drawSegment(segment, animationEnabled, segmentCount++); segment = [] } } }); segment.length && that._drawSegment(segment, animationEnabled, segmentCount++, closeSegment); that._removeOldSegments(segmentCount); that._defaultSegments = that._generateDefaultSegments(); hideLayoutLabels && that.hideLabels(); animationEnabled && that._animate(firstDrawing); if (that.isSelected()) { that._changeStyle(that.lastSelectionMode, void 0, true) } else { if (that.isHovered()) { that._changeStyle(that.lastHoverMode, void 0, true) } } }, _setLabelGroupSettings: function(animationEnabled) { var settings = { "class": "dxc-labels" }; this._applyElementsClipRect(settings); this._applyClearingSettings(settings); animationEnabled && (settings.opacity = .001); this._labelsGroup.attr(settings).append(this._extGroups.labelsGroup) }, _checkType: function(widgetType) { return !!seriesNS.mixins[widgetType][this.type] }, _checkPolarBarType: function(widgetType, options) { return "polar" === widgetType && options.spiderWidget && this.type.indexOf("bar") !== -1 }, _resetType: function(seriesType, widgetType) { var methodName, methods; if (seriesType) { methods = seriesNS.mixins[widgetType][seriesType]; for (methodName in methods) { delete this[methodName] } } }, _setType: function(seriesType, widgetType) { var methodName, methods = seriesNS.mixins[widgetType][seriesType]; for (methodName in methods) { this[methodName] = methods[methodName] } }, _setPointsView: function(view, target) { this.getPoints().forEach(function(point) { if (target !== point) { point.setView(view) } }) }, _resetPointsView: function(view, target) { this.getPoints().forEach(function(point) { if (target !== point) { point.resetView(view) } }) }, _resetNearestPoint: function() { var that = this; that._nearestPoint && that._nearestPoint.resetView(HOVER); that._nearestPoint = null }, _setSelectedState: function(mode) { var that = this; that.lastSelectionMode = _normalizeEnum(mode || that._options.selectionMode); that.fullState = that.fullState | SELECTED_STATE; that._resetNearestPoint(); that._changeStyle(that.lastSelectionMode); if (that.lastSelectionMode !== NONE_MODE && that.isHovered() && includePointsMode(that.lastHoverMode)) { that._resetPointsView(HOVER) } }, _releaseSelectedState: function() { var that = this; that.fullState = that.fullState & ~SELECTED_STATE; that._changeStyle(that.lastSelectionMode, SELECTION); if (that.lastSelectionMode !== NONE_MODE && that.isHovered() && includePointsMode(that.lastHoverMode)) { that._setPointsView(HOVER) } }, isFullStackedSeries: function() { return 0 === this.type.indexOf("fullstacked") }, isStackedSeries: function() { return 0 === this.type.indexOf("stacked") }, isFinancialSeries: function() { return "stock" === this.type || "candlestick" === this.type }, _canChangeView: function() { return !this.isSelected() && _normalizeEnum(this._options.hoverMode) !== NONE_MODE }, _changeStyle: function(mode, resetView, skipPoints) { var that = this, state = that.fullState, styles = [NORMAL, HOVER, SELECTION, SELECTION]; if ("none" === that.lastHoverMode) { state &= ~HOVER_STATE } if ("none" === that.lastSelectionMode) { state &= ~SELECTED_STATE } if (includePointsMode(mode) && !skipPoints) { if (!resetView) { that._setPointsView(styles[state]) } else { that._resetPointsView(resetView) } } that._legendCallback([RESET_ITEM, APPLY_HOVER, APPLY_SELECTED, APPLY_SELECTED][state]); that._applyStyle(that._styles[styles[state]]) }, updateHover: function(x, y) { var that = this, currentNearestPoint = that._nearestPoint, point = that.isHovered() && that.lastHoverMode === NEAREST_POINT && that.getNeighborPoint(x, y); if (point !== currentNearestPoint && !(that.isSelected() && that.lastSelectionMode !== NONE_MODE)) { that._resetNearestPoint(); if (point) { point.setView(HOVER); that._nearestPoint = point } } }, _getMainAxisName: function() { return this._options.rotated ? "X" : "Y" }, areLabelsVisible: function() { return !_isDefined(this._options.maxLabelCount) || this._points.length <= this._options.maxLabelCount }, getLabelVisibility: function() { return this.areLabelsVisible() && this._options.label && this._options.label.visible }, customizePoint: function(point, pointData) { var customizeObject, pointOptions, customLabelOptions, customOptions, useLabelCustomOptions, usePointCustomOptions, that = this, options = that._options, customizePoint = options.customizePoint, customizeLabel = options.customizeLabel; if (customizeLabel && customizeLabel.call) { customizeObject = _extend({ seriesName: that.name }, pointData); customizeObject.series = that; customLabelOptions = customizeLabel.call(customizeObject, customizeObject); useLabelCustomOptions = customLabelOptions && !_isEmptyObject(customLabelOptions); customLabelOptions = useLabelCustomOptions ? _extend(true, {}, options.label, customLabelOptions) : null } if (customizePoint && customizePoint.call) { customizeObject = customizeObject || _extend({ seriesName: that.name }, pointData); customizeObject.series = that; customOptions = customizePoint.call(customizeObject, customizeObject); usePointCustomOptions = customOptions && !_isEmptyObject(customOptions) } if (useLabelCustomOptions || usePointCustomOptions) { pointOptions = that._parsePointOptions(that._preparePointOptions(customOptions), customLabelOptions || options.label, pointData); pointOptions.styles.useLabelCustomOptions = useLabelCustomOptions; pointOptions.styles.usePointCustomOptions = usePointCustomOptions; point.updateOptions(pointOptions) } }, show: function() { if (!this._visible) { this._changeVisibility(true) } }, hide: function() { if (this._visible) { this._changeVisibility(false) } }, _changeVisibility: function(visibility) { var that = this; that._visible = that._options.visible = visibility; that._updatePointsVisibility(); that.hidePointTooltip(); that._options.visibilityChanged() }, _updatePointsVisibility: _noop, hideLabels: function() { _each(this._points, function(_, point) { point._label.hide() }) }, _parsePointOptions: function(pointOptions, labelOptions, data) { var that = this, options = that._options, styles = that._createPointStyles(pointOptions, data), parsedOptions = _extend({}, pointOptions, { type: options.type, rotated: options.rotated, styles: styles, widgetType: options.widgetType, visibilityChanged: options.visibilityChanged }); parsedOptions.label = getLabelOptions(labelOptions, styles.normal.fill); if (that.areErrorBarsVisible()) { parsedOptions.errorBars = options.valueErrorBar } return parsedOptions }, _preparePointOptions: function(customOptions) { var pointOptions = this._getOptionsForPoint(); return customOptions ? mergePointOptions(pointOptions, customOptions) : pointOptions }, _getMarkerGroupOptions: function() { return _extend(false, {}, this._getOptionsForPoint(), { hoverStyle: {}, selectionStyle: {} }) }, _resample: function(ticksInterval, min, max, isDefinedMinMax) { var pointData, minTick, that = this, fusionPoints = [], nowIndexTicks = 0, lastPointIndex = 0, state = 0, originalPoints = that.getAllPoints(); function addFirstFusionPoint(point) { fusionPoints.push(point); minTick = point.argument; if (isDefinedMinMax) { if (point.argument < min) { state = 1 } else { if (point.argument > max) { state = 2 } else { state = 0 } } } } if (that.argumentAxisType === DISCRETE || that.valueAxisType === DISCRETE) { return _map(originalPoints, function(point, index) { if (index % ticksInterval === 0) { return point } point.setInvisibility(); return null }) } that._aggregatedPoints = that._aggregatedPoints || []; _each(originalPoints, function(_, point) { point.setInvisibility(); if (!fusionPoints.length) { addFirstFusionPoint(point) } else { if (!state && Math.abs(minTick - point.argument) < ticksInterval) { fusionPoints.push(point) } else { if (!(1 === state && point.argument < min) && !(2 === state && point.argument > max)) { pointData = that._fusionPoints(fusionPoints, minTick, nowIndexTicks); nowIndexTicks++; if (that._createPoint(pointData, that._aggregatedPoints, lastPointIndex)) { lastPointIndex++ } fusionPoints = []; addFirstFusionPoint(point) } } } }); if (fusionPoints.length) { pointData = that._fusionPoints(fusionPoints, minTick, nowIndexTicks); if (that._createPoint(pointData, that._aggregatedPoints, lastPointIndex)) { lastPointIndex++ } } that._correctPointsLength(lastPointIndex, that._aggregatedPoints); that._endUpdateData(); return that._aggregatedPoints }, canRenderCompleteHandle: function() { var result = this._canRenderCompleteHandle; delete this._canRenderCompleteHandle; return !!result }, isHovered: function() { return !!(1 & this.fullState) }, isSelected: function() { return !!(2 & this.fullState) }, isVisible: function() { return this._visible }, getAllPoints: function() { return (this._originalPoints || []).slice() }, getPointByPos: function(pos) { return (this._points || [])[pos] }, getVisiblePoints: function() { return (this._drawnPoints || []).slice() }, selectPoint: function(point) { if (!point.isSelected()) { setPointSelectedState(point, this._legendCallback); this._eventPipe({ action: POINT_SELECT, target: point }); this._eventTrigger(POINT_SELECTION_CHANGED, { target: point }) } }, deselectPoint: function(point) { if (point.isSelected()) { releasePointSelectedState(point, this._legendCallback); this._eventPipe({ action: POINT_DESELECT, target: point }); this._eventTrigger(POINT_SELECTION_CHANGED, { target: point }) } }, hover: function(mode) { var that = this, eventTrigger = that._eventTrigger; if (that.isHovered()) { return } that.lastHoverMode = _normalizeEnum(mode || that._options.hoverMode); that.fullState = that.fullState | HOVER_STATE; that._changeStyle(that.lastHoverMode, void 0, that.isSelected() && that.lastSelectionMode !== NONE_MODE); eventTrigger(SERIES_HOVER_CHANGED, { target: that }) }, clearHover: function() { var that = this, eventTrigger = that._eventTrigger; if (!that.isHovered()) { return } that._resetNearestPoint(); that.fullState = that.fullState & ~HOVER_STATE; that._changeStyle(that.lastHoverMode, HOVER, that.isSelected() && that.lastSelectionMode !== NONE_MODE); eventTrigger(SERIES_HOVER_CHANGED, { target: that }) }, hoverPoint: function(point) { var that = this; if (!point.isHovered()) { point.clearHover(); setPointHoverState(point, that._legendCallback); that._canChangeView() && that._applyStyle(that._styles.hover); that._eventPipe({ action: POINT_HOVER, target: point }); that._eventTrigger(POINT_HOVER_CHANGED, { target: point }) } }, clearPointHover: function() { var that = this; that.getPoints().some(function(currentPoint) { if (currentPoint.isHovered()) { releasePointHoverState(currentPoint, that._legendCallback); that._canChangeView() && that._applyStyle(that._styles.normal); that._eventPipe({ action: CLEAR_POINT_HOVER, target: currentPoint }); that._eventTrigger(POINT_HOVER_CHANGED, { target: currentPoint }); return true } return false }) }, showPointTooltip: function(point) { triggerEvent(this._extGroups.seriesGroup, new _Event("showpointtooltip"), point) }, hidePointTooltip: function(point) { triggerEvent(this._extGroups.seriesGroup, new _Event("hidepointtooltip"), point) }, select: function() { var that = this; if (!that.isSelected()) { that._setSelectedState(that._options.selectionMode); that._eventPipe({ action: SERIES_SELECT, target: that }); that._group.toForeground(); that._eventTrigger(SERIES_SELECTION_CHANGED, { target: that }) } }, clearSelection: function() { var that = this; if (that.isSelected()) { that._releaseSelectedState(); that._eventTrigger(SERIES_SELECTION_CHANGED, { target: that }) } }, getPointsByArg: function(arg) { return this.pointsByArgument[arg.valueOf()] || [] }, getPointsByKeys: function(arg) { return this.getPointsByArg(arg) }, notify: function(data) { var that = this, action = data.action, seriesModes = that._seriesModes, target = data.target, targetOptions = target.getOptions(), pointHoverMode = _normalizeEnum(targetOptions.hoverMode), selectionModeOfPoint = _normalizeEnum(targetOptions.selectionMode); if (action === POINT_HOVER) { that._hoverPointHandler(target, pointHoverMode, data.notifyLegend) } else { if (action === CLEAR_POINT_HOVER) { that._clearPointHoverHandler(target, pointHoverMode, data.notifyLegend) } else { if (action === SERIES_SELECT) { target !== that && "single" === seriesModes.seriesSelectionMode && that.clearSelection() } else { if (action === POINT_SELECT) { if ("single" === seriesModes.pointSelectionMode) { that.getPoints().some(function(currentPoint) { if (currentPoint !== target && currentPoint.isSelected()) { that.deselectPoint(currentPoint); return true } return false }) } that._selectPointHandler(target, selectionModeOfPoint) } else { if (action === POINT_DESELECT) { that._deselectPointHandler(target, selectionModeOfPoint) } } } } } }, _selectPointHandler: function(target, mode) { var that = this; if (mode === ALL_SERIES_POINTS) { target.series === that && that._setPointsView(SELECTION, target) } else { if (mode === ALL_ARGUMENT_POINTS) { that.getPointsByKeys(target.argument, target.argumentIndex).forEach(function(currentPoint) { currentPoint !== target && currentPoint.setView(SELECTION) }) } } }, _deselectPointHandler: function(target, mode) { if (mode === ALL_SERIES_POINTS) { target.series === this && this._resetPointsView(SELECTION, target) } else { if (mode === ALL_ARGUMENT_POINTS) { this.getPointsByKeys(target.argument, target.argumentIndex).forEach(function(currentPoint) { currentPoint !== target && currentPoint.resetView(SELECTION) }) } } }, _hoverPointHandler: function(target, mode, notifyLegend) { var that = this; if (target.series !== that && mode === ALL_ARGUMENT_POINTS) { that.getPointsByKeys(target.argument, target.argumentIndex).forEach(function(currentPoint) { currentPoint.setView(HOVER) }); notifyLegend && that._legendCallback(target) } else { if (mode === ALL_SERIES_POINTS && target.series === that) { that._setPointsView(HOVER, target) } } }, _clearPointHoverHandler: function(target, mode, notifyLegend) { var that = this; if (mode === ALL_ARGUMENT_POINTS) { target.series !== that && that.getPointsByKeys(target.argument, target.argumentIndex).forEach(function(currentPoint) { currentPoint.resetView(HOVER) }); notifyLegend && that._legendCallback(target) } else { if (mode === ALL_SERIES_POINTS && target.series === that) { that._resetPointsView(HOVER, target) } } }, _deletePoints: function() { var that = this; that._disposePoints(that._originalPoints); that._disposePoints(that._aggregatedPoints); that._disposePoints(that._oldPoints); that._points = that._oldPoints = that._aggregatedPoints = that._originalPoints = that._drawnPoints = null }, _deleteTrackers: function() { var that = this; _each(that._trackers || [], function(_, tracker) { tracker.remove() }); that._trackersGroup && that._trackersGroup.dispose(); that._trackers = that._trackersGroup = null }, dispose: function() { var that = this; that._deletePoints(); that._group.dispose(); that._labelsGroup && that._labelsGroup.dispose(); that._errorBarGroup && that._errorBarGroup.dispose(); that._deleteTrackers(); that._group = that._extGroups = that._markersGroup = that._elementsGroup = that._bordersGroup = that._labelsGroup = that._errorBarGroup = that._graphics = that._rangeData = that._renderer = that._styles = that._options = that._pointOptions = that._drawnPoints = that._aggregatedPoints = that.pointsByArgument = that._segments = that._prevSeries = null }, correctPosition: _noop, drawTrackers: _noop, getNeighborPoint: _noop, areErrorBarsVisible: _noop, getColor: function() { return this.getLegendStyles().normal.fill }, getOpacity: function() { return this._options.opacity }, getStackName: function() { return "stackedbar" === this.type || "fullstackedbar" === this.type ? this._stackName : null }, getPointByCoord: function(x, y) { var point = this.getNeighborPoint(x, y); return point && point.coordsIn(x, y) ? point : null }, getValueAxis: function() { return this._valueAxis }, getArgumentAxis: function() { return this._argumentAxis } } }, /*!********************************************!*\ !*** ./js/viz/series/points/base_point.js ***! \********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../../core/renderer */ 9), mixins = {}, statesConsts = __webpack_require__( /*! ../../components/consts */ 527).states, symbolPoint = __webpack_require__( /*! ./symbol_point */ 528), barPoint = __webpack_require__( /*! ./bar_point */ 531), bubblePoint = __webpack_require__( /*! ./bubble_point */ 532), piePoint = __webpack_require__( /*! ./pie_point */ 533), rangeSymbolPoint = __webpack_require__( /*! ./range_symbol_point */ 534), rangeBarPoint = __webpack_require__( /*! ./range_bar_point */ 535), candlestickPoint = __webpack_require__( /*! ./candlestick_point */ 536), stockPoint = __webpack_require__( /*! ./stock_point */ 537), polarPoints = __webpack_require__( /*! ./polar_point */ 538), _normalizeEnum = __webpack_require__( /*! ../../core/utils */ 509).normalizeEnum, extend = __webpack_require__( /*! ../../../core/utils/extend */ 11).extend, _each = $.each, _extend = extend, commonUtils = __webpack_require__( /*! ../../../core/utils/common */ 14), _isDefined = commonUtils.isDefined, _noop = commonUtils.noop, SYMBOL_POINT = "symbolPoint", POLAR_SYMBOL_POINT = "polarSymbolPoint", BAR_POINT = "barPoint", POLAR_BAR_POINT = "polarBarPoint", PIE_POINT = "piePoint", SELECTED_STATE = statesConsts.selectedMark, HOVER_STATE = statesConsts.hoverMark, NORMAL_STATE = statesConsts.normalMark, HOVER = statesConsts.hover, NORMAL = statesConsts.normal, SELECTION = statesConsts.selection, pointTypes = { chart: { scatter: SYMBOL_POINT, line: SYMBOL_POINT, spline: SYMBOL_POINT, stepline: SYMBOL_POINT, stackedline: SYMBOL_POINT, fullstackedline: SYMBOL_POINT, stackedspline: SYMBOL_POINT, fullstackedspline: SYMBOL_POINT, stackedsplinearea: SYMBOL_POINT, fullstackedsplinearea: SYMBOL_POINT, area: SYMBOL_POINT, splinearea: SYMBOL_POINT, steparea: SYMBOL_POINT, stackedarea: SYMBOL_POINT, fullstackedarea: SYMBOL_POINT, rangearea: "rangeSymbolPoint", bar: BAR_POINT, stackedbar: BAR_POINT, fullstackedbar: BAR_POINT, rangebar: "rangeBarPoint", bubble: "bubblePoint", stock: "stockPoint", candlestick: "candlestickPoint" }, pie: { pie: PIE_POINT, doughnut: PIE_POINT, donut: PIE_POINT }, polar: { scatter: POLAR_SYMBOL_POINT, line: POLAR_SYMBOL_POINT, area: POLAR_SYMBOL_POINT, bar: POLAR_BAR_POINT, stackedbar: POLAR_BAR_POINT } }; function isNoneMode(mode) { return "none" === _normalizeEnum(mode) } function Point(series, dataItem, options) { this.fullState = NORMAL_STATE; this.series = series; this.update(dataItem, options); this._viewCounters = { hover: 0, selection: 0 }; this._emptySettings = { fill: null, stroke: null, dashStyle: null } } exports.Point = Point; mixins.symbolPoint = symbolPoint; mixins.barPoint = barPoint; mixins.bubblePoint = bubblePoint; mixins.piePoint = piePoint; mixins.rangeSymbolPoint = rangeSymbolPoint; mixins.rangeBarPoint = rangeBarPoint; mixins.candlestickPoint = candlestickPoint; mixins.stockPoint = stockPoint; mixins.polarSymbolPoint = polarPoints.polarSymbolPoint; mixins.polarBarPoint = polarPoints.polarBarPoint; Point.prototype = { constructor: Point, getColor: function() { if (!this.hasValue() && !this._styles.usePointCustomOptions) { this.series.customizePoint(this, this._dataItem) } return this._styles.normal.fill || this.series.getColor() }, _getStyle: function() { return this._styles[this._currentStyle || "normal"] }, update: function(dataItem, options) { this.updateOptions(options); this.updateData(dataItem) }, updateData: function(dataItem) { var that = this; that.argument = that.initialArgument = that.originalArgument = dataItem.argument; that.tag = dataItem.tag; that.index = dataItem.index; this._dataItem = dataItem; that.lowError = dataItem.lowError; that.highError = dataItem.highError; that._updateData(dataItem); !that.hasValue() && that.setInvisibility(); that._fillStyle(); that._updateLabelData() }, deleteMarker: function() { var that = this; if (that.graphic) { that.graphic.dispose() } that.graphic = null }, _drawErrorBar: _noop, draw: function(renderer, groups, animationEnabled, firstDrawing) { var that = this; if (that._needDeletingOnDraw) { that.deleteMarker(); that._needDeletingOnDraw = false } if (that._needClearingOnDraw) { that.clearMarker(); that._needClearingOnDraw = false } if (!that._hasGraphic()) { that._getMarkerVisibility() && that._drawMarker(renderer, groups.markers, animationEnabled, firstDrawing) } else { that._updateMarker(animationEnabled, this._getStyle(), groups.markers) } that._drawLabel(); that._drawErrorBar(renderer, groups.errorBars, animationEnabled); return that }, applyStyle: function(style, callback) { var that = this; that._currentStyle = style; if (that.graphic) { if ("normal" === style) { that.clearMarker() } else { that.graphic.toForeground() } that._updateMarker(true, that._styles[style], void 0, callback) } return that }, _getViewStyle: function() { var state = NORMAL_STATE, fullState = this.fullState, styles = [NORMAL, HOVER, SELECTION, SELECTION]; if (this._viewCounters.hover) { state |= HOVER_STATE } if (this._viewCounters.selection) { state |= SELECTED_STATE } if (isNoneMode(this.getOptions().selectionMode)) { fullState &= ~SELECTED_STATE } if (isNoneMode(this.getOptions().hoverMode)) { fullState &= ~HOVER_STATE } state |= fullState; return styles[state] }, applyView: function(legendCallback) { var style = this._getViewStyle(); this.applyStyle(style, legendCallback) }, setView: function(style) { this._viewCounters[style]++; this.applyView() }, resetView: function(style) { --this._viewCounters[style]; if (this._viewCounters[style] < 0) { var debug = __webpack_require__( /*! ../../../core/utils/console */ 13).debug; debug.assert(false, "incorrect view style couinter " + this._viewCounters[style] + " " + style) } this.applyView() }, releaseHoverState: function() { var that = this; if (that.graphic && !that.isSelected()) { that.graphic.toBackground() } }, select: function() { this.series.selectPoint(this) }, clearSelection: function() { this.series.deselectPoint(this) }, hover: function() { this.series.hoverPoint(this) }, clearHover: function() { this.series.clearPointHover() }, showTooltip: function() { this.series.showPointTooltip(this) }, hideTooltip: function() { this.series.hidePointTooltip(this) }, _checkLabelsChanging: function(oldType, newType) { var isNewRange = ~newType.indexOf("range"), isOldRange = ~oldType.indexOf("range"); return isOldRange && !isNewRange || !isOldRange && isNewRange }, updateOptions: function(newOptions) { if (!newOptions) { return } var that = this, oldOptions = that._options, widgetType = newOptions.widgetType, oldType = oldOptions && oldOptions.type, newType = newOptions.type, newPointTypeMixin = pointTypes[widgetType][newType]; if (oldType !== newType) { that._needDeletingOnDraw = true; that._needClearingOnDraw = false; if (oldType) { that._checkLabelsChanging(oldType, newType) && that.deleteLabel(); that._resetType(mixins[pointTypes[oldType]]) } that._setType(mixins[newPointTypeMixin]) } else { that._needDeletingOnDraw = that._checkSymbol(oldOptions, newOptions); that._needClearingOnDraw = that._checkCustomize(oldOptions, newOptions) } that._options = newOptions; that._fillStyle(); that._updateLabelOptions(newPointTypeMixin) }, translate: function() { this.hasValue() && this._translate() }, _checkCustomize: function(oldOptions, newOptions) { return oldOptions.styles.usePointCustomOptions && !newOptions.styles.usePointCustomOptions }, _getCustomLabelVisibility: function() { return this._styles.useLabelCustomOptions ? !!this._options.label.visible : null }, getBoundingRect: function() { return this._getGraphicBBox() }, _resetType: function(methods) { for (var methodName in methods) { delete this[methodName] } }, _setType: function(methods) { for (var methodName in methods) { this[methodName] = methods[methodName] } }, isInVisibleArea: function() { return this.inVisibleArea }, isSelected: function() { return !!(this.fullState & SELECTED_STATE) }, isHovered: function() { return !!(this.fullState & HOVER_STATE) }, getOptions: function() { return this._options }, animate: function(complete, settings, partitionDuration) { if (!this.graphic) { complete && complete(); return } this.graphic.animate(settings, { partitionDuration: partitionDuration }, complete) }, getCoords: function(min) { var that = this; if (!min) { return { x: that.x, y: that.y } } if (!that._options.rotated) { return { x: that.x, y: that.minY } } return { x: that.minX, y: that.y } }, getDefaultCoords: function() { var that = this; return !that._options.rotated ? { x: that.x, y: that.defaultY } : { x: that.defaultX, y: that.y } }, _getVisibleArea: function() { return this.series.getVisibleArea() }, _getArgTranslator: function() { return this.series.getArgumentAxis().getTranslator() }, _getValTranslator: function() { return this.series.getValueAxis().getTranslator() }, _calculateVisibility: function(x, y, width, height) { var that = this, visibleArea = that._getVisibleArea(), rotated = that._options.rotated; if (visibleArea.minX > x + (width || 0) || visibleArea.maxX < x || visibleArea.minY > y + (height || 0) || visibleArea.maxY < y || rotated && _isDefined(width) && 0 !== width && (visibleArea.minX === x + width || visibleArea.maxX === x) || !rotated && _isDefined(height) && 0 !== height && (visibleArea.minY === y + height || visibleArea.maxY === y)) { that.inVisibleArea = false } else { that.inVisibleArea = true } }, hasValue: function() { return null !== this.value && null !== this.minValue }, correctPosition: _noop, correctRadius: _noop, correctLabelRadius: _noop, getCrosshairData: _noop, getPointRadius: _noop, _populatePointShape: _noop, _checkSymbol: _noop, getMarkerCoords: _noop, hide: _noop, show: _noop, hideMarker: _noop, setInvisibility: _noop, clearVisibility: _noop, isVisible: _noop, resetCorrection: _noop, correctValue: _noop, resetValue: _noop, setPercentValue: _noop, correctCoordinates: _noop, coordsIn: _noop, getTooltipParams: _noop, setLabelEllipsis: _noop, setLabelTrackerData: _noop, updateLabelCoord: _noop, drawLabel: _noop, correctLabelPosition: _noop, setMaxLabelLength: _noop, getMinValue: _noop, getMaxValue: _noop, dispose: function() { var that = this; that.deleteMarker(); that.deleteLabel(); that._errorBar && this._errorBar.dispose(); that._options = that._styles = that.series = that._errorBar = null }, getTooltipFormatObject: function(tooltip) { var that = this, tooltipFormatObject = that._getFormatObject(tooltip), sharedTooltipValuesArray = [], tooltipStackPointsFormatObject = []; if (that.stackPoints) { _each(that.stackPoints, function(_, point) { if (!point.isVisible()) { return } var formatObject = point._getFormatObject(tooltip); tooltipStackPointsFormatObject.push(formatObject); sharedTooltipValuesArray.push(formatObject.seriesName + ": " + formatObject.valueText) }); _extend(tooltipFormatObject, { points: tooltipStackPointsFormatObject, valueText: sharedTooltipValuesArray.join("\n"), stackName: that.stackPoints.stackName }) } return tooltipFormatObject }, setHole: function(holeValue, position) { var that = this, minValue = isFinite(that.minValue) ? that.minValue : 0; if (_isDefined(holeValue)) { if ("left" === position) { that.leftHole = that.value - holeValue; that.minLeftHole = minValue - holeValue } else { that.rightHole = that.value - holeValue; that.minRightHole = minValue - holeValue } } }, resetHoles: function() { this.leftHole = null; this.minLeftHole = null; this.rightHole = null; this.minRightHole = null }, getLabel: function() { return this._label }, getLabels: function() { return [this._label] } } }, /*!*************************************!*\ !*** ./js/viz/components/consts.js ***! \*************************************/ function(module, exports) { module.exports = { events: { mouseover: "mouseover", mouseout: "mouseout", mousemove: "mousemove", touchstart: "touchstart", touchmove: "touchmove", touchend: "touchend", mousedown: "mousedown", mouseup: "mouseup", click: "click", selectSeries: "selectseries", deselectSeries: "deselectseries", selectPoint: "selectpoint", deselectPoint: "deselectpoint", showPointTooltip: "showpointtooltip", hidePointTooltip: "hidepointtooltip" }, states: { hover: "hover", normal: "normal", selection: "selection", normalMark: 0, hoverMark: 1, selectedMark: 2, applyHover: "applyHover", applySelected: "applySelected", resetItem: "resetItem" }, pieLabelIndent: 30, pieLabelSpacing: 10, pieSeriesSpacing: 4 } }, /*!**********************************************!*\ !*** ./js/viz/series/points/symbol_point.js ***! \**********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../../core/utils/extend */ 11).extend, labelModule = __webpack_require__( /*! ./label */ 529), _extend = extend, _isDefined = commonUtils.isDefined, _normalizeEnum = __webpack_require__( /*! ../../core/utils */ 509).normalizeEnum, _math = Math, _round = _math.round, _floor = _math.floor, _ceil = _math.ceil, DEFAULT_IMAGE_WIDTH = 20, DEFAULT_IMAGE_HEIGHT = 20, LABEL_OFFSET = 10, CANVAS_POSITION_DEFAULT = "canvas_position_default"; function getSquareMarkerCoords(radius) { return [-radius, -radius, radius, -radius, radius, radius, -radius, radius, -radius, -radius] } function getPolygonMarkerCoords(radius) { var r = _ceil(radius); return [-r, 0, 0, -r, r, 0, 0, r, -r, 0] } function getCrossMarkerCoords(radius) { var r = _ceil(radius), floorHalfRadius = _floor(r / 2), ceilHalfRadius = _ceil(r / 2); return [-r, -floorHalfRadius, -floorHalfRadius, -r, 0, -ceilHalfRadius, floorHalfRadius, -r, r, -floorHalfRadius, ceilHalfRadius, 0, r, floorHalfRadius, floorHalfRadius, r, 0, ceilHalfRadius, -floorHalfRadius, r, -r, floorHalfRadius, -ceilHalfRadius, 0] } function getTriangleDownMarkerCoords(radius) { return [-radius, -radius, radius, -radius, 0, radius, -radius, -radius] } function getTriangleUpMarkerCoords(radius) { return [-radius, radius, radius, radius, 0, -radius, -radius, radius] } module.exports = { deleteLabel: function() { this._label.dispose(); this._label = null }, _hasGraphic: function() { return this.graphic }, clearVisibility: function() { var that = this, graphic = that.graphic; if (graphic && graphic.attr("visibility")) { graphic.attr({ visibility: null }) } that._label.clearVisibility() }, isVisible: function() { return this.inVisibleArea && this.series.isVisible() }, setInvisibility: function() { var that = this, graphic = that.graphic; if (graphic && "hidden" !== graphic.attr("visibility")) { graphic.attr({ visibility: "hidden" }) } that._errorBar && that._errorBar.attr({ visibility: "hidden" }); that._label.hide() }, clearMarker: function() { var graphic = this.graphic; graphic && graphic.attr(this._emptySettings) }, _createLabel: function() { this._label = new labelModule.Label({ renderer: this.series._renderer, labelsGroup: this.series._labelsGroup, point: this }) }, _updateLabelData: function() { this._label.setData(this._getLabelFormatObject()) }, _updateLabelOptions: function() { !this._label && this._createLabel(); this._label.setOptions(this._options.label) }, _checkImage: function(image) { return _isDefined(image) && ("string" === typeof image || _isDefined(image.url)) }, _fillStyle: function() { this._styles = this._options.styles }, _checkSymbol: function(oldOptions, newOptions) { var oldSymbol = oldOptions.symbol, newSymbol = newOptions.symbol, symbolChanged = "circle" === oldSymbol && "circle" !== newSymbol || "circle" !== oldSymbol && "circle" === newSymbol, imageChanged = this._checkImage(oldOptions.image) !== this._checkImage(newOptions.image); return !!(symbolChanged || imageChanged) }, _populatePointShape: function(symbol, radius) { switch (symbol) { case "square": return getSquareMarkerCoords(radius); case "polygon": return getPolygonMarkerCoords(radius); case "triangle": case "triangleDown": return getTriangleDownMarkerCoords(radius); case "triangleUp": return getTriangleUpMarkerCoords(radius); case "cross": return getCrossMarkerCoords(radius) } }, correctValue: function(correction) { var that = this; if (that.hasValue()) { that.value = that.initialValue + correction; that.minValue = correction } }, resetCorrection: function() { this.value = this.initialValue; this.minValue = CANVAS_POSITION_DEFAULT }, resetValue: function() { var that = this; if (that.hasValue()) { that.value = that.initialValue = 0; that.minValue = 0; that._label.setDataField("value", that.value) } }, _getTranslates: function(animationEnabled) { var translateX = this.x, translateY = this.y; if (animationEnabled) { if (this._options.rotated) { translateX = this.defaultX } else { translateY = this.defaultY } } return { x: translateX, y: translateY } }, _createImageMarker: function(renderer, settings, options) { var width = options.width || DEFAULT_IMAGE_WIDTH, height = options.height || DEFAULT_IMAGE_HEIGHT; return renderer.image(-_round(.5 * width), -_round(.5 * height), width, height, options.url ? options.url.toString() : options.toString(), "center").attr({ translateX: settings.translateX, translateY: settings.translateY, visibility: settings.visibility }) }, _createSymbolMarker: function(renderer, pointSettings) { var marker, symbol = this._options.symbol; if ("circle" === symbol) { delete pointSettings.points; marker = renderer.circle().attr(pointSettings) } else { if ("square" === symbol || "polygon" === symbol || "triangle" === symbol || "triangleDown" === symbol || "triangleUp" === symbol || "cross" === symbol) { marker = renderer.path([], "area").attr(pointSettings).sharp() } } return marker }, _createMarker: function(renderer, group, image, settings) { var that = this, marker = that._checkImage(image) ? that._createImageMarker(renderer, settings, image) : that._createSymbolMarker(renderer, settings); if (marker) { marker.data({ "chart-data-point": that }).append(group) } return marker }, _getSymbolBBox: function(x, y, r) { return { x: x - r, y: y - r, width: 2 * r, height: 2 * r } }, _getImageBBox: function(x, y) { var image = this._options.image, width = image.width || DEFAULT_IMAGE_WIDTH, height = image.height || DEFAULT_IMAGE_HEIGHT; return { x: x - _round(width / 2), y: y - _round(height / 2), width: width, height: height } }, _getGraphicBBox: function() { var bBox, that = this, options = that._options, x = that.x, y = that.y; if (options.visible) { bBox = that._checkImage(options.image) ? that._getImageBBox(x, y) : that._getSymbolBBox(x, y, options.styles.normal.r) } else { bBox = { x: x, y: y, width: 0, height: 0 } } return bBox }, _isLabelInsidePoint: commonUtils.noop, _getShiftLabelCoords: function(label) { var coord = this._addLabelAlignmentAndOffset(label, this._getLabelCoords(label)); return this._checkLabelPosition(label, coord) }, _drawLabel: function() { var that = this, customVisibility = that._getCustomLabelVisibility(), label = that._label; if (that._showForZeroValues() && that.hasValue() && false !== customVisibility && (that.series.getLabelVisibility() || customVisibility)) { label.show() } else { label.hide() } }, correctLabelPosition: function(label) { var coord, that = this; if (!that._isLabelInsidePoint(label)) { coord = that._getShiftLabelCoords(label); label.setFigureToDrawConnector(that._getLabelConnector(label.pointPosition)); label.shift(_round(coord.x), _round(coord.y)) } }, _showForZeroValues: function() { return true }, _getLabelConnector: function(pointPosition) { var bBox = this._getGraphicBBox(pointPosition), w2 = bBox.width / 2, h2 = bBox.height / 2; return { x: bBox.x + w2, y: bBox.y + h2, r: this._options.visible ? Math.max(w2, h2) : 0 } }, _getPositionFromLocation: function() { return { x: this.x, y: this.y } }, _isPointInVisibleArea: function(visibleArea, graphicBBox) { return visibleArea.minX <= graphicBBox.x + graphicBBox.width && visibleArea.maxX >= graphicBBox.x && visibleArea.minY <= graphicBBox.y + graphicBBox.height && visibleArea.maxY >= graphicBBox.y }, _checkLabelPosition: function(label, coord) { var that = this, visibleArea = that._getVisibleArea(), labelBBox = label.getBoundingRect(), graphicBBox = that._getGraphicBBox(label.pointPosition), offset = LABEL_OFFSET; if (that._isPointInVisibleArea(visibleArea, graphicBBox)) { if (!that._options.rotated) { if (visibleArea.minX > coord.x) { coord.x = visibleArea.minX } if (visibleArea.maxX < coord.x + labelBBox.width) { coord.x = visibleArea.maxX - labelBBox.width } if (visibleArea.minY > coord.y) { coord.y = graphicBBox.y + graphicBBox.height + offset } if (visibleArea.maxY < coord.y + labelBBox.height) { coord.y = graphicBBox.y - labelBBox.height - offset } } else { if (visibleArea.minX > coord.x) { coord.x = graphicBBox.x + graphicBBox.width + offset } if (visibleArea.maxX < coord.x + labelBBox.width) { coord.x = graphicBBox.x - offset - labelBBox.width } if (visibleArea.minY > coord.y) { coord.y = visibleArea.minY } if (visibleArea.maxY < coord.y + labelBBox.height) { coord.y = visibleArea.maxY - labelBBox.height } } } return coord }, _addLabelAlignmentAndOffset: function(label, coord) { var labelBBox = label.getBoundingRect(), labelOptions = label.getLayoutOptions(); if (!this._options.rotated) { if ("left" === labelOptions.alignment) { coord.x += labelBBox.width / 2 } else { if ("right" === labelOptions.alignment) { coord.x -= labelBBox.width / 2 } } } coord.x += labelOptions.horizontalOffset; coord.y += labelOptions.verticalOffset; return coord }, _getLabelCoords: function(label) { return this._getLabelCoordOfPosition(label, this._getLabelPosition(label.pointPosition)) }, _getLabelCoordOfPosition: function(label, position) { var that = this, labelBBox = label.getBoundingRect(), graphicBBox = that._getGraphicBBox(label.pointPosition), offset = LABEL_OFFSET, centerY = graphicBBox.height / 2 - labelBBox.height / 2, centerX = graphicBBox.width / 2 - labelBBox.width / 2, x = graphicBBox.x, y = graphicBBox.y; switch (position) { case "left": x -= labelBBox.width + offset; y += centerY; break; case "right": x += graphicBBox.width + offset; y += centerY; break; case "top": x += centerX; y -= labelBBox.height + offset; break; case "bottom": x += centerX; y += graphicBBox.height + offset; break; case "inside": x += centerX; y += centerY } return { x: x, y: y } }, _drawMarker: function(renderer, group, animationEnabled) { var that = this, options = that._options, translates = that._getTranslates(animationEnabled), style = that._getStyle(); that.graphic = that._createMarker(renderer, group, options.image, _extend({ translateX: translates.x, translateY: translates.y, points: that._populatePointShape(options.symbol, style.r) }, style)) }, _getErrorBarSettings: function() { return { visibility: "visible" } }, _drawErrorBar: function(renderer, group) { if (!this._options.errorBars) { return } var settings, that = this, options = that._options, errorBarOptions = options.errorBars, points = [], pos = that._errorBarPos, high = that._highErrorCoord, low = that._lowErrorCoord, displayMode = _normalizeEnum(errorBarOptions.displayMode), isHighDisplayMode = "high" === displayMode, isLowDisplayMode = "low" === displayMode, edgeLength = _floor(parseInt(errorBarOptions.edgeLength) / 2), highErrorOnly = (isHighDisplayMode || !_isDefined(low)) && _isDefined(high) && !isLowDisplayMode, lowErrorOnly = (isLowDisplayMode || !_isDefined(high)) && _isDefined(low) && !isHighDisplayMode; highErrorOnly && (low = that._baseErrorBarPos); lowErrorOnly && (high = that._baseErrorBarPos); if ("none" !== displayMode && _isDefined(high) && _isDefined(low) && _isDefined(pos)) { !lowErrorOnly && points.push([pos - edgeLength, high, pos + edgeLength, high]); points.push([pos, high, pos, low]); !highErrorOnly && points.push([pos + edgeLength, low, pos - edgeLength, low]); options.rotated && $.each(points, function(_, p) { p.reverse() }); settings = that._getErrorBarSettings(errorBarOptions); if (!that._errorBar) { that._errorBar = renderer.path(points, "line").attr(settings).append(group) } else { settings.points = points; that._errorBar.attr(settings) } } else { that._errorBar && that._errorBar.attr({ visibility: "hidden" }) } }, getTooltipParams: function() { var that = this, graphic = that.graphic; return { x: that.x, y: that.y, offset: graphic ? graphic.getBBox().height / 2 : 0 } }, setPercentValue: function(total, fullStacked, leftHoleTotal, rightHoleTotal) { var that = this, valuePercent = that.value / total || 0, minValuePercent = that.minValue / total || 0, percent = valuePercent - minValuePercent; that._label.setDataField("percent", percent); that._label.setDataField("total", total); if (that.series.isFullStackedSeries() && that.hasValue()) { if (that.leftHole) { that.leftHole /= total - leftHoleTotal; that.minLeftHole /= total - leftHoleTotal } if (that.rightHole) { that.rightHole /= total - rightHoleTotal; that.minRightHole /= total - rightHoleTotal } that.value = valuePercent; that.minValue = !minValuePercent ? that.minValue : minValuePercent } }, _storeTrackerR: function() { var minTrackerSize, that = this, navigator = window.navigator, r = that._options.styles.normal.r; navigator = that.__debug_navigator || navigator; that.__debug_browserNavigator = navigator; minTrackerSize = "ontouchstart" in window || navigator.msPointerEnabled && navigator.msMaxTouchPoints || navigator.pointerEnabled && navigator.maxTouchPoints ? 20 : 6; that._options.trackerR = r < minTrackerSize ? minTrackerSize : r; return that._options.trackerR }, _translateErrorBars: function() { var that = this, options = that._options, rotated = options.rotated, errorBars = options.errorBars, translator = that._getValTranslator(); if (!errorBars) { return } _isDefined(that.lowError) && (that._lowErrorCoord = translator.translate(that.lowError)); _isDefined(that.highError) && (that._highErrorCoord = translator.translate(that.highError)); that._errorBarPos = _floor(rotated ? that.vy : that.vx); that._baseErrorBarPos = "stdDeviation" === errorBars.type ? that._lowErrorCoord + (that._highErrorCoord - that._lowErrorCoord) / 2 : rotated ? that.vx : that.vy }, _translate: function() { var that = this, valTranslator = that._getValTranslator(), argTranslator = that._getArgTranslator(); if (that._options.rotated) { that.vx = that.x = valTranslator.translate(that.value); that.vy = that.y = argTranslator.translate(that.argument); that.minX = valTranslator.translate(that.minValue); that.defaultX = valTranslator.translate(CANVAS_POSITION_DEFAULT) } else { that.vy = that.y = valTranslator.translate(that.value); that.vx = that.x = argTranslator.translate(that.argument); that.minY = valTranslator.translate(that.minValue); that.defaultY = valTranslator.translate(CANVAS_POSITION_DEFAULT) } that._translateErrorBars(); that._calculateVisibility(that.x, that.y) }, _updateData: function(data) { var that = this; that.value = that.initialValue = that.originalValue = data.value; that.minValue = that.initialMinValue = that.originalMinValue = _isDefined(data.minValue) ? data.minValue : CANVAS_POSITION_DEFAULT }, _getImageSettings: function(image) { return { href: image.url || image.toString(), width: image.width || DEFAULT_IMAGE_WIDTH, height: image.height || DEFAULT_IMAGE_HEIGHT } }, getCrosshairData: function() { var that = this, r = that._options.rotated, value = that.value, argument = that.argument; return { x: that.vx, y: that.vy, xValue: r ? value : argument, yValue: r ? argument : value, axis: that.series.axis } }, getPointRadius: function() { var extraSpace, style = this._getStyle(), options = this._options, r = style.r, symbol = options.symbol, isSquare = "square" === symbol, isTriangle = "triangle" === symbol || "triangleDown" === symbol || "triangleUp" === symbol; if (options.visible && !options.image && r) { extraSpace = style["stroke-width"] / 2; return (isSquare || isTriangle ? 1.4 * r : r) + extraSpace } return 0 }, _updateMarker: function(animationEnabled, style) { var settings, that = this, options = that._options, image = options.image, visibility = !that.isVisible() ? { visibility: "hidden" } : {}; if (that._checkImage(image)) { settings = _extend({}, { visibility: style.visibility }, visibility, that._getImageSettings(image)) } else { settings = _extend({}, style, visibility, { points: that._populatePointShape(options.symbol, style.r) }) } if (!animationEnabled) { settings.translateX = that.x; settings.translateY = that.y } that.graphic.attr(settings).sharp() }, _getLabelFormatObject: function() { var that = this; return { argument: that.initialArgument, value: that.initialValue, originalArgument: that.originalArgument, originalValue: that.originalValue, seriesName: that.series.name, lowErrorValue: that.lowError, highErrorValue: that.highError, point: that } }, _getLabelPosition: function() { var rotated = this._options.rotated; if (this.initialValue > 0) { return rotated ? "right" : "top" } else { return rotated ? "left" : "bottom" } }, _getFormatObject: function(tooltip) { var that = this, labelFormatObject = that._label.getData(); return _extend({}, labelFormatObject, { argumentText: tooltip.formatValue(that.initialArgument, "argument"), valueText: tooltip.formatValue(that.initialValue) }, _isDefined(labelFormatObject.percent) ? { percentText: tooltip.formatValue(labelFormatObject.percent, "percent") } : {}, _isDefined(labelFormatObject.total) ? { totalText: tooltip.formatValue(labelFormatObject.total) } : {}) }, _getMarkerVisibility: function() { return this._options.visible }, coordsIn: function(x, y) { var trackerRadius = this._storeTrackerR(); return x >= this.x - trackerRadius && x <= this.x + trackerRadius && y >= this.y - trackerRadius && y <= this.y + trackerRadius }, getMinValue: function() { var errorBarOptions = this._options.errorBars; if (errorBarOptions) { var displayMode = errorBarOptions.displayMode, lowValue = "high" === displayMode ? this.value : this.lowError, highValue = "low" === displayMode ? this.value : this.highError; return lowValue < highValue ? lowValue : highValue } else { return this.value } }, getMaxValue: function() { var errorBarOptions = this._options.errorBars; if (errorBarOptions) { var displayMode = errorBarOptions.displayMode, lowValue = "high" === displayMode ? this.value : this.lowError, highValue = "low" === displayMode ? this.value : this.highError; return lowValue > highValue ? lowValue : highValue } else { return this.value } } } }, /*!***************************************!*\ !*** ./js/viz/series/points/label.js ***! \***************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../../core/renderer */ 9), _format = __webpack_require__( /*! ../../core/format */ 530), vizUtils = __webpack_require__( /*! ../../core/utils */ 509), _degreesToRadians = vizUtils.degreesToRadians, _patchFontOptions = vizUtils.patchFontOptions, _math = Math, _round = _math.round, _floor = _math.floor, _getCosAndSin = vizUtils.getCosAndSin, _rotateBBox = vizUtils.rotateBBox, LABEL_BACKGROUND_PADDING_X = 8, LABEL_BACKGROUND_PADDING_Y = 4; function getClosestCoord(point, coords) { var closestCoord, closestDistance = 1 / 0; $.each(coords, function(_, coord) { var x = point[0] - coord[0], y = point[1] - coord[1], distance = x * x + y * y; if (distance < closestDistance) { closestDistance = distance; closestCoord = coord } }); return closestCoord } var barPointStrategy = { isLabelInside: function(labelPoint, figure) { return labelPoint.x >= figure.x && labelPoint.x <= figure.x + figure.width && labelPoint.y >= figure.y && labelPoint.y <= figure.y + figure.height }, prepareLabelPoints: function(points) { return points }, getFigureCenter: function(figure) { return [figure.x + figure.width / 2, figure.y + figure.height / 2] }, findFigurePoint: function(figure, labelPoint) { var figureCenter = barPointStrategy.getFigureCenter(figure), point = getClosestCoord(labelPoint, [ [figure.x, figureCenter[1]], [figureCenter[0], figure.y + figure.height], [figure.x + figure.width, figureCenter[1]], [figureCenter[0], figure.y] ]); return [_round(point[0]), _round(point[1])] } }; var symbolPointStrategy = { isLabelInside: function() { return false }, prepareLabelPoints: barPointStrategy.prepareLabelPoints, getFigureCenter: function(figure) { return [figure.x, figure.y] }, findFigurePoint: function(figure, labelPoint) { var angle = Math.atan2(figure.y - labelPoint[1], labelPoint[0] - figure.x); return [_round(figure.x + figure.r * Math.cos(angle)), _round(figure.y - figure.r * Math.sin(angle))] } }; var piePointStrategy = { isLabelInside: function(_0, _1, isOutside) { return !isOutside }, prepareLabelPoints: function(points, center, angle) { var rotatedPoints = [], x0 = center[0], y0 = center[1], cosSin = _getCosAndSin(angle || 0); $.each(points, function(_, point) { rotatedPoints.push([_round((point[0] - x0) * cosSin.cos + (point[1] - y0) * cosSin.sin + x0), _round(-(point[0] - x0) * cosSin.sin + (point[1] - y0) * cosSin.cos + y0)]) }); return rotatedPoints }, getFigureCenter: symbolPointStrategy.getFigureCenter, findFigurePoint: function(figure, labelPoint) { var x = figure.x + (figure.y - labelPoint[1]) / Math.tan(_degreesToRadians(figure.angle)), point = [figure.x, figure.y]; if (figure.x <= x && x <= labelPoint[0] || figure.x >= x && x >= labelPoint[0]) { point.push(_round(x), labelPoint[1]) } return point } }; function selectStrategy(figure) { return void 0 !== figure.angle && piePointStrategy || void 0 !== figure.r && symbolPointStrategy || barPointStrategy } function disposeItem(obj, field) { obj[field] && obj[field].dispose(); obj[field] = null } function checkBackground(background) { return background && (background.fill && "none" !== background.fill || background["stroke-width"] > 0 && background.stroke && "none" !== background.stroke) } function checkConnector(connector) { return connector && connector["stroke-width"] > 0 && connector.stroke && "none" !== connector.stroke } function formatText(data, options) { data.valueText = _format(data.value, options); data.argumentText = _format(data.argument, { format: options.argumentFormat, precision: options.argumentPrecision }); if (void 0 !== data.percent) { data.percentText = _format(data.percent, { format: { type: "percent", precision: options.format && options.format.percentPrecision || options.percentPrecision } }) } if (void 0 !== data.total) { data.totalText = _format(data.total, options) } if (void 0 !== data.openValue) { data.openValueText = _format(data.openValue, options) } if (void 0 !== data.closeValue) { data.closeValueText = _format(data.closeValue, options) } if (void 0 !== data.lowValue) { data.lowValueText = _format(data.lowValue, options) } if (void 0 !== data.highValue) { data.highValueText = _format(data.highValue, options) } if (void 0 !== data.reductionValue) { data.reductionValueText = _format(data.reductionValue, options) } return options.customizeText ? options.customizeText.call(data, data) : data.valueText } function Label(renderSettings) { this._renderer = renderSettings.renderer; this._container = renderSettings.labelsGroup; this._point = renderSettings.point } Label.prototype = { constructor: Label, _setVisibility: function(value, state) { this._group && this._group.attr({ visibility: value }); this._visible = state }, clearVisibility: function() { this._setVisibility(null, true) }, hide: function() { this._setVisibility("hidden", false) }, show: function() { var that = this; if (that._point.hasValue()) { that._draw(); that._point.correctLabelPosition(that) } }, isVisible: function() { return this._visible }, setColor: function(color) { this._color = color }, setOptions: function(options) { this._options = options }, setData: function(data) { this._data = data }, setDataField: function(fieldName, fieldValue) { this._data = this._data || {}; this._data[fieldName] = fieldValue }, getData: function() { return this._data }, setFigureToDrawConnector: function(figure) { this._figure = figure }, dispose: function() { var that = this; disposeItem(that, "_group"); that._data = that._options = that._textContent = that._visible = that._insideGroup = that._text = that._background = that._connector = that._figure = null }, _draw: function() { var that = this, renderer = that._renderer, container = that._container, options = that._options || {}, text = that._textContent = formatText(that._data, that._options) || null; that.clearVisibility(); if (text) { if (!that._group) { that._group = renderer.g().append(container); that._insideGroup = renderer.g().append(that._group); that._text = renderer.text("", 0, 0).append(that._insideGroup) } that._text.css(options.attributes ? _patchFontOptions(options.attributes.font) : {}); if (checkBackground(options.background)) { that._background = that._background || renderer.rect().append(that._insideGroup).toBackground(); that._background.attr(options.background); that._color && that._background.attr({ fill: that._color }) } else { disposeItem(that, "_background") } if (checkConnector(options.connector)) { that._connector = that._connector || renderer.path([], "line").sharp().append(that._group).toBackground(); that._connector.attr(options.connector); that._color && that._connector.attr({ stroke: that._color }) } else { disposeItem(that, "_connector") } that._text.attr({ text: text }); that._updateBackground(that._text.getBBox()); that._setVisibility("visible", true) } else { that.hide() } return that }, _updateBackground: function(bBox) { var that = this; that._textSize = [bBox.width, bBox.height]; if (that._background) { bBox.x -= LABEL_BACKGROUND_PADDING_X; bBox.y -= LABEL_BACKGROUND_PADDING_Y; bBox.width += 2 * LABEL_BACKGROUND_PADDING_X; bBox.height += 2 * LABEL_BACKGROUND_PADDING_Y; that._background.attr(bBox) } if (that._options.rotationAngle) { that._insideGroup.rotate(that._options.rotationAngle, bBox.x + bBox.width / 2, bBox.y + bBox.height / 2); bBox = _rotateBBox(bBox, [bBox.x + bBox.width / 2, bBox.y + bBox.height / 2], -that._options.rotationAngle) } that._bBox = bBox }, _getConnectorPoints: function() { var labelPoint, figurePoint, xc, yc, that = this, figure = that._figure, strategy = selectStrategy(figure), bBox = that.getBoundingRect(), points = []; if (!strategy.isLabelInside(bBox, figure, "inside" !== that._options.position)) { xc = bBox.x + bBox.width / 2; yc = bBox.y + bBox.height / 2; points = strategy.prepareLabelPoints([ [xc, yc - that._textSize[1] / 2], [xc + that._textSize[0] / 2, yc], [xc, yc + that._textSize[1] / 2], [xc - that._textSize[0] / 2, yc] ], [xc, yc], -that._options.rotationAngle || 0); labelPoint = getClosestCoord(strategy.getFigureCenter(figure), points); labelPoint = [_floor(labelPoint[0]), _floor(labelPoint[1])]; figurePoint = strategy.findFigurePoint(figure, labelPoint); points = figurePoint.concat(labelPoint) } return points }, fit: function(maxWidth) { this._text && this._text.applyEllipsis(maxWidth); this._updateBackground(this._text.getBBox()) }, setTrackerData: function(point) { this._text.data({ "chart-data-point": point }); this._background && this._background.data({ "chart-data-point": point }) }, shift: function(x, y) { var that = this; if (that._textContent) { that._insideGroup.attr({ translateX: that._x = _round(x - that._bBox.x), translateY: that._y = _round(y - that._bBox.y) }); if (that._connector) { that._connector.attr({ points: that._getConnectorPoints() }) } } return that }, getBoundingRect: function() { var bBox = this._bBox; return this._textContent ? { x: bBox.x + this._x, y: bBox.y + this._y, width: bBox.width, height: bBox.height } : {} }, getLayoutOptions: function() { var options = this._options; return { alignment: options.alignment, background: checkBackground(options.background), horizontalOffset: options.horizontalOffset, verticalOffset: options.verticalOffset, radialOffset: options.radialOffset, position: options.position } } }; exports.Label = Label; Label._DEBUG_formatText = formatText }, /*!*******************************!*\ !*** ./js/viz/core/format.js ***! \*******************************/ function(module, exports, __webpack_require__) { var _format = __webpack_require__( /*! ../../format_helper */ 66).format; module.exports = function(value, options) { return _format(value, options.format, options.precision) } }, /*!*******************************************!*\ !*** ./js/viz/series/points/bar_point.js ***! \*******************************************/ function(module, exports, __webpack_require__) { var extend = __webpack_require__( /*! ../../../core/utils/extend */ 11).extend, _extend = extend, _math = Math, _floor = _math.floor, _abs = _math.abs, _min = _math.min, symbolPoint = __webpack_require__( /*! ./symbol_point */ 528), CANVAS_POSITION_DEFAULT = "canvas_position_default", DEFAULT_BAR_TRACKER_SIZE = 9, CORRECTING_BAR_TRACKER_VALUE = 4, RIGHT = "right", LEFT = "left", TOP = "top", BOTTOM = "bottom"; module.exports = _extend({}, symbolPoint, { correctCoordinates: function(correctOptions) { var that = this, correction = _floor(correctOptions.offset - correctOptions.width / 2); if (that._options.rotated) { that.height = correctOptions.width; that.yCorrection = correction } else { that.width = correctOptions.width; that.xCorrection = correction } }, _getGraphicBBox: function() { var that = this, bBox = {}; bBox.x = that.x; bBox.y = that.y; bBox.width = that.width; bBox.height = that.height; return bBox }, _getLabelConnector: function(location) { return this._getGraphicBBox(location) }, _getLabelPosition: function() { var position, that = this, initialValue = that.initialValue, invert = that._getValTranslator().getBusinessRange().invert, isDiscreteValue = "discrete" === that.series.valueAxisType, isFullStacked = that.series.isFullStackedSeries(), notAxisInverted = !isDiscreteValue && (initialValue >= 0 && !invert || initialValue < 0 && invert) || isDiscreteValue && !invert || isFullStacked; if (!that._options.rotated) { position = notAxisInverted ? TOP : BOTTOM } else { position = notAxisInverted ? RIGHT : LEFT } return position }, _getLabelCoords: function(label) { var coords, that = this; if (0 === that.initialValue && that.series.isFullStackedSeries()) { if (!this._options.rotated) { coords = that._getLabelCoordOfPosition(label, TOP) } else { coords = that._getLabelCoordOfPosition(label, RIGHT) } } else { if ("inside" === label.getLayoutOptions().position) { coords = that._getLabelCoordOfPosition(label, "inside") } else { coords = symbolPoint._getLabelCoords.call(this, label) } } return coords }, _checkLabelPosition: function(label, coord) { var that = this, visibleArea = that._getVisibleArea(); if (that._isPointInVisibleArea(visibleArea, that._getGraphicBBox())) { return that._moveLabelOnCanvas(coord, visibleArea, label.getBoundingRect()) } return coord }, _isLabelInsidePoint: function(label) { var that = this, graphicBBox = that._getGraphicBBox(), labelBBox = label.getBoundingRect(); if (that._options.resolveLabelsOverlapping && "inside" === label.getLayoutOptions().position) { if (labelBBox.width > graphicBBox.width || labelBBox.height > graphicBBox.height) { label.hide(); return true } } return false }, _moveLabelOnCanvas: function(coord, visibleArea, labelBBox) { var x = coord.x, y = coord.y; if (visibleArea.minX > x) { x = visibleArea.minX } if (visibleArea.maxX < x + labelBBox.width) { x = visibleArea.maxX - labelBBox.width } if (visibleArea.minY > y) { y = visibleArea.minY } if (visibleArea.maxY < y + labelBBox.height) { y = visibleArea.maxY - labelBBox.height } return { x: x, y: y } }, _showForZeroValues: function() { return this._options.label.showForZeroValues || this.initialValue }, _drawMarker: function(renderer, group, animationEnabled) { var that = this, style = that._getStyle(), x = that.x, y = that.y, width = that.width, height = that.height, r = that._options.cornerRadius; if (animationEnabled) { if (that._options.rotated) { width = 0; x = that.defaultX } else { height = 0; y = that.defaultY } } that.graphic = renderer.rect(x, y, width, height).attr({ rx: r, ry: r }).smartAttr(style).data({ "chart-data-point": that }).append(group) }, _getSettingsForTracker: function() { var that = this, y = that.y, height = that.height, x = that.x, width = that.width; if (that._options.rotated) { if (1 === width) { width = DEFAULT_BAR_TRACKER_SIZE; x -= CORRECTING_BAR_TRACKER_VALUE } } else { if (1 === height) { height = DEFAULT_BAR_TRACKER_SIZE; y -= CORRECTING_BAR_TRACKER_VALUE } } return { x: x, y: y, width: width, height: height } }, getGraphicSettings: function() { var graphic = this.graphic; return { x: graphic.attr("x"), y: graphic.attr("y"), height: graphic.attr("height"), width: graphic.attr("width") } }, _getEdgeTooltipParams: function(x, y, width, height) { var xCoord, yCoord, isPositive = this.value >= 0, invertedBusinessRange = this._getValTranslator().getBusinessRange().invert; if (this._options.rotated) { yCoord = y + height / 2; if (invertedBusinessRange) { xCoord = isPositive ? x : x + width } else { xCoord = isPositive ? x + width : x } } else { xCoord = x + width / 2; if (invertedBusinessRange) { yCoord = isPositive ? y + height : y } else { yCoord = isPositive ? y : y + height } } return { x: xCoord, y: yCoord, offset: 0 } }, getTooltipParams: function(location) { var x = this.x, y = this.y, width = this.width, height = this.height; return "edge" === location ? this._getEdgeTooltipParams(x, y, width, height) : { x: x + width / 2, y: y + height / 2, offset: 0 } }, _truncateCoord: function(coord, minBounce, maxBounce) { if (coord < minBounce) { return minBounce } if (coord > maxBounce) { return maxBounce } return coord }, _translateErrorBars: function(argVisibleArea) { symbolPoint._translateErrorBars.call(this); if (this._errorBarPos < argVisibleArea.min || this._errorBarPos > argVisibleArea.max) { this._errorBarPos = void 0 } }, _translate: function() { var arg, minArg, val, minVal, that = this, rotated = that._options.rotated, valAxis = rotated ? "x" : "y", argAxis = rotated ? "y" : "x", valIntervalName = rotated ? "width" : "height", argIntervalName = rotated ? "height" : "width", argTranslator = that._getArgTranslator(), valTranslator = that._getValTranslator(), argVisibleArea = argTranslator.getCanvasVisibleArea(), valVisibleArea = valTranslator.getCanvasVisibleArea(); arg = minArg = argTranslator.translate(that.argument) + (that[argAxis + "Correction"] || 0); val = valTranslator.translate(that.value); minVal = valTranslator.translate(that.minValue); if (null === val) { val = minVal } that["v" + valAxis] = val; that["v" + argAxis] = arg + that[argIntervalName] / 2; that[valIntervalName] = _abs(val - minVal); that._calculateVisibility(rotated ? _min(val, minVal) : _min(arg, minArg), rotated ? _min(arg, minArg) : _min(val, minVal), that.width, that.height); val = that._truncateCoord(val, valVisibleArea.min, valVisibleArea.max); minVal = that._truncateCoord(minVal, valVisibleArea.min, valVisibleArea.max); that[argAxis] = arg; that["min" + argAxis.toUpperCase()] = minArg; that[valIntervalName] = _abs(val - minVal); that[valAxis] = _min(val, minVal) + (that[valAxis + "Correction"] || 0); that["min" + valAxis.toUpperCase()] = minVal + (that[valAxis + "Correction"] || 0); that["default" + valAxis.toUpperCase()] = valTranslator.translate(CANVAS_POSITION_DEFAULT); that._translateErrorBars(argVisibleArea); if (that.inVisibleArea) { if (that[argAxis] < argVisibleArea.min) { that[argIntervalName] = that[argIntervalName] - (argVisibleArea.min - that[argAxis]); that[argAxis] = argVisibleArea.min; that["min" + argAxis.toUpperCase()] = argVisibleArea.min } if (that[argAxis] + that[argIntervalName] > argVisibleArea.max) { that[argIntervalName] = argVisibleArea.max - that[argAxis] } } }, _updateMarker: function(animationEnabled, style) { this.graphic.smartAttr(_extend({}, style, !animationEnabled ? this.getMarkerCoords() : {})) }, getMarkerCoords: function() { return { x: this.x, y: this.y, width: this.width, height: this.height } }, coordsIn: function(x, y) { var that = this; return x >= that.x && x <= that.x + that.width && y >= that.y && y <= that.y + that.height } }) }, /*!**********************************************!*\ !*** ./js/viz/series/points/bubble_point.js ***! \**********************************************/ function(module, exports, __webpack_require__) { var extend = __webpack_require__( /*! ../../../core/utils/extend */ 11).extend, symbolPoint = __webpack_require__( /*! ./symbol_point */ 528), _extend = extend, MIN_BUBBLE_HEIGHT = 20; module.exports = _extend({}, symbolPoint, { correctCoordinates: function(diameter) { this.bubbleSize = diameter / 2 }, _drawMarker: function(renderer, group, animationEnabled) { var that = this, attr = _extend({ translateX: that.x, translateY: that.y }, that._getStyle()); that.graphic = renderer.circle(0, 0, animationEnabled ? 0 : that.bubbleSize).smartAttr(attr).data({ "chart-data-point": that }).append(group) }, getTooltipParams: function(location) { var height, that = this, graphic = that.graphic; if (!graphic) { return } height = graphic.getBBox().height; return { x: that.x, y: height < MIN_BUBBLE_HEIGHT || "edge" === location ? this.y - height / 2 : this.y, offset: 0 } }, _getLabelFormatObject: function() { var formatObject = symbolPoint._getLabelFormatObject.call(this); formatObject.size = this.initialSize; return formatObject }, _updateData: function(data) { symbolPoint._updateData.call(this, data); this.size = this.initialSize = data.size }, _getGraphicBBox: function() { var that = this; return that._getSymbolBBox(that.x, that.y, that.bubbleSize) }, _updateMarker: function(animationEnabled, style) { var that = this; if (!animationEnabled) { style = _extend({ r: that.bubbleSize, translateX: that.x, translateY: that.y }, style) } that.graphic.smartAttr(style) }, _getFormatObject: function(tooltip) { var formatObject = symbolPoint._getFormatObject.call(this, tooltip); formatObject.sizeText = tooltip.formatValue(this.initialSize); return formatObject }, _storeTrackerR: function() { return this.bubbleSize }, _getLabelCoords: function(label) { var coords; if ("inside" === label.getLayoutOptions().position) { coords = this._getLabelCoordOfPosition(label, "inside") } else { coords = symbolPoint._getLabelCoords.call(this, label) } return coords } }) }, /*!*******************************************!*\ !*** ./js/viz/series/points/pie_point.js ***! \*******************************************/ function(module, exports, __webpack_require__) { var extend = __webpack_require__( /*! ../../../core/utils/extend */ 11).extend, CONNECTOR_LENGTH = 20, symbolPoint = __webpack_require__( /*! ./symbol_point */ 528), _extend = extend, _round = Math.round, _sqrt = Math.sqrt, _acos = Math.acos, DEG = 180 / Math.PI, _abs = Math.abs, vizUtils = __webpack_require__( /*! ../../core/utils */ 509), _normalizeAngle = vizUtils.normalizeAngle, _getCosAndSin = vizUtils.getCosAndSin, commonUtils = __webpack_require__( /*! ../../../core/utils/common */ 14), _isDefined = commonUtils.isDefined, getVerticallyShiftedAngularCoords = vizUtils.getVerticallyShiftedAngularCoords, INDENT_FROM_PIE = __webpack_require__( /*! ../../components/consts */ 527).pieLabelIndent; module.exports = _extend({}, symbolPoint, { _updateData: function(data) { var that = this; symbolPoint._updateData.call(this, data); that._visible = true; that.minValue = that.initialMinValue = that.originalMinValue = _isDefined(data.minValue) ? data.minValue : 0 }, animate: function(complete, duration, delay) { var that = this; that.graphic.animate({ x: that.centerX, y: that.centerY, outerRadius: that.radiusOuter, innerRadius: that.radiusInner, startAngle: that.toAngle, endAngle: that.fromAngle }, { delay: delay, partitionDuration: duration }, complete) }, correctPosition: function(correction) { var that = this; that.correctRadius(correction); that.correctLabelRadius(correction.radiusOuter); that.centerX = correction.centerX; that.centerY = correction.centerY }, correctRadius: function(correction) { this.radiusInner = correction.radiusInner; this.radiusOuter = correction.radiusOuter }, correctLabelRadius: function(radiusLabels) { this.radiusLabels = radiusLabels }, correctValue: function(correction, percent, base) { var that = this; that.value = (base || that.initialValue) + correction; that.minValue = correction; that.percent = percent; that._label.setDataField("percent", percent) }, setMaxLabelLength: function(maxLabelLength) { this._maxLabelLength = maxLabelLength }, _updateLabelData: function() { this._label.setData(this._getLabelFormatObject()) }, _getShiftLabelCoords: function() { var that = this, bBox = that._label.getBoundingRect(), coord = that._getLabelCoords(that._label), visibleArea = that._getVisibleArea(); if (that._isLabelDrawingWithoutPoints) { return that._checkLabelPosition(coord, bBox, visibleArea) } else { return that._getLabelExtraCoord(coord, that._checkVerticalLabelPosition(coord, bBox, visibleArea), bBox) } }, _getLabelPosition: function(options) { return options.position }, _getLabelCoords: function(label) { var rad, x, that = this, bBox = label.getBoundingRect(), options = label.getLayoutOptions(), angleFunctions = _getCosAndSin(that.middleAngle), position = that._getLabelPosition(options), radiusInner = that.radiusInner, radiusOuter = that.radiusOuter, radiusLabels = that.radiusLabels; if ("inside" === position) { rad = radiusInner + (radiusOuter - radiusInner) / 2 + options.radialOffset; x = that.centerX + rad * angleFunctions.cos - bBox.width / 2 } else { rad = radiusLabels + options.radialOffset + INDENT_FROM_PIE; if (angleFunctions.cos > .1) { x = that.centerX + rad * angleFunctions.cos } else { if (angleFunctions.cos < -.1) { x = that.centerX + rad * angleFunctions.cos - bBox.width } else { x = that.centerX + rad * angleFunctions.cos - bBox.width / 2 } } } return { x: x, y: _round(that.centerY - rad * angleFunctions.sin - bBox.height / 2) } }, _getColumnsCoord: function(coord) { var x, that = this, label = that._label, bBox = label.getBoundingRect(), options = label.getLayoutOptions(), rad = that.radiusLabels + options.radialOffset, visibleArea = that._getVisibleArea(), rightBorderX = visibleArea.maxX - bBox.width, leftBorderX = visibleArea.minX, angleOfPoint = _normalizeAngle(that.middleAngle); if ("columns" !== options.position) { return coord } rad += CONNECTOR_LENGTH; if (angleOfPoint < 90 || angleOfPoint >= 270) { x = that._maxLabelLength ? that.centerX + rad + that._maxLabelLength - bBox.width : rightBorderX; x = x > rightBorderX ? rightBorderX : x } else { x = that._maxLabelLength ? that.centerX - rad - that._maxLabelLength : leftBorderX; x = x < leftBorderX ? leftBorderX : x } coord.x = x; return coord }, drawLabel: function() { this.translate(); this._isLabelDrawingWithoutPoints = true; this._drawLabel(); this._isLabelDrawingWithoutPoints = false }, updateLabelCoord: function() { var that = this, bBox = that._label.getBoundingRect(), coord = that._getColumnsCoord(bBox); coord = that._checkHorizontalLabelPosition(coord, bBox, that._getVisibleArea()); that._label.shift(_round(coord.x), _round(bBox.y)) }, _checkVerticalLabelPosition: function(coord, box, visibleArea) { var x = coord.x, y = coord.y; if (coord.y + box.height > visibleArea.maxY) { y = visibleArea.maxY - box.height } else { if (coord.y < visibleArea.minY) { y = visibleArea.minY } } return { x: x, y: y } }, _getLabelExtraCoord: function(coord, shiftCoord, box) { return coord.y !== shiftCoord.y ? getVerticallyShiftedAngularCoords({ x: coord.x, y: coord.y, width: box.width, height: box.height }, shiftCoord.y - coord.y, { x: this.centerX, y: this.centerY }) : coord }, _checkHorizontalLabelPosition: function(coord, box, visibleArea) { var x = coord.x, y = coord.y; if (coord.x + box.width > visibleArea.maxX) { x = visibleArea.maxX - box.width } else { if (coord.x < visibleArea.minX) { x = visibleArea.minX } } return { x: x, y: y } }, setLabelEllipsis: function() { var that = this, bBox = that._label.getBoundingRect(), coord = that._checkHorizontalLabelPosition(bBox, bBox, that._getVisibleArea()); that._label.fit(bBox.width - _abs(coord.x - bBox.x)) }, setLabelTrackerData: function() { this._label.setTrackerData(this) }, _checkLabelPosition: function(coord, bBox, visibleArea) { coord = this._checkHorizontalLabelPosition(coord, bBox, visibleArea); return this._checkVerticalLabelPosition(coord, bBox, visibleArea) }, _getLabelConnector: function() { var that = this, rad = that.radiusOuter, seriesStyle = that._options.styles.normal, strokeWidthBy2 = seriesStyle["stroke-width"] / 2, borderWidth = that.series.getOptions().containerBackgroundColor === seriesStyle.stroke ? _round(strokeWidthBy2) : _round(-strokeWidthBy2), angleFunctions = _getCosAndSin(_round(that.middleAngle)); return { x: _round(that.centerX + (rad - borderWidth) * angleFunctions.cos), y: _round(that.centerY - (rad - borderWidth) * angleFunctions.sin), angle: that.middleAngle } }, _drawMarker: function(renderer, group, animationEnabled, firstDrawing) { var that = this, radiusOuter = that.radiusOuter, radiusInner = that.radiusInner, fromAngle = that.fromAngle, toAngle = that.toAngle; if (animationEnabled) { radiusInner = radiusOuter = 0; if (!firstDrawing) { fromAngle = toAngle = that.shiftedAngle } } that.graphic = renderer.arc(that.centerX, that.centerY, radiusInner, radiusOuter, toAngle, fromAngle).attr({ "stroke-linejoin": "round" }).smartAttr(that._getStyle()).data({ "chart-data-point": that }).sharp().append(group) }, getTooltipParams: function() { var that = this, angleFunctions = _getCosAndSin(that.middleAngle), radiusInner = that.radiusInner, radiusOuter = that.radiusOuter; return { x: that.centerX + (radiusInner + (radiusOuter - radiusInner) / 2) * angleFunctions.cos, y: that.centerY - (radiusInner + (radiusOuter - radiusInner) / 2) * angleFunctions.sin, offset: 0 } }, _translate: function() { var that = this, angle = that.shiftedAngle || 0, value = that.value, minValue = that.minValue, translator = that._getValTranslator(); that.fromAngle = translator.translate(minValue) + angle; that.toAngle = translator.translate(value) + angle; that.middleAngle = translator.translate((value - minValue) / 2 + minValue) + angle; if (!that.isVisible()) { that.middleAngle = that.toAngle = that.fromAngle = that.fromAngle || angle } }, _getMarkerVisibility: function() { return true }, _updateMarker: function(animationEnabled, style, _, callback) { var that = this; if (!animationEnabled) { style = _extend({ x: that.centerX, y: that.centerY, outerRadius: that.radiusOuter, innerRadius: that.radiusInner, startAngle: that.toAngle, endAngle: that.fromAngle }, style) } that.graphic.smartAttr(style).sharp(); callback && callback() }, getLegendStyles: function() { return this._styles.legendStyles }, isInVisibleArea: function() { return true }, hide: function() { var that = this; if (that._visible) { that._visible = false; that.hideTooltip(); that._options.visibilityChanged(that) } }, show: function() { var that = this; if (!that._visible) { that._visible = true; that._options.visibilityChanged(that) } }, setInvisibility: function() { this._label.hide() }, isVisible: function() { return this._visible }, _getFormatObject: function(tooltip) { var formatObject = symbolPoint._getFormatObject.call(this, tooltip), percent = this.percent; formatObject.percent = percent; formatObject.percentText = tooltip.formatValue(percent, "percent"); return formatObject }, getColor: function() { return this._styles.normal.fill }, coordsIn: function(x, y) { var angle, that = this, lx = x - that.centerX, ly = y - that.centerY, r = _sqrt(lx * lx + ly * ly), fromAngle = that.fromAngle % 360, toAngle = that.toAngle % 360; if (r < that.radiusInner || r > that.radiusOuter || 0 === r) { return false } angle = _acos(lx / r) * DEG * (ly > 0 ? -1 : 1); if (angle < 0) { angle += 360 } if (fromAngle === toAngle && _abs(that.toAngle - that.fromAngle) > 1e-4) { return true } else { return fromAngle >= toAngle ? angle <= fromAngle && angle >= toAngle : !(angle >= fromAngle && angle <= toAngle) } } }) }, /*!****************************************************!*\ !*** ./js/viz/series/points/range_symbol_point.js ***! \****************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../../core/renderer */ 9), extend = __webpack_require__( /*! ../../../core/utils/extend */ 11).extend, commonUtils = __webpack_require__( /*! ../../../core/utils/common */ 14), labelModule = __webpack_require__( /*! ./label */ 529), symbolPoint = __webpack_require__( /*! ./symbol_point */ 528), _extend = extend, _isDefined = commonUtils.isDefined, _math = Math, _abs = _math.abs, _min = _math.min, _max = _math.max, _round = _math.round, DEFAULT_IMAGE_WIDTH = 20, DEFAULT_IMAGE_HEIGHT = 20; module.exports = _extend({}, symbolPoint, { deleteLabel: function() { var that = this; that._topLabel.dispose(); that._topLabel = null; that._bottomLabel.dispose(); that._bottomLabel = null }, hideMarker: function(type) { var graphic = this.graphic, marker = graphic && graphic[type + "Marker"], label = this["_" + type + "Label"]; if (marker && "hidden" !== marker.attr("visibility")) { marker.attr({ visibility: "hidden" }) } label.hide() }, setInvisibility: function() { this.hideMarker("top"); this.hideMarker("bottom") }, clearVisibility: function() { var that = this, graphic = that.graphic, topMarker = graphic && graphic.topMarker, bottomMarker = graphic && graphic.bottomMarker; if (topMarker && topMarker.attr("visibility")) { topMarker.attr({ visibility: null }) } if (bottomMarker && bottomMarker.attr("visibility")) { bottomMarker.attr({ visibility: null }) } that._topLabel.clearVisibility(); that._bottomLabel.clearVisibility() }, clearMarker: function() { var that = this, graphic = that.graphic, topMarker = graphic && graphic.topMarker, bottomMarker = graphic && graphic.bottomMarker, emptySettings = that._emptySettings; topMarker && topMarker.attr(emptySettings); bottomMarker && bottomMarker.attr(emptySettings) }, _getLabelPosition: function(markerType) { var position, labelsInside = "inside" === this._options.label.position; if (!this._options.rotated) { position = "top" === markerType ^ labelsInside ? "top" : "bottom" } else { position = "top" === markerType ^ labelsInside ? "right" : "left" } return position }, _getLabelMinFormatObject: function() { var that = this; return { index: 0, argument: that.initialArgument, value: that.initialMinValue, seriesName: that.series.name, originalValue: that.originalMinValue, originalArgument: that.originalArgument, point: that } }, _updateLabelData: function() { var maxFormatObject = this._getLabelFormatObject(); maxFormatObject.index = 1; this._topLabel.setData(maxFormatObject); this._bottomLabel.setData(this._getLabelMinFormatObject()) }, _updateLabelOptions: function() { var that = this, options = this._options.label; (!that._topLabel || !that._bottomLabel) && that._createLabel(); that._topLabel.setOptions(options); that._bottomLabel.setOptions(options) }, _createLabel: function() { var options = { renderer: this.series._renderer, labelsGroup: this.series._labelsGroup, point: this }; this._topLabel = new labelModule.Label(options); this._bottomLabel = new labelModule.Label(options) }, _getGraphicBBox: function(location) { var bBox, options = this._options, images = this._getImage(options.image), image = "top" === location ? this._checkImage(images.top) : this._checkImage(images.bottom), coord = this._getPositionFromLocation(location); if (options.visible) { bBox = image ? this._getImageBBox(coord.x, coord.y) : this._getSymbolBBox(coord.x, coord.y, options.styles.normal.r) } else { bBox = { x: coord.x, y: coord.y, width: 0, height: 0 } } return bBox }, _getPositionFromLocation: function(location) { var x, y, isTop = "top" === location; if (!this._options.rotated) { x = this.x; y = isTop ? _min(this.y, this.minY) : _max(this.y, this.minY) } else { x = isTop ? _max(this.x, this.minX) : _min(this.x, this.minX); y = this.y } return { x: x, y: y } }, _checkOverlay: function(bottomCoord, topCoord, topValue) { return bottomCoord < topCoord + topValue }, _getOverlayCorrections: function(topCoords, bottomCoords) { var rotated = this._options.rotated, coordSelector = !rotated ? "y" : "x", valueSelector = !rotated ? "height" : "width", visibleArea = this._getValTranslator().getCanvasVisibleArea(), minBound = visibleArea.min, maxBound = visibleArea.max, delta = _round((topCoords[coordSelector] + topCoords[valueSelector] - bottomCoords[coordSelector]) / 2), coord1 = topCoords[coordSelector] - delta, coord2 = bottomCoords[coordSelector] + delta; if (coord1 < minBound) { delta = minBound - topCoords[coordSelector]; coord1 += delta; coord2 += delta } else { if (coord2 + bottomCoords[valueSelector] > maxBound) { delta = -(bottomCoords[coordSelector] + bottomCoords[valueSelector] - maxBound); coord1 += delta; coord2 += delta } } return { coord1: coord1, coord2: coord2 } }, _checkLabelsOverlay: function(topLocation) { var that = this, topCoords = that._topLabel.getBoundingRect(), bottomCoords = that._bottomLabel.getBoundingRect(), corrections = {}; if (!that._options.rotated) { if ("top" === topLocation) { if (this._checkOverlay(bottomCoords.y, topCoords.y, topCoords.height)) { corrections = this._getOverlayCorrections(topCoords, bottomCoords); that._topLabel.shift(topCoords.x, corrections.coord1); that._bottomLabel.shift(bottomCoords.x, corrections.coord2) } } else { if (this._checkOverlay(topCoords.y, bottomCoords.y, bottomCoords.height)) { corrections = this._getOverlayCorrections(bottomCoords, topCoords); that._topLabel.shift(topCoords.x, corrections.coord2); that._bottomLabel.shift(bottomCoords.x, corrections.coord1) } } } else { if ("top" === topLocation) { if (this._checkOverlay(topCoords.x, bottomCoords.x, bottomCoords.width)) { corrections = this._getOverlayCorrections(bottomCoords, topCoords); that._topLabel.shift(corrections.coord2, topCoords.y); that._bottomLabel.shift(corrections.coord1, bottomCoords.y) } } else { if (this._checkOverlay(bottomCoords.x, topCoords.x, topCoords.width)) { corrections = this._getOverlayCorrections(topCoords, bottomCoords); that._topLabel.shift(corrections.coord1, topCoords.y); that._bottomLabel.shift(corrections.coord2, bottomCoords.y) } } } }, _drawLabel: function() { var that = this, labels = [], notInverted = that._options.rotated ? that.x >= that.minX : that.y < that.minY, customVisibility = that._getCustomLabelVisibility(), topLabel = that._topLabel, bottomLabel = that._bottomLabel; topLabel.pointPosition = notInverted ? "top" : "bottom"; bottomLabel.pointPosition = notInverted ? "bottom" : "top"; if ((that.series.getLabelVisibility() || customVisibility) && that.hasValue() && false !== customVisibility) { false !== that.visibleTopMarker && labels.push(topLabel); false !== that.visibleBottomMarker && labels.push(bottomLabel); $.each(labels, function(_, label) { label.show() }); that._checkLabelsOverlay(that._topLabel.pointPosition) } else { topLabel.hide(); bottomLabel.hide() } }, _getImage: function(imageOption) { var image = {}; if (_isDefined(imageOption)) { if ("string" === typeof imageOption) { image.top = image.bottom = imageOption } else { image.top = { url: "string" === typeof imageOption.url ? imageOption.url : imageOption.url && imageOption.url.rangeMaxPoint, width: "number" === typeof imageOption.width ? imageOption.width : imageOption.width && imageOption.width.rangeMaxPoint, height: "number" === typeof imageOption.height ? imageOption.height : imageOption.height && imageOption.height.rangeMaxPoint }; image.bottom = { url: "string" === typeof imageOption.url ? imageOption.url : imageOption.url && imageOption.url.rangeMinPoint, width: "number" === typeof imageOption.width ? imageOption.width : imageOption.width && imageOption.width.rangeMinPoint, height: "number" === typeof imageOption.height ? imageOption.height : imageOption.height && imageOption.height.rangeMinPoint } } } return image }, _checkSymbol: function(oldOptions, newOptions) { var that = this, oldSymbol = oldOptions.symbol, newSymbol = newOptions.symbol, symbolChanged = "circle" === oldSymbol && "circle" !== newSymbol || "circle" !== oldSymbol && "circle" === newSymbol, oldImages = that._getImage(oldOptions.image), newImages = that._getImage(newOptions.image), topImageChanged = that._checkImage(oldImages.top) !== that._checkImage(newImages.top), bottomImageChanged = that._checkImage(oldImages.bottom) !== that._checkImage(newImages.bottom); return symbolChanged || topImageChanged || bottomImageChanged }, _getSettingsForTwoMarkers: function(style) { var that = this, options = that._options, settings = {}, x = options.rotated ? _min(that.x, that.minX) : that.x, y = options.rotated ? that.y : _min(that.y, that.minY), radius = style.r, points = that._populatePointShape(options.symbol, radius); settings.top = _extend({ translateX: x + that.width, translateY: y, r: radius }, style); settings.bottom = _extend({ translateX: x, translateY: y + that.height, r: radius }, style); if (points) { settings.top.points = settings.bottom.points = points } return settings }, _hasGraphic: function() { return this.graphic && this.graphic.topMarker && this.graphic.bottomMarker }, _drawOneMarker: function(renderer, markerType, imageSettings, settings) { var that = this, graphic = that.graphic; if (graphic[markerType]) { that._updateOneMarker(markerType, settings) } else { graphic[markerType] = that._createMarker(renderer, graphic, imageSettings, settings) } }, _drawMarker: function(renderer, group, animationEnabled, firstDrawing, style) { var that = this, settings = that._getSettingsForTwoMarkers(style || that._getStyle()), image = that._getImage(that._options.image); if (that._checkImage(image.top)) { settings.top = that._getImageSettings(settings.top, image.top) } if (that._checkImage(image.bottom)) { settings.bottom = that._getImageSettings(settings.bottom, image.bottom) } that.graphic = that.graphic || renderer.g().append(group); that.visibleTopMarker && that._drawOneMarker(renderer, "topMarker", image.top, settings.top); that.visibleBottomMarker && that._drawOneMarker(renderer, "bottomMarker", image.bottom, settings.bottom) }, _getSettingsForTracker: function(radius) { var that = this, rotated = that._options.rotated; return { translateX: rotated ? _min(that.x, that.minX) - radius : that.x - radius, translateY: rotated ? that.y - radius : _min(that.y, that.minY) - radius, width: that.width + 2 * radius, height: that.height + 2 * radius } }, isInVisibleArea: function() { var notVisibleByArg, notVisibleByVal, tmp, visibleArgArea, visibleValArea, that = this, rotated = that._options.rotated, argument = !rotated ? that.x : that.y, maxValue = !rotated ? _max(that.minY, that.y) : _max(that.minX, that.x), minValue = !rotated ? _min(that.minY, that.y) : _min(that.minX, that.x), visibleTopMarker = true, visibleBottomMarker = true, visibleRangeArea = true; visibleArgArea = that._getArgTranslator().getCanvasVisibleArea(); visibleValArea = that._getValTranslator().getCanvasVisibleArea(); notVisibleByArg = visibleArgArea.max < argument || visibleArgArea.min > argument; notVisibleByVal = visibleValArea.min > minValue && visibleValArea.min > maxValue || visibleValArea.max < minValue && visibleValArea.max < maxValue; if (notVisibleByArg || notVisibleByVal) { visibleTopMarker = visibleBottomMarker = visibleRangeArea = false } else { visibleTopMarker = visibleValArea.min <= minValue && visibleValArea.max > minValue; visibleBottomMarker = visibleValArea.min < maxValue && visibleValArea.max >= maxValue; if (rotated) { tmp = visibleTopMarker; visibleTopMarker = visibleBottomMarker; visibleBottomMarker = tmp } } that.visibleTopMarker = visibleTopMarker; that.visibleBottomMarker = visibleBottomMarker; return visibleRangeArea }, getTooltipParams: function() { var x, y, that = this, rotated = that._options.rotated, minValue = !rotated ? _min(that.y, that.minY) : _min(that.x, that.minX), side = !rotated ? "height" : "width", visibleArea = that._getVisibleArea(), minVisible = rotated ? visibleArea.minX : visibleArea.minY, maxVisible = rotated ? visibleArea.maxX : visibleArea.maxY, min = _max(minVisible, minValue), max = _min(maxVisible, minValue + that[side]); if (!rotated) { x = that.x; y = min + (max - min) / 2 } else { y = that.y; x = min + (max - min) / 2 } return { x: x, y: y, offset: 0 } }, _translate: function() { var that = this, rotated = that._options.rotated; symbolPoint._translate.call(that); that.height = rotated ? 0 : _abs(that.minY - that.y); that.width = rotated ? _abs(that.x - that.minX) : 0 }, _updateData: function(data) { var that = this; symbolPoint._updateData.call(that, data); that.minValue = that.initialMinValue = that.originalMinValue = data.minValue }, _getImageSettings: function(settings, image) { return { href: image.url || image.toString(), width: image.width || DEFAULT_IMAGE_WIDTH, height: image.height || DEFAULT_IMAGE_HEIGHT, translateX: settings.translateX, translateY: settings.translateY } }, getCrosshairData: function(x, y) { var that = this, rotated = that._options.rotated, minX = that.minX, minY = that.minY, vx = that.vx, vy = that.vy, value = that.value, minValue = that.minValue, argument = that.argument, coords = { axis: that.series.axis, x: vx, y: vy, yValue: value, xValue: argument }; if (rotated) { coords.yValue = argument; if (_abs(vx - x) < _abs(minX - x)) { coords.xValue = value } else { coords.x = minX; coords.xValue = minValue } } else { if (_abs(vy - y) >= _abs(minY - y)) { coords.y = minY; coords.yValue = minValue } } return coords }, _updateOneMarker: function(markerType, settings) { this.graphic && this.graphic[markerType] && this.graphic[markerType].attr(settings) }, _updateMarker: function(animationEnabled, style) { this._drawMarker(void 0, void 0, false, false, style) }, _getFormatObject: function(tooltip) { var that = this, initialMinValue = that.initialMinValue, initialValue = that.initialValue, initialArgument = that.initialArgument, minValue = tooltip.formatValue(initialMinValue), value = tooltip.formatValue(initialValue); return { argument: initialArgument, argumentText: tooltip.formatValue(initialArgument, "argument"), valueText: minValue + " - " + value, rangeValue1Text: minValue, rangeValue2Text: value, rangeValue1: initialMinValue, rangeValue2: initialValue, seriesName: that.series.name, point: that, originalMinValue: that.originalMinValue, originalValue: that.originalValue, originalArgument: that.originalArgument } }, getLabel: function() { return [this._topLabel, this._bottomLabel] }, getLabels: function() { return [this._topLabel, this._bottomLabel] }, getBoundingRect: commonUtils.noop, coordsIn: function(x, y) { var trackerRadius = this._storeTrackerR(), xCond = x >= this.x - trackerRadius && x <= this.x + trackerRadius, yCond = y >= this.y - trackerRadius && y <= this.y + trackerRadius; if (this._options.rotated) { return yCond && (xCond || x >= this.minX - trackerRadius && x <= this.minX + trackerRadius) } else { return xCond && (yCond || y >= this.minY - trackerRadius && y <= this.minY + trackerRadius) } }, getMaxValue: function() { if ("discrete" !== this.series.valueAxisType) { return this.minValue > this.value ? this.minValue : this.value } return this.value }, getMinValue: function() { if ("discrete" !== this.series.valueAxisType) { return this.minValue < this.value ? this.minValue : this.value } return this.minValue } }) }, /*!*************************************************!*\ !*** ./js/viz/series/points/range_bar_point.js ***! \*************************************************/ function(module, exports, __webpack_require__) { var noop = __webpack_require__( /*! ../../../core/utils/common */ 14).noop, extend = __webpack_require__( /*! ../../../core/utils/extend */ 11).extend, barPoint = __webpack_require__( /*! ./bar_point */ 531), rangeSymbolPointMethods = __webpack_require__( /*! ./range_symbol_point */ 534), _extend = extend; module.exports = _extend({}, barPoint, { deleteLabel: rangeSymbolPointMethods.deleteLabel, _getFormatObject: rangeSymbolPointMethods._getFormatObject, clearVisibility: function() { var graphic = this.graphic; if (graphic && graphic.attr("visibility")) { graphic.attr({ visibility: null }) } this._topLabel.clearVisibility(); this._bottomLabel.clearVisibility() }, setInvisibility: function() { var graphic = this.graphic; if (graphic && "hidden" !== graphic.attr("visibility")) { graphic.attr({ visibility: "hidden" }) } this._topLabel.hide(); this._bottomLabel.hide() }, getTooltipParams: function(location) { var x, y, that = this, edgeLocation = "edge" === location; if (that._options.rotated) { x = edgeLocation ? that.x + that.width : that.x + that.width / 2; y = that.y + that.height / 2 } else { x = that.x + that.width / 2; y = edgeLocation ? that.y : that.y + that.height / 2 } return { x: x, y: y, offset: 0 } }, _translate: function() { var that = this, barMethods = barPoint; barMethods._translate.call(that); if (that._options.rotated) { that.width = that.width || 1 } else { that.height = that.height || 1 } }, _updateData: rangeSymbolPointMethods._updateData, _getLabelPosition: rangeSymbolPointMethods._getLabelPosition, _getLabelMinFormatObject: rangeSymbolPointMethods._getLabelMinFormatObject, _updateLabelData: rangeSymbolPointMethods._updateLabelData, _updateLabelOptions: rangeSymbolPointMethods._updateLabelOptions, getCrosshairData: rangeSymbolPointMethods.getCrosshairData, _createLabel: rangeSymbolPointMethods._createLabel, _checkOverlay: rangeSymbolPointMethods._checkOverlay, _checkLabelsOverlay: rangeSymbolPointMethods._checkLabelsOverlay, _getOverlayCorrections: rangeSymbolPointMethods._getOverlayCorrections, _drawLabel: rangeSymbolPointMethods._drawLabel, _getLabelCoords: rangeSymbolPointMethods._getLabelCoords, _getGraphicBBox: function(location) { var isTop = "top" === location, bBox = barPoint._getGraphicBBox.call(this); if (!this._options.rotated) { bBox.y = isTop ? bBox.y : bBox.y + bBox.height; bBox.height = 0 } else { bBox.x = isTop ? bBox.x + bBox.width : bBox.x; bBox.width = 0 } return bBox }, getLabel: rangeSymbolPointMethods.getLabel, getLabels: rangeSymbolPointMethods.getLabels, getBoundingRect: noop, getMinValue: rangeSymbolPointMethods.getMinValue, getMaxValue: rangeSymbolPointMethods.getMaxValue }) }, /*!***************************************************!*\ !*** ./js/viz/series/points/candlestick_point.js ***! \***************************************************/ function(module, exports, __webpack_require__) { var isNumeric = __webpack_require__( /*! ../../../core/utils/common */ 14).isNumeric, extend = __webpack_require__( /*! ../../../core/utils/extend */ 11).extend, symbolPoint = __webpack_require__( /*! ./symbol_point */ 528), barPoint = __webpack_require__( /*! ./bar_point */ 531), _isNumeric = isNumeric, _extend = extend, _math = Math, _abs = _math.abs, _min = _math.min, _max = _math.max, _round = _math.round, DEFAULT_FINANCIAL_TRACKER_MARGIN = 2; module.exports = _extend({}, barPoint, { _getContinuousPoints: function(minValueName, maxValueName) { var points, that = this, x = that.x, createPoint = that._options.rotated ? function(x, y) { return [y, x] } : function(x, y) { return [x, y] }, width = that.width, min = that[minValueName], max = that[maxValueName]; if (min === max) { points = [].concat(createPoint(x, that.highY)).concat(createPoint(x, that.lowY)).concat(createPoint(x, that.closeY)).concat(createPoint(x - width / 2, that.closeY)).concat(createPoint(x + width / 2, that.closeY)).concat(createPoint(x, that.closeY)) } else { points = [].concat(createPoint(x, that.highY)).concat(createPoint(x, max)).concat(createPoint(x + width / 2, max)).concat(createPoint(x + width / 2, min)).concat(createPoint(x, min)).concat(createPoint(x, that.lowY)).concat(createPoint(x, min)).concat(createPoint(x - width / 2, min)).concat(createPoint(x - width / 2, max)).concat(createPoint(x, max)) } return points }, _getCategoryPoints: function(y) { var that = this, x = that.x, createPoint = that._options.rotated ? function(x, y) { return [y, x] } : function(x, y) { return [x, y] }; return [].concat(createPoint(x, that.highY)).concat(createPoint(x, that.lowY)).concat(createPoint(x, y)).concat(createPoint(x - that.width / 2, y)).concat(createPoint(x + that.width / 2, y)).concat(createPoint(x, y)) }, _getPoints: function() { var points, minValueName, maxValueName, that = this, openValue = that.openValue, closeValue = that.closeValue; if (_isNumeric(openValue) && _isNumeric(closeValue)) { minValueName = openValue > closeValue ? "closeY" : "openY"; maxValueName = openValue > closeValue ? "openY" : "closeY"; points = that._getContinuousPoints(minValueName, maxValueName) } else { if (openValue === closeValue) { points = [that.x, that.highY, that.x, that.lowY] } else { points = that._getCategoryPoints(_isNumeric(openValue) ? that.openY : that.closeY) } } return points }, getColor: function() { var that = this; return that._isReduction ? that._options.reduction.color : that._styles.normal.stroke || that.series.getColor() }, _drawMarkerInGroup: function(group, attributes, renderer) { var that = this; that.graphic = renderer.path(that._getPoints(), "area").attr({ "stroke-linecap": "square" }).attr(attributes).data({ "chart-data-point": that }).sharp().append(group) }, _fillStyle: function() { var that = this, styles = that._options.styles; if (that._isReduction && that._isPositive) { that._styles = styles.reductionPositive } else { if (that._isReduction) { that._styles = styles.reduction } else { if (that._isPositive) { that._styles = styles.positive } else { that._styles = styles } } } }, _getMinTrackerWidth: function() { return 2 + 2 * this._styles.normal["stroke-width"] }, correctCoordinates: function(correctOptions) { var minWidth = this._getMinTrackerWidth(), maxWidth = 10, width = correctOptions.width; width = width < minWidth ? minWidth : width > maxWidth ? maxWidth : width; this.width = width + width % 2; this.xCorrection = correctOptions.offset }, _getMarkerGroup: function(group) { var markerGroup, that = this; if (that._isReduction && that._isPositive) { markerGroup = group.reductionPositiveMarkersGroup } else { if (that._isReduction) { markerGroup = group.reductionMarkersGroup } else { if (that._isPositive) { markerGroup = group.defaultPositiveMarkersGroup } else { markerGroup = group.defaultMarkersGroup } } } return markerGroup }, _drawMarker: function(renderer, group) { this._drawMarkerInGroup(this._getMarkerGroup(group), this._getStyle(), renderer) }, _getSettingsForTracker: function() { var x, y, width, height, that = this, highY = that.highY, lowY = that.lowY, rotated = that._options.rotated; if (highY === lowY) { highY = rotated ? highY + DEFAULT_FINANCIAL_TRACKER_MARGIN : highY - DEFAULT_FINANCIAL_TRACKER_MARGIN; lowY = rotated ? lowY - DEFAULT_FINANCIAL_TRACKER_MARGIN : lowY + DEFAULT_FINANCIAL_TRACKER_MARGIN } if (rotated) { x = _min(lowY, highY); y = that.x - that.width / 2; width = _abs(lowY - highY); height = that.width } else { x = that.x - that.width / 2; y = _min(lowY, highY); width = that.width; height = _abs(lowY - highY) } return { x: x, y: y, width: width, height: height } }, _getGraphicBBox: function() { var that = this, rotated = that._options.rotated, x = that.x, width = that.width, lowY = that.lowY, highY = that.highY; return { x: !rotated ? x - _round(width / 2) : lowY, y: !rotated ? highY : x - _round(width / 2), width: !rotated ? width : highY - lowY, height: !rotated ? lowY - highY : width } }, getTooltipParams: function(location) { var that = this; if (that.graphic) { var x, y, minValue = _min(that.lowY, that.highY), maxValue = _max(that.lowY, that.highY), visibleArea = that._getVisibleArea(), edgeLocation = "edge" === location, rotated = that._options.rotated, minVisible = rotated ? visibleArea.minX : visibleArea.minY, maxVisible = rotated ? visibleArea.maxX : visibleArea.maxY, min = _max(minVisible, minValue), max = _min(maxVisible, maxValue), center = min + (max - min) / 2; if (rotated) { y = that.x; x = edgeLocation ? max : center } else { x = that.x; y = edgeLocation ? min : center } return { x: x, y: y, offset: 0 } } }, hasValue: function() { return null !== this.highValue && null !== this.lowValue }, _translate: function() { var centerValue, that = this, rotated = that._options.rotated, valTranslator = that._getValTranslator(); that.vx = that.vy = that.x = that._getArgTranslator().translate(that.argument) + (that.xCorrection || 0); that.openY = null !== that.openValue ? valTranslator.translate(that.openValue) : null; that.highY = valTranslator.translate(that.highValue); that.lowY = valTranslator.translate(that.lowValue); that.closeY = null !== that.closeValue ? valTranslator.translate(that.closeValue) : null; centerValue = _min(that.lowY, that.highY) + _abs(that.lowY - that.highY) / 2; that._calculateVisibility(!rotated ? that.x : centerValue, !rotated ? centerValue : that.x) }, getCrosshairData: function(x, y) { var yValue, coords, that = this, rotated = that._options.rotated, origY = rotated ? x : y, argument = that.argument, coord = "low"; if (_abs(that.lowY - origY) < _abs(that.closeY - origY)) { yValue = that.lowY } else { yValue = that.closeY; coord = "close" } if (_abs(yValue - origY) >= _abs(that.openY - origY)) { yValue = that.openY; coord = "open" } if (_abs(yValue - origY) >= _abs(that.highY - origY)) { yValue = that.highY; coord = "high" } if (rotated) { coords = { y: that.vy, x: yValue, xValue: that[coord + "Value"], yValue: argument } } else { coords = { x: that.vx, y: yValue, xValue: argument, yValue: that[coord + "Value"] } } coords.axis = that.series.axis; return coords }, _updateData: function(data) { var that = this, label = that._label, reductionColor = this._options.reduction.color; that.value = that.initialValue = data.reductionValue; that.originalValue = data.value; that.lowValue = that.originalLowValue = data.lowValue; that.highValue = that.originalHighValue = data.highValue; that.openValue = that.originalOpenValue = data.openValue; that.closeValue = that.originalCloseValue = data.closeValue; that._isPositive = data.openValue < data.closeValue; that._isReduction = data.isReduction; if (that._isReduction) { label.setColor(reductionColor) } }, _updateMarker: function(animationEnabled, style, group) { var that = this, graphic = that.graphic; graphic.attr({ points: that._getPoints() }).smartAttr(style).sharp(); group && graphic.append(that._getMarkerGroup(group)) }, _getLabelFormatObject: function() { var that = this; return { openValue: that.openValue, highValue: that.highValue, lowValue: that.lowValue, closeValue: that.closeValue, reductionValue: that.initialValue, argument: that.initialArgument, value: that.initialValue, seriesName: that.series.name, originalOpenValue: that.originalOpenValue, originalCloseValue: that.originalCloseValue, originalLowValue: that.originalLowValue, originalHighValue: that.originalHighValue, originalArgument: that.originalArgument, point: that } }, _getFormatObject: function(tooltip) { var that = this, highValue = tooltip.formatValue(that.highValue), openValue = tooltip.formatValue(that.openValue), closeValue = tooltip.formatValue(that.closeValue), lowValue = tooltip.formatValue(that.lowValue), symbolMethods = symbolPoint, formatObject = symbolMethods._getFormatObject.call(that, tooltip); return _extend({}, formatObject, { valueText: "h: " + highValue + ("" !== openValue ? " o: " + openValue : "") + ("" !== closeValue ? " c: " + closeValue : "") + " l: " + lowValue, highValueText: highValue, openValueText: openValue, closeValueText: closeValue, lowValueText: lowValue }) }, getMaxValue: function() { return this.highValue }, getMinValue: function() { return this.lowValue } }) }, /*!*********************************************!*\ !*** ./js/viz/series/points/stock_point.js ***! \*********************************************/ function(module, exports, __webpack_require__) { var extend = __webpack_require__( /*! ../../../core/utils/extend */ 11).extend, isNumeric = __webpack_require__( /*! ../../../core/utils/common */ 14).isNumeric, candlestickPoint = __webpack_require__( /*! ./candlestick_point */ 536), _extend = extend, _isNumeric = isNumeric; module.exports = _extend({}, candlestickPoint, { _getPoints: function() { var points, that = this, createPoint = that._options.rotated ? function(x, y) { return [y, x] } : function(x, y) { return [x, y] }, openYExist = _isNumeric(that.openY), closeYExist = _isNumeric(that.closeY), x = that.x, width = that.width; points = [].concat(createPoint(x, that.highY)); openYExist && (points = points.concat(createPoint(x, that.openY))); openYExist && (points = points.concat(createPoint(x - width / 2, that.openY))); openYExist && (points = points.concat(createPoint(x, that.openY))); closeYExist && (points = points.concat(createPoint(x, that.closeY))); closeYExist && (points = points.concat(createPoint(x + width / 2, that.closeY))); closeYExist && (points = points.concat(createPoint(x, that.closeY))); points = points.concat(createPoint(x, that.lowY)); return points }, _drawMarkerInGroup: function(group, attributes, renderer) { this.graphic = renderer.path(this._getPoints(), "line").attr({ "stroke-linecap": "square" }).attr(attributes).data({ "chart-data-point": this }).sharp().append(group) }, _getMinTrackerWidth: function() { var width = 2 + this._styles.normal["stroke-width"]; return width + width % 2 } }) }, /*!*********************************************!*\ !*** ./js/viz/series/points/polar_point.js ***! \*********************************************/ function(module, exports, __webpack_require__) { var extend = __webpack_require__( /*! ../../../core/utils/extend */ 11).extend, _extend = extend, commonUtils = __webpack_require__( /*! ../../../core/utils/common */ 14), symbolPoint = __webpack_require__( /*! ./symbol_point */ 528), barPoint = __webpack_require__( /*! ./bar_point */ 531), piePoint = __webpack_require__( /*! ./pie_point */ 533), isDefined = commonUtils.isDefined, vizUtils = __webpack_require__( /*! ../../core/utils */ 509), normalizeAngle = vizUtils.normalizeAngle, _math = Math, _max = _math.max, ERROR_BARS_ANGLE_OFFSET = 90, CANVAS_POSITION_END = "canvas_position_end", CANVAS_POSITION_DEFAULT = "canvas_position_default"; exports.polarSymbolPoint = _extend({}, symbolPoint, { _getLabelCoords: piePoint._getLabelCoords, _moveLabelOnCanvas: barPoint._moveLabelOnCanvas, _getLabelPosition: function() { return "outside" }, _getCoords: function(argument, value) { var axis = this.series.getValueAxis(), startAngle = axis.getAngles()[0], angle = this._getArgTranslator().translate(argument), radius = this._getValTranslator().translate(value), coords = vizUtils.convertPolarToXY(axis.getCenter(), axis.getAngles()[0], angle, radius); coords.angle = angle + startAngle - 90, coords.radius = radius; return coords }, _translate: function() { var that = this, center = that.series.getValueAxis().getCenter(), coord = that._getCoords(that.argument, that.value); that.vx = normalizeAngle(coord.angle); that.vy = that.radiusOuter = that.radiusLabels = coord.radius; that.radius = coord.radius; that.middleAngle = -coord.angle; that.angle = -coord.angle; that.x = coord.x; that.y = coord.y; that.defaultX = that.centerX = center.x; that.defaultY = that.centerY = center.y; that._translateErrorBars(); that.inVisibleArea = true }, _translateErrorBars: function() { var that = this, errorBars = that._options.errorBars, translator = that._getValTranslator(); if (!errorBars) { return } isDefined(that.lowError) && (that._lowErrorCoord = that.centerY - translator.translate(that.lowError)); isDefined(that.highError) && (that._highErrorCoord = that.centerY - translator.translate(that.highError)); that._errorBarPos = that.centerX; that._baseErrorBarPos = "stdDeviation" === errorBars.type ? that._lowErrorCoord + (that._highErrorCoord - that._lowErrorCoord) / 2 : that.centerY - that.radius }, _getTranslates: function(animationEnabled) { return animationEnabled ? this.getDefaultCoords() : { x: this.x, y: this.y } }, getDefaultCoords: function() { var cosSin = vizUtils.getCosAndSin(-this.angle), radius = this._getValTranslator().translate(CANVAS_POSITION_DEFAULT), x = this.defaultX + radius * cosSin.cos, y = this.defaultY + radius * cosSin.sin; return { x: x, y: y } }, _addLabelAlignmentAndOffset: function(label, coord) { return coord }, _checkLabelPosition: function(label, coord) { var that = this, visibleArea = that._getVisibleArea(), graphicBBox = that._getGraphicBBox(); if (that._isPointInVisibleArea(visibleArea, graphicBBox)) { coord = that._moveLabelOnCanvas(coord, visibleArea, label.getBoundingRect()) } return coord }, _getErrorBarSettings: function(errorBarOptions, animationEnabled) { var settings = symbolPoint._getErrorBarSettings.call(this, errorBarOptions, animationEnabled); settings.rotate = ERROR_BARS_ANGLE_OFFSET - this.angle; settings.rotateX = this.centerX; settings.rotateY = this.centerY; return settings }, getCoords: function(min) { return min ? this.getDefaultCoords() : { x: this.x, y: this.y } } }); exports.polarBarPoint = _extend({}, barPoint, { _translateErrorBars: exports.polarSymbolPoint._translateErrorBars, _getErrorBarSettings: exports.polarSymbolPoint._getErrorBarSettings, _moveLabelOnCanvas: barPoint._moveLabelOnCanvas, _getLabelCoords: piePoint._getLabelCoords, _getLabelConnector: piePoint._getLabelConnector, getTooltipParams: piePoint.getTooltipParams, _getLabelPosition: piePoint._getLabelPosition, _getCoords: exports.polarSymbolPoint._getCoords, _translate: function() { var that = this, translator = that._getValTranslator(), maxRadius = translator.translate(CANVAS_POSITION_END); that.radiusInner = translator.translate(that.minValue); exports.polarSymbolPoint._translate.call(that); if (null === that.radiusInner) { that.radiusInner = that.radius = maxRadius } else { if (null === that.radius) { this.radius = this.value >= 0 ? maxRadius : 0 } } that.radiusOuter = that.radiusLabels = _max(that.radiusInner, that.radius); that.radiusInner = that.defaultRadius = _math.min(that.radiusInner, that.radius); that.middleAngle = that.angle = -normalizeAngle(that.middleAngleCorrection - that.angle) }, getMarkerCoords: function() { return { x: this.centerX, y: this.centerY, outerRadius: this.radiusOuter, innerRadius: this.defaultRadius, startAngle: this.middleAngle - this.interval / 2, endAngle: this.middleAngle + this.interval / 2 } }, _drawMarker: function(renderer, group, animationEnabled) { var that = this, styles = that._getStyle(), coords = that.getMarkerCoords(), innerRadius = coords.innerRadius, outerRadius = coords.outerRadius, start = that._getCoords(that.argument, CANVAS_POSITION_DEFAULT), x = coords.x, y = coords.y; if (animationEnabled) { innerRadius = 0; outerRadius = 0; x = start.x; y = start.y } that.graphic = renderer.arc(x, y, innerRadius, outerRadius, coords.startAngle, coords.endAngle).attr(styles).data({ "chart-data-point": that }).append(group) }, _checkLabelPosition: function(label, coord) { var that = this, visibleArea = that._getVisibleArea(), angleFunctions = vizUtils.getCosAndSin(that.middleAngle), x = that.centerX + that.defaultRadius * angleFunctions.cos, y = that.centerY - that.defaultRadius * angleFunctions.sin; if (x > visibleArea.minX && x < visibleArea.maxX && y > visibleArea.minY && y < visibleArea.maxY) { coord = that._moveLabelOnCanvas(coord, visibleArea, label.getBoundingRect()) } return coord }, _addLabelAlignmentAndOffset: function(label, coord) { return coord }, correctCoordinates: function(correctOptions) { this.middleAngleCorrection = correctOptions.offset; this.interval = correctOptions.width }, coordsIn: function(x, y) { var val = vizUtils.convertXYToPolar(this.series.getValueAxis().getCenter(), x, y), coords = this.getMarkerCoords(), isBetweenAngles = coords.startAngle < coords.endAngle ? -val.phi >= coords.startAngle && -val.phi <= coords.endAngle : -val.phi <= coords.startAngle && -val.phi >= coords.endAngle; return val.r >= coords.innerRadius && val.r <= coords.outerRadius && isBetweenAngles } }) }, /*!********************************************************!*\ !*** ./js/viz/series/helpers/range_data_calculator.js ***! \********************************************************/ function(module, exports, __webpack_require__) { var _math = Math, _abs = _math.abs, unique = __webpack_require__( /*! ../../core/utils */ 509).unique, _isDefined = __webpack_require__( /*! ../../../core/utils/common */ 14).isDefined, DISCRETE = "discrete"; function addLabelPaddings(series, valueRange) { var labelOptions = series.getOptions().label; if (series.areLabelsVisible() && labelOptions && labelOptions.visible && "inside" !== labelOptions.position) { if (valueRange.min < 0) { valueRange.minSpaceCorrection = true } if (valueRange.max > 0) { valueRange.maxSpaceCorrection = true } } } function addRangeSeriesLabelPaddings(series, range) { if (series.areLabelsVisible() && series._options.label.visible && "inside" !== series._options.label.position) { range.minSpaceCorrection = range.maxSpaceCorrection = true } } function continuousRangeCalculator(range, minValue, maxValue) { range.min = range.min < minValue ? range.min : minValue; range.max = range.max > maxValue ? range.max : maxValue } function getRangeCalculator(axisType, calcInterval) { if (axisType === DISCRETE) { return function(range, minValue, maxValue) { if (minValue !== maxValue) { range.categories.push(maxValue) } range.categories.push(minValue) } } if (calcInterval) { return function(range, value) { var interval = calcInterval(value, range.prevValue), minInterval = range.interval; range.interval = (minInterval < interval ? minInterval : interval) || minInterval; range.prevValue = value; continuousRangeCalculator(range, value, value) } } return continuousRangeCalculator } function getInitialRange(axisType, dataType, firstValue) { var range = { axisType: axisType, dataType: dataType }; if (axisType === DISCRETE) { range.categories = [] } else { range.min = firstValue; range.max = firstValue } return range } function processCategories(range) { if (range.categories) { range.categories = unique(range.categories) } } function getValueForArgument(point, extraPoint, x) { if (extraPoint) { var y1 = point.value, y2 = extraPoint.value, x1 = point.argument, x2 = extraPoint.argument; return (x - x1) * (y2 - y1) / (x2 - x1) + y1 } else { return point.value } } function getViewPortFilter(viewport) { if (!_isDefined(viewport.max) && !_isDefined(viewport.min)) { return function() { return true } } if (!_isDefined(viewport.max)) { return function(argument) { return argument >= viewport.min } } if (!_isDefined(viewport.min)) { return function(argument) { return argument <= viewport.max } } return function(argument) { return argument >= viewport.min && argument <= viewport.max } } function calculateRangeBetweenPoints(rangeCalculator, range, point, prevPoint, bound) { var value = getValueForArgument(point, prevPoint, bound); rangeCalculator(range, value, value) } function getViewportReducer(series) { var viewportFilter, rangeCalculator = getRangeCalculator(series.valueAxisType), viewport = series.getArgumentAxis() && series.getArgumentAxis().getViewport() || {}; viewportFilter = getViewPortFilter(viewport); return function(range, point, index, points) { var argument = point.argument; if (!point.hasValue()) { return range } if (viewportFilter(argument)) { if (!range.startCalc) { range.startCalc = true; calculateRangeBetweenPoints(rangeCalculator, range, point, points[index - 1], viewport.min) } rangeCalculator(range, point.getMinValue(), point.getMaxValue()) } else { if (_isDefined(viewport.max) && argument > viewport.max) { if (!range.startCalc) { calculateRangeBetweenPoints(rangeCalculator, range, point, points[index - 1], viewport.min) } range.endCalc = true; calculateRangeBetweenPoints(rangeCalculator, range, point, points[index - 1], viewport.max) } } return range } } function getIntervalCalculator(series) { var calcInterval = series.getArgumentAxis() && series.getArgumentAxis().calcInterval; if (calcInterval) { return calcInterval } return function(value, prevValue) { return _abs(value - prevValue) } } module.exports = { getRangeData: function(series) { var points = series.getPoints(), intervalCalculator = getIntervalCalculator(series), argumentCalculator = getRangeCalculator(series.argumentAxisType, points.length > 1 && intervalCalculator), valueRangeCalculator = getRangeCalculator(series.valueAxisType), viewportReducer = getViewportReducer(series), range = points.reduce(function(range, point, index, points) { var argument = point.argument; argumentCalculator(range.arg, argument, argument); if (point.hasValue()) { valueRangeCalculator(range.val, point.getMinValue(), point.getMaxValue()); viewportReducer(range.viewport, point, index, points) } return range }, { arg: getInitialRange(series.argumentAxisType, series.argumentType, points.length ? points[0].argument : void 0), val: getInitialRange(series.valueAxisType, series.valueType, points.length ? series.getValueRangeInitialValue() : void 0), viewport: getInitialRange(series.valueAxisType, series.valueType, points.length ? series.getValueRangeInitialValue() : void 0) }); processCategories(range.arg); processCategories(range.val); return range }, getViewport: function(series) { var reducer, points = series.getPoints(), range = {}; if (series.valueAxisType !== DISCRETE && series.argumentAxisType !== DISCRETE) { reducer = getViewportReducer(series); range = getInitialRange(series.valueAxisType, series.valueType, points.length ? series.getValueRangeInitialValue() : void 0); points.some(function(point, index) { reducer(range, point, index, points); return range.endCalc }) } return range }, addLabelPaddings: addLabelPaddings, addRangeSeriesLabelPaddings: addRangeSeriesLabelPaddings } }, /*!*****************************************!*\ !*** ./js/viz/series/scatter_series.js ***! \*****************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, rangeCalculator = __webpack_require__( /*! ./helpers/range_data_calculator */ 539), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), vizUtils = __webpack_require__( /*! ../core/utils */ 509), _each = $.each, _extend = extend, _noop = commonUtils.noop, _isDefined = commonUtils.isDefined, _isString = commonUtils.isString, _map = vizUtils.map, _normalizeEnum = vizUtils.normalizeEnum, math = Math, _floor = math.floor, _abs = math.abs, _sqrt = math.sqrt, _min = math.min, _max = math.max, DEFAULT_SYMBOL_POINT_SIZE = 2, DEFAULT_TRACKER_WIDTH = 12, DEFAULT_DURATION = 400, HIGH_ERROR = "highError", LOW_ERROR = "lowError", ORIGINAL = "original", VARIANCE = "variance", STANDARD_DEVIATION = "stddeviation", STANDARD_ERROR = "stderror", PERCENT = "percent", FIXED = "fixed", UNDEFINED = "undefined", DISCRETE = "discrete", LOGARITHMIC = "logarithmic", DATETIME = "datetime"; exports.chart = {}; exports.polar = {}; function sum(array) { var result = 0; _each(array, function(_, value) { result += value }); return result } function isErrorBarTypeCorrect(type) { return inArray(type, [FIXED, PERCENT, VARIANCE, STANDARD_DEVIATION, STANDARD_ERROR]) !== -1 } function variance(array, expectedValue) { return sum(_map(array, function(value) { return (value - expectedValue) * (value - expectedValue) })) / array.length } var baseScatterMethods = { _defaultDuration: DEFAULT_DURATION, _defaultTrackerWidth: DEFAULT_TRACKER_WIDTH, _applyStyle: _noop, _updateOptions: _noop, _parseStyle: _noop, _prepareSegment: _noop, _drawSegment: _noop, _generateDefaultSegments: _noop, _prepareSeriesToDrawing: function() { var that = this; that._deleteOldAnimationMethods(); that._disposePoints(that._oldPoints); that._oldPoints = null }, _appendInGroup: function() { this._group.append(this._extGroups.seriesGroup) }, _createLegendState: function(styleOptions, defaultColor) { return { fill: styleOptions.color || defaultColor, hatching: styleOptions.hatching } }, updateTemplateFieldNames: function() { var that = this, options = that._options; options.valueField = that.getValueFields()[0] + that.name; options.tagField = that.getTagField() + that.name }, _applyElementsClipRect: function(settings) { settings["clip-path"] = this._paneClipRectID }, _applyMarkerClipRect: function(settings) { settings["clip-path"] = this._forceClipping ? this._paneClipRectID : null }, _createGroup: function(groupName, parent, target, settings) { var group = parent[groupName] = parent[groupName] || this._renderer.g(); target && group.append(target); settings && group.attr(settings) }, _applyClearingSettings: function(settings) { settings.opacity = null; settings.scale = null; if (this._options.rotated) { settings.translateX = null } else { settings.translateY = null } }, _createGroups: function() { var that = this; that._createGroup("_markersGroup", that, that._group); that._createGroup("_labelsGroup", that) }, _setMarkerGroupSettings: function() { var that = this, settings = that._createPointStyles(that._getMarkerGroupOptions()).normal; settings.class = "dxc-markers"; settings.opacity = 1; that._applyMarkerClipRect(settings); that._markersGroup.attr(settings) }, getVisibleArea: function() { return this._visibleArea }, areErrorBarsVisible: function() { var errorBarOptions = this._options.valueErrorBar; return errorBarOptions && this._errorBarsEnabled() && "none" !== errorBarOptions.displayMode && (isErrorBarTypeCorrect(_normalizeEnum(errorBarOptions.type)) || _isDefined(errorBarOptions.lowValueField) || _isDefined(errorBarOptions.highValueField)) }, _createErrorBarGroup: function(animationEnabled) { var settings, that = this, errorBarOptions = that._options.valueErrorBar; if (that.areErrorBarsVisible()) { settings = { "class": "dxc-error-bars", stroke: errorBarOptions.color, "stroke-width": errorBarOptions.lineWidth, opacity: animationEnabled ? .001 : errorBarOptions.opacity || 1, "stroke-linecap": "square", sharp: true, "clip-path": that._forceClipping ? that._paneClipRectID : that._widePaneClipRectID }; that._createGroup("_errorBarGroup", that, that._group, settings) } }, _setGroupsSettings: function(animationEnabled) { var that = this; that._setMarkerGroupSettings(); that._setLabelGroupSettings(animationEnabled); that._createErrorBarGroup(animationEnabled) }, _getCreatingPointOptions: function() { var defaultPointOptions, normalStyle, that = this, creatingPointOptions = that._predefinedPointOptions; if (!creatingPointOptions) { defaultPointOptions = that._getPointOptions(); that._predefinedPointOptions = creatingPointOptions = _extend(true, { styles: {} }, defaultPointOptions); normalStyle = defaultPointOptions.styles && defaultPointOptions.styles.normal || {}; creatingPointOptions.styles = creatingPointOptions.styles || {}; creatingPointOptions.styles.normal = { "stroke-width": normalStyle["stroke-width"], r: normalStyle.r, opacity: normalStyle.opacity } } return creatingPointOptions }, _getPointOptions: function() { return this._parsePointOptions(this._preparePointOptions(), this._options.label) }, _getOptionsForPoint: function() { return this._options.point }, _parsePointStyle: function(style, defaultColor, defaultBorderColor, defaultSize) { var border = style.border || {}, sizeValue = void 0 !== style.size ? style.size : defaultSize; return { fill: style.color || defaultColor, stroke: border.color || defaultBorderColor, "stroke-width": border.visible ? border.width : 0, r: sizeValue / 2 + (border.visible && 0 !== sizeValue ? ~~(border.width / 2) || 0 : 0) } }, _createPointStyles: function(pointOptions) { var that = this, mainPointColor = pointOptions.color || that._options.mainSeriesColor, containerColor = that._options.containerBackgroundColor, normalStyle = that._parsePointStyle(pointOptions, mainPointColor, mainPointColor); normalStyle.visibility = pointOptions.visible ? "visible" : "hidden"; return { normal: normalStyle, hover: that._parsePointStyle(pointOptions.hoverStyle, containerColor, mainPointColor, pointOptions.size), selection: that._parsePointStyle(pointOptions.selectionStyle, containerColor, mainPointColor, pointOptions.size) } }, _checkData: function(data) { return _isDefined(data.argument) && void 0 !== data.value }, getErrorBarRangeCorrector: function() { var mode, func; if (this.areErrorBarsVisible()) { mode = _normalizeEnum(this._options.valueErrorBar.displayMode); func = function(point) { var lowError = point.lowError, highError = point.highError; switch (mode) { case "low": return [lowError]; case "high": return [highError]; case "none": return []; default: return [lowError, highError] } } } return func }, getValueRangeInitialValue: function() { return }, _getRangeData: function() { return rangeCalculator.getRangeData(this) }, _processRange: function(range) { rangeCalculator.addLabelPaddings(this, range.val) }, _getPointData: function(data, options) { var pointData = { value: data[options.valueField || "val"], argument: data[options.argumentField || "arg"], tag: data[options.tagField || "tag"] }; this._fillErrorBars(data, pointData, options); return pointData }, _errorBarsEnabled: function() { return this.valueAxisType !== DISCRETE && this.valueAxisType !== LOGARITHMIC && this.valueType !== DATETIME }, _fillErrorBars: function(data, pointData, options) { var errorBars = options.valueErrorBar; if (this.areErrorBarsVisible()) { pointData.lowError = data[errorBars.lowValueField || LOW_ERROR]; pointData.highError = data[errorBars.highValueField || HIGH_ERROR] } }, _drawPoint: function(options) { var point = options.point; if (point.isInVisibleArea()) { point.clearVisibility(); point.draw(this._renderer, options.groups, options.hasAnimation, options.firstDrawing); this._drawnPoints.push(point) } else { point.setInvisibility() } }, _clearingAnimation: function(drawComplete) { var that = this, params = { opacity: .001 }, options = { duration: that._defaultDuration, partitionDuration: .5 }; that._labelsGroup && that._labelsGroup.animate(params, options, function() { that._markersGroup && that._markersGroup.animate(params, options, drawComplete) }) }, _animateComplete: function() { var that = this, animationSettings = { duration: that._defaultDuration }; that._labelsGroup && that._labelsGroup.animate({ opacity: 1 }, animationSettings); that._errorBarGroup && that._errorBarGroup.animate({ opacity: that._options.valueErrorBar.opacity || 1 }, animationSettings) }, _animate: function() { var that = this, lastPointIndex = that._drawnPoints.length - 1; _each(that._drawnPoints || [], function(i, p) { p.animate(i === lastPointIndex ? function() { that._animateComplete() } : void 0, { translateX: p.x, translateY: p.y }) }) }, _getPointSize: function() { return this._options.point.visible ? this._options.point.size : DEFAULT_SYMBOL_POINT_SIZE }, _calcMedianValue: function(fusionPoints, valueField) { var result, allValue = _map(fusionPoints, function(point) { return _isDefined(point[valueField]) ? point[valueField] : null }); allValue.sort(function(a, b) { return a - b }); result = allValue[_floor(allValue.length / 2)]; return _isDefined(result) ? result : null }, _calcErrorBarValues: function(fusionPoints) { if (!fusionPoints.length) { return {} } var lowError, highError, lowValue = fusionPoints[0].lowError, highValue = fusionPoints[0].highError, i = 1, length = fusionPoints.length; for (i; i < length; i++) { lowError = fusionPoints[i].lowError; highError = fusionPoints[i].highError; if (_isDefined(lowError) && _isDefined(highError)) { lowValue = _min(lowError, lowValue); highValue = _max(highError, highValue) } } return { low: lowValue, high: highValue } }, _fusionPoints: function(fusionPoints, tick, index) { var errorBarValues = this._calcErrorBarValues(fusionPoints); return { value: this._calcMedianValue(fusionPoints, "value"), argument: tick, tag: null, index: index, seriesName: this.name, lowError: errorBarValues.low, highError: errorBarValues.high } }, _endUpdateData: function() { delete this._predefinedPointOptions }, getArgumentField: function() { return this._options.argumentField || "arg" }, getValueFields: function() { var lowValueField, highValueField, options = this._options, errorBarsOptions = options.valueErrorBar, valueFields = [options.valueField || "val"]; if (errorBarsOptions) { lowValueField = errorBarsOptions.lowValueField; highValueField = errorBarsOptions.highValueField; _isString(lowValueField) && valueFields.push(lowValueField); _isString(highValueField) && valueFields.push(highValueField) } return valueFields }, _calculateErrorBars: function(data) { if (!this.areErrorBarsVisible()) { return } var value, valueArray, valueArrayLength, meanValue, processDataItem, that = this, options = that._options, errorBarsOptions = options.valueErrorBar, errorBarType = _normalizeEnum(errorBarsOptions.type), floatErrorValue = parseFloat(errorBarsOptions.value), valueField = that.getValueFields()[0], lowValueField = errorBarsOptions.lowValueField || LOW_ERROR, highValueField = errorBarsOptions.highValueField || HIGH_ERROR, addSubError = function(_i, item) { value = item[valueField]; item[lowValueField] = value - floatErrorValue; item[highValueField] = value + floatErrorValue }; switch (errorBarType) { case FIXED: processDataItem = addSubError; break; case PERCENT: processDataItem = function(_, item) { value = item[valueField]; var error = value * floatErrorValue / 100; item[lowValueField] = value - error; item[highValueField] = value + error }; break; case UNDEFINED: processDataItem = function(_, item) { item[lowValueField] = item[ORIGINAL + lowValueField]; item[highValueField] = item[ORIGINAL + highValueField] }; break; default: valueArray = _map(data, function(item) { return _isDefined(item[valueField]) ? item[valueField] : null }); valueArrayLength = valueArray.length; floatErrorValue = floatErrorValue || 1; switch (errorBarType) { case VARIANCE: floatErrorValue = variance(valueArray, sum(valueArray) / valueArrayLength) * floatErrorValue; processDataItem = addSubError; break; case STANDARD_DEVIATION: meanValue = sum(valueArray) / valueArrayLength; floatErrorValue = _sqrt(variance(valueArray, meanValue)) * floatErrorValue; processDataItem = function(_, item) { item[lowValueField] = meanValue - floatErrorValue; item[highValueField] = meanValue + floatErrorValue }; break; case STANDARD_ERROR: floatErrorValue = _sqrt(variance(valueArray, sum(valueArray) / valueArrayLength) / valueArrayLength) * floatErrorValue; processDataItem = addSubError } } processDataItem && _each(data, processDataItem) }, _beginUpdateData: function(data) { this._calculateErrorBars(data) } }; exports.chart = _extend({}, baseScatterMethods, { drawTrackers: function() { var trackers, trackersGroup, that = this, segments = that._segments || [], rotated = that._options.rotated, cat = []; if (!that.isVisible()) { return } if (segments.length) { trackers = that._trackers = that._trackers || []; trackersGroup = that._trackersGroup = (that._trackersGroup || that._renderer.g().attr({ fill: "gray", opacity: .001, stroke: "gray", "class": "dxc-trackers" })).attr({ "clip-path": this._paneClipRectID || null }).append(that._group); _each(segments, function(i, segment) { if (!trackers[i]) { trackers[i] = that._drawTrackerElement(segment).data({ "chart-data-series": that }).append(trackersGroup) } else { that._updateTrackerElement(segment, trackers[i]) } }) } that._trackersTranslator = cat; _each(that.getVisiblePoints(), function(_, p) { var pointCoord = parseInt(rotated ? p.vy : p.vx); if (!cat[pointCoord]) { cat[pointCoord] = p } else { Array.isArray(cat[pointCoord]) ? cat[pointCoord].push(p) : cat[pointCoord] = [cat[pointCoord], p] } }) }, getNeighborPoint: function(x, y) { var minDistance, pCoord = this._options.rotated ? y : x, nCoord = pCoord, cat = this._trackersTranslator, point = null, oppositeCoord = this._options.rotated ? x : y, oppositeCoordName = this._options.rotated ? "vx" : "vy"; if (this.isVisible() && cat) { point = cat[pCoord]; do { point = cat[nCoord] || cat[pCoord]; pCoord--; nCoord++ } while ((pCoord >= 0 || nCoord < cat.length) && !point); if (Array.isArray(point)) { minDistance = _abs(point[0][oppositeCoordName] - oppositeCoord); _each(point, function(i, p) { var distance = _abs(p[oppositeCoordName] - oppositeCoord); if (minDistance >= distance) { minDistance = distance; point = p } }) } } return point }, _applyVisibleArea: function() { var that = this, rotated = that._options.rotated, visibleX = (rotated ? that.getValueAxis() : that.getArgumentAxis()).getTranslator().getCanvasVisibleArea(), visibleY = (rotated ? that.getArgumentAxis() : that.getValueAxis()).getTranslator().getCanvasVisibleArea(); that._visibleArea = { minX: visibleX.min, maxX: visibleX.max, minY: visibleY.min, maxY: visibleY.max } } }); exports.polar = _extend({}, baseScatterMethods, { drawTrackers: function() { exports.chart.drawTrackers.call(this); var index, cat = this._trackersTranslator; if (!this.isVisible()) { return } _each(cat, function(i, category) { if (category) { index = i; return false } }); cat[index + 360] = cat[index] }, getNeighborPoint: function(x, y) { var pos = vizUtils.convertXYToPolar(this.getValueAxis().getCenter(), x, y); return exports.chart.getNeighborPoint.call(this, pos.phi, pos.r) }, _applyVisibleArea: function() { var that = this, canvas = that.getValueAxis().getCanvas(); that._visibleArea = { minX: canvas.left, maxX: canvas.width - canvas.right, minY: canvas.top, maxY: canvas.height - canvas.bottom } } }) }, /*!**************************************!*\ !*** ./js/viz/series/line_series.js ***! \**************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), series = __webpack_require__( /*! ./scatter_series */ 540), chartScatterSeries = series.chart, polarScatterSeries = series.polar, objectUtils = __webpack_require__( /*! ../../core/utils/object */ 27), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, vizUtils = __webpack_require__( /*! ../core/utils */ 509), normalizeAngle = vizUtils.normalizeAngle, DISCRETE = "discrete", _map = vizUtils.map, _extend = extend, _each = $.each; exports.chart = {}; exports.polar = {}; function clonePoint(point, newX, newY, newAngle) { var p = objectUtils.clone(point); p.x = newX; p.y = newY; p.angle = newAngle; return p } function getTangentPoint(point, prevPoint, centerPoint, tan, nextStepAngle) { var correctAngle = point.angle + nextStepAngle, cosSin = vizUtils.getCosAndSin(correctAngle), x = centerPoint.x + (point.radius + tan * nextStepAngle) * cosSin.cos, y = centerPoint.y - (point.radius + tan * nextStepAngle) * cosSin.sin; return clonePoint(prevPoint, x, y, correctAngle) } var lineMethods = { _applyGroupSettings: function(style, settings, group) { var that = this; settings = _extend(settings, style); that._applyElementsClipRect(settings); group.attr(settings) }, _setGroupsSettings: function(animationEnabled) { var that = this, style = that._styles.normal; that._applyGroupSettings(style.elements, { "class": "dxc-elements" }, that._elementsGroup); that._bordersGroup && that._applyGroupSettings(style.border, { "class": "dxc-borders" }, that._bordersGroup); chartScatterSeries._setGroupsSettings.call(that, animationEnabled); animationEnabled && that._markersGroup && that._markersGroup.attr({ opacity: .001 }) }, _createGroups: function() { var that = this; that._createGroup("_elementsGroup", that, that._group); that._areBordersVisible() && that._createGroup("_bordersGroup", that, that._group); chartScatterSeries._createGroups.call(that) }, _areBordersVisible: function() { return false }, _getDefaultSegment: function(segment) { return { line: _map(segment.line || [], function(pt) { return pt.getDefaultCoords() }) } }, _prepareSegment: function(points) { return { line: points } }, _parseLineOptions: function(options, defaultColor) { return { stroke: options.color || defaultColor, "stroke-width": options.width, dashStyle: options.dashStyle || "solid" } }, _parseStyle: function(options, defaultColor) { return { elements: this._parseLineOptions(options, defaultColor) } }, _applyStyle: function(style) { var that = this; that._elementsGroup && that._elementsGroup.attr(style.elements); _each(that._graphics || [], function(_, graphic) { graphic.line && graphic.line.attr({ "stroke-width": style.elements["stroke-width"] }).sharp() }) }, _drawElement: function(segment, group) { return { line: this._createMainElement(segment.line, { "stroke-width": this._styles.normal.elements["stroke-width"] }).append(group) } }, _removeElement: function(element) { element.line.remove() }, _generateDefaultSegments: function() { var that = this; return _map(that._segments || [], function(segment) { return that._getDefaultSegment(segment) }) }, _updateElement: function(element, segment, animate, animateParams, complete) { var params = { points: segment.line }, lineElement = element.line; animate ? lineElement.animate(params, animateParams, complete) : lineElement.attr(params) }, _clearingAnimation: function(drawComplete) { var that = this, lastIndex = that._graphics.length - 1, settings = { opacity: .001 }, options = { duration: that._defaultDuration, partitionDuration: .5 }; that._labelsGroup && that._labelsGroup.animate(settings, options, function() { that._markersGroup && that._markersGroup.animate(settings, options, function() { _each(that._defaultSegments || [], function(i, segment) { that._oldUpdateElement(that._graphics[i], segment, true, { partitionDuration: .5 }, i === lastIndex ? drawComplete : void 0) }) }) }) }, _animateComplete: function() { var that = this; chartScatterSeries._animateComplete.call(this); that._markersGroup && that._markersGroup.animate({ opacity: 1 }, { duration: that._defaultDuration }) }, _animate: function() { var that = this, lastIndex = that._graphics.length - 1; _each(that._graphics || [], function(i, elem) { that._updateElement(elem, that._segments[i], true, { complete: i === lastIndex ? function() { that._animateComplete() } : void 0 }) }) }, _drawPoint: function(options) { chartScatterSeries._drawPoint.call(this, { point: options.point, groups: options.groups }) }, _createMainElement: function(points, settings) { return this._renderer.path(points, "line").attr(settings).sharp() }, _drawSegment: function(points, animationEnabled, segmentCount, lastSegment) { var that = this, segment = that._prepareSegment(points, that._options.rotated, lastSegment); that._segments.push(segment); if (!that._graphics[segmentCount]) { that._graphics[segmentCount] = that._drawElement(animationEnabled ? that._getDefaultSegment(segment) : segment, that._elementsGroup) } else { if (!animationEnabled) { that._updateElement(that._graphics[segmentCount], segment) } } }, _getTrackerSettings: function() { var that = this, defaultTrackerWidth = that._defaultTrackerWidth, strokeWidthFromElements = that._styles.normal.elements["stroke-width"]; return { "stroke-width": strokeWidthFromElements > defaultTrackerWidth ? strokeWidthFromElements : defaultTrackerWidth, fill: "none" } }, _getMainPointsFromSegment: function(segment) { return segment.line }, _drawTrackerElement: function(segment) { return this._createMainElement(this._getMainPointsFromSegment(segment), this._getTrackerSettings(segment)) }, _updateTrackerElement: function(segment, element) { var settings = this._getTrackerSettings(segment); settings.points = this._getMainPointsFromSegment(segment); element.attr(settings) } }; exports.chart.line = _extend({}, chartScatterSeries, lineMethods); exports.chart.stepline = _extend({}, exports.chart.line, { _calculateStepLinePoints: function(points) { var segment = []; _each(points, function(i, pt) { var stepY, point; if (!i) { segment.push(pt); return } stepY = segment[segment.length - 1].y; if (stepY !== pt.y) { point = objectUtils.clone(pt); point.y = stepY; segment.push(point) } segment.push(pt) }); return segment }, _prepareSegment: function(points) { return exports.chart.line._prepareSegment(this._calculateStepLinePoints(points)) } }); exports.chart.spline = _extend({}, exports.chart.line, { _calculateBezierPoints: function(src, rotated) { var bezierPoints = [], pointsCopy = src, checkExtremum = function(otherPointCoord, pointCoord, controlCoord) { return otherPointCoord > pointCoord && controlCoord > otherPointCoord || otherPointCoord < pointCoord && controlCoord < otherPointCoord ? otherPointCoord : controlCoord }; if (1 !== pointsCopy.length) { pointsCopy.forEach(function(curPoint, i) { var leftControlX, leftControlY, rightControlX, rightControlY, xCur, yCur, x1, x2, y1, y2, curIsExtremum, leftPoint, rightPoint, a, b, c, xc, yc, shift, prevPoint = pointsCopy[i - 1], nextPoint = pointsCopy[i + 1], lambda = .5; if (!i || i === pointsCopy.length - 1) { bezierPoints.push(curPoint, curPoint); return } xCur = curPoint.x; yCur = curPoint.y; x1 = prevPoint.x; x2 = nextPoint.x; y1 = prevPoint.y; y2 = nextPoint.y; curIsExtremum = !!(!rotated && (yCur <= prevPoint.y && yCur <= nextPoint.y || yCur >= prevPoint.y && yCur >= nextPoint.y) || rotated && (xCur <= prevPoint.x && xCur <= nextPoint.x || xCur >= prevPoint.x && xCur >= nextPoint.x)); if (curIsExtremum) { if (!rotated) { rightControlY = leftControlY = yCur; rightControlX = (xCur + nextPoint.x) / 2; leftControlX = (xCur + prevPoint.x) / 2 } else { rightControlX = leftControlX = xCur; rightControlY = (yCur + nextPoint.y) / 2; leftControlY = (yCur + prevPoint.y) / 2 } } else { a = y2 - y1; b = x1 - x2; c = y1 * x2 - x1 * y2; if (!rotated) { if (!b) { bezierPoints.push(curPoint, curPoint, curPoint); return } xc = xCur; yc = -1 * (a * xc + c) / b; shift = yc - yCur; y1 -= shift; y2 -= shift } else { if (!a) { bezierPoints.push(curPoint, curPoint, curPoint); return } yc = yCur; xc = -1 * (b * yc + c) / a; shift = xc - xCur; x1 -= shift; x2 -= shift } rightControlX = (xCur + lambda * x2) / (1 + lambda); rightControlY = (yCur + lambda * y2) / (1 + lambda); leftControlX = (xCur + lambda * x1) / (1 + lambda); leftControlY = (yCur + lambda * y1) / (1 + lambda) } if (!rotated) { leftControlY = checkExtremum(prevPoint.y, yCur, leftControlY); rightControlY = checkExtremum(nextPoint.y, yCur, rightControlY) } else { leftControlX = checkExtremum(prevPoint.x, xCur, leftControlX); rightControlX = checkExtremum(nextPoint.x, xCur, rightControlX) } leftPoint = clonePoint(curPoint, leftControlX, leftControlY); rightPoint = clonePoint(curPoint, rightControlX, rightControlY); bezierPoints.push(leftPoint, curPoint, rightPoint) }) } else { bezierPoints.push(pointsCopy[0]) } return bezierPoints }, _prepareSegment: function(points, rotated) { return exports.chart.line._prepareSegment(this._calculateBezierPoints(points, rotated)) }, _createMainElement: function(points, settings) { return this._renderer.path(points, "bezier").attr(settings).sharp() } }); exports.polar.line = _extend({}, polarScatterSeries, lineMethods, { _prepareSegment: function(points, rotated, lastSegment) { var i, preparedPoints = [], centerPoint = this.getValueAxis().getCenter(); lastSegment && this._closeSegment(points); if (this.argumentAxisType !== DISCRETE && this.valueAxisType !== DISCRETE) { for (i = 1; i < points.length; i++) { preparedPoints = preparedPoints.concat(this._getTangentPoints(points[i], points[i - 1], centerPoint)) } if (!preparedPoints.length) { preparedPoints = points } } else { return exports.chart.line._prepareSegment.apply(this, arguments) } return { line: preparedPoints } }, _getRemainingAngle: function(angle) { var normAngle = normalizeAngle(angle); return angle >= 0 ? 360 - normAngle : -normAngle }, _closeSegment: function(points) { var point, differenceAngle; if (this._segments.length) { point = this._segments[0].line[0] } else { point = clonePoint(points[0], points[0].x, points[0].y, points[0].angle) } if (points[points.length - 1].angle !== point.angle) { if (normalizeAngle(Math.round(points[points.length - 1].angle)) === normalizeAngle(Math.round(point.angle))) { point.angle = points[points.length - 1].angle } else { differenceAngle = points[points.length - 1].angle - point.angle; point.angle = points[points.length - 1].angle + this._getRemainingAngle(differenceAngle) } points.push(point) } }, _getTangentPoints: function(point, prevPoint, centerPoint) { var i, tangentPoints = [], betweenAngle = Math.round(prevPoint.angle - point.angle), tan = (prevPoint.radius - point.radius) / betweenAngle; if (0 === betweenAngle) { tangentPoints = [prevPoint, point] } else { if (betweenAngle > 0) { for (i = betweenAngle; i >= 0; i--) { tangentPoints.push(getTangentPoint(point, prevPoint, centerPoint, tan, i)) } } else { for (i = 0; i >= betweenAngle; i--) { tangentPoints.push(getTangentPoint(point, prevPoint, centerPoint, tan, betweenAngle - i)) } } } return tangentPoints } }) }, /*!**************************************!*\ !*** ./js/viz/series/area_series.js ***! \**************************************/ function(module, exports, __webpack_require__) { var objectUtils = __webpack_require__( /*! ../../core/utils/object */ 27), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, scatterSeries = __webpack_require__( /*! ./scatter_series */ 540).chart, lineSeries = __webpack_require__( /*! ./line_series */ 541), chartLineSeries = lineSeries.chart.line, polarLineSeries = lineSeries.polar.line, _map = __webpack_require__( /*! ../core/utils */ 509).map, _extend = extend; exports.chart = {}; exports.polar = {}; var baseAreaMethods = { _createBorderElement: chartLineSeries._createMainElement, _createLegendState: function(styleOptions, defaultColor) { var legendState = scatterSeries._createLegendState.call(this, styleOptions, defaultColor); legendState.opacity = styleOptions.opacity; return legendState }, getValueRangeInitialValue: function() { if ("logarithmic" !== this.valueAxisType && "datetime" !== this.valueType && false !== this.showZero) { return 0 } else { return scatterSeries.getValueRangeInitialValue.call(this) } }, _getDefaultSegment: function(segment) { var defaultSegment = chartLineSeries._getDefaultSegment(segment); defaultSegment.area = defaultSegment.line.concat(defaultSegment.line.slice().reverse()); return defaultSegment }, _updateElement: function(element, segment, animate, animateParams, complete) { var lineParams = { points: segment.line }, areaParams = { points: segment.area }, borderElement = element.line; if (animate) { borderElement && borderElement.animate(lineParams, animateParams); element.area.animate(areaParams, animateParams, complete) } else { borderElement && borderElement.attr(lineParams); element.area.attr(areaParams) } }, _removeElement: function(element) { element.line && element.line.remove(); element.area.remove() }, _drawElement: function(segment) { return { line: this._bordersGroup && this._createBorderElement(segment.line, { "stroke-width": this._styles.normal.border["stroke-width"] }).append(this._bordersGroup), area: this._createMainElement(segment.area).append(this._elementsGroup) } }, _applyStyle: function(style) { var that = this; that._elementsGroup && that._elementsGroup.smartAttr(style.elements); that._bordersGroup && that._bordersGroup.attr(style.border); (that._graphics || []).forEach(function(graphic) { graphic.line && graphic.line.attr({ "stroke-width": style.border["stroke-width"] }).sharp() }) }, _parseStyle: function(options, defaultColor, defaultBorderColor) { var borderOptions = options.border || {}, borderStyle = chartLineSeries._parseLineOptions(borderOptions, defaultBorderColor); borderStyle.stroke = borderOptions.visible && borderStyle["stroke-width"] ? borderStyle.stroke : "none"; borderStyle["stroke-width"] = borderStyle["stroke-width"] || 1; return { border: borderStyle, elements: { stroke: "none", fill: options.color || defaultColor, hatching: options.hatching, opacity: options.opacity } } }, _areBordersVisible: function() { var options = this._options; return options.border.visible || options.hoverStyle.border.visible || options.selectionStyle.border.visible }, _createMainElement: function(points, settings) { return this._renderer.path(points, "area").attr(settings) }, _getTrackerSettings: function(segment) { return { "stroke-width": segment.singlePointSegment ? this._defaultTrackerWidth : 0 } }, _getMainPointsFromSegment: function(segment) { return segment.area } }; exports.chart.area = _extend({}, chartLineSeries, baseAreaMethods, { _prepareSegment: function(points, rotated) { var processedPoints = this._processSinglePointsAreaSegment(points, rotated); return { line: processedPoints, area: _map(processedPoints, function(pt) { return pt.getCoords() }).concat(_map(processedPoints.slice().reverse(), function(pt) { return pt.getCoords(true) })), singlePointSegment: processedPoints !== points } }, _processSinglePointsAreaSegment: function(points, rotated) { if (1 === points.length) { var p = points[0], p1 = objectUtils.clone(p); p1[rotated ? "y" : "x"] += 1; p1.argument = null; return [p, p1] } return points } }); exports.polar.area = _extend({}, polarLineSeries, baseAreaMethods, { _prepareSegment: function(points, rotated, lastSegment) { lastSegment && polarLineSeries._closeSegment.call(this, points); var preparedPoints = exports.chart.area._prepareSegment.call(this, points); return preparedPoints }, _processSinglePointsAreaSegment: function(points) { return lineSeries.polar.line._prepareSegment.call(this, points).line } }); exports.chart.steparea = _extend({}, exports.chart.area, { _prepareSegment: function(points, rotated) { points = exports.chart.area._processSinglePointsAreaSegment(points, rotated); return exports.chart.area._prepareSegment.call(this, lineSeries.chart.stepline._calculateStepLinePoints(points)) } }); exports.chart.splinearea = _extend({}, exports.chart.area, { _areaPointsToSplineAreaPoints: function(areaPoints) { var previousMiddlePoint = areaPoints[areaPoints.length / 2 - 1], middlePoint = areaPoints[areaPoints.length / 2]; areaPoints.splice(areaPoints.length / 2, 0, { x: previousMiddlePoint.x, y: previousMiddlePoint.y }, { x: middlePoint.x, y: middlePoint.y }); if (previousMiddlePoint.defaultCoords) { areaPoints[areaPoints.length / 2].defaultCoords = true } if (middlePoint.defaultCoords) { areaPoints[areaPoints.length / 2 - 1].defaultCoords = true } }, _prepareSegment: function(points, rotated) { var areaSeries = exports.chart.area, processedPoints = areaSeries._processSinglePointsAreaSegment(points, rotated), areaSegment = areaSeries._prepareSegment.call(this, lineSeries.chart.spline._calculateBezierPoints(processedPoints, rotated)); this._areaPointsToSplineAreaPoints(areaSegment.area); areaSegment.singlePointSegment = processedPoints !== points; return areaSegment }, _getDefaultSegment: function(segment) { var areaDefaultSegment = exports.chart.area._getDefaultSegment(segment); this._areaPointsToSplineAreaPoints(areaDefaultSegment.area); return areaDefaultSegment }, _createMainElement: function(points, settings) { return this._renderer.path(points, "bezierarea").attr(settings) }, _createBorderElement: lineSeries.chart.spline._createMainElement }) }, /*!*************************************!*\ !*** ./js/viz/series/bar_series.js ***! \*************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, scatterSeries = __webpack_require__( /*! ./scatter_series */ 540), areaSeries = __webpack_require__( /*! ./area_series */ 542).chart.area, chartSeries = scatterSeries.chart, polarSeries = scatterSeries.polar, _extend = extend, _each = $.each, DEFAULT_BAR_POINT_SIZE = 3; exports.chart = {}; exports.polar = {}; var baseBarSeriesMethods = { _updateOptions: function(options) { this._stackName = "axis_" + (options.axis || "default") + "_stack_" + (options.stack || "default") }, _parsePointStyle: function(style, defaultColor, defaultBorderColor) { var color = style.color || defaultColor, base = chartSeries._parsePointStyle.call(this, style, color, defaultBorderColor); base.fill = color; base.hatching = style.hatching; base.dashStyle = style.border && style.border.dashStyle || "solid"; delete base.r; return base }, _applyMarkerClipRect: function(settings) { settings["clip-path"] = null }, _clearingAnimation: function(drawComplete) { var that = this, settings = that._oldGetAffineCoordOptions() || that._getAffineCoordOptions(); that._labelsGroup && that._labelsGroup.animate({ opacity: .001 }, { duration: that._defaultDuration, partitionDuration: .5 }, function() { that._markersGroup.animate(settings, { partitionDuration: .5 }, function() { that._markersGroup.attr({ scaleX: null, scaleY: null, translateX: 0, translateY: 0 }); drawComplete() }) }) }, _setGroupsSettings: function(animationEnabled, firstDrawing) { var that = this, settings = {}; chartSeries._setGroupsSettings.apply(that, arguments); if (animationEnabled && firstDrawing) { settings = this._getAffineCoordOptions() } else { if (!animationEnabled) { settings = { scaleX: 1, scaleY: 1, translateX: 0, translateY: 0 } } } that._markersGroup.attr(settings) }, _drawPoint: function(options) { options.hasAnimation = options.hasAnimation && !options.firstDrawing; options.firstDrawing = false; chartSeries._drawPoint.call(this, options) }, _getMainColor: function() { return this._options.mainSeriesColor }, _createPointStyles: function(pointOptions) { var that = this, mainColor = pointOptions.color || that._getMainColor(); return { normal: that._parsePointStyle(pointOptions, mainColor, mainColor), hover: that._parsePointStyle(pointOptions.hoverStyle || {}, mainColor, mainColor), selection: that._parsePointStyle(pointOptions.selectionStyle || {}, mainColor, mainColor) } }, _updatePointsVisibility: function() { var visibility = this._options.visible; $.each(this._points, function(_, point) { point._options.visible = visibility }) }, _getOptionsForPoint: function() { return this._options }, _animate: function(firstDrawing) { var that = this, complete = function() { that._animateComplete() }, animateFunc = function(drawnPoints, complete) { var lastPointIndex = drawnPoints.length - 1; _each(drawnPoints || [], function(i, point) { point.animate(i === lastPointIndex ? complete : void 0, point.getMarkerCoords()) }) }; that._animatePoints(firstDrawing, complete, animateFunc) }, _getPointSize: function() { return DEFAULT_BAR_POINT_SIZE }, getValueRangeInitialValue: areaSeries.getValueRangeInitialValue }; exports.chart.bar = _extend({}, chartSeries, baseBarSeriesMethods, { _getAffineCoordOptions: function() { var rotated = this._options.rotated, direction = rotated ? "X" : "Y", settings = { scaleX: rotated ? .001 : 1, scaleY: rotated ? 1 : .001 }; settings["translate" + direction] = this.getValueAxis().getTranslator().translate("canvas_position_default"); return settings }, _processRange: function(range) { areaSeries._processRange.apply(this, arguments); range.arg.stick = false }, _animatePoints: function(firstDrawing, complete, animateFunc) { var that = this; that._markersGroup.animate({ scaleX: 1, scaleY: 1, translateY: 0, translateX: 0 }, void 0, complete); if (!firstDrawing) { animateFunc(that._drawnPoints, complete) } } }); exports.polar.bar = _extend({}, polarSeries, baseBarSeriesMethods, { _animatePoints: function(firstDrawing, complete, animateFunc) { animateFunc(this._drawnPoints, complete) }, _setGroupsSettings: chartSeries._setGroupsSettings, _drawPoint: function(point, groups, animationEnabled) { chartSeries._drawPoint.call(this, point, groups, animationEnabled) }, _parsePointStyle: function(style) { var base = baseBarSeriesMethods._parsePointStyle.apply(this, arguments); base.opacity = style.opacity; return base }, _createGroups: chartSeries._createGroups, _setMarkerGroupSettings: function() { var groupSettings, that = this, markersSettings = that._createPointStyles(that._getMarkerGroupOptions()).normal; markersSettings.class = "dxc-markers"; that._applyMarkerClipRect(markersSettings); groupSettings = _extend({}, markersSettings); delete groupSettings.opacity; that._markersGroup.attr(groupSettings) }, _createLegendState: areaSeries._createLegendState }) }, /*!***************************************!*\ !*** ./js/viz/series/range_series.js ***! \***************************************/ function(module, exports, __webpack_require__) { var commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, _extend = extend, _isDefined = commonUtils.isDefined, _map = __webpack_require__( /*! ../core/utils */ 509).map, _noop = commonUtils.noop, rangeCalculator = __webpack_require__( /*! ./helpers/range_data_calculator */ 539), scatterSeries = __webpack_require__( /*! ./scatter_series */ 540).chart, barSeries = __webpack_require__( /*! ./bar_series */ 543).chart.bar, areaSeries = __webpack_require__( /*! ./area_series */ 542).chart.area; exports.chart = {}; var baseRangeSeries = { _beginUpdateData: _noop, areErrorBarsVisible: _noop, _createErrorBarGroup: _noop, _checkData: function(data) { return _isDefined(data.argument) && void 0 !== data.value && void 0 !== data.minValue }, updateTemplateFieldNames: function() { var that = this, options = that._options, valueFields = that.getValueFields(), name = that.name; options.rangeValue1Field = valueFields[0] + name; options.rangeValue2Field = valueFields[1] + name; options.tagField = that.getTagField() + name }, getValueRangeInitialValue: scatterSeries.getValueRangeInitialValue, _getPointData: function(data, options) { return { tag: data[options.tagField || "tag"], minValue: data[options.rangeValue1Field || "val1"], value: data[options.rangeValue2Field || "val2"], argument: data[options.argumentField || "arg"] } }, _fusionPoints: function(fusionPoints, tick) { var calcMedianValue = scatterSeries._calcMedianValue, value = calcMedianValue.call(this, fusionPoints, "value"), minValue = calcMedianValue.call(this, fusionPoints, "minValue"); if (null === value || null === minValue) { value = minValue = null } return { minValue: minValue, value: value, argument: tick, tag: null } }, getValueFields: function() { return [this._options.rangeValue1Field || "val1", this._options.rangeValue2Field || "val2"] }, _processRange: function(range) { rangeCalculator.addRangeSeriesLabelPaddings(this, range.val) } }; exports.chart.rangebar = _extend({}, barSeries, baseRangeSeries); exports.chart.rangearea = _extend({}, areaSeries, { _drawPoint: function(options) { var point = options.point; if (point.isInVisibleArea()) { point.clearVisibility(); point.draw(this._renderer, options.groups); this._drawnPoints.push(point); if (!point.visibleTopMarker) { point.hideMarker("top") } if (!point.visibleBottomMarker) { point.hideMarker("bottom") } } else { point.setInvisibility() } }, _prepareSegment: function(points, rotated) { var processedPoints = this._processSinglePointsAreaSegment(points, rotated), processedMinPointsCoords = _map(processedPoints, function(pt) { return pt.getCoords(true) }); return { line: processedPoints, bottomLine: processedMinPointsCoords, area: _map(processedPoints, function(pt) { return pt.getCoords() }).concat(processedMinPointsCoords.slice().reverse()), singlePointSegment: processedPoints !== points } }, _getDefaultSegment: function(segment) { var defaultSegment = areaSeries._getDefaultSegment.call(this, segment); defaultSegment.bottomLine = defaultSegment.line; return defaultSegment }, _removeElement: function(element) { areaSeries._removeElement.call(this, element); element.bottomLine && element.bottomLine.remove() }, _drawElement: function(segment, group) { var that = this, drawnElement = areaSeries._drawElement.call(that, segment, group); drawnElement.bottomLine = that._bordersGroup && that._createBorderElement(segment.bottomLine, { "stroke-width": that._styles.normal.border["stroke-width"] }).append(that._bordersGroup); return drawnElement }, _applyStyle: function(style) { var that = this, elementsGroup = that._elementsGroup, bordersGroup = that._bordersGroup; elementsGroup && elementsGroup.smartAttr(style.elements); bordersGroup && bordersGroup.attr(style.border); (that._graphics || []).forEach(function(graphic) { graphic.line && graphic.line.attr({ "stroke-width": style.border["stroke-width"] }); graphic.bottomLine && graphic.bottomLine.attr({ "stroke-width": style.border["stroke-width"] }) }) }, _updateElement: function(element, segment, animate, animateParams, complete) { areaSeries._updateElement.call(this, element, segment, animate, animateParams, complete); var bottomLineParams = { points: segment.bottomLine }, bottomBorderElement = element.bottomLine; if (bottomBorderElement) { animate ? bottomBorderElement.animate(bottomLineParams, animateParams) : bottomBorderElement.attr(bottomLineParams) } } }, baseRangeSeries) }, /*!****************************************!*\ !*** ./js/viz/series/bubble_series.js ***! \****************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), lineSeries = __webpack_require__( /*! ./line_series */ 541).chart.line, scatterSeries = __webpack_require__( /*! ./scatter_series */ 540).chart, areaSeries = __webpack_require__( /*! ./area_series */ 542).chart.area, barSeries = __webpack_require__( /*! ./bar_series */ 543), chartBarSeries = barSeries.chart.bar, polarBarSeries = barSeries.polar.bar, commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, _isDefined = commonUtils.isDefined, _extend = extend, _each = $.each, _noop = commonUtils.noop; exports.chart = {}; exports.chart.bubble = _extend({}, scatterSeries, { _fillErrorBars: _noop, getErrorBarRangeCorrector: _noop, _calculateErrorBars: _noop, _getMainColor: chartBarSeries._getMainColor, _createPointStyles: chartBarSeries._createPointStyles, _updatePointsVisibility: chartBarSeries._updatePointsVisibility, _getOptionsForPoint: chartBarSeries._getOptionsForPoint, _applyMarkerClipRect: lineSeries._applyElementsClipRect, _parsePointStyle: polarBarSeries._parsePointStyle, _createLegendState: areaSeries._createLegendState, _setMarkerGroupSettings: polarBarSeries._setMarkerGroupSettings, areErrorBarsVisible: _noop, _createErrorBarGroup: _noop, _checkData: function(data) { return _isDefined(data.argument) && _isDefined(data.size) && void 0 !== data.value }, _getPointData: function(data, options) { var pointData = scatterSeries._getPointData.call(this, data, options); pointData.size = data[options.sizeField || "size"]; return pointData }, _fusionPoints: function(fusionPoints, tick) { var calcMedianValue = scatterSeries._calcMedianValue; return { size: calcMedianValue.call(this, fusionPoints, "size"), value: calcMedianValue.call(this, fusionPoints, "value"), argument: tick, tag: null } }, getValueFields: function() { return [this._options.valueField || "val"] }, getSizeField: function() { return this._options.sizeField || "size" }, updateTemplateFieldNames: function() { var that = this, options = that._options, name = that.name; options.valueField = that.getValueFields()[0] + name; options.sizeField = that.getSizeField() + name; options.tagField = that.getTagField() + name }, _clearingAnimation: function(drawComplete) { var that = this, partitionDuration = .5, lastPointIndex = that._drawnPoints.length - 1, labelsGroup = that._labelsGroup; labelsGroup && labelsGroup.animate({ opacity: .001 }, { duration: that._defaultDuration, partitionDuration: partitionDuration }, function() { _each(that._drawnPoints || [], function(i, p) { p.animate(i === lastPointIndex ? drawComplete : void 0, { r: 0 }, partitionDuration) }) }) }, _animate: function() { var that = this, lastPointIndex = that._drawnPoints.length - 1, labelsGroup = that._labelsGroup, labelAnimFunc = function() { labelsGroup && labelsGroup.animate({ opacity: 1 }, { duration: that._defaultDuration }) }; _each(that._drawnPoints || [], function(i, p) { p.animate(i === lastPointIndex ? labelAnimFunc : void 0, { r: p.bubbleSize, translateX: p.x, translateY: p.y }) }) } }) }, /*!*************************************!*\ !*** ./js/viz/series/pie_series.js ***! \*************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, scatterSeries = __webpack_require__( /*! ./scatter_series */ 540), vizUtils = __webpack_require__( /*! ../core/utils */ 509), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, chartScatterSeries = scatterSeries.chart, barSeries = __webpack_require__( /*! ./bar_series */ 543).chart.bar, _extend = extend, _each = $.each, _noop = noop, _map = vizUtils.map, _isFinite = isFinite, _max = Math.max, ANIMATION_DURATION = .7, INSIDE = "inside"; exports.pie = _extend({}, barSeries, { _setGroupsSettings: chartScatterSeries._setGroupsSettings, _createErrorBarGroup: _noop, _drawPoint: function(options) { var point = options.point, legendCallback = this._legendCallback; chartScatterSeries._drawPoint.call(this, options); !point.isVisible() && point.setInvisibility(); point.isSelected() && legendCallback() }, adjustLabels: function() { var maxLabelLength, that = this, points = that._points || [], labelsBBoxes = []; _each(points, function(_, point) { if (point._label.isVisible()) { point.setLabelTrackerData(); if (point._label.getLayoutOptions().position !== INSIDE) { point.setLabelEllipsis(); labelsBBoxes.push(point._label.getBoundingRect().width) } } }); if (labelsBBoxes.length) { maxLabelLength = _max.apply(null, labelsBBoxes) } _each(points, function(_, point) { if (point._label.isVisible() && point._label.getLayoutOptions().position !== INSIDE) { point.setMaxLabelLength(maxLabelLength); point.updateLabelCoord() } }) }, _processRange: _noop, _applyElementsClipRect: _noop, getColor: _noop, areErrorBarsVisible: _noop, _prepareSeriesToDrawing: _noop, _endUpdateData: function() { this._arrayArguments = {}; chartScatterSeries._prepareSeriesToDrawing.call(this) }, drawLabelsWOPoints: function() { var that = this; if (that._options.label.position === INSIDE) { return false } that._labelsGroup.append(that._extGroups.labelsGroup); (that._points || []).forEach(function(point) { point.drawLabel() }); return true }, _getCreatingPointOptions: function(data) { return this._getPointOptions(data) }, _updateOptions: function(options) { this.labelSpace = 0; this.innerRadius = "pie" === this.type ? 0 : options.innerRadius }, _checkData: function(data) { var base = barSeries._checkData(data); return this._options.paintNullPoints ? base : base && null !== data.value }, _createGroups: chartScatterSeries._createGroups, _setMarkerGroupSettings: function() { var that = this; that._markersGroup.attr({ "class": "dxc-markers" }) }, _getMainColor: function(data) { var that = this, arr = that._arrayArguments || {}, argument = data.argument; arr[argument] = ++arr[argument] || 0; that._arrayArguments = arr; return that._options.mainSeriesColor(argument, arr[argument]) }, _getPointOptions: function(data) { return this._parsePointOptions(this._preparePointOptions(), this._options.label, data) }, _getRangeData: function() { return this._rangeData }, _getArrangeTotal: function(points) { var total = 0; _each(points, function(_, point) { if (point.isVisible()) { total += point.initialValue } }); return total }, _createPointStyles: function(pointOptions, data) { var that = this, mainColor = pointOptions.color || that._getMainColor(data); return { normal: that._parsePointStyle(pointOptions, mainColor, mainColor), hover: that._parsePointStyle(pointOptions.hoverStyle, mainColor, mainColor), selection: that._parsePointStyle(pointOptions.selectionStyle, mainColor, mainColor), legendStyles: { normal: that._createLegendState(pointOptions, mainColor), hover: that._createLegendState(pointOptions.hoverStyle, mainColor), selection: that._createLegendState(pointOptions.selectionStyle, mainColor) } } }, _getArrangeMinShownValue: function(points, total) { var minSegmentSize = this._options.minSegmentSize, totalMinSegmentSize = 0, totalNotMinValues = 0; total = total || points.length; _each(points, function(_, point) { if (point.isVisible()) { if (point.initialValue < minSegmentSize * total / 360) { totalMinSegmentSize += minSegmentSize } else { totalNotMinValues += point.initialValue } } }); return totalMinSegmentSize < 360 ? minSegmentSize * totalNotMinValues / (360 - totalMinSegmentSize) : 0 }, _applyArrangeCorrection: function(points, minShownValue, total) { var percent, options = this._options, isClockWise = "anticlockwise" !== options.segmentsDirection, shiftedAngle = _isFinite(options.startAngle) ? vizUtils.normalizeAngle(options.startAngle) : 0, minSegmentSize = options.minSegmentSize, correction = 0, zeroTotalCorrection = 0; if (0 === total) { total = points.filter(function(el) { return el.isVisible() }).length; zeroTotalCorrection = 1 } _each(isClockWise ? points : points.concat([]).reverse(), function(_, point) { var updatedZeroValue, val = point.isVisible() ? zeroTotalCorrection || point.initialValue : 0; if (minSegmentSize && point.isVisible() && val < minShownValue) { updatedZeroValue = minShownValue } percent = val / total; point.correctValue(correction, percent, zeroTotalCorrection + (updatedZeroValue || 0)); point.shiftedAngle = shiftedAngle; correction += updatedZeroValue || val }); this._rangeData = { val: { min: 0, max: correction } } }, _removePoint: function(point) { var points = this.getPointsByArg(point.argument); points.splice(points.indexOf(point), 1); point.dispose() }, arrangePoints: function() { var minShownValue, total, points, that = this, originalPoints = that._originalPoints || [], minSegmentSize = that._options.minSegmentSize, isAllPointsNegative = true, i = 0, len = originalPoints.length; while (i < len && isAllPointsNegative) { isAllPointsNegative = originalPoints[i].value <= 0; i++ } points = that._originalPoints = that._points = _map(originalPoints, function(point) { if (null === point.value || !isAllPointsNegative && point.value < 0) { that._removePoint(point); return null } else { return point } }); total = that._getArrangeTotal(points); if (minSegmentSize) { minShownValue = this._getArrangeMinShownValue(points, total) } that._applyArrangeCorrection(points, minShownValue, total) }, correctPosition: function(correction, canvas) { var debug = __webpack_require__( /*! ../../core/utils/console */ 13).debug; debug.assert(correction, "correction was not passed"); debug.assertParam(correction.centerX, "correction.centerX was not passed"); debug.assertParam(correction.centerY, "correction.centerY was not passed"); debug.assertParam(correction.radiusInner, "correction.radiusInner was not passed"); debug.assertParam(correction.radiusOuter, "correction.radiusOuter was not passed"); debug.assertParam(canvas, "correction.canvas was not passed"); _each(this._points, function(_, point) { point.correctPosition(correction) }); this.setVisibleArea(canvas) }, correctRadius: function(correction) { _each(this._points, function(_, point) { point.correctRadius(correction) }) }, correctLabelRadius: function(labelRadius) { _each(this._points, function(_, point) { point.correctLabelRadius(labelRadius) }) }, setVisibleArea: function(canvas) { this._visibleArea = { minX: canvas.left, maxX: canvas.width - canvas.right, minY: canvas.top, maxY: canvas.height - canvas.bottom } }, _applyVisibleArea: _noop, _animate: function(firstDrawing) { var animatePoint, that = this, points = that._points, pointsCount = points && points.length, completeFunc = function() { that._animateComplete() }; if (firstDrawing) { animatePoint = function(p, i) { p.animate(i === pointsCount - 1 ? completeFunc : void 0, ANIMATION_DURATION, (1 - ANIMATION_DURATION) * i / (pointsCount - 1)) } } else { animatePoint = function(p, i) { p.animate(i === pointsCount - 1 ? completeFunc : void 0) } } points.forEach(animatePoint) }, getVisiblePoints: function() { return _map(this._points, function(p) { return p.isVisible() ? p : null }) }, getPointsByKeys: function(arg, argumentIndex) { var pointsByArg = this.getPointsByArg(arg); return pointsByArg[argumentIndex] && [pointsByArg[argumentIndex]] || pointsByArg } }); exports.doughnut = exports.donut = exports.pie }, /*!*******************************************!*\ !*** ./js/viz/series/financial_series.js ***! \*******************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), scatterSeries = __webpack_require__( /*! ./scatter_series */ 540).chart, barSeries = __webpack_require__( /*! ./bar_series */ 543).chart.bar, rangeCalculator = __webpack_require__( /*! ./helpers/range_data_calculator */ 539), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, _isDefined = commonUtils.isDefined, _normalizeEnum = __webpack_require__( /*! ../core/utils */ 509).normalizeEnum, _extend = extend, _each = $.each, _noop = commonUtils.noop, DEFAULT_FINANCIAL_POINT_SIZE = 10; exports.stock = _extend({}, scatterSeries, { _animate: _noop, _applyMarkerClipRect: function(settings) { settings["clip-path"] = this._forceClipping ? this._paneClipRectID : this._widePaneClipRectID }, _updatePointsVisibility: barSeries._updatePointsVisibility, _getOptionsForPoint: barSeries._getOptionsForPoint, getErrorBarRangeCorrector: _noop, _createErrorBarGroup: _noop, areErrorBarsVisible: _noop, _createGroups: scatterSeries._createGroups, _setMarkerGroupSettings: function() { var that = this, markersGroup = that._markersGroup, styles = that._createPointStyles(that._getMarkerGroupOptions()), defaultStyle = _extend(styles.normal, { "class": "default-markers" }), defaultPositiveStyle = _extend(styles.positive.normal, { "class": "default-positive-markers" }), reductionStyle = _extend(styles.reduction.normal, { "class": "reduction-markers" }), reductionPositiveStyle = _extend(styles.reductionPositive.normal, { "class": "reduction-positive-markers" }), markerSettings = { "class": "dxc-markers" }; that._applyMarkerClipRect(markerSettings); markersGroup.attr(markerSettings); that._createGroup("defaultMarkersGroup", markersGroup, markersGroup, defaultStyle); that._createGroup("reductionMarkersGroup", markersGroup, markersGroup, reductionStyle); that._createGroup("defaultPositiveMarkersGroup", markersGroup, markersGroup, defaultPositiveStyle); that._createGroup("reductionPositiveMarkersGroup", markersGroup, markersGroup, reductionPositiveStyle) }, _setGroupsSettings: function() { scatterSeries._setGroupsSettings.call(this, false) }, _clearingAnimation: function(drawComplete) { drawComplete() }, _getCreatingPointOptions: function() { var defaultPointOptions, that = this, creatingPointOptions = that._predefinedPointOptions; if (!creatingPointOptions) { defaultPointOptions = this._getPointOptions(); that._predefinedPointOptions = creatingPointOptions = _extend(true, { styles: {} }, defaultPointOptions); creatingPointOptions.styles.normal = creatingPointOptions.styles.positive.normal = creatingPointOptions.styles.reduction.normal = creatingPointOptions.styles.reductionPositive.normal = { "stroke-width": defaultPointOptions.styles && defaultPointOptions.styles.normal && defaultPointOptions.styles.normal["stroke-width"] } } return creatingPointOptions }, _checkData: function(data) { return _isDefined(data.argument) && void 0 !== data.highValue && void 0 !== data.lowValue && void 0 !== data.openValue && void 0 !== data.closeValue }, _getPointData: function(data, options) { var level, reductionValue, that = this, openValueField = options.openValueField || "open", closeValueField = options.closeValueField || "close", highValueField = options.highValueField || "high", lowValueField = options.lowValueField || "low"; that.level = options.reduction.level; switch (_normalizeEnum(that.level)) { case "open": level = openValueField; break; case "high": level = highValueField; break; case "low": level = lowValueField; break; default: level = closeValueField; that.level = "close" } reductionValue = data[level]; return { argument: data[options.argumentField || "date"], highValue: data[highValueField], lowValue: data[lowValueField], closeValue: data[closeValueField], openValue: data[openValueField], reductionValue: reductionValue, tag: data[options.tagField || "tag"], isReduction: that._checkReduction(reductionValue) } }, _parsePointStyle: function(style, defaultColor, innerColor) { return { stroke: style.color || defaultColor, "stroke-width": style.width, fill: style.color || innerColor } }, updateTemplateFieldNames: function() { var that = this, options = that._options, valueFields = that.getValueFields(), name = that.name; options.openValueField = valueFields[0] + name; options.highValueField = valueFields[1] + name; options.lowValueField = valueFields[2] + name; options.closeValueField = valueFields[3] + name; options.tagField = that.getTagField() + name }, _getDefaultStyle: function(options) { var that = this, mainPointColor = options.color || that._options.mainSeriesColor; return { normal: that._parsePointStyle(options, mainPointColor, mainPointColor), hover: that._parsePointStyle(options.hoverStyle, mainPointColor, mainPointColor), selection: that._parsePointStyle(options.selectionStyle, mainPointColor, mainPointColor) } }, _getReductionStyle: function(options) { var that = this, reductionColor = options.reduction.color; return { normal: that._parsePointStyle({ color: reductionColor, width: options.width, hatching: options.hatching }, reductionColor, reductionColor), hover: that._parsePointStyle(options.hoverStyle, reductionColor, reductionColor), selection: that._parsePointStyle(options.selectionStyle, reductionColor, reductionColor) } }, _createPointStyles: function(pointOptions) { var positiveStyle, reductionStyle, reductionPositiveStyle, that = this, innerColor = that._options.innerColor, styles = that._getDefaultStyle(pointOptions); positiveStyle = _extend(true, {}, styles); reductionStyle = that._getReductionStyle(pointOptions); reductionPositiveStyle = _extend(true, {}, reductionStyle); positiveStyle.normal.fill = positiveStyle.hover.fill = positiveStyle.selection.fill = innerColor; reductionPositiveStyle.normal.fill = reductionPositiveStyle.hover.fill = reductionPositiveStyle.selection.fill = innerColor; styles.positive = positiveStyle; styles.reduction = reductionStyle; styles.reductionPositive = reductionPositiveStyle; return styles }, _endUpdateData: function() { delete this.prevLevelValue; delete this._predefinedPointOptions }, _checkReduction: function(value) { var that = this, result = false; if (null !== value) { if (_isDefined(that.prevLevelValue)) { result = value < that.prevLevelValue } that.prevLevelValue = value } return result }, _fusionPoints: function(fusionPoints, tick) { var reductionLevel, openValue, closeValue, fusedPointData = {}, highValue = -(1 / 0), lowValue = +(1 / 0); if (!fusionPoints.length) { return {} } _each(fusionPoints, function(_, point) { if (!point.hasValue()) { return } highValue = Math.max(highValue, point.highValue); lowValue = Math.min(lowValue, point.lowValue); openValue = void 0 !== openValue ? openValue : point.openValue; closeValue = void 0 !== point.closeValue ? point.closeValue : closeValue }); fusedPointData.argument = tick; fusedPointData.openValue = openValue; fusedPointData.closeValue = closeValue; fusedPointData.highValue = highValue; fusedPointData.lowValue = lowValue; fusedPointData.tag = null; switch (_normalizeEnum(this.level)) { case "open": reductionLevel = openValue; break; case "high": reductionLevel = highValue; break; case "low": reductionLevel = lowValue; break; default: reductionLevel = closeValue } fusedPointData.reductionValue = reductionLevel; fusedPointData.isReduction = this._checkReduction(reductionLevel); return fusedPointData }, _getPointSize: function() { return DEFAULT_FINANCIAL_POINT_SIZE }, getValueFields: function() { var options = this._options; return [options.openValueField || "open", options.highValueField || "high", options.lowValueField || "low", options.closeValueField || "close"] }, getArgumentField: function() { return this._options.argumentField || "date" }, _beginUpdateData: _noop, _processRange: function(range) { rangeCalculator.addRangeSeriesLabelPaddings(this, range.val) } }); exports.candlestick = _extend({}, exports.stock, { _beginUpdateData: barSeries._beginUpdateData, _parsePointStyle: function(style, defaultColor, innerColor) { var color = style.color || innerColor, base = exports.stock._parsePointStyle.call(this, style, defaultColor, color); base.fill = color; base.hatching = style.hatching; return base } }) }, /*!*****************************************!*\ !*** ./js/viz/series/stacked_series.js ***! \*****************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, areaSeries = __webpack_require__( /*! ./area_series */ 542).chart, chartAreaSeries = areaSeries.area, barSeries = __webpack_require__( /*! ./bar_series */ 543), chartBarSeries = barSeries.chart.bar, lineSeries = __webpack_require__( /*! ./line_series */ 541).chart, _extend = extend, vizUtils = __webpack_require__( /*! ../core/utils */ 509), objectUtils = __webpack_require__( /*! ../../core/utils/object */ 27), _noop = noop, baseStackedSeries = { getErrorBarRangeCorrector: _noop, _fillErrorBars: _noop, _calculateErrorBars: _noop }, baseFullStackedSeries = _extend({}, baseStackedSeries, { isFullStackedSeries: function() { return true } }); exports.chart = {}; exports.polar = {}; exports.chart.stackedline = _extend({}, lineSeries.line, baseStackedSeries, {}); exports.chart.stackedspline = _extend({}, lineSeries.spline, baseStackedSeries, {}); var fullStackedLineSeries = exports.chart.fullstackedline = _extend({}, lineSeries.line, baseFullStackedSeries, { _processRange: function(range) { lineSeries.line._processRange.apply(this, arguments); range.val.percentStick = true }, getValueRangeInitialValue: areaSeries.area.getValueRangeInitialValue }); exports.chart.fullstackedspline = _extend({}, lineSeries.spline, baseFullStackedSeries, { _processRange: function(range) { lineSeries.line._processRange.apply(this, arguments); range.val.percentStick = true }, getValueRangeInitialValue: areaSeries.area.getValueRangeInitialValue }); exports.chart.stackedbar = _extend({}, chartBarSeries, baseStackedSeries, {}); exports.chart.fullstackedbar = _extend({}, chartBarSeries, baseFullStackedSeries, { _processRange: function(range) { chartBarSeries._processRange.apply(this, arguments); range.val.percentStick = true } }); function clonePoint(point, value, minValue, position) { point = objectUtils.clone(point); point.value = value; point.minValue = minValue; point.translate(); point.argument = point.argument + position; return point } function preparePointsForStackedAreaSegment(points) { var p, array, i = 0, result = [], len = points.length; while (i < len) { p = points[i]; array = [p]; if (p.leftHole) { array = [clonePoint(p, p.leftHole, p.minLeftHole, "left"), p] } if (p.rightHole) { array.push(clonePoint(p, p.rightHole, p.minRightHole, "right")) } result.push(array); i++ } return [].concat.apply([], result) } exports.chart.stackedarea = _extend({}, chartAreaSeries, baseStackedSeries, { _prepareSegment: function(points, rotated) { return chartAreaSeries._prepareSegment.call(this, preparePointsForStackedAreaSegment(points, this._prevSeries), rotated) }, _appendInGroup: function() { this._group.append(this._extGroups.seriesGroup).toBackground() } }); function getPointsByArgFromPrevSeries(prevSeries, argument) { var result; while (!result && prevSeries) { result = prevSeries._segmentByArg && prevSeries._segmentByArg[argument]; prevSeries = prevSeries._prevSeries } return result } exports.chart.stackedsplinearea = _extend({}, areaSeries.splinearea, baseStackedSeries, { _prepareSegment: function(points, rotated) { var areaSegment, that = this; points = preparePointsForStackedAreaSegment(points, that._prevSeries); if (!this._prevSeries || 1 === points.length) { areaSegment = areaSeries.splinearea._prepareSegment.call(this, points, rotated) } else { var forwardPoints = lineSeries.spline._calculateBezierPoints(points, rotated), backwardPoints = vizUtils.map(points, function(p) { var point = p.getCoords(true); point.argument = p.argument; return point }), prevSeriesForwardPoints = [], pointByArg = {}, i = 0, len = that._prevSeries._segments.length; while (i < len) { prevSeriesForwardPoints = prevSeriesForwardPoints.concat(that._prevSeries._segments[i].line); i++ } $.each(prevSeriesForwardPoints, function(_, p) { if (null !== p.argument) { var argument = p.argument.valueOf(); if (!pointByArg[argument]) { pointByArg[argument] = [p] } else { pointByArg[argument].push(p) } } }); that._prevSeries._segmentByArg = pointByArg; backwardPoints = lineSeries.spline._calculateBezierPoints(backwardPoints, rotated); $.each(backwardPoints, function(i, p) { var prevSeriesPoints, argument = p.argument.valueOf(); if (i % 3 === 0) { prevSeriesPoints = pointByArg[argument] || getPointsByArgFromPrevSeries(that._prevSeries, argument); if (prevSeriesPoints) { backwardPoints[i - 1] && prevSeriesPoints[0] && (backwardPoints[i - 1] = prevSeriesPoints[0]); backwardPoints[i + 1] && (backwardPoints[i + 1] = prevSeriesPoints[2] || p) } } }); areaSegment = { line: forwardPoints, area: forwardPoints.concat(backwardPoints.reverse()) }; that._areaPointsToSplineAreaPoints(areaSegment.area) } return areaSegment }, _appendInGroup: exports.chart.stackedarea._appendInGroup }); exports.chart.fullstackedarea = _extend({}, chartAreaSeries, baseFullStackedSeries, { _prepareSegment: exports.chart.stackedarea._prepareSegment, _appendInGroup: exports.chart.stackedarea._appendInGroup, _processRange: fullStackedLineSeries._processRange }); exports.chart.fullstackedsplinearea = _extend({}, areaSeries.splinearea, baseFullStackedSeries, { _prepareSegment: exports.chart.stackedsplinearea._prepareSegment, _appendInGroup: exports.chart.stackedarea._appendInGroup, _processRange: fullStackedLineSeries._processRange }); exports.polar.stackedbar = _extend({}, barSeries.polar.bar, baseStackedSeries, {}) }, /*!**************************************************!*\ !*** ./js/viz/components/chart_theme_manager.js ***! \**************************************************/ function(module, exports, __webpack_require__) { var commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), typeUtils = __webpack_require__( /*! ../../core/utils/type */ 12), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, BaseThemeManager = __webpack_require__( /*! ../core/base_theme_manager */ 550).BaseThemeManager, _isString = commonUtils.isString, _isDefined = commonUtils.isDefined, _normalizeEnum = __webpack_require__( /*! ../core/utils */ 509).normalizeEnum, FONT = "font", COMMON_AXIS_SETTINGS = "commonAxisSettings", PIE_FONT_FIELDS = ["legend." + FONT, "title." + FONT, "title.subtitle." + FONT, "tooltip." + FONT, "loadingIndicator." + FONT, "export." + FONT, "commonSeriesSettings.label." + FONT], POLAR_FONT_FIELDS = PIE_FONT_FIELDS.concat([COMMON_AXIS_SETTINGS + ".label." + FONT, COMMON_AXIS_SETTINGS + ".title." + FONT]), CHART_FONT_FIELDS = POLAR_FONT_FIELDS.concat(["crosshair.label." + FONT]), chartToFontFieldsMap = { pie: PIE_FONT_FIELDS, chart: CHART_FONT_FIELDS, polar: POLAR_FONT_FIELDS }; var ThemeManager = BaseThemeManager.inherit(function() { var ctor = function(options, themeGroupName) { var that = this; that.callBase.apply(that, arguments); options = options || {}; that._userOptions = options; that._mergeAxisTitleOptions = []; that._multiPieColors = {}; that._themeSection = themeGroupName; that._fontFields = chartToFontFieldsMap[themeGroupName]; that._callback = commonUtils.noop }; var dispose = function() { var that = this; that.palette && that.palette.dispose(); that.palette = that._userOptions = that._mergedSettings = that._multiPieColors = null; return that.callBase.apply(that, arguments) }; var resetPalette = function() { this.palette.reset(); this._multiPieColors = {} }; var updatePalette = function(palette) { this.palette = this.createPalette(palette, { useHighlight: true }) }; var processTitleOptions = function(options) { return _isString(options) ? { text: options } : options }; var processAxisOptions = function(axisOptions) { if (!axisOptions) { return } axisOptions = extend(true, {}, axisOptions); axisOptions.title = processTitleOptions(axisOptions.title); if ("logarithmic" === axisOptions.type && axisOptions.logarithmBase <= 0 || axisOptions.logarithmBase && !commonUtils.isNumeric(axisOptions.logarithmBase)) { axisOptions.logarithmBase = void 0; axisOptions.logarithmBaseError = true } if (axisOptions.label) { if (axisOptions.label.alignment) { axisOptions.label.userAlignment = true } if (_isString(axisOptions.label.overlappingBehavior)) { axisOptions.label.overlappingBehavior = { mode: axisOptions.label.overlappingBehavior } } if (!axisOptions.label.overlappingBehavior || !axisOptions.label.overlappingBehavior.mode) { axisOptions.label.overlappingBehavior = axisOptions.label.overlappingBehavior || {} } } return axisOptions }; var applyParticularAxisOptions = function(name, userOptions, rotated) { var theme = this._theme, position = !(rotated ^ "valueAxis" === name) ? "horizontalAxis" : "verticalAxis", commonAxisSettings = processAxisOptions(this._userOptions.commonAxisSettings, name); return extend(true, {}, theme.commonAxisSettings, theme[position], theme[name], commonAxisSettings, processAxisOptions(userOptions, name)) }; var mergeOptions = function(name, userOptions) { userOptions = userOptions || this._userOptions[name]; var theme = this._theme[name], result = this._mergedSettings[name]; if (result) { return result } if (typeUtils.isPlainObject(theme) && typeUtils.isPlainObject(userOptions)) { result = extend(true, {}, theme, userOptions) } else { result = _isDefined(userOptions) ? userOptions : theme } this._mergedSettings[name] = result; return result }; var applyParticularTheme = { base: mergeOptions, argumentAxis: applyParticularAxisOptions, valueAxisRangeSelector: function() { return mergeOptions.call(this, "valueAxis") }, valueAxis: applyParticularAxisOptions, series: function(name, userOptions) { var settings, mainSeriesColor, seriesVisibility, that = this, theme = that._theme, userCommonSettings = that._userOptions.commonSeriesSettings || {}, themeCommonSettings = theme.commonSeriesSettings, widgetType = that._themeSection.split(".").slice(-1)[0], type = _normalizeEnum(userOptions.type || userCommonSettings.type || themeCommonSettings.type || "pie" === widgetType && theme.type), palette = that.palette, isBar = ~type.indexOf("bar"), isLine = ~type.indexOf("line"), isArea = ~type.indexOf("area"), isBubble = "bubble" === type, resolveLabelsOverlapping = that.getOptions("resolveLabelsOverlapping"), containerBackgroundColor = that.getOptions("containerBackgroundColor"); if (isBar || isBubble) { userOptions = extend(true, {}, userCommonSettings, userCommonSettings[type], userOptions); seriesVisibility = userOptions.visible; userCommonSettings = { type: {} }; extend(true, userOptions, userOptions.point); userOptions.visible = seriesVisibility } settings = extend(true, {}, themeCommonSettings, themeCommonSettings[type], userCommonSettings, userCommonSettings[type], userOptions); settings.type = type; settings.widgetType = widgetType; settings.containerBackgroundColor = containerBackgroundColor; if ("pie" !== widgetType) { mainSeriesColor = settings.color || palette.getNextColor() } else { mainSeriesColor = function(argument, index) { var cat = argument + index; if (!that._multiPieColors[cat]) { that._multiPieColors[cat] = palette.getNextColor() } return that._multiPieColors[cat] } } settings.mainSeriesColor = mainSeriesColor; settings.resolveLabelsOverlapping = resolveLabelsOverlapping; if (settings.label && (isLine || isArea && "rangearea" !== type || "scatter" === type)) { settings.label.position = "outside" } return settings }, animation: function(name) { var userOptions = this._userOptions[name]; userOptions = typeUtils.isPlainObject(userOptions) ? userOptions : _isDefined(userOptions) ? { enabled: !!userOptions } : {}; return mergeOptions.call(this, name, userOptions) } }; return { _themeSection: "chart", ctor: ctor, dispose: dispose, resetPalette: resetPalette, getOptions: function(name) { return (applyParticularTheme[name] || applyParticularTheme.base).apply(this, arguments) }, refresh: function() { this._mergedSettings = {}; return this.callBase.apply(this, arguments) }, _initializeTheme: function() { var that = this; that.callBase.apply(that, arguments); that.updatePalette(that.getOptions("palette")) }, resetOptions: function(name) { this._mergedSettings[name] = null }, update: function(options) { this._userOptions = options }, updatePalette: updatePalette } }()); exports.ThemeManager = ThemeManager }, /*!*******************************************!*\ !*** ./js/viz/core/base_theme_manager.js ***! \*******************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), Class = __webpack_require__( /*! ../../core/class */ 25), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), paletteModule = __webpack_require__( /*! ../palette */ 512), _isString = commonUtils.isString, _parseScalar = __webpack_require__( /*! ./utils */ 509).parseScalar, themeModule = __webpack_require__( /*! ../themes */ 508), _findTheme = themeModule.findTheme, _addCacheItem = themeModule.addCacheItem, _removeCacheItem = themeModule.removeCacheItem, _extend = extend, _each = $.each; __webpack_require__( /*! ./default */ 551); __webpack_require__( /*! ./ios */ 552); __webpack_require__( /*! ./android */ 553); __webpack_require__( /*! ./win */ 554); function getThemePart(theme, path) { var _theme = theme; path && _each(path.split("."), function(_, pathItem) { return _theme = _theme[pathItem] }); return _theme } exports.BaseThemeManager = Class.inherit({ ctor: function() { _addCacheItem(this) }, dispose: function() { var that = this; _removeCacheItem(that); that._callback = that._theme = that._font = null; return that }, setCallback: function(callback) { this._callback = callback; return this }, setTheme: function(theme, rtl) { this._current = theme; this._rtl = rtl; return this.refresh() }, refresh: function() { var that = this, current = that._current || {}, theme = _findTheme(current.name || current); that._themeName = theme.name; that._defaultPalette = theme.defaultPalette; that._font = _extend({}, theme.font, current.font); that._themeSection && _each(that._themeSection.split("."), function(_, path) { theme = _extend(true, {}, theme[path]) }); that._theme = _extend(true, {}, theme, _isString(current) ? {} : current); that._initializeTheme(); if (_parseScalar(that._rtl, that._theme.rtlEnabled)) { _extend(true, that._theme, that._theme._rtl) } that._callback(); return that }, theme: function(path) { return getThemePart(this._theme, path) }, themeName: function() { return this._themeName }, createPalette: function(palette, options) { return new paletteModule.Palette(palette || this._defaultPalette, options) }, createDiscretePalette: function(palette, count) { return new paletteModule.DiscretePalette(palette || this._defaultPalette, count) }, createGradientPalette: function(palette) { return new paletteModule.GradientPalette(palette || this._defaultPalette) }, _initializeTheme: function() { var that = this; _each(that._fontFields || [], function(_, path) { that._initializeFont(getThemePart(that._theme, path)) }) }, _initializeFont: function(font) { _extend(font, this._font, _extend({}, font)) } }) }, /*!********************************!*\ !*** ./js/viz/core/default.js ***! \********************************/ function(module, exports, __webpack_require__) { var WHITE = "#ffffff", BLACK = "#000000", LIGHT_GREY = "#d3d3d3", GREY_GREEN = "#303030", SOME_GREY = "#2b2b2b", RED = "#ff0000", PRIMARY_TITLE_COLOR = "#232323", SECONDARY_TITLE_COLOR = "#767676", CONTRAST_ACTIVE = "#cf00da", MARKER_COLOR = "#f8ca00", TARGET_COLOR = "#8e8e8e", POSITIVE_COLOR = "#b8b8b8", LINE_COLOR = "#c7c7c7", AREA_LAYER_COLOR = "#686868", RANGE_COLOR = "#b5b5b5", NONE = "none", SOLID = "solid", TOP = "top", RIGHT = "right", BOTTOM = "bottom", LEFT = "left", CENTER = "center", INSIDE = "inside", OUTSIDE = "outside", themeModule = __webpack_require__( /*! ../themes */ 508), registerTheme = themeModule.registerTheme, registerThemeAlias = themeModule.registerThemeAlias; registerTheme({ name: "generic.light", font: { color: SECONDARY_TITLE_COLOR, family: "'Segoe UI', 'Helvetica Neue', 'Trebuchet MS', Verdana", weight: 400, size: 12, cursor: "default" }, redrawOnResize: true, backgroundColor: WHITE, primaryTitleColor: PRIMARY_TITLE_COLOR, secondaryTitleColor: SECONDARY_TITLE_COLOR, axisColor: LIGHT_GREY, axisLabelColor: SECONDARY_TITLE_COLOR, title: { backgroundColor: WHITE, font: { size: 28, family: "'Segoe UI Light', 'Helvetica Neue Light', 'Segoe UI', 'Helvetica Neue', 'Trebuchet MS', Verdana", weight: 200 }, subtitle: { font: { size: 16 } } }, loadingIndicator: { text: "Loading..." }, "export": { backgroundColor: WHITE, font: { size: 14, color: PRIMARY_TITLE_COLOR, weight: 400 }, button: { "default": { color: "#333", borderColor: "#ddd", backgroundColor: WHITE }, hover: { color: "#333", borderColor: "#bebebe", backgroundColor: "#e6e6e6" }, focus: { color: BLACK, borderColor: "#9d9d9d", backgroundColor: "#e6e6e6" }, active: { color: "#333", borderColor: "#9d9d9d", backgroundColor: "#d4d4d4" } }, shadowColor: LIGHT_GREY }, tooltip: { enabled: false, border: { width: 1, color: LIGHT_GREY, dashStyle: SOLID, visible: true }, font: { color: PRIMARY_TITLE_COLOR }, color: WHITE, arrowLength: 10, paddingLeftRight: 18, paddingTopBottom: 15, shared: false, location: CENTER, shadow: { opacity: .4, offsetX: 0, offsetY: 4, blur: 2, color: BLACK } }, legend: { hoverMode: "includePoints", verticalAlignment: TOP, horizontalAlignment: RIGHT, position: OUTSIDE, visible: true, margin: 10, markerSize: 12, border: { visible: false, width: 1, cornerRadius: 0, dashStyle: SOLID }, paddingLeftRight: 20, paddingTopBottom: 15, columnCount: 0, rowCount: 0, columnItemSpacing: 20, rowItemSpacing: 8 }, "chart:common": { animation: { enabled: true, duration: 1e3, easing: "easeOutCubic", maxPointCountSupported: 300 }, commonSeriesSettings: { border: { visible: false, width: 2 }, showInLegend: true, visible: true, hoverMode: "nearestPoint", selectionMode: "includePoints", hoverStyle: { hatching: { direction: RIGHT, width: 2, step: 6, opacity: .75 }, border: { visible: false, width: 3 } }, selectionStyle: { hatching: { direction: RIGHT, width: 2, step: 6, opacity: .5 }, border: { visible: false, width: 3 } }, valueErrorBar: { displayMode: "auto", value: 1, color: BLACK, lineWidth: 2, edgeLength: 8 }, label: { visible: false, alignment: CENTER, rotationAngle: 0, horizontalOffset: 0, verticalOffset: 0, radialOffset: 0, showForZeroValues: true, customizeText: void 0, maxLabelCount: void 0, position: OUTSIDE, font: { color: WHITE }, border: { visible: false, width: 1, color: LIGHT_GREY, dashStyle: SOLID }, connector: { visible: false, width: 1 } } }, seriesSelectionMode: "single", pointSelectionMode: "single", equalRowHeight: true, dataPrepareSettings: { checkTypeForAllData: false, convertToAxisDataType: true, sortingMethod: true }, title: { margin: 10 }, adaptiveLayout: { width: 80, height: 80, keepLabels: true }, _rtl: { legend: { itemTextPosition: LEFT } }, resolveLabelOverlapping: NONE }, "chart:common:axis": { visible: false, setTicksAtUnitBeginning: true, valueMarginsEnabled: true, placeholderSize: null, logarithmBase: 10, discreteAxisDivisionMode: "betweenLabels", width: 1, label: { visible: true }, grid: { visible: false, width: 1 }, minorGrid: { visible: false, width: 1, opacity: .3 }, tick: { visible: false, width: 1, length: 8 }, minorTick: { visible: false, width: 1, opacity: .3, length: 8 }, stripStyle: { paddingLeftRight: 10, paddingTopBottom: 5 }, constantLineStyle: { width: 1, color: BLACK, dashStyle: SOLID, label: { visible: true, position: INSIDE } }, marker: { label: {} } }, chart: { commonSeriesSettings: { type: "line", stack: "default", point: { visible: true, symbol: "circle", size: 12, border: { visible: false, width: 1 }, hoverMode: "onlyPoint", selectionMode: "onlyPoint", hoverStyle: { border: { visible: true, width: 4 } }, selectionStyle: { border: { visible: true, width: 4 } } }, scatter: {}, line: { width: 2, dashStyle: SOLID, hoverStyle: { width: 3, hatching: { direction: NONE } }, selectionStyle: { width: 3 } }, stackedline: { width: 2, dashStyle: SOLID, hoverStyle: { width: 3, hatching: { direction: NONE } }, selectionStyle: { width: 3 } }, stackedspline: { width: 2, dashStyle: SOLID, hoverStyle: { width: 3, hatching: { direction: NONE } }, selectionStyle: { width: 3 } }, fullstackedline: { width: 2, dashStyle: SOLID, hoverStyle: { width: 3, hatching: { direction: NONE } }, selectionStyle: { width: 3 } }, fullstackedspline: { width: 2, dashStyle: SOLID, hoverStyle: { width: 3, hatching: { direction: NONE } }, selectionStyle: { width: 3 } }, stepline: { width: 2, dashStyle: SOLID, hoverStyle: { width: 3, hatching: { direction: NONE } }, selectionStyle: { width: 3 } }, area: { point: { visible: false }, opacity: .5 }, stackedarea: { point: { visible: false }, opacity: .5 }, fullstackedarea: { point: { visible: false }, opacity: .5 }, fullstackedsplinearea: { point: { visible: false }, opacity: .5 }, steparea: { border: { visible: true, width: 2 }, point: { visible: false }, hoverStyle: { border: { visible: true, width: 3 } }, selectionStyle: { border: { visible: true, width: 3 } }, opacity: .5 }, spline: { width: 2, hoverStyle: { width: 3, hatching: { direction: NONE } }, selectionStyle: { width: 3 } }, splinearea: { point: { visible: false }, opacity: .5 }, stackedsplinearea: { point: { visible: false }, opacity: .5 }, bar: { cornerRadius: 0, point: { hoverStyle: { border: { visible: false } }, selectionStyle: { border: { visible: false } } } }, stackedbar: { cornerRadius: 0, point: { hoverStyle: { border: { visible: false } }, selectionStyle: { border: { visible: false } } }, label: { position: INSIDE } }, fullstackedbar: { cornerRadius: 0, point: { hoverStyle: { border: { visible: false } }, selectionStyle: { border: { visible: false } } }, label: { position: INSIDE } }, rangebar: { cornerRadius: 0, point: { hoverStyle: { border: { visible: false } }, selectionStyle: { border: { visible: false } } } }, rangearea: { point: { visible: false }, opacity: .5 }, rangesplinearea: { point: { visible: false }, opacity: .5 }, bubble: { opacity: .5, point: { hoverStyle: { border: { visible: false } }, selectionStyle: { border: { visible: false } } } }, candlestick: { width: 1, reduction: { color: RED }, hoverStyle: { width: 3, hatching: { direction: NONE } }, selectionStyle: { width: 3 }, point: { border: { visible: true } } }, stock: { width: 1, reduction: { color: RED }, hoverStyle: { width: 3, hatching: { direction: NONE } }, selectionStyle: { width: 3 }, point: { border: { visible: true } } } }, crosshair: { enabled: false, color: "#f05b41", width: 1, dashStyle: SOLID, label: { visible: false, font: { color: WHITE, size: 12 } }, verticalLine: { visible: true }, horizontalLine: { visible: true } }, commonAxisSettings: { multipleAxesSpacing: 5, forceUserTickInterval: false, label: { displayMode: "standard", overlappingBehavior: "hide", indentFromAxis: 10 }, title: { font: { size: 16 }, margin: 6 }, constantLineStyle: { paddingLeftRight: 10, paddingTopBottom: 10 } }, horizontalAxis: { position: BOTTOM, axisDivisionFactor: 50, label: { rotationAngle: 90, staggeringSpacing: 5, alignment: CENTER }, stripStyle: { label: { horizontalAlignment: CENTER, verticalAlignment: TOP } }, constantLineStyle: { label: { horizontalAlignment: RIGHT, verticalAlignment: TOP } }, constantLines: [] }, verticalAxis: { position: LEFT, axisDivisionFactor: 30, label: { alignment: RIGHT }, stripStyle: { label: { horizontalAlignment: LEFT, verticalAlignment: CENTER } }, constantLineStyle: { label: { horizontalAlignment: LEFT, verticalAlignment: TOP } }, constantLines: [] }, argumentAxis: {}, valueAxis: { grid: { visible: true } }, commonPaneSettings: { backgroundColor: NONE, border: { color: LIGHT_GREY, width: 1, visible: false, top: true, bottom: true, left: true, right: true, dashStyle: SOLID } }, scrollBar: { visible: false, offset: 5, color: "gray", width: 10 }, useAggregation: false, adjustOnZoom: true, rotated: false, zoomingMode: NONE, scrollingMode: NONE, synchronizeMultiAxes: true, equalBarWidth: true, minBubbleSize: 12, maxBubbleSize: .2 }, pie: { innerRadius: .5, minDiameter: .7, type: "pie", commonSeriesSettings: { pie: { border: { visible: false, width: 2, color: WHITE }, hoverStyle: { hatching: { direction: RIGHT, width: 4, step: 10, opacity: .75 }, border: { visible: false, width: 2 } }, selectionStyle: { hatching: { direction: RIGHT, width: 4, step: 10, opacity: .5 }, border: { visible: false, width: 2 } } }, doughnut: { border: { visible: false, width: 2, color: WHITE }, hoverStyle: { hatching: { direction: RIGHT, width: 4, step: 10, opacity: .75 }, border: { visible: false, width: 2 } }, selectionStyle: { hatching: { direction: RIGHT, width: 4, step: 10, opacity: .5 }, border: { visible: false, width: 2 } } }, donut: { border: { visible: false, width: 2, color: WHITE }, hoverStyle: { hatching: { direction: RIGHT, width: 4, step: 10, opacity: .75 }, border: { visible: false, width: 2 } }, selectionStyle: { hatching: { direction: RIGHT, width: 4, step: 10, opacity: .5 }, border: { visible: false, width: 2 } } } }, legend: { hoverMode: "allArgumentPoints", backgroundColor: NONE }, adaptiveLayout: { keepLabels: false } }, gauge: { scale: { tick: { visible: true, length: 5, width: 2, opacity: 1 }, minorTick: { visible: false, length: 3, width: 1, opacity: 1 }, label: { visible: true, alignment: CENTER, hideFirstOrLast: "last", overlappingBehavior: "hide" }, position: TOP }, rangeContainer: { offset: 0, width: 5, backgroundColor: "#808080" }, valueIndicators: { _default: { color: "#c2c2c2" }, rangebar: { space: 2, size: 10, color: "#cbc5cf", backgroundColor: NONE, text: { indent: 0, font: { size: 14, color: null } } }, twocolorneedle: { secondColor: "#e18e92" }, trianglemarker: { space: 2, length: 14, width: 13, color: "#8798a5" }, textcloud: { arrowLength: 5, horizontalOffset: 6, verticalOffset: 3, color: "#679ec5", text: { font: { color: WHITE, size: 18 } } } }, indicator: { hasPositiveMeaning: true, layout: { horizontalAlignment: CENTER, verticalAlignment: BOTTOM }, text: { font: { size: 18 } } }, _circular: { scale: { orientation: OUTSIDE, label: { indentFromTick: 10 } }, rangeContainer: { orientation: OUTSIDE }, valueIndicatorType: "rectangleneedle", subvalueIndicatorType: "trianglemarker", valueIndicators: { _type: "rectangleneedle", _default: { offset: 20, indentFromCenter: 0, width: 2, spindleSize: 14, spindleGapSize: 10 }, triangleneedle: { width: 4 }, twocolorneedle: { space: 2, secondFraction: .4 }, rangebar: { offset: 30 }, trianglemarker: { offset: 6 }, textcloud: { offset: -6 } } }, _linear: { scale: { horizontalOrientation: RIGHT, verticalOrientation: BOTTOM, label: { indentFromTick: -10 } }, rangeContainer: { horizontalOrientation: RIGHT, verticalOrientation: BOTTOM }, valueIndicatorType: "rangebar", subvalueIndicatorType: "trianglemarker", valueIndicators: { _type: "rectangle", _default: { offset: 2.5, length: 15, width: 15 }, rectangle: { width: 10 }, rangebar: { offset: 10, horizontalOrientation: RIGHT, verticalOrientation: BOTTOM }, trianglemarker: { offset: 10, horizontalOrientation: LEFT, verticalOrientation: TOP }, textcloud: { offset: -1, horizontalOrientation: LEFT, verticalOrientation: TOP } } } }, barGauge: { backgroundColor: "#e0e0e0", relativeInnerRadius: .3, barSpacing: 4, label: { indent: 20, connectorWidth: 2, font: { size: 16 } }, indicator: { hasPositiveMeaning: true, layout: { horizontalAlignment: CENTER, verticalAlignment: BOTTOM }, text: { font: { size: 18 } } } }, rangeSelector: { scale: { width: 1, color: BLACK, opacity: .1, showCustomBoundaryTicks: true, showMinorTicks: true, setTicksAtUnitBeginning: true, label: { overlappingBehavior: "hide", alignment: "center", visible: true, topIndent: 7, font: { size: 11 } }, tick: { width: 1, color: BLACK, opacity: .17, visible: true, length: 12 }, minorTick: { width: 1, color: BLACK, opacity: .05, visible: true, length: 12 }, marker: { width: 1, color: "#000000", opacity: .1, visible: true, separatorHeight: 33, topIndent: 10, textLeftIndent: 7, textTopIndent: 11, label: {} }, logarithmBase: 10 }, selectedRangeColor: "#606060", sliderMarker: { visible: true, paddingTopBottom: 2, paddingLeftRight: 4, color: "#606060", invalidRangeColor: RED, font: { color: WHITE, size: 11 } }, sliderHandle: { width: 1, color: BLACK, opacity: .2 }, shutter: { opacity: .75 }, background: { color: "#c0bae1", visible: true, image: { location: "full" } }, behavior: { snapToTicks: true, animationEnabled: true, moveSelectedRangeByClick: true, manualRangeSelectionEnabled: true, allowSlidersSwap: true, callSelectedRangeChanged: "onMovingComplete" }, redrawOnResize: true, chart: { useAggregation: false, equalBarWidth: true, minBubbleSize: 12, maxBubbleSize: .2, topIndent: .1, bottomIndent: 0, valueAxis: { inverted: false, logarithmBase: 10 }, commonSeriesSettings: { type: "area", point: { visible: false }, scatter: { point: { visible: true } } } } }, map: { title: { margin: 10 }, background: { borderWidth: 1, borderColor: "#cacaca" }, layer: { label: { enabled: false, stroke: WHITE, "stroke-width": 1, "stroke-opacity": .7, font: { color: SOME_GREY, size: 12 } } }, "layer:area": { borderWidth: 1, borderColor: WHITE, color: "#d2d2d2", hoveredBorderColor: GREY_GREEN, selectedBorderWidth: 2, selectedBorderColor: GREY_GREEN, label: { "stroke-width": 2, font: { size: 16 } } }, "layer:line": { borderWidth: 2, color: "#ba8365", hoveredColor: "#a94813", selectedBorderWidth: 3, selectedColor: "#e55100", label: { "stroke-width": 2, font: { size: 16 } } }, "layer:marker": { label: { enabled: true, "stroke-width": 1, font: { size: 12 } } }, "layer:marker:dot": { borderWidth: 2, borderColor: WHITE, color: "#ba4d51", size: 8, selectedStep: 2, backStep: 18, backColor: WHITE, backOpacity: .32, shadow: true }, "layer:marker:bubble": { minSize: 20, maxSize: 50, color: "#ba4d51", hoveredBorderWidth: 1, hoveredBorderColor: GREY_GREEN, selectedBorderWidth: 2, selectedBorderColor: GREY_GREEN }, "layer:marker:pie": { size: 50, hoveredBorderWidth: 1, hoveredBorderColor: GREY_GREEN, selectedBorderWidth: 2, selectedBorderColor: GREY_GREEN }, "layer:marker:image": { size: 20 }, legend: { verticalAlignment: BOTTOM, horizontalAlignment: RIGHT, position: INSIDE, backgroundOpacity: .65, border: { visible: true }, paddingLeftRight: 16, paddingTopBottom: 12, markerColor: "#ba4d51" }, controlBar: { borderColor: "#5d5d5d", borderWidth: 3, color: WHITE, margin: 20, opacity: .3 }, _rtl: { legend: { itemTextPosition: LEFT } } }, treeMap: { tile: { border: { width: 1, opacity: .2, color: "#000000" }, color: "#5f8b95", hoverStyle: { hatching: { opacity: .75, step: 6, width: 2, direction: "right" }, border: {} }, selectionStyle: { hatching: { opacity: .5, step: 6, width: 2, direction: "right" }, border: { opacity: 1 } }, label: { visible: true, paddingLeftRight: 5, paddingTopBottom: 4, stroke: "#000000", "stroke-width": 1, "stroke-opacity": .3, font: { color: "#ffffff", weight: 300 }, shadow: { opacity: .8, offsetX: 0, offsetY: 1, blur: 1, color: "#000000" } } }, group: { padding: 4, border: { width: 1 }, color: "#eeeeee", hoverStyle: { hatching: { opacity: 0, step: 6, width: 2, direction: "right" }, border: {} }, selectionStyle: { hatching: { opacity: 0, step: 6, width: 2, direction: "right" }, border: {} }, label: { visible: true, paddingLeftRight: 5, paddingTopBottom: 4, font: { weight: 600 } } }, title: { subtitle: {} }, tooltip: {}, loadingIndicator: {} }, sparkline: { lineColor: "#666666", lineWidth: 2, areaOpacity: .2, minColor: "#e8c267", maxColor: "#e55253", barPositiveColor: "#a9a9a9", barNegativeColor: "#d7d7d7", winColor: "#a9a9a9", lossColor: "#d7d7d7", firstLastColor: "#666666", pointSymbol: "circle", pointColor: WHITE, pointSize: 4, type: "line", argumentField: "arg", valueField: "val", winlossThreshold: 0, showFirstLast: true, showMinMax: false, tooltip: { enabled: true } }, bullet: { color: "#e8c267", targetColor: "#666666", targetWidth: 4, showTarget: true, showZeroLevel: true, tooltip: { enabled: true } }, polar: { commonSeriesSettings: { type: "scatter", closed: true, point: { visible: true, symbol: "circle", size: 12, border: { visible: false, width: 1 }, hoverMode: "onlyPoint", selectionMode: "onlyPoint", hoverStyle: { border: { visible: true, width: 4 }, size: 12 }, selectionStyle: { border: { visible: true, width: 4 }, size: 12 } }, scatter: {}, line: { width: 2, dashStyle: SOLID, hoverStyle: { width: 3, hatching: { direction: NONE } }, selectionStyle: { width: 3 } }, area: { point: { visible: false }, opacity: .5 }, stackedline: { width: 2 }, bar: { opacity: .8 }, stackedbar: { opacity: .8 } }, adaptiveLayout: { width: 170, height: 170, keepLabels: true }, equalBarWidth: true, commonAxisSettings: { visible: true, forceUserTickInterval: false, label: { overlappingBehavior: "hide", indentFromAxis: 5 }, grid: { visible: true }, minorGrid: { visible: true }, tick: { visible: true }, title: { font: { size: 16 }, margin: 10 } }, argumentAxis: { startAngle: 0, firstPointOnStartAngle: false, period: void 0 }, valueAxis: { tick: { visible: false } }, horizontalAxis: { position: TOP, axisDivisionFactor: 50, label: { alignment: CENTER } }, verticalAxis: { position: TOP, axisDivisionFactor: 30, label: { alignment: RIGHT } } } }); registerTheme({ name: "generic.dark", font: { color: "#808080" }, backgroundColor: "#2a2a2a", primaryTitleColor: "#dedede", secondaryTitleColor: "#a3a3a3", axisColor: "#555555", axisLabelColor: "#a3a3a3", "export": { backgroundColor: "#2a2a2a", font: { color: "#dbdbdb" }, button: { "default": { color: "#dedede", borderColor: "#4d4d4d", backgroundColor: "#2e2e2e" }, hover: { color: "#dedede", borderColor: "#6c6c6c", backgroundColor: "#444" }, focus: { color: "#dedede", borderColor: "#8d8d8d", backgroundColor: "#444444" }, active: { color: "#dedede", borderColor: "#8d8d8d", backgroundColor: "#555555" } }, shadowColor: "#292929" }, tooltip: { color: SOME_GREY, border: { color: "#494949" }, font: { color: "#929292" } }, "chart:common": { commonSeriesSettings: { label: { border: { color: "#494949" } }, valueErrorBar: { color: WHITE } } }, "chart:common:axis": { constantLineStyle: { color: WHITE } }, chart: { commonPaneSettings: { border: { color: "#494949" } } }, gauge: { rangeContainer: { backgroundColor: RANGE_COLOR }, valueIndicators: { _default: { color: RANGE_COLOR }, rangebar: { color: "#84788b" }, twocolorneedle: { secondColor: "#ba544d" }, trianglemarker: { color: "#b7918f" }, textcloud: { color: "#ba544d" } } }, barGauge: { backgroundColor: "#3c3c3c" }, rangeSelector: { scale: { tick: { color: WHITE, opacity: .32 }, minorTick: { color: WHITE, opacity: .1 } }, selectedRangeColor: RANGE_COLOR, sliderMarker: { color: RANGE_COLOR, font: { color: GREY_GREEN } }, sliderHandle: { color: WHITE, opacity: .2 }, shutter: { color: SOME_GREY, opacity: .9 } }, map: { background: { borderColor: "#3f3f3f" }, layer: { label: { stroke: BLACK, font: { color: WHITE } } }, "layer:area": { borderColor: GREY_GREEN, color: AREA_LAYER_COLOR, hoveredBorderColor: WHITE, selectedBorderColor: WHITE }, "layer:line": { color: "#c77244", hoveredColor: "#ff5d04", selectedColor: "#ff784f" }, "layer:marker:bubble": { hoveredBorderColor: WHITE, selectedBorderColor: WHITE }, "layer:marker:pie": { hoveredBorderColor: WHITE, selectedBorderColor: WHITE }, legend: { border: { color: "#3f3f3f" }, font: { color: WHITE } }, controlBar: { borderColor: LINE_COLOR, color: GREY_GREEN } }, treeMap: { group: { color: "#4c4c4c" } }, sparkline: { lineColor: LINE_COLOR, firstLastColor: LINE_COLOR, barPositiveColor: POSITIVE_COLOR, barNegativeColor: TARGET_COLOR, winColor: POSITIVE_COLOR, lossColor: TARGET_COLOR, pointColor: GREY_GREEN }, bullet: { targetColor: TARGET_COLOR } }, "generic.light"); registerTheme({ name: "generic.contrast", defaultPalette: "Bright", font: { color: WHITE }, backgroundColor: BLACK, primaryTitleColor: WHITE, secondaryTitleColor: WHITE, axisColor: WHITE, axisLabelColor: WHITE, "export": { backgroundColor: BLACK, font: { color: WHITE }, button: { "default": { color: WHITE, borderColor: WHITE, backgroundColor: BLACK }, hover: { color: WHITE, borderColor: WHITE, backgroundColor: "#cf00d7" }, focus: { color: WHITE, borderColor: "#cf00d7", backgroundColor: BLACK }, active: { color: BLACK, borderColor: WHITE, backgroundColor: WHITE } }, borderColor: WHITE, menuButtonColor: BLACK, activeBackgroundColor: WHITE, activeColor: BLACK, selectedBorderColor: CONTRAST_ACTIVE, selectedColor: CONTRAST_ACTIVE, shadowColor: "none" }, tooltip: { border: { color: WHITE }, font: { color: WHITE }, color: BLACK }, "chart:common": { commonSeriesSettings: { valueErrorBar: { color: WHITE }, hoverStyle: { hatching: { opacity: .5 } }, selectionStyle: { hatching: { opacity: .35 } }, label: { font: { color: WHITE }, border: { color: WHITE } } } }, "chart:common:axis": { constantLineStyle: { color: WHITE } }, chart: { commonSeriesSettings: {}, commonPaneSettings: { backgroundColor: BLACK, border: { color: WHITE } }, scrollBar: { color: WHITE } }, pie: { commonSeriesSettings: { pie: { hoverStyle: { hatching: { opacity: .5 } }, selectionStyle: { hatching: { opacity: .35 } } }, doughnut: { hoverStyle: { hatching: { opacity: .5 } }, selectionStyle: { hatching: { opacity: .35 } } }, donut: { hoverStyle: { hatching: { opacity: .5 } }, selectionStyle: { hatching: { opacity: .35 } } } } }, gauge: { rangeContainer: { backgroundColor: WHITE }, valueIndicators: { _default: { color: WHITE }, rangebar: { color: WHITE, backgroundColor: BLACK }, twocolorneedle: { secondColor: WHITE }, trianglemarker: { color: WHITE }, textcloud: { color: WHITE, text: { font: { color: BLACK } } } } }, barGauge: { backgroundColor: "#3c3c3c" }, rangeSelector: { scale: { tick: { opacity: .4 }, minorTick: { opacity: .12 } }, selectedRangeColor: CONTRAST_ACTIVE, sliderMarker: { color: CONTRAST_ACTIVE }, sliderHandle: { color: CONTRAST_ACTIVE, opacity: 1 }, shutter: { opacity: .75 }, background: { color: BLACK } }, map: { background: { borderColor: WHITE }, layer: { label: { stroke: BLACK, font: { color: WHITE } } }, "layer:area": { borderColor: BLACK, color: AREA_LAYER_COLOR, hoveredBorderColor: WHITE, selectedBorderColor: WHITE, label: { font: { opacity: 1 } } }, "layer:line": { color: "#267cff", hoveredColor: "#f613ff", selectedColor: WHITE }, "layer:marker:dot": { borderColor: BLACK, color: MARKER_COLOR, backColor: BLACK, backOpacity: .32 }, "layer:marker:bubble": { color: MARKER_COLOR, hoveredBorderColor: WHITE, selectedBorderColor: WHITE }, "layer:marker:pie": { hoveredBorderColor: WHITE, selectedBorderColor: WHITE }, legend: { markerColor: MARKER_COLOR }, controlBar: { borderColor: WHITE, color: BLACK, opacity: .3 } }, treeMap: { tile: { color: "#70c92f" }, group: { color: "#797979" } }, sparkline: { pointColor: BLACK }, bullet: {}, polar: { commonSeriesSettings: {} } }, "generic.light"); themeModule.currentTheme("generic.light"); registerThemeAlias("desktop.light", "generic.light"); registerThemeAlias("desktop.dark", "generic.dark") }, /*!****************************!*\ !*** ./js/viz/core/ios.js ***! \****************************/ function(module, exports, __webpack_require__) { var themeModule = __webpack_require__( /*! ../themes */ 508), IOS7_DEFAULT = "ios7.default", SECONDARY_TEXT_COLOR = "#767676", BORDER_COLOR = "#d3d3d3", BLACK = "#000000"; themeModule.registerTheme({ name: IOS7_DEFAULT, backgroundColor: "#ffffff", primaryTitleColor: BLACK, secondaryTitleColor: SECONDARY_TEXT_COLOR, axisColor: "#ececec", axisLabelColor: SECONDARY_TEXT_COLOR, legend: { font: { color: BLACK } }, tooltip: { font: { color: SECONDARY_TEXT_COLOR } }, "chart:common": { commonSeriesSettings: { label: { border: { color: BORDER_COLOR } } } }, chart: { commonPaneSettings: { border: { color: BORDER_COLOR } } }, rangeSelector: { scale: { tick: { color: BLACK, opacity: .1 }, minorTick: { color: BLACK, opacity: .03 } } } }, "generic.light"); themeModule.registerThemeAlias("ios", IOS7_DEFAULT) }, /*!********************************!*\ !*** ./js/viz/core/android.js ***! \********************************/ function(module, exports, __webpack_require__) { var ANDROID5_LIGHT = "android5.light", themeModule = __webpack_require__( /*! ../themes */ 508), registerThemeAlias = themeModule.registerThemeAlias, SECONDARY_TEXT_COLOR = "#767676", BORDER_COLOR = "#e8e8e8", BLACK = "#000000"; themeModule.registerTheme({ name: ANDROID5_LIGHT, backgroundColor: "#ffffff", primaryTitleColor: "#232323", secondaryTitleColor: SECONDARY_TEXT_COLOR, axisColor: "#d3d3d3", axisLabelColor: SECONDARY_TEXT_COLOR, tooltip: { color: BORDER_COLOR, font: { color: SECONDARY_TEXT_COLOR } }, legend: { font: { color: BLACK } }, rangeSelector: { scale: { tick: { color: BLACK, opacity: .17 }, minorTick: { color: BLACK, opacity: .05 } } } }, "generic.light"); registerThemeAlias("android", ANDROID5_LIGHT); registerThemeAlias("android.holo-dark", ANDROID5_LIGHT); registerThemeAlias("android.holo-light", ANDROID5_LIGHT); registerThemeAlias("android.dark", ANDROID5_LIGHT); registerThemeAlias("android.light", ANDROID5_LIGHT) }, /*!****************************!*\ !*** ./js/viz/core/win.js ***! \****************************/ function(module, exports, __webpack_require__) { var themeModule = __webpack_require__( /*! ../themes */ 508), registerTheme = themeModule.registerTheme, registerThemeSchemeAlias = themeModule.registerThemeSchemeAlias, BLACK = "#000000", WHITE = "#ffffff", WIN10_WHITE = "win10.white", WIN10_BLACK = "win10.black", WIN8_WHITE = "win8.white", WIN8_BLACK = "win8.black"; registerTheme({ name: WIN10_BLACK, backgroundColor: BLACK, primaryTitleColor: WHITE, secondaryTitleColor: "#d8d8d8", axisColor: "#4c4c4c", axisLabelColor: WHITE, title: { font: { color: WHITE } }, legend: { font: { color: WHITE } }, tooltip: { color: BLACK, font: { color: WHITE } }, "chart:common": { commonSeriesSettings: { label: { border: { color: "#454545" } } } }, chart: { commonPaneSettings: { border: { color: "#454545" } } }, barGauge: { backgroundColor: "#2b3036" }, rangeSelector: { scale: { tick: { color: WHITE, opacity: .23 }, minorTick: { color: WHITE, opacity: .07 } } } }, "generic.dark"); registerTheme({ name: WIN10_WHITE, backgroundColor: WHITE, primaryTitleColor: BLACK, secondaryTitleColor: "#767676", axisColor: "#ececec", axisLabelColor: BLACK, title: { font: { color: BLACK } }, legend: { font: { color: BLACK } }, tooltip: { font: { color: BLACK } }, rangeSelector: { scale: { tick: { color: BLACK, opacity: .1 }, minorTick: { color: BLACK, opacity: .03 } } } }, "generic.light"); registerThemeSchemeAlias("win10.dark", WIN10_BLACK); registerThemeSchemeAlias("win10.light", WIN10_WHITE); registerTheme({ name: WIN8_BLACK }, WIN10_BLACK); registerTheme({ name: WIN8_WHITE }, WIN10_WHITE); registerThemeSchemeAlias("win8.dark", WIN8_BLACK); registerThemeSchemeAlias("win8.light", WIN8_WHITE) }, /*!***************************************************!*\ !*** ./js/viz/chart_components/layout_manager.js ***! \***************************************************/ function(module, exports, __webpack_require__) { var commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, layoutElementModule = __webpack_require__( /*! ../core/layout_element */ 522), _isNumber = commonUtils.isNumeric, _min = Math.min, _max = Math.max, _floor = Math.floor, _sqrt = Math.sqrt, _extend = extend, consts = __webpack_require__( /*! ../components/consts */ 527), pieLabelIndent = consts.pieLabelIndent, pieLabelSpacing = consts.pieLabelSpacing; function getNearestCoord(firstCoord, secondCoord, pointCenterCoord) { var nearestCoord; if (pointCenterCoord < firstCoord) { nearestCoord = firstCoord } else { if (secondCoord < pointCenterCoord) { nearestCoord = secondCoord } else { nearestCoord = pointCenterCoord } } return nearestCoord } function getLabelLayout(point) { if (point._label.isVisible() && "inside" !== point._label.getLayoutOptions().position) { return point._label.getBoundingRect() } } function getPieRadius(series, paneCenterX, paneCenterY, accessibleRadius, minR) { var radiusIsFound = false; series.forEach(function(singleSeries) { if (radiusIsFound) { return false } singleSeries.getVisiblePoints().forEach(function(point) { var labelBBox = getLabelLayout(point); if (labelBBox) { var xCoords = getNearestCoord(labelBBox.x, labelBBox.x + labelBBox.width, paneCenterX), yCoords = getNearestCoord(labelBBox.y, labelBBox.y + labelBBox.height, paneCenterY); accessibleRadius = _min(_max(getLengthFromCenter(xCoords, yCoords, paneCenterX, paneCenterY) - pieLabelIndent, minR), accessibleRadius); radiusIsFound = true } }) }); return accessibleRadius } function getSizeLabels(series) { var sizes = [], commonWidth = 0; series.forEach(function(singleSeries) { var maxWidth = 0; singleSeries.getVisiblePoints().forEach(function(point) { var labelBBox = getLabelLayout(point); if (labelBBox) { maxWidth = _max(labelBBox.width + pieLabelSpacing, maxWidth) } }); sizes.push(maxWidth); commonWidth += maxWidth }); return { sizes: sizes, common: commonWidth } } function correctLabelRadius(sizes, radius, series, canvas, averageWidthLabels) { var curRadius, i, centerX = (canvas.width - canvas.left - canvas.right) / 2; for (i = 0; i < series.length; i++) { if (0 === sizes[i]) { curRadius && (curRadius += sizes[i - 1]); continue } curRadius = _floor(curRadius ? curRadius + sizes[i - 1] : radius); series[i].correctLabelRadius(curRadius); if (averageWidthLabels && i !== series.length - 1) { sizes[i] = averageWidthLabels; series[i].setVisibleArea({ left: centerX - radius - averageWidthLabels * (i + 1), right: canvas.width - (centerX + radius + averageWidthLabels * (i + 1)), top: canvas.top, bottom: canvas.bottom, width: canvas.width, height: canvas.height }) } } } function getLengthFromCenter(x, y, paneCenterX, paneCenterY) { return _sqrt((x - paneCenterX) * (x - paneCenterX) + (y - paneCenterY) * (y - paneCenterY)) } function getInnerRadius(series) { var innerRadius; if ("pie" === series.type) { innerRadius = 0 } else { innerRadius = _isNumber(series.innerRadius) ? Number(series.innerRadius) : .5; innerRadius = innerRadius < .2 ? .2 : innerRadius; innerRadius = innerRadius > .8 ? .8 : innerRadius } return innerRadius } var inverseAlign = { left: "right", right: "left", top: "bottom", bottom: "top", center: "center" }; function downSize(canvas, layoutOptions) { canvas[layoutOptions.cutLayoutSide] += "horizontal" === layoutOptions.cutSide ? layoutOptions.width : layoutOptions.height } function getOffset(layoutOptions, offsets) { var side = layoutOptions.cutLayoutSide, offset = { horizontal: 0, vertical: 0 }; switch (side) { case "top": case "left": offset[layoutOptions.cutSide] = -offsets[side]; break; case "bottom": case "right": offset[layoutOptions.cutSide] = offsets[side] } return offset } function LayoutManager() {} function toLayoutElementCoords(canvas) { return new layoutElementModule.WrapperLayoutElement(null, { x: canvas.left, y: canvas.top, width: canvas.width - canvas.left - canvas.right, height: canvas.height - canvas.top - canvas.bottom }) } function correctAvailableRadius(availableRadius, canvas, series, minPiePercentage, paneCenterX, paneCenterY) { var averageWidthLabels, minR = minPiePercentage * availableRadius, sizeLabels = getSizeLabels(series), countSeriesWithOuterLabels = 0, fullRadiusWithLabels = paneCenterX - sizeLabels.common + canvas.left; if (fullRadiusWithLabels < minR) { availableRadius = minR; sizeLabels.sizes.forEach(function(size) { 0 !== size && countSeriesWithOuterLabels++ }); averageWidthLabels = (paneCenterX - availableRadius - canvas.left) / countSeriesWithOuterLabels } else { availableRadius = _min(getPieRadius(series, paneCenterX, paneCenterY, availableRadius, minR), fullRadiusWithLabels) } correctLabelRadius(sizeLabels.sizes, availableRadius, series, canvas, averageWidthLabels); return availableRadius } LayoutManager.prototype = { constructor: LayoutManager, setOptions: function(options) { this._options = options }, applyPieChartSeriesLayout: function(canvas, series, hideLayoutLabels) { var availableRadius, paneSpaceHeight = canvas.height - canvas.top - canvas.bottom, paneSpaceWidth = canvas.width - canvas.left - canvas.right, paneCenterX = paneSpaceWidth / 2 + canvas.left, paneCenterY = paneSpaceHeight / 2 + canvas.top, piePercentage = this._options.piePercentage; if (_isNumber(piePercentage)) { availableRadius = piePercentage * _min(canvas.height, canvas.width) / 2 } else { availableRadius = _min(paneSpaceWidth, paneSpaceHeight) / 2; if (!hideLayoutLabels) { availableRadius = correctAvailableRadius(availableRadius, canvas, series, this._options.minPiePercentage, paneCenterX, paneCenterY) } } return { centerX: _floor(paneCenterX), centerY: _floor(paneCenterY), radiusInner: _floor(availableRadius * getInnerRadius(series[0])), radiusOuter: _floor(availableRadius) } }, applyEqualPieChartLayout: function(series, layout) { var radius = layout.radius; return { centerX: _floor(layout.x), centerY: _floor(layout.y), radiusInner: _floor(radius * getInnerRadius(series[0])), radiusOuter: _floor(radius) } }, needMoreSpaceForPanesCanvas: function(panes, rotated) { var options = this._options, width = options.width, height = options.height, piePercentage = options.piePercentage, percentageIsValid = _isNumber(piePercentage), needHorizontalSpace = 0, needVerticalSpace = 0; panes.forEach(function(pane) { var paneCanvas = pane.canvas, minSize = percentageIsValid ? _min(paneCanvas.width, paneCanvas.height) * piePercentage : void 0, needPaneHorizontalSpace = (percentageIsValid ? minSize : width) - (paneCanvas.width - paneCanvas.left - paneCanvas.right), needPaneVerticalSpace = (percentageIsValid ? minSize : height) - (paneCanvas.height - paneCanvas.top - paneCanvas.bottom); if (rotated) { needHorizontalSpace += needPaneHorizontalSpace > 0 ? needPaneHorizontalSpace : 0; needVerticalSpace = _max(needPaneVerticalSpace > 0 ? needPaneVerticalSpace : 0, needVerticalSpace) } else { needHorizontalSpace = _max(needPaneHorizontalSpace > 0 ? needPaneHorizontalSpace : 0, needHorizontalSpace); needVerticalSpace += needPaneVerticalSpace > 0 ? needPaneVerticalSpace : 0 } }); return needHorizontalSpace > 0 || needVerticalSpace > 0 ? { width: needHorizontalSpace, height: needVerticalSpace } : false }, layoutElements: function(elements, canvas, funcAxisDrawer, panes, rotated) { this._elements = elements; this._probeDrawing(canvas); this._drawElements(canvas); funcAxisDrawer(); this._processAdaptiveLayout(panes, rotated, canvas, funcAxisDrawer); this._positionElements(canvas) }, _processAdaptiveLayout: function(panes, rotated, canvas, funcAxisDrawer) { var that = this, size = that.needMoreSpaceForPanesCanvas(panes, rotated), items = this._elements; if (!size) { return } function processCanvases(item, layoutOptions, side) { if (!item.getLayoutOptions()[side]) { canvas[layoutOptions.cutLayoutSide] -= layoutOptions[side]; size[side] = Math.max(size[side] - layoutOptions[side], 0) } } items.slice().reverse().forEach(function(item) { var sizeObject, layoutOptions = _extend({}, item.getLayoutOptions()); if (!layoutOptions) { return } sizeObject = extend({}, layoutOptions); if ("vertical" === layoutOptions.cutSide && size.height) { item.draw(sizeObject.width, sizeObject.height - size.height); processCanvases(item, layoutOptions, "height") } if ("horizontal" === layoutOptions.cutSide && size.width) { item.draw(sizeObject.width - size.width, sizeObject.height); processCanvases(item, layoutOptions, "width") } }); funcAxisDrawer(size) }, _probeDrawing: function(canvas) { var that = this; this._elements.forEach(function(item) { var sizeObject, layoutOptions = item.getLayoutOptions(); if (!layoutOptions) { return } sizeObject = { width: canvas.width - canvas.left - canvas.right, height: canvas.height - canvas.top - canvas.bottom }; if ("vertical" === layoutOptions.cutSide) { sizeObject.height -= that._options.height } else { sizeObject.width -= that._options.width } item.probeDraw(sizeObject.width, sizeObject.height); downSize(canvas, item.getLayoutOptions()) }) }, _drawElements: function(canvas) { this._elements.slice().reverse().forEach(function(item) { var sizeObject, cutSide, length, layoutOptions = item.getLayoutOptions(); if (!layoutOptions) { return } sizeObject = { width: canvas.width - canvas.left - canvas.right, height: canvas.height - canvas.top - canvas.bottom }; cutSide = layoutOptions.cutSide; length = "horizontal" === cutSide ? "width" : "height"; sizeObject[length] = layoutOptions[length]; item.draw(sizeObject.width, sizeObject.height) }) }, _positionElements: function(canvas) { var offsets = { left: 0, right: 0, top: 0, bottom: 0 }; this._elements.slice().reverse().forEach(function(item) { var position, cutSide, my, layoutOptions = item.getLayoutOptions(); if (!layoutOptions) { return } position = layoutOptions.position; cutSide = layoutOptions.cutSide; my = { horizontal: position.horizontal, vertical: position.vertical }; my[cutSide] = inverseAlign[my[cutSide]]; item.position({ of: toLayoutElementCoords(canvas), my: my, at: position, offset: getOffset(layoutOptions, offsets) }); offsets[layoutOptions.cutLayoutSide] += layoutOptions["horizontal" === layoutOptions.cutSide ? "width" : "height"] }) } }; exports.LayoutManager = LayoutManager }, /*!********************************************!*\ !*** ./js/viz/chart_components/tracker.js ***! \********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), clickEvent = __webpack_require__( /*! ../../events/click */ 75), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, consts = __webpack_require__( /*! ../components/consts */ 527), eventsConsts = consts.events, vizUtils = __webpack_require__( /*! ../core/utils */ 509), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), pointerEvents = __webpack_require__( /*! ../../events/pointer */ 76), wheelEvent = __webpack_require__( /*! ../../events/core/wheel */ 85), holdEvent = __webpack_require__( /*! ../../events/hold */ 164), addNamespace = __webpack_require__( /*! ../../events/utils */ 71).addNamespace, devices = __webpack_require__( /*! ../../core/devices */ 53), isDefined = commonUtils.isDefined, _normalizeEnum = __webpack_require__( /*! ../core/utils */ 509).normalizeEnum, _floor = Math.floor, _each = $.each, _noop = commonUtils.noop, HOVER_STATE = consts.states.hoverMark, NORMAL_STATE = consts.states.normalMark, EVENT_NS = "dxChartTracker", DOT_EVENT_NS = "." + EVENT_NS, POINTER_ACTION = addNamespace([pointerEvents.down, pointerEvents.move], EVENT_NS), LEGEND_CLICK = "legendClick", SERIES_CLICK = "seriesClick", POINT_CLICK = "pointClick", ZOOM_START = "zoomStart", POINT_DATA = "chart-data-point", SERIES_DATA = "chart-data-series", ARG_DATA = "chart-data-argument", DELAY = 100, NONE_MODE = "none", ALL_ARGUMENT_POINTS_MODE = "allargumentpoints", INCLUDE_POINTS_MODE = "includepoints", EXLUDE_POINTS_MODE = "excludepoints", LEGEND_HOVER_MODES = [INCLUDE_POINTS_MODE, EXLUDE_POINTS_MODE, NONE_MODE]; function getData(event, dataKey) { var target = event.target; return ("tspan" === target.tagName ? target.parentNode : target)[dataKey] } function eventCanceled(event, target) { return event.cancel || !target.getOptions() } function inCanvas(canvas, x, y) { return x >= canvas.left && x <= canvas.right && y >= canvas.top && y <= canvas.bottom } function correctLegendHoverMode(mode) { if (LEGEND_HOVER_MODES.indexOf(mode) > -1) { return mode } else { return INCLUDE_POINTS_MODE } } function correctHoverMode(target) { var mode = target.getOptions().hoverMode; return mode === NONE_MODE ? mode : ALL_ARGUMENT_POINTS_MODE } var baseTrackerPrototype = { ctor: function(options) { var that = this, data = { tracker: that }; that._renderer = options.renderer; that._legend = options.legend; that._tooltip = options.tooltip; that._eventTrigger = options.eventTrigger; that._seriesGroup = options.seriesGroup; options.seriesGroup.off(DOT_EVENT_NS).on(addNamespace(eventsConsts.showPointTooltip, EVENT_NS), data, that._showPointTooltip).on(addNamespace(eventsConsts.hidePointTooltip, EVENT_NS), data, that._hidePointTooltip); that._renderer.root.off(DOT_EVENT_NS).on(POINTER_ACTION, data, that._pointerHandler).on(addNamespace(clickEvent.name, EVENT_NS), data, that._clickHandler).on(addNamespace(holdEvent.name, EVENT_NS), { timeout: 300 }, _noop) }, update: function(options) { this._prepare() }, updateSeries: function(series) { var that = this; if (that._storedSeries !== series) { that._storedSeries = series || []; that._clean() } else { that._hideTooltip(that.pointAtShownTooltip); that._clearHover(); that.clearSelection() } }, setCanvases: function(mainCanvas, paneCanvases) { this._mainCanvas = mainCanvas; this._canvases = paneCanvases }, repairTooltip: function() { var point = this.pointAtShownTooltip; if (point && !point.isVisible()) { this._hideTooltip(point, true) } else { this._showTooltip(point) } }, _prepare: function() { this._toggleParentsScrollSubscription(true) }, _toggleParentsScrollSubscription: function(subscribe) { var that = this, $parents = $(that._renderer.root.element).parents(), scrollEvents = addNamespace("scroll", EVENT_NS); if ("generic" === devices.real().platform) { $parents = $parents.add(window) } $().add(that._$prevRootParents).off(scrollEvents); if (subscribe) { $parents.on(scrollEvents, function() { that._pointerOut() }); that._$prevRootParents = $parents } }, _setHoveredPoint: function(point) { if (point === this._hoveredPoint) { return } this._releaseHoveredPoint(); point.hover(); this._hoveredPoint = point }, _releaseHoveredPoint: function() { if (this._hoveredPoint && this._hoveredPoint.getOptions()) { this._hoveredPoint.clearHover(); this._hoveredPoint = null; if (this._tooltip.isEnabled()) { this._hideTooltip(this._hoveredPoint) } } }, _setHoveredSeries: function(series, mode) { this._releaseHoveredSeries(); this._releaseHoveredPoint(); series.hover(mode); this.hoveredSeries = series }, _releaseHoveredSeries: function(needSetHoverView, hoveredPoint) { if (this.hoveredSeries) { this.hoveredSeries.clearHover(); this.hoveredSeries = null } }, clearSelection: function() { this._storedSeries.forEach(function(series) { series.clearSelection(); series.getPoints().forEach(function(point) { point.clearSelection() }) }) }, _clean: function() { var that = this; that.hoveredPoint = that.hoveredSeries = that._hoveredArgumentPoints = null; that._hideTooltip(that.pointAtShownTooltip) }, _clearHover: function() { this._resetHoveredArgument(); this._releaseHoveredSeries(); this._releaseHoveredPoint() }, _hideTooltip: function(point, silent) { var that = this; if (!that._tooltip || point && that.pointAtShownTooltip !== point) { return } if (!silent && that.pointAtShownTooltip) { that.pointAtShownTooltip = null } that._tooltip.hide() }, _showTooltip: function(point) { var tooltipFormatObject, eventData, that = this; if (point && point.getOptions()) { tooltipFormatObject = point.getTooltipFormatObject(that._tooltip); if (!isDefined(tooltipFormatObject.valueText) && !tooltipFormatObject.points || !point.isVisible()) { return } if (!that.pointAtShownTooltip || that.pointAtShownTooltip !== point) { eventData = { target: point } } var coords = point.getTooltipParams(that._tooltip.getLocation()), rootOffset = that._renderer.getRootOffset(); coords.x += rootOffset.left; coords.y += rootOffset.top; if (!that._tooltip.show(tooltipFormatObject, coords, eventData)) { return } that.pointAtShownTooltip = point } }, _showPointTooltip: function(event, point) { var that = event.data.tracker, pointWithTooltip = that.pointAtShownTooltip; if (pointWithTooltip && pointWithTooltip !== point) { that._hideTooltip(pointWithTooltip) } that._showTooltip(point) }, _hidePointTooltip: function(event, point) { event.data.tracker._hideTooltip(point) }, _enableOutHandler: function() { if (this._outHandler) { return } var that = this, handler = function(e) { var rootOffset = that._renderer.getRootOffset(), x = _floor(e.pageX - rootOffset.left), y = _floor(e.pageY - rootOffset.top); if (!inCanvas(that._mainCanvas, x, y)) { that._pointerOut(); that._disableOutHandler() } }; $(document).on(POINTER_ACTION, handler); this._outHandler = handler }, _disableOutHandler: function() { this._outHandler && $(document).off(POINTER_ACTION, this._outHandler); this._outHandler = null }, _pointerOut: function() { this._clearHover(); this._tooltip.isEnabled() && this._hideTooltip(this.pointAtShownTooltip) }, _triggerLegendClick: function(eventArgs, elementClick) { var eventTrigger = this._eventTrigger; eventTrigger(LEGEND_CLICK, eventArgs, function() { !eventCanceled(eventArgs.jQueryEvent, eventArgs.target) && eventTrigger(elementClick, eventArgs) }) }, _hoverLegendItem: function(x, y) { var series, that = this, item = that._legend.getItemByCoord(x, y), legendHoverMode = correctLegendHoverMode(that._legend.getOptions().hoverMode); if (item) { series = that._storedSeries[item.id]; if (!series.isHovered() || series.lastHoverMode !== legendHoverMode) { that._setHoveredSeries(series, legendHoverMode) } that._tooltip.isEnabled() && that._hideTooltip(that.pointAtShownTooltip) } else { that._clearHover() } }, _hoverArgument: function(argument, argumentIndex) { var that = this, hoverMode = that._getArgumentHoverMode(); if (isDefined(argument)) { that._releaseHoveredPoint(); that._hoveredArgument = argument; that._argumentIndex = argumentIndex; that._notifySeries({ action: "pointHover", notifyLegend: that._notifyLegendOnHoverArgument, target: { argument: argument, fullState: HOVER_STATE, argumentIndex: argumentIndex, getOptions: function() { return { hoverMode: hoverMode } } } }) } }, _resetHoveredArgument: function() { var hoverMode, that = this; if (isDefined(that._hoveredArgument)) { hoverMode = that._getArgumentHoverMode(); that._notifySeries({ action: "clearPointHover", notifyLegend: that._notifyLegendOnHoverArgument, target: { fullState: NORMAL_STATE, argumentIndex: that._argumentIndex, argument: that._hoveredArgument, getOptions: function() { return { hoverMode: hoverMode } } } }); that._hoveredArgument = null } }, _notifySeries: function(data) { this._storedSeries.forEach(function(series) { series.notify(data) }) }, _pointerHandler: function(e) { var that = e.data.tracker, rootOffset = that._renderer.getRootOffset(), x = _floor(e.pageX - rootOffset.left), y = _floor(e.pageY - rootOffset.top), canvas = that._getCanvas(x, y), series = getData(e, SERIES_DATA), point = getData(e, POINT_DATA) || series && series.getPointByCoord(x, y); that._enableOutHandler(); if (that._checkGestureEvents(e, canvas, rootOffset)) { return } if (that._legend.coordsIn(x, y)) { that._hoverLegendItem(x, y); return } if (that.hoveredSeries && that.hoveredSeries !== that._stuckSeries) { that._releaseHoveredSeries() } if (that._hoverArgumentAxis(x, y, e)) { return } if (that._isPointerOut(canvas, point)) { that._pointerOut() } if (!canvas && !point) { return } if (series && !point) { point = series.getNeighborPoint(x, y); if (series !== that.hoveredSeries) { that._setTimeout(function() { that._setHoveredSeries(series); that._setStuckSeries(e, series, x, y); that._pointerComplete(point, x, y) }, series); return } } else { if (point) { if (that.hoveredSeries) { that._setTimeout(function() { that._pointerOnPoint(point, x, y, e) }, point) } else { that._pointerOnPoint(point, x, y, e) } return } else { if (that._setStuckSeries(e, void 0, x, y)) { series = that._stuckSeries; point = series.getNeighborPoint(x, y); that._releaseHoveredSeries(); point && that._setHoveredPoint(point) } } } that._pointerComplete(point, x, y) }, _pointerOnPoint: function(point, x, y) { this._setHoveredPoint(point); this._pointerComplete(point, x, y) }, _pointerComplete: function(point) { this.pointAtShownTooltip !== point && this._tooltip.isEnabled() && this._showTooltip(point) }, _clickHandler: function(e) { var that = e.data.tracker, rootOffset = that._renderer.getRootOffset(), x = _floor(e.pageX - rootOffset.left), y = _floor(e.pageY - rootOffset.top), point = getData(e, POINT_DATA), series = that._stuckSeries || getData(e, SERIES_DATA) || point && point.series, axis = that._argumentAxis; if (that._legend.coordsIn(x, y)) { var item = that._legend.getItemByCoord(x, y); if (item) { that._legendClick(item, e) } } else { if (axis && axis.coordsIn(x, y)) { var argument = getData(e, ARG_DATA); if (isDefined(argument)) { that._eventTrigger("argumentAxisClick", { argument: argument, jQueryEvent: e }) } } else { if (series) { point = point || series.getPointByCoord(x, y); if (point) { that._pointClick(point, e) } else { getData(e, SERIES_DATA) && that._eventTrigger(SERIES_CLICK, { target: series, jQueryEvent: e }) } } } } }, dispose: function() { var that = this; that._disableOutHandler(); that._toggleParentsScrollSubscription(); that._renderer.root.off(DOT_EVENT_NS); that._seriesGroup.off(DOT_EVENT_NS) } }; var ChartTracker = function(options) { this.ctor(options) }; extend(ChartTracker.prototype, baseTrackerPrototype, { _pointClick: function(point, event) { var that = this, eventTrigger = that._eventTrigger, series = point.series; eventTrigger(POINT_CLICK, { target: point, jQueryEvent: event }, function() { !eventCanceled(event, series) && eventTrigger(SERIES_CLICK, { target: series, jQueryEvent: event }) }) }, __trackerDelay: DELAY, update: function(options) { var that = this; that._zoomingMode = _normalizeEnum(options.zoomingMode); that._scrollingMode = _normalizeEnum(options.scrollingMode); baseTrackerPrototype.update.call(this, options); that._argumentAxis = options.argumentAxis || {}; that._axisHoverEnabled = that._argumentAxis && _normalizeEnum(that._argumentAxis.getOptions().hoverMode) === ALL_ARGUMENT_POINTS_MODE; that._chart = options.chart; that._rotated = options.rotated; that._crosshair = options.crosshair }, _getCanvas: function(x, y) { var that = this, canvases = that._canvases || []; for (var i = 0; i < canvases.length; i++) { var c = canvases[i]; if (inCanvas(c, x, y)) { return c } } return null }, _isPointerOut: function(canvas) { return !canvas && this._stuckSeries }, _hideCrosshair: function() { this._crosshair && this._crosshair.hide() }, _moveCrosshair: function(point, x, y) { if (point && this._crosshair && point.isVisible()) { this._crosshair.show({ point: point, x: x, y: y }) } }, _prepare: function() { var that = this, root = that._renderer.root, touchScrollingEnabled = "all" === that._scrollingMode || "touch" === that._scrollingMode, touchZoomingEnabled = "all" === that._zoomingMode || "touch" === that._zoomingMode, cssValue = (!touchScrollingEnabled ? "pan-x pan-y " : "") + (!touchZoomingEnabled ? "pinch-zoom" : "") || "none", rootStyles = { "touch-action": cssValue, "-ms-touch-action": cssValue }, wheelZoomingEnabled = "all" === that._zoomingMode || "mouse" === that._zoomingMode; root.off(addNamespace([wheelEvent.name, "dxc-scroll-start", "dxc-scroll-move"], EVENT_NS)); baseTrackerPrototype._prepare.call(that); if (!that._gestureEndHandler) { that._gestureEndHandler = function() { that._gestureEnd && that._gestureEnd() }; $(document).on(addNamespace(pointerEvents.up, EVENT_NS), that._gestureEndHandler) } wheelZoomingEnabled && root.on(addNamespace(wheelEvent.name, EVENT_NS), function(e) { var rootOffset = that._renderer.getRootOffset(), x = that._rotated ? e.pageY - rootOffset.top : e.pageX - rootOffset.left, scale = that._argumentAxis.getTranslator().getMinScale(e.delta > 0), translate = x - x * scale, zoom = that._argumentAxis.getTranslator().zoom(-translate, scale); that._pointerOut(); that._eventTrigger(ZOOM_START); that._chart.zoomArgument(zoom.min, zoom.max, true); e.preventDefault(); e.stopPropagation() }); root.on(addNamespace("dxc-scroll-start", EVENT_NS), function(e) { that._startScroll = true; that._gestureStart(that._getGestureParams(e, { left: 0, top: 0 })) }).on(addNamespace("dxc-scroll-move", EVENT_NS), function(e) { that._gestureChange(that._getGestureParams(e, { left: 0, top: 0 })) && e.preventDefault() }); root.css(rootStyles) }, _getGestureParams: function(e, offset) { var x1, x2, left, right, that = this, touches = e.pointers.length, eventCoordField = that._rotated ? "pageY" : "pageX"; offset = that._rotated ? offset.top : offset.left; if (2 === touches) { x1 = e.pointers[0][eventCoordField] - offset; x2 = e.pointers[1][eventCoordField] - offset } else { if (1 === touches) { x1 = x2 = e.pointers[0][eventCoordField] - offset } } left = Math.min(x1, x2); right = Math.max(x1, x2); return { center: left + (right - left) / 2, distance: right - left, touches: touches, scale: 1, pointerType: e.pointerType } }, _gestureStart: function(gestureParams) { var that = this; that._startGesture = that._startGesture || gestureParams; if (that._startGesture.touches !== gestureParams.touches) { that._startGesture = gestureParams } }, _gestureChange: function(gestureParams) { var that = this, startGesture = that._startGesture, gestureChanged = false, scrollingEnabled = "all" === that._scrollingMode || "none" !== that._scrollingMode && that._scrollingMode === gestureParams.pointerType, zoomingEnabled = "all" === that._zoomingMode || "touch" === that._zoomingMode; if (!startGesture) { return gestureChanged } if (1 === startGesture.touches && Math.abs(startGesture.center - gestureParams.center) < 3) { that._gestureStart(gestureParams); return gestureChanged } if (2 === startGesture.touches && zoomingEnabled) { gestureChanged = true; startGesture.scale = gestureParams.distance / startGesture.distance; startGesture.scroll = gestureParams.center - startGesture.center + (startGesture.center - startGesture.center * startGesture.scale) } else { if (1 === startGesture.touches && scrollingEnabled) { gestureChanged = true; startGesture.scroll = gestureParams.center - startGesture.center } } if (gestureChanged) { if (that._startScroll) { that._eventTrigger(ZOOM_START); that._startScroll = false } startGesture.changed = gestureChanged; that._chart._transformArgument(startGesture.scroll, startGesture.scale) } return gestureChanged }, _gestureEnd: function() { var zoom, that = this, startGesture = that._startGesture, renderer = that._renderer; that._startGesture = null; that._startScroll = false; function complete() { that._chart.zoomArgument(zoom.min, zoom.max, true) } if (startGesture && startGesture.changed) { zoom = that._argumentAxis._translator.zoom(-startGesture.scroll, startGesture.scale); if (renderer.animationEnabled() && (-startGesture.scroll !== zoom.translate || startGesture.scale !== zoom.scale)) { var translateDelta = -(startGesture.scroll + zoom.translate), scaleDelta = startGesture.scale - zoom.scale; renderer.root.animate({ _: 0 }, { step: function(pos) { var translateValue = -startGesture.scroll - translateDelta * pos, scaleValue = startGesture.scale - scaleDelta * pos; that._chart._transformArgument(-translateValue, scaleValue) }, complete: complete, duration: 250 }) } else { complete() } } }, _clean: function() { var that = this; baseTrackerPrototype._clean.call(that); that._resetTimer(); that._stuckSeries = null }, _getSeriesForShared: function(x, y) { var that = this, points = [], point = null, distance = 1 / 0; if (that._tooltip.isShared() && !that.hoveredSeries) { _each(that._storedSeries, function(_, series) { var point = series.getNeighborPoint(x, y); point && points.push(point) }); _each(points, function(_, p) { var coords = p.getCrosshairData(x, y), d = vizUtils.getDistance(x, y, coords.x, coords.y); if (d < distance) { point = p; distance = d } }) } return point && point.series }, _setTimeout: function(callback, keeper) { var that = this; if (that._timeoutKeeper !== keeper) { that._resetTimer(); that._hoverTimeout = setTimeout(function() { callback(); that._timeoutKeeper = null }, DELAY); that._timeoutKeeper = keeper } }, _resetTimer: function() { clearTimeout(this._hoverTimeout); this._timeoutKeeper = this._hoverTimeout = null }, _checkGestureEvents: function(e, canvas, rootOffset) { var that = this; if (e.type === pointerEvents.down) { if (canvas) { that._startScroll = true; that._gestureStart(that._getGestureParams(e, rootOffset)) } } else { if (that._startGesture && canvas) { if (that._gestureChange(that._getGestureParams(e, rootOffset))) { that._pointerOut(); e.preventDefault(); return true } } } }, _setStuckSeries: function(e, series, x, y) { if ("mouse" !== e.pointerType) { this._stuckSeries = null } else { this._stuckSeries = series || this._stuckSeries || this._getSeriesForShared(x, y) } return !!this._stuckSeries }, _pointerOut: function() { var that = this; that._stuckSeries = null; that._hideCrosshair(); that._resetTimer(); baseTrackerPrototype._pointerOut.call(that) }, _hoverArgumentAxis: function(x, y, e) { var that = this; that._resetHoveredArgument(); if (that._axisHoverEnabled && that._argumentAxis.coordsIn(x, y)) { that._hoverArgument(getData(e, ARG_DATA)); return true } }, _pointerComplete: function(point, x, y) { var that = this; that.hoveredSeries && that.hoveredSeries.updateHover(x, y); that._resetTimer(); that._moveCrosshair(point, x, y); baseTrackerPrototype._pointerComplete.call(that, point) }, _legendClick: function(item, e) { var series = this._storedSeries[item.id]; this._triggerLegendClick({ target: series, jQueryEvent: e }, SERIES_CLICK) }, _hoverLegendItem: function(x, y) { this._stuckSeries = null; this._hideCrosshair(); baseTrackerPrototype._hoverLegendItem.call(this, x, y) }, _pointerOnPoint: function(point, x, y, e) { this._setStuckSeries(e, point.series, x, y); this._releaseHoveredSeries(); baseTrackerPrototype._pointerOnPoint.call(this, point, x, y, e) }, _notifyLegendOnHoverArgument: false, _getArgumentHoverMode: function() { return correctHoverMode(this._argumentAxis) }, dispose: function() { $(document).off(DOT_EVENT_NS, this._gestureEndHandler); this._resetTimer(); baseTrackerPrototype.dispose.call(this) } }); var PieTracker = function(options) { this.ctor(options) }; extend(PieTracker.prototype, baseTrackerPrototype, { _isPointerOut: function(_, point) { return !point }, _legendClick: function(item, e) { var that = this, points = []; that._storedSeries.forEach(function(s) { points.push.apply(points, s.getPointsByKeys(item.argument, item.id)) }); that._eventTrigger(LEGEND_CLICK, { target: item.argument, points: points, jQueryEvent: e }) }, _pointClick: function(point, e) { this._eventTrigger(POINT_CLICK, { target: point, jQueryEvent: e }) }, _hoverLegendItem: function(x, y) { var that = this, item = that._legend.getItemByCoord(x, y); that._resetHoveredArgument(); if (item) { that._hoverArgument(item.argument, item.argumentIndex) } else { that._clearHover() } }, _getArgumentHoverMode: function() { return correctHoverMode(this._legend) }, _hoverArgumentAxis: _noop, _setStuckSeries: _noop, _getCanvas: _noop, _checkGestureEvents: _noop, _notifyLegendOnHoverArgument: true }); exports.ChartTracker = ChartTracker; exports.PieTracker = PieTracker }, /*!*************************************************!*\ !*** ./js/viz/chart_components/header_block.js ***! \*************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), LayoutElementModule = __webpack_require__( /*! ../core/layout_element */ 522), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, _extend = extend, _each = $.each; function HeaderBlock() {} _extend(HeaderBlock.prototype, LayoutElementModule.LayoutElement.prototype, { update: function(elements, canvas) { this._elements = $.map(elements, function(element) { return element.getLayoutOptions() ? element : null }); this._canvas = canvas }, dispose: function() { this._elements = null }, measure: function() { var result, that = this, layoutOptions = that.getLayoutOptions(); if (layoutOptions) { result = { size: [layoutOptions.width, layoutOptions.height], alignment: [layoutOptions.horizontalAlignment, layoutOptions.verticalAlignment], side: 1 }; _each(that._elements, function(_, elem) { elem.draw(layoutOptions.width, layoutOptions.height, that._canvas) }) } return result || null }, getLayoutOptions: function() { var firstElement, layout, elementLayout, that = this, elements = that._elements, length = elements.length, i = 1; if (!length) { return null } firstElement = elements[0]; layout = _extend(true, {}, firstElement.getLayoutOptions()); layout.position = layout.position || {}; for (i; i < length; i++) { elementLayout = elements[i].getLayoutOptions(); if (elementLayout.height > layout.height) { layout.height = elementLayout.height } layout.width += elementLayout.width; if (elementLayout.position) { layout.position = elementLayout.position; layout.verticalAlignment = elementLayout.position.vertical; layout.horizontalAlignment = elementLayout.position.horizontal } } return layout }, probeDraw: function(width, height) { this._elements.forEach(function(e) { e.probeDraw(width, height); width -= e.getLayoutOptions().width }) }, draw: function(width, height) { var canvas = this._canvas; this._elements.forEach(function(e) { e.draw(width, height, canvas); width -= e.getLayoutOptions().width }) }, shift: function(x, y) { _each(this._elements, function(_, elem) { elem.shift(x, y) }) } }); exports.HeaderBlock = HeaderBlock }, /*!******************************!*\ !*** ./js/viz/core/title.js ***! \******************************/ function(module, exports, __webpack_require__) { var _Number = Number, _isString = __webpack_require__( /*! ../../core/utils/common */ 14).isString, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, _patchFontOptions = __webpack_require__( /*! ./utils */ 509).patchFontOptions, parseHorizontalAlignment = __webpack_require__( /*! ./utils */ 509).enumParser(["left", "center", "right"]), parseVerticalAlignment = __webpack_require__( /*! ./utils */ 509).enumParser(["top", "bottom"]), DEFAULT_MARGIN = 10, DEFAULT_GAP = 3; function hasText(text) { return !!(text && String(text).length > 0) } function processTitleLength(elem, text, width) { if (elem.attr({ text: text }).applyEllipsis(width)) { elem.setTitle(text) } } function pickMarginValue(value) { return value >= 0 ? _Number(value) : DEFAULT_MARGIN } function validateMargin(margin) { var result; if (margin >= 0) { result = { left: _Number(margin), top: _Number(margin), right: _Number(margin), bottom: _Number(margin) } } else { margin = margin || {}; result = { left: pickMarginValue(margin.left), top: pickMarginValue(margin.top), right: pickMarginValue(margin.right), bottom: pickMarginValue(margin.bottom) } } return result } function Title(params) { this._params = params; this._group = params.renderer.g().attr({ "class": params.cssClass }).linkOn(params.renderer.root, { name: "title", after: "peripheral" }); this._hasText = false } extend(Title.prototype, __webpack_require__( /*! ./layout_element */ 522).LayoutElement.prototype, { dispose: function() { var that = this; that._group.linkRemove(); that._group.linkOff(); if (that._titleElement) { that._clipRect.dispose(); that._titleElement = that._subtitleElement = that._clipRect = null } that._params = that._group = that._options = null }, _updateOptions: function(options) { this._options = options; this._options.horizontalAlignment = parseHorizontalAlignment(options.horizontalAlignment, "center"); this._options.verticalAlignment = parseVerticalAlignment(options.verticalAlignment, "top"); this._options.margin = validateMargin(options.margin) }, _updateStructure: function() { var that = this, renderer = that._params.renderer, group = that._group, alignObj = { align: that._options.horizontalAlignment }; if (!that._titleElement) { that._titleElement = renderer.text().attr(alignObj).append(group); that._subtitleElement = renderer.text().attr(alignObj); that._clipRect = renderer.clipRect(); group.attr({ "clip-path": that._clipRect.id }) } group.linkAppend(); hasText(that._options.subtitle.text) ? that._subtitleElement.append(group) : that._subtitleElement.remove() }, _updateTexts: function() { var titleBox, y, that = this, options = that._options, subtitleOptions = options.subtitle, titleElement = that._titleElement, subtitleElement = that._subtitleElement, testText = "A"; titleElement.attr({ text: testText, y: 0 }).css(_patchFontOptions(options.font)); titleBox = titleElement.getBBox(); that._titleTextY = titleBox.height + titleBox.y; titleElement.attr({ text: options.text }); titleBox = titleElement.getBBox(); y = -titleBox.y; titleElement.attr({ y: y }); if (hasText(subtitleOptions.text)) { y += titleBox.height + titleBox.y; subtitleElement.attr({ text: subtitleOptions.text, y: 0 }).css(_patchFontOptions(subtitleOptions.font)); y += -subtitleElement.getBBox().y - that._titleTextY + DEFAULT_GAP; subtitleElement.attr({ y: y }) } }, _updateBoundingRectAlignment: function() { var boundingRect = this._boundingRect, options = this._options; boundingRect.verticalAlignment = options.verticalAlignment; boundingRect.horizontalAlignment = options.horizontalAlignment; boundingRect.cutLayoutSide = options.verticalAlignment; boundingRect.cutSide = "vertical"; boundingRect.position = { horizontal: options.horizontalAlignment, vertical: options.verticalAlignment } }, update: function(options) { var that = this, _hasText = hasText(options.text), isLayoutChanged = _hasText || _hasText !== that._hasText; if (_hasText) { that._updateOptions(options); that._updateStructure(); that._updateTexts(); that._boundingRect = {}; that._updateBoundingRect(); that._updateBoundingRectAlignment() } else { that._group.linkRemove(); that._boundingRect = null } that._hasText = _hasText; return isLayoutChanged }, draw: function(width, height) { var layoutOptions, that = this; that._group.linkAppend(); that._correctTitleLength(width); layoutOptions = that.getLayoutOptions(); if (layoutOptions.height > height) { that._params.incidentOccurred("W2103"); that._group.linkRemove(); that._boundingRect.width = that._boundingRect.height = 0 } return that }, probeDraw: function(width, height) { this.draw(width, height); return this }, _correctTitleLength: function(width) { var that = this, options = that._options, margin = options.margin, maxWidth = width - margin.left - margin.right; processTitleLength(that._titleElement, options.text, maxWidth); that._subtitleElement && processTitleLength(that._subtitleElement, options.subtitle.text, maxWidth); that._updateBoundingRect() }, getLayoutOptions: function() { return this._boundingRect || null }, shift: function(x, y) { var that = this, box = that.getLayoutOptions(); that._group.move(x - box.x, y - box.y); that._setClipRectSettings(); return that }, _setClipRectSettings: function() { var bBox = this.getLayoutOptions(); this._clipRect.attr({ x: bBox.x, y: bBox.y, width: bBox.width, height: bBox.height }) }, _updateBoundingRect: function() { var box, that = this, options = that._options, margin = options.margin, boundingRect = that._boundingRect; box = that._group.getBBox(); box.height += margin.top + margin.bottom - that._titleTextY; box.width += margin.left + margin.right; box.x -= margin.left; box.y += that._titleTextY - margin.top; if (options.placeholderSize > 0) { box.height = options.placeholderSize } boundingRect.height = box.height; boundingRect.width = box.width; boundingRect.x = box.x; boundingRect.y = box.y }, layoutOptions: function() { return this._boundingRect && { horizontalAlignment: this._boundingRect.horizontalAlignment, verticalAlignment: this._boundingRect.verticalAlignment } }, measure: function(size) { this.draw(size[0], size[1]); return [this._boundingRect.width, this._boundingRect.height] }, move: function(rect) { var boundingRect = this._boundingRect; if (rect[2] - rect[0] < boundingRect.width || rect[3] - rect[1] < boundingRect.height) { this.draw(rect[2] - rect[0], rect[3] - rect[1]) } this.shift(Math.round(rect[0]), Math.round(rect[1])) } }); exports.Title = Title; Title.prototype.DEBUG_getOptions = function() { return this._options }; function processTitleOptions(options) { var newOptions = _isString(options) ? { text: options } : options || {}; newOptions.subtitle = _isString(newOptions.subtitle) ? { text: newOptions.subtitle } : newOptions.subtitle || {}; return newOptions } exports.plugin = { name: "title", init: function() { var that = this; that._title = new exports.Title({ renderer: that._renderer, cssClass: that._rootClassPrefix + "-title", incidentOccurred: that._incidentOccurred }); that._layout.add(that._title) }, dispose: function() { this._title.dispose(); this._title = null }, members: { _getTitleOptions: function() { return extend(true, {}, this._themeManager.theme("title"), processTitleOptions(this.option("title"))) } }, customize: function(constructor) { constructor.addChange({ code: "TITLE", handler: function() { if (this._title.update(this._getTitleOptions())) { this._change(["LAYOUT"]) } }, isThemeDependent: true, option: "title", isOptionChange: true }) } } }, /*!********************************!*\ !*** ./js/viz/core/tooltip.js ***! \********************************/ function(module, exports, __webpack_require__) { var doc = document, win = window, $ = __webpack_require__( /*! ../../core/renderer */ 9), rendererModule = __webpack_require__( /*! ./renderers/renderer */ 518), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), typeUtils = __webpack_require__( /*! ../../core/utils/type */ 12), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, HALF_ARROW_WIDTH = 10, vizUtils = __webpack_require__( /*! ./utils */ 509), _format = __webpack_require__( /*! ./format */ 530), mathCeil = Math.ceil; function hideElement($element) { $element.css({ left: "-9999px" }).detach() } function getSpecialFormatOptions(options, specialFormat) { var result = options; switch (specialFormat) { case "argument": result = { format: options.argumentFormat, precision: options.argumentPrecision }; break; case "percent": result = { format: { type: "percent", precision: options.format && options.format.percentPrecision || options.percentPrecision } } } return result } function Tooltip(params) { var renderer, root, that = this; that._eventTrigger = params.eventTrigger; that._wrapper = $("<div>").css({ position: "absolute", overflow: "visible", height: "1px", "pointer-events": "none" }).addClass(params.cssClass); that._renderer = renderer = new rendererModule.Renderer({ pathModified: params.pathModified, container: that._wrapper[0] }); root = renderer.root; root.attr({ "pointer-events": "none" }); that._cloud = renderer.path([], "area").sharp().append(root); that._shadow = renderer.shadowFilter(); that._textGroup = renderer.g().attr({ align: "center" }).append(root); that._text = renderer.text(void 0, 0, 0).append(that._textGroup); that._textGroupHtml = $("<div>").css({ position: "absolute", width: 0, padding: 0, margin: 0, border: "0px solid transparent" }).appendTo(that._wrapper); that._textHtml = $("<div>").css({ position: "relative", display: "inline-block", padding: 0, margin: 0, border: "0px solid transparent" }).appendTo(that._textGroupHtml) } Tooltip.prototype = { constructor: Tooltip, dispose: function() { this._wrapper.remove(); this._renderer.dispose(); this._options = null }, _getContainer: function() { var container = $(this._options.container); return (container.length ? container : $("body")).get(0) }, setOptions: function(options) { options = options || {}; var that = this, cloudSettings = that._cloudSettings = { opacity: options.opacity, filter: that._shadow.id, "stroke-width": null, stroke: null }, borderOptions = options.border || {}; that._shadowSettings = extend({ x: "-50%", y: "-50%", width: "200%", height: "200%" }, options.shadow); that._options = options; if (borderOptions.visible) { extend(cloudSettings, { "stroke-width": borderOptions.width, stroke: borderOptions.color, "stroke-opacity": borderOptions.opacity, dashStyle: borderOptions.dashStyle }) } that._textFontStyles = vizUtils.patchFontOptions(options.font); that._textFontStyles.color = options.font.color; that._wrapper.css({ "z-index": options.zIndex }); that._customizeTooltip = commonUtils.isFunction(options.customizeTooltip) ? options.customizeTooltip : null; return that }, setRendererOptions: function(options) { this._renderer.setOptions(options); this._textGroupHtml.css({ direction: options.rtl ? "rtl" : "ltr" }); return this }, render: function() { var that = this; hideElement(that._wrapper); that._cloud.attr(that._cloudSettings); that._shadow.attr(that._shadowSettings); that._textGroupHtml.css(that._textFontStyles); that._textGroup.css(that._textFontStyles); that._text.css(that._textFontStyles); that._eventData = null; return that }, update: function(options) { return this.setOptions(options).render() }, _prepare: function(formatObject, state) { var options = this._options, customize = {}; if (this._customizeTooltip) { customize = this._customizeTooltip.call(formatObject, formatObject); customize = typeUtils.isPlainObject(customize) ? customize : {}; if ("text" in customize) { state.text = commonUtils.isDefined(customize.text) ? String(customize.text) : "" } if ("html" in customize) { state.html = commonUtils.isDefined(customize.html) ? String(customize.html) : "" } } if (!("text" in state) && !("html" in state)) { state.text = formatObject.valueText || "" } state.color = customize.color || options.color; state.borderColor = customize.borderColor || (options.border || {}).color; state.textColor = customize.fontColor || (options.font || {}).color; return !!state.text || !!state.html }, show: function(formatObject, params, eventData) { var bBox, contentSize, that = this, state = {}, options = that._options, paddingLeftRight = options.paddingLeftRight, paddingTopBottom = options.paddingTopBottom, textGroupHtml = that._textGroupHtml, textHtml = that._textHtml, ss = that._shadowSettings, xOff = ss.offsetX, yOff = ss.offsetY, blur = 2 * ss.blur + 1, getComputedStyle = win.getComputedStyle; if (!that._prepare(formatObject, state)) { return false } that._state = state; state.tc = {}; that._wrapper.appendTo(that._getContainer()); that._cloud.attr({ fill: state.color, stroke: state.borderColor }); if (state.html) { that._text.attr({ text: "" }); textGroupHtml.css({ color: state.textColor, width: that._getCanvas().width }); textHtml.html(state.html); if (getComputedStyle) { bBox = getComputedStyle(textHtml.get(0)); bBox = { x: 0, y: 0, width: mathCeil(parseFloat(bBox.width)), height: mathCeil(parseFloat(bBox.height)) } } else { bBox = textHtml.get(0).getBoundingClientRect(); bBox = { x: 0, y: 0, width: mathCeil(bBox.width ? bBox.width : bBox.right - bBox.left), height: mathCeil(bBox.height ? bBox.height : bBox.bottom - bBox.top) } } textGroupHtml.width(bBox.width); textGroupHtml.height(bBox.height) } else { textHtml.html(""); that._text.css({ fill: state.textColor }).attr({ text: state.text }); bBox = that._textGroup.css({ fill: state.textColor }).getBBox() } contentSize = state.contentSize = { x: bBox.x - paddingLeftRight, y: bBox.y - paddingTopBottom, width: bBox.width + 2 * paddingLeftRight, height: bBox.height + 2 * paddingTopBottom, lm: blur - xOff > 0 ? blur - xOff : 0, rm: blur + xOff > 0 ? blur + xOff : 0, tm: blur - yOff > 0 ? blur - yOff : 0, bm: blur + yOff > 0 ? blur + yOff : 0 }; contentSize.fullWidth = contentSize.width + contentSize.lm + contentSize.rm; contentSize.fullHeight = contentSize.height + contentSize.tm + contentSize.bm + options.arrowLength; that.move(params.x, params.y, params.offset); that._eventData && that._eventTrigger("tooltipHidden", that._eventData); that._eventData = eventData; that._eventTrigger("tooltipShown", that._eventData); return true }, hide: function() { var that = this; hideElement(that._wrapper); that._eventData && that._eventTrigger("tooltipHidden", that._eventData); that._eventData = null }, move: function(x, y, offset) { offset = offset || 0; var that = this, canvas = that._getCanvas(), state = that._state, coords = state.tc, contentSize = state.contentSize; if (that._calculatePosition(x, y, offset, canvas)) { that._cloud.attr({ points: coords.cloudPoints }).move(contentSize.lm, contentSize.tm); if (state.html) { that._textGroupHtml.css({ left: -contentSize.x + contentSize.lm, top: -contentSize.y + contentSize.tm + coords.correction }) } else { that._textGroup.move(-contentSize.x + contentSize.lm, -contentSize.y + contentSize.tm + coords.correction) } that._renderer.resize("out" === coords.hp ? canvas.fullWidth - canvas.left : contentSize.fullWidth, "out" === coords.vp ? canvas.fullHeight - canvas.top : contentSize.fullHeight) } offset = that._wrapper.css({ left: 0, top: 0 }).offset(); that._wrapper.css({ left: coords.x - offset.left, top: coords.y - offset.top, width: contentSize.fullWidth }) }, formatValue: function(value, _specialFormat) { var options = _specialFormat ? getSpecialFormatOptions(this._options, _specialFormat) : this._options; return _format(value, options) }, getLocation: function() { return vizUtils.normalizeEnum(this._options.location) }, isEnabled: function() { return !!this._options.enabled }, isShared: function() { return !!this._options.shared }, _calculatePosition: function(x, y, offset, canvas) { var cloudPoints, y1, y3, hasDeprecatedPosition, that = this, options = that._options, arrowLength = options.arrowLength, state = that._state, coords = state.tc, contentSize = state.contentSize, contentWidth = contentSize.width, halfContentWidth = contentWidth / 2, contentHeight = contentSize.height, cTop = y - canvas.top, cBottom = canvas.top + canvas.height - y, cLeft = x - canvas.left, cRight = canvas.width + canvas.left - x, tTop = contentHeight + arrowLength + offset + contentSize.tm, tBottom = contentHeight + arrowLength + offset + contentSize.bm, tLeft = contentWidth + contentSize.lm, tRight = contentWidth + contentSize.rm, tHalfLeft = halfContentWidth + contentSize.lm, tHalfRight = halfContentWidth + contentSize.rm, correction = 0, arrowPoints = [6, 0], x1 = halfContentWidth + HALF_ARROW_WIDTH, x2 = halfContentWidth, x3 = halfContentWidth - HALF_ARROW_WIDTH, y2 = contentHeight + arrowLength, hp = "center", vp = "bottom"; y1 = y3 = contentHeight; switch (options.verticalAlignment) { case "top": vp = "bottom"; hasDeprecatedPosition = true; break; case "bottom": vp = "top"; hasDeprecatedPosition = true } if (!hasDeprecatedPosition) { if (tTop > cTop && tBottom > cBottom) { vp = "out" } else { if (tTop > cTop) { vp = "top" } } } hasDeprecatedPosition = false; switch (options.horizontalAlignment) { case "left": hp = "right"; hasDeprecatedPosition = true; break; case "center": hp = "center"; hasDeprecatedPosition = true; break; case "right": hp = "left"; hasDeprecatedPosition = true } if (!hasDeprecatedPosition) { if (tLeft > cLeft && tRight > cRight) { hp = "out" } else { if (tHalfLeft > cLeft && tRight < cRight) { hp = "left" } else { if (tHalfRight > cRight && tLeft < cLeft) { hp = "right" } } } } if ("out" === hp) { x = canvas.left } else { if ("left" === hp) { x1 = HALF_ARROW_WIDTH; x2 = x3 = 0 } else { if ("right" === hp) { x1 = x2 = contentWidth; x3 = contentWidth - HALF_ARROW_WIDTH; x -= contentWidth } else { if ("center" === hp) { x -= halfContentWidth } } } } if ("out" === vp) { y = canvas.top } else { if ("top" === vp) { "out" !== hp && (correction = arrowLength); arrowPoints[0] = 2; y1 = y3 = arrowLength; y2 = x1; x1 = x3; x3 = y2; y2 = 0; y += offset } else { y -= contentHeight + arrowLength + offset } } coords.x = x - contentSize.lm; coords.y = y - contentSize.tm; coords.correction = correction; if (hp === coords.hp && vp === coords.vp) { return false } coords.hp = hp; coords.vp = vp; cloudPoints = [0, 0 + correction, contentWidth, 0 + correction, contentWidth, contentHeight + correction, 0, contentHeight + correction]; if ("out" !== hp && "out" !== vp) { arrowPoints.splice(2, 0, x1, y1, x2, y2, x3, y3); cloudPoints.splice.apply(cloudPoints, arrowPoints) } coords.cloudPoints = cloudPoints; return true }, _getCanvas: function() { var html = doc.documentElement, body = doc.body; return { left: win.pageXOffset || html.scrollLeft || 0, top: win.pageYOffset || html.scrollTop || 0, width: html.clientWidth || 0, height: html.clientHeight || 0, fullWidth: Math.max(body.scrollWidth, html.scrollWidth, body.offsetWidth, html.offsetWidth, body.clientWidth, html.clientWidth), fullHeight: Math.max(body.scrollHeight, html.scrollHeight, body.offsetHeight, html.offsetHeight, body.clientHeight, html.clientHeight) } } }; exports.Tooltip = Tooltip; exports.plugin = { name: "tooltip", init: function() { this._initTooltip() }, dispose: function() { this._disposeTooltip() }, members: { _initTooltip: function() { this._tooltip = new exports.Tooltip({ cssClass: this._rootClassPrefix + "-tooltip", eventTrigger: this._eventTrigger, pathModified: this.option("pathModified") }) }, _disposeTooltip: function() { this._tooltip.dispose(); this._tooltip = null }, _hideTooltip: function() { this._tooltip.hide() }, _onRender: function() { if (!this._$element.is(":visible")) { this._hideTooltip() } }, _setTooltipRendererOptions: function() { this._tooltip.setRendererOptions(this._getRendererOptions()) }, _setTooltipOptions: function() { this._tooltip.update(this._getOption("tooltip")) } }, customize: function(constructor) { var proto = constructor.prototype; proto._eventsMap.onTooltipShown = { name: "tooltipShown" }; proto._eventsMap.onTooltipHidden = { name: "tooltipHidden" }; constructor.addChange({ code: "TOOLTIP_RENDERER", handler: function() { this._setTooltipRendererOptions() }, isThemeDependent: true, isOptionChange: true }); constructor.addChange({ code: "TOOLTIP", handler: function() { this._setTooltipOptions() }, isThemeDependent: true, isOptionChange: true, option: "tooltip" }) } } }, /*!******************************************!*\ !*** ./js/viz/core/loading_indicator.js ***! \******************************************/ function(module, exports, __webpack_require__) { var _patchFontOptions = __webpack_require__( /*! ./utils */ 509).patchFontOptions, STATE_HIDDEN = 0, STATE_SHOWN = 1, ANIMATION_EASING = "linear", ANIMATION_DURATION = 400, LOADING_INDICATOR_READY = "loadingIndicatorReady"; function LoadingIndicator(parameters) { var that = this, renderer = parameters.renderer; that._group = renderer.g().attr({ "class": "dx-loading-indicator" }).linkOn(renderer.root, { name: "loading-indicator", after: "peripheral" }); that._rect = renderer.rect().attr({ opacity: 0 }).append(that._group); that._text = renderer.text().attr({ align: "center" }).append(that._group); that._createStates(parameters.eventTrigger, that._group, renderer.root, parameters.notify) } LoadingIndicator.prototype = { constructor: LoadingIndicator, _createStates: function(eventTrigger, group, root, notify) { var that = this; that._states = [{ opacity: 0, start: function() { notify(false) }, complete: function() { group.linkRemove(); root.css({ "pointer-events": "" }); eventTrigger(LOADING_INDICATOR_READY) } }, { opacity: .85, start: function() { group.linkAppend(); root.css({ "pointer-events": "none" }); notify(true) }, complete: function() { eventTrigger(LOADING_INDICATOR_READY) } }]; that._state = STATE_HIDDEN }, setSize: function(size) { var width = size.width, height = size.height; this._rect.attr({ width: width, height: height }); this._text.attr({ x: width / 2, y: height / 2 }) }, setOptions: function(options) { this._rect.attr({ fill: options.backgroundColor }); this._text.css(_patchFontOptions(options.font)).attr({ text: options.text }); this[options.show ? "show" : "hide"]() }, dispose: function() { var that = this; that._group.linkRemove().linkOff(); that._group = that._rect = that._text = that._states = null }, _transit: function(stateId) { var state, that = this; if (that._state !== stateId) { that._state = stateId; that._isHiding = false; state = that._states[stateId]; that._rect.stopAnimation().animate({ opacity: state.opacity }, { complete: state.complete, easing: ANIMATION_EASING, duration: ANIMATION_DURATION, unstoppable: true }); that._noHiding = true; state.start(); that._noHiding = false } }, show: function() { this._transit(STATE_SHOWN) }, hide: function() { this._transit(STATE_HIDDEN) }, scheduleHiding: function() { if (!this._noHiding) { this._isHiding = true } }, fulfillHiding: function() { if (this._isHiding) { this.hide() } } }; exports.LoadingIndicator = LoadingIndicator; exports.plugin = { name: "loading_indicator", init: function() { var that = this; that._loadingIndicator = new exports.LoadingIndicator({ eventTrigger: that._eventTrigger, renderer: that._renderer, notify: notify }); that._scheduleLoadingIndicatorHiding(); function notify(state) { that._skipLoadingIndicatorOptions = true; that.option("loadingIndicator", { show: state }); that._skipLoadingIndicatorOptions = false; if (state) { that._hideTooltip && that._hideTooltip() } } }, dispose: function() { this._loadingIndicator.dispose(); this._loadingIndicator = null }, members: { _scheduleLoadingIndicatorHiding: function() { this._loadingIndicator.scheduleHiding() }, _fulfillLoadingIndicatorHiding: function() { this._loadingIndicator.fulfillHiding() }, showLoadingIndicator: function() { this._loadingIndicator.show() }, hideLoadingIndicator: function() { this._loadingIndicator.hide() }, _onBeginUpdate: function() { this._scheduleLoadingIndicatorHiding() } }, customize: function(constructor) { var proto = constructor.prototype; if (proto._dataSourceChangedHandler) { var _dataSourceChangedHandler = proto._dataSourceChangedHandler; proto._dataSourceChangedHandler = function() { this._scheduleLoadingIndicatorHiding(); _dataSourceChangedHandler.apply(this, arguments) } } var _setContentSize = proto._setContentSize; proto._setContentSize = function() { _setContentSize.apply(this, arguments); this._loadingIndicator.setSize(this._canvas) }; constructor.addChange({ code: "LOADING_INDICATOR", handler: function() { if (!this._skipLoadingIndicatorOptions) { this._loadingIndicator.setOptions(this._getOption("loadingIndicator")) } this._scheduleLoadingIndicatorHiding() }, isThemeDependent: true, option: "loadingIndicator", isOptionChange: true }); proto._eventsMap.onLoadingIndicatorReady = { name: "loadingIndicatorReady" }; var _drawn = proto._drawn; proto._drawn = function() { _drawn.apply(this, arguments); if (this._dataIsReady()) { this._fulfillLoadingIndicatorHiding() } } } } }, /*!************************************!*\ !*** ./js/viz/core/data_source.js ***! \************************************/ function(module, exports, __webpack_require__) { var name, noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, DataHelperMixin = __webpack_require__( /*! ../../data_helper */ 152), postCtor = DataHelperMixin.postCtor, members = { _dataSourceLoadErrorHandler: function() { this._dataSourceChangedHandler() }, _dataSourceOptions: function() { return { paginate: false } }, _updateDataSource: function() { this._refreshDataSource(); if (!this.option("dataSource")) { this._dataSourceChangedHandler() } }, _dataIsLoaded: function() { return !this._dataSource || this._dataSource.isLoaded() }, _dataSourceItems: function() { return this._dataSource && this._dataSource.items() } }; for (name in DataHelperMixin) { if ("postCtor" === name) { continue } members[name] = DataHelperMixin[name] } exports.plugin = { name: "data_source", init: function() { postCtor.call(this) }, dispose: noop, members: members } }, /*!************************************************************!*\ !*** ./js/viz/chart_components/multi_axes_synchronizer.js ***! \************************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), debug = __webpack_require__( /*! ../../core/utils/console */ 13).debug, commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), vizUtils = __webpack_require__( /*! ../core/utils */ 509), _adjustValue = vizUtils.adjustValue, _applyPrecisionByMinDelta = vizUtils.applyPrecisionByMinDelta, _isDefined = commonUtils.isDefined, _math = Math, _floor = _math.floor, _max = _math.max, _abs = _math.abs, _each = $.each, _map = __webpack_require__( /*! ../core/utils */ 509).map, MIN_RANGE_FOR_ADJUST_BOUNDS = .1; var getValueAxesPerPanes = function(valueAxes) { var result = {}; _each(valueAxes, function(_, axis) { var pane = axis.pane; if (!result[pane]) { result[pane] = [] } result[pane].push(axis) }); return result }; var linearConverter = { transform: function(v, b) { return vizUtils.getLog(v, b) }, addInterval: function(v, i) { return v + i }, getInterval: function(base, tickInterval) { return tickInterval }, adjustValue: _floor }; var logConverter = { transform: function(v, b) { return vizUtils.raiseTo(v, b) }, addInterval: function(v, i) { return v * i }, getInterval: function(base, tickInterval) { return _math.pow(base, tickInterval) }, adjustValue: _adjustValue }; var convertAxisInfo = function(axisInfo, converter) { if (!axisInfo.isLogarithmic) { return } var tick, interval, i, base = axisInfo.logarithmicBase, tickValues = axisInfo.tickValues, ticks = []; axisInfo.minValue = converter.transform(axisInfo.minValue, base); axisInfo.oldMinValue = converter.transform(axisInfo.oldMinValue, base); axisInfo.maxValue = converter.transform(axisInfo.maxValue, base); axisInfo.oldMaxValue = converter.transform(axisInfo.oldMaxValue, base); axisInfo.tickInterval = _math.round(axisInfo.tickInterval); if (axisInfo.tickInterval < 1) { axisInfo.tickInterval = 1 } interval = converter.getInterval(base, axisInfo.tickInterval); tick = converter.transform(tickValues[0], base); for (i = 0; i < tickValues.length; i++) { ticks.push(converter.adjustValue(tick)); tick = converter.addInterval(tick, interval) } ticks.tickInterval = axisInfo.tickInterval; axisInfo.tickValues = ticks }; var populateAxesInfo = function(axes) { return _map(axes, function(axis) { var minValue, maxValue, businessRange, tickInterval, synchronizedValue, ticksValues = axis.getTicksValues(), majorTicks = ticksValues.majorTicksValues, options = axis.getOptions(), axisInfo = null; if (majorTicks && majorTicks.length > 0 && commonUtils.isNumeric(majorTicks[0]) && "discrete" !== options.type) { businessRange = axis.getTranslator().getBusinessRange(); tickInterval = axis._tickManager.getTickInterval(); minValue = businessRange.minVisible; maxValue = businessRange.maxVisible; synchronizedValue = options.synchronizedValue; if (minValue === maxValue && _isDefined(synchronizedValue)) { tickInterval = _abs(majorTicks[0] - synchronizedValue) || 1; minValue = majorTicks[0] - tickInterval; maxValue = majorTicks[0] + tickInterval } axisInfo = { axis: axis, isLogarithmic: "logarithmic" === options.type, logarithmicBase: businessRange.base, tickValues: majorTicks, minorValues: ticksValues.minorTicksValues, minValue: minValue, oldMinValue: minValue, maxValue: maxValue, oldMaxValue: maxValue, inverted: businessRange.invert, tickInterval: tickInterval, synchronizedValue: synchronizedValue }; if (businessRange.stubData) { axisInfo.stubData = true; axisInfo.tickInterval = axisInfo.tickInterval || options.tickInterval; axisInfo.isLogarithmic = false } convertAxisInfo(axisInfo, linearConverter); debug.assert(void 0 !== axisInfo.tickInterval && null !== axisInfo.tickInterval, "tickInterval was not provided") } return axisInfo }) }; var updateTickValues = function(axesInfo) { var maxTicksCount = 0; _each(axesInfo, function(_, axisInfo) { maxTicksCount = _max(maxTicksCount, axisInfo.tickValues.length) }); _each(axesInfo, function(_, axisInfo) { var ticksMultiplier, ticksCount, additionalStartTicksCount = 0, synchronizedValue = axisInfo.synchronizedValue, tickValues = axisInfo.tickValues, tickInterval = axisInfo.tickInterval; if (_isDefined(synchronizedValue)) { axisInfo.baseTickValue = axisInfo.invertedBaseTickValue = synchronizedValue; axisInfo.tickValues = [axisInfo.baseTickValue] } else { if (tickValues.length > 1 && tickInterval) { ticksMultiplier = _floor((maxTicksCount + 1) / tickValues.length); ticksCount = ticksMultiplier > 1 ? _floor((maxTicksCount + 1) / ticksMultiplier) : maxTicksCount; additionalStartTicksCount = _floor((ticksCount - tickValues.length) / 2); while (additionalStartTicksCount > 0 && 0 !== tickValues[0]) { tickValues.unshift(_applyPrecisionByMinDelta(tickValues[0], tickInterval, tickValues[0] - tickInterval)); additionalStartTicksCount-- } while (tickValues.length < ticksCount) { tickValues.push(_applyPrecisionByMinDelta(tickValues[0], tickInterval, tickValues[tickValues.length - 1] + tickInterval)) } axisInfo.tickInterval = tickInterval / ticksMultiplier } axisInfo.baseTickValue = tickValues[0]; axisInfo.invertedBaseTickValue = tickValues[tickValues.length - 1] } }) }; var getAxisRange = function(axisInfo) { return axisInfo.maxValue - axisInfo.minValue || 1 }; var getMainAxisInfo = function(axesInfo) { for (var i = 0; i < axesInfo.length; i++) { if (!axesInfo[i].stubData) { return axesInfo[i] } } return null }; var correctMinMaxValues = function(axesInfo) { var mainAxisInfo = getMainAxisInfo(axesInfo), mainAxisInfoTickInterval = mainAxisInfo.tickInterval; _each(axesInfo, function(_, axisInfo) { var scale, move, mainAxisBaseValueOffset, valueFromAxisInfo; if (axisInfo !== mainAxisInfo) { if (mainAxisInfoTickInterval && axisInfo.tickInterval) { if (axisInfo.stubData && _isDefined(axisInfo.synchronizedValue)) { axisInfo.oldMinValue = axisInfo.minValue = axisInfo.baseTickValue - (mainAxisInfo.baseTickValue - mainAxisInfo.minValue) / mainAxisInfoTickInterval * axisInfo.tickInterval; axisInfo.oldMaxValue = axisInfo.maxValue = axisInfo.baseTickValue - (mainAxisInfo.baseTickValue - mainAxisInfo.maxValue) / mainAxisInfoTickInterval * axisInfo.tickInterval } scale = mainAxisInfoTickInterval / getAxisRange(mainAxisInfo) / axisInfo.tickInterval * getAxisRange(axisInfo); axisInfo.maxValue = axisInfo.minValue + getAxisRange(axisInfo) / scale } if (mainAxisInfo.inverted && !axisInfo.inverted || !mainAxisInfo.inverted && axisInfo.inverted) { mainAxisBaseValueOffset = mainAxisInfo.maxValue - mainAxisInfo.invertedBaseTickValue } else { mainAxisBaseValueOffset = mainAxisInfo.baseTickValue - mainAxisInfo.minValue } valueFromAxisInfo = getAxisRange(axisInfo); move = (mainAxisBaseValueOffset / getAxisRange(mainAxisInfo) - (axisInfo.baseTickValue - axisInfo.minValue) / valueFromAxisInfo) * valueFromAxisInfo; axisInfo.minValue -= move; axisInfo.maxValue -= move } }) }; var calculatePaddings = function(axesInfo) { var minPadding, maxPadding, startPadding = 0, endPadding = 0; _each(axesInfo, function(_, axisInfo) { var inverted = axisInfo.inverted; minPadding = axisInfo.minValue > axisInfo.oldMinValue ? (axisInfo.minValue - axisInfo.oldMinValue) / getAxisRange(axisInfo) : 0; maxPadding = axisInfo.maxValue < axisInfo.oldMaxValue ? (axisInfo.oldMaxValue - axisInfo.maxValue) / getAxisRange(axisInfo) : 0; startPadding = _max(startPadding, inverted ? maxPadding : minPadding); endPadding = _max(endPadding, inverted ? minPadding : maxPadding) }); return { start: startPadding, end: endPadding } }; var correctMinMaxValuesByPaddings = function(axesInfo, paddings) { _each(axesInfo, function(_, info) { var range = getAxisRange(info), inverted = info.inverted; info.minValue -= paddings[inverted ? "end" : "start"] * range; info.maxValue += paddings[inverted ? "start" : "end"] * range; if (range > MIN_RANGE_FOR_ADJUST_BOUNDS) { info.minValue = _math.min(info.minValue, _adjustValue(info.minValue)); info.maxValue = _max(info.maxValue, _adjustValue(info.maxValue)) } }) }; var updateTickValuesIfSynchronizedValueUsed = function(axesInfo) { var hasSynchronizedValue = false; _each(axesInfo, function(_, info) { hasSynchronizedValue = hasSynchronizedValue || _isDefined(info.synchronizedValue) }); _each(axesInfo, function(_, info) { var lastTickValue, tickInterval = info.tickInterval, tickValues = info.tickValues, maxValue = info.maxValue, minValue = info.minValue; if (hasSynchronizedValue && tickInterval) { while (tickValues[0] - tickInterval >= minValue) { tickValues.unshift(_adjustValue(tickValues[0] - tickInterval)) } lastTickValue = tickValues[tickValues.length - 1]; while ((lastTickValue += tickInterval) <= maxValue) { tickValues.push(commonUtils.isExponential(lastTickValue) ? _adjustValue(lastTickValue) : _applyPrecisionByMinDelta(minValue, tickInterval, lastTickValue)) } } while (tickValues[0] < minValue) { tickValues.shift() } while (tickValues[tickValues.length - 1] > maxValue) { tickValues.pop() } }) }; var applyMinMaxValues = function(axesInfo) { _each(axesInfo, function(_, info) { var axis = info.axis, range = axis.getTranslator().getBusinessRange(); if (range.min === range.minVisible) { range.min = info.minValue } if (range.max === range.maxVisible) { range.max = info.maxValue } range.minVisible = info.minValue; range.maxVisible = info.maxValue; if (_isDefined(info.stubData)) { range.stubData = info.stubData } if (range.min > range.minVisible) { range.min = range.minVisible } if (range.max < range.maxVisible) { range.max = range.maxVisible } range.isSynchronized = true; axis.getTranslator().updateBusinessRange(range); axis.setTicks({ majorTicks: info.tickValues, minorTicks: info.minorValues }) }) }; var correctAfterSynchronize = function(axesInfo) { var correctValue, validAxisInfo, invalidAxisInfo = []; _each(axesInfo, function(i, info) { if (info.oldMaxValue - info.oldMinValue === 0) { invalidAxisInfo.push(info) } else { if (!_isDefined(correctValue) && !_isDefined(info.synchronizedValue)) { correctValue = _abs((info.maxValue - info.minValue) / (info.tickValues[_floor(info.tickValues.length / 2)] - info.minValue || info.maxValue)); validAxisInfo = info } } }); if (!_isDefined(correctValue)) { return } _each(invalidAxisInfo, function(i, info) { var firstTick = info.tickValues[0], correctedTick = firstTick * correctValue, tickValues = validAxisInfo.tickValues, centralTick = tickValues[_floor(tickValues.length / 2)]; if (firstTick > 0) { info.maxValue = correctedTick; info.minValue = 0 } else { if (firstTick < 0) { info.minValue = correctedTick; info.maxValue = 0 } else { if (0 === firstTick) { info.maxValue = validAxisInfo.maxValue - centralTick; info.minValue = validAxisInfo.minValue - centralTick } } } }) }; var multiAxesSynchronizer = { synchronize: function(valueAxes) { _each(getValueAxesPerPanes(valueAxes), function(_, axes) { var axesInfo, paddings; if (axes.length > 1) { axesInfo = populateAxesInfo(axes); if (0 === axesInfo.length || !getMainAxisInfo(axesInfo)) { return } updateTickValues(axesInfo); correctMinMaxValues(axesInfo); paddings = calculatePaddings(axesInfo); correctMinMaxValuesByPaddings(axesInfo, paddings); correctAfterSynchronize(axesInfo); updateTickValuesIfSynchronizedValueUsed(axesInfo); _each(axesInfo, function() { convertAxisInfo(this, logConverter) }); applyMinMaxValues(axesInfo) } }) } }; module.exports = multiAxesSynchronizer }, /*!***************************************************!*\ !*** ./js/viz/chart_components/advanced_chart.js ***! \***************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, rangeModule = __webpack_require__( /*! ../translators/range */ 564), DEFAULT_AXIS_NAME = "defaultAxisName", axisModule = __webpack_require__( /*! ../axes/base_axis */ 565), seriesFamilyModule = __webpack_require__( /*! ../core/series_family */ 580), BaseChart = __webpack_require__( /*! ./base_chart */ 514).BaseChart, crosshairModule = __webpack_require__( /*! ./crosshair */ 581), _isArray = Array.isArray, _isDefined = commonUtils.isDefined, _each = $.each, _noop = commonUtils.noop, _extend = extend, vizUtils = __webpack_require__( /*! ../core/utils */ 509), _map = vizUtils.map; function getCrosshairMargins(crosshairOptions) { crosshairOptions = crosshairOptions || {}; var crosshairEnabled = crosshairOptions.enabled, margins = crosshairModule.getMargins(); return { x: crosshairEnabled && crosshairOptions.horizontalLine.visible ? margins.x : 0, y: crosshairEnabled && crosshairOptions.verticalLine.visible ? margins.y : 0 } } function prepareAxis(axisOptions) { return _isArray(axisOptions) ? 0 === axisOptions.length ? [{}] : axisOptions : [axisOptions] } var AdvancedChart = BaseChart.inherit({ _dispose: function() { var that = this, disposeObjectsInArray = this._disposeObjectsInArray; that.callBase(); that.panes = null; if (that._legend) { that._legend.dispose(); that._legend = null } disposeObjectsInArray.call(that, "panesBackground"); disposeObjectsInArray.call(that, "seriesFamilies"); that._disposeAxes() }, _reinitAxes: function() { this.panes = this._createPanes(); this._populateAxes() }, _populateAxes: function() { var argumentAxes, paneWithNonVirtualAxis, that = this, valueAxes = [], panes = that.panes, rotated = that._isRotated(), valueAxisOptions = that.option("valueAxis") || {}, argumentOption = that.option("argumentAxis") || {}, argumentAxesOptions = prepareAxis(argumentOption)[0], valueAxesOptions = prepareAxis(valueAxisOptions), axisNames = [], valueAxesCounter = 0, crosshairMargins = getCrosshairMargins(that._getCrosshairOptions()); function getNextAxisName() { return DEFAULT_AXIS_NAME + valueAxesCounter++ } that._disposeAxes(); if (rotated) { paneWithNonVirtualAxis = "right" === argumentAxesOptions.position ? panes[panes.length - 1].name : panes[0].name } else { paneWithNonVirtualAxis = "top" === argumentAxesOptions.position ? panes[0].name : panes[panes.length - 1].name } argumentAxes = _map(panes, function(pane, index) { return that._createAxis("argumentAxis", argumentAxesOptions, { pane: pane.name, crosshairMargin: rotated ? crosshairMargins.x : crosshairMargins.y }, rotated, pane.name !== paneWithNonVirtualAxis, index) }); _each(valueAxesOptions, function(priority, axisOptions) { var axisPanes = [], name = axisOptions.name; if (name && inArray(name, axisNames) !== -1) { that._incidentOccurred("E2102"); return } name && axisNames.push(name); if (axisOptions.pane) { axisPanes.push(axisOptions.pane) } if (axisOptions.panes && axisOptions.panes.length) { axisPanes = axisPanes.concat(axisOptions.panes.slice(0)) } axisPanes = vizUtils.unique(axisPanes); if (!axisPanes.length) { axisPanes.push(void 0) } _each(axisPanes, function(_, pane) { valueAxes.push(that._createAxis("valueAxis", axisOptions, { name: name || getNextAxisName(), pane: pane, priority: priority, crosshairMargin: rotated ? crosshairMargins.y : crosshairMargins.x }, rotated)) }) }); that._valueAxes = valueAxes; that._argumentAxes = argumentAxes }, _prepareStackPoints: function(singleSeries, stackPoints) { var points = singleSeries.getPoints(), stackName = singleSeries.getStackName(); _each(points, function(_, point) { var argument = point.argument; if (!stackPoints[argument]) { stackPoints[argument] = {}; stackPoints[argument][null] = [] } if (stackName && !_isArray(stackPoints[argument][stackName])) { stackPoints[argument][stackName] = []; _each(stackPoints[argument][null], function(_, point) { if (!point.stackName) { stackPoints[argument][stackName].push(point) } }) } if (stackName) { stackPoints[argument][stackName].push(point); stackPoints[argument][null].push(point) } else { _each(stackPoints[argument], function(_, stack) { stack.push(point) }) } point.stackPoints = stackPoints[argument][stackName]; point.stackName = stackName }) }, _resetStackPoints: function(singleSeries) { _each(singleSeries.getPoints(), function(_, point) { point.stackPoints = null; point.stackName = null }) }, _disposeAxes: function() { var that = this, disposeObjectsInArray = that._disposeObjectsInArray; disposeObjectsInArray.call(that, "_argumentAxes"); disposeObjectsInArray.call(that, "_valueAxes") }, _drawAxes: function(drawOptions, panesBorderOptions) { this._restoreOriginalBusinessRange(); this._prepareAxesAndDraw(drawOptions, panesBorderOptions) }, _restoreOriginalBusinessRange: _noop, _appendAdditionalSeriesGroups: function() { this._crosshairCursorGroup.linkAppend(); this._scrollBar && this._scrollBarGroup.linkAppend() }, _getLegendTargets: function() { var that = this; return _map(that.series, function(item) { if (item.getOptions().showInLegend) { return that._getLegendOptions(item) } return null }) }, _legendItemTextField: "name", _seriesPopulatedHandlerCore: function() { this._processSeriesFamilies(); this._processValueAxisFormat() }, _renderTrackers: function() { var i, that = this; for (i = 0; i < that.series.length; ++i) { that.series[i].drawTrackers() } }, _specialProcessSeries: function() { this._processSeriesFamilies() }, _processSeriesFamilies: function() { var paneSeries, that = this, types = [], families = [], themeManager = that._themeManager, negativesAsZeroes = themeManager.getOptions("negativesAsZeroes"), negativesAsZeros = themeManager.getOptions("negativesAsZeros"), familyOptions = { equalBarWidth: themeManager.getOptions("equalBarWidth"), minBubbleSize: themeManager.getOptions("minBubbleSize"), maxBubbleSize: themeManager.getOptions("maxBubbleSize"), barWidth: themeManager.getOptions("barWidth"), negativesAsZeroes: _isDefined(negativesAsZeroes) ? negativesAsZeroes : negativesAsZeros }; if (that.seriesFamilies && that.seriesFamilies.length) { _each(that.seriesFamilies, function(_, family) { family.updateOptions(familyOptions); family.adjustSeriesValues() }); return } _each(that.series, function(_, item) { if (inArray(item.type, types) === -1) { types.push(item.type) } }); _each(that._getLayoutTargets(), function(_, pane) { paneSeries = that._getSeriesForPane(pane.name); _each(types, function(_, type) { var family = new seriesFamilyModule.SeriesFamily({ type: type, pane: pane.name, equalBarWidth: familyOptions.equalBarWidth, minBubbleSize: familyOptions.minBubbleSize, maxBubbleSize: familyOptions.maxBubbleSize, barWidth: familyOptions.barWidth, negativesAsZeroes: familyOptions.negativesAsZeroes, rotated: that._isRotated() }); family.add(paneSeries); family.adjustSeriesValues(); families.push(family) }) }); that.seriesFamilies = families }, _updateSeriesDimensions: function() { var i, that = this, seriesFamilies = that.seriesFamilies || []; for (i = 0; i < seriesFamilies.length; i++) { var family = seriesFamilies[i]; family.updateSeriesValues(); family.adjustSeriesDimensions() } }, _getLegendCallBack: function(series) { return this._legend && this._legend.getActionCallback(series) }, _appendAxesGroups: function() { var that = this; that._stripsGroup.linkAppend(); that._gridGroup.linkAppend(); that._axesGroup.linkAppend(); that._constantLinesGroup.linkAppend(); that._labelAxesGroup.linkAppend() }, _populateBusinessRange: function() { var that = this, businessRanges = [], rotated = that._isRotated(), argAxes = that._argumentAxes, argRange = new rangeModule.Range({ rotated: !!rotated }), groupsData = that._groupsData; that.businessRanges = null; _each(argAxes, function(_, axis) { argRange.addRange(axis.getRangeData()) }); that._valueAxes.forEach(function(valueAxis) { var groupRange = new rangeModule.Range({ rotated: !!rotated, pane: valueAxis.pane, axis: valueAxis.name }), groupAxisRange = valueAxis.getRangeData(), groupSeries = that.series.filter(function(series) { return series.getValueAxis() === valueAxis }); groupRange.addRange(groupAxisRange); groupSeries.forEach(function(series) { var seriesRange = series.getRangeData(); groupRange.addRange(seriesRange.val); argRange.addRange(seriesRange.arg) }); if (!groupRange.isDefined()) { groupRange.setStubData(valueAxis.getOptions().valueType) } if (valueAxis.getOptions().showZero) { groupRange.correctValueZeroLevel() } groupRange.checkZeroStick(); valueAxis.setBusinessRange(groupRange); businessRanges.push({ val: groupRange, arg: argRange }) }); argRange.sortCategories(groupsData.categories); if (!argRange.isDefined()) { argRange.setStubData(argAxes[0].getOptions().argumentType) } that._argumentAxes.forEach(function(a) { a.setBusinessRange(argRange) }); that.businessRanges = businessRanges }, _getArgumentAxis: function() { return this._argumentAxes[0] }, _getArgumentAxes: function() { return this._argumentAxes }, _getValueAxes: function() { return this._valueAxes }, _getGroupsData: function() { var that = this, groups = []; that._valueAxes.forEach(function(axis) { groups.push({ series: that.series.filter(function(series) { return series.getValueAxis() === axis }), valueAxis: axis, valueOptions: axis.getOptions() }) }); return { groups: groups, argumentAxes: that._argumentAxes, argumentOptions: that._argumentAxes[0].getOptions() } }, _groupSeries: function() { var that = this; that._correctValueAxes(); that._groupsData = that._getGroupsData() }, _processValueAxisFormat: function() { var axesWithFullStackedFormat = []; this.series.forEach(function(series) { var axis = series.getValueAxis(); if (series.isFullStackedSeries()) { axis.setPercentLabelFormat(); axesWithFullStackedFormat.push(axis) } }); this._valueAxes.forEach(function(axis) { if (axesWithFullStackedFormat.indexOf(axis) === -1) { axis.resetAutoLabelFormat() } }) }, _createAxis: function(typeSelector, userOptions, axisOptions, rotated, virtual, index) { var axis, that = this, renderingSettings = _extend({ renderer: that._renderer, incidentOccurred: that._incidentOccurred, axisClass: "argumentAxis" === typeSelector ? "arg" : "val", widgetClass: "dxc", stripsGroup: that._stripsGroup, labelAxesGroup: that._labelAxesGroup, constantLinesGroup: that._constantLinesGroup, axesContainerGroup: that._axesGroup, gridGroup: that._gridGroup }, that._getAxisRenderingOptions(typeSelector)), preparedUserOptions = that._prepareStripsAndConstantLines(typeSelector, userOptions, rotated), options = _extend(true, {}, preparedUserOptions, axisOptions, that._prepareAxisOptions(typeSelector, preparedUserOptions, rotated)); if (virtual) { options.visible = options.tick.visible = options.minorTick.visible = options.label.visible = false; options.title = {} } axis = new axisModule.Axis(renderingSettings); axis.updateOptions(options); if (!virtual && _isDefined(index)) { that._displayedArgumentAxisIndex = index } return axis }, _getTrackerSettings: function() { return _extend(this.callBase(), { argumentAxis: this._argumentAxes[this._displayedArgumentAxisIndex] }) }, _prepareStripsAndConstantLines: function(typeSelector, userOptions, rotated) { userOptions = this._themeManager.getOptions(typeSelector, userOptions, rotated); if (userOptions.strips) { _each(userOptions.strips, function(i) { userOptions.strips[i] = _extend(true, {}, userOptions.stripStyle, userOptions.strips[i]) }) } if (userOptions.constantLines) { _each(userOptions.constantLines, function(i, line) { userOptions.constantLines[i] = _extend(true, {}, userOptions.constantLineStyle, line) }) } return userOptions }, _legendDataField: "series", _adjustSeries: _noop, _correctValueAxes: _noop }); exports.AdvancedChart = AdvancedChart }, /*!*************************************!*\ !*** ./js/viz/translators/range.js ***! \*************************************/ function(module, exports, __webpack_require__) { var _Range, commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, _isDefined = commonUtils.isDefined, _isDate = commonUtils.isDate, unique = __webpack_require__( /*! ../core/utils */ 509).unique, minSelector = "min", maxSelector = "max", minVisibleSelector = "minVisible", maxVisibleSelector = "maxVisible", baseSelector = "base", axisTypeSelector = "axisType"; function otherLessThan(thisValue, otherValue) { return otherValue < thisValue } function otherGreaterThan(thisValue, otherValue) { return otherValue > thisValue } function compareAndReplace(thisValue, otherValue, setValue, compare) { var otherValueDefined = _isDefined(otherValue); if (_isDefined(thisValue)) { if (otherValueDefined && compare(thisValue, otherValue)) { setValue(otherValue) } } else { if (otherValueDefined) { setValue(otherValue) } } } _Range = exports.Range = function(range) { range && extend(this, range) }; _Range.prototype = { constructor: _Range, addRange: function(otherRange) { var that = this, categories = that.categories, otherCategories = otherRange.categories; var compareAndReplaceByField = function(field, compare) { compareAndReplace(that[field], otherRange[field], function(value) { that[field] = value }, compare) }; var controlValuesByVisibleBounds = function(valueField, visibleValueField, compare) { compareAndReplace(that[valueField], that[visibleValueField], function(value) { _isDefined(that[valueField]) && (that[valueField] = value) }, compare) }; var checkField = function(field) { that[field] = that[field] || otherRange[field] }; if (commonUtils.isDefined(otherRange.stick)) { that.stick = otherRange.stick } checkField("addSpiderCategory"); checkField("percentStick"); checkField("minSpaceCorrection"); checkField("maxSpaceCorrection"); checkField("invert"); checkField(axisTypeSelector); checkField("dataType"); if ("logarithmic" === that[axisTypeSelector]) { checkField(baseSelector) } else { that[baseSelector] = void 0 } compareAndReplaceByField(minSelector, otherLessThan); compareAndReplaceByField(maxSelector, otherGreaterThan); if ("discrete" === that[axisTypeSelector]) { checkField(minVisibleSelector); checkField(maxVisibleSelector) } else { compareAndReplaceByField(minVisibleSelector, otherLessThan); compareAndReplaceByField(maxVisibleSelector, otherGreaterThan) } compareAndReplaceByField("interval", otherLessThan); controlValuesByVisibleBounds(minSelector, minVisibleSelector, otherLessThan); controlValuesByVisibleBounds(minSelector, maxVisibleSelector, otherLessThan); controlValuesByVisibleBounds(maxSelector, maxVisibleSelector, otherGreaterThan); controlValuesByVisibleBounds(maxSelector, minVisibleSelector, otherGreaterThan); if (void 0 === categories) { that.categories = otherCategories } else { that.categories = otherCategories ? unique(categories.concat(otherCategories)) : categories } return that }, isDefined: function() { return _isDefined(this[minSelector]) && _isDefined(this[maxSelector]) || this.categories && this.categories.length }, setStubData: function(dataType) { var that = this, year = (new Date).getFullYear() - 1, isDate = "datetime" === dataType, axisType = that[axisTypeSelector], min = "logarithmic" === axisType ? 1 : 0; if ("discrete" === axisType) { that.categories = isDate ? [new Date(year, 0, 1), new Date(year, 3, 1), new Date(year, 6, 1), new Date(year, 9, 1)] : ["0", "1", "2"] } else { that[minSelector] = isDate ? new Date(year, 0, 1) : min; that[maxSelector] = isDate ? new Date(year, 11, 31) : 10 } that.stubData = true; return that }, correctValueZeroLevel: function() { var that = this; if ("logarithmic" === that[axisTypeSelector] || _isDate(that[maxSelector]) || _isDate(that[minSelector])) { return that } function setZeroLevel(min, max) { that[min] < 0 && that[max] < 0 && (that[max] = 0); that[min] > 0 && that[max] > 0 && (that[min] = 0) } setZeroLevel(minSelector, maxSelector); setZeroLevel(minVisibleSelector, maxVisibleSelector); return that }, sortCategories: function(arr) { var cat = this.categories, callback = "datetime" === this.dataType ? function(item) { return cat.map(Number).indexOf(item.valueOf()) !== -1 } : function(item) { return cat.indexOf(item) !== -1 }; arr && cat && (this.categories = arr.filter(callback)) }, checkZeroStick: function() { var that = this; if (that.min >= 0 && that.max >= 0) { that.minStickValue = 0 } else { if (that.min <= 0 && that.max <= 0) { that.maxStickValue = 0 } } return that } } }, /*!**********************************!*\ !*** ./js/viz/axes/base_axis.js ***! \**********************************/ function(module, exports, __webpack_require__) { var Axis, $ = __webpack_require__( /*! ../../core/renderer */ 9), vizUtils = __webpack_require__( /*! ../core/utils */ 509), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, constants = __webpack_require__( /*! ./axes_constants */ 566), parseUtils = __webpack_require__( /*! ../components/parse_utils */ 524), tickManagerModule = __webpack_require__( /*! ./base_tick_manager */ 567), Translator2DModule = __webpack_require__( /*! ../translators/translator2d */ 571), rangeModule = __webpack_require__( /*! ../translators/range */ 564), tick = __webpack_require__( /*! ./tick */ 577).tick, formatLabel = constants.formatLabel, convertTicksToValues = constants.convertTicksToValues, _isDefined = commonUtils.isDefined, _isNumber = commonUtils.isNumeric, _getSignificantDigitPosition = vizUtils.getSignificantDigitPosition, _roundValue = vizUtils.roundValue, patchFontOptions = vizUtils.patchFontOptions, _math = Math, _abs = _math.abs, _max = _math.max, _min = _math.min, _each = $.each, _noop = commonUtils.noop, DEFAULT_AXIS_LABEL_SPACING = 5, MAX_GRID_BORDER_ADHENSION = 4, TOP = constants.top, BOTTOM = constants.bottom, LEFT = constants.left, RIGHT = constants.right, CENTER = constants.center; function createMajorTick(axis, renderer) { var options = axis.getOptions(); return tick(axis, renderer, options.tick, options.grid, axis._getSkippedCategory(), axis._translator.getBusinessRange().stubData) } function createMinorTick(axis, renderer) { var options = axis.getOptions(); return tick(axis, renderer, options.minorTick, options.minorGrid) } function createBoundaryTick(axis, renderer, isFirst) { var options = axis.getOptions(); return tick(axis, renderer, extend({}, options.tick, { visible: options.showCustomBoundaryTicks }), options.grid, void 0, false, isFirst ? -1 : 1) } function callAction(ticks, action, actionArgument) { ticks.forEach(function(tick) { tick[action](actionArgument) }) } function initTickCoords(ticks) { callAction(ticks, "initCoords") } function drawTickMarks(ticks) { callAction(ticks, "drawMark") } function drawGrids(ticks, drawLine) { callAction(ticks, "drawGrid", drawLine) } function updateTicksPosition(ticks) { callAction(ticks, "updateTickPosition") } function updateGridsPosition(ticks) { callAction(ticks, "updateGridPosition") } function measureLabels(items) { items.forEach(function(item) { item.labelBBox = item.label ? item.label.getBBox() : { x: 0, y: 0, width: 0, height: 0 } }) } function isEmptyArray(categories) { return categories && categories.length } function getMarginValue(range, margin, checkMax) { var min = _isDefined(range.minVisible) ? range.minVisible : range.min, max = _isDefined(range.maxVisible) ? range.maxVisible : range.max; return vizUtils.applyPrecisionByMinDelta(checkMax ? max : min, margin || 0, _abs(max - min) * margin) } function getAddFunction(range) { if ("datetime" === range.dataType) { return function(rangeValue, marginValue) { return new Date(rangeValue.getTime() + marginValue) } } return function(rangeValue, marginValue) { return rangeValue + marginValue } } function validateAxisOptions(options) { var labelOptions = options.label, position = options.position, defaultPosition = options.isHorizontal ? BOTTOM : LEFT, secondaryPosition = options.isHorizontal ? TOP : RIGHT; if (position !== defaultPosition && position !== secondaryPosition) { position = defaultPosition } if (position === RIGHT && !labelOptions.userAlignment) { labelOptions.alignment = LEFT } options.position = position; options.hoverMode = options.hoverMode ? options.hoverMode.toLowerCase() : "none"; labelOptions.minSpacing = _isDefined(labelOptions.minSpacing) ? labelOptions.minSpacing : DEFAULT_AXIS_LABEL_SPACING } function getOptimalAngle(boxes, labelOpt) { var angle = 180 * _math.asin((boxes[0].height + labelOpt.minSpacing) / (boxes[1].x - boxes[0].x)) / _math.PI; return angle < 45 ? -45 : -90 } function updateLabels(ticks, step, func) { ticks.forEach(function(tick, index) { if (tick.label) { if (index % step !== 0) { tick.label.remove() } else { if (func) { func(tick, index) } } } }) } Axis = exports.Axis = function(renderSettings) { var that = this; that._renderer = renderSettings.renderer; that._incidentOccurred = renderSettings.incidentOccurred; that._stripsGroup = renderSettings.stripsGroup; that._labelAxesGroup = renderSettings.labelAxesGroup; that._constantLinesGroup = renderSettings.constantLinesGroup; that._axesContainerGroup = renderSettings.axesContainerGroup; that._gridContainerGroup = renderSettings.gridGroup; that._axisCssPrefix = renderSettings.widgetClass + "-" + (renderSettings.axisClass ? renderSettings.axisClass + "-" : ""); that._setType(renderSettings.axisType, renderSettings.drawingType); that._createAxisGroups(); that._tickManager = that._createTickManager(); that._translator = that._createTranslator() }; Axis.prototype = { constructor: Axis, _updateIntervalAndBounds: function() { var i, ticks, length, minInterval, bounds, that = this, translator = that._translator, businessRange = translator.getBusinessRange(); if (!isEmptyArray(businessRange.categories)) { ticks = that._majorTicks; length = ticks.length; if (!businessRange.isSynchronized) { bounds = this._tickManager.getTickBounds() } if (length > 1) { minInterval = _abs(ticks[0].value - ticks[1].value); for (i = 1; i < length - 1; i++) { minInterval = _min(_abs(ticks[i].value - ticks[i + 1].value), minInterval) } bounds = extend({ interval: minInterval }, bounds) } if (bounds) { businessRange.addRange(bounds); translator.reinit() } } }, _drawAxis: function() { var options = this._options; if (!options.visible) { return } this._axisElement = this._createAxisElement(); this._updateAxisElementPosition(); this._axisElement.attr({ "stroke-width": options.width, stroke: options.color, "stroke-opacity": options.opacity }).sharp(this._getSharpParam(true)).append(this._axisLineGroup) }, _correctMinForTicks: function(min, max, screenDelta) { var correctingValue, diff = _abs(max - min) / screenDelta, digitPosition = commonUtils.isExponential(diff) && diff < 1 ? vizUtils.getPrecision(diff) : _getSignificantDigitPosition(diff), newMin = _roundValue(Number(min), digitPosition); if (newMin < min) { correctingValue = _math.pow(10, -digitPosition); newMin = vizUtils.applyPrecisionByMinDelta(newMin, correctingValue, newMin + correctingValue) } if (newMin > max) { newMin = min } return newMin }, _getTickManagerData: function() { var that = this, options = that._options, screenDelta = that._getScreenDelta(), min = that._minBound, max = that._maxBound, categories = that._translator.getVisibleCategories() || that._translator.getBusinessRange().categories, customTicks = options.customTicks || (isEmptyArray(categories) ? categories : that._majorTicks && that._majorTicks.length && convertTicksToValues(that._majorTicks)), customMinorTicks = options.customMinorTicks || that._minorTicks && that._minorTicks.length && convertTicksToValues(that._minorTicks); if (_isNumber(min) && options.type !== constants.logarithmic) { min = that._correctMinForTicks(min, max, screenDelta) } return { min: min, max: max, customTicks: customTicks, customMinorTicks: customMinorTicks, customBoundTicks: options.customBoundTicks, screenDelta: screenDelta } }, _getTickManagerTypes: function() { return { axisType: this._options.type, dataType: this._options.dataType } }, _getTicksOptions: function() { var options = this._options; return { base: options.type === constants.logarithmic ? options.logarithmBase : void 0, tickInterval: this._translator.getBusinessRange().stubData ? null : options.tickInterval, gridSpacingFactor: options.axisDivisionFactor, minorGridSpacingFactor: options.minorAxisDivisionFactor, numberMultipliers: options.numberMultipliers, incidentOccurred: options.incidentOccurred, setTicksAtUnitBeginning: options.setTicksAtUnitBeginning, showMinorTicks: options.minorTick.visible || options.minorGrid.visible, minorTickInterval: options.minorTickInterval, minorTickCount: options.minorTickCount, showCalculatedTicks: options.tick.showCalculatedTicks, showMinorCalculatedTicks: options.minorTick.showCalculatedTicks } }, _createTickManager: function() { return new tickManagerModule.TickManager({}, {}) }, _getMarginsOptions: function() { var range = this._translator.getBusinessRange(); return { stick: range.stick || this._options.stick, minStickValue: range.minStickValue, maxStickValue: range.maxStickValue, percentStick: range.percentStick, minSpaceCorrection: range.minSpaceCorrection, maxSpaceCorrection: range.maxSpaceCorrection, minValueMargin: this._options.minValueMargin, maxValueMargin: this._options.maxValueMargin } }, _getLabelOptions: function() { return { hasLabelFormat: this._hasLabelFormat, isMarkersVisible: "discrete" === this._options.type ? false : this._options.marker.visible, addMinMax: this._options.showCustomBoundaryTicks ? this._boundaryTicksVisibility : void 0, forceUserTickInterval: "ignore" === this._options.label.overlappingBehavior.mode ? true : this._options.forceUserTickInterval } }, _updateTickManager: function() { var that = this, options = extend(true, that._getMarginsOptions(), that._getTicksOptions(), that._getLabelOptions()); this._tickManager.update(that._getTickManagerTypes(), that._getTickManagerData(), options) }, _correctLabelFormat: function() { var labelFormat = this._tickManager.getOptions().labelFormat; if (labelFormat) { this._options.label.format = labelFormat } }, _createPathElement: function(points, attr) { return this._renderer.path(points, "line").attr(attr).sharp(this._getSharpParam()) }, _getGridLineDrawer: function(borderOptions) { var that = this, isHorizontal = that._isHorizontal; return function(tick, gridStyle) { that.borderOptions = borderOptions; var element, canvasStart = isHorizontal ? LEFT : TOP, canvasEnd = isHorizontal ? RIGHT : BOTTOM, axisCanvas = that.getCanvas(), canvas = { left: axisCanvas.left, right: axisCanvas.width - axisCanvas.right, top: axisCanvas.top, bottom: axisCanvas.height - axisCanvas.bottom }, firstBorderLinePosition = borderOptions.visible && borderOptions[canvasStart] ? canvas[canvasStart] : void 0, lastBorderLinePosition = borderOptions.visible && borderOptions[canvasEnd] ? canvas[canvasEnd] : void 0, tickPositionField = isHorizontal ? "x" : "y", minDelta = MAX_GRID_BORDER_ADHENSION + firstBorderLinePosition, maxDelta = lastBorderLinePosition - MAX_GRID_BORDER_ADHENSION; if (void 0 === tick.coords[tickPositionField] || tick.coords[tickPositionField] < minDelta || tick.coords[tickPositionField] > maxDelta) { return } var grid = that._getGridPoints(tick.coords); if (grid.points) { element = that._createPathElement(grid.points, gridStyle) } return element } }, _getGridPoints: function(coords) { var isHorizontal = this._isHorizontal, tickPositionField = isHorizontal ? "x" : "y", orthogonalPositions = this._orthogonalPositions, positionFrom = orthogonalPositions.start, positionTo = orthogonalPositions.end; return { points: isHorizontal ? null !== coords[tickPositionField] ? [coords[tickPositionField], positionFrom, coords[tickPositionField], positionTo] : null : null !== coords[tickPositionField] ? [positionFrom, coords[tickPositionField], positionTo, coords[tickPositionField]] : null } }, _getConstantLinePos: function(lineValue, canvasStart, canvasEnd) { var parsedValue = this._validateUnit(lineValue, "E2105", "constantLine"), value = this._getTranslatedCoord(parsedValue); if (!_isDefined(value) || value < _min(canvasStart, canvasEnd) || value > _max(canvasStart, canvasEnd)) { return {} } return { value: value, parsedValue: parsedValue } }, _getConstantLineGraphicAttributes: function(value) { var positionFrom = this._orthogonalPositions.start, positionTo = this._orthogonalPositions.end; return { points: this._isHorizontal ? [value, positionFrom, value, positionTo] : [positionFrom, value, positionTo, value] } }, _createConstantLine: function(value, attr) { return this._createPathElement(this._getConstantLineGraphicAttributes(value).points, attr) }, _drawConstantLinesAndLabels: function(position, lineOptions, canvasStart, canvasEnd) { if (!_isDefined(lineOptions.value)) { return { line: null, label: null, options: lineOptions } } var side, that = this, pos = that._getConstantLinePos(lineOptions.value, canvasStart, canvasEnd), labelOptions = lineOptions.label || {}, value = pos.value, attr = { stroke: lineOptions.color, "stroke-width": lineOptions.width, dashStyle: lineOptions.dashStyle }, group = that._axisConstantLineGroups[position]; if (!group) { side = that._isHorizontal ? labelOptions.verticalAlignment : labelOptions.horizontalAlignment; group = that._axisConstantLineGroups[side] } if (!_isDefined(value)) { return { line: null, label: null, options: lineOptions } } return { line: that._createConstantLine(value, attr).append(that._axisConstantLineGroups.inside), label: labelOptions.visible ? that._drawConstantLineLabels(pos.parsedValue, labelOptions, value, group) : null, options: lineOptions, labelOptions: labelOptions, coord: value } }, _drawConstantLines: function(position) { var that = this, canvas = that._getCanvasStartEnd(); if (that._translator.getBusinessRange().stubData) { return [] } return (that._options.constantLines || []).reduce(function(result, constantLine) { var labelPos = constantLine.label.position; if (labelPos === position || !labelPos && "inside" === position) { result.push(that._drawConstantLinesAndLabels(position, constantLine, canvas.start, canvas.end)) } return result }, []) }, _drawConstantLineLabelText: function(text, x, y, constantLineLabelOptions, group) { var that = this, options = that._options, labelOptions = options.label; return that._renderer.text(text, x, y).css(patchFontOptions(extend({}, labelOptions.font, constantLineLabelOptions.font))).attr({ align: "center" }).append(group) }, _drawConstantLineLabels: function(parsedValue, lineLabelOptions, value, group) { var coords, that = this, text = lineLabelOptions.text, options = that._options, labelOptions = options.label; that._checkAlignmentConstantLineLabels(lineLabelOptions); text = _isDefined(text) ? text : formatLabel(parsedValue, labelOptions); coords = that._getConstantLineLabelsCoords(value, lineLabelOptions); return that._drawConstantLineLabelText(text, coords.x, coords.y, lineLabelOptions, group) }, _getStripPos: function(startValue, endValue, canvasStart, canvasEnd, range) { var start, end, swap, startCategoryIndex, endCategoryIndex, isContinuous = !!(range.minVisible || range.maxVisible), categories = range.categories || [], min = range.minVisible; if (!isContinuous) { if (_isDefined(startValue) && _isDefined(endValue)) { startCategoryIndex = inArray(startValue, categories); endCategoryIndex = inArray(endValue, categories); if (startCategoryIndex === -1 || endCategoryIndex === -1) { return { from: 0, to: 0 } } if (startCategoryIndex > endCategoryIndex) { swap = endValue; endValue = startValue; startValue = swap } } } if (_isDefined(startValue)) { startValue = this._validateUnit(startValue, "E2105", "strip"); start = this._getTranslatedCoord(startValue, -1); if (!_isDefined(start) && isContinuous) { start = startValue < min ? canvasStart : canvasEnd } } else { start = canvasStart } if (_isDefined(endValue)) { endValue = this._validateUnit(endValue, "E2105", "strip"); end = this._getTranslatedCoord(endValue, 1); if (!_isDefined(end) && isContinuous) { end = endValue > min ? canvasEnd : canvasStart } } else { end = canvasEnd } return start < end ? { from: start, to: end } : { from: end, to: start } }, _getStripGraphicAttributes: function(fromPoint, toPoint) { var x, y, width, height, orthogonalPositions = this._orthogonalPositions, positionFrom = orthogonalPositions.start, positionTo = orthogonalPositions.end; if (this._isHorizontal) { x = fromPoint; y = _min(positionFrom, positionTo); width = toPoint - fromPoint; height = _abs(positionFrom - positionTo) } else { x = _min(positionFrom, positionTo); y = fromPoint; width = _abs(positionFrom - positionTo); height = _abs(fromPoint - toPoint) } return { x: x, y: y, width: width, height: height } }, _createStrip: function(fromPoint, toPoint, attr) { var attrs = this._getStripGraphicAttributes(fromPoint, toPoint); return this._renderer.rect(attrs.x, attrs.y, attrs.width, attrs.height).attr(attr) }, _drawStrips: function() { var i, stripOptions, stripPos, stripLabelOptions, attr, labelCoords, that = this, options = that._options, stripData = options.strips, canvas = this._getCanvasStartEnd(), range = that._translator.getBusinessRange(), strips = []; if (!stripData || range.stubData) { return [] } for (i = 0; i < stripData.length; i++) { stripOptions = stripData[i]; stripLabelOptions = stripOptions.label || {}; attr = { fill: stripOptions.color }; if ((_isDefined(stripOptions.startValue) || _isDefined(stripOptions.endValue)) && _isDefined(stripOptions.color)) { stripPos = that._getStripPos(stripOptions.startValue, stripOptions.endValue, canvas.start, canvas.end, range); labelCoords = stripLabelOptions.text ? that._getStripLabelCoords(stripPos.from, stripPos.to, stripLabelOptions) : null; if (stripPos.to - stripPos.from === 0 || !_isDefined(stripPos.to) || !_isDefined(stripPos.from)) { continue } strips.push({ rect: that._createStrip(stripPos.from, stripPos.to, attr).append(that._axisStripGroup), options: stripOptions, label: stripLabelOptions.text ? that._drawStripLabel(stripLabelOptions, labelCoords) : null, labelCoords: labelCoords }) } } return strips }, _drawStripLabel: function(stripLabelOptions, coords) { return this._renderer.text(stripLabelOptions.text, coords.x, coords.y).css(patchFontOptions(extend({}, this._options.label.font, stripLabelOptions.font))).attr({ align: "center" }).append(this._axisStripLabelGroup) }, _adjustStripLabels: function() { var that = this; this._strips.forEach(function(strip) { if (strip.label) { strip.label.attr(that._getAdjustedStripLabelCoords(strip)) } }) }, _adjustLabels: function(offset) { var that = this, maxSize = that._majorTicks.reduce(function(size, tick) { var bBox = tick.labelRotationAngle ? vizUtils.rotateBBox(tick.labelBBox, [tick.labelCoords.x, tick.labelCoords.y], -tick.labelRotationAngle) : tick.labelBBox; return { width: _max(size.width || 0, bBox.width), height: _max(size.height || 0, bBox.height), offset: _max(size.offset || 0, tick.labelOffset || 0) } }, {}), additionalOffset = that._isHorizontal ? maxSize.height : maxSize.width; that._majorTicks.forEach(function(tick) { if (tick.label) { tick.label.attr(that._getLabelAdjustedCoord(tick, offset + (tick.labelOffset || 0), maxSize.width)) } }); return offset + additionalOffset + (additionalOffset && that._options.label.indentFromAxis) + maxSize.offset }, _getLabelAdjustedCoord: function(tick, offset, maxWidth) { offset = offset || 0; var translateX, translateY, that = this, options = that._options, box = vizUtils.rotateBBox(tick.labelBBox, [tick.labelCoords.x, tick.labelCoords.y], -tick.labelRotationAngle || 0), position = options.position, textAlign = tick.labelAlignment || options.label.alignment, indentFromAxis = options.label.indentFromAxis, axisPosition = that._axisPosition, labelCoords = tick.labelCoords, labelX = labelCoords.x; if (that._isHorizontal) { if (position === BOTTOM) { translateY = axisPosition + indentFromAxis - box.y + offset } else { translateY = axisPosition - indentFromAxis - (box.y + box.height) - offset } if (textAlign === RIGHT) { translateX = labelX - box.x - box.width } else { if (textAlign === LEFT) { translateX = labelX - box.x } else { translateX = labelX - box.x - box.width / 2 } } } else { translateY = labelCoords.y - box.y - box.height / 2; if (position === LEFT) { if (textAlign === LEFT) { translateX = axisPosition - indentFromAxis - maxWidth - box.x } else { if (textAlign === CENTER) { translateX = axisPosition - indentFromAxis - maxWidth / 2 - box.x - box.width / 2 } else { translateX = axisPosition - indentFromAxis - box.x - box.width } } translateX -= offset } else { if (textAlign === RIGHT) { translateX = axisPosition + indentFromAxis + maxWidth - box.x - box.width } else { if (textAlign === CENTER) { translateX = axisPosition + indentFromAxis + maxWidth / 2 - box.x - box.width / 2 } else { translateX = axisPosition + indentFromAxis - box.x } } translateX += offset } } return { translateX: translateX, translateY: translateY } }, _createAxisGroups: function() { var insideGroup, outsideGroup1, outsideGroup2, that = this, renderer = that._renderer, classSelector = that._axisCssPrefix, constantLinesClass = classSelector + "constant-lines"; that._axisGroup = renderer.g().attr({ "class": classSelector + "axis" }); that._axisStripGroup = renderer.g().attr({ "class": classSelector + "strips" }); that._axisGridGroup = renderer.g().attr({ "class": classSelector + "grid" }); that._axisElementsGroup = renderer.g().attr({ "class": classSelector + "elements" }).append(that._axisGroup); that._axisLineGroup = renderer.g().attr({ "class": classSelector + "line" }).append(that._axisGroup); that._axisTitleGroup = renderer.g().attr({ "class": classSelector + "title" }).append(that._axisGroup); insideGroup = renderer.g().attr({ "class": constantLinesClass }); outsideGroup1 = renderer.g().attr({ "class": constantLinesClass }); outsideGroup2 = renderer.g().attr({ "class": constantLinesClass }); that._axisConstantLineGroups = { inside: insideGroup, outside1: outsideGroup1, left: outsideGroup1, top: outsideGroup1, outside2: outsideGroup2, right: outsideGroup2, bottom: outsideGroup2 }; that._axisStripLabelGroup = renderer.g().attr({ "class": classSelector + "axis-labels" }) }, _clearAxisGroups: function() { var that = this; that._axisGroup.remove(); that._axisStripGroup.remove(); that._axisStripLabelGroup.remove(); that._axisConstantLineGroups.inside.remove(); that._axisConstantLineGroups.outside1.remove(); that._axisConstantLineGroups.outside2.remove(); that._axisGridGroup.remove(); that._axisTitleGroup.clear(); that._axisElementsGroup.clear(); that._axisLineGroup && that._axisLineGroup.clear(); that._axisStripGroup && that._axisStripGroup.clear(); that._axisGridGroup && that._axisGridGroup.clear(); that._axisConstantLineGroups.inside.clear(); that._axisConstantLineGroups.outside1.clear(); that._axisConstantLineGroups.outside2.clear(); that._axisStripLabelGroup && that._axisStripLabelGroup.clear() }, _formatTickLabel: function(value) { return formatLabel(value, this._options.label, { min: this._minBound, max: this._maxBound }) }, _setTickOffset: function() { var options = this._options, discreteAxisDivisionMode = options.discreteAxisDivisionMode; this._tickOffset = +("crossLabels" !== discreteAxisDivisionMode || !discreteAxisDivisionMode) }, getMargins: function() { var that = this, options = that._options, position = options.position, placeholderSize = options.placeholderSize, canvas = that.getCanvas(), cLeft = canvas.left, cTop = canvas.top, cRight = canvas.width - canvas.right, cBottom = canvas.height - canvas.bottom, boxes = [that._axisElementsGroup, that._axisConstantLineGroups.outside1, that._axisConstantLineGroups.outside2].map(function(group) { return group && group.getBBox() }).concat(function(group) { var box = group && group.getBBox(); if (!box || box.isEmpty) { return box } if (that._isHorizontal) { box.x = cLeft; box.width = cRight - cLeft } else { box.y = cTop; box.height = cBottom - cTop } return box }(that._axisTitleGroup)), margins = boxes.reduce(function(margins, bBox) { if (!bBox || bBox.isEmpty) { return margins } return { left: _max(margins.left, cLeft - bBox.x), top: _max(margins.top, cTop - bBox.y), right: _max(margins.right, bBox.x + bBox.width - cRight), bottom: _max(margins.bottom, bBox.y + bBox.height - cBottom) } }, { left: 0, right: 0, top: 0, bottom: 0 }); margins[position] += options.crosshairMargin; if (placeholderSize) { margins[position] = placeholderSize } return margins }, _validateUnit: function(unit, idError, parameters) { var that = this; unit = that.parser(unit); if (void 0 === unit && idError) { that._incidentOccurred(idError, [parameters]) } return unit }, _setType: function(axisType, drawingType) { var axisTypeMethods, that = this; switch (axisType) { case "xyAxes": axisTypeMethods = __webpack_require__( /*! ./xy_axes */ 578); break; case "polarAxes": axisTypeMethods = __webpack_require__( /*! ./polar_axes */ 579) } _each(axisTypeMethods[drawingType], function(methodName, method) { that[methodName] = method }) }, _getSharpParam: function() { return true }, dispose: function() { var that = this; that._axisElementsGroup && that._axisElementsGroup.dispose(); that._strips = null; that._title = null; that._axisStripGroup = that._axisConstantLineGroups = that._axisStripLabelGroup = null; that._axisLineGroup = that._axisElementsGroup = that._axisGridGroup = null; that._axisGroup = that._axisTitleGroup = null; that._axesContainerGroup = that._stripsGroup = that._constantLinesGroup = null; that._renderer = that._options = that._textOptions = that._textFontStyles = null; that._translator = null; that._majorTicks = that._minorTicks = null; that._tickManager = null }, getOptions: function() { return this._options }, setPane: function(pane) { this.pane = pane; this._options.pane = pane }, setTypes: function(type, axisType, typeSelector) { this._options.type = type || this._options.type; this._options[typeSelector] = axisType || this._options[typeSelector] }, resetTypes: function(typeSelector) { this._options.type = this._initTypes.type; this._options[typeSelector] = this._initTypes[typeSelector] }, getTranslator: function() { return this._translator }, updateOptions: function(options) { var that = this, labelOpt = options.label; that._options = options; options.tick = options.tick || {}; options.minorTick = options.minorTick || {}; options.grid = options.grid || {}; options.minorGrid = options.minorGrid || {}; options.title = options.title || {}; options.marker = options.marker || {}; that._initTypes = { type: options.type, argumentType: options.argumentType, valueType: options.valueType }; validateAxisOptions(options); that._setTickOffset(); that._isHorizontal = options.isHorizontal; that.pane = options.pane; that.name = options.name; that.priority = options.priority; that._hasLabelFormat = "" !== labelOpt.format && _isDefined(labelOpt.format); that._textOptions = { opacity: labelOpt.opacity, align: "center" }; that._textFontStyles = vizUtils.patchFontOptions(labelOpt.font); if (options.type === constants.logarithmic) { if (options.logarithmBaseError) { that._incidentOccurred("E2104"); delete options.logarithmBaseError } that.calcInterval = function(value, prevValue) { return vizUtils.getLog(value / prevValue, options.logarithmBase) } } that._updateTranslator() }, _processCanvas: function(canvas) { return canvas }, updateCanvas: function(canvas) { var positions = this._orthogonalPositions = { start: !this._isHorizontal ? canvas.left : canvas.top, end: !this._isHorizontal ? canvas.width - canvas.right : canvas.height - canvas.bottom }; this._canvas = canvas; positions.center = positions.start + (positions.end - positions.start) / 2; this._translator.updateCanvas(this._processCanvas(canvas)); this._initAxisPositions() }, getCanvas: function() { return this._canvas }, hideTitle: function() { var that = this; if (that._options.title.text) { that._incidentOccurred("W2105", [that._isHorizontal ? "horizontal" : "vertical"]); that._axisTitleGroup.clear() } }, hideOuterElements: function() { var that = this, options = that._options, constantLineLabels = that._outsideConstantLines.map(function(line) { return line.label }); if ((options.label.visible || constantLineLabels.length) && !that._translator.getBusinessRange().stubData) { that._incidentOccurred("W2106", [that._isHorizontal ? "horizontal" : "vertical"]); that._axisElementsGroup.clear(); constantLineLabels.forEach(function(label) { label && label.remove() }) } }, _saveBusinessRange: function() { this._storedBusinessRange = new rangeModule.Range(this._translator.getBusinessRange()) }, restoreBusinessRange: function() { var zoomArgs = this._zoomArgs, range = new rangeModule.Range(this._storedBusinessRange); if (zoomArgs) { this.zoom(zoomArgs.min, zoomArgs.max, zoomArgs.stick) } else { this._updateBusinessRange(range) } }, _applyMargins: function(range) { var minMarginValue, maxMarginValue, options = this._options, type = options.type, valueMarginsEnabled = options.valueMarginsEnabled && "logarithmic" !== type && "discrete" !== type, add = getAddFunction(range); if (valueMarginsEnabled) { minMarginValue = getMarginValue(range, options.minValueMargin); maxMarginValue = getMarginValue(range, options.maxValueMargin, true); range.addRange({ min: add(range.min, -minMarginValue), max: add(range.max, maxMarginValue), minVisible: _isDefined(range.minVisible) ? add(range.minVisible, -minMarginValue) : void 0, maxVisible: _isDefined(range.maxVisible) ? add(range.maxVisible, maxMarginValue) : void 0 }) } }, setBusinessRange: function(range) { this._applyMargins(range); this._updateBusinessRange(range); this._saveBusinessRange(range) }, _updateBusinessRange: function(range) { var that = this; that._translator.updateBusinessRange(range); that._minBound = range.minVisible; that._maxBound = range.maxVisible }, getLabelsPosition: function() { var that = this, options = that._options, position = options.position, labelShift = options.label.indentFromAxis + (that._axisShift || 0) + that._constantLabelOffset, axisPosition = that._axisPosition; return position === TOP || position === LEFT ? axisPosition - labelShift : axisPosition + labelShift }, getFormattedValue: function(value, options, point) { var labelOptions = this._options.label; return _isDefined(value) ? formatLabel(value, extend(true, {}, labelOptions, options), void 0, point) : null }, _getBoundaryTicks: function() { var categories = this._translator.getVisibleCategories() || this._translator.getBusinessRange().categories; return isEmptyArray(categories) && this._tickOffset ? [categories[0], categories[categories.length - 1]] : this._tickManager.getBoundaryTicks() }, setPercentLabelFormat: function() { if (!this._hasLabelFormat) { this._options.label.format = "percent" } }, resetAutoLabelFormat: function() { if (!this._hasLabelFormat) { delete this._options.label.format } }, getMultipleAxesSpacing: function() { return this._options.multipleAxesSpacing || 0 }, getTicksValues: function() { return { majorTicksValues: convertTicksToValues(this._majorTicks), minorTicksValues: convertTicksToValues(this._minorTicks) } }, setTicks: function(ticks) { this._majorTicks = (ticks.majorTicks || []).map(createMajorTick(this, this._renderer)); this._minorTicks = (ticks.minorTicks || []).map(createMinorTick(this, this._renderer)); this._updateTickManager() }, createTicks: function(canvas) { var boundaryTicks, that = this, renderer = that._renderer, tickManager = that._tickManager; if (!canvas) { that._updateIntervalAndBounds(); return } that.updateCanvas(canvas); that._majorTicks = that._minorTicks = null; that._updateTickManager(); that._majorTicks = tickManager.getTicks().map(createMajorTick(this, renderer)); that._minorTicks = tickManager.getMinorTicks().map(createMinorTick(this, renderer)); that.correctTicksOnDeprecated(); boundaryTicks = that._getBoundaryTicks(); if (this._options.showCustomBoundaryTicks && boundaryTicks.length) { that._boundaryTicks = [boundaryTicks[0]].map(createBoundaryTick(this, renderer, true)); if (boundaryTicks.length > 1) { that._boundaryTicks = that._boundaryTicks.concat([boundaryTicks[1]].map(createBoundaryTick(this, renderer, false))) } } that._correctLabelFormat(); that._updateIntervalAndBounds() }, correctTicksOnDeprecated: function() { var behavior = this._options.label.overlappingBehavior, majorTicks = this._majorTicks, length = majorTicks.length; if (length) { majorTicks[0].withoutLabel = behavior.hideFirstLabel; majorTicks[length - 1].withoutLabel = behavior.hideLastLabel; majorTicks[0].withoutPath = behavior.hideFirstTick; majorTicks[length - 1].withoutPath = behavior.hideLastTick } }, draw: function(canvas, borderOptions) { var that = this, drawGridLine = that._getGridLineDrawer(borderOptions || { visible: false }); that.createTicks(canvas); that._clearAxisGroups(); initTickCoords(that._majorTicks); initTickCoords(that._minorTicks); initTickCoords(that._boundaryTicks || []); that._drawAxis(); that._drawTitle(); drawTickMarks(that._majorTicks); drawTickMarks(that._minorTicks); drawTickMarks(that._boundaryTicks || []); drawGrids(that._majorTicks, drawGridLine); drawGrids(that._minorTicks, drawGridLine); callAction(that._majorTicks, "drawLabel"); that._outsideConstantLines = that._drawConstantLines("outside"); that._insideConstantLines = that._drawConstantLines("inside"); that._strips = that._drawStrips(); that._dateMarkers = that._drawDateMarkers() || []; that._axisGroup.append(that._axesContainerGroup); that._labelAxesGroup && that._axisStripLabelGroup.append(that._labelAxesGroup); that._gridContainerGroup && that._axisGridGroup.append(that._gridContainerGroup); that._stripsGroup && that._axisStripGroup.append(that._stripsGroup); if (that._constantLinesGroup) { that._axisConstantLineGroups.inside.append(that._constantLinesGroup); that._axisConstantLineGroups.outside1.append(that._constantLinesGroup); that._axisConstantLineGroups.outside2.append(that._constantLinesGroup) } that._measureTitle(); measureLabels(that._majorTicks); measureLabels(that._outsideConstantLines); measureLabels(that._insideConstantLines); measureLabels(that._strips); measureLabels(that._dateMarkers); that._adjustConstantLineLabels(that._insideConstantLines); that._adjustStripLabels(); var offset = that._constantLabelOffset = that._adjustConstantLineLabels(that._outsideConstantLines); if (!that._translator.getBusinessRange().stubData) { that._setLabelsPlacement(); offset = that._adjustLabels(offset) } offset = that._adjustDateMarkers(offset); that._adjustTitle(offset) }, _measureTitle: _noop, updateSize: function(canvas) { var that = this; that.updateCanvas(canvas); var canvasStartEnd = that._getCanvasStartEnd(); initTickCoords(that._majorTicks); initTickCoords(that._minorTicks); initTickCoords(that._boundaryTicks || []); that._updateAxisElementPosition(); updateTicksPosition(that._majorTicks); updateTicksPosition(that._minorTicks); updateTicksPosition(that._boundaryTicks || []); callAction(that._majorTicks, "updateLabelPosition"); that._outsideConstantLines.concat(that._insideConstantLines || []).forEach(function(item) { var coord = that._getConstantLinePos(item.options.value, canvasStartEnd.start, canvasStartEnd.end).value; item.label && item.label.attr(that._getConstantLineLabelsCoords(coord, item.labelOptions)); item.line && item.line.attr(that._getConstantLineGraphicAttributes(coord)) }); (that._strips || []).forEach(function(item) { var range = that._translator.getBusinessRange(), stripPos = that._getStripPos(item.options.startValue, item.options.endValue, canvasStartEnd.start, canvasStartEnd.end, range); item.label && item.label.attr(that._getStripLabelCoords(stripPos.from, stripPos.to, item.options.label)); item.rect && item.rect.attr(that._getStripGraphicAttributes(stripPos.from, stripPos.to)) }); that._updateTitleCoords(); that._checkTitleOverflow(); updateGridsPosition(that._majorTicks); updateGridsPosition(that._minorTicks) }, applyClipRects: function(elementsClipID, canvasClipID) { this._axisGroup.attr({ "clip-path": canvasClipID }); this._axisStripGroup.attr({ "clip-path": elementsClipID }) }, validate: function(isArgumentAxis) { var that = this, options = that._options, dataType = isArgumentAxis ? options.argumentType : options.valueType, parser = dataType ? parseUtils.getParser(dataType) : function(unit) { return unit }; that.parser = parser; options.dataType = dataType; if (void 0 !== options.min) { options.min = that._validateUnit(options.min, "E2106") } if (void 0 !== options.max) { options.max = that._validateUnit(options.max, "E2106") } if (void 0 !== that._minBound) { that._minBound = that._validateUnit(that._minBound) } if (void 0 !== that._maxBound) { that._maxBound = that._validateUnit(that._maxBound) } }, zoom: function(min, max, skipAdjusting) { var that = this, minOpt = that._options.min, maxOpt = that._options.max, stick = skipAdjusting, businessRange = new rangeModule.Range(this._storedBusinessRange), translatorRange = this._translator.getBusinessRange(), isDiscrete = that._options.type === constants.discrete; skipAdjusting = skipAdjusting || isDiscrete; min = that._validateUnit(min); max = that._validateUnit(max); if (!isDiscrete && _isDefined(min) && _isDefined(max) && min > max) { max = [min, min = max][0] } if (!skipAdjusting) { if (void 0 !== minOpt) { min = minOpt > min ? minOpt : min; max = minOpt > max ? minOpt : max } if (void 0 !== maxOpt) { max = maxOpt < max ? maxOpt : max; min = maxOpt < min ? maxOpt : min } } that._zoomArgs = { min: min, max: max, stick: stick }; businessRange.minVisible = min; businessRange.maxVisible = max; if (stick && !isDiscrete) { businessRange.min = translatorRange.min; businessRange.max = translatorRange.max; businessRange.stick = stick } this._updateBusinessRange(businessRange); return that._zoomArgs }, resetZoom: function() { this._zoomArgs = null }, getViewport: function() { var that = this, minOpt = that._options.min, maxOpt = that._options.max; if (that._zoomArgs) { return that._zoomArgs } if (_isDefined(minOpt) || _isDefined(maxOpt)) { return { min: minOpt, max: maxOpt } } }, getRangeData: function() { var rangeMin, rangeMax, rangeMinVisible, rangeMaxVisible, that = this, options = that._options, minMax = that._getMinMax(), min = minMax.min, max = minMax.max, zoomArgs = that._zoomArgs || {}, type = options.type; if (type === constants.logarithmic) { min = min <= 0 ? void 0 : min; max = max <= 0 ? void 0 : max } if (type !== constants.discrete) { rangeMin = min; rangeMax = max; if (_isDefined(min) && _isDefined(max)) { rangeMin = min < max ? min : max; rangeMax = max > min ? max : min } rangeMinVisible = _isDefined(zoomArgs.min) ? zoomArgs.min : rangeMin; rangeMaxVisible = _isDefined(zoomArgs.max) ? zoomArgs.max : rangeMax } else { rangeMinVisible = _isDefined(zoomArgs.min) ? zoomArgs.min : min; rangeMaxVisible = _isDefined(zoomArgs.max) ? zoomArgs.max : max } return { min: rangeMin, max: rangeMax, stick: that._getStick(), categories: options.categories, dataType: options.dataType, axisType: type, base: options.logarithmBase, invert: options.inverted, addSpiderCategory: that._getSpiderCategoryOption(), minVisible: rangeMinVisible, maxVisible: rangeMaxVisible } }, getFullTicks: function() { return this._tickManager.getFullTicks() }, measureLabels: function(withIndents) { var ticks, maxText, text, box, that = this, options = that._options, widthAxis = options.visible ? options.width : 0, indent = withIndents ? options.label.indentFromAxis + .5 * options.tick.length : 0; if (!options.label.visible || !that._axisElementsGroup) { return { height: widthAxis, width: widthAxis, x: 0, y: 0 } } ticks = that._tickManager.getTicks(); maxText = ticks.reduce(function(prevValue, tick, index) { var label = that._formatTickLabel(tick); if (prevValue[0].length < label.length) { return [label, tick] } else { return prevValue } }, [that._formatTickLabel(ticks[0]), ticks[0]]); text = that._renderer.text(maxText[0], 0, 0).css(that._textFontStyles).attr(that._textOptions).append(that._renderer.root); box = text.getBBox(); text.remove(); return { x: box.x, y: box.y, width: box.width + indent, height: box.height + indent } }, _setLabelsPlacement: function() { if (!this._options.label.visible) { return } var notRecastStep, step, that = this, labelOpt = that._options.label, displayMode = that._validateDisplayMode(labelOpt.displayMode), overlappingMode = that._validateOverlappingMode(labelOpt.overlappingBehavior.mode, displayMode), rotationAngle = labelOpt.overlappingBehavior.rotationAngle, staggeringSpacing = labelOpt.overlappingBehavior.staggeringSpacing, ignoreOverlapping = "none" === overlappingMode || "ignore" === overlappingMode, behavior = { rotationAngle: _isDefined(rotationAngle) ? rotationAngle : labelOpt.rotationAngle, staggeringSpacing: _isDefined(staggeringSpacing) ? staggeringSpacing : labelOpt.staggeringSpacing }, boxes = that._majorTicks.map(function(tick) { return tick.labelBBox }); step = that._getStep(boxes); switch (displayMode) { case "rotate": if (ignoreOverlapping) { notRecastStep = true; step = 1 } that._applyLabelMode(displayMode, step, boxes, labelOpt, notRecastStep); break; case "stagger": if (ignoreOverlapping) { step = 2 } that._applyLabelMode(displayMode, _max(step, 2), boxes, labelOpt); break; default: that._applyLabelOverlapping(boxes, overlappingMode, step, behavior) } }, _applyLabelOverlapping: function(boxes, mode, step, behavior) { var that = this, labelOpt = that._options.label, majorTicks = that._majorTicks; if ("none" === mode || "ignore" === mode) { return } var checkLabels = function(box, index, array) { if (0 === index) { return false } return constants.areLabelsOverlap(box, array[index - 1], labelOpt.minSpacing, labelOpt.alignment) }; if (step > 1 && boxes.some(checkLabels)) { that._applyLabelMode(mode, step, boxes, behavior) } if ("hide" === mode) { that._checkBoundedLabelsOverlapping(step, majorTicks, boxes) } }, _applyLabelMode: function(mode, step, boxes, behavior, notRecastStep) { var labelHeight, alignment, func, that = this, majorTicks = that._majorTicks, labelOpt = that._options.label, angle = behavior.rotationAngle; switch (mode) { case "rotate": if (!labelOpt.userAlignment) { alignment = angle < 0 ? RIGHT : LEFT; if (angle % 90 === 0) { alignment = CENTER } } step = notRecastStep ? step : that._getStep(boxes, angle); func = function(tick) { tick.label.rotate(angle); tick.labelRotationAngle = angle; alignment && (tick.labelAlignment = alignment) }; updateLabels(majorTicks, step, func); break; case "stagger": labelHeight = that._getMaxLabelHeight(that._options.position === TOP, boxes, behavior.staggeringSpacing); func = function(tick, index) { if (index / (step - 1) % 2 !== 0) { tick.labelOffset = labelHeight } }; updateLabels(majorTicks, step - 1, func); break; case "auto": case "_auto": if (2 === step) { that._applyLabelMode("stagger", step, boxes, behavior) } else { that._applyLabelMode("rotate", step, boxes, { rotationAngle: getOptimalAngle(boxes, labelOpt) }) } break; default: updateLabels(majorTicks, step) } }, getMarkerTrackers: _noop, _drawDateMarkers: _noop, _adjustDateMarkers: _noop, coordsIn: _noop, _getSkippedCategory: _noop, _initAxisPositions: _noop, _drawTitle: _noop, _updateTitleCoords: _noop, _adjustConstantLineLabels: _noop, _createTranslator: function() { return new Translator2DModule.Translator2D({}, {}, {}) }, _updateTranslator: function() { this._translator.update({}, {}, { isHorizontal: this._isHorizontal, interval: this._options.semiDiscreteInterval }) }, _adjustTitle: _noop, _checkTitleOverflow: _noop, getSpiderTicks: _noop, setSpiderTicks: _noop, _checkBoundedLabelsOverlapping: _noop, _getTickMarkPoints: _noop, _validateOverlappingMode: _noop, _getStep: _noop, _validateDisplayMode: _noop, shift: _noop } }, /*!***************************************!*\ !*** ./js/viz/axes/axes_constants.js ***! \***************************************/ function(module, exports, __webpack_require__) { var isFunction = __webpack_require__( /*! ../../core/utils/common */ 14).isFunction, _map = __webpack_require__( /*! ../core/utils */ 509).map, _format = __webpack_require__( /*! ../core/format */ 530); function getFormatObject(value, options, axisMinMax, point) { var formatObject = { value: value, valueText: _format(value, options) || "" }; if (axisMinMax) { formatObject.min = axisMinMax.min; formatObject.max = axisMinMax.max } if (point) { formatObject.point = point } return formatObject } module.exports = { logarithmic: "logarithmic", discrete: "discrete", numeric: "numeric", left: "left", right: "right", top: "top", bottom: "bottom", center: "center", canvasPositionPrefix: "canvas_position_", canvasPositionTop: "canvas_position_top", canvasPositionBottom: "canvas_position_bottom", canvasPositionLeft: "canvas_position_left", canvasPositionRight: "canvas_position_right", canvasPositionStart: "canvas_position_start", canvasPositionEnd: "canvas_position_end", horizontal: "horizontal", vertical: "vertical", convertTicksToValues: function(ticks) { return _map(ticks || [], function(item) { return item.value }) }, validateOverlappingMode: function(mode) { return "ignore" === mode || "none" === mode ? mode : "hide" }, formatLabel: function(value, options, axisMinMax, point) { var formatObject = getFormatObject(value, options, axisMinMax, point); return isFunction(options.customizeText) ? options.customizeText.call(formatObject, formatObject) : formatObject.valueText }, formatHint: function(value, options, axisMinMax) { var formatObject = getFormatObject(value, options, axisMinMax); return isFunction(options.customizeHint) ? options.customizeHint.call(formatObject, formatObject) : void 0 }, getTicksCountInRange: function(ticks, valueKey, range) { var i = 1; if (ticks.length > 1) { for (; i < ticks.length; i++) { if (Math.abs(ticks[i].coords[valueKey] - ticks[0].coords[valueKey]) >= range) { break } } } return i }, areLabelsOverlap: function(bBox1, bBox2, spacing, alignment) { var hasHorizontalOverlapping, hasVerticalOverlapping, horizontalInverted = bBox1.x > bBox2.x, verticalInverted = bBox1.y > bBox2.y, x1 = bBox1.x, x2 = bBox2.x, width1 = bBox1.width, width2 = bBox2.width; if ("center" === alignment) { x1 -= width1 / 2; x2 -= width2 / 2 } else { if ("right" === alignment) { x1 -= width1; x2 -= width2 } } hasHorizontalOverlapping = horizontalInverted ? x2 + width2 + spacing > x1 : x1 + width1 + spacing > x2; hasVerticalOverlapping = verticalInverted ? bBox2.y + bBox2.height > bBox1.y : bBox1.y + bBox1.height > bBox2.y; return hasHorizontalOverlapping && hasVerticalOverlapping } } }, /*!******************************************!*\ !*** ./js/viz/axes/base_tick_manager.js ***! \******************************************/ function(module, exports, __webpack_require__) { var TickManager, $ = __webpack_require__( /*! ../../core/renderer */ 9), coreTickManager = __webpack_require__( /*! ./numeric_tick_manager */ 568), dateTimeManager = __webpack_require__( /*! ./datetime_tick_manager */ 569), logarithmicMethods = __webpack_require__( /*! ./logarithmic_tick_manager */ 570), dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, formatHelper = __webpack_require__( /*! ../../format_helper */ 66), _isDefined = commonUtils.isDefined, _isNumber = commonUtils.isNumeric, _addInterval = dateUtils.addInterval, utils = __webpack_require__( /*! ../core/utils */ 509), _adjustValue = utils.adjustValue, _map = utils.map, _each = $.each, _inArray = inArray, _noop = commonUtils.noop, DEFAULT_GRID_SPACING_FACTOR = 30, DEFAULT_MINOR_GRID_SPACING_FACTOR = 15, DEFAULT_NUMBER_MULTIPLIERS = [1, 2, 3, 5], TICKS_COUNT_LIMIT = 2e3, MIN_ARRANGEMENT_TICKS_COUNT = 2; function getUniqueValues(array) { var currentValue, lastValue = array[0], result = [lastValue.obj], length = array.length, i = 1; for (i; i < length; i++) { currentValue = array[i]; if (lastValue.value !== currentValue.value) { result.push(currentValue.obj); lastValue = currentValue } } return result } function concatAndSort(array1, array2) { if (!array1.length && !array2.length) { return [] } var array = array1.concat(array2), values = [], length = array.length, hasNull = false, i = 0; for (i; i < length; i++) { if (null !== array[i]) { values.push({ obj: array[i], value: array[i].valueOf() }) } else { hasNull = true } } values.sort(function(x, y) { return x.value - y.value }); values = getUniqueValues(values); hasNull && values.push(null); return values } function convertTickIntervalToNumeric(interval) { if (!_isNumber(interval)) { var date = new Date; interval = _addInterval(date, interval) - date } return interval } function checkUserTickInterval(userTickInterval, calculatedTickInterval, forceUserTickInterval) { if (forceUserTickInterval && userTickInterval) { return userTickInterval } if (!userTickInterval) { return calculatedTickInterval } var tickInterval1 = convertTickIntervalToNumeric(userTickInterval), tickInterval2 = convertTickIntervalToNumeric(calculatedTickInterval); if (_isNumber(tickInterval1) && _isNumber(tickInterval2)) { if (tickInterval1 > tickInterval2) { return userTickInterval } } return calculatedTickInterval } exports.discrete = extend({}, coreTickManager.continuous, { _calculateMinorTicks: _noop, _findTickInterval: _noop, _createTicks: function() { return [] }, _generateBounds: _noop, _correctMin: _noop, _correctMax: _noop, _findBusinessDelta: _noop, _addBoundedTicks: _noop, getFullTicks: function() { return this._customTicks }, getMinorTicks: function() { return [] }, _findTickIntervalForCustomTicks: function() { return 1 } }); TickManager = exports.TickManager = function(types, data, options) { options = options || {}; this.update(types || {}, data || {}, options) }; TickManager.prototype = { constructor: TickManager, dispose: function() { this._ticks = null; this._minorTicks = null; this._boundaryTicks = null; this._options = null }, update: function(types, data, options) { this._updateOptions(options || {}); this._min = data.min; this._updateTypes(types || {}); this._updateData(data || {}) }, _updateMinMax: function(data) { var min = data.min || 0, max = data.max || 0, newMinMax = this._applyMinMaxMargins(min, max); this._min = this._originalMin = newMinMax.min; this._max = this._originalMax = newMinMax.max; this._updateBusinessDelta() }, _updateBusinessDelta: function() { this._businessDelta = this._findBusinessDelta && this._findBusinessDelta(this._min, this._max) }, _updateTypes: function(types) { var that = this, axisType = that._validateAxisType(types.axisType), dataType = that._validateDataType(types.dataType); that._resetMethods(); this._axisType = axisType; this._dataType = dataType; this._initMethods() }, _updateData: function(data) { data = extend({}, data); data.min = _isDefined(data.min) ? data.min : this._originalMin; data.max = _isDefined(data.max) ? data.max : this._originalMax; this._updateMinMax(data); this._customTicks = data.customTicks && data.customTicks.slice(); this._customMinorTicks = data.customMinorTicks; this._customBoundTicks = data.customBoundTicks; this._screenDelta = data.screenDelta || 0 }, _updateOptions: function(options) { var opt; this._options = opt = options; opt.gridSpacingFactor = opt.gridSpacingFactor || DEFAULT_GRID_SPACING_FACTOR; opt.minorGridSpacingFactor = opt.minorGridSpacingFactor || DEFAULT_MINOR_GRID_SPACING_FACTOR; opt.numberMultipliers = opt.numberMultipliers || DEFAULT_NUMBER_MULTIPLIERS }, getTickBounds: function() { return { minVisible: this._minBound, maxVisible: this._maxBound } }, getTicks: function() { var that = this, options = that._options; that._ticks = that._calculateMajorTicks(); that._checkLabelFormat(); that._generateBounds(); if (options.showMinorTicks) { that._minorTicks = that._calculateMinorTicks() } that._addBoundedTicks(); return that._ticks }, getMinorTicks: function() { return concatAndSort(this._minorTicks || [], []) }, getFullTicks: function() { var that = this, needCalculateMinorTicks = that._ticks && !that._minorTicks, minorTicks = needCalculateMinorTicks ? that._calculateMinorTicks() : that._minorTicks || []; return concatAndSort(that._ticks || [], minorTicks.concat(that.getBoundaryTicks())) }, getBoundaryTicks: function() { return this._boundaryTicks || [] }, getTickInterval: function() { return this._tickInterval }, getMinorTickInterval: function() { return this._minorTickInterval }, getOptions: function() { return this._options }, _calculateMajorTicks: function() { var ticks, that = this; if (that._options.showCalculatedTicks || !that._customTicks) { ticks = that._createTicks(that._options.showCalculatedTicks ? that._customTicks || [] : [], that._findTickInterval(), that._min, that._max) } else { ticks = that._customTicks.slice(); that._tickInterval = ticks.length > 1 ? that._findTickIntervalForCustomTicks() : 0 } return ticks }, _applyMinMaxMargins: function(min, max) { var newMin = min > max ? max : min, newMax = max > min ? max : min; this._minCorrectionEnabled = this._getCorrectionEnabled(min, "min"); this._maxCorrectionEnabled = this._getCorrectionEnabled(max, "max"); return { min: newMin, max: newMax } }, _checkBoundedTickInArray: function(value, array) { var arrayValues = _map(array || [], function(item) { return item.valueOf() }), minorTicksIndex = _inArray(value.valueOf(), arrayValues); if (minorTicksIndex !== -1) { array.splice(minorTicksIndex, 1) } }, _checkLabelFormat: function() { var options = this._options; if ("datetime" === this._dataType && !options.hasLabelFormat && this._ticks.length) { options.labelFormat = options.isMarkersVisible ? dateUtils.getDateFormatByTickInterval(this._tickInterval) : formatHelper.getDateFormatByTicks(this._ticks) } }, _generateBounds: function() { var that = this, interval = that._getBoundInterval(), stick = that._options.stick, minStickValue = that._options.minStickValue, maxStickValue = that._options.maxStickValue, minBound = that._minCorrectionEnabled && !stick ? that._getNextTickValue(that._min, interval, true) : that._originalMin, maxBound = that._maxCorrectionEnabled && !stick ? that._getNextTickValue(that._max, interval) : that._originalMax; that._minBound = minBound < minStickValue ? minStickValue : minBound; that._maxBound = maxBound > maxStickValue ? maxStickValue : maxBound }, _addBoundedTicks: function() { var that = this, tickValues = _map(that._ticks, function(tick) { return tick.valueOf() }), customBounds = that._customBoundTicks, min = that._originalMin, max = that._originalMax, addMinMax = that._options.addMinMax || {}; function processTick(tick) { that._boundaryTicks.push(tick); that._checkBoundedTickInArray(tick, that._minorTicks) } that._boundaryTicks = []; if (customBounds) { if (addMinMax.min && _isDefined(customBounds[0])) { processTick(customBounds[0]) } if (addMinMax.max && _isDefined(customBounds[1])) { processTick(customBounds[1]) } } else { if (addMinMax.min && _inArray(min.valueOf(), tickValues) === -1) { processTick(min) } if (addMinMax.max && _inArray(max.valueOf(), tickValues) === -1) { processTick(max) } } }, _getCorrectionEnabled: function(value, marginSelector) { var options = this._options || {}, hasPercentStick = options.percentStick && 1 === Math.abs(value), hasValueMargin = options[marginSelector + "ValueMargin"]; return !hasPercentStick && !hasValueMargin }, _validateAxisType: function(type) { var defaultType = "continuous", allowedTypes = { continuous: true, discrete: true, logarithmic: true }; return allowedTypes[type] ? type : defaultType }, _validateDataType: function(type) { var allowedTypes = { numeric: true, datetime: true, string: true }; if (!allowedTypes[type]) { type = _isDefined(this._min) ? this._getDataType(this._min) : "numeric" } return type }, _getDataType: function(value) { return commonUtils.isDate(value) ? "datetime" : "numeric" }, _getMethods: function() { var methods; if ("continuous" === this._axisType) { methods = "datetime" === this._dataType ? dateTimeManager.datetime : coreTickManager.continuous } else { switch (this._axisType) { case "discrete": methods = exports.discrete; break; case "logarithmic": methods = logarithmicMethods.logarithmic; break; default: methods = coreTickManager.continuous } } return methods }, _resetMethods: function() { var that = this, methods = that._getMethods(); _each(methods, function(name) { if (that[name]) { delete that[name] } }) }, _initMethods: function(methods) { var that = this; methods = methods || that._getMethods(); _each(methods, function(name, func) { that[name] = func }) }, _getDeltaCoef: function(screenDelta, businessDelta, gridSpacingFactor) { var count; gridSpacingFactor = gridSpacingFactor || this._options.gridSpacingFactor; screenDelta = screenDelta || this._screenDelta; businessDelta = businessDelta || this._businessDelta; count = screenDelta / gridSpacingFactor; count = count <= 1 ? MIN_ARRANGEMENT_TICKS_COUNT : count; return businessDelta / count }, _adjustNumericTickValue: function(value, interval, min) { return commonUtils.isExponential(value) ? _adjustValue(value) : utils.applyPrecisionByMinDelta(min, interval, value) }, _isTickIntervalCorrect: function(tickInterval, tickCountLimit, businessDelta) { var date; businessDelta = businessDelta || this._businessDelta; if (!_isNumber(tickInterval)) { date = new Date; tickInterval = _addInterval(date, tickInterval) - date; if (!tickInterval) { return false } } if (_isNumber(tickInterval)) { if (tickInterval > 0 && businessDelta / tickInterval > tickCountLimit) { if (this._options.incidentOccurred) { this._options.incidentOccurred("W2003") } } else { return true } } return false }, _correctValue: function(valueTypeSelector, tickInterval, correctionMethod) { var that = this, correctionEnabledSelector = "_" + valueTypeSelector + "CorrectionEnabled", spaceCorrectionSelector = valueTypeSelector + "SpaceCorrection", valueSelector = "_" + valueTypeSelector, minStickValue = that._options.minStickValue, maxStickValue = that._options.maxStickValue; if (that[correctionEnabledSelector]) { if (that._options[spaceCorrectionSelector]) { that[valueSelector] = that._getNextTickValue(that[valueSelector], tickInterval, "min" === valueTypeSelector) } correctionMethod.call(this, tickInterval) } if ("min" === valueTypeSelector) { that[valueSelector] = that[valueSelector] < minStickValue ? minStickValue : that[valueSelector] } if ("max" === valueTypeSelector) { that[valueSelector] = that[valueSelector] > maxStickValue ? maxStickValue : that[valueSelector] } }, _findTickInterval: function() { var tickInterval, that = this, options = that._options, calculatedTickInterval = that._getInterval(), userTickInterval = that._isTickIntervalValid(options.tickInterval) && that._isTickIntervalCorrect(options.tickInterval, TICKS_COUNT_LIMIT) && options.tickInterval; tickInterval = checkUserTickInterval(userTickInterval, calculatedTickInterval, options.forceUserTickInterval); if (that._isTickIntervalValid(tickInterval)) { that._correctValue("min", tickInterval, that._correctMin); that._correctValue("max", tickInterval, that._correctMax); that._updateBusinessDelta() } that._tickInterval = tickInterval; return tickInterval }, _findMinorTickInterval: function(firstTick, secondTick) { var that = this, ticks = that._ticks, intervals = that._options.stick ? ticks.length - 1 : ticks.length; if (intervals < 1) { intervals = 1 } that._getMinorInterval(that._screenDelta / intervals, that._findBusinessDelta(firstTick, secondTick, false)); return that._minorTickInterval }, _createMinorTicks: function(ticks, firstTick, secondTick) { var that = this, tickInterval = that._findMinorTickInterval(firstTick, secondTick), isTickIntervalNegative = false, isTickIntervalWithPow = false, needCorrectTick = false, startTick = that._getNextTickValue(firstTick, tickInterval, isTickIntervalNegative, isTickIntervalWithPow, needCorrectTick); if (that._isTickIntervalValid(tickInterval)) { ticks = that._createCountedTicks(ticks, tickInterval, startTick, secondTick, that._minorTickCount, isTickIntervalNegative, isTickIntervalWithPow, needCorrectTick) } return ticks }, _calculateMinorTicks: function() { var that = this, options = that._options, minorTicks = [], ticks = that._ticks, ticksLength = ticks.length, hasUnitBeginningTick = that._hasUnitBeginningTickCorrection(), i = hasUnitBeginningTick ? 1 : 0; if (options.showMinorCalculatedTicks || !that._customMinorTicks) { if (ticks.length) { minorTicks = that._getBoundedMinorTicks(minorTicks, that._minBound, ticks[0], true); if (hasUnitBeginningTick) { minorTicks = that._getUnitBeginningMinorTicks(minorTicks) } for (i; i < ticksLength - 1; i++) { minorTicks = that._createMinorTicks(minorTicks, ticks[i], ticks[i + 1]) } minorTicks = that._getBoundedMinorTicks(minorTicks, that._maxBound, ticks[ticksLength - 1]) } else { minorTicks = that._createMinorTicks(minorTicks, that._minBound, that._maxBound) } options.showMinorCalculatedTicks && (minorTicks = minorTicks.concat(that._customMinorTicks || [])) } else { minorTicks = that._customMinorTicks } return minorTicks }, _createCountedTicks: function(ticks, tickInterval, min, max, count, isTickIntervalWithPow, needMax) { var i, value = min; for (i = 0; i < count; i++) { if (!(false === needMax && value.valueOf() === max.valueOf())) { ticks.push(value) } value = this._getNextTickValue(value, tickInterval, false, isTickIntervalWithPow, false) } return ticks }, _createTicks: function(ticks, tickInterval, min, max, isTickIntervalNegative, isTickIntervalWithPow, withCorrection) { var leftBound, rightBound, boundedRule, that = this, value = min, newValue = min; if (that._isTickIntervalValid(tickInterval)) { boundedRule = min - max < 0; do { value = newValue; if (that._options.stick) { if (value >= that._originalMin && value <= that._originalMax) { ticks.push(value) } } else { ticks.push(value) } newValue = that._getNextTickValue(value, tickInterval, isTickIntervalNegative, isTickIntervalWithPow, withCorrection); if (value.valueOf() === newValue.valueOf()) { break } leftBound = newValue - min >= 0; rightBound = max - newValue >= 0 } while (boundedRule === leftBound && boundedRule === rightBound) } else { ticks.push(value) } return ticks }, _getBoundedMinorTicks: function(minorTicks, boundedTick, tick, isNegative) { var startTick, endTick, that = this, needCorrectTick = false, nextTick = that._tickInterval ? this._getNextTickValue(tick, that._tickInterval, isNegative, true, needCorrectTick) : boundedTick, tickInterval = that._findMinorTickInterval(tick, nextTick), isTickIntervalCorrect = that._isTickIntervalCorrect(tickInterval, TICKS_COUNT_LIMIT, that._findBusinessDelta(tick, boundedTick, false)), boundedTickValue = boundedTick.valueOf(); if (isTickIntervalCorrect && that._isTickIntervalValid(tickInterval) && that._minorTickCount > 0) { if (isNegative) { if (tick.valueOf() <= boundedTickValue) { return minorTicks } while (nextTick.valueOf() < boundedTickValue) { nextTick = this._getNextTickValue(nextTick, tickInterval, false, false, needCorrectTick) } startTick = nextTick; endTick = that._getNextTickValue(tick, tickInterval, true, false, false) } else { startTick = that._getNextTickValue(tick, tickInterval, false, false, false); endTick = boundedTick } minorTicks = that._createTicks(minorTicks, tickInterval, startTick, endTick, false, false, needCorrectTick) } return minorTicks }, getTypes: function() { return { axisType: this._axisType, dataType: this._dataType } }, getData: function() { return { min: this._min, max: this._max, customTicks: this._customTicks, customMinorTicks: this._customMinorTicks, screenDelta: this._screenDelta } } } }, /*!*********************************************!*\ !*** ./js/viz/axes/numeric_tick_manager.js ***! \*********************************************/ function(module, exports, __webpack_require__) { var vizUtils = __webpack_require__( /*! ../core/utils */ 509), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), _isDefined = commonUtils.isDefined, _adjustValue = vizUtils.adjustValue, _math = Math, _abs = _math.abs, _ceil = _math.ceil, _floor = _math.floor, _noop = commonUtils.noop, MINOR_TICKS_COUNT_LIMIT = 200, DEFAULT_MINOR_NUMBER_MULTIPLIERS = [2, 4, 5, 8, 10]; exports.continuous = { _hasUnitBeginningTickCorrection: _noop, _correctMax: function(tickInterval) { this._max = this._adjustNumericTickValue(_ceil(this._max / tickInterval) * tickInterval, tickInterval, this._min) }, _correctMin: function(tickInterval) { this._min = this._adjustNumericTickValue(_floor(this._min / tickInterval) * tickInterval, tickInterval, this._min) }, _findBusinessDelta: function(min, max) { return _adjustValue(_abs(min - max)) }, _findTickIntervalForCustomTicks: function() { return _abs(this._customTicks[1] - this._customTicks[0]) }, _getBoundInterval: function() { var that = this, boundCoef = that._options.boundCoef; return _isDefined(boundCoef) && isFinite(boundCoef) ? that._tickInterval * _abs(boundCoef) : that._tickInterval / 2 }, _getInterval: function(deltaCoef, numberMultipliers) { var factor, newResult, i, interval = deltaCoef || this._getDeltaCoef(this._screenDelta, this._businessDelta, this._options.gridSpacingFactor), multipliers = numberMultipliers || this._options.numberMultipliers, result = 0, hasResult = false; if (interval > 1) { for (factor = 1; !hasResult; factor *= 10) { for (i = 0; i < multipliers.length; i++) { result = multipliers[i] * factor; if (interval <= result) { hasResult = true; break } } } } else { if (interval > 0) { result = 1; for (factor = .1; !hasResult; factor /= 10) { for (i = multipliers.length - 1; i >= 0; i--) { newResult = multipliers[i] * factor; if (interval > newResult) { hasResult = true; break } result = newResult } } } } return _adjustValue(result) }, _getDefaultMinorInterval: function(screenDelta, businessDelta) { var result, deltaCoef = this._getDeltaCoef(screenDelta, businessDelta, this._options.minorGridSpacingFactor), multipliers = DEFAULT_MINOR_NUMBER_MULTIPLIERS, i = multipliers.length - 1; for (i; i >= 0; i--) { result = businessDelta / multipliers[i]; if (deltaCoef <= result) { return _adjustValue(result) } } return 0 }, _getMinorInterval: function(screenDelta, businessDelta) { var interval, intervalsCount, count, that = this, options = that._options, minorTickInterval = options.minorTickInterval, minorTickCount = options.minorTickCount; if (isFinite(minorTickInterval) && that._isTickIntervalCorrect(minorTickInterval, MINOR_TICKS_COUNT_LIMIT, businessDelta)) { interval = minorTickInterval; count = interval < businessDelta ? _ceil(businessDelta / interval) - 1 : 0 } else { if (_isDefined(minorTickCount)) { intervalsCount = _isDefined(minorTickCount) ? minorTickCount + 1 : _floor(screenDelta / options.minorGridSpacingFactor); count = intervalsCount - 1; interval = count > 0 ? businessDelta / intervalsCount : 0 } else { interval = that._getDefaultMinorInterval(screenDelta, businessDelta); count = interval < businessDelta ? _floor(businessDelta / interval) - 1 : 0 } } that._minorTickInterval = interval; that._minorTickCount = count }, _getNextTickValue: function(value, tickInterval, isTickIntervalNegative) { tickInterval = _isDefined(isTickIntervalNegative) && isTickIntervalNegative ? -tickInterval : tickInterval; value += tickInterval; return this._adjustNumericTickValue(value, tickInterval, this._min) }, _isTickIntervalValid: function(tickInterval) { return _isDefined(tickInterval) && isFinite(tickInterval) && 0 !== tickInterval } } }, /*!**********************************************!*\ !*** ./js/viz/axes/datetime_tick_manager.js ***! \**********************************************/ function(module, exports, __webpack_require__) { var dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, tickManagerContinuous = __webpack_require__( /*! ./numeric_tick_manager */ 568).continuous, _isDefined = commonUtils.isDefined, _convertDateUnitToMilliseconds = dateUtils.convertDateUnitToMilliseconds, _correctDateWithUnitBeginning = dateUtils.correctDateWithUnitBeginning, _dateToMilliseconds = dateUtils.dateToMilliseconds, _convertMillisecondsToDateUnits = dateUtils.convertMillisecondsToDateUnits, _math = Math, _abs = _math.abs, _ceil = _math.ceil, _floor = _math.floor, MINOR_TICKS_COUNT_LIMIT = 50, DEFAULT_DATETIME_MULTIPLIERS = { millisecond: [1, 2, 5, 10, 25, 100, 250, 300, 500], second: [1, 2, 3, 5, 10, 15, 20, 30], minute: [1, 2, 3, 5, 10, 15, 20, 30], hour: [1, 2, 3, 4, 6, 8, 12], day: [1, 2, 3, 5, 7, 10, 14], month: [1, 2, 3, 6] }; function correctDate(date, tickInterval, correctionMethod) { var interval = _dateToMilliseconds(tickInterval), timezoneOffset = 60 * date.getTimezoneOffset() * 1e3; return new Date(Math[correctionMethod]((date - 0 - timezoneOffset) / interval) * interval + timezoneOffset) } exports.datetime = extend({}, tickManagerContinuous, { _correctMax: function(tickInterval) { this._max = correctDate(this._max, tickInterval, "ceil") }, _correctMin: function(tickInterval) { this._min = correctDate(this._min, tickInterval, "floor"); if (this._options.setTicksAtUnitBeginning) { this._min = _correctDateWithUnitBeginning(this._min, tickInterval) } }, _findTickIntervalForCustomTicks: function() { return _convertMillisecondsToDateUnits(_abs(this._customTicks[1] - this._customTicks[0])) }, _getBoundInterval: function() { var that = this, interval = that._tickInterval, intervalInMs = _dateToMilliseconds(interval), boundCoef = that._options.boundCoef, boundIntervalInMs = _isDefined(boundCoef) && isFinite(boundCoef) ? intervalInMs * _abs(boundCoef) : intervalInMs / 2; return _convertMillisecondsToDateUnits(boundIntervalInMs) }, _getInterval: function(deltaCoef) { var factor, i, key, specificMultipliers, yearsCount, interval = deltaCoef || this._getDeltaCoef(this._screenDelta, this._businessDelta, this._options.gridSpacingFactor), multipliers = this._options.numberMultipliers, result = {}; if (interval > 0 && interval < 1) { return { milliseconds: 1 } } if (0 === interval) { return 0 } for (key in DEFAULT_DATETIME_MULTIPLIERS) { if (DEFAULT_DATETIME_MULTIPLIERS.hasOwnProperty(key)) { specificMultipliers = DEFAULT_DATETIME_MULTIPLIERS[key]; for (i = 0; i < specificMultipliers.length; i++) { if (interval <= _convertDateUnitToMilliseconds(key, specificMultipliers[i])) { result[key + "s"] = specificMultipliers[i]; return result } } } } for (factor = 1;; factor *= 10) { for (i = 0; i < multipliers.length; i++) { yearsCount = factor * multipliers[i]; if (interval <= _convertDateUnitToMilliseconds("year", yearsCount)) { return { years: yearsCount } } } } }, _getMinorInterval: function(screenDelta, businessDelta) { var interval, intervalInMs, intervalsCount, count, that = this, options = that._options; if (_isDefined(options.minorTickInterval) && that._isTickIntervalCorrect(options.minorTickInterval, MINOR_TICKS_COUNT_LIMIT, businessDelta)) { interval = options.minorTickInterval; intervalInMs = _dateToMilliseconds(interval); count = intervalInMs < businessDelta ? _ceil(businessDelta / intervalInMs) - 1 : 0 } else { intervalsCount = _isDefined(options.minorTickCount) ? options.minorTickCount + 1 : _floor(screenDelta / options.minorGridSpacingFactor); count = intervalsCount - 1; interval = count > 0 ? _convertMillisecondsToDateUnits(businessDelta / intervalsCount) : 0 } that._minorTickInterval = interval; that._minorTickCount = count }, _getNextTickValue: function(value, tickInterval, isTickIntervalNegative, isTickIntervalWithPow, withCorrection) { var newValue = dateUtils.addInterval(value, tickInterval, isTickIntervalNegative); if (this._options.setTicksAtUnitBeginning && false !== withCorrection) { newValue = _correctDateWithUnitBeginning(newValue, tickInterval, true); this._correctDateWithUnitBeginningCalled = true } return newValue }, _getUnitBeginningMinorTicks: function(minorTicks) { var that = this, ticks = that._ticks, tickInterval = that._findMinorTickInterval(ticks[1], ticks[2]), isTickIntervalNegative = true, isTickIntervalWithPow = false, needCorrectTick = false, startTick = that._getNextTickValue(ticks[1], tickInterval, isTickIntervalNegative, isTickIntervalWithPow, needCorrectTick); if (that._isTickIntervalValid(tickInterval)) { minorTicks = that._createTicks(minorTicks, tickInterval, startTick, ticks[0], isTickIntervalNegative, isTickIntervalWithPow, needCorrectTick) } return minorTicks }, _hasUnitBeginningTickCorrection: function() { var ticks = this._ticks; if (ticks.length < 3) { return false } return ticks[1] - ticks[0] !== ticks[2] - ticks[1] && this._options.setTicksAtUnitBeginning && this._options.minorTickCount }, _isTickIntervalValid: function(tickInterval) { return _isDefined(tickInterval) && 0 !== _dateToMilliseconds(tickInterval) } }) }, /*!*************************************************!*\ !*** ./js/viz/axes/logarithmic_tick_manager.js ***! \*************************************************/ function(module, exports, __webpack_require__) { var vizUtils = __webpack_require__( /*! ../core/utils */ 509), dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), _isDefined = commonUtils.isDefined, _addInterval = dateUtils.addInterval, _adjustValue = vizUtils.adjustValue, tickManagerContinuous = __webpack_require__( /*! ./numeric_tick_manager */ 568).continuous, _getLog = vizUtils.getLog, _raiseTo = vizUtils.raiseTo, _math = Math, _abs = _math.abs, _ceil = _math.ceil, _floor = _math.floor, _round = _math.round; exports.logarithmic = extend({}, tickManagerContinuous, { _correctMax: function() { var base = this._options.base; this._max = _adjustValue(_raiseTo(_ceil(_adjustValue(_getLog(this._max, base))), base)) }, _correctMin: function() { var base = this._options.base; this._min = _adjustValue(_raiseTo(_floor(_adjustValue(_getLog(this._min, base))), base)) }, _findBusinessDelta: function(min, max, isTickIntervalWithPow) { var delta; if (min <= 0 || max <= 0) { return 0 } if (false === isTickIntervalWithPow) { delta = tickManagerContinuous._findBusinessDelta(min, max) } else { delta = _round(_abs(_getLog(min, this._options.base) - _getLog(max, this._options.base))) } return delta }, _findTickIntervalForCustomTicks: function() { return _adjustValue(_getLog(this._customTicks[1] / this._customTicks[0], this._options.base)) }, _getInterval: function(deltaCoef) { var factor, i, interval = deltaCoef || this._getDeltaCoef(this._screenDelta, this._businessDelta, this._options.gridSpacingFactor), multipliers = this._options.numberMultipliers, result = 0, hasResult = false; if (0 !== interval) { for (factor = 1; !hasResult; factor *= 10) { for (i = 0; i < multipliers.length; i++) { result = multipliers[i] * factor; if (interval <= result) { hasResult = true; break } } } } return _adjustValue(result) }, _getMinorInterval: function(screenDelta, businessDelta) { var that = this, options = that._options, minorTickCount = options.minorTickCount, intervalsCount = _isDefined(minorTickCount) ? minorTickCount + 1 : _floor(screenDelta / options.minorGridSpacingFactor), count = intervalsCount - 1, interval = count > 0 ? businessDelta / intervalsCount : 0; that._minorTickInterval = interval; that._minorTickCount = count }, _getNextTickValue: function(value, tickInterval, isTickIntervalNegative, isTickIntervalWithPow) { var pow, nextTickValue, that = this; tickInterval = _isDefined(isTickIntervalNegative) && isTickIntervalNegative ? -tickInterval : tickInterval; if (false === isTickIntervalWithPow) { nextTickValue = value + tickInterval } else { pow = _addInterval(_getLog(value, that._options.base), tickInterval, that._min > that._max); nextTickValue = _adjustValue(_raiseTo(pow, that._options.base)) } return nextTickValue } }) }, /*!********************************************!*\ !*** ./js/viz/translators/translator2d.js ***! \********************************************/ function(module, exports, __webpack_require__) { var _Translator2d, $ = __webpack_require__( /*! ../../core/renderer */ 9), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, numericTranslator = __webpack_require__( /*! ./numeric_translator */ 572), categoryTranslator = __webpack_require__( /*! ./category_translator */ 573), intervalTranslator = __webpack_require__( /*! ./interval_translator */ 574), datetimeTranslator = __webpack_require__( /*! ./datetime_translator */ 575), logarithmicTranslator = __webpack_require__( /*! ./logarithmic_translator */ 576), vizUtils = __webpack_require__( /*! ../core/utils */ 509), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), getLog = vizUtils.getLog, getPower = vizUtils.getPower, isDefined = commonUtils.isDefined, _abs = Math.abs, CANVAS_PROP = ["width", "height", "left", "top", "bottom", "right"], NUMBER_EQUALITY_CORRECTION = 1, DATETIME_EQUALITY_CORRECTION = 6e4, _noop = commonUtils.noop, addInterval = __webpack_require__( /*! ../../core/utils/date */ 63).addInterval; var validateCanvas = function(canvas) { $.each(CANVAS_PROP, function(_, prop) { canvas[prop] = parseInt(canvas[prop]) || 0 }); return canvas }; var makeCategoriesToPoints = function(categories) { var categoriesToPoints = {}; categories.forEach(function(item, i) { categoriesToPoints[item.valueOf()] = i }); return categoriesToPoints }; var validateBusinessRange = function(businessRange) { function validate(valueSelector, baseValueSelector) { if (!isDefined(businessRange[valueSelector]) && isDefined(businessRange[baseValueSelector])) { businessRange[valueSelector] = businessRange[baseValueSelector] } } validate("minVisible", "min"); validate("maxVisible", "max"); return businessRange }; function valuesIsDefinedAndEqual(val1, val2) { return isDefined(val1) && isDefined(val2) && val1.valueOf() === val2.valueOf() } function getCanvasBounds(range) { var newMin, newMax, min = range.min, max = range.max, minVisible = range.minVisible, maxVisible = range.maxVisible, base = range.base, isDateTime = commonUtils.isDate(max) || commonUtils.isDate(min), correction = isDateTime ? DATETIME_EQUALITY_CORRECTION : NUMBER_EQUALITY_CORRECTION, isLogarithmic = "logarithmic" === range.axisType; if (isLogarithmic) { maxVisible = getLog(maxVisible, base); minVisible = getLog(minVisible, base); min = getLog(min, base); max = getLog(max, base) } if (valuesIsDefinedAndEqual(min, max)) { newMin = min.valueOf() - correction; newMax = max.valueOf() + correction; if (isDateTime) { min = new Date(newMin); max = new Date(newMax) } else { min = 0 !== min || isLogarithmic ? newMin : 0; max = newMax } } if (valuesIsDefinedAndEqual(minVisible, maxVisible)) { newMin = minVisible.valueOf() - correction; newMax = maxVisible.valueOf() + correction; if (isDateTime) { minVisible = newMin < min.valueOf() ? min : new Date(newMin); maxVisible = newMax > max.valueOf() ? max : new Date(newMax) } else { if (0 !== minVisible || isLogarithmic) { minVisible = newMin < min ? min : newMin } maxVisible = newMax > max ? max : newMax } } return { base: base, rangeMin: min, rangeMax: max, rangeMinVisible: minVisible, rangeMaxVisible: maxVisible } } exports.Translator2D = _Translator2d = function(businessRange, canvas, options) { this.update(businessRange, canvas, options) }; _Translator2d.prototype = { constructor: _Translator2d, reinit: function() { var that = this, range = that._businessRange, categories = range.categories || [], script = {}, canvasOptions = that._prepareCanvasOptions(), visibleCategories = vizUtils.getCategoriesInfo(categories, range.minVisible, range.maxVisible).categories, categoriesLength = (visibleCategories || categories).length; switch (range.axisType) { case "logarithmic": script = logarithmicTranslator; break; case "semidiscrete": script = intervalTranslator; canvasOptions.ratioOfCanvasRange = canvasOptions.canvasLength / (addInterval(canvasOptions.rangeMaxVisible, that._options.interval) - canvasOptions.rangeMinVisible); break; case "discrete": script = categoryTranslator; that._categories = categories; canvasOptions.interval = that._getDiscreteInterval(range.addSpiderCategory ? categoriesLength + 1 : categoriesLength, canvasOptions); that._categoriesToPoints = makeCategoriesToPoints(categories, canvasOptions.invert); if (visibleCategories && categoriesLength) { canvasOptions.startPointIndex = that._categoriesToPoints[visibleCategories[0].valueOf()]; that.visibleCategories = visibleCategories } break; default: if ("datetime" === range.dataType) { script = datetimeTranslator } else { script = numericTranslator } } extend(that, script); that._conversionValue = that._options.conversionValue ? function(value) { return value } : function(value) { return Math.round(value) }; that._calculateSpecialValues() }, _getDiscreteInterval: function(categoriesLength, canvasOptions) { var correctedCategoriesCount = categoriesLength - (this._businessRange.stick ? 1 : 0); return correctedCategoriesCount > 0 ? canvasOptions.canvasLength / correctedCategoriesCount : canvasOptions.canvasLength }, _prepareCanvasOptions: function() { var length, that = this, businessRange = that._businessRange, canvasOptions = that._canvasOptions = getCanvasBounds(businessRange), canvas = that._canvas; if (that._options.isHorizontal) { canvasOptions.startPoint = canvas.left; length = canvas.width; canvasOptions.endPoint = canvas.width - canvas.right; canvasOptions.invert = businessRange.invert } else { canvasOptions.startPoint = canvas.top; length = canvas.height; canvasOptions.endPoint = canvas.height - canvas.bottom; canvasOptions.invert = !businessRange.invert } that.canvasLength = canvasOptions.canvasLength = canvasOptions.endPoint - canvasOptions.startPoint; canvasOptions.rangeDoubleError = Math.pow(10, getPower(canvasOptions.rangeMax - canvasOptions.rangeMin) - getPower(length) - 2); canvasOptions.ratioOfCanvasRange = canvasOptions.canvasLength / (canvasOptions.rangeMaxVisible - canvasOptions.rangeMinVisible); return canvasOptions }, updateCanvas: function(canvas) { this._canvas = validateCanvas(canvas); this.reinit() }, updateBusinessRange: function(businessRange) { this._businessRange = validateBusinessRange(businessRange); this.reinit() }, update: function(businessRange, canvas, options) { var that = this; that._options = extend(that._options || {}, options); that._canvas = validateCanvas(canvas); that.updateBusinessRange(businessRange) }, getBusinessRange: function() { return this._businessRange }, getCanvasVisibleArea: function() { return { min: this._canvasOptions.startPoint, max: this._canvasOptions.endPoint } }, _calculateSpecialValues: function() { var invert, canvas_position_default, canvas_position_center_middle, that = this, canvasOptions = that._canvasOptions, startPoint = canvasOptions.startPoint, endPoint = canvasOptions.endPoint, range = that._businessRange, minVisible = range.minVisible, maxVisible = range.maxVisible; if (minVisible <= 0 && maxVisible >= 0) { that.sc = {}; canvas_position_default = that.translate(0) } else { invert = range.invert ^ (minVisible <= 0 && maxVisible <= 0); if (that._options.isHorizontal) { canvas_position_default = invert ? endPoint : startPoint } else { canvas_position_default = invert ? startPoint : endPoint } } canvas_position_center_middle = startPoint + canvasOptions.canvasLength / 2; that.sc = { canvas_position_default: canvas_position_default, canvas_position_left: startPoint, canvas_position_top: startPoint, canvas_position_center: canvas_position_center_middle, canvas_position_middle: canvas_position_center_middle, canvas_position_right: endPoint, canvas_position_bottom: endPoint, canvas_position_start: canvasOptions.invert ? endPoint : startPoint, canvas_position_end: canvasOptions.invert ? startPoint : endPoint } }, translateSpecialCase: function(value) { return this.sc[value] }, _calculateProjection: function(distance) { var canvasOptions = this._canvasOptions; return canvasOptions.invert ? canvasOptions.endPoint - distance : canvasOptions.startPoint + distance }, _calculateUnProjection: function(distance) { var canvasOptions = this._canvasOptions; return canvasOptions.invert ? canvasOptions.rangeMaxVisible.valueOf() - distance : canvasOptions.rangeMinVisible.valueOf() + distance }, getVisibleCategories: function() { return this.visibleCategories }, getMinBarSize: function(minBarSize) { var visibleArea = this.getCanvasVisibleArea(), minValue = this.untranslate(visibleArea.min + minBarSize); return _abs(this.untranslate(visibleArea.min) - (!isDefined(minValue) ? this.untranslate(visibleArea.max) : minValue)) }, translate: _noop, untranslate: _noop, getInterval: _noop, zoom: _noop, getMinScale: _noop, getRange: function() { return [this.untranslate(this._canvasOptions.startPoint, -1), this.untranslate(this._canvasOptions.endPoint, 1)] }, isEmptyValueRange: function() { return this._businessRange.stubData }, getScreenRange: function() { return [this._canvasOptions.startPoint, this._canvasOptions.endPoint] }, add: function(value, diff, dir) { return this._add(value, diff, (this._businessRange.invert ? -1 : 1) * dir) } } }, /*!**************************************************!*\ !*** ./js/viz/translators/numeric_translator.js ***! \**************************************************/ function(module, exports, __webpack_require__) { var commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), isDefined = commonUtils.isDefined, round = Math.round; module.exports = { translate: function(bp) { var that = this, canvasOptions = that._canvasOptions, doubleError = canvasOptions.rangeDoubleError, specialValue = that.translateSpecialCase(bp); if (isDefined(specialValue)) { return specialValue } if (isNaN(bp) || bp.valueOf() + doubleError < canvasOptions.rangeMin || bp.valueOf() - doubleError > canvasOptions.rangeMax) { return null } return that._conversionValue(that._calculateProjection((bp - canvasOptions.rangeMinVisible) * canvasOptions.ratioOfCanvasRange)) }, untranslate: function(pos, _directionOffset, enableOutOfCanvas) { var canvasOptions = this._canvasOptions, startPoint = canvasOptions.startPoint; if (!enableOutOfCanvas && (pos < startPoint || pos > canvasOptions.endPoint) || !isDefined(canvasOptions.rangeMin) || !isDefined(canvasOptions.rangeMax)) { return null } return this._calculateUnProjection((pos - startPoint) / canvasOptions.ratioOfCanvasRange) }, getInterval: function() { return round(this._canvasOptions.ratioOfCanvasRange * (this._businessRange.interval || Math.abs(this._canvasOptions.rangeMax - this._canvasOptions.rangeMin))) }, _getValue: function(val) { return val }, zoom: function(translate, scale) { var that = this, canvasOptions = that._canvasOptions, startPoint = canvasOptions.startPoint, endPoint = canvasOptions.endPoint, newStart = (startPoint + translate) / scale, newEnd = (endPoint + translate) / scale, translatedRangeMinMax = [that.translate(that._getValue(canvasOptions.rangeMin)), that.translate(that._getValue(canvasOptions.rangeMax))], minPoint = Math.min(translatedRangeMinMax[0], translatedRangeMinMax[1]), maxPoint = Math.max(translatedRangeMinMax[0], translatedRangeMinMax[1]); if (minPoint > newStart) { newEnd -= newStart - minPoint; newStart = minPoint } if (maxPoint < newEnd) { newStart -= newEnd - maxPoint; newEnd = maxPoint } if (maxPoint - minPoint < newEnd - newStart) { newStart = minPoint; newEnd = maxPoint } translate = (endPoint - startPoint) * newStart / (newEnd - newStart) - startPoint; scale = (startPoint + translate) / newStart || 1; return { min: that.untranslate(newStart, void 0, true), max: that.untranslate(newEnd, void 0, true), translate: translate, scale: scale } }, getMinScale: function(zoom) { return zoom ? 1.1 : .9 }, getScale: function(val1, val2) { var canvasOptions = this._canvasOptions; val1 = isDefined(val1) ? val1 : canvasOptions.rangeMin; val2 = isDefined(val2) ? val2 : canvasOptions.rangeMax; return (canvasOptions.rangeMax - canvasOptions.rangeMin) / Math.abs(val1 - val2) }, isValid: function(value) { var co = this._canvasOptions; return null !== value && !isNaN(value) && value.valueOf() + co.rangeDoubleError >= co.rangeMin && value.valueOf() - co.rangeDoubleError <= co.rangeMax }, parse: function(value) { return Number(value) }, to: function(value) { return this._conversionValue(this._calculateProjection((value - this._canvasOptions.rangeMinVisible) * this._canvasOptions.ratioOfCanvasRange)) }, from: function(position) { return this._calculateUnProjection((position - this._canvasOptions.startPoint) / this._canvasOptions.ratioOfCanvasRange) }, _add: function(value, diff, coeff) { return value + diff * coeff }, isValueProlonged: false } }, /*!***************************************************!*\ !*** ./js/viz/translators/category_translator.js ***! \***************************************************/ function(module, exports, __webpack_require__) { var commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), isDefined = commonUtils.isDefined, round = Math.round; module.exports = { translate: function(category, directionOffset) { var stickDelta, that = this, canvasOptions = that._canvasOptions, categoryIndex = that._categoriesToPoints[category.valueOf()], specialValue = that.translateSpecialCase(category), startPointIndex = canvasOptions.startPointIndex || 0, stickInterval = that._businessRange.stick ? 0 : .5; if (isDefined(specialValue)) { return specialValue } if (!categoryIndex && 0 !== categoryIndex) { return null } directionOffset = directionOffset || 0; stickDelta = categoryIndex + stickInterval - startPointIndex + .5 * directionOffset; return round(that._calculateProjection(canvasOptions.interval * stickDelta)) }, untranslate: function(pos, directionOffset, enableOutOfCanvas) { var that = this, canvasOptions = that._canvasOptions, startPoint = canvasOptions.startPoint, categories = that.visibleCategories || that._categories, categoriesLength = categories.length, result = 0, stickInterval = that._businessRange.stick ? .5 : 0; if (!enableOutOfCanvas && (pos < startPoint || pos > canvasOptions.endPoint)) { return null } directionOffset = directionOffset || 0; result = round((pos - startPoint) / canvasOptions.interval + stickInterval - .5 - .5 * directionOffset); if (categoriesLength === result) { result-- } if (result === -1) { result = 0 } if (canvasOptions.invert) { result = categoriesLength - result - 1 } return categories[result] }, getInterval: function() { return this._canvasOptions.interval }, zoom: function(translate, scale) { var endCategoryIndex, newVisibleCategories, newInterval, that = this, canvasOptions = that._canvasOptions, stick = that._businessRange.stick, invert = canvasOptions.invert, interval = canvasOptions.interval * scale, translateCategories = translate / interval, startCategoryIndex = parseInt((canvasOptions.startPointIndex || 0) + translateCategories + .5), categoriesLength = parseInt(canvasOptions.canvasLength / interval + (stick ? 1 : 0)) || 1, categories = that._categories; if (invert) { startCategoryIndex = parseInt((canvasOptions.startPointIndex || 0) + (that.visibleCategories || []).length - translateCategories + .5) - categoriesLength } if (startCategoryIndex < 0) { startCategoryIndex = 0 } endCategoryIndex = startCategoryIndex + categoriesLength; if (endCategoryIndex > categories.length) { endCategoryIndex = categories.length; startCategoryIndex = endCategoryIndex - categoriesLength; if (startCategoryIndex < 0) { startCategoryIndex = 0 } } newVisibleCategories = categories.slice(parseInt(startCategoryIndex), parseInt(endCategoryIndex)); newInterval = that._getDiscreteInterval(newVisibleCategories.length, canvasOptions); scale = newInterval / canvasOptions.interval; translate = that.translate(!invert ? newVisibleCategories[0] : newVisibleCategories[newVisibleCategories.length - 1]) * scale - (canvasOptions.startPoint + (stick ? 0 : newInterval / 2)); return { min: newVisibleCategories[0], max: newVisibleCategories[newVisibleCategories.length - 1], translate: translate, scale: scale } }, getMinScale: function(zoom) { var that = this, canvasOptions = that._canvasOptions, categoriesLength = (that.visibleCategories || that._categories).length; categoriesLength += (parseInt(.1 * categoriesLength) || 1) * (zoom ? -2 : 2); return canvasOptions.canvasLength / (Math.max(categoriesLength, 1) * canvasOptions.interval) }, getScale: function(min, max) { var that = this, canvasOptions = that._canvasOptions, visibleArea = that.getCanvasVisibleArea(), stickOffset = !that._businessRange.stick && 1, minPoint = isDefined(min) ? that.translate(min, -stickOffset) : null, maxPoint = isDefined(max) ? that.translate(max, +stickOffset) : null; if (null === minPoint) { minPoint = canvasOptions.invert ? visibleArea.max : visibleArea.min } if (null === maxPoint) { maxPoint = canvasOptions.invert ? visibleArea.min : visibleArea.max } return that.canvasLength / Math.abs(maxPoint - minPoint) }, isValid: function(value) { return isDefined(value) ? this._categoriesToPoints[value.valueOf()] >= 0 : false }, parse: function(value) { return value }, to: function(value, direction) { var canvasOptions = this._canvasOptions, businessRange = this._businessRange, categoryIndex = this._categoriesToPoints[value.valueOf()], startPointIndex = canvasOptions.startPointIndex || 0, stickInterval = businessRange.stick ? 0 : .5, stickDelta = categoryIndex + stickInterval - startPointIndex + (businessRange.invert ? -1 : 1) * direction * .5; return round(this._calculateProjection(canvasOptions.interval * stickDelta)) }, from: function(position, direction) { var canvasOptions = this._canvasOptions, businessRange = this._businessRange, startPoint = canvasOptions.startPoint, categories = this._categories, categoriesLength = categories.length, stickInterval = businessRange.stick ? .5 : 0, result = round((position - startPoint) / canvasOptions.interval + stickInterval - .5 - .5 * direction); if (categoriesLength === result) { result-- } if (result === -1) { result = 0 } if (canvasOptions.invert) { result = categoriesLength - result - 1 } return categories[result] }, _add: function() { return NaN }, isValueProlonged: true } }, /*!***************************************************!*\ !*** ./js/viz/translators/interval_translator.js ***! \***************************************************/ function(module, exports, __webpack_require__) { var adjustValue = __webpack_require__( /*! ../core/utils */ 509).adjustValue, commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), isNumber = commonUtils.isNumeric, isDefined = commonUtils.isDefined, dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63), addInterval = dateUtils.addInterval, dateToMilliseconds = dateUtils.dateToMilliseconds, floor = Math.floor; module.exports = { _intervalize: function(value, interval) { if (!isDefined(value)) { return } if ("datetime" === this._businessRange.dataType) { if (isNumber(value)) { value = new Date(value) } else { value = new Date(value.getTime()) } value = dateUtils.correctDateWithUnitBeginning(value, interval) } else { value = adjustValue(floor(value / interval) * interval) } return value }, translate: function(bp, direction, interval) { var that = this, specialValue = that.translateSpecialCase(bp); if (isDefined(specialValue)) { return specialValue } interval = interval || that._options.interval; if (!that.isValid(bp, interval)) { return null } return that.to(bp, direction, interval) }, untranslate: function(pos, direction, enableOutOfCanvas) { var canvasOptions = this._canvasOptions, startPoint = canvasOptions.startPoint; if (!enableOutOfCanvas && (pos < startPoint || pos > canvasOptions.endPoint) || !isDefined(canvasOptions.rangeMin) || !isDefined(canvasOptions.rangeMax)) { return null } return this.from(pos, direction) }, getInterval: function() { return Math.round(this._canvasOptions.ratioOfCanvasRange * (this._businessRange.interval || Math.abs(this._canvasOptions.rangeMax - this._canvasOptions.rangeMin))) }, _getValue: function() {}, zoom: function() {}, getMinScale: function() {}, getScale: function() {}, isValid: function(value, interval) { var that = this, co = that._canvasOptions, rangeMin = co.rangeMin, rangeMax = co.rangeMax; interval = interval || that._options.interval; if (null === value || isNaN(value)) { return false } value = "datetime" === that._businessRange.dataType && isNumber(value) ? new Date(value) : value; if (interval !== that._options.interval) { rangeMin = that._intervalize(rangeMin, interval); rangeMax = that._intervalize(rangeMax, interval) } if (value.valueOf() < rangeMin || value.valueOf() >= addInterval(rangeMax, interval)) { return false } return true }, parse: function(value) { return "datetime" === this._businessRange.dataType ? isNumber(value) ? new Date(value) : value : Number(value) }, to: function(bp, direction, interval) { var that = this; interval = interval || that._options.interval; var v1 = that._intervalize(bp, interval), v2 = addInterval(v1, interval), res = that._to(v1), p2 = that._to(v2); if (!direction) { res = floor((res + p2) / 2) } else { if (direction > 0) { res = p2 } } return res }, _to: function(value) { var co = this._canvasOptions, rMin = co.rangeMinVisible, rMax = co.rangeMaxVisible, offset = value - rMin; if (value < rMin) { offset = 0 } else { if (value > rMax) { offset = addInterval(rMax, this._options.interval) - rMin } } return this._conversionValue(this._calculateProjection(offset * this._canvasOptions.ratioOfCanvasRange)) }, from: function(position, direction) { var value, that = this, origInterval = that._options.interval, interval = origInterval, co = that._canvasOptions, rMin = co.rangeMinVisible, rMax = co.rangeMaxVisible; if ("datetime" === that._businessRange.dataType) { interval = dateToMilliseconds(origInterval) } value = that._calculateUnProjection((position - that._canvasOptions.startPoint) / that._canvasOptions.ratioOfCanvasRange); value = that._intervalize(addInterval(value, interval / 2, direction > 0), origInterval); if (value < rMin) { value = rMin } else { if (value > rMax) { value = rMax } } return value }, _add: function() { return NaN }, isValueProlonged: true } }, /*!***************************************************!*\ !*** ./js/viz/translators/datetime_translator.js ***! \***************************************************/ function(module, exports, __webpack_require__) { var numericTranslator = __webpack_require__( /*! ./numeric_translator */ 572); module.exports = { translate: numericTranslator.translate, untranslate: function() { var result = numericTranslator.untranslate.apply(this, arguments); return null === result ? result : new Date(result) }, _getValue: numericTranslator._getValue, getInterval: numericTranslator.getInterval, zoom: numericTranslator.zoom, getMinScale: numericTranslator.getMinScale, getScale: numericTranslator.getScale, isValid: function(value) { return numericTranslator.isValid.call(this, new Date(value)) }, parse: function(value) { return new Date(value) }, to: numericTranslator.to, from: function(position) { return new Date(numericTranslator.from.call(this, position)) }, _add: __webpack_require__( /*! ../../core/utils/date */ 63).addDateInterval, isValueProlonged: numericTranslator.isValueProlonged } }, /*!******************************************************!*\ !*** ./js/viz/translators/logarithmic_translator.js ***! \******************************************************/ function(module, exports, __webpack_require__) { var numericTranslator = __webpack_require__( /*! ./numeric_translator */ 572), vizUtils = __webpack_require__( /*! ../core/utils */ 509), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), raiseTo = vizUtils.raiseTo, getLog = vizUtils.getLog; module.exports = { translate: function(bp) { var that = this, specialValue = that.translateSpecialCase(bp); if (commonUtils.isDefined(specialValue)) { return specialValue } return numericTranslator.translate.call(that, getLog(bp, that._businessRange.base)) }, untranslate: function() { var result = numericTranslator.untranslate.apply(this, arguments); return null === result ? result : raiseTo(result, this._businessRange.base) }, getInterval: numericTranslator.getInterval, _getValue: function(value) { return Math.pow(this._canvasOptions.base, value) }, zoom: numericTranslator.zoom, getMinScale: numericTranslator.getMinScale, getScale: function(val1, val2) { var base = this._businessRange.base; val1 = commonUtils.isDefined(val1) ? getLog(val1, base) : void 0; val2 = commonUtils.isDefined(val2) ? getLog(val2, base) : void 0; return numericTranslator.getScale.call(this, val1, val2) }, isValid: function(value) { return numericTranslator.isValid.call(this, getLog(value, this._businessRange.base)) }, parse: numericTranslator.parse, to: function(value) { return numericTranslator.to.call(this, getLog(value, this._businessRange.base)) }, from: function(position) { return raiseTo(numericTranslator.from.call(this, position), this._businessRange.base) }, _add: function(value, diff, dir) { var b = this._businessRange.base; return raiseTo(numericTranslator._add(getLog(value, b), diff, dir), b) }, isValueProlonged: numericTranslator.isValueProlonged } }, /*!*****************************!*\ !*** ./js/viz/axes/tick.js ***! \*****************************/ function(module, exports, __webpack_require__) { var isDefined = __webpack_require__( /*! ../../core/utils/common */ 14).isDefined, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, constants = __webpack_require__( /*! ./axes_constants */ 566); function getPathStyle(options) { return { stroke: options.color, "stroke-width": options.width, "stroke-opacity": options.opacity } } function createTick(axis, renderer, tickOptions, gridOptions, skippedCategory, skipLabels, offset) { var tickOffset = offset || axis._tickOffset, lineGroup = axis._axisLineGroup, elementsGroup = axis._axisElementsGroup, tickStyle = getPathStyle(tickOptions), gridStyle = getPathStyle(gridOptions), emptyStrRegExp = /^\s+$/, axisOptions = axis.getOptions(), labelOptions = axisOptions.label, labelStyle = axis._textOptions; function getLabelFontStyle(tick) { var fontStyle = axis._textFontStyles, customizeColor = labelOptions.customizeColor; if (customizeColor && customizeColor.call) { fontStyle = extend({}, axis._textFontStyles, { fill: customizeColor.call(tick, tick) }) } return fontStyle } return function(value) { var tick = { value: value, initCoords: function() { this.coords = axis._getTranslatedValue(value, tickOffset) }, drawMark: function() { if (!tickOptions.visible || skippedCategory === value) { return } if (this.withoutPath) { return } this.mark = axis._createPathElement([], tickStyle).append(lineGroup); this.updateTickPosition() }, updateTickPosition: function() { if (!this.mark) { return } this.mark.attr({ points: axis._getTickMarkPoints(tick, tickOptions.length) }); this.coords.angle && axis._rotateTick(this.mark, this.coords) }, drawLabel: function() { if (!labelOptions.visible || skipLabels) { return } if (this.withoutLabel) { return } var labelHint, axisBounds = { min: axis._minBound, max: axis._maxBound }, text = constants.formatLabel(value, labelOptions, axisBounds); if (isDefined(text) && "" !== text && !emptyStrRegExp.test(text)) { this.label = renderer.text(text).css(getLabelFontStyle(this)).attr(labelStyle).data("chart-data-argument", this.value).append(elementsGroup); this.updateLabelPosition(); labelHint = constants.formatHint(this.value, labelOptions, axisBounds); if (isDefined(labelHint) && "" !== labelHint) { this.label.setTitle(labelHint) } } }, updateLabelPosition: function() { if (!this.label) { return } var coords = axis._getTranslatedValue(value); this.labelCoords = coords; this.label.attr({ x: coords.x, y: coords.y }) }, drawGrid: function(drawLine) { if (gridOptions.visible && skippedCategory !== this.value) { this.grid = drawLine(this, gridStyle); this.grid && this.grid.append(axis._axisGridGroup) } }, updateGridPosition: function(updateLine) { this.grid && this.grid.attr(axis._getGridPoints(tick.coords)) } }; return tick } } exports.tick = createTick }, /*!********************************!*\ !*** ./js/viz/axes/xy_axes.js ***! \********************************/ function(module, exports, __webpack_require__) { var formatHelper = __webpack_require__( /*! ../../format_helper */ 66), dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, getNextDateUnit = dateUtils.getNextDateUnit, correctDateWithUnitBeginning = dateUtils.correctDateWithUnitBeginning, commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), vizUtils = __webpack_require__( /*! ../core/utils */ 509), _isDefined = commonUtils.isDefined, constants = __webpack_require__( /*! ./axes_constants */ 566), _extend = extend, _math = Math, _max = _math.max, TOP = constants.top, BOTTOM = constants.bottom, LEFT = constants.left, RIGHT = constants.right, CENTER = constants.center; function prepareDatesDifferences(datesDifferences, tickInterval) { var dateUnitInterval, i; if ("week" === tickInterval) { tickInterval = "day" } if ("quarter" === tickInterval) { tickInterval = "month" } if (datesDifferences[tickInterval]) { for (i = 0; i < dateUtils.dateUnitIntervals.length; i++) { dateUnitInterval = dateUtils.dateUnitIntervals[i]; if (datesDifferences[dateUnitInterval]) { datesDifferences[dateUnitInterval] = false; datesDifferences.count-- } if (dateUnitInterval === tickInterval) { break } } } } function getMarkerDates(min, max, markerInterval) { var dates, origMin = min; min = correctDateWithUnitBeginning(min, markerInterval); max = correctDateWithUnitBeginning(max, markerInterval); dates = dateUtils.getSequenceByInterval(min, max, markerInterval); if (dates.length && origMin > dates[0]) { dates = dates.slice(1) } return dates } function getStripHorizontalAlignmentPosition(alignment) { var position = "start"; if ("center" === alignment) { position = "center" } if ("right" === alignment) { position = "end" } return position } function getStripVerticalAlignmentPosition(alignment) { var position = "start"; if ("center" === alignment) { position = "center" } if ("bottom" === alignment) { position = "end" } return position } function getMarkerInterval(tickInterval) { var markerInterval = getNextDateUnit(tickInterval); if ("quarter" === markerInterval) { markerInterval = getNextDateUnit(markerInterval) } return markerInterval } function getMarkerFormat(curDate, prevDate, tickInterval, markerInterval) { var format = markerInterval, datesDifferences = prevDate && dateUtils.getDatesDifferences(prevDate, curDate); if (prevDate && "year" !== tickInterval) { prepareDatesDifferences(datesDifferences, tickInterval); format = formatHelper.getDateFormatByDifferences(datesDifferences) } return format } function getMaxSide(act, boxes) { return boxes.reduce(function(prevValue, box) { return _max(prevValue, act(box)) }, 0) } function getDistanceByAngle(bBox, rotationAngle) { rotationAngle = _math.abs(rotationAngle); rotationAngle = rotationAngle % 180 >= 90 ? 90 - rotationAngle % 90 : rotationAngle % 90; var a = rotationAngle * (_math.PI / 180); if (a >= _math.atan(bBox.height / bBox.width)) { return bBox.height / _math.abs(_math.sin(a)) } else { return bBox.width } } function getMaxConstantLinePadding(constantLines) { return constantLines.reduce(function(padding, options) { return _max(padding, options.paddingTopBottom) }, 0) } function getConstantLineLabelMarginForVerticalAlignment(constantLines, alignment, labelHeight) { return constantLines.some(function(options) { return options.label.verticalAlignment === alignment }) && labelHeight || 0 } function getLeftMargin(bBox) { return _math.abs(bBox.x) || 0 } function getRightMargin(bBox) { return _math.abs(bBox.width - _math.abs(bBox.x)) || 0 } module.exports = { linear: { _getStep: function(boxes, rotationAngle) { var spacing = this._options.label.minSpacing, func = this._isHorizontal ? function(box) { return box.width + spacing } : function(box) { return box.height }, maxLabelLength = getMaxSide(func, boxes); if (rotationAngle) { maxLabelLength = getDistanceByAngle({ width: maxLabelLength, height: this._getMaxLabelHeight(false, boxes, 0) }, rotationAngle) } return constants.getTicksCountInRange(this._majorTicks, this._isHorizontal ? "x" : "y", maxLabelLength) }, _getMaxLabelHeight: function(isNegative, boxes, spacing) { return (isNegative ? -1 : 1) * (getMaxSide(function(box) { return box.height }, boxes) + spacing) }, _validateOverlappingMode: function(mode, displayMode) { if (this._isHorizontal && ("rotate" === displayMode || "stagger" === displayMode) || !this._isHorizontal) { return constants.validateOverlappingMode(mode) } return mode }, _validateDisplayMode: function(mode) { return this._isHorizontal ? mode : "standard" }, getMarkerTrackers: function() { return this._markerTrackers }, _getSharpParam: function(opposite) { return this._isHorizontal ^ opposite ? "h" : "v" }, _createAxisElement: function() { return this._renderer.path([], "line") }, _updateAxisElementPosition: function() { if (!this._axisElement) { return } var axisCoord = this._axisPosition, canvas = this._getCanvasStartEnd(); this._axisElement.attr({ points: this._isHorizontal ? [canvas.start, axisCoord, canvas.end, axisCoord] : [axisCoord, canvas.start, axisCoord, canvas.end] }) }, _getTranslatedCoord: function(value, offset) { return this._translator.translate(value, offset) }, _getCanvasStartEnd: function() { var isHorizontal = this._isHorizontal, canvas = this._canvas, invert = this._translator.getBusinessRange().invert, coords = isHorizontal ? [canvas.left, canvas.width - canvas.right] : [canvas.height - canvas.bottom, canvas.top]; invert && coords.reverse(); return { start: coords[0], end: coords[1] } }, _getScreenDelta: function() { var canvas = this._getCanvasStartEnd(); return _math.abs(canvas.start - canvas.end) }, _initAxisPositions: function() { var that = this, position = that._options.position; that._axisPosition = that._orthogonalPositions["top" === position || "left" === position ? "start" : "end"] }, _getTickMarkPoints: function(tick, length) { var coords = tick.coords, isHorizontal = this._isHorizontal, tickCorrection = { left: -1, top: -1, right: 0, bottom: 0, center: -.5 }[this._options.tickOrientation || "center"]; return [coords.x + (isHorizontal ? 0 : tickCorrection * length), coords.y + (isHorizontal ? tickCorrection * length : 0), coords.x + (isHorizontal ? 0 : tickCorrection * length + length), coords.y + (isHorizontal ? tickCorrection * length + length : 0)] }, _getTitleCoords: function() { var that = this, x = that._axisPosition, y = that._axisPosition, canvas = that._getCanvasStartEnd(), center = canvas.start + (canvas.end - canvas.start) / 2; if (that._isHorizontal) { x = center } else { y = center } return { x: x, y: y } }, _drawTitleText: function(group, coords) { var options = this._options, titleOptions = options.title, attrs = { opacity: titleOptions.opacity, align: "center" }; if (!titleOptions.text || !group) { return } coords = coords || this._getTitleCoords(); if (!this._isHorizontal) { attrs.rotate = options.position === LEFT ? 270 : 90 } var text = this._renderer.text(titleOptions.text, coords.x, coords.y).css(vizUtils.patchFontOptions(titleOptions.font)).attr(attrs).append(group); return text }, _updateTitleCoords: function() { this._title && this._title.element.attr(this._getTitleCoords()) }, _drawTitle: function() { var title = this._drawTitleText(this._axisTitleGroup); if (title) { this._title = { element: title } } }, _measureTitle: function() { if (this._title) { this._title.bBox = this._title.element.getBBox() } }, _drawDateMarker: function(date, options) { var text, pathElement, that = this, markerOptions = that._options.marker, invert = that._translator.getBusinessRange().invert, textIndent = markerOptions.width + markerOptions.textLeftIndent; if (null === options.x) { return } if (!options.withoutStick) { pathElement = that._renderer.path([options.x, options.y, options.x, options.y + markerOptions.separatorHeight], "line").attr({ "stroke-width": markerOptions.width, stroke: markerOptions.color, "stroke-opacity": markerOptions.opacity, sharp: "h" }).append(that._axisElementsGroup) } text = String(constants.formatLabel(date, options.labelFormat)); return { date: date, x: options.x, y: options.y, cropped: options.withoutStick, label: that._renderer.text(text, options.x, options.y).css(vizUtils.patchFontOptions(markerOptions.label.font)).append(that._axisElementsGroup), line: pathElement, getEnd: function() { return this.x + (invert ? -1 : 1) * (textIndent + this.labelBBox.width) }, setTitle: function() { this.title = text }, hideLabel: function() { this.label.dispose(); this.label = null; this.title = text }, hide: function() { if (pathElement) { pathElement.dispose(); pathElement = null } this.label.dispose(); this.label = null; this.hidden = true } } }, _drawDateMarkers: function() { var tickInterval, markerInterval, markerDates, markersAreaTop, dateMarker, that = this, options = that._options, translator = that._translator, minBound = that._minBound, dateMarkers = []; function draw(markerDate, format, withoutStick) { return that._drawDateMarker(markerDate, { x: translator.translate(markerDate), y: markersAreaTop, labelFormat: that._getLabelFormatOptions(format), withoutStick: withoutStick }) } if (!options.marker.visible || "datetime" !== options.argumentType || "discrete" === options.type || that._majorTicks.length <= 1) { return [] } markersAreaTop = that._axisPosition + options.marker.topIndent; tickInterval = dateUtils.getDateUnitInterval(this._tickManager.getTickInterval()); markerInterval = getMarkerInterval(tickInterval); markerDates = getMarkerDates(minBound, that._maxBound, markerInterval); if (markerDates.length > 1 || 1 === markerDates.length && minBound < markerDates[0]) { dateMarkers = markerDates.reduce(function(markers, curDate, i, dates) { var marker = draw(curDate, getMarkerFormat(curDate, dates[i - 1] || minBound < curDate && minBound, tickInterval, markerInterval)); marker && markers.push(marker); return markers }, []); if (minBound < markerDates[0]) { dateMarker = draw(minBound, getMarkerFormat(minBound, markerDates[0], tickInterval, markerInterval), true); dateMarker && dateMarkers.unshift(dateMarker) } } return dateMarkers }, _adjustDateMarkers: function(offset) { offset = offset || 0; var that = this, markerOptions = this._options.marker, textIndent = markerOptions.width + markerOptions.textLeftIndent, invert = this._translator.getBusinessRange().invert, canvas = that._getCanvasStartEnd(), dateMarkers = this._dateMarkers; if (!dateMarkers.length) { return offset } if (dateMarkers[0].cropped) { if (!this._checkMarkersPosition(invert, dateMarkers[1], dateMarkers[0])) { dateMarkers[0].hideLabel() } } var prevDateMarker; dateMarkers.forEach(function(marker, i, markers) { if (marker.cropped) { return } if (invert ? marker.getEnd() < canvas.end : marker.getEnd() > canvas.end) { marker.hideLabel() } else { if (that._checkMarkersPosition(invert, marker, prevDateMarker)) { prevDateMarker = marker } else { marker.hide() } } }); this._dateMarkers.forEach(function(marker) { if (marker.label) { var labelBBox = marker.labelBBox, dy = marker.y + markerOptions.textTopIndent - labelBBox.y; marker.label.attr({ translateX: invert ? marker.x - textIndent - labelBBox.x - labelBBox.width : marker.x + textIndent - labelBBox.x, translateY: dy + offset }) } if (marker.line) { marker.line.attr({ translateY: offset }) } }); that._initializeMarkersTrackers(offset); return offset + markerOptions.topIndent + markerOptions.separatorHeight }, _checkMarkersPosition: function(invert, dateMarker, prevDateMarker) { if (void 0 === prevDateMarker) { return true } return invert ? dateMarker.x < prevDateMarker.getEnd() : dateMarker.x > prevDateMarker.getEnd() }, _initializeMarkersTrackers: function(offset) { var that = this, separatorHeight = that._options.marker.separatorHeight, renderer = that._renderer, businessRange = this._translator.getBusinessRange(), canvas = that._getCanvasStartEnd(), group = that._axisElementsGroup; that._markerTrackers = this._dateMarkers.filter(function(marker) { return !marker.hidden }).map(function(marker, i, markers) { var nextMarker = markers[i + 1] || { x: canvas.end, date: businessRange.max }, x = marker.x, y = marker.y + offset, markerTracker = renderer.path([x, y, x, y + separatorHeight, nextMarker.x, y + separatorHeight, nextMarker.x, y, x, y], "area").attr({ "stroke-width": 1, stroke: "grey", fill: "grey", opacity: 1e-4 }).append(group); markerTracker.data("range", { startValue: marker.date, endValue: nextMarker.date }); if (marker.title) { markerTracker.setTitle(marker.title) } return markerTracker }) }, _getLabelFormatOptions: function(formatString) { var that = this, markerLabelOptions = that._markerLabelOptions; if (!markerLabelOptions) { that._markerLabelOptions = markerLabelOptions = _extend(true, {}, that._options.marker.label) } if (!_isDefined(that._options.marker.label.format)) { markerLabelOptions.format = formatString } return markerLabelOptions }, _adjustConstantLineLabels: function(constantLines) { var that = this, axisPosition = that._options.position, canvas = that.getCanvas(), canvasLeft = canvas.left, canvasRight = canvas.width - canvas.right, canvasTop = canvas.top, canvasBottom = canvas.height - canvas.bottom, verticalCenter = canvasTop + (canvasBottom - canvasTop) / 2, horizontalCenter = canvasLeft + (canvasRight - canvasLeft) / 2, maxLabel = 0; constantLines.forEach(function(item) { var translateX, translateY, isHorizontal = that._isHorizontal, linesOptions = item.options, paddingTopBottom = linesOptions.paddingTopBottom, paddingLeftRight = linesOptions.paddingLeftRight, labelOptions = linesOptions.label, labelVerticalAlignment = labelOptions.verticalAlignment, labelHorizontalAlignment = labelOptions.horizontalAlignment, labelIsInside = "inside" === labelOptions.position, label = item.label, box = item.labelBBox; if (null === label) { return } if (isHorizontal) { if (labelIsInside) { if (labelHorizontalAlignment === LEFT) { translateX = item.coord - paddingLeftRight - box.x - box.width } else { translateX = item.coord + paddingLeftRight - box.x } switch (labelVerticalAlignment) { case CENTER: translateY = verticalCenter - box.y - box.height / 2; break; case BOTTOM: translateY = canvasBottom - paddingTopBottom - box.y - box.height; break; default: translateY = canvasTop + paddingTopBottom - box.y } } else { if (axisPosition === labelVerticalAlignment) { maxLabel = _max(maxLabel, box.height + paddingTopBottom) } translateX = item.coord - box.x - box.width / 2; if (labelVerticalAlignment === BOTTOM) { translateY = canvasBottom + paddingTopBottom - box.y } else { translateY = canvasTop - paddingTopBottom - box.y - box.height } } } else { if (labelIsInside) { if (labelVerticalAlignment === BOTTOM) { translateY = item.coord + paddingTopBottom - box.y } else { translateY = item.coord - paddingTopBottom - box.y - box.height } switch (labelHorizontalAlignment) { case CENTER: translateX = horizontalCenter - box.x - box.width / 2; break; case RIGHT: translateX = canvasRight - paddingLeftRight - box.x - box.width; break; default: translateX = canvasLeft + paddingLeftRight - box.x } } else { if (axisPosition === labelHorizontalAlignment) { maxLabel = _max(maxLabel, box.width + paddingLeftRight) } translateY = item.coord - box.y - box.height / 2; if (labelHorizontalAlignment === RIGHT) { translateX = canvasRight + paddingLeftRight - box.x } else { translateX = canvasLeft - paddingLeftRight - box.x - box.width } } } label.attr({ translateX: translateX, translateY: translateY }) }); return maxLabel }, _drawConstantLinesForEstimating: function(constantLines) { var that = this, renderer = this._renderer, group = renderer.g(); constantLines.forEach(function(options) { that._drawConstantLineLabelText(options.label.text, 0, 0, options.label, group).attr({ align: "center" }) }); return group.append(renderer.root) }, _estimateLabelHeight: function(bBox, labelOptions) { var height = bBox.height, drawingType = labelOptions.drawingType; if ("stagger" === this._validateDisplayMode(drawingType) || "stagger" === this._validateOverlappingMode(labelOptions.overlappingBehavior, drawingType)) { height = 2 * height + labelOptions.staggeringSpacing } if ("rotate" === this._validateDisplayMode(drawingType) || "rotate" === this._validateOverlappingMode(labelOptions.overlappingBehavior, drawingType)) { var sinCos = vizUtils.getCosAndSin(labelOptions.rotationAngle); height = height * sinCos.cos + bBox.width * sinCos.sin } return height && (height + labelOptions.indentFromAxis || 0) || 0 }, _estimateLabelFormat: function(canvas) { this.updateCanvas(canvas); this._updateTickManager(); this._tickManager.getTicks(); this._correctLabelFormat() }, estimateMargins: function(canvas) { this._estimateLabelFormat(canvas); var that = this, options = this._options, constantLineOptions = (options.constantLines || []).filter(function(options) { that._checkAlignmentConstantLineLabels(options.label); return "outside" === options.label.position && options.label.visible }), rootElement = that._renderer.root, businessRange = that._translator.getBusinessRange(), labelIsVisible = options.label.visible && !that._translator.getBusinessRange().stubData, labelValue = labelIsVisible && constants.formatLabel("discrete" === businessRange.axisType ? businessRange.categories[0] : businessRange.max, options.label), labelElement = labelIsVisible && that._renderer.text(labelValue, 0, 0).css(that._textFontStyles).attr(that._textOptions).append(rootElement), titleElement = that._drawTitleText(rootElement, { x: 0, y: 0 }), constantLinesLabelsElement = that._drawConstantLinesForEstimating(constantLineOptions), labelBox = labelElement && labelElement.getBBox() || { x: 0, y: 0, width: 0, height: 0 }, titleBox = titleElement && titleElement.getBBox() || { x: 0, y: 0, width: 0, height: 0 }, constantLinesBox = constantLinesLabelsElement.getBBox(), titleHeight = titleBox.height ? titleBox.height + options.title.margin : 0, labelHeight = that._estimateLabelHeight(labelBox, options.label), constantLinesHeight = constantLinesBox.height ? constantLinesBox.height + getMaxConstantLinePadding(constantLineOptions) : 0, height = labelHeight + titleHeight, margins = { left: _max(getLeftMargin(labelBox), getLeftMargin(constantLinesBox)), right: _max(getRightMargin(labelBox), getRightMargin(constantLinesBox)), top: ("top" === options.position ? height : 0) + getConstantLineLabelMarginForVerticalAlignment(constantLineOptions, "top", constantLinesHeight), bottom: ("top" !== options.position ? height : 0) + getConstantLineLabelMarginForVerticalAlignment(constantLineOptions, "bottom", constantLinesHeight) }; labelElement && labelElement.remove(); titleElement && titleElement.remove(); constantLinesLabelsElement && constantLinesLabelsElement.remove(); return margins }, _checkAlignmentConstantLineLabels: function(labelOptions) { var position = labelOptions.position, verticalAlignment = (labelOptions.verticalAlignment || "").toLowerCase(), horizontalAlignment = (labelOptions.horizontalAlignment || "").toLowerCase(); if (this._isHorizontal) { if ("outside" === position) { verticalAlignment = verticalAlignment === BOTTOM ? BOTTOM : TOP; horizontalAlignment = CENTER } else { verticalAlignment = verticalAlignment === CENTER ? CENTER : verticalAlignment === BOTTOM ? BOTTOM : TOP; horizontalAlignment = horizontalAlignment === LEFT ? LEFT : RIGHT } } else { if ("outside" === position) { verticalAlignment = CENTER; horizontalAlignment = horizontalAlignment === LEFT ? LEFT : RIGHT } else { verticalAlignment = verticalAlignment === BOTTOM ? BOTTOM : TOP; horizontalAlignment = horizontalAlignment === RIGHT ? RIGHT : horizontalAlignment === CENTER ? CENTER : LEFT } } labelOptions.verticalAlignment = verticalAlignment; labelOptions.horizontalAlignment = horizontalAlignment }, _getConstantLineLabelsCoords: function(value, lineLabelOptions) { var that = this, x = value, y = value; if (that._isHorizontal) { y = that._orthogonalPositions["top" === lineLabelOptions.verticalAlignment ? "start" : "end"] } else { x = that._orthogonalPositions["right" === lineLabelOptions.horizontalAlignment ? "end" : "start"] } return { x: x, y: y } }, _getAdjustedStripLabelCoords: function(strip) { var stripOptions = strip.options, paddingTopBottom = stripOptions.paddingTopBottom, paddingLeftRight = stripOptions.paddingLeftRight, horizontalAlignment = stripOptions.label.horizontalAlignment, verticalAlignment = stripOptions.label.verticalAlignment, box = strip.labelBBox, labelHeight = box.height, labelWidth = box.width, labelCoords = strip.labelCoords, y = labelCoords.y - box.y, x = labelCoords.x - box.x; if (verticalAlignment === TOP) { y += paddingTopBottom } else { if (verticalAlignment === CENTER) { y -= labelHeight / 2 } else { if (verticalAlignment === BOTTOM) { y -= paddingTopBottom + labelHeight } } } if (horizontalAlignment === LEFT) { x += paddingLeftRight } else { if (horizontalAlignment === CENTER) { x -= labelWidth / 2 } else { if (horizontalAlignment === RIGHT) { x -= paddingLeftRight + labelWidth } } } return { translateX: x, translateY: y } }, _adjustTitle: function(offset) { offset = offset || 0; if (!this._title) { return } var that = this, options = that._options, position = options.position, margin = options.title.margin, title = that._title, boxTitle = title.bBox, x = boxTitle.x, y = boxTitle.y, width = boxTitle.width, height = boxTitle.height, axisPosition = that._axisPosition, loCoord = axisPosition - margin - offset, hiCoord = axisPosition + margin + offset, params = {}; if (that._isHorizontal) { if (position === TOP) { params.translateY = loCoord - (y + height) } else { params.translateY = hiCoord - y } } else { if (position === LEFT) { params.translateX = loCoord - (x + width) } else { params.translateX = hiCoord - x } } title.element.attr(params) }, _checkTitleOverflow: function() { if (!this._title) { return } var canvasLength = this._getScreenDelta(), title = this._title, boxTitle = title.bBox; if ((this._isHorizontal ? boxTitle.width : boxTitle.height) > canvasLength) { title.element.applyEllipsis(canvasLength) && title.element.setTitle(this._options.title.text) } }, coordsIn: function(x, y) { var canvas = this.getCanvas(), isHorizontal = this._options.isHorizontal, position = this._options.position, coord = isHorizontal ? y : x; if (isHorizontal && position === constants.top || !isHorizontal && position === constants.left) { return coord < canvas[position] } return coord > canvas[isHorizontal ? "height" : "width"] - canvas[position] }, _boundaryTicksVisibility: { min: true, max: true }, _getMinMax: function() { return { min: this._options.min, max: this._options.max } }, _getStick: function() { return !this._options.valueMarginsEnabled }, _getStripLabelCoords: function(from, to, stripLabelOptions) { var x, y, that = this, orthogonalPositions = that._orthogonalPositions, isHorizontal = that._isHorizontal, horizontalAlignment = stripLabelOptions.horizontalAlignment, verticalAlignment = stripLabelOptions.verticalAlignment; if (isHorizontal) { if (horizontalAlignment === CENTER) { x = from + (to - from) / 2 } else { if (horizontalAlignment === LEFT) { x = from } else { if (horizontalAlignment === RIGHT) { x = to } } } y = orthogonalPositions[getStripVerticalAlignmentPosition(verticalAlignment)] } else { x = orthogonalPositions[getStripHorizontalAlignmentPosition(horizontalAlignment)]; if (verticalAlignment === TOP) { y = from } else { if (verticalAlignment === CENTER) { y = to + (from - to) / 2 } else { if (verticalAlignment === BOTTOM) { y = to } } } } return { x: x, y: y } }, _getTranslatedValue: function(value, offset) { var pos1 = this._translator.translate(value, offset, "semidiscrete" === this._options.type && this._options.tickInterval), pos2 = this._axisPosition, isHorizontal = this._isHorizontal; return { x: isHorizontal ? pos1 : pos2, y: isHorizontal ? pos2 : pos1 } }, _getSkippedCategory: function() { var skippedCategory, categories = this._translator.getVisibleCategories() || this._translator.getBusinessRange().categories; if (categories && categories.length && !!this._tickOffset) { skippedCategory = categories[categories.length - 1] } return skippedCategory }, _getSpiderCategoryOption: commonUtils.noop, shift: function(margins) { var that = this, options = that._options, isHorizontal = options.isHorizontal, axesSpacing = that.getMultipleAxesSpacing(), constantLinesGroups = that._axisConstantLineGroups; function shiftGroup(side, group) { var attr = {}, shift = margins[side] + axesSpacing; attr[isHorizontal ? "translateY" : "translateX"] = ("left" === side || "top" === side ? -1 : 1) * shift; if (margins[side]) { (group[side] || group).attr(attr); return shift } } that._axisShift = shiftGroup(options.position, that._axisGroup); if (isHorizontal) { shiftGroup("top", constantLinesGroups); shiftGroup("bottom", constantLinesGroups) } else { shiftGroup("left", constantLinesGroups); shiftGroup("right", constantLinesGroups) } } } } }, /*!***********************************!*\ !*** ./js/viz/axes/polar_axes.js ***! \***********************************/ function(module, exports, __webpack_require__) { var circularAxes, polarAxes, vizUtils = __webpack_require__( /*! ../core/utils */ 509), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, constants = __webpack_require__( /*! ./axes_constants */ 566), xyAxesLinear = __webpack_require__( /*! ./xy_axes */ 578).linear, tick = __webpack_require__( /*! ./tick */ 577).tick, _map = vizUtils.map, _math = Math, _abs = _math.abs, _round = _math.round, convertPolarToXY = vizUtils.convertPolarToXY, _extend = extend, _noop = commonUtils.noop, HALF_PI_ANGLE = 90; function getPolarQuarter(angle) { var quarter; angle = vizUtils.normalizeAngle(angle); if (angle >= 315 && angle <= 360 || angle < 45 && angle >= 0) { quarter = 1 } else { if (angle >= 45 && angle < 135) { quarter = 2 } else { if (angle >= 135 && angle < 225) { quarter = 3 } else { if (angle >= 225 && angle < 315) { quarter = 4 } } } } return quarter } polarAxes = exports; circularAxes = polarAxes.circular = { _updateTranslator: function() { this._translator.update({}, {}, { isHorizontal: true, conversionValue: true }) }, getCenter: function() { return this._center }, getRadius: function() { return this._radius }, getAngles: function() { var options = this._options; return [options.startAngle, options.endAngle] }, _updateRadius: function(canvas) { var rad = Math.min(canvas.width - canvas.left - canvas.right, canvas.height - canvas.top - canvas.bottom) / 2; this._radius = rad < 0 ? 0 : rad }, _updateCenter: function(canvas) { this._center = { x: canvas.left + (canvas.width - canvas.right - canvas.left) / 2, y: canvas.top + (canvas.height - canvas.top - canvas.bottom) / 2 } }, _processCanvas: function(canvas) { var options = this._options; this._updateRadius(canvas); this._updateCenter(canvas); return { left: 0, right: 0, width: _math.abs(options.endAngle - options.startAngle) } }, _createAxisElement: function() { return this._renderer.circle() }, _updateAxisElementPosition: function() { var center = this.getCenter(); this._axisElement.attr({ cx: center.x, cy: center.y, r: this.getRadius() }) }, _boundaryTicksVisibility: { min: true }, _getSpiderCategoryOption: function() { return this._options.firstPointOnStartAngle }, _getMinMax: function() { var max, options = this._options, min = commonUtils.isNumeric(options.originValue) ? options.originValue : void 0; if (options.period > 0 && options.argumentType === constants.numeric) { min = min || 0; max = min + options.period } return { min: min, max: max } }, _getStick: function() { return this._options.firstPointOnStartAngle || this._options.type !== constants.discrete }, _getTranslatedCoord: function(value, offset) { return this._translator.translate(value, offset) - HALF_PI_ANGLE }, _getCanvasStartEnd: function() { return { start: 0 - HALF_PI_ANGLE, end: 360 - HALF_PI_ANGLE } }, _getStripGraphicAttributes: function(fromAngle, toAngle) { var center = this.getCenter(), angle = this.getAngles()[0], r = this.getRadius(); return { x: center.x, y: center.y, innerRadius: 0, outerRadius: r, startAngle: -toAngle - angle, endAngle: -fromAngle - angle } }, _createStrip: function(fromAngle, toAngle, attr) { var coords = this._getStripGraphicAttributes(fromAngle, toAngle); return this._renderer.arc(coords.x, coords.y, coords.innerRadius, coords.outerRadius, coords.startAngle, coords.endAngle).attr(attr) }, _getStripLabelCoords: function(from, to) { var that = this, coords = that._getStripGraphicAttributes(from, to), angle = coords.startAngle + (coords.endAngle - coords.startAngle) / 2, cosSin = vizUtils.getCosAndSin(angle), halfRad = that.getRadius() / 2, center = that.getCenter(), x = _round(center.x + halfRad * cosSin.cos), y = _round(center.y - halfRad * cosSin.sin); return { x: x, y: y, align: constants.center } }, _getConstantLineGraphicAttributes: function(value) { var center = this.getCenter(), r = this.getRadius(); return { points: [center.x, center.y, center.x + r, center.y] } }, _createConstantLine: function(value, attr) { var center = this.getCenter(); return this._createPathElement(this._getConstantLineGraphicAttributes(value).points, attr).rotate(value + this.getAngles()[0], center.x, center.y) }, _getConstantLineLabelsCoords: function(value) { var that = this, cosSin = vizUtils.getCosAndSin(-value - that.getAngles()[0]), halfRad = that.getRadius() / 2, center = that.getCenter(), x = _round(center.x + halfRad * cosSin.cos), y = _round(center.y - halfRad * cosSin.sin); return { x: x, y: y } }, _checkAlignmentConstantLineLabels: _noop, _getScreenDelta: function() { var angles = this.getAngles(); return _abs(angles[0] - angles[1]) * this.getRadius() * Math.PI / 180 }, _getTickMarkPoints: function(tick, length) { var center = this.getCenter(), corrections = { inside: -1, center: -.5, outside: 0 }, radiusWithTicks = this.getRadius() + length * corrections[this._options.tickOrientation || "center"]; return [center.x + radiusWithTicks, center.y, center.x + radiusWithTicks + length, center.y] }, _getLabelAdjustedCoord: function(tick) { var that = this, labelCoords = tick.labelCoords, labelY = labelCoords.y, labelAngle = labelCoords.angle, cosSin = vizUtils.getCosAndSin(labelAngle), cos = cosSin.cos, sin = cosSin.sin, box = tick.labelBBox, halfWidth = box.width / 2, halfHeight = box.height / 2, indentFromAxis = that._options.label.indentFromAxis || 0, x = labelCoords.x + indentFromAxis * cos, y = labelY + (labelY - box.y - halfHeight) + indentFromAxis * sin; switch (getPolarQuarter(labelAngle)) { case 1: x += halfWidth; y += halfHeight * sin; break; case 2: x += halfWidth * cos; y += halfHeight; break; case 3: x += -halfWidth; y += halfHeight * sin; break; case 4: x += halfWidth * cos; y += -halfHeight } return { x: x, y: y } }, _getGridLineDrawer: function() { var that = this; return function(tick, gridStyle) { var center = that.getCenter(); return that._createPathElement(that._getGridPoints().points, gridStyle).rotate(tick.coords.angle, center.x, center.y) } }, _getGridPoints: function() { var r = this.getRadius(), center = this.getCenter(); return { points: [center.x, center.y, center.x + r, center.y] } }, _getTranslatedValue: function(value, offset) { var startAngle = this.getAngles()[0], angle = this._translator.translate(value, -offset), coords = convertPolarToXY(this.getCenter(), startAngle, angle, this.getRadius()); return { x: coords.x, y: coords.y, angle: angle + startAngle - HALF_PI_ANGLE } }, _getAdjustedStripLabelCoords: function(strip) { var box = strip.labelBBox; return { translateY: strip.label.attr("y") - box.y - box.height / 2 } }, coordsIn: function(x, y) { return vizUtils.convertXYToPolar(this.getCenter(), x, y).r > this.getRadius() }, _rotateTick: function(element, coords) { var center = this.getCenter(); element.rotate(coords.angle, center.x, center.y) }, _validateOverlappingMode: function(mode) { return constants.validateOverlappingMode(mode) }, _validateDisplayMode: function() { return "standard" }, _getStep: function(boxes) { var that = this, radius = that.getRadius() + (that._options.label.indentFromAxis || 0), maxLabelBox = boxes.reduce(function(prevValue, box) { var curValue = prevValue; if (prevValue.width < box.width) { curValue.width = box.width } if (prevValue.height < box.height) { curValue.height = box.height } return curValue }, { width: 0, height: 0 }), angle1 = _abs(2 * _math.atan(maxLabelBox.height / (2 * radius - maxLabelBox.width)) * 180 / _math.PI), angle2 = _abs(2 * _math.atan(maxLabelBox.width / (2 * radius - maxLabelBox.height)) * 180 / _math.PI); return constants.getTicksCountInRange(that._majorTicks, "angle", _math.max(angle1, angle2)) }, _checkBoundedLabelsOverlapping: function(step, majorTicks, boxes) { var lastVisibleLabelIndex = _math.floor((boxes.length - 1) / step) * step, labelOpt = this._options.label; if (!lastVisibleLabelIndex) { return } if (constants.areLabelsOverlap(boxes[0], boxes[lastVisibleLabelIndex], labelOpt.minSpacing, constants.center)) { "first" === labelOpt.overlappingBehavior.hideFirstOrLast ? majorTicks[0].label.remove() : majorTicks[lastVisibleLabelIndex].label.remove() } }, shift: function(margins) { this._axisGroup.attr({ translateX: margins.right, translateY: margins.bottom }) } }; exports.circularSpider = _extend({}, circularAxes, { _createAxisElement: function() { return this._renderer.path([], "area") }, _updateAxisElementPosition: function() { this._axisElement.attr({ points: _map(this.getSpiderTicks(), function(tick) { return { x: tick.coords.x, y: tick.coords.y } }) }) }, _getStick: function() { return true }, _getSpiderCategoryOption: function() { return true }, getSpiderTicks: function() { var that = this; that._spiderTicks = that._tickManager.getFullTicks().map(tick(that, that.renderer, {}, {}, that._getSkippedCategory(), true)); that._spiderTicks.forEach(function(tick) { tick.initCoords() }); return that._spiderTicks }, _getStripGraphicAttributes: function(fromAngle, toAngle) { var firstTick, lastTick, nextTick, tick, center = this.getCenter(), spiderTicks = this.getSpiderTicks(), points = [], i = 0, len = spiderTicks.length; while (i < len) { tick = spiderTicks[i].coords; if (tick.angle >= fromAngle && tick.angle <= toAngle) { if (!firstTick) { firstTick = (spiderTicks[i - 1] || spiderTicks[spiderTicks.length - 1]).coords; points.push((tick.x + firstTick.x) / 2, (tick.y + firstTick.y) / 2) } points.push(tick.x, tick.y); nextTick = (spiderTicks[i + 1] || spiderTicks[0]).coords; lastTick = { x: (tick.x + nextTick.x) / 2, y: (tick.y + nextTick.y) / 2 } } i++ } points.push(lastTick.x, lastTick.y); points.push(center.x, center.y); return { points: points } }, _createStrip: function(fromAngle, toAngle, attr) { var points = this._getStripGraphicAttributes(fromAngle, toAngle).points; return this._renderer.path(points, "area").attr(attr) }, _getTranslatedCoord: function(value, offset) { return this._translator.translate(value, offset) - HALF_PI_ANGLE }, _setTickOffset: function() { this._tickOffset = false } }); polarAxes.linear = { _getMinMax: circularAxes._getMinMax, _getStick: xyAxesLinear._getStick, _getSpiderCategoryOption: commonUtils.noop, _updateTranslator: function() { this._translator.update({}, {}, { isHorizontal: true }) }, _updateRadius: circularAxes._updateRadius, getRadius: circularAxes.getRadius, getCenter: circularAxes.getCenter, getAngles: circularAxes.getAngles, _updateCenter: circularAxes._updateCenter, _processCanvas: function(canvas) { this._updateRadius(canvas); this._updateCenter(canvas); return { left: 0, right: 0, width: this.getRadius() } }, _createAxisElement: xyAxesLinear._createAxisElement, _updateAxisElementPosition: function() { var centerCoord = this.getCenter(); this._axisElement.attr({ points: [centerCoord.x, centerCoord.y, centerCoord.x + this.getRadius(), centerCoord.y] }).rotate(this.getAngles()[0] - HALF_PI_ANGLE, centerCoord.x, centerCoord.y) }, _getScreenDelta: function() { return this.getRadius() }, _getTickMarkPoints: function(tick, length) { var coords = tick.coords; return [coords.x - length / 2, coords.y, coords.x + length / 2, coords.y] }, _getLabelAdjustedCoord: function(tick) { var x, y, that = this, labelCoords = tick.labelCoords, labelY = labelCoords.y, cosSin = vizUtils.getCosAndSin(labelCoords.angle), indentFromAxis = that._options.label.indentFromAxis || 0, box = tick.labelBBox; x = labelCoords.x - _abs(indentFromAxis * cosSin.sin) + _abs(box.width / 2 * cosSin.cos) - box.width / 2; y = labelY + (labelY - box.y) - _abs(box.height / 2 * cosSin.sin) + _abs(indentFromAxis * cosSin.cos); return { x: x, y: y } }, _getGridLineDrawer: function() { var that = this; return function(tick, gridStyle) { var grid = that._getGridPoints(tick.coords); return that._renderer.circle(grid.x, grid.y, grid.r).attr(gridStyle).sharp() } }, _getGridPoints: function(coords) { var pos = this.getCenter(); return { x: pos.x, y: pos.y, r: vizUtils.getDistance(pos.x, pos.y, coords.x, coords.y) } }, _getTranslatedValue: function(value, offset) { var startAngle = this.getAngles()[0], xy = convertPolarToXY(this.getCenter(), startAngle, 0, this._translator.translate(value, offset)); return { x: xy.x, y: xy.y, angle: startAngle - HALF_PI_ANGLE } }, _getTranslatedCoord: function(value, offset) { return this._translator.translate(value, offset) }, _getCanvasStartEnd: function() { return { start: 0, end: this.getRadius() } }, _getStripGraphicAttributes: function(fromPoint, toPoint) { var center = this.getCenter(); return { x: center.x, y: center.y, innerRadius: fromPoint, outerRadius: toPoint } }, _createStrip: function(fromPoint, toPoint, attr) { var attrs = this._getStripGraphicAttributes(fromPoint, toPoint); return this._renderer.arc(attrs.x, attrs.y, attrs.innerRadius, attrs.outerRadius, 0, 360).attr(attr) }, _getAdjustedStripLabelCoords: circularAxes._getAdjustedStripLabelCoords, _getStripLabelCoords: function(from, to) { var that = this, labelPos = from + (to - from) / 2, center = that.getCenter(), y = _round(center.y - labelPos); return { x: center.x, y: y, align: constants.center } }, _getConstantLineGraphicAttributes: function(value) { var center = this.getCenter(); return { cx: center.x, cy: center.y, r: value } }, _createConstantLine: function(value, attr) { var attrs = this._getConstantLineGraphicAttributes(value); return this._renderer.circle(attrs.cx, attrs.cy, attrs.r).attr(attr).sharp() }, _getConstantLineLabelsCoords: function(value) { var that = this, center = that.getCenter(), y = _round(center.y - value); return { x: center.x, y: y } }, _checkAlignmentConstantLineLabels: _noop, _rotateTick: function(element, coords) { element.rotate(coords.angle + HALF_PI_ANGLE, coords.x, coords.y) }, _validateOverlappingMode: circularAxes._validateOverlappingMode, _validateDisplayMode: circularAxes._validateDisplayMode, _getStep: function(boxes) { var quarter = getPolarQuarter(this.getAngles()[0]), spacing = this._options.label.minSpacing, func = 2 === quarter || 4 === quarter ? function(box) { return box.width + spacing } : function(box) { return box.height }, maxLabelLength = boxes.reduce(function(prevValue, box) { return _math.max(prevValue, func(box)) }, 0); return constants.getTicksCountInRange(this._majorTicks, 2 === quarter || 4 === quarter ? "x" : "y", maxLabelLength) } }; polarAxes.linearSpider = _extend({}, polarAxes.linear, { _createPathElement: function(points, attr) { return this._renderer.path(points, "area").attr(attr).sharp() }, setSpiderTicks: function(ticks) { this._spiderTicks = ticks }, _getGridLineDrawer: function() { var that = this; return function(tick, gridStyle, element) { return that._createPathElement(that._getGridPoints(tick.coords).points, gridStyle) } }, _getGridPoints: function(coords) { var pos = this.getCenter(), radius = vizUtils.getDistance(pos.x, pos.y, coords.x, coords.y); return this._getGridPointsByRadius(radius) }, _getGridPointsByRadius: function(radius) { var pos = this.getCenter(); return { points: _map(this._spiderTicks, function(tick) { var cosSin = vizUtils.getCosAndSin(tick.coords.angle); return { x: _round(pos.x + radius * cosSin.cos), y: _round(pos.y + radius * cosSin.sin) } }) } }, _getStripGraphicAttributes: function(fromPoint, toPoint) { var innerPoints = this._getGridPointsByRadius(toPoint).points, outerPoints = this._getGridPointsByRadius(fromPoint).points; return { points: [outerPoints, innerPoints.reverse()] } }, _createStrip: function(fromPoint, toPoint, attr) { var points = this._getStripGraphicAttributes(fromPoint, toPoint).points; return this._renderer.path(points, "area").attr(attr) }, _getConstantLineGraphicAttributes: function(value) { return this._getGridPointsByRadius(value) }, _createConstantLine: function(value, attr) { return this._createPathElement(this._getConstantLineGraphicAttributes(value).points, attr) } }) }, /*!**************************************!*\ !*** ./js/viz/core/series_family.js ***! \**************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, _math = Math, _round = _math.round, _abs = _math.abs, _pow = _math.pow, _each = $.each, _noop = commonUtils.noop, vizUtils = __webpack_require__( /*! ./utils */ 509), _normalizeEnum = vizUtils.normalizeEnum; function getStacksWithArgument(stackKeepers, argument) { var stacksWithArgument = []; _each(stackKeepers, function(stackName, seriesInStack) { _each(seriesInStack, function(_, singleSeries) { var i, points = singleSeries.getPointsByArg(argument), pointsLength = points.length; for (i = 0; i < pointsLength; ++i) { if (points[i].hasValue()) { stacksWithArgument.push(stackName); return false } } }) }); return stacksWithArgument } function correctPointCoordinatesForStacks(stackKeepers, stacksWithArgument, argument, parameters) { _each(stackKeepers, function(stackName, seriesInStack) { var offset, stackIndex = inArray(stackName, stacksWithArgument); if (stackIndex === -1) { return } offset = getOffset(stackIndex, parameters); _each(seriesInStack, function(_, singleSeries) { correctPointCoordinates(singleSeries.getPointsByArg(argument) || [], parameters.width, offset) }) }) } function adjustBarSeriesDimensionsCore(series, stackCount, options, seriesStackIndexCallback) { var percentWidth, stackIndex, i, points, stackName, stacksWithArgument, parameters, argumentsKeeper = {}, stackKeepers = {}, barsArea = series[0] && .7 * series[0].getArgumentAxis().getTranslator().getInterval(), barWidth = options.barWidth; if (options.equalBarWidth) { percentWidth = barWidth && (barWidth < 0 || barWidth > 1) ? 0 : barWidth; parameters = calculateParams(barsArea, stackCount, percentWidth); for (i = 0; i < series.length; i++) { stackIndex = seriesStackIndexCallback(i, stackCount); points = series[i].getPoints(); correctPointCoordinates(points, parameters.width, getOffset(stackIndex, parameters)) } } else { _each(series, function(i, singleSeries) { stackName = singleSeries.getStackName && singleSeries.getStackName(); stackName = stackName || i.toString(); if (!stackKeepers[stackName]) { stackKeepers[stackName] = [] } stackKeepers[stackName].push(singleSeries); _each(singleSeries.getPoints(), function(_, point) { var argument = point.argument; if (!argumentsKeeper.hasOwnProperty(argument)) { argumentsKeeper[argument.valueOf()] = 1 } }) }); for (var argument in argumentsKeeper) { stacksWithArgument = getStacksWithArgument(stackKeepers, argument); parameters = calculateParams(barsArea, stacksWithArgument.length); correctPointCoordinatesForStacks(stackKeepers, stacksWithArgument, argument, parameters) } } } function calculateParams(barsArea, count, percentWidth) { var spacing, width, middleIndex = count / 2; if (!percentWidth) { spacing = _round(barsArea / count * .2); width = _round((barsArea - spacing * (count - 1)) / count) } else { width = _round(barsArea * percentWidth / count); spacing = _round(count > 1 ? (barsArea - barsArea * percentWidth) / (count - 1) : 0) } return { width: width > 1 ? width : 1, spacing: spacing, middleIndex: middleIndex } } function getOffset(stackIndex, parameters) { return (stackIndex - parameters.middleIndex + .5) * parameters.width - (parameters.middleIndex - stackIndex - .5) * parameters.spacing } function correctPointCoordinates(points, width, offset) { _each(points, function(_, point) { point.correctCoordinates({ width: width, offset: offset }) }) } function checkMinBarSize(value, minShownValue) { return _abs(value) < minShownValue ? value >= 0 ? minShownValue : -minShownValue : value } function getValueType(value) { return value >= 0 ? "positive" : "negative" } function getVisibleSeries(that) { return that.series.filter(function(s) { return s.isVisible() }) } function getAbsStackSumByArg(stackKeepers, stackName, argument) { var positiveStackValue = (stackKeepers.positive[stackName] || {})[argument] || 0, negativeStackValue = -(stackKeepers.negative[stackName] || {})[argument] || 0; return positiveStackValue + negativeStackValue } function getSeriesStackIndexCallback(rotated, series, stackIndexes) { if (!rotated) { return function(seriesIndex) { return stackIndexes ? stackIndexes[series[seriesIndex].getStackName()] : seriesIndex } } else { return function(seriesIndex, stackCount) { return stackCount - (stackIndexes ? stackIndexes[series[seriesIndex].getStackName()] : seriesIndex) - 1 } } } function adjustBarSeriesDimensions() { var that = this, series = getVisibleSeries(that); adjustBarSeriesDimensionsCore(series, series.length, that._options, getSeriesStackIndexCallback(that.rotated, series)) } function adjustStackedBarSeriesDimensions() { var that = this, series = getVisibleSeries(that), stackIndexes = {}, stackCount = 0; _each(series, function() { var stackName = this.getStackName(); if (!stackIndexes.hasOwnProperty(stackName)) { stackIndexes[stackName] = stackCount++ } }); adjustBarSeriesDimensionsCore(series, stackCount, that._options, getSeriesStackIndexCallback(that.rotated, series, stackIndexes)) } function adjustStackedSeriesValues() { var that = this, negativesAsZeroes = that._options.negativesAsZeroes, series = getVisibleSeries(that), stackKeepers = { positive: {}, negative: {} }, holesStack = { left: {}, right: {} }; _each(series, function(seriesIndex, singleSeries) { var points = singleSeries.getPoints(), hole = false; singleSeries._prevSeries = series[seriesIndex - 1]; singleSeries.holes = extend(true, {}, holesStack); _each(points, function(index, point) { var currentStack, value = point.initialValue, argument = point.argument.valueOf(), stackName = singleSeries.getStackName(), stacks = value >= 0 ? stackKeepers.positive : stackKeepers.negative; if (negativesAsZeroes && value < 0) { stacks = stackKeepers.positive; value = 0; point.resetValue() } stacks[stackName] = stacks[stackName] || {}; currentStack = stacks[stackName]; if (currentStack[argument]) { point.correctValue(currentStack[argument]); currentStack[argument] += value } else { currentStack[argument] = value; point.resetCorrection() } if (!point.hasValue()) { var prevPoint = points[index - 1]; if (!hole && prevPoint && prevPoint.hasValue()) { argument = prevPoint.argument.valueOf(); prevPoint._skipSetRightHole = true; holesStack.right[argument] = (holesStack.right[argument] || 0) + (prevPoint.value - (isFinite(prevPoint.minValue) ? prevPoint.minValue : 0)) } hole = true } else { if (hole) { hole = false; holesStack.left[argument] = (holesStack.left[argument] || 0) + (point.value - (isFinite(point.minValue) ? point.minValue : 0)); point._skipSetLeftHole = true } } }) }); _each(series, function(seriesIndex, singleSeries) { var points = singleSeries.getPoints(), holes = singleSeries.holes; _each(points, function(index, point) { var argument = point.argument.valueOf(); point.resetHoles(); !point._skipSetLeftHole && point.setHole(holes.left[argument] || holesStack.left[argument] && 0, "left"); !point._skipSetRightHole && point.setHole(holes.right[argument] || holesStack.right[argument] && 0, "right"); point._skipSetLeftHole = null; point._skipSetRightHole = null }) }); that._stackKeepers = stackKeepers; _each(series, function(_, singleSeries) { _each(singleSeries.getPoints(), function(_, point) { var argument = point.argument.valueOf(); point.setPercentValue(getAbsStackSumByArg(stackKeepers, singleSeries.getStackName(), argument), that.fullStacked, holesStack.left[argument], holesStack.right[argument]) }) }) } function updateStackedSeriesValues() { var that = this, series = getVisibleSeries(that), stack = that._stackKeepers, stackKeepers = { positive: {}, negative: {} }; _each(series, function(_, singleSeries) { var minBarSize = singleSeries.getOptions().minBarSize, minShownBusinessValue = minBarSize && singleSeries.getValueAxis().getTranslator().getMinBarSize(minBarSize), stackName = singleSeries.getStackName(); _each(singleSeries.getPoints(), function(index, point) { if (!point.hasValue()) { return } var updateValue, valueType, currentStack, value = point.initialValue, argument = point.argument.valueOf(); if (that.fullStacked) { value = value / getAbsStackSumByArg(stack, stackName, argument) || 0 } updateValue = checkMinBarSize(value, minShownBusinessValue); valueType = getValueType(updateValue); currentStack = stackKeepers[valueType][stackName] = stackKeepers[valueType][stackName] || {}; if (currentStack[argument]) { point.minValue = currentStack[argument]; currentStack[argument] += updateValue } else { currentStack[argument] = updateValue } point.value = currentStack[argument] }) }); if (that.fullStacked) { updateFullStackedSeriesValues(series, stackKeepers) } } function updateFullStackedSeriesValues(series, stackKeepers) { _each(series, function(_, singleSeries) { var stackName = singleSeries.getStackName ? singleSeries.getStackName() : "default"; _each(singleSeries.getPoints(), function(index, point) { var stackSum = getAbsStackSumByArg(stackKeepers, stackName, point.argument.valueOf()); point.value = point.value / stackSum; if (commonUtils.isNumeric(point.minValue)) { point.minValue = point.minValue / stackSum } }) }) } function updateBarSeriesValues() { _each(this.series, function(_, singleSeries) { var minBarSize = singleSeries.getOptions().minBarSize, minShownBusinessValue = minBarSize && singleSeries.getValueAxis().getTranslator().getMinBarSize(minBarSize); if (minShownBusinessValue) { _each(singleSeries.getPoints(), function(index, point) { if (point.hasValue()) { point.value = checkMinBarSize(point.initialValue, minShownBusinessValue) } }) } }) } function adjustCandlestickSeriesDimensions() { var series = getVisibleSeries(this); adjustBarSeriesDimensionsCore(series, series.length, { barWidth: null, equalBarWidth: true }, getSeriesStackIndexCallback(this.rotated, series)) } function adjustBubbleSeriesDimensions() { var series = getVisibleSeries(this); if (!series.length) { return } var pointSize, bubbleArea, sizeProportion, sizeDispersion, areaDispersion, options = this._options, argTranslator = series[0].getArgumentAxis().getTranslator(), valTranslator = series[0].getValueAxis().getTranslator(), visibleAreaX = argTranslator.getCanvasVisibleArea(), visibleAreaY = valTranslator.getCanvasVisibleArea(), min = _math.min(visibleAreaX.max - visibleAreaX.min, visibleAreaY.max - visibleAreaY.min), minBubbleArea = _pow(options.minBubbleSize, 2), maxBubbleArea = _pow(min * options.maxBubbleSize, 2), equalBubbleSize = (min * options.maxBubbleSize + options.minBubbleSize) / 2, minPointSize = 1 / 0, maxPointSize = 0; _each(series, function(_, seriesItem) { _each(seriesItem.getPoints(), function(_, point) { maxPointSize = maxPointSize > point.size ? maxPointSize : point.size; minPointSize = minPointSize < point.size ? minPointSize : point.size }) }); sizeDispersion = maxPointSize - minPointSize; areaDispersion = _abs(maxBubbleArea - minBubbleArea); minPointSize = minPointSize < 0 ? 0 : minPointSize; _each(series, function(_, seriesItem) { _each(seriesItem.getPoints(), function(_, point) { if (maxPointSize === minPointSize) { pointSize = _round(equalBubbleSize) } else { sizeProportion = _abs(point.size - minPointSize) / sizeDispersion; bubbleArea = areaDispersion * sizeProportion + minBubbleArea; pointSize = _round(_math.sqrt(bubbleArea)) } point.correctCoordinates(pointSize) }) }) } function SeriesFamily(options) { var debug = __webpack_require__( /*! ../../core/utils/console */ 13).debug; debug.assert(options.type, "type was not passed or empty"); var that = this; that.type = _normalizeEnum(options.type); that.pane = options.pane; that.rotated = options.rotated; that.series = []; that.updateOptions(options); switch (that.type) { case "bar": that.adjustSeriesDimensions = adjustBarSeriesDimensions; that.updateSeriesValues = updateBarSeriesValues; break; case "rangebar": that.adjustSeriesDimensions = adjustBarSeriesDimensions; break; case "fullstackedbar": that.fullStacked = true; that.adjustSeriesDimensions = adjustStackedBarSeriesDimensions; that.adjustSeriesValues = adjustStackedSeriesValues; that.updateSeriesValues = updateStackedSeriesValues; break; case "stackedbar": that.adjustSeriesDimensions = adjustStackedBarSeriesDimensions; that.adjustSeriesValues = adjustStackedSeriesValues; that.updateSeriesValues = updateStackedSeriesValues; break; case "fullstackedarea": case "fullstackedline": case "fullstackedspline": case "fullstackedsplinearea": that.fullStacked = true; that.adjustSeriesValues = adjustStackedSeriesValues; break; case "stackedarea": case "stackedsplinearea": case "stackedline": case "stackedspline": that.adjustSeriesValues = adjustStackedSeriesValues; break; case "candlestick": case "stock": that.adjustSeriesDimensions = adjustCandlestickSeriesDimensions; break; case "bubble": that.adjustSeriesDimensions = adjustBubbleSeriesDimensions } } exports.SeriesFamily = SeriesFamily; SeriesFamily.prototype = { constructor: SeriesFamily, adjustSeriesDimensions: _noop, adjustSeriesValues: _noop, updateSeriesValues: _noop, updateOptions: function(options) { this._options = options }, dispose: function() { this.series = null }, add: function(series) { var type = this.type; this.series = vizUtils.map(series, function(singleSeries) { return singleSeries.type === type ? singleSeries : null }) } } }, /*!**********************************************!*\ !*** ./js/viz/chart_components/crosshair.js ***! \**********************************************/ function(module, exports, __webpack_require__) { var math = Math, mathAbs = math.abs, mathMin = math.min, mathMax = math.max, mathFloor = math.floor, vizUtils = __webpack_require__( /*! ../core/utils */ 509), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, HORIZONTAL = "horizontal", VERTICAL = "vertical", LABEL_BACKGROUND_PADDING_X = 8, LABEL_BACKGROUND_PADDING_Y = 4, CENTER = "center", RIGHT = "right", LEFT = "left", TOP = "top", BOTTOM = "bottom"; exports.getMargins = function() { return { x: LABEL_BACKGROUND_PADDING_X, y: LABEL_BACKGROUND_PADDING_Y } }; function getRectangleBBox(bBox) { return { x: bBox.x - LABEL_BACKGROUND_PADDING_X, y: bBox.y - LABEL_BACKGROUND_PADDING_Y, width: bBox.width + 2 * LABEL_BACKGROUND_PADDING_X, height: bBox.height + 2 * LABEL_BACKGROUND_PADDING_Y } } function getLabelCheckerPosition(x, y, isHorizontal, canvas) { var params = isHorizontal ? ["x", "width", "y", "height", y, 0] : ["y", "height", "x", "width", x, 1]; return function(bBox, position, coord) { var labelCoord = { x: coord.x, y: coord.y }, rectangleBBox = getRectangleBBox(bBox), delta = isHorizontal ? coord.y - bBox.y - bBox.height / 2 : coord.y - bBox.y; labelCoord.y = isHorizontal || !isHorizontal && position === BOTTOM ? coord.y + delta : coord.y; if (rectangleBBox[params[0]] < 0) { labelCoord[params[0]] -= rectangleBBox[params[0]] } else { if (rectangleBBox[params[0]] + rectangleBBox[params[1]] + delta * params[5] > canvas[params[1]]) { labelCoord[params[0]] -= rectangleBBox[params[0]] + rectangleBBox[params[1]] + delta * params[5] - canvas[params[1]] } } if (params[4] - rectangleBBox[params[3]] / 2 < 0) { labelCoord[params[2]] -= params[4] - rectangleBBox[params[3]] / 2 } else { if (params[4] + rectangleBBox[params[3]] / 2 > canvas[params[3]]) { labelCoord[params[2]] -= params[4] + rectangleBBox[params[3]] / 2 - canvas[params[3]] } } return labelCoord } } function Crosshair(renderer, options, params, group) { var that = this; that._renderer = renderer; that._crosshairGroup = group; that._options = {}; that.update(options, params) } Crosshair.prototype = { constructor: Crosshair, update: function(options, params) { var that = this, canvas = params.canvas; that._canvas = { top: canvas.top, bottom: canvas.height - canvas.bottom, left: canvas.left, right: canvas.width - canvas.right, width: canvas.width, height: canvas.height }; that._axes = params.axes; that._panes = params.panes; that._prepareOptions(options, HORIZONTAL); that._prepareOptions(options, VERTICAL) }, dispose: function() { var that = this; that._renderer = that._crosshairGroup = that._options = that._axes = that._canvas = that._horizontalGroup = that._verticalGroup = that._horizontal = that._vertical = that._circle = that._panes = null }, _prepareOptions: function(options, direction) { var lineOptions = options[direction + "Line"]; this._options[direction] = { visible: lineOptions.visible, line: { stroke: lineOptions.color || options.color, "stroke-width": lineOptions.width || options.width, dashStyle: lineOptions.dashStyle || options.dashStyle, opacity: lineOptions.opacity || options.opacity, "stroke-linecap": "butt" }, label: extend(true, {}, options.label, lineOptions.label) } }, _createLines: function(options, sharpParam, group) { var lines = [], canvas = this._canvas, points = [canvas.left, canvas.top, canvas.left, canvas.top]; for (var i = 0; i < 2; i++) { lines.push(this._renderer.path(points, "line").attr(options).sharp(sharpParam).append(group)) } return lines }, render: function() { var that = this, renderer = that._renderer, options = that._options, verticalOptions = options.vertical, horizontalOptions = options.horizontal, extraOptions = horizontalOptions.visible ? horizontalOptions.line : verticalOptions.line, circleOptions = { stroke: extraOptions.stroke, "stroke-width": extraOptions["stroke-width"], dashStyle: extraOptions.dashStyle, opacity: extraOptions.opacity }, canvas = that._canvas; that._horizontal = {}; that._vertical = {}; that._circle = renderer.circle(canvas.left, canvas.top, 0).attr(circleOptions).append(that._crosshairGroup); that._horizontalGroup = renderer.g().append(that._crosshairGroup); that._verticalGroup = renderer.g().append(that._crosshairGroup); if (verticalOptions.visible) { that._vertical.lines = that._createLines(verticalOptions.line, "h", that._verticalGroup); that._vertical.labels = that._createLabels(that._axes[0], verticalOptions, false, that._verticalGroup) } if (horizontalOptions.visible) { that._horizontal.lines = that._createLines(horizontalOptions.line, "v", that._horizontalGroup); that._horizontal.labels = that._createLabels(that._axes[1], horizontalOptions, true, that._horizontalGroup) } that.hide() }, _createLabels: function(axes, options, isHorizontal, group) { var x, y, text, background, currentLabelPos, that = this, canvas = that._canvas, renderer = that._renderer, labels = [], labelOptions = options.label; if (labelOptions.visible) { axes.forEach(function(axis) { var align, position = axis.getOptions().position; if (axis.getTranslator().getBusinessRange().stubData) { return } currentLabelPos = axis.getLabelsPosition(); if (isHorizontal) { y = canvas.top; x = currentLabelPos } else { x = canvas.left; y = currentLabelPos } align = position === TOP || position === BOTTOM ? CENTER : position === RIGHT ? LEFT : RIGHT; background = renderer.rect(0, 0, 0, 0).attr({ fill: labelOptions.backgroundColor || options.line.stroke }).append(group); text = renderer.text("0", 0, 0).css(vizUtils.patchFontOptions(options.label.font)).attr({ align: align }).append(group); labels.push({ text: text, background: background, axis: axis, options: labelOptions, pos: { coord: currentLabelPos, side: position }, startXY: { x: x, y: y } }) }) } return labels }, _updateText: function(value, axisName, labels, point, func) { var that = this; labels.forEach(function(label) { var axis = label.axis, coord = label.startXY, textElement = label.text, backgroundElement = label.background, text = ""; if (!axis.name || axis.name === axisName) { text = axis.getFormattedValue(value, label.options, point) } if (text) { textElement.attr({ text: text, x: coord.x, y: coord.y }); textElement.attr(func(textElement.getBBox(), label.pos.side, coord)); that._updateLinesCanvas(label); backgroundElement.attr(getRectangleBBox(textElement.getBBox())) } else { textElement.attr({ text: "" }); backgroundElement.attr({ x: 0, y: 0, width: 0, height: 0 }) } }) }, hide: function() { this._crosshairGroup.attr({ visibility: "hidden" }) }, _updateLinesCanvas: function(label) { var position = label.pos.side, labelCoord = label.pos.coord, coords = this._linesCanvas, canvas = this._canvas; coords[position] = coords[position] !== canvas[position] && mathAbs(coords[position] - canvas[position]) < mathAbs(labelCoord - canvas[position]) ? coords[position] : labelCoord }, _updateLines: function(lines, x, y, r, isHorizontal) { var coords = this._linesCanvas, canvas = this._canvas, points = isHorizontal ? [ [mathMin(x - r, coords.left), canvas.top, x - r, canvas.top], [x + r, canvas.top, mathMax(coords.right, x + r), canvas.top] ] : [ [canvas.left, mathMin(coords.top, y - r), canvas.left, y - r], [canvas.left, y + r, canvas.left, mathMax(coords.bottom, y + r)] ]; for (var i = 0; i < 2; i++) { lines[i].attr({ points: points[i] }) } }, _resetLinesCanvas: function() { var canvas = this._canvas; this._linesCanvas = { left: canvas.left, right: canvas.right, top: canvas.top, bottom: canvas.bottom } }, _getClipRectForPane: function(x, y) { var i, coords, panes = this._panes; for (i = 0; i < panes.length; i++) { coords = panes[i].coords; if (coords.left <= x && coords.right >= x && coords.top <= y && coords.bottom >= y) { return panes[i].clipRect } } return { id: null } }, show: function(data) { var that = this, point = data.point, pointData = point.getCrosshairData(data.x, data.y), r = point.getPointRadius(), horizontal = that._horizontal, vertical = that._vertical, rad = !r ? 0 : r + 3, canvas = that._canvas, x = mathFloor(pointData.x), y = mathFloor(pointData.y); if (x >= canvas.left && x <= canvas.right && y >= canvas.top && y <= canvas.bottom) { that._crosshairGroup.attr({ visibility: "visible" }); that._resetLinesCanvas(); that._circle.attr({ cx: x, cy: y, r: rad, "clip-path": that._getClipRectForPane(x, y).id }); if (horizontal.lines) { that._updateText(pointData.yValue, pointData.axis, horizontal.labels, point, getLabelCheckerPosition(x, y, true, canvas)); that._updateLines(horizontal.lines, x, y, rad, true); that._horizontalGroup.attr({ translateY: y - canvas.top }) } if (vertical.lines) { that._updateText(pointData.xValue, pointData.axis, vertical.labels, point, getLabelCheckerPosition(x, y, false, canvas)); that._updateLines(vertical.lines, x, y, rad, false); that._verticalGroup.attr({ translateX: x - canvas.left }) } } else { that.hide() } } }; exports.Crosshair = Crosshair }, /*!***********************************************!*\ !*** ./js/viz/chart_components/scroll_bar.js ***! \***********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, MIN_SCROLL_BAR_SIZE = 2, translator2DModule = __webpack_require__( /*! ../translators/translator2d */ 571), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), pointerEvents = __webpack_require__( /*! ../../events/pointer */ 76), isDefined = commonUtils.isDefined, _min = Math.min, _max = Math.max; var ScrollBar = function(renderer, group) { this._translator = new translator2DModule.Translator2D({}, {}, {}); this._scroll = renderer.rect().append(group); this._addEvents() }; function _getXCoord(canvas, pos, offset, width) { var x = 0; if ("right" === pos) { x = canvas.width - canvas.right + offset } else { if ("left" === pos) { x = canvas.left - offset - width } } return x } function _getYCoord(canvas, pos, offset, width) { var y = 0; if ("top" === pos) { y = canvas.top - offset } else { if ("bottom" === pos) { y = canvas.height - canvas.bottom + width + offset } } return y } ScrollBar.prototype = { _addEvents: function() { var that = this, $scroll = $(that._scroll.element), startPosX = 0, startPosY = 0, scrollChangeHandler = function(e) { var dX = (startPosX - e.pageX) * that._scale, dY = (startPosY - e.pageY) * that._scale; $scroll.trigger(new $.Event("dxc-scroll-move", extend(e, { type: "dxc-scroll-move", pointers: [{ pageX: startPosX + dX, pageY: startPosY + dY }] }))) }; $scroll.on(pointerEvents.down, function(e) { startPosX = e.pageX; startPosY = e.pageY; $scroll.trigger(new $.Event("dxc-scroll-start", { pointers: [{ pageX: startPosX, pageY: startPosY }] })); $(document).on(pointerEvents.move, scrollChangeHandler) }); $(document).on(pointerEvents.up, function() { $(document).off(pointerEvents.move, scrollChangeHandler) }) }, update: function(options) { var that = this, position = options.position, isVertical = options.rotated, defaultPosition = isVertical ? "right" : "top", secondaryPosition = isVertical ? "left" : "bottom"; if (position !== defaultPosition && position !== secondaryPosition) { position = defaultPosition } that._scroll.attr({ rotate: !options.rotated ? -90 : 0, rotateX: 0, rotateY: 0, fill: options.color, width: options.width, opacity: options.opacity }); that._layoutOptions = { width: options.width, offset: options.offset, vertical: isVertical, position: position }; return that }, init: function(range) { var that = this; that._translateWithOffset = "discrete" === range.axisType && !range.stick && 1 || 0; that._translator.update(extend({}, range, { minVisible: null, maxVisible: null, visibleCategories: null }), that._canvas, { isHorizontal: !that._layoutOptions.vertical }); return that }, getOptions: function() { return this._layoutOptions }, setPane: function(panes) { var pane, position = this._layoutOptions.position; if ("left" === position || "top" === position) { pane = panes[0] } else { pane = panes[panes.length - 1] } this.pane = pane.name; return this }, updateSize: function(canvas) { this._canvas = extend({}, canvas); var options = this._layoutOptions, pos = options.position, offset = options.offset, width = options.width; this._scroll.attr({ translateX: _getXCoord(canvas, pos, offset, width), translateY: _getYCoord(canvas, pos, offset, width) }) }, getMultipleAxesSpacing: function() { return 0 }, estimateMargins: function() { return this.getMargins() }, getMargins: function() { var options = this._layoutOptions, margins = { left: 0, top: 0, right: 0, bottom: 0 }; margins[options.position] = options.width + options.offset; return margins }, draw: function() {}, shift: function() {}, hideTitle: function() {}, hideOuterElements: function() {}, setPosition: function(min, max) { var that = this, translator = that._translator, minPoint = isDefined(min) ? translator.translate(min, -that._translateWithOffset) : translator.translate("canvas_position_start"), maxPoint = isDefined(max) ? translator.translate(max, that._translateWithOffset) : translator.translate("canvas_position_end"); that._offset = _min(minPoint, maxPoint); that._scale = translator.getScale(min, max); that._applyPosition(_min(minPoint, maxPoint), _max(minPoint, maxPoint)) }, transform: function(translate, scale) { var translator = this._translator, x = translator.getCanvasVisibleArea().min, dx = x - (x * scale - translate), lx = this._offset + dx / (this._scale * scale); this._applyPosition(lx, lx + translator.canvasLength / (this._scale * scale)) }, dispose: function() { this._scroll.dispose(); this._scroll = this._translator = null }, _applyPosition: function(x1, x2) { var height, that = this, visibleArea = that._translator.getCanvasVisibleArea(); x1 = _max(x1, visibleArea.min); x1 = _min(x1, visibleArea.max); x2 = _min(x2, visibleArea.max); x2 = _max(x2, visibleArea.min); height = Math.abs(x2 - x1); that._scroll.attr({ y: x1, height: height < MIN_SCROLL_BAR_SIZE ? MIN_SCROLL_BAR_SIZE : height }) } }; exports.ScrollBar = ScrollBar }, /*!*************************************************!*\ !*** ./js/viz/chart_components/shutter_zoom.js ***! \*************************************************/ function(module, exports, __webpack_require__) { var dragEvents = __webpack_require__( /*! ../../events/drag */ 110), SHUTTER_EVENTS_NS = ".shutter-zoom", DRAG_START_EVENT_NAME = dragEvents.start + SHUTTER_EVENTS_NS, DRAG_UPDATE_EVENT_NAME = dragEvents.move + SHUTTER_EVENTS_NS, DRAG_END_EVENT_NAME = dragEvents.end + SHUTTER_EVENTS_NS; function getPointerCoord(rootOffset, canvas, rotated, e) { var coord = Math.floor(rotated ? e.pageY - rootOffset.top : e.pageX - rootOffset.left), min = rotated ? canvas.y1 : canvas.x1, max = rotated ? canvas.y2 : canvas.x2; if (coord < min) { coord = min } else { if (coord > max) { coord = max } } return coord } function checkCoords(rootOffset, canvas, e) { var x = e.pageX - rootOffset.left, y = e.pageY - rootOffset.top; return x >= canvas.x1 && x <= canvas.x2 && y >= canvas.y1 && y <= canvas.y2 } function dragStartHandler(ctx) { return function(e) { var offset = ctx.getRootOffset(), canvas = ctx.getCanvas(); if (!checkCoords(offset, canvas, e)) { e.cancel = true; return } ctx.rootOffset = offset; ctx.canvas = canvas; ctx.startCoord = getPointerCoord(offset, canvas, ctx.rotated, e); ctx.triggerStart(); ctx.rect.attr({ x: canvas.x1, y: canvas.y1, width: canvas.width, height: canvas.height }).append(ctx.root) } } function dragHandler(ctx) { return function(e) { var curCoord = getPointerCoord(ctx.rootOffset, ctx.canvas, ctx.rotated, e), attr = {}; ctx.curCoord = curCoord; attr[ctx.rotated ? "y" : "x"] = Math.min(ctx.startCoord, curCoord); attr[ctx.rotated ? "height" : "width"] = Math.abs(ctx.startCoord - curCoord); ctx.rect.attr(attr) } } function dragEndHandler(ctx) { return function(e) { ctx.triggerEnd(); ctx.rect.remove() } } function shutterZoom(options) { var chart = options.chart, renderer = options.renderer, rotated = options.rotated, rect = renderer.rect(0, 0, 0, 0).attr(options.shutterOptions), shutter = { rect: rect, root: renderer.root, rotated: rotated, triggerStart: function() { chart._eventTrigger("zoomStart") }, triggerEnd: function() { var tr = chart._argumentAxes[0].getTranslator(), rangeStart = Math.min(this.startCoord, this.curCoord), rangeEnd = Math.max(this.startCoord, this.curCoord); chart._eventTrigger("zoomEnd", { rangeStart: tr.untranslate(rangeStart), rangeEnd: tr.untranslate(rangeEnd) }) }, dispose: function() { renderer.root.off(SHUTTER_EVENTS_NS); rect.dispose() }, getRootOffset: function() { return renderer.getRootOffset() }, getCanvas: function() { var canvas = chart._canvas, panes = chart.panes, firstPane = panes[0].canvas, lastPane = panes[panes.length - 1].canvas; return { x1: firstPane.left, y1: firstPane.top, x2: canvas.width - lastPane.right, y2: canvas.height - lastPane.bottom, width: canvas.width - firstPane.left - lastPane.right, height: canvas.height - firstPane.top - lastPane.bottom } } }; renderer.root.off(SHUTTER_EVENTS_NS).on(DRAG_START_EVENT_NAME, { direction: rotated ? "vertical" : "horizontal", immediate: true }, dragStartHandler(shutter)).on(DRAG_UPDATE_EVENT_NAME, dragHandler(shutter)).on(DRAG_END_EVENT_NAME, dragEndHandler(shutter)); return shutter } module.exports = { name: "shutter_zoom", init: function() { var options = this.option("shutterZoom") || {}; if (!options.enabled) { return } this._shutterZoom = shutterZoom({ chart: this, renderer: this._renderer, rotated: this.option("rotated"), shutterOptions: options }) }, dispose: function() { this._shutterZoom && this._shutterZoom.dispose() } } }, /*!*****************************!*\ !*** ./js/viz/pie_chart.js ***! \*****************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../core/renderer */ 9), errors = __webpack_require__( /*! ../core/errors */ 7), seriesConsts = __webpack_require__( /*! ./components/consts */ 527), vizUtils = __webpack_require__( /*! ./core/utils */ 509), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, commonUtils = __webpack_require__( /*! ../core/utils/common */ 14), rangeModule = __webpack_require__( /*! ./translators/range */ 564), registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), baseChartModule = __webpack_require__( /*! ./chart_components/base_chart */ 514), BaseChart = baseChartModule.BaseChart, overlapping = baseChartModule.overlapping, seriesSpacing = seriesConsts.pieSeriesSpacing, translator1DModule = __webpack_require__( /*! ./translators/translator1d */ 585), OPTIONS_FOR_REFRESH_SERIES = ["startAngle", "innerRadius", "segmentsDirection", "type"], _extend = extend, _each = $.each, _noop = commonUtils.noop, _getVerticallyShiftedAngularCoords = __webpack_require__( /*! ./core/utils */ 509).getVerticallyShiftedAngularCoords, states = seriesConsts.states, NORMAL_STATE = states.normalMark, LEGEND_ACTIONS = [states.resetItem, states.applyHover, states.applySelected, states.applySelected]; function getLegendItemAction(points) { var state = NORMAL_STATE; points.forEach(function(point) { state |= point.fullState }); return LEGEND_ACTIONS[state] } function correctPercentValue(value) { if (commonUtils.isNumeric(value)) { if (value > 1) { value = 1 } else { if (value < 0) { value = 0 } } } else { value = void 0 } return value } var dxPieChart = BaseChart.inherit({ _setDeprecatedOptions: function() { this.callBase.apply(this, arguments); _extend(this._deprecatedOptions, { "series.innerRadius": { since: "15.2", message: "Use the 'innerRadius' option instead" }, "series.startAngle": { since: "15.2", message: "Use the 'startAngle' option instead" }, "series.segmentsDirection": { since: "15.2", message: "Use the 'segmentsDirection' option instead" }, "series.type": { since: "15.2", message: "Use the 'type' option instead" } }) }, _chartType: "pie", _layoutManagerOptions: function() { return _extend(true, {}, this.callBase(), { piePercentage: correctPercentValue(this._themeManager.getOptions("diameter")), minPiePercentage: correctPercentValue(this._themeManager.getOptions("minDiameter")) }) }, _optionChangesMap: { diameter: "REINIT", minDiameter: "REINIT", sizeGroup: "REINIT" }, _disposeCore: function() { pieSizeEqualizer.remove(this); this.callBase() }, _groupSeries: function() { var series = this.series; this._groupsData = { groups: [{ series: series, valueOptions: { valueType: "numeric" } }], argumentOptions: series[0] && series[0].getOptions() } }, _getArgumentAxis: function() { return null }, _getValueAxis: function() { var translator = (new translator1DModule.Translator1D).setCodomain(360, 0); return { getTranslator: function() { return translator }, setBusinessRange: function(range) { translator.setDomain(range.min, range.max) } } }, _populateBusinessRange: function() { this.businessRanges = this.series.map(function(series) { var range = new rangeModule.Range; range.addRange(series.getRangeData().val); if (!range.isDefined()) { range.setStubData() } series.getValueAxis().setBusinessRange(range); return range }) }, _specialProcessSeries: function() { _each(this.series, function(_, singleSeries) { singleSeries.arrangePoints() }) }, _checkPaneName: function() { return true }, _processSingleSeries: function(singleSeries) { singleSeries.arrangePoints() }, _getLegendTargets: function() { var that = this, itemsByArgument = {}, items = []; that.series.forEach(function(series) { _each(series.pointsByArgument, function(argument, points) { points.forEach(function(point, index) { var key = argument.valueOf().toString() + index; itemsByArgument[key] = itemsByArgument[key] || []; var argumentCount = itemsByArgument[key].push(point); point.index = itemsByArgument[key][argumentCount - 2] ? itemsByArgument[key][argumentCount - 2].index : Object.keys(itemsByArgument).length - 1; point.argumentIndex = index }) }) }); _each(itemsByArgument, function(_, points) { points.forEach(function(point, index) { if (0 === index) { items.push(that._getLegendOptions(point)) } else { if (!items[items.length - 1].visible) { items[items.length - 1].visible = point.isVisible() } } }) }); return items }, _getLayoutTargets: function() { return [{ canvas: this._canvas }] }, _getLayoutSeries: function(series, drawOptions) { var layout, that = this, canvas = that._canvas, drawnLabels = false; layout = that.layoutManager.applyPieChartSeriesLayout(canvas, series, true); series.forEach(function(singleSeries) { singleSeries.correctPosition(layout, canvas); drawnLabels = singleSeries.drawLabelsWOPoints() || drawnLabels }); if (drawnLabels) { layout = that.layoutManager.applyPieChartSeriesLayout(canvas, series, drawOptions.hideLayoutLabels) } series.forEach(function(singleSeries) { singleSeries.hideLabels() }); that._sizeGroupLayout = { x: layout.centerX, y: layout.centerY, radius: layout.radiusOuter, drawOptions: drawOptions }; return layout }, _getLayoutSeriesForEqualPies: function(series, sizeGroupLayout) { var canvas = this._canvas, layout = this.layoutManager.applyEqualPieChartLayout(series, sizeGroupLayout); series.forEach(function(s) { s.correctPosition(layout, canvas) }); return layout }, _updateSeriesDimensions: function(drawOptions) { var innerRad, delta, layout, that = this, visibleSeries = that._getVisibleSeries(), lengthVisibleSeries = visibleSeries.length, sizeGroupLayout = drawOptions.sizeGroupLayout; if (lengthVisibleSeries) { layout = sizeGroupLayout ? that._getLayoutSeriesForEqualPies(visibleSeries, sizeGroupLayout) : that._getLayoutSeries(visibleSeries, drawOptions); delta = (layout.radiusOuter - layout.radiusInner - seriesSpacing * (lengthVisibleSeries - 1)) / lengthVisibleSeries; innerRad = layout.radiusInner; that._setCenter({ x: layout.centerX, y: layout.centerY }); _each(visibleSeries, function(_, singleSeries) { singleSeries.correctRadius({ radiusInner: innerRad, radiusOuter: innerRad + delta }); innerRad += delta + seriesSpacing }) } }, _renderSeries: function(drawOptions, isRotated, isLegendInside) { this._calculateSeriesLayout(drawOptions, isRotated); if (!drawOptions.sizeGroupLayout && this.getSizeGroup()) { pieSizeEqualizer.queue(this); return } this._renderSeriesElements(drawOptions, isRotated, isLegendInside) }, _getLegendCallBack: function() { var that = this, legend = this._legend, items = this._getLegendTargets().map(function(i) { return i.legendData }); return function(target) { items.forEach(function(data) { var points = [], callback = legend.getActionCallback({ index: data.id }); that.series.forEach(function(series) { var seriesPoints = series.getPointsByKeys(data.argument, data.argumentIndex); points.push.apply(points, seriesPoints) }); if (target && target.argument === data.argument && target.argumentIndex === data.argumentIndex) { points.push(target) } callback(getLegendItemAction(points)) }) } }, _adjustSeries: function() { _each(this.series, function(_, singleSeries) { singleSeries.adjustLabels() }) }, _prepareStackPoints: _noop, _resetStackPoints: _noop, _applyExtraSettings: _noop, _resolveLabelOverlappingShift: function() { var that = this, series = that.series, center = that._center; _each(series, function(_, singleSeries) { if ("inside" === singleSeries.getOptions().label.position) { return } var points = singleSeries.getVisiblePoints(), lPoints = [], rPoints = []; $.each(points, function(_, point) { var angle = vizUtils.normalizeAngle(point.middleAngle); (angle <= 90 || angle >= 270 ? rPoints : lPoints).push(point) }); overlapping.resolveLabelOverlappingInOneDirection(lPoints, that._canvas, false, shiftFunction); overlapping.resolveLabelOverlappingInOneDirection(rPoints, that._canvas, false, shiftFunction) }); function shiftFunction(box, length) { return _getVerticallyShiftedAngularCoords(box, -length, center) } }, _setCenter: function(center) { this._center = center }, _disposeSeries: function() { this.callBase.apply(this, arguments); this._abstractSeries = null }, getSeries: function() { errors.log("W0002", "dxPieChart", "getSeries", "15.2", "Use the 'getAllSeries' method instead"); return this.series[0] }, _legendDataField: "point", _legendItemTextField: "argument", _updateLegendPosition: _noop, _renderTrackers: _noop, _trackerType: "PieTracker", _createScrollBar: _noop, _updateAxesLayout: _noop, _applyClipRects: _noop, _appendAdditionalSeriesGroups: _noop, _prepareToRender: _noop, _isLegendInside: _noop, _renderAxes: _noop, _shrinkAxes: _noop, _isRotated: _noop, _seriesPopulatedHandlerCore: _noop, _reinitAxes: _noop, _correctAxes: _noop, _getExtraOptions: function() { var that = this; return { startAngle: that.option("startAngle"), innerRadius: that.option("innerRadius"), segmentsDirection: that.option("segmentsDirection"), type: that.option("type") } }, getSizeGroup: function() { return this._themeManager.getOptions("sizeGroup") }, getSizeGroupLayout: function() { return this._sizeGroupLayout }, setPieSize: function(layout) { var drawOptions = this._sizeGroupLayout.drawOptions; drawOptions.sizeGroupLayout = layout; this._renderSeries(drawOptions, this._isRotated(), this._isLegendInside()) } }); _each(OPTIONS_FOR_REFRESH_SERIES, function(_, name) { dxPieChart.prototype._optionChangesMap[name] = "REFRESH_SERIES_DATA_INIT" }); registerComponent("dxPieChart", dxPieChart); module.exports = dxPieChart; var pieSizeEqualizer = function() { function equalize(group, allPies) { var pies = allPies.filter(function(p) { return p.getSizeGroup() === group }), minRadius = Math.min.apply(null, pies.map(function(p) { return p.getSizeGroupLayout().radius })), layout = pies.filter(function(p) { return p.getSizeGroupLayout().radius === minRadius })[0].getSizeGroupLayout(); pies.forEach(function(p) { p.setPieSize({ x: layout.x, y: layout.y, radius: minRadius }) }) } function removeFromList(list, item) { return list.filter(function(li) { return li !== item }) } function addToList(list, item) { return removeFromList(list, item).concat(item) } var pies = [], timers = {}; return { queue: function(pie) { var group = pie.getSizeGroup(); pies = addToList(pies, pie); clearTimeout(timers[group]); timers[group] = setTimeout(function() { equalize(group, pies) }) }, remove: function(pie) { pies = removeFromList(pies, pie); if (!pies.length) { timers = {} } } } }() }, /*!********************************************!*\ !*** ./js/viz/translators/translator1d.js ***! \********************************************/ function(module, exports) { var _Number = Number; function Translator1D() { this.setDomain(arguments[0], arguments[1]).setCodomain(arguments[2], arguments[3]) } Translator1D.prototype = { constructor: Translator1D, setDomain: function(domain1, domain2) { var that = this; that._domain1 = _Number(domain1); that._domain2 = _Number(domain2); that._domainDelta = that._domain2 - that._domain1; return that }, setCodomain: function(codomain1, codomain2) { var that = this; that._codomain1 = _Number(codomain1); that._codomain2 = _Number(codomain2); that._codomainDelta = that._codomain2 - that._codomain1; return that }, getDomain: function() { return [this._domain1, this._domain2] }, getCodomain: function() { return [this._codomain1, this._codomain2] }, getDomainStart: function() { return this._domain1 }, getDomainEnd: function() { return this._domain2 }, getCodomainStart: function() { return this._codomain1 }, getCodomainEnd: function() { return this._codomain2 }, getDomainRange: function() { return this._domainDelta }, getCodomainRange: function() { return this._codomainDelta }, translate: function(value) { var ratio = (_Number(value) - this._domain1) / this._domainDelta; return 0 <= ratio && ratio <= 1 ? this._codomain1 + ratio * this._codomainDelta : NaN }, adjust: function(value) { var ratio = (_Number(value) - this._domain1) / this._domainDelta, result = NaN; if (ratio < 0) { result = this._domain1 } else { if (ratio > 1) { result = this._domain2 } else { if (0 <= ratio && ratio <= 1) { result = _Number(value) } } } return result } }; exports.Translator1D = Translator1D }, /*!*******************************!*\ !*** ./js/viz/polar_chart.js ***! \*******************************/ function(module, exports, __webpack_require__) { var noop = __webpack_require__( /*! ../core/utils/common */ 14).noop, registerComponent = __webpack_require__( /*! ../core/component_registrator */ 57), extend = __webpack_require__( /*! ../core/utils/extend */ 11).extend, vizUtils = __webpack_require__( /*! ./core/utils */ 509), AdvancedChart = __webpack_require__( /*! ./chart_components/advanced_chart */ 563).AdvancedChart, _noop = noop, DEFAULT_PANE_NAME = "default"; var dxPolarChart = AdvancedChart.inherit({ _chartType: "polar", _createPanes: function() { return [{ name: DEFAULT_PANE_NAME }] }, _checkPaneName: function() { return true }, _getAxisRenderingOptions: function(typeSelector) { var isArgumentAxis = "argumentAxis" === typeSelector, type = isArgumentAxis ? "circular" : "linear", useSpiderWeb = this.option("useSpiderWeb"); if (useSpiderWeb) { type += "Spider" } return { axisType: "polarAxes", drawingType: type } }, _prepareAxisOptions: function(typeSelector, axisOptions) { var isArgumentAxis = "argumentAxis" === typeSelector, themeManager = this._themeManager, axisUserOptions = this.option("argumentAxis"), argumentAxisOptions = themeManager.getOptions("argumentAxis", axisUserOptions) || {}, startAngle = isFinite(argumentAxisOptions.startAngle) ? vizUtils.normalizeAngle(argumentAxisOptions.startAngle) : 0; return { type: this.option("useSpiderWeb") && isArgumentAxis ? "discrete" : axisOptions.type, isHorizontal: true, showCustomBoundaryTicks: isArgumentAxis, startAngle: startAngle, endAngle: startAngle + 360 } }, _optionChangesMap: { useSpiderWeb: "REINIT" }, _getExtraOptions: function() { return { spiderWidget: this.option("useSpiderWeb") } }, _prepareToRender: function() { this._appendAxesGroups(); return {} }, _renderAxes: function(drawOptions) { this._drawAxes(drawOptions) }, _getValueAxis: function() { return this._valueAxes[0] }, _prepareAxesAndDraw: function(drawOptions, panesBorderOptions) { var that = this, valueAxis = that._getValueAxis(), argumentAxis = that._getArgumentAxis(); var canvas = that._calcCanvas(argumentAxis.measureLabels(true)); argumentAxis.draw(canvas); valueAxis.setSpiderTicks(argumentAxis.getSpiderTicks()); valueAxis.draw(canvas) }, _shrinkAxes: function(drawOptions, sizeShortage) { var valueAxis = this._getValueAxis(), argumentAxis = this._getArgumentAxis(); if (sizeShortage.width || sizeShortage.height) { argumentAxis.hideOuterElements(); argumentAxis.updateSize(this._canvas); valueAxis.updateSize(this._canvas) } }, _calcCanvas: function(measure) { var canvas = extend({}, this._canvas); canvas.left += measure.width; canvas.right += measure.width; canvas.top += measure.height; canvas.bottom += measure.height; return canvas }, _getLayoutTargets: function() { return [{ canvas: this._canvas }] }, _getSeriesForPane: function() { return this.series }, _applyExtraSettings: _noop, _updateLegendPosition: _noop, _createScrollBar: _noop, _applyClipRects: _noop, _isRotated: _noop, _getCrosshairOptions: _noop, _isLegendInside: _noop, _processSingleSeries: _noop }); registerComponent("dxPolarChart", dxPolarChart); module.exports = dxPolarChart }, /*!********************************!*\ !*** ./js/viz/linear_gauge.js ***! \********************************/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__( /*! ./gauges/linear_gauge */ 588) }, /*!***************************************!*\ !*** ./js/viz/gauges/linear_gauge.js ***! \***************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), _max = Math.max, _min = Math.min, _round = Math.round, _each = $.each, registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, objectUtils = __webpack_require__( /*! ../../core/utils/object */ 27), dxBaseGauge = __webpack_require__( /*! ./base_gauge */ 589).dxBaseGauge, dxGauge = __webpack_require__( /*! ./common */ 591).dxGauge, _normalizeEnum = __webpack_require__( /*! ../core/utils */ 509).normalizeEnum, linearIndicatorsModule = __webpack_require__( /*! ./linear_indicators */ 592), createIndicatorCreator = __webpack_require__( /*! ./common */ 591).createIndicatorCreator, LinearRangeContainer = __webpack_require__( /*! ./linear_range_container */ 594), ThemeManager = __webpack_require__( /*! ./theme_manager */ 596); var dxLinearGauge = dxGauge.inherit({ _rootClass: "dxg-linear-gauge", _factoryMethods: { rangeContainer: "createLinearRangeContainer", indicator: "createLinearIndicator" }, _gridSpacingFactor: 25, _scaleTypes: { type: "xyAxes", drawingType: "linear" }, _getTicksOrientation: function(scaleOptions) { return scaleOptions.isHorizontal ? scaleOptions.verticalOrientation : scaleOptions.horizontalOrientation }, _updateScaleTickIndent: function(scaleOptions) { var orientation, textCorrection, tickCorrection, indentFromTick = scaleOptions.label.indentFromTick, length = scaleOptions.tick.length, textParams = this._scale.measureLabels(), verticalTextCorrection = scaleOptions.isHorizontal ? textParams.height + textParams.y : 0, isIndentPositive = indentFromTick > 0; if (scaleOptions.isHorizontal) { orientation = isIndentPositive ? { center: .5, middle: .5, top: 0, bottom: 1 } : { center: .5, middle: .5, top: 1, bottom: 0 }; tickCorrection = length * orientation[scaleOptions.verticalOrientation]; textCorrection = textParams.y } else { orientation = isIndentPositive ? { center: .5, left: 0, right: 1 } : { center: .5, left: 1, right: 0 }; tickCorrection = length * orientation[scaleOptions.horizontalOrientation]; textCorrection = -textParams.width } scaleOptions.label.indentFromAxis = -indentFromTick + (isIndentPositive ? -tickCorrection + textCorrection : tickCorrection - verticalTextCorrection); this._scale.updateOptions(scaleOptions) }, _shiftScale: function(layout, scaleOptions) { var that = this, canvas = extend({}, that._canvas), isHorizontal = scaleOptions.isHorizontal, scale = that._scale; canvas[isHorizontal ? "left" : "top"] = that._area[isHorizontal ? "startCoord" : "endCoord"]; canvas[isHorizontal ? "right" : "bottom"] = canvas[isHorizontal ? "width" : "height"] - that._area[isHorizontal ? "endCoord" : "startCoord"]; scale.draw(canvas); scale.shift({ left: -layout.x, top: -layout.y }) }, _setupCodomain: function() { var that = this, geometry = that.option("geometry") || {}, vertical = "vertical" === _normalizeEnum(geometry.orientation); that._area = { vertical: vertical, x: 0, y: 0, startCoord: -100, endCoord: 100 }; that._rangeContainer.vertical = vertical }, _getScaleLayoutValue: function() { return this._area[this._area.vertical ? "x" : "y"] }, _getTicksCoefficients: function(options) { var coefs = { inner: 0, outer: 1 }; if (this._area.vertical) { if ("left" === options.horizontalOrientation) { coefs.inner = 1; coefs.outer = 0 } else { if ("center" === options.horizontalOrientation) { coefs.inner = coefs.outer = .5 } } } else { if ("top" === options.verticalOrientation) { coefs.inner = 1; coefs.outer = 0 } else { if ("center" === options.verticalOrientation || "middle" === options.verticalOrientation) { coefs.inner = coefs.outer = .5 } } } return coefs }, _correctScaleIndents: function(result, indentFromTick, textParams) { var vertical = this._area.vertical; if (indentFromTick >= 0) { result.max += indentFromTick + textParams[vertical ? "width" : "height"] } else { result.min -= -indentFromTick + textParams[vertical ? "width" : "height"] } result.indent = textParams[vertical ? "height" : "width"] / 2 }, _measureMainElements: function(elements, scaleMeasurement) { var that = this, x = that._area.x, y = that._area.y, minBound = 1e3, maxBound = 0, indent = 0, scale = that._scale; _each(elements.concat(scale), function(_, element) { var bounds = element.measure ? element.measure({ x: x + element.getOffset(), y: y + element.getOffset() }) : scaleMeasurement; void 0 !== bounds.max && (maxBound = _max(maxBound, bounds.max)); void 0 !== bounds.min && (minBound = _min(minBound, bounds.min)); bounds.indent > 0 && (indent = _max(indent, bounds.indent)) }); return { minBound: minBound, maxBound: maxBound, indent: indent } }, _applyMainLayout: function(elements, scaleMeasurement) { var rect, offset, that = this, measurements = that._measureMainElements(elements, scaleMeasurement), area = that._area; if (area.vertical) { rect = selectRectBySizes(that._innerRect, { width: measurements.maxBound - measurements.minBound }); offset = (rect.left + rect.right) / 2 - (measurements.minBound + measurements.maxBound) / 2; area.startCoord = rect.bottom - measurements.indent; area.endCoord = rect.top + measurements.indent; area.x = _round(area.x + offset) } else { rect = selectRectBySizes(that._innerRect, { height: measurements.maxBound - measurements.minBound }); offset = (rect.top + rect.bottom) / 2 - (measurements.minBound + measurements.maxBound) / 2; area.startCoord = rect.left + measurements.indent; area.endCoord = rect.right - measurements.indent; area.y = _round(area.y + offset) } that._translator.setCodomain(area.startCoord, area.endCoord); that._innerRect = rect }, _getElementLayout: function(offset) { return { x: _round(this._area.x + offset), y: _round(this._area.y + offset) } }, _getApproximateScreenRange: function() { var that = this, area = that._area, s = area.vertical ? that._canvas.height : that._canvas.width; s > area.totalSize && (s = area.totalSize); s = .8 * s; return s }, _getDefaultSize: function() { var geometry = this.option("geometry") || {}; if ("vertical" === geometry.orientation) { return { width: 100, height: 300 } } else { return { width: 300, height: 100 } } }, _factory: objectUtils.clone(dxBaseGauge.prototype._factory) }); function selectRectBySizes(srcRect, sizes, margins) { var step, rect = extend({}, srcRect); margins = margins || {}; if (sizes) { rect.left += margins.left || 0; rect.right -= margins.right || 0; rect.top += margins.top || 0; rect.bottom -= margins.bottom || 0; if (sizes.width > 0) { step = (rect.right - rect.left - sizes.width) / 2; if (step > 0) { rect.left += step; rect.right -= step } } if (sizes.height > 0) { step = (rect.bottom - rect.top - sizes.height) / 2; if (step > 0) { rect.top += step; rect.bottom -= step } } } return rect } dxLinearGauge._TESTS_selectRectBySizes = selectRectBySizes; var indicators = dxLinearGauge.prototype._factory.indicators = {}; dxLinearGauge.prototype._factory.createIndicator = createIndicatorCreator(indicators); indicators._default = linearIndicatorsModule._default; indicators.rectangle = linearIndicatorsModule.rectangle; indicators.rhombus = linearIndicatorsModule.rhombus; indicators.circle = linearIndicatorsModule.circle; indicators.trianglemarker = linearIndicatorsModule.trianglemarker; indicators.textcloud = linearIndicatorsModule.textcloud; indicators.rangebar = linearIndicatorsModule.rangebar; dxLinearGauge.prototype._factory.RangeContainer = LinearRangeContainer; dxLinearGauge.prototype._factory.ThemeManager = ThemeManager.inherit({ _subTheme: "_linear" }); registerComponent("dxLinearGauge", dxLinearGauge); module.exports = dxLinearGauge }, /*!*************************************!*\ !*** ./js/viz/gauges/base_gauge.js ***! \*************************************/ function(module, exports, __webpack_require__) { var _Number = Number, _getAppropriateFormat = __webpack_require__( /*! ../core/utils */ 509).getAppropriateFormat, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, translator1DModule = __webpack_require__( /*! ../translators/translator1d */ 585), _extend = extend, BaseWidget = __webpack_require__( /*! ../core/base_widget */ 515), _normalizeEnum = __webpack_require__( /*! ../core/utils */ 509).normalizeEnum, commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), Tracker = __webpack_require__( /*! ./tracker */ 590), _isString = commonUtils.isString; var dxBaseGauge = BaseWidget.inherit({ _rootClassPrefix: "dxg", _createThemeManager: function() { return new this._factory.ThemeManager }, _setDeprecatedOptions: function() { this.callBase(); _extend(this._deprecatedOptions, { subtitle: { since: "15.2", message: "Use the 'title.subtitle' option instead" }, "title.position": { since: "15.2", message: "Use the 'verticalAlignment' and 'horizontalAlignment' options instead" }, "scale.hideFirstTick": { since: "15.2", message: "The functionality is not more available" }, "scale.hideLastTick": { since: "15.2", message: "The functionality is not more available" }, "scale.hideFirstLabel": { since: "15.2", message: "The functionality is not more available" }, "scale.hideLastLabel": { since: "15.2", message: "The functionality is not more available" }, "scale.majorTick": { since: "15.2", message: "Use the 'tick' option instead" }, "scale.minorTick.showCalculatedTicks": { since: "15.2", message: "The functionality is not more available" }, "scale.minorTick.customTickValues": { since: "15.2", message: "Use the 'customMinorTicks' option instead" }, "scale.minorTick.tickInterval": { since: "15.2", message: "Use the 'minorTickInterval' option instead" }, "scale.label.overlappingBehavior.useAutoArrangement": { since: "17.1", message: "Use the 'scale.label.overlappingBehavior' option instead" }, "scale.label.overlappingBehavior.hideFirstOrLast": { since: "17.1", message: "Use the 'scale.label.hideFirstOrLast' option instead" } }) }, _initCore: function() { var that = this, root = that._renderer.root; that._valueChangingLocker = 0; that._translator = that._factory.createTranslator(); that._initDeltaIndicator(); that._tracker = that._factory.createTracker({ renderer: that._renderer, container: root }); that._setTrackerCallbacks() }, _beginValueChanging: function() { this._resetIsReady(); ++this._valueChangingLocker }, _endValueChanging: function() { if (0 === --this._valueChangingLocker) { this._drawn() } }, _initDeltaIndicator: function() { var that = this, DeltaIndicator = that._DeltaIndicator; if (DeltaIndicator) { that._deltaIndicator = new DeltaIndicator({ renderer: that._renderer, container: that._renderer.root }); that._deltaIndicator.layoutOptions = function() { this.clean(); this.draw(that._getOption("indicator")); var options = this.getLayoutOptions(); this._size = options ? [options.width, options.height] : null; return options && { horizontalAlignment: options.horizontalAlignment || "center", verticalAlignment: options.verticalAlignment || "bottom" } }; that._deltaIndicator.measure = function() { return this._size }; that._deltaIndicator.move = function(rect) { return this.shift(Math.round(rect[0]), Math.round(rect[1])) }; that._layout.add(that._deltaIndicator) } }, _disposeDeltaIndicator: function() { if (this._deltaIndicator) { this._deltaIndicator.clean(); this._deltaIndicator.dispose() } }, _setTrackerCallbacks: function() { var that = this, renderer = that._renderer, tooltip = that._tooltip; that._tracker.setCallbacks({ "tooltip-show": function(target, info) { var tooltipParameters = target.getTooltipParameters(), offset = renderer.getRootOffset(), formatObject = _extend({ value: tooltipParameters.value, valueText: tooltip.formatValue(tooltipParameters.value), color: tooltipParameters.color }, info); return tooltip.show(formatObject, { x: tooltipParameters.x + offset.left, y: tooltipParameters.y + offset.top, offset: tooltipParameters.offset }, { target: info }) }, "tooltip-hide": function() { return tooltip.hide() } }) }, _dispose: function() { this._cleanCore(); this.callBase.apply(this, arguments) }, _disposeCore: function() { var that = this; that._themeManager.dispose(); that._tracker.dispose(); that._disposeDeltaIndicator(); that._translator = that._tracker = null }, _cleanCore: function() { var that = this; that._tracker.deactivate(); that._cleanContent() }, _renderCore: function() { var that = this; if (!that._isValidDomain) { return } that._renderContent(); that._tracker.setTooltipState(that._tooltip.isEnabled()); that._tracker.activate(); that._noAnimation = false; that._debug_rendered && that._debug_rendered() }, _applyChanges: function() { this.callBase.apply(this, arguments); this._resizing = this._noAnimation = false }, _setContentSize: function() { var that = this; that._resizing = that._noAnimation = 2 === that._changes.count(); that.callBase.apply(that, arguments) }, _applySize: function(rect) { var that = this; that._DEBUG_rootRect = rect; that._innerRect = { left: rect[0], top: rect[1], right: rect[2], bottom: rect[3] }; var layoutCache = that._layout._cache; that._cleanCore(); that._renderCore(); that._layout._cache = that._layout._cache || layoutCache; return [rect[0], that._innerRect.top, rect[2], that._innerRect.bottom] }, _initialChanges: ["DOMAIN"], _themeDependentChanges: ["DOMAIN"], _optionChangesMap: { subtitle: "MOSTLY_TOTAL", indicator: "MOSTLY_TOTAL", geometry: "MOSTLY_TOTAL", animation: "MOSTLY_TOTAL", startValue: "DOMAIN", endValue: "DOMAIN" }, _optionChangesOrder: ["DOMAIN", "MOSTLY_TOTAL"], _change_DOMAIN: function() { this._setupDomain() }, _change_MOSTLY_TOTAL: function() { this._applyMostlyTotalChange() }, _setupDomain: function() { var that = this; that._setupDomainCore(); that._isValidDomain = isFinite(1 / (that._translator.getDomain()[1] - that._translator.getDomain()[0])); if (!that._isValidDomain) { that._incidentOccurred("W2301") } that._change(["MOSTLY_TOTAL"]) }, _applyMostlyTotalChange: function() { var that = this; that._setupCodomain(); that._setupAnimationSettings(); that._setupDefaultFormat(); that._change(["LAYOUT"]) }, _setupAnimationSettings: function() { var that = this, option = that.option("animation"); that._animationSettings = null; if (void 0 === option || option) { option = _extend({ enabled: true, duration: 1e3, easing: "easeOutCubic" }, option); if (option.enabled && option.duration > 0) { that._animationSettings = { duration: _Number(option.duration), easing: option.easing } } } that._containerBackgroundColor = that.option("containerBackgroundColor") || that._themeManager.theme().containerBackgroundColor }, _setupDefaultFormat: function() { var domain = this._translator.getDomain(); this._defaultFormatOptions = _getAppropriateFormat(domain[0], domain[1], this._getApproximateScreenRange()) }, _setupDomainCore: null, _calculateSize: null, _cleanContent: null, _renderContent: null, _setupCodomain: null, _getApproximateScreenRange: null, _factory: { createTranslator: function() { return new translator1DModule.Translator1D }, createTracker: function(parameters) { return new Tracker(parameters) } } }); exports.dxBaseGauge = dxBaseGauge; var _format = __webpack_require__( /*! ../core/format */ 530); var formatValue = function(value, options, extra) { options = options || {}; var formatObject, text = _format(value, options); if ("function" === typeof options.customizeText) { formatObject = _extend({ value: value, valueText: text }, extra); return String(options.customizeText.call(formatObject, formatObject)) } return text }; var getSampleText = function(translator, options) { var text1 = formatValue(translator.getDomainStart(), options), text2 = formatValue(translator.getDomainEnd(), options); return text1.length >= text2.length ? text1 : text2 }; exports.formatValue = formatValue; exports.getSampleText = getSampleText; exports.compareArrays = function(array1, array2) { return array1 && array2 && array1.length === array2.length && compareArraysElements(array1, array2) }; function compareArraysElements(array1, array2) { var i, ii = array1.length; for (i = 0; i < ii; ++i) { if (array1[i] !== array2[i]) { return false } } return true } dxBaseGauge.addPlugin(__webpack_require__( /*! ../core/export */ 511).plugin); dxBaseGauge.addPlugin(__webpack_require__( /*! ../core/title */ 558).plugin); dxBaseGauge.addPlugin(__webpack_require__( /*! ../core/tooltip */ 559).plugin); dxBaseGauge.addPlugin(__webpack_require__( /*! ../core/loading_indicator */ 560).plugin); var _setTooltipOptions = dxBaseGauge.prototype._setTooltipOptions; dxBaseGauge.prototype._setTooltipOptions = function() { _setTooltipOptions.apply(this, arguments); this._tracker && this._tracker.setTooltipState(this._tooltip.isEnabled()) }; function processTitleOptions(options) { return _isString(options) ? { text: options } : options || {} } dxBaseGauge.prototype._getTitleOptions = function() { var options, position, that = this, titleOptions = processTitleOptions(that.option("title")); that._suppressDeprecatedWarnings(); titleOptions.subtitle = extend(processTitleOptions(titleOptions.subtitle), processTitleOptions(that.option("subtitle"))); that._resumeDeprecatedWarnings(); options = _extend(true, {}, that._themeManager.theme("title"), titleOptions); if (options.position) { position = _normalizeEnum(options.position).split("-"); options.verticalAlignment = position[0]; options.horizontalAlignment = position[1] } return options } }, /*!**********************************!*\ !*** ./js/viz/gauges/tracker.js ***! \**********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), _abs = Math.abs, Class = __webpack_require__( /*! ../../core/class */ 25), wheelEvent = __webpack_require__( /*! ../../events/core/wheel */ 85), TOOLTIP_SHOW_DELAY = 300, TOOLTIP_HIDE_DELAY = 300, TOOLTIP_TOUCH_SHOW_DELAY = 400, TOOLTIP_TOUCH_HIDE_DELAY = 300; var Tracker = Class.inherit({ ctor: function(parameters) { var debug = __webpack_require__( /*! ../../core/utils/console */ 13).debug; debug.assertParam(parameters, "parameters"); debug.assertParam(parameters.renderer, "parameters.renderer"); debug.assertParam(parameters.container, "parameters.container"); var that = this; that._element = parameters.renderer.g().attr({ "class": "dxg-tracker", stroke: "none", "stroke-width": 0, fill: "#000000", opacity: 1e-4 }).linkOn(parameters.container, { name: "tracker", after: "peripheral" }); that._showTooltipCallback = function() { that._showTooltipTimeout = null; var target = that._tooltipEvent.target, data_target = target["gauge-data-target"], data_info = target["gauge-data-info"]; that._targetEvent = null; if (that._tooltipTarget !== target && that._callbacks["tooltip-show"](data_target, data_info)) { that._tooltipTarget = target } }; that._hideTooltipCallback = function() { that._hideTooltipTimeout = null; that._targetEvent = null; if (that._tooltipTarget) { that._callbacks["tooltip-hide"](); that._tooltipTarget = null } }; that._dispose = function() { clearTimeout(that._showTooltipTimeout); clearTimeout(that._hideTooltipTimeout); that._showTooltipCallback = that._hideTooltipCallback = that._dispose = null }; that._DEBUG_showTooltipTimeoutSet = that._DEBUG_showTooltipTimeoutCleared = that._DEBUG_hideTooltipTimeoutSet = that._DEBUG_hideTooltipTimeoutCleared = 0; that.TOOLTIP_SHOW_DELAY = TOOLTIP_SHOW_DELAY; that.TOOLTIP_HIDE_DELAY = TOOLTIP_HIDE_DELAY; that.TOOLTIP_TOUCH_SHOW_DELAY = TOOLTIP_TOUCH_SHOW_DELAY; that.TOOLTIP_TOUCH_HIDE_DELAY = TOOLTIP_TOUCH_HIDE_DELAY }, dispose: function() { var that = this; that._dispose(); that.deactivate(); that._element.linkOff(); that._element = that._context = that._callbacks = null; return that }, activate: function() { this._element.linkAppend(); return this }, deactivate: function() { this._element.linkRemove().clear(); return this }, attach: function(element, target, info) { element.data({ "gauge-data-target": target, "gauge-data-info": info }).append(this._element); return this }, detach: function(element) { element.remove(); return this }, setTooltipState: function(state) { var data, that = this; that._element.off(tooltipMouseEvents).off(tooltipTouchEvents).off(tooltipMouseWheelEvents); if (state) { data = { tracker: that }; that._element.on(tooltipMouseEvents, data).on(tooltipTouchEvents, data).on(tooltipMouseWheelEvents, data) } return that }, setCallbacks: function(callbacks) { this._callbacks = callbacks; return this }, _showTooltip: function(event, delay) { var that = this; that._hideTooltipTimeout && ++that._DEBUG_hideTooltipTimeoutCleared; clearTimeout(that._hideTooltipTimeout); that._hideTooltipTimeout = null; if (that._tooltipTarget === event.target) { return } clearTimeout(that._showTooltipTimeout); that._tooltipEvent = event; ++that._DEBUG_showTooltipTimeoutSet; that._showTooltipTimeout = setTimeout(that._showTooltipCallback, delay) }, _hideTooltip: function(delay) { var that = this; that._showTooltipTimeout && ++that._DEBUG_showTooltipTimeoutCleared; clearTimeout(that._showTooltipTimeout); that._showTooltipTimeout = null; clearTimeout(that._hideTooltipTimeout); if (delay) { ++that._DEBUG_hideTooltipTimeoutSet; that._hideTooltipTimeout = setTimeout(that._hideTooltipCallback, delay) } else { that._hideTooltipCallback() } } }); var tooltipMouseEvents = { "mouseover.gauge-tooltip": handleTooltipMouseOver, "mouseout.gauge-tooltip": handleTooltipMouseOut }; var tooltipMouseMoveEvents = { "mousemove.gauge-tooltip": handleTooltipMouseMove }; var tooltipMouseWheelEvents = {}; tooltipMouseWheelEvents[wheelEvent.name + ".gauge-tooltip"] = handleTooltipMouseWheel; var tooltipTouchEvents = { "touchstart.gauge-tooltip": handleTooltipTouchStart }; function handleTooltipMouseOver(event) { var tracker = event.data.tracker; tracker._x = event.pageX; tracker._y = event.pageY; tracker._element.off(tooltipMouseMoveEvents).on(tooltipMouseMoveEvents, event.data); tracker._showTooltip(event, TOOLTIP_SHOW_DELAY) } function handleTooltipMouseMove(event) { var tracker = event.data.tracker; if (tracker._showTooltipTimeout && _abs(event.pageX - tracker._x) > 4 || _abs(event.pageY - tracker._y) > 4) { tracker._x = event.pageX; tracker._y = event.pageY; tracker._showTooltip(event, TOOLTIP_SHOW_DELAY) } } function handleTooltipMouseOut(event) { var tracker = event.data.tracker; tracker._element.off(tooltipMouseMoveEvents); tracker._hideTooltip(TOOLTIP_HIDE_DELAY) } function handleTooltipMouseWheel(event) { event.data.tracker._hideTooltip() } var active_touch_tooltip_tracker = null; Tracker._DEBUG_reset = function() { active_touch_tooltip_tracker = null }; function handleTooltipTouchStart(event) { event.preventDefault(); var tracker = active_touch_tooltip_tracker; if (tracker && tracker !== event.data.tracker) { tracker._hideTooltip(TOOLTIP_TOUCH_HIDE_DELAY) } tracker = active_touch_tooltip_tracker = event.data.tracker; tracker._showTooltip(event, TOOLTIP_TOUCH_SHOW_DELAY); tracker._touch = true } function handleTooltipDocumentTouchStart() { var tracker = active_touch_tooltip_tracker; if (tracker) { if (!tracker._touch) { tracker._hideTooltip(TOOLTIP_TOUCH_HIDE_DELAY); active_touch_tooltip_tracker = null } tracker._touch = null } } function handleTooltipDocumentTouchEnd() { var tracker = active_touch_tooltip_tracker; if (tracker) { if (tracker._showTooltipTimeout) { tracker._hideTooltip(TOOLTIP_TOUCH_HIDE_DELAY); active_touch_tooltip_tracker = null } } } $(window.document).on({ "touchstart.gauge-tooltip": handleTooltipDocumentTouchStart, "touchend.gauge-tooltip": handleTooltipDocumentTouchEnd }); module.exports = Tracker }, /*!*********************************!*\ !*** ./js/viz/gauges/common.js ***! \*********************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), dxBaseGauge = __webpack_require__( /*! ./base_gauge */ 589).dxBaseGauge, commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, _isDefined = commonUtils.isDefined, _isString = commonUtils.isString, _isArray = Array.isArray, _isNumber = commonUtils.isNumeric, rangeModule = __webpack_require__( /*! ../translators/range */ 564), axisModule = __webpack_require__( /*! ../axes/base_axis */ 565), _map = __webpack_require__( /*! ../core/utils */ 509).map, _normalizeEnum = __webpack_require__( /*! ../core/utils */ 509).normalizeEnum, _compareArrays = __webpack_require__( /*! ./base_gauge */ 589).compareArrays, _isFinite = isFinite, _Number = Number, _min = Math.min, _max = Math.max, _extend = extend, _each = $.each, _noop = commonUtils.noop, SHIFT_ANGLE = 90, OPTION_VALUE = "value", OPTION_SUBVALUES = "subvalues", DEFAULT_MINOR_AXIS_DIVISION_FACTOR = 5, DEFAULT_NUMBER_MULTIPLIERS = [1, 2, 5]; function processValue(value, fallbackValue) { return _isFinite(value) ? _Number(value) : fallbackValue } function parseArrayOfNumbers(arg) { return _isArray(arg) ? arg : _isNumber(arg) ? [arg] : null } exports.dxGauge = dxBaseGauge.inherit({ _initCore: function() { var that = this, renderer = that._renderer; that._setupValue(that.option(OPTION_VALUE)); that.__subvalues = parseArrayOfNumbers(that.option(OPTION_SUBVALUES)); that._setupSubvalues(that.__subvalues); selectMode(that); that.callBase.apply(that, arguments); that._rangeContainer = new that._factory.RangeContainer({ renderer: renderer, container: renderer.root, translator: that._translator, themeManager: that._themeManager }); that._initScale() }, _initScale: function() { var that = this; that._scaleGroup = that._renderer.g().attr({ "class": "dxg-scale" }).linkOn(that._renderer.root, "scale"); that._scale = new axisModule.Axis({ incidentOccurred: that._incidentOccurred, renderer: that._renderer, axesContainerGroup: that._scaleGroup, axisType: that._scaleTypes.type, drawingType: that._scaleTypes.drawingType, widgetClass: "dxg" }) }, _disposeCore: function() { var that = this; that.callBase.apply(that, arguments); that._scale.dispose(); that._scaleGroup.linkOff(); that._rangeContainer.dispose(); that._disposeValueIndicators(); that._scale = that._scaleGroup = that._rangeContainer = null }, _disposeValueIndicators: function() { var that = this; that._valueIndicator && that._valueIndicator.dispose(); that._subvalueIndicatorsSet && that._subvalueIndicatorsSet.dispose(); that._valueIndicator = that._subvalueIndicatorsSet = null }, _setupDomainCore: function() { var that = this, scaleOption = that.option("scale") || {}, startValue = that.option("startValue"), endValue = that.option("endValue"); startValue = _isNumber(startValue) ? _Number(startValue) : _isNumber(scaleOption.startValue) ? _Number(scaleOption.startValue) : 0; endValue = _isNumber(endValue) ? _Number(endValue) : _isNumber(scaleOption.endValue) ? _Number(scaleOption.endValue) : 100; that._baseValue = startValue < endValue ? startValue : endValue; that._translator.setDomain(startValue, endValue) }, _cleanContent: function() { var that = this; that._rangeContainer.clean(); that._cleanValueIndicators() }, _measureScale: function(scaleOptions) { var textParams, layoutValue, result, coefs, innerCoef, outerCoef, that = this, majorTick = scaleOptions.tick, majorTickEnabled = majorTick.visible && majorTick.length > 0 && majorTick.width > 0, minorTick = scaleOptions.minorTick, minorTickEnabled = minorTick.visible && minorTick.length > 0 && minorTick.width > 0, label = scaleOptions.label, indentFromTick = Number(label.indentFromTick); if (!majorTickEnabled && !minorTickEnabled && !label.visible) { return {} } textParams = that._scale.measureLabels(); layoutValue = that._getScaleLayoutValue(); result = { min: layoutValue, max: layoutValue }; coefs = that._getTicksCoefficients(scaleOptions); innerCoef = coefs.inner; outerCoef = coefs.outer; if (majorTickEnabled) { result.min = _min(result.min, layoutValue - innerCoef * majorTick.length); result.max = _max(result.max, layoutValue + outerCoef * majorTick.length) } if (minorTickEnabled) { result.min = _min(result.min, layoutValue - innerCoef * minorTick.length); result.max = _max(result.max, layoutValue + outerCoef * minorTick.length) } label.visible && that._correctScaleIndents(result, indentFromTick, textParams); return result }, _renderContent: function() { var elements, that = this, scaleOptions = that._prepareScaleSettings(); that._rangeContainer.render(_extend(that._getOption("rangeContainer"), { vertical: that._area.vertical })); that._renderScale(scaleOptions); elements = _map([that._rangeContainer].concat(that._prepareValueIndicators()), function(element) { return element && element.enabled ? element : null }); that._applyMainLayout(elements, that._measureScale(scaleOptions)); _each(elements, function(_, element) { element.resize(that._getElementLayout(element.getOffset())) }); that._shiftScale(that._getElementLayout(0), scaleOptions); that._beginValueChanging(); that._updateActiveElements(); that._endValueChanging() }, _prepareScaleSettings: function() { var that = this, scaleOptions = extend(true, {}, that._themeManager.theme("scale"), that.option("scale")), scaleMajorTick = scaleOptions.majorTick, scaleMinorTick = scaleOptions.minorTick, overlappingBehavior = scaleOptions.label.overlappingBehavior, useAutoArrangement = overlappingBehavior.useAutoArrangement; if (_isString(overlappingBehavior)) { overlappingBehavior = { mode: overlappingBehavior } } if (scaleMajorTick) { scaleOptions.tick = _extend(scaleOptions.tick, scaleMajorTick); useAutoArrangement = _isDefined(scaleMajorTick.useTickAutoArrangement) ? scaleMajorTick.useTickAutoArrangement : useAutoArrangement; void 0 !== scaleMajorTick.tickInterval && (scaleOptions.tickInterval = scaleMajorTick.tickInterval); void 0 !== scaleMajorTick.customTickValues && (scaleOptions.customTicks = scaleMajorTick.customTickValues); if (scaleOptions.customTicks) { scaleOptions.tick.showCalculatedTicks = void 0 !== scaleMajorTick.showCalculatedTicks ? scaleMajorTick.showCalculatedTicks : true } else { scaleOptions.tick.showCalculatedTicks = false } } overlappingBehavior.hideFirstTick = scaleOptions.hideFirstTick; overlappingBehavior.hideFirstLabel = scaleOptions.hideFirstLabel; overlappingBehavior.hideLastTick = scaleOptions.hideLastTick; overlappingBehavior.hideLastLabel = scaleOptions.hideLastLabel; if (!_isDefined(overlappingBehavior.hideFirstOrLast)) { overlappingBehavior.hideFirstOrLast = scaleOptions.label.hideFirstOrLast } if (_isDefined(useAutoArrangement)) { overlappingBehavior.mode = useAutoArrangement ? "hide" : "none" } void 0 !== scaleMinorTick.customTickValues && (scaleOptions.customMinorTicks = scaleOptions.minorTick.customTickValues); void 0 !== scaleMinorTick.tickInterval && (scaleOptions.minorTickInterval = scaleOptions.minorTick.tickInterval); if (scaleOptions.customMinorTicks) { scaleMinorTick.showCalculatedTicks = void 0 !== scaleMinorTick.showCalculatedTicks ? scaleMinorTick.showCalculatedTicks : true } else { scaleMinorTick.showCalculatedTicks = false } scaleOptions.label.indentFromAxis = 0; scaleOptions.isHorizontal = !that._area.vertical; scaleOptions.axisDivisionFactor = that._gridSpacingFactor; scaleOptions.minorAxisDivisionFactor = DEFAULT_MINOR_AXIS_DIVISION_FACTOR; scaleOptions.numberMultipliers = DEFAULT_NUMBER_MULTIPLIERS; scaleOptions.tickOrientation = that._getTicksOrientation(scaleOptions); if (scaleOptions.label.useRangeColors) { scaleOptions.label.customizeColor = function() { return that._rangeContainer.getColorForValue(this.value) } } scaleOptions.label.overlappingBehavior = overlappingBehavior; return scaleOptions }, _renderScale: function(scaleOptions) { var that = this, bounds = that._translator.getDomain(), startValue = bounds[0], endValue = bounds[1], angles = that._translator.getCodomain(); scaleOptions.min = startValue; scaleOptions.max = endValue; scaleOptions.startAngle = SHIFT_ANGLE - angles[0]; scaleOptions.endAngle = SHIFT_ANGLE - angles[1]; that._scale.updateOptions(scaleOptions); that._updateScaleTickIndent(scaleOptions); that._scale.setBusinessRange(new rangeModule.Range({ axisType: "continuous", dataType: "numeric", stick: true, minVisible: startValue, maxVisible: endValue, invert: startValue > endValue })); that._scaleGroup.linkAppend(); that._scale.draw(extend({}, that._canvas)) }, _updateIndicatorSettings: function(settings) { var that = this; settings.currentValue = settings.baseValue = _isFinite(that._translator.translate(settings.baseValue)) ? _Number(settings.baseValue) : that._baseValue; settings.vertical = that._area.vertical; if (settings.text && !settings.text.format && !settings.text.precision) { settings.text.format = that._defaultFormatOptions } }, _prepareIndicatorSettings: function(options, defaultTypeField) { var that = this, theme = that._themeManager.theme("valueIndicators"), type = _normalizeEnum(options.type || that._themeManager.theme(defaultTypeField)), settings = _extend(true, {}, theme._default, theme[type], options); settings.type = type; settings.animation = that._animationSettings; settings.containerBackgroundColor = that._containerBackgroundColor; that._updateIndicatorSettings(settings); return settings }, _cleanValueIndicators: function() { this._valueIndicator && this._valueIndicator.clean(); this._subvalueIndicatorsSet && this._subvalueIndicatorsSet.clean() }, _prepareValueIndicators: function() { var that = this; that._prepareValueIndicator(); null !== that.__subvalues && that._prepareSubvalueIndicators(); return [that._valueIndicator, that._subvalueIndicatorsSet] }, _updateActiveElements: function() { this._updateValueIndicator(); this._updateSubvalueIndicators() }, _prepareValueIndicator: function() { var that = this, target = that._valueIndicator, settings = that._prepareIndicatorSettings(that.option("valueIndicator") || {}, "valueIndicatorType"); if (target && target.type !== settings.type) { target.dispose(); target = null } if (!target) { target = that._valueIndicator = that._createIndicator(settings.type, that._renderer.root, "dxg-value-indicator", "value-indicator") } target.render(settings) }, _createSubvalueIndicatorsSet: function() { var that = this, root = that._renderer.root; return new ValueIndicatorsSet({ createIndicator: function(type, i) { return that._createIndicator(type, root, "dxg-subvalue-indicator", "subvalue-indicator", i) }, createPalette: function(palette) { return that._themeManager.createPalette(palette) } }) }, _prepareSubvalueIndicators: function() { var isRecreate, dummy, that = this, target = that._subvalueIndicatorsSet, settings = that._prepareIndicatorSettings(that.option("subvalueIndicator") || {}, "subvalueIndicatorType"); if (!target) { target = that._subvalueIndicatorsSet = that._createSubvalueIndicatorsSet() } isRecreate = settings.type !== target.type; target.type = settings.type; dummy = that._createIndicator(settings.type, that._renderer.root); if (dummy) { dummy.dispose(); target.render(settings, isRecreate) } }, _setupValue: function(value) { this.__value = processValue(value, this.__value) }, _setupSubvalues: function(subvalues) { var i, ii, list, vals = void 0 === subvalues ? this.__subvalues : parseArrayOfNumbers(subvalues); if (null === vals) { return } for (i = 0, ii = vals.length, list = []; i < ii; ++i) { list.push(processValue(vals[i], this.__subvalues[i])) } this.__subvalues = list }, _updateValueIndicator: function() { var that = this; that._valueIndicator && that._valueIndicator.value(that.__value, that._noAnimation) }, _updateSubvalueIndicators: function() { var that = this; that._subvalueIndicatorsSet && that._subvalueIndicatorsSet.values(that.__subvalues, that._noAnimation) }, value: function(arg) { if (void 0 !== arg) { this._changeValue(arg); return this } return this.__value }, subvalues: function(arg) { if (void 0 !== arg) { this._changeSubvalues(arg); return this } return null !== this.__subvalues ? this.__subvalues.slice() : void 0 }, _changeValue: function(value) { var that = this; that._setupValue(value); that._beginValueChanging(); that._updateValueIndicator(); if (that.__value !== that.option(OPTION_VALUE)) { that.option(OPTION_VALUE, that.__value) } that._endValueChanging() }, _changeSubvalues: function(subvalues) { var that = this; if (null !== that.__subvalues) { that._setupSubvalues(subvalues); that._beginValueChanging(); that._updateSubvalueIndicators(); that._endValueChanging() } else { that.__subvalues = parseArrayOfNumbers(subvalues); that._setContentSize(); that._renderContent() } if (!_compareArrays(that.__subvalues, that.option(OPTION_SUBVALUES))) { that.option(OPTION_SUBVALUES, that.__subvalues) } }, _optionChangesMap: { scale: "DOMAIN", rangeContainer: "MOSTLY_TOTAL", valueIndicator: "MOSTLY_TOTAL", subvalueIndicator: "MOSTLY_TOTAL", containerBackgroundColor: "MOSTLY_TOTAL", value: "VALUE", subvalues: "SUBVALUES", valueIndicators: "MOSTLY_TOTAL" }, _customChangesOrder: ["VALUE", "SUBVALUES"], _change_VALUE: function() { this._changeValue(this.option(OPTION_VALUE)) }, _change_SUBVALUES: function() { this._changeSubvalues(this.option(OPTION_SUBVALUES)) }, _applyMainLayout: null, _getElementLayout: null, _createIndicator: function(type, owner, className, trackerType, trackerIndex, _strict) { var that = this, indicator = that._factory.createIndicator({ renderer: that._renderer, translator: that._translator, owner: owner, tracker: that._tracker, className: className }, type, _strict); if (indicator) { indicator.type = type; indicator._trackerInfo = { type: trackerType, index: trackerIndex } } return indicator }, _getApproximateScreenRange: null }); function valueGetter(arg) { return arg ? arg.value : null } function setupValues(that, fieldName, optionItems) { var currentValues = that[fieldName], newValues = _isArray(optionItems) ? _map(optionItems, valueGetter) : [], i = 0, ii = newValues.length, list = []; for (; i < ii; ++i) { list.push(processValue(newValues[i], currentValues[i])) } that[fieldName] = list } function selectMode(gauge) { if (void 0 === gauge.option(OPTION_VALUE) && void 0 === gauge.option(OPTION_SUBVALUES)) { if (void 0 !== gauge.option("valueIndicators")) { disableDefaultMode(gauge); selectHardMode(gauge) } } } function disableDefaultMode(that) { that.value = that.subvalues = _noop; that._setupValue = that._setupSubvalues = that._updateValueIndicator = that._updateSubvalueIndicators = null } function selectHardMode(that) { that._indicatorValues = []; setupValues(that, "_indicatorValues", that.option("valueIndicators")); that._valueIndicators = []; var _applyMostlyTotalChange = that._applyMostlyTotalChange; that._applyMostlyTotalChange = function() { setupValues(this, "_indicatorValues", this.option("valueIndicators")); _applyMostlyTotalChange.call(this) }; that._updateActiveElements = updateActiveElements_hardMode; that._prepareValueIndicators = prepareValueIndicators_hardMode; that._disposeValueIndicators = disposeValueIndicators_hardMode; that._cleanValueIndicators = cleanValueIndicators_hardMode; that.indicatorValue = indicatorValue_hardMode } function updateActiveElements_hardMode() { var that = this; _each(that._valueIndicators, function(_, valueIndicator) { valueIndicator.value(that._indicatorValues[valueIndicator.index], that._noAnimation) }) } function prepareValueIndicators_hardMode() { var ii, that = this, valueIndicators = that._valueIndicators || [], userOptions = that.option("valueIndicators"), optionList = [], i = 0; for (ii = _isArray(userOptions) ? userOptions.length : 0; i < ii; ++i) { optionList.push(userOptions[i]) } for (ii = valueIndicators.length; i < ii; ++i) { optionList.push(null) } var newValueIndicators = []; _each(optionList, function(i, userSettings) { var valueIndicator = valueIndicators[i]; if (!userSettings) { valueIndicator && valueIndicator.dispose(); return } var settings = that._prepareIndicatorSettings(userSettings, "valueIndicatorType"); if (valueIndicator && valueIndicator.type !== settings.type) { valueIndicator.dispose(); valueIndicator = null } if (!valueIndicator) { valueIndicator = that._createIndicator(settings.type, that._renderer.root, "dxg-value-indicator", "value-indicator", i, true) } if (valueIndicator) { valueIndicator.index = i; valueIndicator.render(settings); newValueIndicators.push(valueIndicator) } }); that._valueIndicators = newValueIndicators; return that._valueIndicators } function disposeValueIndicators_hardMode() { _each(this._valueIndicators, function(_, valueIndicator) { valueIndicator.dispose() }); this._valueIndicators = null } function cleanValueIndicators_hardMode() { _each(this._valueIndicators, function(_, valueIndicator) { valueIndicator.clean() }) } function indicatorValue_hardMode(index, value) { return accessPointerValue(this, this._valueIndicators, this._indicatorValues, index, value) } function accessPointerValue(that, pointers, values, index, value) { if (void 0 !== value) { if (void 0 !== values[index]) { values[index] = processValue(value, values[index]); pointers[index] && pointers[index].value(values[index]) } return that } else { return values[index] } } function ValueIndicatorsSet(parameters) { this._parameters = parameters; this._indicators = [] } ValueIndicatorsSet.prototype = { constructor: ValueIndicatorsSet, dispose: function() { var that = this; _each(that._indicators, function(_, indicator) { indicator.dispose() }); that._parameters = that._options = that._indicators = that._colorPalette = that._palette = null; return that }, clean: function() { var that = this; that._sample && that._sample.clean().dispose(); _each(that._indicators, function(_, indicator) { indicator.clean() }); that._sample = that._options = that._palette = null; return that }, render: function(options, isRecreate) { var that = this; that._options = options; that._sample = that._parameters.createIndicator(that.type); that._sample.render(options); that.enabled = that._sample.enabled; that._palette = _isDefined(options.palette) ? that._parameters.createPalette(options.palette) : null; if (that.enabled) { that._generatePalette(that._indicators.length); that._indicators = _map(that._indicators, function(indicator, i) { if (isRecreate) { indicator.dispose(); indicator = that._parameters.createIndicator(that.type, i) } indicator.render(that._getIndicatorOptions(i)); return indicator }) } return that }, getOffset: function() { return _Number(this._options.offset) || 0 }, resize: function(layout) { var that = this; that._layout = layout; _each(that._indicators, function(_, indicator) { indicator.resize(layout) }); return that }, measure: function(layout) { return this._sample.measure(layout) }, _getIndicatorOptions: function(index) { var result = this._options; if (this._colorPalette) { result = _extend({}, result, { color: this._colorPalette[index] }) } return result }, _generatePalette: function(count) { var that = this, colors = null; if (that._palette) { colors = []; that._palette.reset(); var i = 0; for (; i < count; ++i) { colors.push(that._palette.getNextColor()) } } that._colorPalette = colors }, _adjustIndicatorsCount: function(count) { var i, ii, indicator, that = this, indicators = that._indicators, indicatorsLen = indicators.length; if (indicatorsLen > count) { for (i = count, ii = indicatorsLen; i < ii; ++i) { indicators[i].clean().dispose() } that._indicators = indicators.slice(0, count); that._generatePalette(indicators.length) } else { if (indicatorsLen < count) { that._generatePalette(count); for (i = indicatorsLen, ii = count; i < ii; ++i) { indicator = that._parameters.createIndicator(that.type, i); indicator.render(that._getIndicatorOptions(i)).resize(that._layout); indicators.push(indicator) } } } }, values: function(arg, _noAnimation) { var that = this; if (!that.enabled) { return } if (void 0 !== arg) { if (!_isArray(arg)) { arg = _isFinite(arg) ? [Number(arg)] : null } if (arg) { that._adjustIndicatorsCount(arg.length); _each(that._indicators, function(i, indicator) { indicator.value(arg[i], _noAnimation) }) } return that } return _map(that._indicators, function(indicator) { return indicator.value() }) } }; exports.createIndicatorCreator = function(indicators) { return function(parameters, type, _strict) { var indicatorType = indicators[_normalizeEnum(type)] || !_strict && indicators._default; return indicatorType ? new indicatorType(parameters) : null } } }, /*!********************************************!*\ !*** ./js/viz/gauges/linear_indicators.js ***! \********************************************/ function(module, exports, __webpack_require__) { var baseIndicatorsModule = __webpack_require__( /*! ./base_indicators */ 593), BaseIndicator = baseIndicatorsModule.BaseIndicator, BaseTextCloudMarker = baseIndicatorsModule.BaseTextCloudMarker, BaseRangeBar = baseIndicatorsModule.BaseRangeBar, _Number = Number, _normalizeEnum = __webpack_require__( /*! ../core/utils */ 509).normalizeEnum; var SimpleIndicator = BaseIndicator.inherit({ _move: function() { var that = this, delta = that._actualPosition - that._zeroPosition; that._rootElement.move(that.vertical ? 0 : delta, that.vertical ? delta : 0); that._trackerElement && that._trackerElement.move(that.vertical ? 0 : delta, that.vertical ? delta : 0) }, _isEnabled: function() { this.vertical = this._options.vertical; return this._options.length > 0 && this._options.width > 0 }, _isVisible: function() { return true }, _getTrackerSettings: function() { var x1, x2, y1, y2, options = this._options, width = options.width / 2, length = options.length / 2, p = this._zeroPosition; width > 10 || (width = 10); length > 10 || (length = 10); if (this.vertical) { x1 = options.x - length; x2 = options.x + length; y1 = p + width; y2 = p - width } else { x1 = p - width; x2 = p + width; y1 = options.y + length; y2 = options.y - length } return { points: [x1, y1, x1, y2, x2, y2, x2, y1] } }, _render: function() { var that = this; that._zeroPosition = that._translator.getCodomainStart() }, _clear: function() { delete this._element }, measure: function(layout) { var p = this.vertical ? layout.x : layout.y; return { min: p - this._options.length / 2, max: p + this._options.length / 2 } }, getTooltipParameters: function() { var that = this, options = that._options, p = that._actualPosition, parameters = { x: p, y: p, value: that._currentValue, color: options.color, offset: options.width / 2 }; that.vertical ? parameters.x = options.x : parameters.y = options.y; return parameters } }); var rectangle = SimpleIndicator.inherit({ _render: function() { var p, x1, x2, y1, y2, that = this, options = that._options; that.callBase(); p = that._zeroPosition; if (that.vertical) { x1 = options.x - options.length / 2; x2 = options.x + options.length / 2; y1 = p + options.width / 2; y2 = p - options.width / 2 } else { x1 = p - options.width / 2; x2 = p + options.width / 2; y1 = options.y + options.length / 2; y2 = options.y - options.length / 2 } that._element = that._element || that._renderer.path([], "area").append(that._rootElement); that._element.attr({ points: [x1, y1, x1, y2, x2, y2, x2, y1] }) } }); var rhombus = SimpleIndicator.inherit({ _render: function() { var x, y, dx, dy, that = this, options = that._options; that.callBase(); if (that.vertical) { x = options.x; y = that._zeroPosition; dx = options.length / 2 || 0; dy = options.width / 2 || 0 } else { x = that._zeroPosition; y = options.y; dx = options.width / 2 || 0; dy = options.length / 2 || 0 } that._element = that._element || that._renderer.path([], "area").append(that._rootElement); that._element.attr({ points: [x - dx, y, x, y - dy, x + dx, y, x, y + dy] }) } }); var circle = SimpleIndicator.inherit({ _render: function() { var x, y, r, that = this, options = that._options; that.callBase(); if (that.vertical) { x = options.x; y = that._zeroPosition } else { x = that._zeroPosition; y = options.y } r = options.length / 2 || 0; that._element = that._element || that._renderer.circle().append(that._rootElement); that._element.attr({ cx: x, cy: y, r: r }) } }); var triangleMarker = SimpleIndicator.inherit({ _isEnabled: function() { var that = this; that.vertical = that._options.vertical; that._inverted = that.vertical ? "right" === _normalizeEnum(that._options.horizontalOrientation) : "bottom" === _normalizeEnum(that._options.verticalOrientation); return that._options.length > 0 && that._options.width > 0 }, _isVisible: function() { return true }, _render: function() { var x1, x2, y1, y2, that = this, options = that._options, settings = { stroke: "none", "stroke-width": 0, "stroke-linecap": "square" }; that.callBase(); if (that.vertical) { x1 = options.x; y1 = that._zeroPosition; x2 = x1 + _Number(that._inverted ? options.length : -options.length); settings.points = [x1, y1, x2, y1 - options.width / 2, x2, y1 + options.width / 2] } else { y1 = options.y; x1 = that._zeroPosition; y2 = y1 + _Number(that._inverted ? options.length : -options.length); settings.points = [x1, y1, x1 - options.width / 2, y2, x1 + options.width / 2, y2] } if (options.space > 0) { settings["stroke-width"] = Math.min(options.space, options.width / 4) || 0; settings.stroke = settings["stroke-width"] > 0 ? options.containerBackgroundColor || "none" : "none" } that._element = that._element || that._renderer.path([], "area").append(that._rootElement); that._element.attr(settings).sharp() }, _getTrackerSettings: function() { var x1, x2, y1, y2, result, that = this, options = that._options, width = options.width / 2, length = _Number(options.length); width > 10 || (width = 10); length > 20 || (length = 20); if (that.vertical) { x1 = x2 = options.x; x2 = x1 + (that._inverted ? length : -length); y1 = that._zeroPosition + width; y2 = that._zeroPosition - width; result = [x1, y1, x2, y1, x2, y2, x1, y2] } else { y1 = options.y; y2 = y1 + (that._inverted ? length : -length); x1 = that._zeroPosition - width; x2 = that._zeroPosition + width; result = [x1, y1, x1, y2, x2, y2, x2, y1] } return { points: result } }, measure: function(layout) { var minBound, maxBound, that = this, length = _Number(that._options.length); if (that.vertical) { minBound = maxBound = layout.x; if (that._inverted) { maxBound = minBound + length } else { minBound = maxBound - length } } else { minBound = maxBound = layout.y; if (that._inverted) { maxBound = minBound + length } else { minBound = maxBound - length } } return { min: minBound, max: maxBound, indent: that._options.width / 2 } }, getTooltipParameters: function() { var that = this, options = that._options, s = (that._inverted ? options.length : -options.length) / 2, parameters = that.callBase(); that.vertical ? parameters.x += s : parameters.y += s; parameters.offset = options.length / 2; return parameters } }); var textCloud = BaseTextCloudMarker.inherit({ _isEnabled: function() { var that = this; that.vertical = that._options.vertical; that._inverted = that.vertical ? "right" === _normalizeEnum(that._options.horizontalOrientation) : "bottom" === _normalizeEnum(that._options.verticalOrientation); return true }, _isVisible: function() { return true }, _getTextCloudOptions: function() { var type, that = this, x = that._actualPosition, y = that._actualPosition; if (that.vertical) { x = that._options.x; type = that._inverted ? "top-left" : "top-right" } else { y = that._options.y; type = that._inverted ? "right-top" : "right-bottom" } return { x: x, y: y, type: type } }, measure: function(layout) { var minBound, maxBound, indent, that = this, arrowLength = _Number(that._options.arrowLength) || 0; that._measureText(); if (that.vertical) { indent = that._textFullHeight; if (that._inverted) { minBound = layout.x; maxBound = layout.x + arrowLength + that._textFullWidth } else { minBound = layout.x - arrowLength - that._textFullWidth; maxBound = layout.x } } else { indent = that._textFullWidth; if (that._inverted) { minBound = layout.y; maxBound = layout.y + arrowLength + that._textFullHeight } else { minBound = layout.y - arrowLength - that._textFullHeight; maxBound = layout.y } } return { min: minBound, max: maxBound, indent: indent } } }); var rangeBar = BaseRangeBar.inherit({ _isEnabled: function() { var that = this; that.vertical = that._options.vertical; that._inverted = that.vertical ? "right" === _normalizeEnum(that._options.horizontalOrientation) : "bottom" === _normalizeEnum(that._options.verticalOrientation); return that._options.size > 0 }, _isVisible: function() { return true }, _createBarItem: function() { return this._renderer.path([], "area").append(this._rootElement) }, _createTracker: function() { return this._renderer.path([], "area") }, _setBarSides: function() { var minSide, maxSide, that = this, options = that._options, size = _Number(options.size); if (that.vertical) { if (that._inverted) { minSide = options.x; maxSide = options.x + size } else { minSide = options.x - size; maxSide = options.x } } else { if (that._inverted) { minSide = options.y; maxSide = options.y + size } else { minSide = options.y - size; maxSide = options.y } } that._minSide = minSide; that._maxSide = maxSide; that._minBound = minSide; that._maxBound = maxSide }, _getSpace: function() { var options = this._options; return options.space > 0 ? _Number(options.space) : 0 }, _isTextVisible: function() { var textOptions = this._options.text || {}; return textOptions.indent > 0 || textOptions.indent < 0 }, _getTextAlign: function() { return this.vertical ? this._options.text.indent > 0 ? "left" : "right" : "center" }, _setTextItemsSides: function() { var that = this, indent = _Number(that._options.text.indent); if (indent > 0) { that._lineStart = that._maxSide; that._lineEnd = that._maxSide + indent; that._textPosition = that._lineEnd + (that.vertical ? 2 : that._textHeight / 2); that._maxBound = that._textPosition + (that.vertical ? that._textWidth : that._textHeight / 2) } else { if (indent < 0) { that._lineStart = that._minSide; that._lineEnd = that._minSide + indent; that._textPosition = that._lineEnd - (that.vertical ? 2 : that._textHeight / 2); that._minBound = that._textPosition - (that.vertical ? that._textWidth : that._textHeight / 2) } } }, _getPositions: function() { var mainPosition1, mainPosition2, backPosition1, backPosition2, that = this, startPosition = that._startPosition, endPosition = that._endPosition, space = that._space, basePosition = that._basePosition, actualPosition = that._actualPosition; if (startPosition < endPosition) { if (basePosition < actualPosition) { mainPosition1 = basePosition; mainPosition2 = actualPosition } else { mainPosition1 = actualPosition; mainPosition2 = basePosition } backPosition1 = mainPosition1 - space; backPosition2 = mainPosition2 + space } else { if (basePosition > actualPosition) { mainPosition1 = basePosition; mainPosition2 = actualPosition } else { mainPosition1 = actualPosition; mainPosition2 = basePosition } backPosition1 = mainPosition1 + space; backPosition2 = mainPosition2 - space } return { start: startPosition, end: endPosition, main1: mainPosition1, main2: mainPosition2, back1: backPosition1, back2: backPosition2 } }, _buildItemSettings: function(from, to) { var that = this, side1 = that._minSide, side2 = that._maxSide, points = that.vertical ? [side1, from, side1, to, side2, to, side2, from] : [from, side1, from, side2, to, side2, to, side1]; return { points: points } }, _updateTextPosition: function() { var that = this; that._text.attr(that.vertical ? { x: that._textPosition, y: that._actualPosition + that._textVerticalOffset } : { x: that._actualPosition, y: that._textPosition + that._textVerticalOffset }) }, _updateLinePosition: function() { var side1, side2, points, that = this, actualPosition = that._actualPosition; if (that.vertical) { if (that._basePosition >= actualPosition) { side1 = actualPosition; side2 = actualPosition + 2 } else { side1 = actualPosition - 2; side2 = actualPosition } points = [that._lineStart, side1, that._lineStart, side2, that._lineEnd, side2, that._lineEnd, side1] } else { if (that._basePosition <= actualPosition) { side1 = actualPosition - 2; side2 = actualPosition } else { side1 = actualPosition; side2 = actualPosition + 2 } points = [side1, that._lineStart, side1, that._lineEnd, side2, that._lineEnd, side2, that._lineStart] } that._line.attr({ points: points }).sharp() }, _getTooltipPosition: function() { var that = this, crossCenter = (that._minSide + that._maxSide) / 2, alongCenter = (that._basePosition + that._actualPosition) / 2; return that.vertical ? { x: crossCenter, y: alongCenter } : { x: alongCenter, y: crossCenter } }, measure: function(layout) { var minBound, maxBound, indent, that = this, size = _Number(that._options.size), textIndent = _Number(that._options.text.indent); that._measureText(); if (that.vertical) { minBound = maxBound = layout.x; if (that._inverted) { maxBound += size } else { minBound -= size } if (that._hasText) { indent = that._textHeight / 2; if (textIndent > 0) { maxBound += textIndent + that._textWidth } if (textIndent < 0) { minBound += textIndent - that._textWidth } } } else { minBound = maxBound = layout.y; if (that._inverted) { maxBound += size } else { minBound -= size } if (that._hasText) { indent = that._textWidth / 2; if (textIndent > 0) { maxBound += textIndent + that._textHeight } if (textIndent < 0) { minBound += textIndent - that._textHeight } } } return { min: minBound, max: maxBound, indent: indent } } }); exports._default = rangeBar; exports.rectangle = rectangle; exports.rhombus = rhombus; exports.circle = circle; exports.trianglemarker = triangleMarker; exports.textcloud = textCloud; exports.rangebar = rangeBar }, /*!******************************************!*\ !*** ./js/viz/gauges/base_indicators.js ***! \******************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, _isFinite = isFinite, _Number = Number, _round = Math.round, baseGaugeModule = __webpack_require__( /*! ./base_gauge */ 589), _formatValue = baseGaugeModule.formatValue, _getSampleText = baseGaugeModule.getSampleText, _patchFontOptions = __webpack_require__( /*! ../core/utils */ 509).patchFontOptions, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, Class = __webpack_require__( /*! ../../core/class */ 25); var BaseElement = Class.inherit({ ctor: function(parameters) { var that = this; $.each(parameters, function(name, value) { that["_" + name] = value }); that._init() }, dispose: function() { var that = this; that._dispose(); $.each(that, function(name) { that[name] = null }); return that }, getOffset: function() { return _Number(this._options.offset) || 0 } }); var BaseIndicator = BaseElement.inherit({ _init: function() { var that = this; that._rootElement = that._createRoot().linkOn(that._owner, { name: "value-indicator", after: "core" }); that._trackerElement = that._createTracker() }, _dispose: function() { this._rootElement.linkOff() }, _setupAnimation: function() { var that = this; if (that._options.animation) { that._animation = { step: function(pos) { that._actualValue = that._animation.start + that._animation.delta * pos; that._actualPosition = that._translator.translate(that._actualValue); that._move() }, duration: that._options.animation.duration > 0 ? _Number(that._options.animation.duration) : 0, easing: that._options.animation.easing } } }, _runAnimation: function(value) { var that = this, animation = that._animation; animation.start = that._actualValue; animation.delta = value - that._actualValue; that._rootElement.animate({ _: 0 }, { step: animation.step, duration: animation.duration, easing: animation.easing }) }, _createRoot: function() { return this._renderer.g().attr({ "class": this._className }) }, _createTracker: function() { return this._renderer.path([], "area") }, _getTrackerSettings: noop, clean: function() { var that = this; that._animation && that._rootElement.stopAnimation(); that._rootElement.linkRemove().clear(); that._clear(); that._tracker.detach(that._trackerElement); that._options = that.enabled = that._animation = null; return that }, render: function(options) { var that = this; that.type = options.type; that._options = options; that._actualValue = that._currentValue = that._translator.adjust(that._options.currentValue); that.enabled = that._isEnabled(); if (that.enabled) { that._setupAnimation(); that._rootElement.attr({ fill: that._options.color }).linkAppend(); that._tracker.attach(that._trackerElement, that, that._trackerInfo) } return that }, resize: function(layout) { var that = this; that._rootElement.clear(); that._clear(); that.visible = that._isVisible(layout); if (that.visible) { extend(that._options, layout); that._actualPosition = that._translator.translate(that._actualValue); that._render(); that._trackerElement.attr(that._getTrackerSettings()); that._move() } return that }, value: function(arg, _noAnimation) { var val, that = this; if (void 0 !== arg) { val = that._translator.adjust(arg); if (that._currentValue !== val && _isFinite(val)) { that._currentValue = val; if (that.visible) { if (that._animation && !_noAnimation) { that._runAnimation(val) } else { that._actualValue = val; that._actualPosition = that._translator.translate(val); that._move() } } } return that } return that._currentValue }, _isEnabled: null, _isVisible: null, _render: null, _clear: null, _move: null }); var COEFFICIENTS_MAP = {}; COEFFICIENTS_MAP["right-bottom"] = COEFFICIENTS_MAP.rb = [0, -1, -1, 0, 0, 1, 1, 0]; COEFFICIENTS_MAP["bottom-right"] = COEFFICIENTS_MAP.br = [-1, 0, 0, -1, 1, 0, 0, 1]; COEFFICIENTS_MAP["left-bottom"] = COEFFICIENTS_MAP.lb = [0, -1, 1, 0, 0, 1, -1, 0]; COEFFICIENTS_MAP["bottom-left"] = COEFFICIENTS_MAP.bl = [1, 0, 0, -1, -1, 0, 0, 1]; COEFFICIENTS_MAP["left-top"] = COEFFICIENTS_MAP.lt = [0, 1, 1, 0, 0, -1, -1, 0]; COEFFICIENTS_MAP["top-left"] = COEFFICIENTS_MAP.tl = [1, 0, 0, 1, -1, 0, 0, -1]; COEFFICIENTS_MAP["right-top"] = COEFFICIENTS_MAP.rt = [0, 1, -1, 0, 0, -1, 1, 0]; COEFFICIENTS_MAP["top-right"] = COEFFICIENTS_MAP.tr = [-1, 0, 0, 1, 1, 0, 0, -1]; function getTextCloudInfo(options) { var tailWidth, tailHeight, x = options.x, y = options.y, type = COEFFICIENTS_MAP[options.type], cloudWidth = options.textWidth + 2 * options.horMargin, cloudHeight = options.textHeight + 2 * options.verMargin, cx = x, cy = y; tailWidth = tailHeight = options.tailLength; if (1 & type[0]) { tailHeight = Math.min(tailHeight, cloudHeight / 3) } else { tailWidth = Math.min(tailWidth, cloudWidth / 3) } return { cx: _round(cx + type[0] * tailWidth + (type[0] + type[2]) * cloudWidth / 2), cy: _round(cy + type[1] * tailHeight + (type[1] + type[3]) * cloudHeight / 2), points: [_round(x), _round(y), _round(x += type[0] * (cloudWidth + tailWidth)), _round(y += type[1] * (cloudHeight + tailHeight)), _round(x += type[2] * cloudWidth), _round(y += type[3] * cloudHeight), _round(x += type[4] * cloudWidth), _round(y += type[5] * cloudHeight), _round(x += type[6] * (cloudWidth - tailWidth)), _round(y += type[7] * (cloudHeight - tailHeight))] } } var BaseTextCloudMarker = BaseIndicator.inherit({ _move: function() { var bBox, info, that = this, textCloudOptions = that._getTextCloudOptions(), text = _formatValue(that._actualValue, that._options.text); that._text.attr({ text: text }); bBox = that._text.getBBox(); info = getTextCloudInfo({ x: textCloudOptions.x, y: textCloudOptions.y, textWidth: bBox.width || text.length * that._textUnitWidth, textHeight: bBox.height || that._textHeight, horMargin: that._options.horizontalOffset, verMargin: that._options.verticalOffset, tailLength: that._options.arrowLength, type: textCloudOptions.type }); that._text.attr({ x: info.cx, y: info.cy + that._textVerticalOffset }); that._cloud.attr({ points: info.points }); that._trackerElement && that._trackerElement.attr({ points: info.points }) }, _measureText: function() { var root, text, bBox, sampleText, that = this; if (!that._textVerticalOffset) { root = that._createRoot().append(that._owner); sampleText = _getSampleText(that._translator, that._options.text); text = that._renderer.text(sampleText, 0, 0).attr({ align: "center" }).css(_patchFontOptions(that._options.text.font)).append(root); bBox = text.getBBox(); root.remove(); that._textVerticalOffset = -bBox.y - bBox.height / 2; that._textWidth = bBox.width; that._textHeight = bBox.height; that._textUnitWidth = that._textWidth / sampleText.length; that._textFullWidth = that._textWidth + 2 * that._options.horizontalOffset; that._textFullHeight = that._textHeight + 2 * that._options.verticalOffset } }, _render: function() { var that = this; that._measureText(); that._cloud = that._cloud || that._renderer.path([], "area").append(that._rootElement); that._text = that._text || that._renderer.text().append(that._rootElement); that._text.attr({ align: "center" }).css(_patchFontOptions(that._options.text.font)) }, _clear: function() { delete this._cloud; delete this._text }, getTooltipParameters: function() { var position = this._getTextCloudOptions(); return { x: position.x, y: position.y, value: this._currentValue, color: this._options.color } } }); var BaseRangeBar = BaseIndicator.inherit({ _measureText: function() { var root, text, bBox, that = this; that._hasText = that._isTextVisible(); if (that._hasText && !that._textVerticalOffset) { root = that._createRoot().append(that._owner); text = that._renderer.text(_getSampleText(that._translator, that._options.text), 0, 0).attr({ "class": "dxg-text", align: "center" }).css(_patchFontOptions(that._options.text.font)).append(root); bBox = text.getBBox(); root.remove(); that._textVerticalOffset = -bBox.y - bBox.height / 2; that._textWidth = bBox.width; that._textHeight = bBox.height } }, _move: function() { var that = this; that._updateBarItemsPositions(); if (that._hasText) { that._text.attr({ text: _formatValue(that._actualValue, that._options.text) }); that._updateTextPosition(); that._updateLinePosition() } }, _updateBarItems: function() { var backgroundColor, spaceColor, that = this, options = that._options, translator = that._translator; that._setBarSides(); that._startPosition = translator.translate(translator.getDomainStart()); that._endPosition = translator.translate(translator.getDomainEnd()); that._basePosition = translator.translate(options.baseValue); that._space = that._getSpace(); backgroundColor = options.backgroundColor || "none"; if ("none" !== backgroundColor && that._space > 0) { spaceColor = options.containerBackgroundColor || "none" } else { that._space = 0; spaceColor = "none" } that._backItem1.attr({ fill: backgroundColor }); that._backItem2.attr({ fill: backgroundColor }); that._spaceItem1.attr({ fill: spaceColor }); that._spaceItem2.attr({ fill: spaceColor }) }, _getSpace: function() { return 0 }, _updateTextItems: function() { var that = this; if (that._hasText) { that._line = that._line || that._renderer.path([], "line").attr({ "class": "dxg-main-bar", "stroke-linecap": "square" }).append(that._rootElement); that._text = that._text || that._renderer.text("", 0, 0).attr({ "class": "dxg-text" }).append(that._rootElement); that._text.attr({ align: that._getTextAlign() }).css(that._getFontOptions()); that._setTextItemsSides() } else { if (that._line) { that._line.remove(); delete that._line } if (that._text) { that._text.remove(); delete that._text } } }, _isTextVisible: function() { return false }, _getTextAlign: function() { return "center" }, _getFontOptions: function() { var options = this._options, font = options.text.font; if (!font || !font.color) { font = extend({}, font, { color: options.color }) } return _patchFontOptions(font) }, _updateBarItemsPositions: function() { var that = this, positions = that._getPositions(); that._backItem1.attr(that._buildItemSettings(positions.start, positions.back1)); that._backItem2.attr(that._buildItemSettings(positions.back2, positions.end)); that._spaceItem1.attr(that._buildItemSettings(positions.back1, positions.main1)); that._spaceItem2.attr(that._buildItemSettings(positions.main2, positions.back2)); that._mainItem.attr(that._buildItemSettings(positions.main1, positions.main2)); that._trackerElement && that._trackerElement.attr(that._buildItemSettings(positions.main1, positions.main2)) }, _render: function() { var that = this; that._measureText(); if (!that._backItem1) { that._backItem1 = that._createBarItem(); that._backItem1.attr({ "class": "dxg-back-bar" }) } if (!that._backItem2) { that._backItem2 = that._createBarItem(); that._backItem2.attr({ "class": "dxg-back-bar" }) } if (!that._spaceItem1) { that._spaceItem1 = that._createBarItem(); that._spaceItem1.attr({ "class": "dxg-space-bar" }) } if (!that._spaceItem2) { that._spaceItem2 = that._createBarItem(); that._spaceItem2.attr({ "class": "dxg-space-bar" }) } if (!that._mainItem) { that._mainItem = that._createBarItem(); that._mainItem.attr({ "class": "dxg-main-bar" }) } that._updateBarItems(); that._updateTextItems() }, _clear: function() { var that = this; delete that._backItem1; delete that._backItem2; delete that._spaceItem1; delete that._spaceItem2; delete that._mainItem; delete that._hasText; delete that._line; delete that._text }, getTooltipParameters: function() { var position = this._getTooltipPosition(); return { x: position.x, y: position.y, value: this._currentValue, color: this._options.color, offset: 0 } } }); exports.BaseElement = BaseElement; exports.BaseIndicator = BaseIndicator; exports.BaseTextCloudMarker = BaseTextCloudMarker; exports.BaseRangeBar = BaseRangeBar; exports.getTextCloudInfo = getTextCloudInfo }, /*!*************************************************!*\ !*** ./js/viz/gauges/linear_range_container.js ***! \*************************************************/ function(module, exports, __webpack_require__) { var BaseRangeContainer = __webpack_require__( /*! ./base_range_container */ 595), _Number = Number, _max = Math.max, _normalizeEnum = __webpack_require__( /*! ../core/utils */ 509).normalizeEnum; var LinearRangeContainer = BaseRangeContainer.inherit({ _processOptions: function() { var that = this; that.vertical = that._options.vertical; that._inner = that._outer = 0; if (that.vertical) { switch (_normalizeEnum(that._options.horizontalOrientation)) { case "left": that._inner = 1; break; case "center": that._inner = that._outer = .5; break; default: that._outer = 1 } } else { switch (_normalizeEnum(that._options.verticalOrientation)) { case "top": that._inner = 1; break; case "center": case "middle": that._inner = that._outer = .5; break; default: that._outer = 1 } } }, _isVisible: function() { return true }, _createRange: function(range, layout) { var points, that = this, inner = that._inner, outer = that._outer, startPosition = that._translator.translate(range.start), endPosition = that._translator.translate(range.end), x = layout.x, y = layout.y, startWidth = range.startWidth, endWidth = range.endWidth; if (that.vertical) { points = [x - startWidth * inner, startPosition, x - endWidth * inner, endPosition, x + endWidth * outer, endPosition, x + startWidth * outer, startPosition] } else { points = [startPosition, y + startWidth * outer, startPosition, y - startWidth * inner, endPosition, y - endWidth * inner, endPosition, y + endWidth * outer] } return that._renderer.path(points, "area") }, measure: function(layout) { var width, result = {}; result.min = result.max = layout[this.vertical ? "x" : "y"]; width = this._options.width; width = _Number(width) || _max(_Number(width.start), _Number(width.end)); result.min -= this._inner * width; result.max += this._outer * width; return result } }); module.exports = LinearRangeContainer }, /*!***********************************************!*\ !*** ./js/viz/gauges/base_range_container.js ***! \***********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), BaseElement = __webpack_require__( /*! ./base_indicators */ 593).BaseElement, _Number = Number, _abs = Math.abs, commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), _isString = commonUtils.isString, _isArray = Array.isArray, _isFinite = isFinite, _each = $.each, _map = $.map; var BaseRangeContainer = BaseElement.inherit({ _init: function() { this._root = this._renderer.g().attr({ "class": "dxg-range-container" }).linkOn(this._container, "range-container") }, _dispose: function() { this._root.linkOff() }, clean: function() { this._root.linkRemove().clear(); this._options = this.enabled = null; return this }, _getRanges: function() { var that = this, options = that._options, translator = that._translator, totalStart = translator.getDomain()[0], totalEnd = translator.getDomain()[1], totalDelta = totalEnd - totalStart, isNotEmptySegment = totalDelta >= 0 ? isNotEmptySegmentAsc : isNotEmptySegmentDesc, subtractSegment = totalDelta >= 0 ? subtractSegmentAsc : subtractSegmentDesc, list = [], ranges = [], backgroundRanges = [{ start: totalStart, end: totalEnd }], threshold = _abs(totalDelta) / 1e4, palette = that._themeManager.createPalette(options.palette, { type: "indicatingSet" }), backgroundColor = _isString(options.backgroundColor) ? options.backgroundColor : "none", width = options.width || {}, startWidth = _Number(width > 0 ? width : width.start), endWidth = _Number(width > 0 ? width : width.end), deltaWidth = endWidth - startWidth; if (void 0 !== options.ranges && !_isArray(options.ranges)) { return null } if (!(startWidth >= 0 && endWidth >= 0 && startWidth + endWidth > 0)) { return null } list = _map(_isArray(options.ranges) ? options.ranges : [], function(rangeOptions, i) { rangeOptions = rangeOptions || {}; var start = translator.adjust(rangeOptions.startValue), end = translator.adjust(rangeOptions.endValue); return _isFinite(start) && _isFinite(end) && isNotEmptySegment(start, end, threshold) ? { start: start, end: end, color: rangeOptions.color, classIndex: i } : null }); _each(list, function(i, item) { var paletteColor = palette.getNextColor(); item.color = _isString(item.color) && item.color || paletteColor || "none"; item.className = "dxg-range dxg-range-" + item.classIndex; delete item.classIndex }); _each(list, function(_, item) { var i, ii, sub, subs, range, newRanges = [], newBackgroundRanges = []; for (i = 0, ii = ranges.length; i < ii; ++i) { range = ranges[i]; subs = subtractSegment(range.start, range.end, item.start, item.end); (sub = subs[0]) && (sub.color = range.color) && (sub.className = range.className) && newRanges.push(sub); (sub = subs[1]) && (sub.color = range.color) && (sub.className = range.className) && newRanges.push(sub) } newRanges.push(item); ranges = newRanges; for (i = 0, ii = backgroundRanges.length; i < ii; ++i) { range = backgroundRanges[i]; subs = subtractSegment(range.start, range.end, item.start, item.end); (sub = subs[0]) && newBackgroundRanges.push(sub); (sub = subs[1]) && newBackgroundRanges.push(sub) } backgroundRanges = newBackgroundRanges }); _each(backgroundRanges, function(_, range) { range.color = backgroundColor; range.className = "dxg-range dxg-background-range"; ranges.push(range) }); _each(ranges, function(_, range) { range.startWidth = (range.start - totalStart) / totalDelta * deltaWidth + startWidth; range.endWidth = (range.end - totalStart) / totalDelta * deltaWidth + startWidth }); return ranges }, render: function(options) { var that = this; that._options = options; that._processOptions(); that._ranges = that._getRanges(); if (that._ranges) { that.enabled = true; that._root.linkAppend() } return that }, resize: function(layout) { var that = this; that._root.clear(); if (that._isVisible(layout)) { _each(that._ranges, function(_, range) { that._createRange(range, layout).attr({ fill: range.color, "class": range.className }).append(that._root) }) } return that }, _processOptions: null, _isVisible: null, _createRange: null, getColorForValue: function(value) { var color = null; _each(this._ranges, function(_, range) { if (range.start <= value && value <= range.end || range.start >= value && value >= range.end) { color = range.color; return false } }); return color } }); function subtractSegmentAsc(segmentStart, segmentEnd, otherStart, otherEnd) { var result; if (otherStart > segmentStart && otherEnd < segmentEnd) { result = [{ start: segmentStart, end: otherStart }, { start: otherEnd, end: segmentEnd }] } else { if (otherStart >= segmentEnd || otherEnd <= segmentStart) { result = [{ start: segmentStart, end: segmentEnd }] } else { if (otherStart <= segmentStart && otherEnd >= segmentEnd) { result = [] } else { if (otherStart > segmentStart) { result = [{ start: segmentStart, end: otherStart }] } else { if (otherEnd < segmentEnd) { result = [{ start: otherEnd, end: segmentEnd }] } } } } } return result } function subtractSegmentDesc(segmentStart, segmentEnd, otherStart, otherEnd) { var result; if (otherStart < segmentStart && otherEnd > segmentEnd) { result = [{ start: segmentStart, end: otherStart }, { start: otherEnd, end: segmentEnd }] } else { if (otherStart <= segmentEnd || otherEnd >= segmentStart) { result = [{ start: segmentStart, end: segmentEnd }] } else { if (otherStart >= segmentStart && otherEnd <= segmentEnd) { result = [] } else { if (otherStart < segmentStart) { result = [{ start: segmentStart, end: otherStart }] } else { if (otherEnd > segmentEnd) { result = [{ start: otherEnd, end: segmentEnd }] } } } } } return result } function isNotEmptySegmentAsc(start, end, threshold) { return end - start >= threshold } function isNotEmptySegmentDesc(start, end, threshold) { return start - end >= threshold } module.exports = BaseRangeContainer }, /*!****************************************!*\ !*** ./js/viz/gauges/theme_manager.js ***! \****************************************/ function(module, exports, __webpack_require__) { var extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, _extend = extend, BaseThemeManager = __webpack_require__( /*! ../core/base_theme_manager */ 550).BaseThemeManager; var ThemeManager = BaseThemeManager.inherit({ _themeSection: "gauge", _fontFields: ["scale.label.font", "valueIndicators.rangebar.text.font", "valueIndicators.textcloud.text.font", "title.font", "title.subtitle.font", "tooltip.font", "indicator.text.font", "loadingIndicator.font", "export.font"], _initializeTheme: function() { var subTheme, that = this; if (that._subTheme) { subTheme = _extend(true, {}, that._theme[that._subTheme], that._theme); _extend(true, that._theme, subTheme) } that.callBase.apply(that, arguments) } }); module.exports = ThemeManager }, /*!**********************************!*\ !*** ./js/viz/circular_gauge.js ***! \**********************************/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__( /*! ./gauges/circular_gauge */ 598) }, /*!*****************************************!*\ !*** ./js/viz/gauges/circular_gauge.js ***! \*****************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), _isFinite = isFinite, registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), objectUtils = __webpack_require__( /*! ../../core/utils/object */ 27), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, dxBaseGauge = __webpack_require__( /*! ./base_gauge */ 589).dxBaseGauge, dxGauge = __webpack_require__( /*! ./common */ 591).dxGauge, vizUtils = __webpack_require__( /*! ../core/utils */ 509), _normalizeAngle = vizUtils.normalizeAngle, _getCosAndSin = vizUtils.getCosAndSin, circularIndicatorsModule = __webpack_require__( /*! ./circular_indicators */ 599), createIndicatorCreator = __webpack_require__( /*! ./common */ 591).createIndicatorCreator, CircularRangeContainer = __webpack_require__( /*! ./circular_range_container */ 600), ThemeManager = __webpack_require__( /*! ./theme_manager */ 596), _abs = Math.abs, _max = Math.max, _min = Math.min, _round = Math.round, _each = $.each, PI = Math.PI; function getSides(startAngle, endAngle) { var startCosSin = _getCosAndSin(startAngle), endCosSin = _getCosAndSin(endAngle), startCos = startCosSin.cos, startSin = startCosSin.sin, endCos = endCosSin.cos, endSin = endCosSin.sin; return { left: startSin <= 0 && endSin >= 0 || startSin <= 0 && endSin <= 0 && startCos <= endCos || startSin >= 0 && endSin >= 0 && startCos >= endCos ? -1 : _min(startCos, endCos, 0), right: startSin >= 0 && endSin <= 0 || startSin >= 0 && endSin >= 0 && startCos >= endCos || startSin <= 0 && endSin <= 0 && startCos <= endCos ? 1 : _max(startCos, endCos, 0), up: startCos <= 0 && endCos >= 0 || startCos <= 0 && endCos <= 0 && startSin >= endSin || startCos >= 0 && endCos >= 0 && startSin <= endSin ? -1 : -_max(startSin, endSin, 0), down: startCos >= 0 && endCos <= 0 || startCos >= 0 && endCos >= 0 && startSin <= endSin || startCos <= 0 && endCos <= 0 && startSin >= endSin ? 1 : -_min(startSin, endSin, 0) } } var dxCircularGauge = dxGauge.inherit({ _rootClass: "dxg-circular-gauge", _factoryMethods: { rangeContainer: "createCircularRangeContainer", indicator: "createCircularIndicator" }, _gridSpacingFactor: 17, _scaleTypes: { type: "polarAxes", drawingType: "circular" }, _updateScaleTickIndent: function(scaleOptions) { var indentFromTick = scaleOptions.label.indentFromTick, length = scaleOptions.tick.length, textParams = this._scale.measureLabels(), tickCorrection = length; if ("inside" === scaleOptions.orientation) { tickCorrection = 0 } else { if ("center" === scaleOptions.orientation) { tickCorrection = .5 * length } } scaleOptions.label.indentFromAxis = indentFromTick >= 0 ? indentFromTick + tickCorrection : indentFromTick - tickCorrection - _max(textParams.width, textParams.height); this._scale.updateOptions(scaleOptions) }, _setupCodomain: function() { var sides, that = this, geometry = that.option("geometry") || {}, startAngle = geometry.startAngle, endAngle = geometry.endAngle; startAngle = _isFinite(startAngle) ? _normalizeAngle(startAngle) : 225; endAngle = _isFinite(endAngle) ? _normalizeAngle(endAngle) : -45; if (_abs(startAngle - endAngle) < 1) { endAngle -= 360; sides = { left: -1, up: -1, right: 1, down: 1 } } else { startAngle < endAngle && (endAngle -= 360); sides = getSides(startAngle, endAngle) } that._area = { x: 0, y: 0, radius: 100, startCoord: startAngle, endCoord: endAngle, sides: sides }; that._translator.setCodomain(startAngle, endAngle) }, _shiftScale: function(layout) { var centerCoords, scale = this._scale, canvas = scale.getCanvas(); canvas.width = canvas.height = 2 * layout.radius; scale.draw(canvas); centerCoords = scale.getCenter(); scale.shift({ right: layout.x - centerCoords.x, bottom: layout.y - centerCoords.y }) }, _getScaleLayoutValue: function() { return this._area.radius }, _getTicksOrientation: function(scaleOptions) { return scaleOptions.orientation }, _getTicksCoefficients: function(options) { var coefs = { inner: 0, outer: 1 }; if ("inside" === options.orientation) { coefs.inner = 1; coefs.outer = 0 } else { if ("center" === options.orientation) { coefs.inner = coefs.outer = .5 } } return coefs }, _correctScaleIndents: function(result, indentFromTick, textParams) { if (indentFromTick >= 0) { result.horizontalOffset = indentFromTick + textParams.width; result.verticalOffset = indentFromTick + textParams.height } else { result.horizontalOffset = result.verticalOffset = 0; result.min -= -indentFromTick + _max(textParams.width, textParams.height) } result.inverseHorizontalOffset = textParams.width / 2; result.inverseVerticalOffset = textParams.height / 2 }, _measureMainElements: function(elements, scaleMeasurement) { var that = this, radius = that._area.radius, maxRadius = 0, minRadius = 1 / 0, maxHorizontalOffset = 0, maxVerticalOffset = 0, maxInverseHorizontalOffset = 0, maxInverseVerticalOffset = 0, scale = that._scale; _each(elements.concat(scale), function(_, element) { var bounds = element.measure ? element.measure({ radius: radius - element.getOffset() }) : scaleMeasurement; bounds.min > 0 && (minRadius = _min(minRadius, bounds.min)); bounds.max > 0 && (maxRadius = _max(maxRadius, bounds.max)); bounds.horizontalOffset > 0 && (maxHorizontalOffset = _max(maxHorizontalOffset, bounds.max + bounds.horizontalOffset)); bounds.verticalOffset > 0 && (maxVerticalOffset = _max(maxVerticalOffset, bounds.max + bounds.verticalOffset)); bounds.inverseHorizontalOffset > 0 && (maxInverseHorizontalOffset = _max(maxInverseHorizontalOffset, bounds.inverseHorizontalOffset)); bounds.inverseVerticalOffset > 0 && (maxInverseVerticalOffset = _max(maxInverseVerticalOffset, bounds.inverseVerticalOffset)) }); maxHorizontalOffset = _max(maxHorizontalOffset - maxRadius, 0); maxVerticalOffset = _max(maxVerticalOffset - maxRadius, 0); return { minRadius: minRadius, maxRadius: maxRadius, horizontalMargin: maxHorizontalOffset, verticalMargin: maxVerticalOffset, inverseHorizontalMargin: maxInverseHorizontalOffset, inverseVerticalMargin: maxInverseVerticalOffset } }, _applyMainLayout: function(elements, scaleMeasurement) { var x, y, measurements = this._measureMainElements(elements, scaleMeasurement), area = this._area, sides = area.sides, margins = { left: (sides.left < -.1 ? measurements.horizontalMargin : measurements.inverseHorizontalMargin) || 0, right: (sides.right > .1 ? measurements.horizontalMargin : measurements.inverseHorizontalMargin) || 0, top: (sides.up < -.1 ? measurements.verticalMargin : measurements.inverseVerticalMargin) || 0, bottom: (sides.down > .1 ? measurements.verticalMargin : measurements.inverseVerticalMargin) || 0 }, rect = selectRectByAspectRatio(this._innerRect, (sides.down - sides.up) / (sides.right - sides.left), margins), radius = _min(getWidth(rect) / (sides.right - sides.left), getHeight(rect) / (sides.down - sides.up)); radius = radius - measurements.maxRadius + area.radius; x = rect.left - getWidth(rect) * sides.left / (sides.right - sides.left); y = rect.top - getHeight(rect) * sides.up / (sides.down - sides.up); area.x = _round(x); area.y = _round(y); area.radius = radius; rect.left -= margins.left; rect.right += margins.right; rect.top -= margins.top; rect.bottom += margins.bottom; this._innerRect = rect }, _getElementLayout: function(offset) { return { x: this._area.x, y: this._area.y, radius: _round(this._area.radius - offset) } }, _getApproximateScreenRange: function() { var that = this, area = that._area, r = _min(that._canvas.width / (area.sides.right - area.sides.left), that._canvas.height / (area.sides.down - area.sides.up)); r > area.totalRadius && (r = area.totalRadius); r = .8 * r; return -that._translator.getCodomainRange() * r * PI / 180 }, _getDefaultSize: function() { return { width: 300, height: 300 } }, _factory: objectUtils.clone(dxBaseGauge.prototype._factory) }); function getWidth(rect) { return rect.right - rect.left } function getHeight(rect) { return rect.bottom - rect.top } function selectRectByAspectRatio(srcRect, aspectRatio, margins) { var selfAspectRatio, rect = extend({}, srcRect), width = 0, height = 0; margins = margins || {}; if (aspectRatio > 0) { rect.left += margins.left || 0; rect.right -= margins.right || 0; rect.top += margins.top || 0; rect.bottom -= margins.bottom || 0; if (getWidth(rect) > 0 && getHeight(rect) > 0) { selfAspectRatio = getHeight(rect) / getWidth(rect); if (selfAspectRatio > 1) { aspectRatio < selfAspectRatio ? width = getWidth(rect) : height = getHeight(rect) } else { aspectRatio > selfAspectRatio ? height = getHeight(rect) : width = getWidth(rect) } width > 0 || (width = height / aspectRatio); height > 0 || (height = width * aspectRatio); width = (getWidth(rect) - width) / 2; height = (getHeight(rect) - height) / 2; rect.left += width; rect.right -= width; rect.top += height; rect.bottom -= height } else { rect.left = rect.right = (rect.left + rect.right) / 2; rect.top = rect.bottom = (rect.top + rect.bottom) / 2 } } return rect } dxCircularGauge._TESTS_selectRectByAspectRatio = selectRectByAspectRatio; var indicators = dxCircularGauge.prototype._factory.indicators = {}; dxCircularGauge.prototype._factory.createIndicator = createIndicatorCreator(indicators); indicators._default = circularIndicatorsModule._default; indicators.rectangleneedle = circularIndicatorsModule.rectangleneedle; indicators.triangleneedle = circularIndicatorsModule.triangleneedle; indicators.twocolorneedle = circularIndicatorsModule.twocolorneedle; indicators.trianglemarker = circularIndicatorsModule.trianglemarker; indicators.textcloud = circularIndicatorsModule.textcloud; indicators.rangebar = circularIndicatorsModule.rangebar; dxCircularGauge.prototype._factory.RangeContainer = CircularRangeContainer; dxCircularGauge.prototype._factory.ThemeManager = ThemeManager.inherit({ _subTheme: "_circular" }); registerComponent("dxCircularGauge", dxCircularGauge); module.exports = dxCircularGauge }, /*!**********************************************!*\ !*** ./js/viz/gauges/circular_indicators.js ***! \**********************************************/ function(module, exports, __webpack_require__) { var baseIndicatorsModule = __webpack_require__( /*! ./base_indicators */ 593), BaseIndicator = baseIndicatorsModule.BaseIndicator, BaseTextCloudMarker = baseIndicatorsModule.BaseTextCloudMarker, BaseRangeBar = baseIndicatorsModule.BaseRangeBar, vizUtils = __webpack_require__( /*! ../core/utils */ 509), _Number = Number, _getCosAndSin = vizUtils.getCosAndSin, _convertAngleToRendererSpace = vizUtils.convertAngleToRendererSpace; var SimpleIndicator = BaseIndicator.inherit({ _move: function() { var that = this, options = that._options, angle = _convertAngleToRendererSpace(that._actualPosition); that._rootElement.rotate(angle, options.x, options.y); that._trackerElement && that._trackerElement.rotate(angle, options.x, options.y) }, _isEnabled: function() { return this._options.width > 0 }, _isVisible: function(layout) { return layout.radius - _Number(this._options.indentFromCenter) > 0 }, _getTrackerSettings: function() { var options = this._options, x = options.x, y = options.y - (options.radius + _Number(options.indentFromCenter)) / 2, width = options.width / 2, length = (options.radius - _Number(options.indentFromCenter)) / 2; width > 10 || (width = 10); length > 10 || (length = 10); return { points: [x - width, y - length, x - width, y + length, x + width, y + length, x + width, y - length] } }, _renderSpindle: function() { var gapSize, that = this, options = that._options; if (options.spindleSize > 0) { gapSize = _Number(options.spindleGapSize) || 0; if (gapSize > 0) { gapSize = gapSize <= options.spindleSize ? gapSize : _Number(options.spindleSize) } that._spindleOuter = that._spindleOuter || that._renderer.circle().append(that._rootElement); that._spindleInner = that._spindleInner || that._renderer.circle().append(that._rootElement); that._spindleOuter.attr({ "class": "dxg-spindle-border", cx: options.x, cy: options.y, r: options.spindleSize / 2 }); that._spindleInner.attr({ "class": "dxg-spindle-hole", cx: options.x, cy: options.y, r: gapSize / 2, fill: options.containerBackgroundColor }) } }, _render: function() { var that = this; that._renderPointer(); that._renderSpindle() }, _clearSpindle: function() { delete this._spindleOuter; delete this._spindleInner }, _clearPointer: function() { delete this._element }, _clear: function() { this._clearPointer(); this._clearSpindle() }, measure: function(layout) { var result = { max: layout.radius }; if (this._options.indentFromCenter < 0) { result.inverseHorizontalOffset = result.inverseVerticalOffset = -_Number(this._options.indentFromCenter) } return result }, getTooltipParameters: function() { var options = this._options, cosSin = _getCosAndSin(this._actualPosition), r = (options.radius + _Number(options.indentFromCenter)) / 2; return { x: options.x + cosSin.cos * r, y: options.y - cosSin.sin * r, value: this._currentValue, color: options.color, offset: options.width / 2 } } }); var rectangleNeedle = SimpleIndicator.inherit({ _renderPointer: function() { var that = this, options = that._options, y2 = options.y - options.radius, y1 = options.y - _Number(options.indentFromCenter), x1 = options.x - options.width / 2, x2 = x1 + _Number(options.width); that._element = that._element || that._renderer.path([], "area").append(that._rootElement); that._element.attr({ points: [x1, y1, x1, y2, x2, y2, x2, y1] }) } }); var triangleNeedle = SimpleIndicator.inherit({ _renderPointer: function() { var that = this, options = that._options, y2 = options.y - options.radius, y1 = options.y - _Number(options.indentFromCenter), x1 = options.x - options.width / 2, x2 = options.x + options.width / 2; that._element = that._element || that._renderer.path([], "area").append(that._rootElement); that._element.attr({ points: [x1, y1, options.x, y2, x2, y1] }) } }); var twoColorNeedle = SimpleIndicator.inherit({ _renderPointer: function() { var y2, y3, that = this, options = that._options, x1 = options.x - options.width / 2, x2 = options.x + options.width / 2, y4 = options.y - options.radius, y1 = options.y - _Number(options.indentFromCenter), fraction = _Number(options.secondFraction) || 0; if (fraction >= 1) { y2 = y3 = y1 } else { if (fraction <= 0) { y2 = y3 = y4 } else { y3 = y4 + (y1 - y4) * fraction; y2 = y3 + _Number(options.space) } } that._firstElement = that._firstElement || that._renderer.path([], "area").append(that._rootElement); that._spaceElement = that._spaceElement || that._renderer.path([], "area").append(that._rootElement); that._secondElement = that._secondElement || that._renderer.path([], "area").append(that._rootElement); that._firstElement.attr({ points: [x1, y1, x1, y2, x2, y2, x2, y1] }); that._spaceElement.attr({ points: [x1, y2, x1, y3, x2, y3, x2, y2], "class": "dxg-hole", fill: options.containerBackgroundColor }); that._secondElement.attr({ points: [x1, y3, x1, y4, x2, y4, x2, y3], "class": "dxg-part", fill: options.secondColor }) }, _clearPointer: function() { delete this._firstElement; delete this._secondElement; delete this._spaceElement } }); var triangleMarker = SimpleIndicator.inherit({ _isEnabled: function() { return this._options.length > 0 && this._options.width > 0 }, _isVisible: function(layout) { return layout.radius > 0 }, _render: function() { var settings, that = this, options = that._options, x = options.x, y1 = options.y - options.radius, dx = options.width / 2 || 0, y2 = y1 - _Number(options.length); that._element = that._element || that._renderer.path([], "area").append(that._rootElement); settings = { points: [x, y1, x - dx, y2, x + dx, y2], stroke: "none", "stroke-width": 0, "stroke-linecap": "square" }; if (options.space > 0) { settings["stroke-width"] = Math.min(options.space, options.width / 4) || 0; settings.stroke = settings["stroke-width"] > 0 ? options.containerBackgroundColor || "none" : "none" } that._element.attr(settings).sharp() }, _clear: function() { delete this._element }, _getTrackerSettings: function() { var options = this._options, x = options.x, y = options.y - options.radius - options.length / 2, width = options.width / 2, length = options.length / 2; width > 10 || (width = 10); length > 10 || (length = 10); return { points: [x - width, y - length, x - width, y + length, x + width, y + length, x + width, y - length] } }, measure: function(layout) { return { min: layout.radius, max: layout.radius + _Number(this._options.length) } }, getTooltipParameters: function() { var options = this._options, cosSin = _getCosAndSin(this._actualPosition), r = options.radius + options.length / 2, parameters = this.callBase(); parameters.x = options.x + cosSin.cos * r; parameters.y = options.y - cosSin.sin * r; parameters.offset = options.length / 2; return parameters } }); var textCloud = BaseTextCloudMarker.inherit({ _isEnabled: function() { return true }, _isVisible: function(layout) { return layout.radius > 0 }, _getTextCloudOptions: function() { var that = this, cosSin = _getCosAndSin(that._actualPosition), nAngle = vizUtils.normalizeAngle(that._actualPosition); return { x: that._options.x + cosSin.cos * that._options.radius, y: that._options.y - cosSin.sin * that._options.radius, type: nAngle > 270 ? "left-top" : nAngle > 180 ? "top-right" : nAngle > 90 ? "right-bottom" : "bottom-left" } }, measure: function(layout) { var verticalOffset, horizontalOffset, that = this, arrowLength = _Number(that._options.arrowLength) || 0; that._measureText(); verticalOffset = that._textFullHeight + arrowLength; horizontalOffset = that._textFullWidth + arrowLength; return { min: layout.radius, max: layout.radius, horizontalOffset: horizontalOffset, verticalOffset: verticalOffset, inverseHorizontalOffset: horizontalOffset, inverseVerticalOffset: verticalOffset } } }); var rangeBar = BaseRangeBar.inherit({ _isEnabled: function() { return this._options.size > 0 }, _isVisible: function(layout) { return layout.radius - _Number(this._options.size) > 0 }, _createBarItem: function() { return this._renderer.arc().attr({ "stroke-linejoin": "round" }).append(this._rootElement) }, _createTracker: function() { return this._renderer.arc().attr({ "stroke-linejoin": "round" }) }, _setBarSides: function() { var that = this; that._maxSide = that._options.radius; that._minSide = that._maxSide - _Number(that._options.size) }, _getSpace: function() { var options = this._options; return options.space > 0 ? 180 * options.space / options.radius / Math.PI : 0 }, _isTextVisible: function() { var options = this._options.text || {}; return options.indent > 0 }, _setTextItemsSides: function() { var that = this, options = that._options, indent = _Number(options.text.indent); that._lineFrom = options.y - options.radius; that._lineTo = that._lineFrom - indent; that._textRadius = options.radius + indent }, _getPositions: function() { var mainPosition1, mainPosition2, that = this, basePosition = that._basePosition, actualPosition = that._actualPosition; if (basePosition >= actualPosition) { mainPosition1 = basePosition; mainPosition2 = actualPosition } else { mainPosition1 = actualPosition; mainPosition2 = basePosition } return { start: that._startPosition, end: that._endPosition, main1: mainPosition1, main2: mainPosition2, back1: Math.min(mainPosition1 + that._space, that._startPosition), back2: Math.max(mainPosition2 - that._space, that._endPosition) } }, _buildItemSettings: function(from, to) { var that = this; return { x: that._options.x, y: that._options.y, innerRadius: that._minSide, outerRadius: that._maxSide, startAngle: to, endAngle: from } }, _updateTextPosition: function() { var that = this, cosSin = _getCosAndSin(that._actualPosition), x = that._options.x + that._textRadius * cosSin.cos, y = that._options.y - that._textRadius * cosSin.sin; x += cosSin.cos * that._textWidth * .6; y -= cosSin.sin * that._textHeight * .6; that._text.attr({ x: x, y: y + that._textVerticalOffset }) }, _updateLinePosition: function() { var x1, x2, that = this, x = that._options.x; if (that._basePosition > that._actualPosition) { x1 = x - 2; x2 = x } else { if (that._basePosition < that._actualPosition) { x1 = x; x2 = x + 2 } else { x1 = x - 1; x2 = x + 1 } } that._line.attr({ points: [x1, that._lineFrom, x1, that._lineTo, x2, that._lineTo, x2, that._lineFrom] }).rotate(_convertAngleToRendererSpace(that._actualPosition), x, that._options.y).sharp() }, _getTooltipPosition: function() { var that = this, cosSin = _getCosAndSin((that._basePosition + that._actualPosition) / 2), r = (that._minSide + that._maxSide) / 2; return { x: that._options.x + cosSin.cos * r, y: that._options.y - cosSin.sin * r } }, measure: function(layout) { var that = this, result = { min: layout.radius - _Number(that._options.size), max: layout.radius }; that._measureText(); if (that._hasText) { result.max += _Number(that._options.text.indent); result.horizontalOffset = that._textWidth; result.verticalOffset = that._textHeight } return result } }); exports._default = rectangleNeedle; exports.rectangleneedle = rectangleNeedle; exports.triangleneedle = triangleNeedle; exports.twocolorneedle = twoColorNeedle; exports.trianglemarker = triangleMarker; exports.textcloud = textCloud; exports.rangebar = rangeBar }, /*!***************************************************!*\ !*** ./js/viz/gauges/circular_range_container.js ***! \***************************************************/ function(module, exports, __webpack_require__) { var BaseRangeContainer = __webpack_require__( /*! ./base_range_container */ 595), _Number = Number, _max = Math.max, _normalizeEnum = __webpack_require__( /*! ../core/utils */ 509).normalizeEnum; var CircularRangeContainer = BaseRangeContainer.inherit({ _processOptions: function() { var that = this; that._inner = that._outer = 0; switch (_normalizeEnum(that._options.orientation)) { case "inside": that._inner = 1; break; case "center": that._inner = that._outer = .5; break; default: that._outer = 1 } }, _isVisible: function(layout) { var width = this._options.width; width = _Number(width) || _max(_Number(width.start), _Number(width.end)); return layout.radius - this._inner * width > 0 }, _createRange: function(range, layout) { var that = this, width = (range.startWidth + range.endWidth) / 2; return that._renderer.arc(layout.x, layout.y, layout.radius - that._inner * width, layout.radius + that._outer * width, that._translator.translate(range.end), that._translator.translate(range.start)).attr({ "stroke-linejoin": "round" }) }, measure: function(layout) { var width = this._options.width; width = _Number(width) || _max(_Number(width.start), _Number(width.end)); return { min: layout.radius - this._inner * width, max: layout.radius + this._outer * width } } }); module.exports = CircularRangeContainer }, /*!*****************************!*\ !*** ./js/viz/bar_gauge.js ***! \*****************************/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__( /*! ./gauges/bar_gauge */ 602).dxBarGauge }, /*!************************************!*\ !*** ./js/viz/gauges/bar_gauge.js ***! \************************************/ function(module, exports, __webpack_require__) { var PI_DIV_180 = Math.PI / 180, _abs = Math.abs, _round = Math.round, _floor = Math.floor, _min = Math.min, _max = Math.max, registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), objectUtils = __webpack_require__( /*! ../../core/utils/object */ 27), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, baseGaugeModule = __webpack_require__( /*! ./base_gauge */ 589), dxBaseGauge = baseGaugeModule.dxBaseGauge, _getSampleText = baseGaugeModule.getSampleText, _formatValue = baseGaugeModule.formatValue, _compareArrays = baseGaugeModule.compareArrays, dxCircularGauge = __webpack_require__( /*! ./circular_gauge */ 598), BaseThemeManager = __webpack_require__( /*! ../core/base_theme_manager */ 550).BaseThemeManager, _isArray = Array.isArray, vizUtils = __webpack_require__( /*! ../core/utils */ 509), _convertAngleToRendererSpace = vizUtils.convertAngleToRendererSpace, _getCosAndSin = vizUtils.getCosAndSin, _patchFontOptions = vizUtils.patchFontOptions, _Number = Number, _isFinite = isFinite, _noop = commonUtils.noop, _extend = extend, OPTION_VALUES = "values"; var dxBarGauge = dxBaseGauge.inherit({ _rootClass: "dxbg-bar-gauge", _initCore: function() { var that = this; that.callBase.apply(that, arguments); that._barsGroup = that._renderer.g().attr({ "class": "dxbg-bars" }).linkOn(that._renderer.root, "bars"); that._values = []; that._context = { renderer: that._renderer, translator: that._translator, tracker: that._tracker, group: that._barsGroup }; that._animateStep = function(pos) { var i, ii, bars = that._bars; for (i = 0, ii = bars.length; i < ii; ++i) { bars[i].animate(pos) } }; that._animateComplete = function() { var i, ii, bars = that._bars; for (i = 0, ii = bars.length; i < ii; ++i) { bars[i].endAnimation() } } }, _disposeCore: function() { var that = this; that._barsGroup.linkOff(); that._barsGroup = that._values = that._context = that._animateStep = that._animateComplete = null; that.callBase.apply(that, arguments) }, _setupDomainCore: function() { var that = this, startValue = that.option("startValue"), endValue = that.option("endValue"); _isFinite(startValue) || (startValue = 0); _isFinite(endValue) || (endValue = 100); that._translator.setDomain(startValue, endValue); that._baseValue = that._translator.adjust(that.option("baseValue")); _isFinite(that._baseValue) || (that._baseValue = startValue < endValue ? startValue : endValue) }, _getDefaultSize: function() { return { width: 300, height: 300 } }, _setupCodomain: dxCircularGauge.prototype._setupCodomain, _getApproximateScreenRange: function() { var that = this, sides = that._area.sides, width = that._canvas.width / (sides.right - sides.left), height = that._canvas.height / (sides.down - sides.up), r = width < height ? width : height; return -that._translator.getCodomainRange() * r * PI_DIV_180 }, _setupAnimationSettings: function() { var that = this; that.callBase.apply(that, arguments); if (that._animationSettings) { that._animationSettings.step = that._animateStep; that._animationSettings.complete = that._animateComplete } }, _cleanContent: function() { var i, ii, that = this; that._barsGroup.linkRemove(); that._animationSettings && that._barsGroup.stopAnimation(); for (i = 0, ii = that._bars ? that._bars.length : 0; i < ii; ++i) { that._bars[i].dispose() } that._palette = that._bars = null }, _renderContent: function() { var text, bBox, that = this, labelOptions = that.option("label"), context = that._context; that._barsGroup.linkAppend(); context.textEnabled = void 0 === labelOptions || labelOptions && (!("visible" in labelOptions) || labelOptions.visible); if (context.textEnabled) { context.textColor = labelOptions && labelOptions.font && labelOptions.font.color || null; labelOptions = _extend(true, {}, that._themeManager.theme().label, labelOptions); context.formatOptions = { format: void 0 !== labelOptions.format ? labelOptions.format : that._defaultFormatOptions, precision: labelOptions.precision, customizeText: labelOptions.customizeText }; context.textOptions = { align: "center" }; context.fontStyles = _patchFontOptions(_extend({}, that._themeManager.theme().label.font, labelOptions.font, { color: null })); that._textIndent = labelOptions.indent > 0 ? _Number(labelOptions.indent) : 0; context.lineWidth = labelOptions.connectorWidth > 0 ? _Number(labelOptions.connectorWidth) : 0; context.lineColor = labelOptions.connectorColor || null; text = that._renderer.text(_getSampleText(that._translator, context.formatOptions), 0, 0).attr(context.textOptions).css(context.fontStyles).append(that._barsGroup); bBox = text.getBBox(); text.remove(); context.textVerticalOffset = -bBox.y - bBox.height / 2; context.textWidth = bBox.width; context.textHeight = bBox.height } dxCircularGauge.prototype._applyMainLayout.call(that); that._renderBars() }, _measureMainElements: function() { var result = { maxRadius: this._area.radius }; if (this._context.textEnabled) { result.horizontalMargin = this._context.textWidth; result.verticalMargin = this._context.textHeight } return result }, _renderBars: function() { var relativeInnerRadius, radius, that = this, options = _extend({}, that._themeManager.theme(), that.option()), area = that._area; that._palette = that._themeManager.createPalette(options.palette, { useHighlight: true }); relativeInnerRadius = options.relativeInnerRadius > 0 && options.relativeInnerRadius < 1 ? _Number(options.relativeInnerRadius) : .1; radius = area.radius; if (that._context.textEnabled) { that._textIndent = _round(_min(that._textIndent, radius / 2)); radius -= that._textIndent } that._outerRadius = _floor(radius); that._innerRadius = _floor(radius * relativeInnerRadius); that._barSpacing = options.barSpacing > 0 ? _Number(options.barSpacing) : 0; _extend(that._context, { backgroundColor: options.backgroundColor, x: area.x, y: area.y, startAngle: area.startCoord, endAngle: area.endCoord, baseAngle: that._translator.translate(that._baseValue) }); that._bars = []; that._updateValues(that.option(OPTION_VALUES)) }, _arrangeBars: function(count) { var spacing, _count, unitOffset, i, that = this, radius = that._outerRadius - that._innerRadius, context = that._context; context.barSize = count > 0 ? _max((radius - (count - 1) * that._barSpacing) / count, 1) : 0; spacing = count > 1 ? _max(_min((radius - count * context.barSize) / (count - 1), that._barSpacing), 0) : 0; _count = _min(_floor((radius + spacing) / context.barSize), count); that._setBarsCount(_count); radius = that._outerRadius; context.textRadius = radius + that._textIndent; that._palette.reset(); unitOffset = context.barSize + spacing; for (i = 0; i < _count; ++i, radius -= unitOffset) { that._bars[i].arrange({ radius: radius, color: that._palette.getNextColor() }) } }, _setBarsCount: function(count) { var i, ii, that = this; if (that._bars.length > count) { for (i = count, ii = that._bars.length; i < ii; ++i) { that._bars[i].dispose() } that._bars.splice(count, ii - count) } else { if (that._bars.length < count) { for (i = that._bars.length, ii = count; i < ii; ++i) { that._bars.push(new BarWrapper(i, that._context)) } } } if (that._bars.length > 0) { if (that._dummyBackground) { that._dummyBackground.dispose(); that._dummyBackground = null } } else { if (!that._dummyBackground) { that._dummyBackground = that._renderer.arc().attr({ "stroke-linejoin": "round" }).append(that._barsGroup) } that._dummyBackground.attr({ x: that._context.x, y: that._context.y, outerRadius: that._outerRadius, innerRadius: that._innerRadius, startAngle: that._context.endAngle, endAngle: that._context.startAngle, fill: that._context.backgroundColor }) } }, _updateBars: function(values) { var i, ii, that = this; for (i = 0, ii = that._bars.length; i < ii; ++i) { that._bars[i].setValue(values[i]) } }, _animateBars: function(values) { var i, that = this, ii = that._bars.length; if (ii > 0) { for (i = 0; i < ii; ++i) { that._bars[i].beginAnimation(values[i]) } that._barsGroup.animate({ _: 0 }, that._animationSettings) } }, _updateValues: function(values) { var i, value, that = this, list = _isArray(values) && values || _isFinite(values) && [values] || [], ii = list.length, barValues = []; that._values.length = ii; for (i = 0; i < ii; ++i) { value = list[i]; that._values[i] = value = _Number(_isFinite(value) ? value : that._values[i]); if (_isFinite(value)) { barValues.push(value) } } that._animationSettings && that._barsGroup.stopAnimation(); that._beginValueChanging(); if (that._bars) { that._arrangeBars(barValues.length); if (that._animationSettings && !that._noAnimation) { that._animateBars(barValues) } else { that._updateBars(barValues) } } if (!that._resizing) { if (!_compareArrays(that._values, that.option(OPTION_VALUES))) { that.option(OPTION_VALUES, that._values) } } that._endValueChanging() }, values: function(arg) { if (void 0 !== arg) { this._updateValues(arg); return this } else { return this._values.slice(0) } }, _optionChangesMap: { backgroundColor: "MOSTLY_TOTAL", relativeInnerRadius: "MOSTLY_TOTAL", barSpacing: "MOSTLY_TOTAL", label: "MOSTLY_TOTAL", palette: "MOSTLY_TOTAL", values: "VALUES" }, _customChangesOrder: ["VALUES"], _change_VALUES: function() { this._updateValues(this.option(OPTION_VALUES)) }, _factory: objectUtils.clone(dxBaseGauge.prototype._factory) }); var BarWrapper = function(index, context) { var that = this; that._context = context; that._background = context.renderer.arc().attr({ "stroke-linejoin": "round", fill: context.backgroundColor }).append(context.group); that._bar = context.renderer.arc().attr({ "stroke-linejoin": "round" }).append(context.group); if (context.textEnabled) { that._line = context.renderer.path([], "line").attr({ "stroke-width": context.lineWidth }).append(context.group); that._text = context.renderer.text().css(context.fontStyles).attr(context.textOptions).append(context.group) } that._tracker = context.renderer.arc().attr({ "stroke-linejoin": "round" }); context.tracker.attach(that._tracker, that, { index: index }); that._index = index; that._angle = context.baseAngle; that._settings = { x: context.x, y: context.y, startAngle: context.baseAngle, endAngle: context.baseAngle } }; _extend(BarWrapper.prototype, { dispose: function() { var that = this; that._background.dispose(); that._bar.dispose(); if (that._context.textEnabled) { that._line.dispose(); that._text.dispose() } that._context.tracker.detach(that._tracker); that._context = that._settings = that._background = that._bar = that._line = that._text = that._tracker = null; return that }, arrange: function(options) { var that = this, context = that._context; that._settings.outerRadius = options.radius; that._settings.innerRadius = options.radius - context.barSize; that._background.attr(_extend({}, that._settings, { startAngle: context.endAngle, endAngle: context.startAngle })); that._bar.attr(that._settings); that._tracker.attr(that._settings); that._color = options.color; that._bar.attr({ fill: options.color }); if (context.textEnabled) { that._line.attr({ points: [context.x, context.y - that._settings.innerRadius, context.x, context.y - context.textRadius], stroke: context.lineColor || options.color }).sharp(); that._text.css({ fill: context.textColor || options.color }) } return that }, getTooltipParameters: function() { var that = this, cosSin = _getCosAndSin((that._angle + that._context.baseAngle) / 2); return { x: _round(that._context.x + (that._settings.outerRadius + that._settings.innerRadius) / 2 * cosSin.cos), y: _round(that._context.y - (that._settings.outerRadius + that._settings.innerRadius) / 2 * cosSin.sin), offset: 0, color: that._color, value: that._value } }, setAngle: function(angle) { var cosSin, that = this; that._angle = angle; setAngles(that._settings, that._context.baseAngle, that._angle); that._bar.attr(that._settings); that._tracker.attr(that._settings); if (that._context.textEnabled) { var text = _formatValue(that._value, that._context.formatOptions, { index: that._index }); that._line.attr({ visibility: "" === text ? "hidden" : null }); that._line.rotate(_convertAngleToRendererSpace(that._angle), that._context.x, that._context.y); cosSin = _getCosAndSin(that._angle); that._text.attr({ text: text, x: that._context.x + (that._context.textRadius + .6 * that._context.textWidth) * cosSin.cos, y: that._context.y - (that._context.textRadius + .6 * that._context.textHeight) * cosSin.sin + that._context.textVerticalOffset }) } return that }, _processValue: function(value) { this._value = this._context.translator.adjust(value); return this._context.translator.translate(this._value) }, setValue: function(value) { return this.setAngle(this._processValue(value)) }, beginAnimation: function(value) { var that = this, angle = this._processValue(value); if (!compareFloats(that._angle, angle)) { that._start = that._angle; that._delta = angle - that._angle; that._tracker.attr({ visibility: "hidden" }); if (that._context.textEnabled) { that._line.attr({ visibility: "hidden" }); that._text.attr({ visibility: "hidden" }) } } else { that.animate = _noop; that.setAngle(that._angle) } }, animate: function(pos) { var that = this; that._angle = that._start + that._delta * pos; setAngles(that._settings, that._context.baseAngle, that._angle); that._bar.attr(that._settings) }, endAnimation: function() { var that = this; if (void 0 !== that._delta) { if (compareFloats(that._angle, that._start + that._delta)) { that._tracker.attr({ visibility: null }); if (that._context.textEnabled) { that._line.attr({ visibility: null }); that._text.attr({ visibility: null }) } that.setAngle(that._angle) } } else { delete that.animate } delete that._start; delete that._delta } }); function setAngles(target, angle1, angle2) { target.startAngle = angle1 < angle2 ? angle1 : angle2; target.endAngle = angle1 < angle2 ? angle2 : angle1 } function compareFloats(value1, value2) { return _abs(value1 - value2) < 1e-4 } dxBarGauge.prototype._factory.ThemeManager = BaseThemeManager.inherit({ _themeSection: "barGauge", _fontFields: ["label.font", "title.font", "tooltip.font", "loadingIndicator.font"] }); registerComponent("dxBarGauge", dxBarGauge); exports.dxBarGauge = dxBarGauge; var __BarWrapper = BarWrapper; exports.BarWrapper = __BarWrapper; exports.stubBarWrapper = function(barWrapperType) { BarWrapper = barWrapperType }; exports.restoreBarWrapper = function() { BarWrapper = __BarWrapper } }, /*!**********************************!*\ !*** ./js/viz/range_selector.js ***! \**********************************/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__( /*! ./range_selector/range_selector */ 604) }, /*!*************************************************!*\ !*** ./js/viz/range_selector/range_selector.js ***! \*************************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), registerComponent = __webpack_require__( /*! ../../core/component_registrator */ 57), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, vizUtils = __webpack_require__( /*! ../core/utils */ 509), adjustValue = vizUtils.adjustValue, dateUtils = __webpack_require__( /*! ../../core/utils/date */ 63), addInterval = dateUtils.addInterval, dateToMilliseconds = dateUtils.dateToMilliseconds, getSequenceByInterval = dateUtils.getSequenceByInterval, rangeModule = __webpack_require__( /*! ../translators/range */ 564), axisModule = __webpack_require__( /*! ../axes/base_axis */ 565), patchFontOptions = vizUtils.patchFontOptions, parseUtils = __webpack_require__( /*! ../components/parse_utils */ 524), _normalizeEnum = vizUtils.normalizeEnum, formatHelper = __webpack_require__( /*! ../../format_helper */ 66), commonModule = __webpack_require__( /*! ./common */ 605), slidersControllerModule = __webpack_require__( /*! ./sliders_controller */ 606), trackerModule = __webpack_require__( /*! ./tracker */ 609), rangeViewModule = __webpack_require__( /*! ./range_view */ 610), seriesDataSourceModule = __webpack_require__( /*! ./series_data_source */ 611), themeManagerModule = __webpack_require__( /*! ./theme_manager */ 612), tickManagerModule = __webpack_require__( /*! ../axes/base_tick_manager */ 567), log = __webpack_require__( /*! ../../core/errors */ 7).log, _isDefined = commonUtils.isDefined, _isNumber = commonUtils.isNumeric, _isDate = commonUtils.isDate, _max = Math.max, _ceil = Math.ceil, _floor = Math.floor, START_VALUE = "startValue", END_VALUE = "endValue", DATETIME = "datetime", SELECTED_RANGE = "selectedRange", VALUE = "value", DISCRETE = "discrete", SEMIDISCRETE = "semidiscrete", STRING = "string", SELECTED_RANGE_CHANGED = SELECTED_RANGE + "Changed", VALUE_CHANGED = VALUE + "Changed", CONTAINER_BACKGROUND_COLOR = "containerBackgroundColor", SLIDER_MARKER = "sliderMarker", OPTION_BACKGROUND = "background", LOGARITHMIC = "logarithmic", INVISIBLE_POS = -1e3, SEMIDISCRETE_GRID_SPACING_FACTOR = 50, logarithmBase = 10; function calculateMarkerHeight(renderer, value, sliderMarkerOptions) { var formattedText = void 0 === value ? commonModule.consts.emptySliderMarkerText : commonModule.formatValue(value, sliderMarkerOptions), textBBox = getTextBBox(renderer, formattedText, sliderMarkerOptions.font); return _ceil(textBBox.height) + 2 * sliderMarkerOptions.paddingTopBottom + commonModule.consts.pointerSize } function calculateScaleLabelHalfWidth(renderer, value, scaleOptions) { var formattedText = commonModule.formatValue(value, scaleOptions.label), textBBox = getTextBBox(renderer, formattedText, scaleOptions.label.font); return _ceil(textBBox.width / 2) } function parseValue(value) { return { startValue: value[0], endValue: value[1] } } function parseSelectedRange(selectedRange) { return [selectedRange.startValue, selectedRange.endValue] } function parseSliderMarkersPlaceholderSize(placeholderSize) { var placeholderWidthLeft, placeholderWidthRight, placeholderHeight; if (_isNumber(placeholderSize)) { placeholderWidthLeft = placeholderWidthRight = placeholderHeight = placeholderSize } else { if (placeholderSize) { if (_isNumber(placeholderSize.height)) { placeholderHeight = placeholderSize.height } if (_isNumber(placeholderSize.width)) { placeholderWidthLeft = placeholderWidthRight = placeholderSize.width } else { if (placeholderSize.width) { if (_isNumber(placeholderSize.width.left)) { placeholderWidthLeft = placeholderSize.width.left } if (_isNumber(placeholderSize.width.right)) { placeholderWidthRight = placeholderSize.width.right } } } } else { return null } } return { widthLeft: placeholderWidthLeft, widthRight: placeholderWidthRight, height: placeholderHeight } } function calculateIndents(renderer, scale, sliderMarkerOptions, indentOptions) { var leftMarkerHeight, rightMarkerHeight, placeholderHeight, parsedPlaceholderSize, leftScaleLabelWidth = 0, rightScaleLabelWidth = 0, placeholderWidthLeft = 0, placeholderWidthRight = 0; indentOptions = indentOptions || {}; parsedPlaceholderSize = parseSliderMarkersPlaceholderSize(sliderMarkerOptions.placeholderSize); if (parsedPlaceholderSize && void 0 === indentOptions.left && void 0 === indentOptions.right) { placeholderWidthLeft = parsedPlaceholderSize.widthLeft; placeholderWidthRight = parsedPlaceholderSize.widthRight } else { placeholderWidthLeft = indentOptions.left; placeholderWidthRight = indentOptions.right } if (parsedPlaceholderSize && void 0 === sliderMarkerOptions.placeholderHeight) { placeholderHeight = parsedPlaceholderSize.height } else { placeholderHeight = sliderMarkerOptions.placeholderHeight } if (sliderMarkerOptions.visible) { leftMarkerHeight = calculateMarkerHeight(renderer, scale.startValue, sliderMarkerOptions); rightMarkerHeight = calculateMarkerHeight(renderer, scale.endValue, sliderMarkerOptions); if (void 0 === placeholderHeight) { placeholderHeight = _max(leftMarkerHeight, rightMarkerHeight) } } if (scale.label.visible) { leftScaleLabelWidth = calculateScaleLabelHalfWidth(renderer, scale.startValue, scale); rightScaleLabelWidth = calculateScaleLabelHalfWidth(renderer, scale.endValue, scale) } placeholderWidthLeft = void 0 !== placeholderWidthLeft ? placeholderWidthLeft : leftScaleLabelWidth; placeholderWidthRight = (void 0 !== placeholderWidthRight ? placeholderWidthRight : rightScaleLabelWidth) || 1; return { left: placeholderWidthLeft, right: placeholderWidthRight, top: placeholderHeight || 0, bottom: 0 } } function calculateValueType(firstValue, secondValue) { var typeFirstValue = commonUtils.type(firstValue), typeSecondValue = commonUtils.type(secondValue), validType = function(type) { return typeFirstValue === type || typeSecondValue === type }; return validType("date") ? DATETIME : validType("number") ? "numeric" : validType(STRING) ? STRING : "" } function showScaleMarkers(scaleOptions) { return scaleOptions.valueType === DATETIME && scaleOptions.marker.visible } function updateTranslatorRangeInterval(translatorRange, scaleOptions) { var intervalX = scaleOptions.minorTickInterval || scaleOptions.tickInterval; if ("datetime" === scaleOptions.valueType) { intervalX = dateUtils.dateToMilliseconds(intervalX) } translatorRange.addRange({ interval: intervalX }) } function checkLogarithmicOptions(options, defaultLogarithmBase, incidentOccurred) { var logarithmBase; if (!options) { return } logarithmBase = options.logarithmBase; if (options.type === LOGARITHMIC && logarithmBase <= 0 || logarithmBase && !_isNumber(logarithmBase)) { options.logarithmBase = defaultLogarithmBase; incidentOccurred("E2104") } else { if (options.type !== LOGARITHMIC) { options.logarithmBase = void 0 } } } function calculateScaleAreaHeight(renderer, scaleOptions, visibleMarkers) { var textBBox, value = "0", formatObject = { value: 0, valueText: value }, labelScaleOptions = scaleOptions.label, markerScaleOptions = scaleOptions.marker, customizeText = labelScaleOptions.customizeText, placeholderHeight = scaleOptions.placeholderHeight, text = commonUtils.isFunction(customizeText) ? customizeText.call(formatObject, formatObject) : value, visibleLabels = labelScaleOptions.visible; if (placeholderHeight) { return placeholderHeight } else { textBBox = getTextBBox(renderer, text, labelScaleOptions.font); return (visibleLabels ? labelScaleOptions.topIndent + textBBox.height : 0) + (visibleMarkers ? markerScaleOptions.topIndent + markerScaleOptions.separatorHeight : 0) } } function getNextTickInterval(tickInterval, minorTickInterval, isDateType) { if (!tickInterval) { tickInterval = minorTickInterval } else { if (isDateType) { tickInterval = dateUtils.getNextDateUnit(tickInterval) } else { tickInterval += minorTickInterval } } return tickInterval } function calculateTickIntervalsForSemidiscreteScale(scaleOptions, min, max, screenDelta) { var interval, tickCountByInterval, tickCountByScreen, minorTickInterval = scaleOptions.minorTickInterval, tickInterval = scaleOptions.tickInterval, isDateType = "datetime" === scaleOptions.valueType, gridSpacingFactor = scaleOptions.axisDivisionFactor || {}; if (!tickInterval) { do { interval = getNextTickInterval(tickInterval, minorTickInterval, isDateType); if (tickInterval !== interval) { tickInterval = interval } else { break } if (isDateType) { interval = dateToMilliseconds(tickInterval) } tickCountByInterval = _ceil((max - min) / interval); tickCountByScreen = _floor(screenDelta / (gridSpacingFactor[tickInterval] || SEMIDISCRETE_GRID_SPACING_FACTOR)) || 1 } while (interval && tickCountByInterval > tickCountByScreen) } return { tickInterval: tickInterval, minorTickInterval: minorTickInterval, bounds: { minVisible: min, maxVisible: max }, ticks: [] } } function updateTickIntervals(scaleOptions, screenDelta, incidentOccurred, range) { var result, tickManager, ticks, min = _isDefined(range.minVisible) ? range.minVisible : range.min, max = _isDefined(range.maxVisible) ? range.maxVisible : range.max, categoriesInfo = scaleOptions._categoriesInfo; if (scaleOptions.type === SEMIDISCRETE) { result = calculateTickIntervalsForSemidiscreteScale(scaleOptions, min, max, screenDelta) } else { tickManager = new tickManagerModule.TickManager({ axisType: scaleOptions.type, dataType: scaleOptions.valueType }, { min: min, max: max, screenDelta: screenDelta, customTicks: categoriesInfo && categoriesInfo.categories }, { labelOptions: {}, boundCoef: 1, minorTickInterval: scaleOptions.minorTickInterval, tickInterval: scaleOptions.tickInterval, incidentOccurred: incidentOccurred, base: scaleOptions.logarithmBase, showMinorTicks: true, withMinorCorrection: true, stick: false !== range.stick }); ticks = tickManager.getTicks(true); result = { tickInterval: tickManager.getTickInterval(), minorTickInterval: tickManager.getMinorTickInterval(), bounds: tickManager.getTickBounds(), ticks: ticks } } return result } function calculateTranslatorRange(seriesDataSource, scaleOptions) { var minValue, maxValue, isEqualDates, categories, categoriesInfo, rangeForCategories, inverted = false, startValue = scaleOptions.startValue, endValue = scaleOptions.endValue, translatorRange = seriesDataSource ? seriesDataSource.getBoundRange().arg : new rangeModule.Range, isDate = "datetime" === scaleOptions.valueType, minRange = scaleOptions.minRange; if (scaleOptions.type === DISCRETE) { rangeForCategories = new rangeModule.Range({ minVisible: startValue, maxVisible: endValue }); rangeForCategories.addRange(translatorRange); translatorRange = rangeForCategories; categories = seriesDataSource ? seriesDataSource.argCategories : scaleOptions.categories || !seriesDataSource && startValue && endValue && [startValue, endValue]; categories = categories || []; scaleOptions._categoriesInfo = categoriesInfo = vizUtils.getCategoriesInfo(categories, startValue || categories[0], endValue || categories[categories.length - 1]) } if (scaleOptions.type === SEMIDISCRETE) { startValue = scaleOptions.startValue = correctValueByInterval(scaleOptions.startValue, isDate, minRange); endValue = scaleOptions.endValue = correctValueByInterval(scaleOptions.endValue, isDate, minRange); translatorRange.minVisible = correctValueByInterval(translatorRange.minVisible, isDate, minRange); translatorRange.maxVisible = correctValueByInterval(translatorRange.maxVisible, isDate, minRange); translatorRange.min = correctValueByInterval(translatorRange.min, isDate, minRange); translatorRange.max = correctValueByInterval(translatorRange.max, isDate, minRange) } if (_isDefined(startValue) && _isDefined(endValue)) { inverted = categoriesInfo ? categoriesInfo.inverted : startValue > endValue; minValue = categoriesInfo ? categoriesInfo.start : inverted ? endValue : startValue; maxValue = categoriesInfo ? categoriesInfo.end : inverted ? startValue : endValue } else { if (_isDefined(startValue) || _isDefined(endValue)) { minValue = startValue; maxValue = endValue } else { if (categoriesInfo) { minValue = categoriesInfo.start; maxValue = categoriesInfo.end } } } isEqualDates = _isDate(minValue) && _isDate(maxValue) && minValue.getTime() === maxValue.getTime(); if (scaleOptions.type === SEMIDISCRETE || minValue !== maxValue && !isEqualDates) { translatorRange.addRange({ invert: inverted, min: minValue, max: maxValue, minVisible: minValue, maxVisible: maxValue, dataType: scaleOptions.valueType }) } translatorRange.addRange({ categories: !seriesDataSource ? categories : void 0, base: scaleOptions.logarithmBase, axisType: scaleOptions.type }); seriesDataSource && translatorRange.sortCategories(categories); if (!translatorRange.isDefined()) { if (isEqualDates) { scaleOptions.valueType = "numeric" } translatorRange.setStubData(scaleOptions.valueType) } return translatorRange } function startEndNotDefined(start, end) { return !_isDefined(start) || !_isDefined(end) } function getTextBBox(renderer, text, fontOptions) { var textElement = renderer.text(text, INVISIBLE_POS, INVISIBLE_POS).css(patchFontOptions(fontOptions)).append(renderer.root); var textBBox = textElement.getBBox(); textElement.remove(); return textBBox } function getDateMarkerVisibilityChecker(screenDelta) { return function(isDateScale, isMarkerVisible, min, max, tickInterval) { if (isMarkerVisible && isDateScale) { if (tickInterval.years || tickInterval.months >= 6 || screenDelta / SEMIDISCRETE_GRID_SPACING_FACTOR < _ceil((max - min) / dateToMilliseconds("year")) + 1) { isMarkerVisible = false } } return isMarkerVisible } } function updateScaleOptions(scaleOptions, seriesDataSource, translatorRange, tickIntervalsInfo, checkDateMarkerVisibility) { var bounds, isEmptyInterval, intervals, categoriesInfo = scaleOptions._categoriesInfo, isDateTime = scaleOptions.valueType === DATETIME; if (seriesDataSource && !seriesDataSource.isEmpty() && !translatorRange.stubData) { bounds = tickIntervalsInfo.bounds; translatorRange.addRange(bounds); scaleOptions.startValue = translatorRange.invert ? bounds.maxVisible : bounds.minVisible; scaleOptions.endValue = translatorRange.invert ? bounds.minVisible : bounds.maxVisible } scaleOptions.marker.visible = checkDateMarkerVisibility(isDateTime && scaleOptions.type.indexOf(DISCRETE) === -1, scaleOptions.marker.visible, scaleOptions.startValue, scaleOptions.endValue, tickIntervalsInfo.tickInterval); if (categoriesInfo) { scaleOptions.startValue = categoriesInfo.start; scaleOptions.endValue = categoriesInfo.end } if (scaleOptions.type.indexOf(DISCRETE) === -1) { isEmptyInterval = _isDate(scaleOptions.startValue) && _isDate(scaleOptions.endValue) && scaleOptions.startValue.getTime() === scaleOptions.endValue.getTime() || scaleOptions.startValue === scaleOptions.endValue } scaleOptions.isEmpty = startEndNotDefined(scaleOptions.startValue, scaleOptions.endValue) || isEmptyInterval; if (scaleOptions.isEmpty) { scaleOptions.startValue = scaleOptions.endValue = void 0 } else { scaleOptions.minorTickInterval = tickIntervalsInfo.minorTickInterval; scaleOptions.tickInterval = tickIntervalsInfo.tickInterval; if (isDateTime && (!_isDefined(scaleOptions.label.format) || scaleOptions.type === SEMIDISCRETE && scaleOptions.minorTickInterval !== scaleOptions.tickInterval)) { if (scaleOptions.type === DISCRETE) { scaleOptions.label.format = formatHelper.getDateFormatByTicks(tickIntervalsInfo.ticks) } else { if (!scaleOptions.marker.visible) { scaleOptions.label.format = formatHelper.getDateFormatByTickInterval(scaleOptions.startValue, scaleOptions.endValue, scaleOptions.tickInterval) } else { scaleOptions.label.format = dateUtils.getDateFormatByTickInterval(scaleOptions.tickInterval) } } } } if (scaleOptions.type === SEMIDISCRETE) { intervals = getIntervalCustomTicks(scaleOptions); scaleOptions.customMinorTicks = intervals.altIntervals; scaleOptions.customTicks = intervals.intervals; scaleOptions.customBoundTicks = [scaleOptions.customTicks[0]] } } function prepareScaleOptions(scaleOption, seriesDataSource, incidentOccurred) { var parser, parsedValue = 0, valueType = parseUtils.correctValueType(_normalizeEnum(scaleOption.valueType)), validateStartEndValues = function(field, parser) { var messageToIncidentOccurred = field === START_VALUE ? "start" : "end"; if (_isDefined(scaleOption[field])) { parsedValue = parser(scaleOption[field]); if (_isDefined(parsedValue)) { scaleOption[field] = parsedValue } else { scaleOption[field] = void 0; incidentOccurred("E2202", [messageToIncidentOccurred]) } } }; if (seriesDataSource) { valueType = seriesDataSource.getCalculatedValueType() || valueType } if (!valueType) { valueType = calculateValueType(scaleOption.startValue, scaleOption.endValue) || "numeric" } if (valueType === STRING || scaleOption.categories) { scaleOption.type = DISCRETE; valueType = STRING } scaleOption.valueType = valueType; parser = parseUtils.getParser(valueType); validateStartEndValues(START_VALUE, parser); validateStartEndValues(END_VALUE, parser); checkLogarithmicOptions(scaleOption, logarithmBase, incidentOccurred); if (!scaleOption.type) { scaleOption.type = "continuous" } void 0 === scaleOption.tickInterval && (scaleOption.tickInterval = scaleOption.majorTickInterval); scaleOption.minorTick.visible && (scaleOption.minorTick.visible = scaleOption.showMinorTicks); scaleOption.parser = parser; if (scaleOption.type === SEMIDISCRETE) { scaleOption.minorTick.visible = false; scaleOption.minorTickInterval = scaleOption.minRange; scaleOption.marker.visible = false; scaleOption.maxRange = void 0 } return scaleOption } function correctValueByInterval(value, isDate, interval) { if (_isDefined(value)) { value = isDate ? dateUtils.correctDateWithUnitBeginning(new Date(value), interval) : adjustValue(_floor(value / interval) * interval) } return value } function getIntervalCustomTicks(options) { var min = options.startValue, max = options.endValue, isDate = "datetime" === options.valueType, tickInterval = options.tickInterval, res = { intervals: [] }; if (!_isDefined(min) || !_isDefined(max)) { return res } res.intervals = getSequenceByInterval(min, max, options.minorTickInterval); if (tickInterval !== options.minorTickInterval) { res.altIntervals = res.intervals; min = correctValueByInterval(min, isDate, tickInterval); max = correctValueByInterval(max, isDate, tickInterval); res.intervals = getSequenceByInterval(min, max, tickInterval) } return res } var dxRangeSelector = __webpack_require__( /*! ../core/base_widget */ 515).inherit({ _eventsMap: { onSelectedRangeChanged: { name: SELECTED_RANGE_CHANGED }, onValueChanged: { name: VALUE_CHANGED } }, _setDeprecatedOptions: function() { this.callBase.apply(this, arguments); extend(this._deprecatedOptions, { "sliderMarker.padding": { since: "15.1", message: "Use the 'paddingTopBottom' and 'paddingLeftRight' options instead" }, "sliderMarker.placeholderSize": { since: "15.1", message: "Use the 'placeholderHeight' and 'indent' options instead" }, "scale.majorTickInterval": { since: "15.2", message: "Use the 'tickInterval' options instead" }, "scale.showMinorTicks": { since: "15.2", message: "Use the 'minorTick.visible' options instead" }, selectedRange: { since: "16.2", message: "Use the 'value' option instead" }, onSelectedRangeChanged: { since: "16.2", message: "Use the 'onValueChanged' option instead" }, "behavior.callSelectedRangeChanged": { since: "16.2", message: "Use the 'behavior.callValueChanged' option instead" }, "scale.useTicksAutoArrangement": { since: "17.1", message: "Use the 'scale.label.overlappingBehavior' option instead" } }) }, _rootClassPrefix: "dxrs", _rootClass: "dxrs-range-selector", _dataIsReady: function() { return this._dataIsLoaded() }, _initialChanges: ["DATA_SOURCE", "SELECTED_RANGE", "VALUE", "DISABLED"], _themeDependentChanges: ["MOSTLY_TOTAL"], _initCore: function() { var rangeViewGroup, slidersGroup, scaleGroup, trackersGroup, that = this, renderer = that._renderer, root = renderer.root; root.css({ "touch-action": "pan-y", "-ms-touch-action": "pan-y" }); that._clipRect = renderer.clipRect(); rangeViewGroup = renderer.g().attr({ "class": "dxrs-view" }).append(root); slidersGroup = renderer.g().attr({ "class": "dxrs-slidersContainer", "clip-path": that._clipRect.id }).append(root); scaleGroup = renderer.g().attr({ "class": "dxrs-scale", "clip-path": that._clipRect.id }).append(root); trackersGroup = renderer.g().attr({ "class": "dxrs-trackers" }).append(root); that._axis = new AxisWrapper({ renderer: renderer, root: scaleGroup, updateSelectedRange: function(range) { that.setValue(parseSelectedRange(range)) } }); that._rangeView = new rangeViewModule.RangeView({ renderer: renderer, root: rangeViewGroup, translator: that._axis.getTranslator() }); that._slidersController = new slidersControllerModule.SlidersController({ renderer: renderer, root: slidersGroup, trackersGroup: trackersGroup, updateSelectedRange: function(range, lastSelectedRange) { if (!that._rangeOption) { that._suppressDeprecatedWarnings(); that.option(SELECTED_RANGE, range); that._resumeDeprecatedWarnings(); that.option(VALUE, parseSelectedRange(range)) } if (that._options.onSelectedRangeChanged || that.hasEvent("selectedRangeChanged")) { that._eventTrigger(SELECTED_RANGE_CHANGED, { startValue: range.startValue, endValue: range.endValue }) } that._eventTrigger(VALUE_CHANGED, { value: parseSelectedRange(range), previousValue: parseSelectedRange(lastSelectedRange) }) }, translator: that._axis.getTranslator() }); that._tracker = new trackerModule.Tracker({ renderer: renderer, controller: that._slidersController }) }, _getDefaultSize: function() { return { width: 400, height: 160 } }, _disposeCore: function() { this._axis.dispose(); this._slidersController.dispose(); this._tracker.dispose() }, _createThemeManager: function() { return new themeManagerModule.ThemeManager }, _applySize: function(rect) { this._clientRect = rect.slice(); this._change(["MOSTLY_TOTAL"]) }, _optionChangesMap: { scale: "SCALE", selectedRange: "SELECTED_RANGE", value: "VALUE", dataSource: "DATA_SOURCE", disabled: "DISABLED" }, _optionChangesOrder: ["SCALE", "DATA_SOURCE"], _change_SCALE: function() { this._change(["MOSTLY_TOTAL"]) }, _change_DATA_SOURCE: function() { if (this._initialized || this._options.dataSource) { this._options[SELECTED_RANGE] = this._options[VALUE] = null; this._updateDataSource() } }, _customChangesOrder: ["MOSTLY_TOTAL", "SELECTED_RANGE", "VALUE", "SLIDER_SELECTION", "DISABLED"], _change_MOSTLY_TOTAL: function() { this._applyMostlyTotalChange() }, _change_SLIDER_SELECTION: function() { var that = this, range = that._options[SELECTED_RANGE], value = that._options[VALUE]; that._slidersController.setSelectedRange(value ? parseValue(value) : range && range) }, _change_SELECTED_RANGE: function() { var that = this, option = that._rangeOption && that._rangeOption[SELECTED_RANGE]; if (option) { that._options[SELECTED_RANGE] = option; that._validateRange(option.startValue, option.endValue); that.setValue(parseSelectedRange(option)) } }, _change_VALUE: function() { var that = this, option = that._rangeOption && that._rangeOption[VALUE]; if (option) { that._options[VALUE] = option; that._validateRange(option[0], option[1]); that.setValue(option) } }, _change_DISABLED: function() { var renderer = this._renderer, root = renderer.root; if (this.option("disabled")) { root.attr({ "pointer-events": "none", filter: renderer.getGrayScaleFilter().id }) } else { root.attr({ "pointer-events": null, filter: null }) } }, _validateRange: function(start, end) { var that = this, translator = that._axis.getTranslator(); if (null !== start && !translator.isValid(start) || null !== end && !translator.isValid(end)) { that._incidentOccurred("E2203") } }, _applyChanges: function() { var that = this, selectedRange = that._options[SELECTED_RANGE], value = that._options[VALUE]; if (that._changes.has("VALUE") && value) { that._rangeOption = { value: [value[0], value[1]] } } else { if (that._changes.has("SELECTED_RANGE") && selectedRange) { that._rangeOption = { selectedRange: selectedRange } } } that.callBase.apply(that, arguments); that._rangeOption = null; that.__isResizing = false }, _applyMostlyTotalChange: function() { var currentAnimationEnabled, that = this, renderer = that._renderer, rect = that._clientRect; if (that.__isResizing) { currentAnimationEnabled = renderer.animationEnabled(); renderer.updateAnimationOptions({ enabled: false }) } that._clipRect.attr({ x: rect[0], y: rect[1], width: rect[2] - rect[0], height: rect[3] - rect[1] }); that._updateContent({ left: rect[0], top: rect[1], width: rect[2] - rect[0], height: rect[3] - rect[1] }); if (that.__isResizing) { renderer.updateAnimationOptions({ enabled: currentAnimationEnabled }) } that._drawn() }, _dataSourceChangedHandler: function() { this._requestChange(["MOSTLY_TOTAL"]) }, _updateContent: function(canvas) { var sliderMarkerOptions, indents, scaleLabelsAreaHeight, rangeContainerCanvas, that = this, chartOptions = that.option("chart"), seriesDataSource = that._createSeriesDataSource(chartOptions), isCompactMode = !(seriesDataSource && seriesDataSource.isShowChart() || that.option("background.image.url")), scaleOptions = prepareScaleOptions(that._getOption("scale"), seriesDataSource, that._incidentOccurred), argTranslatorRange = calculateTranslatorRange(seriesDataSource, scaleOptions), tickIntervalsInfo = updateTickIntervals(scaleOptions, canvas.width, that._incidentOccurred, argTranslatorRange), chartThemeManager = seriesDataSource && seriesDataSource.isShowChart() && seriesDataSource.getThemeManager(); if (chartThemeManager) { checkLogarithmicOptions(chartOptions && chartOptions.valueAxis, chartThemeManager.getOptions("valueAxis").logarithmBase, that._incidentOccurred) } updateScaleOptions(scaleOptions, seriesDataSource, argTranslatorRange, tickIntervalsInfo, getDateMarkerVisibilityChecker(canvas.width)); updateTranslatorRangeInterval(argTranslatorRange, scaleOptions); sliderMarkerOptions = that._prepareSliderMarkersOptions(scaleOptions, canvas.width, tickIntervalsInfo); indents = calculateIndents(that._renderer, scaleOptions, sliderMarkerOptions, that.option("indent")); scaleLabelsAreaHeight = calculateScaleAreaHeight(that._renderer, scaleOptions, showScaleMarkers(scaleOptions)); rangeContainerCanvas = { left: canvas.left + indents.left, top: canvas.top + indents.top, width: _max(canvas.width + canvas.left - indents.right, 1), height: _max(!isCompactMode ? canvas.height - indents.top - indents.bottom - scaleLabelsAreaHeight : commonModule.HEIGHT_COMPACT_MODE, 0), right: 0, bottom: 0 }; that._axis.update(scaleOptions, isCompactMode, rangeContainerCanvas, argTranslatorRange); scaleOptions.minorTickInterval = scaleOptions.isEmpty ? 0 : scaleOptions.minorTickInterval; that._updateElements(scaleOptions, sliderMarkerOptions, isCompactMode, rangeContainerCanvas, seriesDataSource); if (chartThemeManager) { chartThemeManager.dispose() } }, _updateElements: function(scaleOptions, sliderMarkerOptions, isCompactMode, canvas, seriesDataSource) { var that = this, behavior = that._getOption("behavior"), shutterOptions = that._getOption("shutter"), isNotSemiDiscrete = scaleOptions.type !== SEMIDISCRETE; shutterOptions.color = shutterOptions.color || that._getOption(CONTAINER_BACKGROUND_COLOR, true); that._rangeView.update(that.option("background"), that._themeManager.theme("background"), canvas, isCompactMode, behavior.animationEnabled && that._renderer.animationEnabled(), seriesDataSource); that._isUpdating = true; that._slidersController.update([canvas.top, canvas.top + canvas.height], behavior, isCompactMode, that._getOption("sliderHandle"), sliderMarkerOptions, shutterOptions, { minRange: isNotSemiDiscrete ? that.option("scale.minRange") : void 0, maxRange: isNotSemiDiscrete ? that.option("scale.maxRange") : void 0 }, that._axis.getFullTicks(), that._getOption("selectedRangeColor", true)); that._requestChange(["SLIDER_SELECTION"]); that._isUpdating = false; that._tracker.update(!that._axis.getTranslator().isEmptyValueRange(), behavior) }, _createSeriesDataSource: function(chartOptions) { var seriesDataSource, that = this, dataSource = that._dataSourceItems(), scaleOptions = that._getOption("scale"), valueType = scaleOptions.valueType || calculateValueType(scaleOptions.startValue, scaleOptions.endValue), valueAxis = new axisModule.Axis({ renderer: that._renderer, axisType: "xyAxes", drawingType: "linear" }); valueAxis.updateOptions({ isHorizontal: false, label: {} }); if (dataSource || chartOptions && chartOptions.series) { chartOptions = extend({}, chartOptions, { theme: that.option("theme") }); seriesDataSource = new seriesDataSourceModule.SeriesDataSource({ renderer: that._renderer, dataSource: dataSource, valueType: _normalizeEnum(valueType), axisType: scaleOptions.type, chart: chartOptions, dataSourceField: that.option("dataSourceField"), incidentOccurred: that._incidentOccurred, categories: scaleOptions.categories, argumentAxis: that._axis, valueAxis: valueAxis }) } return seriesDataSource }, _prepareSliderMarkersOptions: function(scaleOptions, screenDelta, tickIntervalsInfo) { var businessInterval, that = this, minorTickInterval = tickIntervalsInfo.minorTickInterval, tickInterval = tickIntervalsInfo.tickInterval, endValue = scaleOptions.endValue, startValue = scaleOptions.startValue, sliderMarkerOptions = that._getOption(SLIDER_MARKER), sliderMarkerUserOption = that.option(SLIDER_MARKER) || {}, isTypeDiscrete = scaleOptions.type === DISCRETE, isValueTypeDatetime = scaleOptions.valueType === DATETIME; sliderMarkerOptions.borderColor = that._getOption(CONTAINER_BACKGROUND_COLOR, true); if (!sliderMarkerOptions.format) { if (!that._getOption("behavior").snapToTicks && _isNumber(scaleOptions.startValue)) { businessInterval = Math.abs(endValue - startValue); sliderMarkerOptions.format = { type: "fixedPoint", precision: vizUtils.getSignificantDigitPosition(businessInterval / screenDelta) } } if (isValueTypeDatetime && !isTypeDiscrete) { if (!scaleOptions.marker.visible) { if (_isDefined(startValue) && _isDefined(endValue)) { sliderMarkerOptions.format = formatHelper.getDateFormatByTickInterval(startValue, endValue, _isDefined(minorTickInterval) && 0 !== minorTickInterval ? minorTickInterval : tickInterval) } } else { sliderMarkerOptions.format = dateUtils.getDateFormatByTickInterval(_isDefined(minorTickInterval) && 0 !== minorTickInterval ? minorTickInterval : tickInterval) } } if (isValueTypeDatetime && isTypeDiscrete && tickIntervalsInfo.ticks.length) { sliderMarkerOptions.format = formatHelper.getDateFormatByTicks(tickIntervalsInfo.ticks) } } if (void 0 !== sliderMarkerUserOption.padding && void 0 === sliderMarkerUserOption.paddingLeftRight && void 0 === sliderMarkerUserOption.paddingTopBottom) { sliderMarkerOptions.paddingLeftRight = sliderMarkerOptions.paddingTopBottom = sliderMarkerUserOption.padding } return sliderMarkerOptions }, getSelectedRange: function() { log("W0002", this.NAME, "getSelectedRange", "16.2", "Use the 'getValue' method instead"); return parseValue(this.getValue()) }, getValue: function() { return parseSelectedRange(this._slidersController.getSelectedRange()) }, setSelectedRange: function(range) { log("W0002", this.NAME, "setSelectedRange", "16.2", "Use the 'setValue' method instead"); this.setValue(parseSelectedRange(range)) }, setValue: function(value) { var current; if (!this._isUpdating && value) { current = this._slidersController.getSelectedRange(); if (!current || current.startValue !== value[0] || current.endValue !== value[1]) { this._slidersController.setSelectedRange(parseValue(value)) } } }, resetSelectedRange: function() { this.setValue([]) }, _setContentSize: function() { this.__isResizing = 2 === this._changes.count(); this.callBase.apply(this, arguments) } }); $.each(["selectedRangeColor", "containerBackgroundColor", "sliderMarker", "sliderHandle", "shutter", OPTION_BACKGROUND, "behavior", "chart", "indent"], function(_, name) { dxRangeSelector.prototype._optionChangesMap[name] = "MOSTLY_TOTAL" }); function prepareAxisOptions(scaleOptions, isCompactMode, height, axisPosition) { scaleOptions.label.overlappingBehavior = { mode: _isDefined(scaleOptions.useTicksAutoArrangement) ? scaleOptions.useTicksAutoArrangement ? "hide" : "none" : scaleOptions.label.overlappingBehavior }; scaleOptions.marker.label.font = scaleOptions.label.font; scaleOptions.color = scaleOptions.marker.color = scaleOptions.tick.color; scaleOptions.opacity = scaleOptions.marker.opacity = scaleOptions.tick.opacity; scaleOptions.width = scaleOptions.marker.width = scaleOptions.tick.width; scaleOptions.placeholderSize = (scaleOptions.placeholderHeight || 0) + axisPosition; scaleOptions.argumentType = scaleOptions.valueType; scaleOptions.visible = isCompactMode; scaleOptions.minorTick.showCalculatedTicks = scaleOptions.isHorizontal = scaleOptions.stick = true; scaleOptions.semiDiscreteInterval = scaleOptions.minRange; if (!isCompactMode) { scaleOptions.minorTick.length = scaleOptions.tick.length = height } scaleOptions.label.indentFromAxis = scaleOptions.label.topIndent + axisPosition; return scaleOptions } function createDateMarkersEvent(scaleOptions, markerTrackers, setSelectedRange) { $.each(markerTrackers, function(_, value) { value.on("dxpointerdown", onPointerDown) }); function onPointerDown(e) { var range = e.target.range, minRange = scaleOptions.minRange ? addInterval(range.startValue, scaleOptions.minRange) : void 0, maxRange = scaleOptions.maxRange ? addInterval(range.startValue, scaleOptions.maxRange) : void 0; if (!(minRange && minRange > range.endValue || maxRange && maxRange < range.endValue)) { setSelectedRange(range) } } } function AxisWrapper(params) { this._axis = new axisModule.Axis({ renderer: params.renderer, axesContainerGroup: params.root, axisType: "xyAxes", drawingType: "linear", widgetClass: "dxrs", axisClass: "range-selector" }); this._updateSelectedRangeCallback = params.updateSelectedRange } AxisWrapper.prototype = { constructor: AxisWrapper, dispose: function() { this._axis.dispose() }, update: function(options, isCompactMode, canvas, businessRange) { var axis = this._axis; axis.updateOptions(prepareAxisOptions(options, isCompactMode, canvas.height, canvas.height / 2 - Math.ceil(options.width / 2))); axis.setBusinessRange(businessRange); axis.draw(canvas); axis.shift({ left: 0, bottom: -canvas.height / 2 + canvas.top }); if (axis.getMarkerTrackers()) { createDateMarkersEvent(options, axis.getMarkerTrackers(), this._updateSelectedRangeCallback) } }, getFullTicks: function() { return this._axis.getFullTicks() }, getTranslator: function() { return this._axis.getTranslator() }, getViewport: function() {} }; registerComponent("dxRangeSelector", dxRangeSelector); module.exports = dxRangeSelector; dxRangeSelector.addPlugin(__webpack_require__( /*! ../core/export */ 511).plugin); dxRangeSelector.addPlugin(__webpack_require__( /*! ../core/title */ 558).plugin); dxRangeSelector.addPlugin(__webpack_require__( /*! ../core/loading_indicator */ 560).plugin); dxRangeSelector.addPlugin(__webpack_require__( /*! ../core/data_source */ 561).plugin) }, /*!*****************************************!*\ !*** ./js/viz/range_selector/common.js ***! \*****************************************/ function(module, exports, __webpack_require__) { var _format = __webpack_require__( /*! ../core/format */ 530), isFunction = __webpack_require__( /*! ../../core/utils/common */ 14).isFunction, HEIGHT_COMPACT_MODE = 24, POINTER_SIZE = 4, EMPTY_SLIDER_MARKER_TEXT = ". . ."; var utils = { trackerSettings: { fill: "grey", stroke: "grey", opacity: 1e-4 }, animationSettings: { duration: 250 } }; var consts = { emptySliderMarkerText: EMPTY_SLIDER_MARKER_TEXT, pointerSize: POINTER_SIZE }; var formatValue = function(value, formatOptions) { var formatObject = { value: value, valueText: _format(value, formatOptions) }; return String(isFunction(formatOptions.customizeText) ? formatOptions.customizeText.call(formatObject, formatObject) : formatObject.valueText) }; exports.utils = utils; exports.consts = consts; exports.formatValue = formatValue; exports.HEIGHT_COMPACT_MODE = HEIGHT_COMPACT_MODE }, /*!*****************************************************!*\ !*** ./js/viz/range_selector/sliders_controller.js ***! \*****************************************************/ function(module, exports, __webpack_require__) { var noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, commonModule = __webpack_require__( /*! ./common */ 605), animationSettings = commonModule.utils.animationSettings, emptySliderMarkerText = commonModule.consts.emptySliderMarkerText, Slider = __webpack_require__( /*! ./slider */ 607), _normalizeEnum = __webpack_require__( /*! ../core/utils */ 509).normalizeEnum; function buildRectPoints(left, top, right, bottom) { return [left, top, right, top, right, bottom, left, bottom] } function valueOf(value) { return value && value.valueOf() } function isLess(a, b) { return a < b } function isGreater(a, b) { return a > b } function selectClosestValue(target, values) { var middle, start = 0, end = values ? values.length - 1 : 0, val = target; while (end - start > 1) { middle = start + end >> 1; val = values[middle]; if (val === target) { return target } else { if (target < val) { end = middle } else { start = middle } } } if (values) { val = values[target - values[start] <= values[end] - target ? start : end] } return val } function dummyProcessSelectionChanged() { this._lastSelectedRange = this.getSelectedRange(); delete this._processSelectionChanged } function suppressSetSelectedRange(controller) { controller.setSelectedRange = noop; if (controller._processSelectionChanged === dummyProcessSelectionChanged) { controller._processSelectionChanged() } } function restoreSetSelectedRange(controller) { delete controller.setSelectedRange } function SlidersController(params) { var that = this, sliderParams = { renderer: params.renderer, root: params.root, trackersGroup: params.trackersGroup, translator: params.translator }; that._params = params; that._areaTracker = params.renderer.path(null, "area").attr({ "class": "area-tracker", fill: "#000000", opacity: 1e-4 }).append(params.trackersGroup); that._selectedAreaTracker = params.renderer.path(null, "area").attr({ "class": "selected-area-tracker", fill: "#000000", opacity: 1e-4 }).append(params.trackersGroup); that._shutter = params.renderer.path(null, "area").append(params.root); that._sliders = [new Slider(sliderParams, 0), new Slider(sliderParams, 1)]; that._processSelectionChanged = dummyProcessSelectionChanged } SlidersController.prototype = { constructor: SlidersController, dispose: function() { this._sliders[0].dispose(); this._sliders[1].dispose() }, getTrackerTargets: function() { return { area: this._areaTracker, selectedArea: this._selectedAreaTracker, sliders: this._sliders } }, _processSelectionChanged: function() { var that = this, selectedRange = that.getSelectedRange(); if (valueOf(selectedRange.startValue) !== valueOf(that._lastSelectedRange.startValue) || valueOf(selectedRange.endValue) !== valueOf(that._lastSelectedRange.endValue)) { that._params.updateSelectedRange(selectedRange, that._lastSelectedRange); that._lastSelectedRange = selectedRange } }, update: function(verticalRange, behavior, isCompactMode, sliderHandleOptions, sliderMarkerOptions, shutterOptions, rangeBounds, fullTicks, selectedRangeColor) { var that = this, callValueChanged = behavior.callValueChanged || behavior.callSelectedRangeChanged, screenRange = that._params.translator.getScreenRange(); that._verticalRange = verticalRange; that._minRange = rangeBounds.minRange; that._maxRange = rangeBounds.maxRange; that._animationEnabled = behavior.animationEnabled && that._params.renderer.animationEnabled(); that._allowSlidersSwap = behavior.allowSlidersSwap; that._sliders[0].update(verticalRange, sliderHandleOptions, sliderMarkerOptions); that._sliders[1].update(verticalRange, sliderHandleOptions, sliderMarkerOptions); that._sliders[0]._position = that._sliders[1]._position = screenRange[0]; that._values = !that._params.translator.isValueProlonged && behavior.snapToTicks ? fullTicks : null; that._areaTracker.attr({ points: buildRectPoints(screenRange[0], verticalRange[0], screenRange[1], verticalRange[1]) }); that._isCompactMode = isCompactMode; that._shutterOffset = sliderHandleOptions.width / 2; that._updateSelectedView(shutterOptions, selectedRangeColor); that._isOnMoving = "onmoving" === _normalizeEnum(callValueChanged); that._updateSelectedRange(); that._applyTotalPosition(false) }, _updateSelectedView: function(shutterOptions, selectedRangeColor) { var settings = { fill: null, "fill-opacity": null, stroke: null, "stroke-width": null }; if (this._isCompactMode) { settings.stroke = selectedRangeColor; settings["stroke-width"] = 3; settings.sharp = "v" } else { settings.fill = shutterOptions.color; settings["fill-opacity"] = shutterOptions.opacity } this._shutter.attr(settings) }, _updateSelectedRange: function() { var that = this, sliders = that._sliders; sliders[0].cancelAnimation(); sliders[1].cancelAnimation(); that._shutter.stopAnimation(); if (that._params.translator.isEmptyValueRange()) { sliders[0]._setText(emptySliderMarkerText); sliders[1]._setText(emptySliderMarkerText); sliders[0]._value = sliders[1]._value = void 0; sliders[0]._position = that._params.translator.getScreenRange()[0]; sliders[1]._position = that._params.translator.getScreenRange()[1]; that._applyTotalPosition(false); suppressSetSelectedRange(that) } else { restoreSetSelectedRange(that) } }, _applyTotalPosition: function(isAnimated) { var areOverlapped, sliders = this._sliders; isAnimated = this._animationEnabled && isAnimated; sliders[0].applyPosition(isAnimated); sliders[1].applyPosition(isAnimated); areOverlapped = sliders[0].getCloudBorder() > sliders[1].getCloudBorder(); sliders[0].setOverlapped(areOverlapped); sliders[1].setOverlapped(areOverlapped); this._applyAreaTrackersPosition(); this._applySelectedRangePosition(isAnimated) }, _applyAreaTrackersPosition: function() { var that = this, position1 = that._sliders[0].getPosition(), position2 = that._sliders[1].getPosition(); that._selectedAreaTracker.attr({ points: buildRectPoints(position1, that._verticalRange[0], position2, that._verticalRange[1]) }).css({ cursor: Math.abs(that._params.translator.getScreenRange()[1] - that._params.translator.getScreenRange()[0] - position2 + position1) < .001 ? "default" : "pointer" }) }, _applySelectedRangePosition: function(isAnimated) { var screenRange, points, that = this, verticalRange = that._verticalRange, pos1 = that._sliders[0].getPosition(), pos2 = that._sliders[1].getPosition(); if (that._isCompactMode) { points = [pos1 + Math.ceil(that._shutterOffset), (verticalRange[0] + verticalRange[1]) / 2, pos2 - Math.floor(that._shutterOffset), (verticalRange[0] + verticalRange[1]) / 2] } else { screenRange = that._params.translator.getScreenRange(); points = [buildRectPoints(screenRange[0], verticalRange[0], Math.max(pos1 - Math.floor(that._shutterOffset), screenRange[0]), verticalRange[1]), buildRectPoints(screenRange[1], verticalRange[0], Math.min(pos2 + Math.ceil(that._shutterOffset), screenRange[1]), verticalRange[1])] } if (isAnimated) { that._shutter.animate({ points: points }, animationSettings) } else { that._shutter.attr({ points: points }) } }, getSelectedRange: function() { return { startValue: this._sliders[0].getValue(), endValue: this._sliders[1].getValue() } }, setSelectedRange: function(arg) { arg = arg || {}; var that = this, translator = that._params.translator, startValue = translator.isValid(arg.startValue) ? translator.parse(arg.startValue) : translator.getRange()[0], endValue = translator.isValid(arg.endValue) ? translator.parse(arg.endValue) : translator.getRange()[1], values = translator.to(startValue, -1) < translator.to(endValue, 1) ? [startValue, endValue] : [endValue, startValue]; that._sliders[0].setDisplayValue(values[0]); that._sliders[1].setDisplayValue(values[1]); that._sliders[0]._position = translator.to(values[0], -1); that._sliders[1]._position = translator.to(values[1], 1); that._applyTotalPosition(true); that._processSelectionChanged() }, beginSelectedAreaMoving: function(initialPosition) { var that = this, sliders = that._sliders, offset = (sliders[0].getPosition() + sliders[1].getPosition()) / 2 - initialPosition, currentPosition = initialPosition; move.complete = function() { that._dockSelectedArea() }; return move; function move(position) { if (position !== currentPosition && position > currentPosition === position > (sliders[0].getPosition() + sliders[1].getPosition()) / 2 - offset) { that._moveSelectedArea(position + offset, false) } currentPosition = position } }, _dockSelectedArea: function() { var translator = this._params.translator, sliders = this._sliders; sliders[0]._position = translator.to(sliders[0].getValue(), -1); sliders[1]._position = translator.to(sliders[1].getValue(), 1); this._applyTotalPosition(true); this._processSelectionChanged() }, moveSelectedArea: function(screenPosition) { this._moveSelectedArea(screenPosition, true); this._dockSelectedArea() }, _moveSelectedArea: function(screenPosition, isAnimated) { var startValue, that = this, translator = that._params.translator, sliders = that._sliders, interval = sliders[1].getPosition() - sliders[0].getPosition(), startPosition = screenPosition - interval / 2, endPosition = screenPosition + interval / 2; if (startPosition < translator.getScreenRange()[0]) { startPosition = translator.getScreenRange()[0]; endPosition = startPosition + interval } if (endPosition > translator.getScreenRange()[1]) { endPosition = translator.getScreenRange()[1]; startPosition = endPosition - interval } startValue = selectClosestValue(translator.from(startPosition, -1), that._values); sliders[0].setDisplayValue(startValue); sliders[1].setDisplayValue(selectClosestValue(translator.from(translator.to(startValue, -1) + interval, 1), that._values)); sliders[0]._position = startPosition; sliders[1]._position = endPosition; that._applyTotalPosition(isAnimated); if (that._isOnMoving) { that._processSelectionChanged() } }, placeSliderAndBeginMoving: function(firstPosition, secondPosition) { var thresholdPosition, handler, that = this, translator = that._params.translator, sliders = that._sliders, index = firstPosition < secondPosition ? 0 : 1, dir = index > 0 ? 1 : -1, compare = index > 0 ? isGreater : isLess, antiCompare = index > 0 ? isLess : isGreater, positions = [], values = []; values[index] = translator.from(firstPosition, dir); values[1 - index] = translator.from(secondPosition, -dir); positions[1 - index] = secondPosition; if (translator.isValueProlonged) { if (compare(firstPosition, translator.to(values[index], dir))) { values[index] = translator.from(firstPosition, -dir) } if (compare(secondPosition, translator.to(values[index], -dir))) { values[1 - index] = values[index] } } if (that._minRange) { thresholdPosition = translator.to(translator.add(selectClosestValue(values[index], that._values), that._minRange, -dir), -dir); if (compare(secondPosition, thresholdPosition)) { values[1 - index] = translator.add(values[index], that._minRange, -dir) } thresholdPosition = translator.to(translator.add(translator.getRange()[1 - index], that._minRange, dir), -dir); if (antiCompare(firstPosition, thresholdPosition)) { values[1 - index] = translator.getRange()[1 - index]; values[index] = translator.add(values[1 - index], that._minRange, dir); positions[1 - index] = firstPosition } } values[0] = selectClosestValue(values[0], that._values); values[1] = selectClosestValue(values[1], that._values); positions[index] = translator.to(values[index], dir); sliders[0].setDisplayValue(values[0]); sliders[1].setDisplayValue(values[1]); sliders[0]._position = positions[0]; sliders[1]._position = positions[1]; that._applyTotalPosition(true); if (that._isOnMoving) { that._processSelectionChanged() } handler = that.beginSliderMoving(1 - index, secondPosition); sliders[1 - index]._sliderGroup.stopAnimation(); that._shutter.stopAnimation(); handler(secondPosition); return handler }, beginSliderMoving: function(initialIndex, initialPosition) { var that = this, translator = that._params.translator, sliders = that._sliders, minPosition = translator.getScreenRange()[0], maxPosition = translator.getScreenRange()[1], index = initialIndex, staticPosition = sliders[1 - index].getPosition(), currentPosition = initialPosition, dir = index > 0 ? 1 : -1, compareMin = index > 0 ? isLess : isGreater, compareMax = index > 0 ? isGreater : isLess, moveOffset = sliders[index].getPosition() - initialPosition, swapOffset = compareMin(sliders[index].getPosition(), initialPosition) ? -moveOffset : moveOffset; move.complete = function() { sliders[index]._setValid(true); that._dockSelectedArea() }; return move; function move(position) { var isValid, temp, pos, slider, value; if (position !== currentPosition) { if (compareMin(position + swapOffset, staticPosition)) { isValid = that._allowSlidersSwap; if (isValid && !translator.isValueProlonged && that._minRange) { isValid = translator.isValid(translator.add(sliders[1 - index].getValue(), that._minRange, -dir)) } if (isValid) { that._changeMovingSlider(index); index = 1 - index; dir = -dir; temp = compareMin; compareMin = compareMax; compareMax = temp; moveOffset = -dir * Math.abs(moveOffset); swapOffset = -moveOffset } } if (compareMax(position + moveOffset, staticPosition)) { isValid = true; slider = sliders[index]; value = sliders[1 - index].getValue(); pos = Math.max(Math.min(position + moveOffset, maxPosition), minPosition); if (isValid && translator.isValueProlonged) { isValid = !compareMin(pos, translator.to(value, dir)) } if (isValid && that._minRange) { isValid = !compareMin(pos, translator.to(translator.add(value, that._minRange, dir), dir)) } if (isValid && that._maxRange) { isValid = !compareMax(pos, translator.to(translator.add(value, that._maxRange, dir), dir)) } slider._setValid(isValid); slider.setDisplayValue(isValid ? selectClosestValue(translator.from(pos, dir), that._values) : slider.getValue()); slider._position = pos; that._applyTotalPosition(false); slider.toForeground(); if (that._isOnMoving) { that._processSelectionChanged() } } } currentPosition = position } }, _changeMovingSlider: function(index) { var newValue, that = this, translator = that._params.translator, sliders = that._sliders, position = sliders[1 - index].getPosition(), dir = index > 0 ? 1 : -1; sliders[index].setDisplayValue(selectClosestValue(translator.from(position, dir), that._values)); newValue = translator.from(position, -dir); if (translator.isValueProlonged) { newValue = translator.from(position, dir) } else { if (that._minRange) { newValue = translator.add(newValue, that._minRange, -dir) } } sliders[1 - index].setDisplayValue(selectClosestValue(newValue, that._values)); sliders[index]._setValid(true); sliders[index]._marker._update(); sliders[0]._position = sliders[1]._position = position }, foregroundSlider: function(index) { this._sliders[index].toForeground() } }; exports.SlidersController = SlidersController }, /*!*****************************************!*\ !*** ./js/viz/range_selector/slider.js ***! \*****************************************/ function(module, exports, __webpack_require__) { var commonModule = __webpack_require__( /*! ./common */ 605), animationSettings = commonModule.utils.animationSettings, formatValue = commonModule.formatValue, SliderMarker = __webpack_require__( /*! ./slider_marker */ 608), support = __webpack_require__( /*! ../../core/utils/support */ 61), SPLITTER_WIDTH = 8, TOUCH_SPLITTER_WIDTH = 20; function getSliderTrackerWidth(sliderHandleWidth) { return support.touchEvents || support.pointer ? TOUCH_SPLITTER_WIDTH : SPLITTER_WIDTH < sliderHandleWidth ? sliderHandleWidth : SPLITTER_WIDTH } function Slider(params, index) { var that = this; that._translator = params.translator; that._sliderGroup = params.renderer.g().attr({ "class": "slider" }).append(params.root); that._line = params.renderer.path(null, "line").append(that._sliderGroup); that._marker = new SliderMarker(params.renderer, that._sliderGroup, 1 === index); that._tracker = params.renderer.rect().attr({ "class": "slider-tracker", fill: "#000000", opacity: 1e-4 }).css({ cursor: "w-resize" }).append(params.trackersGroup) } Slider.prototype = { constructor: Slider, cancelAnimation: function() { this._sliderGroup.stopAnimation(); this._tracker.stopAnimation() }, applyPosition: function(isAnimated) { var that = this, slider = that._sliderGroup, tracker = that._tracker, attrs = { translateX: that._position }; that._marker.setPosition(that._position); if (isAnimated) { slider.animate(attrs, animationSettings); tracker.animate(attrs, animationSettings) } else { slider.attr(attrs); tracker.attr(attrs) } }, _setValid: function(isValid) { this._marker.setValid(isValid); this._line.attr({ stroke: this._colors[Number(isValid)] }) }, _setText: function(text) { this._marker.setText(text) }, update: function(verticalRange, sliderHandleOptions, sliderMarkerOptions) { var that = this; that._formatOptions = { format: sliderMarkerOptions.format, precision: sliderMarkerOptions.precision, customizeText: sliderMarkerOptions.customizeText }; that._marker.applyOptions(sliderMarkerOptions, that._translator.getScreenRange()); that._colors = [sliderMarkerOptions.invalidRangeColor, sliderHandleOptions.color]; that._sliderGroup.attr({ translateY: verticalRange[0] }); that._line.attr({ "stroke-width": sliderHandleOptions.width, stroke: sliderHandleOptions.color, "stroke-opacity": sliderHandleOptions.opacity, sharp: "h", points: [0, 0, 0, verticalRange[1] - verticalRange[0]] }); var trackerWidth = getSliderTrackerWidth(sliderHandleOptions.width); that._tracker.attr({ x: -trackerWidth / 2, y: 0, width: trackerWidth, height: verticalRange[1] - verticalRange[0], translateY: verticalRange[0] }) }, toForeground: function() { this._sliderGroup.toForeground() }, getSliderTracker: function() { return this._tracker }, getPosition: function() { return this._position }, setDisplayValue: function(value) { this._value = value; this._setText(formatValue(value, this._formatOptions)) }, setOverlapped: function(isOverlapped) { this._marker.setOverlapped(isOverlapped) }, getValue: function() { return this._value }, on: function(event, handler) { this._tracker.on(event, handler); this._marker.getTracker().on(event, handler) }, getCloudBorder: function() { return this._marker.getBorderPosition() }, dispose: function() { this._marker.dispose() } }; module.exports = Slider }, /*!************************************************!*\ !*** ./js/viz/range_selector/slider_marker.js ***! \************************************************/ function(module, exports, __webpack_require__) { var patchFontOptions = __webpack_require__( /*! ../core/utils */ 509).patchFontOptions, SLIDER_MARKER_UPDATE_DELAY = 75, POINTER_SIZE = __webpack_require__( /*! ./common */ 605).consts.pointerSize; function SliderMarker(renderer, root, isLeftPointer) { var that = this; that._isLeftPointer = isLeftPointer; that._isOverlapped = false; that._group = renderer.g().attr({ "class": "slider-marker" }).append(root); that._area = renderer.path(null, "area").append(that._group); that._label = renderer.text().attr({ align: "left" }).append(that._group); that._tracker = renderer.rect().attr({ "class": "slider-marker-tracker", fill: "#000000", opacity: 1e-4 }).css({ cursor: "pointer" }).append(that._group); that._border = renderer.rect(0, 0, 1, 0) } SliderMarker.prototype = { constructor: SliderMarker, _getRectSize: function(textSize) { return { width: Math.round(2 * this._paddingLeftRight + textSize.width), height: Math.round(2 * this._paddingTopBottom + textSize.height) } }, _getTextSize: function() { var textSize = this._label.getBBox(); if (!this._textHeight && isFinite(textSize.height)) { this._textHeight = textSize.height } return { width: textSize.width, height: this._textHeight, y: textSize.y } }, _getAreaPointsInfo: function(textSize) { var that = this, rectSize = that._getRectSize(textSize), rectWidth = rectSize.width, rectHeight = rectSize.height, rectLeftBorder = -rectWidth, rectRightBorder = 0, pointerRightPoint = POINTER_SIZE, pointerCenterPoint = 0, pointerLeftPoint = -POINTER_SIZE, position = that._position, isLeft = that._isLeftPointer, correctCloudBorders = function() { rectLeftBorder++; rectRightBorder++; pointerRightPoint++; pointerCenterPoint++; pointerLeftPoint++ }, checkPointerBorders = function() { if (pointerRightPoint > rectRightBorder) { pointerRightPoint = rectRightBorder } else { if (pointerLeftPoint < rectLeftBorder) { pointerLeftPoint = rectLeftBorder } } isLeft && correctCloudBorders() }, borderPosition = position; if (isLeft) { if (position > that._range[1] - rectWidth) { rectRightBorder = -position + that._range[1]; rectLeftBorder = rectRightBorder - rectWidth; checkPointerBorders(); borderPosition += rectLeftBorder } else { rectLeftBorder = pointerLeftPoint = 0; rectRightBorder = rectWidth } } else { if (position - that._range[0] < rectWidth) { rectLeftBorder = -(position - that._range[0]); rectRightBorder = rectLeftBorder + rectWidth; checkPointerBorders(); borderPosition += rectRightBorder } else { pointerRightPoint = 0; correctCloudBorders() } } that._borderPosition = borderPosition; return { offset: rectLeftBorder, isCut: (!isLeft || pointerCenterPoint !== pointerLeftPoint) && (isLeft || pointerCenterPoint !== pointerRightPoint), points: [rectLeftBorder, 0, rectRightBorder, 0, rectRightBorder, rectHeight, pointerRightPoint, rectHeight, pointerCenterPoint, rectHeight + POINTER_SIZE, pointerLeftPoint, rectHeight, rectLeftBorder, rectHeight] } }, _update: function() { var textSize, currentTextSize, rectSize, that = this; clearTimeout(that._timeout); that._label.attr({ text: that._text || "" }); currentTextSize = that._getTextSize(); rectSize = that._getRectSize(currentTextSize); textSize = that._textSize || currentTextSize; textSize = that._textSize = currentTextSize.width > textSize.width || currentTextSize.height > textSize.height ? currentTextSize : textSize; that._timeout = setTimeout(function() { updateSliderMarker(currentTextSize, rectSize); that._textSize = currentTextSize }, SLIDER_MARKER_UPDATE_DELAY); function updateSliderMarker(size, rectSize) { var points, pointsData, offset; rectSize = rectSize || that._getRectSize(size); that._group.attr({ translateY: -(rectSize.height + POINTER_SIZE) }); pointsData = that._getAreaPointsInfo(size); points = pointsData.points; offset = pointsData.offset; that._area.attr({ points: points }); that._border.attr({ x: that._isLeftPointer ? points[0] - 1 : points[2], height: pointsData.isCut ? rectSize.height : rectSize.height + POINTER_SIZE }); that._tracker.attr({ translateX: offset, width: rectSize.width, height: rectSize.height + POINTER_SIZE }); that._label.attr({ translateX: that._paddingLeftRight + offset, translateY: rectSize.height / 2 - (size.y + size.height / 2) }) } updateSliderMarker(textSize) }, setText: function(value) { this._text = value }, setPosition: function(position) { this._position = position; this._update() }, applyOptions: function(options, screenRange) { var that = this; that._range = screenRange; that._paddingLeftRight = options.paddingLeftRight; that._paddingTopBottom = options.paddingTopBottom; that._textHeight = null; that._colors = [options.invalidRangeColor, options.color]; that._area.attr({ fill: options.color }); that._border.attr({ fill: options.borderColor }); that._label.css(patchFontOptions(options.font)); that._update() }, getTracker: function() { return this._tracker }, setValid: function(isValid) { this._area.attr({ fill: this._colors[Number(isValid)] }) }, setColor: function(color) { this._area.attr({ fill: color }) }, dispose: function() { clearTimeout(this._timeout) }, setOverlapped: function(isOverlapped) { var that = this; if (that._isOverlapped !== isOverlapped) { if (isOverlapped) { that._border.append(that._group) } else { that._isOverlapped && that._border.remove() } that._isOverlapped = isOverlapped } }, getBorderPosition: function() { return this._borderPosition } }; module.exports = SliderMarker }, /*!******************************************!*\ !*** ./js/viz/range_selector/tracker.js ***! \******************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), pointerEvents = __webpack_require__( /*! ../../events/pointer */ 76), msPointerEnabled = __webpack_require__( /*! ../../core/utils/support */ 61).pointer, MIN_MANUAL_SELECTING_WIDTH = 10; function isLeftButtonPressed(event) { var e = event || window.event, originalEvent = e.originalEvent, touches = e.touches, pointerType = originalEvent ? originalEvent.pointerType : false, eventTouches = originalEvent ? originalEvent.touches : false, isMSPointerLeftClick = originalEvent && void 0 !== pointerType && (pointerType === (originalEvent.MSPOINTER_TYPE_TOUCH || "touch") || pointerType === (originalEvent.MSPOINTER_TYPE_MOUSE || "mouse") && 1 === originalEvent.buttons), isTouches = touches && touches.length > 0 || eventTouches && eventTouches.length > 0; return 1 === e.which || isMSPointerLeftClick || isTouches } function isMultiTouches(event) { var originalEvent = event.originalEvent, touches = event.touches, eventTouches = originalEvent && originalEvent.touches; return touches && touches.length > 1 || eventTouches && eventTouches.length > 1 || null } function preventDefault(e) { if (!isMultiTouches(e)) { e.preventDefault() } } function stopPropagationAndPreventDefault(e) { if (!isMultiTouches(e)) { e.stopPropagation(); e.preventDefault() } } function isTouchEventArgs(e) { return e && e.type && 0 === e.type.indexOf("touch") } function getEventPageX(event) { var originalEvent = event.originalEvent, result = 0; if (event.pageX) { result = event.pageX } else { if (originalEvent && originalEvent.pageX) { result = originalEvent.pageX } } if (originalEvent && originalEvent.touches) { if (originalEvent.touches.length > 0) { result = originalEvent.touches[0].pageX } else { if (originalEvent.changedTouches.length > 0) { result = originalEvent.changedTouches[0].pageX } } } return result } function initializeAreaEvents(controller, area, state, getRootOffsetLeft) { var isTouchEvent, initialPosition, isActive = false, movingHandler = null, docEvents = {}; docEvents[pointerEvents.move] = function(e) { var position, offset; if (isTouchEvent !== isTouchEventArgs(e)) { return } if (!isLeftButtonPressed(e)) { cancel() } if (isActive) { position = getEventPageX(e); offset = getRootOffsetLeft(); if (movingHandler) { movingHandler(position - offset) } else { if (state.manualRangeSelectionEnabled && Math.abs(initialPosition - position) >= MIN_MANUAL_SELECTING_WIDTH) { movingHandler = controller.placeSliderAndBeginMoving(initialPosition - offset, position - offset) } } } }; docEvents[pointerEvents.up] = function(e) { var position; if (isActive) { position = getEventPageX(e); if (!movingHandler && state.moveSelectedRangeByClick && Math.abs(initialPosition - position) < MIN_MANUAL_SELECTING_WIDTH) { controller.moveSelectedArea(position - getRootOffsetLeft()) } cancel() } }; function cancel() { if (isActive) { isActive = false; if (movingHandler) { movingHandler.complete(); movingHandler = null } } } area.on(pointerEvents.down, function(e) { if (!state.enabled || !isLeftButtonPressed(e) || isActive) { return } isActive = true; isTouchEvent = isTouchEventArgs(e); initialPosition = getEventPageX(e) }); return docEvents } function initializeSelectedAreaEvents(controller, area, state, getRootOffsetLeft) { var isTouchEvent, isActive = false, movingHandler = null, docEvents = {}; docEvents[pointerEvents.move] = function(e) { if (isTouchEvent !== isTouchEventArgs(e)) { return } if (!isLeftButtonPressed(e)) { cancel() } if (isActive) { preventDefault(e); movingHandler(getEventPageX(e) - getRootOffsetLeft()) } }; docEvents[pointerEvents.up] = cancel; function cancel() { if (isActive) { isActive = false; movingHandler.complete(); movingHandler = null } } area.on(pointerEvents.down, function(e) { if (!state.enabled || !isLeftButtonPressed(e) || isActive) { return } isActive = true; isTouchEvent = isTouchEventArgs(e); movingHandler = controller.beginSelectedAreaMoving(getEventPageX(e) - getRootOffsetLeft()); stopPropagationAndPreventDefault(e) }); return docEvents } function initializeSliderEvents(controller, sliders, state, getRootOffsetLeft) { var isTouchEvent, isActive = false, movingHandler = null, docEvents = {}; docEvents[pointerEvents.move] = function(e) { if (isTouchEvent !== isTouchEventArgs(e)) { return } if (!isLeftButtonPressed(e)) { cancel() } if (isActive) { preventDefault(e); movingHandler(getEventPageX(e) - getRootOffsetLeft()) } }; docEvents[pointerEvents.up] = cancel; $.each(sliders, function(i, slider) { var events = {}; events[pointerEvents.down] = function(e) { if (!state.enabled || !isLeftButtonPressed(e) || isActive) { return } isActive = true; isTouchEvent = isTouchEventArgs(e); movingHandler = controller.beginSliderMoving(i, getEventPageX(e) - getRootOffsetLeft()); stopPropagationAndPreventDefault(e) }; events[pointerEvents.move] = function() { if (!movingHandler) { controller.foregroundSlider(i) } }; slider.on(events) }); function cancel() { if (isActive) { isActive = false; movingHandler.complete(); movingHandler = null } } return docEvents } function Tracker(params) { var state = this._state = {}, targets = params.controller.getTrackerTargets(); if (msPointerEnabled) { params.renderer.root.css({ msTouchAction: "pinch-zoom" }) } this._docEvents = [initializeSelectedAreaEvents(params.controller, targets.selectedArea, state, getRootOffsetLeft), initializeAreaEvents(params.controller, targets.area, state, getRootOffsetLeft), initializeSliderEvents(params.controller, targets.sliders, state, getRootOffsetLeft)]; $.each(this._docEvents, function(_, events) { $(document).on(events) }); function getRootOffsetLeft() { return params.renderer.getRootOffset().left } } Tracker.prototype = { constructor: Tracker, dispose: function() { $.each(this._docEvents, function(_, events) { $(document).off(events) }) }, update: function(enabled, behavior) { var state = this._state; state.enabled = enabled; state.moveSelectedRangeByClick = behavior.moveSelectedRangeByClick; state.manualRangeSelectionEnabled = behavior.manualRangeSelectionEnabled } }; exports.Tracker = Tracker }, /*!*********************************************!*\ !*** ./js/viz/range_selector/range_view.js ***! \*********************************************/ function(module, exports) { function drawSeriesView(root, seriesDataSource, translator, canvas, isAnimationEnabled) { var series, i, valueAxis, seriesList = seriesDataSource.getSeries(), ii = seriesList.length; seriesDataSource.adjustSeriesDimensions(); if (!seriesList.length) { return } valueAxis = seriesList[0].getValueAxis(); valueAxis.setBusinessRange(seriesDataSource.getBoundRange().val); valueAxis.updateCanvas({ top: canvas.top, bottom: 0, height: canvas.height + canvas.top }); for (i = 0; i < ii; ++i) { series = seriesList[i]; series._extGroups.seriesGroup = series._extGroups.labelsGroup = root; series.draw(isAnimationEnabled) } } function merge(a, b) { return void 0 !== a ? a : b } function RangeView(params) { this._params = params; this._clipRect = params.renderer.clipRect(); params.root.attr({ "clip-path": this._clipRect.id }) } RangeView.prototype = { constructor: RangeView, update: function(backgroundOption, backgroundTheme, canvas, isCompactMode, isAnimationEnabled, seriesDataSource) { var seriesGroup, renderer = this._params.renderer, root = this._params.root, canvasWidth = canvas.width - canvas.left; backgroundOption = backgroundOption || {}; root.clear(); this._clipRect.attr({ x: canvas.left, y: canvas.top, width: canvasWidth, height: canvas.height }); if (!isCompactMode) { if (merge(backgroundOption.visible, backgroundTheme.visible)) { if (backgroundOption.color) { renderer.rect(canvas.left, canvas.top, canvasWidth + 1, canvas.height).attr({ fill: merge(backgroundOption.color, backgroundTheme.color), "class": "dx-range-selector-background" }).append(root) } if (backgroundOption.image && backgroundOption.image.url) { renderer.image(canvas.left, canvas.top, canvasWidth + 1, canvas.height, backgroundOption.image.url, merge(backgroundOption.image.location, backgroundTheme.image.location)).append(root) } } if (seriesDataSource && seriesDataSource.isShowChart()) { seriesGroup = renderer.g().attr({ "class": "dxrs-series-group" }).append(root); drawSeriesView(seriesGroup, seriesDataSource, this._params.translator, canvas, isAnimationEnabled) } } } }; exports.RangeView = RangeView }, /*!*****************************************************!*\ !*** ./js/viz/range_selector/series_data_source.js ***! \*****************************************************/ function(module, exports, __webpack_require__) { var SeriesDataSource, $ = __webpack_require__( /*! ../../core/renderer */ 9), seriesModule = __webpack_require__( /*! ../series/base_series */ 525), seriesFamilyModule = __webpack_require__( /*! ../core/series_family */ 580), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, vizUtils = __webpack_require__( /*! ../core/utils */ 509), rangeModule = __webpack_require__( /*! ../translators/range */ 564), dataValidatorModule = __webpack_require__( /*! ../components/data_validator */ 523), ChartThemeManager = __webpack_require__( /*! ../components/chart_theme_manager */ 549).ThemeManager; var createThemeManager = function(chartOptions) { return new ChartThemeManager(chartOptions, "rangeSelector.chart") }; var processSeriesFamilies = function(series, equalBarWidth, minBubbleSize, maxBubbleSize, barWidth, negativesAsZeroes) { var families = [], types = []; $.each(series, function(i, item) { if (inArray(item.type, types) === -1) { types.push(item.type) } }); $.each(types, function(_, type) { var family = new seriesFamilyModule.SeriesFamily({ type: type, equalBarWidth: equalBarWidth, minBubbleSize: minBubbleSize, maxBubbleSize: maxBubbleSize, barWidth: barWidth, negativesAsZeroes: negativesAsZeroes }); family.add(series); family.adjustSeriesValues(); families.push(family) }); return families }; var isStickType = function(type) { var nonStickTypes = ["bar", "candlestick", "stock", "bubble"], stickType = true; type = vizUtils.normalizeEnum(type); $.each(nonStickTypes, function(_, item) { if (type.indexOf(item) !== -1) { stickType = false; return false } }); return stickType }; function setTemplateFields(data, templateData, series) { $.each(data, function(_, data) { $.each(series.getTemplateFields(), function(_, field) { data[field.templateField] = data[field.originalField] }); templateData.push(data) }); series.updateTemplateFieldNames() } SeriesDataSource = function(options) { var templatedSeries, seriesTemplate, topIndent, bottomIndent, negativesAsZeroes, negativesAsZeros, that = this, themeManager = that._themeManager = createThemeManager(options.chart); themeManager._fontFields = ["commonSeriesSettings.label.font"]; themeManager.setTheme(options.chart.theme); topIndent = themeManager.getOptions("topIndent"); bottomIndent = themeManager.getOptions("bottomIndent"); that._indent = { top: topIndent >= 0 && topIndent < 1 ? topIndent : 0, bottom: bottomIndent >= 0 && bottomIndent < 1 ? bottomIndent : 0 }; that._valueAxis = themeManager.getOptions("valueAxisRangeSelector") || {}; that._hideChart = false; seriesTemplate = themeManager.getOptions("seriesTemplate"); if (options.dataSource && seriesTemplate) { templatedSeries = vizUtils.processSeriesTemplate(seriesTemplate, options.dataSource) } that._useAggregation = options.chart.useAggregation; that._series = that._calculateSeries(options, templatedSeries); negativesAsZeroes = themeManager.getOptions("negativesAsZeroes"); negativesAsZeros = themeManager.getOptions("negativesAsZeros"); that._seriesFamilies = processSeriesFamilies(that._series, themeManager.getOptions("equalBarWidth"), themeManager.getOptions("minBubbleSize"), themeManager.getOptions("maxBubbleSize"), themeManager.getOptions("barWidth"), commonUtils.isDefined(negativesAsZeroes) ? negativesAsZeroes : negativesAsZeros) }; SeriesDataSource.prototype = { constructor: SeriesDataSource, _calculateSeries: function(options, templatedSeries) { var particularSeriesOptions, seriesTheme, data, parsedData, dataSourceField, i, newSeries, groupsData, that = this, series = [], chartThemeManager = that._themeManager, hasSeriesTemplate = !!chartThemeManager.getOptions("seriesTemplate"), allSeriesOptions = hasSeriesTemplate ? templatedSeries : options.chart.series, seriesValueType = options.chart.valueAxis && options.chart.valueAxis.valueType; that.templateData = []; if (options.dataSource && !allSeriesOptions) { dataSourceField = options.dataSourceField || "arg"; allSeriesOptions = { argumentField: dataSourceField, valueField: dataSourceField }; that._hideChart = true } allSeriesOptions = Array.isArray(allSeriesOptions) ? allSeriesOptions : allSeriesOptions ? [allSeriesOptions] : []; for (i = 0; i < allSeriesOptions.length; i++) { particularSeriesOptions = extend(true, { incidentOccurred: options.incidentOccurred }, allSeriesOptions[i]); particularSeriesOptions.rotated = false; data = particularSeriesOptions.data || options.dataSource; seriesTheme = chartThemeManager.getOptions("series", particularSeriesOptions); seriesTheme.argumentField = seriesTheme.argumentField || options.dataSourceField; if (data && data.length > 0) { newSeries = new seriesModule.Series({ renderer: options.renderer, argumentAxis: options.argumentAxis, valueAxis: options.valueAxis }, seriesTheme); series.push(newSeries) } if (hasSeriesTemplate) { setTemplateFields(data, that.templateData, newSeries) } } data = hasSeriesTemplate ? that.templateData : data; if (series.length) { groupsData = { groups: [{ series: series, valueOptions: { valueType: dataSourceField ? options.valueType : seriesValueType } }], argumentOptions: { categories: options.categories, argumentType: options.valueType, type: options.axisType } }; parsedData = dataValidatorModule.validateData(data, groupsData, options.incidentOccurred, chartThemeManager.getOptions("dataPrepareSettings")); that.argCategories = groupsData.categories; for (i = 0; i < series.length; i++) { series[i].updateData(parsedData[series[i].getArgumentField()]) } } return series }, adjustSeriesDimensions: function() { if (this._useAggregation) { $.each(this._series, function(_, s) { s.resamplePoints(s.getArgumentAxis().getTranslator().canvasLength) }) } $.each(this._seriesFamilies, function(_, family) { family.adjustSeriesDimensions() }) }, getBoundRange: function() { var rangeData, rangeYSize, rangeVisibleSizeY, minIndent, maxIndent, that = this, valueAxisMin = that._valueAxis.min, valueAxisMax = that._valueAxis.max, valRange = new rangeModule.Range({ min: valueAxisMin, minVisible: valueAxisMin, max: valueAxisMax, maxVisible: valueAxisMax, axisType: that._valueAxis.type, base: that._valueAxis.logarithmBase }), argRange = new rangeModule.Range({}); $.each(that._series, function(_, series) { rangeData = series.getRangeData(); valRange.addRange(rangeData.val); argRange.addRange(rangeData.arg); if (!isStickType(series.type)) { argRange.addRange({ stick: false }) } }); if (valRange.isDefined() && argRange.isDefined()) { minIndent = that._valueAxis.inverted ? that._indent.top : that._indent.bottom; maxIndent = that._valueAxis.inverted ? that._indent.bottom : that._indent.top; rangeYSize = valRange.max - valRange.min; rangeVisibleSizeY = (commonUtils.isNumeric(valRange.maxVisible) ? valRange.maxVisible : valRange.max) - (commonUtils.isNumeric(valRange.minVisible) ? valRange.minVisible : valRange.min); if (commonUtils.isDate(valRange.min)) { valRange.min = new Date(valRange.min.valueOf() - rangeYSize * minIndent) } else { valRange.min -= rangeYSize * minIndent } if (commonUtils.isDate(valRange.max)) { valRange.max = new Date(valRange.max.valueOf() + rangeYSize * maxIndent) } else { valRange.max += rangeYSize * maxIndent } if (commonUtils.isNumeric(rangeVisibleSizeY)) { valRange.maxVisible = valRange.maxVisible ? valRange.maxVisible + rangeVisibleSizeY * maxIndent : void 0; valRange.minVisible = valRange.minVisible ? valRange.minVisible - rangeVisibleSizeY * minIndent : void 0 } valRange.invert = that._valueAxis.inverted } return { arg: argRange, val: valRange } }, getSeries: function() { return this._series }, isEmpty: function() { return 0 === this.getSeries().length }, isShowChart: function() { return !this._hideChart }, getCalculatedValueType: function() { var series = this._series[0]; return series && series.argumentType }, getThemeManager: function() { return this._themeManager } }; exports.SeriesDataSource = SeriesDataSource }, /*!************************************************!*\ !*** ./js/viz/range_selector/theme_manager.js ***! \************************************************/ function(module, exports, __webpack_require__) { var BaseThemeManager = __webpack_require__( /*! ../core/base_theme_manager */ 550).BaseThemeManager; exports.ThemeManager = BaseThemeManager.inherit({ _themeSection: "rangeSelector", _fontFields: ["scale.label.font", "sliderMarker.font", "loadingIndicator.font", "export.font", "title.font", "title.subtitle.font"] }) }, /*!******************************!*\ !*** ./js/viz/vector_map.js ***! \******************************/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__( /*! ./vector_map/vector_map */ 614) }, /*!*****************************************!*\ !*** ./js/viz/vector_map/vector_map.js ***! \*****************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, _parseScalar = __webpack_require__( /*! ../core/utils */ 509).parseScalar, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, projectionModule = __webpack_require__( /*! ./projection.main */ 615), controlBarModule = __webpack_require__( /*! ./control_bar */ 617), gestureHandlerModule = __webpack_require__( /*! ./gesture_handler */ 618), trackerModule = __webpack_require__( /*! ./tracker */ 619), themeManagerModule = __webpack_require__( /*! ./theme_manager */ 620), dataExchangerModule = __webpack_require__( /*! ./data_exchanger */ 621), legendModule = __webpack_require__( /*! ./legend */ 622), layoutModule = __webpack_require__( /*! ./layout */ 623), mapLayerModule = __webpack_require__( /*! ./map_layer */ 624), tooltipViewerModule = __webpack_require__( /*! ./tooltip_viewer */ 625), _noop = noop, _extend = extend, DEFAULT_WIDTH = 800, DEFAULT_HEIGHT = 400, nextDataKey = 1, RE_STARTS_LAYERS = /^layers/, RE_ENDS_DATA_SOURCE = /\.(dataSource|data)$/; __webpack_require__( /*! ./projection */ 626); function generateDataKey() { return "vectormap-data-" + nextDataKey++ } var dxVectorMap = __webpack_require__( /*! ../core/base_widget */ 515).inherit({ _eventsMap: { onClick: { name: "click" }, onCenterChanged: { name: "centerChanged" }, onZoomFactorChanged: { name: "zoomFactorChanged" }, onAreaClick: { name: "areaClick" }, onAreaHoverChanged: { name: "areaHoverChanged" }, onAreaSelectionChanged: { name: "areaSelectionChanged" }, onMarkerClick: { name: "markerClick" }, onMarkerHoverChanged: { name: "markerHoverChanged" }, onMarkerSelectionChanged: { name: "markerSelectionChanged" }, onHoverChanged: { name: "hoverChanged" }, onSelectionChanged: { name: "selectionChanged" } }, _setDeprecatedOptions: function() { this.callBase.apply(this, arguments); _extend(this._deprecatedOptions, { areaSettings: { since: "15.2", message: "Use the 'layers' option instead" }, markerSettings: { since: "15.2", message: "Use the 'layers' option instead" }, mapData: { since: "15.2", message: "Use the 'layers' option instead" }, markers: { since: "15.2", message: "Use the 'layers' option instead" }, onAreaClick: { since: "15.2", message: "Use the 'onClick' option instead" }, onMarkerClick: { since: "15.2", message: "Use the 'onClick' option instead" }, onAreaHoverChanged: { since: "15.2", message: "Use the 'onHoverChanged' option instead" }, onMarkerHoverChanged: { since: "15.2", message: "Use the 'onHoverChanged' option instead" }, onAreaSelectionChanged: { since: "15.2", message: "Use the 'onSelectionChanged' option instead" }, onMarkerSelectionChanged: { since: "15.2", message: "Use the 'onSelectionChanged' option instead" }, "layers.data": { since: "15.2", message: "Use the 'layers.dataSource' option instead" } }) }, _rootClassPrefix: "dxm", _rootClass: "dxm-vector-map", _createThemeManager: function() { return new themeManagerModule.ThemeManager }, _initLayerCollection: function(dataKey) { var that = this; that._layerCollection = new mapLayerModule.MapLayerCollection({ renderer: that._renderer, projection: that._projection, themeManager: that._themeManager, tracker: that._tracker, dataKey: dataKey, eventTrigger: that._eventTrigger, dataExchanger: that._dataExchanger, tooltip: that._tooltip, notifyDirty: that._notifyDirty, notifyReady: that._notifyReady }); if (void 0 === that._options.layers && (that._options.mapData || that._options.markers)) { applyDeprecatedMode(that) } else { suspendLayersData(that._layerCollection, that._options.layers) } }, _initLegendsControl: function() { var that = this; that._legendsControl = new legendModule.LegendsControl({ renderer: that._renderer, container: that._root, layoutControl: that._layoutControl, themeManager: that._themeManager, dataExchanger: that._dataExchanger, notifyDirty: that._notifyDirty, notifyReady: that._notifyReady }) }, _initControlBar: function(dataKey) { var that = this; that._controlBar = new controlBarModule.ControlBar({ renderer: that._renderer, container: that._root, layoutControl: that._layoutControl, projection: that._projection, tracker: that._tracker, dataKey: dataKey }) }, _initElements: function() { var that = this, dataKey = generateDataKey(), notifyCounter = 0; that._notifyDirty = function() { that._resetIsReady(); ++notifyCounter }; that._notifyReady = function() { if (0 === --notifyCounter) { that._drawn() } }; that._dataExchanger = new dataExchangerModule.DataExchanger; that._projection = new projectionModule.Projection({ centerChanged: function(value) { if (that._initialized) { that._eventTrigger("centerChanged", { center: value }) } }, zoomChanged: function(value) { if (that._initialized) { that._eventTrigger("zoomFactorChanged", { zoomFactor: value }) } } }); that._tracker = new trackerModule.Tracker({ root: that._root, projection: that._projection, dataKey: dataKey }); that._gestureHandler = new gestureHandlerModule.GestureHandler({ projection: that._projection, renderer: that._renderer, tracker: that._tracker }); that._layoutControl = new layoutModule.LayoutControl; that._layoutControl.suspend(); that._initLayerCollection(dataKey); that._initControlBar(dataKey); that._initLegendsControl(); that._tooltipViewer = new tooltipViewerModule.TooltipViewer({ tracker: that._tracker, tooltip: that._tooltip, layerCollection: that._layerCollection }) }, _init: function() { this.callBase.apply(this, arguments); this._afterInit(); this._layoutControl.resume() }, _initialChanges: ["PROJECTION", "BOUNDS", "MAX_ZOOM_FACTOR", "ZOOM_FACTOR", "CENTER"], _afterInit: function() { resumeLayersData(this._layerCollection, this._options.layers, this._renderer) }, _initCore: function() { this._root = this._renderer.root.attr({ align: "center", cursor: "default" }); this._initElements() }, _disposeCore: function() { var that = this; that._controlBar.dispose(); that._gestureHandler.dispose(); that._tracker.dispose(); that._legendsControl.dispose(); that._layerCollection.dispose(); that._layoutControl.dispose(); that._tooltipViewer.dispose(); that._dataExchanger.dispose(); that._projection.dispose(); that._dataExchanger = that._gestureHandler = that._projection = that._tracker = that._layoutControl = that._root = that._layerCollection = that._controlBar = that._legendsControl = null }, _setupInteraction: function() { var options = { centeringEnabled: !!_parseScalar(this._getOption("panningEnabled", true), true), zoomingEnabled: !!_parseScalar(this._getOption("zoomingEnabled", true), true) }; this._gestureHandler.setInteraction(options); this._controlBar.setInteraction(options) }, _getDefaultSize: function() { return { width: DEFAULT_WIDTH, height: DEFAULT_HEIGHT } }, _applySize: function(rect) { var layout = { left: rect[0], top: rect[1], width: rect[2] - rect[0], height: rect[3] - rect[1], right: 0, bottom: 0 }; this._projection.setSize(layout); this._layoutControl.setSize(layout); this._layerCollection.setRect([layout.left, layout.top, layout.width, layout.height]) }, _optionChanging: function(name, currentValue, nextValue) { if (currentValue && nextValue) { if (RE_STARTS_LAYERS.test(name)) { if (currentValue.dataSource && nextValue.dataSource && currentValue !== nextValue) { currentValue.dataSource = null } else { if (currentValue.data && nextValue.data && currentValue !== nextValue) { currentValue.data = null } else { if (RE_ENDS_DATA_SOURCE.test(name)) { this.option(name, null) } } } } if ("mapData" === name) { this._options.mapData = null } if ("markers" === name) { this._options.markers = null } } }, _applyChanges: function() { this._notifyDirty(); this.callBase.apply(this, arguments); this._notifyReady() }, _optionChangesMap: { background: "BACKGROUND", layers: "LAYERS", areaSettings: "LAYERS", markerSettings: "LAYERS", mapData: "LAYERS", markers: "LAYERS", controlBar: "CONTROL_BAR", legends: "LEGENDS", touchEnabled: "TRACKER", wheelEnabled: "TRACKER", panningEnabled: "INTERACTION", zoomingEnabled: "INTERACTION", projection: "PROJECTION", bounds: "BOUNDS", maxZoomFactor: "MAX_ZOOM_FACTOR", zoomFactor: "ZOOM_FACTOR", center: "CENTER" }, _optionChangesOrder: ["PROJECTION", "BOUNDS", "MAX_ZOOM_FACTOR", "ZOOM_FACTOR", "CENTER", "BACKGROUND", "LAYERS", "CONTROL_BAR", "LEGENDS", "TRACKER", "INTERACTION"], _change_PROJECTION: function() { this._setProjection() }, _change_BOUNDS: function() { this._setBounds() }, _change_MAX_ZOOM_FACTOR: function() { this._setMaxZoom() }, _change_ZOOM_FACTOR: function() { this._setZoom() }, _change_CENTER: function() { this._setCenter() }, _change_BACKGROUND: function() { this._setBackgroundOptions() }, _change_LAYERS: function() { this._setLayerCollectionOptions() }, _change_CONTROL_BAR: function() { this._setControlBarOptions() }, _change_LEGENDS: function() { this._setLegendsOptions() }, _change_TRACKER: function() { this._setTrackerOptions() }, _change_INTERACTION: function() { this._setupInteraction() }, _themeDependentChanges: ["BACKGROUND", "LAYERS", "CONTROL_BAR", "LEGENDS", "TRACKER", "INTERACTION"], _setProjection: function() { this._projection.setEngine(this.option("projection")) }, _setBounds: function() { this._projection.setBounds(this.option("bounds")) }, _setMaxZoom: function() { this._projection.setMaxZoom(this.option("maxZoomFactor")) }, _setZoom: function() { this._projection.setZoom(this.option("zoomFactor")) }, _setCenter: function() { this._projection.setCenter(this.option("center")) }, _setBackgroundOptions: function() { this._layerCollection.setBackgroundOptions(this._getOption("background")) }, _setLayerCollectionOptions: function() { this._layerCollection.setOptions(this.option("layers")) }, _setControlBarOptions: function() { this._controlBar.setOptions(this._getOption("controlBar")) }, _setLegendsOptions: function() { this._legendsControl.setOptions(this.option("legends")) }, _setTrackerOptions: function() { this._tracker.setOptions({ touchEnabled: this._getOption("touchEnabled", true), wheelEnabled: this._getOption("wheelEnabled", true) }) }, getLayers: function() { var i, layers = this._layerCollection.items(), list = [], ii = list.length = layers.length; for (i = 0; i < ii; ++i) { list[i] = layers[i].proxy } return list }, getLayerByIndex: function(index) { var layer = this._layerCollection.byIndex(index); return layer ? layer.proxy : null }, getLayerByName: function(name) { var layer = this._layerCollection.byName(name); return layer ? layer.proxy : null }, clearSelection: function(_noEvent) { var i, layers = this._layerCollection.items(), ii = layers.length; for (i = 0; i < ii; ++i) { layers[i].clearSelection(_noEvent) } return this }, getAreas: _noop, getMarkers: _noop, clearAreaSelection: _noop, clearMarkerSelection: _noop, center: function(value) { var that = this; if (void 0 === value) { return that._projection.getCenter() } else { that._projection.setCenter(value); return that } }, zoomFactor: function(value) { var that = this; if (void 0 === value) { return that._projection.getZoom() } else { that._projection.setZoom(value); return that } }, viewport: function(value) { var that = this; if (void 0 === value) { return that._projection.getViewport() } else { that._projection.setViewport(value); return that } }, convertCoordinates: function(coordinates) { coordinates = coordinates && coordinates.length ? coordinates : [arguments[0], arguments[1]]; return this._projection.fromScreenPoint(coordinates) } }); function suspendLayersData(layerCollection, options) { if (options) { layerCollection.__data = options.length ? $.map(options, patch) : patch(options) } function patch(ops) { var result = {}; swapData(ops || {}, result); return result } } function resumeLayersData(layerCollection, options, renderer) { var data = layerCollection.__data; if (data) { layerCollection.__data = void 0; if (data.length) { $.each(data, function(i, item) { swapData(item, options[i]) }) } else { swapData(data, options) } renderer.lock(); layerCollection.setOptions(options); renderer.unlock() } } function swapData(source, target) { var name = !("dataSource" in source) && "data" in source ? "data" : "dataSource"; target[name] = source[name]; source[name] = void 0 } function applyDeprecatedMode(map) { var log = __webpack_require__( /*! ../../core/errors */ 7).log, mapData = map._options.mapData, markers = map._options.markers; map._options.mapData = map._options.markers = void 0; map._afterInit = function() { this._options.mapData = mapData; this._options.markers = markers; this._renderer.lock(); this._setLayerCollectionOptions(); this._renderer.unlock(); mapData = markers = void 0 }; map._setLayerCollectionOptions = function() { var options = this._options, mapData = options.mapData, markers = options.markers; mapData = mapData && mapData.features ? _extend({}, mapData) : mapData; markers = markers && markers.features ? _extend({}, markers) : markers; this._layerCollection.setOptions([_extend({}, options.areaSettings, { name: "areas", _deprecated: true, dataSource: mapData, type: "area" }), _extend({}, options.markerSettings, { name: "markers", _deprecated: true, dataSource: markers, type: "marker", elementType: options.markerSettings && options.markerSettings.type })]) }; map.getAreas = function() { log("W0002", this.NAME, "getAreas", "15.2", "Use the 'getLayerByName('areas').getElements()' instead"); return this.getLayerByName("areas").getElements() }; map.getMarkers = function() { log("W0002", this.NAME, "getMarkers", "15.2", "Use the 'getLayerByName('markers').getElements()' instead"); return this.getLayerByName("markers").getElements() }; map.clearAreaSelection = function(_noEvent) { log("W0002", this.NAME, "clearAreaSelection", "15.2", "Use the 'getLayerByName('areas').clearSelection()' instead"); this.getLayerByName("areas").clearSelection(_noEvent); return this }; map.clearMarkerSelection = function(_noEvent) { log("W0002", this.NAME, "clearMarkerSelection", "15.2", "Use the 'getLayerByName('markers').clearSelection()' instead"); this.getLayerByName("markers").clearSelection(_noEvent); return this }; var clickMap = { areas: "areaClick", markers: "markerClick" }, hoverChangedMap = { areas: "areaHoverChanged", markers: "markerHoverChanged" }, selectionChangedMap = { areas: "areaSelectionChanged", markers: "markerSelectionChanged" }; map.on("click", function(e) { if (e.target) { this._eventTrigger(clickMap[e.target.layer.name], e) } }); map.on("hoverChanged", function(e) { if (e.target) { this._eventTrigger(hoverChangedMap[e.target.layer.name], e) } }); map.on("selectionChanged", function(e) { if (e.target) { this._eventTrigger(selectionChangedMap[e.target.layer.name], e) } }) } __webpack_require__( /*! ../../core/component_registrator */ 57)("dxVectorMap", dxVectorMap); module.exports = dxVectorMap; module.exports._TESTS_resetDataKey = function() { nextDataKey = 1 }; dxVectorMap.addPlugin(__webpack_require__( /*! ../core/export */ 511).plugin); dxVectorMap.addPlugin(__webpack_require__( /*! ../core/title */ 558).plugin); dxVectorMap.addPlugin(__webpack_require__( /*! ../core/tooltip */ 559).plugin); dxVectorMap.addPlugin(__webpack_require__( /*! ../core/loading_indicator */ 560).plugin) }, /*!**********************************************!*\ !*** ./js/viz/vector_map/projection.main.js ***! \**********************************************/ function(module, exports, __webpack_require__) { var extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, eventEmitterModule = __webpack_require__( /*! ./event_emitter */ 616); var _Number = Number, _min = Math.min, _max = Math.max, _abs = Math.abs, _round = Math.round, _ln = Math.log, _pow = Math.pow, TWO_TO_LN2 = 2 / Math.LN2, MIN_BOUNDS_RANGE = 1 / 3600 / 180 / 10, DEFAULT_MIN_ZOOM = 1, DEFAULT_MAX_ZOOM = 256, DEFAULT_CENTER = [NaN, NaN], DEFAULT_ENGINE_NAME = "mercator"; function floatsEqual(f1, f2) { return _abs(f1 - f2) < 1e-8 } function arraysEqual(a1, a2) { return floatsEqual(a1[0], a2[0]) && floatsEqual(a1[1], a2[1]) } function parseAndClamp(value, minValue, maxValue, defaultValue) { var val = _Number(value); return isFinite(val) ? _min(_max(val, minValue), maxValue) : defaultValue } function parseAndClampArray(value, minValue, maxValue, defaultValue) { return [parseAndClamp(value[0], minValue[0], maxValue[0], defaultValue[0]), parseAndClamp(value[1], minValue[1], maxValue[1], defaultValue[1])] } function getEngine(engine) { return engine instanceof Engine && engine || projection.get(engine) || projection.get(DEFAULT_ENGINE_NAME) } function Projection(parameters) { var that = this; that._initEvents(); that._params = parameters; that._engine = getEngine(); that._center = that._engine.center(); that._adjustCenter() } Projection.prototype = { constructor: Projection, _minZoom: DEFAULT_MIN_ZOOM, _maxZoom: DEFAULT_MAX_ZOOM, _zoom: DEFAULT_MIN_ZOOM, _center: DEFAULT_CENTER, _canvas: {}, _scale: [], dispose: function() { this._disposeEvents() }, setEngine: function(value) { var that = this, engine = getEngine(value); if (that._engine !== engine) { that._engine = engine; that._fire("engine"); if (that._changeCenter(engine.center())) { that._triggerCenterChanged() } if (that._changeZoom(that._minZoom)) { that._triggerZoomChanged() } that._adjustCenter(); that._setupScreen() } }, setBounds: function(bounds) { if (void 0 !== bounds) { this.setEngine(this._engine.original().bounds(bounds)) } }, _setupScreen: function() { var that = this, canvas = that._canvas, width = canvas.width, height = canvas.height, aspectRatio = that._engine.ar(); that._x0 = canvas.left + width / 2; that._y0 = canvas.top + height / 2; if (width / height <= aspectRatio) { that._xRadius = width / 2; that._yRadius = width / 2 / aspectRatio } else { that._xRadius = height / 2 * aspectRatio; that._yRadius = height / 2 } that._fire("screen") }, setSize: function(canvas) { var that = this; that._canvas = canvas; that._setupScreen() }, _toScreen: function(coordinates) { return [this._x0 + this._xRadius * coordinates[0], this._y0 + this._yRadius * coordinates[1]] }, _fromScreen: function(coordinates) { return [(coordinates[0] - this._x0) / this._xRadius, (coordinates[1] - this._y0) / this._yRadius] }, _toTransformed: function(coordinates) { return [coordinates[0] * this._zoom + this._xCenter, coordinates[1] * this._zoom + this._yCenter] }, _toTransformedFast: function(coordinates) { return [coordinates[0] * this._zoom, coordinates[1] * this._zoom] }, _fromTransformed: function(coordinates) { return [(coordinates[0] - this._xCenter) / this._zoom, (coordinates[1] - this._yCenter) / this._zoom] }, _adjustCenter: function() { var that = this, center = that._engine.project(that._center); that._xCenter = -center[0] * that._zoom || 0; that._yCenter = -center[1] * that._zoom || 0 }, project: function(coordinates) { return this._engine.project(coordinates) }, transform: function(coordinates) { return this._toScreen(this._toTransformedFast(coordinates)) }, isInvertible: function() { return this._engine.isInvertible() }, getSquareSize: function(size) { return [size[0] * this._zoom * this._xRadius, size[1] * this._zoom * this._yRadius] }, getZoom: function() { return this._zoom }, _changeZoom: function(value) { var that = this, oldZoom = that._zoom, newZoom = that._zoom = parseAndClamp(value, that._minZoom, that._maxZoom, that._minZoom), isChanged = !floatsEqual(oldZoom, newZoom); if (isChanged) { that._adjustCenter(); that._fire("zoom") } return isChanged }, setZoom: function(value) { if (this._engine.isInvertible() && this._changeZoom(value)) { this._triggerZoomChanged() } }, getScaledZoom: function() { return _round((this._scale.length - 1) * _ln(this._zoom) / _ln(this._maxZoom)) }, setScaledZoom: function(scaledZoom) { this.setZoom(this._scale[_round(scaledZoom)]) }, changeScaledZoom: function(deltaZoom) { this.setZoom(this._scale[_max(_min(_round(this.getScaledZoom() + deltaZoom), this._scale.length - 1), 0)]) }, getZoomScalePartition: function() { return this._scale.length - 1 }, _setupScaling: function() { var step, zoom, that = this, k = _round(TWO_TO_LN2 * _ln(that._maxZoom)), i = 1; k = k > 4 ? k : 4; step = _pow(that._maxZoom, 1 / k); zoom = that._minZoom; that._scale = [zoom]; for (; i <= k; ++i) { that._scale.push(zoom *= step) } }, setMaxZoom: function(maxZoom) { var that = this; that._minZoom = DEFAULT_MIN_ZOOM; that._maxZoom = parseAndClamp(maxZoom, that._minZoom, _Number.MAX_VALUE, DEFAULT_MAX_ZOOM); that._setupScaling(); if (that._zoom > that._maxZoom) { that.setZoom(that._maxZoom) } that._fire("max-zoom") }, getCenter: function() { return this._center.slice() }, setCenter: function(value) { if (this._engine.isInvertible() && this._changeCenter(value || [])) { this._triggerCenterChanged() } }, _changeCenter: function(value) { var that = this, engine = that._engine, oldCenter = that._center, newCenter = that._center = parseAndClampArray(value, engine.min(), engine.max(), engine.center()), isChanged = !arraysEqual(oldCenter, newCenter); if (isChanged) { that._adjustCenter(); that._fire("center") } return isChanged }, _triggerCenterChanged: function() { this._params.centerChanged(this.getCenter()) }, _triggerZoomChanged: function() { this._params.zoomChanged(this.getZoom()) }, setCenterByPoint: function(coordinates, screenPosition) { var that = this, p = that._engine.project(coordinates), q = that._fromScreen(screenPosition); that.setCenter(that._engine.unproject([-q[0] / that._zoom + p[0], -q[1] / that._zoom + p[1]])) }, beginMoveCenter: function() { if (this._engine.isInvertible()) { this._moveCenter = this._center } }, endMoveCenter: function() { var that = this; if (that._moveCenter) { if (!arraysEqual(that._moveCenter, that._center)) { that._triggerCenterChanged() } that._moveCenter = null } }, moveCenter: function(shift) { var current, center, that = this; if (that._moveCenter) { current = that._toScreen(that._toTransformed(that._engine.project(that._center))); center = that._engine.unproject(that._fromTransformed(that._fromScreen([current[0] + shift[0], current[1] + shift[1]]))); that._changeCenter(center) } }, getViewport: function() { var that = this, unproject = that._engine.unproject, lt = unproject(that._fromTransformed([-1, -1])), lb = unproject(that._fromTransformed([-1, 1])), rt = unproject(that._fromTransformed([1, -1])), rb = unproject(that._fromTransformed([1, 1])), minMax = findMinMax([selectFarthestPoint(lt[0], lb[0], rt[0], rb[0]), selectFarthestPoint(lt[1], rt[1], lb[1], rb[1])], [selectFarthestPoint(rt[0], rb[0], lt[0], lb[0]), selectFarthestPoint(lb[1], rb[1], lt[1], rt[1])]); return [].concat(minMax.min, minMax.max) }, setViewport: function(viewport) { var engine = this._engine, data = viewport ? getZoomAndCenterFromViewport(engine.project, engine.unproject, viewport) : [this._minZoom, engine.center()]; this.setZoom(data[0]); this.setCenter(data[1]) }, getTransform: function() { return { translateX: this._xCenter * this._xRadius, translateY: this._yCenter * this._yRadius } }, fromScreenPoint: function(coordinates) { return this._engine.unproject(this._fromTransformed(this._fromScreen(coordinates))) }, _eventNames: ["engine", "screen", "center", "zoom", "max-zoom"] }; eventEmitterModule.makeEventEmitter(Projection); function selectFarthestPoint(point1, point2, basePoint1, basePoint2) { var basePoint = (basePoint1 + basePoint2) / 2; return _abs(point1 - basePoint) > _abs(point2 - basePoint) ? point1 : point2 } function selectClosestPoint(point1, point2, basePoint1, basePoint2) { var basePoint = (basePoint1 + basePoint2) / 2; return _abs(point1 - basePoint) < _abs(point2 - basePoint) ? point1 : point2 } function getZoomAndCenterFromViewport(project, unproject, viewport) { var lt = project([viewport[0], viewport[3]]), lb = project([viewport[0], viewport[1]]), rt = project([viewport[2], viewport[3]]), rb = project([viewport[2], viewport[1]]), l = selectClosestPoint(lt[0], lb[0], rt[0], rb[0]), r = selectClosestPoint(rt[0], rb[0], lt[0], lb[0]), t = selectClosestPoint(lt[1], rt[1], lb[1], rb[1]), b = selectClosestPoint(lb[1], rb[1], lt[1], rt[1]); return [2 / _max(_abs(l - r), _abs(t - b)), unproject([(l + r) / 2, (t + b) / 2])] } function setMinMax(engine, p1, p2) { var minMax = findMinMax(p1, p2); engine.min = returnArray(minMax.min); engine.max = returnArray(minMax.max) } function Engine(parameters) { var that = this, project = createProjectMethod(parameters.to), unproject = parameters.from ? createUnprojectMethod(parameters.from) : returnValue(DEFAULT_CENTER); that.project = project; that.unproject = unproject; that.original = returnValue(that); that.source = function() { return extend({}, parameters) }; that.isInvertible = returnValue(!!parameters.from); that.ar = returnValue(parameters.aspectRatio > 0 ? _Number(parameters.aspectRatio) : 1); that.center = returnArray(unproject([0, 0])); setMinMax(that, [unproject([-1, 0])[0], unproject([0, 1])[1]], [unproject([1, 0])[0], unproject([0, -1])[1]]) } Engine.prototype.aspectRatio = function(aspectRatio) { var engine = new Engine(extend(this.source(), { aspectRatio: aspectRatio })); engine.original = this.original; engine.min = this.min; engine.max = this.max; return engine }; Engine.prototype.bounds = function(bounds) { bounds = bounds || []; var engine, parameters = this.source(), min = this.min(), max = this.max(), b1 = parseAndClampArray([bounds[0], bounds[1]], min, max, min), b2 = parseAndClampArray([bounds[2], bounds[3]], min, max, max), p1 = parameters.to(b1), p2 = parameters.to(b2), delta = _min(_abs(p2[0] - p1[0]) > MIN_BOUNDS_RANGE ? _abs(p2[0] - p1[0]) : 2, _abs(p2[1] - p1[1]) > MIN_BOUNDS_RANGE ? _abs(p2[1] - p1[1]) : 2); if (delta < 2) { extend(parameters, createProjectUnprojectMethods(parameters.to, parameters.from, p1, p2, delta)) } engine = new Engine(parameters); engine.original = this.original; setMinMax(engine, b1, b2); return engine }; function isEngine(engine) { return engine instanceof Engine } function invertVerticalAxis(pair) { return [pair[0], -pair[1]] } function createProjectMethod(method) { return function(arg) { return invertVerticalAxis(method(arg)) } } function createUnprojectMethod(method) { return function(arg) { return method(invertVerticalAxis(arg)) } } function returnValue(value) { return function() { return value } } function returnArray(value) { return function() { return value.slice() } } function projection(parameters) { return parameters && parameters.to ? new Engine(parameters) : null } function findMinMax(p1, p2) { return { min: [_min(p1[0], p2[0]), _min(p1[1], p2[1])], max: [_max(p1[0], p2[0]), _max(p1[1], p2[1])] } } var projectionsCache = {}; projection.get = function(name) { return projectionsCache[name] || null }; projection.add = function(name, engine) { if (!projectionsCache[name] && isEngine(engine)) { projectionsCache[name] = engine } return projection }; function createProjectUnprojectMethods(project, unproject, p1, p2, delta) { var x0 = (p1[0] + p2[0]) / 2 - delta / 2, y0 = (p1[1] + p2[1]) / 2 - delta / 2, k = 2 / delta; return { to: function(coordinates) { var p = project(coordinates); return [-1 + (p[0] - x0) * k, -1 + (p[1] - y0) * k] }, from: function(coordinates) { var p = [x0 + (coordinates[0] + 1) / k, y0 + (coordinates[1] + 1) / k]; return unproject(p) } } } exports.Projection = Projection; exports.projection = projection; exports._TESTS_Engine = Engine }, /*!********************************************!*\ !*** ./js/viz/vector_map/event_emitter.js ***! \********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9); var eventEmitterMethods = { _initEvents: function() { var i, names = this._eventNames, ii = names.length, events = this._events = {}; for (i = 0; i < ii; ++i) { events[names[i]] = $.Callbacks() } }, _disposeEvents: function() { var name, events = this._events; for (name in events) { events[name].empty() } this._events = null }, on: function(handlers) { var name, events = this._events; for (name in handlers) { events[name].add(handlers[name]) } return dispose; function dispose() { for (name in handlers) { events[name].remove(handlers[name]) } } }, _fire: function(name, arg) { this._events[name].fire(arg) } }; exports.makeEventEmitter = function(target) { var name, proto = target.prototype; for (name in eventEmitterMethods) { proto[name] = eventEmitterMethods[name] } }; exports._TESTS_eventEmitterMethods = eventEmitterMethods }, /*!******************************************!*\ !*** ./js/viz/vector_map/control_bar.js ***! \******************************************/ function(module, exports, __webpack_require__) { var _math = Math, _min = _math.min, _max = _math.max, _round = _math.round, _floor = _math.floor, _sqrt = _math.sqrt, vizUtils = __webpack_require__( /*! ../core/utils */ 509), _parseScalar = vizUtils.parseScalar, parseHorizontalAlignment = vizUtils.enumParser(["left", "center", "right"]), parseVerticalAlignment = vizUtils.enumParser(["top", "bottom"]), COMMAND_RESET = "command-reset", COMMAND_MOVE_UP = "command-move-up", COMMAND_MOVE_RIGHT = "command-move-right", COMMAND_MOVE_DOWN = "command-move-down", COMMAND_MOVE_LEFT = "command-move-left", COMMAND_ZOOM_IN = "command-zoom-in", COMMAND_ZOOM_OUT = "command-zoom-out", COMMAND_ZOOM_DRAG_LINE = "command-zoom-drag-line", COMMAND_ZOOM_DRAG = "command-zoom-drag", EVENT_TARGET_TYPE = "control-bar", FLAG_CENTERING = 1, FLAG_ZOOMING = 2, SIZE_OPTIONS = { bigCircleSize: 58, smallCircleSize: 28, buttonSize: 10, arrowButtonOffset: 20, incDecButtonSize: 11, incButtonOffset: 66, decButtonOffset: 227, sliderLineStartOffset: 88.5, sliderLineEndOffset: 205.5, sliderLength: 20, sliderWidth: 8, trackerGap: 4 }, OFFSET_X = 30.5, OFFSET_Y = 30.5, TOTAL_WIDTH = 61, TOTAL_HEIGHT = 274, COMMAND_TO_TYPE_MAP = {}; COMMAND_TO_TYPE_MAP[COMMAND_RESET] = ResetCommand; COMMAND_TO_TYPE_MAP[COMMAND_MOVE_UP] = COMMAND_TO_TYPE_MAP[COMMAND_MOVE_RIGHT] = COMMAND_TO_TYPE_MAP[COMMAND_MOVE_DOWN] = COMMAND_TO_TYPE_MAP[COMMAND_MOVE_LEFT] = MoveCommand; COMMAND_TO_TYPE_MAP[COMMAND_ZOOM_IN] = COMMAND_TO_TYPE_MAP[COMMAND_ZOOM_OUT] = ZoomCommand; COMMAND_TO_TYPE_MAP[COMMAND_ZOOM_DRAG] = ZoomDragCommand; function ControlBar(parameters) { var that = this; that._params = parameters; that._createElements(parameters.renderer, parameters.container, parameters.dataKey); parameters.layoutControl.addItem(that); that._subscribeToProjection(parameters.projection); that._subscribeToTracker(parameters.tracker); that._createCallbacks(parameters.projection) } ControlBar.prototype = { constructor: ControlBar, _flags: 0, dispose: function() { var that = this; that._params.layoutControl.removeItem(that); that._root.linkRemove().linkOff(); that._offProjection(); that._offTracker(); that._params = that._root = that._offProjection = that._offTracker = that._callbacks = null }, _subscribeToProjection: function(projection) { var that = this; that._offProjection = projection.on({ engine: function() { that._update() }, zoom: updateZoom, "max-zoom": function() { that._zoomPartition = projection.getZoomScalePartition(); that._sliderUnitLength = that._sliderLineLength / that._zoomPartition; updateZoom() } }); function updateZoom() { that._adjustZoom(projection.getScaledZoom()) } }, _subscribeToTracker: function(tracker) { var that = this, isActive = false; that._offTracker = tracker.on({ start: function(arg) { isActive = arg.data.name === EVENT_TARGET_TYPE; if (isActive) { that._processStart(arg.data.index, arg) } }, move: function(arg) { if (isActive) { that._processMove(arg.data.index, arg) } }, end: function() { if (isActive) { that._processEnd(); isActive = false } } }) }, _createCallbacks: function(projection) { var that = this; that._callbacks = { reset: function(isCenter, isZoom) { if (isCenter) { projection.setCenter(null) } if (isZoom) { projection.setZoom(null) } }, beginMove: function() { projection.beginMoveCenter() }, endMove: function() { projection.endMoveCenter() }, move: function(shift) { projection.moveCenter(shift) }, zoom: function(zoom) { projection.setScaledZoom(zoom) } } }, _createElements: function(renderer, container, dataKey) { var buttonsGroups, trackersGroup, that = this; that._root = renderer.g().attr({ "class": "dxm-control-bar" }).linkOn(container, "control-bar"); buttonsGroups = that._buttonsGroup = renderer.g().attr({ "class": "dxm-control-buttons" }).append(that._root); trackersGroup = renderer.g().attr({ stroke: "none", "stroke-width": 0, fill: "#000000", opacity: 1e-4 }).css({ cursor: "pointer" }).append(that._root); that._createButtons(renderer, dataKey, buttonsGroups); that._createTrackers(renderer, dataKey, trackersGroup) }, _createButtons: function(renderer, dataKey, group) { var that = this, options = SIZE_OPTIONS, size = options.buttonSize / 2, offset1 = options.arrowButtonOffset - size, offset2 = options.arrowButtonOffset, incDecButtonSize = options.incDecButtonSize / 2, directionOptions = { "stroke-linecap": "square", fill: "none" }, line = "line"; renderer.circle(0, 0, options.bigCircleSize / 2).append(group); renderer.circle(0, 0, size).attr({ fill: "none" }).append(group); renderer.path([-size, -offset1, 0, -offset2, size, -offset1], line).attr(directionOptions).append(group); renderer.path([offset1, -size, offset2, 0, offset1, size], line).attr(directionOptions).append(group); renderer.path([size, offset1, 0, offset2, -size, offset1], line).attr(directionOptions).append(group); renderer.path([-offset1, size, -offset2, 0, -offset1, -size], line).attr(directionOptions).append(group); renderer.circle(0, options.incButtonOffset, options.smallCircleSize / 2).append(group); renderer.path([ [-incDecButtonSize, options.incButtonOffset, incDecButtonSize, options.incButtonOffset], [0, options.incButtonOffset - incDecButtonSize, 0, options.incButtonOffset + incDecButtonSize] ], "area").append(group); renderer.circle(0, options.decButtonOffset, options.smallCircleSize / 2).append(group); renderer.path([-incDecButtonSize, options.decButtonOffset, incDecButtonSize, options.decButtonOffset], "area").append(group); that._zoomLine = renderer.path([], "line").append(group); that._zoomDrag = renderer.rect(_floor(-options.sliderLength / 2), _floor(options.sliderLineEndOffset - options.sliderWidth / 2), options.sliderLength, options.sliderWidth).append(group); that._sliderLineLength = options.sliderLineEndOffset - options.sliderLineStartOffset }, _createTrackers: function(renderer, dataKey, group) { var options = SIZE_OPTIONS, size = _round((options.arrowButtonOffset - options.trackerGap) / 2), offset1 = options.arrowButtonOffset - size, offset2 = _round(_sqrt(options.bigCircleSize * options.bigCircleSize / 4 - size * size)), size2 = offset2 - offset1; renderer.rect(-size, -size, 2 * size, 2 * size).data(dataKey, { index: COMMAND_RESET, name: EVENT_TARGET_TYPE }).append(group); renderer.rect(-size, -offset2, 2 * size, size2).data(dataKey, { index: COMMAND_MOVE_UP, name: EVENT_TARGET_TYPE }).append(group); renderer.rect(offset1, -size, size2, 2 * size).data(dataKey, { index: COMMAND_MOVE_RIGHT, name: EVENT_TARGET_TYPE }).append(group); renderer.rect(-size, offset1, 2 * size, size2).data(dataKey, { index: COMMAND_MOVE_DOWN, name: EVENT_TARGET_TYPE }).append(group); renderer.rect(-offset2, -size, size2, 2 * size).data(dataKey, { index: COMMAND_MOVE_LEFT, name: EVENT_TARGET_TYPE }).append(group); renderer.circle(0, options.incButtonOffset, options.smallCircleSize / 2).data(dataKey, { index: COMMAND_ZOOM_IN, name: EVENT_TARGET_TYPE }).append(group); renderer.circle(0, options.decButtonOffset, options.smallCircleSize / 2).data(dataKey, { index: COMMAND_ZOOM_OUT, name: EVENT_TARGET_TYPE }).append(group); renderer.rect(-2, options.sliderLineStartOffset - 2, 4, options.sliderLineEndOffset - options.sliderLineStartOffset + 4).css({ cursor: "default" }).data(dataKey, { index: COMMAND_ZOOM_DRAG_LINE, name: EVENT_TARGET_TYPE }).append(group); this._zoomDragTracker = renderer.rect(-options.sliderLength / 2, options.sliderLineEndOffset - options.sliderWidth / 2, options.sliderLength, options.sliderWidth).data(dataKey, { index: COMMAND_ZOOM_DRAG, name: EVENT_TARGET_TYPE }).append(group) }, resize: function(size) { if (this._isActive) { this._root.attr({ visibility: null !== size ? null : "hidden" }) } }, getLayoutOptions: function() { return this._isActive ? this._layoutOptions : null }, locate: function(x, y) { this._root.attr({ translateX: x + this._margin + OFFSET_X, translateY: y + this._margin + OFFSET_Y }) }, _update: function() { var that = this; that._isActive = that._isEnabled && that._flags && that._params.projection.isInvertible(); if (that._isActive) { that._root.linkAppend() } else { that._root.linkRemove() } that._processEnd(); that.updateLayout() }, setInteraction: function(interaction) { var that = this; if (_parseScalar(interaction.centeringEnabled, true)) { that._flags |= FLAG_CENTERING } else { that._flags &= ~FLAG_CENTERING } if (_parseScalar(interaction.zoomingEnabled, true)) { that._flags |= FLAG_ZOOMING } else { that._flags &= ~FLAG_ZOOMING } that._update() }, setOptions: function(options) { var that = this; that._isEnabled = !!_parseScalar(options.enabled, true); that._margin = options.margin || 0; that._layoutOptions = { width: 2 * that._margin + TOTAL_WIDTH, height: 2 * that._margin + TOTAL_HEIGHT, horizontalAlignment: parseHorizontalAlignment(options.horizontalAlignment, "left"), verticalAlignment: parseVerticalAlignment(options.verticalAlignment, "top") }; that._buttonsGroup.attr({ "stroke-width": options.borderWidth, stroke: options.borderColor, fill: options.color, "fill-opacity": options.opacity }); that._update() }, _adjustZoom: function(zoom) { var transform, y, that = this, start = SIZE_OPTIONS.sliderLineStartOffset, end = SIZE_OPTIONS.sliderLineEndOffset, h = SIZE_OPTIONS.sliderWidth; that._zoomFactor = _max(_min(_round(zoom), that._zoomPartition), 0); transform = { translateY: -_round(that._zoomFactor * that._sliderUnitLength) }; y = end - h / 2 + transform.translateY; that._zoomLine.attr({ points: [ [0, start, 0, _max(start, y)], [0, _min(end, y + h), 0, end] ] }); that._zoomDrag.attr(transform); that._zoomDragTracker.attr(transform) }, _applyZoom: function() { this._callbacks.zoom(this._zoomFactor) }, _processStart: function(command, arg) { var commandType; if (this._isActive) { commandType = COMMAND_TO_TYPE_MAP[command]; this._command = commandType && commandType.flags & this._flags ? new commandType(this, command, arg) : null } }, _processMove: function(command, arg) { this._command && this._command.update(command, arg) }, _processEnd: function() { this._command && this._command.finish(); this._command = null } }; function disposeCommand(command) { delete command._owner; command.update = function() {}; command.finish = function() {} } function ResetCommand(owner, command) { this._owner = owner; this._command = command } ResetCommand.flags = FLAG_CENTERING | FLAG_ZOOMING; ResetCommand.prototype.update = function(command) { command !== this._command && disposeCommand(this) }; ResetCommand.prototype.finish = function() { var flags = this._owner._flags; this._owner._callbacks.reset(!!(flags & FLAG_CENTERING), !!(flags & FLAG_ZOOMING)); disposeCommand(this) }; function MoveCommand(owner, command, arg) { this._command = command; var timeout = null, interval = 100, dx = 0, dy = 0; switch (this._command) { case COMMAND_MOVE_UP: dy = -10; break; case COMMAND_MOVE_RIGHT: dx = 10; break; case COMMAND_MOVE_DOWN: dy = 10; break; case COMMAND_MOVE_LEFT: dx = -10 } function callback() { owner._callbacks.move([dx, dy]); timeout = setTimeout(callback, interval) } this._stop = function() { clearTimeout(timeout); owner._callbacks.endMove(); this._stop = owner = null; return this }; arg = null; owner._callbacks.beginMove(); callback() } MoveCommand.flags = FLAG_CENTERING; MoveCommand.prototype.update = function(command) { this._command !== command && this.finish() }; MoveCommand.prototype.finish = function() { disposeCommand(this._stop()) }; function ZoomCommand(owner, command) { this._owner = owner; this._command = command; var timeout = null, interval = 150, dZoom = this._command === COMMAND_ZOOM_IN ? 1 : -1; function callback() { owner._adjustZoom(owner._zoomFactor + dZoom); timeout = setTimeout(callback, interval) } this._stop = function() { clearTimeout(timeout); this._stop = owner = null; return this }; callback() } ZoomCommand.flags = FLAG_ZOOMING; ZoomCommand.prototype.update = function(command) { this._command !== command && this.finish() }; ZoomCommand.prototype.finish = function() { this._owner._applyZoom(); disposeCommand(this._stop()) }; function ZoomDragCommand(owner, command, arg) { this._owner = owner; this._zoomFactor = owner._zoomFactor; this._pos = arg.y } ZoomDragCommand.flags = FLAG_ZOOMING; ZoomDragCommand.prototype.update = function(command, arg) { var owner = this._owner; owner._adjustZoom(this._zoomFactor + owner._zoomPartition * (this._pos - arg.y) / owner._sliderLineLength) }; ZoomDragCommand.prototype.finish = function() { this._owner._applyZoom(); disposeCommand(this) }; exports.ControlBar = ControlBar; var COMMAND_TO_TYPE_MAP__ORIGINAL = COMMAND_TO_TYPE_MAP; exports._TESTS_stubCommandToTypeMap = function(map) { COMMAND_TO_TYPE_MAP = map }; exports._TESTS_restoreCommandToTypeMap = function() { COMMAND_TO_TYPE_MAP = COMMAND_TO_TYPE_MAP__ORIGINAL } }, /*!**********************************************!*\ !*** ./js/viz/vector_map/gesture_handler.js ***! \**********************************************/ function(module, exports) { var _ln = Math.log, _LN2 = Math.LN2; function GestureHandler(params) { var that = this; that._projection = params.projection; that._renderer = params.renderer; that._x = that._y = 0; that._subscribeToTracker(params.tracker) } GestureHandler.prototype = { constructor: GestureHandler, dispose: function() { this._offTracker(); this._offTracker = null }, _subscribeToTracker: function(tracker) { var that = this, isActive = false; that._offTracker = tracker.on({ start: function(arg) { isActive = "control-bar" !== arg.data.name; if (isActive) { that._processStart(arg) } }, move: function(arg) { if (isActive) { that._processMove(arg) } }, end: function() { if (isActive) { that._processEnd() } }, zoom: function(arg) { that._processZoom(arg) } }) }, setInteraction: function(options) { this._processEnd(); this._centeringEnabled = options.centeringEnabled; this._zoomingEnabled = options.zoomingEnabled }, _processStart: function(arg) { if (this._centeringEnabled) { this._x = arg.x; this._y = arg.y; this._projection.beginMoveCenter() } }, _processMove: function(arg) { var that = this; if (that._centeringEnabled) { that._renderer.root.attr({ cursor: "move" }); that._projection.moveCenter([that._x - arg.x, that._y - arg.y]); that._x = arg.x; that._y = arg.y } }, _processEnd: function() { if (this._centeringEnabled) { this._renderer.root.attr({ cursor: "default" }); this._projection.endMoveCenter() } }, _processZoom: function(arg) { var delta, screenPosition, coords, that = this; if (that._zoomingEnabled) { if (arg.delta) { delta = arg.delta } else { if (arg.ratio) { delta = _ln(arg.ratio) / _LN2 } } if (that._centeringEnabled) { screenPosition = that._renderer.getRootOffset(); screenPosition = [arg.x - screenPosition.left, arg.y - screenPosition.top]; coords = that._projection.fromScreenPoint(screenPosition) } that._projection.changeScaledZoom(delta); if (that._centeringEnabled) { that._projection.setCenterByPoint(coords, screenPosition) } } } }; exports.GestureHandler = GestureHandler }, /*!**************************************!*\ !*** ./js/viz/vector_map/tracker.js ***! \**************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), _math = Math, _abs = _math.abs, _sqrt = _math.sqrt, _round = _math.round, eventEmitterModule = __webpack_require__( /*! ./event_emitter */ 616), eventUtils = __webpack_require__( /*! ../../events/utils */ 71), wheelEventName = __webpack_require__( /*! ../../events/core/wheel */ 85).name, _addNamespace = eventUtils.addNamespace, _parseScalar = __webpack_require__( /*! ../core/utils */ 509).parseScalar, _now = $.now, _NAME = "dxVectorMap", EVENTS = {}; setupEvents(); var EVENT_START = "start", EVENT_MOVE = "move", EVENT_END = "end", EVENT_ZOOM = "zoom", EVENT_HOVER_ON = "hover-on", EVENT_HOVER_OFF = "hover-off", EVENT_CLICK = "click", EVENT_FOCUS_ON = "focus-on", EVENT_FOCUS_MOVE = "focus-move", EVENT_FOCUS_OFF = "focus-off", CLICK_TIME_THRESHOLD = 500, CLICK_COORD_THRESHOLD_MOUSE = 5, CLICK_COORD_THRESHOLD_TOUCH = 20, DRAG_COORD_THRESHOLD_MOUSE = 5, DRAG_COORD_THRESHOLD_TOUCH = 10, FOCUS_ON_DELAY_MOUSE = 300, FOCUS_OFF_DELAY_MOUSE = 300, FOCUS_ON_DELAY_TOUCH = 300, FOCUS_OFF_DELAY_TOUCH = 400, FOCUS_COORD_THRESHOLD_MOUSE = 5, WHEEL_COOLDOWN = 50, WHEEL_DIRECTION_COOLDOWN = 300; function Tracker(parameters) { var that = this; that._root = parameters.root; that._createEventHandlers(parameters.dataKey); that._createProjectionHandlers(parameters.projection); that._initEvents(); that._focus = new Focus(function(name, arg) { that._fire(name, arg) }); that._attachHandlers() } Tracker.prototype = { constructor: Tracker, dispose: function() { var that = this; that._detachHandlers(); that._disposeEvents(); that._focus.dispose(); that._root = that._focus = that._docHandlers = that._rootHandlers = null }, _eventNames: [EVENT_START, EVENT_MOVE, EVENT_END, EVENT_ZOOM, EVENT_CLICK, EVENT_HOVER_ON, EVENT_HOVER_OFF, EVENT_FOCUS_ON, EVENT_FOCUS_OFF, EVENT_FOCUS_MOVE], _startClick: function(event, data) { if (!data) { return } var coords = getEventCoords(event); this._clickState = { x: coords.x, y: coords.y, threshold: isTouchEvent(event) ? CLICK_COORD_THRESHOLD_TOUCH : CLICK_COORD_THRESHOLD_MOUSE, time: _now() } }, _endClick: function(event, data) { var threshold, coords, state = this._clickState; if (!state) { return } if (data && _now() - state.time <= CLICK_TIME_THRESHOLD) { threshold = state.threshold; coords = getEventCoords(event); if (_abs(coords.x - state.x) <= threshold && _abs(coords.y - state.y) <= threshold) { this._fire(EVENT_CLICK, { data: data, x: coords.x, y: coords.y, $event: event }) } } this._clickState = null }, _startDrag: function(event, data) { if (!data) { return } var coords = getEventCoords(event), state = this._dragState = { x: coords.x, y: coords.y, data: data }; this._fire(EVENT_START, { x: state.x, y: state.y, data: state.data }) }, _moveDrag: function(event, data) { var coords, threshold, state = this._dragState; if (!state) { return } coords = getEventCoords(event); threshold = isTouchEvent(event) ? DRAG_COORD_THRESHOLD_TOUCH : DRAG_COORD_THRESHOLD_MOUSE; if (state.active || _abs(coords.x - state.x) > threshold || _abs(coords.y - state.y) > threshold) { state.x = coords.x; state.y = coords.y; state.active = true; state.data = data || {}; this._fire(EVENT_MOVE, { x: state.x, y: state.y, data: state.data }) } }, _endDrag: function() { var state = this._dragState; if (!state) { return } this._dragState = null; this._fire(EVENT_END, { x: state.x, y: state.y, data: state.data }) }, _wheelZoom: function(event, data) { if (!data) { return } var delta, coords, that = this, lock = that._wheelLock, time = _now(); if (time - lock.time <= WHEEL_COOLDOWN) { return } if (time - lock.dirTime > WHEEL_DIRECTION_COOLDOWN) { lock.dir = 0 } delta = adjustWheelDelta(event.delta / 120 || 0, lock); if (0 === delta) { return } coords = getEventCoords(event); that._fire(EVENT_ZOOM, { delta: delta, x: coords.x, y: coords.y }); lock.time = lock.dirTime = time }, _startZoom: function(event, data) { if (!isTouchEvent(event) || !data) { return } var coords, pointer2, state = this._zoomState = this._zoomState || {}; if (state.pointer1 && state.pointer2) { return } if (void 0 === state.pointer1) { state.pointer1 = getPointerId(event) || 0; coords = getMultitouchEventCoords(event, state.pointer1); state.x1 = state.x1_0 = coords.x; state.y1 = state.y1_0 = coords.y } if (void 0 === state.pointer2) { pointer2 = getPointerId(event) || 1; if (pointer2 !== state.pointer1) { coords = getMultitouchEventCoords(event, pointer2); if (coords) { state.x2 = state.x2_0 = coords.x; state.y2 = state.y2_0 = coords.y; state.pointer2 = pointer2; state.ready = true; this._endDrag() } } } }, _moveZoom: function(event) { var coords, state = this._zoomState; if (!state || !isTouchEvent(event)) { return } if (void 0 !== state.pointer1) { coords = getMultitouchEventCoords(event, state.pointer1); if (coords) { state.x1 = coords.x; state.y1 = coords.y } } if (void 0 !== state.pointer2) { coords = getMultitouchEventCoords(event, state.pointer2); if (coords) { state.x2 = coords.x; state.y2 = coords.y } } }, _endZoom: function(event) { var startDistance, currentDistance, state = this._zoomState; if (!state || !isTouchEvent(event)) { return } if (state.ready) { startDistance = getDistance(state.x1_0, state.y1_0, state.x2_0, state.y2_0); currentDistance = getDistance(state.x1, state.y1, state.x2, state.y2); this._fire(EVENT_ZOOM, { ratio: currentDistance / startDistance, x: (state.x1_0 + state.x2_0) / 2, y: (state.y1_0 + state.y2_0) / 2 }) } this._zoomState = null }, _startHover: function(event, data) { this._doHover(event, data, true) }, _moveHover: function(event, data) { this._doHover(event, data, false) }, _doHover: function(event, data, isTouch) { var that = this; if (that._dragState && that._dragState.active || that._zoomState && that._zoomState.ready) { that._cancelHover(); return } if (isTouchEvent(event) !== isTouch || that._hoverTarget === event.target || that._hoverState && that._hoverState.data === data) { return } that._cancelHover(); if (data) { that._hoverState = { data: data }; that._fire(EVENT_HOVER_ON, { data: data }) } that._hoverTarget = event.target }, _cancelHover: function() { var state = this._hoverState; this._hoverState = this._hoverTarget = null; if (state) { this._fire(EVENT_HOVER_OFF, { data: state.data }) } }, _startFocus: function(event, data) { this._doFocus(event, data, true) }, _moveFocus: function(event, data) { this._doFocus(event, data, false) }, _doFocus: function(event, data, isTouch) { var that = this; if (that._dragState && that._dragState.active || that._zoomState && that._zoomState.ready) { that._cancelFocus(); return } if (isTouchEvent(event) !== isTouch) { return } that._focus.turnOff(isTouch ? FOCUS_OFF_DELAY_TOUCH : FOCUS_OFF_DELAY_MOUSE); data && that._focus.turnOn(data, getEventCoords(event), isTouch ? FOCUS_ON_DELAY_TOUCH : FOCUS_ON_DELAY_MOUSE, isTouch) }, _endFocus: function(event) { if (!isTouchEvent(event)) { return } this._focus.cancelOn() }, _cancelFocus: function() { this._focus.cancel() }, _createEventHandlers: function(DATA_KEY) { var that = this; that._docHandlers = {}; that._rootHandlers = {}; that._rootHandlers[EVENTS.start] = that._docHandlers[EVENTS.start] = function(event) { var isTouch = isTouchEvent(event), data = getData(event); if (isTouch && !that._isTouchEnabled) { return } if (data) { event.preventDefault(); event.stopPropagation() } that._startClick(event, data); that._startDrag(event, data); that._startZoom(event, data); that._startHover(event, data); that._startFocus(event, data) }; that._docHandlers[EVENTS.move] = function(event) { var isTouch = isTouchEvent(event), data = getData(event); if (isTouch && !that._isTouchEnabled) { return } that._moveDrag(event, data); that._moveZoom(event, data); that._moveHover(event, data); that._moveFocus(event, data) }; that._docHandlers[EVENTS.end] = function(event) { var isTouch = isTouchEvent(event), data = getData(event); if (isTouch && !that._isTouchEnabled) { return } that._endClick(event, data); that._endDrag(event, data); that._endZoom(event, data); that._endFocus(event, data) }; that._rootHandlers[EVENTS.wheel] = function(event) { that._cancelFocus(); if (!that._isWheelEnabled) { return } var data = getData(event); if (data) { event.preventDefault(); event.stopPropagation(); that._wheelZoom(event, data) } }; that._wheelLock = { dir: 0 }; function getData(event) { var target = event.target; return ("tspan" === target.tagName ? target.parentNode : target)[DATA_KEY] } }, _createProjectionHandlers: function(projection) { var that = this; projection.on({ center: handler, zoom: handler }); function handler() { that._cancelFocus() } }, reset: function() { var that = this; that._clickState = null; that._endDrag(); that._cancelHover(); that._cancelFocus() }, setOptions: function(options) { var that = this; that.reset(); that._detachHandlers(); that._isTouchEnabled = !!_parseScalar(options.touchEnabled, true); that._isWheelEnabled = !!_parseScalar(options.wheelEnabled, true); that._attachHandlers() }, _detachHandlers: function() { var that = this; if (that._isTouchEnabled) { that._root.css({ "touch-action": "", "-ms-touch-action": "", "-webkit-user-select": "" }).off(_addNamespace("MSHoldVisual", _NAME)).off(_addNamespace("contextmenu", _NAME)) } $(document).off(that._docHandlers); that._root.off(that._rootHandlers) }, _attachHandlers: function() { var that = this; if (that._isTouchEnabled) { that._root.css({ "touch-action": "none", "-ms-touch-action": "none", "-webkit-user-select": "none" }).on(_addNamespace("MSHoldVisual", _NAME), function(event) { event.preventDefault() }).on(_addNamespace("contextmenu", _NAME), function(event) { isTouchEvent(event) && event.preventDefault() }) } $(document).on(that._docHandlers); that._root.on(that._rootHandlers) } }; var Focus = function(fire) { var _x, _y, that = this, _activeData = null, _data = null, _disabled = false, _onTimer = null, _offTimer = null; that.dispose = function() { clearTimeout(_onTimer); clearTimeout(_offTimer); that.turnOn = that.turnOff = that.cancel = that.cancelOn = that.dispose = that = fire = _activeData = _data = _onTimer = _offTimer = null }; that.turnOn = function(data, coords, timeout, forceTimeout) { if (data === _data && _disabled) { return } _disabled = false; _data = data; if (_activeData) { _x = coords.x; _y = coords.y; clearTimeout(_onTimer); _onTimer = setTimeout(function() { _onTimer = null; if (_data === _activeData) { fire(EVENT_FOCUS_MOVE, { data: _data, x: _x, y: _y }); onCheck(true) } else { fire(EVENT_FOCUS_ON, { data: _data, x: _x, y: _y, done: onCheck }) } }, forceTimeout ? timeout : 0) } else { if (!_onTimer || _abs(coords.x - _x) > FOCUS_COORD_THRESHOLD_MOUSE || _abs(coords.y - _y) > FOCUS_COORD_THRESHOLD_MOUSE || forceTimeout) { _x = coords.x; _y = coords.y; clearTimeout(_onTimer); _onTimer = setTimeout(function() { _onTimer = null; fire(EVENT_FOCUS_ON, { data: _data, x: _x, y: _y, done: onCheck }) }, timeout) } } function onCheck(result) { _disabled = !result; if (result) { _activeData = _data; clearTimeout(_offTimer); _offTimer = null } } }; that.turnOff = function(timeout) { clearTimeout(_onTimer); _onTimer = null; _data = null; if (_activeData && !_disabled) { _offTimer = _offTimer || setTimeout(function() { _offTimer = null; fire(EVENT_FOCUS_OFF, { data: _activeData }); _activeData = null }, timeout) } }; that.cancel = function() { clearTimeout(_onTimer); clearTimeout(_offTimer); if (_activeData) { fire(EVENT_FOCUS_OFF, { data: _activeData }) } _activeData = _data = _onTimer = _offTimer = null }; that.cancelOn = function() { clearTimeout(_onTimer); _onTimer = null } }; eventEmitterModule.makeEventEmitter(Tracker); exports.Tracker = Tracker; var originFocus = Focus; exports._DEBUG_forceEventMode = function(mode) { setupEvents(mode) }; exports.Focus = Focus; exports._DEBUG_stubFocusType = function(focusType) { Focus = focusType }; exports._DEBUG_restoreFocusType = function() { Focus = originFocus }; function getDistance(x1, y1, x2, y2) { return _sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)) } function isTouchEvent(event) { var type = event.originalEvent.type, pointerType = event.originalEvent.pointerType; return /^touch/.test(type) || /^MSPointer/.test(type) && 4 !== pointerType || /^pointer/.test(type) && "mouse" !== pointerType } function selectItem(flags, items) { var item, i = 0, ii = flags.length; for (; i < ii; ++i) { if (flags[i]) { item = items[i]; break } } return _addNamespace(item || items[i], _NAME) } function setupEvents() { var flags = [navigator.pointerEnabled, navigator.msPointerEnabled, "ontouchstart" in window]; if (arguments.length) { flags = ["pointer" === arguments[0], "MSPointer" === arguments[0], "touch" === arguments[0]] } EVENTS = { start: selectItem(flags, ["pointerdown", "MSPointerDown", "touchstart mousedown", "mousedown"]), move: selectItem(flags, ["pointermove", "MSPointerMove", "touchmove mousemove", "mousemove"]), end: selectItem(flags, ["pointerup", "MSPointerUp", "touchend mouseup", "mouseup"]), wheel: _addNamespace(wheelEventName, _NAME) } } function getEventCoords(event) { var originalEvent = event.originalEvent, touch = originalEvent.touches && originalEvent.touches[0] || {}; return { x: touch.pageX || originalEvent.pageX || event.pageX, y: touch.pageY || originalEvent.pageY || event.pageY } } function getPointerId(event) { return event.originalEvent.pointerId } function getMultitouchEventCoords(event, pointerId) { var originalEvent = event.originalEvent; if (void 0 !== originalEvent.pointerId) { originalEvent = originalEvent.pointerId === pointerId ? originalEvent : null } else { originalEvent = originalEvent.touches[pointerId] } return originalEvent ? { x: originalEvent.pageX || event.pageX, y: originalEvent.pageY || event.pageY } : null } function adjustWheelDelta(delta, lock) { if (0 === delta) { return 0 } var _delta = _abs(delta), sign = _round(delta / _delta); if (lock.dir && sign !== lock.dir) { return 0 } lock.dir = sign; if (_delta < .1) { _delta = 0 } else { if (_delta < 1) { _delta = 1 } else { if (_delta > 4) { _delta = 4 } else { _delta = _round(_delta) } } } return sign * _delta } }, /*!********************************************!*\ !*** ./js/viz/vector_map/theme_manager.js ***! \********************************************/ function(module, exports, __webpack_require__) { var BaseThemeManager = __webpack_require__( /*! ../core/base_theme_manager */ 550).BaseThemeManager; exports.ThemeManager = BaseThemeManager.inherit({ _themeSection: "map", _fontFields: ["layer:area.label.font", "layer:marker:dot.label.font", "layer:marker:bubble.label.font", "layer:marker:pie.label.font", "layer:marker:image.label.font", "tooltip.font", "legend.font", "title.font", "title.subtitle.font", "loadingIndicator.font", "export.font"] }) }, /*!*********************************************!*\ !*** ./js/viz/vector_map/data_exchanger.js ***! \*********************************************/ function(module, exports, __webpack_require__) { var _Callbacks = __webpack_require__( /*! ../../core/renderer */ 9).Callbacks; function DataExchanger() { this._store = {} } DataExchanger.prototype = { constructor: DataExchanger, dispose: function() { this._store = null; return this }, _get: function(category, name) { var store = this._store[category] || (this._store[category] = {}); return store[name] || (store[name] = { callbacks: _Callbacks() }) }, set: function(category, name, data) { var item = this._get(category, name); item.data = data; item.callbacks.fire(data); return this }, bind: function(category, name, callback) { var item = this._get(category, name); item.callbacks.add(callback); item.data && callback(item.data); return this }, unbind: function(category, name, callback) { var item = this._get(category, name); item.callbacks.remove(callback); return this } }; exports.DataExchanger = DataExchanger }, /*!*************************************!*\ !*** ./js/viz/vector_map/legend.js ***! \*************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, _extend = extend, _each = $.each, legendModule = __webpack_require__( /*! ../components/legend */ 521), _BaseLegend = legendModule.Legend; var sourceMap = { areacolorgroups: { category: "areas", name: "color" }, markercolorgroups: { category: "markers", name: "color" }, markersizegroups: { category: "markers", name: "size" } }; var unknownSource = { category: "UNKNOWN", name: "UNKNOWN" }; function parseSource(source) { var result; if ("string" === typeof source) { result = sourceMap[source.toLowerCase()] || unknownSource } else { result = { category: source.layer, name: source.grouping } } return result } function buildData(partition, values, field) { var i, item, ii = values.length, list = []; for (i = 0; i < ii; ++i) { list[i] = item = { start: partition[i], end: partition[i + 1], index: i }; item[field] = values[i]; item.states = { normal: { fill: item.color } } } return list } var Legend = function(parameters) { var that = this; that._params = parameters; that._root = parameters.renderer.g().attr({ "class": "dxm-legend" }).linkOn(parameters.container, { name: "legend", after: "legend-base" }).linkAppend(); parameters.layoutControl.addItem(that); _BaseLegend.call(that, { renderer: parameters.renderer, group: that._root, backgroundClass: null, itemsGroupClass: null, textField: "text", getFormatObject: function(data) { return data } }); that._onDataChanged = function(data) { that._updateData(data) } }; Legend.prototype = _extend(__webpack_require__( /*! ../../core/utils/object */ 27).clone(_BaseLegend.prototype), { constructor: Legend, dispose: function() { var that = this; that._params.layoutControl.removeItem(that); that._unbindData(); that._root.linkRemove().linkOff(); that._params = that._root = that._onDataChanged = null; return _BaseLegend.prototype.dispose.apply(that, arguments) }, resize: function(size) { this._params.notifyDirty(); if (null === size) { this.erase() } else { this.draw(size.width, size.height) } this._params.notifyReady() }, locate: _BaseLegend.prototype.shift, _updateData: function(data) { this.update(data ? buildData(data.partition, data.values, this._dataName) : [], this._options); this.updateLayout() }, _unbindData: function() { if (this._dataCategory) { this._params.dataExchanger.unbind(this._dataCategory, this._dataName, this._onDataChanged) } }, _bindData: function(arg) { this._params.dataExchanger.bind(this._dataCategory = arg.category, this._dataName = arg.name, this._onDataChanged) }, setOptions: function(options) { var that = this; that.update(that._data, options); that._unbindData(); that._bindData(options.source && parseSource(options.source) || unknownSource); that.updateLayout(); return that } }); function LegendsControl(parameters) { this._params = parameters; this._items = []; parameters.container.virtualLink("legend-base") } LegendsControl.prototype = { constructor: LegendsControl, dispose: function() { _each(this._items, function(_, item) { item.dispose() }); this._params = this._items = null }, setOptions: function(options) { var i, optionList = options && options.length ? options : [], items = this._items, ii = optionList.length, params = this._params, theme = params.themeManager.theme("legend"); for (i = items.length; i < ii; ++i) { items[i] = new Legend(params) } for (i = items.length - 1; i >= ii; --i) { items[i].dispose(); items.splice(i, 1) } params.layoutControl.suspend(); for (i = 0; i < ii; ++i) { items[i].setOptions(_extend(true, {}, theme, optionList[i])) } params.layoutControl.resume() } }; exports.LegendsControl = LegendsControl; var originalLegend = Legend; exports._TESTS_Legend = Legend; exports._TESTS_stubLegendType = function(stub) { Legend = stub }; exports._TESTS_restoreLegendType = function() { Legend = originalLegend } }, /*!*************************************!*\ !*** ./js/viz/vector_map/layout.js ***! \*************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, _round = Math.round, _min = Math.min, _max = Math.max, _each = $.each, _inArray = inArray, horizontalAlignmentMap = { left: 0, center: 1, right: 2 }, verticalAlignmentMap = { top: 0, bottom: 1 }; function getCellIndex(options) { return 3 * verticalAlignmentMap[options.verticalAlignment] + horizontalAlignmentMap[options.horizontalAlignment] } function createCells(canvas, items) { var hStep = (canvas.right - canvas.left) / 3, vStep = (canvas.bottom - canvas.top) / 2, h1 = canvas.left, h2 = _round(h1 + hStep), h3 = _round(h1 + hStep + hStep), h4 = canvas.right, v1 = canvas.top, v2 = _round(v1 + vStep), v3 = canvas.bottom, cells = [{ rect: [h1, v1, h2, v2] }, { rect: [h2, v1, h3, v2], center: true }, { rect: [h3, v1, h4, v2], horInversion: true }, { rect: [h1, v2, h2, v3], verInversion: true }, { rect: [h2, v2, h3, v3], center: true, verInversion: true }, { rect: [h3, v2, h4, v3], horInversion: true, verInversion: true }], itemsList = [ [], [], [], [], [], [] ]; _each(items, function(_, item) { var options = item.getLayoutOptions(); if (options) { itemsList[getCellIndex(options)].push({ item: item, width: options.width, height: options.height }) } }); _each(cells, function(i, cell) { if (itemsList[i].length) { cell.items = itemsList[i] } else { if (cell.center) { cell.rect[0] = cell.rect[2] = (cell.rect[0] + cell.rect[2]) / 2 } else { cell.rect[cell.horInversion ? 0 : 2] = cell.rect[cell.horInversion ? 2 : 0] } cell.rect[cell.verInversion ? 1 : 3] = cell.rect[cell.verInversion ? 3 : 1] } }); return cells } function adjustCellSizes(cells) { _each([0, 1, 2, 3, 4, 5], function(_, index) { var cell = cells[index], otherCell = cells[(index + 3) % 6]; if (cell.items) { if (!otherCell.items) { cell.rect[1] = _min(cell.rect[1], otherCell.rect[3]); cell.rect[3] = _max(cell.rect[3], otherCell.rect[1]) } } }); _each([1, 4], function(_, index) { var size1, size2, cell = cells[index], otherCell1 = cells[index - 1], otherCell2 = cells[index + 1]; if (cell.items) { if (!otherCell1.items && !otherCell2.items) { size1 = cell.rect[0] - otherCell1.rect[2]; size2 = otherCell2.rect[0] - cell.rect[2]; if (size1 > size2) { if (size1 / size2 >= 2) { cell.rect[0] -= size1; cell.right = true } else { cell.rect[0] -= size2; cell.rect[2] += size2 } } else { if (size2 / size1 >= 2) { cell.rect[2] += size2; cell.center = null } else { cell.rect[0] -= size1; cell.rect[2] += size1 } } } } else { if (otherCell1.items) { otherCell1.rect[2] = (cell.rect[0] + cell.rect[2]) / 2 } if (otherCell2.items) { otherCell2.rect[0] = (cell.rect[0] + cell.rect[2]) / 2 } } }) } function adjustCellsAndApplyLayout(cells, forceMode) { var hasHiddenItems = false; adjustCellSizes(cells); _each(cells, function(_, cell) { if (cell.items) { hasHiddenItems = applyCellLayout(cell, forceMode) || hasHiddenItems } }); return hasHiddenItems } function applyCellLayout(cell, forceMode) { var cellRect = cell.rect, cellWidth = cellRect[2] - cellRect[0], cellHeight = cellRect[3] - cellRect[1], xOffset = 0, yOffset = 0, currentHeight = 0, totalL = cellRect[2], totalT = cellRect[3], totalR = cellRect[0], totalB = cellRect[1], moves = [], hasHiddenItems = false; _each(cell.items, function(_, item) { if (item.width > cellWidth || item.height > cellHeight) { moves.push(null); hasHiddenItems = true; return forceMode || false } if (xOffset + item.width > cellWidth) { yOffset += currentHeight; xOffset = currentHeight = 0 } if (yOffset + item.height > cellHeight) { moves.push(null); hasHiddenItems = true; return forceMode || false } currentHeight = _max(currentHeight, item.height); var dx = cell.horInversion ? cellRect[2] - item.width - xOffset : cellRect[0] + xOffset, dy = cell.verInversion ? cellRect[3] - item.height - yOffset : cellRect[1] + yOffset; xOffset += item.width; totalL = _min(totalL, dx); totalT = _min(totalT, dy); totalR = _max(totalR, dx + item.width); totalB = _max(totalB, dy + item.height); moves.push([dx, dy]) }); if (forceMode || !hasHiddenItems) { xOffset = 0; if (cell.right) { xOffset = cellRect[2] - cellRect[0] - totalR + totalL } else { if (cell.center) { xOffset = _round((cellRect[2] - cellRect[0] - totalR + totalL) / 2) } } _each(cell.items, function(i, item) { var move = moves[i]; if (move) { item.item.locate(move[0] + xOffset, move[1]) } else { item.item.resize(null) } }); cell.rect = [totalL, totalT, totalR, totalB]; cell.items = null } return hasHiddenItems } function applyLayout(canvas, items) { var cells = createCells(canvas, items); if (adjustCellsAndApplyLayout(cells)) { adjustCellsAndApplyLayout(cells, true) } } function LayoutControl() { var that = this; that._items = []; that._suspended = 0; that._updateLayout = function() { that._update() } } LayoutControl.prototype = { constructor: LayoutControl, dispose: function() { this._items = this._updateLayout = null }, setSize: function(canvas) { this._canvas = canvas; this._update() }, suspend: function() { ++this._suspended }, resume: function() { if (0 === --this._suspended) { this._update() } }, addItem: function(item) { this._items.push(item); item.updateLayout = this._updateLayout }, removeItem: function(item) { this._items.splice(_inArray(item, this._items), 1); item.updateLayout = null }, _update: function() { var canvas; if (0 === this._suspended) { canvas = this._canvas; _each(this._items, function(_, item) { item.resize(canvas) }); applyLayout({ left: canvas.left, top: canvas.top, right: canvas.width + canvas.left, bottom: canvas.height + canvas.top }, this._items) } } }; exports.LayoutControl = LayoutControl }, /*!****************************************!*\ !*** ./js/viz/vector_map/map_layer.js ***! \****************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, _Number = Number, _String = String, _abs = Math.abs, _round = Math.round, _min = Math.min, _max = Math.max, _sqrt = Math.sqrt, _utils = __webpack_require__( /*! ../../core/utils/common */ 14), DataHelperMixin = __webpack_require__( /*! ../../data_helper */ 152), _isFunction = _utils.isFunction, _isArray = Array.isArray, vizUtils = __webpack_require__( /*! ../core/utils */ 509), _parseScalar = vizUtils.parseScalar, _patchFontOptions = vizUtils.patchFontOptions, _normalizeEnum = vizUtils.normalizeEnum, _noop = noop, _extend = extend, _each = $.each, _concat = Array.prototype.concat, TYPE_AREA = "area", TYPE_LINE = "line", TYPE_MARKER = "marker", STATE_DEFAULT = 0, STATE_HOVERED = 1, STATE_SELECTED = 2, STATE_TO_INDEX = [0, 1, 2, 2], TOLERANCE = 1, SELECTIONS = { none: null, single: -1, multiple: NaN }; function getSelection(selectionMode) { var selection = _normalizeEnum(selectionMode); selection = selection in SELECTIONS ? SELECTIONS[selection] : SELECTIONS.single; if (null !== selection) { selection = { state: {}, single: selection } } return selection } function EmptySource() {} EmptySource.prototype.count = function() { return 0 }; function ArraySource(raw) { this.raw = raw } ArraySource.prototype = { constructor: ArraySource, count: function() { return this.raw.length }, item: function(index) { return this.raw[index] }, geometry: function(item) { return { coordinates: item.coordinates } }, attributes: function(item) { return item.attributes } }; function GeoJsonSource(raw) { this.raw = raw } GeoJsonSource.prototype = { constructor: GeoJsonSource, count: function() { return this.raw.features.length }, item: function(index) { return this.raw.features[index] }, geometry: function(item) { return item.geometry }, attributes: function(item) { return item.properties } }; function isGeoJsonObject(obj) { return _isArray(obj.features) } function unwrapFromDataSource(source) { var sourceType; if (source) { if (isGeoJsonObject(source)) { sourceType = GeoJsonSource } else { if (1 === source.length && source[0] && isGeoJsonObject(source[0])) { sourceType = GeoJsonSource; source = source[0] } else { if (_isArray(source)) { sourceType = ArraySource } } } } sourceType = sourceType || EmptySource; return new sourceType(source) } function wrapToDataSource(option) { return option ? isGeoJsonObject(option) ? [option] : option : [] } function customizeHandles(proxies, callback, widget) { callback.call(widget, proxies) } function customizeHandles_deprecated(proxies, callback) { var i, proxy, settings, ii = proxies.length; for (i = 0; i < ii; ++i) { proxy = proxies[i]; settings = callback.call(proxy, proxy) || {}; proxy.applySettings(settings); if (settings.isSelected) { proxy.selected(true) } } } function patchProxies(handles, name, data) { var i, dataItem, type = { areas: "area", markers: "marker" }[name], ii = handles.length; for (i = 0; i < ii; ++i) { handles[i].proxy.type = type } if ("marker" === type) { for (i = 0; i < ii; ++i) { dataItem = data.item(i); _extend(handles[i].proxy, { text: dataItem.text, value: dataItem.value, values: dataItem.values, url: dataItem.url }) } } } function setAreaLabelVisibility(label) { label.text.attr({ visibility: label.size[0] / label.spaceSize[0] < TOLERANCE && label.size[1] / label.spaceSize[1] < TOLERANCE ? null : "hidden" }) } function setLineLabelVisibility(label) { label.text.attr({ visibility: label.size[0] / label.spaceSize[0] < TOLERANCE || label.size[1] / label.spaceSize[1] < TOLERANCE ? null : "hidden" }) } function getDataValue(proxy, dataField, deprecatedField) { return proxy.attribute(dataField) || proxy[deprecatedField] } var TYPE_TO_TYPE_MAP = { Point: TYPE_MARKER, MultiPoint: TYPE_LINE, LineString: TYPE_LINE, MultiLineString: TYPE_LINE, Polygon: TYPE_AREA, MultiPolygon: TYPE_AREA }; function pick(a, b) { return void 0 !== a ? a : b } function guessTypeByData(sample) { var type = TYPE_TO_TYPE_MAP[sample.type], coordinates = sample.coordinates; if (!type) { if ("number" === typeof coordinates[0]) { type = TYPE_MARKER } else { if ("number" === typeof coordinates[0][0]) { type = TYPE_LINE } else { type = TYPE_AREA } } } return type } var selectStrategy = function(options, data) { var sample, type = _normalizeEnum(options.type), elementType = _normalizeEnum(options.elementType), strategy = _extend({}, emptyStrategy); if (data.count() > 0) { sample = data.geometry(data.item(0)); type = strategiesByType[type] ? type : guessTypeByData(sample); _extend(strategy, strategiesByType[type]); strategy.fullType = strategy.type = type; if (strategiesByGeometry[type]) { _extend(strategy, strategiesByGeometry[type](sample)) } if (strategiesByElementType[type]) { elementType = strategiesByElementType[type][elementType] ? elementType : strategiesByElementType[type]._default; _extend(strategy, strategiesByElementType[type][elementType]); strategy.elementType = elementType; strategy.fullType += ":" + elementType } } return strategy }; function applyElementState(figure, styles, state, field) { figure[field].attr(styles[field][state]) } var emptyStrategy = { setup: _noop, reset: _noop, arrange: _noop, updateGrouping: _noop }; var strategiesByType = {}; strategiesByType[TYPE_AREA] = { projectLabel: projectAreaLabel, transform: transformPointList, transformLabel: transformAreaLabel, draw: function(context, figure, data) { figure.root = context.renderer.path([], "area").data(context.dataKey, data) }, refresh: _noop, getLabelOffset: function(label) { setAreaLabelVisibility(label); return [0, 0] }, getStyles: function(settings) { var color = settings.color || null, borderColor = settings.borderColor || null, borderWidth = pick(settings.borderWidth, null), opacity = pick(settings.opacity, null); return { root: [{ "class": "dxm-area", stroke: borderColor, "stroke-width": borderWidth, fill: color, opacity: opacity }, { "class": "dxm-area dxm-area-hovered", stroke: settings.hoveredBorderColor || borderColor, "stroke-width": pick(settings.hoveredBorderWidth, borderWidth), fill: settings.hoveredColor || color, opacity: pick(settings.hoveredOpacity, opacity) }, { "class": "dxm-area dxm-area-selected", stroke: settings.selectedBorderColor || borderColor, "stroke-width": pick(settings.selectedBorderWidth, borderWidth), fill: settings.selectedColor || color, opacity: pick(settings.selectedOpacity, opacity) }] } }, setState: function(figure, styles, state) { applyElementState(figure, styles, state, "root") }, hasLabelsGroup: true, updateGrouping: function(context) { groupByColor(context) } }; strategiesByType[TYPE_LINE] = { projectLabel: projectLineLabel, transform: transformPointList, transformLabel: transformLineLabel, draw: function(context, figure, data) { figure.root = context.renderer.path([], "line").data(context.dataKey, data) }, refresh: _noop, getLabelOffset: function(label) { setLineLabelVisibility(label); return [0, 0] }, getStyles: function(settings) { var color = settings.color || settings.borderColor || null, width = pick(settings.borderWidth, null), opacity = pick(settings.opacity, null); return { root: [{ "class": "dxm-line", stroke: color, "stroke-width": width, opacity: opacity }, { "class": "dxm-line dxm-line-hovered", stroke: settings.hoveredColor || settings.hoveredBorderColor || color, "stroke-width": pick(settings.hoveredBorderWidth, width), opacity: pick(settings.hoveredOpacity, opacity) }, { "class": "dxm-line dxm-line-selected", stroke: settings.selectedColor || settings.selectedBorderColor || color, "stroke-width": pick(settings.selectedBorderWidth, width), opacity: pick(settings.selectedOpacity, opacity) }] } }, setState: function(figure, styles, state) { applyElementState(figure, styles, state, "root") }, hasLabelsGroup: true, updateGrouping: function(context) { groupByColor(context) } }; strategiesByType[TYPE_MARKER] = { project: projectPoint, transform: transformPoint, draw: function(context, figure, data) { figure.root = context.renderer.g(); this._draw(context, figure, data) }, refresh: _noop, hasLabelsGroup: false, getLabelOffset: function(label, settings) { return [_round((label.size[0] + _max(settings.size || 0, 0)) / 2) + 2, 0] }, getStyles: function(settings) { var styles = { root: [{ "class": "dxm-marker" }, { "class": "dxm-marker dxm-marker-hovered" }, { "class": "dxm-marker dxm-marker-selected" }] }; this._getStyles(styles, settings); return styles }, setState: function(figure, styles, state) { applyElementState(figure, styles, state, "root"); this._setState(figure, styles, state) }, updateGrouping: function(context) { groupByColor(context); groupBySize(context) } }; var strategiesByGeometry = {}; strategiesByGeometry[TYPE_AREA] = function(sample) { var coordinates = sample.coordinates; return { project: coordinates[0] && coordinates[0][0] && coordinates[0][0][0] && "number" === typeof coordinates[0][0][0][0] ? projectMultiPolygon : projectPolygon } }; strategiesByGeometry[TYPE_LINE] = function(sample) { var coordinates = sample.coordinates; return { project: coordinates[0] && coordinates[0][0] && "number" === typeof coordinates[0][0][0] ? projectPolygon : projectLineString } }; var strategiesByElementType = {}; strategiesByElementType[TYPE_MARKER] = { _default: "dot", dot: { setup: function(context) { context.filter = context.renderer.shadowFilter("-40%", "-40%", "180%", "200%", 0, 1, 1, "#000000", .2) }, reset: function(context) { context.filter.dispose(); context.filter = null }, _draw: function(ctx, figure, data) { figure.back = ctx.renderer.circle().sharp().data(ctx.dataKey, data).append(figure.root); figure.dot = ctx.renderer.circle().sharp().data(ctx.dataKey, data).append(figure.root) }, refresh: function(ctx, figure, data, proxy, settings) { figure.dot.attr({ filter: settings.shadow ? ctx.filter.id : null }) }, _getStyles: function(styles, style) { var size = style.size > 0 ? _Number(style.size) : 0, hoveredSize = size, selectedSize = size + (style.selectedStep > 0 ? _Number(style.selectedStep) : 0), hoveredBackSize = hoveredSize + (style.backStep > 0 ? _Number(style.backStep) : 0), selectedBackSize = selectedSize + (style.backStep > 0 ? _Number(style.backStep) : 0), color = style.color || null, borderColor = style.borderColor || null, borderWidth = pick(style.borderWidth, null), opacity = pick(style.opacity, null), backColor = style.backColor || null, backOpacity = pick(style.backOpacity, null); styles.dot = [{ r: size / 2, stroke: borderColor, "stroke-width": borderWidth, fill: color, opacity: opacity }, { r: hoveredSize / 2, stroke: style.hoveredBorderColor || borderColor, "stroke-width": pick(style.hoveredBorderWidth, borderWidth), fill: style.hoveredColor || color, opacity: pick(style.hoveredOpacity, opacity) }, { r: selectedSize / 2, stroke: style.selectedBorderColor || borderColor, "stroke-width": pick(style.selectedBorderWidth, borderWidth), fill: style.selectedColor || color, opacity: pick(style.selectedOpacity, opacity) }]; styles.back = [{ r: size / 2, stroke: "none", "stroke-width": 0, fill: backColor, opacity: backOpacity }, { r: hoveredBackSize / 2, stroke: "none", "stroke-width": 0, fill: backColor, opacity: backOpacity }, { r: selectedBackSize / 2, stroke: "none", "stroke-width": 0, fill: backColor, opacity: backOpacity }] }, _setState: function(figure, styles, state) { applyElementState(figure, styles, state, "dot"); applyElementState(figure, styles, state, "back") } }, bubble: { _draw: function(ctx, figure, data) { figure.bubble = ctx.renderer.circle().sharp().data(ctx.dataKey, data).append(figure.root) }, refresh: function(ctx, figure, data, proxy, settings) { figure.bubble.attr({ r: settings.size / 2 }) }, _getStyles: function(styles, style) { var color = style.color || null, borderColor = style.borderColor || null, borderWidth = pick(style.borderWidth, null), opacity = pick(style.opacity, null); styles.bubble = [{ stroke: borderColor, "stroke-width": borderWidth, fill: color, opacity: opacity }, { stroke: style.hoveredBorderColor || borderColor, "stroke-width": pick(style.hoveredBorderWidth, borderWidth), fill: style.hoveredColor || style.color, opacity: pick(style.hoveredOpacity, opacity) }, { stroke: style.selectedBorderColor || borderColor, "stroke-width": pick(style.selectedBorderWidth, borderWidth), fill: style.selectedColor || style.color, opacity: pick(style.selectedOpacity, opacity) }] }, _setState: function(figure, styles, state) { applyElementState(figure, styles, state, "bubble") }, arrange: function(context, handles) { var i, minValue, maxValue, deltaValue, deltaSize, values = [], ii = values.length = handles.length, settings = context.settings, dataField = settings.dataField, minSize = settings.minSize > 0 ? _Number(settings.minSize) : 0, maxSize = settings.maxSize > minSize ? _Number(settings.maxSize) : minSize; if (settings.sizeGroups) { return } for (i = 0; i < ii; ++i) { values[i] = _max(getDataValue(handles[i].proxy, dataField, "value") || 0, 0) } minValue = _min.apply(null, values); maxValue = _max.apply(null, values); deltaValue = maxValue - minValue || 1; deltaSize = maxSize - minSize; for (i = 0; i < ii; ++i) { handles[i]._settings.size = minSize + deltaSize * (values[i] - minValue) / deltaValue } }, updateGrouping: function(context) { var dataField = context.settings.dataField; strategiesByType[TYPE_MARKER].updateGrouping(context); groupBySize(context, function(proxy) { return getDataValue(proxy, dataField, "value") }) } }, pie: { _draw: function(ctx, figure, data) { figure.pie = ctx.renderer.g().append(figure.root); figure.border = ctx.renderer.circle().sharp().data(ctx.dataKey, data).append(figure.root) }, refresh: function(ctx, figure, data, proxy, settings) { var i, values = getDataValue(proxy, ctx.settings.dataField, "values") || [], ii = values.length || 0, colors = settings._colors, sum = 0, pie = figure.pie, renderer = ctx.renderer, dataKey = ctx.dataKey, r = (settings.size > 0 ? _Number(settings.size) : 0) / 2, start = 90, end = start; for (i = 0; i < ii; ++i) { sum += values[i] || 0 } for (i = 0; i < ii; ++i) { start = end; end += (values[i] || 0) / sum * 360; renderer.arc(0, 0, 0, r, start, end).attr({ "stroke-linejoin": "round", fill: colors[i] }).data(dataKey, data).append(pie) } figure.border.attr({ r: r }) }, _getStyles: function(styles, style) { var opacity = pick(style.opacity, null), borderColor = style.borderColor || null, borderWidth = pick(style.borderWidth, null); styles.pie = [{ opacity: opacity }, { opacity: pick(style.hoveredOpacity, opacity) }, { opacity: pick(style.selectedOpacity, opacity) }]; styles.border = [{ stroke: borderColor, "stroke-width": borderWidth }, { stroke: style.hoveredBorderColor || borderColor, "stroke-width": pick(style.hoveredBorderWidth, borderWidth) }, { stroke: style.selectedBorderColor || borderColor, "stroke-width": pick(style.selectedBorderWidth, borderWidth) }] }, _setState: function(figure, styles, state) { applyElementState(figure, styles, state, "pie"); applyElementState(figure, styles, state, "border") }, arrange: function(context, handles) { var i, values, palette, ii = handles.length, dataField = context.settings.dataField, count = 0; for (i = 0; i < ii; ++i) { values = getDataValue(handles[i].proxy, dataField, "values"); if (values && values.length > count) { count = values.length } } if (count > 0) { values = []; palette = context.params.themeManager.createPalette(context.settings.palette, { useHighlight: true }); for (i = 0; i < count; ++i) { values.push(palette.getNextColor()) } context.settings._colors = values; context.grouping.color = { callback: _noop, field: "", partition: [], values: [] }; context.params.dataExchanger.set(context.name, "color", { partition: [], values: values }) } } }, image: { _draw: function(ctx, figure, data) { figure.image = ctx.renderer.image().attr({ location: "center" }).data(ctx.dataKey, data).append(figure.root) }, refresh: function(ctx, figure, data, proxy) { figure.image.attr({ href: getDataValue(proxy, ctx.settings.dataField, "url") }) }, _getStyles: function(styles, style) { var size = style.size > 0 ? _Number(style.size) : 0, hoveredSize = size + (style.hoveredStep > 0 ? _Number(style.hoveredStep) : 0), selectedSize = size + (style.selectedStep > 0 ? _Number(style.selectedStep) : 0), opacity = pick(style.opacity, null); styles.image = [{ x: -size / 2, y: -size / 2, width: size, height: size, opacity: opacity }, { x: -hoveredSize / 2, y: -hoveredSize / 2, width: hoveredSize, height: hoveredSize, opacity: pick(style.hoveredOpacity, opacity) }, { x: -selectedSize / 2, y: -selectedSize / 2, width: selectedSize, height: selectedSize, opacity: pick(style.selectedOpacity, opacity) }] }, _setState: function(figure, styles, state) { applyElementState(figure, styles, state, "image") } } }; function projectPoint(projection, coordinates) { return projection.project(coordinates) } function projectPointList(projection, coordinates) { var i, output = [], ii = output.length = coordinates.length; for (i = 0; i < ii; ++i) { output[i] = projection.project(coordinates[i]) } return output } function projectLineString(projection, coordinates) { return [projectPointList(projection, coordinates)] } function projectPolygon(projection, coordinates) { var i, output = [], ii = output.length = coordinates.length; for (i = 0; i < ii; ++i) { output[i] = projectPointList(projection, coordinates[i]) } return output } function projectMultiPolygon(projection, coordinates) { var i, output = [], ii = output.length = coordinates.length; for (i = 0; i < ii; ++i) { output[i] = projectPolygon(projection, coordinates[i]) } return _concat.apply([], output) } function transformPoint(content, projection, coordinates) { var data = projection.transform(coordinates); content.root.attr({ translateX: data[0], translateY: data[1] }) } function transformList(projection, coordinates) { var i, item, output = [], ii = coordinates.length, k = 0; output.length = 2 * ii; for (i = 0; i < ii; ++i) { item = projection.transform(coordinates[i]); output[k++] = item[0]; output[k++] = item[1] } return output } function transformPointList(content, projection, coordinates) { var i, output = [], ii = output.length = coordinates.length; for (i = 0; i < ii; ++i) { output[i] = transformList(projection, coordinates[i]) } content.root.attr({ points: output }) } function transformAreaLabel(label, projection, coordinates) { var data = projection.transform(coordinates[0]); label.spaceSize = projection.getSquareSize(coordinates[1]); label.text.attr({ translateX: data[0], translateY: data[1] }); setAreaLabelVisibility(label) } function transformLineLabel(label, projection, coordinates) { var data = projection.transform(coordinates[0]); label.spaceSize = projection.getSquareSize(coordinates[1]); label.text.attr({ translateX: data[0], translateY: data[1] }); setLineLabelVisibility(label) } function getItemSettings(context, proxy, settings) { var result = combineSettings(context.settings, settings); proxy.text = proxy.text || settings.text; applyGrouping(context.grouping, proxy, result); if (void 0 === settings.color && settings.paletteIndex >= 0) { result.color = result._colors[settings.paletteIndex] } return result } function applyGrouping(grouping, proxy, settings) { _each(grouping, function(name, data) { var index = findGroupingIndex(data.callback(proxy, data.field), data.partition); if (index >= 0) { settings[name] = data.values[index] } }) } function findGroupingIndex(value, partition) { var middle, start = 0, end = partition.length - 1, index = -1; if (partition[start] <= value && value <= partition[end]) { if (value === partition[end]) { index = end - 1 } else { while (end - start > 1) { middle = start + end >> 1; if (value < partition[middle]) { end = middle } else { start = middle } } index = start } } return index } function raiseChanged(context, handle, state, name) { context.params.eventTrigger(name, { target: handle.proxy, state: state }) } function combineSettings(common, partial) { var obj = _extend({}, common, partial); obj.label = _extend({}, common.label, obj.label); obj.label.font = _extend({}, common.label.font, obj.label.font); return obj } function processCommonSettings(type, options, themeManager) { var colors, i, palette, settings = combineSettings(themeManager.theme("layer:" + type) || { label: {} }, options); if (settings.paletteSize > 0) { palette = themeManager.createDiscretePalette(settings.palette, settings.paletteSize); for (i = 0, colors = []; i < settings.paletteSize; ++i) { colors.push(palette.getColor(i)) } settings._colors = colors } return settings } function valueCallback(proxy, dataField) { return proxy.attribute(dataField) } var performGrouping = function(context, partition, settingField, dataField, valuesCallback) { var values; if (dataField && partition && partition.length > 1) { values = valuesCallback(partition.length - 1); context.grouping[settingField] = { callback: _isFunction(dataField) ? dataField : valueCallback, field: dataField, partition: partition, values: values }; context.params.dataExchanger.set(context.name, settingField, { partition: partition, values: values }) } }; function dropGrouping(context) { var name = context.name, dataExchanger = context.params.dataExchanger; _each(context.grouping, function(field) { dataExchanger.set(name, field, null) }); context.grouping = {} } var groupByColor = function(context) { performGrouping(context, context.settings.colorGroups, "color", context.settings.colorGroupingField, function(count) { var i, _palette = context.params.themeManager.createDiscretePalette(context.settings.palette, count), list = []; for (i = 0; i < count; ++i) { list.push(_palette.getColor(i)) } return list }) }; var groupBySize = function(context, valueCallback) { var settings = context.settings; performGrouping(context, settings.sizeGroups, "size", valueCallback || settings.sizeGroupingField, function(count) { var minSize = settings.minSize > 0 ? _Number(settings.minSize) : 0, maxSize = settings.maxSize >= minSize ? _Number(settings.maxSize) : 0, i = 0, sizes = []; if (count > 1) { for (i = 0; i < count; ++i) { sizes.push((minSize * (count - i - 1) + maxSize * i) / (count - 1)) } } else { if (1 === count) { sizes.push((minSize + maxSize) / 2) } } return sizes }) }; function setFlag(flags, flag, state) { if (state) { flags |= flag } else { flags &= ~flag } return flags } function hasFlag(flags, flag) { return !!(flags & flag) } function createLayerProxy(layer, name, index) { var proxy = { index: index, name: name, getElements: function() { return layer.getProxies() }, clearSelection: function(_noEvent) { layer.clearSelection(_noEvent); return proxy }, getDataSource: function() { return layer.getDataSource() } }; return proxy } var MapLayer = function(params, container, name, index) { var that = this; that._params = params; that._onProjection(); that.proxy = createLayerProxy(that, name, index); that._context = { name: name, layer: that.proxy, renderer: params.renderer, projection: params.projection, params: params, dataKey: params.dataKey, str: emptyStrategy, hover: false, selection: null, grouping: {}, root: params.renderer.g().attr({ "class": "dxm-layer" }).linkOn(container, name).linkAppend() }; that._container = container; that._options = {}; that._handles = []; that._data = new EmptySource }; MapLayer.prototype = _extend({ constructor: MapLayer, _onProjection: function() { var that = this; that._removeHandlers = that._params.projection.on({ engine: function() { that._project() }, screen: function() { that._transform() }, center: function() { that._transformCore() }, zoom: function() { that._transform() } }) }, _dataSourceLoadErrorHandler: function() { this._dataSourceChangedHandler() }, _dataSourceChangedHandler: function() { var that = this; that._data = unwrapFromDataSource(that._dataSource && that._dataSource.items()); that._update(true) }, _dataSourceOptions: function() { return { paginate: false } }, _getSpecificDataSourceOption: function() { return this._specificDataSourceOption }, _offProjection: function() { this._removeHandlers(); this._removeHandlers = null }, dispose: function() { var that = this; that._disposeDataSource(); that._destroyHandles(); dropGrouping(that._context); that._context.root.linkRemove().linkOff(); that._context.labelRoot && that._context.labelRoot.linkRemove().linkOff(); that._context.str.reset(that._context); that._offProjection(); that._params = that._container = that._context = that.proxy = null; return that }, TESTS_getContext: function() { return this._context }, setOptions: function(options) { var name, that = this; options = that._options = options || {}; name = !("dataSource" in options) && "data" in options ? "data" : "dataSource"; if (name in options && options[name] !== that._options_dataSource) { that._options_dataSource = options[name]; that._params.notifyDirty(); that._specificDataSourceOption = wrapToDataSource(options[name]); that._refreshDataSource() } else { if (that._data.count() > 0) { that._params.notifyDirty(); that._update(void 0 !== options.type && options.type !== that._context.str.type || void 0 !== options.elementType && options.elementType !== that._context.str.elementType) } } }, _update: function(isContextChanged) { var that = this, context = that._context; if (isContextChanged) { context.str.reset(context); context.root.clear(); context.labelRoot && context.labelRoot.clear(); that._params.tracker.reset(); that._destroyHandles(); context.str = selectStrategy(that._options, that._data); context.str.setup(context); that.proxy.type = context.str.type; that.proxy.elementType = context.str.elementType } context.settings = processCommonSettings(context.str.fullType, that._options, that._params.themeManager); context.hasSeparateLabel = !!(context.settings.label.enabled && context.str.hasLabelsGroup); context.hover = !!_parseScalar(context.settings.hoverEnabled, true); if (context.selection) { _each(context.selection.state, function(_, handle) { handle && handle.resetSelected() }) } context.selection = getSelection(context.settings.selectionMode); if (context.hasSeparateLabel) { if (!context.labelRoot) { context.labelRoot = context.renderer.g().attr({ "class": "dxm-layer-labels" }).linkOn(that._container, { name: context.name + "-labels", after: context.name }).linkAppend(); that._transformCore() } } else { if (context.labelRoot) { context.labelRoot.linkRemove().linkOff(); context.labelRoot = null } } if (isContextChanged) { that._createHandles() } dropGrouping(context); context.str.arrange(context, that._handles); context.str.updateGrouping(context); that._updateHandles(); that._params.notifyReady() }, _destroyHandles: function() { var i, handles = this._handles, ii = handles.length; for (i = 0; i < ii; ++i) { handles[i].dispose() } if (this._context.selection) { this._context.selection.state = {} } this._handles = [] }, _createHandles: function() { var i, handle, dataItem, that = this, handles = that._handles = [], data = that._data, ii = handles.length = data.count(), context = that._context, geometry = data.geometry, attributes = data.attributes; for (i = 0; i < ii; ++i) { dataItem = data.item(i); handles[i] = new MapLayerElement(context, i, geometry(dataItem), attributes(dataItem)) } if (_isFunction(that._options.customize)) { (that._options._deprecated ? customizeHandles_deprecated : customizeHandles)(that.getProxies(), that._options.customize, that._params.widget) } if (that._options._deprecated) { patchProxies(handles, context.name, data) } for (i = 0; i < ii; ++i) { handle = handles[i]; handle.project(); handle.draw(); handle.transform() } if (context.selection) { _each(context.selection.state, function(_, handle) { handle && handle.restoreSelected() }) } }, _updateHandles: function() { var i, handles = this._handles, ii = handles.length; for (i = 0; i < ii; ++i) { handles[i].refresh() } if (this._context.settings.label.enabled) { for (i = 0; i < ii; ++i) { handles[i].measureLabel() } for (i = 0; i < ii; ++i) { handles[i].adjustLabel() } } }, _transformCore: function() { var transform = this._params.projection.getTransform(); this._context.root.attr(transform); this._context.labelRoot && this._context.labelRoot.attr(transform) }, _project: function() { var i, handles = this._handles, ii = handles.length; for (i = 0; i < ii; ++i) { handles[i].project() } }, _transform: function() { var i, handles = this._handles, ii = handles.length; this._transformCore(); for (i = 0; i < ii; ++i) { handles[i].transform() } }, getProxies: function() { var i, handles = this._handles, proxies = [], ii = proxies.length = handles.length; for (i = 0; i < ii; ++i) { proxies[i] = handles[i].proxy } return proxies }, getProxy: function(index) { return this._handles[index].proxy }, raiseClick: function(i, jQueryEvent) { this._params.eventTrigger("click", { target: this._handles[i].proxy, jQueryEvent: jQueryEvent }) }, hoverItem: function(i, state) { this._handles[i].setHovered(state) }, selectItem: function(i, state, _noEvent) { this._handles[i].setSelected(state, _noEvent) }, clearSelection: function() { var selection = this._context.selection; if (selection) { _each(selection.state, function(_, handle) { handle && handle.setSelected(false) }); selection.state = {} } } }, DataHelperMixin); function createProxy(handle, coords, attrs) { var proxy = { coordinates: function() { return coords }, attribute: function(name, value) { if (arguments.length > 1) { attrs[name] = value; return proxy } else { return arguments.length > 0 ? attrs[name] : attrs } }, selected: function(state, _noEvent) { if (arguments.length > 0) { handle.setSelected(state, _noEvent); return proxy } else { return handle.isSelected() } }, applySettings: function(settings) { handle.update(settings); return proxy } }; return proxy } var MapLayerElement = function(context, index, geometry, attributes) { var that = this, proxy = that.proxy = createProxy(that, geometry.coordinates, _extend({}, attributes)); that._ctx = context; that._index = index; that._fig = that._label = null; that._state = STATE_DEFAULT; that._coordinates = geometry.coordinates; that._settings = { label: {} }; proxy.index = index; proxy.layer = context.layer; that._data = { name: context.name, index: index } }; MapLayerElement.prototype = { constructor: MapLayerElement, dispose: function() { var that = this; that._ctx = that.proxy = that._settings = that._fig = that._label = that.data = null; return that }, project: function() { var context = this._ctx; this._projection = context.str.project(context.projection, this._coordinates); if (context.hasSeparateLabel && this._label) { this._projectLabel() } }, _projectLabel: function() { this._labelProjection = this._ctx.str.projectLabel(this._projection) }, draw: function() { var that = this, context = this._ctx; context.str.draw(context, that._fig = {}, that._data); that._fig.root.append(context.root) }, transform: function() { var that = this, context = that._ctx; context.str.transform(that._fig, context.projection, that._projection); if (context.hasSeparateLabel && that._label) { that._transformLabel() } }, _transformLabel: function() { this._ctx.str.transformLabel(this._label, this._ctx.projection, this._labelProjection) }, refresh: function() { var that = this, strategy = that._ctx.str, settings = getItemSettings(that._ctx, that.proxy, that._settings); that._styles = strategy.getStyles(settings); strategy.refresh(that._ctx, that._fig, that._data, that.proxy, settings); that._refreshLabel(settings); that._setState() }, _refreshLabel: function(settings) { var that = this, context = that._ctx, labelSettings = settings.label, label = that._label; if (context.settings.label.enabled) { if (!label) { label = that._label = { root: context.labelRoot || that._fig.root, text: context.renderer.text().attr({ "class": "dxm-label" }), size: [0, 0] }; if (context.hasSeparateLabel) { that._projectLabel(); that._transformLabel() } } label.value = _String(that.proxy.text || that.proxy.attribute(labelSettings.dataField) || ""); if (label.value) { label.text.attr({ text: label.value, x: 0, y: 0 }).css(_patchFontOptions(labelSettings.font)).attr({ align: "center", stroke: labelSettings.stroke, "stroke-width": labelSettings["stroke-width"], "stroke-opacity": labelSettings["stroke-opacity"] }).data(context.dataKey, that._data).append(label.root); label.settings = settings } } else { if (label) { label.text.remove(); that._label = null } } }, measureLabel: function() { var bBox, label = this._label; if (label.value) { bBox = label.text.getBBox(); label.size = [bBox.width, bBox.height, -bBox.y - bBox.height / 2] } }, adjustLabel: function() { var offset, label = this._label; if (label.value) { offset = this._ctx.str.getLabelOffset(label, label.settings); label.settings = null; label.text.attr({ x: offset[0], y: offset[1] + label.size[2] }) } }, update: function(settings) { var that = this; that._settings = combineSettings(that._settings, settings); if (that._fig) { that.refresh(); if (that._label && that._label.value) { that.measureLabel(); that.adjustLabel() } } }, _setState: function() { this._ctx.str.setState(this._fig, this._styles, STATE_TO_INDEX[this._state]) }, _setForeground: function() { var root = this._fig.root; this._state ? root.toForeground() : root.toBackground() }, setHovered: function(state) { var that = this, currentState = hasFlag(that._state, STATE_HOVERED), newState = !!state; if (that._ctx.hover && currentState !== newState) { that._state = setFlag(that._state, STATE_HOVERED, newState); that._setState(); that._setForeground(); raiseChanged(that._ctx, that, newState, "hoverChanged") } return that }, setSelected: function(state, _noEvent) { var tmp, that = this, currentState = hasFlag(that._state, STATE_SELECTED), newState = !!state, selection = that._ctx.selection; if (selection && currentState !== newState) { that._state = setFlag(that._state, STATE_SELECTED, newState); tmp = selection.state[selection.single]; selection.state[selection.single] = null; if (tmp) { tmp.setSelected(false) } selection.state[selection.single || that._index] = state ? that : null; if (that._fig) { that._setState(); that._setForeground(); if (!_noEvent) { raiseChanged(that._ctx, that, newState, "selectionChanged") } } } }, isSelected: function() { return hasFlag(this._state, STATE_SELECTED) }, resetSelected: function() { this._state = setFlag(this._state, STATE_SELECTED, false) }, restoreSelected: function() { this._fig.root.toForeground() } }; function calculatePolygonCentroid(coordinates) { var i, v1, cross, length = coordinates.length, v2 = coordinates[length - 1], cx = 0, cy = 0, area = 0, minX = 1 / 0, maxX = -(1 / 0), minY = 1 / 0, maxY = -(1 / 0); for (i = 0; i < length; ++i) { v1 = v2; v2 = coordinates[i]; cross = v1[0] * v2[1] - v2[0] * v1[1]; area += cross; cx += (v1[0] + v2[0]) * cross; cy += (v1[1] + v2[1]) * cross; minX = _min(minX, v2[0]); maxX = _max(maxX, v2[0]); minY = _min(minY, v2[1]); maxY = _max(maxY, v2[1]) } return { area: _abs(area) / 2, center: [2 * cx / 3 / area - (minX + maxX) / 2, 2 * cy / 3 / area - (minY + maxY) / 2] } } function calculateLineStringData(coordinates) { var i, v1, t, ii = coordinates.length, v2 = coordinates[0] || [], totalLength = 0, items = [0], min0 = v2[0], max0 = v2[0], min1 = v2[1], max1 = v2[1]; for (i = 1; i < ii; ++i) { v1 = v2; v2 = coordinates[i]; totalLength += _sqrt((v1[0] - v2[0]) * (v1[0] - v2[0]) + (v1[1] - v2[1]) * (v1[1] - v2[1])); items[i] = totalLength; min0 = _min(min0, v2[0]); max0 = _max(max0, v2[0]); min1 = _min(min1, v2[1]); max1 = _max(max1, v2[1]) } i = findGroupingIndex(totalLength / 2, items); v1 = coordinates[i]; v2 = coordinates[i + 1]; t = (totalLength / 2 - items[i]) / (items[i + 1] - items[i]); return ii ? [ [v1[0] * (1 - t) + v2[0] * t, v1[1] * (1 - t) + v2[1] * t], [max0 - min0, max1 - min1], totalLength ] : [] } function projectAreaLabel(coordinates) { var i, centroid, resultCentroid, ii = coordinates.length, maxArea = 0; for (i = 0; i < ii; ++i) { centroid = calculatePolygonCentroid(coordinates[i]); if (centroid.area > maxArea) { maxArea = centroid.area; resultCentroid = centroid } } return resultCentroid ? [resultCentroid.center, [_sqrt(resultCentroid.area), _sqrt(resultCentroid.area)]] : [ [], [] ] } function projectLineLabel(coordinates) { var i, data, resultData, ii = coordinates.length, maxLength = 0; for (i = 0; i < ii; ++i) { data = calculateLineStringData(coordinates[i]); if (data[2] > maxLength) { maxLength = data[2]; resultData = data } } return resultData || [ [], [] ] } function MapLayerCollection(params) { var that = this, renderer = params.renderer; that._params = params; that._layers = []; that._layerByName = {}; that._rect = [0, 0, 0, 0]; that._clip = renderer.clipRect(); that._background = renderer.rect().attr({ "class": "dxm-background" }).data(params.dataKey, { name: "background" }).append(renderer.root); that._container = renderer.g().attr({ "class": "dxm-layers", "clip-path": that._clip.id }).append(renderer.root).enableLinks(); that._subscribeToTracker(params.tracker, renderer, params.eventTrigger) } MapLayerCollection.prototype = { constructor: MapLayerCollection, dispose: function() { var that = this; that._clip.dispose(); that._offTracker(); that._params = that._offTracker = that._layers = that._layerByName = that._clip = that._background = that._container = null }, _subscribeToTracker: function(tracker, renderer, eventTrigger) { var that = this; that._offTracker = tracker.on({ click: function(arg) { var offset = renderer.getRootOffset(), layer = that.byName(arg.data.name); arg.$event.x = arg.x - offset.left; arg.$event.y = arg.y - offset.top; if (layer) { layer.raiseClick(arg.data.index, arg.$event) } else { if ("background" === arg.data.name) { eventTrigger("click", { jQueryEvent: arg.$event }) } } }, "hover-on": function(arg) { var layer = that.byName(arg.data.name); if (layer) { layer.hoverItem(arg.data.index, true) } }, "hover-off": function(arg) { var layer = that.byName(arg.data.name); if (layer) { layer.hoverItem(arg.data.index, false) } } }) }, setOptions: function(options) { var name, layer, i, ii, optionList = options ? options.length ? options : [options] : [], layers = this._layers, layerByName = this._layerByName, params = this._params, container = this._container; for (i = optionList.length, ii = layers.length; i < ii; ++i) { layer = layers[i]; delete layerByName[layer.proxy.name]; layer.dispose() } layers.splice(optionList.length, layers.length - optionList.length); for (i = layers.length, ii = optionList.length; i < ii; ++i) { name = (optionList[i] || {}).name || "map-layer-" + i; layer = layers[i] = new MapLayer(params, container, name, i); layerByName[name] = layer } for (i = 0, ii = optionList.length; i < ii; ++i) { name = optionList[i] && optionList[i].name; layer = layers[i]; if (name && name !== layer.proxy.name) { delete layerByName[layer.proxy.name]; layer.dispose(); layer = layers[i] = new MapLayer(params, container, name, i); layerByName[name] = layer } layer.setOptions(optionList[i]) } }, _updateClip: function() { var rect = this._rect, bw = this._borderWidth; this._clip.attr({ x: rect[0] + bw, y: rect[1] + bw, width: _max(rect[2] - 2 * bw, 0), height: _max(rect[3] - 2 * bw, 0) }) }, setBackgroundOptions: function(options) { this._background.attr({ stroke: options.borderColor, "stroke-width": options.borderWidth, fill: options.color }); this._borderWidth = _max(options.borderWidth, 0); this._updateClip() }, setRect: function(rect) { this._rect = rect; this._background.attr({ x: rect[0], y: rect[1], width: rect[2], height: rect[3] }); this._updateClip() }, byIndex: function(index) { return this._layers[index] }, byName: function(name) { return this._layerByName[name] }, items: function() { return this._layers } }; exports.MapLayerCollection = MapLayerCollection; exports._TESTS_MapLayer = MapLayer; exports._TESTS_stub_MapLayer = function(stub) { MapLayer = stub }; exports._TESTS_selectStrategy = selectStrategy; exports._TESTS_stub_selectStrategy = function(stub) { selectStrategy = stub }; exports._TESTS_MapLayerElement = MapLayerElement; exports._TESTS_stub_MapLayerElement = function(stub) { MapLayerElement = stub }; exports._TESTS_createProxy = createProxy; exports._TESTS_stub_performGrouping = function(stub) { performGrouping = stub }; exports._TESTS_performGrouping = performGrouping; exports._TESTS_stub_groupByColor = function(stub) { groupByColor = stub }; exports._TESTS_groupByColor = groupByColor; exports._TESTS_stub_groupBySize = function(stub) { groupBySize = stub }; exports._TESTS_groupBySize = groupBySize; exports._TESTS_findGroupingIndex = findGroupingIndex }, /*!*********************************************!*\ !*** ./js/viz/vector_map/tooltip_viewer.js ***! \*********************************************/ function(module, exports) { var TOOLTIP_OFFSET = 12; function TooltipViewer(params) { this._subscribeToTracker(params.tracker, params.tooltip, params.layerCollection) } TooltipViewer.prototype = { constructor: TooltipViewer, dispose: function() { this._offTracker(); this._offTracker = null }, _subscribeToTracker: function(tracker, tooltip, layerCollection) { this._offTracker = tracker.on({ "focus-on": function(arg) { var layer, proxy, result = false; if (tooltip.isEnabled()) { layer = layerCollection.byName(arg.data.name); proxy = layer && layer.getProxy(arg.data.index); if (proxy && tooltip.show(proxy, { x: 0, y: 0, offset: 0 }, { target: proxy })) { tooltip.move(arg.x, arg.y, TOOLTIP_OFFSET); result = true } } arg.done(result) }, "focus-move": function(arg) { tooltip.move(arg.x, arg.y, TOOLTIP_OFFSET) }, "focus-off": function() { tooltip.hide() } }) } }; exports.TooltipViewer = TooltipViewer }, /*!*****************************************!*\ !*** ./js/viz/vector_map/projection.js ***! \*****************************************/ function(module, exports, __webpack_require__) { var projectionModule = __webpack_require__( /*! ./projection.main */ 615), projection = projectionModule.projection, _min = Math.min, _max = Math.max, _sin = Math.sin, _asin = Math.asin, _tan = Math.tan, _atan = Math.atan, _exp = Math.exp, _log = Math.log, PI = Math.PI, PI_DIV_4 = PI / 4, GEO_LON_BOUND = 180, GEO_LAT_BOUND = 90, RADIANS = PI / 180, MERCATOR_LAT_BOUND = (2 * _atan(_exp(PI)) - PI / 2) / RADIANS, MILLER_LAT_BOUND = (2.5 * _atan(_exp(.8 * PI)) - .625 * PI) / RADIANS; function clamp(value, threshold) { return _max(_min(value, +threshold), -threshold) } projection.add("mercator", projection({ aspectRatio: 1, to: function(coordinates) { return [coordinates[0] / GEO_LON_BOUND, _log(_tan(PI_DIV_4 + clamp(coordinates[1], MERCATOR_LAT_BOUND) * RADIANS / 2)) / PI] }, from: function(coordinates) { return [coordinates[0] * GEO_LON_BOUND, (2 * _atan(_exp(coordinates[1] * PI)) - PI / 2) / RADIANS] } })); projection.add("equirectangular", projection({ aspectRatio: 2, to: function(coordinates) { return [coordinates[0] / GEO_LON_BOUND, coordinates[1] / GEO_LAT_BOUND] }, from: function(coordinates) { return [coordinates[0] * GEO_LON_BOUND, coordinates[1] * GEO_LAT_BOUND] } })); projection.add("lambert", projection({ aspectRatio: 2, to: function(coordinates) { return [coordinates[0] / GEO_LON_BOUND, _sin(clamp(coordinates[1], GEO_LAT_BOUND) * RADIANS)] }, from: function(coordinates) { return [coordinates[0] * GEO_LON_BOUND, _asin(clamp(coordinates[1], 1)) / RADIANS] } })); projection.add("miller", projection({ aspectRatio: 1, to: function(coordinates) { return [coordinates[0] / GEO_LON_BOUND, 1.25 * _log(_tan(PI_DIV_4 + clamp(coordinates[1], MILLER_LAT_BOUND) * RADIANS * .4)) / PI] }, from: function(coordinates) { return [coordinates[0] * GEO_LON_BOUND, (2.5 * _atan(_exp(.8 * coordinates[1] * PI)) - .625 * PI) / RADIANS] } })); exports.projection = projection }, /*!*****************************!*\ !*** ./js/viz/sparkline.js ***! \*****************************/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__( /*! ./sparklines/sparkline */ 628) }, /*!****************************************!*\ !*** ./js/viz/sparklines/sparkline.js ***! \****************************************/ function(module, exports, __webpack_require__) { var BaseSparkline = __webpack_require__( /*! ./base_sparkline */ 629), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), dataValidatorModule = __webpack_require__( /*! ../components/data_validator */ 523), seriesModule = __webpack_require__( /*! ../series/base_series */ 525), MIN_BAR_WIDTH = 1, MAX_BAR_WIDTH = 50, DEFAULT_BAR_INTERVAL = 4, DEFAULT_CANVAS_WIDTH = 250, DEFAULT_CANVAS_HEIGHT = 30, DEFAULT_HORIZONTAL_MARGIN = 5, DEFAULT_VERTICAL_MARGIN = 3, ALLOWED_TYPES = { line: true, spline: true, stepline: true, area: true, steparea: true, splinearea: true, bar: true, winloss: true }, _math = Math, _abs = _math.abs, _round = _math.round, _max = _math.max, _min = _math.min, _isFinite = isFinite, vizUtils = __webpack_require__( /*! ../core/utils */ 509), _map = vizUtils.map, _normalizeEnum = vizUtils.normalizeEnum, _isDefined = commonUtils.isDefined, _Number = Number, _String = String; var dxSparkline = BaseSparkline.inherit({ _rootClassPrefix: "dxsl", _rootClass: "dxsl-sparkline", _widgetType: "sparkline", _defaultSize: { width: DEFAULT_CANVAS_WIDTH, height: DEFAULT_CANVAS_HEIGHT, left: DEFAULT_HORIZONTAL_MARGIN, right: DEFAULT_HORIZONTAL_MARGIN, top: DEFAULT_VERTICAL_MARGIN, bottom: DEFAULT_VERTICAL_MARGIN }, _initCore: function() { this.callBase(); this._createSeries() }, _initialChanges: ["DATA_SOURCE"], _dataSourceChangedHandler: function() { this._requestChange(["UPDATE"]) }, _updateWidgetElements: function() { this._updateSeries(); this.callBase() }, _disposeWidgetElements: function() { var that = this; that._series && that._series.dispose(); that._series = that._seriesGroup = that._seriesLabelGroup = null }, _cleanWidgetElements: function() { this._seriesGroup.remove(); this._seriesLabelGroup.remove(); this._seriesGroup.clear(); this._seriesLabelGroup.clear() }, _drawWidgetElements: function() { if (this._dataIsLoaded()) { this._drawSeries(); this._drawn() } }, _prepareOptions: function() { var that = this; that._allOptions = that.callBase(); that._allOptions.type = _normalizeEnum(that._allOptions.type); if (!ALLOWED_TYPES[that._allOptions.type]) { that._allOptions.type = "line" } }, _createHtmlElements: function() { this._seriesGroup = this._renderer.g().attr({ "class": "dxsl-series" }); this._seriesLabelGroup = this._renderer.g().attr({ "class": "dxsl-series-labels" }) }, _createSeries: function() { this._series = new seriesModule.Series({ renderer: this._renderer, seriesGroup: this._seriesGroup, labelsGroup: this._seriesLabelGroup, argumentAxis: this._argumentAxis, valueAxis: this._valueAxis }, { widgetType: "chart", type: "line" }) }, getSeriesOptions: function() { return this._series.getOptions() }, _updateSeries: function() { var groupsData, seriesOptions, that = this, singleSeries = that._series; that._prepareDataSource(); seriesOptions = that._prepareSeriesOptions(); singleSeries.updateOptions(seriesOptions); groupsData = { groups: [{ series: [singleSeries] }] }; groupsData.argumentOptions = { type: "bar" === seriesOptions.type ? "discrete" : void 0 }; that._simpleDataSource = dataValidatorModule.validateData(that._simpleDataSource, groupsData, that._incidentOccurred, { checkTypeForAllData: false, convertToAxisDataType: true, sortingMethod: true })[singleSeries.getArgumentField()]; singleSeries.updateData(that._simpleDataSource); that._groupsDataCategories = groupsData.categories }, _optionChangesMap: { dataSource: "DATA_SOURCE" }, _optionChangesOrder: ["DATA_SOURCE"], _change_DATA_SOURCE: function() { this._updateDataSource() }, _parseNumericDataSource: function(data, argField, valField) { var ignoreEmptyPoints = this.option("ignoreEmptyPoints"); return _map(data, function(dataItem, index) { var isDataNumber, value, item = null; if (void 0 !== dataItem) { item = {}; isDataNumber = _isFinite(dataItem); item[argField] = isDataNumber ? _String(index) : dataItem[argField]; value = isDataNumber ? dataItem : dataItem[valField]; item[valField] = null === value ? ignoreEmptyPoints ? void 0 : value : _Number(value); item = void 0 !== item[argField] && void 0 !== item[valField] ? item : null } return item }) }, _parseWinlossDataSource: function(data, argField, valField) { var lowBarValue = -1, zeroBarValue = 0, highBarValue = 1, delta = 1e-4, target = this._allOptions.winlossThreshold; return _map(data, function(dataItem) { var item = {}; item[argField] = dataItem[argField]; if (_abs(dataItem[valField] - target) < delta) { item[valField] = zeroBarValue } else { if (dataItem[valField] > target) { item[valField] = highBarValue } else { item[valField] = lowBarValue } } return item }) }, _prepareDataSource: function() { var that = this, options = that._allOptions, argField = options.argumentField, valField = options.valueField, dataSource = that._dataSourceItems() || [], data = that._parseNumericDataSource(dataSource, argField, valField); if ("winloss" === options.type) { that._winlossDataSource = data; that._simpleDataSource = that._parseWinlossDataSource(data, argField, valField) } else { that._simpleDataSource = data } }, _prepareSeriesOptions: function() { var that = this, options = that._allOptions, type = "winloss" === options.type ? "bar" : options.type; return { visible: true, argumentField: options.argumentField, valueField: options.valueField, color: options.lineColor, width: options.lineWidth, widgetType: "chart", type: type, opacity: type.indexOf("area") !== -1 ? that._allOptions.areaOpacity : void 0, customizePoint: that._getCustomizeFunction(), point: { size: options.pointSize, symbol: options.pointSymbol, border: { visible: true, width: 2 }, color: options.pointColor, visible: false, hoverStyle: { border: {} }, selectionStyle: { border: {} } }, border: { color: options.lineColor, width: options.lineWidth, visible: "bar" !== type } } }, _createBarCustomizeFunction: function(pointIndexes) { var that = this, options = that._allOptions, winlossData = that._winlossDataSource; return function() { var color, index = this.index, isWinloss = "winloss" === options.type, target = isWinloss ? options.winlossThreshold : 0, value = isWinloss ? winlossData[index][options.valueField] : this.value, positiveColor = isWinloss ? options.winColor : options.barPositiveColor, negativeColor = isWinloss ? options.lossColor : options.barNegativeColor; if (value >= target) { color = positiveColor } else { color = negativeColor } if (index === pointIndexes.first || index === pointIndexes.last) { color = options.firstLastColor } if (index === pointIndexes.min) { color = options.minColor } if (index === pointIndexes.max) { color = options.maxColor } return { color: color } } }, _createLineCustomizeFunction: function(pointIndexes) { var that = this, options = that._allOptions; return function() { var color, index = this.index; if (index === pointIndexes.first || index === pointIndexes.last) { color = options.firstLastColor } if (index === pointIndexes.min) { color = options.minColor } if (index === pointIndexes.max) { color = options.maxColor } return color ? { visible: true, border: { color: color } } : {} } }, _getCustomizeFunction: function() { var customizeFunction, that = this, options = that._allOptions, dataSource = that._winlossDataSource || that._simpleDataSource, drawnPointIndexes = that._getExtremumPointsIndexes(dataSource); if ("winloss" === options.type || "bar" === options.type) { customizeFunction = that._createBarCustomizeFunction(drawnPointIndexes) } else { customizeFunction = that._createLineCustomizeFunction(drawnPointIndexes) } return customizeFunction }, _getExtremumPointsIndexes: function(data) { var that = this, options = that._allOptions, lastIndex = data.length - 1, indexes = {}; that._minMaxIndexes = that._findMinMax(data); if (options.showFirstLast) { indexes.first = 0; indexes.last = lastIndex } if (options.showMinMax) { indexes.min = that._minMaxIndexes.minIndex; indexes.max = that._minMaxIndexes.maxIndex } return indexes }, _findMinMax: function(data) { var value, i, that = this, valField = that._allOptions.valueField, firstItem = data[0] || {}, firstValue = firstItem[valField] || 0, min = firstValue, max = firstValue, minIndex = 0, maxIndex = 0, dataLength = data.length; for (i = 1; i < dataLength; i++) { value = data[i][valField]; if (value < min) { min = value; minIndex = i } if (value > max) { max = value; maxIndex = i } } return { minIndex: minIndex, maxIndex: maxIndex } }, _updateRange: function() { var valCoef, argCoef, that = this, series = that._series, type = series.type, isBarType = "bar" === type, isWinlossType = "winloss" === type, DEFAULT_VALUE_RANGE_MARGIN = .15, DEFAULT_ARGUMENT_RANGE_MARGIN = .1, WINLOSS_MAX_RANGE = 1, WINLOSS_MIN_RANGE = -1, rangeData = series.getRangeData(), minValue = that._allOptions.minValue, hasMinY = _isDefined(minValue) && _isFinite(minValue), maxValue = that._allOptions.maxValue, hasMaxY = _isDefined(maxValue) && _isFinite(maxValue); valCoef = (rangeData.val.max - rangeData.val.min) * DEFAULT_VALUE_RANGE_MARGIN; if (isBarType || isWinlossType || "area" === type) { if (0 !== rangeData.val.min) { rangeData.val.min -= valCoef } if (0 !== rangeData.val.max) { rangeData.val.max += valCoef } } else { rangeData.val.min -= valCoef; rangeData.val.max += valCoef } if (hasMinY || hasMaxY) { if (hasMinY && hasMaxY) { rangeData.val.minVisible = _min(minValue, maxValue); rangeData.val.maxVisible = _max(minValue, maxValue) } else { rangeData.val.minVisible = hasMinY ? _Number(minValue) : void 0; rangeData.val.maxVisible = hasMaxY ? _Number(maxValue) : void 0 } if (isWinlossType) { rangeData.val.minVisible = hasMinY ? _max(rangeData.val.minVisible, WINLOSS_MIN_RANGE) : void 0; rangeData.val.maxVisible = hasMaxY ? _min(rangeData.val.maxVisible, WINLOSS_MAX_RANGE) : void 0 } } if (series.getPoints().length > 1) { if (isBarType) { argCoef = (rangeData.arg.max - rangeData.arg.min) * DEFAULT_ARGUMENT_RANGE_MARGIN; rangeData.arg.min = rangeData.arg.min - argCoef; rangeData.arg.max = rangeData.arg.max + argCoef } else { rangeData.arg.stick = true } } rangeData.arg.categories = that._groupsDataCategories; that._ranges = rangeData }, _getBarWidth: function(pointsCount) { var that = this, canvas = that._canvas, intervalWidth = pointsCount * DEFAULT_BAR_INTERVAL, rangeWidth = canvas.width - canvas.left - canvas.right - intervalWidth, width = _round(rangeWidth / pointsCount); if (width < MIN_BAR_WIDTH) { width = MIN_BAR_WIDTH } if (width > MAX_BAR_WIDTH) { width = MAX_BAR_WIDTH } return width }, _correctPoints: function() { var barWidth, i, that = this, seriesType = that._allOptions.type, seriesPoints = that._series.getPoints(), pointsLength = seriesPoints.length; if ("bar" === seriesType || "winloss" === seriesType) { barWidth = that._getBarWidth(pointsLength); for (i = 0; i < pointsLength; i++) { seriesPoints[i].correctCoordinates({ width: barWidth, offset: 0 }) } } }, _drawSeries: function() { var that = this; if (that._simpleDataSource.length > 0) { that._correctPoints(); that._series.draw(); that._seriesGroup.append(that._renderer.root) } }, _isTooltipEnabled: function() { return !!this._simpleDataSource.length }, _getTooltipData: function() { var that = this, options = that._allOptions, dataSource = that._winlossDataSource || that._simpleDataSource, tooltip = that._tooltip; if (0 === dataSource.length) { return {} } var minMax = that._minMaxIndexes, valueField = options.valueField, first = dataSource[0][valueField], last = dataSource[dataSource.length - 1][valueField], min = dataSource[minMax.minIndex][valueField], max = dataSource[minMax.maxIndex][valueField], formattedFirst = tooltip.formatValue(first), formattedLast = tooltip.formatValue(last), formattedMin = tooltip.formatValue(min), formattedMax = tooltip.formatValue(max), customizeObject = { firstValue: formattedFirst, lastValue: formattedLast, minValue: formattedMin, maxValue: formattedMax, originalFirstValue: first, originalLastValue: last, originalMinValue: min, originalMaxValue: max, valueText: ["Start:", formattedFirst, "End:", formattedLast, "Min:", formattedMin, "Max:", formattedMax] }; if ("winloss" === options.type) { customizeObject.originalThresholdValue = options.winlossThreshold; customizeObject.thresholdValue = tooltip.formatValue(options.winlossThreshold) } return customizeObject } }); _map(["lineColor", "lineWidth", "areaOpacity", "minColor", "maxColor", "barPositiveColor", "barNegativeColor", "winColor", "lessColor", "firstLastColor", "pointSymbol", "pointColor", "pointSize", "type", "argumentField", "valueField", "winlossThreshold", "showFirstLast", "showMinMax", "ignoreEmptyPoints", "minValue", "maxValue"], function(name) { dxSparkline.prototype._optionChangesMap[name] = "OPTIONS" }); __webpack_require__( /*! ../../core/component_registrator */ 57)("dxSparkline", dxSparkline); module.exports = dxSparkline; dxSparkline.addPlugin(__webpack_require__( /*! ../core/data_source */ 561).plugin) }, /*!*********************************************!*\ !*** ./js/viz/sparklines/base_sparkline.js ***! \*********************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), commonUtils = __webpack_require__( /*! ../../core/utils/common */ 14), BaseWidget = __webpack_require__( /*! ../core/base_widget */ 515), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, DEFAULT_LINE_SPACING = 2, DEFAULT_EVENTS_DELAY = 200, TOUCH_EVENTS_DELAY = 1e3, eventUtils = __webpack_require__( /*! ../../events/utils */ 71), wheelEvent = __webpack_require__( /*! ../../events/core/wheel */ 85), baseThemeManagerModule = __webpack_require__( /*! ../core/base_theme_manager */ 550), translator2DModule = __webpack_require__( /*! ../translators/translator2d */ 571), _abs = Math.abs, _extend = extend, _noop = commonUtils.noop; function generateDefaultCustomizeTooltipCallback(fontOptions, rtlEnabled) { var lineSpacing = fontOptions.lineSpacing, lineHeight = (void 0 !== lineSpacing && null !== lineSpacing ? lineSpacing : DEFAULT_LINE_SPACING) + fontOptions.size; return function(customizeObject) { var html = "", vt = customizeObject.valueText; for (var i = 0; i < vt.length; i += 2) { html += "<tr><td>" + vt[i] + "</td><td style='width: 15px'></td><td style='text-align: " + (rtlEnabled ? "left" : "right") + "'>" + vt[i + 1] + "</td></tr>" } return { html: "<table style='border-spacing:0px; line-height: " + lineHeight + "px'>" + html + "</table>" } } } function generateCustomizeTooltipCallback(customizeTooltip, fontOptions, rtlEnabled) { var defaultCustomizeTooltip = generateDefaultCustomizeTooltipCallback(fontOptions, rtlEnabled); if (commonUtils.isFunction(customizeTooltip)) { return function(customizeObject) { var res = customizeTooltip.call(customizeObject, customizeObject); if (!("html" in res) && !("text" in res)) { _extend(res, defaultCustomizeTooltip.call(customizeObject, customizeObject)) } return res } } else { return defaultCustomizeTooltip } } function createAxis(isHorizontal) { var translator = new translator2DModule.Translator2D({}, {}, { isHorizontal: !!isHorizontal }); return { getTranslator: function() { return translator }, update: function(range, canvas) { translator.update(range, canvas) }, getViewport: function() { return } } } var BaseSparkline = BaseWidget.inherit({ _setDeprecatedOptions: function() { this.callBase(); _extend(this._deprecatedOptions, { "tooltip.verticalAlignment": { since: "15.1", message: "Now tooltips are aligned automatically" }, "tooltip.horizontalAlignment": { since: "15.1", message: "Now tooltips are aligned automatically" } }) }, _getLayoutItems: _noop, _useLinks: false, _themeDependentChanges: ["OPTIONS"], _initCore: function() { var that = this; that._tooltipTracker = that._renderer.root; that._tooltipTracker.attr({ "pointer-events": "visible" }); that._createHtmlElements(); that._initTooltipEvents(); that._argumentAxis = createAxis(true); that._valueAxis = createAxis() }, _getDefaultSize: function() { return this._defaultSize }, _disposeCore: function() { this._disposeWidgetElements(); this._disposeTooltipEvents(); this._ranges = null }, _optionChangesOrder: ["OPTIONS"], _change_OPTIONS: function() { this._prepareOptions(); this._change(["UPDATE"]) }, _customChangesOrder: ["UPDATE"], _change_UPDATE: function() { this._update() }, _update: function() { var that = this; if (that._tooltipShown) { that._tooltipShown = false; that._tooltip.hide() } that._cleanWidgetElements(); that._updateWidgetElements(); that._drawWidgetElements() }, _updateWidgetElements: function() { this._updateRange(); this._argumentAxis.update(this._ranges.arg, this._canvas); this._valueAxis.update(this._ranges.val, this._canvas) }, _applySize: function(rect) { this._allOptions.size = { width: rect[2] - rect[0], height: rect[3] - rect[1] }; this._change(["UPDATE"]) }, _setupResizeHandler: _noop, _prepareOptions: function() { return _extend(true, {}, this._themeManager.theme(), this.option()) }, _createThemeManager: function() { var themeManager = new baseThemeManagerModule.BaseThemeManager; themeManager._themeSection = this._widgetType; themeManager._fontFields = ["tooltip.font"]; return themeManager }, _getTooltipCoords: function() { var canvas = this._canvas, rootOffset = this._renderer.getRootOffset(); return { x: canvas.width / 2 + rootOffset.left, y: canvas.height / 2 + rootOffset.top } }, _initTooltipEvents: function() { var that = this, data = { widget: that }; that._showTooltipCallback = function() { var tooltip; that._showTooltipTimeout = null; if (!that._tooltipShown) { that._tooltipShown = true; tooltip = that._getTooltip(); tooltip.isEnabled() && that._tooltip.show(that._getTooltipData(), that._getTooltipCoords(), {}) } that._DEBUG_showCallback && that._DEBUG_showCallback() }; that._hideTooltipCallback = function() { var tooltipWasShown = that._tooltipShown; that._hideTooltipTimeout = null; if (that._tooltipShown) { that._tooltipShown = false; that._tooltip.hide() } that._DEBUG_hideCallback && that._DEBUG_hideCallback(tooltipWasShown) }; that._disposeCallbacks = function() { that = that._showTooltipCallback = that._hideTooltipCallback = that._disposeCallbacks = null }; that._tooltipTracker.on(mouseEvents, data).on(touchEvents, data).on(mouseWheelEvents, data); that._tooltipTracker.on(menuEvents) }, _disposeTooltipEvents: function() { var that = this; clearTimeout(that._showTooltipTimeout); clearTimeout(that._hideTooltipTimeout); that._tooltipTracker.off(); that._disposeCallbacks() }, _getTooltip: function() { var that = this; if (!that._tooltip) { _initTooltip.apply(this, arguments); that._setTooltipRendererOptions(that._tooltipRendererOptions); that._tooltipRendererOptions = null; that._setTooltipOptions() } return that._tooltip } }); var menuEvents = { "contextmenu.sparkline-tooltip": function(event) { if (eventUtils.isTouchEvent(event) || eventUtils.isPointerEvent(event)) { event.preventDefault() } }, "MSHoldVisual.sparkline-tooltip": function(event) { event.preventDefault() } }; var mouseEvents = { "mouseover.sparkline-tooltip": function(event) { isPointerDownCalled = false; var widget = event.data.widget; widget._x = event.pageX; widget._y = event.pageY; widget._tooltipTracker.off(mouseMoveEvents).on(mouseMoveEvents, event.data); widget._showTooltip(DEFAULT_EVENTS_DELAY) }, "mouseout.sparkline-tooltip": function(event) { if (isPointerDownCalled) { return } var widget = event.data.widget; widget._tooltipTracker.off(mouseMoveEvents); widget._hideTooltip(DEFAULT_EVENTS_DELAY) } }; var mouseWheelEvents = {}; mouseWheelEvents[wheelEvent.name + ".sparkline-tooltip"] = function(event) { event.data.widget._hideTooltip() }; var mouseMoveEvents = { "mousemove.sparkline-tooltip": function(event) { var widget = event.data.widget; if (widget._showTooltipTimeout && (_abs(widget._x - event.pageX) > 3 || _abs(widget._y - event.pageY) > 3)) { widget._x = event.pageX; widget._y = event.pageY; widget._showTooltip(DEFAULT_EVENTS_DELAY) } } }; var active_touch_tooltip_widget = null, touchStartTooltipProcessing = function(event) { event.preventDefault(); var widget = active_touch_tooltip_widget; if (widget && widget !== event.data.widget) { widget._hideTooltip(DEFAULT_EVENTS_DELAY) } widget = active_touch_tooltip_widget = event.data.widget; widget._showTooltip(TOUCH_EVENTS_DELAY); widget._touch = true }, touchStartDocumentProcessing = function() { var widget = active_touch_tooltip_widget; if (widget) { if (!widget._touch) { widget._hideTooltip(DEFAULT_EVENTS_DELAY); active_touch_tooltip_widget = null } widget._touch = null } }, touchEndDocumentProcessing = function() { var widget = active_touch_tooltip_widget; if (widget) { if (widget._showTooltipTimeout) { widget._hideTooltip(DEFAULT_EVENTS_DELAY); active_touch_tooltip_widget = null } } }, isPointerDownCalled = false; var touchEvents = { "pointerdown.sparkline-tooltip": touchStartTooltipProcessing, "touchstart.sparkline-tooltip": touchStartTooltipProcessing }; $(document).on({ "pointerdown.sparkline-tooltip": function() { isPointerDownCalled = true; touchStartDocumentProcessing() }, "touchstart.sparkline-tooltip": touchStartDocumentProcessing, "pointerup.sparkline-tooltip": touchEndDocumentProcessing, "touchend.sparkline-tooltip": touchEndDocumentProcessing }); module.exports = BaseSparkline; module.exports._DEBUG_reset = function() { active_touch_tooltip_widget = null }; BaseSparkline.addPlugin(__webpack_require__( /*! ../core/tooltip */ 559).plugin); var _initTooltip = BaseSparkline.prototype._initTooltip; BaseSparkline.prototype._initTooltip = _noop; var _disposeTooltip = BaseSparkline.prototype._disposeTooltip; BaseSparkline.prototype._disposeTooltip = function() { if (this._tooltip) { _disposeTooltip.apply(this, arguments) } }; BaseSparkline.prototype._setTooltipRendererOptions = function() { var options = this._getRendererOptions(); if (this._tooltip) { this._tooltip.setRendererOptions(options) } else { this._tooltipRendererOptions = options } }; BaseSparkline.prototype._setTooltipOptions = function() { var tooltip = this._tooltip, options = tooltip && this._getOption("tooltip"); tooltip && tooltip.update(_extend({}, options, { customizeTooltip: generateCustomizeTooltipCallback(options.customizeTooltip, options.font, this.option("rtlEnabled")), enabled: options.enabled && this._isTooltipEnabled() })) }; BaseSparkline.prototype._showTooltip = function(delay) { var that = this; ++that._DEBUG_clearHideTooltipTimeout; clearTimeout(that._hideTooltipTimeout); that._hideTooltipTimeout = null; clearTimeout(that._showTooltipTimeout); ++that._DEBUG_showTooltipTimeoutSet; that._showTooltipTimeout = setTimeout(that._showTooltipCallback, delay) }; BaseSparkline.prototype._hideTooltip = function(delay) { var that = this; ++that._DEBUG_clearShowTooltipTimeout; clearTimeout(that._showTooltipTimeout); that._showTooltipTimeout = null; clearTimeout(that._hideTooltipTimeout); if (delay) { ++that._DEBUG_hideTooltipTimeoutSet; that._hideTooltipTimeout = setTimeout(that._hideTooltipCallback, delay) } else { that._hideTooltipCallback() } }; var exportPlugin = extend(true, {}, __webpack_require__( /*! ../core/export */ 511).plugin, { init: _noop, dispose: _noop, customize: null, members: { _getExportMenuOptions: null } }); BaseSparkline.addPlugin(exportPlugin) }, /*!**************************!*\ !*** ./js/viz/bullet.js ***! \**************************/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__( /*! ./sparklines/bullet */ 631) }, /*!*************************************!*\ !*** ./js/viz/sparklines/bullet.js ***! \*************************************/ function(module, exports, __webpack_require__) { var $ = __webpack_require__( /*! ../../core/renderer */ 9), BaseSparkline = __webpack_require__( /*! ./base_sparkline */ 629), TARGET_MIN_Y = .02, TARGET_MAX_Y = .98, BAR_VALUE_MIN_Y = .1, BAR_VALUE_MAX_Y = .9, DEFAULT_CANVAS_WIDTH = 300, DEFAULT_CANVAS_HEIGHT = 30, DEFAULT_HORIZONTAL_MARGIN = 1, DEFAULT_VERTICAL_MARGIN = 2, _Number = Number, _isFinite = isFinite; var dxBullet = BaseSparkline.inherit({ _rootClassPrefix: "dxb", _rootClass: "dxb-bullet", _widgetType: "bullet", _defaultSize: { width: DEFAULT_CANVAS_WIDTH, height: DEFAULT_CANVAS_HEIGHT, left: DEFAULT_HORIZONTAL_MARGIN, right: DEFAULT_HORIZONTAL_MARGIN, top: DEFAULT_VERTICAL_MARGIN, bottom: DEFAULT_VERTICAL_MARGIN }, _disposeWidgetElements: function() { delete this._zeroLevelPath; delete this._targetPath; delete this._barValuePath }, _cleanWidgetElements: function() { this._zeroLevelPath.remove(); this._targetPath.remove(); this._barValuePath.remove() }, _drawWidgetElements: function() { this._drawBullet(); this._drawn() }, _createHtmlElements: function() { var renderer = this._renderer; this._zeroLevelPath = renderer.path(void 0, "line").attr({ "class": "dxb-zero-level", "stroke-linecap": "square" }); this._targetPath = renderer.path(void 0, "line").attr({ "class": "dxb-target", "stroke-linecap": "square" }); this._barValuePath = renderer.path(void 0, "line").attr({ "class": "dxb-bar-value", "stroke-linecap": "square" }) }, _prepareOptions: function() { var options, startScaleValue, endScaleValue, level, value, target, isValueUndefined, isTargetUndefined, that = this; that._allOptions = options = that.callBase(); isValueUndefined = void 0 === that._allOptions.value; isTargetUndefined = void 0 === that._allOptions.target; that._tooltipEnabled = !(isValueUndefined && isTargetUndefined); if (isValueUndefined) { that._allOptions.value = 0 } if (isTargetUndefined) { that._allOptions.target = 0 } options.value = value = _Number(options.value); options.target = target = _Number(options.target); if (void 0 === that._allOptions.startScaleValue) { that._allOptions.startScaleValue = target < value ? target : value; that._allOptions.startScaleValue = that._allOptions.startScaleValue < 0 ? that._allOptions.startScaleValue : 0 } if (void 0 === that._allOptions.endScaleValue) { that._allOptions.endScaleValue = target > value ? target : value } options.startScaleValue = startScaleValue = _Number(options.startScaleValue); options.endScaleValue = endScaleValue = _Number(options.endScaleValue); if (endScaleValue < startScaleValue) { level = endScaleValue; that._allOptions.endScaleValue = startScaleValue; that._allOptions.startScaleValue = level; that._allOptions.inverted = true } }, _updateRange: function() { var that = this, options = that._allOptions; that._ranges = { arg: { invert: options.inverted, min: options.startScaleValue, max: options.endScaleValue, axisType: "continuous", dataType: "numeric" }, val: { min: 0, max: 1, axisType: "continuous", dataType: "numeric" } } }, _drawBullet: function() { var that = this, options = that._allOptions, isValidBounds = options.startScaleValue !== options.endScaleValue, isValidMin = _isFinite(options.startScaleValue), isValidMax = _isFinite(options.endScaleValue), isValidValue = _isFinite(options.value), isValidTarget = _isFinite(options.target); if (isValidBounds && isValidMax && isValidMin && isValidTarget && isValidValue) { this._drawBarValue(); this._drawTarget(); this._drawZeroLevel() } }, _getTargetParams: function() { var that = this, options = that._allOptions, translatorY = that._valueAxis.getTranslator(), x = that._argumentAxis.getTranslator().translate(options.target); return { points: [x, translatorY.translate(TARGET_MIN_Y), x, translatorY.translate(TARGET_MAX_Y)], stroke: options.targetColor, "stroke-width": options.targetWidth } }, _getBarValueParams: function() { var x1, x2, that = this, options = that._allOptions, translatorX = that._argumentAxis.getTranslator(), translatorY = that._valueAxis.getTranslator(), startLevel = options.startScaleValue, endLevel = options.endScaleValue, value = options.value, y2 = translatorY.translate(BAR_VALUE_MIN_Y), y1 = translatorY.translate(BAR_VALUE_MAX_Y); if (value > 0) { x1 = startLevel <= 0 ? 0 : startLevel; x2 = value >= endLevel ? endLevel : value < x1 ? x1 : value } else { x1 = endLevel >= 0 ? 0 : endLevel; x2 = value < startLevel ? startLevel : value > x1 ? x1 : value } x1 = translatorX.translate(x1); x2 = translatorX.translate(x2); return { points: [x1, y1, x2, y1, x2, y2, x1, y2], fill: options.color } }, _getZeroLevelParams: function() { var that = this, translatorY = that._valueAxis.getTranslator(), x = that._argumentAxis.getTranslator().translate(0); return { points: [x, translatorY.translate(TARGET_MIN_Y), x, translatorY.translate(TARGET_MAX_Y)], stroke: that._allOptions.targetColor, "stroke-width": 1 } }, _drawZeroLevel: function() { var that = this, options = that._allOptions; if (0 > options.endScaleValue || 0 < options.startScaleValue || !options.showZeroLevel) { return } that._zeroLevelPath.attr(that._getZeroLevelParams()).sharp().append(that._renderer.root) }, _drawTarget: function() { var that = this, options = that._allOptions, target = options.target; if (target > options.endScaleValue || target < options.startScaleValue || !options.showTarget) { return } that._targetPath.attr(that._getTargetParams()).sharp().append(that._renderer.root) }, _drawBarValue: function() { this._barValuePath.attr(this._getBarValueParams()).append(this._renderer.root) }, _getTooltipCoords: function() { var canvas = this._canvas, rootOffset = this._renderer.getRootOffset(), bBox = this._barValuePath.getBBox(); return { x: bBox.x + bBox.width / 2 + rootOffset.left, y: canvas.height / 2 + rootOffset.top } }, _getTooltipData: function() { var that = this, tooltip = that._tooltip, options = that._allOptions, value = options.value, target = options.target, valueText = tooltip.formatValue(value), targetText = tooltip.formatValue(target); return { originalValue: value, originalTarget: target, value: valueText, target: targetText, valueText: ["Actual Value:", valueText, "Target Value:", targetText] } }, _isTooltipEnabled: function() { return this._tooltipEnabled } }); $.each(["color", "targetColor", "targetWidth", "showTarget", "showZeroLevel", "value", "target", "startScaleValue", "endScaleValue"], function(_, name) { dxBullet.prototype._optionChangesMap[name] = "OPTIONS" }); __webpack_require__( /*! ../../core/component_registrator */ 57)("dxBullet", dxBullet); module.exports = dxBullet }, /*!****************************!*\ !*** ./js/viz/tree_map.js ***! \****************************/ function(module, exports, __webpack_require__) { module.exports = __webpack_require__( /*! ./tree_map/tree_map */ 633) }, /*!*************************************!*\ !*** ./js/viz/tree_map/tree_map.js ***! \*************************************/ function(module, exports, __webpack_require__) { var dxTreeMap = module.exports = __webpack_require__( /*! ./tree_map.base */ 634); __webpack_require__( /*! ./tiling.squarified */ 639); __webpack_require__( /*! ./tiling.strip */ 642); __webpack_require__( /*! ./tiling.slice_and_dice */ 643); __webpack_require__( /*! ./tiling.rotated_slice_and_dice */ 644); __webpack_require__( /*! ./colorizing.discrete */ 641); __webpack_require__( /*! ./colorizing.gradient */ 645); __webpack_require__( /*! ./colorizing.range */ 646); __webpack_require__( /*! ./api */ 647); __webpack_require__( /*! ./hover */ 648); __webpack_require__( /*! ./selection */ 650); __webpack_require__( /*! ./tooltip */ 651); __webpack_require__( /*! ./tracker */ 652); __webpack_require__( /*! ./drilldown */ 653); __webpack_require__( /*! ./plain_data_source */ 654); dxTreeMap.addPlugin(__webpack_require__( /*! ../core/export */ 511).plugin); dxTreeMap.addPlugin(__webpack_require__( /*! ../core/title */ 558).plugin); dxTreeMap.addPlugin(__webpack_require__( /*! ../core/loading_indicator */ 560).plugin) }, /*!******************************************!*\ !*** ./js/viz/tree_map/tree_map.base.js ***! \******************************************/ function(module, exports, __webpack_require__) { var common = __webpack_require__( /*! ./common */ 635), Node = __webpack_require__( /*! ./node */ 636), _getTilingAlgorithm = __webpack_require__( /*! ./tiling */ 637).getAlgorithm, _getColorizer = __webpack_require__( /*! ./colorizing */ 638).getColorizer, _patchFontOptions = __webpack_require__( /*! ../core/utils */ 509).patchFontOptions, _buildRectAppearance = common.buildRectAppearance, _buildTextAppearance = common.buildTextAppearance, _noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, _max = Math.max, directions = { lefttoprightbottom: [1, 1], leftbottomrighttop: [1, -1], righttopleftbottom: [-1, 1], rightbottomlefttop: [-1, -1] }; __webpack_require__( /*! ./tiling.squarified */ 639); __webpack_require__( /*! ./tiling */ 637).setDefaultAlgorithm("squarified"); __webpack_require__( /*! ./colorizing.discrete */ 641); __webpack_require__( /*! ./colorizing */ 638).setDefaultColorizer("discrete"); function pickPositiveInteger(val) { return val > 0 ? Math.round(val) : 0 } var dxTreeMap = __webpack_require__( /*! ../core/base_widget */ 515).inherit({ _handlers: { beginBuildNodes: _noop, buildNode: _noop, endBuildNodes: _noop, setTrackerData: _noop, calculateState: function(options) { return _buildRectAppearance(options) } }, _rootClass: "dxtm-tree-map", _rootClassPrefix: "dxtm", _getDefaultSize: function() { return { width: 400, height: 400 } }, _createThemeManager: function() { return new ThemeManager }, _init: function() { var that = this; that._rectOffsets = {}; that._handlers = Object.create(that._handlers); that._context = { suspend: function() { if (!that._applyingChanges) { that._suspendChanges() } }, resume: function() { if (!that._applyingChanges) { that._resumeChanges() } }, change: function(codes) { that._change(codes) }, settings: [{}, {}], calculateState: that._handlers.calculateState, calculateLabelState: _buildTextAppearance }; that._root = that._topNode = { nodes: [] }; that.callBase.apply(that, arguments) }, _initialChanges: ["DATA_SOURCE"], _initCore: function() { var that = this, renderer = that._renderer; that._createProxyType(); that._tilesGroup = renderer.g().linkOn(renderer.root, "tiles").linkAppend(); that._labelsGroup = renderer.g().attr({ align: "left" }).linkOn(renderer.root, "labels").linkAppend() }, _createProxyType: _noop, _disposeCore: function() { var that = this; that._filter && that._filter.dispose(); that._labelsGroup.linkOff(); that._tilesGroup.linkOff() }, _applySize: function(rect) { this._tilingRect = rect.slice(); this._change(["TILING"]) }, _optionChangesMap: { dataSource: "DATA_SOURCE", valueField: "NODES_CREATE", childrenField: "NODES_CREATE", colorField: "TILES", colorizer: "TILES", labelField: "LABELS", tile: "TILE_SETTINGS", group: "GROUP_SETTINGS", maxDepth: "MAX_DEPTH", layoutAlgorithm: "TILING", layoutDirection: "TILING", resolveLabelOverflow: "LABEL_OVERFLOW" }, _themeDependentChanges: ["TILE_SETTINGS", "GROUP_SETTINGS", "MAX_DEPTH"], _changeDataSource: function() { var that = this; that._isDataExpected = that._isSyncData = true; that._updateDataSource(); that._isSyncData = false; if (that._isDataExpected) { that._suspendChanges() } }, _dataSourceChangedHandler: function() { var that = this; if (that._isDataExpected) { that._isDataExpected = false; that._change(["NODES_CREATE"]); if (!that._isSyncData) { that._resumeChanges() } } else { that._requestChange(["NODES_CREATE"]) } }, _optionChangesOrder: ["DATA_SOURCE", "TILE_SETTINGS", "GROUP_SETTINGS", "MAX_DEPTH", "LABEL_OVERFLOW"], _change_DATA_SOURCE: function() { this._changeDataSource() }, _change_TILE_SETTINGS: function() { this._changeTileSettings() }, _change_GROUP_SETTINGS: function() { this._changeGroupSettings() }, _change_LABEL_OVERFLOW: function() { this._changeTileSettings(); this._changeGroupSettings() }, _change_MAX_DEPTH: function() { this._changeMaxDepth() }, _customChangesOrder: ["NODES_CREATE", "NODES_RESET", "TILES", "LABELS", "TILING", "LABELS_LAYOUT"], _change_NODES_CREATE: function() { this._buildNodes() }, _change_NODES_RESET: function() { this._resetNodes() }, _change_TILES: function() { this._applyTilesAppearance() }, _change_LABELS: function() { this._applyLabelsAppearance() }, _change_TILING: function() { this._performTiling() }, _change_LABELS_LAYOUT: function() { this._performLabelsLayout() }, _applyChanges: function() { var that = this; that.callBase.apply(that, arguments); if (!that._isDataExpected) { that._drawn() } that._context.forceReset = false }, _buildNodes: function() { var processedData, that = this, root = that._root = that._topNode = new Node; root._id = 0; root.parent = {}; root.data = {}; root.level = root.index = -1; root.ctx = that._context; root.label = null; that._nodes = [root]; that._handlers.beginBuildNodes(); processedData = that._processDataSourceItems(that._dataSourceItems() || []); traverseDataItems(root, processedData.items, 0, { itemsField: !processedData.isPlain && that._getOption("childrenField", true) || "items", valueField: that._getOption("valueField", true) || "value", buildNode: that._handlers.buildNode, ctx: that._context, nodes: that._nodes }); that._onNodesCreated(); that._handlers.endBuildNodes(); that._change(["NODES_RESET"]) }, _onNodesCreated: common.empty, _processDataSourceItems: function(items) { return { items: items, isPlain: false } }, _changeTileSettings: function() { var that = this, options = that._getOption("tile"), offsets = that._rectOffsets, borderWidth = pickPositiveInteger(options.border.width), edgeOffset = borderWidth / 2, innerOffset = 1 & borderWidth ? .5 : 0, labelOptions = options.label, settings = that._context.settings[0]; that._change(["TILES", "LABELS"]); settings.state = that._handlers.calculateState(options); that._filter = that._filter || that._renderer.shadowFilter("-50%", "-50%", "200%", "200%"); that._filter.attr(labelOptions.shadow); that._calculateLabelSettings(settings, labelOptions, that._filter.id); if (offsets.tileEdge !== edgeOffset || offsets.tileInner !== innerOffset) { offsets.tileEdge = edgeOffset; offsets.tileInner = innerOffset; that._change(["TILING"]) } }, _changeGroupSettings: function() { var that = this, options = that._getOption("group"), labelOptions = options.label, offsets = that._rectOffsets, borderWidth = pickPositiveInteger(options.border.width), edgeOffset = borderWidth / 2, innerOffset = 1 & borderWidth ? .5 : 0, headerHeight = 0, groupPadding = pickPositiveInteger(options.padding), settings = that._context.settings[1]; that._change(["TILES", "LABELS"]); settings.state = that._handlers.calculateState(options); that._calculateLabelSettings(settings, labelOptions); if (options.headerHeight >= 0) { headerHeight = pickPositiveInteger(options.headerHeight) } else { headerHeight = settings.labelParams.height + 2 * pickPositiveInteger(labelOptions.paddingTopBottom) } if (that._headerHeight !== headerHeight) { that._headerHeight = headerHeight; that._change(["TILING"]) } if (that._groupPadding !== groupPadding) { that._groupPadding = groupPadding; that._change(["TILING"]) } if (offsets.headerEdge !== edgeOffset || offsets.headerInner !== innerOffset) { offsets.headerEdge = edgeOffset; offsets.headerInner = innerOffset; that._change(["TILING"]) } }, _calculateLabelSettings: function(settings, options, filter) { var bBox = this._getTextBBox(options.font), paddingLeftRight = pickPositiveInteger(options.paddingLeftRight), paddingTopBottom = pickPositiveInteger(options.paddingTopBottom); settings.labelState = _buildTextAppearance(options, filter); settings.labelState.visible = !("visible" in options) || !!options.visible; settings.labelParams = { unitWidth: bBox.width, height: bBox.height, hOffset: paddingLeftRight, vOffset: -bBox.y + paddingTopBottom, rtlEnabled: this._getOption("rtlEnabled", true), paddingTopBottom: paddingTopBottom, paddingLeftRight: paddingLeftRight, resolveLabelOverflow: this._getOption("resolveLabelOverflow", true) } }, _changeMaxDepth: function() { var maxDepth = this._getOption("maxDepth", true); maxDepth = maxDepth >= 1 ? Math.round(maxDepth) : 1 / 0; if (this._maxDepth !== maxDepth) { this._maxDepth = maxDepth; this._change(["NODES_RESET"]) } }, _resetNodes: function() { var that = this; that._tilesGroup.clear(); that._renderer.initHatching(); that._context.forceReset = true; that._context.minLevel = that._topNode.level + 1; that._context.maxLevel = that._context.minLevel + that._maxDepth - 1; that._change(["TILES", "LABELS", "TILING"]) }, _processNodes: function(context, process) { processNodes(context, this._topNode, process) }, _applyTilesAppearance: function() { var that = this, colorizer = _getColorizer(that._getOption("colorizer"), that._themeManager, that._topNode); that._processNodes({ renderer: that._renderer, group: that._tilesGroup, setTrackerData: that._handlers.setTrackerData, colorField: that._getOption("colorField", true) || "color", getColor: colorizer }, processTileAppearance) }, _applyLabelsAppearance: function() { var that = this; that._labelsGroup.clear(); that._processNodes({ renderer: that._renderer, group: that._labelsGroup, setTrackerData: that._handlers.setTrackerData, labelField: that._getOption("labelField", true) || "name" }, processLabelAppearance); that._change(["LABELS_LAYOUT"]) }, _performTiling: function() { var that = this, context = { algorithm: _getTilingAlgorithm(that._getOption("layoutAlgorithm", true)), directions: directions[String(that._getOption("layoutDirection", true)).toLowerCase()] || directions.lefttoprightbottom, headerHeight: that._headerHeight, groupPadding: that._groupPadding, rectOffsets: that._rectOffsets }; that._topNode.innerRect = that._tilingRect; calculateRects(context, that._topNode); that._processNodes(context, processTiling); that._change(["LABELS_LAYOUT"]); that._onTilingPerformed() }, _onTilingPerformed: common.empty, _performLabelsLayout: function() { this._processNodes(null, processLabelsLayout) }, _getTextBBox: function(fontOptions) { var bBox, renderer = this._renderer, text = this._textForCalculations || renderer.text("0", 0, 0); this._textForCalculations = text; text.css(_patchFontOptions(fontOptions)).append(renderer.root); bBox = text.getBBox(); text.remove(); return bBox } }); function traverseDataItems(root, dataItems, level, params) { var node, i, dataItem, items, nodes = [], allNodes = params.nodes, ii = dataItems.length, totalValue = 0; for (i = 0; i < ii; ++i) { dataItem = dataItems[i]; node = new Node; node._id = allNodes.length; node.ctx = params.ctx; node.parent = root; node.level = level; node.index = nodes.length; node.data = dataItem; params.buildNode(node); allNodes.push(node); nodes.push(node); items = dataItem[params.itemsField]; if (items && items.length) { traverseDataItems(node, items, level + 1, params) } if (dataItem[params.valueField] > 0) { node.value = Number(dataItem[params.valueField]) } totalValue += node.value } root.nodes = nodes; root.value = totalValue } function processNodes(context, root, process) { var node, i, nodes = root.nodes, ii = nodes.length; for (i = 0; i < ii; ++i) { node = nodes[i]; process(context, node); if (node.isNode()) { processNodes(context, node, process) } } } function processTileAppearance(context, node) { node.color = node.data[context.colorField] || context.getColor(node) || node.parent.color; node.updateStyles(); node.tile = !node.ctx.forceReset && node.tile || createTile[Number(node.isNode())](context, node); node.applyState() } var createTile = [createLeaf, createGroup]; function createLeaf(context, node) { var tile = context.renderer.simpleRect().append(context.group); context.setTrackerData(node, tile); return tile } function createGroup(context, node) { var outer = context.renderer.simpleRect().append(context.group), inner = context.renderer.simpleRect().append(context.group); context.setTrackerData(node, inner); return { outer: outer, inner: inner } } function processLabelAppearance(context, node) { node.updateLabelStyle(); if (node.labelState.visible) { createLabel(context, node, node.labelState, node.labelParams) } } function createLabel(context, currentNode, settings, params) { var textData = currentNode.data[context.labelField]; currentNode.label = textData ? String(textData) : null; textData = currentNode.customLabel || currentNode.label; if (textData) { currentNode.text = context.renderer.text(textData).attr(settings.attr).css(settings.css).append(context.group); context.setTrackerData(currentNode, currentNode.text); currentNode.textWidth = params.unitWidth * textData.length } } var emptyRect = [0, 0, 0, 0]; function calculateRects(context, root) { var i, nodes = root.nodes, items = [], rects = [], sum = 0, ii = items.length = rects.length = nodes.length; for (i = 0; i < ii; ++i) { sum += nodes[i].value; items[i] = { value: nodes[i].value, i: i } } if (sum > 0) { context.algorithm({ items: items.slice(), sum: sum, rect: root.innerRect.slice(), isRotated: 1 & nodes[0].level, directions: context.directions }) } for (i = 0; i < ii; ++i) { rects[i] = items[i].rect || emptyRect } root.rects = rects } function processTiling(context, node) { var headerHeight, rect = node.parent.rects[node.index], rectOffsets = context.rectOffsets; if (node.isNode()) { setRectAttrs(node.tile.outer, buildTileRect(rect, node.parent.innerRect, rectOffsets.headerEdge, rectOffsets.headerInner)); rect = marginateRect(rect, context.groupPadding); headerHeight = Math.min(context.headerHeight, rect[3] - rect[1]); node.rect = [rect[0], rect[1], rect[2], rect[1] + headerHeight]; setRectAttrs(node.tile.inner, marginateRect(node.rect, rectOffsets.headerEdge)); rect[1] += headerHeight; node.innerRect = rect; calculateRects(context, node) } else { node.rect = rect; setRectAttrs(node.tile, buildTileRect(rect, node.parent.innerRect, rectOffsets.tileEdge, rectOffsets.tileInner)) } } function marginateRect(rect, margin) { return [rect[0] + margin, rect[1] + margin, rect[2] - margin, rect[3] - margin] } function buildTileRect(rect, outer, edgeOffset, innerOffset) { return [rect[0] + (rect[0] === outer[0] ? edgeOffset : +innerOffset), rect[1] + (rect[1] === outer[1] ? edgeOffset : +innerOffset), rect[2] - (rect[2] === outer[2] ? edgeOffset : -innerOffset), rect[3] - (rect[3] === outer[3] ? edgeOffset : -innerOffset)] } function setRectAttrs(element, rect) { element.attr({ x: rect[0], y: rect[1], width: _max(rect[2] - rect[0], 0), height: _max(rect[3] - rect[1], 0) }) } function processLabelsLayout(context, node) { if (node.text && node.labelState.visible) { layoutTextNode(node, node.labelParams) } } function layoutTextNode(node, params) { var rect = node.rect, hOffset = params.hOffset, effectiveWidth = rect[2] - rect[0] - params.paddingLeftRight, fitByHeight = params.height + params.paddingTopBottom < rect[3] - rect[1], fitByWidth = node.textWidth < effectiveWidth; if ("ellipsis" === params.resolveLabelOverflow && fitByHeight) { node.text.applyEllipsis(effectiveWidth); if (!fitByWidth) { fitByWidth = node.text.getBBox().width < effectiveWidth } } node.text.attr({ x: params.rtlEnabled ? rect[2] - hOffset : rect[0] + hOffset, y: rect[1] + params.vOffset, visibility: fitByHeight && fitByWidth ? "visible" : "hidden" }) } var ThemeManager = __webpack_require__( /*! ../core/base_theme_manager */ 550).BaseThemeManager.inherit({ _themeSection: "treeMap", _fontFields: ["tile.label.font", "group.label.font", "loadingIndicator.font", "title.font", "title.subtitle.font", "tooltip.font"] }); __webpack_require__( /*! ../../core/component_registrator */ 57)("dxTreeMap", dxTreeMap); module.exports = dxTreeMap; dxTreeMap.addPlugin(__webpack_require__( /*! ../core/data_source */ 561).plugin) }, /*!***********************************!*\ !*** ./js/viz/tree_map/common.js ***! \***********************************/ function(module, exports, __webpack_require__) { var _patchFontOptions = __webpack_require__( /*! ../core/utils */ 509).patchFontOptions; function empty() {} exports.empty = empty; function createChainExecutor() { var chain = []; executeChain.add = function(item) { chain.push(item) }; return executeChain; function executeChain() { var i, ii = chain.length; for (i = 0; i < ii; ++i) { chain[i].apply(this, arguments) } } } exports.expand = function(target, name, expander) { var current = target[name]; if (current.add) { current.add(expander) } else { if (current === empty) { current = expander } else { current = createChainExecutor(); current.add(target[name]); current.add(expander) } } target[name] = current }; exports.buildRectAppearance = function(option) { var border = option.border || {}; return { fill: option.color, opacity: option.opacity, stroke: border.color, "stroke-width": border.width, "stroke-opacity": border.opacity, hatching: option.hatching } }; exports.buildTextAppearance = function(options, filter) { return { attr: options["stroke-width"] ? { stroke: options.stroke, "stroke-width": options["stroke-width"], "stroke-opacity": options["stroke-opacity"], filter: filter } : {}, css: _patchFontOptions(options.font) } } }, /*!*********************************!*\ !*** ./js/viz/tree_map/node.js ***! \*********************************/ function(module, exports, __webpack_require__) { var _extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend; function Node() {} _extend(Node.prototype, { value: 0, isNode: function() { return !!(this.nodes && this.level < this.ctx.maxLevel) }, isActive: function() { var ctx = this.ctx; return this.level >= ctx.minLevel && this.level <= ctx.maxLevel }, updateStyles: function() { var that = this, isNode = Number(that.isNode()); that.state = that._buildState(that.ctx.settings[isNode].state, !isNode && that.color && { fill: that.color }) }, _buildState: function(state, extra) { var base = _extend({}, state); return extra ? _extend(base, extra) : base }, updateLabelStyle: function() { var settings = this.ctx.settings[Number(this.isNode())]; this.labelState = settings.labelState; this.labelParams = settings.labelParams }, _getState: function() { return this.state }, applyState: function() { updateTile[Number(this.isNode())](this.tile, this._getState()) } }); var updateTile = [updateLeaf, updateGroup]; function updateLeaf(content, attrs) { content.smartAttr(attrs) } function updateGroup(content, attrs) { content.outer.attr({ stroke: attrs.stroke, "stroke-width": attrs["stroke-width"], "stroke-opacity": attrs["stroke-opacity"] }); content.inner.smartAttr({ fill: attrs.fill, opacity: attrs.opacity, hatching: attrs.hatching }) } module.exports = Node }, /*!***********************************!*\ !*** ./js/viz/tree_map/tiling.js ***! \***********************************/ function(module, exports, __webpack_require__) { var defaultAlgorithm, _isFunction = __webpack_require__( /*! ../../core/utils/common */ 14).isFunction, _normalizeEnum = __webpack_require__( /*! ../core/utils */ 509).normalizeEnum, _round = Math.round, algorithms = {}; exports.getAlgorithm = function(value) { return algorithms[_normalizeEnum(value)] || _isFunction(value) && value || defaultAlgorithm }; exports.addAlgorithm = function(name, callback) { algorithms[name] = callback }; exports.setDefaultAlgorithm = function(name) { defaultAlgorithm = algorithms[name] }; var directionToIndexOffsets = {}; directionToIndexOffsets[-1] = [2, 0]; directionToIndexOffsets[1] = [0, 2]; var getStaticSideIndex = function(rect) { return rect[2] - rect[0] < rect[3] - rect[1] ? 0 : 1 }; exports.getStaticSideIndex = getStaticSideIndex; exports.buildSidesData = function(rect, directions, _staticSideIndex) { var staticSideIndex = void 0 !== _staticSideIndex ? _staticSideIndex : getStaticSideIndex(rect), variedSideIndex = 1 - staticSideIndex, staticSideDirection = directions[staticSideIndex], variedSideDirection = directions[variedSideIndex], staticSideIndexOffsets = directionToIndexOffsets[staticSideDirection], variedSideIndexOffsets = directionToIndexOffsets[variedSideDirection]; return { staticSide: rect[2 + staticSideIndex] - rect[staticSideIndex], variedSide: rect[2 + variedSideIndex] - rect[variedSideIndex], static1: staticSideIndex + staticSideIndexOffsets[0], static2: staticSideIndex + staticSideIndexOffsets[1], varied1: variedSideIndex + variedSideIndexOffsets[0], varied2: variedSideIndex + variedSideIndexOffsets[1], staticDir: staticSideDirection, variedDir: variedSideDirection } }; exports.calculateRectangles = function(nodes, head, totalRect, sidesData, rowData) { var i, ii, rect, delta, variedSidePart = [0, 0, 0, 0], static1 = sidesData.static1, static2 = sidesData.static2, position = totalRect[static1], dir = sidesData.staticDir, side = sidesData.staticSide, sum = rowData.sum; variedSidePart[sidesData.varied1] = totalRect[sidesData.varied1]; variedSidePart[sidesData.varied2] = totalRect[sidesData.varied1] + sidesData.variedDir * rowData.side; for (i = head, ii = head + rowData.count; i < ii; ++i) { rect = variedSidePart.slice(); rect[static1] = position; delta = _round(side * nodes[i].value / sum) || 0; sum -= nodes[i].value; side -= delta; position += dir * delta; rect[static2] = position; nodes[i].rect = rect } totalRect[sidesData.varied1] = variedSidePart[sidesData.varied2] } }, /*!***************************************!*\ !*** ./js/viz/tree_map/colorizing.js ***! \***************************************/ function(module, exports, __webpack_require__) { var defaultColorizerName, _normalizeEnum = __webpack_require__( /*! ../core/utils */ 509).normalizeEnum, _noop = __webpack_require__( /*! ../../core/utils/common */ 14).noop, colorizers = {}; function wrapLeafColorGetter(getter) { return function(node) { return !node.isNode() ? getter(node) : void 0 } } function wrapGroupColorGetter(getter) { return function(node) { var parent = !node.isNode() && node.parent; return parent ? parent._groupColor = parent._groupColor || getter(parent) : void 0 } } exports.getColorizer = function(options, themeManager, root) { var type = _normalizeEnum(options.type || defaultColorizerName), colorizer = colorizers[type] && colorizers[type](options, themeManager, root); return colorizer ? (options.colorizeGroups ? wrapGroupColorGetter : wrapLeafColorGetter)(colorizer) : _noop }; exports.addColorizer = function(name, colorizer) { colorizers[name] = colorizer }; exports.setDefaultColorizer = function(name) { defaultColorizerName = name }; function getValueAsColorCode(node) { return node.value } function createColorCodeGetter(colorCodeField) { return function(node) { return Number(node.data[colorCodeField]) } } exports.createColorCodeGetter = function(options) { return options.colorCodeField ? createColorCodeGetter(options.colorCodeField) : getValueAsColorCode } }, /*!**********************************************!*\ !*** ./js/viz/tree_map/tiling.squarified.js ***! \**********************************************/ function(module, exports, __webpack_require__) { var _max = Math.max, _squarify = __webpack_require__( /*! ./tiling.squarified.base */ 640); function accumulate(total, current) { return _max(total, current) } function squarified(data) { return _squarify(data, accumulate, false) } __webpack_require__( /*! ./tiling */ 637).addAlgorithm("squarified", squarified); module.exports = squarified }, /*!***************************************************!*\ !*** ./js/viz/tree_map/tiling.squarified.base.js ***! \***************************************************/ function(module, exports, __webpack_require__) { var _max = Math.max, _round = Math.round, tiling = __webpack_require__( /*! ./tiling */ 637); function compare(a, b) { return b.value - a.value } function getAspectRatio(value) { return _max(value, 1 / value) } function findAppropriateCollection(nodes, head, context) { var nextAspectRatio, nextSum, i, j, totalAspectRatio, bestAspectRatio = 1 / 0, sum = 0, ii = nodes.length, coeff = context.areaToValue / context.staticSide; for (i = head; i < ii;) { nextSum = sum + nodes[i].value; totalAspectRatio = context.staticSide / coeff / nextSum; nextAspectRatio = 0; for (j = head; j <= i; ++j) { nextAspectRatio = context.accumulate(nextAspectRatio, getAspectRatio(totalAspectRatio * nodes[j].value / nextSum), j - head + 1) } if (nextAspectRatio < bestAspectRatio) { bestAspectRatio = nextAspectRatio; sum = nextSum; ++i } else { break } } return { sum: sum, count: i - head, side: _round(coeff * sum) } } function getArea(rect) { return (rect[2] - rect[0]) * (rect[3] - rect[1]) } function doStep(nodes, head, context) { var sidesData = tiling.buildSidesData(context.rect, context.directions, context.staticSideIndex), area = getArea(context.rect), rowData = area > 0 ? findAppropriateCollection(nodes, head, { areaToValue: area / context.sum, accumulate: context.accumulate, staticSide: sidesData.staticSide }) : { sum: 1, side: sidesData.variedSide, count: nodes.length - head }; tiling.calculateRectangles(nodes, head, context.rect, sidesData, rowData); context.sum -= rowData.sum; return head + rowData.count } module.exports = function(data, accumulate, isFixedStaticSide) { var i, items = data.items, ii = items.length, context = { sum: data.sum, rect: data.rect, directions: data.directions, accumulate: accumulate }; if (isFixedStaticSide) { context.staticSideIndex = tiling.getStaticSideIndex(context.rect) } items.sort(compare); for (i = 0; i < ii;) { i = doStep(items, i, context) } } }, /*!************************************************!*\ !*** ./js/viz/tree_map/colorizing.discrete.js ***! \************************************************/ function(module, exports, __webpack_require__) { function discreteColorizer(options, themeManager, root) { var palette = themeManager.createPalette(options.palette, { useHighlight: true }); return (options.colorizeGroups ? discreteGroupColorizer : discreteLeafColorizer)(palette, root) } function generateColors(palette, colors, count) { var i; for (i = colors.length; i < count; ++i) { colors.push(palette.getNextColor()) } } function discreteLeafColorizer(palette) { var colors = []; generateColors(palette, colors, 4); return function(node) { if (node.index >= colors.length) { generateColors(palette, colors, 2 * colors.length) } return colors[node.index] } } function prepareDiscreteGroupColors(palette, root) { var i, node, colors = {}, allNodes = root.nodes.slice(), ii = allNodes.length; for (i = 0; i < ii; ++i) { node = allNodes[i]; if (node.isNode()) { allNodes = allNodes.concat(node.nodes); ii = allNodes.length } else { if (!colors[node.parent._id]) { colors[node.parent._id] = palette.getNextColor() } } } return colors } function discreteGroupColorizer(palette, root) { var colors = prepareDiscreteGroupColors(palette, root); return function(node) { return colors[node._id] } } __webpack_require__( /*! ./colorizing */ 638).addColorizer("discrete", discreteColorizer); module.exports = discreteColorizer }, /*!*****************************************!*\ !*** ./js/viz/tree_map/tiling.strip.js ***! \*****************************************/ function(module, exports, __webpack_require__) { var _squarify = __webpack_require__( /*! ./tiling.squarified.base */ 640); function accumulate(total, current, count) { return ((count - 1) * total + current) / count } function strip(data) { return _squarify(data, accumulate, true) } __webpack_require__( /*! ./tiling */ 637).addAlgorithm("strip", strip); module.exports = strip }, /*!**************************************************!*\ !*** ./js/viz/tree_map/tiling.slice_and_dice.js ***! \**************************************************/ function(module, exports, __webpack_require__) { var tiling = __webpack_require__( /*! ./tiling */ 637); function sliceAndDice(data) { var items = data.items, sidesData = tiling.buildSidesData(data.rect, data.directions, data.isRotated ? 1 : 0); tiling.calculateRectangles(items, 0, data.rect, sidesData, { sum: data.sum, count: items.length, side: sidesData.variedSide }) } tiling.addAlgorithm("sliceanddice", sliceAndDice); module.exports = sliceAndDice }, /*!**********************************************************!*\ !*** ./js/viz/tree_map/tiling.rotated_slice_and_dice.js ***! \**********************************************************/ function(module, exports, __webpack_require__) { var tiling = __webpack_require__( /*! ./tiling */ 637), sliceAndDiceAlgorithm = tiling.getAlgorithm("sliceanddice"); function rotatedSliceAndDice(data) { data.isRotated = !data.isRotated; return sliceAndDiceAlgorithm.call(this, data) } tiling.addAlgorithm("rotatedsliceanddice", rotatedSliceAndDice) }, /*!************************************************!*\ !*** ./js/viz/tree_map/colorizing.gradient.js ***! \************************************************/ function(module, exports, __webpack_require__) { var _createColorCodeGetter = __webpack_require__( /*! ./colorizing */ 638).createColorCodeGetter, _min = Math.min, _max = Math.max; function createSimpleColorizer(getColor, range) { return function(node) { return getColor(node, range) } } function getRangeData(range) { return [Number(range[0]) || 0, range[1] - range[0] || 1] } function calculateRange(nodes, getValue) { var i, code, ii = nodes.length, codes = []; for (i = 0; i < ii; ++i) { code = getValue(nodes[i]); if (isFinite(code)) { codes.push(code) } } return getRangeData([_min.apply(null, codes), _max.apply(null, codes)]) } function createGuessingColorizer(getColor, getValue) { var ranges = {}; return function(node) { var parent = node.parent; return getColor(node, ranges[parent._id] || (ranges[parent._id] = calculateRange(parent.nodes, getValue))) } } function gradientColorizer(options, themeManager) { var palette = themeManager.createGradientPalette(options.palette), getValue = _createColorCodeGetter(options); return "range" in options ? createSimpleColorizer(getColor, getRangeData(options.range || [])) : createGuessingColorizer(getColor, getValue); function getColor(node, arg) { return palette.getColor((getValue(node) - arg[0]) / arg[1]) } } __webpack_require__( /*! ./colorizing */ 638).addColorizer("gradient", gradientColorizer); module.exports = gradientColorizer }, /*!*********************************************!*\ !*** ./js/viz/tree_map/colorizing.range.js ***! \*********************************************/ function(module, exports, __webpack_require__) { var _createColorCodeGetter = __webpack_require__( /*! ./colorizing */ 638).createColorCodeGetter; function getPaletteIndex(value, items) { var middle, start = 0, end = items.length - 1, index = -1; if (items[start] <= value && value <= items[end]) { if (value === items[end]) { index = end - 1 } else { while (end - start > 1) { middle = start + end >> 1; if (value < items[middle]) { end = middle } else { start = middle } } index = start } } return index } function rangeColorizer(options, themeManager) { var range = options.range || [], palette = themeManager.createDiscretePalette(options.palette, range.length - 1), getValue = _createColorCodeGetter(options); return function(node) { return palette.getColor(getPaletteIndex(getValue(node), range)) } } __webpack_require__( /*! ./colorizing */ 638).addColorizer("range", rangeColorizer); module.exports = rangeColorizer }, /*!********************************!*\ !*** ./js/viz/tree_map/api.js ***! \********************************/ function(module, exports, __webpack_require__) { var proto = __webpack_require__( /*! ./tree_map.base */ 634).prototype, nodeProto = __webpack_require__( /*! ./node */ 636).prototype, _extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend; proto._eventsMap.onNodesInitialized = { name: "nodesInitialized" }; proto._eventsMap.onNodesRendering = { name: "nodesRendering" }; proto._createProxyType = function() { var nodes, that = this; Proxy.prototype = { constructor: Proxy, getParent: function() { return nodes[this._id].parent.proxy || null }, getChild: function(index) { var _nodes = nodes[this._id].nodes; return _nodes ? _nodes[index].proxy : null }, getChildrenCount: function() { var _nodes = nodes[this._id].nodes; return _nodes ? _nodes.length : 0 }, getAllChildren: function() { var i, _nodes = nodes[this._id].nodes, ii = _nodes && _nodes.length, list = []; for (i = 0; i < ii; ++i) { list.push(_nodes[i].proxy) } return list }, getAllNodes: function() { var list = []; collectNodes(nodes[this._id], list); return list }, isLeaf: function() { return !nodes[this._id].isNode() }, isActive: function() { return nodes[this._id].isActive() }, value: function(arg) { var result, node = nodes[this._id]; if (void 0 !== arg) { updateValue(node, arg > 0 ? Number(arg) : 0); change(node, ["TILING"]); result = this } else { result = node.value } return result }, label: function(arg) { var result, node = nodes[this._id]; if (void 0 !== arg) { node.customLabel = arg ? String(arg) : null; change(node, ["LABELS"]); result = this } else { result = node.customLabel || node.label } return result }, customize: function(settings) { var node = nodes[this._id]; if (settings) { node._custom = node._custom || {}; _extend(true, node._custom, settings); node._partialState = node._partialLabelState = null } change(node, ["TILES", "LABELS"]); return this }, resetCustomization: function() { var node = nodes[this._id]; node._custom = node._partialState = node._partialLabelState = null; change(node, ["TILES", "LABELS"]); return this } }; that._extendProxyType(Proxy.prototype); function Proxy(node) { var that = this; node.proxy = that; that._id = node._id; that.level = node.level; that.index = node.index; that.data = node.data } that._handlers.beginBuildNodes = function() { nodes = that._nodes; new Proxy(that._root) }; that._handlers.buildNode = function(node) { new Proxy(node) }; that._handlers.endBuildNodes = function() { that._eventTrigger("nodesInitialized", { root: that._root.proxy }) } }; function change(node, codes) { var ctx = node.ctx; ctx.suspend(); ctx.change(codes); ctx.resume() } function collectNodes(node, list) { var i, nodes = node.nodes, ii = nodes && nodes.length; for (i = 0; i < ii; ++i) { list.push(nodes[i].proxy); collectNodes(nodes[i], list) } } function updateValue(node, value) { var delta = value - node.value; while (node) { node.value += delta; node = node.parent } } proto._extendProxyType = __webpack_require__( /*! ./common */ 635).empty; var _resetNodes = proto._resetNodes; proto._resetNodes = function() { _resetNodes.call(this); this._eventTrigger("nodesRendering", { node: this._topNode.proxy }) }; var _updateStyles = nodeProto.updateStyles; nodeProto.updateStyles = function() { var that = this; _updateStyles.call(that); if (that._custom) { that._partialState = !that.ctx.forceReset && that._partialState || that.ctx.calculateState(that._custom); _extend(true, that.state, that._partialState) } }; var _updateLabelStyle = nodeProto.updateLabelStyle; nodeProto.updateLabelStyle = function() { var that = this, custom = that._custom; _updateLabelStyle.call(that); if (custom && custom.label) { that._partialLabelState = !that.ctx.forceReset && that._partialLabelState || calculatePartialLabelState(that, custom.label); that.labelState = _extend(true, {}, that.labelState, that._partialLabelState) } }; function calculatePartialLabelState(node, settings) { var state = node.ctx.calculateLabelState(settings); if ("visible" in settings) { state.visible = !!settings.visible } return state } proto.getRootNode = function() { return this._root.proxy }; proto.resetNodes = function() { var context = this._context; context.suspend(); context.change(["NODES_CREATE"]); context.resume(); return this } }, /*!**********************************!*\ !*** ./js/viz/tree_map/hover.js ***! \**********************************/ function(module, exports, __webpack_require__) { var proto = __webpack_require__( /*! ./tree_map.base */ 634).prototype, nodeProto = __webpack_require__( /*! ./node */ 636).prototype, common = __webpack_require__( /*! ./common */ 635), _parseScalar = __webpack_require__( /*! ../core/utils */ 509).parseScalar, _buildRectAppearance = common.buildRectAppearance, STATE_CODE = 1; __webpack_require__( /*! ./api */ 647); __webpack_require__( /*! ./states */ 649); proto._eventsMap.onHoverChanged = { name: "hoverChanged" }; common.expand(proto._handlers, "calculateAdditionalStates", function(states, options) { states[1] = options.hoverStyle ? _buildRectAppearance(options.hoverStyle) : {} }); __webpack_require__( /*! ./tree_map.base */ 634).addChange({ code: "HOVER_ENABLED", handler: function() { var hoverEnabled = _parseScalar(this._getOption("hoverEnabled", true), true); if (!hoverEnabled) { this.clearHover() } this._hoverEnabled = hoverEnabled }, isThemeDependent: true, isOptionChange: true, option: "hoverEnabled" }); nodeProto.statesMap[1] = 1; nodeProto.additionalStates.push(1); common.expand(proto, "_extendProxyType", function(proto) { var that = this; proto.setHover = function() { that._hoverNode(this._id) }; proto.isHovered = function() { return that._hoverIndex === this._id } }); common.expand(proto, "_onNodesCreated", function() { this._hoverIndex = -1 }); common.expand(proto, "_changeGroupSettings", function() { var that = this; that._groupHoverEnabled = _parseScalar(that._getOption("group").hoverEnabled, true); if (!that._groupHoverEnabled) { that.clearHover() } }); proto._applyHoverState = function(index, state) { setNodeStateRecursive(this._nodes[index], STATE_CODE, state); this._eventTrigger("hoverChanged", { node: this._nodes[index].proxy }) }; function setNodeStateRecursive(node, code, state) { var i, nodes = node.isNode() && node.nodes, ii = nodes && nodes.length; node.setState(code, state); for (i = 0; i < ii; ++i) { setNodeStateRecursive(nodes[i], code, state) } } proto._hoverNode = function(index) { var that = this, currentIndex = that._hoverIndex; if (that._hoverEnabled && currentIndex !== index) { if (!that._groupHoverEnabled && index >= 0 && that._nodes[index].isNode()) { that.clearHover(); return } that._context.suspend(); that._hoverIndex = -1; if (currentIndex >= 0) { that._applyHoverState(currentIndex, false) } that._hoverIndex = index; if (index >= 0) { that._applyHoverState(index, true) } that._context.resume() } }; proto.clearHover = function() { this._hoverNode(-1) } }, /*!***********************************!*\ !*** ./js/viz/tree_map/states.js ***! \***********************************/ function(module, exports, __webpack_require__) { var proto = __webpack_require__( /*! ./tree_map.base */ 634).prototype, nodeProto = __webpack_require__( /*! ./node */ 636).prototype, handlers = proto._handlers, _calculateState = handlers.calculateState, _buildState = nodeProto._buildState, _extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend; handlers.calculateState = function(options) { var states = { 0: _calculateState(options) }; handlers.calculateAdditionalStates(states, options); return states }; handlers.calculateAdditionalStates = __webpack_require__( /*! ./common */ 635).empty; nodeProto.code = 0; nodeProto.statesMap = { 0: 0 }; nodeProto.additionalStates = []; nodeProto._buildState = function(state, extra) { var states = { 0: _buildState(state[0], extra) }; if (this.additionalStates.length) { buildAdditionalStates(states, states[0], state, this.additionalStates) } return states }; nodeProto._getState = function() { return this.state[this.statesMap[this.code]] }; nodeProto.setState = function(code, state) { if (state) { this.code |= code } else { this.code &= ~code } this.ctx.change(["TILES"]) }; function buildAdditionalStates(states, base, source, list) { var i, ii = list.length; for (i = 0; i < ii; ++i) { states[list[i]] = _extend({}, base, source[list[i]]) } } }, /*!**************************************!*\ !*** ./js/viz/tree_map/selection.js ***! \**************************************/ function(module, exports, __webpack_require__) { var proto = __webpack_require__( /*! ./tree_map.base */ 634).prototype, nodeProto = __webpack_require__( /*! ./node */ 636).prototype, common = __webpack_require__( /*! ./common */ 635), _buildRectAppearance = common.buildRectAppearance, _normalizeEnum = __webpack_require__( /*! ../core/utils */ 509).normalizeEnum, _inArray = __webpack_require__( /*! ../../core/utils/array */ 26).inArray, MODE_NONE = 0, MODE_SINGLE = 1, MODE_MULTIPLE = 2, STATE_CODE = 2; __webpack_require__( /*! ./api */ 647); __webpack_require__( /*! ./states */ 649); proto._eventsMap.onSelectionChanged = { name: "selectionChanged" }; common.expand(proto._handlers, "calculateAdditionalStates", function(states, options) { states[2] = options.selectionStyle ? _buildRectAppearance(options.selectionStyle) : {} }); nodeProto.statesMap[2] = nodeProto.statesMap[3] = STATE_CODE; nodeProto.additionalStates.push(2); common.expand(proto, "_onNodesCreated", function() { this._selectionList.length = 0 }); common.expand(proto, "_extendProxyType", function(proto) { var that = this; proto.select = function(state) { that._selectNode(this._id, !!state) }; proto.isSelected = function() { return _inArray(this._id, that._selectionList) >= 0 }; that._selectionList = [] }); __webpack_require__( /*! ./tree_map.base */ 634).addChange({ code: "SELECTION_MODE", handler: function() { var mode, tmp, that = this, option = _normalizeEnum(that._getOption("selectionMode", true)), selectionList = that._selectionList; mode = "none" === option ? MODE_NONE : "multiple" === option ? MODE_MULTIPLE : MODE_SINGLE; if (mode === MODE_SINGLE && selectionList.length > 1) { tmp = selectionList.pop(); that.clearSelection(); selectionList.push(tmp) } else { if (mode === MODE_NONE) { that.clearSelection() } } that._selectionMode = mode }, isThemeDependent: true, isOptionChange: true, option: "selectionMode" }); common.expand(proto, "_applyTilesAppearance", function() { if (this._selectionList.length) { bringSelectedTilesToForeground(this._nodes, this._selectionList) } }); function bringSelectedTilesToForeground(nodes, selectionList) { var i, node, ii = selectionList.length; for (i = 0; i < ii; ++i) { node = nodes[selectionList[i]]; tileToFront[Number(node.isNode())](node.tile) } } var tileToFront = [leafToFront, groupToFront]; function leafToFront(content) { content.toForeground() } function groupToFront(content) { content.outer.toForeground(); content.inner.toForeground() } proto._applySelectionState = function(index, state) { var node = this._nodes[index]; node.setState(STATE_CODE, state); this._eventTrigger("selectionChanged", { node: node.proxy }) }; proto._selectNode = function(index, state) { var selectionList, k, tmp, that = this; if (that._selectionMode !== MODE_NONE) { that._context.suspend(); selectionList = that._selectionList; k = _inArray(index, selectionList); if (state && k === -1) { if (that._selectionMode === MODE_SINGLE) { if (selectionList.length) { tmp = selectionList.pop(); that._applySelectionState(tmp, false) } } selectionList.push(index); that._applySelectionState(index, true) } else { if (!state && k >= 0) { selectionList.splice(k, 1); that._applySelectionState(index, false) } } that._context.resume() } }; proto.clearSelection = function() { var i, that = this, selectionList = that._selectionList, ii = selectionList.length; if (that._selectionMode !== MODE_NONE) { that._context.suspend(); for (i = 0; i < ii; ++i) { that._applySelectionState(selectionList[i], false) } selectionList.length = 0; that._context.resume() } } }, /*!************************************!*\ !*** ./js/viz/tree_map/tooltip.js ***! \************************************/ function(module, exports, __webpack_require__) { var proto = __webpack_require__( /*! ./tree_map.base */ 634).prototype, common = __webpack_require__( /*! ./common */ 635); __webpack_require__( /*! ./api */ 647); common.expand(proto, "_extendProxyType", function(proto) { var that = this; proto.showTooltip = function(coords) { that._showTooltip(this._id, coords) } }); common.expand(proto, "_onNodesCreated", function() { if (this._tooltipIndex >= 0) { this._tooltip.hide() } this._tooltipIndex = -1 }); common.expand(proto, "_onTilingPerformed", function() { if (this._tooltipIndex >= 0) { this._moveTooltip(this._nodes[this._tooltipIndex]) } }); function getCoords(rect, renderer) { var offset = renderer.getRootOffset(); return [(rect[0] + rect[2]) / 2 + offset.left, (rect[1] + rect[3]) / 2 + offset.top] } proto._showTooltip = function(index, coords) { var node, state, that = this, tooltip = that._tooltip; if (tooltip.isEnabled()) { node = that._nodes[index]; state = that._tooltipIndex === index || tooltip.show({ value: node.value, valueText: tooltip.formatValue(node.value), node: node.proxy }, { x: 0, y: 0, offset: 0 }, { node: node.proxy }); if (state) { that._moveTooltip(node, coords) } else { tooltip.hide() } that._tooltipIndex = state ? index : -1 } }; proto._moveTooltip = function(node, coords) { var xy = coords || node.rect && getCoords(node.rect, this._renderer) || [-1e3, -1e3]; this._tooltip.move(xy[0], xy[1], 0) }; proto.hideTooltip = function() { if (this._tooltipIndex >= 0) { this._tooltipIndex = -1; this._tooltip.hide() } }; __webpack_require__( /*! ./tree_map.base */ 634).addPlugin(__webpack_require__( /*! ../core/tooltip */ 559).plugin) }, /*!************************************!*\ !*** ./js/viz/tree_map/tracker.js ***! \************************************/ function(module, exports, __webpack_require__) { var proto = __webpack_require__( /*! ./tree_map.base */ 634).prototype, common = __webpack_require__( /*! ./common */ 635), extend = __webpack_require__( /*! ../../core/utils/extend */ 11).extend, _eventData = __webpack_require__( /*! ../../events/utils */ 71).eventData, _parseScalar = __webpack_require__( /*! ../core/utils */ 509).parseScalar, clickEventName = __webpack_require__( /*! ../../events/click */ 75).name, downPointerEventName = __webpack_require__( /*! ../../events/pointer */ 76).down, movePointerEventName = __webpack_require__( /*! ../../events/pointer */ 76).move, $ = __webpack_require__( /*! ../../core/renderer */ 9), $doc = $(document), DATA_KEY_BASE = "__treemap_data_", dataKeyModifier = 0; __webpack_require__( /*! ./api */ 647); __webpack_require__( /*! ./hover */ 648); __webpack_require__( /*! ./tooltip */ 651); proto._eventsMap.onClick = { name: "click" }; common.expand(proto, "_initCore", function() { var that = this, dataKey = DATA_KEY_BASE + dataKeyModifier++; that._tracker = new Tracker({ widget: that, root: that._renderer.root, eventTrigger: that._eventTrigger, getData: function(e) { var target = e.target; return ("tspan" === target.tagName ? target.parentNode : target)[dataKey] }, getProxy: function(index) { return that._nodes[index].proxy }, getCoords: function(e) { var data = _eventData(e), offset = that._renderer.getRootOffset(); return [data.x - offset.left, data.y - offset.top] } }); that._handlers.setTrackerData = function(node, element) { element.data(dataKey, node._id) }; exports._TESTS_dataKey = dataKey }); common.expand(proto, "_disposeCore", function() { this._tracker.dispose() }); __webpack_require__( /*! ./tree_map.base */ 634).addChange({ code: "INTERACT_WITH_GROUP", handler: function() { this._tracker.setOptions({ interactWithGroup: _parseScalar(this._getOption("interactWithGroup", true), false) }) }, isThemeDependent: true, isOptionChange: true, option: "interactWithGroup" }); function Tracker(parameters) { this._options = {}; this._initHandlers(parameters, this._options) } Tracker.prototype = { constructor: Tracker, _initHandlers: function(parameters, options) { parameters.getNode = function(id) { var proxy = parameters.getProxy(id); return options.interactWithGroup && proxy.isLeaf() && proxy.getParent().isActive() ? proxy.getParent() : proxy }; parameters.root.on(clickEventName, clickHandler); parameters.root.on(downPointerEventName, downHandler); $doc.on(downPointerEventName, downHandler); $doc.on(movePointerEventName, moveHandler); this._disposeHandlers = function() { parameters.root.off(clickEventName, clickHandler); parameters.root.off(downPointerEventName, downHandler); $doc.off(downPointerEventName, downHandler); $doc.off(movePointerEventName, moveHandler) }; function clickHandler(e) { processClick(e, parameters) } var isRootDown = false; function downHandler(e) { if (isRootDown) { isRootDown = false } else { if (void 0 !== parameters.getData(e)) { e.preventDefault(); isRootDown = true } moveHandler(e) } } function moveHandler(e) { processHover(e, parameters); processTooltip(e, parameters) } }, dispose: function() { this._disposeHandlers() }, setOptions: function(options) { extend(this._options, options) } }; function processClick(e, params) { var id = params.getData(e); if (id >= 0) { params.eventTrigger("click", { node: params.getNode(id), coords: params.getCoords(e), jQueryEvent: e }) } } function processHover(e, params) { var id = params.getData(e); if (id >= 0) { params.getNode(id).setHover() } else { params.widget.clearHover() } } function processTooltip(e, params) { var coords, id = params.getData(e); if (id >= 0) { coords = _eventData(e); params.getNode(id).showTooltip([coords.x, coords.y]) } else { params.widget.hideTooltip() } } }, /*!**************************************!*\ !*** ./js/viz/tree_map/drilldown.js ***! \**************************************/ function(module, exports, __webpack_require__) { var proto = __webpack_require__( /*! ./tree_map.base */ 634).prototype, _expand = __webpack_require__( /*! ./common */ 635).expand; __webpack_require__( /*! ./api */ 647); proto._eventsMap.onDrill = { name: "drill" }; _expand(proto, "_extendProxyType", function(proto) { var that = this; proto.drillDown = function() { that._drillToNode(this._id) } }); _expand(proto, "_onNodesCreated", function() { this._drilldownIndex = -1 }); proto._drillToNode = function(index) { var node, that = this; if (that._drilldownIndex !== index) { node = that._nodes[index] || that._root; if (node.nodes) { that._drilldownIndex = index; that._topNode = node; that._context.suspend(); that._context.change(["MAX_DEPTH", "NODES_RESET"]); that._context.resume(); that._eventTrigger("drill", { node: node.proxy }) } } }; proto.resetDrillDown = function() { this._drillToNode(-1); return this }; proto.drillUp = function() { this._drillToNode(this._topNode.parent._id || -1); return this }; proto.getCurrentNode = function() { return this._topNode.proxy } }, /*!**********************************************!*\ !*** ./js/viz/tree_map/plain_data_source.js ***! \**********************************************/ function(module, exports, __webpack_require__) { var proto = __webpack_require__( /*! ./tree_map.base */ 634).prototype; proto._optionChangesMap.idField = proto._optionChangesMap.parentField = "NODES_CREATE"; proto._processDataSourceItems = function(items) { var i, currentItem, parentId, tmpItems, item, struct = {}, idField = this._getOption("idField", true), parentField = this._getOption("parentField", true), rootNodes = []; if (!idField || !parentField || 0 === items.length) { return { items: items, isPlain: true } } for (i = 0; i < items.length; i++) { currentItem = items[i]; parentId = currentItem[parentField]; if (!!parentId) { struct[parentId] = struct[parentId] || { items: [] }; tmpItems = struct[parentId].items } else { tmpItems = rootNodes } tmpItems.push(currentItem) } treeFiller({ struct: struct, idField: idField }, rootNodes); for (item in struct) { struct[item] && rootNodes.push(struct[item]) } return { items: rootNodes, isPlain: true } }; function treeFiller(context, items) { var currentItem, i, id, struct = context.struct; for (i = 0; i < items.length; i++) { currentItem = items[i]; id = currentItem[context.idField]; if (struct[id]) { currentItem.items = struct[id].items; struct[id] = null; treeFiller(context, currentItem.items) } } } }, /*!*************************!*\ !*** ./js/viz/utils.js ***! \*************************/ function(module, exports, __webpack_require__) { exports.refreshPaths = __webpack_require__( /*! ./core/renderers/renderer */ 518).refreshPaths }, , , /*!**********************************!*\ !*** ./js/bundles/dx.viz-web.js ***! \**********************************/ function(module, exports, __webpack_require__) { __webpack_require__( /*! ./modules/parts/widgets-web */ 336); __webpack_require__( /*! ./modules/parts/viz */ 506) } ]);