dinocollab-core 2.2.10 → 2.2.13

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 (100) hide show
  1. package/README.md +0 -22
  2. package/dist/data-surface/index.js +1 -1
  3. package/dist/filter-bar/index.js +1 -1
  4. package/dist/src/data-surface/index.create.js +1 -1
  5. package/dist/src/data-surface/index.create.js.map +1 -1
  6. package/dist/src/data-surface/index.dino.js +1 -1
  7. package/dist/src/data-surface/index.dino.js.map +1 -1
  8. package/dist/src/data-surface/types.js +1 -1
  9. package/dist/src/data-surface/types.js.map +1 -1
  10. package/dist/src/data-surface/ui.units.js +1 -1
  11. package/dist/src/data-surface/view-grid/hooks.js +1 -1
  12. package/dist/src/data-surface/view-grid/hooks.js.map +1 -1
  13. package/dist/src/data-surface/view-grid/index.js +1 -1
  14. package/dist/src/data-surface/view-grid/index.js.map +1 -1
  15. package/dist/src/data-surface/view-grid/styleds.js +1 -1
  16. package/dist/src/data-surface/view-grid/styleds.js.map +1 -1
  17. package/dist/src/data-surface/view-list/hooks.js +1 -1
  18. package/dist/src/data-surface/view-list/hooks.js.map +1 -1
  19. package/dist/src/data-surface/view-list/index.js +1 -1
  20. package/dist/src/data-surface/view-list/index.js.map +1 -1
  21. package/dist/src/data-surface/view-list/styled.js +1 -1
  22. package/dist/src/data-surface/view-list/styled.js.map +1 -1
  23. package/dist/src/data-surface/view-list/types.js.map +1 -1
  24. package/dist/src/data-surface/view-switch-transition.js.map +1 -1
  25. package/dist/src/filter-bar/components/chip-viewer.js +1 -1
  26. package/dist/src/filter-bar/components/chip-viewer.js.map +1 -1
  27. package/dist/src/filter-bar/components/filter-sort.js +1 -1
  28. package/dist/src/filter-bar/components/filter-sort.js.map +1 -1
  29. package/dist/src/filter-bar/components/filter-summary.js +1 -1
  30. package/dist/src/filter-bar/components/filter-summary.js.map +1 -1
  31. package/dist/src/filter-bar/components/{units.js → icons.js} +1 -1
  32. package/dist/src/filter-bar/components/{units.js.map → icons.js.map} +1 -1
  33. package/dist/src/filter-bar/components/popper-custom.js +1 -1
  34. package/dist/src/filter-bar/components/popper-custom.js.map +1 -1
  35. package/dist/src/filter-bar/components/ui.units.js +2 -0
  36. package/dist/src/filter-bar/components/ui.units.js.map +1 -0
  37. package/dist/src/filter-bar/convert-to-graphql.js +1 -1
  38. package/dist/src/filter-bar/convert-to-graphql.js.map +1 -1
  39. package/dist/src/filter-bar/index.create.js +1 -1
  40. package/dist/src/filter-bar/index.create.js.map +1 -1
  41. package/dist/src/filter-bar/index.dino.js +1 -1
  42. package/dist/src/filter-bar/index.dino.js.map +1 -1
  43. package/dist/src/filter-bar/local-filter-builder.js +2 -0
  44. package/dist/src/filter-bar/local-filter-builder.js.map +1 -0
  45. package/dist/src/filter-bar/menu/create-form-field-select-multiple.js +2 -0
  46. package/dist/src/filter-bar/menu/create-form-field-select-multiple.js.map +1 -0
  47. package/dist/src/filter-bar/menu/create-form-field-select.js +2 -0
  48. package/dist/src/filter-bar/menu/create-form-field-select.js.map +1 -0
  49. package/dist/src/filter-bar/menu/create-form-field-string.js +2 -0
  50. package/dist/src/filter-bar/menu/create-form-field-string.js.map +1 -0
  51. package/dist/src/filter-bar/menu/create.js +2 -0
  52. package/dist/src/filter-bar/menu/create.js.map +1 -0
  53. package/dist/src/form/create.form-base.js +1 -1
  54. package/dist/src/form/create.text-editor.js +1 -1
  55. package/dist/src/form/helpers.js +1 -1
  56. package/dist/src/table/create.table.js +1 -1
  57. package/dist/src/table/csv-export-helper.js +2 -0
  58. package/dist/src/table/csv-export-helper.js.map +1 -0
  59. package/dist/src/table/custom.export-button.js +2 -0
  60. package/dist/src/table/custom.export-button.js.map +1 -0
  61. package/dist/src/table/dino.js +1 -1
  62. package/dist/src/table/dino.js.map +1 -1
  63. package/dist/src/table/toolbar-pannel.js +1 -1
  64. package/dist/src/table/toolbar-pannel.js.map +1 -1
  65. package/dist/src/utils/helpers.js +1 -1
  66. package/dist/types/data-surface/index.create.d.ts +22 -6
  67. package/dist/types/data-surface/index.dino.d.ts +2 -0
  68. package/dist/types/data-surface/types.d.ts +5 -0
  69. package/dist/types/data-surface/view-grid/hooks.d.ts +6 -0
  70. package/dist/types/data-surface/view-grid/styleds.d.ts +2 -0
  71. package/dist/types/data-surface/view-grid/types.d.ts +17 -3
  72. package/dist/types/data-surface/view-list/hooks.d.ts +6 -0
  73. package/dist/types/data-surface/view-list/styled.d.ts +2 -0
  74. package/dist/types/data-surface/view-list/types.d.ts +17 -3
  75. package/dist/types/data-surface/view-switch-transition.d.ts +1 -1
  76. package/dist/types/filter-bar/components/chip-viewer.d.ts +1 -3
  77. package/dist/types/filter-bar/components/popper-custom.d.ts +2 -2
  78. package/dist/types/filter-bar/components/ui.units.d.ts +22 -0
  79. package/dist/types/filter-bar/convert-to-graphql.d.ts +8 -0
  80. package/dist/types/filter-bar/index.create.d.ts +1 -1
  81. package/dist/types/filter-bar/index.d.ts +1 -0
  82. package/dist/types/filter-bar/index.dino.d.ts +8 -1
  83. package/dist/types/filter-bar/local-filter-builder.d.ts +39 -0
  84. package/dist/types/filter-bar/menu/create-form-field-select-multiple.d.ts +13 -0
  85. package/dist/types/filter-bar/menu/create-form-field-select.d.ts +17 -0
  86. package/dist/types/filter-bar/menu/create-form-field-string.d.ts +10 -0
  87. package/dist/types/filter-bar/{components/filter-menu.d.ts → menu/create.d.ts} +2 -2
  88. package/dist/types/filter-bar/{components/filter-menu.types.d.ts → menu/types.d.ts} +6 -1
  89. package/dist/types/table/csv-export-helper.d.ts +20 -0
  90. package/dist/types/table/custom.export-button.d.ts +8 -0
  91. package/dist/types/table/dino.d.ts +1 -0
  92. package/dist/types/table/index.d.ts +1 -0
  93. package/dist/types/table/toolbar-pannel.d.ts +2 -0
  94. package/package.json +1 -1
  95. package/dist/src/filter-bar/components/filter-menu.js +0 -2
  96. package/dist/src/filter-bar/components/filter-menu.js.map +0 -1
  97. package/dist/src/filter-bar/components/filter-menu.units.js +0 -2
  98. package/dist/src/filter-bar/components/filter-menu.units.js.map +0 -1
  99. package/dist/types/filter-bar/components/filter-menu.units.d.ts +0 -18
  100. /package/dist/types/filter-bar/components/{units.d.ts → icons.d.ts} +0 -0
@@ -1,5 +1,5 @@
1
1
  import type { ComponentType } from 'react';
2
- import type { RenderStrategyRule, TGetterId } from '../types';
2
+ import type { DataSurfaceFeatureMode, RenderStrategyRule, TGetterId } from '../types';
3
3
  export type TGridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
4
4
  export type TGridSizes = Partial<Record<TGridSize, number>>;
5
5
  /**
@@ -12,6 +12,14 @@ export interface IViewGridItemProps<T> {
12
12
  /** Zero-based position of this item in the data array. */
13
13
  index: number;
14
14
  }
15
+ export interface IViewGridNormalOptions {
16
+ /** When true, the grid will automatically adjust its height to fit all items. @default false */
17
+ autoHeight?: boolean;
18
+ }
19
+ export interface IViewGridVirtualizedOptions {
20
+ /** Number of extra rows rendered outside the viewport as a buffer when using virtualized rendering. @default 6 */
21
+ overscan?: number;
22
+ }
15
23
  export interface IViewGridBase<T> {
16
24
  /** Spacing between grid items in pixels. @default 8 */
17
25
  spacing?: number;
@@ -26,8 +34,10 @@ export interface IViewGridBase<T> {
26
34
  */
27
35
  renderStrategy?: RenderStrategyRule;
28
36
  Component?: ComponentType<IViewGridItemProps<T>>;
29
- /** Number of extra rows rendered outside the viewport as a buffer when using virtualized rendering. @default 4 */
30
- overscan?: number;
37
+ /** Options specific to normal rendering strategy. */
38
+ normalOptions?: IViewGridNormalOptions;
39
+ /** Options specific to virtualized rendering strategy. */
40
+ virtualizedOptions?: IViewGridVirtualizedOptions;
31
41
  }
32
42
  export interface IViewGridConfig<T> extends IViewGridBase<T> {
33
43
  getterId: TGetterId<T>;
@@ -36,4 +46,8 @@ export interface IViewGridProps<T> extends IViewGridBase<T> {
36
46
  value: T[];
37
47
  /** Called when user scrolls near the bottom of the list. Use this to trigger pagination or infinity load. */
38
48
  onNearEnd?: () => void;
49
+ /** Feature mode for the data surface. */
50
+ featureMode?: DataSurfaceFeatureMode;
51
+ /** When this value changes, the scroll position resets to top (virtualized mode only). */
52
+ scrollResetToken?: unknown;
39
53
  }
@@ -7,6 +7,12 @@ export declare function useMergedConfig<T>(config: IViewListConfig<T>, props: IV
7
7
  rowHeight: number;
8
8
  cellPadding: string;
9
9
  rowSpacing: number;
10
+ normalOptions: {
11
+ autoHeight: boolean;
12
+ } & import("./types").IViewListNormalOptions;
13
+ virtualizedOptions: {
14
+ overscan: number;
15
+ } & import("./types").IViewListVirtualizedOptions;
10
16
  rootStyle: CSSProperties;
11
17
  };
12
18
  /**
@@ -2,7 +2,9 @@
2
2
  export declare const VIEW_LIST_ROW_SPACING_VAR = "--DinoViewList-rowSpacing";
3
3
  export declare const viewListClasses: {
4
4
  root: string;
5
+ normal: string;
5
6
  virtualized: string;
7
+ autoHeight: string;
6
8
  scrollContainer: string;
7
9
  table: string;
8
10
  tableHeader: string;
@@ -1,5 +1,5 @@
1
1
  import type { ReactNode } from 'react';
2
- import { RenderStrategyRule, TGetterId } from '../types';
2
+ import { DataSurfaceFeatureMode, RenderStrategyRule, TGetterId } from '../types';
3
3
  /**
4
4
  * Props received by the custom render function for each row in List view.
5
5
  * @template T - The shape of a single data row object.
@@ -64,6 +64,14 @@ export declare const ListDensity: {
64
64
  readonly comfortable: "comfortable";
65
65
  };
66
66
  export type ListDensity = keyof typeof ListDensity;
67
+ export interface IViewListNormalOptions {
68
+ /** When true, the list will automatically adjust its height to fit all items. @default false */
69
+ autoHeight?: boolean;
70
+ }
71
+ export interface IViewListVirtualizedOptions {
72
+ /** Number of extra rows rendered outside the viewport as a buffer when using virtualized rendering. @default 6 */
73
+ overscan?: number;
74
+ }
67
75
  /** Base configuration for List view. */
68
76
  export interface IViewListBase<T> {
69
77
  /** Custom render function for list rows. If not provided, a default row layout will be used. */
@@ -81,8 +89,10 @@ export interface IViewListBase<T> {
81
89
  renderStrategy?: RenderStrategyRule;
82
90
  /** Enable row selection with checkboxes. */
83
91
  selectable?: boolean;
84
- /** Number of extra rows rendered outside the viewport as a buffer when using virtualized rendering. @default 6 */
85
- overscan?: number;
92
+ /** Options specific to normal rendering strategy. */
93
+ normalOptions?: IViewListNormalOptions;
94
+ /** Options specific to virtualized rendering strategy. */
95
+ virtualizedOptions?: IViewListVirtualizedOptions;
86
96
  }
87
97
  /** Configuration for List view. */
88
98
  export interface IViewListConfig<T> extends IViewListBase<T> {
@@ -99,4 +109,8 @@ export interface IViewListProps<T> extends IViewListBase<T> {
99
109
  selectedIds?: (string | number)[];
100
110
  /** Callback when selection changes. */
101
111
  onSelectionChange?: (selectedIds: (string | number)[]) => void;
112
+ /** Feature mode for the data surface. */
113
+ featureMode?: DataSurfaceFeatureMode;
114
+ /** When this value changes, the scroll position resets to top (virtualized mode only). */
115
+ scrollResetToken?: unknown;
102
116
  }
@@ -1,5 +1,5 @@
1
1
  import type { FC, ReactNode, ComponentType } from 'react';
2
- import { TAnimationConfig } from './view-switch-transition.units';
2
+ import type { TAnimationConfig } from './view-switch-transition.units';
3
3
  type TViewSwitchTransitionConfig<T extends string = string> = {
4
4
  value: T;
5
5
  label?: string;
@@ -22,7 +22,5 @@ interface IChipViewerProps<T> {
22
22
  enableMinimalesticView?: boolean;
23
23
  sx?: SxProps<Theme>;
24
24
  }
25
- export declare function createChipViewers<T>(): {
26
- Group: FC<IChipViewerProps<T>>;
27
- };
25
+ export declare function createChipViewers<T>(): FC<IChipViewerProps<T>>;
28
26
  export {};
@@ -22,6 +22,6 @@ export interface PopperContentProps extends BoxProps {
22
22
  };
23
23
  }
24
24
  export declare const PopperContent: FC<PopperContentProps>;
25
- export declare const PopperFooter: FC<Required<PropsWithChildren>>;
26
- export declare const PopperBody: FC<Required<PropsWithChildren>>;
25
+ export declare const PopperFooter: FC<BoxProps & Required<PropsWithChildren>>;
26
+ export declare const PopperBody: FC<BoxProps & Required<PropsWithChildren>>;
27
27
  export {};
@@ -0,0 +1,22 @@
1
+ import type { FC } from 'react';
2
+ import type { ToggleButtonGroupProps } from '@mui/material';
3
+ import type { TLogic } from '../types';
4
+ interface IFilterMenuNoFieldProps {
5
+ onClose: () => void;
6
+ }
7
+ export declare const FilterMenuNoField: FC<IFilterMenuNoFieldProps>;
8
+ export declare const ButtonBack: import("@emotion/styled").StyledComponent<import("@mui/material").IconButtonOwnProps & Omit<import("@mui/material").ButtonBaseOwnProps, "classes"> & import("@mui/material/OverridableComponent").CommonProps & Omit<Omit<import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, "ref"> & {
9
+ ref?: ((instance: HTMLButtonElement | null) => void) | import("react").RefObject<HTMLButtonElement> | null | undefined;
10
+ }, "classes" | "className" | "style" | "children" | "sx" | "tabIndex" | "color" | "action" | "disabled" | "size" | "centerRipple" | "disableRipple" | "disableTouchRipple" | "focusRipple" | "focusVisibleClassName" | "LinkComponent" | "onFocusVisible" | "TouchRippleProps" | "touchRippleRef" | "disableFocusRipple" | "edge"> & {
11
+ component?: import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements> | undefined;
12
+ } & import("@mui/system").MUIStyledCommonProps<import("@mui/material").Theme>, {}, {}>;
13
+ export declare const ChipDark: import("@emotion/styled").StyledComponent<import("@mui/material").ChipOwnProps & import("@mui/material/OverridableComponent").CommonProps & Omit<Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
14
+ ref?: ((instance: HTMLDivElement | null) => void) | import("react").RefObject<HTMLDivElement> | null | undefined;
15
+ }, "classes" | "className" | "style" | "children" | "sx" | "variant" | "label" | "tabIndex" | "color" | "icon" | "disabled" | "size" | "clickable" | "avatar" | "deleteIcon" | "onDelete" | "skipFocusWhenDisabled"> & import("@mui/system").MUIStyledCommonProps<import("@mui/material").Theme>, {}, {}>;
16
+ export interface FilterLogicToggleProps {
17
+ value?: TLogic;
18
+ onChange?: (event: React.MouseEvent<HTMLElement>, value: TLogic) => void;
19
+ sx?: ToggleButtonGroupProps['sx'];
20
+ }
21
+ export declare const FilterLogicToggle: FC<FilterLogicToggleProps>;
22
+ export {};
@@ -11,7 +11,15 @@ type TFilterScopeFn<TSource, TTarget extends object> = (currentBuilder: RequestP
11
11
  */
12
12
  type TAutoMapFieldCustomFn<TSource, TTarget extends object> = (currentBuilder: RequestParam<TTarget>, value?: NonNullable<TFieldStore<TSource>>[keyof TFieldStore<TSource>], store?: TFieldStore<TSource>) => void;
13
13
  type TAutoMapConfig<TSource, TTarget extends object> = {
14
+ /**
15
+ * @en The target field in the GraphQL schema that this filter field maps to. If not provided, the source field name will be used as the target field.
16
+ * @vi Trường đích trong schema GraphQL mà trường filter này ánh xạ tới. Nếu không cung cấp, tên trường nguồn sẽ được sử dụng làm trường đích.
17
+ */
14
18
  targetfield?: keyof TTarget;
19
+ /**
20
+ * @en The operation to apply for the filter field. Can be 'equal' or 'contains'. @default 'contains'
21
+ * @vi Thao tác áp dụng cho trường filter. Có thể là 'equal' hoặc 'contains'. @default 'contains'
22
+ */
15
23
  operation?: 'equal' | 'contains';
16
24
  /**
17
25
  * @en
@@ -1,7 +1,7 @@
1
1
  import { BoxProps } from '@mui/material';
2
2
  import type { ComponentType, FC } from 'react';
3
3
  import type { TFilterState } from './types';
4
- import type { IFilterMenuConfig, IFilterMenuProps } from './components/filter-menu.types';
4
+ import type { IFilterMenuConfig, IFilterMenuProps } from './menu/types';
5
5
  import type { IFilterSortConfig, IFilterSortProps } from './components/filter-sort.types';
6
6
  import type { IFilterInputConfig, IFilterInputProps } from './components/filter-input.types';
7
7
  import type { IFilterSummaryConfig, IFilterSummaryProps } from './components/filter-summary.types';
@@ -2,4 +2,5 @@ export * from './types';
2
2
  export * from './index.create';
3
3
  export * from './components/hint-icon';
4
4
  export * from './convert-to-graphql';
5
+ export * from './local-filter-builder';
5
6
  export * from './index.dino';
@@ -1,8 +1,15 @@
1
- import { getFilterFromURL, isEmptyFilterState, isFilterStateEqual, removeNullValues, setFilterToURL } from './helpers';
2
1
  import { createFilterBar } from './index.create';
2
+ import { getFilterFromURL, isEmptyFilterState, isFilterStateEqual, removeNullValues, setFilterToURL } from './helpers';
3
+ import createFormFieldString from './menu/create-form-field-string';
4
+ import createFormFieldSelect from './menu/create-form-field-select';
5
+ import createFormFieldSelectMultiple from './menu/create-form-field-select-multiple';
3
6
  export declare class DinoFilterBar {
4
7
  createFilterBar: typeof createFilterBar;
5
8
  createConvertToGraphQL: <TSource extends Record<string, any>, TTarget extends object>(state: import("./types").TFilterState<TSource>) => import("./convert-to-graphql").TableFileterConverter<TSource, TTarget>;
9
+ createLocalFilterBuilder: <T>(data: T[], filterState: import("./types").TFilterState<T>) => import("./local-filter-builder").LocalFilterBuilder<T>;
10
+ createFormFieldString: typeof createFormFieldString;
11
+ createFormFieldSelect: typeof createFormFieldSelect;
12
+ createFormFieldSelectMultiple: typeof createFormFieldSelectMultiple;
6
13
  mapLogic: (logic?: import("./types").TLogic | undefined) => "Or" | "And";
7
14
  mapDirection: (direction?: import("./types").TDirection | undefined) => "ASC" | "DESC";
8
15
  isEmptyFilterState: typeof isEmptyFilterState;
@@ -0,0 +1,39 @@
1
+ import { TFilterState } from './types';
2
+ type TOperation = 'equal' | 'contains';
3
+ type TAutoMapField = {
4
+ /** The operation to use for filtering. 'equal' for exact match, 'contains' for partial match. @default 'contains' */
5
+ operation?: TOperation;
6
+ };
7
+ type TAutoMapFields<T> = Partial<Record<keyof T, TAutoMapField>>;
8
+ type TAutoMapConfigs<T> = {
9
+ fields?: TAutoMapFields<T>;
10
+ sortFields?: (keyof T)[];
11
+ quickSearchFields?: (keyof T)[];
12
+ };
13
+ export declare class LocalFilterBuilder<T> {
14
+ private operation;
15
+ private data;
16
+ private dataFiltered;
17
+ private filterState;
18
+ constructor(data: T[], filterState: TFilterState<T>);
19
+ private autoMapConfigs;
20
+ autoMap(configs?: TAutoMapConfigs<T>): this;
21
+ /** Register field filter config. Merged with autoMap.fields. */
22
+ filter(config?: {
23
+ fields?: TAutoMapFields<T>;
24
+ }): this;
25
+ private handleFilter;
26
+ /** Register quickSearch config. Merged with autoMap.quickSearchFields. */
27
+ quickSearch(config?: {
28
+ fields?: (keyof T)[];
29
+ }): this;
30
+ private handleQuickSearch;
31
+ /** Register sort config. Merged with autoMap.sortFields. */
32
+ sort(config?: {
33
+ sortFields?: (keyof T)[];
34
+ }): this;
35
+ private handleSort;
36
+ build(): T[];
37
+ }
38
+ export declare const createLocalFilterBuilder: <T>(data: T[], filterState: TFilterState<T>) => LocalFilterBuilder<T>;
39
+ export {};
@@ -0,0 +1,13 @@
1
+ import type { FC } from 'react';
2
+ import type { IFieldSelectOption } from './create-form-field-select';
3
+ import type { IFieldMenuConfig, IFilterMenuFormProps } from './types';
4
+ export interface IFormFieldSelectMultipleProps<T> extends IFilterMenuFormProps<T> {
5
+ }
6
+ export interface IFormFieldSelectMultipleParam<T> {
7
+ /** Optional configuration for the form field */
8
+ config?: IFieldMenuConfig<T>;
9
+ /** List of options for the select field */
10
+ options: IFieldSelectOption[];
11
+ }
12
+ declare function createFormFieldSelectMultiple<T>(params?: IFormFieldSelectMultipleParam<T>): FC<IFormFieldSelectMultipleProps<T>>;
13
+ export default createFormFieldSelectMultiple;
@@ -0,0 +1,17 @@
1
+ import { FC } from 'react';
2
+ import type { IFieldMenuConfig, IFilterMenuFormProps } from './types';
3
+ import type { TFieldValid } from '../types';
4
+ export interface IFormFieldSelectProps<T> extends IFilterMenuFormProps<T> {
5
+ }
6
+ export interface IFieldSelectOption {
7
+ value: TFieldValid;
8
+ label?: string;
9
+ }
10
+ export interface IFormFieldSelectParams<T> {
11
+ /** Optional configuration for the form field */
12
+ config?: IFieldMenuConfig<T>;
13
+ /** List of options for the select field */
14
+ options: IFieldSelectOption[];
15
+ }
16
+ declare function createFormFieldSelect<T>(params: IFormFieldSelectParams<T>): FC<IFormFieldSelectProps<T>>;
17
+ export default createFormFieldSelect;
@@ -0,0 +1,10 @@
1
+ import type { FC } from 'react';
2
+ import type { IFieldMenuConfig, IFilterMenuFormProps } from './types';
3
+ export interface IFormFieldStringProps<T> extends IFilterMenuFormProps<T> {
4
+ }
5
+ export interface IFormFieldStringParam<T> {
6
+ /** Optional configuration for the form field */
7
+ config?: IFieldMenuConfig<T>;
8
+ }
9
+ declare function createFormFieldString<T>(params?: IFormFieldStringParam<T>): FC<IFormFieldStringProps<T>>;
10
+ export default createFormFieldString;
@@ -1,6 +1,6 @@
1
1
  import type { FC } from 'react';
2
- import type { IFilterMenuProps } from './filter-menu.types';
3
- import type { IFilterMenuConfig } from './filter-menu.types';
2
+ import type { IFilterMenuProps } from './types';
3
+ import type { IFilterMenuConfig } from './types';
4
4
  export declare function createFilterMenu<T>(config: IFilterMenuConfig<T>): FC<IFilterMenuProps<T>>;
5
5
  export declare const filterMenuClasses: {
6
6
  root: string;
@@ -7,10 +7,12 @@ export interface IFieldMenuConfig<T> {
7
7
  label?: string;
8
8
  singleValue?: boolean;
9
9
  /** Default form component for the field is `String` */
10
- form?: ComponentType<IFilterMenuFormProps<T>>;
10
+ FormComponent?: ComponentType<IFilterMenuFormProps<T>>;
11
11
  }
12
12
  export type TFieldMenuConfigs<T> = Partial<Record<TFieldType<T>, Omit<IFieldMenuConfig<T>, 'field'>>>;
13
+ export type TFieldMenuConfigsInternal<T> = Partial<Record<TFieldType<T>, IFieldMenuConfig<T>>>;
13
14
  export interface IFilterMenuFormProps<T> {
15
+ currentConfig: IFieldMenuConfig<T>;
14
16
  isLoading?: boolean;
15
17
  value?: TFieldValue;
16
18
  validator?: FormValidator<Partial<TFieldModelValid<T>>>;
@@ -32,6 +34,9 @@ export interface IFilterMenuConfig<T> extends IFilterMenuSlots {
32
34
  /** Option to enable or disable quick search @default true */
33
35
  enableQuickSearch?: boolean;
34
36
  }
37
+ export interface IFilterMenuConfigInternal<T> extends Omit<IFilterMenuConfig<T>, 'fields'> {
38
+ fields: TFieldMenuConfigsInternal<T>;
39
+ }
35
40
  export interface IFilterMenuProps<T> {
36
41
  slots?: IFilterMenuSlots;
37
42
  }
@@ -0,0 +1,20 @@
1
+ export interface IExportCsvOptionsModel<T = any> {
2
+ fileName: string;
3
+ fields: (keyof T)[];
4
+ utf8WithBom?: boolean;
5
+ }
6
+ export declare const generateExportCsvOptions: <T>(options: IExportCsvOptionsModel<T>) => IExportCsvOptionsModel<T>;
7
+ export declare class CsvExportHelper {
8
+ /**
9
+ * Export data to CSV with UTF-8 BOM encoding support
10
+ */
11
+ static exportToCsv<T = any>(data: T[], options: IExportCsvOptionsModel<T>): void;
12
+ /**
13
+ * Format field value for CSV export
14
+ */
15
+ private static formatFieldValue;
16
+ /**
17
+ * Escape CSV value by wrapping in quotes if needed
18
+ */
19
+ private static escapeCSVValue;
20
+ }
@@ -0,0 +1,8 @@
1
+ import { FC } from 'react';
2
+ import { ButtonProps } from '@mui/material';
3
+ import { IExportCsvOptionsModel } from './csv-export-helper';
4
+ export interface CustomExportButtonProps extends Omit<ButtonProps, 'onClick'> {
5
+ csvOptions?: IExportCsvOptionsModel;
6
+ tooltip?: string;
7
+ }
8
+ export declare const CustomExportButton: FC<CustomExportButtonProps>;
@@ -22,6 +22,7 @@ interface FormatterDateOptions {
22
22
  declare class DinoTableBase {
23
23
  createTable: typeof CreateTable;
24
24
  createActionRow: typeof CreateActionRow;
25
+ generateExportCsvOptions: <T>(options: import("./csv-export-helper").IExportCsvOptionsModel<T>) => import("./csv-export-helper").IExportCsvOptionsModel<T>;
25
26
  setUrlQuery: <TModel>(tableInfo: Partial<import("./types").ITableQueryParams<TModel>>, defaultValue: import("./types").ITableQueryParams<TModel>) => void;
26
27
  getUrlQuery: <TModel>(defaultValue: import("./types").ITableQueryParams<TModel>) => import("./types").ITableQueryParams<TModel>;
27
28
  mapContext: (context: (context: import("./context").ITableBaseContext) => ReactNode) => import("react/jsx-runtime").JSX.Element;
@@ -5,3 +5,4 @@ export * from './create.table';
5
5
  export { default as DinoTable } from './dino';
6
6
  export { dinoTableClasses } from './helpers';
7
7
  export type { IStatusCellConfig } from './ui.units';
8
+ export type { IExportCsvOptionsModel } from './csv-export-helper';
@@ -1,6 +1,7 @@
1
1
  import React, { Component } from 'react';
2
2
  import { BoxProps } from '@mui/material';
3
3
  import { IBreadcrumbConfig } from '../components';
4
+ import { IExportCsvOptionsModel } from './csv-export-helper';
4
5
  export interface IToolbarPannelToolbarConfig {
5
6
  columns?: boolean;
6
7
  filters?: boolean;
@@ -21,6 +22,7 @@ export interface IToolbarPannelProps {
21
22
  aboveAction?: React.ReactNode;
22
23
  actionWrapProps?: BoxProps;
23
24
  sx?: BoxProps['sx'];
25
+ exportCsvOptions?: IExportCsvOptionsModel;
24
26
  }
25
27
  declare class ToolbarPannel extends Component<React.PropsWithChildren<IToolbarPannelProps>> {
26
28
  render(): import("react/jsx-runtime").JSX.Element;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dinocollab-core",
3
- "version": "2.2.10",
3
+ "version": "2.2.13",
4
4
  "description": "Dinocollab core - libraries for building collaborative applications with React 18",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -1,2 +0,0 @@
1
- import{defineProperty as e,objectWithoutProperties as n,objectSpread2 as r,slicedToArray as t,asyncToGenerator as i,regenerator as o}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as l,jsxs as a}from"react/jsx-runtime";import{useState as u,useContext as c,useMemo as s,createRef as d}from"react";import{styled as m,Box as f,MenuList as p,Tooltip as v,IconButton as h,Badge as b,MenuItem as g,Typography as y,Button as j}from"@mui/material";import k from"@mui/icons-material/FilterList";import F from"@mui/material/ClickAwayListener";import{KeySpecial as I}from"../types.js";import{useFilterActions as C}from"../hooks.js";import{FilterBarContext as x}from"../index.context.js";import{mapSpecialLabel as S,mapSpecialTexts as w}from"../helpers.js";import{SingleRuleValidate as P,FormValidator as R}from"../../form/validator.js";import{PopperCustom as q,PopperContent as T,PopperFooter as A}from"./popper-custom.js";import{createFormFieldString as B,FilterMenuNoField as O}from"./filter-menu.units.js";var M=["fields","validation","enableQuickSearch"];function D(m){var f=L,p=function(e){var t=e.fields,i=e.validation,o=e.enableQuickSearch,l=void 0===o||o,a=n(e,M),u=I.quickSearch,c=r({},t);if(l){var s=c[u],d=null!=s&&s.label?s.label:S[u],m=Object.assign({},c[u],{field:u,label:d,singleValue:!0});c[u]=m}else delete c[u];var f=Object.keys(c),p=f.reduce(function(e,n){var t=c[n];return t?(e[n]=r(r({},t),{},{field:n}),e):e},{}),v=r({},i);return f.forEach(function(e){var n,r,t,i=v[e],o=null!==(n=null!==(r=null==i?void 0:i.label)&&void 0!==r?r:null===(t=c[e])||void 0===t?void 0:t.label)&&void 0!==n?n:e.toString();i?i.Rules.some(function(e){return e.rule===P.Required})||(i.label=o,i.Rules.push({rule:P.Required})):v[e]={Rules:[{rule:P.Required}],label:o}}),r(r({},a),{},{fields:p,validation:v,enableQuickSearch:l})}(m),D=function(n){return Object.keys(n.fields).reduce(function(r,t){var i,o=t,l=null===(i=n.validation)||void 0===i?void 0:i[o];return l&&(r[o]=new R(e({},o,l))),r},{})}(p),V=function(e){var n=e.fields;return Object.keys(n).reduce(function(e,r){var t,i=r,o=n[i];return o&&(e[i]=null!==(t=o.form)&&void 0!==t?t:B(o)),e},{})}(p),z=m.quickSearchHint;return function(e){var n=d(),S=u(null),P=t(S,2),R=P[0],B=P[1],M=Boolean(R),L=c(x),E=C(L),H=u(null),_=t(H,2),G=_[0],W=_[1],J=s(function(){var n=m.popperProps,r=m.rootProps;return Object.assign({},{popperProps:n,rootProps:r},e.slots)},[m,e.slots]),K=function(){B(null),setTimeout(function(){W(null)},300)},U=function(){E.clearAllFilters(),K()},X=function(){var e=i(o().m(function e(n,r,t){return o().w(function(e){for(;;)switch(e.n){case 0:if(r){e.n=1;break}return e.a(2);case 1:null!=t&&t.singleValue?E.replaceFilter(n,r,{logic:r.logic}):E.upsertManyFilter(n,r,{logic:r.logic});case 2:return e.a(2)}},e)}));return function(n,r,t){return e.apply(this,arguments)}}(),Y=s(function(){var e=Object.values(p.fields);return Array.from(e)},[p.fields]),Z=E.getTotalCount(),$="".concat(Z," Filter").concat(1!==Z?"s":"");return l(F,{onClickAway:K,children:a(N,r(r({className:f.root},J.rootProps),{},{children:[l(v,{title:$,arrow:!0,placement:"top",children:l(h,{size:"small",ref:n,onClick:function(){W(null),B(n.current)},children:l(b,{badgeContent:Z,color:"primary",invisible:0===Z,children:l(k,{fontSize:"small"})})})}),l(q,r(r({open:M,anchorEl:R,placement:"bottom",transition:!0,disablePortal:!0},J.popperProps),{},{children:function(){if(0===Y.length)return l(O,{onClose:K});if(G){var e,n=V[G];if(!n)return null;var r=null===(e=L.filterState.storeFilter)||void 0===e?void 0:e[G];return l(n,{value:r,isLoading:L.isLoading,onRemove:E.removeFilterByFieldValue,validator:D[G],onSubmit:X,onClose:K,onRemoveField:function(e){return E.removeFilter(e)},onBack:function(){return W(null)}})}return a(T,{title:"Filter by",onClose:K,children:[l(Q,{className:f.menu,children:Y.map(function(e){var n,r,t=e.field.toString();if(!t)return null;var i=E.getFieldInfo(e.field),o=null!==(n=null==i?void 0:i.values.join(", "))&&void 0!==n?n:"",u=i?i.values.length:0,c=u>0?" (".concat(u,")"):"",s=null!==(r=e.label)&&void 0!==r?r:t.toString(),d=u>0?"Filter by ".concat(s,": ").concat(o):void 0;if(e.field===I.quickSearch){var m=w.qsTooltip;d="function"==typeof z?z(m):null!=z?z:m}return l(g,{className:f.menuItem,sx:{justifyContent:"space-between"},onClick:function(){return n=e.field,void W(n);var n},children:l(v,{title:d,placement:"right",arrow:!0,children:a("div",{className:f.menuItemInner,children:[l(y,{variant:"body2",children:s}),l(y,{variant:"caption",sx:{ml:1,color:"text.secondary"},children:c})]})})},t)})}),l(A,{children:l(j,{color:"error",disabled:0===Z,onClick:U,children:"Clear All"})})]})}()}))]}))})}}var L={root:"DinoFilterMenu-root",menu:"DinoFilterMenu-menu",menuItem:"DinoFilterMenu-menuItem",menuItemInner:"DinoFilterMenu-menuItemInner"},N=m(f)(e({},"&.".concat(L.root),{display:"inline-flex",justifyContent:"center",alignItems:"center",flex:"0 0 auto"})),Q=m(p)(e(e({},".".concat(L.menuItem),{paddingTop:0,paddingBottom:0}),".".concat(L.menuItemInner),{display:"flex",justifyContent:"space-between",alignItems:"center",width:"100%",gap:"4px",paddingTop:"6px",paddingBottom:"6px"}));export{D as createFilterMenu,L as filterMenuClasses};
2
- //# sourceMappingURL=filter-menu.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"filter-menu.js","sources":["../../../../src/filter-bar/components/filter-menu.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { createRef, useContext, useMemo, useState } from 'react'\r\nimport { Badge, Box, Button, IconButton, MenuItem, MenuList, styled, Tooltip, Typography } from '@mui/material'\r\nimport FilterListIcon from '@mui/icons-material/FilterList'\r\nimport ClickAwayListener from '@mui/material/ClickAwayListener'\r\nimport { KeySpecial } from '../types'\r\nimport { useFilterActions } from '../hooks'\r\nimport { FilterBarContext } from '../index.context'\r\nimport { mapSpecialLabel, mapSpecialTexts } from '../helpers'\r\nimport { FormValidator, SingleRuleValidate } from '../../form/validator'\r\nimport { PopperContent, PopperCustom, PopperFooter } from './popper-custom'\r\nimport { createFormFieldString, FilterMenuNoField } from './filter-menu.units'\r\n// types\r\nimport type { FC } from 'react'\r\nimport type { IFilterBarContext } from '../index.context'\r\nimport type { TFieldModelValid, TFieldType, TFieldValue } from '../types'\r\nimport type { IConfigValue, IFormValidatorConfig } from '../../form/validator'\r\nimport type { IFilterMenuProps, IFilterMenuSlots, TFieldMenuConfigs } from './filter-menu.types'\r\nimport type { IFieldMenuConfig, IFilterMenuConfig, IFilterMenuFormProps } from './filter-menu.types'\r\n\r\nfunction generateValidatorMap<T>(config: IFilterMenuConfig<T>) {\r\n const keys = Object.keys(config.fields) as TFieldType<T>[]\r\n const validateMaps = keys.reduce(\r\n (acc, key) => {\r\n const fieldKey = key as TFieldType<T>\r\n const fieldConfig = config.validation?.[fieldKey]\r\n if (fieldConfig) {\r\n acc[fieldKey] = new FormValidator({ [fieldKey]: fieldConfig } as IFormValidatorConfig<Partial<TFieldModelValid<T>>>)\r\n }\r\n return acc\r\n },\r\n {} as Record<TFieldType<T>, FormValidator<Partial<TFieldModelValid<T>>>>\r\n )\r\n return validateMaps\r\n}\r\n\r\nfunction generateFormInputMap<T>(config: IFilterMenuConfig<T>) {\r\n const { fields } = config\r\n const keys = Object.keys(fields) as TFieldType<T>[]\r\n const formInputMaps = keys.reduce(\r\n (acc, key) => {\r\n const fieldKey = key as TFieldType<T>\r\n const fieldConfig = fields[fieldKey] as IFieldMenuConfig<T>\r\n if (fieldConfig) acc[fieldKey] = fieldConfig.form ?? createFormFieldString(fieldConfig)\r\n return acc\r\n },\r\n {} as Record<TFieldType<T>, React.ComponentType<IFilterMenuFormProps<T>>>\r\n )\r\n return formInputMaps\r\n}\r\n\r\nfunction generateConfigs<T>(config: IFilterMenuConfig<T>): IFilterMenuConfig<T> {\r\n const { fields, validation, enableQuickSearch = true, ...rest } = config\r\n const qsKey = KeySpecial.quickSearch\r\n\r\n // Merge quick search field if enabled\r\n const mergedFields: TFieldMenuConfigs<T> = { ...fields }\r\n if (enableQuickSearch) {\r\n const item = mergedFields[qsKey]\r\n const label = item?.label ? item.label : mapSpecialLabel[qsKey]\r\n const temp = Object.assign({}, mergedFields[qsKey], { field: qsKey, label, singleValue: true })\r\n mergedFields[qsKey] = temp\r\n } else {\r\n delete mergedFields[qsKey]\r\n }\r\n\r\n const keys = Object.keys(mergedFields) as TFieldType<T>[]\r\n const finalFields = keys.reduce<TFieldMenuConfigs<T>>((acc, key) => {\r\n const fieldConfig = mergedFields[key]\r\n if (!fieldConfig) return acc\r\n acc[key] = { ...fieldConfig, field: key }\r\n return acc\r\n }, {} as TFieldMenuConfigs<T>)\r\n\r\n // Merge validation config with default required rule\r\n const mergedValidation: IFormValidatorConfig<Partial<TFieldModelValid<T>>> = { ...validation }\r\n keys.forEach((key) => {\r\n const item: IConfigValue<Partial<TFieldModelValid<T>>> | undefined = mergedValidation[key]\r\n const label = item?.label ?? mergedFields[key]?.label ?? key.toString()\r\n if (!item) {\r\n mergedValidation[key] = { Rules: [{ rule: SingleRuleValidate.Required }], label }\r\n } else if (!item.Rules.some((r) => r.rule === SingleRuleValidate.Required)) {\r\n item.label = label\r\n item.Rules.push({ rule: SingleRuleValidate.Required })\r\n }\r\n })\r\n\r\n return { ...rest, fields: finalFields, validation: mergedValidation, enableQuickSearch }\r\n}\r\n\r\nexport function createFilterMenu<T>(config: IFilterMenuConfig<T>) {\r\n const classes = filterMenuClasses\r\n const mergedConfigs = generateConfigs(config)\r\n const validateMaps = generateValidatorMap(mergedConfigs)\r\n const formInputMaps = generateFormInputMap(mergedConfigs)\r\n const quickSearchHint = config.quickSearchHint\r\n\r\n // Component\r\n const FilterMenu: FC<IFilterMenuProps<T>> = (props) => {\r\n const refButton = createRef<HTMLButtonElement>()\r\n\r\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null)\r\n const isOpen = Boolean(anchorEl)\r\n\r\n const context = useContext(FilterBarContext) as IFilterBarContext<T>\r\n const filterActions = useFilterActions<T>(context)\r\n\r\n const [fieldSelected, setFieldSelected] = useState<TFieldType<T> | null>(null)\r\n\r\n const mergedSlots = useMemo<IFilterMenuSlots>(() => {\r\n const { popperProps, rootProps } = config\r\n return Object.assign({}, { popperProps, rootProps }, props.slots)\r\n }, [config, props.slots])\r\n\r\n const handleClose = () => {\r\n setAnchorEl(null)\r\n setTimeout(() => {\r\n setFieldSelected(null)\r\n }, 300)\r\n }\r\n\r\n const handleOpen = () => {\r\n setFieldSelected(null)\r\n setAnchorEl(refButton.current)\r\n }\r\n\r\n const handleMenuItemClick = (field: TFieldType<T>) => {\r\n setFieldSelected(field)\r\n }\r\n\r\n const handleClearAll = () => {\r\n filterActions.clearAllFilters()\r\n handleClose()\r\n }\r\n\r\n const handleSubmit = async (key: TFieldType<T>, value?: TFieldValue, config?: IFieldMenuConfig<T>) => {\r\n if (!value) return\r\n if (config?.singleValue) {\r\n filterActions.replaceFilter(key, value, { logic: value.logic })\r\n } else {\r\n filterActions.upsertManyFilter(key, value, { logic: value.logic })\r\n }\r\n }\r\n\r\n const data = useMemo(() => {\r\n const keys = Object.values(mergedConfigs.fields)\r\n return Array.from(keys) as IFieldMenuConfig<T>[]\r\n }, [mergedConfigs.fields])\r\n\r\n const renderContent = () => {\r\n if (data.length === 0) {\r\n return <FilterMenuNoField onClose={handleClose} />\r\n }\r\n\r\n if (fieldSelected) {\r\n const FormComponent = formInputMaps[fieldSelected] as React.ComponentType<IFilterMenuFormProps<T>>\r\n if (!FormComponent) return null\r\n const value = context.filterState.storeFilter?.[fieldSelected]\r\n return (\r\n <FormComponent\r\n value={value}\r\n isLoading={context.isLoading}\r\n onRemove={filterActions.removeFilterByFieldValue}\r\n validator={validateMaps[fieldSelected]}\r\n onSubmit={handleSubmit}\r\n onClose={handleClose}\r\n onRemoveField={(f) => filterActions.removeFilter(f)}\r\n onBack={() => setFieldSelected(null)}\r\n />\r\n )\r\n }\r\n\r\n return (\r\n <PopperContent title='Filter by' onClose={handleClose}>\r\n <MenuListCustom className={classes.menu}>\r\n {data.map((item) => {\r\n const key = item.field.toString()\r\n if (!key) return null\r\n const info = filterActions.getFieldInfo(item.field)\r\n const note = info?.values.join(', ') ?? ''\r\n const fieldCount = info ? info.values.length : 0\r\n const suffix = fieldCount > 0 ? ` (${fieldCount})` : ''\r\n const label = item.label ?? key.toString()\r\n let tooltipTitle = fieldCount > 0 ? `Filter by ${label}: ${note}` : undefined\r\n if (item.field === KeySpecial.quickSearch) {\r\n const txt = mapSpecialTexts.qsTooltip\r\n tooltipTitle = typeof quickSearchHint === 'function' ? quickSearchHint(txt) : (quickSearchHint ?? txt)\r\n }\r\n return (\r\n <MenuItem\r\n key={key}\r\n className={classes.menuItem}\r\n sx={{ justifyContent: 'space-between' }}\r\n onClick={() => handleMenuItemClick(item.field)}\r\n >\r\n <Tooltip title={tooltipTitle} placement='right' arrow>\r\n <div className={classes.menuItemInner}>\r\n <Typography variant='body2'>{label}</Typography>\r\n <Typography variant='caption' sx={{ ml: 1, color: 'text.secondary' }}>\r\n {suffix}\r\n </Typography>\r\n </div>\r\n </Tooltip>\r\n </MenuItem>\r\n )\r\n })}\r\n </MenuListCustom>\r\n <PopperFooter>\r\n <Button color='error' disabled={filterCount === 0} onClick={handleClearAll}>\r\n Clear All\r\n </Button>\r\n </PopperFooter>\r\n </PopperContent>\r\n )\r\n }\r\n\r\n const filterCount = filterActions.getTotalCount()\r\n const iconTitle = `${filterCount} Filter${filterCount !== 1 ? 's' : ''}`\r\n return (\r\n <ClickAwayListener onClickAway={handleClose}>\r\n <FilterInputStyled className={classes.root} {...mergedSlots.rootProps}>\r\n <Tooltip title={iconTitle} arrow placement='top'>\r\n <IconButton size='small' ref={refButton} onClick={handleOpen}>\r\n <Badge badgeContent={filterCount} color='primary' invisible={filterCount === 0}>\r\n <FilterListIcon fontSize='small' />\r\n </Badge>\r\n </IconButton>\r\n </Tooltip>\r\n <PopperCustom open={isOpen} anchorEl={anchorEl} placement='bottom' transition disablePortal {...mergedSlots.popperProps}>\r\n {renderContent()}\r\n </PopperCustom>\r\n </FilterInputStyled>\r\n </ClickAwayListener>\r\n )\r\n }\r\n return FilterMenu\r\n}\r\n\r\n// styles\r\nexport const filterMenuClasses = {\r\n root: 'DinoFilterMenu-root',\r\n input: 'DinoFilterMenu-input',\r\n beforeInput: 'DinoFilterMenu-beforeInput',\r\n menu: 'DinoFilterMenu-menu',\r\n menuItem: 'DinoFilterMenu-menuItem',\r\n menuItemInner: 'DinoFilterMenu-menuItemInner'\r\n}\r\n\r\nconst FilterInputStyled = styled(Box)({\r\n [`&.${filterMenuClasses.root}`]: {\r\n display: 'inline-flex',\r\n justifyContent: 'center',\r\n alignItems: 'center',\r\n flex: '0 0 auto'\r\n }\r\n})\r\n\r\nconst MenuListCustom = styled(MenuList)({\r\n [`.${filterMenuClasses.menuItem}`]: {\r\n paddingTop: 0,\r\n paddingBottom: 0\r\n },\r\n [`.${filterMenuClasses.menuItemInner}`]: {\r\n display: 'flex',\r\n justifyContent: 'space-between',\r\n alignItems: 'center',\r\n width: '100%',\r\n gap: '4px',\r\n paddingTop: '6px',\r\n paddingBottom: '6px'\r\n }\r\n})\r\n"],"names":["createFilterMenu","config","classes","filterMenuClasses","mergedConfigs","fields","validation","_config$enableQuickSe","enableQuickSearch","rest","_objectWithoutProperties","_excluded","qsKey","KeySpecial","quickSearch","mergedFields","_objectSpread","item","label","mapSpecialLabel","temp","Object","assign","field","singleValue","keys","finalFields","reduce","acc","key","fieldConfig","mergedValidation","forEach","_ref","_item$label","_mergedFields$key","toString","Rules","some","r","rule","SingleRuleValidate","Required","push","generateConfigs","validateMaps","_config$validation","fieldKey","FormValidator","_defineProperty","generateValidatorMap","formInputMaps","_fieldConfig$form","form","createFormFieldString","generateFormInputMap","quickSearchHint","props","refButton","createRef","_useState","useState","_useState2","_slicedToArray","anchorEl","setAnchorEl","isOpen","Boolean","context","useContext","FilterBarContext","filterActions","useFilterActions","_useState3","_useState4","fieldSelected","setFieldSelected","mergedSlots","useMemo","popperProps","rootProps","slots","handleClose","setTimeout","handleClearAll","clearAllFilters","handleSubmit","_ref2","_asyncToGenerator","_regenerator","m","_callee","value","w","_context","n","a","replaceFilter","logic","upsertManyFilter","_x","_x2","_x3","apply","this","arguments","data","values","Array","from","filterCount","getTotalCount","iconTitle","concat","_jsx","ClickAwayListener","onClickAway","children","_jsxs","FilterInputStyled","className","root","Tooltip","title","arrow","placement","IconButton","size","ref","onClick","current","Badge","badgeContent","color","invisible","FilterListIcon","fontSize","PopperCustom","open","transition","disablePortal","length","FilterMenuNoField","onClose","_context$filterState$","FormComponent","filterState","storeFilter","isLoading","onRemove","removeFilterByFieldValue","validator","onSubmit","onRemoveField","f","removeFilter","onBack","PopperContent","MenuListCustom","menu","map","_info$values$join","_item$label2","info","getFieldInfo","note","join","fieldCount","suffix","tooltipTitle","undefined","txt","mapSpecialTexts","qsTooltip","MenuItem","menuItem","sx","justifyContent","menuItemInner","Typography","variant","ml","PopperFooter","Button","disabled","renderContent","styled","Box","display","alignItems","flex","MenuList","paddingTop","paddingBottom","width","gap"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{objectWithoutProperties as e,objectSpread2 as l,slicedToArray as o}from"../../../_virtual/_rollupPluginBabelHelpers.js";import{jsx as r,jsxs as i}from"react/jsx-runtime";import{useState as t,useMemo as n,createRef as a}from"react";import{styled as c,Tooltip as s,IconButton as u,alpha as d,Chip as m,ToggleButtonGroup as v,TextField as p,Button as f,Box as h,Typography as b,ToggleButton as g}from"@mui/material";import x from"@mui/icons-material/ChevronLeft";import{createChipViewers as C}from"./chip-viewer.js";import{PopperContent as y,PopperBody as k,PopperFooter as z}from"./popper-custom.js";import{getErrorMessage as A,convertFormDataToJson as j}from"../../form/helpers.js";var w=["children"],S=function(e){var l=e.onClose;return r(y,{title:"Filter by",onClose:l,children:r(b,{variant:"body2",sx:{p:2,textAlign:"center"},children:"No field to filter"})})},B=c(function(o){var i=o.children,t=e(o,w);return r(s,{title:"Back",placement:"top",arrow:!0,children:r(u,l(l({},t),{},{children:i||r(x,{fontSize:"small"})}))})})(function(e){var l=e.theme;return{color:l.palette.common.white,transition:l.transitions.create("color"),"&:hover":{color:l.palette.primary.light,backgroundColor:d(l.palette.common.white,.1)}}}),T=c(m)(function(e){var l=e.theme;return{backgroundColor:"dark"===l.palette.mode?l.palette.grey[900]:l.palette.grey[800],color:l.palette.common.white,border:"1px solid ".concat(d(l.palette.common.white,.1)),height:20,fontSize:"0.75rem","& .MuiChip-label":{color:l.palette.common.white}}}),F=function(e){return i(M,{size:"small",value:e.value||"and",exclusive:!0,onChange:function(l,o){o&&e.onChange&&e.onChange(l,o)},sx:e.sx,children:[r(g,{size:"small",value:"and","aria-label":"and logic",children:"AND"}),r(g,{size:"small",value:"or","aria-label":"or logic",children:"OR"})]})},M=c(v)({"& .MuiToggleButton-root":{color:"#fff",borderColor:"rgba(255, 255, 255, 0.3)",fontSize:"0.65rem",fontWeight:600,lineHeight:1,minWidth:"40px",padding:"6px 8px","&.Mui-selected":{backgroundColor:"#1976d2",color:"#fff","&:hover":{backgroundColor:"#1565c0"}},"&:hover":{backgroundColor:"rgba(255, 255, 255, 0.08)"}}});function R(e){var l=C();return function(c){var s,u=a(),d=c.value,m=void 0===d?{values:[],logic:"or"}:d,v=t(m.logic),b=o(v,2),g=b[0],x=b[1],C=null!==(s=null==e?void 0:e.label)&&void 0!==s?s:e.field.toString(),w=t({}),S=o(w,2),M=S[0],R=S[1],D=function(l){c.onSubmit(e.field,l,e)},H=A(M,e.field),I=n(function(){var l=Array.isArray(m.values)?m.values:[m.values];return{field:e.field,items:l.map(function(e){return{value:e}})}},[e.field,m]),L=[];return c.isLoading&&L.push("disabled"),r(W,{className:L.join(" "),onSubmit:function(l){var o;l.preventDefault();var r=new FormData(l.currentTarget),i=j(r),t=null===(o=c.validator)||void 0===o?void 0:o.run(i);if(R(t||{}),!t||0===Object.keys(t).length){var n=Array.isArray(i[e.field])?i[e.field]:[i[e.field]];D({values:n,logic:g}),u.current&&(u.current.blur(),u.current.value="")}},noValidate:!0,children:i(y,{title:"Filter by ".concat(C),onClose:c.onClose,slots:{beforeTitle:r(B,{size:"small",onClick:c.onBack}),afterTitle:e.singleValue?r(T,{sx:{ml:1.5},size:"small",label:"Last value only"}):!m.values||m.values.length<2?null:r(F,{sx:{ml:1},value:g,onChange:function(e,l){return function(e){x(e);var l={values:m.values,logic:e};D(l)}(l)}})},children:[i(k,{children:[r(l.Group,{sx:{mb:1,borderBottom:"none!important"},label:"Applied",placement:"horizontal",enableMinimalesticView:!0,value:I,onRemove:c.onRemove}),r(p,{inputRef:u,autoFocus:!0,name:e.field.toString(),size:"small",fullWidth:!0,placeholder:"Enter value",error:H.error,helperText:H.message,sx:{".MuiInputBase-root":{minHeight:"42px"}}})]}),i(z,{children:[r(f,{size:"small",color:"error",variant:"text",name:"action",value:"clear",disabled:!m.values||0===m.values.length,onClick:function(){var l;null===(l=c.onRemoveField)||void 0===l||l.call(c,e.field)},children:"Clear All"}),r(h,{sx:{flex:1}}),r(f,{size:"small",color:"inherit",variant:"text",name:"action",value:"cancel",onClick:c.onClose,children:"Cancel"}),r(f,{size:"small",type:"submit",color:"primary",variant:"contained",name:"action",value:"ok",children:"Apply"})]})]})})}}var W=c("form")({position:"relative","&::after":{content:'""',display:"block",position:"absolute",inset:0,backgroundColor:"rgba(0, 0, 0, 0.2)",filter:"blur(2px)",zIndex:-1,opacity:0,transition:"opacity 0.3s",visibility:"hidden"},"&.disabled":{pointerEvents:"none","&::after":{zIndex:1,opacity:1,visibility:"visible"}}});export{F as FilterLogicToggle,S as FilterMenuNoField,R as createFormFieldString};
2
- //# sourceMappingURL=filter-menu.units.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"filter-menu.units.js","sources":["../../../../src/filter-bar/components/filter-menu.units.tsx"],"sourcesContent":["// Copyright (c) 2024-present, Dinocollab Technologies, Inc. and its affiliates. All rights reserved.\r\n\r\n// imports\r\nimport { createRef, useMemo, useState } from 'react'\r\nimport { alpha, Box, Button, Chip, IconButton, styled, TextField, ToggleButton, ToggleButtonGroup, Tooltip, Typography } from '@mui/material'\r\nimport ChevronLeftIcon from '@mui/icons-material/ChevronLeft'\r\nimport { createChipViewers } from './chip-viewer'\r\nimport { PopperBody, PopperContent, PopperFooter } from './popper-custom'\r\nimport { convertFormDataToJson, getErrorMessage } from '../../form/helpers'\r\n// types\r\nimport type { FC } from 'react'\r\nimport type { IconButtonProps, ToggleButtonGroupProps } from '@mui/material'\r\nimport type { TChipViewerGroup } from './chip-viewer'\r\nimport type { IPartialError } from '../../form/validator'\r\nimport type { IFieldMenuConfig, IFilterMenuFormProps } from './filter-menu.types'\r\nimport type { TFieldModelValid, TFieldValid, TFieldValue, TLogic } from '../types'\r\n\r\ninterface IFilterMenuNoFieldProps {\r\n onClose: () => void\r\n}\r\n\r\nexport const FilterMenuNoField: FC<IFilterMenuNoFieldProps> = ({ onClose }) => (\r\n <PopperContent title='Filter by' onClose={onClose}>\r\n <Typography variant='body2' sx={{ p: 2, textAlign: 'center' }}>\r\n No field to filter\r\n </Typography>\r\n </PopperContent>\r\n)\r\n\r\nconst ButtonBack = styled(({ children, ...props }: IconButtonProps) => (\r\n <Tooltip title='Back' placement='top' arrow>\r\n <IconButton {...props}>{children || <ChevronLeftIcon fontSize='small' />}</IconButton>\r\n </Tooltip>\r\n))(({ theme }) => ({\r\n color: theme.palette.common.white,\r\n transition: theme.transitions.create('color'),\r\n '&:hover': {\r\n color: theme.palette.primary.light,\r\n backgroundColor: alpha(theme.palette.common.white, 0.1)\r\n }\r\n}))\r\n\r\nconst ChipDark = styled(Chip)(({ theme }) => ({\r\n backgroundColor: theme.palette.mode === 'dark' ? theme.palette.grey[900] : theme.palette.grey[800],\r\n color: theme.palette.common.white,\r\n border: `1px solid ${alpha(theme.palette.common.white, 0.1)}`,\r\n height: 20,\r\n fontSize: '0.75rem',\r\n '& .MuiChip-label': {\r\n color: theme.palette.common.white\r\n }\r\n}))\r\n\r\nexport interface FilterLogicToggleProps {\r\n value?: TLogic\r\n onChange?: (event: React.MouseEvent<HTMLElement>, value: TLogic) => void\r\n sx?: ToggleButtonGroupProps['sx']\r\n}\r\n\r\nexport const FilterLogicToggle: FC<FilterLogicToggleProps> = (props) => {\r\n const handleChange = (event: React.MouseEvent<HTMLElement>, newValue: string | null) => {\r\n if (newValue && props.onChange) {\r\n props.onChange(event, newValue as TLogic)\r\n }\r\n }\r\n\r\n return (\r\n <ToggleButtonGroupCustom size='small' value={props.value || 'and'} exclusive onChange={handleChange} sx={props.sx}>\r\n <ToggleButton size='small' value='and' aria-label='and logic'>\r\n AND\r\n </ToggleButton>\r\n <ToggleButton size='small' value='or' aria-label='or logic'>\r\n OR\r\n </ToggleButton>\r\n </ToggleButtonGroupCustom>\r\n )\r\n}\r\n\r\nconst ToggleButtonGroupCustom = styled(ToggleButtonGroup)({\r\n '& .MuiToggleButton-root': {\r\n color: '#fff',\r\n borderColor: 'rgba(255, 255, 255, 0.3)',\r\n fontSize: '0.65rem',\r\n fontWeight: 600,\r\n lineHeight: 1,\r\n minWidth: '40px',\r\n padding: '6px 8px',\r\n '&.Mui-selected': {\r\n backgroundColor: '#1976d2',\r\n color: '#fff',\r\n '&:hover': { backgroundColor: '#1565c0' }\r\n },\r\n '&:hover': { backgroundColor: 'rgba(255, 255, 255, 0.08)' }\r\n }\r\n})\r\n\r\nexport interface IFormFieldStringProps<T> extends IFilterMenuFormProps<T> {}\r\n\r\nexport function createFormFieldString<T>(config: IFieldMenuConfig<T>) {\r\n const ChipViewers = createChipViewers<T>()\r\n\r\n const FormFieldString: FC<IFormFieldStringProps<T>> = (props) => {\r\n const refInput = createRef<HTMLInputElement>()\r\n const { value = { values: [], logic: 'or' } } = props\r\n const [filterLogic, setFilterLogic] = useState<TLogic>(value.logic!)\r\n\r\n const label = config?.label ?? config.field.toString()\r\n\r\n const [errorData, setErrorData] = useState<IPartialError<TFieldModelValid<T>>>({})\r\n\r\n const handleSubmit = (newValue: TFieldValue) => {\r\n props.onSubmit(config.field, newValue, config)\r\n }\r\n\r\n const handleSubmitForm = (event: React.FormEvent<HTMLFormElement>) => {\r\n event.preventDefault()\r\n const formData = new FormData(event.currentTarget)\r\n const obj = convertFormDataToJson<TFieldModelValid<T>>(formData)\r\n let errorData = props.validator?.run(obj) as IPartialError<TFieldModelValid<T>>\r\n\r\n setErrorData(errorData || {})\r\n\r\n if (!errorData || Object.keys(errorData).length === 0) {\r\n const newValues = (Array.isArray(obj[config.field]) ? obj[config.field] : [obj[config.field]]) as TFieldValid[]\r\n const newValue: TFieldValue = { values: newValues, logic: filterLogic }\r\n handleSubmit(newValue)\r\n\r\n if (refInput.current) {\r\n refInput.current.blur()\r\n refInput.current.value = ''\r\n }\r\n\r\n // const action = (event.nativeEvent as any).submitter?.value\r\n // if (action === 'ok') // Clear input value\r\n }\r\n }\r\n\r\n const error = getErrorMessage(errorData, config.field)\r\n\r\n const filterViewerValue = useMemo<TChipViewerGroup<T>>(() => {\r\n const items = Array.isArray(value.values) ? value.values : [value.values]\r\n return { field: config.field, items: items.map((v) => ({ value: v })) }\r\n }, [config.field, value])\r\n\r\n const handleChandeLogic = (newLogic: TLogic) => {\r\n setFilterLogic(newLogic)\r\n const newValue: TFieldValue = { values: value.values, logic: newLogic }\r\n handleSubmit(newValue)\r\n }\r\n\r\n const handleClearAll = () => {\r\n props.onRemoveField?.(config.field)\r\n }\r\n\r\n const renderAfterTitle = () => {\r\n if (config.singleValue) return <ChipDark sx={{ ml: 1.5 }} size='small' label='Last value only' />\r\n if (!value.values || value.values.length < 2) return null\r\n return <FilterLogicToggle sx={{ ml: 1 }} value={filterLogic} onChange={(_, nVal) => handleChandeLogic(nVal)} />\r\n }\r\n\r\n const rootClasse: string[] = []\r\n if (props.isLoading) rootClasse.push('disabled')\r\n\r\n return (\r\n <FormCustom className={rootClasse.join(' ')} onSubmit={handleSubmitForm} noValidate>\r\n <PopperContent\r\n title={`Filter by ${label}`}\r\n onClose={props.onClose}\r\n slots={{\r\n beforeTitle: <ButtonBack size='small' onClick={props.onBack} />,\r\n afterTitle: renderAfterTitle()\r\n }}\r\n >\r\n <PopperBody>\r\n <ChipViewers.Group\r\n sx={{ mb: 1, borderBottom: 'none!important' }}\r\n label='Applied'\r\n placement='horizontal'\r\n enableMinimalesticView\r\n value={filterViewerValue}\r\n onRemove={props.onRemove}\r\n />\r\n <TextField\r\n inputRef={refInput}\r\n autoFocus\r\n name={config.field.toString()}\r\n size='small'\r\n fullWidth\r\n placeholder='Enter value'\r\n error={error.error}\r\n helperText={error.message}\r\n sx={{ '.MuiInputBase-root': { minHeight: '42px' } }}\r\n />\r\n </PopperBody>\r\n <PopperFooter>\r\n <Button\r\n size='small'\r\n color='error'\r\n variant='text'\r\n name='action'\r\n value='clear'\r\n disabled={!value.values || value.values.length === 0}\r\n onClick={handleClearAll}\r\n >\r\n Clear All\r\n </Button>\r\n <Box sx={{ flex: 1 }} />\r\n <Button size='small' color='inherit' variant='text' name='action' value='cancel' onClick={props.onClose}>\r\n Cancel\r\n </Button>\r\n <Button size='small' type='submit' color='primary' variant='contained' name='action' value='ok'>\r\n Apply\r\n </Button>\r\n </PopperFooter>\r\n </PopperContent>\r\n </FormCustom>\r\n )\r\n }\r\n\r\n return FormFieldString\r\n}\r\n\r\nconst FormCustom = styled('form')({\r\n position: 'relative',\r\n '&::after': {\r\n content: '\"\"',\r\n display: 'block',\r\n position: 'absolute',\r\n inset: 0, // top: 0, left: 0, right: 0, bottom: 0\r\n backgroundColor: 'rgba(0, 0, 0, 0.2)',\r\n filter: 'blur(2px)',\r\n zIndex: -1,\r\n opacity: 0,\r\n transition: 'opacity 0.3s',\r\n visibility: 'hidden'\r\n },\r\n '&.disabled': {\r\n pointerEvents: 'none',\r\n '&::after': {\r\n zIndex: 1,\r\n opacity: 1,\r\n visibility: 'visible'\r\n }\r\n }\r\n})\r\n"],"names":["FilterMenuNoField","_ref","onClose","_jsx","PopperContent","title","Typography","variant","sx","p","textAlign","children","ButtonBack","styled","_ref2","props","_objectWithoutProperties","_excluded","Tooltip","placement","arrow","IconButton","_objectSpread","ChevronLeftIcon","fontSize","_ref3","theme","color","palette","common","white","transition","transitions","create","primary","light","backgroundColor","alpha","ChipDark","Chip","_ref4","mode","grey","border","concat","height","FilterLogicToggle","_jsxs","ToggleButtonGroupCustom","size","value","exclusive","onChange","event","newValue","ToggleButton","ToggleButtonGroup","borderColor","fontWeight","lineHeight","minWidth","padding","createFormFieldString","config","ChipViewers","createChipViewers","_config$label","refInput","createRef","_props$value","values","logic","_useState","useState","_useState2","_slicedToArray","filterLogic","setFilterLogic","label","field","toString","_useState3","_useState4","errorData","setErrorData","handleSubmit","onSubmit","error","getErrorMessage","filterViewerValue","useMemo","items","Array","isArray","map","v","rootClasse","isLoading","push","FormCustom","className","join","_props$validator","preventDefault","formData","FormData","currentTarget","obj","convertFormDataToJson","validator","run","Object","keys","length","newValues","current","blur","noValidate","slots","beforeTitle","onClick","onBack","afterTitle","singleValue","ml","_","nVal","newLogic","handleChandeLogic","PopperBody","Group","mb","borderBottom","enableMinimalesticView","onRemove","TextField","inputRef","autoFocus","name","fullWidth","placeholder","helperText","message","minHeight","PopperFooter","Button","disabled","_props$onRemoveField","onRemoveField","call","Box","flex","type","position","content","display","inset","filter","zIndex","opacity","visibility","pointerEvents"],"mappings":"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"}
@@ -1,18 +0,0 @@
1
- import type { FC } from 'react';
2
- import type { ToggleButtonGroupProps } from '@mui/material';
3
- import type { IFieldMenuConfig, IFilterMenuFormProps } from './filter-menu.types';
4
- import type { TLogic } from '../types';
5
- interface IFilterMenuNoFieldProps {
6
- onClose: () => void;
7
- }
8
- export declare const FilterMenuNoField: FC<IFilterMenuNoFieldProps>;
9
- export interface FilterLogicToggleProps {
10
- value?: TLogic;
11
- onChange?: (event: React.MouseEvent<HTMLElement>, value: TLogic) => void;
12
- sx?: ToggleButtonGroupProps['sx'];
13
- }
14
- export declare const FilterLogicToggle: FC<FilterLogicToggleProps>;
15
- export interface IFormFieldStringProps<T> extends IFilterMenuFormProps<T> {
16
- }
17
- export declare function createFormFieldString<T>(config: IFieldMenuConfig<T>): FC<IFormFieldStringProps<T>>;
18
- export {};