@lax-wp/design-system 0.13.42 → 0.13.44
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/components/data-display/infinite-table/context.cjs.js +1 -1
- package/dist/components/data-display/infinite-table/context.cjs.js.map +1 -1
- package/dist/components/data-display/infinite-table/context.d.ts +1 -0
- package/dist/components/data-display/infinite-table/context.es.js +1 -0
- package/dist/components/data-display/infinite-table/context.es.js.map +1 -1
- package/dist/components/data-display/infinite-table/head/cell/Options.cjs.js +1 -1
- package/dist/components/data-display/infinite-table/head/cell/Options.cjs.js.map +1 -1
- package/dist/components/data-display/infinite-table/head/cell/Options.d.ts +2 -1
- package/dist/components/data-display/infinite-table/head/cell/Options.es.js +79 -70
- package/dist/components/data-display/infinite-table/head/cell/Options.es.js.map +1 -1
- package/dist/components/data-display/infinite-table/head/cell/Resizer.cjs.js +1 -1
- package/dist/components/data-display/infinite-table/head/cell/Resizer.cjs.js.map +1 -1
- package/dist/components/data-display/infinite-table/head/cell/Resizer.d.ts +2 -1
- package/dist/components/data-display/infinite-table/head/cell/Resizer.es.js +23 -19
- package/dist/components/data-display/infinite-table/head/cell/Resizer.es.js.map +1 -1
- package/dist/components/data-display/infinite-table/head/cell/index.cjs.js +1 -1
- package/dist/components/data-display/infinite-table/head/cell/index.cjs.js.map +1 -1
- package/dist/components/data-display/infinite-table/head/cell/index.es.js +46 -44
- package/dist/components/data-display/infinite-table/head/cell/index.es.js.map +1 -1
- package/dist/components/data-display/infinite-table/index.cjs.js +1 -1
- package/dist/components/data-display/infinite-table/index.cjs.js.map +1 -1
- package/dist/components/data-display/infinite-table/index.es.js +474 -470
- package/dist/components/data-display/infinite-table/index.es.js.map +1 -1
- package/dist/components/dropdown/Dropdown.cjs.js +1 -1
- package/dist/components/dropdown/Dropdown.cjs.js.map +1 -1
- package/dist/components/dropdown/Dropdown.es.js +11 -11
- package/dist/components/dropdown/Dropdown.es.js.map +1 -1
- package/dist/utils/table.cjs.js +1 -1
- package/dist/utils/table.cjs.js.map +1 -1
- package/dist/utils/table.d.ts +2 -1
- package/dist/utils/table.es.js +19 -18
- package/dist/utils/table.es.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { jsx as n, jsxs as x } from "react/jsx-runtime";
|
|
2
2
|
import { Dropdown as K, Popover as L } from "antd";
|
|
3
|
-
import D, { useState as
|
|
3
|
+
import D, { useState as g, useCallback as E } from "react";
|
|
4
4
|
import { cn as l } from "../../lib/utils.es.js";
|
|
5
|
-
import { ExpandMoreFilledIcon as
|
|
5
|
+
import { ExpandMoreFilledIcon as k, KeyboardArrowRightIcon as m } from "../icon/icons.generated.es.js";
|
|
6
6
|
function w(e) {
|
|
7
7
|
return !!e && !("type" in e);
|
|
8
8
|
}
|
|
@@ -14,7 +14,7 @@ const j = ({
|
|
|
14
14
|
}) => /* @__PURE__ */ n(
|
|
15
15
|
"div",
|
|
16
16
|
{
|
|
17
|
-
className: "bg-white dark:bg-black-800 border border-neutral-200 dark:border-black-600 rounded-[8px] shadow flex flex-col
|
|
17
|
+
className: "bg-white dark:bg-black-800 border border-neutral-200 dark:border-black-600 rounded-[8px] shadow flex flex-col p-0 border-none overflow-hidden",
|
|
18
18
|
style: { minWidth: o },
|
|
19
19
|
children: e?.map((r, s) => r ? "type" in r && r.type === "divider" ? /* @__PURE__ */ n(
|
|
20
20
|
"div",
|
|
@@ -51,7 +51,7 @@ const j = ({
|
|
|
51
51
|
isChild: o = !1,
|
|
52
52
|
onItemSelected: t
|
|
53
53
|
}) => {
|
|
54
|
-
const [r, s] =
|
|
54
|
+
const [r, s] = g(e.defaultOpen ?? !1), [i, u] = g(!1), b = Array.isArray(e.children) && e.children.length > 0, d = b && e.expandable === !0, c = b && !e.expandable, h = e.icon !== void 0, C = (p) => {
|
|
55
55
|
if (e.disabled) return;
|
|
56
56
|
if (d) {
|
|
57
57
|
s((y) => !y);
|
|
@@ -73,7 +73,7 @@ const j = ({
|
|
|
73
73
|
e.disabled ? "opacity-50 cursor-not-allowed" : "",
|
|
74
74
|
e.className
|
|
75
75
|
), z = d ? /* @__PURE__ */ n(
|
|
76
|
-
|
|
76
|
+
k,
|
|
77
77
|
{
|
|
78
78
|
size: 16,
|
|
79
79
|
className: l(
|
|
@@ -81,7 +81,7 @@ const j = ({
|
|
|
81
81
|
r ? "rotate-180" : "rotate-0"
|
|
82
82
|
)
|
|
83
83
|
}
|
|
84
|
-
) : c ? /* @__PURE__ */ n(
|
|
84
|
+
) : c ? /* @__PURE__ */ n(m, { size: 16, className: "flex-none" }) : null, v = D.isValidElement(e.label) && e.label.type?.displayName === "OptionButton", A = v && z ? D.cloneElement(e.label, {
|
|
85
85
|
chevron: z
|
|
86
86
|
}) : e.label, O = h ? (
|
|
87
87
|
// Native rendering: icon + label + optional indicator
|
|
@@ -109,7 +109,7 @@ const j = ({
|
|
|
109
109
|
)
|
|
110
110
|
] }),
|
|
111
111
|
d && /* @__PURE__ */ n(
|
|
112
|
-
|
|
112
|
+
k,
|
|
113
113
|
{
|
|
114
114
|
size: 20,
|
|
115
115
|
className: l(
|
|
@@ -119,7 +119,7 @@ const j = ({
|
|
|
119
119
|
}
|
|
120
120
|
),
|
|
121
121
|
c && /* @__PURE__ */ n(
|
|
122
|
-
|
|
122
|
+
m,
|
|
123
123
|
{
|
|
124
124
|
size: 20,
|
|
125
125
|
className: "flex-none text-neutral-500 dark:text-neutral-400"
|
|
@@ -133,7 +133,7 @@ const j = ({
|
|
|
133
133
|
/* @__PURE__ */ x("div", { className: M, onClick: e.disabled ? void 0 : C, children: [
|
|
134
134
|
/* @__PURE__ */ n("div", { className: l("min-w-0 flex-1"), children: A }),
|
|
135
135
|
!v && d && /* @__PURE__ */ n(
|
|
136
|
-
|
|
136
|
+
k,
|
|
137
137
|
{
|
|
138
138
|
size: 16,
|
|
139
139
|
className: l(
|
|
@@ -143,7 +143,7 @@ const j = ({
|
|
|
143
143
|
}
|
|
144
144
|
),
|
|
145
145
|
!v && c && /* @__PURE__ */ n(
|
|
146
|
-
|
|
146
|
+
m,
|
|
147
147
|
{
|
|
148
148
|
size: 16,
|
|
149
149
|
className: "flex-none mr-2 text-neutral-500 dark:text-neutral-400"
|
|
@@ -213,7 +213,7 @@ const j = ({
|
|
|
213
213
|
onOpenChange: t,
|
|
214
214
|
...r
|
|
215
215
|
}) => {
|
|
216
|
-
const [s, i] =
|
|
216
|
+
const [s, i] = g(0), u = (d, c) => {
|
|
217
217
|
d || i((h) => h + 1), t?.(d, c);
|
|
218
218
|
}, b = E(
|
|
219
219
|
() => /* @__PURE__ */ n(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dropdown.es.js","sources":["../../../src/components/dropdown/Dropdown.tsx"],"sourcesContent":["import { Dropdown as AntDropdown, Popover } from 'antd';\nimport type { DropdownProps as AntDropdownProps } from 'antd';\nimport React, { useCallback, useState } from 'react';\nimport { cn } from '../../lib/utils';\nimport {\n ExpandMoreFilledIcon,\n KeyboardArrowRightIcon,\n} from '../icon';\n\n// ─── Item Types ──────────────────────────────────────────────────────────────\n\nexport interface DropdownMenuItemDef {\n key?: string | number;\n label?: React.ReactNode;\n /** Icon displayed before the label (enables native rendering mode). */\n icon?: React.ReactNode;\n disabled?: boolean;\n /** Renders label in error-600 color. */\n danger?: boolean;\n className?: string;\n onClick?: (info: { key: string; domEvent: React.MouseEvent }) => void;\n children?: DropdownItemDef[];\n /**\n * When `true` and `children` is provided, items expand inline below the\n * parent rather than opening a side-panel popup. Defaults to `false`.\n */\n expandable?: boolean;\n /** When `expandable` is true, controls the initial open state. */\n defaultOpen?: boolean;\n}\n\nexport interface DropdownDividerDef {\n type: 'divider';\n key?: string | number;\n dashed?: boolean;\n}\n\nexport interface DropdownGroupDef {\n type: 'group';\n key?: string | number;\n label?: React.ReactNode;\n children?: DropdownItemDef[];\n}\n\nexport type DropdownItemDef =\n | DropdownMenuItemDef\n | DropdownDividerDef\n | DropdownGroupDef\n | null\n | undefined;\n\nexport interface DropdownMenuConfig {\n items?: DropdownItemDef[];\n onClick?: (info: {\n key: string;\n keyPath: string[];\n domEvent: React.MouseEvent;\n }) => void;\n [key: string]: unknown;\n}\n\nexport interface DropdownProps\n extends Omit<AntDropdownProps, 'overlay' | 'dropdownRender' | 'menu'> {\n menu?: DropdownMenuConfig;\n /** Minimum width of the dropdown panel in pixels. Defaults to 200. */\n minWidth?: number;\n}\n\n// ─── Internal helpers ────────────────────────────────────────────────────────\n\nfunction isMenuItemDef(item: DropdownItemDef): item is DropdownMenuItemDef {\n return !!item && !('type' in item);\n}\n\n// ─── DropdownMenuPanel ────────────────────────────────────────────────────────\n\ninterface DropdownMenuPanelProps {\n items?: DropdownItemDef[];\n onItemClick?: DropdownMenuConfig['onClick'];\n minWidth?: number;\n /** Fires after a leaf item is clicked. Used to close ancestor popovers. */\n onItemSelected?: () => void;\n}\n\nconst DropdownMenuPanel: React.FC<DropdownMenuPanelProps> = ({\n items,\n onItemClick,\n minWidth = 200,\n onItemSelected,\n}) => {\n return (\n <div\n className='bg-white dark:bg-black-800 border border-neutral-200 dark:border-black-600 rounded-[8px] shadow flex flex-col gap-1 p-0'\n style={{ minWidth }}\n >\n {items?.map((item, idx) => {\n if (!item) return null;\n\n if ('type' in item && item.type === 'divider') {\n return (\n <div\n key={item.key ?? `divider-${idx}`}\n className='h-px bg-neutral-200 dark:bg-black-600 mx-1 my-0.5'\n />\n );\n }\n\n if ('type' in item && item.type === 'group') {\n return (\n <div key={item.key ?? `group-${idx}`}>\n {item.label && (\n <div className='px-3 py-1 text-xs font-semibold text-neutral-500 dark:text-neutral-400 uppercase tracking-wide'>\n {item.label}\n </div>\n )}\n {item.children?.map((child, childIdx) =>\n isMenuItemDef(child) ? (\n <DropdownMenuItemRow\n key={(child as DropdownMenuItemDef).key ?? childIdx}\n item={child}\n onItemClick={onItemClick}\n onItemSelected={onItemSelected}\n />\n ) : null,\n )}\n </div>\n );\n }\n\n if (isMenuItemDef(item)) {\n return (\n <DropdownMenuItemRow\n key={item.key ?? idx}\n item={item}\n onItemClick={onItemClick}\n onItemSelected={onItemSelected}\n />\n );\n }\n\n return null;\n })}\n </div>\n );\n};\n\n// ─── DropdownMenuItemRow ─────────────────────────────────────────────────────\n\ninterface DropdownMenuItemRowProps {\n item: DropdownMenuItemDef;\n onItemClick?: DropdownMenuConfig['onClick'];\n isChild?: boolean;\n /** Closes the enclosing popover. Propagates upward through nested submenus. */\n onItemSelected?: () => void;\n}\n\nconst DropdownMenuItemRow: React.FC<DropdownMenuItemRowProps> = ({\n item,\n onItemClick,\n isChild = false,\n onItemSelected,\n}) => {\n const [expanded, setExpanded] = useState(item.defaultOpen ?? false);\n const [popoverOpen, setPopoverOpen] = useState(false);\n\n const hasChildren =\n Array.isArray(item.children) && item.children.length > 0;\n const isCollapsable = hasChildren && item.expandable === true;\n const isSubmenu = hasChildren && !item.expandable;\n const isNative = item.icon !== undefined;\n\n const handleClick = (e: React.MouseEvent) => {\n if (item.disabled) return;\n\n if (isCollapsable) {\n setExpanded((prev) => !prev);\n return;\n }\n\n const key = String(item.key ?? '');\n if (!isSubmenu) {\n item.onClick?.({ key, domEvent: e });\n onItemClick?.({ key, keyPath: [key], domEvent: e });\n onItemSelected?.();\n }\n };\n\n const handleChildSelected = useCallback(() => {\n setPopoverOpen(false);\n onItemSelected?.();\n }, [onItemSelected]);\n\n const containerClasses = cn(\n 'flex items-center justify-between rounded-[4px] cursor-pointer select-none w-full transition-colors duration-100',\n isChild ? 'pl-9 pr-1 min-h-[36px]' : 'px-0 py-0.5',\n !isNative && 'overflow-hidden',\n item.disabled ? 'opacity-50 cursor-not-allowed' : '',\n item.className,\n );\n\n const nativeContainerClasses = cn(\n 'flex items-center justify-between gap-3 rounded-[4px] cursor-pointer select-none w-full transition-colors duration-100 dark:bg-black-800',\n isChild ? 'pl-9 pr-1 py-2 min-h-[36px]' : 'px-3 py-2',\n item.disabled ? 'opacity-50 cursor-not-allowed' : '',\n item.className,\n );\n\n const compatChevron = isCollapsable ? (\n <ExpandMoreFilledIcon\n size={16}\n className={cn(\n 'flex-none transition-transform duration-200',\n expanded ? 'rotate-180' : 'rotate-0',\n )}\n />\n ) : isSubmenu ? (\n <KeyboardArrowRightIcon size={16} className='flex-none' />\n ) : null;\n\n const compatLabelIsOptionButton =\n React.isValidElement(item.label) &&\n (item.label.type as { displayName?: string })?.displayName === 'OptionButton';\n\n const compatLabelNode =\n compatLabelIsOptionButton && compatChevron\n ? React.cloneElement(item.label as React.ReactElement<{ chevron?: React.ReactNode }>, {\n chevron: compatChevron,\n })\n : item.label;\n\n const itemContent = isNative ? (\n // Native rendering: icon + label + optional indicator\n <div className={nativeContainerClasses} onClick={!item.disabled ? handleClick : undefined}>\n <div className='flex items-center gap-3 min-w-0 flex-1'>\n <span\n className={cn(\n 'flex-none flex items-center justify-center',\n isChild ? 'size-4' : 'size-5',\n )}\n >\n {item.icon}\n </span>\n <span\n className={cn(\n 'text-sm font-medium leading-5 whitespace-nowrap',\n item.danger\n ? 'text-error-600'\n : 'text-neutral-900 dark:text-neutral-100',\n )}\n >\n {item.label}\n </span>\n </div>\n\n {isCollapsable && (\n <ExpandMoreFilledIcon\n size={20}\n className={cn(\n 'flex-none text-neutral-500 dark:text-neutral-400 transition-transform duration-200',\n expanded ? 'rotate-180' : 'rotate-0',\n )}\n />\n )}\n {isSubmenu && (\n <KeyboardArrowRightIcon\n size={20}\n className='flex-none text-neutral-500 dark:text-neutral-400'\n />\n )}\n </div>\n ) : (\n // Compat rendering: label is a fully rendered node (e.g. OptionButton).\n // For OptionButton labels we inject the chevron as a prop so it sits inside\n // the button's hover area; for any other node we fall back to a sibling chevron.\n <div className={containerClasses} onClick={!item.disabled ? handleClick : undefined}>\n <div className={cn('min-w-0 flex-1')}>{compatLabelNode}</div>\n {!compatLabelIsOptionButton && isCollapsable && (\n <ExpandMoreFilledIcon\n size={16}\n className={cn(\n 'flex-none mr-2 text-neutral-500 dark:text-neutral-400 transition-transform duration-200',\n expanded ? 'rotate-180' : 'rotate-0',\n )}\n />\n )}\n {!compatLabelIsOptionButton && isSubmenu && (\n <KeyboardArrowRightIcon\n size={16}\n className='flex-none mr-2 text-neutral-500 dark:text-neutral-400'\n />\n )}\n </div>\n );\n\n if (isSubmenu) {\n return (\n <Popover\n open={popoverOpen}\n onOpenChange={setPopoverOpen}\n content={\n <DropdownMenuPanel\n items={item.children}\n onItemClick={onItemClick}\n onItemSelected={handleChildSelected}\n />\n }\n trigger='hover'\n placement='rightTop'\n overlayInnerStyle={{ padding: 0 }}\n overlayStyle={{ padding: 0 }}\n arrow={false}\n >\n <div>{itemContent}</div>\n </Popover>\n );\n }\n\n return (\n <div>\n {itemContent}\n {isCollapsable && (\n <div\n className={cn(\n 'grid transition-[grid-template-rows] duration-200 ease-in-out',\n expanded ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]',\n )}\n >\n <div className='overflow-hidden'>\n <div className='flex flex-col'>\n {item.children?.map((child, idx) => {\n if (!child || !isMenuItemDef(child)) return null;\n const isLast = idx === (item.children?.length ?? 0) - 1;\n return (\n <div key={(child as DropdownMenuItemDef).key ?? idx} className='relative'>\n {/* L-shaped connector: vertical segment from top to row midpoint, curves right */}\n <div\n className='absolute left-[19px] top-0 w-3.5 border-l border-b border-neutral-200 dark:border-black-600 rounded-bl-[6px] pointer-events-none'\n style={{ height: 'calc(50% + 4px)' }}\n />\n {/* Vertical bridge down to next sibling */}\n {!isLast && (\n <div className='absolute left-[19px] top-1/2 bottom-0 w-px bg-neutral-200 dark:bg-black-600 pointer-events-none' />\n )}\n <DropdownMenuItemRow\n item={child as DropdownMenuItemDef}\n onItemClick={onItemClick}\n isChild\n onItemSelected={onItemSelected}\n />\n </div>\n );\n })}\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n\n// ─── Dropdown ────────────────────────────────────────────────────────────────\n\nexport const Dropdown: React.FC<DropdownProps> = ({\n children,\n menu,\n minWidth = 200,\n onOpenChange,\n ...rest\n}) => {\n const [remountKey, setRemountKey] = useState(0);\n\n const handleOpenChange: AntDropdownProps['onOpenChange'] = (open, info) => {\n if (!open) {\n // Force-remount the panel on close so nested collapsible/submenu\n // open state is reset the next time the dropdown is opened.\n setRemountKey((k) => k + 1);\n }\n onOpenChange?.(open, info);\n };\n\n const popupRender = useCallback(\n () => (\n <DropdownMenuPanel\n key={remountKey}\n items={menu?.items as DropdownItemDef[]}\n onItemClick={menu?.onClick as DropdownMenuConfig['onClick']}\n minWidth={minWidth}\n />\n ),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [menu?.items, menu?.onClick, minWidth, remountKey],\n );\n\n return (\n <AntDropdown\n {...rest}\n onOpenChange={handleOpenChange}\n popupRender={popupRender}\n >\n {children as React.ReactElement}\n </AntDropdown>\n );\n};\n\nexport default Dropdown;\n"],"names":["isMenuItemDef","item","DropdownMenuPanel","items","onItemClick","minWidth","onItemSelected","jsx","idx","child","childIdx","DropdownMenuItemRow","isChild","expanded","setExpanded","useState","popoverOpen","setPopoverOpen","hasChildren","isCollapsable","isSubmenu","isNative","handleClick","e","prev","key","handleChildSelected","useCallback","containerClasses","cn","nativeContainerClasses","compatChevron","ExpandMoreFilledIcon","KeyboardArrowRightIcon","compatLabelIsOptionButton","React","compatLabelNode","itemContent","jsxs","Popover","isLast","Dropdown","children","menu","onOpenChange","rest","remountKey","setRemountKey","handleOpenChange","open","info","k","popupRender","AntDropdown"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Dropdown.es.js","sources":["../../../src/components/dropdown/Dropdown.tsx"],"sourcesContent":["import { Dropdown as AntDropdown, Popover } from 'antd';\nimport type { DropdownProps as AntDropdownProps } from 'antd';\nimport React, { useCallback, useState } from 'react';\nimport { cn } from '../../lib/utils';\nimport {\n ExpandMoreFilledIcon,\n KeyboardArrowRightIcon,\n} from '../icon';\n\n// ─── Item Types ──────────────────────────────────────────────────────────────\n\nexport interface DropdownMenuItemDef {\n key?: string | number;\n label?: React.ReactNode;\n /** Icon displayed before the label (enables native rendering mode). */\n icon?: React.ReactNode;\n disabled?: boolean;\n /** Renders label in error-600 color. */\n danger?: boolean;\n className?: string;\n onClick?: (info: { key: string; domEvent: React.MouseEvent }) => void;\n children?: DropdownItemDef[];\n /**\n * When `true` and `children` is provided, items expand inline below the\n * parent rather than opening a side-panel popup. Defaults to `false`.\n */\n expandable?: boolean;\n /** When `expandable` is true, controls the initial open state. */\n defaultOpen?: boolean;\n}\n\nexport interface DropdownDividerDef {\n type: 'divider';\n key?: string | number;\n dashed?: boolean;\n}\n\nexport interface DropdownGroupDef {\n type: 'group';\n key?: string | number;\n label?: React.ReactNode;\n children?: DropdownItemDef[];\n}\n\nexport type DropdownItemDef =\n | DropdownMenuItemDef\n | DropdownDividerDef\n | DropdownGroupDef\n | null\n | undefined;\n\nexport interface DropdownMenuConfig {\n items?: DropdownItemDef[];\n onClick?: (info: {\n key: string;\n keyPath: string[];\n domEvent: React.MouseEvent;\n }) => void;\n [key: string]: unknown;\n}\n\nexport interface DropdownProps\n extends Omit<AntDropdownProps, 'overlay' | 'dropdownRender' | 'menu'> {\n menu?: DropdownMenuConfig;\n /** Minimum width of the dropdown panel in pixels. Defaults to 200. */\n minWidth?: number;\n}\n\n// ─── Internal helpers ────────────────────────────────────────────────────────\n\nfunction isMenuItemDef(item: DropdownItemDef): item is DropdownMenuItemDef {\n return !!item && !('type' in item);\n}\n\n// ─── DropdownMenuPanel ────────────────────────────────────────────────────────\n\ninterface DropdownMenuPanelProps {\n items?: DropdownItemDef[];\n onItemClick?: DropdownMenuConfig['onClick'];\n minWidth?: number;\n /** Fires after a leaf item is clicked. Used to close ancestor popovers. */\n onItemSelected?: () => void;\n}\n\nconst DropdownMenuPanel: React.FC<DropdownMenuPanelProps> = ({\n items,\n onItemClick,\n minWidth = 200,\n onItemSelected,\n}) => {\n return (\n <div\n className='bg-white dark:bg-black-800 border border-neutral-200 dark:border-black-600 rounded-[8px] shadow flex flex-col p-0 border-none overflow-hidden'\n style={{ minWidth }}\n >\n {items?.map((item, idx) => {\n if (!item) return null;\n\n if ('type' in item && item.type === 'divider') {\n return (\n <div\n key={item.key ?? `divider-${idx}`}\n className='h-px bg-neutral-200 dark:bg-black-600 mx-1 my-0.5'\n />\n );\n }\n\n if ('type' in item && item.type === 'group') {\n return (\n <div key={item.key ?? `group-${idx}`}>\n {item.label && (\n <div className='px-3 py-1 text-xs font-semibold text-neutral-500 dark:text-neutral-400 uppercase tracking-wide'>\n {item.label}\n </div>\n )}\n {item.children?.map((child, childIdx) =>\n isMenuItemDef(child) ? (\n <DropdownMenuItemRow\n key={(child as DropdownMenuItemDef).key ?? childIdx}\n item={child}\n onItemClick={onItemClick}\n onItemSelected={onItemSelected}\n />\n ) : null,\n )}\n </div>\n );\n }\n\n if (isMenuItemDef(item)) {\n return (\n <DropdownMenuItemRow\n key={item.key ?? idx}\n item={item}\n onItemClick={onItemClick}\n onItemSelected={onItemSelected}\n />\n );\n }\n\n return null;\n })}\n </div>\n );\n};\n\n// ─── DropdownMenuItemRow ─────────────────────────────────────────────────────\n\ninterface DropdownMenuItemRowProps {\n item: DropdownMenuItemDef;\n onItemClick?: DropdownMenuConfig['onClick'];\n isChild?: boolean;\n /** Closes the enclosing popover. Propagates upward through nested submenus. */\n onItemSelected?: () => void;\n}\n\nconst DropdownMenuItemRow: React.FC<DropdownMenuItemRowProps> = ({\n item,\n onItemClick,\n isChild = false,\n onItemSelected,\n}) => {\n const [expanded, setExpanded] = useState(item.defaultOpen ?? false);\n const [popoverOpen, setPopoverOpen] = useState(false);\n\n const hasChildren =\n Array.isArray(item.children) && item.children.length > 0;\n const isCollapsable = hasChildren && item.expandable === true;\n const isSubmenu = hasChildren && !item.expandable;\n const isNative = item.icon !== undefined;\n\n const handleClick = (e: React.MouseEvent) => {\n if (item.disabled) return;\n\n if (isCollapsable) {\n setExpanded((prev) => !prev);\n return;\n }\n\n const key = String(item.key ?? '');\n if (!isSubmenu) {\n item.onClick?.({ key, domEvent: e });\n onItemClick?.({ key, keyPath: [key], domEvent: e });\n onItemSelected?.();\n }\n };\n\n const handleChildSelected = useCallback(() => {\n setPopoverOpen(false);\n onItemSelected?.();\n }, [onItemSelected]);\n\n const containerClasses = cn(\n 'flex items-center justify-between rounded-[4px] cursor-pointer select-none w-full transition-colors duration-100',\n isChild ? 'pl-9 pr-1 min-h-[36px]' : 'px-0 py-0.5',\n !isNative && 'overflow-hidden',\n item.disabled ? 'opacity-50 cursor-not-allowed' : '',\n item.className,\n );\n\n const nativeContainerClasses = cn(\n 'flex items-center justify-between gap-3 rounded-[4px] cursor-pointer select-none w-full transition-colors duration-100 dark:bg-black-800',\n isChild ? 'pl-9 pr-1 py-2 min-h-[36px]' : 'px-3 py-2',\n item.disabled ? 'opacity-50 cursor-not-allowed' : '',\n item.className,\n );\n\n const compatChevron = isCollapsable ? (\n <ExpandMoreFilledIcon\n size={16}\n className={cn(\n 'flex-none transition-transform duration-200',\n expanded ? 'rotate-180' : 'rotate-0',\n )}\n />\n ) : isSubmenu ? (\n <KeyboardArrowRightIcon size={16} className='flex-none' />\n ) : null;\n\n const compatLabelIsOptionButton =\n React.isValidElement(item.label) &&\n (item.label.type as { displayName?: string })?.displayName === 'OptionButton';\n\n const compatLabelNode =\n compatLabelIsOptionButton && compatChevron\n ? React.cloneElement(item.label as React.ReactElement<{ chevron?: React.ReactNode }>, {\n chevron: compatChevron,\n })\n : item.label;\n\n const itemContent = isNative ? (\n // Native rendering: icon + label + optional indicator\n <div className={nativeContainerClasses} onClick={!item.disabled ? handleClick : undefined}>\n <div className='flex items-center gap-3 min-w-0 flex-1'>\n <span\n className={cn(\n 'flex-none flex items-center justify-center',\n isChild ? 'size-4' : 'size-5',\n )}\n >\n {item.icon}\n </span>\n <span\n className={cn(\n 'text-sm font-medium leading-5 whitespace-nowrap',\n item.danger\n ? 'text-error-600'\n : 'text-neutral-900 dark:text-neutral-100',\n )}\n >\n {item.label}\n </span>\n </div>\n\n {isCollapsable && (\n <ExpandMoreFilledIcon\n size={20}\n className={cn(\n 'flex-none text-neutral-500 dark:text-neutral-400 transition-transform duration-200',\n expanded ? 'rotate-180' : 'rotate-0',\n )}\n />\n )}\n {isSubmenu && (\n <KeyboardArrowRightIcon\n size={20}\n className='flex-none text-neutral-500 dark:text-neutral-400'\n />\n )}\n </div>\n ) : (\n // Compat rendering: label is a fully rendered node (e.g. OptionButton).\n // For OptionButton labels we inject the chevron as a prop so it sits inside\n // the button's hover area; for any other node we fall back to a sibling chevron.\n <div className={containerClasses} onClick={!item.disabled ? handleClick : undefined}>\n <div className={cn('min-w-0 flex-1')}>{compatLabelNode}</div>\n {!compatLabelIsOptionButton && isCollapsable && (\n <ExpandMoreFilledIcon\n size={16}\n className={cn(\n 'flex-none mr-2 text-neutral-500 dark:text-neutral-400 transition-transform duration-200',\n expanded ? 'rotate-180' : 'rotate-0',\n )}\n />\n )}\n {!compatLabelIsOptionButton && isSubmenu && (\n <KeyboardArrowRightIcon\n size={16}\n className='flex-none mr-2 text-neutral-500 dark:text-neutral-400'\n />\n )}\n </div>\n );\n\n if (isSubmenu) {\n return (\n <Popover\n open={popoverOpen}\n onOpenChange={setPopoverOpen}\n content={\n <DropdownMenuPanel\n items={item.children}\n onItemClick={onItemClick}\n onItemSelected={handleChildSelected}\n />\n }\n trigger='hover'\n placement='rightTop'\n overlayInnerStyle={{ padding: 0 }}\n overlayStyle={{ padding: 0 }}\n arrow={false}\n >\n <div>{itemContent}</div>\n </Popover>\n );\n }\n\n return (\n <div>\n {itemContent}\n {isCollapsable && (\n <div\n className={cn(\n 'grid transition-[grid-template-rows] duration-200 ease-in-out',\n expanded ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]',\n )}\n >\n <div className='overflow-hidden'>\n <div className='flex flex-col'>\n {item.children?.map((child, idx) => {\n if (!child || !isMenuItemDef(child)) return null;\n const isLast = idx === (item.children?.length ?? 0) - 1;\n return (\n <div key={(child as DropdownMenuItemDef).key ?? idx} className='relative'>\n {/* L-shaped connector: vertical segment from top to row midpoint, curves right */}\n <div\n className='absolute left-[19px] top-0 w-3.5 border-l border-b border-neutral-200 dark:border-black-600 rounded-bl-[6px] pointer-events-none'\n style={{ height: 'calc(50% + 4px)' }}\n />\n {/* Vertical bridge down to next sibling */}\n {!isLast && (\n <div className='absolute left-[19px] top-1/2 bottom-0 w-px bg-neutral-200 dark:bg-black-600 pointer-events-none' />\n )}\n <DropdownMenuItemRow\n item={child as DropdownMenuItemDef}\n onItemClick={onItemClick}\n isChild\n onItemSelected={onItemSelected}\n />\n </div>\n );\n })}\n </div>\n </div>\n </div>\n )}\n </div>\n );\n};\n\n// ─── Dropdown ────────────────────────────────────────────────────────────────\n\nexport const Dropdown: React.FC<DropdownProps> = ({\n children,\n menu,\n minWidth = 200,\n onOpenChange,\n ...rest\n}) => {\n const [remountKey, setRemountKey] = useState(0);\n\n const handleOpenChange: AntDropdownProps['onOpenChange'] = (open, info) => {\n if (!open) {\n // Force-remount the panel on close so nested collapsible/submenu\n // open state is reset the next time the dropdown is opened.\n setRemountKey((k) => k + 1);\n }\n onOpenChange?.(open, info);\n };\n\n const popupRender = useCallback(\n () => (\n <DropdownMenuPanel\n key={remountKey}\n items={menu?.items as DropdownItemDef[]}\n onItemClick={menu?.onClick as DropdownMenuConfig['onClick']}\n minWidth={minWidth}\n />\n ),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [menu?.items, menu?.onClick, minWidth, remountKey],\n );\n\n return (\n <AntDropdown\n {...rest}\n onOpenChange={handleOpenChange}\n popupRender={popupRender}\n >\n {children as React.ReactElement}\n </AntDropdown>\n );\n};\n\nexport default Dropdown;\n"],"names":["isMenuItemDef","item","DropdownMenuPanel","items","onItemClick","minWidth","onItemSelected","jsx","idx","child","childIdx","DropdownMenuItemRow","isChild","expanded","setExpanded","useState","popoverOpen","setPopoverOpen","hasChildren","isCollapsable","isSubmenu","isNative","handleClick","e","prev","key","handleChildSelected","useCallback","containerClasses","cn","nativeContainerClasses","compatChevron","ExpandMoreFilledIcon","KeyboardArrowRightIcon","compatLabelIsOptionButton","React","compatLabelNode","itemContent","jsxs","Popover","isLast","Dropdown","children","menu","onOpenChange","rest","remountKey","setRemountKey","handleOpenChange","open","info","k","popupRender","AntDropdown"],"mappings":"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"}
|
package/dist/utils/table.cjs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b=(
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b=(t,s,r="asc")=>[...t].sort((n,l)=>{const i=n[s]??0,c=l[s]??0;return r==="asc"?i-c:c-i}),m=(t,s)=>{let r=s;const n=30;if(t?.length&&(r=r?.map((e,o)=>{const a=t.find(u=>u.name===e.Header);return a?{...e,order:a.order||o+r.length,width:a.width||e.width,visible:a.visible,sticky:a.sticky}:e})),r.filter(e=>e.visible).length>n){let e=0;r=r.map(o=>{if(o.visible){const a=e<n;return e++,{...o,visible:a}}return o})}const i=b(r,"order","asc"),c=i.filter(e=>e?.sticky)?.filter(e=>e.accessor);return[...i.filter(e=>!e?.sticky)?.filter(e=>e.accessor),...c]},p=(t,s)=>!t?.id||t.id==="untitled-view"?!0:t.created_by===s,f=t=>t&&t?.trim()?.replace(/^\*+|\*+$/g,"")?.replace(/[-/\\^$+?.()|[\]{}]/g,"\\$&")?.replace(/\*/g,".")||"",g=(t,s)=>{if(!t||!s)return"";try{let r=t;const n=/{{([^}]+)}}/g,l=t.match(n);return l&&s&&l.forEach(i=>{const c=i.slice(2,-2).trim(),d=s[c];d!=null&&(r=r.replace(i,String(d)))}),r}catch{return""}};exports.canEditTableView=p;exports.escapeRegExp=f;exports.mergeViewColumnsWithTableColumns=m;exports.parseMasterDataFormula=g;
|
|
2
2
|
//# sourceMappingURL=table.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.cjs.js","sources":["../../src/utils/table.ts"],"sourcesContent":["import type { IColumn } from '../components/data-display/infinite-table/types';\n\nconst sortArrayOfObject = <T,>(arr: T[], key: string, order: 'asc' | 'desc' = 'asc'): T[] => {\n return [...arr].sort((a, b) => {\n const aVal = ((a as Record<string, unknown>)[key] as number) ?? 0;\n const bVal = ((b as Record<string, unknown>)[key] as number) ?? 0;\n return order === 'asc' ? aVal - bVal : bVal - aVal;\n });\n};\n\nexport const mergeViewColumnsWithTableColumns = (viewColumns: IColumn[], tableColumns: IColumn[]) => {\n let updatedHeaders: IColumn[] = tableColumns;\n const MAX_VISIBLE_COLUMNS = 30;\n\n if (viewColumns?.length) {\n updatedHeaders = updatedHeaders?.map((item, index) => {\n const findHeader = viewColumns.find((_item) => _item.name === item.Header);\n if (findHeader) {\n return {\n ...item,\n order: findHeader.order || index + updatedHeaders.length,\n width: findHeader.width || item.width,\n visible: findHeader.visible,\n sticky: findHeader.sticky,\n };\n }\n return item;\n });\n }\n\n const visibleColumns = updatedHeaders.filter((header) => header.visible);\n\n if (visibleColumns.length > MAX_VISIBLE_COLUMNS) {\n let visibleCount = 0;\n updatedHeaders = updatedHeaders.map((header) => {\n if (header.visible) {\n const shouldBeVisible = visibleCount < MAX_VISIBLE_COLUMNS;\n visibleCount++;\n return { ...header, visible: shouldBeVisible };\n }\n return header;\n });\n }\n\n const sortedHeaders = sortArrayOfObject(updatedHeaders, 'order', 'asc');\n\n const stickyHeaders = sortedHeaders.filter((item) => item?.sticky)?.filter((_th) => _th.accessor);\n const nonStickyHeaders = sortedHeaders.filter((item) => !item?.sticky)?.filter((_th) => _th.accessor);\n\n return [...nonStickyHeaders, ...stickyHeaders];\n};\n\nexport const escapeRegExp = (string: string) => {\n if (!string) return '';\n const trimmed = string?.trim()?.replace(/^\\*+|\\*+$/g, '');\n const escaped = trimmed?.replace(/[-/\\\\^$+?.()|[\\]{}]/g, '\\\\$&');\n return escaped?.replace(/\\*/g, '.') || '';\n};\n\nexport const parseMasterDataFormula = (formula: string, reference: Record<string, unknown>): string => {\n if (!formula) return '';\n if (!reference) return '';\n\n try {\n let parsedFormula = formula;\n const variablePattern = /{{([^}]+)}}/g;\n const matches = formula.match(variablePattern);\n\n if (matches && reference) {\n matches.forEach((match) => {\n const variableName = match.slice(2, -2).trim();\n const variableValue = reference[variableName];\n if (variableValue !== undefined && variableValue !== null) {\n parsedFormula = parsedFormula.replace(match, String(variableValue));\n }\n });\n }\n\n return parsedFormula;\n } catch {\n return '';\n }\n};\n"],"names":["sortArrayOfObject","arr","key","order","a","b","aVal","bVal","mergeViewColumnsWithTableColumns","viewColumns","tableColumns","updatedHeaders","MAX_VISIBLE_COLUMNS","item","index","findHeader","_item","header","visibleCount","shouldBeVisible","sortedHeaders","stickyHeaders","_th","escapeRegExp","string","parseMasterDataFormula","formula","reference","parsedFormula","variablePattern","matches","match","variableName","variableValue"],"mappings":"gFAEA,MAAMA,EAAoB,CAAKC,EAAUC,EAAaC,EAAwB,QACrE,CAAC,GAAGF,CAAG,EAAE,KAAK,CAACG,EAAGC,IAAM,CAC7B,MAAMC,EAASF,EAA8BF,CAAG,GAAgB,EAC1DK,EAASF,EAA8BH,CAAG,GAAgB,EAChE,OAAOC,IAAU,MAAQG,EAAOC,EAAOA,EAAOD,CAChD,CAAC,EAGUE,EAAmC,CAACC,EAAwBC,IAA4B,CACnG,IAAIC,EAA4BD,EAChC,MAAME,EAAsB,GAoB5B,GAlBIH,GAAa,SACfE,EAAiBA,GAAgB,IAAI,CAACE,EAAMC,IAAU,CACpD,MAAMC,EAAaN,EAAY,KAAMO,GAAUA,EAAM,OAASH,EAAK,MAAM,EACzE,OAAIE,EACK,CACL,GAAGF,EACH,MAAOE,EAAW,OAASD,EAAQH,EAAe,OAClD,MAAOI,EAAW,OAASF,EAAK,MAChC,QAASE,EAAW,QACpB,OAAQA,EAAW,MAAA,EAGhBF,CACT,CAAC,GAGoBF,EAAe,OAAQM,GAAWA,EAAO,OAAO,EAEpD,OAASL,EAAqB,CAC/C,IAAIM,EAAe,EACnBP,EAAiBA,EAAe,IAAKM,GAAW,CAC9C,GAAIA,EAAO,QAAS,CAClB,MAAME,EAAkBD,EAAeN,EACvC,OAAAM,IACO,CAAE,GAAGD,EAAQ,QAASE,CAAA,CAC/B,CACA,OAAOF,CACT,CAAC,CACH,CAEA,MAAMG,EAAgBpB,EAAkBW,EAAgB,QAAS,KAAK,EAEhEU,EAAgBD,EAAc,OAAQP,GAASA,GAAM,MAAM,GAAG,OAAQS,GAAQA,EAAI,QAAQ,EAGhG,MAAO,CAAC,GAFiBF,EAAc,OAAQP,GAAS,CAACA,GAAM,MAAM,GAAG,OAAQS,GAAQA,EAAI,QAAQ,EAEvE,GAAGD,CAAa,CAC/C,
|
|
1
|
+
{"version":3,"file":"table.cjs.js","sources":["../../src/utils/table.ts"],"sourcesContent":["import type { IColumn, ITableView } from '../components/data-display/infinite-table/types';\n\nconst sortArrayOfObject = <T,>(arr: T[], key: string, order: 'asc' | 'desc' = 'asc'): T[] => {\n return [...arr].sort((a, b) => {\n const aVal = ((a as Record<string, unknown>)[key] as number) ?? 0;\n const bVal = ((b as Record<string, unknown>)[key] as number) ?? 0;\n return order === 'asc' ? aVal - bVal : bVal - aVal;\n });\n};\n\nexport const mergeViewColumnsWithTableColumns = (viewColumns: IColumn[], tableColumns: IColumn[]) => {\n let updatedHeaders: IColumn[] = tableColumns;\n const MAX_VISIBLE_COLUMNS = 30;\n\n if (viewColumns?.length) {\n updatedHeaders = updatedHeaders?.map((item, index) => {\n const findHeader = viewColumns.find((_item) => _item.name === item.Header);\n if (findHeader) {\n return {\n ...item,\n order: findHeader.order || index + updatedHeaders.length,\n width: findHeader.width || item.width,\n visible: findHeader.visible,\n sticky: findHeader.sticky,\n };\n }\n return item;\n });\n }\n\n const visibleColumns = updatedHeaders.filter((header) => header.visible);\n\n if (visibleColumns.length > MAX_VISIBLE_COLUMNS) {\n let visibleCount = 0;\n updatedHeaders = updatedHeaders.map((header) => {\n if (header.visible) {\n const shouldBeVisible = visibleCount < MAX_VISIBLE_COLUMNS;\n visibleCount++;\n return { ...header, visible: shouldBeVisible };\n }\n return header;\n });\n }\n\n const sortedHeaders = sortArrayOfObject(updatedHeaders, 'order', 'asc');\n\n const stickyHeaders = sortedHeaders.filter((item) => item?.sticky)?.filter((_th) => _th.accessor);\n const nonStickyHeaders = sortedHeaders.filter((item) => !item?.sticky)?.filter((_th) => _th.accessor);\n\n return [...nonStickyHeaders, ...stickyHeaders];\n};\n\n// A view that hasn't been persisted yet (no id, or the local \"untitled-view\" draft) is always\n// editable — it's the current user's own in-progress draft. Any persisted view (including a\n// global/shared view with no individual owner, i.e. created_by is null) can only be edited by\n// the user who created it.\nexport const canEditTableView = (view?: ITableView | null, userId?: string): boolean => {\n if (!view?.id || view.id === 'untitled-view') return true;\n return view.created_by === userId;\n};\n\nexport const escapeRegExp = (string: string) => {\n if (!string) return '';\n const trimmed = string?.trim()?.replace(/^\\*+|\\*+$/g, '');\n const escaped = trimmed?.replace(/[-/\\\\^$+?.()|[\\]{}]/g, '\\\\$&');\n return escaped?.replace(/\\*/g, '.') || '';\n};\n\nexport const parseMasterDataFormula = (formula: string, reference: Record<string, unknown>): string => {\n if (!formula) return '';\n if (!reference) return '';\n\n try {\n let parsedFormula = formula;\n const variablePattern = /{{([^}]+)}}/g;\n const matches = formula.match(variablePattern);\n\n if (matches && reference) {\n matches.forEach((match) => {\n const variableName = match.slice(2, -2).trim();\n const variableValue = reference[variableName];\n if (variableValue !== undefined && variableValue !== null) {\n parsedFormula = parsedFormula.replace(match, String(variableValue));\n }\n });\n }\n\n return parsedFormula;\n } catch {\n return '';\n }\n};\n"],"names":["sortArrayOfObject","arr","key","order","a","b","aVal","bVal","mergeViewColumnsWithTableColumns","viewColumns","tableColumns","updatedHeaders","MAX_VISIBLE_COLUMNS","item","index","findHeader","_item","header","visibleCount","shouldBeVisible","sortedHeaders","stickyHeaders","_th","canEditTableView","view","userId","escapeRegExp","string","parseMasterDataFormula","formula","reference","parsedFormula","variablePattern","matches","match","variableName","variableValue"],"mappings":"gFAEA,MAAMA,EAAoB,CAAKC,EAAUC,EAAaC,EAAwB,QACrE,CAAC,GAAGF,CAAG,EAAE,KAAK,CAACG,EAAGC,IAAM,CAC7B,MAAMC,EAASF,EAA8BF,CAAG,GAAgB,EAC1DK,EAASF,EAA8BH,CAAG,GAAgB,EAChE,OAAOC,IAAU,MAAQG,EAAOC,EAAOA,EAAOD,CAChD,CAAC,EAGUE,EAAmC,CAACC,EAAwBC,IAA4B,CACnG,IAAIC,EAA4BD,EAChC,MAAME,EAAsB,GAoB5B,GAlBIH,GAAa,SACfE,EAAiBA,GAAgB,IAAI,CAACE,EAAMC,IAAU,CACpD,MAAMC,EAAaN,EAAY,KAAMO,GAAUA,EAAM,OAASH,EAAK,MAAM,EACzE,OAAIE,EACK,CACL,GAAGF,EACH,MAAOE,EAAW,OAASD,EAAQH,EAAe,OAClD,MAAOI,EAAW,OAASF,EAAK,MAChC,QAASE,EAAW,QACpB,OAAQA,EAAW,MAAA,EAGhBF,CACT,CAAC,GAGoBF,EAAe,OAAQM,GAAWA,EAAO,OAAO,EAEpD,OAASL,EAAqB,CAC/C,IAAIM,EAAe,EACnBP,EAAiBA,EAAe,IAAKM,GAAW,CAC9C,GAAIA,EAAO,QAAS,CAClB,MAAME,EAAkBD,EAAeN,EACvC,OAAAM,IACO,CAAE,GAAGD,EAAQ,QAASE,CAAA,CAC/B,CACA,OAAOF,CACT,CAAC,CACH,CAEA,MAAMG,EAAgBpB,EAAkBW,EAAgB,QAAS,KAAK,EAEhEU,EAAgBD,EAAc,OAAQP,GAASA,GAAM,MAAM,GAAG,OAAQS,GAAQA,EAAI,QAAQ,EAGhG,MAAO,CAAC,GAFiBF,EAAc,OAAQP,GAAS,CAACA,GAAM,MAAM,GAAG,OAAQS,GAAQA,EAAI,QAAQ,EAEvE,GAAGD,CAAa,CAC/C,EAMaE,EAAmB,CAACC,EAA0BC,IACrD,CAACD,GAAM,IAAMA,EAAK,KAAO,gBAAwB,GAC9CA,EAAK,aAAeC,EAGhBC,EAAgBC,GACtBA,GACWA,GAAQ,KAAA,GAAQ,QAAQ,aAAc,EAAE,GAC/B,QAAQ,uBAAwB,MAAM,GAC/C,QAAQ,MAAO,GAAG,GAAK,GAG5BC,EAAyB,CAACC,EAAiBC,IAA+C,CAErG,GADI,CAACD,GACD,CAACC,EAAW,MAAO,GAEvB,GAAI,CACF,IAAIC,EAAgBF,EACpB,MAAMG,EAAkB,eAClBC,EAAUJ,EAAQ,MAAMG,CAAe,EAE7C,OAAIC,GAAWH,GACbG,EAAQ,QAASC,GAAU,CACzB,MAAMC,EAAeD,EAAM,MAAM,EAAG,EAAE,EAAE,KAAA,EAClCE,EAAgBN,EAAUK,CAAY,EACTC,GAAkB,OACnDL,EAAgBA,EAAc,QAAQG,EAAO,OAAOE,CAAa,CAAC,EAEtE,CAAC,EAGIL,CACT,MAAQ,CACN,MAAO,EACT,CACF"}
|
package/dist/utils/table.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { IColumn } from '../components/data-display/infinite-table/types';
|
|
1
|
+
import type { IColumn, ITableView } from '../components/data-display/infinite-table/types';
|
|
2
2
|
export declare const mergeViewColumnsWithTableColumns: (viewColumns: IColumn[], tableColumns: IColumn[]) => IColumn[];
|
|
3
|
+
export declare const canEditTableView: (view?: ITableView | null, userId?: string) => boolean;
|
|
3
4
|
export declare const escapeRegExp: (string: string) => string;
|
|
4
5
|
export declare const parseMasterDataFormula: (formula: string, reference: Record<string, unknown>) => string;
|
package/dist/utils/table.es.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
const b = (
|
|
1
|
+
const b = (t, s, r = "asc") => [...t].sort((c, l) => {
|
|
2
2
|
const i = c[s] ?? 0, a = l[s] ?? 0;
|
|
3
|
-
return
|
|
4
|
-
}), f = (
|
|
5
|
-
let
|
|
3
|
+
return r === "asc" ? i - a : a - i;
|
|
4
|
+
}), f = (t, s) => {
|
|
5
|
+
let r = s;
|
|
6
6
|
const c = 30;
|
|
7
|
-
if (
|
|
8
|
-
const n =
|
|
7
|
+
if (t?.length && (r = r?.map((e, o) => {
|
|
8
|
+
const n = t.find((u) => u.name === e.Header);
|
|
9
9
|
return n ? {
|
|
10
10
|
...e,
|
|
11
|
-
order: n.order || o +
|
|
11
|
+
order: n.order || o + r.length,
|
|
12
12
|
width: n.width || e.width,
|
|
13
13
|
visible: n.visible,
|
|
14
14
|
sticky: n.sticky
|
|
15
15
|
} : e;
|
|
16
|
-
})),
|
|
16
|
+
})), r.filter((e) => e.visible).length > c) {
|
|
17
17
|
let e = 0;
|
|
18
|
-
|
|
18
|
+
r = r.map((o) => {
|
|
19
19
|
if (o.visible) {
|
|
20
20
|
const n = e < c;
|
|
21
21
|
return e++, { ...o, visible: n };
|
|
@@ -23,24 +23,25 @@ const b = (r, s, t = "asc") => [...r].sort((c, l) => {
|
|
|
23
23
|
return o;
|
|
24
24
|
});
|
|
25
25
|
}
|
|
26
|
-
const i = b(
|
|
26
|
+
const i = b(r, "order", "asc"), a = i.filter((e) => e?.sticky)?.filter((e) => e.accessor);
|
|
27
27
|
return [...i.filter((e) => !e?.sticky)?.filter((e) => e.accessor), ...a];
|
|
28
|
-
}, p = (
|
|
29
|
-
if (!
|
|
28
|
+
}, p = (t, s) => !t?.id || t.id === "untitled-view" ? !0 : t.created_by === s, m = (t) => t && t?.trim()?.replace(/^\*+|\*+$/g, "")?.replace(/[-/\\^$+?.()|[\]{}]/g, "\\$&")?.replace(/\*/g, ".") || "", v = (t, s) => {
|
|
29
|
+
if (!t || !s) return "";
|
|
30
30
|
try {
|
|
31
|
-
let
|
|
32
|
-
const c = /{{([^}]+)}}/g, l =
|
|
31
|
+
let r = t;
|
|
32
|
+
const c = /{{([^}]+)}}/g, l = t.match(c);
|
|
33
33
|
return l && s && l.forEach((i) => {
|
|
34
34
|
const a = i.slice(2, -2).trim(), d = s[a];
|
|
35
|
-
d != null && (
|
|
36
|
-
}),
|
|
35
|
+
d != null && (r = r.replace(i, String(d)));
|
|
36
|
+
}), r;
|
|
37
37
|
} catch {
|
|
38
38
|
return "";
|
|
39
39
|
}
|
|
40
40
|
};
|
|
41
41
|
export {
|
|
42
|
-
p as
|
|
42
|
+
p as canEditTableView,
|
|
43
|
+
m as escapeRegExp,
|
|
43
44
|
f as mergeViewColumnsWithTableColumns,
|
|
44
|
-
|
|
45
|
+
v as parseMasterDataFormula
|
|
45
46
|
};
|
|
46
47
|
//# sourceMappingURL=table.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.es.js","sources":["../../src/utils/table.ts"],"sourcesContent":["import type { IColumn } from '../components/data-display/infinite-table/types';\n\nconst sortArrayOfObject = <T,>(arr: T[], key: string, order: 'asc' | 'desc' = 'asc'): T[] => {\n return [...arr].sort((a, b) => {\n const aVal = ((a as Record<string, unknown>)[key] as number) ?? 0;\n const bVal = ((b as Record<string, unknown>)[key] as number) ?? 0;\n return order === 'asc' ? aVal - bVal : bVal - aVal;\n });\n};\n\nexport const mergeViewColumnsWithTableColumns = (viewColumns: IColumn[], tableColumns: IColumn[]) => {\n let updatedHeaders: IColumn[] = tableColumns;\n const MAX_VISIBLE_COLUMNS = 30;\n\n if (viewColumns?.length) {\n updatedHeaders = updatedHeaders?.map((item, index) => {\n const findHeader = viewColumns.find((_item) => _item.name === item.Header);\n if (findHeader) {\n return {\n ...item,\n order: findHeader.order || index + updatedHeaders.length,\n width: findHeader.width || item.width,\n visible: findHeader.visible,\n sticky: findHeader.sticky,\n };\n }\n return item;\n });\n }\n\n const visibleColumns = updatedHeaders.filter((header) => header.visible);\n\n if (visibleColumns.length > MAX_VISIBLE_COLUMNS) {\n let visibleCount = 0;\n updatedHeaders = updatedHeaders.map((header) => {\n if (header.visible) {\n const shouldBeVisible = visibleCount < MAX_VISIBLE_COLUMNS;\n visibleCount++;\n return { ...header, visible: shouldBeVisible };\n }\n return header;\n });\n }\n\n const sortedHeaders = sortArrayOfObject(updatedHeaders, 'order', 'asc');\n\n const stickyHeaders = sortedHeaders.filter((item) => item?.sticky)?.filter((_th) => _th.accessor);\n const nonStickyHeaders = sortedHeaders.filter((item) => !item?.sticky)?.filter((_th) => _th.accessor);\n\n return [...nonStickyHeaders, ...stickyHeaders];\n};\n\nexport const escapeRegExp = (string: string) => {\n if (!string) return '';\n const trimmed = string?.trim()?.replace(/^\\*+|\\*+$/g, '');\n const escaped = trimmed?.replace(/[-/\\\\^$+?.()|[\\]{}]/g, '\\\\$&');\n return escaped?.replace(/\\*/g, '.') || '';\n};\n\nexport const parseMasterDataFormula = (formula: string, reference: Record<string, unknown>): string => {\n if (!formula) return '';\n if (!reference) return '';\n\n try {\n let parsedFormula = formula;\n const variablePattern = /{{([^}]+)}}/g;\n const matches = formula.match(variablePattern);\n\n if (matches && reference) {\n matches.forEach((match) => {\n const variableName = match.slice(2, -2).trim();\n const variableValue = reference[variableName];\n if (variableValue !== undefined && variableValue !== null) {\n parsedFormula = parsedFormula.replace(match, String(variableValue));\n }\n });\n }\n\n return parsedFormula;\n } catch {\n return '';\n }\n};\n"],"names":["sortArrayOfObject","arr","key","order","a","b","aVal","bVal","mergeViewColumnsWithTableColumns","viewColumns","tableColumns","updatedHeaders","MAX_VISIBLE_COLUMNS","item","index","findHeader","_item","header","visibleCount","shouldBeVisible","sortedHeaders","stickyHeaders","_th","escapeRegExp","string","parseMasterDataFormula","formula","reference","parsedFormula","variablePattern","matches","match","variableName","variableValue"],"mappings":"AAEA,MAAMA,IAAoB,CAAKC,GAAUC,GAAaC,IAAwB,UACrE,CAAC,GAAGF,CAAG,EAAE,KAAK,CAACG,GAAGC,MAAM;AAC7B,QAAMC,IAASF,EAA8BF,CAAG,KAAgB,GAC1DK,IAASF,EAA8BH,CAAG,KAAgB;AAChE,SAAOC,MAAU,QAAQG,IAAOC,IAAOA,IAAOD;AAChD,CAAC,GAGUE,IAAmC,CAACC,GAAwBC,MAA4B;AACnG,MAAIC,IAA4BD;AAChC,QAAME,IAAsB;AAoB5B,MAlBIH,GAAa,WACfE,IAAiBA,GAAgB,IAAI,CAACE,GAAMC,MAAU;AACpD,UAAMC,IAAaN,EAAY,KAAK,CAACO,MAAUA,EAAM,SAASH,EAAK,MAAM;AACzE,WAAIE,IACK;AAAA,MACL,GAAGF;AAAA,MACH,OAAOE,EAAW,SAASD,IAAQH,EAAe;AAAA,MAClD,OAAOI,EAAW,SAASF,EAAK;AAAA,MAChC,SAASE,EAAW;AAAA,MACpB,QAAQA,EAAW;AAAA,IAAA,IAGhBF;AAAA,EACT,CAAC,IAGoBF,EAAe,OAAO,CAACM,MAAWA,EAAO,OAAO,EAEpD,SAASL,GAAqB;AAC/C,QAAIM,IAAe;AACnB,IAAAP,IAAiBA,EAAe,IAAI,CAACM,MAAW;AAC9C,UAAIA,EAAO,SAAS;AAClB,cAAME,IAAkBD,IAAeN;AACvC,eAAAM,KACO,EAAE,GAAGD,GAAQ,SAASE,EAAA;AAAA,MAC/B;AACA,aAAOF;AAAA,IACT,CAAC;AAAA,EACH;AAEA,QAAMG,IAAgBpB,EAAkBW,GAAgB,SAAS,KAAK,GAEhEU,IAAgBD,EAAc,OAAO,CAACP,MAASA,GAAM,MAAM,GAAG,OAAO,CAACS,MAAQA,EAAI,QAAQ;AAGhG,SAAO,CAAC,GAFiBF,EAAc,OAAO,CAACP,MAAS,CAACA,GAAM,MAAM,GAAG,OAAO,CAACS,MAAQA,EAAI,QAAQ,GAEvE,GAAGD,CAAa;AAC/C,
|
|
1
|
+
{"version":3,"file":"table.es.js","sources":["../../src/utils/table.ts"],"sourcesContent":["import type { IColumn, ITableView } from '../components/data-display/infinite-table/types';\n\nconst sortArrayOfObject = <T,>(arr: T[], key: string, order: 'asc' | 'desc' = 'asc'): T[] => {\n return [...arr].sort((a, b) => {\n const aVal = ((a as Record<string, unknown>)[key] as number) ?? 0;\n const bVal = ((b as Record<string, unknown>)[key] as number) ?? 0;\n return order === 'asc' ? aVal - bVal : bVal - aVal;\n });\n};\n\nexport const mergeViewColumnsWithTableColumns = (viewColumns: IColumn[], tableColumns: IColumn[]) => {\n let updatedHeaders: IColumn[] = tableColumns;\n const MAX_VISIBLE_COLUMNS = 30;\n\n if (viewColumns?.length) {\n updatedHeaders = updatedHeaders?.map((item, index) => {\n const findHeader = viewColumns.find((_item) => _item.name === item.Header);\n if (findHeader) {\n return {\n ...item,\n order: findHeader.order || index + updatedHeaders.length,\n width: findHeader.width || item.width,\n visible: findHeader.visible,\n sticky: findHeader.sticky,\n };\n }\n return item;\n });\n }\n\n const visibleColumns = updatedHeaders.filter((header) => header.visible);\n\n if (visibleColumns.length > MAX_VISIBLE_COLUMNS) {\n let visibleCount = 0;\n updatedHeaders = updatedHeaders.map((header) => {\n if (header.visible) {\n const shouldBeVisible = visibleCount < MAX_VISIBLE_COLUMNS;\n visibleCount++;\n return { ...header, visible: shouldBeVisible };\n }\n return header;\n });\n }\n\n const sortedHeaders = sortArrayOfObject(updatedHeaders, 'order', 'asc');\n\n const stickyHeaders = sortedHeaders.filter((item) => item?.sticky)?.filter((_th) => _th.accessor);\n const nonStickyHeaders = sortedHeaders.filter((item) => !item?.sticky)?.filter((_th) => _th.accessor);\n\n return [...nonStickyHeaders, ...stickyHeaders];\n};\n\n// A view that hasn't been persisted yet (no id, or the local \"untitled-view\" draft) is always\n// editable — it's the current user's own in-progress draft. Any persisted view (including a\n// global/shared view with no individual owner, i.e. created_by is null) can only be edited by\n// the user who created it.\nexport const canEditTableView = (view?: ITableView | null, userId?: string): boolean => {\n if (!view?.id || view.id === 'untitled-view') return true;\n return view.created_by === userId;\n};\n\nexport const escapeRegExp = (string: string) => {\n if (!string) return '';\n const trimmed = string?.trim()?.replace(/^\\*+|\\*+$/g, '');\n const escaped = trimmed?.replace(/[-/\\\\^$+?.()|[\\]{}]/g, '\\\\$&');\n return escaped?.replace(/\\*/g, '.') || '';\n};\n\nexport const parseMasterDataFormula = (formula: string, reference: Record<string, unknown>): string => {\n if (!formula) return '';\n if (!reference) return '';\n\n try {\n let parsedFormula = formula;\n const variablePattern = /{{([^}]+)}}/g;\n const matches = formula.match(variablePattern);\n\n if (matches && reference) {\n matches.forEach((match) => {\n const variableName = match.slice(2, -2).trim();\n const variableValue = reference[variableName];\n if (variableValue !== undefined && variableValue !== null) {\n parsedFormula = parsedFormula.replace(match, String(variableValue));\n }\n });\n }\n\n return parsedFormula;\n } catch {\n return '';\n }\n};\n"],"names":["sortArrayOfObject","arr","key","order","a","b","aVal","bVal","mergeViewColumnsWithTableColumns","viewColumns","tableColumns","updatedHeaders","MAX_VISIBLE_COLUMNS","item","index","findHeader","_item","header","visibleCount","shouldBeVisible","sortedHeaders","stickyHeaders","_th","canEditTableView","view","userId","escapeRegExp","string","parseMasterDataFormula","formula","reference","parsedFormula","variablePattern","matches","match","variableName","variableValue"],"mappings":"AAEA,MAAMA,IAAoB,CAAKC,GAAUC,GAAaC,IAAwB,UACrE,CAAC,GAAGF,CAAG,EAAE,KAAK,CAACG,GAAGC,MAAM;AAC7B,QAAMC,IAASF,EAA8BF,CAAG,KAAgB,GAC1DK,IAASF,EAA8BH,CAAG,KAAgB;AAChE,SAAOC,MAAU,QAAQG,IAAOC,IAAOA,IAAOD;AAChD,CAAC,GAGUE,IAAmC,CAACC,GAAwBC,MAA4B;AACnG,MAAIC,IAA4BD;AAChC,QAAME,IAAsB;AAoB5B,MAlBIH,GAAa,WACfE,IAAiBA,GAAgB,IAAI,CAACE,GAAMC,MAAU;AACpD,UAAMC,IAAaN,EAAY,KAAK,CAACO,MAAUA,EAAM,SAASH,EAAK,MAAM;AACzE,WAAIE,IACK;AAAA,MACL,GAAGF;AAAA,MACH,OAAOE,EAAW,SAASD,IAAQH,EAAe;AAAA,MAClD,OAAOI,EAAW,SAASF,EAAK;AAAA,MAChC,SAASE,EAAW;AAAA,MACpB,QAAQA,EAAW;AAAA,IAAA,IAGhBF;AAAA,EACT,CAAC,IAGoBF,EAAe,OAAO,CAACM,MAAWA,EAAO,OAAO,EAEpD,SAASL,GAAqB;AAC/C,QAAIM,IAAe;AACnB,IAAAP,IAAiBA,EAAe,IAAI,CAACM,MAAW;AAC9C,UAAIA,EAAO,SAAS;AAClB,cAAME,IAAkBD,IAAeN;AACvC,eAAAM,KACO,EAAE,GAAGD,GAAQ,SAASE,EAAA;AAAA,MAC/B;AACA,aAAOF;AAAA,IACT,CAAC;AAAA,EACH;AAEA,QAAMG,IAAgBpB,EAAkBW,GAAgB,SAAS,KAAK,GAEhEU,IAAgBD,EAAc,OAAO,CAACP,MAASA,GAAM,MAAM,GAAG,OAAO,CAACS,MAAQA,EAAI,QAAQ;AAGhG,SAAO,CAAC,GAFiBF,EAAc,OAAO,CAACP,MAAS,CAACA,GAAM,MAAM,GAAG,OAAO,CAACS,MAAQA,EAAI,QAAQ,GAEvE,GAAGD,CAAa;AAC/C,GAMaE,IAAmB,CAACC,GAA0BC,MACrD,CAACD,GAAM,MAAMA,EAAK,OAAO,kBAAwB,KAC9CA,EAAK,eAAeC,GAGhBC,IAAe,CAACC,MACtBA,KACWA,GAAQ,KAAA,GAAQ,QAAQ,cAAc,EAAE,GAC/B,QAAQ,wBAAwB,MAAM,GAC/C,QAAQ,OAAO,GAAG,KAAK,IAG5BC,IAAyB,CAACC,GAAiBC,MAA+C;AAErG,MADI,CAACD,KACD,CAACC,EAAW,QAAO;AAEvB,MAAI;AACF,QAAIC,IAAgBF;AACpB,UAAMG,IAAkB,gBAClBC,IAAUJ,EAAQ,MAAMG,CAAe;AAE7C,WAAIC,KAAWH,KACbG,EAAQ,QAAQ,CAACC,MAAU;AACzB,YAAMC,IAAeD,EAAM,MAAM,GAAG,EAAE,EAAE,KAAA,GAClCE,IAAgBN,EAAUK,CAAY;AAC5C,MAAmCC,KAAkB,SACnDL,IAAgBA,EAAc,QAAQG,GAAO,OAAOE,CAAa,CAAC;AAAA,IAEtE,CAAC,GAGIL;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;"}
|