@pisell/private-materials 6.11.115 → 6.11.117

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.
Files changed (129) hide show
  1. package/build/lowcode/assets-daily.json +11 -11
  2. package/build/lowcode/assets-dev.json +2 -2
  3. package/build/lowcode/assets-prod.json +11 -11
  4. package/build/lowcode/meta.js +1 -1
  5. package/build/lowcode/render/default/view.js +1 -1
  6. package/build/lowcode/view.js +1 -1
  7. package/es/components/appointmentBooking/components/TimeSlicing/components/SelectDateOS.d.ts +0 -1
  8. package/es/components/booking/hooks/useClearCart.d.ts +0 -1
  9. package/es/components/booking/info/notes/index.d.ts +0 -1
  10. package/es/components/ecocup/components/AddCustomerModal/index.d.ts +1 -0
  11. package/es/components/ecocup/components/CupActionList/index.d.ts +1 -0
  12. package/es/components/ecocup/components/CupActionModal/index.d.ts +1 -0
  13. package/es/components/ecocup/components/CupInfoCard/index.d.ts +1 -0
  14. package/es/components/ecocup/components/CupStatusModal/index.d.ts +1 -0
  15. package/es/components/ecocup/components/CustomerAndCupModal/index.d.ts +1 -0
  16. package/es/components/ecocup/components/CustomerCard/index.d.ts +1 -0
  17. package/es/components/ecocup/components/MoreDropdown/index.d.ts +1 -0
  18. package/es/components/ecocup/components/SearchBar/index.d.ts +1 -0
  19. package/es/components/ecocup/components/SettingModal/index.d.ts +1 -0
  20. package/es/components/ecocup/cupList/hooks/useColumns.d.ts +1 -0
  21. package/es/components/ecocup/cupList/hooks/useSummary.d.ts +1 -0
  22. package/es/components/eftpos/hooks.d.ts +1 -0
  23. package/es/components/eftpos/index.d.ts +1 -0
  24. package/es/components/eftposPay/component/fail/network.d.ts +0 -1
  25. package/es/components/eftposPay/component/fail/unknow.d.ts +0 -1
  26. package/es/components/eftposPay/component/signature/index.d.ts +0 -1
  27. package/es/components/eftposPay/store/index.d.ts +1 -1
  28. package/es/components/eftposPay/tip.d.ts +0 -1
  29. package/es/components/eftposPay/windcave/receiptAction.d.ts +0 -1
  30. package/es/components/shoppingCart/hooks/useClearCart.d.ts +0 -1
  31. package/es/plus/clinetSearch/Add/BirthdayField/index.d.ts +1 -0
  32. package/es/plus/clinetSearch/Add/GenderField/index.d.ts +1 -0
  33. package/es/plus/clinetSearch/Add/PhoneField/index.d.ts +1 -0
  34. package/es/plus/orderList/components/HandleActions.d.ts +1 -0
  35. package/es/plus/orderList/components/QuickFilter.d.ts +1 -0
  36. package/es/plus/orderList/components/Reset.d.ts +1 -0
  37. package/es/plus/orderList/components/Toolbar.d.ts +1 -0
  38. package/es/plus/pisellReservation/PisellReservation.js +369 -41
  39. package/es/plus/pisellReservation/components/PisellReservationSubcomponents.d.ts +7 -6
  40. package/es/plus/pisellReservation/components/PisellReservationSubcomponents.js +25 -12
  41. package/es/plus/pisellReservation/components/ReservationResourceWallResourceSelect.d.ts +14 -0
  42. package/es/plus/pisellReservation/components/ReservationResourceWallResourceSelect.js +30 -0
  43. package/es/plus/pisellReservation/components/bookingDetailModal/ReservationBookingDetailModal.js +5 -5
  44. package/es/plus/pisellReservation/data/bookingToReservationTables.d.ts +4 -0
  45. package/es/plus/pisellReservation/data/bookingToReservationTables.js +12 -4
  46. package/es/plus/pisellReservation/data/mapReservationToVenueWallCards.d.ts +6 -0
  47. package/es/plus/pisellReservation/data/mapReservationToVenueWallCards.js +171 -0
  48. package/es/plus/pisellReservation/data/reservationDataUtils.js +1 -1
  49. package/es/plus/pisellReservation/floorMap/reservationMock.js +160 -0
  50. package/es/plus/pisellReservation/floorRoomCard/buildCardBodyViewModel.js +4 -4
  51. package/es/plus/pisellReservation/floorRoomCard/floorRoomCardUtils.d.ts +18 -0
  52. package/es/plus/pisellReservation/floorRoomCard/floorRoomCardUtils.js +44 -0
  53. package/es/plus/pisellReservation/hooks/useReservationScheduleDebounced.d.ts +3 -3
  54. package/es/plus/pisellReservation/locales/locales-ja.d.ts +5 -0
  55. package/es/plus/pisellReservation/locales/locales-ja.js +5 -0
  56. package/es/plus/pisellReservation/locales/locales-pt.d.ts +5 -0
  57. package/es/plus/pisellReservation/locales/locales-pt.js +5 -0
  58. package/es/plus/pisellReservation/locales/locales.d.ts +17 -0
  59. package/es/plus/pisellReservation/locales/locales.js +7 -0
  60. package/es/plus/pisellReservation/reservationConstants.d.ts +23 -5
  61. package/es/plus/pisellReservation/reservationConstants.js +7 -0
  62. package/es/plus/pisellReservation/types.d.ts +4 -0
  63. package/es/plus/saasAttendance/settings/components/membersField/index.d.ts +1 -0
  64. package/es/plus/skuOptionsSelection/components/OptionsCard/index.d.ts +1 -0
  65. package/es/plus/walletPassGallery/components/timelineSection/index.d.ts +1 -0
  66. package/es/pro/Selector/demo.d.ts +1 -0
  67. package/es/pro/pisellPhoneKeyboard/index.d.ts +1 -0
  68. package/lib/components/appointmentBooking/components/TimeSlicing/components/SelectDateOS.d.ts +0 -1
  69. package/lib/components/booking/hooks/useClearCart.d.ts +0 -1
  70. package/lib/components/booking/info/notes/index.d.ts +0 -1
  71. package/lib/components/ecocup/components/AddCustomerModal/index.d.ts +1 -0
  72. package/lib/components/ecocup/components/CupActionList/index.d.ts +1 -0
  73. package/lib/components/ecocup/components/CupActionModal/index.d.ts +1 -0
  74. package/lib/components/ecocup/components/CupInfoCard/index.d.ts +1 -0
  75. package/lib/components/ecocup/components/CupStatusModal/index.d.ts +1 -0
  76. package/lib/components/ecocup/components/CustomerAndCupModal/index.d.ts +1 -0
  77. package/lib/components/ecocup/components/CustomerCard/index.d.ts +1 -0
  78. package/lib/components/ecocup/components/MoreDropdown/index.d.ts +1 -0
  79. package/lib/components/ecocup/components/SearchBar/index.d.ts +1 -0
  80. package/lib/components/ecocup/components/SettingModal/index.d.ts +1 -0
  81. package/lib/components/ecocup/cupList/hooks/useColumns.d.ts +1 -0
  82. package/lib/components/ecocup/cupList/hooks/useSummary.d.ts +1 -0
  83. package/lib/components/eftpos/hooks.d.ts +1 -0
  84. package/lib/components/eftpos/index.d.ts +1 -0
  85. package/lib/components/eftposPay/component/fail/network.d.ts +0 -1
  86. package/lib/components/eftposPay/component/fail/unknow.d.ts +0 -1
  87. package/lib/components/eftposPay/component/signature/index.d.ts +0 -1
  88. package/lib/components/eftposPay/store/index.d.ts +1 -1
  89. package/lib/components/eftposPay/tip.d.ts +0 -1
  90. package/lib/components/eftposPay/windcave/receiptAction.d.ts +0 -1
  91. package/lib/components/shoppingCart/hooks/useClearCart.d.ts +0 -1
  92. package/lib/plus/clinetSearch/Add/BirthdayField/index.d.ts +1 -0
  93. package/lib/plus/clinetSearch/Add/GenderField/index.d.ts +1 -0
  94. package/lib/plus/clinetSearch/Add/PhoneField/index.d.ts +1 -0
  95. package/lib/plus/orderList/components/HandleActions.d.ts +1 -0
  96. package/lib/plus/orderList/components/QuickFilter.d.ts +1 -0
  97. package/lib/plus/orderList/components/Reset.d.ts +1 -0
  98. package/lib/plus/orderList/components/Toolbar.d.ts +1 -0
  99. package/lib/plus/pisellReservation/PisellReservation.js +312 -12
  100. package/lib/plus/pisellReservation/components/PisellReservationSubcomponents.d.ts +7 -6
  101. package/lib/plus/pisellReservation/components/PisellReservationSubcomponents.js +18 -5
  102. package/lib/plus/pisellReservation/components/ReservationResourceWallResourceSelect.d.ts +14 -0
  103. package/lib/plus/pisellReservation/components/ReservationResourceWallResourceSelect.js +60 -0
  104. package/lib/plus/pisellReservation/components/bookingDetailModal/ReservationBookingDetailModal.js +1 -1
  105. package/lib/plus/pisellReservation/data/bookingToReservationTables.d.ts +4 -0
  106. package/lib/plus/pisellReservation/data/bookingToReservationTables.js +16 -9
  107. package/lib/plus/pisellReservation/data/mapReservationToVenueWallCards.d.ts +6 -0
  108. package/lib/plus/pisellReservation/data/mapReservationToVenueWallCards.js +160 -0
  109. package/lib/plus/pisellReservation/data/reservationDataUtils.js +2 -1
  110. package/lib/plus/pisellReservation/floorMap/reservationMock.js +151 -0
  111. package/lib/plus/pisellReservation/floorRoomCard/buildCardBodyViewModel.js +5 -2
  112. package/lib/plus/pisellReservation/floorRoomCard/floorRoomCardUtils.d.ts +18 -0
  113. package/lib/plus/pisellReservation/floorRoomCard/floorRoomCardUtils.js +40 -0
  114. package/lib/plus/pisellReservation/hooks/useReservationScheduleDebounced.d.ts +3 -3
  115. package/lib/plus/pisellReservation/locales/locales-ja.d.ts +5 -0
  116. package/lib/plus/pisellReservation/locales/locales-ja.js +5 -0
  117. package/lib/plus/pisellReservation/locales/locales-pt.d.ts +5 -0
  118. package/lib/plus/pisellReservation/locales/locales-pt.js +5 -0
  119. package/lib/plus/pisellReservation/locales/locales.d.ts +17 -0
  120. package/lib/plus/pisellReservation/locales/locales.js +7 -0
  121. package/lib/plus/pisellReservation/reservationConstants.d.ts +23 -5
  122. package/lib/plus/pisellReservation/reservationConstants.js +12 -0
  123. package/lib/plus/pisellReservation/types.d.ts +4 -0
  124. package/lib/plus/saasAttendance/settings/components/membersField/index.d.ts +1 -0
  125. package/lib/plus/skuOptionsSelection/components/OptionsCard/index.d.ts +1 -0
  126. package/lib/plus/walletPassGallery/components/timelineSection/index.d.ts +1 -0
  127. package/lib/pro/Selector/demo.d.ts +1 -0
  128. package/lib/pro/pisellPhoneKeyboard/index.d.ts +1 -0
  129. package/package.json +4 -4
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  declare const QuickFilter: (props: {
2
3
  locales: any;
3
4
  }) => JSX.Element;
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  declare const Reset: (props: {
2
3
  locales: any;
3
4
  setValueType: (value: any) => void;
@@ -1,3 +1,4 @@
1
+ /// <reference types="react" />
1
2
  declare const Toolbar: (props: {
2
3
  locales: any;
3
4
  clearSelectedData: () => void;
@@ -60,6 +60,7 @@ var import_reservationDensity = require("./data/reservationDensity");
60
60
  var import_bookingToReservationTables = require("./data/bookingToReservationTables");
61
61
  var import_hudDrawerLocalListQuery = require("./data/hudDrawerLocalListQuery");
62
62
  var import_reservationTablesMerge = require("./data/reservationTablesMerge");
63
+ var import_formResourceToReservationTables = require("./data/formResourceToReservationTables");
63
64
  var import_bookingToReservationTables2 = require("./data/bookingToReservationTables");
64
65
  var import_calendarAdapter = require("./data/calendarAdapter");
65
66
  var import_reservationDataUtils = require("./data/reservationDataUtils");
@@ -69,6 +70,8 @@ var import_useReservationFloorPlan = require("./floorMap/useReservationFloorPlan
69
70
  var import_useReservationFloorMapMerged = require("./floorMap/useReservationFloorMapMerged");
70
71
  var import_ReservationCalendarDayBookingRoomCard = require("./components/ReservationCalendarDayBookingRoomCard");
71
72
  var import_reservationConstants = require("./reservationConstants");
73
+ var import_mapReservationToVenueWallCards = require("./data/mapReservationToVenueWallCards");
74
+ var import_ReservationResourceWallResourceSelect = require("./components/ReservationResourceWallResourceSelect");
72
75
  var import_reservationOperatingDayRange = require("./data/reservationOperatingDayRange");
73
76
  var import_useReservationScheduleDebounced = require("./hooks/useReservationScheduleDebounced");
74
77
  var import_useReservationSalesHostData = require("./hooks/useReservationSalesHostData");
@@ -207,6 +210,9 @@ var PisellReservationCore = (props) => {
207
210
  */
208
211
  subscribeRealtimePush: true
209
212
  });
213
+ const [shellBodyView, setShellBodyView] = (0, import_react.useState)(
214
+ () => (0, import_reservationDataUtils.readBodyViewFromStorageKey)(bodyViewStorageKey)
215
+ );
210
216
  const { baseFloorConfig, floorPlanRemoteId, setRemoteFloorPlanView } = (0, import_useReservationFloorPlan.useReservationFloorPlan)({
211
217
  resolvedFloorPlanId,
212
218
  effectiveFloorPlanCode,
@@ -232,11 +238,44 @@ var PisellReservationCore = (props) => {
232
238
  ),
233
239
  [floorConfigForBindings.sceneElements, gridDataSourceKey]
234
240
  );
241
+ const resourceWallFilterIdsForFloorBooking = (0, import_react.useMemo)(() => {
242
+ if (!isInternalListData) return [];
243
+ const sp = gridBookingData.searchParams;
244
+ const fv = sp == null ? void 0 : sp.filter;
245
+ if (!fv || typeof fv !== "object" || fv === null) return [];
246
+ const vals = fv.values;
247
+ if (!vals || typeof vals !== "object") return [];
248
+ const raw = vals[import_materials.DEFAULT_RESOURCE_WALL_FILTER_FIELD_KEY];
249
+ if (!Array.isArray(raw)) return [];
250
+ return raw.map(String).filter(Boolean);
251
+ }, [isInternalListData, gridBookingData.searchParams]);
235
252
  const floorBookingResourceReady = isInternalListData && !resourceBoardData.loading;
236
- const floorBookingExtraParams = (0, import_react.useMemo)(
237
- () => ({ form_record_ids: floorBoundFormRecordIds }),
238
- [floorBoundFormRecordIds]
239
- );
253
+ const floorBookingExtraParams = (0, import_react.useMemo)(() => {
254
+ const normalizeIds = (ids) => {
255
+ const out = [];
256
+ for (const id of ids) {
257
+ const t = String(id).trim();
258
+ if (!t) continue;
259
+ const n = Number(t);
260
+ if (Number.isFinite(n) && n > 0 && /^\d+$/.test(t)) {
261
+ out.push(Math.trunc(n));
262
+ } else {
263
+ out.push(t);
264
+ }
265
+ }
266
+ return out;
267
+ };
268
+ if (shellBodyView === "resourceWall" && resourceWallFilterIdsForFloorBooking.length > 0) {
269
+ return {
270
+ form_record_ids: normalizeIds(resourceWallFilterIdsForFloorBooking)
271
+ };
272
+ }
273
+ return { form_record_ids: floorBoundFormRecordIds };
274
+ }, [
275
+ shellBodyView,
276
+ resourceWallFilterIdsForFloorBooking,
277
+ floorBoundFormRecordIds
278
+ ]);
240
279
  const floorDayBookingData = (0, import_usePisellReservationBookingData.usePisellReservationBookingData)(
241
280
  floorBookingResourceReady,
242
281
  { listPageSize: 999, extraRequestParams: floorBookingExtraParams }
@@ -299,6 +338,24 @@ var PisellReservationCore = (props) => {
299
338
  timeNavigatorPropsProp,
300
339
  timelineRange: effectiveTimelineRange
301
340
  });
341
+ (0, import_react.useEffect)(() => {
342
+ if (!isInternalListData) return;
343
+ const raw = salesResourceBookings;
344
+ if (raw == null) {
345
+ console.log("[PisellReservation] salesResourceBookings", null);
346
+ return;
347
+ }
348
+ if (!Array.isArray(raw)) {
349
+ console.log("[PisellReservation] salesResourceBookings (non-array)", raw);
350
+ return;
351
+ }
352
+ const head = raw.slice(0, 3);
353
+ console.log("[PisellReservation] salesResourceBookings", {
354
+ length: raw.length,
355
+ head,
356
+ full: raw
357
+ });
358
+ }, [isInternalListData, salesResourceBookings]);
302
359
  const tables = (0, import_react.useMemo)(
303
360
  () => (0, import_reservationTablesMerge.buildReservationMergedTableRows)({
304
361
  dataSourcesProp,
@@ -320,6 +377,29 @@ var PisellReservationCore = (props) => {
320
377
  dataProp
321
378
  ]
322
379
  );
380
+ const resourceWallFilterSelectOptions = (0, import_react.useMemo)(() => {
381
+ if (isInternalListData && Array.isArray(resourceBoardData.data) && resourceBoardData.data.length > 0) {
382
+ return (0, import_formResourceToReservationTables.formResourceListToReservationTableRows)(
383
+ resourceBoardData.data
384
+ ).map((r) => ({
385
+ label: r.code || r.main_field || String(r.id),
386
+ value: String(r.id)
387
+ }));
388
+ }
389
+ const seen = /* @__PURE__ */ new Set();
390
+ const out = [];
391
+ for (const row of tables) {
392
+ const id = String(row.id);
393
+ if (!id || id === "undefined" || id === "null") continue;
394
+ if (seen.has(id)) continue;
395
+ seen.add(id);
396
+ out.push({
397
+ label: row.code || row.main_field || id,
398
+ value: id
399
+ });
400
+ }
401
+ return out;
402
+ }, [isInternalListData, resourceBoardData.data, tables]);
323
403
  const calendarOrderedResourceIds = (0, import_react.useMemo)(() => {
324
404
  const fromScene = (0, import_calendarAdapter.orderedCanvasResourceRecordIdStrings)(
325
405
  floorConfigForBindings.sceneElements,
@@ -369,6 +449,104 @@ var PisellReservationCore = (props) => {
369
449
  }),
370
450
  [floorDayBookingData.data, calendarCanvasIdSet]
371
451
  );
452
+ (0, import_react.useEffect)(() => {
453
+ if (shellBodyView !== "calendar") return;
454
+ const summarizeBooking = (b) => ({
455
+ id: b.id,
456
+ courtId: b.courtId,
457
+ date: b.date,
458
+ startHour: b.startHour,
459
+ endHour: b.endHour,
460
+ name: b.name,
461
+ kind: b.kind
462
+ });
463
+ const summarizeResource = (r) => ({
464
+ id: r.id,
465
+ name: r.name,
466
+ groupType: r.groupType
467
+ });
468
+ console.log("[PisellReservation] calendar 展示数据", {
469
+ shellBodyView,
470
+ calendarGranularity,
471
+ anchorDate: schedule.date.toISOString(),
472
+ scheduleAt: (0, import_dayjs.default)(schedule.at).isValid() ? (0, import_dayjs.default)(schedule.at).toISOString() : String(schedule.at),
473
+ timelineRange: effectiveTimelineRange,
474
+ floorDayBookingLoading: floorDayBookingData.loading,
475
+ floorDayBookingCount: Array.isArray(floorDayBookingData.data) ? floorDayBookingData.data.length : 0,
476
+ calendarOrderedResourceIds,
477
+ resourcesCount: calendarResources.length,
478
+ resourcesPreview: calendarResources.slice(0, 12).map(summarizeResource),
479
+ bookingsCount: calendarBookings.length,
480
+ bookingsPreview: calendarBookings.slice(0, 12).map(summarizeBooking),
481
+ resourcesFull: calendarResources,
482
+ bookingsFull: calendarBookings
483
+ });
484
+ }, [
485
+ shellBodyView,
486
+ calendarGranularity,
487
+ schedule.date,
488
+ schedule.at,
489
+ effectiveTimelineRange,
490
+ floorDayBookingData.loading,
491
+ floorDayBookingData.data,
492
+ calendarOrderedResourceIds,
493
+ calendarResources,
494
+ calendarBookings
495
+ ]);
496
+ const venueWallCards = (0, import_react.useMemo)(
497
+ () => (0, import_mapReservationToVenueWallCards.mapReservationRowsToVenueWallCards)(tables),
498
+ [tables]
499
+ );
500
+ (0, import_react.useEffect)(() => {
501
+ if (shellBodyView !== "resourceWall") return;
502
+ const filterKey = import_materials.DEFAULT_RESOURCE_WALL_FILTER_FIELD_KEY;
503
+ const sp = searchParams;
504
+ const fv = sp == null ? void 0 : sp.filter;
505
+ const vals = fv && typeof fv === "object" && fv !== null && typeof fv.values === "object" && fv.values !== null ? fv.values : {};
506
+ const selectedRaw = vals[filterKey];
507
+ const selectedIds = Array.isArray(selectedRaw) ? selectedRaw.map((x) => String(x)) : null;
508
+ const allCards = venueWallCards;
509
+ const visibleCards = selectedIds == null || selectedIds.length === 0 ? allCards : (() => {
510
+ const set = new Set(selectedIds);
511
+ return allCards.filter((c) => set.has(String(c.resourceId)));
512
+ })();
513
+ const summarize = (c) => {
514
+ var _a2;
515
+ return {
516
+ resourceId: c.resourceId,
517
+ resource: c.resource,
518
+ area: c.area,
519
+ status: c.status,
520
+ currentTime: c.currentTime,
521
+ currentBooking: c.currentBooking,
522
+ startsInMin: c.startsInMin,
523
+ lateMin: c.lateMin,
524
+ remainingMin: c.remainingMin,
525
+ nextListHead: (_a2 = c.nextList) == null ? void 0 : _a2.slice(0, 2)
526
+ };
527
+ };
528
+ console.log("[PisellReservation] resourceWall 展示数据", {
529
+ shellBodyView,
530
+ filterFieldKey: filterKey,
531
+ searchParamsFilterValues: vals,
532
+ selectedIds,
533
+ floorDayBookingLoading: floorDayBookingData.loading,
534
+ floorBookingExtraParams,
535
+ cardsCount: allCards.length,
536
+ visibleCount: visibleCards.length,
537
+ cardsPreview: allCards.slice(0, 8).map(summarize),
538
+ visiblePreview: visibleCards.slice(0, 8).map(summarize),
539
+ cardsFull: allCards,
540
+ visibleFull: visibleCards
541
+ });
542
+ }, [
543
+ shellBodyView,
544
+ venueWallCards,
545
+ floorDayBookingData.loading,
546
+ searchParams,
547
+ floorBookingExtraParams
548
+ ]);
549
+ const resourceWallFilterStorageKey = `${import_reservationConstants.PISELL_RESERVATION_RESOURCE_WALL_FILTER_STORAGE_PREFIX}:${bodyViewStorageKey ?? "default"}`;
372
550
  const debouncedScheduleKey = (0, import_react.useMemo)(
373
551
  () => `${(0, import_dayjs.default)(debouncedSchedule.date).startOf("day").valueOf()}_${(0, import_dayjs.default)(
374
552
  debouncedSchedule.at
@@ -406,6 +584,7 @@ var PisellReservationCore = (props) => {
406
584
  const bodyViewRef = (0, import_react.useRef)(
407
585
  (0, import_reservationDataUtils.readBodyViewFromStorageKey)(bodyViewStorageKey)
408
586
  );
587
+ const resourceWallFilterHydratedRef = (0, import_react.useRef)(false);
409
588
  const floorMapLayoutRef = (0, import_react.useRef)(null);
410
589
  const [followWallClock, setFollowWallClock] = (0, import_react.useState)(true);
411
590
  const [calendarGranularity, setCalendarGranularity] = (0, import_react.useState)("week");
@@ -442,7 +621,7 @@ var PisellReservationCore = (props) => {
442
621
  }
443
622
  prevCommittedDateRef.current = d;
444
623
  }
445
- if ((bodyViewRef.current === "floorMap" || bodyViewRef.current === "calendar") && !isInternalListData) {
624
+ if ((bodyViewRef.current === "floorMap" || bodyViewRef.current === "calendar" || bodyViewRef.current === "resourceWall") && !isInternalListData) {
446
625
  (_a2 = onSearchRef.current) == null ? void 0 : _a2.call(onSearchRef, {
447
626
  ...searchParamsRefControlled.current ?? {},
448
627
  reservationDate: debouncedSchedule.date.toISOString(),
@@ -736,6 +915,74 @@ var PisellReservationCore = (props) => {
736
915
  );
737
916
  const onSearch = isInternalListData ? onGridBookingSearch : onSearchProp;
738
917
  const onReset = isInternalListData ? gridBookingData.onReset : onResetProp;
918
+ (0, import_react.useEffect)(() => {
919
+ if (!isInternalListData) return;
920
+ if (resourceWallFilterHydratedRef.current) return;
921
+ if (calendarOrderedResourceIds.length === 0) return;
922
+ const fv = searchParams == null ? void 0 : searchParams.filter;
923
+ const values = fv && typeof fv === "object" && fv !== null && typeof fv.values === "object" && fv.values !== null ? fv.values : {};
924
+ const maxRw = import_reservationConstants.RESERVATION_RESOURCE_WALL_MAX_RESOURCE_SELECTION;
925
+ const existing = values.resource_wall_resource_ids;
926
+ if (Array.isArray(existing) && existing.length > 0) {
927
+ if (existing.length > maxRw && onSearch) {
928
+ onSearch({
929
+ ...searchParams,
930
+ filter: {
931
+ ...typeof searchParams.filter === "object" && searchParams.filter !== null ? searchParams.filter : {},
932
+ values: {
933
+ ...typeof values === "object" ? values : {},
934
+ resource_wall_resource_ids: existing.slice(0, maxRw).map(String)
935
+ }
936
+ }
937
+ });
938
+ }
939
+ resourceWallFilterHydratedRef.current = true;
940
+ return;
941
+ }
942
+ let stored;
943
+ try {
944
+ const raw = localStorage.getItem(resourceWallFilterStorageKey);
945
+ if (raw) stored = JSON.parse(raw);
946
+ } catch {
947
+ }
948
+ const all = calendarOrderedResourceIds;
949
+ const storedIds = Array.isArray(stored) && stored.length > 0 ? stored : [];
950
+ const picked = storedIds.length > 0 ? all.filter((id) => storedIds.includes(id)).slice(0, maxRw) : all.slice(0, maxRw);
951
+ const finalList = picked.length > 0 ? picked : all.slice(0, maxRw);
952
+ resourceWallFilterHydratedRef.current = true;
953
+ if (!onSearch) return;
954
+ onSearch({
955
+ ...searchParams,
956
+ filter: {
957
+ ...typeof searchParams.filter === "object" && searchParams.filter !== null ? searchParams.filter : {},
958
+ values: {
959
+ ...typeof values === "object" ? values : {},
960
+ resource_wall_resource_ids: finalList
961
+ }
962
+ }
963
+ });
964
+ }, [
965
+ isInternalListData,
966
+ calendarOrderedResourceIds,
967
+ resourceWallFilterStorageKey,
968
+ onSearch,
969
+ searchParams
970
+ ]);
971
+ (0, import_react.useEffect)(() => {
972
+ const fv = searchParams == null ? void 0 : searchParams.filter;
973
+ if (!fv || typeof fv !== "object" || fv === null || typeof fv.values !== "object" || fv.values === null) {
974
+ return;
975
+ }
976
+ const rid = fv.values.resource_wall_resource_ids;
977
+ if (!Array.isArray(rid)) return;
978
+ try {
979
+ localStorage.setItem(
980
+ resourceWallFilterStorageKey,
981
+ JSON.stringify(rid.map(String))
982
+ );
983
+ } catch {
984
+ }
985
+ }, [searchParams == null ? void 0 : searchParams.filter, resourceWallFilterStorageKey]);
739
986
  const handleRouteJump = (0, import_ahooks.useMemoizedFn)((routePath) => {
740
987
  var _a2, _b2;
741
988
  if (!routePath) return;
@@ -829,6 +1076,26 @@ var PisellReservationCore = (props) => {
829
1076
  effectiveTimelineRange.end
830
1077
  ]
831
1078
  );
1079
+ const reservationResourceWallQuickFilter = (0, import_react.useMemo)(
1080
+ () => ({
1081
+ filterList: [
1082
+ {
1083
+ type: "custom",
1084
+ key: "resource_wall_resource_ids",
1085
+ name: "resource_wall_resource_ids",
1086
+ label: import_utils.locales.getText(import_reservationConstants.I18N_RESOURCE_WALL_RESOURCES),
1087
+ props: {
1088
+ options: resourceWallFilterSelectOptions
1089
+ },
1090
+ other: {
1091
+ component: import_ReservationResourceWallResourceSelect.ReservationResourceWallResourceSelect
1092
+ }
1093
+ }
1094
+ ],
1095
+ hideFilterNamesOnFloorMap: []
1096
+ }),
1097
+ [resourceWallFilterSelectOptions]
1098
+ );
832
1099
  const toolBarMerged = (0, import_react.useMemo)(() => {
833
1100
  const {
834
1101
  tabs: extraTabs,
@@ -839,6 +1106,7 @@ var PisellReservationCore = (props) => {
839
1106
  return {
840
1107
  ...bookingToolBar ?? {},
841
1108
  ...restToolbar,
1109
+ quickFilter: reservationResourceWallQuickFilter,
842
1110
  tabs: /* @__PURE__ */ import_react.default.createElement(
843
1111
  import_PisellReservationSubcomponents.PisellReservationToolbarTabs,
844
1112
  {
@@ -871,7 +1139,8 @@ var PisellReservationCore = (props) => {
871
1139
  mergedTimeNavigatorProps,
872
1140
  schedulePropsProp,
873
1141
  loadReservationDensity,
874
- calendarGranularity
1142
+ calendarGranularity,
1143
+ reservationResourceWallQuickFilter
875
1144
  ]);
876
1145
  const recordBoardGrid = (0, import_react.useMemo)(() => {
877
1146
  return bookingChildProps.grid;
@@ -968,6 +1237,19 @@ var PisellReservationCore = (props) => {
968
1237
  },
969
1238
  [tables]
970
1239
  );
1240
+ const handleBlockedTimeSave = (0, import_react.useCallback)(
1241
+ async (payload) => {
1242
+ try {
1243
+ await import_utils2.request.getRequest().post("/shop/schedule/blocked-time", payload);
1244
+ import_antd.message.success("保存成功");
1245
+ await floorDayBookingData.refreshAsync();
1246
+ return true;
1247
+ } catch {
1248
+ return false;
1249
+ }
1250
+ },
1251
+ [floorDayBookingData]
1252
+ );
971
1253
  const calendarLoadKey = (0, import_react.useMemo)(
972
1254
  () => `${calendarGranularity}_${(0, import_dayjs.default)(schedule.date).startOf("day").valueOf()}_${(0, import_dayjs.default)(
973
1255
  schedule.at
@@ -1000,7 +1282,8 @@ var PisellReservationCore = (props) => {
1000
1282
  persistGuard: reservationCalendarPersist,
1001
1283
  resources: calendarResources,
1002
1284
  bookings: calendarBookings,
1003
- loading: calendarLoading,
1285
+ /** 不套全屏 Spin:数据刷新时仍展示上一帧内容,避免切日历闪 loading */
1286
+ loading: false,
1004
1287
  onViewportChange: handleCalendarViewportChange,
1005
1288
  onBookingClick: handleCalendarBookingClick,
1006
1289
  timelineRange: effectiveTimelineRange,
@@ -1009,21 +1292,31 @@ var PisellReservationCore = (props) => {
1009
1292
  anchorDate: schedule.date.toDate(),
1010
1293
  onAnchorDateChange: handleCalendarAnchorChange,
1011
1294
  slotStepMinutes: 30,
1012
- renderBooking: renderReservationCalendarBooking
1295
+ renderBooking: renderReservationCalendarBooking,
1296
+ onBlockedTimeSave: handleBlockedTimeSave,
1297
+ blockedTimeSalesChannels: ["online_store"]
1013
1298
  };
1014
1299
  }, [
1015
1300
  reservationCalendarPersist,
1016
1301
  calendarResources,
1017
1302
  calendarBookings,
1018
- calendarLoading,
1019
1303
  handleCalendarViewportChange,
1020
1304
  handleCalendarBookingClick,
1021
1305
  calendarGranularity,
1022
1306
  schedule.date,
1023
1307
  handleCalendarAnchorChange,
1024
1308
  effectiveTimelineRange,
1025
- renderReservationCalendarBooking
1309
+ renderReservationCalendarBooking,
1310
+ handleBlockedTimeSave
1026
1311
  ]);
1312
+ const reservationResourceWallSlotProps = (0, import_react.useMemo)(
1313
+ () => ({
1314
+ cards: venueWallCards,
1315
+ loading: floorDayBookingData.loading,
1316
+ filterFieldKey: import_materials.DEFAULT_RESOURCE_WALL_FILTER_FIELD_KEY
1317
+ }),
1318
+ [venueWallCards, floorDayBookingData.loading]
1319
+ );
1027
1320
  return /* @__PURE__ */ import_react.default.createElement(
1028
1321
  import_date_picker.LocalizationProvider,
1029
1322
  {
@@ -1057,20 +1350,27 @@ var PisellReservationCore = (props) => {
1057
1350
  batchActionBar: bookingChildProps.batchActionBar,
1058
1351
  floorMap: floorMapMerged,
1059
1352
  calendar: reservationCalendarSlotProps,
1353
+ resourceWall: reservationResourceWallSlotProps,
1060
1354
  defaultBodyView: "floorMap",
1061
1355
  bodyViewStorageKey,
1062
1356
  bodyViewSwitchable,
1063
1357
  lockedBodyView,
1064
1358
  floorMapLayoutRef
1065
1359
  },
1066
- /* @__PURE__ */ import_react.default.createElement(import_materials.PisellRecordBoard.ShellFrame, null, /* @__PURE__ */ import_react.default.createElement(import_PisellReservationSubcomponents.RecordBoardBodyViewCapture, { bodyViewRef }), /* @__PURE__ */ import_react.default.createElement(
1360
+ /* @__PURE__ */ import_react.default.createElement(import_materials.PisellRecordBoard.ShellFrame, null, /* @__PURE__ */ import_react.default.createElement(
1361
+ import_PisellReservationSubcomponents.RecordBoardBodyViewCapture,
1362
+ {
1363
+ bodyViewRef,
1364
+ onBodyViewChange: setShellBodyView
1365
+ }
1366
+ ), /* @__PURE__ */ import_react.default.createElement(
1067
1367
  import_PisellReservationSubcomponents.ScheduleSyncOnFloorEnter,
1068
1368
  {
1069
1369
  schedule,
1070
1370
  isInternalListData,
1071
1371
  patchSearchParams: floorDayBookingData.patchSearchParams
1072
1372
  }
1073
- ), /* @__PURE__ */ import_react.default.createElement(import_materials.PisellRecordBoard.GridLayout, null), /* @__PURE__ */ import_react.default.createElement(import_materials.PisellRecordBoard.FloorMap, null), /* @__PURE__ */ import_react.default.createElement(import_materials.PisellRecordBoard.Calendar, null))
1373
+ ), /* @__PURE__ */ import_react.default.createElement(import_materials.PisellRecordBoard.GridLayout, null), /* @__PURE__ */ import_react.default.createElement(import_materials.PisellRecordBoard.FloorMap, null), /* @__PURE__ */ import_react.default.createElement(import_materials.PisellRecordBoard.Calendar, null), /* @__PURE__ */ import_react.default.createElement(import_materials.PisellRecordBoard.ResourceWall, null))
1074
1374
  ),
1075
1375
  /* @__PURE__ */ import_react.default.createElement(
1076
1376
  import_materials.PisellModal,
@@ -1,17 +1,18 @@
1
1
  /**
2
2
  * 预约页拆出的轻量子组件(无业务数据请求):
3
- * - `RecordBoardBodyViewCapture`:把当前 grid/floorMap 同步到父组件 ref,供 debounce effect 读 bodyView;
3
+ * - `RecordBoardBodyViewCapture`:同步 bodyView ref,并可通知宿主;
4
4
  * - `ScheduleSyncOnFloorEnter`:从表格回到平面图/日历、或从日历回到平面图时,用当前营业日 patch 列表时间窗口;
5
- * - `PisellReservationToolbarTabs`:平面图下的日程带 + 表格/平面图 Segmented
5
+ * - `PisellReservationToolbarTabs`:平面图/日历为日程带 + Segmented;表格 / 资源墙不展示日程带,仅 extraTabs
6
6
  * - `ReservationGridTopRight` / `PisellReservationScheduleEndActions` / `ReservationFloorMapCanvasTabsTrailing`:工具栏与画布尾区。
7
7
  */
8
8
  import React from 'react';
9
- import type { Dayjs } from 'dayjs';
9
+ import { type Dayjs } from 'dayjs';
10
10
  import type { PisellFloorMapLayoutRef, RecordBoardBodyView, ReservationScheduleBandValue } from '@pisell/materials';
11
11
  import type { PisellReservationProps } from '../types';
12
- /** 无 UI:仅将 RecordBoard Context 中的 `bodyView` 写入 ref */
12
+ /** 无 UI:将 RecordBoard Context 中的 `bodyView` 写入 ref,并可选通知宿主(如预约页按视图切换 booking 的 form_record_ids) */
13
13
  export declare function RecordBoardBodyViewCapture(props: {
14
14
  bodyViewRef: React.MutableRefObject<RecordBoardBodyView>;
15
+ onBodyViewChange?: (v: RecordBoardBodyView) => void;
15
16
  }): null;
16
17
  /** 从表格切回平面图/日历,或从日历回到平面图时,用当前日程收敛 `booking_time` 查询窗(与视口逻辑一致) */
17
18
  export declare function ScheduleSyncOnFloorEnter(props: {
@@ -38,8 +39,8 @@ export declare type PisellReservationToolbarTabsProps = {
38
39
  calendarGranularity?: 'day' | 'week' | 'month';
39
40
  };
40
41
  /**
41
- * 顶栏 tabs:平面图下为日程带 + 时间轴 + 标题旁切换;表格下不展示 ScheduleBand,
42
- * 切换器由 RecordBoard 工具栏顶行(Find 左侧)承担,与历史行为一致。
42
+ * 顶栏 tabs:**仅平面图、日历**下为日程带 + 时间轴 + 标题旁切换;表格 / 资源墙不展示 ScheduleBand,
43
+ * 切换器由 RecordBoard 工具栏顶行承担(表格态在 Find 左侧;资源墙无 Find 时在顶行左侧),与历史行为一致。
43
44
  */
44
45
  export declare function PisellReservationToolbarTabs(props: PisellReservationToolbarTabsProps): JSX.Element | null;
45
46
  /** 表格视图时展示工具栏右上角透传;平面图时收起(编辑入口在画布 Tab 行右侧) */
@@ -48,8 +48,10 @@ var import_reservationConstants = require("../reservationConstants");
48
48
  function RecordBoardBodyViewCapture(props) {
49
49
  const { bodyView } = (0, import_materials.useRecordBoardContext)();
50
50
  (0, import_react.useEffect)(() => {
51
+ var _a;
51
52
  props.bodyViewRef.current = bodyView;
52
- }, [bodyView, props.bodyViewRef]);
53
+ (_a = props.onBodyViewChange) == null ? void 0 : _a.call(props, bodyView);
54
+ }, [bodyView, props.bodyViewRef, props.onBodyViewChange]);
53
55
  return null;
54
56
  }
55
57
  function ScheduleSyncOnFloorEnter(props) {
@@ -57,12 +59,12 @@ function ScheduleSyncOnFloorEnter(props) {
57
59
  const prevRef = (0, import_react.useRef)(null);
58
60
  (0, import_react.useEffect)(() => {
59
61
  const prev = prevRef.current;
60
- if (props.isInternalListData && (bodyView === "floorMap" || bodyView === "calendar") && prev !== null && prev !== "floorMap" && prev !== "calendar") {
62
+ if (props.isInternalListData && (bodyView === "floorMap" || bodyView === "calendar" || bodyView === "resourceWall") && prev !== null && prev !== "floorMap" && prev !== "calendar" && prev !== "resourceWall") {
61
63
  props.patchSearchParams(
62
64
  (p) => (0, import_reservationDataUtils.mergeSearchParamsBookingWindow)(p, props.schedule.date)
63
65
  );
64
66
  }
65
- if (props.isInternalListData && prev === "calendar" && bodyView === "floorMap") {
67
+ if (props.isInternalListData && (prev === "calendar" || prev === "resourceWall") && bodyView === "floorMap") {
66
68
  props.patchSearchParams(
67
69
  (p) => (0, import_reservationDataUtils.mergeSearchParamsBookingWindow)(p, props.schedule.date)
68
70
  );
@@ -84,14 +86,19 @@ function PisellReservationToolbarTabs(props) {
84
86
  const hasGrid = (shellMeta == null ? void 0 : shellMeta.hasGridContent) ?? true;
85
87
  const hasFloor = shellMeta == null ? void 0 : shellMeta.hasFloorMapSlot;
86
88
  const hasCalendar = shellMeta == null ? void 0 : shellMeta.hasCalendarSlot;
89
+ const hasResourceWall = shellMeta == null ? void 0 : shellMeta.hasResourceWallSlot;
87
90
  const floorForToggle = shellMeta == null ? void 0 : shellMeta.effectiveFloorMapProps;
88
91
  const canFloor = Boolean(hasFloor && floorForToggle != null);
89
92
  const canCalendar = Boolean(hasCalendar);
90
- const bodyViewOptionCount = (hasGrid ? 1 : 0) + (canFloor ? 1 : 0) + (canCalendar ? 1 : 0);
93
+ const canResourceWall = Boolean(hasResourceWall);
94
+ const bodyViewOptionCount = (hasGrid ? 1 : 0) + (canFloor ? 1 : 0) + (canCalendar ? 1 : 0) + (canResourceWall ? 1 : 0);
91
95
  const allowBodyViewToggle = bodyViewOptionCount >= 2 && bodyViewSwitchable !== false;
92
96
  if (bodyView === "grid") {
93
97
  return props.extraTabs ? /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, props.extraTabs) : null;
94
98
  }
99
+ if (bodyView === "resourceWall") {
100
+ return props.extraTabs ? /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, props.extraTabs) : null;
101
+ }
95
102
  const bodyViewSegmentedOptions = (0, import_react.useMemo)(() => {
96
103
  const opts = [];
97
104
  if (canFloor) {
@@ -103,11 +110,17 @@ function PisellReservationToolbarTabs(props) {
103
110
  value: "calendar"
104
111
  });
105
112
  }
113
+ if (canResourceWall) {
114
+ opts.push({
115
+ label: import_utils.locales.getText(import_reservationConstants.I18N_VIEW_RESOURCE_WALL),
116
+ value: "resourceWall"
117
+ });
118
+ }
106
119
  if (hasGrid) {
107
120
  opts.push({ label: import_utils.locales.getText(import_reservationConstants.I18N_VIEW_GRID), value: "grid" });
108
121
  }
109
122
  return opts;
110
- }, [canFloor, canCalendar, hasGrid]);
123
+ }, [canFloor, canCalendar, canResourceWall, hasGrid]);
111
124
  const bodyViewToggle = allowBodyViewToggle ? /* @__PURE__ */ import_react.default.createElement(
112
125
  import_antd.Segmented,
113
126
  {
@@ -0,0 +1,14 @@
1
+ /// <reference types="react" />
2
+ export declare type ReservationResourceWallResourceSelectProps = {
3
+ value?: string[];
4
+ onChange?: (v: string[]) => void;
5
+ /** 与日历资源同源:{ label, value } */
6
+ options?: Array<{
7
+ label: string;
8
+ value: string;
9
+ }>;
10
+ };
11
+ /**
12
+ * 大屏快筛:画布资源多选(写入 `searchParams.filter.values.resource_wall_resource_ids`)。
13
+ */
14
+ export declare function ReservationResourceWallResourceSelect(props: ReservationResourceWallResourceSelectProps): JSX.Element;
@@ -0,0 +1,60 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+
29
+ // src/plus/pisellReservation/components/ReservationResourceWallResourceSelect.tsx
30
+ var ReservationResourceWallResourceSelect_exports = {};
31
+ __export(ReservationResourceWallResourceSelect_exports, {
32
+ ReservationResourceWallResourceSelect: () => ReservationResourceWallResourceSelect
33
+ });
34
+ module.exports = __toCommonJS(ReservationResourceWallResourceSelect_exports);
35
+ var import_react = __toESM(require("react"));
36
+ var import_antd = require("antd");
37
+ var import_utils = require("@pisell/utils");
38
+ var import_reservationConstants = require("../reservationConstants");
39
+ function ReservationResourceWallResourceSelect(props) {
40
+ const { value, onChange, options = [] } = props;
41
+ const max = import_reservationConstants.RESERVATION_RESOURCE_WALL_MAX_RESOURCE_SELECTION;
42
+ return /* @__PURE__ */ import_react.default.createElement(
43
+ import_antd.Select,
44
+ {
45
+ mode: "multiple",
46
+ allowClear: true,
47
+ showSearch: true,
48
+ optionFilterProp: "label",
49
+ placeholder: import_utils.locales.getText(import_reservationConstants.I18N_RESOURCE_WALL_RESOURCES),
50
+ value: (value ?? []).slice(0, max),
51
+ onChange: (v) => onChange == null ? void 0 : onChange(v.slice(0, max)),
52
+ options,
53
+ style: { minWidth: 260, maxWidth: 420 }
54
+ }
55
+ );
56
+ }
57
+ // Annotate the CommonJS export names for ESM import in node:
58
+ 0 && (module.exports = {
59
+ ReservationResourceWallResourceSelect
60
+ });
@@ -70,7 +70,7 @@ function stopUiClick(e) {
70
70
  }
71
71
  function resolveOrderIdForHostActions(bookingRaw) {
72
72
  const order = bookingRaw.order;
73
- const id = (order == null ? void 0 : order.id) ?? bookingRaw.order_id;
73
+ const id = (order == null ? void 0 : order.id) ?? (order == null ? void 0 : order.order_id) ?? bookingRaw.order_id;
74
74
  if (id == null || id === "") return void 0;
75
75
  if (typeof id === "number" && Number.isFinite(id)) return id;
76
76
  const s = String(id).trim();