UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

191 lines (189 loc) • 8.7 kB
/** * DevExtreme (cjs/__internal/scheduler/m_compact_appointments_helper.js) * Version: 24.2.6 * Build date: Mon Mar 17 2025 * * Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/ */ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CompactAppointmentsHelper = void 0; var _translator = require("../../common/core/animation/translator"); var _date = _interopRequireDefault(require("../../common/core/localization/date")); var _message = _interopRequireDefault(require("../../common/core/localization/message")); var _renderer = _interopRequireDefault(require("../../core/renderer")); var _function_template = require("../../core/templates/function_template"); var _button = _interopRequireDefault(require("../../ui/button")); var _m_appointment_adapter = require("./m_appointment_adapter"); var _m_constants = require("./m_constants"); var _m_data_structures = require("./m_data_structures"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e } } const APPOINTMENT_COLLECTOR_CLASS = "dx-scheduler-appointment-collector"; const COMPACT_APPOINTMENT_COLLECTOR_CLASS = `${APPOINTMENT_COLLECTOR_CLASS}-compact`; const APPOINTMENT_COLLECTOR_CONTENT_CLASS = `${APPOINTMENT_COLLECTOR_CLASS}-content`; const WEEK_VIEW_COLLECTOR_OFFSET = 5; const COMPACT_THEME_WEEK_VIEW_COLLECTOR_OFFSET = 1; class CompactAppointmentsHelper { constructor(instance) { this.instance = instance; this.elements = [] } render(options) { const { isCompact: isCompact, items: items } = options; const template = this._createTemplate(items.data.length, isCompact); const button = this._createCompactButton(template, options); const $button = button.$element(); this.elements.push($button); $button.data("items", this._createTooltipInfos(items)); return $button } clear() { this.elements.forEach((button => { button.detach(); button.remove() })); this.elements = [] } _createTooltipInfos(items) { return items.data.map(((appointment, index) => { var _items$settings; const targetedAdapter = (0, _m_appointment_adapter.createAppointmentAdapter)(appointment, this.instance._dataAccessors, this.instance.timeZoneCalculator).clone(); if ((null === (_items$settings = items.settings) || void 0 === _items$settings ? void 0 : _items$settings.length) > 0) { const { info: info } = items.settings[index]; targetedAdapter.startDate = info.sourceAppointment.startDate; targetedAdapter.endDate = info.sourceAppointment.endDate } return new _m_data_structures.AppointmentTooltipInfo(appointment, targetedAdapter.source(), items.colors[index], items.settings[index]) })) } _onButtonClick(e, options) { const $button = (0, _renderer.default)(e.element); this.instance.showAppointmentTooltipCore($button, $button.data("items"), this._getExtraOptionsForTooltip(options, $button)) } _getExtraOptionsForTooltip(options, $appointmentCollector) { return { clickEvent: this._clickEvent(options.onAppointmentClick).bind(this), dragBehavior: options.allowDrag && this._createTooltipDragBehavior($appointmentCollector).bind(this), dropDownAppointmentTemplate: this.instance.option().dropDownAppointmentTemplate, isButtonClick: true, _loopFocus: true } } _clickEvent(onAppointmentClick) { return e => { const clickEventArgs = this.instance._createEventArgs(e); onAppointmentClick(clickEventArgs) } } _createTooltipDragBehavior($appointmentCollector) { return e => { const $element = (0, _renderer.default)(e.element); const $schedulerElement = (0, _renderer.default)(this.instance.element()); const workSpace = this.instance.getWorkSpace(); const initialPosition = (0, _translator.locate)($appointmentCollector); const options = { filter: `.${_m_constants.LIST_ITEM_CLASS}`, isSetCursorOffset: true, initialPosition: initialPosition, getItemData: itemElement => { var _$$data; return null === (_$$data = (0, _renderer.default)(itemElement).data(_m_constants.LIST_ITEM_DATA_KEY)) || void 0 === _$$data ? void 0 : _$$data.appointment }, getItemSettings: (_, event) => event.itemSettings }; workSpace._createDragBehaviorBase($element, $schedulerElement, options) } } _getCollectorOffset(width, cellWidth) { return cellWidth - width - this._getCollectorRightOffset() } _getCollectorRightOffset() { return this.instance.getRenderingStrategyInstance()._isCompactTheme() ? 1 : 5 } _setPosition(element, position) { (0, _translator.move)(element, { top: position.top, left: position.left }) } _createCompactButton(template, options) { const $button = this._createCompactButtonElement(options); return this.instance._createComponent($button, _button.default, { type: "default", width: options.width, height: options.height, onClick: e => this._onButtonClick(e, options), template: this._renderTemplate(template, options.items, options.isCompact) }) } _createCompactButtonElement(_ref) { let { isCompact: isCompact, $container: $container, coordinates: coordinates, sortedIndex: sortedIndex, items: items } = _ref; const appointmentDate = this._getDateText(items.data[0]); const result = (0, _renderer.default)("<div>").addClass(APPOINTMENT_COLLECTOR_CLASS).attr("aria-roledescription", appointmentDate).toggleClass(COMPACT_APPOINTMENT_COLLECTOR_CLASS, isCompact).appendTo($container); result.data("dxAppointmentSettings", { sortedIndex: sortedIndex }); this._setPosition(result, coordinates); return result } _renderTemplate(template, items, isCompact) { return new _function_template.FunctionTemplate((options => template.render({ model: { appointmentCount: items.data.length, isCompact: isCompact }, container: options.container }))) } _createTemplate(count, isCompact) { this._initButtonTemplate(count, isCompact); return this.instance._getAppointmentTemplate("appointmentCollectorTemplate") } _initButtonTemplate(count, isCompact) { this.instance._templateManager.addDefaultTemplates({ appointmentCollector: new _function_template.FunctionTemplate((options => this._createButtonTemplate(count, (0, _renderer.default)(options.container), isCompact))) }) } _createButtonTemplate(appointmentCount, element, isCompact) { const text = isCompact ? appointmentCount : _message.default.getFormatter("dxScheduler-moreAppointments")(appointmentCount); return element.append((0, _renderer.default)("<span>").text(text)).addClass(APPOINTMENT_COLLECTOR_CONTENT_CLASS) } _localizeDate(date) { return `${_date.default.format(date,"monthAndDay")}, ${_date.default.format(date,"year")}` } _getStartDate(appointment) { const date = appointment.startDate; return date ? new Date(date) : null } _getEndDate(appointment) { const date = appointment.endDate; return date ? new Date(date) : null } _getDateText(appointment) { const startDate = this._getStartDate(appointment); const endDate = this._getEndDate(appointment); const startDateText = startDate ? this._localizeDate(startDate) : ""; const endDateText = endDate ? this._localizeDate(endDate) : ""; const dateText = startDateText === endDateText ? `${startDateText}` : `${startDateText} - ${endDateText}`; return `${dateText}` } } exports.CompactAppointmentsHelper = CompactAppointmentsHelper;