devextreme
Version:
JavaScript/TypeScript Component Suite for Responsive Web Development
112 lines (111 loc) • 4.26 kB
JavaScript
/**
* DevExtreme (esm/__internal/scheduler/view_model/appointments_layout_manager.js)
* Version: 25.2.7
* Build date: Tue May 05 2026
*
* Copyright (c) 2012 - 2026 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
import {
filterAppointments
} from "./filtration/filter_appointments";
import {
generateAgendaViewModel
} from "./generate_view_model/generate_agenda_view_model";
import {
generateGridViewModel,
sortAppointments
} from "./generate_view_model/generate_grid_view_model";
import {
OptionManager
} from "./generate_view_model/options/option_manager";
import {
getAgendaAppointmentInfo,
getAppointmentInfo
} from "./get_appointment_info";
import {
prepareAppointments
} from "./preparation/prepare_appointments";
class AppointmentLayoutManager {
get filteredItems() {
return this._filteredItems
}
get sortedItems() {
return this._sortedItems
}
constructor(schedulerStore) {
this.schedulerStore = schedulerStore;
this.preparedItems = [];
this._filteredItems = [];
this._sortedItems = []
}
prepareAppointments(items) {
this.preparedItems = prepareAppointments(this.schedulerStore, items)
}
filterAppointments() {
this._filteredItems = filterAppointments(this.schedulerStore, this.preparedItems)
}
hasAllDayAppointments() {
return this._filteredItems.filter(item => item.isAllDayPanelOccupied).length > 0
}
generateViewModel() {
const viewType = this.schedulerStore.currentView.type;
if ("agenda" === viewType) {
const viewModel = generateAgendaViewModel(this.schedulerStore, this._filteredItems);
return viewModel.map(item => Object.assign({}, item, {
isAgendaModel: true,
info: getAgendaAppointmentInfo(item)
}))
}
const optionManager = new OptionManager(this.schedulerStore);
this._sortedItems = sortAppointments(optionManager, this._filteredItems);
const viewModel = generateGridViewModel(this.schedulerStore, optionManager, this._sortedItems);
const isSkipResizing = appointment => appointment.isAllDayPanelOccupied && "day" === viewType && 1 === this.schedulerStore.currentView.intervalCount;
const toCollectedItem = item => ({
itemData: item.itemData,
allDay: item.isAllDayPanelOccupied,
groupIndex: item.groupIndex,
width: item.width,
height: item.height,
info: getAppointmentInfo(item)
});
return viewModel.map(item => {
if (item.items.length) {
return {
itemData: item.itemData,
allDay: item.isAllDayPanelOccupied,
groupIndex: item.groupIndex,
sortedIndex: item.sortedIndex,
top: item.top,
left: item.left,
width: item.width,
height: item.height,
isCompact: item.isCompact,
items: item.items.map(toCollectedItem)
}
}
return (item => ({
itemData: item.itemData,
allDay: item.isAllDayPanelOccupied,
groupIndex: item.groupIndex,
sortedIndex: item.sortedIndex,
direction: item.direction,
level: item.level,
maxLevel: item.maxLevel,
empty: item.empty,
top: item.top,
left: item.left,
height: item.height,
width: item.width,
reduced: item.reduced,
partIndex: item.partIndex,
partTotalCount: item.partCount,
rowIndex: item.rowIndex,
columnIndex: item.columnIndex,
skipResizing: isSkipResizing(item),
info: getAppointmentInfo(item)
}))(item)
})
}
}
export default AppointmentLayoutManager;