@creekjs/web-components 1.0.0

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 (73) hide show
  1. package/.fatherrc.ts +13 -0
  2. package/.turbo/daemon/deec863de02760ed-turbo.log.2024-11-20 +0 -0
  3. package/README.md +1026 -0
  4. package/dist/bg-center/index.js +28 -0
  5. package/dist/creek-config-provider/CreekConfigContext.js +2 -0
  6. package/dist/creek-config-provider/index.js +14 -0
  7. package/dist/creek-hooks/index.js +1 -0
  8. package/dist/creek-hooks/useViewportHeight.js +147 -0
  9. package/dist/creek-icon/index.js +37 -0
  10. package/dist/creek-keep-alive/index.js +20 -0
  11. package/dist/creek-layout/CollapseButton.js +59 -0
  12. package/dist/creek-layout/Exception/NotFound.js +13 -0
  13. package/dist/creek-layout/Exception/NotFoundPage.js +5 -0
  14. package/dist/creek-layout/Exception/index.js +8 -0
  15. package/dist/creek-layout/HeaderContent/FullScreen.js +50 -0
  16. package/dist/creek-layout/HeaderContent/UserInfo.js +58 -0
  17. package/dist/creek-layout/HeaderContent/index.js +33 -0
  18. package/dist/creek-layout/index.js +86 -0
  19. package/dist/creek-loading/index.js +52 -0
  20. package/dist/creek-search/CreekSearch.js +51 -0
  21. package/dist/creek-search/CreekSearchContext.js +546 -0
  22. package/dist/creek-search/CreekSearchFilterDisplay.js +97 -0
  23. package/dist/creek-search/CreekSearchInput.js +96 -0
  24. package/dist/creek-search/CreekSearchValueSelector.js +422 -0
  25. package/dist/creek-search/index.js +5 -0
  26. package/dist/creek-search/type.js +1 -0
  27. package/dist/creek-table/SearchTable.js +121 -0
  28. package/dist/creek-table/TableOptionRender.js +65 -0
  29. package/dist/creek-table/TableViewContent.js +45 -0
  30. package/dist/creek-table/hooks/index.js +3 -0
  31. package/dist/creek-table/hooks/useAdaptiveToolBar.js +48 -0
  32. package/dist/creek-table/hooks/useAutoAddFilterToColumns.js +93 -0
  33. package/dist/creek-table/hooks/useElementDistance.js +58 -0
  34. package/dist/creek-table/index.js +25 -0
  35. package/dist/creek-table/toolBarRender.js +36 -0
  36. package/dist/creek-table/type.js +1 -0
  37. package/dist/index.js +7 -0
  38. package/package.json +19 -0
  39. package/src/bg-center/index.tsx +26 -0
  40. package/src/creek-config-provider/CreekConfigContext.tsx +7 -0
  41. package/src/creek-config-provider/index.tsx +12 -0
  42. package/src/creek-hooks/index.ts +1 -0
  43. package/src/creek-hooks/useViewportHeight.tsx +154 -0
  44. package/src/creek-icon/index.tsx +34 -0
  45. package/src/creek-keep-alive/index.tsx +11 -0
  46. package/src/creek-layout/CollapseButton.tsx +66 -0
  47. package/src/creek-layout/Exception/NotFound.tsx +12 -0
  48. package/src/creek-layout/Exception/NotFoundPage.tsx +4 -0
  49. package/src/creek-layout/Exception/index.tsx +10 -0
  50. package/src/creek-layout/HeaderContent/FullScreen.tsx +46 -0
  51. package/src/creek-layout/HeaderContent/UserInfo.tsx +54 -0
  52. package/src/creek-layout/HeaderContent/index.tsx +27 -0
  53. package/src/creek-layout/index.tsx +98 -0
  54. package/src/creek-loading/index.tsx +35 -0
  55. package/src/creek-search/CreekSearch.tsx +59 -0
  56. package/src/creek-search/CreekSearchContext.tsx +593 -0
  57. package/src/creek-search/CreekSearchFilterDisplay.tsx +84 -0
  58. package/src/creek-search/CreekSearchInput.tsx +75 -0
  59. package/src/creek-search/CreekSearchValueSelector.tsx +324 -0
  60. package/src/creek-search/index.tsx +5 -0
  61. package/src/creek-search/type.ts +9 -0
  62. package/src/creek-table/SearchTable.tsx +115 -0
  63. package/src/creek-table/TableOptionRender.tsx +57 -0
  64. package/src/creek-table/TableViewContent.tsx +44 -0
  65. package/src/creek-table/hooks/index.ts +4 -0
  66. package/src/creek-table/hooks/useAdaptiveToolBar.tsx +45 -0
  67. package/src/creek-table/hooks/useAutoAddFilterToColumns.tsx +90 -0
  68. package/src/creek-table/hooks/useElementDistance.tsx +64 -0
  69. package/src/creek-table/index.tsx +16 -0
  70. package/src/creek-table/toolBarRender.tsx +28 -0
  71. package/src/creek-table/type.ts +21 -0
  72. package/src/index.tsx +8 -0
  73. package/tsconfig.json +12 -0
@@ -0,0 +1,90 @@
1
+ import { ParamsType, ProColumnType } from '@ant-design/pro-components';
2
+ import { useMemoizedFn, useSafeState } from 'ahooks';
3
+ import { useMemo } from 'react';
4
+
5
+ import { CreekSearchValueSelector, useSearchContext } from '../../creek-search';
6
+ import { CreekTableProps } from '../type';
7
+
8
+ interface UseAutoAddFilterToColumnsProps<T extends ParamsType, U extends ParamsType, ValueType = 'text'> {
9
+ columns: CreekTableProps<T, U, ValueType>['columns'];
10
+ autoAddFilterForColumn?: boolean;
11
+ }
12
+
13
+ interface UseAutoAddFilterToColumnsReturn<T extends ParamsType, U extends ParamsType, ValueType> {
14
+ columnsWithFilter: CreekTableProps<T, U, ValueType>['columns'];
15
+ getColumnKey: (column: ProColumnType<T, U>) => string;
16
+ }
17
+
18
+ export const useAutoAddFilterToColumns = <T extends ParamsType, U extends ParamsType, ValueType = 'text'>({
19
+ columns,
20
+ autoAddFilterForColumn,
21
+ }: UseAutoAddFilterToColumnsProps<T, U, ValueType>): UseAutoAddFilterToColumnsReturn<T, U, ValueType> => {
22
+ const { hasOptions, setSelectedColumn, filters } = useSearchContext();
23
+
24
+ // 管理每列的下拉框状态
25
+ const [filterOpenMap, setFilterOpenMap] = useSafeState<Record<string, boolean>>({});
26
+
27
+ // 获取列的唯一标识
28
+ const getColumnKey = useMemoizedFn((column: ProColumnType<T, U>) => {
29
+ return column.dataIndex as string;
30
+ });
31
+
32
+ // 控制特定列的下拉框开关
33
+ const setColumnFilterOpen = useMemoizedFn((columnKey: string, open: boolean) => {
34
+ setFilterOpenMap((prev) => ({
35
+ ...prev,
36
+ [columnKey]: open,
37
+ }));
38
+ });
39
+
40
+ // 关闭特定列的下拉框
41
+ const closeColumnFilter = useMemoizedFn((columnKey: string) => {
42
+ setFilterOpenMap((prev) => ({
43
+ ...prev,
44
+ [columnKey]: false,
45
+ }));
46
+ });
47
+
48
+ // 自动为列添加筛选功能
49
+ const autoAddFilterToColumns = useMemoizedFn((columns: CreekTableProps<T, U, ValueType>['columns'] = []) => {
50
+ return columns.map((column) => {
51
+ if (hasOptions(column)) {
52
+ const newColumn = { ...column };
53
+ const columnKey = getColumnKey(newColumn as ProColumnType<T, U>);
54
+
55
+ return {
56
+ ...newColumn,
57
+ filters: newColumn?.filters || true,
58
+ onFilter: newColumn?.onFilter || false,
59
+ filtered: filters.map((item) => item.dataIndex).includes(columnKey),
60
+ filterDropdown: (
61
+ <CreekSearchValueSelector
62
+ onConfirm={() => {
63
+ // 点击确认时关闭当前列的下拉框
64
+ closeColumnFilter(columnKey);
65
+ }}
66
+ />
67
+ ),
68
+ filterDropdownProps: {
69
+ open: filterOpenMap[columnKey] || false,
70
+ onOpenChange: (open: boolean) => {
71
+ if (open) {
72
+ const selectedColumn = columns.find((item) => item.dataIndex === columnKey);
73
+ setSelectedColumn(selectedColumn);
74
+ }
75
+ setColumnFilterOpen(columnKey, open);
76
+ },
77
+ },
78
+ };
79
+ }
80
+ return column;
81
+ });
82
+ });
83
+
84
+ const columnsWithFilter = useMemo(() => (autoAddFilterForColumn ? autoAddFilterToColumns(columns) : columns), [columns, filters, autoAddFilterToColumns, filterOpenMap]);
85
+
86
+ return {
87
+ columnsWithFilter,
88
+ getColumnKey,
89
+ };
90
+ };
@@ -0,0 +1,64 @@
1
+ import { useDebounceFn, useEventListener, useLatest } from 'ahooks';
2
+ import { useEffect, useState } from 'react';
3
+
4
+ type ElementRef = React.RefObject<HTMLElement>;
5
+
6
+ interface Position {
7
+ left: number;
8
+ width: number;
9
+ }
10
+
11
+ interface Distance {
12
+ x: number;
13
+ }
14
+
15
+ const getElementCenter = (element: HTMLElement): Position => {
16
+ const rect = element.getBoundingClientRect();
17
+ return {
18
+ left: rect.left,
19
+ width: rect.width,
20
+ };
21
+ };
22
+
23
+ const calculateDistance = (pos1: Position, pos2: Position): Distance => {
24
+ const x = Math.abs(pos2.left - pos1.left - pos1.width);
25
+ return { x };
26
+ };
27
+
28
+ export const useElementDistance = (element1Ref: ElementRef, element2Ref: ElementRef): Distance | null => {
29
+ const [distance, setDistance] = useState<Distance | null>(null);
30
+ const distanceRef = useLatest(distance);
31
+
32
+ const { run: calculateAndUpdateDistance } = useDebounceFn(
33
+ () => {
34
+ if (!element1Ref.current || !element2Ref.current) {
35
+ if (distanceRef.current !== null) {
36
+ setDistance(null);
37
+ }
38
+ return;
39
+ }
40
+
41
+ const pos1 = getElementCenter(element1Ref.current);
42
+ const pos2 = getElementCenter(element2Ref.current);
43
+ const newDistance = calculateDistance(pos1, pos2);
44
+
45
+ // 只有当距离发生变化时才更新,避免不必要的重渲染
46
+ if (!distanceRef.current || distanceRef.current.x !== newDistance.x) {
47
+ setDistance(newDistance);
48
+ }
49
+ },
50
+ {
51
+ wait: 100,
52
+ },
53
+ );
54
+
55
+ // 初始计算
56
+ useEffect(() => {
57
+ calculateAndUpdateDistance();
58
+ }, [element1Ref, element2Ref]);
59
+
60
+ // 监听 window 的 resize 和 scroll 事件
61
+ useEventListener('resize', calculateAndUpdateDistance, { target: window });
62
+
63
+ return distance;
64
+ };
@@ -0,0 +1,16 @@
1
+ import { ParamsType } from '@ant-design/pro-components';
2
+
3
+ import { CreekSearchProvider } from '../creek-search';
4
+
5
+ import { SearchProTable } from './SearchTable';
6
+ import { CreekTableProps } from './type';
7
+
8
+ export const CreekTable = <T extends ParamsType, U extends ParamsType, ValueType = 'text'>(props: CreekTableProps<T, U, ValueType>) => {
9
+ const { columns = [], onSubmit, ...restProps } = props;
10
+
11
+ return (
12
+ <CreekSearchProvider columns={columns} onSubmit={onSubmit}>
13
+ <SearchProTable columns={columns} {...restProps} />
14
+ </CreekSearchProvider>
15
+ );
16
+ };
@@ -0,0 +1,28 @@
1
+ import { DownOutlined } from '@ant-design/icons';
2
+ import { Button, Dropdown } from 'antd';
3
+
4
+ export const toolBarRender = (options: { shouldCollapse: boolean; restProps: any }) => {
5
+ const { shouldCollapse, restProps } = options;
6
+
7
+ const baseActions = restProps.toolBarRender?.() || [];
8
+ if (!shouldCollapse || baseActions.length <= 1) {
9
+ return baseActions;
10
+ }
11
+
12
+ const [first, ...rest] = baseActions;
13
+
14
+ return [
15
+ first,
16
+ <Dropdown
17
+ key="more"
18
+ menu={{
19
+ items: rest.map((item: React.ReactDOM, index: number) => ({ key: index, label: item })),
20
+ }}
21
+ trigger={['click']}
22
+ >
23
+ <Button>
24
+ 更多 <DownOutlined />
25
+ </Button>
26
+ </Dropdown>,
27
+ ];
28
+ };
@@ -0,0 +1,21 @@
1
+ import { ParamsType, ProTableProps } from '@ant-design/pro-components';
2
+
3
+ export type OptionRenderCustom = {
4
+ text?: string;
5
+ icon?: React.ReactNode;
6
+ onClick?: () => void;
7
+ };
8
+
9
+ export type CreekTableProps<T extends ParamsType, U extends ParamsType, ValueType = 'text'> = Omit<ProTableProps<T, U, ValueType>, 'search' | 'options'> & {
10
+ pageFixedBottom?: boolean; // 是否固定分页在底部
11
+ pageFixedBottomConfig?: {
12
+ /** 底部保留空间(如固定在底部的元素高度),默认 0 */
13
+ bottomFix?: number;
14
+ };
15
+ options?: ProTableProps<T, U, ValueType>['options'] & {
16
+ importConfig?: OptionRenderCustom;
17
+ exportConfig?: OptionRenderCustom;
18
+ };
19
+ // 是否自动为列添加筛选功能,默认 true
20
+ autoAddFilterForColumn?: boolean;
21
+ };
package/src/index.tsx ADDED
@@ -0,0 +1,8 @@
1
+ export * from './bg-center';
2
+ export * from './creek-config-provider';
3
+ export * from './creek-icon';
4
+ export * from './creek-layout';
5
+ export * from './creek-loading';
6
+ export * from './creek-search';
7
+ export * from './creek-table';
8
+
package/tsconfig.json ADDED
@@ -0,0 +1,12 @@
1
+ {
2
+ "extends": "@creekjs/lint/dist/tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "./dist",
5
+ "rootDir": "./src",
6
+ "baseUrl": "./",
7
+ "paths": {
8
+ "@/*": ["src/*"]
9
+ }
10
+ },
11
+ "include": ["src"]
12
+ }