import { _objectSpread2 } from "../../_virtual/_@oxc-project_runtime@0.122.0/helpers/objectSpread2.js";
import { _asyncToGenerator } from "../../_virtual/_@oxc-project_runtime@0.122.0/helpers/asyncToGenerator.js";
import { _objectWithoutProperties } from "../../_virtual/_@oxc-project_runtime@0.122.0/helpers/objectWithoutProperties.js";
import useEngineContext, { usePisellOS } from "../../hooks/useEngineContext.js";
import { request } from "../../utils/index.js";
import { useReservationPhoneGridInfiniteData } from "./hooks/useReservationPhoneGridInfiniteData.js";
import { getRelationTables } from "../pisellSalesManagement/serve.js";
import { resolveBookingMonitorColumnStorageKey } from "../pisellSalesManagement/config/booking.js";
import { useBookingPerspective } from "../pisellSalesManagement/hooks/useBookingPerspective.js";
import { ReservationBookingDetailModal } from "./components/bookingDetailModal/ReservationBookingDetailModal.js";
import "./floorMap/floorPlanApi.js";
import { GRID_DS_KEY, PISELL_RESERVATION_PAGE_LOCALES } from "./reservationConstants.js";
import { resolveOperatingDayBoundaryFromCoreModel, timelineRangeFromOperatingDayBoundary, timelineReferenceDateForScheduleDay } from "./data/reservationOperatingDayRange.js";
import { getDefaultMonitorSearchParams, getGridTableBookingSearchParams, usePisellReservationBookingData } from "./hooks/usePisellReservationBookingData.js";
import { usePisellReservationResourceTableData } from "./hooks/usePisellReservationResourceTableData.js";
import { extractResourceRecordIds } from "./data/bookingToReservationTables.js";
import { buildReservationMergedTableRows } from "./data/reservationTablesMerge.js";
import { sceneElementsToBoundFormRecordIds } from "./floorMap/floorMapBoundRecordIds.js";
import { buildCalendarResourcesFromMergedTables, mapFloorDayBookingsToCalendarItems, orderedCanvasResourceRecordIdStrings } from "./data/calendarAdapter.js";
import { mergeGridBookingSearchParams, mergeSearchParamsBookingWindow, readBodyViewFromStorageKey, shouldUseBuiltinReservationList } from "./data/reservationDataUtils.js";
import { RecordBoardBodyViewCapture, ScheduleSyncOnFloorEnter } from "./components/PisellReservationSubcomponents.js";
import { useReservationFloorPlan } from "./floorMap/useReservationFloorPlan.js";
import { useReservationFloorMapMerged } from "./floorMap/useReservationFloorMapMerged.js";
import { mapReservationRowsToVenueWallCards } from "./data/mapReservationToVenueWallCards.js";
import { useReservationScheduleDebounced } from "./hooks/useReservationScheduleDebounced.js";
import { useReservationSalesHostData } from "./hooks/useReservationSalesHostData.js";
import { useReservationLoadingShownDebounced } from "./hooks/useReservationLoadingShownDebounced.js";
import { useFloorMapBookingInteraction } from "./hooks/useFloorMapBookingInteraction.js";
import { useReservationCalendarSlot } from "./hooks/useReservationCalendarSlot.js";
import { buildReservationMobileTableGridConfig } from "./mobileTable/buildReservationMobileTableConfig.js";
import { useReservationToolBarMerged } from "./hooks/useReservationToolBarMerged.js";
import { ReservationNewReservationModal } from "./components/ReservationNewReservationModal.js";
import { usePicoCodingOpenData } from "./hooks/usePicoCodingOpenData.js";
import { useReservationWallClockFollow } from "./hooks/useReservationWallClockFollow.js";
import { useReservationHudDrawer } from "./hooks/useReservationHudDrawer.js";
import { useReservationResourceWallPersist } from "./hooks/useReservationResourceWallPersist.js";
import { useReservationDebugLoggers } from "./hooks/useReservationDebugLoggers.js";
import { ReservationHudDrawer } from "./components/ReservationHudDrawer.js";
import dayjs from "dayjs";
import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
import { locales } from "@pisell/utils";
import { DEFAULT_RESOURCE_WALL_FILTER_FIELD_KEY, PisellRecordBoard } from "@pisell/materials";
import classNames from "classnames";
import { useRequest } from "ahooks";
import "dayjs/locale/zh-cn";
import "dayjs/locale/en";
import "dayjs/locale/zh-tw";
import { LocalizationProvider } from "@pisell/date-picker";
import { AdapterDayjs } from "@pisell/date-picker/es/AdapterDayjs";
import "./PisellReservation.less";
//#region src/plus/pisellReservation/PisellReservation.tsx
const _excluded = [
	"gridDataSourceKey",
	"dataSources",
	"scheduleValue",
	"onScheduleChange",
	"reservationBiz",
	"associatedMenuListIds",
	"toolBar",
	"floorMap",
	"scheduleStartSlot",
	"scheduleEndSlot",
	"onNewReservation",
	"timeNavigatorProps",
	"scheduleProps",
	"fab",
	"defaultBodyView",
	"data",
	"total",
	"pagination",
	"onPageChange",
	"onSearch",
	"onReset",
	"searchParams",
	"loading",
	"rowKey",
	"__id",
	"className",
	"style",
	"floorPlanId",
	"floorPlanCanvasWidth",
	"floorPlanCanvasHeight",
	"floorPlanCode",
	"floorPlanName",
	"floorPlanSort",
	"floorPlanStatus",
	"onFloorPlanPersisted",
	"putFloorPlan",
	"onFloorMapBookingClick",
	"bodyViewSwitchable",
	"lockedBodyView",
	"bodyViewStorageKey",
	"floorMapHudTableDrawer",
	"variant",
	"forceFollowWallClock",
	"resourceSelectMode"
];
/**
* Dumi / Story 等无低代码引擎时，`utils` 的 request 未被注入；
* 子模块仍会调用 `request.getRequest().post/get`，未 setRequest 会抛错。
* 仅在无引擎请求实例时使用占位（返回空 data），不影响真实环境中 `appHelper.utils.request` 优先注入。
*/
const PREVIEW_HTTP_CLIENT = {
	get: function() {
		var _ref = _asyncToGenerator(function* () {
			return { data: {} };
		});
		return function get() {
			return _ref.apply(this, arguments);
		};
	}(),
	post: function() {
		var _ref2 = _asyncToGenerator(function* () {
			return { data: {} };
		});
		return function post() {
			return _ref2.apply(this, arguments);
		};
	}(),
	put: function() {
		var _ref3 = _asyncToGenerator(function* () {
			return { data: {} };
		});
		return function put() {
			return _ref3.apply(this, arguments);
		};
	}(),
	remove: function() {
		var _ref4 = _asyncToGenerator(function* () {
			return { data: {} };
		});
		return function remove() {
			return _ref4.apply(this, arguments);
		};
	}(),
	custom: function() {
		var _ref5 = _asyncToGenerator(function* () {
			return { data: {} };
		});
		return function custom() {
			return _ref5.apply(this, arguments);
		};
	}()
};
/**
* 预约看板 Core：内置 Sales 预约列表 + 时间轴 + 平面图。
* 页面壳 {@link PisellReservationBookingPage} / {@link PisellVenueControlPage} /
* {@link PisellVenueWallPage} / {@link PisellReservationTablePage} 通过 props 组合默认行为。
*/
const PisellReservationCore = (props) => {
	var _engineCtx$appHelper, _engineCtx$engine, _engineCtx$appHelper2, _engineCtx$appHelper3, _app$router, _app$router$getRoutes, _app$history, _app$history$useParam, _engineCtx$appHelper8, _floorMapProp$mode, _scroll$autoCalc, _scroll;
	const { gridDataSourceKey = GRID_DS_KEY, dataSources: dataSourcesProp, scheduleValue: scheduleValueProp, onScheduleChange, reservationBiz: reservationBizProp, associatedMenuListIds: associatedMenuListIdsProp, toolBar: toolBarProp, floorMap: floorMapProp, scheduleStartSlot: scheduleStartSlotProp, scheduleEndSlot: scheduleEndSlotProp, onNewReservation, timeNavigatorProps: timeNavigatorPropsProp, scheduleProps: schedulePropsProp, fab, defaultBodyView: _unusedDefaultBodyView, data: dataProp, total: totalProp, pagination: paginationProp, onPageChange: onPageChangeProp, onSearch: onSearchProp, onReset: onResetProp, searchParams: searchParamsProp, loading: loadingProp, rowKey = "id", __id, className, style, floorPlanId: floorPlanIdProp, floorPlanCanvasWidth, floorPlanCanvasHeight, floorPlanCode, floorPlanName, floorPlanSort, floorPlanStatus, onFloorPlanPersisted, putFloorPlan, onFloorMapBookingClick, bodyViewSwitchable = true, lockedBodyView, bodyViewStorageKey, floorMapHudTableDrawer = false, variant, forceFollowWallClock: forceFollowWallClockProp, resourceSelectMode } = props, rest = _objectWithoutProperties(props, _excluded);
	const isPhoneLayout = variant === "phone";
	const isInternalListData = shouldUseBuiltinReservationList(dataProp, totalProp, paginationProp, onPageChangeProp);
	const resolvedFloorPlanId = floorPlanIdProp === null ? null : floorPlanIdProp === void 0 ? 1 : floorPlanIdProp;
	const engineCtx = useEngineContext();
	const r = engineCtx === null || engineCtx === void 0 || (_engineCtx$appHelper = engineCtx.appHelper) === null || _engineCtx$appHelper === void 0 || (_engineCtx$appHelper = _engineCtx$appHelper.utils) === null || _engineCtx$appHelper === void 0 ? void 0 : _engineCtx$appHelper.request;
	request.setRequest(r !== null && r !== void 0 ? r : PREVIEW_HTTP_CLIENT);
	const pisellos = usePisellOS();
	/** 低代码里 context 常每次给新 `pisellos` 对象，勿把 `pisellos` 放进 effect 依赖 */
	const pisellosRef = useRef(pisellos);
	pisellosRef.current = pisellos;
	const hasPisellosGetModule = typeof (pisellos === null || pisellos === void 0 ? void 0 : pisellos.getModule) === "function";
	const engineLocale = (engineCtx === null || engineCtx === void 0 || (_engineCtx$engine = engineCtx.engine) === null || _engineCtx$engine === void 0 || (_engineCtx$engine = _engineCtx$engine.props) === null || _engineCtx$engine === void 0 ? void 0 : _engineCtx$engine.locale) || "zh-CN";
	const app = engineCtx === null || engineCtx === void 0 || (_engineCtx$appHelper2 = engineCtx.appHelper) === null || _engineCtx$appHelper2 === void 0 || (_engineCtx$appHelper2 = _engineCtx$appHelper2.utils) === null || _engineCtx$appHelper2 === void 0 || (_engineCtx$appHelper3 = _engineCtx$appHelper2.getApp) === null || _engineCtx$appHelper3 === void 0 ? void 0 : _engineCtx$appHelper3.call(_engineCtx$appHelper2);
	const router = app === null || app === void 0 || (_app$router = app.router) === null || _app$router === void 0 || (_app$router$getRoutes = _app$router.getRoutes) === null || _app$router$getRoutes === void 0 ? void 0 : _app$router$getRoutes.call(_app$router);
	const params = app === null || app === void 0 || (_app$history = app.history) === null || _app$history === void 0 || (_app$history$useParam = _app$history.useParams) === null || _app$history$useParam === void 0 ? void 0 : _app$history$useParam.call(_app$history);
	const BIZ = reservationBizProp !== null && reservationBizProp !== void 0 ? reservationBizProp : params === null || params === void 0 ? void 0 : params.business_code;
	/** 路由有 business_code 时，表格/平面图两路 booking 列表请求扁平带上 business_code */
	const bookingListBusinessCodeExtra = useMemo(() => {
		const s = BIZ != null && BIZ !== "" ? String(BIZ).trim() : "";
		if (!s) return {};
		return { business_code: s };
	}, [BIZ]);
	const { reservationRuleProduct, reservationAssociatedMenuListIds: picoAssociatedMenuListIds } = usePicoCodingOpenData(engineCtx, BIZ);
	const reservationAssociatedMenuListIds = associatedMenuListIdsProp !== null && associatedMenuListIdsProp !== void 0 ? associatedMenuListIdsProp : picoAssociatedMenuListIds;
	/**
	* effectiveFloorPlanCode：用作按 code 拉/创建店铺平面图的 code。
	* 优先级：路由 business_code → props.floorPlanCode → 兜底常量。
	* 当 GET 404 时 `ensureShopFloorPlanByCode` 会用同一 code 走 POST 兜底创建。
	*/
	const effectiveFloorPlanCode = BIZ || floorPlanCode || "pisell_reservation";
	const muiDatePickerAdapterLocale = useMemo(() => {
		const loc = String(engineLocale).toLowerCase();
		if (loc.startsWith("zh-cn")) return "zh-cn";
		if (loc.startsWith("zh-tw") || loc.startsWith("zh-hk")) return "zh-tw";
		return "en";
	}, [engineLocale]);
	const operatingDayBoundary = useMemo(() => {
		try {
			var _engineCtx$appHelper4, _engineCtx$appHelper5, _engineCtx$appHelper6, _store$getDataByModel;
			const store = engineCtx === null || engineCtx === void 0 || (_engineCtx$appHelper4 = engineCtx.appHelper) === null || _engineCtx$appHelper4 === void 0 || (_engineCtx$appHelper4 = _engineCtx$appHelper4.utils) === null || _engineCtx$appHelper4 === void 0 || (_engineCtx$appHelper5 = _engineCtx$appHelper4.getApp) === null || _engineCtx$appHelper5 === void 0 || (_engineCtx$appHelper5 = _engineCtx$appHelper5.call(_engineCtx$appHelper4)) === null || _engineCtx$appHelper5 === void 0 || (_engineCtx$appHelper5 = _engineCtx$appHelper5.data) === null || _engineCtx$appHelper5 === void 0 || (_engineCtx$appHelper5 = _engineCtx$appHelper5.store) === null || _engineCtx$appHelper5 === void 0 || (_engineCtx$appHelper6 = _engineCtx$appHelper5.getStore) === null || _engineCtx$appHelper6 === void 0 ? void 0 : _engineCtx$appHelper6.call(_engineCtx$appHelper5);
			const coreData = store === null || store === void 0 || (_store$getDataByModel = store.getDataByModel) === null || _store$getDataByModel === void 0 ? void 0 : _store$getDataByModel.call(store, "core", "core");
			const boundary = resolveOperatingDayBoundaryFromCoreModel(coreData);
			if (process.env.NODE_ENV !== "production") {
				let coreSnapshot = coreData;
				try {
					coreSnapshot = JSON.parse(JSON.stringify(coreData));
				} catch (_unused) {
					coreSnapshot = coreData;
				}
				const rec = coreData;
				const underCore = (rec === null || rec === void 0 ? void 0 : rec.core) != null && typeof rec.core === "object" ? rec.core.operating_day_boundary : void 0;
				const onRoot = rec === null || rec === void 0 ? void 0 : rec.operating_day_boundary;
				console.info("[PisellReservation][engine store getDataByModel(\"core\",\"core\")]", {
					hasStore: Boolean(store),
					coreSnapshot,
					operating_day_boundary_under_core: underCore,
					operating_day_boundary_on_model_root: onRoot,
					operating_day_boundary_RESOLVED: boundary
				});
			}
			return boundary;
		} catch (e) {
			if (process.env.NODE_ENV !== "production") console.warn("[PisellReservation][engine] read core / operating_day_boundary failed", e);
			return;
		}
	}, [engineCtx]);
	const timelineRangeFromCore = useMemo(() => {
		const range = timelineRangeFromOperatingDayBoundary(operatingDayBoundary);
		if (process.env.NODE_ENV !== "production") console.info("[PisellReservation][timeline] derived from operating_day_boundary", {
			operatingDayBoundary,
			timelineRangeFromCore: range
		});
		return range;
	}, [operatingDayBoundary]);
	const effectiveTimelineRange = useMemo(() => {
		const fromProp = timeNavigatorPropsProp === null || timeNavigatorPropsProp === void 0 ? void 0 : timeNavigatorPropsProp.range;
		const effective = fromProp !== null && fromProp !== void 0 ? fromProp : timelineRangeFromCore;
		if (process.env.NODE_ENV !== "production") console.info("[PisellReservation][timeline] effective (timeNavigatorProps.range overrides core)", {
			timeNavigatorPropsRange: fromProp,
			effectiveTimelineRange: effective
		});
		return effective;
	}, [timeNavigatorPropsProp === null || timeNavigatorPropsProp === void 0 ? void 0 : timeNavigatorPropsProp.range, timelineRangeFromCore]);
	useEffect(() => {
		var _engineCtx$appHelper7;
		const r = engineCtx === null || engineCtx === void 0 || (_engineCtx$appHelper7 = engineCtx.appHelper) === null || _engineCtx$appHelper7 === void 0 || (_engineCtx$appHelper7 = _engineCtx$appHelper7.utils) === null || _engineCtx$appHelper7 === void 0 ? void 0 : _engineCtx$appHelper7.request;
		if (r) request.setRequest(r);
	}, [engineCtx === null || engineCtx === void 0 || (_engineCtx$appHelper8 = engineCtx.appHelper) === null || _engineCtx$appHelper8 === void 0 || (_engineCtx$appHelper8 = _engineCtx$appHelper8.utils) === null || _engineCtx$appHelper8 === void 0 ? void 0 : _engineCtx$appHelper8.request]);
	locales.init(PISELL_RESERVATION_PAGE_LOCALES, engineLocale);
	const getGridBookingInitialSearchParams = useCallback(() => getGridTableBookingSearchParams(operatingDayBoundary, effectiveTimelineRange), [operatingDayBoundary, effectiveTimelineRange]);
	const resourceBoardData = usePisellReservationResourceTableData(isInternalListData);
	const gridBookingData = usePisellReservationBookingData(isInternalListData, {
		listPageSize: 50,
		getInitialSearchParams: getGridBookingInitialSearchParams,
		extraRequestParams: bookingListBusinessCodeExtra,
		subscribeRealtimePush: true
	});
	/** 与 RecordBoard 当前子视图同步，用于资源墙下按所选资源切换 floorDayBooking 的 form_record_ids */
	const [shellBodyView, setShellBodyView] = useState(() => readBodyViewFromStorageKey(bodyViewStorageKey));
	/** 锁定大屏子视图、显式 prop、或 Segmented 切到「大屏」：强制墙钟跟随且不可关 */
	const wallClockFollowLocked = useMemo(() => Boolean(forceFollowWallClockProp) || lockedBodyView === "resourceWall" || shellBodyView === "resourceWall", [
		forceFollowWallClockProp,
		lockedBodyView,
		shellBodyView
	]);
	const { baseFloorConfig, floorPlanRemoteId, setRemoteFloorPlanView } = useReservationFloorPlan({
		resolvedFloorPlanId,
		effectiveFloorPlanCode,
		gridDataSourceKey,
		floorMapConfigFromProp: floorMapProp === null || floorMapProp === void 0 ? void 0 : floorMapProp.floorMapConfig,
		engineLocale
	});
	/**
	* 画布绑定 / 日历列：须与平面图实际 `sceneElements` 一致。
	* 勿直接用 `floorMapProp.floorMapConfig` 整块覆盖 `baseFloorConfig`：低代码常只传部分字段或
	* `sceneElements: []`，会盖掉 `useReservationFloorPlan` 已合并的远程布局，导致 form_record_ids 与
	* 日历画布 id 全空、三视图无数据。
	*/
	const floorConfigForBindings = useMemo(() => {
		var _baseFloorConfig$scen;
		const patch = floorMapProp === null || floorMapProp === void 0 ? void 0 : floorMapProp.floorMapConfig;
		if (!patch) return baseFloorConfig;
		const patchScene = patch.sceneElements;
		const usePatchScene = Array.isArray(patchScene) && patchScene.length > 0;
		return _objectSpread2(_objectSpread2(_objectSpread2({}, baseFloorConfig), patch), {}, { sceneElements: usePatchScene ? patchScene : (_baseFloorConfig$scen = baseFloorConfig.sceneElements) !== null && _baseFloorConfig$scen !== void 0 ? _baseFloorConfig$scen : patchScene });
	}, [floorMapProp === null || floorMapProp === void 0 ? void 0 : floorMapProp.floorMapConfig, baseFloorConfig]);
	const floorBoundFormRecordIds = useMemo(() => sceneElementsToBoundFormRecordIds(floorConfigForBindings.sceneElements, gridDataSourceKey), [floorConfigForBindings.sceneElements, gridDataSourceKey]);
	/** 资源墙筛选里选中的资源 id（与 grid 侧 searchParams.filter 同源） */
	const resourceWallFilterIdsForFloorBooking = useMemo(() => {
		if (!isInternalListData) return [];
		const sp = gridBookingData.searchParams;
		const fv = sp === null || sp === void 0 ? void 0 : sp.filter;
		if (!fv || typeof fv !== "object" || fv === null) return [];
		const vals = fv.values;
		if (!vals || typeof vals !== "object") return [];
		const raw = vals[DEFAULT_RESOURCE_WALL_FILTER_FIELD_KEY];
		if (!Array.isArray(raw)) return [];
		return raw.map(String).filter(Boolean);
	}, [isInternalListData, gridBookingData.searchParams]);
	/** 平面图：画布绑定 id；资源墙：所选资源 id（与画布一致走同一套 booking 推送 + mutate） */
	const floorBookingResourceReady = isInternalListData && !resourceBoardData.loading;
	const floorBookingExtraParams = useMemo(() => {
		const normalizeIds = (ids) => {
			const out = [];
			for (const id of ids) {
				const t = String(id).trim();
				if (!t) continue;
				const n = Number(t);
				if (Number.isFinite(n) && n > 0 && /^\d+$/.test(t)) out.push(Math.trunc(n));
				else out.push(t);
			}
			return out;
		};
		if (shellBodyView === "resourceWall" && resourceWallFilterIdsForFloorBooking.length > 0) return _objectSpread2(_objectSpread2({}, bookingListBusinessCodeExtra), {}, { form_record_ids: normalizeIds(resourceWallFilterIdsForFloorBooking) });
		return _objectSpread2(_objectSpread2({}, bookingListBusinessCodeExtra), {}, { form_record_ids: floorBoundFormRecordIds });
	}, [
		bookingListBusinessCodeExtra,
		shellBodyView,
		resourceWallFilterIdsForFloorBooking,
		floorBoundFormRecordIds
	]);
	const floorDayBookingData = usePisellReservationBookingData(floorBookingResourceReady, {
		listPageSize: 9999,
		extraRequestParams: floorBookingExtraParams,
		getInitialSearchParams: useCallback(() => getDefaultMonitorSearchParams(dayjs(), operatingDayBoundary, effectiveTimelineRange), [operatingDayBoundary, effectiveTimelineRange])
	});
	const _getRelationTables = useRequest(getRelationTables);
	const bookingPerspective = useBookingPerspective(useMemo(() => ({ relationTables: _getRelationTables.data }), [_getRelationTables.data]));
	const runtimeContext = useMemo(() => ({
		refresh: () => {
			resourceBoardData.refresh();
			gridBookingData.refresh();
			floorDayBookingData.refresh();
		},
		refreshAsync: function() {
			var _ref6 = _asyncToGenerator(function* () {
				yield Promise.all([
					resourceBoardData.refreshAsync(),
					gridBookingData.refreshAsync(),
					floorDayBookingData.refreshAsync()
				]);
			});
			return function refreshAsync() {
				return _ref6.apply(this, arguments);
			};
		}(),
		currentPerspective: "monitor"
	}), [
		resourceBoardData.refresh,
		resourceBoardData.refreshAsync,
		gridBookingData.refresh,
		gridBookingData.refreshAsync,
		floorDayBookingData.refresh,
		floorDayBookingData.refreshAsync
	]);
	const bookingChildProps = useMemo(() => {
		const build = bookingPerspective.getChildComponentProps;
		return build ? build(runtimeContext) : {};
	}, [bookingPerspective, runtimeContext]);
	/** 预约 Monitor 列序 bump 专用 key，避免沿用旧 `column_order`（低代码 `__id` 派生） */
	const bookingColumnStorageKey = useMemo(() => resolveBookingMonitorColumnStorageKey(__id), [__id]);
	const { internalSchedule, setInternalSchedule, schedule, debouncedSchedule, flushCommittedSchedule, queueCommittedSchedule } = useReservationScheduleDebounced({ scheduleValueProp });
	/**
	* 顶栏时间轴透传配置。
	*
	* 关于 `snapToStep`：预约场景下时间轴需要支持任意分钟（甚至秒级）的连续拖拽，
	* 不允许松手时把时间「吸附」回 0/15/30/45 等 step 刻度，否则会造成用户拖到 12:07
	* 松手后跳到 12:00 / 12:15 的体感断裂，并破坏与服务端原始时间戳的精度。
	*
	* 关于 `cursorMode`：桌面默认 `cursor-moves`；`variant="phone"` 时改为 `axis-moves`（拖刻度轴）。
	* 合并层始终强制 `snapToStep: false`，并覆盖 lowcode 误传的 `cursorMode`。
	* 下游 `PisellReservationSubcomponents` 中还会再按 `phoneLayout` 覆盖一次 cursorMode。
	*
	* 关于 `referenceDate`：`operating_day_boundary.type === 'end_time'` 时须与
	* `bookingTimeWindowForAnchorDay` 一致，锚到选中日 D−1，使 `getRangeBounds` 展开为
	* [D−1 界钟, D 界钟)；`start_time` 时为选中日 D。
	*
	* 因此这里在合并时**始终**写死 `snapToStep: false` 和 `cursorMode: 'cursor-moves'`，
	* 覆盖业务层（lowcode / 接入方）任何可能传入的相反值，作为整条链路的最外层强制关闭点。
	* 下游 `PisellReservationSubcomponents` 中还会再做一次同名兜底，
	* 避免新增中间层时因 spread 顺序失误把吸附 / axis-moves 打开。
	*/
	const mergedTimeNavigatorProps = useMemo(() => {
		var _timeNavigatorPropsPr;
		/**
		* 用户当前查看的日历日 == 真实自然日 时，认为是在「今天」视图：
		* 此时把 `referenceDate` 留给 timeline 自动按 `now` 挑（pickReferenceDateContainingNow），
		* 这样无论 now 是 02:00（处于上一个营业日尾部）还是 14:00（当前营业日中段），
		* 时间轴窗口都能覆盖 now，橙色「现在」高亮永远可见；且 timeline 每分钟 tick 重算一次，
		* 跨过营业边界（如 04:00）时自动切到下一个营业日窗口。
		*
		* 用户在日历切到其它日期（看过去/未来某一天）时，仍按 `schedule.date` + 营业边界类型派生，
		* 不让自动逻辑把视图拉回今天。
		*/
		const isViewingToday = dayjs(schedule.date).startOf("day").isSame(dayjs().startOf("day"), "day");
		return _objectSpread2(_objectSpread2({}, timeNavigatorPropsProp !== null && timeNavigatorPropsProp !== void 0 ? timeNavigatorPropsProp : {}), {}, {
			range: effectiveTimelineRange,
			snapToStep: false,
			cursorMode: isPhoneLayout ? "axis-moves" : "cursor-moves",
			referenceDate: (_timeNavigatorPropsPr = timeNavigatorPropsProp === null || timeNavigatorPropsProp === void 0 ? void 0 : timeNavigatorPropsProp.referenceDate) !== null && _timeNavigatorPropsPr !== void 0 ? _timeNavigatorPropsPr : isViewingToday ? void 0 : timelineReferenceDateForScheduleDay(schedule.date, operatingDayBoundary)
		});
	}, [
		timeNavigatorPropsProp,
		effectiveTimelineRange,
		schedule.date,
		operatingDayBoundary,
		isPhoneLayout
	]);
	const { followWallClock, setFollowWallClock, onFollowWallClockToggle, onTimeNavigatorUserInteraction } = useReservationWallClockFollow(scheduleValueProp, setInternalSchedule, flushCommittedSchedule, onScheduleChange, wallClockFollowLocked);
	const { salesResourceBookings, salesTimelineHighlights } = useReservationSalesHostData({
		isInternalListData,
		pisellosRef,
		hasPisellosGetModule,
		debouncedSchedule,
		followWallClock,
		resourceBoardLoading: resourceBoardData.loading,
		floorDayBookingLoading: floorDayBookingData.loading,
		floorDayBookingData: floorDayBookingData.data,
		floorDayBookingDataVersion: floorDayBookingData.pushDataVersion,
		scheduleDate: schedule.date,
		timeNavigatorPropsProp,
		timelineRange: effectiveTimelineRange,
		operatingDayBoundary
	});
	/** 合并资源行 + 当日预约列表（接口已按画布 form_record_ids + 营业日窗约束，不按顶栏 at 游标筛） */
	const tables = useMemo(() => buildReservationMergedTableRows({
		dataSourcesProp,
		gridDataSourceKey,
		isInternalListData,
		resourceList: resourceBoardData.data,
		floorDayBookingList: floorDayBookingData.data,
		schedule,
		dataProp,
		salesResourceBookings
	}), [
		dataSourcesProp,
		gridDataSourceKey,
		isInternalListData,
		resourceBoardData.data,
		floorDayBookingData.data,
		salesResourceBookings,
		dataProp
	]);
	/**
	* 日历列顺序：优先 sceneElements 绑定 id；若无（漏写 dataSourceKey、与 tables key 不一致等），
	* 回退到合并 tables 行 id，再回退到 floorDayBooking 中出现的 relation_id，避免画布有预约但日历全空。
	*/
	const calendarOrderedResourceIds = useMemo(() => {
		const fromScene = orderedCanvasResourceRecordIdStrings(floorConfigForBindings.sceneElements, gridDataSourceKey);
		if (fromScene.length > 0) return fromScene;
		const fromTables = [...new Set(tables.map((r) => String(r.id)).filter((id) => id !== "" && id !== "undefined" && id !== "null"))];
		if (fromTables.length > 0) return fromTables;
		const fromBookings = /* @__PURE__ */ new Set();
		const list = floorDayBookingData.data;
		if (Array.isArray(list)) for (const raw of list) {
			if (!raw || typeof raw !== "object") continue;
			for (const id of extractResourceRecordIds(raw)) if (id) fromBookings.add(id);
		}
		return [...fromBookings];
	}, [
		floorConfigForBindings.sceneElements,
		gridDataSourceKey,
		tables,
		floorDayBookingData.data
	]);
	const calendarCanvasIdSet = useMemo(() => new Set(calendarOrderedResourceIds), [calendarOrderedResourceIds]);
	const calendarResources = useMemo(() => buildCalendarResourcesFromMergedTables({
		orderedResourceIds: calendarOrderedResourceIds,
		tables
	}), [calendarOrderedResourceIds, tables]);
	const calendarBookings = useMemo(() => mapFloorDayBookingsToCalendarItems({
		bookings: floorDayBookingData.data,
		canvasResourceIdSet: calendarCanvasIdSet
	}), [floorDayBookingData.data, calendarCanvasIdSet]);
	const venueWallCards = useMemo(() => mapReservationRowsToVenueWallCards(tables), [tables]);
	/** 顶栏日程防抖落定后的时间键，避免 dayjs 引用抖动 */
	const debouncedScheduleKey = useMemo(() => `${dayjs(debouncedSchedule.date).startOf("day").valueOf()}_${dayjs(debouncedSchedule.at).valueOf()}`, [debouncedSchedule.date, debouncedSchedule.at]);
	const bodyViewRef = useRef(readBodyViewFromStorageKey(bodyViewStorageKey));
	const floorMapLayoutRef = useRef(null);
	const newReservationModalRef = useRef(null);
	const searchParamsRefControlled = useRef(searchParamsProp);
	useEffect(() => {
		searchParamsRefControlled.current = searchParamsProp;
	}, [searchParamsProp]);
	const onSearchRef = useRef(onSearchProp);
	const onScheduleChangeRef = useRef(onScheduleChange);
	/** 每帧同步，供 interval / effect 内调用最新 onSearch、onScheduleChange，避免闭包陈旧 */
	useEffect(() => {
		onSearchRef.current = onSearchProp;
		onScheduleChangeRef.current = onScheduleChange;
	});
	/**
	* `debouncedSchedule` 更新后执行（用户停手约 300ms 或 flush）：
	* - 内置列表：非日历视图下，将 floorDayBooking 的 `booking_time_start_between` 与时间轴营业窗对齐
	*   （「今天」用 pickReferenceDateContainingNow，与 TimeNavigator 一致；其它日仍按锚定营业日）；
	* - **日历视图**下可见区间由 `onViewportChange` → `mergeSearchParamsBookingRange` 维护；此处若再合并单日窗
	*   会在防抖后覆盖整月/整周区间；
	* - 外部 data + 当前 bodyView 为平面图：把 reservationDate/At 透传给外部 onSearch。
	*/
	useEffect(() => {
		if (isInternalListData && bodyViewRef.current !== "calendar") {
			const d = debouncedSchedule.date;
			floorDayBookingData.patchSearchParams((prevParams) => mergeSearchParamsBookingWindow(prevParams, d, operatingDayBoundary, effectiveTimelineRange, dayjs()));
		}
		if ((bodyViewRef.current === "floorMap" || bodyViewRef.current === "calendar" || bodyViewRef.current === "resourceWall") && !isInternalListData) {
			var _onSearchRef$current, _searchParamsRefContr;
			(_onSearchRef$current = onSearchRef.current) === null || _onSearchRef$current === void 0 || _onSearchRef$current.call(onSearchRef, _objectSpread2(_objectSpread2({}, (_searchParamsRefContr = searchParamsRefControlled.current) !== null && _searchParamsRefContr !== void 0 ? _searchParamsRefContr : {}), {}, {
				reservationDate: debouncedSchedule.date.toISOString(),
				reservationAt: debouncedSchedule.at.toISOString()
			}));
		}
	}, [
		debouncedSchedule,
		isInternalListData,
		floorDayBookingData.patchSearchParams,
		operatingDayBoundary,
		effectiveTimelineRange
	]);
	const handleScheduleChange = useCallback((next) => {
		if (!wallClockFollowLocked) setFollowWallClock(false);
		if (scheduleValueProp === void 0) setInternalSchedule(next);
		onScheduleChange === null || onScheduleChange === void 0 || onScheduleChange(next);
		queueCommittedSchedule(next);
	}, [
		scheduleValueProp,
		onScheduleChange,
		setFollowWallClock,
		queueCommittedSchedule,
		wallClockFollowLocked
	]);
	/** 先展开外部 dataSources，再用合并后的 `tables` 覆盖同名 key，避免低代码默认的 `tables: []` 盖掉 resource+booking 合并结果 */
	const dataSources = useMemo(() => {
		return _objectSpread2(_objectSpread2({}, dataSourcesProp), {}, { [gridDataSourceKey]: tables });
	}, [
		gridDataSourceKey,
		tables,
		dataSourcesProp
	]);
	const isFloorModeControlled = (floorMapProp === null || floorMapProp === void 0 ? void 0 : floorMapProp.mode) !== void 0;
	const [mapEditInternal, setMapEditInternal] = useState(false);
	const effectiveMapMode = (_floorMapProp$mode = floorMapProp === null || floorMapProp === void 0 ? void 0 : floorMapProp.mode) !== null && _floorMapProp$mode !== void 0 ? _floorMapProp$mode : mapEditInternal ? "edit" : "read";
	const { showVenueHudDock, handleOpenHudTableDrawer, closeHudTableDrawer, hudDrawerRef, hudDrawerOpen, hudMapItems, hudDrawerResourceRootBuckets, hudDrawerPagedRows, hudDrawerFilteredTotal, hudDrawerLoading, hudDrawerBookingPagination, hudDrawerOnSearch, hudDrawerOnReset, hudDrawerOnPageChange, hudDrawerToolBar, hudDrawerLocalSearchParams, handleHudDrawerFormRecordIdsChange, reservationFloorMapViewportOverlay, renderItemByKind } = useReservationHudDrawer({
		floorMapHudTableDrawer,
		dataSources,
		gridDataSourceKey,
		isInternalListData,
		floorDayBookingData,
		searchParamsProp,
		dataProp,
		loadingProp,
		bookingChildProps,
		resourceBoardData,
		phoneLayout: isPhoneLayout,
		hideViewportHudStats: isPhoneLayout && effectiveMapMode === "edit"
	});
	const [floorMapAppearanceMode, setFloorMapAppearanceMode] = useState("light");
	const toggleFloorMapAppearanceMode = useCallback(() => {
		setFloorMapAppearanceMode((prev) => prev === "light" ? "dark" : "light");
	}, []);
	const { bookingDetailOpen, bookingDetailRaw, bookingDetailRow, bookingDetailSceneName, closeBookingDetailModal, closeBookingDetailNow, floorMapItemClickBefore, openBookingDetailFromRaw, readModeSelectedFloorItemId } = useFloorMapBookingInteraction({
		engineCtx,
		onFloorMapBookingClick,
		dataSources,
		mergedTableRows: tables,
		reservationBiz: BIZ,
		resourceSelectMode,
		associatedMenuListIds: reservationAssociatedMenuListIds,
		reservationRuleProduct
	});
	/**
	* 详情 Modal 内动作（complete / start / cancel 等）成功后：
	*
	* 1. 立刻同步关 Modal —— 不要先 `await refreshAsync()` 再关。否则在 refresh 期间
	*    `useFloorMapBookingInteraction` 里 `useEffect[bookingDetailOpen, mergedTableRows]`
	*    会用 `extractFloorMapSourceBookingForRow` 把 `bookingDetailRaw` 回灌成「completed
	*    新 raw」，弹窗内容再亮一帧；叠加 `closeBookingDetailModal` 的 50ms `setTimeout`
	*    与上层 `Modal.confirm` 的 fade out，all 视图下视觉上就成了「弹窗消失 → 又出现 → 再消失」。
	* 2. 走 `closeBookingDetailNow`（不带 50ms 延迟），程序化路径不存在 click 冒泡风险。
	* 3. 关完再去 refresh，`bookingDetailOpen=false` 后 effect 自然短路，回灌不会再发生。
	*/
	const handleBookingDetailActionSuccess = useCallback(_asyncToGenerator(function* () {
		closeBookingDetailNow();
		yield runtimeContext.refreshAsync();
	}), [closeBookingDetailNow, runtimeContext]);
	const { reservationCalendarSlotProps, calendarGranularity, setCalendarGranularity } = useReservationCalendarSlot({
		isInternalListData,
		floorDayBookingData,
		operatingDayBoundary,
		tables,
		openBookingDetailFromRaw,
		schedule,
		handleScheduleChange,
		calendarResources,
		calendarBookings,
		effectiveTimelineRange,
		runtimeContext
	});
	const floorMapMerged = useReservationFloorMapMerged({
		floorMapProp,
		baseFloorConfig,
		dataSources,
		renderItemByKind,
		gridDataSourceKey,
		effectiveMapMode,
		resolvedFloorPlanId,
		floorPlanRemoteId,
		effectiveFloorPlanCode,
		floorPlanCanvasWidth,
		floorPlanCanvasHeight,
		floorPlanName,
		floorPlanSort,
		floorPlanStatus,
		onFloorPlanPersisted,
		putFloorPlan,
		isFloorModeControlled,
		mapEditInternal,
		setMapEditInternal,
		floorMapLayoutRef,
		reservationFloorMapViewportOverlay,
		setRemoteFloorPlanView,
		floorMapItemClickBefore,
		engineLocale,
		floorMapHudTableDrawer,
		readModeSelectedItemId: readModeSelectedFloorItemId,
		editTopBarPhoneLayout: isPhoneLayout,
		appearanceMode: floorMapAppearanceMode,
		onToggleAppearanceMode: toggleFloorMapAppearanceMode
	});
	const data = isInternalListData ? gridBookingData.data : dataProp !== null && dataProp !== void 0 ? dataProp : [];
	/** 内置 booking 列表请求不展示 RecordBoard 全表 Spin；受控模式仍可用 props.loading */
	const loadingShown = useReservationLoadingShownDebounced(isInternalListData ? false : loadingProp !== null && loadingProp !== void 0 ? loadingProp : false);
	const total = isInternalListData ? gridBookingData.total : totalProp !== null && totalProp !== void 0 ? totalProp : 0;
	const pagination = isInternalListData ? gridBookingData.pagination : paginationProp !== null && paginationProp !== void 0 ? paginationProp : {
		pageNumber: 1,
		pageSize: 50
	};
	const onPageChange = isInternalListData ? gridBookingData.onPageChange : onPageChangeProp;
	const searchParams = isInternalListData ? gridBookingData.searchParams : searchParamsProp !== null && searchParamsProp !== void 0 ? searchParamsProp : {};
	const phoneGridInfiniteData = useReservationPhoneGridInfiniteData({
		enabled: isPhoneLayout,
		isInternalListData,
		rowKey,
		data,
		pagination,
		searchParams
	});
	const recordBoardListData = isPhoneLayout ? phoneGridInfiniteData : data;
	const onGridBookingSearch = useCallback((params) => {
		gridBookingData.onSearch(mergeGridBookingSearchParams(params));
	}, [gridBookingData.onSearch]);
	const onSearch = isInternalListData ? onGridBookingSearch : onSearchProp;
	const onReset = isInternalListData ? gridBookingData.onReset : onResetProp;
	const { venueWallAppearanceTheme, setVenueWallAppearanceTheme, venueWallAppearanceMode, setVenueWallAppearanceMode, venueWallResourceLayout, setVenueWallResourceLayout } = useReservationResourceWallPersist({
		bodyViewStorageKey,
		isInternalListData,
		searchParams,
		onSearch,
		venueWallCards,
		floorDayBookingLoading: floorDayBookingData.loading
	});
	useReservationDebugLoggers({
		isInternalListData,
		resourceList: resourceBoardData.data,
		resourceListLoading: resourceBoardData.loading,
		salesResourceBookings,
		debouncedScheduleKey,
		debouncedSchedule,
		gridBookingData,
		floorDayBookingData,
		tables,
		dataProp: dataProp !== null && dataProp !== void 0 ? dataProp : void 0,
		dataSourcesProp,
		gridDataSourceKey,
		floorConfigForBindings,
		floorBoundFormRecordIds,
		shellBodyView,
		calendarGranularity,
		schedule,
		effectiveTimelineRange,
		calendarOrderedResourceIds,
		calendarResources,
		calendarBookings,
		venueWallCards,
		searchParams,
		floorBookingExtraParams
	});
	const { toolBarMerged } = useReservationToolBarMerged({
		toolBarProp,
		bookingToolBar: bookingChildProps.toolBar,
		isInternalListData,
		tables,
		schedule,
		handleScheduleChange,
		scheduleStartSlotProp,
		scheduleEndSlotProp,
		schedulePropsProp,
		mergedTimeNavigatorProps,
		followWallClock,
		onFollowWallClockToggle,
		onTimeNavigatorUserInteraction,
		calendarGranularity,
		setCalendarGranularity,
		onNewReservation: () => {
			var _newReservationModalR;
			return (_newReservationModalR = newReservationModalRef.current) === null || _newReservationModalR === void 0 ? void 0 : _newReservationModalR.requestOpen();
		},
		salesTimelineHighlights,
		floorDayBookingData: floorDayBookingData.data,
		data,
		effectiveTimelineRange,
		phoneLayout: isPhoneLayout,
		bodyView: shellBodyView
	});
	const recordBoardGrid = useMemo(() => {
		return bookingChildProps.grid;
	}, [bookingChildProps.grid]);
	const mobileRecordBoardGrid = useMemo(() => {
		if (!isPhoneLayout || recordBoardGrid == null || typeof recordBoardGrid !== "object") return recordBoardGrid;
		return buildReservationMobileTableGridConfig(recordBoardGrid);
	}, [isPhoneLayout, recordBoardGrid]);
	/**
	* HUD 抽屉（Today sales）始终为窄抽屉（≤ 540px），即使主页面在桌面视口下也应使用手机布局；
	* 因此独立从 `recordBoardGrid` 派生 mobile 配置，不依赖 `isPhoneLayout`。
	*/
	const hudDrawerMobileGrid = useMemo(() => {
		if (recordBoardGrid == null || typeof recordBoardGrid !== "object") return recordBoardGrid;
		return buildReservationMobileTableGridConfig(recordBoardGrid);
	}, [recordBoardGrid]);
	/**
	* HUD 内嵌表：小号密度 + 无限滚动；列宽由 `buildReservationMobileTableGridConfig`
	*（`adaptColumnsForPhoneLayout` + 列 key 上限）统一收窄，勿在 HUD 层二次缩放。
	*/
	const hudDrawerGrid = useMemo(() => {
		const g = hudDrawerMobileGrid;
		const scrollBase = g != null && typeof g === "object" && "scroll" in g && g.scroll != null && typeof g.scroll === "object" ? _objectSpread2({}, g.scroll) : {};
		if (g == null || typeof g !== "object") return {
			size: "small",
			infiniteScroll: true,
			scroll: _objectSpread2(_objectSpread2({}, scrollBase), {}, { autoCalc: true })
		};
		return _objectSpread2(_objectSpread2({}, g), {}, {
			size: "small",
			infiniteScroll: true,
			scroll: _objectSpread2(_objectSpread2({}, scrollBase), {}, { autoCalc: true })
		});
	}, [hudDrawerMobileGrid]);
	const fillHeight = (_scroll$autoCalc = mobileRecordBoardGrid === null || mobileRecordBoardGrid === void 0 || (_scroll = mobileRecordBoardGrid.scroll) === null || _scroll === void 0 ? void 0 : _scroll.autoCalc) !== null && _scroll$autoCalc !== void 0 ? _scroll$autoCalc : true;
	const reservationResourceWallSlotProps = useMemo(() => ({
		cards: venueWallCards,
		loading: floorDayBookingData.loading,
		filterFieldKey: DEFAULT_RESOURCE_WALL_FILTER_FIELD_KEY,
		appearanceTheme: venueWallAppearanceTheme,
		onAppearanceThemeChange: setVenueWallAppearanceTheme,
		appearanceMode: venueWallAppearanceMode,
		onAppearanceModeChange: setVenueWallAppearanceMode,
		resourceWallLayout: venueWallResourceLayout,
		onResourceWallLayoutChange: setVenueWallResourceLayout
	}), [
		venueWallCards,
		floorDayBookingData.loading,
		venueWallAppearanceTheme,
		venueWallAppearanceMode,
		venueWallResourceLayout
	]);
	return /* @__PURE__ */ React.createElement(LocalizationProvider, {
		dateAdapter: AdapterDayjs,
		adapterLocale: muiDatePickerAdapterLocale
	}, /* @__PURE__ */ React.createElement("div", {
		className: classNames("pisell-reservation-page", isPhoneLayout && "pisell-reservation-page--phone", className),
		style
	}, /* @__PURE__ */ React.createElement(PisellRecordBoard, _objectSpread2(_objectSpread2({}, rest), {}, {
		columnVisibilityStorageKey: bookingColumnStorageKey,
		layoutVariant: isPhoneLayout ? "phone" : "default",
		fillHeight,
		rowKey,
		data: recordBoardListData,
		dataSources,
		loading: loadingShown,
		total,
		pagination,
		onPageChange,
		searchParams,
		onSearch,
		onReset,
		grid: mobileRecordBoardGrid,
		toolBar: toolBarMerged,
		search: bookingChildProps.search,
		batchActionBar: bookingChildProps.batchActionBar,
		floorMap: floorMapMerged,
		calendar: reservationCalendarSlotProps,
		resourceWall: reservationResourceWallSlotProps,
		defaultBodyView: "floorMap",
		bodyViewStorageKey,
		bodyViewSwitchable,
		lockedBodyView,
		floorMapLayoutRef
	}), /* @__PURE__ */ React.createElement(RecordBoardBodyViewCapture, {
		bodyViewRef,
		onBodyViewChange: setShellBodyView
	}), /* @__PURE__ */ React.createElement(ScheduleSyncOnFloorEnter, {
		schedule,
		isInternalListData,
		patchSearchParams: floorDayBookingData.patchSearchParams,
		operatingDayBoundary,
		timelineRange: effectiveTimelineRange
	}), /* @__PURE__ */ React.createElement(PisellRecordBoard.ShellFrame, null, /* @__PURE__ */ React.createElement(PisellRecordBoard.GridLayout, null), /* @__PURE__ */ React.createElement(PisellRecordBoard.FloorMap, null), /* @__PURE__ */ React.createElement(PisellRecordBoard.Calendar, reservationCalendarSlotProps), /* @__PURE__ */ React.createElement(PisellRecordBoard.ResourceWall, null))), /* @__PURE__ */ React.createElement(ReservationNewReservationModal, {
		ref: newReservationModalRef,
		router,
		app
	}), /* @__PURE__ */ React.createElement(ReservationBookingDetailModal, {
		open: bookingDetailOpen,
		onClose: closeBookingDetailModal,
		onActionSuccess: handleBookingDetailActionSuccess,
		raw: bookingDetailRaw,
		tableRow: bookingDetailRow,
		sceneElementName: bookingDetailSceneName,
		reservationBiz: BIZ,
		associatedMenuListIds: reservationAssociatedMenuListIds,
		reservationRuleProduct,
		floorDayBookingList: floorDayBookingData.data,
		currentTime: debouncedSchedule.at,
		followWallClock
	}), fab ? /* @__PURE__ */ React.createElement("div", { className: "pisell-reservation-fab" }, fab) : null, /* @__PURE__ */ React.createElement(ReservationHudDrawer, {
		floorMapHudTableDrawer,
		showVenueHudDock,
		hudDrawerOpen,
		hudDrawerRef,
		hudMapItems,
		dataSources,
		handleOpenHudTableDrawer,
		closeHudTableDrawer,
		rowKey,
		hudDrawerPagedRows,
		hudDrawerLoading,
		hudDrawerFilteredTotal,
		hudDrawerBookingPagination,
		hudDrawerOnPageChange,
		hudDrawerLocalSearchParams,
		hudDrawerOnSearch,
		hudDrawerOnReset,
		hudDrawerGrid,
		hudDrawerToolBar,
		batchActionBar: bookingChildProps.batchActionBar,
		hudDrawerResourceRootBuckets,
		handleHudDrawerFormRecordIdsChange
	})));
};
//#endregion
export { PisellReservationCore };
