@pisell/materials 1.0.1063 → 1.0.1065

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 (112) 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/index.js +1 -1
  5. package/build/lowcode/meta.js +7 -7
  6. package/build/lowcode/preview.js +9 -9
  7. package/build/lowcode/render/default/view.css +1 -1
  8. package/build/lowcode/render/default/view.js +26 -26
  9. package/build/lowcode/view.css +1 -1
  10. package/build/lowcode/view.js +26 -26
  11. package/es/components/dataSourceComponents/dataSourceForm/utils.d.ts +1 -1
  12. package/es/components/dataSourceComponents/dataSourceTable/hooks/useTableProps.d.ts +3 -3
  13. package/es/components/dataSourceComponents/fields/RecordListWrapper/index.d.ts +1 -1
  14. package/es/components/dataSourceComponents/fields/Select/index.d.ts +1 -1
  15. package/es/components/dataSourceComponents/fields/Tabs/index.d.ts +1 -1
  16. package/es/components/dataSourceComponents/fields/index.d.ts +6 -6
  17. package/es/components/pisellFloorMapLayout/PisellFloorMapLayout.js +43 -31
  18. package/es/components/pisellFloorMapLayout/components/FloorMapEditPanel.js +60 -16
  19. package/es/components/pisellFloorMapLayout/components/FloorMapEditPanel.less +8 -0
  20. package/es/components/pisellFloorMapLayout/components/FloorMapToolbar.js +22 -12
  21. package/es/components/pisellFloorMapLayout/components/FloorMapToolbar.less +7 -5
  22. package/es/components/pisellFloorMapLayout/components/MapLayer.js +5 -2
  23. package/es/components/pisellFloorMapLayout/components/ViewControls.d.ts +4 -0
  24. package/es/components/pisellFloorMapLayout/components/ViewControls.js +29 -10
  25. package/es/components/pisellFloorMapLayout/components/ViewControls.less +36 -12
  26. package/es/components/pisellFloorMapLayout/components/ViewControlsWithZoom.d.ts +2 -0
  27. package/es/components/pisellFloorMapLayout/components/ViewControlsWithZoom.js +3 -1
  28. package/es/components/pisellFloorMapLayout/context/mergeFloorMapLayoutContext.js +2 -2
  29. package/es/components/pisellFloorMapLayout/hooks/useFloorMapEditState.d.ts +1 -0
  30. package/es/components/pisellFloorMapLayout/hooks/useFloorMapEditState.js +166 -43
  31. package/es/components/pisellFloorMapLayout/hooks/useFloorMapTransformMetrics.d.ts +1 -1
  32. package/es/components/pisellFloorMapLayout/hooks/useFloorMapTransformMetrics.js +90 -13
  33. package/es/components/pisellFloorMapLayout/index.d.ts +2 -0
  34. package/es/components/pisellFloorMapLayout/index.js +2 -0
  35. package/es/components/pisellFloorMapLayout/locales.d.ts +6 -0
  36. package/es/components/pisellFloorMapLayout/locales.js +9 -3
  37. package/es/components/pisellFloorMapLayout/types.d.ts +9 -2
  38. package/es/components/pisellFloorMapLayout/utils/floorMapDropUtils.d.ts +1 -0
  39. package/es/components/pisellFloorMapLayout/utils/floorMapDropUtils.js +10 -1
  40. package/es/components/pisellFloorMapLayout/utils/floorMapElementKindUtils.d.ts +11 -0
  41. package/es/components/pisellFloorMapLayout/utils/floorMapElementKindUtils.js +86 -0
  42. package/es/components/pisellFloorMapLayout/utils/floorMapFallbackRender.js +3 -2
  43. package/es/components/pisellRecordBoard/PisellRecordBoard.js +6 -3
  44. package/es/components/pisellRecordBoard/index.d.ts +1 -0
  45. package/es/components/pisellRecordBoard/index.js +2 -1
  46. package/es/components/pisellRecordBoard/shellFrame/ToolBar/index.d.ts +1 -0
  47. package/es/components/pisellRecordBoard/shellFrame/ToolBar/index.js +21 -10
  48. package/es/components/pisellRecordBoard/shellFrame/ToolBar/recordBoardToolbar.less +23 -0
  49. package/es/components/pisellRecordBoard/shellFrame/index.d.ts +2 -0
  50. package/es/components/pisellRecordBoard/shellFrame/index.js +9 -3
  51. package/es/components/pisellRecordBoard/shellFrame/shellFrameFloorMap.less +25 -0
  52. package/es/components/pisellRecordBoard/types.d.ts +6 -0
  53. package/es/components/pisellReservationScheduleBand/PisellReservationScheduleBand.js +4 -1
  54. package/es/components/pisellReservationScheduleBand/PisellReservationScheduleBand.less +18 -1
  55. package/es/components/pisellReservationScheduleBand/types.d.ts +4 -0
  56. package/es/components/pisellTimeNavigator/PisellTimeNavigator.js +180 -22
  57. package/es/components/pisellTimeNavigator/PisellTimeNavigator.less +11 -0
  58. package/es/components/pisellTimeNavigator/components/CursorLayer.js +4 -4
  59. package/es/components/pisellTimeNavigator/components/ScaleLayer.js +3 -3
  60. package/es/components/pisellTimeNavigator/types.d.ts +11 -0
  61. package/es/hooks/useResponsive.d.ts +1 -1
  62. package/es/index.d.ts +2 -2
  63. package/es/index.js +2 -2
  64. package/lib/components/pisellFloorMapLayout/PisellFloorMapLayout.js +39 -36
  65. package/lib/components/pisellFloorMapLayout/components/FloorMapEditPanel.js +56 -12
  66. package/lib/components/pisellFloorMapLayout/components/FloorMapEditPanel.less +8 -0
  67. package/lib/components/pisellFloorMapLayout/components/FloorMapToolbar.js +19 -10
  68. package/lib/components/pisellFloorMapLayout/components/FloorMapToolbar.less +7 -5
  69. package/lib/components/pisellFloorMapLayout/components/MapLayer.js +3 -1
  70. package/lib/components/pisellFloorMapLayout/components/ViewControls.d.ts +4 -0
  71. package/lib/components/pisellFloorMapLayout/components/ViewControls.js +28 -6
  72. package/lib/components/pisellFloorMapLayout/components/ViewControls.less +36 -12
  73. package/lib/components/pisellFloorMapLayout/components/ViewControlsWithZoom.d.ts +2 -0
  74. package/lib/components/pisellFloorMapLayout/components/ViewControlsWithZoom.js +3 -1
  75. package/lib/components/pisellFloorMapLayout/hooks/useFloorMapEditState.d.ts +1 -0
  76. package/lib/components/pisellFloorMapLayout/hooks/useFloorMapEditState.js +143 -29
  77. package/lib/components/pisellFloorMapLayout/hooks/useFloorMapTransformMetrics.d.ts +1 -1
  78. package/lib/components/pisellFloorMapLayout/hooks/useFloorMapTransformMetrics.js +86 -13
  79. package/lib/components/pisellFloorMapLayout/index.d.ts +2 -0
  80. package/lib/components/pisellFloorMapLayout/index.js +6 -0
  81. package/lib/components/pisellFloorMapLayout/locales.d.ts +6 -0
  82. package/lib/components/pisellFloorMapLayout/locales.js +9 -3
  83. package/lib/components/pisellFloorMapLayout/types.d.ts +9 -2
  84. package/lib/components/pisellFloorMapLayout/utils/floorMapDropUtils.d.ts +1 -0
  85. package/lib/components/pisellFloorMapLayout/utils/floorMapDropUtils.js +7 -1
  86. package/lib/components/pisellFloorMapLayout/utils/floorMapElementKindUtils.d.ts +11 -0
  87. package/lib/components/pisellFloorMapLayout/utils/floorMapElementKindUtils.js +69 -0
  88. package/lib/components/pisellFloorMapLayout/utils/floorMapFallbackRender.js +2 -1
  89. package/lib/components/pisellRecordBoard/PisellRecordBoard.js +5 -1
  90. package/lib/components/pisellRecordBoard/index.d.ts +1 -0
  91. package/lib/components/pisellRecordBoard/index.js +5 -2
  92. package/lib/components/pisellRecordBoard/shellFrame/ToolBar/index.d.ts +1 -0
  93. package/lib/components/pisellRecordBoard/shellFrame/ToolBar/index.js +13 -5
  94. package/lib/components/pisellRecordBoard/shellFrame/ToolBar/recordBoardToolbar.less +23 -0
  95. package/lib/components/pisellRecordBoard/shellFrame/index.d.ts +2 -0
  96. package/lib/components/pisellRecordBoard/shellFrame/index.js +11 -4
  97. package/lib/components/pisellRecordBoard/shellFrame/shellFrameFloorMap.less +25 -0
  98. package/lib/components/pisellRecordBoard/types.d.ts +6 -0
  99. package/lib/components/pisellReservationScheduleBand/PisellReservationScheduleBand.js +2 -1
  100. package/lib/components/pisellReservationScheduleBand/PisellReservationScheduleBand.less +18 -1
  101. package/lib/components/pisellReservationScheduleBand/types.d.ts +4 -0
  102. package/lib/components/pisellTimeNavigator/PisellTimeNavigator.js +177 -12
  103. package/lib/components/pisellTimeNavigator/PisellTimeNavigator.less +11 -0
  104. package/lib/components/pisellTimeNavigator/types.d.ts +11 -0
  105. package/lib/index.d.ts +2 -2
  106. package/lib/index.js +10 -0
  107. package/lowcode/floor-map-image-element/meta.ts +113 -0
  108. package/lowcode/floor-map-layout-provider/meta.ts +1 -1
  109. package/lowcode/pisell-floor-map-layout/meta.ts +37 -1
  110. package/lowcode/render-figma-style-round-table-card/meta.ts +1 -1
  111. package/lowcode/render-figma-style-table-card/meta.ts +1 -1
  112. package/package.json +3 -3
@@ -1,9 +1,13 @@
1
- /**
2
- * ViewControls - 内置视图控制按钮:缩放(Stepper)、复位、区域定位
1
+ 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); }
2
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
3
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
4
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
5
+ /**
6
+ * ViewControls - 内置视图控制按钮:缩放(Stepper)、复位、区域定位
3
7
  */
4
8
  import React from 'react';
5
9
  import classNames from 'classnames';
6
- import { MinusOutlined, PlusOutlined, FullscreenOutlined, FullscreenExitOutlined } from '@ant-design/icons';
10
+ import { MinusOutlined, PlusOutlined, FullscreenOutlined, FullscreenExitOutlined, BorderInnerOutlined } from '@ant-design/icons';
7
11
  import "./ViewControls.less";
8
12
  var PREFIX = 'pisell-floor-map-layout';
9
13
 
@@ -17,12 +21,17 @@ export function ViewControls(props) {
17
21
  scale = _props$scale === void 0 ? 1 : _props$scale,
18
22
  _props$isFullscreen = props.isFullscreen,
19
23
  isFullscreen = _props$isFullscreen === void 0 ? false : _props$isFullscreen,
20
- className = props.className;
24
+ className = props.className,
25
+ _props$mapGridVisible = props.mapGridVisible,
26
+ mapGridVisible = _props$mapGridVisible === void 0 ? false : _props$mapGridVisible,
27
+ onToggleMapGrid = props.onToggleMapGrid;
21
28
  var showZoom = config.showZoom !== false;
22
29
  var showReset = config.showReset === true;
23
30
  var showFitBounds = config.showFitBounds === true;
24
31
  var showFullscreen = config.showFullscreen === true;
32
+ var showGridToggle = config.showGridToggle === true && typeof onToggleMapGrid === 'function';
25
33
  var scalePercent = Math.round(scale * 100);
34
+ var showToolsCapsule = showReset || showFitBounds || showFullscreen || showGridToggle;
26
35
  return /*#__PURE__*/React.createElement("div", {
27
36
  className: classNames("".concat(PREFIX, "-view-controls"), className)
28
37
  }, showZoom && /*#__PURE__*/React.createElement("div", {
@@ -43,27 +52,37 @@ export function ViewControls(props) {
43
52
  return api.zoomIn();
44
53
  },
45
54
  "aria-label": "\u653E\u5927"
46
- }, /*#__PURE__*/React.createElement(PlusOutlined, null))), showReset && /*#__PURE__*/React.createElement("button", {
55
+ }, /*#__PURE__*/React.createElement(PlusOutlined, null))), showToolsCapsule && /*#__PURE__*/React.createElement("div", {
56
+ className: "".concat(PREFIX, "-view-controls-tools-capsule")
57
+ }, showReset && /*#__PURE__*/React.createElement("button", {
47
58
  type: "button",
48
- className: "".concat(PREFIX, "-view-controls-btn"),
59
+ className: "".concat(PREFIX, "-view-controls-tool-btn"),
49
60
  onClick: function onClick() {
50
61
  return api.resetTransform();
51
62
  },
52
63
  "aria-label": "\u590D\u4F4D"
53
64
  }, "\u27F2"), showFitBounds && api.fitBounds && /*#__PURE__*/React.createElement("button", {
54
65
  type: "button",
55
- className: "".concat(PREFIX, "-view-controls-btn"),
66
+ className: "".concat(PREFIX, "-view-controls-tool-btn"),
56
67
  onClick: function onClick() {
57
68
  return api.fitBounds();
58
69
  },
59
70
  "aria-label": "\u533A\u57DF\u5B9A\u4F4D"
60
- }, "\u229E"), showFullscreen && api.toggleFullscreen && /*#__PURE__*/React.createElement("button", {
71
+ }, "\u229E"), showGridToggle && /*#__PURE__*/React.createElement("button", {
61
72
  type: "button",
62
- className: "".concat(PREFIX, "-view-controls-btn"),
73
+ className: classNames("".concat(PREFIX, "-view-controls-tool-btn"), _defineProperty({}, "".concat(PREFIX, "-view-controls-tool-btn--active"), mapGridVisible)),
74
+ onClick: function onClick() {
75
+ return onToggleMapGrid();
76
+ },
77
+ "aria-pressed": mapGridVisible,
78
+ "aria-label": mapGridVisible ? '隐藏网格' : '显示网格'
79
+ }, /*#__PURE__*/React.createElement(BorderInnerOutlined, null)), showFullscreen && api.toggleFullscreen && /*#__PURE__*/React.createElement("button", {
80
+ type: "button",
81
+ className: "".concat(PREFIX, "-view-controls-tool-btn"),
63
82
  onClick: function onClick() {
64
83
  return api.toggleFullscreen();
65
84
  },
66
85
  "aria-label": isFullscreen ? '退出全屏' : '全屏'
67
- }, isFullscreen ? /*#__PURE__*/React.createElement(FullscreenExitOutlined, null) : /*#__PURE__*/React.createElement(FullscreenOutlined, null)));
86
+ }, isFullscreen ? /*#__PURE__*/React.createElement(FullscreenExitOutlined, null) : /*#__PURE__*/React.createElement(FullscreenOutlined, null))));
68
87
  }
69
88
  export default ViewControls;
@@ -10,6 +10,7 @@
10
10
  gap: 6px;
11
11
 
12
12
  /* Stepper:胶囊形 [减] 数值% [加] */
13
+
13
14
  &-zoom-stepper {
14
15
  display: flex;
15
16
  align-items: center;
@@ -52,26 +53,49 @@
52
53
  color: #101828;
53
54
  }
54
55
 
55
- &-btn {
56
- width: 32px;
57
- height: 32px;
56
+ /* 复位 / 区域定位 / 全屏 / 网格:与 Stepper 同系胶囊条 */
57
+
58
+ &-tools-capsule {
59
+ display: flex;
60
+ align-items: center;
61
+ flex-wrap: wrap;
62
+ gap: 4px;
63
+ min-height: 56px;
64
+ padding: 2px 6px;
65
+ background: #fff;
66
+ border: 1px solid #98a2b3;
67
+ border-radius: 100px;
68
+ box-shadow: 0 12px 16px -4px rgba(16, 24, 40, 0.08), 0 4px 6px -2px rgba(16, 24, 40, 0.03);
69
+ }
70
+
71
+ &-tool-btn {
72
+ width: 52px;
73
+ height: 52px;
58
74
  display: flex;
59
75
  align-items: center;
60
76
  justify-content: center;
61
77
  padding: 0;
62
- border: 1px solid rgba(0, 0, 0, 0.1);
63
- border-radius: 4px;
64
- background: #fff;
78
+ border: none;
79
+ border-radius: 50%;
80
+ background: transparent;
65
81
  cursor: pointer;
66
- font-size: 18px;
82
+ color: #101828;
83
+ font-size: 20px;
67
84
  line-height: 1;
68
- color: rgba(0, 0, 0, 0.65);
69
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
70
85
 
71
86
  &:hover {
72
- color: #1890ff;
73
- border-color: #1890ff;
74
- background: #e6f7ff;
87
+ background: #f2f4f7;
88
+ color: #101828;
89
+ }
90
+ }
91
+
92
+ &-tool-btn--active {
93
+ background: #fff4ed;
94
+ color: #ff692e;
95
+
96
+ &:hover {
97
+ background: #ffe8d9;
98
+ color: #ff692e;
75
99
  }
76
100
  }
77
101
  }
@@ -7,5 +7,7 @@ export interface ViewControlsWithZoomProps {
7
7
  fitBounds: () => void;
8
8
  /** 未传时不展示全屏按钮(如编辑态 floorMapFullscreenMode 为 disabled) */
9
9
  toggleFullscreen?: () => void;
10
+ mapGridVisible?: boolean;
11
+ onToggleMapGrid?: () => void;
10
12
  }
11
13
  export declare function ViewControlsWithZoom(props: ViewControlsWithZoomProps): JSX.Element;
@@ -22,6 +22,8 @@ export function ViewControlsWithZoom(props) {
22
22
  api: api,
23
23
  config: props.config,
24
24
  scale: props.scale,
25
- isFullscreen: props.isFullscreen
25
+ isFullscreen: props.isFullscreen,
26
+ mapGridVisible: props.mapGridVisible,
27
+ onToggleMapGrid: props.onToggleMapGrid
26
28
  });
27
29
  }
@@ -4,8 +4,8 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
4
4
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
5
5
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
6
6
  function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
7
- /**
8
- * 将 `FloorMapLayoutContext` 与 Layout props 合并:各字段 props ?? ctx,props 显式值优先。
7
+ /**
8
+ * 将 `FloorMapLayoutContext` 与 Layout props 合并:各字段 props ?? ctx,props 显式值优先。
9
9
  */
10
10
  export function mergeFloorMapLayoutPropsFromContext(props, ctx) {
11
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;
@@ -59,4 +59,5 @@ export declare function useFloorMapEditState<T extends FloorMapItemBase>(params:
59
59
  } | null;
60
60
  placeOverlayClass: string;
61
61
  isLayoutDirty: boolean;
62
+ toggleDraftCanvasShowGrid: () => void;
62
63
  };
@@ -2,15 +2,15 @@ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" ==
2
2
  var _excluded = ["x", "y", "zIndex", "width", "height"];
3
3
  function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
4
4
  function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
5
+ function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
6
+ 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."); }
7
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
8
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
5
9
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
6
10
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
7
11
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
8
12
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
9
13
  function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
10
- function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
11
- 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."); }
12
- function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
13
- function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
14
14
  function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
15
15
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
16
16
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
@@ -28,14 +28,39 @@ import { createTranslationText } from "../../translation/utils";
28
28
  import { mergeCanvasItems } from "../utils/floorMapConfigMerge";
29
29
  import { STAGE_DECO_DEFAULT } from "../utils/floorMapStageDefaults";
30
30
  import { floorMapViewConfigsEqual, normalizeFloorMapViewConfigFromProp } from "../utils/floorMapViewConfigDiff";
31
- import { getElementKindConfig, resolveDataBindingPolicy } from "../utils/floorMapElementKindUtils";
31
+ import { getElementKindConfig, resolveDataBindingPolicy, isFloorMapImageElementKind } from "../utils/floorMapElementKindUtils";
32
32
  import { DEFAULT_CELL_SIZE } from "../utils/layoutMeasurements";
33
33
  import { initFloorMapLayoutLocales } from "../utils/floorMapCanvasDisplay";
34
- import { FLOOR_MAP_IMAGE_ELEMENT_KIND, FLOOR_MAP_STAGE_ELEMENT_KIND } from "../types";
34
+ import { FLOOR_MAP_STAGE_ELEMENT_KIND } from "../types";
35
35
  var IMAGE_PLACE_DEFAULT = {
36
36
  width: 400,
37
37
  height: 240
38
38
  };
39
+ var GRID_VIS_STORAGE_PREFIX = 'pisell-floor-map-layout.grid-visible';
40
+ function getGridVisStorageKey(canvasId) {
41
+ return "".concat(GRID_VIS_STORAGE_PREFIX, ":").concat(canvasId);
42
+ }
43
+ function readStoredGridVisible(canvasId) {
44
+ try {
45
+ var raw = localStorage.getItem(getGridVisStorageKey(canvasId));
46
+ if (raw == null) return null;
47
+ if (raw === '1') return true;
48
+ if (raw === '0') return false;
49
+ return null;
50
+ } catch (_unused) {
51
+ return null;
52
+ }
53
+ }
54
+ function writeStoredGridVisible(canvasId, visible) {
55
+ try {
56
+ localStorage.setItem(getGridVisStorageKey(canvasId), visible ? '1' : '0');
57
+ } catch (_unused2) {
58
+ // ignore localStorage failure (private mode / quota / sandbox)
59
+ }
60
+ }
61
+
62
+ /** 批量落位时每条相对上一条的偏移(内容坐标) */
63
+ var BATCH_PLACE_OFFSET = 16;
39
64
  function newInstanceId() {
40
65
  return "elm_".concat(Date.now(), "_").concat(Math.random().toString(36).slice(2, 9));
41
66
  }
@@ -86,13 +111,36 @@ export function useFloorMapEditState(params) {
86
111
  _useState12 = _slicedToArray(_useState11, 2),
87
112
  savingRecord = _useState12[0],
88
113
  setSavingRecord = _useState12[1];
114
+ /**
115
+ * 本地“已提交保存”的基线快照:
116
+ * - 点击「完成编辑/保存」后立即置为当前 draft,避免等待上游 props 回写期间仍显示“未持久化”提示;
117
+ * - 用户后续再改动 draft 时,dirty 会再次为 true。
118
+ */
119
+ var _useState13 = useState(null),
120
+ _useState14 = _slicedToArray(_useState13, 2),
121
+ savedBaselineConfig = _useState14[0],
122
+ setSavedBaselineConfig = _useState14[1];
89
123
  var config = isFloorMapView ? draftConfig !== null && draftConfig !== void 0 ? draftConfig : floorMapConfigProp : null;
90
124
  var configRef = useRef(config);
91
125
  configRef.current = config;
92
126
  useEffect(function () {
93
127
  if (!floorMapConfigProp) return;
94
- var nextConfig = normalizeFloorMapViewConfigFromProp(floorMapConfigProp);
128
+ var baseConfig = normalizeFloorMapViewConfigFromProp(floorMapConfigProp);
129
+ var nextConfig = _objectSpread(_objectSpread({}, baseConfig), {}, {
130
+ canvases: baseConfig.canvases.map(function (canvas) {
131
+ var _canvas$mapLayer;
132
+ var stored = readStoredGridVisible(canvas.id);
133
+ if (stored == null) return canvas;
134
+ return _objectSpread(_objectSpread({}, canvas), {}, {
135
+ mapLayer: _objectSpread(_objectSpread({}, (_canvas$mapLayer = canvas.mapLayer) !== null && _canvas$mapLayer !== void 0 ? _canvas$mapLayer : {}), {}, {
136
+ showGrid: stored
137
+ })
138
+ });
139
+ })
140
+ });
95
141
  setDraftConfig(nextConfig);
142
+ /** 上游配置已刷新,以服务端/父级为准,清空本地临时保存基线 */
143
+ setSavedBaselineConfig(null);
96
144
  var enabled = nextConfig.canvases.filter(function (c) {
97
145
  return c.enabled;
98
146
  }).sort(function (a, b) {
@@ -109,9 +157,9 @@ export function useFloorMapEditState(params) {
109
157
  /** 当前草稿与上游持久化 `floorMapConfig`(经同等规范化)是否不一致 */
110
158
  var isLayoutDirty = useMemo(function () {
111
159
  if (!isFloorMapView || !draftConfig || !floorMapConfigProp) return false;
112
- var baseline = normalizeFloorMapViewConfigFromProp(floorMapConfigProp);
160
+ var baseline = savedBaselineConfig !== null && savedBaselineConfig !== void 0 ? savedBaselineConfig : normalizeFloorMapViewConfigFromProp(floorMapConfigProp);
113
161
  return !floorMapViewConfigsEqual(draftConfig, baseline);
114
- }, [isFloorMapView, draftConfig, floorMapConfigProp]);
162
+ }, [isFloorMapView, draftConfig, floorMapConfigProp, savedBaselineConfig]);
115
163
  var handleAddCanvas = useCallback(function () {
116
164
  initFloorMapLayoutLocales(engineLocale);
117
165
  var label = locales.getText('pisell-floor-map-layout.canvas-tabs.default-new-canvas-name');
@@ -242,7 +290,7 @@ export function useFloorMapEditState(params) {
242
290
  var placeOverlayClass = "".concat(layoutPrefix, "-place-overlay");
243
291
 
244
292
  /**
245
- * 在内容坐标系下按「新建图元」模式落一条 sceneElement(点击落点与侧栏拖拽共用)
293
+ * 在内容坐标系下按「新建图元」模式落 sceneElement(支持 recordIds 批量;点击与拖拽共用)
246
294
  * @returns 是否已成功写入草稿(校验失败时为 false)
247
295
  */
248
296
  var applyScenePlacementAtCoords = useCallback(function (contentX, contentY, scene) {
@@ -258,6 +306,29 @@ export function useFloorMapEditState(params) {
258
306
  return allKeys.includes(k);
259
307
  }) : allKeys;
260
308
  var pickKey = (_ref = (_scene$dataSourceKey = scene.dataSourceKey) !== null && _scene$dataSourceKey !== void 0 ? _scene$dataSourceKey : allowedKeys[0]) !== null && _ref !== void 0 ? _ref : allKeys[0];
309
+ var recordIdsToPlace = scene.recordIds && scene.recordIds.length > 0 ? scene.recordIds : scene.recordId ? [scene.recordId] : [];
310
+ var isStage = scene.elementKind === FLOOR_MAP_STAGE_ELEMENT_KIND;
311
+ var isImage = isFloorMapImageElementKind(scene.elementKind);
312
+ var w = isImage ? IMAGE_PLACE_DEFAULT.width : isStage ? STAGE_DECO_DEFAULT.width : defaultPlacementWidth;
313
+ var h = isImage ? IMAGE_PLACE_DEFAULT.height : isStage ? STAGE_DECO_DEFAULT.height : defaultPlacementHeight;
314
+ var useDecoSize = policy === 'none' && scene.elementKind !== FLOOR_MAP_STAGE_ELEMENT_KIND && !isImage;
315
+ var buildOneElement = function buildOneElement(dataBinding, x, y, name) {
316
+ return _objectSpread({
317
+ instanceId: newInstanceId(),
318
+ canvasId: currentCanvasId,
319
+ x: x,
320
+ y: y,
321
+ name: name,
322
+ zIndex: isImage ? -5 : 0,
323
+ width: useDecoSize ? defaultDecoSize : w,
324
+ height: useDecoSize ? defaultDecoSize : h,
325
+ elementKind: scene.elementKind,
326
+ shape: isStage || isImage ? 'rect' : kindConfig === null || kindConfig === void 0 ? void 0 : kindConfig.defaultShape,
327
+ dataBinding: dataBinding
328
+ }, isImage ? {
329
+ imageUrl: ''
330
+ } : {});
331
+ };
261
332
  var dataBinding;
262
333
  if (policy !== 'none' && pickKey) {
263
334
  var _dataSources$pickKey;
@@ -267,14 +338,15 @@ export function useFloorMapEditState(params) {
267
338
  dataSourceKey: pickKey,
268
339
  recordId: "new_".concat(Date.now())
269
340
  };
270
- } else if (!scene.recordId) {
341
+ } else if (recordIdsToPlace.length === 0) {
271
342
  if (policy === 'required') {
272
343
  message.warning('请先在侧栏选择数据源与数据行,再落位');
273
344
  return false;
274
345
  }
275
- } else {
346
+ } else if (recordIdsToPlace.length === 1) {
347
+ var rid = recordIdsToPlace[0];
276
348
  var record = dsList.find(function (r) {
277
- return r.id === scene.recordId;
349
+ return r.id === rid;
278
350
  });
279
351
  if (!record) {
280
352
  message.error('所选记录不存在,请重新选择数据行');
@@ -282,52 +354,80 @@ export function useFloorMapEditState(params) {
282
354
  }
283
355
  var cand = {
284
356
  dataSourceKey: pickKey,
285
- recordId: scene.recordId
357
+ recordId: rid
286
358
  };
287
359
  if (duplicateBinding(config.sceneElements, cand)) {
288
360
  message.warning('该数据记录已在平面图中绑定,请勿重复添加');
289
361
  return false;
290
362
  }
291
363
  dataBinding = cand;
364
+ } else {
365
+ var newEls = [];
366
+ var skippedDup = 0;
367
+ var skippedMissing = 0;
368
+ var placeIndex = 0;
369
+ var seenInBatch = new Set();
370
+ recordIdsToPlace.forEach(function (rid) {
371
+ var _row$name;
372
+ var record = dsList.find(function (r) {
373
+ return r.id === rid;
374
+ });
375
+ if (!record) {
376
+ skippedMissing += 1;
377
+ return;
378
+ }
379
+ var cand = {
380
+ dataSourceKey: pickKey,
381
+ recordId: rid
382
+ };
383
+ if (seenInBatch.has(rid) || duplicateBinding(config.sceneElements, cand)) {
384
+ skippedDup += 1;
385
+ return;
386
+ }
387
+ seenInBatch.add(rid);
388
+ var row = record;
389
+ var placementName = String((_row$name = row === null || row === void 0 ? void 0 : row.name) !== null && _row$name !== void 0 ? _row$name : rid);
390
+ newEls.push(buildOneElement(cand, contentX + placeIndex * BATCH_PLACE_OFFSET, contentY + placeIndex * BATCH_PLACE_OFFSET, placementName));
391
+ placeIndex += 1;
392
+ });
393
+ if (skippedDup > 0) {
394
+ message.warning("\u5DF2\u8DF3\u8FC7 ".concat(skippedDup, " \u6761\u5DF2\u5728\u5E73\u9762\u56FE\u4E2D\u7ED1\u5B9A\u7684\u8BB0\u5F55"));
395
+ }
396
+ if (skippedMissing > 0) {
397
+ message.warning("\u6709 ".concat(skippedMissing, " \u6761\u8BB0\u5F55\u4E0D\u5B58\u5728\uFF0C\u5DF2\u8DF3\u8FC7"));
398
+ }
399
+ if (newEls.length === 0) {
400
+ message.warning('没有可落位的记录');
401
+ return false;
402
+ }
403
+ setDraftConfig(function (prev) {
404
+ var _prev$sceneElements4;
405
+ return prev ? _objectSpread(_objectSpread({}, prev), {}, {
406
+ sceneElements: [].concat(_toConsumableArray((_prev$sceneElements4 = prev.sceneElements) !== null && _prev$sceneElements4 !== void 0 ? _prev$sceneElements4 : []), newEls)
407
+ }) : prev;
408
+ });
409
+ return true;
292
410
  }
293
411
  }
294
- var isStage = scene.elementKind === FLOOR_MAP_STAGE_ELEMENT_KIND;
295
- var isImage = scene.elementKind === FLOOR_MAP_IMAGE_ELEMENT_KIND;
296
- var w = isImage ? IMAGE_PLACE_DEFAULT.width : isStage ? STAGE_DECO_DEFAULT.width : defaultPlacementWidth;
297
- var h = isImage ? IMAGE_PLACE_DEFAULT.height : isStage ? STAGE_DECO_DEFAULT.height : defaultPlacementHeight;
298
- var useDecoSize = policy === 'none' && scene.elementKind !== FLOOR_MAP_STAGE_ELEMENT_KIND && !isImage;
299
412
  var placementName = function (_kindConfig$defaultPr, _kindConfig$defaultPr2) {
300
413
  if (isStage) return STAGE_DECO_DEFAULT.name;
301
414
  if (isImage) return '底图';
302
415
  var db = dataBinding;
303
- if (db && scene.recordId) {
304
- var _dataSources$db$dataS, _row$name;
416
+ var rid = recordIdsToPlace[0];
417
+ if (db && rid) {
418
+ var _dataSources$db$dataS, _row$name2;
305
419
  var row = dataSources === null || dataSources === void 0 || (_dataSources$db$dataS = dataSources[db.dataSourceKey]) === null || _dataSources$db$dataS === void 0 ? void 0 : _dataSources$db$dataS.find(function (r) {
306
- return r.id === db.recordId;
420
+ return r.id === rid;
307
421
  });
308
- return String((_row$name = row === null || row === void 0 ? void 0 : row.name) !== null && _row$name !== void 0 ? _row$name : db.recordId);
422
+ return String((_row$name2 = row === null || row === void 0 ? void 0 : row.name) !== null && _row$name2 !== void 0 ? _row$name2 : rid);
309
423
  }
310
424
  return (_kindConfig$defaultPr = kindConfig === null || kindConfig === void 0 || (_kindConfig$defaultPr2 = kindConfig.defaultPresentation) === null || _kindConfig$defaultPr2 === void 0 ? void 0 : _kindConfig$defaultPr2.title) !== null && _kindConfig$defaultPr !== void 0 ? _kindConfig$defaultPr : '';
311
425
  }();
312
- var newEl = _objectSpread({
313
- instanceId: newInstanceId(),
314
- canvasId: currentCanvasId,
315
- x: contentX,
316
- y: contentY,
317
- name: placementName,
318
- zIndex: isImage ? -5 : 0,
319
- width: useDecoSize ? defaultDecoSize : w,
320
- height: useDecoSize ? defaultDecoSize : h,
321
- elementKind: scene.elementKind,
322
- shape: isStage || isImage ? 'rect' : kindConfig === null || kindConfig === void 0 ? void 0 : kindConfig.defaultShape,
323
- dataBinding: dataBinding
324
- }, isImage ? {
325
- imageUrl: ''
326
- } : {});
426
+ var newEl = buildOneElement(dataBinding, contentX, contentY, placementName);
327
427
  setDraftConfig(function (prev) {
328
- var _prev$sceneElements4;
428
+ var _prev$sceneElements5;
329
429
  return prev ? _objectSpread(_objectSpread({}, prev), {}, {
330
- sceneElements: [].concat(_toConsumableArray((_prev$sceneElements4 = prev.sceneElements) !== null && _prev$sceneElements4 !== void 0 ? _prev$sceneElements4 : []), [newEl])
430
+ sceneElements: [].concat(_toConsumableArray((_prev$sceneElements5 = prev.sceneElements) !== null && _prev$sceneElements5 !== void 0 ? _prev$sceneElements5 : []), [newEl])
331
431
  }) : prev;
332
432
  });
333
433
  return true;
@@ -357,10 +457,32 @@ export function useFloorMapEditState(params) {
357
457
  setSaving(true);
358
458
  try {
359
459
  onSave(draftConfig);
460
+ /** 先本地确认“已提交保存”,让提示即时消失;后续以 props 回写为准 */
461
+ setSavedBaselineConfig(draftConfig);
360
462
  } finally {
361
463
  setSaving(false);
362
464
  }
363
465
  }, [draftConfig, onSave]);
466
+
467
+ /** 切换当前画布草稿中的 mapLayer.showGrid(随布局保存持久化) */
468
+ var toggleDraftCanvasShowGrid = useCallback(function () {
469
+ setDraftConfig(function (prev) {
470
+ if (!prev || !currentCanvasId) return prev;
471
+ return _objectSpread(_objectSpread({}, prev), {}, {
472
+ canvases: prev.canvases.map(function (c) {
473
+ var _c$mapLayer;
474
+ if (c.id !== currentCanvasId) return c;
475
+ var nextShow = !Boolean((_c$mapLayer = c.mapLayer) === null || _c$mapLayer === void 0 ? void 0 : _c$mapLayer.showGrid);
476
+ writeStoredGridVisible(currentCanvasId, nextShow);
477
+ return _objectSpread(_objectSpread({}, c), {}, {
478
+ mapLayer: _objectSpread(_objectSpread({}, c.mapLayer), {}, {
479
+ showGrid: nextShow
480
+ })
481
+ });
482
+ })
483
+ });
484
+ });
485
+ }, [currentCanvasId]);
364
486
  var handleEditPanelUpdate = useCallback(function (patch) {
365
487
  if (!selectedId) return;
366
488
  var bindingPatch = patch.dataBinding;
@@ -384,10 +506,10 @@ export function useFloorMapEditState(params) {
384
506
  var handleEditPanelDelete = useCallback(function () {
385
507
  if (!selectedId) return;
386
508
  setDraftConfig(function (prev) {
387
- var _prev$sceneElements5;
509
+ var _prev$sceneElements6;
388
510
  if (!prev) return prev;
389
511
  return _objectSpread(_objectSpread({}, prev), {}, {
390
- sceneElements: ((_prev$sceneElements5 = prev.sceneElements) !== null && _prev$sceneElements5 !== void 0 ? _prev$sceneElements5 : []).filter(function (e) {
512
+ sceneElements: ((_prev$sceneElements6 = prev.sceneElements) !== null && _prev$sceneElements6 !== void 0 ? _prev$sceneElements6 : []).filter(function (e) {
391
513
  return e.instanceId !== selectedId;
392
514
  })
393
515
  });
@@ -433,6 +555,7 @@ export function useFloorMapEditState(params) {
433
555
  placeSceneElementFromPaletteDrop: placeSceneElementFromPaletteDrop,
434
556
  editPanelParams: editPanelParams,
435
557
  placeOverlayClass: placeOverlayClass,
436
- isLayoutDirty: isLayoutDirty
558
+ isLayoutDirty: isLayoutDirty,
559
+ toggleDraftCanvasShowGrid: toggleDraftCanvasShowGrid
437
560
  };
438
561
  }
@@ -56,7 +56,7 @@ export declare function useFloorMapTransformMetrics<T extends FloorMapItemBase>(
56
56
  setScale: import("react").Dispatch<import("react").SetStateAction<number>>;
57
57
  isFullscreen: boolean;
58
58
  toggleFullscreen: () => void;
59
- fitBounds: () => void;
59
+ fitBounds: () => boolean;
60
60
  lastTransformRef: MutableRefObject<{
61
61
  x: number;
62
62
  y: number;