devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
142 lines (141 loc) • 6.42 kB
JavaScript
/**
* DevExtreme (esm/ui/scheduler/appointments.layout_manager.js)
* Version: 21.1.4
* Build date: Mon Jun 21 2021
*
* Copyright (c) 2012 - 2021 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
import _extends from "@babel/runtime/helpers/esm/extends";
import {
equalByValue
} from "../../core/utils/common";
import VerticalAppointmentsStrategy from "./rendering_strategies/ui.scheduler.appointments.strategy.vertical";
import HorizontalAppointmentsStrategy from "./rendering_strategies/ui.scheduler.appointments.strategy.horizontal";
import HorizontalMonthLineAppointmentsStrategy from "./rendering_strategies/ui.scheduler.appointments.strategy.horizontal_month_line";
import HorizontalMonthAppointmentsStrategy from "./rendering_strategies/ui.scheduler.appointments.strategy.horizontal_month";
import AgendaAppointmentsStrategy from "./rendering_strategies/ui.scheduler.appointments.strategy.agenda";
var RENDERING_STRATEGIES = {
horizontal: HorizontalAppointmentsStrategy,
horizontalMonth: HorizontalMonthAppointmentsStrategy,
horizontalMonthLine: HorizontalMonthLineAppointmentsStrategy,
vertical: VerticalAppointmentsStrategy,
agenda: AgendaAppointmentsStrategy
};
class AppointmentLayoutManager {
constructor(instance, renderingStrategy) {
this.instance = instance;
renderingStrategy && this.initRenderingStrategy(renderingStrategy)
}
getCellDimensions(options) {
if (this.instance._workSpace) {
return {
width: this.instance._workSpace.getCellWidth(),
height: this.instance._workSpace.getCellHeight(),
allDayHeight: this.instance._workSpace.getAllDayHeight()
}
}
}
getGroupOrientation(options) {
if (this.instance._workSpace) {
options.callback(this.instance._workSpace._getRealGroupOrientation())
}
}
initRenderingStrategy(renderingStrategy) {
var Strategy = RENDERING_STRATEGIES[renderingStrategy];
this._renderingStrategyInstance = new Strategy(this.instance);
this.renderingStrategy = renderingStrategy
}
createAppointmentsMap(items) {
var {
allDayHeight: allDayHeight
} = this.getCellDimensions();
this.instance._allDayCellHeight = allDayHeight;
this.getGroupOrientation({
callback: groupOrientation => this.instance._groupOrientation = groupOrientation
});
var appointments = items ? items.slice() : [];
this._positionMap = this._renderingStrategyInstance.createTaskPositionMap(appointments);
return this._createAppointmentsMapCore(appointments, this._positionMap)
}
_createAppointmentsMapCore(list, positionMap) {
return list.map((data, index) => {
if (!this._renderingStrategyInstance.keepAppointmentSettings()) {
delete data.settings
}
var appointmentSettings = positionMap[index];
appointmentSettings.forEach(settings => {
settings.direction = "vertical" === this.renderingStrategy && !settings.allDay ? "vertical" : "horizontal"
});
return {
itemData: data,
settings: appointmentSettings,
needRepaint: true,
needRemove: false
}
})
}
_isDataChanged(data) {
var updatedData = this.instance.getUpdatedAppointment();
return updatedData === data || this.instance.getUpdatedAppointmentKeys().some(item => data[item.key] === item.value)
}
_isAppointmentShouldAppear(currentAppointment, sourceAppointment) {
return currentAppointment.needRepaint && sourceAppointment.needRemove
}
_isSettingChanged(settings, sourceSetting) {
if (settings.length !== sourceSetting.length) {
return true
}
for (var i = 0; i < settings.length; i++) {
var newSettings = _extends({}, settings[i]);
var oldSettings = _extends({}, sourceSetting[i], {
sortedIndex: newSettings.sortedIndex,
cellIndex: newSettings.cellIndex,
rowIndex: newSettings.rowIndex,
hMax: newSettings.hMax,
vMax: newSettings.vMax
});
if (!equalByValue(newSettings, oldSettings)) {
return true
}
}
return false
}
_getAssociatedSourceAppointment(currentAppointment, sourceAppointments) {
for (var i = 0; i < sourceAppointments.length; i++) {
var item = sourceAppointments[i];
if (item.itemData === currentAppointment.itemData) {
return item
}
}
return null
}
_getDeletedAppointments(currentAppointments, sourceAppointments) {
var result = [];
for (var i = 0; i < sourceAppointments.length; i++) {
var sourceAppointment = sourceAppointments[i];
var currentAppointment = this._getAssociatedSourceAppointment(sourceAppointment, currentAppointments);
if (!currentAppointment) {
sourceAppointment.needRemove = true;
result.push(sourceAppointment)
}
}
return result
}
getRepaintedAppointments(currentAppointments, sourceAppointments) {
if (0 === sourceAppointments.length || "agenda" === this.renderingStrategy) {
return currentAppointments
}
currentAppointments.forEach(appointment => {
var sourceAppointment = this._getAssociatedSourceAppointment(appointment, sourceAppointments);
if (sourceAppointment) {
appointment.needRepaint = this._isDataChanged(appointment.itemData) || this._isSettingChanged(appointment.settings, sourceAppointment.settings) || this._isAppointmentShouldAppear(appointment, sourceAppointment)
}
});
return currentAppointments.concat(this._getDeletedAppointments(currentAppointments, sourceAppointments))
}
getRenderingStrategyInstance() {
return this._renderingStrategyInstance
}
}
export default AppointmentLayoutManager;