@pisell/materials 1.0.1060 → 1.0.1062

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 (64) 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 +7 -7
  5. package/build/lowcode/render/default/view.css +1 -1
  6. package/build/lowcode/render/default/view.js +3 -3
  7. package/build/lowcode/view.css +1 -1
  8. package/build/lowcode/view.js +23 -23
  9. package/es/components/PisellLayouts/index.js +14 -14
  10. package/es/components/pisellFloorMapLayout/PisellFloorMapLayout.js +9 -4
  11. package/es/components/pisellFloorMapLayout/PisellFloorMapLayout.stories.js +34 -34
  12. package/es/components/pisellFloorMapLayout/components/FloorMapEditPanel.js +55 -2
  13. package/es/components/pisellFloorMapLayout/components/FloorMapEditPanel.less +1 -0
  14. package/es/components/pisellFloorMapLayout/components/ItemLayer.js +5 -5
  15. package/es/components/pisellFloorMapLayout/context/mergeFloorMapLayoutContext.js +3 -2
  16. package/es/components/pisellFloorMapLayout/hooks/useFloorMapEditState.d.ts +2 -0
  17. package/es/components/pisellFloorMapLayout/hooks/useFloorMapEditState.js +4 -2
  18. package/es/components/pisellFloorMapLayout/hooks/useFloorMapTransformMetrics.js +42 -1
  19. package/es/components/pisellFloorMapLayout/types.d.ts +17 -1
  20. package/es/components/pisellHierarchicalSummaryList/hooks/useExpandedKeys.js +2 -2
  21. package/es/components/pisellHierarchicalSummaryList/index.js +2 -2
  22. package/es/components/pisellRecordBoard/PisellRecordBoard.js +30 -5
  23. package/es/components/pisellRecordBoard/PisellRecordBoard.stories.js +51 -51
  24. package/es/components/pisellRecordBoard/shellFrame/ToolBar/index.js +4 -4
  25. package/es/components/pisellRecordBoard/shellFrame/index.js +4 -2
  26. package/es/components/pisellRecordBoard/types.d.ts +8 -2
  27. package/es/components/pisellReservationScheduleBand/PisellReservationScheduleBand.less +1 -1
  28. package/es/components/pisellTimeNavigator/PisellTimeNavigator.js +148 -51
  29. package/es/components/pisellTimeNavigator/PisellTimeNavigator.less +38 -4
  30. package/es/components/pisellTimeNavigator/components/BackgroundLayer.js +2 -2
  31. package/es/components/pisellTimeNavigator/components/CursorLayer.js +4 -4
  32. package/es/components/pisellTimeNavigator/components/GestureLayer.js +2 -2
  33. package/es/components/pisellTimeNavigator/components/NowButton.js +3 -3
  34. package/es/components/pisellTimeNavigator/components/ScaleLayer.js +3 -3
  35. package/es/components/pisellTimeNavigator/hooks/useDragInertia.js +2 -2
  36. package/es/components/pisellTimeNavigator/hooks/useRealtime.js +2 -2
  37. package/es/components/pisellTimeNavigator/hooks/useTimeAxis.js +8 -8
  38. package/es/components/pisellTimeNavigator/types.d.ts +4 -0
  39. package/es/components/pisellTimeNavigator/utils/index.d.ts +4 -0
  40. package/es/components/pisellTimeNavigator/utils/index.js +28 -14
  41. package/es/index.js +16 -16
  42. package/lib/components/pisellFloorMapLayout/PisellFloorMapLayout.js +7 -4
  43. package/lib/components/pisellFloorMapLayout/components/FloorMapEditPanel.js +231 -157
  44. package/lib/components/pisellFloorMapLayout/components/FloorMapEditPanel.less +1 -0
  45. package/lib/components/pisellFloorMapLayout/context/mergeFloorMapLayoutContext.js +2 -1
  46. package/lib/components/pisellFloorMapLayout/hooks/useFloorMapEditState.d.ts +2 -0
  47. package/lib/components/pisellFloorMapLayout/hooks/useFloorMapEditState.js +4 -2
  48. package/lib/components/pisellFloorMapLayout/hooks/useFloorMapTransformMetrics.js +47 -1
  49. package/lib/components/pisellFloorMapLayout/types.d.ts +17 -1
  50. package/lib/components/pisellRecordBoard/PisellRecordBoard.js +32 -4
  51. package/lib/components/pisellRecordBoard/shellFrame/index.js +1 -0
  52. package/lib/components/pisellRecordBoard/types.d.ts +8 -2
  53. package/lib/components/pisellReservationScheduleBand/PisellReservationScheduleBand.less +1 -1
  54. package/lib/components/pisellTimeNavigator/PisellTimeNavigator.js +143 -29
  55. package/lib/components/pisellTimeNavigator/PisellTimeNavigator.less +38 -4
  56. package/lib/components/pisellTimeNavigator/types.d.ts +4 -0
  57. package/lib/components/pisellTimeNavigator/utils/index.d.ts +4 -0
  58. package/lib/components/pisellTimeNavigator/utils/index.js +9 -0
  59. package/lowcode/floor-map-layout-provider/meta.ts +1 -1
  60. package/lowcode/pisell-floor-map-layout/meta.ts +75 -1
  61. package/lowcode/pisell-hierarchical-summary-list/meta.ts +244 -244
  62. package/lowcode/render-figma-style-round-table-card/meta.ts +1 -1
  63. package/lowcode/render-figma-style-table-card/meta.ts +1 -1
  64. package/package.json +4 -4
@@ -1,17 +1,17 @@
1
- /**
2
- * PisellLayouts 命名空间
3
- * 布局组件集合
4
- *
5
- * @example
6
- * import { PisellLayouts } from '@pisell/materials';
7
- *
8
- * <PisellLayouts.BasicGrid columns={3} gap={16}>
9
- * {items.map(item => <Card key={item.id} {...item} />)}
10
- * </PisellLayouts.BasicGrid>
11
- *
12
- * <PisellLayouts.ScrollView direction="horizontal">
13
- * <Content />
14
- * </PisellLayouts.ScrollView>
1
+ /**
2
+ * PisellLayouts 命名空间
3
+ * 布局组件集合
4
+ *
5
+ * @example
6
+ * import { PisellLayouts } from '@pisell/materials';
7
+ *
8
+ * <PisellLayouts.BasicGrid columns={3} gap={16}>
9
+ * {items.map(item => <Card key={item.id} {...item} />)}
10
+ * </PisellLayouts.BasicGrid>
11
+ *
12
+ * <PisellLayouts.ScrollView direction="horizontal">
13
+ * <Content />
14
+ * </PisellLayouts.ScrollView>
15
15
  */
16
16
 
17
17
  import PisellBasicGrid from "../PisellBasicGrid";
@@ -81,7 +81,8 @@ function PisellFloorMapLayoutInner(props, ref) {
81
81
  onElementRenderError = p.onElementRenderError,
82
82
  _p$toolbarShowSave = p.toolbarShowSave,
83
83
  toolbarShowSave = _p$toolbarShowSave === void 0 ? true : _p$toolbarShowSave,
84
- floorMapFullscreenMode = p.floorMapFullscreenMode;
84
+ floorMapFullscreenMode = p.floorMapFullscreenMode,
85
+ showDataSourceRecordFormBlock = p.showDataSourceRecordFormBlock;
85
86
  var isFloorMapView = Boolean(floorMapConfigProp);
86
87
  var contentOffsetRef = useRef({
87
88
  x: 0,
@@ -101,7 +102,8 @@ function PisellFloorMapLayoutInner(props, ref) {
101
102
  dataSourceRecordForm: dataSourceRecordForm,
102
103
  dataSourceLabels: dataSourceLabels,
103
104
  layoutPrefix: PREFIX,
104
- contentOffsetRef: contentOffsetRef
105
+ contentOffsetRef: contentOffsetRef,
106
+ showDataSourceRecordFormBlock: showDataSourceRecordFormBlock
105
107
  });
106
108
  var config = edit.config,
107
109
  currentCanvasId = edit.currentCanvasId,
@@ -298,9 +300,12 @@ function PisellFloorMapLayoutInner(props, ref) {
298
300
  var _transformRef$current3;
299
301
  return (_transformRef$current3 = transformRef.current) === null || _transformRef$current3 === void 0 ? void 0 : _transformRef$current3.resetTransform();
300
302
  },
301
- fitBounds: fitBounds
303
+ fitBounds: fitBounds,
304
+ saveLayout: function saveLayout() {
305
+ return handleSave();
306
+ }
302
307
  };
303
- }, [fitBounds]);
308
+ }, [fitBounds, handleSave]);
304
309
  var showSidebar = isFloorMapView && mode === 'edit' && config && dataSources;
305
310
  return /*#__PURE__*/React.createElement("div", {
306
311
  ref: containerRef,
@@ -49,11 +49,11 @@ var FIGMA = {
49
49
  legendAvailableSoon: '#FDA29B'
50
50
  };
51
51
 
52
- /**
53
- * PisellFloorMapLayout 楼层图布局
54
- *
55
- * 空间布局视图:在二维平面按坐标渲染资源(桌台/房间/工位等),
56
- * 支持缩放、平移、复位、区域定位,仅负责展示与交互。
52
+ /**
53
+ * PisellFloorMapLayout 楼层图布局
54
+ *
55
+ * 空间布局视图:在二维平面按坐标渲染资源(桌台/房间/工位等),
56
+ * 支持缩放、平移、复位、区域定位,仅负责展示与交互。
57
57
  */
58
58
  var meta = {
59
59
  title: 'Data Display/PisellFloorMapLayout',
@@ -166,8 +166,8 @@ function renderSimpleItem(item) {
166
166
  }, item.id);
167
167
  }
168
168
 
169
- /**
170
- * 默认 - 纯色底 + 简单格子(格子单位,默认 item 间距 8px)
169
+ /**
170
+ * 默认 - 纯色底 + 简单格子(格子单位,默认 item 间距 8px)
171
171
  */
172
172
  export var Default = {
173
173
  parameters: {
@@ -220,8 +220,8 @@ export var Default = {
220
220
  }
221
221
  };
222
222
 
223
- /**
224
- * 显示网格线(item 间距由 mapLayer.gap 控制)
223
+ /**
224
+ * 显示网格线(item 间距由 mapLayer.gap 控制)
225
225
  */
226
226
  export var WithGrid = {
227
227
  args: {
@@ -246,8 +246,8 @@ export var WithGrid = {
246
246
  }
247
247
  };
248
248
 
249
- /**
250
- * 开启平移 - 可拖拽画布
249
+ /**
250
+ * 开启平移 - 可拖拽画布
251
251
  */
252
252
  export var WithPan = {
253
253
  args: {
@@ -278,8 +278,8 @@ export var WithPan = {
278
278
  }
279
279
  };
280
280
 
281
- /**
282
- * 不同形状 - 矩形、圆形、三角形;含不同格子宽高(如 rect2 为 2x1)
281
+ /**
282
+ * 不同形状 - 矩形、圆形、三角形;含不同格子宽高(如 rect2 为 2x1)
283
283
  */
284
284
  var shapeItems = [{
285
285
  id: 'rect',
@@ -326,8 +326,8 @@ export var WithShapes = {
326
326
  }
327
327
  };
328
328
 
329
- /**
330
- * 格子单位下不同宽高 - 每个 item 可设置 width/height(格子数)
329
+ /**
330
+ * 格子单位下不同宽高 - 每个 item 可设置 width/height(格子数)
331
331
  */
332
332
  var variableSizeItems = [{
333
333
  id: '1x1',
@@ -389,8 +389,8 @@ export var WithVariableSizes = {
389
389
  }
390
390
  };
391
391
 
392
- /**
393
- * 像素单位 - x、y、width、height 均为像素,可任意位置与尺寸
392
+ /**
393
+ * 像素单位 - x、y、width、height 均为像素,可任意位置与尺寸
394
394
  */
395
395
  var pixelItems = [{
396
396
  id: 'A',
@@ -451,8 +451,8 @@ export var PixelUnits = {
451
451
  }
452
452
  };
453
453
 
454
- /**
455
- * 点击与 Hover 事件
454
+ /**
455
+ * 点击与 Hover 事件
456
456
  */
457
457
  export var WithEvents = {
458
458
  args: {
@@ -481,8 +481,8 @@ export var WithEvents = {
481
481
  }
482
482
  };
483
483
 
484
- /**
485
- * Ref 调用 - 外部按钮控制缩放/复位/区域定位
484
+ /**
485
+ * Ref 调用 - 外部按钮控制缩放/复位/区域定位
486
486
  */
487
487
  export var WithRefControls = {
488
488
  render: function WithRefControlsRender() {
@@ -544,9 +544,9 @@ export var WithRefControls = {
544
544
  }
545
545
  };
546
546
 
547
- /**
548
- * Floor Map 视图 - 编辑态(多画布 Tab + 占位工具栏/编辑面板)
549
- * 传入 floorMapConfig + dataSources + mode='edit',由组件内部合并 items
547
+ /**
548
+ * Floor Map 视图 - 编辑态(多画布 Tab + 占位工具栏/编辑面板)
549
+ * 传入 floorMapConfig + dataSources + mode='edit',由组件内部合并 items
550
550
  */
551
551
  var mockFloorMapConfig = {
552
552
  canvasUi: {
@@ -747,8 +747,8 @@ function SalesRecordInlineForm(props) {
747
747
  }, "\u4FDD\u5B58\uFF08\u81EA\u5B9A\u4E49\u8868\u5355\uFF09"));
748
748
  }
749
749
 
750
- /**
751
- * 平面图编辑态 + 自定义数据源记录表单(`dataSourceRecordForm.sales`)
750
+ /**
751
+ * 平面图编辑态 + 自定义数据源记录表单(`dataSourceRecordForm.sales`)
752
752
  */
753
753
  export var FloorMapViewEditCustomRecordForm = {
754
754
  parameters: {
@@ -811,8 +811,8 @@ export var FloorMapViewEditCustomRecordForm = {
811
811
  }
812
812
  };
813
813
 
814
- /**
815
- * Floor Map 视图 - 阅读态(方桌同样用 Figma 样式)
814
+ /**
815
+ * Floor Map 视图 - 阅读态(方桌同样用 Figma 样式)
816
816
  */
817
817
  export var FloorMapViewRead = {
818
818
  parameters: {
@@ -851,8 +851,8 @@ export var FloorMapViewRead = {
851
851
  }
852
852
  };
853
853
 
854
- /**
855
- * 自定义控制按钮显隐
854
+ /**
855
+ * 自定义控制按钮显隐
856
856
  */
857
857
  export var ControlsHidden = {
858
858
  args: {
@@ -875,8 +875,8 @@ export var ControlsHidden = {
875
875
  }
876
876
  };
877
877
 
878
- /**
879
- * `FloorMapLayoutProvider` 注入 `floorMapConfig` / `dataSources`;Layout 仅传展示向 props
878
+ /**
879
+ * `FloorMapLayoutProvider` 注入 `floorMapConfig` / `dataSources`;Layout 仅传展示向 props
880
880
  */
881
881
  export var FloorMapWithLayoutProvider = {
882
882
  parameters: {
@@ -1531,8 +1531,8 @@ function LegendItem14131(_ref5) {
1531
1531
  }), label);
1532
1532
  }
1533
1533
 
1534
- /**
1535
- * Figma 设计稿效果 - 餐厅桌台状态图(顶部 Tab + 图例参考 node 14131:6266,内容区不变)
1534
+ /**
1535
+ * Figma 设计稿效果 - 餐厅桌台状态图(顶部 Tab + 图例参考 node 14131:6266,内容区不变)
1536
1536
  */
1537
1537
  export var FigmaDesign = {
1538
1538
  parameters: {
@@ -48,6 +48,7 @@ export function FloorMapEditPanel(props) {
48
48
  _props$dataSourceLabe = props.dataSourceLabels,
49
49
  dataSourceLabels = _props$dataSourceLabe === void 0 ? {} : _props$dataSourceLabe,
50
50
  layoutDraftDirty = props.layoutDraftDirty,
51
+ showRecordFormProp = props.showDataSourceRecordFormBlock,
51
52
  className = props.className;
52
53
  var _Form$useForm = Form.useForm(),
53
54
  _Form$useForm2 = _slicedToArray(_Form$useForm, 1),
@@ -196,6 +197,7 @@ export function FloorMapEditPanel(props) {
196
197
  var showDataBindingSection = bindingPolicy !== 'none';
197
198
  /** 仅在实际绑定到某一行时展示「数据源记录」,避免仅选数据源、recordId 为空时误展示空表单 */
198
199
  var showDataSourceRecordBlock = hasBoundDataRecord && Boolean(binding) && (onSaveRecord != null || hasCustomRecordForm);
200
+ var showDataRecordEditorSection = showRecordFormProp !== false && showDataSourceRecordBlock && Boolean(binding);
199
201
  var recordFormContext = useMemo(function () {
200
202
  if (!binding) return null;
201
203
  return {
@@ -217,8 +219,59 @@ export function FloorMapEditPanel(props) {
217
219
  layoutTransformLocked: !sceneElement.layoutTransformLocked
218
220
  });
219
221
  };
222
+ var panelScrollRef = useRef(null);
223
+ var dragScrollRef = useRef({
224
+ active: false,
225
+ pointerId: -1,
226
+ startY: 0,
227
+ startScrollTop: 0
228
+ });
229
+ var isDragScrollSurface = useCallback(function (target) {
230
+ if (!(target instanceof Element)) return false;
231
+ return !target.closest('input,textarea,button,select,.ant-select,.ant-input,[contenteditable="true"]');
232
+ }, []);
233
+ var handlePanelPointerDown = useCallback(function (e) {
234
+ if (!isDragScrollSurface(e.target)) return;
235
+ var el = panelScrollRef.current;
236
+ if (!el || el.scrollHeight <= el.clientHeight) return;
237
+ el.setPointerCapture(e.pointerId);
238
+ dragScrollRef.current = {
239
+ active: true,
240
+ pointerId: e.pointerId,
241
+ startY: e.clientY,
242
+ startScrollTop: el.scrollTop
243
+ };
244
+ }, [isDragScrollSurface]);
245
+ var handlePanelPointerMove = useCallback(function (e) {
246
+ var d = dragScrollRef.current;
247
+ if (!d.active || e.pointerId !== d.pointerId) return;
248
+ var el = panelScrollRef.current;
249
+ if (!el) return;
250
+ el.scrollTop = d.startScrollTop + (d.startY - e.clientY);
251
+ }, []);
252
+ var endPanelDragScroll = useCallback(function (e) {
253
+ var d = dragScrollRef.current;
254
+ if (!d.active || e.pointerId !== d.pointerId) return;
255
+ dragScrollRef.current = {
256
+ active: false,
257
+ pointerId: -1,
258
+ startY: 0,
259
+ startScrollTop: 0
260
+ };
261
+ try {
262
+ var _panelScrollRef$curre;
263
+ (_panelScrollRef$curre = panelScrollRef.current) === null || _panelScrollRef$curre === void 0 || _panelScrollRef$curre.releasePointerCapture(e.pointerId);
264
+ } catch (_unused) {
265
+ /* ignore */
266
+ }
267
+ }, []);
220
268
  return /*#__PURE__*/React.createElement("div", {
221
- className: classNames("".concat(PREFIX, "-edit-panel"), className)
269
+ ref: panelScrollRef,
270
+ className: classNames("".concat(PREFIX, "-edit-panel"), className),
271
+ onPointerDown: handlePanelPointerDown,
272
+ onPointerMove: handlePanelPointerMove,
273
+ onPointerUp: endPanelDragScroll,
274
+ onPointerCancel: endPanelDragScroll
222
275
  }, /*#__PURE__*/React.createElement("div", {
223
276
  className: "".concat(PREFIX, "-edit-panel-header")
224
277
  }, /*#__PURE__*/React.createElement("span", null, ep.elementProps), /*#__PURE__*/React.createElement(Button, {
@@ -409,7 +462,7 @@ export function FloorMapEditPanel(props) {
409
462
  }
410
463
  }), !hasBoundDataRecord && /*#__PURE__*/React.createElement("p", {
411
464
  className: "".concat(PREFIX, "-edit-panel-record-bind-hint")
412
- }, ep.hintUnbound))), showDataSourceRecordBlock && binding && /*#__PURE__*/React.createElement("div", {
465
+ }, ep.hintUnbound))), showDataRecordEditorSection && binding && /*#__PURE__*/React.createElement("div", {
413
466
  className: "".concat(PREFIX, "-edit-panel-record")
414
467
  }, /*#__PURE__*/React.createElement("div", {
415
468
  className: "".concat(PREFIX, "-edit-panel-record-title")
@@ -7,6 +7,7 @@
7
7
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
8
8
  max-height: 80vh;
9
9
  overflow-y: auto;
10
+ touch-action: pan-y;
10
11
 
11
12
  &-header {
12
13
  display: flex;
@@ -10,9 +10,9 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
10
10
  function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
11
11
  function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
12
12
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
13
- /**
14
- * ItemLayer - 楼层图展示层
15
- * 按 items 的 (x, y) 与 cellSize 定位,用 renderItem 渲染每项内容
13
+ /**
14
+ * ItemLayer - 楼层图展示层
15
+ * 按 items 的 (x, y) 与 cellSize 定位,用 renderItem 渲染每项内容
16
16
  */
17
17
  import React, { useMemo } from 'react';
18
18
  import classNames from 'classnames';
@@ -25,8 +25,8 @@ function getItemKey(item, index, rowKey) {
25
25
  return rowKey(item, index);
26
26
  }
27
27
 
28
- /**
29
- * 根据形状返回 item 容器的 style(clip-path / border-radius)
28
+ /**
29
+ * 根据形状返回 item 容器的 style(clip-path / border-radius)
30
30
  */
31
31
  function getShapeStyle() {
32
32
  var shape = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'rect';
@@ -8,7 +8,7 @@ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e
8
8
  * 将 `FloorMapLayoutContext` 与 Layout props 合并:各字段 props ?? ctx,props 显式值优先。
9
9
  */
10
10
  export function mergeFloorMapLayoutPropsFromContext(props, ctx) {
11
- var _props$floorMapConfig, _props$dataSources, _props$onSave, _props$onDataSourceRe, _props$dataSourceLabe, _props$dataSourceForm, _props$dataSourceReco, _props$loading, _props$saveError, _props$onElementRende, _props$toolbarShowSav, _props$floorMapFullsc;
11
+ var _props$floorMapConfig, _props$dataSources, _props$onSave, _props$onDataSourceRe, _props$dataSourceLabe, _props$dataSourceForm, _props$dataSourceReco, _props$loading, _props$saveError, _props$onElementRende, _props$toolbarShowSav, _props$floorMapFullsc, _props$showDataSource;
12
12
  if (ctx == null) return props;
13
13
  return _objectSpread(_objectSpread({}, props), {}, {
14
14
  floorMapConfig: (_props$floorMapConfig = props.floorMapConfig) !== null && _props$floorMapConfig !== void 0 ? _props$floorMapConfig : ctx.floorMapConfig,
@@ -22,6 +22,7 @@ export function mergeFloorMapLayoutPropsFromContext(props, ctx) {
22
22
  saveError: (_props$saveError = props.saveError) !== null && _props$saveError !== void 0 ? _props$saveError : ctx.saveError,
23
23
  onElementRenderError: (_props$onElementRende = props.onElementRenderError) !== null && _props$onElementRende !== void 0 ? _props$onElementRende : ctx.onElementRenderError,
24
24
  toolbarShowSave: (_props$toolbarShowSav = props.toolbarShowSave) !== null && _props$toolbarShowSav !== void 0 ? _props$toolbarShowSav : ctx.toolbarShowSave,
25
- floorMapFullscreenMode: (_props$floorMapFullsc = props.floorMapFullscreenMode) !== null && _props$floorMapFullsc !== void 0 ? _props$floorMapFullsc : ctx.floorMapFullscreenMode
25
+ floorMapFullscreenMode: (_props$floorMapFullsc = props.floorMapFullscreenMode) !== null && _props$floorMapFullsc !== void 0 ? _props$floorMapFullsc : ctx.floorMapFullscreenMode,
26
+ showDataSourceRecordFormBlock: (_props$showDataSource = props.showDataSourceRecordFormBlock) !== null && _props$showDataSource !== void 0 ? _props$showDataSource : ctx.showDataSourceRecordFormBlock
26
27
  });
27
28
  }
@@ -16,6 +16,7 @@ export interface UseFloorMapEditStateParams<T extends FloorMapItemBase> {
16
16
  x: number;
17
17
  y: number;
18
18
  }>;
19
+ showDataSourceRecordFormBlock?: boolean;
19
20
  }
20
21
  export declare function useFloorMapEditState<T extends FloorMapItemBase>(params: UseFloorMapEditStateParams<T>): {
21
22
  config: FloorMapViewConfig | null;
@@ -54,6 +55,7 @@ export declare function useFloorMapEditState<T extends FloorMapItemBase>(params:
54
55
  dataSourceRecordForm: Record<string, FloorMapDataSourceRecordFormContent> | undefined;
55
56
  dataSourceLabels: Record<string, string> | undefined;
56
57
  layoutDraftDirty: boolean;
58
+ showDataSourceRecordFormBlock: boolean | undefined;
57
59
  } | null;
58
60
  placeOverlayClass: string;
59
61
  isLayoutDirty: boolean;
@@ -58,7 +58,8 @@ export function useFloorMapEditState(params) {
58
58
  dataSourceRecordForm = params.dataSourceRecordForm,
59
59
  dataSourceLabels = params.dataSourceLabels,
60
60
  layoutPrefix = params.layoutPrefix,
61
- contentOffsetRef = params.contentOffsetRef;
61
+ contentOffsetRef = params.contentOffsetRef,
62
+ showDataSourceRecordFormBlock = params.showDataSourceRecordFormBlock;
62
63
  var engineCtx = useEngineContext();
63
64
  var 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';
64
65
  var _useState = useState(null),
@@ -408,7 +409,8 @@ export function useFloorMapEditState(params) {
408
409
  recordFormColumns: dataSourceFormColumns,
409
410
  dataSourceRecordForm: dataSourceRecordForm,
410
411
  dataSourceLabels: dataSourceLabels,
411
- layoutDraftDirty: isLayoutDirty
412
+ layoutDraftDirty: isLayoutDirty,
413
+ showDataSourceRecordFormBlock: showDataSourceRecordFormBlock
412
414
  } : null;
413
415
  return {
414
416
  config: config,
@@ -89,6 +89,7 @@ export function useFloorMapTransformMetrics(params) {
89
89
  return ro.disconnect();
90
90
  };
91
91
  }, []);
92
+ var autoFitOnMount = zoom.autoFitOnMount === true;
92
93
  var zoomConfig = useMemo(function () {
93
94
  var _zoom$defaultScale, _zoom$min, _zoom$max, _zoom$step;
94
95
  return {
@@ -172,6 +173,10 @@ export function useFloorMapTransformMetrics(params) {
172
173
  done: false
173
174
  };
174
175
  }
176
+ if (autoFitOnMount) {
177
+ initialAlignRef.current.done = true;
178
+ return;
179
+ }
175
180
  if (alignPadSingle == null) {
176
181
  initialAlignRef.current.done = false;
177
182
  return;
@@ -194,7 +199,7 @@ export function useFloorMapTransformMetrics(params) {
194
199
  cancelled = true;
195
200
  cancelAnimationFrame(raf);
196
201
  };
197
- }, [isFloorMapView, frameResetKey, alignPadSingle, initialPositionX, initialPositionY, zoomConfig.initialScale, transformRef]);
202
+ }, [isFloorMapView, frameResetKey, alignPadSingle, initialPositionX, initialPositionY, zoomConfig.initialScale, transformRef, autoFitOnMount]);
198
203
  useEffect(function () {
199
204
  var el = containerRef.current;
200
205
  if (!el) return;
@@ -231,6 +236,42 @@ export function useFloorMapTransformMetrics(params) {
231
236
  var y = VIEWPORT_TOP_LEFT_MARGIN - padA * nextScale;
232
237
  ctx.setTransform(x, y, nextScale);
233
238
  }, [contentWidth, contentHeight, zoom.max, transformRef, alignPadSingle]);
239
+
240
+ /** autoFitOnMount:每画布一次 fitBounds(在 TransformWrapper 就绪后) */
241
+ var autoFitOnceRef = useRef({
242
+ frame: '',
243
+ done: false
244
+ });
245
+ useEffect(function () {
246
+ if (!isFloorMapView || !autoFitOnMount || frameResetKey === undefined) return;
247
+ var frame = String(frameResetKey);
248
+ if (autoFitOnceRef.current.frame !== frame) {
249
+ autoFitOnceRef.current = {
250
+ frame: frame,
251
+ done: false
252
+ };
253
+ }
254
+ if (autoFitOnceRef.current.done) return;
255
+ if (contentWidth <= 0 || contentHeight <= 0) return;
256
+ var cancelled = false;
257
+ var raf = 0;
258
+ var tick = function tick() {
259
+ if (cancelled) return;
260
+ var ctx = transformRef.current;
261
+ var container = containerRef.current;
262
+ if (!ctx || !(container !== null && container !== void 0 && container.querySelector('.react-transform-wrapper'))) {
263
+ raf = requestAnimationFrame(tick);
264
+ return;
265
+ }
266
+ fitBounds();
267
+ autoFitOnceRef.current.done = true;
268
+ };
269
+ raf = requestAnimationFrame(tick);
270
+ return function () {
271
+ cancelled = true;
272
+ cancelAnimationFrame(raf);
273
+ };
274
+ }, [isFloorMapView, autoFitOnMount, frameResetKey, contentWidth, contentHeight, fitBounds, transformRef]);
234
275
  var lastTransformRef = useRef({
235
276
  x: 0,
236
277
  y: 0,
@@ -81,6 +81,11 @@ export interface FloorMapZoomConfig {
81
81
  max?: number;
82
82
  /** 缩放步进,默认 0.1 (10%) */
83
83
  step?: number;
84
+ /**
85
+ * 为 true 时:挂载后每个画布(frameResetKey)自动执行一次 fitBounds,使图元落在视口内。
86
+ * 为 true 时跳过「首帧 defaultScale 左上对齐」,避免与 fit 闪动叠加。
87
+ */
88
+ autoFitOnMount?: boolean;
84
89
  }
85
90
  /**
86
91
  * 平移配置
@@ -377,6 +382,11 @@ export interface FloorMapEditPanelParams {
377
382
  * 用于提示用户点击顶部「保存」持久化布局草稿。
378
383
  */
379
384
  layoutDraftDirty?: boolean;
385
+ /**
386
+ * 为 false 时不渲染「数据绑定」下方的数据源记录编辑表单(FloorMapDataForm / 自定义 record 表单);
387
+ * 数据绑定选数据源与选行仍可展示。
388
+ */
389
+ showDataSourceRecordFormBlock?: boolean;
380
390
  }
381
391
  /**
382
392
  * 合并当前画布的 sceneElements 为 items(用于 Layout 渲染)
@@ -400,7 +410,7 @@ export declare type FloorMapFullscreenMode = 'toggle' | 'locked' | 'disabled';
400
410
  * 平面图 Layout 注入上下文:数据、保存、侧栏表单与状态等(不包含 renderItem/mapLayer 等展示向 props)。
401
411
  * 由 `FloorMapLayoutProvider` / RecordBoard `floorMapLayoutContext` 提供,与 `PisellFloorMapLayout` props 按 `??` 合并,props 优先。
402
412
  */
403
- export declare type FloorMapLayoutContextValue = Partial<Pick<PisellFloorMapLayoutProps<FloorMapItemBase>, 'floorMapConfig' | 'dataSources' | 'onSave' | 'onDataSourceRecordSave' | 'dataSourceLabels' | 'dataSourceFormColumns' | 'dataSourceRecordForm' | 'loading' | 'saveError' | 'onElementRenderError' | 'toolbarShowSave' | 'floorMapFullscreenMode'>>;
413
+ export declare type FloorMapLayoutContextValue = Partial<Pick<PisellFloorMapLayoutProps<FloorMapItemBase>, 'floorMapConfig' | 'dataSources' | 'onSave' | 'onDataSourceRecordSave' | 'dataSourceLabels' | 'dataSourceFormColumns' | 'dataSourceRecordForm' | 'loading' | 'saveError' | 'onElementRenderError' | 'toolbarShowSave' | 'floorMapFullscreenMode' | 'showDataSourceRecordFormBlock'>>;
404
414
  /**
405
415
  * PisellFloorMapLayout 组件 Props
406
416
  * @template T - 资源项类型,需继承 FloorMapItemBase 或兼容 id/x/y
@@ -527,6 +537,10 @@ export interface PisellFloorMapLayoutProps<T extends FloorMapItemBase = FloorMap
527
537
  * 是否在左侧工具栏底部显示「保存」(默认 true;非全屏时顶栏为 Tab+全屏,保存多在侧栏;全屏时保存仅在顶栏)
528
538
  */
529
539
  toolbarShowSave?: boolean;
540
+ /**
541
+ * 为 false 时隐藏侧栏「数据源记录」表单区(保留数据绑定选源/选行)。
542
+ */
543
+ showDataSourceRecordFormBlock?: boolean;
530
544
  }
531
545
  /**
532
546
  * PisellFloorMapLayout Ref 方法
@@ -541,4 +555,6 @@ export interface PisellFloorMapLayoutRef {
541
555
  reset: () => void;
542
556
  /** 区域定位:使所有 items 落在视口内 */
543
557
  fitBounds: () => void;
558
+ /** 提交当前布局草稿(与顶栏/侧栏「保存」一致) */
559
+ saveLayout: () => void;
544
560
  }
@@ -5,8 +5,8 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len
5
5
  function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
6
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
7
7
  import { useCallback, useMemo, useState } from 'react';
8
- /**
9
- * 展开态管理(兼容受控/非受控)。
8
+ /**
9
+ * 展开态管理(兼容受控/非受控)。
10
10
  */
11
11
  export function useExpandedKeys(options) {
12
12
  var expandedKeys = options.expandedKeys,
@@ -1,5 +1,5 @@
1
- /**
2
- * PisellHierarchicalSummaryList 组件导出
1
+ /**
2
+ * PisellHierarchicalSummaryList 组件导出
3
3
  */
4
4
 
5
5
  export { PisellHierarchicalSummaryList, PREFIX_CLS as HIERARCHICAL_SUMMARY_LIST_PREFIX_CLS } from "./PisellHierarchicalSummaryList";
@@ -1,4 +1,4 @@
1
- var _excluded = ["children", "layoutType", "rowKey", "data", "dataSources", "gridDataSourceKey", "loading", "total", "pagination", "onPageChange", "searchParams", "onSearch", "onReset", "floorMap", "floorMapLayoutContext", "defaultBodyView", "className", "style"];
1
+ var _excluded = ["children", "layoutType", "rowKey", "data", "dataSources", "gridDataSourceKey", "loading", "total", "pagination", "onPageChange", "searchParams", "onSearch", "onReset", "floorMap", "floorMapLayoutContext", "defaultBodyView", "bodyViewStorageKey", "floorMapLayoutRef", "className", "style"];
2
2
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
3
3
  function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
4
4
  function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
@@ -25,6 +25,16 @@ var defaultPagination = {
25
25
  pageNumber: 1,
26
26
  pageSize: 50
27
27
  };
28
+ function readBodyViewFromStorage(key, fallback) {
29
+ if (typeof window === 'undefined' || !key) return fallback;
30
+ try {
31
+ var raw = localStorage.getItem(key);
32
+ if (raw === 'grid' || raw === 'floorMap') return raw;
33
+ } catch (_unused) {
34
+ /* ignore quota / private mode */
35
+ }
36
+ return fallback;
37
+ }
28
38
 
29
39
  /**
30
40
  * 从打散 props 合并出 childComponentProps(供 context 使用)。
@@ -75,6 +85,7 @@ function getDefaultRecordBoardContext(layoutType, selection, rowKey) {
75
85
  floorMapProps: undefined,
76
86
  floorMapLayoutContext: undefined,
77
87
  defaultBodyView: undefined,
88
+ floorMapLayoutRef: undefined,
78
89
  dataSources: undefined,
79
90
  gridDataSourceKey: undefined
80
91
  };
@@ -104,6 +115,8 @@ var PisellRecordBoard = function PisellRecordBoard(props) {
104
115
  floorMapProp = props.floorMap,
105
116
  floorMapLayoutContextProp = props.floorMapLayoutContext,
106
117
  defaultBodyView = props.defaultBodyView,
118
+ bodyViewStorageKey = props.bodyViewStorageKey,
119
+ floorMapLayoutRef = props.floorMapLayoutRef,
107
120
  classNameProp = props.className,
108
121
  styleProp = props.style,
109
122
  rest = _objectWithoutProperties(props, _excluded);
@@ -134,11 +147,22 @@ var PisellRecordBoard = function PisellRecordBoard(props) {
134
147
  filterResetKey = _useState8[0],
135
148
  setFilterResetKey = _useState8[1];
136
149
  var _useState9 = useState(function () {
137
- return defaultBodyView === 'floorMap' ? 'floorMap' : 'grid';
150
+ var fallback = defaultBodyView === 'floorMap' ? 'floorMap' : 'grid';
151
+ return readBodyViewFromStorage(bodyViewStorageKey, fallback);
138
152
  }),
139
153
  _useState10 = _slicedToArray(_useState9, 2),
140
154
  bodyView = _useState10[0],
141
- setBodyView = _useState10[1];
155
+ setBodyViewState = _useState10[1];
156
+ var setBodyView = useCallback(function (v) {
157
+ setBodyViewState(v);
158
+ if (typeof window !== 'undefined' && bodyViewStorageKey) {
159
+ try {
160
+ localStorage.setItem(bodyViewStorageKey, v);
161
+ } catch (_unused2) {
162
+ /* ignore */
163
+ }
164
+ }
165
+ }, [bodyViewStorageKey]);
142
166
  var _useState11 = useState(function () {
143
167
  var _props$grid$defaultHi, _props$grid, _props$grid$columns, _props$grid2;
144
168
  var fromConfig = (_props$grid$defaultHi = (_props$grid = props.grid) === null || _props$grid === void 0 ? void 0 : _props$grid.defaultHiddenColumnKeys) !== null && _props$grid$defaultHi !== void 0 ? _props$grid$defaultHi : [];
@@ -276,9 +300,10 @@ var PisellRecordBoard = function PisellRecordBoard(props) {
276
300
  setBodyView: setBodyView,
277
301
  floorMapProps: floorMapProp,
278
302
  floorMapLayoutContext: floorMapLayoutContextProp,
279
- defaultBodyView: defaultBodyView
303
+ defaultBodyView: defaultBodyView,
304
+ floorMapLayoutRef: floorMapLayoutRef
280
305
  });
281
- }, [layoutType, rowKeyProp, dataProp, dataSourcesProp, gridDataSourceKeyProp, loadingProp, totalProp, paginationProp, onPageChangeProp, searchParamsProp, onSearchProp, onResetProp, mergedChildComponentProps, internalSelectedKeys, internalSelectedRows, onSelectionChangeInternal, internalColumnVisibility, onColumnVisibilityChangeInternal, internalColumnOrder, onColumnOrderChangeInternal, fillHeight, scrollAreaHeight, filterResetKey, floorMapProp, floorMapLayoutContextProp, defaultBodyView, bodyView]);
306
+ }, [layoutType, rowKeyProp, dataProp, dataSourcesProp, gridDataSourceKeyProp, loadingProp, totalProp, paginationProp, onPageChangeProp, searchParamsProp, onSearchProp, onResetProp, mergedChildComponentProps, internalSelectedKeys, internalSelectedRows, onSelectionChangeInternal, internalColumnVisibility, onColumnVisibilityChangeInternal, internalColumnOrder, onColumnOrderChangeInternal, fillHeight, scrollAreaHeight, filterResetKey, floorMapProp, floorMapLayoutContextProp, defaultBodyView, floorMapLayoutRef, bodyView, setBodyView]);
282
307
  var content = /*#__PURE__*/React.createElement(RecordBoardProvider, {
283
308
  value: contextValue
284
309
  }, children);