@almadar/ui 5.126.0 → 5.127.0

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.
@@ -11,7 +11,7 @@ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
11
11
  import { createPortal } from 'react-dom';
12
12
  import { useTranslate } from '@almadar/ui/hooks';
13
13
  import { useUISlots, UISlotProvider, useTheme } from '@almadar/ui/context';
14
- import { evaluateGuard, evaluate, createMinimalContext, executeEffects } from '@almadar/evaluator';
14
+ import { evaluateGuard, evaluateListenPayloadExpr, evaluate, createMinimalContext, executeEffects } from '@almadar/evaluator';
15
15
  import { wrapCallbackForEvent, prepareSchemaForPreview, perfStore, pushPerfEntry, collectTraitRefsFromResolvedTrait, buildOrbitalsByTrait, collectEmbeddedTraits } from '@almadar/runtime/ui';
16
16
  export { PERF_NAMESPACE, adjustSchemaForMockData, buildMockData, clearPerf, perfEnd, perfStart, perfTime, prepareSchemaForPreview, wrapCallbackForEvent } from '@almadar/runtime/ui';
17
17
  import { Link, Outlet, useLocation } from 'react-router-dom';
@@ -18437,6 +18437,32 @@ var init_ButtonGroup = __esm({
18437
18437
  ButtonGroup.displayName = "ButtonGroup";
18438
18438
  }
18439
18439
  });
18440
+
18441
+ // lib/getNestedValue.ts
18442
+ function getNestedValue(obj, path) {
18443
+ if (obj === null || obj === void 0 || !path) {
18444
+ return void 0;
18445
+ }
18446
+ if (!path.includes(".")) {
18447
+ return obj[path];
18448
+ }
18449
+ const parts = path.split(".");
18450
+ let value = obj;
18451
+ for (const part of parts) {
18452
+ if (value === null || value === void 0) {
18453
+ return void 0;
18454
+ }
18455
+ if (typeof value !== "object" || Array.isArray(value)) {
18456
+ return void 0;
18457
+ }
18458
+ value = value[part];
18459
+ }
18460
+ return value;
18461
+ }
18462
+ var init_getNestedValue = __esm({
18463
+ "lib/getNestedValue.ts"() {
18464
+ }
18465
+ });
18440
18466
  function dayWindowForViewport(width) {
18441
18467
  if (width <= 640) return 1;
18442
18468
  if (width <= 1024) return 3;
@@ -18483,11 +18509,15 @@ function getWeekDays(start) {
18483
18509
  }
18484
18510
  return days;
18485
18511
  }
18486
- function generateDefaultTimeSlots(events2) {
18512
+ function eventStartDate(event, startField) {
18513
+ const raw = getNestedValue(event, startField);
18514
+ return new Date(raw ?? "");
18515
+ }
18516
+ function generateDefaultTimeSlots(events2, startField) {
18487
18517
  let first = DEFAULT_FIRST_HOUR;
18488
18518
  let last = DEFAULT_LAST_HOUR;
18489
18519
  for (const ev of events2) {
18490
- const start = new Date(ev.startTime);
18520
+ const start = eventStartDate(ev, startField);
18491
18521
  if (Number.isNaN(start.getTime())) continue;
18492
18522
  const hour = start.getHours();
18493
18523
  if (hour < first) first = hour;
@@ -18499,8 +18529,8 @@ function generateDefaultTimeSlots(events2) {
18499
18529
  }
18500
18530
  return slots;
18501
18531
  }
18502
- function eventInSlot(event, day, slotTime) {
18503
- const eventStart = new Date(event.startTime);
18532
+ function eventInSlot(event, day, slotTime, startField) {
18533
+ const eventStart = eventStartDate(event, startField);
18504
18534
  if (Number.isNaN(eventStart.getTime())) return false;
18505
18535
  const [slotHour] = slotTime.split(":").map(Number);
18506
18536
  return eventStart.toDateString() === day.toDateString() && eventStart.getHours() === slotHour;
@@ -18517,7 +18547,12 @@ function CalendarGrid({
18517
18547
  longPressPayload,
18518
18548
  swipeLeftEvent,
18519
18549
  swipeRightEvent,
18520
- dayWindow = "auto"
18550
+ dayWindow = "auto",
18551
+ titleField = "title",
18552
+ startField = "startTime",
18553
+ colorField = "color",
18554
+ children,
18555
+ renderItem
18521
18556
  }) {
18522
18557
  const evs = Array.isArray(events2) ? events2 : events2 ? [events2] : [];
18523
18558
  const eventBus = useEventBus();
@@ -18532,8 +18567,8 @@ function CalendarGrid({
18532
18567
  [resolvedWeekStart]
18533
18568
  );
18534
18569
  const resolvedTimeSlots = useMemo(
18535
- () => timeSlots ?? generateDefaultTimeSlots(evs),
18536
- [timeSlots, evs]
18570
+ () => timeSlots ?? generateDefaultTimeSlots(evs, startField),
18571
+ [timeSlots, evs, startField]
18537
18572
  );
18538
18573
  const visibleCount = useDayWindow(dayWindow);
18539
18574
  const [dayOffset, setDayOffset] = useState(0);
@@ -18570,9 +18605,9 @@ function CalendarGrid({
18570
18605
  );
18571
18606
  const eventsForDayCount = useCallback(
18572
18607
  (day) => evs.filter(
18573
- (ev) => new Date(ev.startTime).toDateString() === day.toDateString()
18608
+ (ev) => eventStartDate(ev, startField).toDateString() === day.toDateString()
18574
18609
  ).length,
18575
- [events2]
18610
+ [events2, startField]
18576
18611
  );
18577
18612
  const swipeCallbacks = useMemo(() => ({
18578
18613
  onSwipeLeft: swipeLeftEvent ? () => eventBus.emit(`UI:${swipeLeftEvent}`, {}) : void 0,
@@ -18591,8 +18626,11 @@ function CalendarGrid({
18591
18626
  eventBus.emit(`UI:${longPressEvent}`, { date: day.toISOString(), time, ...longPressPayload });
18592
18627
  }, 500);
18593
18628
  }, [longPressEvent, longPressPayload, eventBus]);
18629
+ const renderChip = children ?? renderItem;
18594
18630
  const renderEvent = (event) => {
18595
- const color = event.color;
18631
+ const color = getNestedValue(event, colorField);
18632
+ const label = String(getNestedValue(event, titleField) ?? "");
18633
+ const eventIndex = evs.indexOf(event);
18596
18634
  return /* @__PURE__ */ jsx(
18597
18635
  Box,
18598
18636
  {
@@ -18604,7 +18642,7 @@ function CalendarGrid({
18604
18642
  color ? color : "bg-primary/10 border-primary/30 text-primary"
18605
18643
  ),
18606
18644
  onClick: (e) => handleEventClick(event, e),
18607
- children: /* @__PURE__ */ jsx(Typography, { variant: "small", className: "truncate font-medium", children: event.title })
18645
+ children: renderChip ? renderChip(event, eventIndex) : /* @__PURE__ */ jsx(Typography, { variant: "small", className: "truncate font-medium", children: label })
18608
18646
  },
18609
18647
  event.id
18610
18648
  );
@@ -18688,7 +18726,7 @@ function CalendarGrid({
18688
18726
  ) }),
18689
18727
  visibleDays.map((day) => {
18690
18728
  const slotEvents = evs.filter(
18691
- (ev) => eventInSlot(ev, day, time)
18729
+ (ev) => eventInSlot(ev, day, time, startField)
18692
18730
  );
18693
18731
  const isToday = day.toDateString() === (/* @__PURE__ */ new Date()).toDateString();
18694
18732
  return /* @__PURE__ */ jsx(
@@ -18725,6 +18763,7 @@ var init_CalendarGrid = __esm({
18725
18763
  "components/core/molecules/CalendarGrid.tsx"() {
18726
18764
  "use client";
18727
18765
  init_cn();
18766
+ init_getNestedValue();
18728
18767
  init_Box();
18729
18768
  init_Button();
18730
18769
  init_Stack();
@@ -18741,32 +18780,6 @@ var init_CalendarGrid = __esm({
18741
18780
  CalendarGrid.displayName = "CalendarGrid";
18742
18781
  }
18743
18782
  });
18744
-
18745
- // lib/getNestedValue.ts
18746
- function getNestedValue(obj, path) {
18747
- if (obj === null || obj === void 0 || !path) {
18748
- return void 0;
18749
- }
18750
- if (!path.includes(".")) {
18751
- return obj[path];
18752
- }
18753
- const parts = path.split(".");
18754
- let value = obj;
18755
- for (const part of parts) {
18756
- if (value === null || value === void 0) {
18757
- return void 0;
18758
- }
18759
- if (typeof value !== "object" || Array.isArray(value)) {
18760
- return void 0;
18761
- }
18762
- value = value[part];
18763
- }
18764
- return value;
18765
- }
18766
- var init_getNestedValue = __esm({
18767
- "lib/getNestedValue.ts"() {
18768
- }
18769
- });
18770
18783
  var Pagination;
18771
18784
  var init_Pagination = __esm({
18772
18785
  "components/core/molecules/Pagination.tsx"() {
@@ -45336,7 +45349,7 @@ function useTraitStateMachine(traitBindings, uiSlots, options) {
45336
45349
  crossTraitLog.debug("listen:fired", { busKey, targetTrait: binding.trait.name, triggers: listen.triggers });
45337
45350
  enqueueAndDrain(
45338
45351
  listen.triggers,
45339
- applyListenPayloadMapping(listen.payloadMapping, event.payload),
45352
+ applyListenPayloadMapping(listen.payloadMapping, event.payload, evaluateListenPayloadExpr),
45340
45353
  binding.trait.name
45341
45354
  );
45342
45355
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@almadar/ui",
3
- "version": "5.126.0",
3
+ "version": "5.127.0",
4
4
  "description": "React UI components, hooks, and providers for Almadar",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -117,11 +117,11 @@
117
117
  "access": "public"
118
118
  },
119
119
  "dependencies": {
120
- "@almadar/core": "^10.34.0",
121
- "@almadar/evaluator": "^2.35.0",
120
+ "@almadar/core": "^10.35.0",
121
+ "@almadar/evaluator": "^2.36.0",
122
122
  "@almadar/logger": "^1.10.0",
123
- "@almadar/runtime": "^6.37.0",
124
- "@almadar/std": "^16.144.0",
123
+ "@almadar/runtime": "^6.38.0",
124
+ "@almadar/std": "^16.145.0",
125
125
  "@almadar/syntax": "^1.12.0",
126
126
  "@dnd-kit/core": "^6.3.1",
127
127
  "@dnd-kit/sortable": "^10.0.0",