@pisell/materials 6.12.9 → 6.12.11

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 (28) hide show
  1. package/build/lowcode/assets-daily.json +11 -11
  2. package/build/lowcode/assets-dev.json +2 -2
  3. package/build/lowcode/assets-prod.json +11 -11
  4. package/build/lowcode/meta.js +1 -1
  5. package/build/lowcode/render/default/view.js +1 -1
  6. package/build/lowcode/view.js +1 -1
  7. package/es/components/PisellTabbar/PisellTabbar.js +34 -5
  8. package/es/components/PisellTabbar/index.d.ts +1 -1
  9. package/es/components/PisellTabbar/template/Template1/PisellTabbar.js +33 -5
  10. package/es/components/PisellTabbar/types.d.ts +20 -1
  11. package/es/components/dataSourceComponents/fields/Upload/utils.d.ts +1 -1
  12. package/es/components/dataSourceComponents/fields/index.d.ts +6 -6
  13. package/es/components/pisellRecordBoard/shellFrame/Calendar/bookingCalendarViewShared.d.ts +1 -1
  14. package/es/components/table/Table/fields/index.d.ts +2 -2
  15. package/es/components/table/Table/utils.d.ts +1 -1
  16. package/es/index.d.ts +1 -1
  17. package/lib/components/PisellTabbar/PisellTabbar.js +31 -5
  18. package/lib/components/PisellTabbar/index.d.ts +1 -1
  19. package/lib/components/PisellTabbar/template/Template1/PisellTabbar.js +40 -5
  20. package/lib/components/PisellTabbar/types.d.ts +20 -1
  21. package/lib/components/dataSourceComponents/fields/Upload/utils.d.ts +1 -1
  22. package/lib/components/dataSourceComponents/fields/index.d.ts +6 -6
  23. package/lib/components/pisellRecordBoard/shellFrame/Calendar/bookingCalendarViewShared.d.ts +1 -1
  24. package/lib/components/table/Table/fields/index.d.ts +2 -2
  25. package/lib/components/table/Table/utils.d.ts +1 -1
  26. package/lib/index.d.ts +1 -1
  27. package/lowcode/pisell-group-view/meta.ts +1 -1
  28. package/package.json +2 -2
@@ -1,4 +1,8 @@
1
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 _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
3
+ 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."); }
4
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
5
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
2
6
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
3
7
  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; }
4
8
  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; }
@@ -86,7 +90,8 @@ var PisellTabbar = /*#__PURE__*/forwardRef(function (props, ref) {
86
90
  _props$maxLevel = props.maxLevel,
87
91
  maxLevel = _props$maxLevel === void 0 ? 3 : _props$maxLevel,
88
92
  _onSearch = props.onSearch,
89
- searchProps = props.searchProps;
93
+ searchProps = props.searchProps,
94
+ level1Actions = props.level1Actions;
90
95
  var containerRef = useRef(null);
91
96
  var tabbarIdRef = useRef(createTabbarId());
92
97
  var searchRef = useRef(null);
@@ -276,7 +281,17 @@ var PisellTabbar = /*#__PURE__*/forwardRef(function (props, ref) {
276
281
  * 一级数据源
277
282
  */
278
283
  var level1DataSource = useMemo(function () {
279
- var full = addDataSourceItemsByKey(dataSource, LEVEL_ADD_ITEMS.level1);
284
+ var categoryItems = dataSource.length ? addDataSourceItemsByKey(dataSource, LEVEL_ADD_ITEMS.level1) : [];
285
+ var actionItems = (level1Actions || []).map(function (action, index) {
286
+ return {
287
+ id: "__level1-action-".concat(String(action.key), "-").concat(index),
288
+ key: "__level1-action-".concat(String(action.key), "-").concat(index),
289
+ name: '',
290
+ customClick: true,
291
+ __action: action
292
+ };
293
+ });
294
+ var full = [].concat(_toConsumableArray(categoryItems), _toConsumableArray(actionItems));
280
295
  // 搜索弹层展开时,隐藏分类切换(普通分类 / 全部 / 展开),仅保留搜索入口本身。
281
296
  if (isSearchOpen) {
282
297
  return full.filter(function (item) {
@@ -284,7 +299,7 @@ var PisellTabbar = /*#__PURE__*/forwardRef(function (props, ref) {
284
299
  });
285
300
  }
286
301
  return full;
287
- }, [dataSource, isSearchOpen]);
302
+ }, [dataSource, isSearchOpen, level1Actions]);
288
303
  var level2Expand = getExpand('level2');
289
304
  var level3Expand = getExpand('level3');
290
305
  var level3ScrollViewProps = useMemo(function () {
@@ -504,6 +519,20 @@ var PisellTabbar = /*#__PURE__*/forwardRef(function (props, ref) {
504
519
  */
505
520
  var renderLevel1Item = useMemoizedFn(function (itemProps) {
506
521
  var itemData = itemProps.dataSource;
522
+ var action = itemData === null || itemData === void 0 ? void 0 : itemData.__action;
523
+ if (action) {
524
+ return /*#__PURE__*/React.createElement(PisellCards.MultilevelCard, _extends({}, itemProps, {
525
+ "aria-label": action.ariaLabel,
526
+ onClick: action.onClick,
527
+ card: function card(cardProps) {
528
+ var _action$label;
529
+ return renderLevelNCard(_objectSpread(_objectSpread({}, cardProps), {}, {
530
+ text: (_action$label = action.label) !== null && _action$label !== void 0 ? _action$label : action.icon
531
+ }), 'level1');
532
+ }
533
+ }));
534
+ }
535
+
507
536
  // 处理自定义点击事件的项(如展开按钮)
508
537
  if (itemData !== null && itemData !== void 0 && itemData.customClick) {
509
538
  if (itemProps.dataSource.key === 'search') {
@@ -548,7 +577,7 @@ var PisellTabbar = /*#__PURE__*/forwardRef(function (props, ref) {
548
577
  * // activeKey / expand 未变时复用同一 SuperTabs 元素
549
578
  */
550
579
  var tabbarDom = useMemo(function () {
551
- return dataSource.length ? /*#__PURE__*/React.createElement("div", {
580
+ return level1DataSource.length ? /*#__PURE__*/React.createElement("div", {
552
581
  className: classNames('pisell-tabbar', className),
553
582
  style: style,
554
583
  ref: containerRef
@@ -572,7 +601,7 @@ var PisellTabbar = /*#__PURE__*/forwardRef(function (props, ref) {
572
601
  scrollViewProps: level1ScrollViewProps,
573
602
  renderItem: renderLevel1Item
574
603
  })) : null;
575
- }, [dataSource.length, className, style, level1DataSource, activeKey, expand, maxLevel, level1Value, handleLevel1Change, level1Config, level1Expand, level1ScrollViewProps, renderLevel1Item]);
604
+ }, [className, style, level1DataSource, activeKey, expand, maxLevel, level1Value, handleLevel1Change, level1Config, level1Expand, level1ScrollViewProps, renderLevel1Item]);
576
605
  return tabbarDom;
577
606
  });
578
607
  PisellTabbar.displayName = 'PisellTabbar';
@@ -4,6 +4,6 @@
4
4
  */
5
5
  import PisellTabbar from './PisellTabbar';
6
6
  import PisellTabbarTemplate1 from './template/Template1';
7
- export type { PisellTabbarProps, TabbarDataSource, LevelType } from './types';
7
+ export type { LevelType, PisellTabbarProps, TabbarActionItem, TabbarDataSource, } from './types';
8
8
  export { PisellTabbarTemplate1 };
9
9
  export default PisellTabbar;
@@ -1,4 +1,8 @@
1
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 _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
3
+ 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."); }
4
+ function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
5
+ function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
2
6
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
3
7
  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; }
4
8
  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; }
@@ -50,7 +54,8 @@ var PisellTabbar = function PisellTabbar(props, ref) {
50
54
  _props$maxLevel = props.maxLevel,
51
55
  maxLevel = _props$maxLevel === void 0 ? 3 : _props$maxLevel,
52
56
  _onSearch = props.onSearch,
53
- searchProps = props.searchProps;
57
+ searchProps = props.searchProps,
58
+ level1Actions = props.level1Actions;
54
59
  var containerRef = useRef(null);
55
60
  var searchRef = useRef(null);
56
61
 
@@ -297,7 +302,17 @@ var PisellTabbar = function PisellTabbar(props, ref) {
297
302
  * 一级 Tabbar 数据源
298
303
  */
299
304
  var level1DataSource = useMemo(function () {
300
- var full = addDataSourceItemsByKey(dataSource, LEVEL_ADD_ITEMS.level1);
305
+ var categoryItems = dataSource.length ? addDataSourceItemsByKey(dataSource, LEVEL_ADD_ITEMS.level1) : [];
306
+ var actionItems = (level1Actions || []).map(function (action, index) {
307
+ return {
308
+ id: "__level1-action-".concat(String(action.key), "-").concat(index),
309
+ key: "__level1-action-".concat(String(action.key), "-").concat(index),
310
+ name: '',
311
+ customClick: true,
312
+ __action: action
313
+ };
314
+ });
315
+ var full = [].concat(_toConsumableArray(categoryItems), _toConsumableArray(actionItems));
301
316
  // 搜索弹层展开时,隐藏分类切换(普通分类 / 全部 / 展开),仅保留搜索入口本身。
302
317
  if (isSearchOpen) {
303
318
  return full.filter(function (item) {
@@ -305,7 +320,7 @@ var PisellTabbar = function PisellTabbar(props, ref) {
305
320
  });
306
321
  }
307
322
  return full;
308
- }, [dataSource, isSearchOpen]);
323
+ }, [dataSource, isSearchOpen, level1Actions]);
309
324
 
310
325
  /**
311
326
  * 渲染一级 Tab Item
@@ -313,6 +328,19 @@ var PisellTabbar = function PisellTabbar(props, ref) {
313
328
  var renderLevel1Item = useCallback(function (itemProps) {
314
329
  var itemData = itemProps.dataSource;
315
330
  var isExpanded = getExpand('level1');
331
+ var action = itemData === null || itemData === void 0 ? void 0 : itemData.__action;
332
+ if (action) {
333
+ return /*#__PURE__*/React.createElement(PisellCards.MultilevelCard, _extends({}, itemProps, {
334
+ "aria-label": action.ariaLabel,
335
+ onClick: action.onClick,
336
+ card: function card(cardProps) {
337
+ var _action$label;
338
+ return renderNormalCard(_objectSpread(_objectSpread({}, cardProps), {}, {
339
+ text: (_action$label = action.label) !== null && _action$label !== void 0 ? _action$label : action.icon
340
+ }), 'level1');
341
+ }
342
+ }));
343
+ }
316
344
  if (itemData !== null && itemData !== void 0 && itemData.customClick) {
317
345
  if (itemProps.dataSource.key === 'search') {
318
346
  return renderSearch(itemProps, 'level1');
@@ -346,7 +374,7 @@ var PisellTabbar = function PisellTabbar(props, ref) {
346
374
  return document.querySelector(".pisell-super-tabs-slot-bottom-".concat(tabbarId));
347
375
  }
348
376
  }));
349
- }, [getLevelConfig, getExpand, toggleExpand, maxLevel, activeKey, tabbarId]);
377
+ }, [getExpand, toggleExpand, maxLevel, tabbarId, renderSearch, renderExpandCard, renderNormalCard]);
350
378
 
351
379
  /**
352
380
  * 渲染二级 Tabbar 面板
@@ -517,7 +545,7 @@ var PisellTabbar = function PisellTabbar(props, ref) {
517
545
  */
518
546
  var level1Config = getLevelConfig('level1');
519
547
  var isExpanded1 = getExpand('level1');
520
- return dataSource.length ? /*#__PURE__*/React.createElement("div", {
548
+ return level1DataSource.length ? /*#__PURE__*/React.createElement("div", {
521
549
  className: classNames('pisell-tabbar', className),
522
550
  style: style,
523
551
  ref: containerRef
@@ -1,4 +1,21 @@
1
- import { CSSProperties } from 'react';
1
+ import { CSSProperties, ReactNode } from 'react';
2
+ /**
3
+ * 一级 Tabbar 操作项。
4
+ *
5
+ * 操作项复用一级卡片样式,但点击时不进入分类选中态。
6
+ */
7
+ export interface TabbarActionItem {
8
+ /** 唯一标识 */
9
+ key: string | number;
10
+ /** 卡片图标 */
11
+ icon: ReactNode;
12
+ /** 可选的卡片文案;未传时只显示图标 */
13
+ label?: ReactNode;
14
+ /** 无障碍名称 */
15
+ ariaLabel: string;
16
+ /** 点击回调 */
17
+ onClick: () => void;
18
+ }
2
19
  /**
3
20
  * Tabbar 数据源项类型
4
21
  */
@@ -85,6 +102,8 @@ export interface PisellTabbarProps {
85
102
  onSearch?: (value: string) => void;
86
103
  /** 透传给内部 PisellFind 的搜索配置(如 inputRender 插槽)。 */
87
104
  searchProps?: Record<string, any>;
105
+ /** 追加在一级分类末尾、且不参与分类选中态的操作卡片。 */
106
+ level1Actions?: TabbarActionItem[];
88
107
  __designMode?: boolean;
89
108
  }
90
109
  export interface PisellTabbarRef {
@@ -15,4 +15,4 @@ export declare const getFileMetadataParams: (file: RcFile & {
15
15
  metadata?: MediaMetadata;
16
16
  }) => Record<string, any>;
17
17
  export declare const isValueEqual: (value: any, fileListValue: any) => boolean;
18
- export declare const getBaseTime: (size: number) => 2000 | 1000 | 4000 | 8000;
18
+ export declare const getBaseTime: (size: number) => 1000 | 2000 | 4000 | 8000;
@@ -80,13 +80,11 @@ declare const formFieldMap: {
80
80
  extraParams?: Record<string, any> | undefined;
81
81
  }) => import("react").JSX.Element;
82
82
  };
83
- declare const getFieldComponent: (fieldComponent: string) => import("react").FC<any> | import("react").FC<import("./Checkbox/type").CheckboxGroupProps & import("../dataSourceForm/utils").WithModeProps> | (import("react").FC<{}> & {
83
+ declare const getFieldComponent: (fieldComponent: string) => import("react").FC<any> | (import("react").FC<{}> & {
84
84
  Group: import("react").FC<import("./Checkbox/type").CheckboxGroupProps & import("../dataSourceForm/utils").WithModeProps>;
85
85
  } & {
86
86
  Group: import("react").FC<import("./Checkbox/type").CheckboxGroupProps & import("../dataSourceForm/utils").WithModeProps>;
87
- }) | import("react").FC<import("./ColorPicker/type").ColorPickerProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<(import("antd").DatePickerProps & import("../dataSourceForm/utils").WithModeProps) & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("antd/es/input").PasswordProps & import("react").RefAttributes<import("antd").InputRef> & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("antd").InputProps & import("react").RefAttributes<import("antd").InputRef> & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("antd").InputProps & {
88
- onChange: (value: string) => void;
89
- } & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("./Input.Phone/WithMode").PhoneInputProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("./Input.Mobile/WithMode").PhoneInputProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | (import("react").FC<import("./Input/type").InputProps> & {
87
+ }) | import("react").FC<import("./ColorPicker/type").ColorPickerProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<(import("antd").DatePickerProps & import("../dataSourceForm/utils").WithModeProps) & import("../dataSourceForm/utils").WithFormItemProps> | (import("react").FC<import("./Input/type").InputProps> & {
90
88
  JSON: import("react").FC<any>;
91
89
  Password: import("react").FC<import("antd/es/input").PasswordProps & import("react").RefAttributes<import("antd").InputRef> & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps>;
92
90
  TextArea: import("react").FC<import("antd/es/input").TextAreaProps & import("react").RefAttributes<import("antd/es/input/TextArea").TextAreaRef> & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps>;
@@ -106,7 +104,7 @@ declare const getFieldComponent: (fieldComponent: string) => import("react").FC<
106
104
  name?: string | undefined;
107
105
  fieldKey?: string | undefined;
108
106
  } & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps>;
109
- }) | import("react").FC<import("./Radio/type").RadioGroupProps & import("../dataSourceForm/utils").WithModeProps> | (import("react").FC<{}> & {
107
+ }) | (import("react").FC<{}> & {
110
108
  Group: import("react").FC<import("./Radio/type").RadioGroupProps & import("../dataSourceForm/utils").WithModeProps>;
111
109
  } & {
112
110
  Group: import("react").FC<import("./Radio/type").RadioGroupProps & import("../dataSourceForm/utils").WithModeProps>;
@@ -119,7 +117,9 @@ declare const getFieldComponent: (fieldComponent: string) => import("react").FC<
119
117
  } & {
120
118
  dataSource?: any;
121
119
  extraParams?: Record<string, any> | undefined;
122
- }) => import("react").JSX.Element) | import("react").FC<import("./TimePicker/type").TimePickerProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("./DateRangePicker/type").DateRangePickerProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("./Upload/type").UploadProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("./Translation/type").TranslationProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("./IconSelect/type").IconSelectProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | ((props: import("./RecordListWrapper/type").RecordListWrapperProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps & {
120
+ }) => import("react").JSX.Element) | import("react").FC<import("./TimePicker/type").TimePickerProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("./Input.Phone/WithMode").PhoneInputProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("./Input.Mobile/WithMode").PhoneInputProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("antd").InputProps & {
121
+ onChange: (value: string) => void;
122
+ } & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("antd").InputProps & import("react").RefAttributes<import("antd").InputRef> & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("antd/es/input").PasswordProps & import("react").RefAttributes<import("antd").InputRef> & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("./Radio/type").RadioGroupProps & import("../dataSourceForm/utils").WithModeProps> | import("react").FC<import("./Checkbox/type").CheckboxGroupProps & import("../dataSourceForm/utils").WithModeProps> | import("react").FC<import("./DateRangePicker/type").DateRangePickerProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("./Upload/type").UploadProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("./Translation/type").TranslationProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("./IconSelect/type").IconSelectProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | ((props: import("./RecordListWrapper/type").RecordListWrapperProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps & {
123
123
  options?: any;
124
124
  optionSourceType?: "default" | "custom" | "api" | undefined;
125
125
  labelField: string;
@@ -6,7 +6,7 @@ export declare function statusTagMeta(tag: string | null | undefined): {
6
6
  } | null;
7
7
  /** 锁台卡片副标题:操作人、锁台时间等拼接一行 */
8
8
  export declare function getBlockMetaLine(item: any): string;
9
- export declare function getRemainingToneClass(ratio: any, isLight?: boolean): "theme-text-muted" | "text-zinc-400" | "text-red-600" | "text-red-300" | "text-amber-600" | "text-amber-300";
9
+ export declare function getRemainingToneClass(ratio: any, isLight?: boolean): "text-red-600" | "text-red-300" | "text-amber-600" | "text-amber-300" | "theme-text-muted" | "text-zinc-400";
10
10
  /**
11
11
  * @param options.flattenWhenAllGroupsCollapsed
12
12
  * 若为 `true`:全部分组折叠时仅有 group 头、无 court 行,会退化为平铺 court(易与「全部展开」混淆)。
@@ -197,12 +197,12 @@ export declare const fieldList: ({
197
197
  field_icon: string;
198
198
  field_name: string;
199
199
  field_type: string;
200
- default_value: string;
200
+ default_value: boolean;
201
201
  } | {
202
202
  field_icon: string;
203
203
  field_name: string;
204
204
  field_type: string;
205
- default_value: boolean;
205
+ default_value: string;
206
206
  } | {
207
207
  field_icon: string;
208
208
  field_name: string;
@@ -155,7 +155,7 @@ export declare const getSettingKeyArrByMode: ({ filter, columnSetting, dataSourc
155
155
  sort?: SortType | undefined;
156
156
  mode: "" | "localStorage" | "remote";
157
157
  currentViewMode: ModeType;
158
- }) => ("view_mode" | "column_setting" | "order_by" | "group_by" | "gallery_setting" | "filters" | "filter_setting")[];
158
+ }) => ("filters" | "column_setting" | "gallery_setting" | "order_by" | "group_by" | "view_mode" | "filter_setting")[];
159
159
  export declare const omit: (obj: Record<string, any>, keys: string[]) => Record<string, any>;
160
160
  export declare const stringify: (obj: Record<string, any>) => string;
161
161
  export {};
package/es/index.d.ts CHANGED
@@ -42,7 +42,7 @@ export type { PisellStepItem, PisellStepsProps, } from './components/PisellSteps
42
42
  export { default as PisellSuperTabs } from './components/PisellSuperTabs';
43
43
  export type { PisellSuperTabsProps, TabDataItem, } from './components/PisellSuperTabs';
44
44
  export { default as PisellTabbar } from './components/PisellTabbar';
45
- export type { LevelType, PisellTabbarProps, TabbarDataSource, } from './components/PisellTabbar';
45
+ export type { LevelType, PisellTabbarProps, TabbarActionItem, TabbarDataSource, } from './components/PisellTabbar';
46
46
  export { default as PisellTabbarTemplate1 } from './components/PisellTabbar/template/Template1';
47
47
  export { default as PisellTabbar2 } from './components/PisellTabbar2';
48
48
  export { default as AppVersionControl } from './components/appVersionControl';
@@ -70,7 +70,8 @@ var PisellTabbar = (0, import_react.forwardRef)(
70
70
  expandConfig: customExpandConfig,
71
71
  maxLevel = 3,
72
72
  onSearch,
73
- searchProps
73
+ searchProps,
74
+ level1Actions
74
75
  } = props;
75
76
  const containerRef = (0, import_react.useRef)(null);
76
77
  const tabbarIdRef = (0, import_react.useRef)(createTabbarId());
@@ -231,13 +232,21 @@ var PisellTabbar = (0, import_react.forwardRef)(
231
232
  );
232
233
  const level1DataSource = (0, import_react.useMemo)(
233
234
  () => {
234
- const full = (0, import_utils.addDataSourceItemsByKey)(dataSource, import_constants.LEVEL_ADD_ITEMS.level1);
235
+ const categoryItems = dataSource.length ? (0, import_utils.addDataSourceItemsByKey)(dataSource, import_constants.LEVEL_ADD_ITEMS.level1) : [];
236
+ const actionItems = (level1Actions || []).map((action, index) => ({
237
+ id: `__level1-action-${String(action.key)}-${index}`,
238
+ key: `__level1-action-${String(action.key)}-${index}`,
239
+ name: "",
240
+ customClick: true,
241
+ __action: action
242
+ }));
243
+ const full = [...categoryItems, ...actionItems];
235
244
  if (isSearchOpen) {
236
245
  return full.filter((item) => (item == null ? void 0 : item.key) === "search");
237
246
  }
238
247
  return full;
239
248
  },
240
- [dataSource, isSearchOpen]
249
+ [dataSource, isSearchOpen, level1Actions]
241
250
  );
242
251
  const level2Expand = getExpand("level2");
243
252
  const level3Expand = getExpand("level3");
@@ -492,6 +501,24 @@ var PisellTabbar = (0, import_react.forwardRef)(
492
501
  const renderLevel1Item = (0, import_ahooks.useMemoizedFn)(
493
502
  (itemProps) => {
494
503
  const { dataSource: itemData } = itemProps;
504
+ const action = itemData == null ? void 0 : itemData.__action;
505
+ if (action) {
506
+ return /* @__PURE__ */ import_react.default.createElement(
507
+ import_PisellCards.default.MultilevelCard,
508
+ {
509
+ ...itemProps,
510
+ "aria-label": action.ariaLabel,
511
+ onClick: action.onClick,
512
+ card: (cardProps) => renderLevelNCard(
513
+ {
514
+ ...cardProps,
515
+ text: action.label ?? action.icon
516
+ },
517
+ "level1"
518
+ )
519
+ }
520
+ );
521
+ }
495
522
  if (itemData == null ? void 0 : itemData.customClick) {
496
523
  if (itemProps.dataSource.key === "search") {
497
524
  return renderSearch(itemProps, "level1");
@@ -531,7 +558,7 @@ var PisellTabbar = (0, import_react.forwardRef)(
531
558
  [level1Expand]
532
559
  );
533
560
  const tabbarDom = (0, import_react.useMemo)(
534
- () => dataSource.length ? /* @__PURE__ */ import_react.default.createElement(
561
+ () => level1DataSource.length ? /* @__PURE__ */ import_react.default.createElement(
535
562
  "div",
536
563
  {
537
564
  className: (0, import_classnames.default)("pisell-tabbar", className),
@@ -563,7 +590,6 @@ var PisellTabbar = (0, import_react.forwardRef)(
563
590
  )
564
591
  ) : null,
565
592
  [
566
- dataSource.length,
567
593
  className,
568
594
  style,
569
595
  level1DataSource,
@@ -4,6 +4,6 @@
4
4
  */
5
5
  import PisellTabbar from './PisellTabbar';
6
6
  import PisellTabbarTemplate1 from './template/Template1';
7
- export type { PisellTabbarProps, TabbarDataSource, LevelType } from './types';
7
+ export type { LevelType, PisellTabbarProps, TabbarActionItem, TabbarDataSource, } from './types';
8
8
  export { PisellTabbarTemplate1 };
9
9
  export default PisellTabbar;
@@ -54,7 +54,8 @@ var PisellTabbar = (props, ref) => {
54
54
  expandConfig: customExpandConfig,
55
55
  maxLevel = 3,
56
56
  onSearch,
57
- searchProps
57
+ searchProps,
58
+ level1Actions
58
59
  } = props;
59
60
  const containerRef = (0, import_react.useRef)(null);
60
61
  const searchRef = (0, import_react.useRef)(null);
@@ -282,18 +283,44 @@ var PisellTabbar = (props, ref) => {
282
283
  );
283
284
  const level1DataSource = (0, import_react.useMemo)(
284
285
  () => {
285
- const full = (0, import_utils.addDataSourceItemsByKey)(dataSource, import_constants.LEVEL_ADD_ITEMS.level1);
286
+ const categoryItems = dataSource.length ? (0, import_utils.addDataSourceItemsByKey)(dataSource, import_constants.LEVEL_ADD_ITEMS.level1) : [];
287
+ const actionItems = (level1Actions || []).map((action, index) => ({
288
+ id: `__level1-action-${String(action.key)}-${index}`,
289
+ key: `__level1-action-${String(action.key)}-${index}`,
290
+ name: "",
291
+ customClick: true,
292
+ __action: action
293
+ }));
294
+ const full = [...categoryItems, ...actionItems];
286
295
  if (isSearchOpen) {
287
296
  return full.filter((item) => (item == null ? void 0 : item.key) === "search");
288
297
  }
289
298
  return full;
290
299
  },
291
- [dataSource, isSearchOpen]
300
+ [dataSource, isSearchOpen, level1Actions]
292
301
  );
293
302
  const renderLevel1Item = (0, import_react.useCallback)(
294
303
  (itemProps) => {
295
304
  const { dataSource: itemData } = itemProps;
296
305
  const isExpanded = getExpand("level1");
306
+ const action = itemData == null ? void 0 : itemData.__action;
307
+ if (action) {
308
+ return /* @__PURE__ */ import_react.default.createElement(
309
+ import_PisellCards.default.MultilevelCard,
310
+ {
311
+ ...itemProps,
312
+ "aria-label": action.ariaLabel,
313
+ onClick: action.onClick,
314
+ card: (cardProps) => renderNormalCard(
315
+ {
316
+ ...cardProps,
317
+ text: action.label ?? action.icon
318
+ },
319
+ "level1"
320
+ )
321
+ }
322
+ );
323
+ }
297
324
  if (itemData == null ? void 0 : itemData.customClick) {
298
325
  if (itemProps.dataSource.key === "search") {
299
326
  return renderSearch(itemProps, "level1");
@@ -326,7 +353,15 @@ var PisellTabbar = (props, ref) => {
326
353
  }
327
354
  );
328
355
  },
329
- [getLevelConfig, getExpand, toggleExpand, maxLevel, activeKey, tabbarId]
356
+ [
357
+ getExpand,
358
+ toggleExpand,
359
+ maxLevel,
360
+ tabbarId,
361
+ renderSearch,
362
+ renderExpandCard,
363
+ renderNormalCard
364
+ ]
330
365
  );
331
366
  const renderLevel2Panel = (0, import_react.useCallback)(
332
367
  (panelProps) => {
@@ -512,7 +547,7 @@ var PisellTabbar = (props, ref) => {
512
547
  );
513
548
  const level1Config = getLevelConfig("level1");
514
549
  const isExpanded1 = getExpand("level1");
515
- return dataSource.length ? /* @__PURE__ */ import_react.default.createElement(
550
+ return level1DataSource.length ? /* @__PURE__ */ import_react.default.createElement(
516
551
  "div",
517
552
  {
518
553
  className: (0, import_classnames.default)("pisell-tabbar", className),
@@ -1,4 +1,21 @@
1
- import { CSSProperties } from 'react';
1
+ import { CSSProperties, ReactNode } from 'react';
2
+ /**
3
+ * 一级 Tabbar 操作项。
4
+ *
5
+ * 操作项复用一级卡片样式,但点击时不进入分类选中态。
6
+ */
7
+ export interface TabbarActionItem {
8
+ /** 唯一标识 */
9
+ key: string | number;
10
+ /** 卡片图标 */
11
+ icon: ReactNode;
12
+ /** 可选的卡片文案;未传时只显示图标 */
13
+ label?: ReactNode;
14
+ /** 无障碍名称 */
15
+ ariaLabel: string;
16
+ /** 点击回调 */
17
+ onClick: () => void;
18
+ }
2
19
  /**
3
20
  * Tabbar 数据源项类型
4
21
  */
@@ -85,6 +102,8 @@ export interface PisellTabbarProps {
85
102
  onSearch?: (value: string) => void;
86
103
  /** 透传给内部 PisellFind 的搜索配置(如 inputRender 插槽)。 */
87
104
  searchProps?: Record<string, any>;
105
+ /** 追加在一级分类末尾、且不参与分类选中态的操作卡片。 */
106
+ level1Actions?: TabbarActionItem[];
88
107
  __designMode?: boolean;
89
108
  }
90
109
  export interface PisellTabbarRef {
@@ -15,4 +15,4 @@ export declare const getFileMetadataParams: (file: RcFile & {
15
15
  metadata?: MediaMetadata;
16
16
  }) => Record<string, any>;
17
17
  export declare const isValueEqual: (value: any, fileListValue: any) => boolean;
18
- export declare const getBaseTime: (size: number) => 2000 | 1000 | 4000 | 8000;
18
+ export declare const getBaseTime: (size: number) => 1000 | 2000 | 4000 | 8000;
@@ -80,13 +80,11 @@ declare const formFieldMap: {
80
80
  extraParams?: Record<string, any> | undefined;
81
81
  }) => import("react").JSX.Element;
82
82
  };
83
- declare const getFieldComponent: (fieldComponent: string) => import("react").FC<any> | import("react").FC<import("./Checkbox/type").CheckboxGroupProps & import("../dataSourceForm/utils").WithModeProps> | (import("react").FC<{}> & {
83
+ declare const getFieldComponent: (fieldComponent: string) => import("react").FC<any> | (import("react").FC<{}> & {
84
84
  Group: import("react").FC<import("./Checkbox/type").CheckboxGroupProps & import("../dataSourceForm/utils").WithModeProps>;
85
85
  } & {
86
86
  Group: import("react").FC<import("./Checkbox/type").CheckboxGroupProps & import("../dataSourceForm/utils").WithModeProps>;
87
- }) | import("react").FC<import("./ColorPicker/type").ColorPickerProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<(import("antd").DatePickerProps & import("../dataSourceForm/utils").WithModeProps) & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("antd/es/input").PasswordProps & import("react").RefAttributes<import("antd").InputRef> & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("antd").InputProps & import("react").RefAttributes<import("antd").InputRef> & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("antd").InputProps & {
88
- onChange: (value: string) => void;
89
- } & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("./Input.Phone/WithMode").PhoneInputProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("./Input.Mobile/WithMode").PhoneInputProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | (import("react").FC<import("./Input/type").InputProps> & {
87
+ }) | import("react").FC<import("./ColorPicker/type").ColorPickerProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<(import("antd").DatePickerProps & import("../dataSourceForm/utils").WithModeProps) & import("../dataSourceForm/utils").WithFormItemProps> | (import("react").FC<import("./Input/type").InputProps> & {
90
88
  JSON: import("react").FC<any>;
91
89
  Password: import("react").FC<import("antd/es/input").PasswordProps & import("react").RefAttributes<import("antd").InputRef> & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps>;
92
90
  TextArea: import("react").FC<import("antd/es/input").TextAreaProps & import("react").RefAttributes<import("antd/es/input/TextArea").TextAreaRef> & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps>;
@@ -106,7 +104,7 @@ declare const getFieldComponent: (fieldComponent: string) => import("react").FC<
106
104
  name?: string | undefined;
107
105
  fieldKey?: string | undefined;
108
106
  } & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps>;
109
- }) | import("react").FC<import("./Radio/type").RadioGroupProps & import("../dataSourceForm/utils").WithModeProps> | (import("react").FC<{}> & {
107
+ }) | (import("react").FC<{}> & {
110
108
  Group: import("react").FC<import("./Radio/type").RadioGroupProps & import("../dataSourceForm/utils").WithModeProps>;
111
109
  } & {
112
110
  Group: import("react").FC<import("./Radio/type").RadioGroupProps & import("../dataSourceForm/utils").WithModeProps>;
@@ -119,7 +117,9 @@ declare const getFieldComponent: (fieldComponent: string) => import("react").FC<
119
117
  } & {
120
118
  dataSource?: any;
121
119
  extraParams?: Record<string, any> | undefined;
122
- }) => import("react").JSX.Element) | import("react").FC<import("./TimePicker/type").TimePickerProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("./DateRangePicker/type").DateRangePickerProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("./Upload/type").UploadProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("./Translation/type").TranslationProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("./IconSelect/type").IconSelectProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | ((props: import("./RecordListWrapper/type").RecordListWrapperProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps & {
120
+ }) => import("react").JSX.Element) | import("react").FC<import("./TimePicker/type").TimePickerProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("./Input.Phone/WithMode").PhoneInputProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("./Input.Mobile/WithMode").PhoneInputProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("antd").InputProps & {
121
+ onChange: (value: string) => void;
122
+ } & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("antd").InputProps & import("react").RefAttributes<import("antd").InputRef> & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("antd/es/input").PasswordProps & import("react").RefAttributes<import("antd").InputRef> & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("./Radio/type").RadioGroupProps & import("../dataSourceForm/utils").WithModeProps> | import("react").FC<import("./Checkbox/type").CheckboxGroupProps & import("../dataSourceForm/utils").WithModeProps> | import("react").FC<import("./DateRangePicker/type").DateRangePickerProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("./Upload/type").UploadProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("./Translation/type").TranslationProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | import("react").FC<import("./IconSelect/type").IconSelectProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps> | ((props: import("./RecordListWrapper/type").RecordListWrapperProps & import("../dataSourceForm/utils").WithModeProps & import("../dataSourceForm/utils").WithFormItemProps & {
123
123
  options?: any;
124
124
  optionSourceType?: "default" | "custom" | "api" | undefined;
125
125
  labelField: string;
@@ -6,7 +6,7 @@ export declare function statusTagMeta(tag: string | null | undefined): {
6
6
  } | null;
7
7
  /** 锁台卡片副标题:操作人、锁台时间等拼接一行 */
8
8
  export declare function getBlockMetaLine(item: any): string;
9
- export declare function getRemainingToneClass(ratio: any, isLight?: boolean): "theme-text-muted" | "text-zinc-400" | "text-red-600" | "text-red-300" | "text-amber-600" | "text-amber-300";
9
+ export declare function getRemainingToneClass(ratio: any, isLight?: boolean): "text-red-600" | "text-red-300" | "text-amber-600" | "text-amber-300" | "theme-text-muted" | "text-zinc-400";
10
10
  /**
11
11
  * @param options.flattenWhenAllGroupsCollapsed
12
12
  * 若为 `true`:全部分组折叠时仅有 group 头、无 court 行,会退化为平铺 court(易与「全部展开」混淆)。
@@ -197,12 +197,12 @@ export declare const fieldList: ({
197
197
  field_icon: string;
198
198
  field_name: string;
199
199
  field_type: string;
200
- default_value: string;
200
+ default_value: boolean;
201
201
  } | {
202
202
  field_icon: string;
203
203
  field_name: string;
204
204
  field_type: string;
205
- default_value: boolean;
205
+ default_value: string;
206
206
  } | {
207
207
  field_icon: string;
208
208
  field_name: string;
@@ -155,7 +155,7 @@ export declare const getSettingKeyArrByMode: ({ filter, columnSetting, dataSourc
155
155
  sort?: SortType | undefined;
156
156
  mode: "" | "localStorage" | "remote";
157
157
  currentViewMode: ModeType;
158
- }) => ("view_mode" | "column_setting" | "order_by" | "group_by" | "gallery_setting" | "filters" | "filter_setting")[];
158
+ }) => ("filters" | "column_setting" | "gallery_setting" | "order_by" | "group_by" | "view_mode" | "filter_setting")[];
159
159
  export declare const omit: (obj: Record<string, any>, keys: string[]) => Record<string, any>;
160
160
  export declare const stringify: (obj: Record<string, any>) => string;
161
161
  export {};
package/lib/index.d.ts CHANGED
@@ -42,7 +42,7 @@ export type { PisellStepItem, PisellStepsProps, } from './components/PisellSteps
42
42
  export { default as PisellSuperTabs } from './components/PisellSuperTabs';
43
43
  export type { PisellSuperTabsProps, TabDataItem, } from './components/PisellSuperTabs';
44
44
  export { default as PisellTabbar } from './components/PisellTabbar';
45
- export type { LevelType, PisellTabbarProps, TabbarDataSource, } from './components/PisellTabbar';
45
+ export type { LevelType, PisellTabbarProps, TabbarActionItem, TabbarDataSource, } from './components/PisellTabbar';
46
46
  export { default as PisellTabbarTemplate1 } from './components/PisellTabbar/template/Template1';
47
47
  export { default as PisellTabbar2 } from './components/PisellTabbar2';
48
48
  export { default as AppVersionControl } from './components/appVersionControl';
@@ -9,7 +9,7 @@ const PisellGroupViewMeta: ComponentMetadata = {
9
9
  "devMode": "proCode",
10
10
  "npm": {
11
11
  "package": "@pisell/materials",
12
- "version": "6.12.8",
12
+ "version": "6.12.10",
13
13
  "exportName": "PisellGroupView",
14
14
  "main": "src/index.tsx",
15
15
  "destructuring": true,