@monolith-forensics/monolith-ui 1.1.91 → 1.2.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.
- package/dist/DateInput/DateInput.d.ts +2 -1
- package/dist/DateInput/DateInput.js +9 -6
- package/dist/DropDownMenu/DropDownMenu.js +41 -35
- package/dist/Input/Input.d.ts +1 -3
- package/dist/Input/Input.js +5 -4
- package/dist/Loader/Loader.js +0 -1
- package/dist/MonolithUIProvider/MonolithUIProvider.d.ts +131 -7
- package/dist/MonolithUIProvider/MonolithUIProvider.js +4 -4
- package/dist/MonolithUIProvider/index.d.ts +1 -1
- package/dist/MonolithUIProvider/index.js +1 -1
- package/dist/QueryFilter/DefaultOperators.d.ts +77 -0
- package/dist/QueryFilter/DefaultOperators.js +22 -0
- package/dist/QueryFilter/QueryFilter.d.ts +5 -0
- package/dist/QueryFilter/QueryFilter.js +224 -0
- package/dist/QueryFilter/index.d.ts +3 -0
- package/dist/QueryFilter/index.js +3 -0
- package/dist/QueryFilter/types.d.ts +51 -0
- package/dist/QueryFilter/useQueryFilter.d.ts +3 -0
- package/dist/QueryFilter/useQueryFilter.js +36 -0
- package/dist/{NewTable → Table}/ActionCell.js +4 -3
- package/dist/{NewTable → Table}/ColumnResizer.js +1 -1
- package/dist/Table/LoadingIndicator.d.ts +4 -0
- package/dist/Table/LoadingIndicator.js +76 -0
- package/dist/Table/RenderSkeleton.d.ts +6 -0
- package/dist/Table/RenderSkeleton.js +25 -0
- package/dist/{NewTable → Table}/StateStorage.d.ts +9 -0
- package/dist/{NewTable → Table}/StateStorage.js +26 -0
- package/dist/Table/Table.d.ts +2 -92
- package/dist/Table/Table.js +73 -679
- package/dist/{NewTable → Table}/TableComponents.js +27 -22
- package/dist/{NewTable → Table}/TableDefaults.d.ts +5 -0
- package/dist/{NewTable → Table}/TableDefaults.js +6 -1
- package/dist/{NewTable → Table}/TableHeader.js +9 -8
- package/dist/Table/TableMenu/InfoBadge.d.ts +10 -0
- package/dist/Table/TableMenu/InfoBadge.js +23 -0
- package/dist/Table/TableMenu/TableMenu.d.ts +2 -0
- package/dist/Table/TableMenu/TableMenu.js +108 -0
- package/dist/Table/TableMenu/index.d.ts +2 -0
- package/dist/Table/TableMenu/index.js +2 -0
- package/dist/{NewTable → Table}/TableProvider.d.ts +1 -1
- package/dist/{NewTable → Table}/TableProvider.js +199 -30
- package/dist/{NewTable → Table}/TableRow.js +1 -1
- package/dist/{NewTable → Table}/VirtualIzedRows.d.ts +0 -1
- package/dist/{NewTable → Table}/VirtualIzedRows.js +6 -6
- package/dist/{NewTable → Table}/enums.d.ts +4 -0
- package/dist/{NewTable → Table}/enums.js +5 -0
- package/dist/Table/index.d.ts +4 -3
- package/dist/Table/index.js +4 -2
- package/dist/{NewTable → Table}/types.d.ts +77 -1
- package/dist/Table/types.js +1 -0
- package/dist/{NewTable → Table}/useTable.js +1 -1
- package/dist/TextInput/TextInput.d.ts +2 -3
- package/dist/TextInput/TextInput.js +5 -4
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/useDelayedBoolean.d.ts +2 -0
- package/dist/hooks/useDelayedBoolean.js +17 -0
- package/dist/index.d.ts +3 -5
- package/dist/index.js +3 -3
- package/dist/theme/getTheme.d.ts +3 -0
- package/dist/theme/getTheme.js +13 -0
- package/dist/theme/index.d.ts +3 -168
- package/dist/theme/index.js +3 -12
- package/dist/theme/variants.d.ts +7 -172
- package/dist/theme/variants.js +6 -5
- package/package.json +2 -2
- package/dist/NewTable/Table.d.ts +0 -3
- package/dist/NewTable/Table.js +0 -83
- package/dist/NewTable/index.d.ts +0 -4
- package/dist/NewTable/index.js +0 -4
- /package/dist/{NewTable → QueryFilter}/types.js +0 -0
- /package/dist/{NewTable → Table}/ActionButton.d.ts +0 -0
- /package/dist/{NewTable → Table}/ActionButton.js +0 -0
- /package/dist/{NewTable → Table}/ActionCell.d.ts +0 -0
- /package/dist/{NewTable → Table}/Column.d.ts +0 -0
- /package/dist/{NewTable → Table}/Column.js +0 -0
- /package/dist/{NewTable → Table}/ColumnResizer.d.ts +0 -0
- /package/dist/{NewTable → Table}/SelectionCell.d.ts +0 -0
- /package/dist/{NewTable → Table}/SelectionCell.js +0 -0
- /package/dist/{NewTable → Table}/StaticRows.d.ts +0 -0
- /package/dist/{NewTable → Table}/StaticRows.js +0 -0
- /package/dist/{NewTable → Table}/TableComponents.d.ts +0 -0
- /package/dist/{NewTable → Table}/TableHeader.d.ts +0 -0
- /package/dist/{NewTable → Table}/TableRow.d.ts +0 -0
- /package/dist/{NewTable → Table}/Utils/index.d.ts +0 -0
- /package/dist/{NewTable → Table}/Utils/index.js +0 -0
- /package/dist/{NewTable → Table}/Utils/resizeHandler.d.ts +0 -0
- /package/dist/{NewTable → Table}/Utils/resizeHandler.js +0 -0
- /package/dist/{NewTable → Table}/Utils/resolveColumnReorder.d.ts +0 -0
- /package/dist/{NewTable → Table}/Utils/resolveColumnReorder.js +0 -0
- /package/dist/{NewTable → Table}/Utils/resolveColumnResize.d.ts +0 -0
- /package/dist/{NewTable → Table}/Utils/resolveColumnResize.js +0 -0
- /package/dist/{NewTable → Table}/Utils/syncColumnState.d.ts +0 -0
- /package/dist/{NewTable → Table}/Utils/syncColumnState.js +0 -0
- /package/dist/{NewTable → Table}/useTable.d.ts +0 -0
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import styled, { useTheme } from "styled-components";
|
|
3
|
+
import { XIcon } from "lucide-react";
|
|
4
|
+
import DropDownMenu from "../DropDownMenu";
|
|
5
|
+
import Button from "../Button";
|
|
6
|
+
import DefaultOperators from "./DefaultOperators";
|
|
7
|
+
import Input from "../Input";
|
|
8
|
+
import DateInput from "../DateInput";
|
|
9
|
+
import { useDebouncedCallback } from "use-debounce";
|
|
10
|
+
const StyledContainer = styled.div `
|
|
11
|
+
display: flex;
|
|
12
|
+
flex-direction: row;
|
|
13
|
+
gap: 1.5px;
|
|
14
|
+
`;
|
|
15
|
+
const RuleContainer = styled(StyledContainer) `
|
|
16
|
+
// first child
|
|
17
|
+
& > *:first-child {
|
|
18
|
+
border-radius: 5px 0 0 5px;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// last child
|
|
22
|
+
& > *:last-child {
|
|
23
|
+
border-radius: 0 5px 5px 0;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
button.mfui-DropDownMenu {
|
|
27
|
+
border-color: transparent;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
button.mfui-DropDownMenu:hover {
|
|
31
|
+
border-color: ${({ theme }) => theme.palette.primary.main};
|
|
32
|
+
}
|
|
33
|
+
`;
|
|
34
|
+
const FilterContainer = styled(StyledContainer) `
|
|
35
|
+
gap: 10px;
|
|
36
|
+
flex-wrap: wrap;
|
|
37
|
+
`;
|
|
38
|
+
const StyledButton = styled(Button) `
|
|
39
|
+
border-radius: 0;
|
|
40
|
+
font-size: 11px;
|
|
41
|
+
height: 20px;
|
|
42
|
+
|
|
43
|
+
padding: 3px 5px;
|
|
44
|
+
|
|
45
|
+
&:hover {
|
|
46
|
+
background-color: ${({ theme }) => theme.palette.action.hover};
|
|
47
|
+
border-color: ${({ theme }) => theme.palette.primary.main};
|
|
48
|
+
}
|
|
49
|
+
`;
|
|
50
|
+
const BaseLabel = styled.div `
|
|
51
|
+
user-select: none;
|
|
52
|
+
|
|
53
|
+
display: flex;
|
|
54
|
+
flex-direction: row;
|
|
55
|
+
align-items: center;
|
|
56
|
+
|
|
57
|
+
border: 1px solid transparent;
|
|
58
|
+
|
|
59
|
+
background-color: ${({ theme }) => theme.palette.background.secondary};
|
|
60
|
+
|
|
61
|
+
font-size: 11px;
|
|
62
|
+
|
|
63
|
+
height: 20px;
|
|
64
|
+
|
|
65
|
+
padding: 2px 4px;
|
|
66
|
+
|
|
67
|
+
overflow: hidden;
|
|
68
|
+
white-space: nowrap;
|
|
69
|
+
text-overflow: ellipsis;
|
|
70
|
+
|
|
71
|
+
cursor: pointer;
|
|
72
|
+
|
|
73
|
+
&:hover {
|
|
74
|
+
background-color: ${({ theme }) => theme.palette.action.hover};
|
|
75
|
+
}
|
|
76
|
+
`;
|
|
77
|
+
const FieldLabel = styled(BaseLabel) ``;
|
|
78
|
+
const ValueLabel = styled(BaseLabel) ``;
|
|
79
|
+
const StyledInput = styled(Input) `
|
|
80
|
+
height: 20px;
|
|
81
|
+
min-height: 20px;
|
|
82
|
+
width: 100px;
|
|
83
|
+
border-radius: 0;
|
|
84
|
+
font-size: 11px;
|
|
85
|
+
padding: 2px 4px;
|
|
86
|
+
|
|
87
|
+
border-color: transparent;
|
|
88
|
+
background-color: ${({ theme }) => theme.palette.background.secondary};
|
|
89
|
+
|
|
90
|
+
&:hover {
|
|
91
|
+
border-color: ${({ theme }) => theme.palette.primary.main};
|
|
92
|
+
}
|
|
93
|
+
`;
|
|
94
|
+
const StyledDateInput = styled(DateInput) `
|
|
95
|
+
height: 20px;
|
|
96
|
+
// width: 100px;
|
|
97
|
+
font-size: 11px;
|
|
98
|
+
border-radius: 0;
|
|
99
|
+
border-color: transparent;
|
|
100
|
+
background-color: ${({ theme }) => theme.palette.background.secondary};
|
|
101
|
+
`;
|
|
102
|
+
const ValueEditor = ({ rule, inputType, filterDef, onChange }) => {
|
|
103
|
+
var _a, _b, _c;
|
|
104
|
+
const theme = useTheme();
|
|
105
|
+
const handleInputChange = useDebouncedCallback((e) => {
|
|
106
|
+
const value = e.target.value;
|
|
107
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(Object.assign(Object.assign({}, rule), { value }));
|
|
108
|
+
}, 250);
|
|
109
|
+
const handleMultiSelectChange = useDebouncedCallback((selected) => {
|
|
110
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(Object.assign(Object.assign({}, rule), { value: selected.map((s) => s.value) }));
|
|
111
|
+
}, 100);
|
|
112
|
+
const handleTimestampChange = useDebouncedCallback((timestamp) => {
|
|
113
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(Object.assign(Object.assign({}, rule), { value: timestamp }));
|
|
114
|
+
}, 100);
|
|
115
|
+
switch (inputType) {
|
|
116
|
+
case "text":
|
|
117
|
+
return (_jsx(StyledInput, { placeholder: "Enter Value...", defaultValue: rule.value, onChange: handleInputChange }));
|
|
118
|
+
case "number":
|
|
119
|
+
return (_jsx(StyledInput, { type: "number", placeholder: "Enter Value...", defaultValue: rule.value, onChange: handleInputChange }));
|
|
120
|
+
case "date":
|
|
121
|
+
return (_jsx(StyledDateInput, { arrow: true, enableCalendar: true, format: "YYYY-MM-DD", defaultValue: rule.value, onChange: handleTimestampChange }));
|
|
122
|
+
case "datetime":
|
|
123
|
+
return (_jsx(StyledDateInput, { arrow: true, enableCalendar: true, format: "YYYY-MM-DD HH:mm:ss", defaultValue: rule.value, onChange: handleTimestampChange }));
|
|
124
|
+
case "multiselect":
|
|
125
|
+
let display = Array.isArray(rule.value) && rule.value.length > 0
|
|
126
|
+
? ((_b = (_a = filterDef === null || filterDef === void 0 ? void 0 : filterDef.selectOptions) === null || _a === void 0 ? void 0 : _a.filter((o) => rule.value.includes(o.value))) === null || _b === void 0 ? void 0 : _b.map((o) => o.label).join(", ")) || "Select Value"
|
|
127
|
+
: "Select Value";
|
|
128
|
+
if (Array.isArray(rule.value) && rule.value.length > 1) {
|
|
129
|
+
display = `${rule.value.length} ${(filterDef === null || filterDef === void 0 ? void 0 : filterDef.pluralLabel) || "Values"}`;
|
|
130
|
+
}
|
|
131
|
+
if (!(filterDef === null || filterDef === void 0 ? void 0 : filterDef.selectOptions)) {
|
|
132
|
+
return _jsx(FieldLabel, { children: "Loading..." });
|
|
133
|
+
}
|
|
134
|
+
return (_jsx(DropDownMenu, { data: (filterDef === null || filterDef === void 0 ? void 0 : filterDef.selectOptions) || [], variant: "outlined", multiselect: true, searchable: true, buttonProps: {
|
|
135
|
+
size: "xxs",
|
|
136
|
+
style: {
|
|
137
|
+
padding: "0px 4px",
|
|
138
|
+
height: 20,
|
|
139
|
+
borderRadius: 0,
|
|
140
|
+
backgroundColor: theme.palette.background.secondary,
|
|
141
|
+
fontSize: 11,
|
|
142
|
+
fontWeight: "normal",
|
|
143
|
+
color: !!rule.value &&
|
|
144
|
+
Array.isArray(rule.value) &&
|
|
145
|
+
rule.value.length > 0
|
|
146
|
+
? theme.palette.text.primary
|
|
147
|
+
: theme.palette.text.secondary,
|
|
148
|
+
},
|
|
149
|
+
}, dropDownProps: {
|
|
150
|
+
style: { width: 175, maxWidth: 400 },
|
|
151
|
+
}, defaultValue: (_c = filterDef === null || filterDef === void 0 ? void 0 : filterDef.selectOptions) === null || _c === void 0 ? void 0 : _c.filter((o) => Array.isArray(rule.value) &&
|
|
152
|
+
!!rule.value.find((v) => v == o.value)), onChange: handleMultiSelectChange, children: display }));
|
|
153
|
+
default:
|
|
154
|
+
return (_jsx(StyledInput, { placeholder: "Enter Value...", onChange: handleInputChange }));
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
const ValueSelector = ({ rule, inputType, filterDef, onChange, }) => {
|
|
158
|
+
const isBetween = rule.operator.value.toLowerCase().includes("between");
|
|
159
|
+
const handleValueChange = (e) => {
|
|
160
|
+
const currentValue = rule.value;
|
|
161
|
+
if (isBetween) {
|
|
162
|
+
const newValue = [e.value];
|
|
163
|
+
if (Array.isArray(currentValue) && currentValue.length === 2) {
|
|
164
|
+
newValue.push(currentValue[1]);
|
|
165
|
+
}
|
|
166
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(Object.assign(Object.assign({}, rule), { value: newValue }));
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(Object.assign(Object.assign({}, rule), { value: e.value }));
|
|
170
|
+
};
|
|
171
|
+
const handleSecondaryValueChange = (e) => {
|
|
172
|
+
const currentValue = rule.value;
|
|
173
|
+
if (isBetween) {
|
|
174
|
+
// current value already an array?
|
|
175
|
+
if (Array.isArray(currentValue)) {
|
|
176
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(Object.assign(Object.assign({}, rule), { value: [currentValue[0], e.value] }));
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
const newValue = [currentValue, e.value];
|
|
180
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(Object.assign(Object.assign({}, rule), { value: newValue }));
|
|
181
|
+
}
|
|
182
|
+
return;
|
|
183
|
+
};
|
|
184
|
+
return (_jsxs(_Fragment, { children: [_jsx(ValueEditor, { rule: rule, inputType: inputType, filterDef: filterDef, onChange: handleValueChange }), isBetween && (_jsxs(_Fragment, { children: [_jsx(FieldLabel, { children: "and" }), _jsx(ValueEditor, { rule: rule, inputType: inputType, onChange: handleSecondaryValueChange })] }))] }));
|
|
185
|
+
};
|
|
186
|
+
const CloseLabel = styled(StyledButton) `
|
|
187
|
+
padding: 2px;
|
|
188
|
+
|
|
189
|
+
color: ${({ theme }) => theme.palette.text.secondary};
|
|
190
|
+
|
|
191
|
+
&:hover {
|
|
192
|
+
border-color: ${({ theme }) => theme.palette.primary.main};
|
|
193
|
+
}
|
|
194
|
+
`;
|
|
195
|
+
const Rules = ({ rules = [], combinator, showCombinator, filterDefinitions, onDelete, onUpdate, }) => {
|
|
196
|
+
return (_jsxs(_Fragment, { children: [showCombinator === true && (_jsx(FieldLabel, { children: combinator.toUpperCase() })), rules.map((rule, index) => {
|
|
197
|
+
const filterDef = filterDefinitions.find((f) => f.dataField === rule.dataField);
|
|
198
|
+
const operatorOptions = (filterDef === null || filterDef === void 0 ? void 0 : filterDef.operators) || DefaultOperators;
|
|
199
|
+
const inputType = (filterDef === null || filterDef === void 0 ? void 0 : filterDef.inputType) || "text";
|
|
200
|
+
return (_jsxs(RuleContainer, { "data-rule-id": rule.id, children: [_jsx(FieldLabel, { children: rule.label }), _jsx(DropDownMenu, { variant: "outlined", data: operatorOptions,
|
|
201
|
+
// arrow={true}
|
|
202
|
+
buttonProps: {
|
|
203
|
+
title: "Select Operator",
|
|
204
|
+
variant: "contained",
|
|
205
|
+
size: "xxs",
|
|
206
|
+
style: {
|
|
207
|
+
fontWeight: "normal",
|
|
208
|
+
padding: "3px 5px",
|
|
209
|
+
height: 20,
|
|
210
|
+
borderRadius: 0,
|
|
211
|
+
},
|
|
212
|
+
}, onItemSelect: (e) => onUpdate(Object.assign(Object.assign({}, rule), { operator: e })), dropDownProps: {
|
|
213
|
+
style: { width: 175, maxWidth: 400 },
|
|
214
|
+
}, children: rule.operator.label }), _jsx(ValueSelector, { rule: rule, inputType: inputType, filterDef: filterDef, onChange: onUpdate }), _jsx(CloseLabel, { variant: "contained", size: "xxs", onClick: () => onDelete(rule), children: _jsx(XIcon, { size: 16 }) })] }, rule.id));
|
|
215
|
+
})] }));
|
|
216
|
+
};
|
|
217
|
+
const QueryFilter = ({ queryFilter, }) => {
|
|
218
|
+
var _a;
|
|
219
|
+
const { filter, filterDefinitions, showCombinator } = queryFilter;
|
|
220
|
+
if (((_a = filter === null || filter === void 0 ? void 0 : filter.rules) === null || _a === void 0 ? void 0 : _a.length) == 0)
|
|
221
|
+
return null;
|
|
222
|
+
return (_jsx(FilterContainer, { className: "mfui-QueryFilter", children: _jsx(Rules, { rules: filter.rules, combinator: filter.combinator, showCombinator: showCombinator, filterDefinitions: filterDefinitions, onDelete: (rule) => queryFilter.removeRule(rule.id), onUpdate: (rule) => queryFilter.updateRule(rule) }) }));
|
|
223
|
+
};
|
|
224
|
+
export default QueryFilter;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { DropDownItem } from "../DropDownMenu";
|
|
2
|
+
export interface UseQueryFilterProps {
|
|
3
|
+
defaultFilter?: Query | null;
|
|
4
|
+
filterDefinitions: FilterDefinition[];
|
|
5
|
+
showCombinator?: boolean;
|
|
6
|
+
onFilterChange?: (filter: any) => void;
|
|
7
|
+
}
|
|
8
|
+
export type QueryFilter = {
|
|
9
|
+
filter: Query;
|
|
10
|
+
filterDefinitions: FilterDefinition[];
|
|
11
|
+
showCombinator?: boolean;
|
|
12
|
+
addRule: (rule: Rule) => void;
|
|
13
|
+
removeRule: (id: string) => void;
|
|
14
|
+
updateRule: (rule: Rule) => void;
|
|
15
|
+
};
|
|
16
|
+
export type UseQueryFilter = (args: UseQueryFilterProps) => QueryFilter;
|
|
17
|
+
export type Combinator = "and" | "or";
|
|
18
|
+
export type Operator = {
|
|
19
|
+
label: string;
|
|
20
|
+
value: string;
|
|
21
|
+
};
|
|
22
|
+
export type EditorType = "text" | "select" | "checkbox" | "radio" | "multiselect" | "date" | "time" | null;
|
|
23
|
+
export interface FilterDefinition {
|
|
24
|
+
dataField: string;
|
|
25
|
+
label: string;
|
|
26
|
+
pluralLabel?: string;
|
|
27
|
+
operators?: Operator[];
|
|
28
|
+
inputType?: HTMLInputElement["type"];
|
|
29
|
+
placeholder?: string;
|
|
30
|
+
selectOptions?: DropDownItem[];
|
|
31
|
+
editorType?: EditorType;
|
|
32
|
+
query?: {
|
|
33
|
+
queryKey: (string | {
|
|
34
|
+
[x: string]: any;
|
|
35
|
+
})[];
|
|
36
|
+
queryFn: (args: any) => Promise<any>;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export interface Rule {
|
|
40
|
+
id?: string;
|
|
41
|
+
dataField: string;
|
|
42
|
+
value: string | string[] | number | number[];
|
|
43
|
+
operator: Operator;
|
|
44
|
+
label: string;
|
|
45
|
+
}
|
|
46
|
+
export interface RuleGroup {
|
|
47
|
+
rules: Rule[];
|
|
48
|
+
combinator: Combinator;
|
|
49
|
+
}
|
|
50
|
+
export interface Query extends RuleGroup {
|
|
51
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { useEffect, useState } from "react";
|
|
2
|
+
import shortUUID from "short-uuid";
|
|
3
|
+
const defaultFilter = {
|
|
4
|
+
combinator: "and",
|
|
5
|
+
rules: [],
|
|
6
|
+
};
|
|
7
|
+
const useQueryFilter = (args) => {
|
|
8
|
+
const [filter, setFilter] = useState((args === null || args === void 0 ? void 0 : args.defaultFilter) || defaultFilter);
|
|
9
|
+
const addRule = (rule) => {
|
|
10
|
+
if (!rule.id) {
|
|
11
|
+
rule.id = shortUUID.generate();
|
|
12
|
+
}
|
|
13
|
+
setFilter(Object.assign(Object.assign({}, filter), { rules: [...filter.rules, rule] }));
|
|
14
|
+
};
|
|
15
|
+
const removeRule = (id) => {
|
|
16
|
+
const rules = filter.rules.filter((r) => r.id !== id);
|
|
17
|
+
setFilter(Object.assign(Object.assign({}, filter), { rules }));
|
|
18
|
+
};
|
|
19
|
+
const updateRule = (rule) => {
|
|
20
|
+
const rules = filter.rules.map((r) => (r.id === rule.id ? rule : r));
|
|
21
|
+
setFilter(Object.assign(Object.assign({}, filter), { rules }));
|
|
22
|
+
};
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
var _a;
|
|
25
|
+
(_a = args === null || args === void 0 ? void 0 : args.onFilterChange) === null || _a === void 0 ? void 0 : _a.call(args, filter);
|
|
26
|
+
}, [filter]);
|
|
27
|
+
return {
|
|
28
|
+
filter,
|
|
29
|
+
filterDefinitions: args.filterDefinitions,
|
|
30
|
+
showCombinator: args.showCombinator,
|
|
31
|
+
addRule,
|
|
32
|
+
removeRule,
|
|
33
|
+
updateRule,
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
export default useQueryFilter;
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import styled from "styled-components";
|
|
2
2
|
import { TD } from "./TableComponents";
|
|
3
|
+
import TableDefaults from "./TableDefaults";
|
|
3
4
|
const ActionCell = styled(TD) `
|
|
4
|
-
width:
|
|
5
|
-
min-width:
|
|
6
|
-
max-width:
|
|
5
|
+
width: ${TableDefaults.actionCell.width}px;
|
|
6
|
+
min-width: ${TableDefaults.actionCell.minWidth}px;
|
|
7
|
+
max-width: ${TableDefaults.actionCell.maxWidth}px;
|
|
7
8
|
|
|
8
9
|
display: flex;
|
|
9
10
|
justify-content: center;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import styled from "styled-components";
|
|
3
|
+
import Loader from "../Loader";
|
|
4
|
+
import { useEffect, useState } from "react";
|
|
5
|
+
const StyledContainer = styled.div `
|
|
6
|
+
position: absolute;
|
|
7
|
+
top: 20%;
|
|
8
|
+
left: 50%;
|
|
9
|
+
transform: translate(-50%, -20%);
|
|
10
|
+
z-index: 5;
|
|
11
|
+
|
|
12
|
+
display: flex;
|
|
13
|
+
flex-direction: column;
|
|
14
|
+
gap: 10px;
|
|
15
|
+
|
|
16
|
+
font-size: 14px;
|
|
17
|
+
|
|
18
|
+
height: 150px;
|
|
19
|
+
width: 150px;
|
|
20
|
+
|
|
21
|
+
display: flex;
|
|
22
|
+
justify-content: center;
|
|
23
|
+
align-items: center;
|
|
24
|
+
|
|
25
|
+
border-radius: 5px;
|
|
26
|
+
border: 1px solid ${(props) => props.theme.palette.divider};
|
|
27
|
+
background-color: ${(props) => props.theme.palette.background.default};
|
|
28
|
+
|
|
29
|
+
// add blur to background
|
|
30
|
+
// backdrop-filter: blur(5px);
|
|
31
|
+
|
|
32
|
+
// delay visibility
|
|
33
|
+
&.fade-in {
|
|
34
|
+
animation: fadeIn 0.4s forwards; /* Adjust duration as needed */
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
&.fade-out {
|
|
38
|
+
animation: fadeOut 0.4s forwards;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@keyframes fadeIn {
|
|
42
|
+
from {
|
|
43
|
+
opacity: 0;
|
|
44
|
+
}
|
|
45
|
+
to {
|
|
46
|
+
opacity: 1;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
@keyframes fadeOut {
|
|
51
|
+
from {
|
|
52
|
+
opacity: 1;
|
|
53
|
+
}
|
|
54
|
+
to {
|
|
55
|
+
opacity: 0;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
`;
|
|
59
|
+
const LoadingIndicator = ({ visible = false, }) => {
|
|
60
|
+
const [shouldRender, setShouldRender] = useState(visible);
|
|
61
|
+
useEffect(() => {
|
|
62
|
+
if (visible) {
|
|
63
|
+
setShouldRender(true); // Make sure component renders to fade in
|
|
64
|
+
}
|
|
65
|
+
}, [visible]);
|
|
66
|
+
const handleAnimationEnd = () => {
|
|
67
|
+
if (!visible) {
|
|
68
|
+
setShouldRender(false); // Remove component after fade-out animation
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
if (!shouldRender) {
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
return (_jsxs(StyledContainer, { className: visible ? "fade-in" : "fade-out", onAnimationEnd: handleAnimationEnd, children: [_jsx(Loader, { size: 24, style: { margin: "none" }, speed: 550 }), _jsx("div", { children: "Loading..." })] }));
|
|
75
|
+
};
|
|
76
|
+
export default LoadingIndicator;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import styled from "styled-components";
|
|
3
|
+
import useTable from "./useTable";
|
|
4
|
+
const StyledContainer = styled.div `
|
|
5
|
+
position: absolute;
|
|
6
|
+
top: 0;
|
|
7
|
+
left: 0;
|
|
8
|
+
|
|
9
|
+
width: 100%;
|
|
10
|
+
height: 100%;
|
|
11
|
+
`;
|
|
12
|
+
const SkeletonRow = styled.div `
|
|
13
|
+
height: 20px;
|
|
14
|
+
width: 100%;
|
|
15
|
+
|
|
16
|
+
border-bottom: 1px solid ${({ theme }) => theme.palette.divider};
|
|
17
|
+
`;
|
|
18
|
+
const RenderSkeleton = ({ rowHeight, height, }) => {
|
|
19
|
+
const {} = useTable();
|
|
20
|
+
const totalRows = Math.floor(height / rowHeight);
|
|
21
|
+
return (_jsx(StyledContainer, { style: {
|
|
22
|
+
height,
|
|
23
|
+
}, children: [...Array(totalRows)].map((_, i) => (_jsx(SkeletonRow, { style: { height: rowHeight } }, i))) }));
|
|
24
|
+
};
|
|
25
|
+
export default RenderSkeleton;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Query } from "../QueryFilter";
|
|
1
2
|
import { ColumnState, SelectionState, SortState, TableState } from "./types";
|
|
2
3
|
type GetTableStateFn = (key: string) => TableState;
|
|
3
4
|
type GetColumnStateFn = (key: string) => ColumnState[];
|
|
@@ -6,6 +7,10 @@ type GetSelectionStateFn = (key: string) => SelectionState;
|
|
|
6
7
|
type SetSelectionStateFn = (key: string, value: any) => void;
|
|
7
8
|
type GetSortStateStateFn = (key: string) => SortState | null | undefined;
|
|
8
9
|
type SetSortStateFn = (key: string, value: SortState | undefined | null) => void;
|
|
10
|
+
type GetSearchStateFn = (key: string) => string;
|
|
11
|
+
type SetSearchStateFn = (key: string, value: string) => void;
|
|
12
|
+
type GetFilterStateFn = (key: string) => Query | undefined;
|
|
13
|
+
type SetFilterStateFn = (key: string, value?: Query | null) => void;
|
|
9
14
|
declare const StateStorage: {
|
|
10
15
|
getTableState: GetTableStateFn;
|
|
11
16
|
getColumnState: GetColumnStateFn;
|
|
@@ -14,5 +19,9 @@ declare const StateStorage: {
|
|
|
14
19
|
setSelectionState: SetSelectionStateFn;
|
|
15
20
|
getSortState: GetSortStateStateFn;
|
|
16
21
|
setSortState: SetSortStateFn;
|
|
22
|
+
getSearchState: GetSearchStateFn;
|
|
23
|
+
setSearchState: SetSearchStateFn;
|
|
24
|
+
getFilterState: GetFilterStateFn;
|
|
25
|
+
setFilterState: SetFilterStateFn;
|
|
17
26
|
};
|
|
18
27
|
export default StateStorage;
|
|
@@ -60,6 +60,28 @@ const setSortState = (key, value) => {
|
|
|
60
60
|
const newState = Object.assign(Object.assign({}, previousState), { sortState: value });
|
|
61
61
|
set(key, newState);
|
|
62
62
|
};
|
|
63
|
+
const getSearchState = (key) => {
|
|
64
|
+
const data = getTableState(key);
|
|
65
|
+
return data.searchState || "";
|
|
66
|
+
};
|
|
67
|
+
const setSearchState = (key, value) => {
|
|
68
|
+
// get previous state
|
|
69
|
+
const previousState = getTableState(key);
|
|
70
|
+
// merge previous state with new state
|
|
71
|
+
const newState = Object.assign(Object.assign({}, previousState), { searchState: value });
|
|
72
|
+
set(key, newState);
|
|
73
|
+
};
|
|
74
|
+
const getFilterState = (key) => {
|
|
75
|
+
const data = getTableState(key);
|
|
76
|
+
return data.filterState;
|
|
77
|
+
};
|
|
78
|
+
const setFilterState = (key, value) => {
|
|
79
|
+
// get previous state
|
|
80
|
+
const previousState = getTableState(key);
|
|
81
|
+
// merge previous state with new state
|
|
82
|
+
const newState = Object.assign(Object.assign({}, previousState), { filterState: value });
|
|
83
|
+
set(key, newState);
|
|
84
|
+
};
|
|
63
85
|
const StateStorage = {
|
|
64
86
|
getTableState,
|
|
65
87
|
getColumnState,
|
|
@@ -68,5 +90,9 @@ const StateStorage = {
|
|
|
68
90
|
setSelectionState,
|
|
69
91
|
getSortState,
|
|
70
92
|
setSortState,
|
|
93
|
+
getSearchState,
|
|
94
|
+
setSearchState,
|
|
95
|
+
getFilterState,
|
|
96
|
+
setFilterState,
|
|
71
97
|
};
|
|
72
98
|
export default StateStorage;
|
package/dist/Table/Table.d.ts
CHANGED
|
@@ -1,93 +1,3 @@
|
|
|
1
|
-
import "
|
|
2
|
-
|
|
3
|
-
export interface ColumnProps {
|
|
4
|
-
className?: string;
|
|
5
|
-
key?: string | number;
|
|
6
|
-
dataField: string;
|
|
7
|
-
caption: string;
|
|
8
|
-
columnId?: string | number;
|
|
9
|
-
allowSorting?: boolean;
|
|
10
|
-
allowReorder?: boolean;
|
|
11
|
-
allowResize?: boolean;
|
|
12
|
-
resizeEnabled?: boolean;
|
|
13
|
-
width?: number;
|
|
14
|
-
visible?: boolean;
|
|
15
|
-
enabled?: boolean;
|
|
16
|
-
sorting?: {
|
|
17
|
-
active: boolean;
|
|
18
|
-
direction: "asc" | "desc";
|
|
19
|
-
};
|
|
20
|
-
format?: {
|
|
21
|
-
type: string;
|
|
22
|
-
};
|
|
23
|
-
props?: any;
|
|
24
|
-
render?: (data: any, options: any) => React.ReactNode;
|
|
25
|
-
}
|
|
26
|
-
export declare const Column: React.FC<ColumnProps>;
|
|
27
|
-
interface onResizeProps {
|
|
28
|
-
columns: {
|
|
29
|
-
dataField: string;
|
|
30
|
-
width: number;
|
|
31
|
-
}[];
|
|
32
|
-
}
|
|
33
|
-
type SelectionState = "all" | "none" | "someIncluded" | "someExcluded";
|
|
34
|
-
interface TableInstanceProps {
|
|
35
|
-
setTableInstance: (e: any) => void;
|
|
36
|
-
toggleCompact: () => void;
|
|
37
|
-
toggleStripes: () => void;
|
|
38
|
-
isCompact: boolean;
|
|
39
|
-
isStriped: boolean;
|
|
40
|
-
getVirtualSelectionTotal: () => number;
|
|
41
|
-
getSelectedRows: () => any[];
|
|
42
|
-
getExcludedRows: () => any[];
|
|
43
|
-
getSelectionState: () => SelectionState;
|
|
44
|
-
clearSelections: () => void;
|
|
45
|
-
onColumnResize: (e: onResizeProps) => void;
|
|
46
|
-
}
|
|
47
|
-
export declare const useTable: () => {
|
|
48
|
-
setTableInstance: import("react").Dispatch<import("react").SetStateAction<TableInstanceProps | null>>;
|
|
49
|
-
toggleCompact: () => void | undefined;
|
|
50
|
-
toggleStripes: () => void | undefined;
|
|
51
|
-
isCompact: boolean;
|
|
52
|
-
isStriped: boolean;
|
|
53
|
-
getVirtualSelectionTotal: () => number;
|
|
54
|
-
getSelectedRows: () => any[];
|
|
55
|
-
getExcludedRows: () => any[];
|
|
56
|
-
getSelectionState: () => {};
|
|
57
|
-
clearSelections: () => void | undefined;
|
|
58
|
-
onColumnResize: (e: onResizeProps) => void | undefined;
|
|
59
|
-
};
|
|
60
|
-
interface TableProps {
|
|
61
|
-
className?: string;
|
|
62
|
-
children: ReactElement<ColumnProps> | ReactElement<ColumnProps>[];
|
|
63
|
-
data: {
|
|
64
|
-
[key: string]: any;
|
|
65
|
-
}[];
|
|
66
|
-
rowHeight?: number;
|
|
67
|
-
headerHeight?: number;
|
|
68
|
-
tableInstance?: TableInstanceProps;
|
|
69
|
-
queryKey?: any;
|
|
70
|
-
totalRecords?: number;
|
|
71
|
-
compact?: boolean;
|
|
72
|
-
focusedRow?: {
|
|
73
|
-
[key: string]: any;
|
|
74
|
-
};
|
|
75
|
-
keyValue?: string;
|
|
76
|
-
onScroll?: (e: any) => void;
|
|
77
|
-
allowColumnResize?: boolean;
|
|
78
|
-
allowColumnReorder?: boolean;
|
|
79
|
-
showActionColumn?: boolean;
|
|
80
|
-
showSelection?: boolean;
|
|
81
|
-
selectAll?: boolean;
|
|
82
|
-
reloadFn?: () => void;
|
|
83
|
-
onColumnReorder?: (e: any) => void;
|
|
84
|
-
onSelectionChanged?: (e: any) => void;
|
|
85
|
-
onActionButtonClick?: (e: any) => void;
|
|
86
|
-
onHeaderClick?: (e: any) => void;
|
|
87
|
-
onColumnResize?: (e: any) => void;
|
|
88
|
-
onRowUpdated?: (e: any) => void;
|
|
89
|
-
onRowClick?: (e: any) => void;
|
|
90
|
-
onRowDoubleClick?: (e: any) => void;
|
|
91
|
-
}
|
|
92
|
-
declare const Table: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<TableProps, never>> & string & Omit<({ className, children, data, rowHeight, headerHeight, tableInstance, queryKey, totalRecords, compact, focusedRow, keyValue, onScroll, allowColumnResize, allowColumnReorder, showActionColumn, showSelection, selectAll, reloadFn, onColumnReorder, onSelectionChanged, onActionButtonClick, onHeaderClick, onColumnResize, onRowUpdated, onRowClick, onRowDoubleClick, }: TableProps) => import("react/jsx-runtime").JSX.Element, keyof import("react").Component<any, {}, any>>;
|
|
1
|
+
import { TableProps } from "./types";
|
|
2
|
+
declare const Table: React.FC<TableProps>;
|
|
93
3
|
export default Table;
|