UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

193 lines (150 loc) 6.14 kB
"use strict"; var $ = require("../../core/renderer"), window = require("../../core/utils/window").getWindow(), CalendarStrategy = require("./ui.date_box.strategy.calendar"), TimeView = require("./ui.time_view"), dateLocalization = require("../../localization/date"), extend = require("../../core/utils/extend").extend, Box = require("../box"), uiDateUtils = require("./ui.date_utils"); var SHRINK_VIEW_SCREEN_WIDTH = 573, DATEBOX_ADAPTIVITY_MODE_CLASS = "dx-datebox-adaptivity-mode"; var CalendarWithTimeStrategy = CalendarStrategy.inherit({ NAME: "CalendarWithTime", getDefaultOptions: function getDefaultOptions() { return extend(this.callBase(), { applyValueMode: "useButtons", buttonsLocation: "bottom after", showPopupTitle: false }); }, getDisplayFormat: function getDisplayFormat(displayFormat) { return displayFormat || "shortdateshorttime"; }, _is24HourFormat: function _is24HourFormat() { return dateLocalization.is24HourFormat(this.getDisplayFormat(this.dateBox.option("displayFormat"))); }, _renderWidget: function _renderWidget() { this.callBase(); this._timeView = this.dateBox._createComponent($("<div>"), TimeView, { value: this.dateBoxValue(), _showClock: !this._isShrinkView(), use24HourFormat: this._is24HourFormat(), onValueChanged: this._valueChangedHandler.bind(this) }); }, renderOpenedState: function renderOpenedState() { 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 isAdaptivityChanged() { var isAdaptiveMode = this._isShrinkView(); if (isAdaptiveMode !== this._currentAdaptiveMode) { this._currentAdaptiveMode = isAdaptiveMode; return true; } return this.callBase(); }, _updateValue: function _updateValue(preventDefaultValue) { var date = this.dateBoxValue(); if (!date && !preventDefaultValue) { date = new Date(); uiDateUtils.normalizeTime(date); } this.callBase(); if (this._timeView) { date && this._timeView.option("value", date); this._timeView.option("use24HourFormat", this._is24HourFormat()); } }, _isSmallScreen: function _isSmallScreen() { return $(window).width() <= SHRINK_VIEW_SCREEN_WIDTH; }, _isShrinkView: function _isShrinkView() { return !this.dateBox.option("showAnalogClock") || this.dateBox.option("adaptivityEnabled") && this._isSmallScreen(); }, _getBoxItems: function _getBoxItems() { 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 renderPopupContent() { 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()); break; } return $container; }.bind(this) }); this._attachTabHandler(); }, popupConfig: function popupConfig(_popupConfig) { var calendarPopupConfig = this.callBase(_popupConfig), result = extend(calendarPopupConfig, { onShowing: function () { if (this._box.option("_layoutStrategy") === "fallback") { var clockMinWidth = this._getPopup().$content().find(".dx-timeview-clock").css("minWidth"); this._timeView.$element().css("maxWidth", clockMinWidth); } }.bind(this) }); return result; }, getFirstPopupElement: function getFirstPopupElement() { return this._timeView._hourBox.$element().find("input"); }, _attachTabHandler: function _attachTabHandler() { var dateBox = this.dateBox, handler = function handler(e) { if (e.shiftKey) { e.preventDefault(); dateBox.focus(); } }; this._timeView._hourBox.registerKeyHandler("tab", handler); }, _preventFocusOnPopup: function _preventFocusOnPopup(e) { if (!$(e.target).hasClass("dx-texteditor-input")) { this.callBase.apply(this, arguments); if (!this.dateBox._hasFocusClass()) { this.dateBox.focus(); } } }, getValue: function getValue() { 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(), time.getMilliseconds()); return date; }, dispose: function dispose() { clearTimeout(this._removeMinWidthTimer); clearTimeout(this._repaintTimer); this.callBase(); } }); module.exports = CalendarWithTimeStrategy;