@monolith-forensics/monolith-ui 1.8.1-dev.2 → 1.8.1-dev.3

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 (102) hide show
  1. package/dist/Calendar/Calendar.d.ts +4 -1
  2. package/dist/Calendar/Calendar.js +126 -50
  3. package/dist/Calendar/CalendarStyles.d.ts +3 -2
  4. package/dist/Calendar/CalendarStyles.js +62 -23
  5. package/dist/Calendar/calendarHelpers.d.ts +1 -1
  6. package/dist/CheckBox/CheckBox.js +35 -4
  7. package/dist/DateTimeRangePicker/DateTimeRangePicker.d.ts +41 -0
  8. package/dist/DateTimeRangePicker/DateTimeRangePicker.js +363 -0
  9. package/dist/DateTimeRangePicker/index.d.ts +2 -0
  10. package/dist/DateTimeRangePicker/index.js +2 -0
  11. package/dist/DropDownMenu/DropDownMenu.js +25 -15
  12. package/dist/DropDownMenu/components/MenuComponent.js +6 -1
  13. package/dist/DropDownMenu/components/MenuItem.js +6 -0
  14. package/dist/DropDownMenu/components/MenuItemList.d.ts +2 -0
  15. package/dist/DropDownMenu/components/MenuItemList.js +94 -13
  16. package/dist/DropDownMenu/components/StyledContent.js +1 -2
  17. package/dist/DropDownMenu/types.d.ts +1 -0
  18. package/dist/FileViewer/viewers/ImageViewer.js +75 -18
  19. package/dist/MonolithUIProvider/MonolithUIProvider.d.ts +1 -0
  20. package/dist/QueryFilter/DefaultOperators.d.ts +1 -76
  21. package/dist/QueryFilter/DefaultOperators.js +1 -21
  22. package/dist/QueryFilter/QueryFilter.constants.d.ts +134 -0
  23. package/dist/QueryFilter/QueryFilter.constants.js +39 -0
  24. package/dist/QueryFilter/QueryFilter.d.ts +1 -1
  25. package/dist/QueryFilter/QueryFilter.js +3 -303
  26. package/dist/QueryFilter/QueryFilter.lib.d.ts +14 -0
  27. package/dist/QueryFilter/QueryFilter.lib.js +84 -0
  28. package/dist/QueryFilter/QueryFilter.styled.d.ts +89 -0
  29. package/dist/QueryFilter/QueryFilter.styled.js +184 -0
  30. package/dist/QueryFilter/QueryFilter.types.d.ts +61 -0
  31. package/dist/QueryFilter/QueryFilter.types.js +1 -0
  32. package/dist/QueryFilter/components/MultiSelectEditor.d.ts +7 -0
  33. package/dist/QueryFilter/components/MultiSelectEditor.js +44 -0
  34. package/dist/QueryFilter/components/RuleChip.d.ts +8 -0
  35. package/dist/QueryFilter/components/RuleChip.js +37 -0
  36. package/dist/QueryFilter/components/Rules.d.ts +11 -0
  37. package/dist/QueryFilter/components/Rules.js +41 -0
  38. package/dist/QueryFilter/components/UnavailableRuleChip.d.ts +5 -0
  39. package/dist/QueryFilter/components/UnavailableRuleChip.js +7 -0
  40. package/dist/QueryFilter/components/ValueEditor.d.ts +7 -0
  41. package/dist/QueryFilter/components/ValueEditor.js +45 -0
  42. package/dist/QueryFilter/components/ValueSelector.d.ts +7 -0
  43. package/dist/QueryFilter/components/ValueSelector.js +34 -0
  44. package/dist/QueryFilter/components/index.d.ts +6 -0
  45. package/dist/QueryFilter/components/index.js +6 -0
  46. package/dist/QueryFilter/index.d.ts +3 -2
  47. package/dist/QueryFilter/index.js +3 -2
  48. package/dist/QueryFilter/types.d.ts +1 -52
  49. package/dist/QueryFilter/types.js +1 -1
  50. package/dist/QueryFilter/useQueryFilter.d.ts +1 -1
  51. package/dist/QueryFilter/useQueryFilter.js +23 -19
  52. package/dist/RichTextEditor/Extensions/getTiptapExtensions.js +5 -15
  53. package/dist/RichTextEditor/Plugins/ImageActionsPlugin.d.ts +3 -0
  54. package/dist/RichTextEditor/Plugins/ImageActionsPlugin.js +241 -0
  55. package/dist/RichTextEditor/Plugins/UploadImagesPlugin.d.ts +15 -0
  56. package/dist/RichTextEditor/Plugins/UploadImagesPlugin.js +115 -51
  57. package/dist/RichTextEditor/Plugins/index.d.ts +1 -0
  58. package/dist/RichTextEditor/Plugins/index.js +1 -0
  59. package/dist/RichTextEditor/RichTextEditor.d.ts +3 -2
  60. package/dist/RichTextEditor/RichTextEditor.js +302 -35
  61. package/dist/SuperDatePicker/SuperDatePicker.constants.d.ts +24 -0
  62. package/dist/SuperDatePicker/SuperDatePicker.constants.js +30 -0
  63. package/dist/SuperDatePicker/SuperDatePicker.d.ts +3 -0
  64. package/dist/SuperDatePicker/SuperDatePicker.js +31 -0
  65. package/dist/SuperDatePicker/SuperDatePicker.lib.d.ts +17 -0
  66. package/dist/SuperDatePicker/SuperDatePicker.lib.js +206 -0
  67. package/dist/SuperDatePicker/SuperDatePicker.styled.d.ts +60 -0
  68. package/dist/SuperDatePicker/SuperDatePicker.styled.js +256 -0
  69. package/dist/SuperDatePicker/SuperDatePicker.types.d.ts +48 -0
  70. package/dist/SuperDatePicker/SuperDatePicker.types.js +1 -0
  71. package/dist/SuperDatePicker/components/CommonPresetGroups.d.ts +7 -0
  72. package/dist/SuperDatePicker/components/CommonPresetGroups.js +6 -0
  73. package/dist/SuperDatePicker/components/EndpointCalendarDropdown.d.ts +10 -0
  74. package/dist/SuperDatePicker/components/EndpointCalendarDropdown.js +9 -0
  75. package/dist/SuperDatePicker/components/EndpointDateInput.d.ts +16 -0
  76. package/dist/SuperDatePicker/components/EndpointDateInput.js +26 -0
  77. package/dist/SuperDatePicker/components/EndpointPopover.d.ts +18 -0
  78. package/dist/SuperDatePicker/components/EndpointPopover.js +11 -0
  79. package/dist/SuperDatePicker/components/QuickRangeDropdown.d.ts +14 -0
  80. package/dist/SuperDatePicker/components/QuickRangeDropdown.js +19 -0
  81. package/dist/SuperDatePicker/components/QuickRangePopover.d.ts +18 -0
  82. package/dist/SuperDatePicker/components/QuickRangePopover.js +12 -0
  83. package/dist/SuperDatePicker/components/index.d.ts +6 -0
  84. package/dist/SuperDatePicker/components/index.js +6 -0
  85. package/dist/SuperDatePicker/index.d.ts +3 -0
  86. package/dist/SuperDatePicker/index.js +3 -0
  87. package/dist/SuperDatePicker/useSuperDatePicker.d.ts +32 -0
  88. package/dist/SuperDatePicker/useSuperDatePicker.js +125 -0
  89. package/dist/Table/ColumnResizer.d.ts +6 -9
  90. package/dist/Table/ColumnResizer.js +30 -10
  91. package/dist/Table/TableComponents.js +14 -10
  92. package/dist/Table/TableHeader.js +31 -16
  93. package/dist/Table/TableMenu/TableMenu.js +1 -1
  94. package/dist/Table/TableProvider.js +91 -4
  95. package/dist/Table/TableRow.js +19 -12
  96. package/dist/Table/Utils/index.d.ts +0 -1
  97. package/dist/Table/Utils/index.js +0 -1
  98. package/dist/Table/types.d.ts +6 -19
  99. package/dist/index.d.ts +2 -0
  100. package/dist/index.js +1 -0
  101. package/dist/theme/variants.js +2 -0
  102. package/package.json +22 -18
@@ -0,0 +1,61 @@
1
+ import type { DropDownItem, DropDownMenuProps } from "../DropDownMenu";
2
+ import type { SuperDatePickerProps } from "../SuperDatePicker";
3
+ export interface UseQueryFilterProps {
4
+ value?: Query | null;
5
+ defaultValue?: Query | null;
6
+ /** @deprecated Use value instead. */
7
+ filter?: Query | null;
8
+ /** @deprecated Use defaultValue instead. */
9
+ defaultFilter?: Query | null;
10
+ filterDefinitions: FilterDefinition[];
11
+ showCombinator?: boolean;
12
+ onFilterChange?: (filter: Query) => void;
13
+ }
14
+ export type QueryFilterType = {
15
+ filter: Query;
16
+ filterDefinitions: FilterDefinition[];
17
+ showCombinator?: boolean;
18
+ addRule: (rule: Rule) => void;
19
+ removeRule: (id: string) => void;
20
+ updateRule: (rule: Rule) => void;
21
+ updateRootCombinator: (combinator: Combinator) => void;
22
+ };
23
+ export type UseQueryFilter = (args: UseQueryFilterProps) => QueryFilterType;
24
+ export type Combinator = "and" | "or";
25
+ export type Operator = {
26
+ label: string;
27
+ value: string;
28
+ };
29
+ export type InputType = "text" | "number" | "date" | "datetime" | "multiselect";
30
+ export type BetweenEditor = "inputs" | "superDatePicker";
31
+ export interface FilterDefinition {
32
+ dataField: string;
33
+ label: string;
34
+ pluralLabel?: string;
35
+ operators?: Operator[];
36
+ inputType?: InputType;
37
+ betweenEditor?: BetweenEditor;
38
+ resolution?: "day" | "second" | "millisecond";
39
+ isoString?: boolean;
40
+ placeholder?: string;
41
+ selectOptions?: DropDownItem[];
42
+ superDatePickerProps?: Omit<SuperDatePickerProps, "defaultValue" | "format" | "onChange" | "size" | "value" | "variant" | "width">;
43
+ dropDownOptions?: {
44
+ style?: React.CSSProperties;
45
+ };
46
+ query?: DropDownMenuProps["query"];
47
+ }
48
+ export interface Rule {
49
+ id?: string;
50
+ dataField: string;
51
+ value?: string[];
52
+ options?: DropDownItem[];
53
+ operator: Operator;
54
+ label: string;
55
+ }
56
+ export interface RuleGroup {
57
+ rules: Rule[];
58
+ combinator: Combinator;
59
+ }
60
+ export interface Query extends RuleGroup {
61
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ import { DropDownItem } from "../../DropDownMenu";
2
+ import { FilterDefinition, Rule } from "../QueryFilter.types";
3
+ export declare const MultiSelectEditor: React.FC<{
4
+ rule: Rule;
5
+ filterDef: FilterDefinition;
6
+ onChange?: (selected: DropDownItem[], diff: DropDownItem[]) => void;
7
+ }>;
@@ -0,0 +1,44 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useTheme } from "styled-components";
3
+ import { DropDownMenu } from "../../DropDownMenu";
4
+ import { QUERY_FILTER_SELECT_VALUE_LABEL, } from "../QueryFilter.constants";
5
+ export const MultiSelectEditor = ({ rule, filterDef, onChange }) => {
6
+ var _a, _b;
7
+ const theme = useTheme();
8
+ const handleChange = (selected, diff) => {
9
+ onChange === null || onChange === void 0 ? void 0 : onChange(selected, diff);
10
+ };
11
+ const options = [
12
+ ...((filterDef === null || filterDef === void 0 ? void 0 : filterDef.selectOptions) || []),
13
+ ...(rule.options || []),
14
+ ];
15
+ const selected = ((_a = rule.value) === null || _a === void 0 ? void 0 : _a.map((value) => {
16
+ const option = options.find((o) => o.value == value);
17
+ return option || { label: value, value };
18
+ })) || [];
19
+ let display = selected.map((o) => o.label).join(", ") || QUERY_FILTER_SELECT_VALUE_LABEL;
20
+ if (Array.isArray(rule.value) && rule.value.length > 1) {
21
+ display = `${rule.value.length} ${(filterDef === null || filterDef === void 0 ? void 0 : filterDef.pluralLabel) || "Values"}`;
22
+ }
23
+ return (_jsx(DropDownMenu, { data: (filterDef === null || filterDef === void 0 ? void 0 : filterDef.selectOptions) || [], variant: "outlined", multiselect: true, searchable: true, size: "xs", buttonProps: {
24
+ title: QUERY_FILTER_SELECT_VALUE_LABEL,
25
+ variant: "contained",
26
+ size: "xxs",
27
+ style: {
28
+ padding: "3px 8px",
29
+ height: 24,
30
+ borderRadius: 0,
31
+ backgroundColor: "transparent",
32
+ borderColor: "transparent",
33
+ fontFamily: theme.typography.fontFamily,
34
+ fontSize: 11,
35
+ fontWeight: "normal",
36
+ lineHeight: 1,
37
+ color: !!rule.value && Array.isArray(rule.value) && rule.value.length > 0
38
+ ? theme.palette.text.primary
39
+ : theme.palette.text.secondary,
40
+ },
41
+ }, dropDownProps: {
42
+ style: Object.assign({ width: 200, maxWidth: 400 }, (_b = filterDef === null || filterDef === void 0 ? void 0 : filterDef.dropDownOptions) === null || _b === void 0 ? void 0 : _b.style),
43
+ }, value: selected, onChange: handleChange, query: filterDef === null || filterDef === void 0 ? void 0 : filterDef.query, children: display }));
44
+ };
@@ -0,0 +1,8 @@
1
+ import { FilterDefinition, Operator, Rule } from "../QueryFilter.types";
2
+ export declare const RuleChip: React.FC<{
3
+ rule: Rule;
4
+ filterDef: FilterDefinition;
5
+ onDelete: (rule: Rule) => void;
6
+ onOperatorChange: (rule: Rule, operator: Operator) => void;
7
+ onUpdate: (rule: Rule) => void;
8
+ }>;
@@ -0,0 +1,37 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { XIcon } from "lucide-react";
3
+ import styled, { useTheme } from "styled-components";
4
+ import { DropDownMenu } from "../../DropDownMenu";
5
+ import { DefaultOperators } from "../QueryFilter.constants";
6
+ import { operatorRequiresValue } from "../QueryFilter.lib";
7
+ import { CloseLabel, FieldLabel, RuleContainer } from "../QueryFilter.styled";
8
+ import { ValueSelector } from "./ValueSelector";
9
+ const RuleLabel = styled(FieldLabel) `
10
+ &:hover {
11
+ background-color: transparent;
12
+ }
13
+ `;
14
+ export const RuleChip = ({ rule, filterDef, onDelete, onOperatorChange, onUpdate }) => {
15
+ const theme = useTheme();
16
+ const operatorOptions = (filterDef === null || filterDef === void 0 ? void 0 : filterDef.operators) || DefaultOperators;
17
+ const inputType = (filterDef === null || filterDef === void 0 ? void 0 : filterDef.inputType) || "text";
18
+ return (_jsxs(RuleContainer, { "data-rule-id": rule.id, children: [_jsx(RuleLabel, { children: rule.label }), _jsx(DropDownMenu, { variant: "outlined", data: operatorOptions, size: "xs", buttonProps: {
19
+ title: "Select Operator",
20
+ variant: "contained",
21
+ color: "secondary",
22
+ style: {
23
+ fontFamily: theme.typography.fontFamily,
24
+ fontWeight: "normal",
25
+ fontSize: 11,
26
+ lineHeight: 1,
27
+ padding: "3px 8px",
28
+ height: 24,
29
+ borderRadius: 0,
30
+ backgroundColor: "transparent",
31
+ borderColor: "transparent",
32
+ color: theme.palette.text.secondary,
33
+ },
34
+ }, onItemSelect: (e) => onOperatorChange(rule, e), dropDownProps: {
35
+ style: { width: 150, maxWidth: 400 },
36
+ }, children: rule.operator.label }), operatorRequiresValue(rule.operator) && (_jsx(ValueSelector, { rule: rule, inputType: inputType, filterDef: filterDef, onChange: onUpdate })), _jsx(CloseLabel, { variant: "contained", onClick: () => onDelete(rule), children: _jsx(XIcon, { size: 16 }) })] }));
37
+ };
@@ -0,0 +1,11 @@
1
+ import { FilterDefinition, Rule } from "../QueryFilter.types";
2
+ export interface RulesProps {
3
+ rules: Rule[];
4
+ combinator: "and" | "or";
5
+ showCombinator?: boolean;
6
+ filterDefinitions: FilterDefinition[];
7
+ onDelete: (rule: Rule) => void;
8
+ onUpdate: (rule: Rule) => void;
9
+ onUpdateRootCombinator: (e: "or" | "and") => void;
10
+ }
11
+ export declare const Rules: React.FC<RulesProps>;
@@ -0,0 +1,41 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useTheme } from "styled-components";
3
+ import { DropDownMenu } from "../../DropDownMenu";
4
+ import { QUERY_FILTER_COMBINATOR_OPTIONS, QUERY_FILTER_COMBINATOR_TITLE, } from "../QueryFilter.constants";
5
+ import { updateRuleOperator } from "../QueryFilter.lib";
6
+ import { RuleChip } from "./RuleChip";
7
+ import { UnavailableRuleChip } from "./UnavailableRuleChip";
8
+ export const Rules = ({ rules = [], combinator, showCombinator, filterDefinitions, onDelete, onUpdate, onUpdateRootCombinator, }) => {
9
+ const theme = useTheme();
10
+ const handleCombinatorChange = (e) => {
11
+ onUpdateRootCombinator(e);
12
+ };
13
+ const handleOperatorChange = (rule, operator) => {
14
+ onUpdate(updateRuleOperator(rule, operator));
15
+ };
16
+ return (_jsxs(_Fragment, { children: [showCombinator === true && (_jsx(DropDownMenu, { variant: "outlined", data: QUERY_FILTER_COMBINATOR_OPTIONS, size: "xs", buttonProps: {
17
+ title: QUERY_FILTER_COMBINATOR_TITLE,
18
+ variant: "contained",
19
+ color: "secondary",
20
+ style: {
21
+ fontFamily: theme.typography.fontFamily,
22
+ fontWeight: 400,
23
+ fontSize: 11,
24
+ letterSpacing: 0,
25
+ lineHeight: 1,
26
+ padding: "3px 8px",
27
+ height: 24,
28
+ borderRadius: 5,
29
+ borderColor: "transparent",
30
+ color: theme.palette.text.secondary,
31
+ },
32
+ }, onItemSelect: (e) => handleCombinatorChange(e.value), dropDownProps: {
33
+ style: { width: 75 },
34
+ }, children: combinator.toUpperCase() })), rules.map((rule, index) => {
35
+ const filterDef = filterDefinitions.find((f) => f.dataField === rule.dataField);
36
+ if (!filterDef) {
37
+ return (_jsx(UnavailableRuleChip, { rule: rule, onDelete: onDelete }, rule.id || `${rule.dataField}-${index}`));
38
+ }
39
+ return (_jsx(RuleChip, { rule: rule, filterDef: filterDef, onDelete: onDelete, onOperatorChange: handleOperatorChange, onUpdate: onUpdate }, rule.id || `${rule.dataField}-${index}`));
40
+ })] }));
41
+ };
@@ -0,0 +1,5 @@
1
+ import { Rule } from "../QueryFilter.types";
2
+ export declare const UnavailableRuleChip: React.FC<{
3
+ rule: Rule;
4
+ onDelete: (rule: Rule) => void;
5
+ }>;
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { XIcon } from "lucide-react";
3
+ import { QUERY_FILTER_UNAVAILABLE_FILTER_LABEL } from "../QueryFilter.constants";
4
+ import { CloseLabel, FieldLabel, UnavailableRuleContainer, ValueLabel, } from "../QueryFilter.styled";
5
+ export const UnavailableRuleChip = ({ rule, onDelete }) => {
6
+ return (_jsxs(UnavailableRuleContainer, { "data-rule-id": rule.id, children: [_jsx(FieldLabel, { title: rule.dataField, children: rule.label || rule.dataField }), _jsx(ValueLabel, { children: QUERY_FILTER_UNAVAILABLE_FILTER_LABEL }), _jsx(CloseLabel, { variant: "contained", onClick: () => onDelete(rule), children: _jsx(XIcon, { size: 16 }) })] }));
7
+ };
@@ -0,0 +1,7 @@
1
+ import { FilterDefinition, InputType, Rule } from "../QueryFilter.types";
2
+ export declare const ValueEditor: React.FC<{
3
+ rule: Rule;
4
+ inputType: InputType;
5
+ filterDef: FilterDefinition;
6
+ onChange?: (e: Rule) => void;
7
+ }>;
@@ -0,0 +1,45 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect, useState } from "react";
3
+ import { useDebouncedCallback } from "use-debounce";
4
+ import { QUERY_FILTER_DATE_FORMATS, QUERY_FILTER_VALUE_PLACEHOLDER, } from "../QueryFilter.constants";
5
+ import { dateFormatResolver, formatRuleTimestampValue, } from "../QueryFilter.lib";
6
+ import { StyledDateInput, StyledInput } from "../QueryFilter.styled";
7
+ import { MultiSelectEditor } from "./MultiSelectEditor";
8
+ export const ValueEditor = ({ rule, inputType, filterDef, onChange }) => {
9
+ var _a, _b, _c;
10
+ const editorValue = ((_a = rule.value) === null || _a === void 0 ? void 0 : _a[0]) || "";
11
+ const dateEditorValue = ((_b = rule.value) === null || _b === void 0 ? void 0 : _b[0]) === "" ? undefined : (_c = rule.value) === null || _c === void 0 ? void 0 : _c[0];
12
+ const [draftValue, setDraftValue] = useState(editorValue);
13
+ useEffect(() => {
14
+ setDraftValue(editorValue);
15
+ }, [editorValue]);
16
+ const handleInputChange = useDebouncedCallback((value) => {
17
+ onChange === null || onChange === void 0 ? void 0 : onChange(Object.assign(Object.assign({}, rule), { value: value ? [value] : undefined }));
18
+ }, 250);
19
+ const handleDraftInputChange = (e) => {
20
+ const value = e.target.value;
21
+ setDraftValue(value);
22
+ handleInputChange(value);
23
+ };
24
+ const handleMultiSelectChange = useDebouncedCallback((selected) => {
25
+ onChange === null || onChange === void 0 ? void 0 : onChange(Object.assign(Object.assign({}, rule), { value: selected.map((s) => s.value), options: selected }));
26
+ }, 100);
27
+ const handleTimestampChange = useDebouncedCallback((timestamp) => {
28
+ const formattedValue = formatRuleTimestampValue(timestamp, filterDef);
29
+ onChange === null || onChange === void 0 ? void 0 : onChange(Object.assign(Object.assign({}, rule), { value: formattedValue ? [formattedValue] : undefined }));
30
+ }, 100);
31
+ switch (inputType) {
32
+ case "text":
33
+ return (_jsx(StyledInput, { placeholder: filterDef.placeholder || QUERY_FILTER_VALUE_PLACEHOLDER, value: draftValue, onChange: handleDraftInputChange }));
34
+ case "number":
35
+ return (_jsx(StyledInput, { type: "number", placeholder: filterDef.placeholder || QUERY_FILTER_VALUE_PLACEHOLDER, value: draftValue, onChange: handleDraftInputChange }));
36
+ case "date":
37
+ return (_jsx(StyledDateInput, { arrow: false, enableCalendar: true, format: QUERY_FILTER_DATE_FORMATS.day, value: dateEditorValue, onChange: handleTimestampChange }));
38
+ case "datetime":
39
+ return (_jsx(StyledDateInput, { arrow: false, enableCalendar: true, format: dateFormatResolver(filterDef === null || filterDef === void 0 ? void 0 : filterDef.resolution), value: dateEditorValue, onChange: handleTimestampChange }));
40
+ case "multiselect":
41
+ return (_jsx(MultiSelectEditor, { rule: rule, filterDef: filterDef, onChange: handleMultiSelectChange }));
42
+ default:
43
+ return (_jsx(StyledInput, { placeholder: filterDef.placeholder || QUERY_FILTER_VALUE_PLACEHOLDER, value: draftValue, onChange: handleDraftInputChange }));
44
+ }
45
+ };
@@ -0,0 +1,7 @@
1
+ import { FilterDefinition, InputType, Rule } from "../QueryFilter.types";
2
+ export declare const ValueSelector: React.FC<{
3
+ rule: Rule;
4
+ inputType: InputType;
5
+ filterDef: FilterDefinition;
6
+ onChange?: (e: Rule) => void;
7
+ }>;
@@ -0,0 +1,34 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import styled from "styled-components";
3
+ import SuperDatePicker from "../../SuperDatePicker";
4
+ import { QUERY_FILTER_DATE_FORMATS } from "../QueryFilter.constants";
5
+ import { dateFormatResolver, getRuleDateRangeValue, getSecondaryRuleValue, isDateInputType, isBetweenOperator, updateRuleDateRangeValue, updateRulePrimaryValue, updateRuleSecondaryValue, } from "../QueryFilter.lib";
6
+ import { FieldLabel } from "../QueryFilter.styled";
7
+ import { ValueEditor } from "./ValueEditor";
8
+ const BetweenAndLabel = styled(FieldLabel) `
9
+ &:hover {
10
+ background-color: transparent;
11
+ }
12
+ `;
13
+ export const ValueSelector = ({ rule, inputType, filterDef, onChange }) => {
14
+ var _a, _b;
15
+ const isBetween = isBetweenOperator(rule.operator);
16
+ const useSuperDatePicker = isBetween &&
17
+ isDateInputType(inputType) &&
18
+ filterDef.betweenEditor === "superDatePicker";
19
+ const handleValueChange = (nextRule) => {
20
+ onChange === null || onChange === void 0 ? void 0 : onChange(updateRulePrimaryValue(rule, nextRule));
21
+ };
22
+ const handleSecondaryValueChange = (nextRule) => {
23
+ onChange === null || onChange === void 0 ? void 0 : onChange(updateRuleSecondaryValue(rule, nextRule));
24
+ };
25
+ const handleDateRangeChange = (value) => {
26
+ onChange === null || onChange === void 0 ? void 0 : onChange(updateRuleDateRangeValue(rule, value, filterDef));
27
+ };
28
+ if (useSuperDatePicker) {
29
+ return (_jsx(SuperDatePicker, Object.assign({}, filterDef.superDatePickerProps, { clearable: (_b = (_a = filterDef.superDatePickerProps) === null || _a === void 0 ? void 0 : _a.clearable) !== null && _b !== void 0 ? _b : false, format: inputType === "date"
30
+ ? QUERY_FILTER_DATE_FORMATS.day
31
+ : dateFormatResolver(filterDef.resolution), size: "xxs", value: getRuleDateRangeValue(rule), variant: "text", width: "auto", onChange: handleDateRangeChange })));
32
+ }
33
+ return (_jsxs(_Fragment, { children: [_jsx(ValueEditor, { rule: rule, inputType: inputType, filterDef: filterDef, onChange: handleValueChange }), isBetween && (_jsxs(_Fragment, { children: [_jsx(BetweenAndLabel, { children: "and" }), _jsx(ValueEditor, { rule: Object.assign(Object.assign({}, rule), { value: [getSecondaryRuleValue(rule)] }), inputType: inputType, filterDef: filterDef, onChange: handleSecondaryValueChange })] }))] }));
34
+ };
@@ -0,0 +1,6 @@
1
+ export * from "./MultiSelectEditor";
2
+ export * from "./RuleChip";
3
+ export * from "./Rules";
4
+ export * from "./UnavailableRuleChip";
5
+ export * from "./ValueEditor";
6
+ export * from "./ValueSelector";
@@ -0,0 +1,6 @@
1
+ export * from "./MultiSelectEditor";
2
+ export * from "./RuleChip";
3
+ export * from "./Rules";
4
+ export * from "./UnavailableRuleChip";
5
+ export * from "./ValueEditor";
6
+ export * from "./ValueSelector";
@@ -1,4 +1,5 @@
1
1
  export * from "./useQueryFilter";
2
2
  export * from "./QueryFilter";
3
- export * from "./types";
4
- export * from "./DefaultOperators";
3
+ export * from "./QueryFilter.types";
4
+ export * from "./QueryFilter.constants";
5
+ export * from "./QueryFilter.lib";
@@ -1,4 +1,5 @@
1
1
  export * from "./useQueryFilter";
2
2
  export * from "./QueryFilter";
3
- export * from "./types";
4
- export * from "./DefaultOperators";
3
+ export * from "./QueryFilter.types";
4
+ export * from "./QueryFilter.constants";
5
+ export * from "./QueryFilter.lib";
@@ -1,52 +1 @@
1
- import { DropDownItem, DropDownMenuProps } 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 QueryFilterType = {
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
- updateRootCombinator: (combinator: Combinator) => void;
16
- };
17
- export type UseQueryFilter = (args: UseQueryFilterProps) => QueryFilterType;
18
- export type Combinator = "and" | "or";
19
- export type Operator = {
20
- label: string;
21
- value: string;
22
- };
23
- export type InputType = "text" | "number" | "date" | "datetime" | "multiselect";
24
- export interface FilterDefinition {
25
- dataField: string;
26
- label: string;
27
- pluralLabel?: string;
28
- operators?: Operator[];
29
- inputType?: InputType;
30
- resolution?: "day" | "second" | "millisecond";
31
- isoString?: boolean;
32
- placeholder?: string;
33
- selectOptions?: DropDownItem[];
34
- dropDownOptions?: {
35
- style?: React.CSSProperties;
36
- };
37
- query?: DropDownMenuProps["query"];
38
- }
39
- export interface Rule {
40
- id?: string;
41
- dataField: string;
42
- value?: string[];
43
- options?: DropDownItem[];
44
- operator: Operator;
45
- label: string;
46
- }
47
- export interface RuleGroup {
48
- rules: Rule[];
49
- combinator: Combinator;
50
- }
51
- export interface Query extends RuleGroup {
52
- }
1
+ export * from "./QueryFilter.types";
@@ -1 +1 @@
1
- export {};
1
+ export * from "./QueryFilter.types";
@@ -1,2 +1,2 @@
1
- import { UseQueryFilter } from "./types";
1
+ import { UseQueryFilter } from "./QueryFilter.types";
2
2
  export declare const useQueryFilter: UseQueryFilter;
@@ -1,32 +1,36 @@
1
- import { useEffect, useState } from "react";
1
+ import { useState } from "react";
2
+ import { DEFAULT_QUERY_FILTER } from "./QueryFilter.constants";
2
3
  import shortUUID from "short-uuid";
3
- const defaultFilter = {
4
- combinator: "and",
5
- rules: [],
6
- };
7
4
  export 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();
5
+ var _a, _b, _c;
6
+ const controlledFilter = (_a = args.value) !== null && _a !== void 0 ? _a : args.filter;
7
+ const defaultValue = (_c = (_b = args.defaultValue) !== null && _b !== void 0 ? _b : args.defaultFilter) !== null && _c !== void 0 ? _c : DEFAULT_QUERY_FILTER;
8
+ const [internalFilter, setInternalFilter] = useState(defaultValue || DEFAULT_QUERY_FILTER);
9
+ const isControlled = controlledFilter !== undefined;
10
+ const filter = isControlled
11
+ ? controlledFilter || DEFAULT_QUERY_FILTER
12
+ : internalFilter;
13
+ const commitFilter = (updater) => {
14
+ var _a;
15
+ const nextFilter = updater(filter);
16
+ if (!isControlled) {
17
+ setInternalFilter(nextFilter);
12
18
  }
13
- setFilter(Object.assign(Object.assign({}, filter), { rules: [...filter.rules, rule] }));
19
+ (_a = args.onFilterChange) === null || _a === void 0 ? void 0 : _a.call(args, nextFilter);
20
+ };
21
+ const addRule = (rule) => {
22
+ const nextRule = Object.assign(Object.assign({}, rule), { id: rule.id || shortUUID.generate() });
23
+ commitFilter((currentFilter) => (Object.assign(Object.assign({}, currentFilter), { rules: [...currentFilter.rules, nextRule] })));
14
24
  };
15
25
  const removeRule = (id) => {
16
- const rules = filter.rules.filter((r) => r.id !== id);
17
- setFilter(Object.assign(Object.assign({}, filter), { rules }));
26
+ commitFilter((currentFilter) => (Object.assign(Object.assign({}, currentFilter), { rules: currentFilter.rules.filter((r) => r.id !== id) })));
18
27
  };
19
28
  const updateRule = (rule) => {
20
- const rules = filter.rules.map((r) => (r.id === rule.id ? rule : r));
21
- setFilter(Object.assign(Object.assign({}, filter), { rules }));
29
+ commitFilter((currentFilter) => (Object.assign(Object.assign({}, currentFilter), { rules: currentFilter.rules.map((r) => (r.id === rule.id ? rule : r)) })));
22
30
  };
23
31
  const updateRootCombinator = (combinator) => {
24
- setFilter(Object.assign(Object.assign({}, filter), { combinator }));
32
+ commitFilter((currentFilter) => (Object.assign(Object.assign({}, currentFilter), { combinator })));
25
33
  };
26
- useEffect(() => {
27
- var _a;
28
- (_a = args === null || args === void 0 ? void 0 : args.onFilterChange) === null || _a === void 0 ? void 0 : _a.call(args, filter);
29
- }, [filter]);
30
34
  return {
31
35
  filter,
32
36
  filterDefinitions: args.filterDefinitions,
@@ -1,18 +1,13 @@
1
1
  import TiptapImage from "@tiptap/extension-image";
2
2
  import StarterKit from "@tiptap/starter-kit";
3
3
  import HorizontalRule from "@tiptap/extension-horizontal-rule";
4
- import Underline from "@tiptap/extension-underline";
5
4
  import TextAlign from "@tiptap/extension-text-align";
6
- import Table from "@tiptap/extension-table";
7
- import TableCell from "@tiptap/extension-table-cell";
8
- import TableHeader from "@tiptap/extension-table-header";
9
- import TableRow from "@tiptap/extension-table-row";
10
- import Placeholder from "@tiptap/extension-placeholder";
5
+ import { Table, TableCell, TableHeader, TableRow } from "@tiptap/extension-table";
6
+ import { Focus, Placeholder } from "@tiptap/extensions";
11
7
  import { Color } from "@tiptap/extension-color";
12
- import TextStyle from "@tiptap/extension-text-style";
8
+ import { TextStyle } from "@tiptap/extension-text-style";
13
9
  import { InputRule, Extension } from "@tiptap/core";
14
- import Focus from "@tiptap/extension-focus";
15
- import { UploadImagesPlugin } from "../Plugins";
10
+ import { ImageActionsPlugin, UploadImagesPlugin, } from "../Plugins";
16
11
  import getSlashCommand from "./getSlashCommand";
17
12
  import { Extensions } from "../Enums";
18
13
  import BubbleMenu from "./BubbleMenuExtension";
@@ -25,7 +20,7 @@ const CustomImage = TiptapImage.extend({
25
20
  } });
26
21
  },
27
22
  addProseMirrorPlugins() {
28
- return [UploadImagesPlugin()];
23
+ return [UploadImagesPlugin(), ImageActionsPlugin(this.editor)];
29
24
  },
30
25
  });
31
26
  const CustomStorage = Extension.create({
@@ -84,11 +79,6 @@ const getTipTapExtensions = ({ extensions = [], slashCommands = [], bubbleMenuOp
84
79
  category: "default",
85
80
  extension: Color,
86
81
  },
87
- {
88
- name: Extensions.Underline,
89
- category: "default",
90
- extension: Underline,
91
- },
92
82
  {
93
83
  name: Extensions.TextAlign,
94
84
  category: "default",
@@ -0,0 +1,3 @@
1
+ import { Editor } from "@tiptap/core";
2
+ import { Plugin } from "@tiptap/pm/state";
3
+ export declare const ImageActionsPlugin: (editor: Editor) => Plugin<any>;