@progress/kendo-angular-scheduler 23.3.0-develop.15 → 23.3.0-develop.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -43,8 +43,8 @@ const packageMetadata = {
43
43
  productName: 'Kendo UI for Angular',
44
44
  productCode: 'KENDOUIANGULAR',
45
45
  productCodes: ['KENDOUIANGULAR'],
46
- publishDate: 1774529188,
47
- version: '23.3.0-develop.15',
46
+ publishDate: 1774600251,
47
+ version: '23.3.0-develop.17',
48
48
  licensingDocsUrl: 'https://www.telerik.com/kendo-angular-ui/my-license/'
49
49
  };
50
50
 
@@ -2550,6 +2550,9 @@ function rtlScrollPosition(element, position) {
2550
2550
  * @hidden
2551
2551
  */
2552
2552
  const isVisible = (element) => {
2553
+ if (!element?.getBoundingClientRect) {
2554
+ return false;
2555
+ }
2553
2556
  const rect = element.getBoundingClientRect();
2554
2557
  const hasSize = rect.width > 0 && rect.height > 0;
2555
2558
  const hasPosition = rect.x !== 0 && rect.y !== 0;
@@ -15837,6 +15840,42 @@ const columnIndexComparer = (a, b) => {
15837
15840
  }
15838
15841
  return indexA - indexB;
15839
15842
  };
15843
+ function addMinHeightOverflowEvents(sorted, slots, slotItems) {
15844
+ const firstSlot = slots[0];
15845
+ if (!firstSlot || slots.length <= 1) {
15846
+ return;
15847
+ }
15848
+ const slotDurationMs = firstSlot.end.getTime() - firstSlot.start.getTime();
15849
+ const slotHeight = firstSlot.height;
15850
+ if (slotDurationMs <= 0 || slotHeight <= 0) {
15851
+ return;
15852
+ }
15853
+ const msPerPixel = slotDurationMs / slotHeight;
15854
+ const minEventDurationMs = MIN_EVENT_HEIGHT * msPerPixel;
15855
+ sorted.forEach(event => {
15856
+ const eventDurationMs = event.item.endTime.getTime() - event.item.startTime.getTime();
15857
+ if (eventDurationMs >= minEventDurationMs) {
15858
+ return;
15859
+ }
15860
+ const visualEndMs = event.item.startTime.getTime() + minEventDurationMs;
15861
+ const endMs = event.item.endTime.getTime();
15862
+ for (let i = 0; i < slots.length; i++) {
15863
+ const slot = slots[i];
15864
+ if (slot.end.getTime() <= endMs) {
15865
+ continue;
15866
+ }
15867
+ if (slot.start.getTime() >= visualEndMs) {
15868
+ break;
15869
+ }
15870
+ if (intersects(event.item.startTime, event.item.endTime, slot.start, slot.end)) {
15871
+ continue;
15872
+ }
15873
+ const value = slotItems[slot.key] = slotItems[slot.key] || { events: [] };
15874
+ value.slot = slot;
15875
+ value.events.push(event);
15876
+ }
15877
+ });
15878
+ }
15840
15879
  function initTimeColumns(slotKeys, slotItems) {
15841
15880
  // Break slots into groups with overlapping events.
15842
15881
  let columns = 0;
@@ -15850,7 +15889,14 @@ function initTimeColumns(slotKeys, slotItems) {
15850
15889
  groupSlots.push(slot);
15851
15890
  for (let eventIdx = 0; eventIdx < count; eventIdx++) {
15852
15891
  const event = events[eventIdx];
15853
- groupEnd = groupEnd && event.item.endTime.getTime() <= slot.end.getTime();
15892
+ const endsInSlot = event.item.endTime.getTime() <= slot.end.getTime();
15893
+ // Grouping needs to consider the enforced minimum rendered height with MIN_EVENT_HEIGHT.
15894
+ let visuallyEndsInSlot = true;
15895
+ if (endsInSlot) {
15896
+ const eventTop = event.rect ? event.rect.top : (slot.rect.top + timeOffset(slot, event.item.startTime));
15897
+ visuallyEndsInSlot = eventTop + MIN_EVENT_HEIGHT <= slot.rect.top + slot.rect.height;
15898
+ }
15899
+ groupEnd = groupEnd && endsInSlot && visuallyEndsInSlot;
15854
15900
  if (isNumber(event.columnIndex)) {
15855
15901
  continue;
15856
15902
  }
@@ -15859,6 +15905,7 @@ function initTimeColumns(slotKeys, slotItems) {
15859
15905
  };
15860
15906
  event.columnIndex = eventIdx;
15861
15907
  event.lastColumn = true;
15908
+ let columnFound = false;
15862
15909
  for (let idx = 0, previousIdx = -1; idx < eventIdx; idx++) {
15863
15910
  const current = events[idx];
15864
15911
  if (current.columnIndex > previousIdx + 1) {
@@ -15866,9 +15913,10 @@ function initTimeColumns(slotKeys, slotItems) {
15866
15913
  event.lastColumn = false;
15867
15914
  events.splice(eventIdx, 1);
15868
15915
  events.splice(event.columnIndex, 0, event);
15916
+ columnFound = true;
15869
15917
  break;
15870
15918
  }
15871
- //events that don't intersect their start or end times but overlap in rendered height due to the minimum event height
15919
+ // Events that don't intersect their start or end times but overlap in rendered height due to the minimum event height
15872
15920
  const anyOverlappingEvents = events.filter(e => e !== current && e.rect).some(event => {
15873
15921
  const areIntersecting = intersects(event.item.startTime, event.item.endTime, current.item.startTime, current.item.endTime);
15874
15922
  const areOverlapping = minHeightOverlaps(current.rect.top, event.rect.top);
@@ -15877,6 +15925,18 @@ function initTimeColumns(slotKeys, slotItems) {
15877
15925
  const intersectingEvents = intersects(event.item.startTime, event.item.endTime, current.item.startTime, current.item.endTime);
15878
15926
  const overlappingEvents = minHeightOverlaps(current.rect.top, event.rect.top);
15879
15927
  if (!(anyOverlappingEvents || intersectingEvents || overlappingEvents)) {
15928
+ const targetColumn = current.columnIndex;
15929
+ // Verify no other event in the same column overlaps with the new event
15930
+ const hasColumnConflict = events.some(e => e !== current &&
15931
+ isNumber(e.columnIndex) &&
15932
+ e.columnIndex === targetColumn &&
15933
+ (intersects(event.item.startTime, event.item.endTime, e.item.startTime, e.item.endTime) ||
15934
+ (e.rect && event.rect && minHeightOverlaps(e.rect.top, event.rect.top))));
15935
+ if (hasColumnConflict) {
15936
+ previousIdx = current.columnIndex;
15937
+ current.lastColumn = false;
15938
+ continue;
15939
+ }
15880
15940
  const currentSlotDay = new Date(slot.start).toDateString();
15881
15941
  const hasPreviousSlotsWithMoreOrSameColumns = slotKeys.some(previousKey => {
15882
15942
  const previousSlot = slotItems[previousKey].slot;
@@ -15888,20 +15948,32 @@ function initTimeColumns(slotKeys, slotItems) {
15888
15948
  if (!hasPreviousSlotsWithMoreOrSameColumns) {
15889
15949
  columns--;
15890
15950
  }
15891
- event.columnIndex = idx;
15951
+ event.columnIndex = targetColumn;
15892
15952
  event.lastColumn = !events.some((e) => {
15893
15953
  const hasColumnIndex = e.columnIndex;
15894
- const isBeforeCurrentIndex = idx < e.columnIndex;
15954
+ const isBeforeCurrentIndex = targetColumn < e.columnIndex;
15895
15955
  const areIntersecting = intersects(event.item.startTime, event.item.endTime, e.item.startTime, e.item.endTime);
15896
15956
  return hasColumnIndex && isBeforeCurrentIndex && areIntersecting;
15897
15957
  });
15898
15958
  events.splice(eventIdx, 1);
15899
15959
  events.splice(idx, 0, event);
15960
+ columnFound = true;
15900
15961
  break;
15901
15962
  }
15902
15963
  previousIdx = current.columnIndex;
15903
15964
  current.lastColumn = false;
15904
15965
  }
15966
+ // After splice operations, array positions may not match column indices.
15967
+ // Recalculate the column index based on the highest occupied column.
15968
+ if (!columnFound) {
15969
+ let maxColumn = -1;
15970
+ for (let i = 0; i < eventIdx; i++) {
15971
+ if (isNumber(events[i].columnIndex) && events[i].columnIndex > maxColumn) {
15972
+ maxColumn = events[i].columnIndex;
15973
+ }
15974
+ }
15975
+ event.columnIndex = maxColumn + 1;
15976
+ }
15905
15977
  }
15906
15978
  if (groupEnd) {
15907
15979
  groupSlots.forEach(item => item.columns = columns);
@@ -16073,6 +16145,7 @@ class SlotRange {
16073
16145
  value.slot = slot;
16074
16146
  value.events.push(event);
16075
16147
  }));
16148
+ addMinHeightOverflowEvents(sorted, slots, slotItems);
16076
16149
  const slotKeys = Object.keys(slotItems);
16077
16150
  initTimeColumns(slotKeys, slotItems);
16078
16151
  slotKeys.forEach((key) => {
@@ -7,7 +7,7 @@ export const packageMetadata = {
7
7
  "productCodes": [
8
8
  "KENDOUIANGULAR"
9
9
  ],
10
- "publishDate": 1774529188,
11
- "version": "23.3.0-develop.15",
10
+ "publishDate": 1774600251,
11
+ "version": "23.3.0-develop.17",
12
12
  "licensingDocsUrl": "https://www.telerik.com/kendo-angular-ui/my-license/"
13
13
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@progress/kendo-angular-scheduler",
3
- "version": "23.3.0-develop.15",
3
+ "version": "23.3.0-develop.17",
4
4
  "description": "Kendo UI Scheduler Angular - Outlook or Google-style angular scheduler calendar. Full-featured and customizable embedded scheduling from the creator developers trust for professional UI components.",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "author": "Progress",
@@ -19,7 +19,7 @@
19
19
  "package": {
20
20
  "productName": "Kendo UI for Angular",
21
21
  "productCode": "KENDOUIANGULAR",
22
- "publishDate": 1774529188,
22
+ "publishDate": 1774600251,
23
23
  "licensingDocsUrl": "https://www.telerik.com/kendo-angular-ui/my-license/"
24
24
  }
25
25
  },
@@ -32,23 +32,23 @@
32
32
  "@progress/kendo-data-query": "^1.7.3",
33
33
  "@progress/kendo-drawing": "^1.24.1",
34
34
  "@progress/kendo-licensing": "^1.10.0",
35
- "@progress/kendo-angular-tooltip": "23.3.0-develop.15",
36
- "@progress/kendo-angular-buttons": "23.3.0-develop.15",
37
- "@progress/kendo-angular-common": "23.3.0-develop.15",
38
- "@progress/kendo-angular-dateinputs": "23.3.0-develop.15",
39
- "@progress/kendo-angular-dialog": "23.3.0-develop.15",
40
- "@progress/kendo-angular-dropdowns": "23.3.0-develop.15",
41
- "@progress/kendo-angular-icons": "23.3.0-develop.15",
42
- "@progress/kendo-angular-inputs": "23.3.0-develop.15",
43
- "@progress/kendo-angular-intl": "23.3.0-develop.15",
44
- "@progress/kendo-angular-l10n": "23.3.0-develop.15",
45
- "@progress/kendo-angular-label": "23.3.0-develop.15",
46
- "@progress/kendo-angular-popup": "23.3.0-develop.15",
35
+ "@progress/kendo-angular-tooltip": "23.3.0-develop.17",
36
+ "@progress/kendo-angular-buttons": "23.3.0-develop.17",
37
+ "@progress/kendo-angular-common": "23.3.0-develop.17",
38
+ "@progress/kendo-angular-dateinputs": "23.3.0-develop.17",
39
+ "@progress/kendo-angular-dialog": "23.3.0-develop.17",
40
+ "@progress/kendo-angular-dropdowns": "23.3.0-develop.17",
41
+ "@progress/kendo-angular-icons": "23.3.0-develop.17",
42
+ "@progress/kendo-angular-inputs": "23.3.0-develop.17",
43
+ "@progress/kendo-angular-intl": "23.3.0-develop.17",
44
+ "@progress/kendo-angular-l10n": "23.3.0-develop.17",
45
+ "@progress/kendo-angular-label": "23.3.0-develop.17",
46
+ "@progress/kendo-angular-popup": "23.3.0-develop.17",
47
47
  "rxjs": "^6.5.3 || ^7.0.0"
48
48
  },
49
49
  "dependencies": {
50
50
  "tslib": "^2.3.1",
51
- "@progress/kendo-angular-schematics": "23.3.0-develop.15",
51
+ "@progress/kendo-angular-schematics": "23.3.0-develop.17",
52
52
  "@progress/kendo-date-math": "^1.3.2",
53
53
  "@progress/kendo-draggable": "^3.0.2",
54
54
  "@progress/kendo-file-saver": "^1.0.7",
@@ -9,10 +9,10 @@ const schematics_1 = require("@angular-devkit/schematics");
9
9
  function default_1(options) {
10
10
  const finalOptions = Object.assign(Object.assign({}, options), { mainNgModule: 'SchedulerModule', package: 'scheduler', peerDependencies: {
11
11
  // peer deps of the dropdowns
12
- '@progress/kendo-angular-treeview': '23.3.0-develop.15',
13
- '@progress/kendo-angular-navigation': '23.3.0-develop.15',
12
+ '@progress/kendo-angular-treeview': '23.3.0-develop.17',
13
+ '@progress/kendo-angular-navigation': '23.3.0-develop.17',
14
14
  // peer dependency of kendo-angular-inputs
15
- '@progress/kendo-angular-dialog': '23.3.0-develop.15',
15
+ '@progress/kendo-angular-dialog': '23.3.0-develop.17',
16
16
  // peer dependency of kendo-angular-icons
17
17
  '@progress/kendo-svg-icons': '^4.0.0'
18
18
  } });