@pisell/private-materials 6.12.124 → 6.12.126

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 (39) 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.css +1 -1
  6. package/build/lowcode/render/default/view.js +2 -2
  7. package/build/lowcode/view.css +1 -1
  8. package/build/lowcode/view.js +2 -2
  9. package/es/components/bigSale/components/KioskCategorySidebar/index.js +1 -1
  10. package/es/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/CalenDateWeek/WeekItem/index.js +2 -2
  11. package/es/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/CalenDateWeek/index.js +5 -3
  12. package/es/components/eventBooking/components/bookingAvailabilityCalendar/components/SelectDate/index.js +2 -1
  13. package/es/components/eventBooking/components/bookingAvailabilityCalendar/index.d.ts +5 -0
  14. package/es/components/eventBooking/components/bookingAvailabilityCalendar/index.js +2 -1
  15. package/es/plus/productSelect/ProductCard/SkuCard/locales.js +10 -5
  16. package/es/plus/productSelect/ProductCard/index.js +25 -5
  17. package/es/plus/productSelect/ProductCard/utils.js +11 -1
  18. package/es/pro/skuDetailModal/flow/index.less +27 -0
  19. package/es/pro/skuDetailModal/flow/modules/date.js +1 -0
  20. package/es/pro/skuDetailModal/flow/modules/resource.js +1 -2
  21. package/es/pro/skuDetailModal/flow/modules/resource.less +37 -0
  22. package/es/pro/skuDetailModal/index.js +45 -3
  23. package/es/pro/skuDetailModal/index.less +12 -7
  24. package/lib/components/bigSale/components/KioskCategorySidebar/index.js +1 -1
  25. package/lib/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/CalenDateWeek/WeekItem/index.js +2 -2
  26. package/lib/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/CalenDateWeek/index.js +5 -3
  27. package/lib/components/eventBooking/components/bookingAvailabilityCalendar/components/SelectDate/index.js +2 -1
  28. package/lib/components/eventBooking/components/bookingAvailabilityCalendar/index.d.ts +5 -0
  29. package/lib/components/eventBooking/components/bookingAvailabilityCalendar/index.js +2 -1
  30. package/lib/plus/productSelect/ProductCard/SkuCard/locales.js +10 -5
  31. package/lib/plus/productSelect/ProductCard/index.js +24 -4
  32. package/lib/plus/productSelect/ProductCard/utils.js +11 -0
  33. package/lib/pro/skuDetailModal/flow/index.less +27 -0
  34. package/lib/pro/skuDetailModal/flow/modules/date.js +1 -0
  35. package/lib/pro/skuDetailModal/flow/modules/resource.js +1 -2
  36. package/lib/pro/skuDetailModal/flow/modules/resource.less +37 -0
  37. package/lib/pro/skuDetailModal/index.js +45 -3
  38. package/lib/pro/skuDetailModal/index.less +12 -7
  39. package/package.json +2 -2
@@ -1,5 +1,5 @@
1
1
  import { _objectSpread2 } from "../../../../_virtual/_@oxc-project_runtime@0.122.0/helpers/objectSpread2.js";
2
- import React, { forwardRef, useImperativeHandle, useMemo, useRef } from "react";
2
+ import React, { forwardRef, useEffect, useImperativeHandle, useMemo, useRef } from "react";
3
3
  import { PisellTabbarTemplate1 } from "@pisell/materials";
4
4
  import "./index.less";
5
5
  //#region src/components/bigSale/components/KioskCategorySidebar/index.tsx
@@ -8,7 +8,7 @@ import { Iconfont } from "@pisell/materials";
8
8
  import "./index.less";
9
9
  //#region src/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/CalenDateWeek/WeekItem/index.tsx
10
10
  const WeekItem = (props) => {
11
- const { weekList, currentDate, setCurrentDate, isActive, productId, dateLimitData, getLimitData, cutTime, showStatusBar = true, ignoreAvailabilityDisabled = false, minSelectableDate, enableRangeSelection = false, selectedRangeStartDate, selectedRangeEndDate, showMonthHeader = false, disableCallToBook = false, onPrevWeek, onNextWeek, showNavigation = true } = props;
11
+ const { weekList, currentDate, setCurrentDate, isActive, productId, dateLimitData, getLimitData, cutTime, showStatusBar = true, ignoreAvailabilityDisabled = false, minSelectableDate, minViewDate, enableRangeSelection = false, selectedRangeStartDate, selectedRangeEndDate, showMonthHeader = false, disableCallToBook = false, onPrevWeek, onNextWeek, showNavigation = true } = props;
12
12
  const [monthIndex, setMonthIndex] = useState([]);
13
13
  useEffect(() => {
14
14
  if (isActive && productId) {}
@@ -20,7 +20,7 @@ const WeekItem = (props) => {
20
20
  useEffect(() => {
21
21
  setMonthIndex(getMonthIndex(weekList));
22
22
  }, [weekList]);
23
- const prevWeekDisabled = minSelectableDate && (weekList === null || weekList === void 0 ? void 0 : weekList[0]) && dayjs(weekList[0]).subtract(1, "day").isBefore(dayjs(minSelectableDate), "day");
23
+ const prevWeekDisabled = (minViewDate || minSelectableDate) && (weekList === null || weekList === void 0 ? void 0 : weekList[0]) && dayjs(weekList[0]).subtract(1, "day").isBefore(dayjs(minViewDate || minSelectableDate), "day");
24
24
  return /* @__PURE__ */ React.createElement("div", { className: "week-item-wrap" }, /* @__PURE__ */ React.createElement("div", { className: "week-item-content" }, showNavigation ? /* @__PURE__ */ React.createElement(Iconfont, {
25
25
  type: "pisell2-arrow-left",
26
26
  className: "week-item__icon",
@@ -9,7 +9,7 @@ import classNames from "classnames";
9
9
  import "./index.less";
10
10
  //#region src/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/CalenDateWeek/index.tsx
11
11
  const CalenDateWeek = (props) => {
12
- const { currentDate, dateChange, productId, timeList, dateLimitData, getLimitData, cutTime, showStatusBar = true, showDisabledStatus = true, ignoreAvailabilityDisabled = false, minSelectableDate, enableRangeSelection = false, selectedRangeStartDate, selectedRangeEndDate, showMonthHeader = false, enableSwipeNavigation = false, disableCallToBook = false } = props;
12
+ const { currentDate, dateChange, productId, timeList, dateLimitData, getLimitData, cutTime, showStatusBar = true, showDisabledStatus = true, ignoreAvailabilityDisabled = false, minSelectableDate, minViewDate, enableRangeSelection = false, selectedRangeStartDate, selectedRangeEndDate, showMonthHeader = false, enableSwipeNavigation = false, disableCallToBook = false } = props;
13
13
  const [weekList, setWeekList] = useState([]);
14
14
  const [weekAnchorDate, setWeekAnchorDate] = useState(currentDate);
15
15
  const [pendingWeekList, setPendingWeekList] = useState(null);
@@ -84,7 +84,8 @@ const CalenDateWeek = (props) => {
84
84
  if (weekListRef === null || weekListRef === void 0 ? void 0 : weekListRef.current) weekListRef.current.scrollLeft = 0;
85
85
  }, [currentDate, weekList]);
86
86
  const resolveWeekNavigation = (direction) => {
87
- const minDate = minSelectableDate ? dayjs(minSelectableDate).startOf("day") : null;
87
+ const minimumViewDate = minViewDate || minSelectableDate;
88
+ const minDate = minimumViewDate ? dayjs(minimumViewDate).startOf("day") : null;
88
89
  const nextDate = dayjs(weekAnchorDate).add(direction * 7, "day");
89
90
  const nextAnchorDate = direction < 0 && minDate && nextDate.isBefore(minDate, "day") ? minDate.format("YYYY-MM-DD") : nextDate.format("YYYY-MM-DD");
90
91
  const nextWeekList = initCurrentWeekData(nextAnchorDate);
@@ -181,6 +182,7 @@ const CalenDateWeek = (props) => {
181
182
  showStatusBar,
182
183
  ignoreAvailabilityDisabled,
183
184
  minSelectableDate,
185
+ minViewDate,
184
186
  enableRangeSelection,
185
187
  selectedRangeStartDate,
186
188
  selectedRangeEndDate,
@@ -190,7 +192,7 @@ const CalenDateWeek = (props) => {
190
192
  onNextWeek: () => handleWeekNavigate(1),
191
193
  showNavigation: !enableSwipeNavigation
192
194
  });
193
- const prevWeekDisabled = Boolean(minSelectableDate && (weekList === null || weekList === void 0 ? void 0 : weekList[0]) && dayjs(weekList[0]).subtract(1, "day").isBefore(dayjs(minSelectableDate), "day"));
195
+ const prevWeekDisabled = Boolean((minViewDate || minSelectableDate) && (weekList === null || weekList === void 0 ? void 0 : weekList[0]) && dayjs(weekList[0]).subtract(1, "day").isBefore(dayjs(minViewDate || minSelectableDate), "day"));
194
196
  return /* @__PURE__ */ React.createElement("div", { className: "calendar-week-wrap" }, /* @__PURE__ */ React.createElement("div", { className: "calendar-week-navigation" }, enableSwipeNavigation ? /* @__PURE__ */ React.createElement(Iconfont, {
195
197
  type: "pisell2-arrow-left",
196
198
  className: "calendar-week-navigation__icon",
@@ -11,7 +11,7 @@ import { Iconfont } from "@pisell/materials";
11
11
  import classNames from "classnames";
12
12
  import "./index.less";
13
13
  //#region src/components/eventBooking/components/bookingAvailabilityCalendar/components/SelectDate/index.tsx
14
- const SelectDate = ({ currentDate, detail, currentDateChange, setSurplusDisabledChange, cutTime, setCutTime, showCalendarPopup, showStatusLegend = true, showDateStatusBar = true, title = "Select a date", showHeader = true, showDisabledStatus = true, ignoreAvailabilityDisabled = false, minSelectableDate, enableRangeSelection = false, selectedRangeStartDate, selectedRangeEndDate, showMonthHeader = false, enableWeekSwipe = false, availabilityDates }, ref) => {
14
+ const SelectDate = ({ currentDate, detail, currentDateChange, setSurplusDisabledChange, cutTime, setCutTime, showCalendarPopup, showStatusLegend = true, showDateStatusBar = true, title = "Select a date", showHeader = true, showDisabledStatus = true, ignoreAvailabilityDisabled = false, minSelectableDate, minViewDate, enableRangeSelection = false, selectedRangeStartDate, selectedRangeEndDate, showMonthHeader = false, enableWeekSwipe = false, availabilityDates }, ref) => {
15
15
  const [dateLimitData, setDateLimitData] = useState(mock.availability_calendar.limitData);
16
16
  /**
17
17
  * UBS 日期结果只负责状态展示,不伪造旧事件预约的 times/库存结构。
@@ -67,6 +67,7 @@ const SelectDate = ({ currentDate, detail, currentDateChange, setSurplusDisabled
67
67
  showDisabledStatus,
68
68
  ignoreAvailabilityDisabled,
69
69
  minSelectableDate,
70
+ minViewDate,
70
71
  enableRangeSelection,
71
72
  selectedRangeStartDate,
72
73
  selectedRangeEndDate,
@@ -32,6 +32,11 @@ interface BookingAvailabilityCalendarProps {
32
32
  showDisabledStatus?: boolean;
33
33
  ignoreAvailabilityDisabled?: boolean;
34
34
  minSelectableDate?: string;
35
+ /**
36
+ * 周历允许查看的最早日期;未传时继续沿用 minSelectableDate。
37
+ * 该值只控制翻页边界,不会让不可选日期变成可选。
38
+ */
39
+ minViewDate?: string;
35
40
  enableRangeSelection?: boolean;
36
41
  selectedRangeStartDate?: string;
37
42
  selectedRangeEndDate?: string;
@@ -9,7 +9,7 @@ import "./index.less";
9
9
  const BookingAvailabilityCalendar = (props) => {
10
10
  var _mock$availability_ca, _mock$availability_ca2, _mock$availability_ca3;
11
11
  locales.init(locales_default, locales.locale || "en");
12
- const { showCalendarPopup, onDateChange, detail = (_mock$availability_ca = mock.availability_calendar) === null || _mock$availability_ca === void 0 ? void 0 : _mock$availability_ca.detail, currentDate = (_mock$availability_ca2 = mock.availability_calendar) === null || _mock$availability_ca2 === void 0 ? void 0 : _mock$availability_ca2.currentDate, cutTime = (_mock$availability_ca3 = mock.availability_calendar) === null || _mock$availability_ca3 === void 0 ? void 0 : _mock$availability_ca3.cutTime, onCurrentDateChange, onCutTimeChange, onSurplusDisabledChange, showStatusLegend = true, showDateStatusBar = true, theme = "light", className, title, showHeader, showDisabledStatus, ignoreAvailabilityDisabled, minSelectableDate, enableRangeSelection, selectedRangeStartDate, selectedRangeEndDate, showMonthHeader, enableWeekSwipe, availabilityDates } = props;
12
+ const { showCalendarPopup, onDateChange, detail = (_mock$availability_ca = mock.availability_calendar) === null || _mock$availability_ca === void 0 ? void 0 : _mock$availability_ca.detail, currentDate = (_mock$availability_ca2 = mock.availability_calendar) === null || _mock$availability_ca2 === void 0 ? void 0 : _mock$availability_ca2.currentDate, cutTime = (_mock$availability_ca3 = mock.availability_calendar) === null || _mock$availability_ca3 === void 0 ? void 0 : _mock$availability_ca3.cutTime, onCurrentDateChange, onCutTimeChange, onSurplusDisabledChange, showStatusLegend = true, showDateStatusBar = true, theme = "light", className, title, showHeader, showDisabledStatus, ignoreAvailabilityDisabled, minSelectableDate, minViewDate, enableRangeSelection, selectedRangeStartDate, selectedRangeEndDate, showMonthHeader, enableWeekSwipe, availabilityDates } = props;
13
13
  console.log(detail, currentDate, cutTime, "detail, currentDate, cutTime");
14
14
  return /* @__PURE__ */ React.createElement("div", { className: classNames("event-booking-availability-calendar", `event-booking-availability-calendar--${theme}`, className) }, /* @__PURE__ */ React.createElement(SelectDate_default, {
15
15
  showCalendarPopup,
@@ -29,6 +29,7 @@ const BookingAvailabilityCalendar = (props) => {
29
29
  showDisabledStatus,
30
30
  ignoreAvailabilityDisabled,
31
31
  minSelectableDate,
32
+ minViewDate,
32
33
  enableRangeSelection,
33
34
  selectedRangeStartDate,
34
35
  selectedRangeEndDate,
@@ -11,7 +11,8 @@ var locales_default = {
11
11
  "pisell2.sku-card.time.remaining": "Time Remaining",
12
12
  "pisell2.sku-card.capacity": "Capacity",
13
13
  "pisell2.sku-card.free": "Free",
14
- "pisell2.sku-card.max": "Max"
14
+ "pisell2.sku-card.max": "Max",
15
+ "pisell2.sku-card.sold-out": "Sold Out"
15
16
  },
16
17
  "zh-CN": {
17
18
  "pisell2.sku-card.search": "搜索",
@@ -24,7 +25,8 @@ var locales_default = {
24
25
  "pisell2.sku-card.time.remaining": "剩余",
25
26
  "pisell2.sku-card.capacity": "容量",
26
27
  "pisell2.sku-card.free": "免费",
27
- "pisell2.sku-card.max": "最大"
28
+ "pisell2.sku-card.max": "最大",
29
+ "pisell2.sku-card.sold-out": "已售罄"
28
30
  },
29
31
  "zh-HK": {
30
32
  "pisell2.sku-card.search": "搜索",
@@ -37,7 +39,8 @@ var locales_default = {
37
39
  "pisell2.sku-card.time.remaining": "剩余",
38
40
  "pisell2.sku-card.capacity": "容量",
39
41
  "pisell2.sku-card.free": "免費",
40
- "pisell2.sku-card.max": "最大"
42
+ "pisell2.sku-card.max": "最大",
43
+ "pisell2.sku-card.sold-out": "已售罄"
41
44
  },
42
45
  ja: {
43
46
  "pisell2.sku-card.search": "検索",
@@ -50,7 +53,8 @@ var locales_default = {
50
53
  "pisell2.sku-card.time.remaining": "残り時間",
51
54
  "pisell2.sku-card.capacity": "容量",
52
55
  "pisell2.sku-card.free": "無料",
53
- "pisell2.sku-card.max": "最大"
56
+ "pisell2.sku-card.max": "最大",
57
+ "pisell2.sku-card.sold-out": "売り切れ"
54
58
  },
55
59
  pt: {
56
60
  "pisell2.sku-card.search": "Pesquisar",
@@ -63,7 +67,8 @@ var locales_default = {
63
67
  "pisell2.sku-card.time.remaining": "Tempo Restante",
64
68
  "pisell2.sku-card.capacity": "Capacidade",
65
69
  "pisell2.sku-card.free": "Grátis",
66
- "pisell2.sku-card.max": "Máx"
70
+ "pisell2.sku-card.max": "Máx",
71
+ "pisell2.sku-card.sold-out": "Esgotado"
67
72
  }
68
73
  };
69
74
  //#endregion
@@ -1,10 +1,13 @@
1
1
  import { _objectSpread2 } from "../../../_virtual/_@oxc-project_runtime@0.122.0/helpers/objectSpread2.js";
2
+ import useEngineContext from "../../../hooks/useEngineContext.js";
2
3
  import { IntersectionTrigger } from "../components/IntersectionObserver.js";
3
4
  import index from "../components/pisellPriceText/index.js";
4
5
  import "./ProductCardSkeleton.js";
5
6
  import { getStandardWeightUnitPrice } from "./weighingPrice.js";
7
+ import locales_default from "./SkuCard/locales.js";
8
+ import useInitLocalesOnce from "../../../hooks/useInitLocalesOnce.js";
6
9
  import SkuCard from "./SkuCard/index.js";
7
- import { formatProductPrice, getSkuCardConfig } from "./utils.js";
10
+ import { formatProductPrice, getSkuCardConfig, shouldShowInventorySoldOut } from "./utils.js";
8
11
  import useTranslationOriginal from "../../../hooks/useTranslationOriginal.js";
9
12
  import { PREFIX } from "../index.js";
10
13
  import React, { memo, useMemo } from "react";
@@ -39,10 +42,15 @@ const defaultConfig = {
39
42
  }
40
43
  };
41
44
  const ProductCard = memo(({ item, index: index$1, context, onSelect, onSelectCover, onSelectInfo, isSelected, className, decorateConfig = {}, scenario = "default", selectionTrigger = "pointerUp", customSkuCardAllConfig }) => {
45
+ var _engineContext$appHel, _engineContext$appHel2;
46
+ const engineContext = useEngineContext();
47
+ useInitLocalesOnce(locales_default);
42
48
  const finalConfig = _objectSpread2(_objectSpread2({}, defaultConfig), decorateConfig);
43
49
  const { imgHeight, imgWidth, isOriginPrice, isPrice, isProductCover, isStock, isSubtitle, isTitle, radius, showZeroPrice, gap, rightStyle } = finalConfig;
44
50
  const { __typename } = item;
45
51
  const translationOriginal = useTranslationOriginal();
52
+ const isSoldOut = shouldShowInventorySoldOut(item, engineContext === null || engineContext === void 0 || (_engineContext$appHel = engineContext.appHelper) === null || _engineContext$appHel === void 0 || (_engineContext$appHel = _engineContext$appHel.utils) === null || _engineContext$appHel === void 0 || (_engineContext$appHel2 = _engineContext$appHel.getData) === null || _engineContext$appHel2 === void 0 ? void 0 : _engineContext$appHel2.call(_engineContext$appHel, "channel"));
53
+ const soldOutText = locales.getText("pisell2.sku-card.sold-out") || "Sold Out";
46
54
  if (__typename === "category") return /* @__PURE__ */ React.createElement("div", {
47
55
  className: classNames(`${PREFIX}__product-category`, className),
48
56
  "data-index": index$1,
@@ -133,11 +141,21 @@ const ProductCard = memo(({ item, index: index$1, context, onSelect, onSelectCov
133
141
  */
134
142
  const skuCardRender = useMemo(() => {
135
143
  const skuCardAllConfig = customSkuCardAllConfig || getSkuCardConfig(finalConfig);
144
+ const skuStatusOverlayConfig = isSoldOut ? _objectSpread2(_objectSpread2({}, skuCardAllConfig.skuStatusOverlayConfig), {}, {
145
+ isOpen: 1,
146
+ text: soldOutText,
147
+ fontSize: 28,
148
+ fontWeight: 700,
149
+ color: "#000000",
150
+ background: "rgba(255, 255, 255, 0.72)",
151
+ slot: null
152
+ }) : skuCardAllConfig.skuStatusOverlayConfig;
136
153
  return /* @__PURE__ */ React.createElement(SkuCard, _objectSpread2(_objectSpread2({ key: item.id }, skuCardAllConfig), {}, {
154
+ skuStatusOverlayConfig,
137
155
  dataSource: skuCardDataSource,
138
- onCardClick: () => onSelect === null || onSelect === void 0 ? void 0 : onSelect(item),
139
- onSelectCover: () => onSelectCover === null || onSelectCover === void 0 ? void 0 : onSelectCover(item),
140
- onSelectInfo: () => onSelectInfo === null || onSelectInfo === void 0 ? void 0 : onSelectInfo(item),
156
+ onCardClick: isSoldOut ? void 0 : () => onSelect === null || onSelect === void 0 ? void 0 : onSelect(item),
157
+ onSelectCover: isSoldOut ? void 0 : () => onSelectCover === null || onSelectCover === void 0 ? void 0 : onSelectCover(item),
158
+ onSelectInfo: isSoldOut ? void 0 : () => onSelectInfo === null || onSelectInfo === void 0 ? void 0 : onSelectInfo(item),
141
159
  selectionTrigger,
142
160
  isSelected,
143
161
  "data-index": index$1,
@@ -162,7 +180,9 @@ const ProductCard = memo(({ item, index: index$1, context, onSelect, onSelectCov
162
180
  rightStyle,
163
181
  className,
164
182
  customSkuCardAllConfig,
165
- selectionTrigger
183
+ selectionTrigger,
184
+ isSoldOut,
185
+ soldOutText
166
186
  ]);
167
187
  /**
168
188
  * @description: 根据 scenario 决定渲染内容
@@ -14,6 +14,16 @@ const formatProductPrice = (item) => {
14
14
  };
15
15
  };
16
16
  /**
17
+ * 追踪库存且禁止超售时,库存小于等于 0 视为售罄。
18
+ */
19
+ const isInventorySoldOut = (item) => Number(item === null || item === void 0 ? void 0 : item.is_track) === 1 && Number(item === null || item === void 0 ? void 0 : item.over_sold) === 0 && Number(item === null || item === void 0 ? void 0 : item.stock_quantity) <= 0;
20
+ /**
21
+ * POS 保持原有商品选择行为;其它渠道才展示库存售罄状态。
22
+ */
23
+ const shouldShowInventorySoldOut = (item, channel) => {
24
+ return (String(channel || "pos").trim().toLowerCase() || "pos") !== "pos" && isInventorySoldOut(item);
25
+ };
26
+ /**
17
27
  * @description: 获取sku卡配置
18
28
  * @param {ProductCardConfig} finalConfig
19
29
  * @return {*}
@@ -52,4 +62,4 @@ const getSkuCardConfig = (finalConfig) => {
52
62
  };
53
63
  };
54
64
  //#endregion
55
- export { formatProductPrice, getSkuCardConfig };
65
+ export { formatProductPrice, getSkuCardConfig, shouldShowInventorySoldOut };
@@ -70,7 +70,34 @@
70
70
  }
71
71
  }
72
72
 
73
+ .sku-detail-selection-flow-scroll-shell {
74
+ position: relative;
75
+ display: flex;
76
+ min-height: 0;
77
+ flex: 1;
78
+ flex-direction: column;
79
+
80
+ // 阴影挂在不滚动的外壳上,因此不会混入时间卡片并跟随内容移动。
81
+ // 仅在下方仍有内容时展示,并使用较浅的渐变作为轻量提示。
82
+ &--can-scroll-down::after {
83
+ position: absolute;
84
+ right: 12px;
85
+ bottom: 0;
86
+ left: 0;
87
+ z-index: 2;
88
+ height: 16px;
89
+ background: linear-gradient(
90
+ to bottom,
91
+ rgba(255, 255, 255, 0),
92
+ rgba(16, 24, 40, 0.08)
93
+ );
94
+ content: '';
95
+ pointer-events: none;
96
+ }
97
+ }
98
+
73
99
  .sku-detail-right-content--selection-flow {
74
100
  display: flex;
101
+ flex: 1;
75
102
  flex-direction: column;
76
103
  }
@@ -276,6 +276,7 @@ const DateFlowModuleComponent = ({ context, module, registerHandle }) => {
276
276
  showHeader: false,
277
277
  showMonthHeader: true,
278
278
  enableWeekSwipe: true,
279
+ minViewDate: dayjs().startOf("day").format("YYYY-MM-DD"),
279
280
  minSelectableDate: minimumSelectableDate.format("YYYY-MM-DD")
280
281
  });
281
282
  }
@@ -11,7 +11,6 @@ import PisellResourceCard from "../../../../components/eventBooking/components/r
11
11
  import { getResourceList } from "../../../../components/booking/info2/serve.js";
12
12
  import React, { useEffect, useMemo, useRef } from "react";
13
13
  import { Alert, Space } from "antd";
14
- import { isMobile } from "@pisell/utils";
15
14
  import { PisellCustomCheckboxGroup } from "@pisell/materials";
16
15
  import "./resource.less";
17
16
  //#region src/pro/skuDetailModal/flow/modules/resource.tsx
@@ -334,7 +333,7 @@ const ResourceFlowModuleComponent = ({ context, module, registerHandle }) => {
334
333
  fontWeight: 600
335
334
  } }, group.title || group.code || "Resource"), /* @__PURE__ */ React.createElement(PisellCustomCheckboxGroup, {
336
335
  dataSource: group.options,
337
- columns: isMobile() ? 2 : 3,
336
+ columns: 4,
338
337
  horizontalGap: 16,
339
338
  verticalGap: 16,
340
339
  className: "selection-flow-resource-grid",
@@ -3,8 +3,45 @@
3
3
  min-height: 166px;
4
4
  }
5
5
 
6
+ // ResourceDisplay 的文本头像沿用 Ant Avatar 的缩放定位规则;在 Flow 的
7
+ // 纵向卡片中改为由 flex 容器直接居中,避免首字母视觉上向右偏移。
8
+ .pisell-resource-card-empty-avatar
9
+ .pisell-lowcode-avatar-string,
10
+ .pisell-resource-card-empty-avatar .ant-avatar-string {
11
+ position: static;
12
+ left: auto;
13
+ width: 100%;
14
+ margin: 0;
15
+ text-align: center;
16
+ transform: none !important;
17
+ transform-origin: center;
18
+ }
19
+
20
+ // 不依赖 PisellText 的默认 display/text-align,确保资源名称始终相对
21
+ // 整张卡片居中,而不是相对文字自身宽度居中。
22
+ .pisell-resource-card-info {
23
+ align-items: center;
24
+ text-align: center;
25
+ }
26
+
27
+ .pisell-resource-card-name {
28
+ display: block;
29
+ width: 100%;
30
+ margin: 0;
31
+ padding: 0;
32
+ text-align: center;
33
+ }
34
+
6
35
  .selection-flow-resource-card--disabled {
7
36
  cursor: not-allowed;
8
37
  opacity: 0.45;
9
38
  }
39
+
40
+ // 默认使用四列;只有真正窄于手机内容宽度时才退回两列。
41
+ // 需要 !important 覆盖 PisellViewGrid 写在元素上的 grid-template-columns。
42
+ @media (max-width: 600px) {
43
+ .pisell-view-grid-content {
44
+ grid-template-columns: repeat(2, minmax(0, 1fr)) !important;
45
+ }
46
+ }
10
47
  }
@@ -146,6 +146,9 @@ const SkuDetailModal = ({ onConfirm, onRemove, onClose, variant }, ref) => {
146
146
  * - 称重商品打开弹窗时,自动滚动到底部以完整展示称重模块
147
147
  */
148
148
  const leftTopRef = useRef(null);
149
+ /** 新 Flow 当前步骤的滚动容器;切换步骤时回到顶部。 */
150
+ const selectionFlowScrollRef = useRef(null);
151
+ const [selectionFlowCanScrollDown, setSelectionFlowCanScrollDown] = useState(false);
149
152
  const Toast = useToast$1();
150
153
  const logger = useLogger();
151
154
  /**
@@ -303,6 +306,40 @@ const SkuDetailModal = ({ onConfirm, onRemove, onClose, variant }, ref) => {
303
306
  * 此时回退到旧详情界面,避免全局预设阻断称重等普通商品。
304
307
  */
305
308
  const isCustomSelectionFlow = isCreateMode && Array.isArray(effectiveSelectionFlowSteps) && (selectionFlowProcedureSteps === null || selectionFlowProcedureSteps === void 0 ? void 0 : selectionFlowProcedureSteps.length) !== 0;
309
+ const updateSelectionFlowScrollAffordance = useCallback(() => {
310
+ const container = selectionFlowScrollRef.current;
311
+ if (!container) {
312
+ setSelectionFlowCanScrollDown(false);
313
+ return;
314
+ }
315
+ setSelectionFlowCanScrollDown(container.scrollHeight - container.scrollTop - container.clientHeight > 2);
316
+ }, []);
317
+ useLayoutEffect(() => {
318
+ if (!open || !isCustomSelectionFlow) {
319
+ setSelectionFlowCanScrollDown(false);
320
+ return;
321
+ }
322
+ const container = selectionFlowScrollRef.current;
323
+ container === null || container === void 0 || container.scrollTo({
324
+ top: 0,
325
+ behavior: "auto"
326
+ });
327
+ const animationFrame = requestAnimationFrame(updateSelectionFlowScrollAffordance);
328
+ if (!container || typeof ResizeObserver === "undefined") return () => cancelAnimationFrame(animationFrame);
329
+ const resizeObserver = new ResizeObserver(updateSelectionFlowScrollAffordance);
330
+ resizeObserver.observe(container);
331
+ Array.from(container.children).forEach((child) => resizeObserver.observe(child));
332
+ return () => {
333
+ cancelAnimationFrame(animationFrame);
334
+ resizeObserver.disconnect();
335
+ };
336
+ }, [
337
+ currentStep,
338
+ isCustomSelectionFlow,
339
+ open,
340
+ selectionFlowInstanceKey,
341
+ updateSelectionFlowScrollAffordance
342
+ ]);
306
343
  const selectionFlowInitialDraft = useMemo(() => {
307
344
  var _openParamsRef$curren, _resolvedSkuValue$bun, _resolvedSkuValue$opt, _bookingState$client, _extend$duration, _openParamsRef$curren2, _openParamsRef$curren3;
308
345
  if (!isCustomSelectionFlow || !productData) return null;
@@ -1280,7 +1317,11 @@ const SkuDetailModal = ({ onConfirm, onRemove, onClose, variant }, ref) => {
1280
1317
  };
1281
1318
  const rightContent = () => {
1282
1319
  if (detailLoading || !productData) return /* @__PURE__ */ React.createElement("div", { className: "sku-detail-right-content" }, renderLoadingPanel());
1283
- if (isCustomSelectionFlow && selectionFlowInitialDraft) return /* @__PURE__ */ React.createElement("div", { className: "sku-detail-right-content sku-detail-right-content--selection-flow" }, isMobile && (skuDetailConfig === null || skuDetailConfig === void 0 ? void 0 : skuDetailConfig.isShowProductSummary) ? renderProductSummary() : null, shouldRenderMobileWeighing ? /* @__PURE__ */ React.createElement("div", { className: "sku-detail-mobile-weighing" }, renderWeighingSection()) : null, /* @__PURE__ */ React.createElement(ForwardedSelectionFlow, {
1320
+ if (isCustomSelectionFlow && selectionFlowInitialDraft) return /* @__PURE__ */ React.createElement("div", { className: classNames("sku-detail-selection-flow-scroll-shell", selectionFlowCanScrollDown && "sku-detail-selection-flow-scroll-shell--can-scroll-down") }, /* @__PURE__ */ React.createElement("div", {
1321
+ ref: selectionFlowScrollRef,
1322
+ className: "sku-detail-right-content sku-detail-right-content--selection-flow",
1323
+ onScroll: updateSelectionFlowScrollAffordance
1324
+ }, isMobile && (skuDetailConfig === null || skuDetailConfig === void 0 ? void 0 : skuDetailConfig.isShowProductSummary) ? renderProductSummary() : null, shouldRenderMobileWeighing ? /* @__PURE__ */ React.createElement("div", { className: "sku-detail-mobile-weighing" }, renderWeighingSection()) : null, /* @__PURE__ */ React.createElement(ForwardedSelectionFlow, {
1284
1325
  key: selectionFlowInstanceKey,
1285
1326
  ref: selectionFlowRef,
1286
1327
  steps: effectiveSelectionFlowSteps || [],
@@ -1334,7 +1375,7 @@ const SkuDetailModal = ({ onConfirm, onRemove, onClose, variant }, ref) => {
1334
1375
  onCancel: () => {
1335
1376
  if (openTaskIdRef.current === selectionFlowInstanceKey) handleCancel();
1336
1377
  }
1337
- }));
1378
+ })));
1338
1379
  const shouldRenderSkuSelection = (isMobile || currentStep === 1) && hasSkuOptions;
1339
1380
  const shouldRenderMobileProductDetails = isMobile && (!isCreateMode || !!(skuDetailConfig === null || skuDetailConfig === void 0 ? void 0 : skuDetailConfig.isShowProductSummary));
1340
1381
  const shouldRenderProductSummary = shouldRenderSkuSelection || shouldRenderMobileProductDetails;
@@ -1382,13 +1423,14 @@ const SkuDetailModal = ({ onConfirm, onRemove, onClose, variant }, ref) => {
1382
1423
  closable: false,
1383
1424
  destroyOnClose: true,
1384
1425
  style: { maxHeight: variant === "phone" ? "95dvh" : void 0 },
1385
- height: variant === "phone" ? "auto" : void 0,
1426
+ height: variant === "phone" ? isCustomSelectionFlow ? "clamp(600px, 50dvh, 1600px)" : "auto" : void 0,
1386
1427
  width: variant === "phone" ? "100%" : "80%",
1387
1428
  className: classNames({
1388
1429
  "pisell-sku-detail-modal": variant !== "phone",
1389
1430
  "pisell-sku-detail-modal--smallTablet": variant !== "phone" && variant === "smallTablet",
1390
1431
  "pisell-sku-detail-modal--tablet": variant !== "phone" && variant === "tablet",
1391
1432
  "pisell-sku-detail-drawer": variant === "phone",
1433
+ "pisell-sku-detail-drawer--selection-flow": variant === "phone" && isCustomSelectionFlow,
1392
1434
  "aside-full": isWeighingProductWithoutSku && !shouldRenderMobileWeighing
1393
1435
  }),
1394
1436
  placement: variant === "phone" ? "bottom" : void 0
@@ -897,13 +897,18 @@
897
897
  }
898
898
  }
899
899
 
900
- // PisellProcedure 的小屏 Modal 规则在 low-code 产物中带有 #body 前缀,
901
- // 会把竖排 Drawer 的 sidebar 重新限制为 290px;使用同一作用域覆盖固定宽度。
902
- #body .pisell-sku-detail-drawer {
903
- .pisell-procedure--modal .pisell-procedure-sidebar {
904
- width: 100% !important;
905
- min-width: 0 !important;
906
- max-width: 100% !important;
900
+ // 预约步骤的内容量差异很大:时间片可能很多,资源也可能只有一两个。
901
+ // Flow Drawer 使用稳定的外壳高度,中间内容区沿用上方的 overflow-y:auto;
902
+ // 普通商品没有该修饰类,仍保持原来的内容自适应高度。
903
+ .pisell-sku-detail-drawer--selection-flow {
904
+ max-height: 95dvh;
905
+
906
+ .pisell-lowcode-floating-layer-content,
907
+ .pisell-lowcode-drawer-content,
908
+ .pisell-lowcode-floating-layer-body,
909
+ .pisell-lowcode-drawer-body {
910
+ height: 100%;
911
+ min-height: 0;
907
912
  }
908
913
  }
909
914
 
@@ -72,7 +72,7 @@ const KioskCategorySidebar = (0, react.forwardRef)(function KioskCategorySidebar
72
72
  var _tabbarRef$current, _tabbarRef$current$cl;
73
73
  return (_tabbarRef$current = tabbarRef.current) === null || _tabbarRef$current === void 0 || (_tabbarRef$current$cl = _tabbarRef$current.closeSearchMode) === null || _tabbarRef$current$cl === void 0 ? void 0 : _tabbarRef$current$cl.call(_tabbarRef$current);
74
74
  } }), []);
75
- useEffect(() => {
75
+ (0, react.useEffect)(() => {
76
76
  if (!dataSource.length || hasResetInitialScrollRef.current) return;
77
77
  const animationFrame = requestAnimationFrame(() => {
78
78
  var _sidebarRef$current;
@@ -10,7 +10,7 @@ let _pisell_materials = require("@pisell/materials");
10
10
  require("./index.less");
11
11
  //#region src/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/CalenDateWeek/WeekItem/index.tsx
12
12
  const WeekItem = (props) => {
13
- const { weekList, currentDate, setCurrentDate, isActive, productId, dateLimitData, getLimitData, cutTime, showStatusBar = true, ignoreAvailabilityDisabled = false, minSelectableDate, enableRangeSelection = false, selectedRangeStartDate, selectedRangeEndDate, showMonthHeader = false, disableCallToBook = false, onPrevWeek, onNextWeek, showNavigation = true } = props;
13
+ const { weekList, currentDate, setCurrentDate, isActive, productId, dateLimitData, getLimitData, cutTime, showStatusBar = true, ignoreAvailabilityDisabled = false, minSelectableDate, minViewDate, enableRangeSelection = false, selectedRangeStartDate, selectedRangeEndDate, showMonthHeader = false, disableCallToBook = false, onPrevWeek, onNextWeek, showNavigation = true } = props;
14
14
  const [monthIndex, setMonthIndex] = (0, react.useState)([]);
15
15
  (0, react.useEffect)(() => {
16
16
  if (isActive && productId) {}
@@ -22,7 +22,7 @@ const WeekItem = (props) => {
22
22
  (0, react.useEffect)(() => {
23
23
  setMonthIndex(require_utils.getMonthIndex(weekList));
24
24
  }, [weekList]);
25
- const prevWeekDisabled = minSelectableDate && (weekList === null || weekList === void 0 ? void 0 : weekList[0]) && (0, dayjs.default)(weekList[0]).subtract(1, "day").isBefore((0, dayjs.default)(minSelectableDate), "day");
25
+ const prevWeekDisabled = (minViewDate || minSelectableDate) && (weekList === null || weekList === void 0 ? void 0 : weekList[0]) && (0, dayjs.default)(weekList[0]).subtract(1, "day").isBefore((0, dayjs.default)(minViewDate || minSelectableDate), "day");
26
26
  return /* @__PURE__ */ React.createElement("div", { className: "week-item-wrap" }, /* @__PURE__ */ React.createElement("div", { className: "week-item-content" }, showNavigation ? /* @__PURE__ */ React.createElement(_pisell_materials.Iconfont, {
27
27
  type: "pisell2-arrow-left",
28
28
  className: "week-item__icon",
@@ -12,7 +12,7 @@ classnames = require_runtime.__toESM(classnames);
12
12
  require("./index.less");
13
13
  //#region src/components/eventBooking/components/bookingAvailabilityCalendar/components/CalendarDate/CalenDateWeek/index.tsx
14
14
  const CalenDateWeek = (props) => {
15
- const { currentDate, dateChange, productId, timeList, dateLimitData, getLimitData, cutTime, showStatusBar = true, showDisabledStatus = true, ignoreAvailabilityDisabled = false, minSelectableDate, enableRangeSelection = false, selectedRangeStartDate, selectedRangeEndDate, showMonthHeader = false, enableSwipeNavigation = false, disableCallToBook = false } = props;
15
+ const { currentDate, dateChange, productId, timeList, dateLimitData, getLimitData, cutTime, showStatusBar = true, showDisabledStatus = true, ignoreAvailabilityDisabled = false, minSelectableDate, minViewDate, enableRangeSelection = false, selectedRangeStartDate, selectedRangeEndDate, showMonthHeader = false, enableSwipeNavigation = false, disableCallToBook = false } = props;
16
16
  const [weekList, setWeekList] = (0, react.useState)([]);
17
17
  const [weekAnchorDate, setWeekAnchorDate] = (0, react.useState)(currentDate);
18
18
  const [pendingWeekList, setPendingWeekList] = (0, react.useState)(null);
@@ -87,7 +87,8 @@ const CalenDateWeek = (props) => {
87
87
  if (weekListRef === null || weekListRef === void 0 ? void 0 : weekListRef.current) weekListRef.current.scrollLeft = 0;
88
88
  }, [currentDate, weekList]);
89
89
  const resolveWeekNavigation = (direction) => {
90
- const minDate = minSelectableDate ? (0, dayjs.default)(minSelectableDate).startOf("day") : null;
90
+ const minimumViewDate = minViewDate || minSelectableDate;
91
+ const minDate = minimumViewDate ? (0, dayjs.default)(minimumViewDate).startOf("day") : null;
91
92
  const nextDate = (0, dayjs.default)(weekAnchorDate).add(direction * 7, "day");
92
93
  const nextAnchorDate = direction < 0 && minDate && nextDate.isBefore(minDate, "day") ? minDate.format("YYYY-MM-DD") : nextDate.format("YYYY-MM-DD");
93
94
  const nextWeekList = initCurrentWeekData(nextAnchorDate);
@@ -184,6 +185,7 @@ const CalenDateWeek = (props) => {
184
185
  showStatusBar,
185
186
  ignoreAvailabilityDisabled,
186
187
  minSelectableDate,
188
+ minViewDate,
187
189
  enableRangeSelection,
188
190
  selectedRangeStartDate,
189
191
  selectedRangeEndDate,
@@ -193,7 +195,7 @@ const CalenDateWeek = (props) => {
193
195
  onNextWeek: () => handleWeekNavigate(1),
194
196
  showNavigation: !enableSwipeNavigation
195
197
  });
196
- const prevWeekDisabled = Boolean(minSelectableDate && (weekList === null || weekList === void 0 ? void 0 : weekList[0]) && (0, dayjs.default)(weekList[0]).subtract(1, "day").isBefore((0, dayjs.default)(minSelectableDate), "day"));
198
+ const prevWeekDisabled = Boolean((minViewDate || minSelectableDate) && (weekList === null || weekList === void 0 ? void 0 : weekList[0]) && (0, dayjs.default)(weekList[0]).subtract(1, "day").isBefore((0, dayjs.default)(minViewDate || minSelectableDate), "day"));
197
199
  return /* @__PURE__ */ React.createElement("div", { className: "calendar-week-wrap" }, /* @__PURE__ */ React.createElement("div", { className: "calendar-week-navigation" }, enableSwipeNavigation ? /* @__PURE__ */ React.createElement(_pisell_materials.Iconfont, {
198
200
  type: "pisell2-arrow-left",
199
201
  className: "calendar-week-navigation__icon",
@@ -15,7 +15,7 @@ let classnames = require("classnames");
15
15
  classnames = require_runtime.__toESM(classnames);
16
16
  require("./index.less");
17
17
  //#region src/components/eventBooking/components/bookingAvailabilityCalendar/components/SelectDate/index.tsx
18
- const SelectDate = ({ currentDate, detail, currentDateChange, setSurplusDisabledChange, cutTime, setCutTime, showCalendarPopup, showStatusLegend = true, showDateStatusBar = true, title = "Select a date", showHeader = true, showDisabledStatus = true, ignoreAvailabilityDisabled = false, minSelectableDate, enableRangeSelection = false, selectedRangeStartDate, selectedRangeEndDate, showMonthHeader = false, enableWeekSwipe = false, availabilityDates }, ref) => {
18
+ const SelectDate = ({ currentDate, detail, currentDateChange, setSurplusDisabledChange, cutTime, setCutTime, showCalendarPopup, showStatusLegend = true, showDateStatusBar = true, title = "Select a date", showHeader = true, showDisabledStatus = true, ignoreAvailabilityDisabled = false, minSelectableDate, minViewDate, enableRangeSelection = false, selectedRangeStartDate, selectedRangeEndDate, showMonthHeader = false, enableWeekSwipe = false, availabilityDates }, ref) => {
19
19
  const [dateLimitData, setDateLimitData] = (0, react.useState)(require_mock.mock.availability_calendar.limitData);
20
20
  /**
21
21
  * UBS 日期结果只负责状态展示,不伪造旧事件预约的 times/库存结构。
@@ -71,6 +71,7 @@ const SelectDate = ({ currentDate, detail, currentDateChange, setSurplusDisabled
71
71
  showDisabledStatus,
72
72
  ignoreAvailabilityDisabled,
73
73
  minSelectableDate,
74
+ minViewDate,
74
75
  enableRangeSelection,
75
76
  selectedRangeStartDate,
76
77
  selectedRangeEndDate,
@@ -32,6 +32,11 @@ interface BookingAvailabilityCalendarProps {
32
32
  showDisabledStatus?: boolean;
33
33
  ignoreAvailabilityDisabled?: boolean;
34
34
  minSelectableDate?: string;
35
+ /**
36
+ * 周历允许查看的最早日期;未传时继续沿用 minSelectableDate。
37
+ * 该值只控制翻页边界,不会让不可选日期变成可选。
38
+ */
39
+ minViewDate?: string;
35
40
  enableRangeSelection?: boolean;
36
41
  selectedRangeStartDate?: string;
37
42
  selectedRangeEndDate?: string;
@@ -12,7 +12,7 @@ require("./index.less");
12
12
  const BookingAvailabilityCalendar = (props) => {
13
13
  var _mock$availability_ca, _mock$availability_ca2, _mock$availability_ca3;
14
14
  _pisell_utils.locales.init(require_locales.default, _pisell_utils.locales.locale || "en");
15
- const { showCalendarPopup, onDateChange, detail = (_mock$availability_ca = require_mock.mock.availability_calendar) === null || _mock$availability_ca === void 0 ? void 0 : _mock$availability_ca.detail, currentDate = (_mock$availability_ca2 = require_mock.mock.availability_calendar) === null || _mock$availability_ca2 === void 0 ? void 0 : _mock$availability_ca2.currentDate, cutTime = (_mock$availability_ca3 = require_mock.mock.availability_calendar) === null || _mock$availability_ca3 === void 0 ? void 0 : _mock$availability_ca3.cutTime, onCurrentDateChange, onCutTimeChange, onSurplusDisabledChange, showStatusLegend = true, showDateStatusBar = true, theme = "light", className, title, showHeader, showDisabledStatus, ignoreAvailabilityDisabled, minSelectableDate, enableRangeSelection, selectedRangeStartDate, selectedRangeEndDate, showMonthHeader, enableWeekSwipe, availabilityDates } = props;
15
+ const { showCalendarPopup, onDateChange, detail = (_mock$availability_ca = require_mock.mock.availability_calendar) === null || _mock$availability_ca === void 0 ? void 0 : _mock$availability_ca.detail, currentDate = (_mock$availability_ca2 = require_mock.mock.availability_calendar) === null || _mock$availability_ca2 === void 0 ? void 0 : _mock$availability_ca2.currentDate, cutTime = (_mock$availability_ca3 = require_mock.mock.availability_calendar) === null || _mock$availability_ca3 === void 0 ? void 0 : _mock$availability_ca3.cutTime, onCurrentDateChange, onCutTimeChange, onSurplusDisabledChange, showStatusLegend = true, showDateStatusBar = true, theme = "light", className, title, showHeader, showDisabledStatus, ignoreAvailabilityDisabled, minSelectableDate, minViewDate, enableRangeSelection, selectedRangeStartDate, selectedRangeEndDate, showMonthHeader, enableWeekSwipe, availabilityDates } = props;
16
16
  console.log(detail, currentDate, cutTime, "detail, currentDate, cutTime");
17
17
  return /* @__PURE__ */ react.default.createElement("div", { className: (0, classnames.default)("event-booking-availability-calendar", `event-booking-availability-calendar--${theme}`, className) }, /* @__PURE__ */ react.default.createElement(require_index.default, {
18
18
  showCalendarPopup,
@@ -32,6 +32,7 @@ const BookingAvailabilityCalendar = (props) => {
32
32
  showDisabledStatus,
33
33
  ignoreAvailabilityDisabled,
34
34
  minSelectableDate,
35
+ minViewDate,
35
36
  enableRangeSelection,
36
37
  selectedRangeStartDate,
37
38
  selectedRangeEndDate,