pixelize-design-library 2.3.1-beta.2 → 2.3.1-beta.20
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/.claude/settings.local.json +28 -1
- package/.cursor/TASK-SETUP.md +43 -0
- package/.cursor/agents/be-impl.md +37 -0
- package/.cursor/agents/fe-impl.md +39 -0
- package/.cursor/agents/task-plan.md +56 -0
- package/.cursor/agents/test-create.md +31 -0
- package/.cursor/agents/test-exec.md +26 -0
- package/.cursor/hooks/task-hint.env +1 -0
- package/.cursor/hooks/task-skill-nudge.sh +71 -0
- package/.cursor/hooks/task-slash-guard.sh +31 -0
- package/.cursor/hooks.json +13 -0
- package/.cursor/modules/account-management/MODULE.md +16 -0
- package/.cursor/modules/buttons/MODULE.md +13 -0
- package/.cursor/modules/cards/MODULE.md +13 -0
- package/.cursor/modules/charts/MODULE.md +13 -0
- package/.cursor/modules/common/MODULE.md +13 -0
- package/.cursor/modules/contact-auth/MODULE.md +13 -0
- package/.cursor/modules/data-display/MODULE.md +13 -0
- package/.cursor/modules/feedback/MODULE.md +14 -0
- package/.cursor/modules/form/MODULE.md +13 -0
- package/.cursor/modules/inputs-basic/MODULE.md +13 -0
- package/.cursor/modules/inputs-date-file/MODULE.md +19 -0
- package/.cursor/modules/inputs-select/MODULE.md +14 -0
- package/.cursor/modules/inputs-toggle/MODULE.md +13 -0
- package/.cursor/modules/kanban/MODULE.md +14 -0
- package/.cursor/modules/layout-navigation/MODULE.md +14 -0
- package/.cursor/modules/overlays/MODULE.md +13 -0
- package/.cursor/modules/playground/MODULE.md +15 -0
- package/.cursor/modules/table/MODULE.md +15 -0
- package/.cursor/modules/theme/MODULE.md +15 -0
- package/.cursor/modules/types-exports/MODULE.md +17 -0
- package/.cursor/modules/utility-ui/MODULE.md +15 -0
- package/.cursor/modules/utils-hooks/MODULE.md +13 -0
- package/.cursor/pixelize-task-statusline.sh +64 -0
- package/.cursor/plans/blocked/.gitkeep +0 -0
- package/.cursor/plans/current.md +35 -0
- package/.cursor/plans/done/.gitkeep +0 -0
- package/.cursor/rules +31 -0
- package/.cursor/skills/task/SKILL.md +167 -0
- package/CLAUDE.md +122 -0
- package/dist/Components/Accordion/Accordion.js +26 -5
- package/dist/Components/Card/PaymentCard/PaymentCard.d.ts +1 -1
- package/dist/Components/Card/PaymentCard/PaymentCard.js +3 -3
- package/dist/Components/Card/PaymentCard/PaymentCardProps.d.ts +1 -0
- package/dist/Components/CopyButton/CopyButton.d.ts +22 -0
- package/dist/Components/CopyButton/CopyButton.js +126 -0
- package/dist/Components/CustomModulesTable/CustomModulesTable.d.ts +4 -0
- package/dist/Components/CustomModulesTable/CustomModulesTable.js +182 -0
- package/dist/Components/CustomModulesTable/CustomModulesTable.test.d.ts +1 -0
- package/dist/Components/CustomModulesTable/CustomModulesTable.test.js +84 -0
- package/dist/Components/CustomModulesTable/CustomModulesTableProps.d.ts +54 -0
- package/dist/Components/CustomModulesTable/CustomModulesTableProps.js +2 -0
- package/dist/Components/CustomModulesTable/DeleteModuleModal.d.ts +4 -0
- package/dist/Components/CustomModulesTable/DeleteModuleModal.js +33 -0
- package/dist/Components/CustomModulesTable/EditModuleModal.d.ts +4 -0
- package/dist/Components/CustomModulesTable/EditModuleModal.js +63 -0
- package/dist/Components/Dropdown/DropDown.js +110 -28
- package/dist/Components/Dropdown/Dropdown.test.d.ts +1 -0
- package/dist/Components/Dropdown/Dropdown.test.js +102 -0
- package/dist/Components/Dropdown/DropdownProps.d.ts +4 -1
- package/dist/Components/EmptyState/EmptyState.d.ts +4 -0
- package/dist/Components/EmptyState/EmptyState.js +65 -0
- package/dist/Components/EmptyState/EmptyStateProps.d.ts +28 -0
- package/dist/Components/EmptyState/EmptyStateProps.js +2 -0
- package/dist/Components/FieldSelectModal/FieldSelectModal.d.ts +26 -0
- package/dist/Components/FieldSelectModal/FieldSelectModal.js +107 -0
- package/dist/Components/FilePreview/FilePreview.d.ts +6 -0
- package/dist/Components/FilePreview/FilePreview.js +190 -0
- package/dist/Components/FilePreview/FilePreviewProps.d.ts +26 -0
- package/dist/Components/FilePreview/FilePreviewProps.js +2 -0
- package/dist/Components/KanbanBoard/AccountCard.js +17 -14
- package/dist/Components/KanbanBoard/KanbanBoard.js +93 -78
- package/dist/Components/LazyWrapper/LazyWrapper.d.ts +10 -0
- package/dist/Components/LazyWrapper/LazyWrapper.js +50 -0
- package/dist/Components/MoreItems/MoreItems.d.ts +4 -0
- package/dist/Components/MoreItems/MoreItems.js +35 -0
- package/dist/Components/MoreItems/MoreItemsProps.d.ts +29 -0
- package/dist/Components/MoreItems/MoreItemsProps.js +2 -0
- package/dist/Components/NavigationBar/NavigationBar.js +4 -4
- package/dist/Components/OrgSwitcher/OrgSwitcher.d.ts +4 -0
- package/dist/Components/OrgSwitcher/OrgSwitcher.js +121 -0
- package/dist/Components/OrgSwitcher/OrgSwitcherProps.d.ts +41 -0
- package/dist/Components/OrgSwitcher/OrgSwitcherProps.js +25 -0
- package/dist/Components/OrganizationDetails/CreateOrgModal.d.ts +4 -0
- package/dist/Components/OrganizationDetails/CreateOrgModal.js +122 -0
- package/dist/Components/OrganizationDetails/DeleteOrgModal.d.ts +4 -0
- package/dist/Components/OrganizationDetails/DeleteOrgModal.js +29 -0
- package/dist/Components/OrganizationDetails/OrganizationDetails.d.ts +4 -0
- package/dist/Components/OrganizationDetails/OrganizationDetails.js +264 -0
- package/dist/Components/OrganizationDetails/OrganizationDetails.test.d.ts +1 -0
- package/dist/Components/OrganizationDetails/OrganizationDetails.test.js +122 -0
- package/dist/Components/OrganizationDetails/OrganizationDetailsProps.d.ts +88 -0
- package/dist/Components/OrganizationDetails/OrganizationDetailsProps.js +2 -0
- package/dist/Components/PdfViewer/PdfViewer.d.ts +15 -0
- package/dist/Components/PdfViewer/PdfViewer.js +29 -0
- package/dist/Components/ProfilePhotoViewer/ProfilePhotoViewer.d.ts +1 -1
- package/dist/Components/ProfilePhotoViewer/ProfilePhotoViewer.js +42 -24
- package/dist/Components/ProfilePhotoViewer/ProfilePhotoViewerProps.d.ts +2 -0
- package/dist/Components/RolesPermission/DeleteRoleModal.d.ts +4 -0
- package/dist/Components/RolesPermission/DeleteRoleModal.js +29 -0
- package/dist/Components/RolesPermission/RolesPermission.d.ts +4 -0
- package/dist/Components/RolesPermission/RolesPermission.js +243 -0
- package/dist/Components/RolesPermission/RolesPermission.test.d.ts +1 -0
- package/dist/Components/RolesPermission/RolesPermission.test.js +150 -0
- package/dist/Components/RolesPermission/RolesPermissionProps.d.ts +117 -0
- package/dist/Components/RolesPermission/RolesPermissionProps.js +2 -0
- package/dist/Components/ScrollToTop/ScrollToTop.d.ts +19 -0
- package/dist/Components/ScrollToTop/ScrollToTop.js +104 -0
- package/dist/Components/SearchSelect/SearchSelect.js +53 -21
- package/dist/Components/SideBar/components/OtherApps.test.js +3 -2
- package/dist/Components/SignInActivityTable/SignInActivityTable.d.ts +4 -0
- package/dist/Components/SignInActivityTable/SignInActivityTable.js +95 -0
- package/dist/Components/SignInActivityTable/SignInActivityTable.test.d.ts +1 -0
- package/dist/Components/SignInActivityTable/SignInActivityTable.test.js +63 -0
- package/dist/Components/SignInActivityTable/SignInActivityTableProps.d.ts +21 -0
- package/dist/Components/SignInActivityTable/SignInActivityTableProps.js +2 -0
- package/dist/Components/StageProgress/StageItem.d.ts +4 -0
- package/dist/Components/StageProgress/StageItem.js +137 -0
- package/dist/Components/StageProgress/StageProgress.d.ts +4 -0
- package/dist/Components/StageProgress/StageProgress.js +59 -0
- package/dist/Components/StageProgress/StageProgressProps.d.ts +85 -0
- package/dist/Components/StageProgress/StageProgressProps.js +27 -0
- package/dist/Components/StageProgress/StepperStage.d.ts +4 -0
- package/dist/Components/StageProgress/StepperStage.js +78 -0
- package/dist/Components/Table/Table.d.ts +1 -1
- package/dist/Components/Table/Table.js +167 -32
- package/dist/Components/Table/TableProps.d.ts +11 -3
- package/dist/Components/Table/components/Pagination.js +1 -1
- package/dist/Components/Table/components/TableActions.d.ts +2 -2
- package/dist/Components/Table/components/TableActions.js +5 -4
- package/dist/Components/Table/components/TableBody.js +98 -29
- package/dist/Components/Table/components/TableBody.virtualize.test.js +13 -3
- package/dist/Components/Table/components/TableHeader.d.ts +1 -1
- package/dist/Components/Table/components/TableHeader.js +9 -13
- package/dist/Components/Table/hooks/useTable.d.ts +2 -1
- package/dist/Components/Table/hooks/useTable.js +24 -10
- package/dist/Components/Table/settings/ManageColumns.test.js +1 -0
- package/dist/Components/Table/settings/TableSettings.d.ts +3 -2
- package/dist/Components/Table/settings/TableSettings.js +30 -6
- package/dist/Components/Timeline/Timeline.d.ts +1 -1
- package/dist/Components/Timeline/Timeline.js +145 -78
- package/dist/Components/Toaster/Toaster.js +40 -20
- package/dist/Components/UpgradeButton/UpgradeButton.d.ts +4 -0
- package/dist/Components/UpgradeButton/UpgradeButton.js +73 -0
- package/dist/Components/UpgradeButton/UpgradeButtonProps.d.ts +43 -0
- package/dist/Components/UpgradeButton/UpgradeButtonProps.js +2 -0
- package/dist/Components/UserDetails/AddUserModal.d.ts +4 -0
- package/dist/Components/UserDetails/AddUserModal.js +218 -0
- package/dist/Components/UserDetails/ChangeRoleModal.d.ts +4 -0
- package/dist/Components/UserDetails/ChangeRoleModal.js +150 -0
- package/dist/Components/UserDetails/DeactivateConfirmModal.d.ts +4 -0
- package/dist/Components/UserDetails/DeactivateConfirmModal.js +34 -0
- package/dist/Components/UserDetails/UserDetails.d.ts +4 -0
- package/dist/Components/UserDetails/UserDetails.js +263 -0
- package/dist/Components/UserDetails/UserDetails.test.d.ts +1 -0
- package/dist/Components/UserDetails/UserDetails.test.js +129 -0
- package/dist/Components/UserDetails/UserDetailsProps.d.ts +151 -0
- package/dist/Components/UserDetails/UserDetailsProps.js +2 -0
- package/dist/Theme/index.d.ts +4 -4
- package/dist/Theme/index.js +4 -4
- package/dist/Utils/table.d.ts +6 -1
- package/dist/Utils/table.js +47 -27
- package/dist/index.d.ts +23 -1
- package/dist/index.js +37 -2
- package/package.json +1 -1
|
@@ -50,58 +50,140 @@ var framer_motion_1 = require("framer-motion");
|
|
|
50
50
|
var useCustomTheme_1 = require("../../Theme/useCustomTheme");
|
|
51
51
|
var lucide_react_1 = require("lucide-react");
|
|
52
52
|
var MotionBox = (0, framer_motion_1.motion)((0, react_1.forwardRef)(function (props, ref) { return (react_1.default.createElement(react_2.Box, __assign({ ref: ref }, props))); }));
|
|
53
|
+
// Size scale (mirrors the Button sizes). `btn` is the Chakra Button size.
|
|
54
|
+
var SIZE_MAP = {
|
|
55
|
+
xs: { btn: "xs", fontSize: "0.75rem", py: 1, px: 2.5, img: "1rem", chevron: 13, minW: "8rem", gap: 1.5 },
|
|
56
|
+
sm: { btn: "sm", fontSize: "0.8125rem", py: 1.5, px: 3, img: "1.05rem", chevron: 14, minW: "9rem", gap: 2 },
|
|
57
|
+
md: { btn: "md", fontSize: "0.875rem", py: 2, px: 3, img: "1.15rem", chevron: 16, minW: "11rem", gap: 2 },
|
|
58
|
+
lg: { btn: "lg", fontSize: "0.9375rem", py: 2.5, px: 3.5, img: "1.25rem", chevron: 18, minW: "12rem", gap: 2.5 },
|
|
59
|
+
xl: { btn: "lg", fontSize: "1.0625rem", py: 3, px: 4, img: "1.4rem", chevron: 20, minW: "13rem", gap: 3 },
|
|
60
|
+
};
|
|
53
61
|
var Dropdown = (0, react_1.forwardRef)(function (_a, ref) {
|
|
54
|
-
var
|
|
62
|
+
var _b, _c;
|
|
63
|
+
var dropDownButtonStyle = _a.dropDownButtonStyle, ButtonText = _a.ButtonText, options = _a.options, handleOptionSelect = _a.handleOptionSelect, _d = _a.dropdownType, dropdownType = _d === void 0 ? "button" : _d, text = _a.text, DropdownIcon = _a.DropdownIcon, _e = _a.isVisibleIconShow, isVisibleIconShow = _e === void 0 ? true : _e, buttonProps = _a.buttonProps, headStyle = _a.headStyle, ListStyle = _a.ListStyle, ItemStyle = _a.ItemStyle, LabelStyle = _a.LabelStyle, ImageStyle = _a.ImageStyle, size = _a.size, optionsSize = _a.optionsSize, _f = _a.divider, divider = _f === void 0 ? false : _f;
|
|
55
64
|
var theme = (0, useCustomTheme_1.useCustomTheme)();
|
|
56
|
-
var
|
|
65
|
+
var _g = (0, react_2.useDisclosure)(), isOpen = _g.isOpen, onToggle = _g.onToggle, onClose = _g.onClose;
|
|
57
66
|
var dropdownRef = (0, react_1.useRef)(null);
|
|
67
|
+
var menuRef = (0, react_1.useRef)(null);
|
|
68
|
+
var _h = (0, react_1.useState)({ top: 0, left: 0, width: 0 }), menuPos = _h[0], setMenuPos = _h[1];
|
|
69
|
+
var s = (_c = SIZE_MAP[(_b = size !== null && size !== void 0 ? size : optionsSize) !== null && _b !== void 0 ? _b : "md"]) !== null && _c !== void 0 ? _c : SIZE_MAP.md;
|
|
58
70
|
var handleListItemClick = function (optionId, optionLabel) {
|
|
59
71
|
onClose();
|
|
60
72
|
handleOptionSelect(optionId, optionLabel);
|
|
61
73
|
};
|
|
74
|
+
// The menu is portaled to <body> (so it sits above everything). Anchor it to
|
|
75
|
+
// the trigger, then clamp to the viewport so it never overflows off-screen
|
|
76
|
+
// (e.g. when the trigger sits near the right or bottom edge).
|
|
77
|
+
var updateMenuPos = (0, react_1.useCallback)(function () {
|
|
78
|
+
var _a, _b;
|
|
79
|
+
if (!dropdownRef.current)
|
|
80
|
+
return;
|
|
81
|
+
var r = dropdownRef.current.getBoundingClientRect();
|
|
82
|
+
var gutter = 8;
|
|
83
|
+
var vw = window.innerWidth;
|
|
84
|
+
var vh = window.innerHeight;
|
|
85
|
+
// Use the rendered menu size when available; fall back to trigger width.
|
|
86
|
+
var menuW = ((_a = menuRef.current) === null || _a === void 0 ? void 0 : _a.offsetWidth) || r.width;
|
|
87
|
+
var menuH = ((_b = menuRef.current) === null || _b === void 0 ? void 0 : _b.offsetHeight) || 0;
|
|
88
|
+
// Horizontal: prefer left-aligned to trigger; if it overflows the right
|
|
89
|
+
// edge, right-align to the trigger, then clamp within [gutter, vw-gutter].
|
|
90
|
+
var left = r.left;
|
|
91
|
+
if (left + menuW > vw - gutter)
|
|
92
|
+
left = r.right - menuW;
|
|
93
|
+
left = Math.min(Math.max(left, gutter), Math.max(gutter, vw - menuW - gutter));
|
|
94
|
+
// Vertical: prefer below the trigger; flip above when it would overflow the
|
|
95
|
+
// bottom and there is more room above. Clamp within the viewport.
|
|
96
|
+
var top = r.bottom;
|
|
97
|
+
var spaceBelow = vh - r.bottom;
|
|
98
|
+
var spaceAbove = r.top;
|
|
99
|
+
if (menuH && top + menuH > vh - gutter && spaceAbove > spaceBelow) {
|
|
100
|
+
top = r.top - menuH;
|
|
101
|
+
}
|
|
102
|
+
top = Math.min(Math.max(top, gutter), Math.max(gutter, vh - menuH - gutter));
|
|
103
|
+
setMenuPos({ top: top, left: left, width: r.width });
|
|
104
|
+
}, []);
|
|
105
|
+
(0, react_1.useEffect)(function () {
|
|
106
|
+
if (!isOpen)
|
|
107
|
+
return;
|
|
108
|
+
updateMenuPos();
|
|
109
|
+
window.addEventListener("scroll", updateMenuPos, true);
|
|
110
|
+
window.addEventListener("resize", updateMenuPos);
|
|
111
|
+
return function () {
|
|
112
|
+
window.removeEventListener("scroll", updateMenuPos, true);
|
|
113
|
+
window.removeEventListener("resize", updateMenuPos);
|
|
114
|
+
};
|
|
115
|
+
}, [isOpen, updateMenuPos]);
|
|
62
116
|
(0, react_1.useEffect)(function () {
|
|
63
117
|
var handleClickOutside = function (event) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
118
|
+
var _a, _b;
|
|
119
|
+
var target = event.target;
|
|
120
|
+
// Ignore clicks on the trigger or inside the (portaled) menu.
|
|
121
|
+
if ((_a = dropdownRef.current) === null || _a === void 0 ? void 0 : _a.contains(target))
|
|
122
|
+
return;
|
|
123
|
+
if ((_b = menuRef.current) === null || _b === void 0 ? void 0 : _b.contains(target))
|
|
124
|
+
return;
|
|
125
|
+
onClose();
|
|
68
126
|
};
|
|
69
127
|
document.addEventListener("mousedown", handleClickOutside);
|
|
70
128
|
return function () {
|
|
71
129
|
document.removeEventListener("mousedown", handleClickOutside);
|
|
72
130
|
};
|
|
73
|
-
}, [
|
|
131
|
+
}, [onClose]);
|
|
132
|
+
var setMenuRef = function (node) {
|
|
133
|
+
menuRef.current = node;
|
|
134
|
+
if (typeof ref === "function")
|
|
135
|
+
ref(node);
|
|
136
|
+
else if (ref)
|
|
137
|
+
ref.current = node;
|
|
138
|
+
// Recompute once the menu has mounted so clamping uses its real size.
|
|
139
|
+
if (node)
|
|
140
|
+
updateMenuPos();
|
|
141
|
+
};
|
|
142
|
+
var Chevron = isVisibleIconShow ? (react_1.default.createElement(react_2.Box, { as: "span", display: "inline-flex", transition: "transform 0.2s ease", transform: isOpen ? "rotate(180deg)" : "rotate(0deg)" },
|
|
143
|
+
react_1.default.createElement(lucide_react_1.ChevronDown, { size: s.chevron }))) : undefined;
|
|
74
144
|
var dropDownToggleOption = function () {
|
|
75
|
-
var
|
|
76
|
-
|
|
77
|
-
"
|
|
78
|
-
|
|
79
|
-
|
|
145
|
+
var _a, _b, _c, _d;
|
|
146
|
+
var ButtonToggle = (react_1.default.createElement(react_2.Button, __assign({ onClick: onToggle, size: s.btn, colorScheme: "primary", borderRadius: "0.5rem", fontWeight: 600, "aria-haspopup": "menu", "aria-expanded": isOpen, rightIcon: Chevron, sx: __assign({ transition: "all 0.15s ease" }, dropDownButtonStyle) }, buttonProps),
|
|
147
|
+
react_1.default.createElement(react_2.Box, { as: "span", display: "inline-flex", alignItems: "center", gap: DropdownIcon && ButtonText ? s.gap : 0 },
|
|
148
|
+
DropdownIcon,
|
|
149
|
+
ButtonText)));
|
|
150
|
+
var TextToggle = (react_1.default.createElement(react_2.Flex, { onClick: onToggle, align: "center", gap: 1.5, cursor: "pointer", fontSize: s.fontSize, fontWeight: 500, color: (_b = (_a = theme.colors) === null || _a === void 0 ? void 0 : _a.text) === null || _b === void 0 ? void 0 : _b[700], transition: "color 0.15s ease", _hover: { color: (_d = (_c = theme.colors) === null || _c === void 0 ? void 0 : _c.primary) === null || _d === void 0 ? void 0 : _d[600] }, style: dropDownButtonStyle, role: "button", "aria-haspopup": "menu", "aria-expanded": isOpen },
|
|
80
151
|
DropdownIcon,
|
|
81
|
-
" ",
|
|
82
152
|
text,
|
|
83
|
-
|
|
153
|
+
Chevron));
|
|
84
154
|
return dropdownType === "button" ? ButtonToggle : TextToggle;
|
|
85
155
|
};
|
|
86
156
|
var DropdownContentRender = function () {
|
|
87
|
-
var _a, _b, _c;
|
|
88
|
-
return (react_1.default.createElement(react_2.List, { bg: (_b = (_a = theme.colors) === null || _a === void 0 ? void 0 : _a.
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
"
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
157
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
|
|
158
|
+
return (react_1.default.createElement(react_2.List, { bg: (_b = (_a = theme.colors) === null || _a === void 0 ? void 0 : _a.white) !== null && _b !== void 0 ? _b : "#fff", border: "0.063rem solid ".concat((_e = (_d = (_c = theme.colors) === null || _c === void 0 ? void 0 : _c.boxborder) === null || _d === void 0 ? void 0 : _d[200]) !== null && _e !== void 0 ? _e : (_f = theme.colors) === null || _f === void 0 ? void 0 : _f.gray[200]), borderRadius: "0.625rem", boxShadow: (_g = theme.shadows) === null || _g === void 0 ? void 0 : _g.lg, py: 1.5, mt: "0.375rem", minWidth: s.minW, maxH: "18rem", overflowY: "auto", overflowX: "hidden", sx: {
|
|
159
|
+
scrollbarWidth: "thin",
|
|
160
|
+
scrollbarColor: "".concat((_j = (_h = theme.colors) === null || _h === void 0 ? void 0 : _h.gray) === null || _j === void 0 ? void 0 : _j[300], " transparent"),
|
|
161
|
+
"&::-webkit-scrollbar": { width: "6px" },
|
|
162
|
+
"&::-webkit-scrollbar-thumb": {
|
|
163
|
+
background: (_l = (_k = theme.colors) === null || _k === void 0 ? void 0 : _k.gray) === null || _l === void 0 ? void 0 : _l[300],
|
|
164
|
+
borderRadius: "3px",
|
|
165
|
+
},
|
|
166
|
+
"&::-webkit-scrollbar-thumb:hover": {
|
|
167
|
+
background: (_o = (_m = theme.colors) === null || _m === void 0 ? void 0 : _m.gray) === null || _o === void 0 ? void 0 : _o[400],
|
|
168
|
+
},
|
|
169
|
+
}, style: ListStyle }, options.map(function (option) {
|
|
170
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w;
|
|
171
|
+
return (react_1.default.createElement(react_2.ListItem, { key: option.id, onClick: function () { return handleListItemClick(option.id, option.label); }, mx: 1.5, px: s.px, py: s.py, borderRadius: "0.375rem", display: "flex", alignItems: "center", gap: 2, cursor: "pointer", color: (_c = (_b = (_a = theme.colors) === null || _a === void 0 ? void 0 : _a.text) === null || _b === void 0 ? void 0 : _b[700]) !== null && _c !== void 0 ? _c : (_e = (_d = theme.colors) === null || _d === void 0 ? void 0 : _d.gray) === null || _e === void 0 ? void 0 : _e[700], transition: "background 0.12s ease, color 0.12s ease", _hover: {
|
|
172
|
+
bg: (_j = (_h = (_g = (_f = theme.colors) === null || _f === void 0 ? void 0 : _f.primary) === null || _g === void 0 ? void 0 : _g.opacity) === null || _h === void 0 ? void 0 : _h[8]) !== null && _j !== void 0 ? _j : (_k = theme.colors) === null || _k === void 0 ? void 0 : _k.gray[100],
|
|
173
|
+
color: (_o = (_m = (_l = theme.colors) === null || _l === void 0 ? void 0 : _l.primary) === null || _m === void 0 ? void 0 : _m[700]) !== null && _o !== void 0 ? _o : (_q = (_p = theme.colors) === null || _p === void 0 ? void 0 : _p.primary) === null || _q === void 0 ? void 0 : _q[600],
|
|
174
|
+
}, borderBottom: divider
|
|
175
|
+
? "0.063rem solid ".concat((_t = (_s = (_r = theme.colors) === null || _r === void 0 ? void 0 : _r.boxborder) === null || _s === void 0 ? void 0 : _s[100]) !== null && _t !== void 0 ? _t : (_u = theme.colors) === null || _u === void 0 ? void 0 : _u.gray[200])
|
|
176
|
+
: undefined, sx: { "&:last-child": { borderBottom: "none" } }, style: ItemStyle, fontWeight: 500 },
|
|
177
|
+
(option === null || option === void 0 ? void 0 : option.image) && (react_1.default.createElement(react_2.Box, { as: option.image, boxSize: s.img, flexShrink: 0, color: (_w = (_v = theme.colors) === null || _v === void 0 ? void 0 : _v.gray) === null || _w === void 0 ? void 0 : _w[500], style: ImageStyle })),
|
|
178
|
+
react_1.default.createElement(react_2.Box, { as: "span", fontSize: s.fontSize, isTruncated: true,
|
|
179
|
+
// fontWeight={400}
|
|
180
|
+
style: LabelStyle }, option.label)));
|
|
100
181
|
})));
|
|
101
182
|
};
|
|
102
183
|
return (react_1.default.createElement(react_2.Box, { ref: dropdownRef, position: "relative", display: "inline-block" },
|
|
103
184
|
dropDownToggleOption(),
|
|
104
|
-
isOpen && (react_1.default.createElement(
|
|
185
|
+
isOpen && (react_1.default.createElement(react_2.Portal, null,
|
|
186
|
+
react_1.default.createElement(MotionBox, { ref: setMenuRef, position: "fixed", top: "".concat(menuPos.top, "px"), left: "".concat(menuPos.left, "px"), minW: "".concat(menuPos.width, "px"), zIndex: 1500, initial: { opacity: 0, y: -6 }, animate: { opacity: 1, y: 0 }, exit: { opacity: 0, y: -6 }, style: headStyle }, DropdownContentRender())))));
|
|
105
187
|
});
|
|
106
188
|
Dropdown.displayName = "Dropdown";
|
|
107
189
|
exports.default = Dropdown;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import "@testing-library/jest-dom";
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
var react_1 = __importDefault(require("react"));
|
|
7
|
+
var react_2 = require("@testing-library/react");
|
|
8
|
+
require("@testing-library/jest-dom");
|
|
9
|
+
var react_3 = require("@chakra-ui/react");
|
|
10
|
+
var DropDown_1 = __importDefault(require("./DropDown"));
|
|
11
|
+
jest.mock("../../Theme/useCustomTheme", function () { return ({
|
|
12
|
+
useCustomTheme: function () { return ({
|
|
13
|
+
colors: {
|
|
14
|
+
white: "#ffffff",
|
|
15
|
+
gray: { 100: "#f0f0f0", 200: "#e2e8f0", 300: "#cbd5e1", 400: "#94a3b8", 500: "#64748b", 700: "#334155" },
|
|
16
|
+
primary: { 600: "#4f46e5", 700: "#4338ca", opacity: { 8: "rgba(99,102,241,0.08)" } },
|
|
17
|
+
boxborder: { 100: "#eef2f6", 200: "#e2e8f0" },
|
|
18
|
+
text: { 700: "#334155" },
|
|
19
|
+
},
|
|
20
|
+
shadows: { lg: "0 10px 15px rgba(0,0,0,0.1)" },
|
|
21
|
+
}); },
|
|
22
|
+
}); });
|
|
23
|
+
beforeAll(function () {
|
|
24
|
+
Object.defineProperty(window, "matchMedia", {
|
|
25
|
+
writable: true,
|
|
26
|
+
configurable: true,
|
|
27
|
+
value: jest.fn().mockImplementation(function (query) { return ({
|
|
28
|
+
matches: false,
|
|
29
|
+
media: query,
|
|
30
|
+
onchange: null,
|
|
31
|
+
addListener: jest.fn(),
|
|
32
|
+
removeListener: jest.fn(),
|
|
33
|
+
addEventListener: jest.fn(),
|
|
34
|
+
removeEventListener: jest.fn(),
|
|
35
|
+
dispatchEvent: jest.fn(),
|
|
36
|
+
}); }),
|
|
37
|
+
});
|
|
38
|
+
Object.defineProperty(window, "innerWidth", { writable: true, configurable: true, value: 1000 });
|
|
39
|
+
Object.defineProperty(window, "innerHeight", { writable: true, configurable: true, value: 800 });
|
|
40
|
+
});
|
|
41
|
+
var options = [
|
|
42
|
+
{ id: 1, label: "Upload file" },
|
|
43
|
+
{ id: 2, label: "Documents" },
|
|
44
|
+
];
|
|
45
|
+
var renderWithChakra = function (ui) {
|
|
46
|
+
return (0, react_2.render)(react_1.default.createElement(react_3.ChakraProvider, null, ui));
|
|
47
|
+
};
|
|
48
|
+
describe("Dropdown", function () {
|
|
49
|
+
it("renders the trigger and opens the menu on click", function () {
|
|
50
|
+
var onSelect = jest.fn();
|
|
51
|
+
renderWithChakra(react_1.default.createElement(DropDown_1.default, { ButtonText: "Actions", options: options, handleOptionSelect: onSelect }));
|
|
52
|
+
var trigger = react_2.screen.getByRole("button", { name: /actions/i });
|
|
53
|
+
expect(trigger).toBeInTheDocument();
|
|
54
|
+
expect(react_2.screen.queryByText("Upload file")).not.toBeInTheDocument();
|
|
55
|
+
react_2.fireEvent.click(trigger);
|
|
56
|
+
expect(react_2.screen.getByText("Upload file")).toBeInTheDocument();
|
|
57
|
+
expect(react_2.screen.getByText("Documents")).toBeInTheDocument();
|
|
58
|
+
});
|
|
59
|
+
it("calls handleOptionSelect with the chosen option", function () {
|
|
60
|
+
var onSelect = jest.fn();
|
|
61
|
+
renderWithChakra(react_1.default.createElement(DropDown_1.default, { ButtonText: "Actions", options: options, handleOptionSelect: onSelect }));
|
|
62
|
+
react_2.fireEvent.click(react_2.screen.getByRole("button", { name: /actions/i }));
|
|
63
|
+
react_2.fireEvent.click(react_2.screen.getByText("Documents"));
|
|
64
|
+
expect(onSelect).toHaveBeenCalledWith(2, "Documents");
|
|
65
|
+
});
|
|
66
|
+
it("clamps the menu within the viewport when the trigger is near the right edge", function () {
|
|
67
|
+
var onSelect = jest.fn();
|
|
68
|
+
var container = renderWithChakra(react_1.default.createElement(DropDown_1.default, { ButtonText: "Actions", options: options, handleOptionSelect: onSelect })).container;
|
|
69
|
+
var trigger = react_2.screen.getByRole("button", { name: /actions/i });
|
|
70
|
+
var anchor = container.querySelector("div");
|
|
71
|
+
// Trigger sits flush against the right edge (viewport width = 1000).
|
|
72
|
+
jest
|
|
73
|
+
.spyOn(anchor, "getBoundingClientRect")
|
|
74
|
+
.mockReturnValue({
|
|
75
|
+
top: 100,
|
|
76
|
+
bottom: 140,
|
|
77
|
+
left: 960,
|
|
78
|
+
right: 1000,
|
|
79
|
+
width: 40,
|
|
80
|
+
height: 40,
|
|
81
|
+
x: 960,
|
|
82
|
+
y: 100,
|
|
83
|
+
toJSON: function () { return ({}); },
|
|
84
|
+
});
|
|
85
|
+
react_2.fireEvent.click(trigger);
|
|
86
|
+
// Walk up from the rendered option to the fixed-position menu container.
|
|
87
|
+
var node = react_2.screen.getByText("Upload file");
|
|
88
|
+
var menu = null;
|
|
89
|
+
while (node) {
|
|
90
|
+
if (getComputedStyle(node).position === "fixed") {
|
|
91
|
+
menu = node;
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
node = node.parentElement;
|
|
95
|
+
}
|
|
96
|
+
expect(menu).toBeTruthy();
|
|
97
|
+
var left = parseFloat(getComputedStyle(menu).left);
|
|
98
|
+
// Must be pulled left of the trigger so it does not overflow the right edge.
|
|
99
|
+
expect(left).toBeLessThan(960);
|
|
100
|
+
expect(left).toBeGreaterThanOrEqual(8);
|
|
101
|
+
});
|
|
102
|
+
});
|
|
@@ -14,7 +14,10 @@ export type DropdownProps = {
|
|
|
14
14
|
ItemStyle?: React.CSSProperties;
|
|
15
15
|
LabelStyle?: React.CSSProperties;
|
|
16
16
|
ImageStyle?: React.CSSProperties;
|
|
17
|
-
|
|
17
|
+
/** Overall size of the trigger + options (like Button sizes). */
|
|
18
|
+
size?: "xs" | "sm" | "md" | "lg" | "xl";
|
|
19
|
+
/** @deprecated Use `size` instead. Kept for backward compatibility. */
|
|
20
|
+
optionsSize?: "sm" | "md" | "lg";
|
|
18
21
|
divider?: boolean;
|
|
19
22
|
};
|
|
20
23
|
type Option = {
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __makeTemplateObject = (this && this.__makeTemplateObject) || function (cooked, raw) {
|
|
3
|
+
if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; }
|
|
4
|
+
return cooked;
|
|
5
|
+
};
|
|
6
|
+
var __assign = (this && this.__assign) || function () {
|
|
7
|
+
__assign = Object.assign || function(t) {
|
|
8
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
9
|
+
s = arguments[i];
|
|
10
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
11
|
+
t[p] = s[p];
|
|
12
|
+
}
|
|
13
|
+
return t;
|
|
14
|
+
};
|
|
15
|
+
return __assign.apply(this, arguments);
|
|
16
|
+
};
|
|
17
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
18
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
19
|
+
};
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
var react_1 = __importDefault(require("react"));
|
|
22
|
+
var react_2 = require("@chakra-ui/react");
|
|
23
|
+
var lucide_react_1 = require("lucide-react");
|
|
24
|
+
var react_3 = require("@emotion/react");
|
|
25
|
+
var useCustomTheme_1 = require("../../Theme/useCustomTheme");
|
|
26
|
+
var float = (0, react_3.keyframes)(templateObject_1 || (templateObject_1 = __makeTemplateObject(["\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-8px); }\n"], ["\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-8px); }\n"])));
|
|
27
|
+
var sizeMap = {
|
|
28
|
+
sm: { badge: "48px", icon: 20, title: "0.95rem", desc: "0.8rem", gap: 2, pad: 6 },
|
|
29
|
+
md: { badge: "72px", icon: 30, title: "1.1rem", desc: "0.9rem", gap: 3, pad: 10 },
|
|
30
|
+
lg: { badge: "96px", icon: 40, title: "1.35rem", desc: "1rem", gap: 4, pad: 14 },
|
|
31
|
+
};
|
|
32
|
+
var EmptyState = function (_a) {
|
|
33
|
+
var _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
|
34
|
+
var _m = _a.title, title = _m === void 0 ? "No data found" : _m, description = _a.description, _o = _a.icon, IconComp = _o === void 0 ? lucide_react_1.Inbox : _o, image = _a.image, _p = _a.size, size = _p === void 0 ? "md" : _p, _q = _a.colorScheme, colorScheme = _q === void 0 ? "primary" : _q, _r = _a.variant, variant = _r === void 0 ? "default" : _r, action = _a.action, _s = _a.animate, animate = _s === void 0 ? false : _s, _t = _a.minH, minH = _t === void 0 ? "240px" : _t, sx = _a.sx;
|
|
35
|
+
var theme = (0, useCustomTheme_1.useCustomTheme)();
|
|
36
|
+
var s = sizeMap[size];
|
|
37
|
+
// Resolve accent palette: theme.colors[colorScheme] or theme.colors.semantic[*]
|
|
38
|
+
var semantic = ["success", "error", "warning", "info"];
|
|
39
|
+
var palette = semantic.includes(colorScheme)
|
|
40
|
+
? theme.colors.semantic[colorScheme]
|
|
41
|
+
: theme.colors[colorScheme];
|
|
42
|
+
var accent = (_b = palette === null || palette === void 0 ? void 0 : palette[500]) !== null && _b !== void 0 ? _b : theme.colors.primary[500];
|
|
43
|
+
var accentSoft = (_c = palette === null || palette === void 0 ? void 0 : palette[50]) !== null && _c !== void 0 ? _c : theme.colors.primary[50];
|
|
44
|
+
var containerStyles = variant === "subtle"
|
|
45
|
+
? { bg: (_e = (_d = theme.colors.gray) === null || _d === void 0 ? void 0 : _d[50]) !== null && _e !== void 0 ? _e : "#F8FAFC", borderRadius: "16px" }
|
|
46
|
+
: variant === "dashed"
|
|
47
|
+
? {
|
|
48
|
+
border: "2px dashed",
|
|
49
|
+
borderColor: (_g = (_f = theme.colors.gray) === null || _f === void 0 ? void 0 : _f[200]) !== null && _g !== void 0 ? _g : "#E2E8F0",
|
|
50
|
+
borderRadius: "16px",
|
|
51
|
+
bg: "transparent",
|
|
52
|
+
}
|
|
53
|
+
: {};
|
|
54
|
+
return (react_1.default.createElement(react_2.Flex, { direction: "column", align: "center", justify: "center", textAlign: "center", minH: minH, px: s.pad, py: s.pad, gap: s.gap, width: "100%", sx: __assign(__assign({}, containerStyles), sx) },
|
|
55
|
+
image ? (react_1.default.createElement(react_2.Image, { src: image, alt: title, boxSize: s.badge, objectFit: "contain", animation: animate ? "".concat(float, " 3s ease-in-out infinite") : undefined })) : (react_1.default.createElement(react_2.Flex, { align: "center", justify: "center", boxSize: s.badge, borderRadius: "full", bg: accentSoft, color: accent, animation: animate ? "".concat(float, " 3s ease-in-out infinite") : undefined, sx: {
|
|
56
|
+
boxShadow: "0 0 0 8px ".concat(accentSoft, "55"),
|
|
57
|
+
} },
|
|
58
|
+
react_1.default.createElement(IconComp, { size: s.icon, strokeWidth: 1.75 }))),
|
|
59
|
+
react_1.default.createElement(react_2.Box, null,
|
|
60
|
+
react_1.default.createElement(react_2.Text, { fontSize: s.title, fontWeight: 600, color: (_j = (_h = theme.colors.gray) === null || _h === void 0 ? void 0 : _h[800]) !== null && _j !== void 0 ? _j : "#1A202C", mt: 1 }, title),
|
|
61
|
+
description && (react_1.default.createElement(react_2.Text, { fontSize: s.desc, color: (_l = (_k = theme.colors.gray) === null || _k === void 0 ? void 0 : _k[500]) !== null && _l !== void 0 ? _l : "#718096", mt: 1, maxW: "380px" }, description))),
|
|
62
|
+
action && (react_1.default.createElement(react_2.Flex, { gap: 3, mt: 2, wrap: "wrap", justify: "center" }, action))));
|
|
63
|
+
};
|
|
64
|
+
exports.default = EmptyState;
|
|
65
|
+
var templateObject_1;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { ElementType, ReactNode } from "react";
|
|
2
|
+
import { BoxProps } from "@chakra-ui/react";
|
|
3
|
+
export type EmptyStateSize = "sm" | "md" | "lg";
|
|
4
|
+
export type EmptyStateColorScheme = "primary" | "secondary" | "tertiary" | "gray" | "success" | "error" | "warning" | "info";
|
|
5
|
+
export interface EmptyStateProps {
|
|
6
|
+
/** Heading text. Defaults to "No data found". */
|
|
7
|
+
title?: string;
|
|
8
|
+
/** Supporting line under the title. */
|
|
9
|
+
description?: string;
|
|
10
|
+
/** A lucide-react (or any) icon component rendered inside the badge. */
|
|
11
|
+
icon?: ElementType;
|
|
12
|
+
/** Illustration image URL. When provided it replaces the icon badge. */
|
|
13
|
+
image?: string;
|
|
14
|
+
/** Controls spacing, icon and font sizes. */
|
|
15
|
+
size?: EmptyStateSize;
|
|
16
|
+
/** Accent color for the icon badge. */
|
|
17
|
+
colorScheme?: EmptyStateColorScheme;
|
|
18
|
+
/** "default" plain, "subtle" tinted card, "dashed" dashed-border drop zone. */
|
|
19
|
+
variant?: "default" | "subtle" | "dashed";
|
|
20
|
+
/** Action node(s) — usually a Button or a pair of buttons. */
|
|
21
|
+
action?: ReactNode;
|
|
22
|
+
/** Float the icon gently to draw attention. */
|
|
23
|
+
animate?: boolean;
|
|
24
|
+
/** Minimum height of the container. */
|
|
25
|
+
minH?: BoxProps["minH"];
|
|
26
|
+
/** Escape hatch for extra Chakra styles on the outer container. */
|
|
27
|
+
sx?: BoxProps["sx"];
|
|
28
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
export interface SelectableField {
|
|
3
|
+
/** Unique value committed on confirm. */
|
|
4
|
+
field_name: string;
|
|
5
|
+
/** Human-readable label. */
|
|
6
|
+
field_label: string;
|
|
7
|
+
}
|
|
8
|
+
export interface FieldSelectModalProps {
|
|
9
|
+
isOpen: boolean;
|
|
10
|
+
onClose: () => void;
|
|
11
|
+
fields: SelectableField[];
|
|
12
|
+
/** Called with the chosen field_name values. */
|
|
13
|
+
onConfirm: (selected: string[]) => void;
|
|
14
|
+
title?: string;
|
|
15
|
+
confirmText?: string;
|
|
16
|
+
loadingText?: string;
|
|
17
|
+
isLoading?: boolean;
|
|
18
|
+
/** Pre-selected field_name values. Defaults to all selected. */
|
|
19
|
+
defaultSelected?: string[];
|
|
20
|
+
/** Columns in the field grid. */
|
|
21
|
+
columns?: number;
|
|
22
|
+
/** Show the search box (auto-hidden under 8 fields by default). */
|
|
23
|
+
searchable?: boolean;
|
|
24
|
+
}
|
|
25
|
+
declare const FieldSelectModal: React.FC<FieldSelectModalProps>;
|
|
26
|
+
export default FieldSelectModal;
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
36
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
37
|
+
if (ar || !(i in from)) {
|
|
38
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
39
|
+
ar[i] = from[i];
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
43
|
+
};
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
var react_1 = __importStar(require("react"));
|
|
46
|
+
var react_2 = require("@chakra-ui/react");
|
|
47
|
+
var framer_motion_1 = require("framer-motion");
|
|
48
|
+
var lucide_react_1 = require("lucide-react");
|
|
49
|
+
var useCustomTheme_1 = require("../../Theme/useCustomTheme");
|
|
50
|
+
var MotionModalContent = (0, framer_motion_1.motion)(react_2.ModalContent);
|
|
51
|
+
var FieldSelectModal = function (_a) {
|
|
52
|
+
var _b, _c, _d, _e, _f, _g;
|
|
53
|
+
var isOpen = _a.isOpen, onClose = _a.onClose, fields = _a.fields, onConfirm = _a.onConfirm, _h = _a.title, title = _h === void 0 ? "Select Fields" : _h, _j = _a.confirmText, confirmText = _j === void 0 ? "Apply" : _j, _k = _a.loadingText, loadingText = _k === void 0 ? "Applying..." : _k, _l = _a.isLoading, isLoading = _l === void 0 ? false : _l, defaultSelected = _a.defaultSelected, _m = _a.columns, columns = _m === void 0 ? 2 : _m, searchable = _a.searchable;
|
|
54
|
+
var theme = (0, useCustomTheme_1.useCustomTheme)();
|
|
55
|
+
var _o = (0, react_1.useState)([]), selected = _o[0], setSelected = _o[1];
|
|
56
|
+
var _p = (0, react_1.useState)(""), query = _p[0], setQuery = _p[1];
|
|
57
|
+
(0, react_1.useEffect)(function () {
|
|
58
|
+
if (isOpen) {
|
|
59
|
+
setSelected(defaultSelected !== null && defaultSelected !== void 0 ? defaultSelected : fields.map(function (f) { return f.field_name; }));
|
|
60
|
+
setQuery("");
|
|
61
|
+
}
|
|
62
|
+
}, [isOpen, fields, defaultSelected]);
|
|
63
|
+
var showSearch = searchable !== null && searchable !== void 0 ? searchable : fields.length >= 8;
|
|
64
|
+
var visibleFields = (0, react_1.useMemo)(function () {
|
|
65
|
+
if (!query.trim())
|
|
66
|
+
return fields;
|
|
67
|
+
var q = query.toLowerCase();
|
|
68
|
+
return fields.filter(function (f) { return f.field_label.toLowerCase().includes(q); });
|
|
69
|
+
}, [fields, query]);
|
|
70
|
+
var toggle = function (name) {
|
|
71
|
+
return setSelected(function (prev) {
|
|
72
|
+
return prev.includes(name) ? prev.filter(function (f) { return f !== name; }) : __spreadArray(__spreadArray([], prev, true), [name], false);
|
|
73
|
+
});
|
|
74
|
+
};
|
|
75
|
+
var isAllSelected = selected.length === fields.length && fields.length > 0;
|
|
76
|
+
var isIndeterminate = selected.length > 0 && selected.length < fields.length;
|
|
77
|
+
return (react_1.default.createElement(react_2.Modal, { isOpen: isOpen, onClose: onClose, size: "xl", isCentered: true },
|
|
78
|
+
react_1.default.createElement(react_2.ModalOverlay, { bg: "blackAlpha.400", backdropFilter: "blur(4px)" }),
|
|
79
|
+
react_1.default.createElement(MotionModalContent, { borderRadius: "16px", overflow: "hidden", maxH: "85vh", initial: { opacity: 0, scale: 0.96, y: 8 }, animate: { opacity: 1, scale: 1, y: 0 }, transition: { duration: 0.2, ease: "easeOut" } },
|
|
80
|
+
react_1.default.createElement(react_2.ModalHeader, { pb: 2 },
|
|
81
|
+
react_1.default.createElement(react_2.Text, { fontSize: "lg", fontWeight: 600 }, title),
|
|
82
|
+
react_1.default.createElement(react_2.Text, { fontSize: "sm", color: (_c = (_b = theme.colors.gray) === null || _b === void 0 ? void 0 : _b[500]) !== null && _c !== void 0 ? _c : "#718096", fontWeight: 400 },
|
|
83
|
+
selected.length,
|
|
84
|
+
" of ",
|
|
85
|
+
fields.length,
|
|
86
|
+
" selected")),
|
|
87
|
+
react_1.default.createElement(react_2.ModalCloseButton, null),
|
|
88
|
+
react_1.default.createElement(react_2.ModalBody, { overflowY: "auto" },
|
|
89
|
+
react_1.default.createElement(react_2.Flex, { align: "center", justify: "space-between", mb: 3, gap: 3, wrap: "wrap" },
|
|
90
|
+
react_1.default.createElement(react_2.Checkbox, { isChecked: isAllSelected, isIndeterminate: isIndeterminate, onChange: function (e) {
|
|
91
|
+
return setSelected(e.target.checked ? fields.map(function (f) { return f.field_name; }) : []);
|
|
92
|
+
}, fontWeight: 500 }, "Select all"),
|
|
93
|
+
showSearch && (react_1.default.createElement(react_2.InputGroup, { size: "sm", maxW: "220px" },
|
|
94
|
+
react_1.default.createElement(react_2.InputLeftElement, { pointerEvents: "none" },
|
|
95
|
+
react_1.default.createElement(lucide_react_1.Search, { size: 15, color: (_e = (_d = theme.colors.gray) === null || _d === void 0 ? void 0 : _d[400]) !== null && _e !== void 0 ? _e : "#A0AEC0" })),
|
|
96
|
+
react_1.default.createElement(react_2.Input, { placeholder: "Search fields", value: query, onChange: function (e) { return setQuery(e.target.value); }, borderRadius: "8px" })))),
|
|
97
|
+
react_1.default.createElement(react_2.SimpleGrid, { columns: columns, spacingX: 4, spacingY: 3 }, visibleFields.map(function (field) { return (react_1.default.createElement(react_2.Checkbox, { key: field.field_name, isChecked: selected.includes(field.field_name), onChange: function () { return toggle(field.field_name); } },
|
|
98
|
+
react_1.default.createElement(react_2.Text, { fontSize: "sm" }, field.field_label))); })),
|
|
99
|
+
visibleFields.length === 0 && (react_1.default.createElement(react_2.Text, { fontSize: "sm", color: (_g = (_f = theme.colors.gray) === null || _f === void 0 ? void 0 : _f[500]) !== null && _g !== void 0 ? _g : "#718096", textAlign: "center", py: 6 },
|
|
100
|
+
"No fields match \"",
|
|
101
|
+
query,
|
|
102
|
+
"\""))),
|
|
103
|
+
react_1.default.createElement(react_2.ModalFooter, { gap: 3 },
|
|
104
|
+
react_1.default.createElement(react_2.Button, { variant: "outline", colorScheme: "gray", size: "sm", onClick: onClose }, "Cancel"),
|
|
105
|
+
react_1.default.createElement(react_2.Button, { colorScheme: "primary", size: "sm", isLoading: isLoading, loadingText: loadingText, isDisabled: selected.length === 0, onClick: function () { return onConfirm(selected); } }, confirmText)))));
|
|
106
|
+
};
|
|
107
|
+
exports.default = FieldSelectModal;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { FilePreviewProps, FilePreviewTriggerProps } from "./FilePreviewProps";
|
|
3
|
+
export declare const FilePreview: React.FC<FilePreviewProps>;
|
|
4
|
+
/** Thumbnail with a hover "preview" affordance that opens {@link FilePreview}. */
|
|
5
|
+
export declare const FilePreviewTrigger: React.FC<FilePreviewTriggerProps>;
|
|
6
|
+
export default FilePreview;
|