@progress/kendo-angular-scheduler 23.3.0-develop.16 → 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: 1774537237,
47
- version: '23.3.0-develop.16',
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
 
@@ -15840,6 +15840,42 @@ const columnIndexComparer = (a, b) => {
15840
15840
  }
15841
15841
  return indexA - indexB;
15842
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
+ }
15843
15879
  function initTimeColumns(slotKeys, slotItems) {
15844
15880
  // Break slots into groups with overlapping events.
15845
15881
  let columns = 0;
@@ -15853,7 +15889,14 @@ function initTimeColumns(slotKeys, slotItems) {
15853
15889
  groupSlots.push(slot);
15854
15890
  for (let eventIdx = 0; eventIdx < count; eventIdx++) {
15855
15891
  const event = events[eventIdx];
15856
- 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;
15857
15900
  if (isNumber(event.columnIndex)) {
15858
15901
  continue;
15859
15902
  }
@@ -15862,6 +15905,7 @@ function initTimeColumns(slotKeys, slotItems) {
15862
15905
  };
15863
15906
  event.columnIndex = eventIdx;
15864
15907
  event.lastColumn = true;
15908
+ let columnFound = false;
15865
15909
  for (let idx = 0, previousIdx = -1; idx < eventIdx; idx++) {
15866
15910
  const current = events[idx];
15867
15911
  if (current.columnIndex > previousIdx + 1) {
@@ -15869,9 +15913,10 @@ function initTimeColumns(slotKeys, slotItems) {
15869
15913
  event.lastColumn = false;
15870
15914
  events.splice(eventIdx, 1);
15871
15915
  events.splice(event.columnIndex, 0, event);
15916
+ columnFound = true;
15872
15917
  break;
15873
15918
  }
15874
- //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
15875
15920
  const anyOverlappingEvents = events.filter(e => e !== current && e.rect).some(event => {
15876
15921
  const areIntersecting = intersects(event.item.startTime, event.item.endTime, current.item.startTime, current.item.endTime);
15877
15922
  const areOverlapping = minHeightOverlaps(current.rect.top, event.rect.top);
@@ -15880,6 +15925,18 @@ function initTimeColumns(slotKeys, slotItems) {
15880
15925
  const intersectingEvents = intersects(event.item.startTime, event.item.endTime, current.item.startTime, current.item.endTime);
15881
15926
  const overlappingEvents = minHeightOverlaps(current.rect.top, event.rect.top);
15882
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
+ }
15883
15940
  const currentSlotDay = new Date(slot.start).toDateString();
15884
15941
  const hasPreviousSlotsWithMoreOrSameColumns = slotKeys.some(previousKey => {
15885
15942
  const previousSlot = slotItems[previousKey].slot;
@@ -15891,20 +15948,32 @@ function initTimeColumns(slotKeys, slotItems) {
15891
15948
  if (!hasPreviousSlotsWithMoreOrSameColumns) {
15892
15949
  columns--;
15893
15950
  }
15894
- event.columnIndex = idx;
15951
+ event.columnIndex = targetColumn;
15895
15952
  event.lastColumn = !events.some((e) => {
15896
15953
  const hasColumnIndex = e.columnIndex;
15897
- const isBeforeCurrentIndex = idx < e.columnIndex;
15954
+ const isBeforeCurrentIndex = targetColumn < e.columnIndex;
15898
15955
  const areIntersecting = intersects(event.item.startTime, event.item.endTime, e.item.startTime, e.item.endTime);
15899
15956
  return hasColumnIndex && isBeforeCurrentIndex && areIntersecting;
15900
15957
  });
15901
15958
  events.splice(eventIdx, 1);
15902
15959
  events.splice(idx, 0, event);
15960
+ columnFound = true;
15903
15961
  break;
15904
15962
  }
15905
15963
  previousIdx = current.columnIndex;
15906
15964
  current.lastColumn = false;
15907
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
+ }
15908
15977
  }
15909
15978
  if (groupEnd) {
15910
15979
  groupSlots.forEach(item => item.columns = columns);
@@ -16076,6 +16145,7 @@ class SlotRange {
16076
16145
  value.slot = slot;
16077
16146
  value.events.push(event);
16078
16147
  }));
16148
+ addMinHeightOverflowEvents(sorted, slots, slotItems);
16079
16149
  const slotKeys = Object.keys(slotItems);
16080
16150
  initTimeColumns(slotKeys, slotItems);
16081
16151
  slotKeys.forEach((key) => {
@@ -7,7 +7,7 @@ export const packageMetadata = {
7
7
  "productCodes": [
8
8
  "KENDOUIANGULAR"
9
9
  ],
10
- "publishDate": 1774537237,
11
- "version": "23.3.0-develop.16",
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.16",
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": 1774537237,
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.16",
36
- "@progress/kendo-angular-buttons": "23.3.0-develop.16",
37
- "@progress/kendo-angular-common": "23.3.0-develop.16",
38
- "@progress/kendo-angular-dateinputs": "23.3.0-develop.16",
39
- "@progress/kendo-angular-dialog": "23.3.0-develop.16",
40
- "@progress/kendo-angular-dropdowns": "23.3.0-develop.16",
41
- "@progress/kendo-angular-icons": "23.3.0-develop.16",
42
- "@progress/kendo-angular-inputs": "23.3.0-develop.16",
43
- "@progress/kendo-angular-intl": "23.3.0-develop.16",
44
- "@progress/kendo-angular-l10n": "23.3.0-develop.16",
45
- "@progress/kendo-angular-label": "23.3.0-develop.16",
46
- "@progress/kendo-angular-popup": "23.3.0-develop.16",
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.16",
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.16',
13
- '@progress/kendo-angular-navigation': '23.3.0-develop.16',
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.16',
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
  } });