@cronocode/react-box 3.0.12 → 3.0.14
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/README.md +8 -7
- package/array.d.ts +13 -0
- package/box.cjs +1 -1
- package/box.d.ts +8 -9
- package/box.mjs +16 -16
- package/components/button.d.ts +7 -6
- package/components/checkbox.d.ts +5 -3
- package/components/checkbox.mjs +4 -4
- package/components/dataGrid/contracts/dataGridContract.d.ts +36 -0
- package/components/dataGrid/dataGridCell.d.ts +8 -0
- package/components/dataGrid/dataGridGroupRow.d.ts +6 -0
- package/components/dataGrid/dataGridHeaderCell.d.ts +6 -0
- package/components/dataGrid/dataGridPagination.d.ts +6 -0
- package/components/dataGrid/dataGridRow.d.ts +6 -0
- package/components/dataGrid/models/cellModel.d.ts +10 -0
- package/components/dataGrid/models/columnModel.d.ts +36 -0
- package/components/dataGrid/models/gridModel.d.ts +44 -0
- package/components/dataGrid/models/groupRowCellModel.d.ts +10 -0
- package/components/dataGrid/models/groupRowModel.d.ts +23 -0
- package/components/dataGrid/models/rowModel.d.ts +16 -0
- package/components/dataGrid/useGrid.d.ts +3 -0
- package/components/dataGrid.cjs +1 -1
- package/components/dataGrid.d.ts +2 -7
- package/components/dataGrid.mjs +656 -18
- package/components/dropdown.cjs +1 -1
- package/components/dropdown.d.ts +2 -2
- package/components/dropdown.mjs +63 -62
- package/components/flex.d.ts +2 -1
- package/components/form.cjs +1 -1
- package/components/form.mjs +11 -8
- package/components/grid.d.ts +2 -1
- package/components/radioButton.cjs +1 -1
- package/components/radioButton.d.ts +7 -6
- package/components/radioButton.mjs +9 -9
- package/components/semantics.cjs +1 -1
- package/components/semantics.d.ts +27 -25
- package/components/semantics.mjs +26 -25
- package/components/textarea.d.ts +7 -6
- package/components/textbox.d.ts +7 -6
- package/components/tooltip.cjs +1 -1
- package/components/tooltip.d.ts +1 -1
- package/components/tooltip.mjs +20 -22
- package/core/boxConstants.d.ts +1 -0
- package/core/boxStyles.d.ts +112 -37
- package/core/boxStylesFormatters.d.ts +1 -1
- package/core/classNames.d.ts +1 -1
- package/core/extends/boxComponents.d.ts +391 -0
- package/core/{boxExtends.d.ts → extends/boxExtends.d.ts} +4 -1
- package/core/extends/useComponents.d.ts +2 -0
- package/core/theme/theme.d.ts +1 -3
- package/core/theme/themeContext.d.ts +2 -4
- package/core/useStyles.d.ts +2 -2
- package/core/variables.d.ts +1 -0
- package/core.cjs +4 -4
- package/core.mjs +634 -511
- package/hooks/useVisibility.d.ts +9 -1
- package/icons/arrowIcon.d.ts +2 -0
- package/icons/dotsIcon.d.ts +2 -0
- package/icons/groupingIcon.d.ts +2 -0
- package/icons/pinIcon.d.ts +2 -0
- package/package.json +1 -1
- package/types.d.ts +35 -6
- package/utils/fn/fnUtils.d.ts +4 -0
- package/utils/memo.d.ts +5 -0
- package/utils/object/objectUtils.d.ts +1 -1
- package/components/dataGrid/dataGridContract.d.ts +0 -24
- package/components/dataGrid/useGridData.d.ts +0 -7
- package/components/label.cjs +0 -1
- package/components/label.d.ts +0 -5
- package/components/label.mjs +0 -10
- package/core/theme/defaultTheme.d.ts +0 -3
- package/core/theme/themeContract.d.ts +0 -25
- package/core/theme/useTheme.d.ts +0 -2
package/README.md
CHANGED
|
@@ -114,13 +114,14 @@ export const { extendedProps, extendedPropTypes } = Box.extend(
|
|
|
114
114
|
|
|
115
115
|
```JS
|
|
116
116
|
import '@cronocode/react-box';
|
|
117
|
-
import { ExtractBoxStyles } from '@cronocode/react-box/types';
|
|
118
|
-
import { extendedProps, extendedPropTypes } from './path-to-your-b0x-extends-declaration';
|
|
117
|
+
import { ExtractBoxStyles, ExtractComponentsAndVariants } from '@cronocode/react-box/types';
|
|
118
|
+
import { extendedProps, extendedPropTypes, components } from './path-to-your-b0x-extends-declaration';
|
|
119
119
|
|
|
120
120
|
declare module '@cronocode/react-box/types' {
|
|
121
121
|
namespace Augmented {
|
|
122
122
|
interface BoxProps extends ExtractBoxStyles<typeof extendedProps> {}
|
|
123
123
|
interface BoxPropTypes extends ExtractBoxStyles<typeof extendedPropTypes> {}
|
|
124
|
+
interface ComponentsTypes extends ExtractComponentsAndVariants<typeof components> {}
|
|
124
125
|
}
|
|
125
126
|
}
|
|
126
127
|
```
|
|
@@ -130,14 +131,14 @@ declare module '@cronocode/react-box/types' {
|
|
|
130
131
|
In the project root file (main.tsx) use `Theme.setup`
|
|
131
132
|
|
|
132
133
|
```JS
|
|
133
|
-
import
|
|
134
|
+
import Box from '@cronocode/react-box';
|
|
134
135
|
|
|
135
|
-
|
|
136
|
+
Box.components({
|
|
136
137
|
button: {
|
|
137
138
|
styles: {
|
|
138
139
|
px: 4
|
|
139
140
|
},
|
|
140
|
-
|
|
141
|
+
variants: {
|
|
141
142
|
mytheme: {
|
|
142
143
|
px: 8
|
|
143
144
|
}
|
|
@@ -157,13 +158,13 @@ function MyComponent() {
|
|
|
157
158
|
}
|
|
158
159
|
```
|
|
159
160
|
|
|
160
|
-
or is possible to use Button with specific
|
|
161
|
+
or is possible to use Button with specific variant
|
|
161
162
|
|
|
162
163
|
```JS
|
|
163
164
|
import Button from '@cronocode/react-box/components/button';
|
|
164
165
|
|
|
165
166
|
function MyComponent() {
|
|
166
|
-
return <Button
|
|
167
|
+
return <Button variant="mytheme">Click me</Button>
|
|
167
168
|
}
|
|
168
169
|
```
|
|
169
170
|
|
package/array.d.ts
CHANGED
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
export {};
|
|
2
2
|
declare global {
|
|
3
|
+
type SortDirection = 'ASC' | 'DESC';
|
|
4
|
+
interface GroupItem<TKey, T> {
|
|
5
|
+
key: TKey;
|
|
6
|
+
values: T[];
|
|
7
|
+
}
|
|
3
8
|
interface Array<T> {
|
|
9
|
+
take(count: number, skip?: number): Array<T>;
|
|
10
|
+
add(...items: T[]): Array<T>;
|
|
4
11
|
removeBy(predicate: (value: T) => boolean): Array<T>;
|
|
12
|
+
sumBy(fn: (value: T, index: number) => number, initialValue?: number): number;
|
|
13
|
+
sortBy<TVal>(fn: (value: T) => TVal, direction?: 'ASC' | 'DESC'): Array<T>;
|
|
14
|
+
maxBy(fn: (value: T) => number): number;
|
|
15
|
+
findOrThrow(predicate: (value: T) => boolean): T;
|
|
16
|
+
toRecord<K extends string | number | symbol, V>(fn: (value: T) => [K, V]): Record<K, V>;
|
|
17
|
+
groupBy<TKey extends string | number | symbol>(keySelector: (item: T, index: number) => TKey): GroupItem<TKey, T>[];
|
|
5
18
|
}
|
|
6
19
|
}
|
package/box.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const t=require("react"),e=require("./core.cjs");function
|
|
1
|
+
"use strict";const t=require("react"),e=require("./core.cjs");function T(n,l){const{tag:c="div",children:a,props:m,className:x,style:i,disabled:B,required:p,checked:g,selected:f}=n,h=e.useStyles(n,c==="svg"),r=t.useMemo(()=>{const P=e.classNames(h,x).join(" "),s={...m,className:P};return e.BoxUtils.assignBooleanProp(B,"disabled",s),e.BoxUtils.assignBooleanProp(p,"required",s),e.BoxUtils.assignBooleanProp(g,"checked",s),e.BoxUtils.assignBooleanProp(f,"selected",s),i&&(s.style=i),l&&(s.ref=l),s},[n]),[v,u]=t.useState(!1),d=typeof a=="function";return d&&(r.onMouseEnter=()=>u(!0),r.onMouseLeave=()=>u(!1)),t.createElement(c,r,d?a({isHover:v}):a)}const o=t.memo(t.forwardRef(T));o.extend=e.BoxExtends.extend;o.components=e.BoxExtends.components;o.Theme=e.Theme;o.useTheme=e.Theme.useTheme;o.getVariableValue=e.Variables.getVariableValue;module.exports=o;
|
package/box.d.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { default as React,
|
|
1
|
+
import { default as React, RefAttributes } from 'react';
|
|
2
2
|
import { ClassNameType } from './core/classNames';
|
|
3
3
|
import { ExtractElementFromTag } from './core/coreTypes';
|
|
4
|
-
import { BoxStyleProps } from './types';
|
|
5
|
-
import { default as BoxExtends } from './core/boxExtends';
|
|
4
|
+
import { BoxStyleProps, ComponentsAndVariants } from './types';
|
|
5
|
+
import { default as BoxExtends } from './core/extends/boxExtends';
|
|
6
6
|
import { default as Theme } from './core/theme/theme';
|
|
7
7
|
import { default as Variables } from './core/variables';
|
|
8
8
|
type AllProps<TTag extends keyof React.JSX.IntrinsicElements> = React.ComponentProps<TTag>;
|
|
9
9
|
type TagPropsType<TTag extends keyof React.JSX.IntrinsicElements> = Omit<AllProps<TTag>, 'className' | 'style' | 'ref' | 'disabled' | 'required' | 'checked'>;
|
|
10
|
-
interface Props<TTag extends keyof React.JSX.IntrinsicElements> extends BoxStyleProps {
|
|
10
|
+
interface Props<TTag extends keyof React.JSX.IntrinsicElements, TKey extends keyof ComponentsAndVariants> extends BoxStyleProps<TKey> {
|
|
11
11
|
children?: React.ReactNode | ((props: {
|
|
12
12
|
isHover: boolean;
|
|
13
13
|
}) => React.ReactNode);
|
|
@@ -16,16 +16,15 @@ interface Props<TTag extends keyof React.JSX.IntrinsicElements> extends BoxStyle
|
|
|
16
16
|
className?: ClassNameType;
|
|
17
17
|
style?: React.ComponentProps<TTag>['style'];
|
|
18
18
|
}
|
|
19
|
-
declare function BoxComponent<TTag extends keyof React.JSX.IntrinsicElements = 'div'>(props: Props<TTag>, ref: Ref<ExtractElementFromTag<TTag>>): React.ReactElement<React.ComponentProps<TTag>, string | React.JSXElementConstructor<any>>;
|
|
20
19
|
interface BoxType {
|
|
21
|
-
<TTag extends keyof React.JSX.IntrinsicElements = 'div'>(props: Props<TTag> & RefAttributes<ExtractElementFromTag<TTag>>): React.ReactNode;
|
|
20
|
+
<TTag extends keyof React.JSX.IntrinsicElements = 'div', TKey extends keyof ComponentsAndVariants = never>(props: Props<TTag, TKey> & RefAttributes<ExtractElementFromTag<TTag>>): React.ReactNode;
|
|
22
21
|
extend: typeof BoxExtends.extend;
|
|
23
|
-
|
|
22
|
+
components: typeof BoxExtends.components;
|
|
24
23
|
Theme: typeof Theme;
|
|
25
24
|
useTheme: typeof Theme.useTheme;
|
|
26
25
|
getVariableValue: typeof Variables.getVariableValue;
|
|
27
26
|
}
|
|
28
27
|
declare const Box: BoxType;
|
|
29
28
|
export default Box;
|
|
30
|
-
export type BoxProps<TTag extends keyof React.JSX.IntrinsicElements = 'div'> = React.ComponentProps<typeof
|
|
31
|
-
export type BoxTagProps<TTag extends keyof React.JSX.IntrinsicElements = 'div'> = Required<BoxProps<TTag>>['props'];
|
|
29
|
+
export type BoxProps<TTag extends keyof React.JSX.IntrinsicElements = 'div', TKey extends keyof ComponentsAndVariants = never> = React.ComponentProps<typeof Box<TTag, TKey>>;
|
|
30
|
+
export type BoxTagProps<TTag extends keyof React.JSX.IntrinsicElements = 'div', TKey extends keyof ComponentsAndVariants = never> = Required<BoxProps<TTag, TKey>>['props'];
|
package/box.mjs
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { B as
|
|
3
|
-
function
|
|
4
|
-
const { tag:
|
|
5
|
-
const
|
|
6
|
-
...
|
|
7
|
-
className:
|
|
1
|
+
import V, { memo as b, forwardRef as y, useMemo as N, useState as C } from "react";
|
|
2
|
+
import { B as u, T as d, V as E, u as H, c as M, a as o } from "./core.mjs";
|
|
3
|
+
function S(a, r) {
|
|
4
|
+
const { tag: l = "div", children: t, props: p, className: f, style: c, disabled: g, required: B, checked: x, selected: h } = a, v = H(a, l === "svg"), n = N(() => {
|
|
5
|
+
const T = M(v, f).join(" "), e = {
|
|
6
|
+
...p,
|
|
7
|
+
className: T
|
|
8
8
|
};
|
|
9
|
-
return
|
|
10
|
-
}, [
|
|
11
|
-
return
|
|
9
|
+
return o.assignBooleanProp(g, "disabled", e), o.assignBooleanProp(B, "required", e), o.assignBooleanProp(x, "checked", e), o.assignBooleanProp(h, "selected", e), c && (e.style = c), r && (e.ref = r), e;
|
|
10
|
+
}, [a]), [P, i] = C(!1), m = typeof t == "function";
|
|
11
|
+
return m && (n.onMouseEnter = () => i(!0), n.onMouseLeave = () => i(!1)), V.createElement(l, n, m ? t({ isHover: P }) : t);
|
|
12
12
|
}
|
|
13
|
-
const s =
|
|
14
|
-
s.extend =
|
|
15
|
-
s.
|
|
16
|
-
s.Theme =
|
|
17
|
-
s.useTheme =
|
|
18
|
-
s.getVariableValue =
|
|
13
|
+
const s = b(y(S));
|
|
14
|
+
s.extend = u.extend;
|
|
15
|
+
s.components = u.components;
|
|
16
|
+
s.Theme = d;
|
|
17
|
+
s.useTheme = d.useTheme;
|
|
18
|
+
s.getVariableValue = E.getVariableValue;
|
|
19
19
|
export {
|
|
20
20
|
s as default
|
|
21
21
|
};
|
package/components/button.d.ts
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { RefAttributes } from 'react';
|
|
2
|
+
import { BoxProps, BoxTagProps } from '../box';
|
|
3
|
+
import { ComponentsAndVariants } from '../types';
|
|
4
4
|
declare const tagProps: readonly ["type", "onClick"];
|
|
5
5
|
type TagPropsType = (typeof tagProps)[number];
|
|
6
|
-
type
|
|
6
|
+
type ButtonProps<TKey extends keyof ComponentsAndVariants> = Omit<BoxProps<'button', TKey>, 'tag' | 'props'>;
|
|
7
|
+
type ButtonTagProps = Omit<BoxTagProps<'button'>, TagPropsType>;
|
|
7
8
|
type ButtonType = Required<React.ComponentProps<'button'>>['type'];
|
|
8
|
-
interface Props extends
|
|
9
|
+
interface Props<TKey extends keyof ComponentsAndVariants> extends ButtonProps<TKey> {
|
|
9
10
|
props?: ButtonTagProps;
|
|
10
11
|
type?: ButtonType;
|
|
11
12
|
onClick?: (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void;
|
|
12
13
|
}
|
|
13
|
-
declare const _default:
|
|
14
|
+
declare const _default: <TKey extends keyof ComponentsAndVariants = "button">(props: Props<TKey> & RefAttributes<HTMLButtonElement>) => React.ReactNode;
|
|
14
15
|
export default _default;
|
package/components/checkbox.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import { RefAttributes } from 'react';
|
|
1
2
|
import { BoxTagProps, BoxProps } from '../box';
|
|
3
|
+
import { ComponentsAndVariants } from '../types';
|
|
2
4
|
declare const tagProps: readonly ["name", "onInput", "onChange", "autoFocus", "readOnly", "value", "defaultChecked"];
|
|
3
5
|
type TagPropsType = (typeof tagProps)[number];
|
|
4
|
-
type CheckboxProps = Omit<BoxProps<'input'>, 'tag' | 'props'>;
|
|
6
|
+
type CheckboxProps<TKey extends keyof ComponentsAndVariants> = Omit<BoxProps<'input', TKey>, 'tag' | 'props'>;
|
|
5
7
|
type CheckboxTagProps = Omit<BoxTagProps<'input'>, TagPropsType | 'type'>;
|
|
6
|
-
interface Props extends CheckboxProps {
|
|
8
|
+
interface Props<TKey extends keyof ComponentsAndVariants> extends CheckboxProps<TKey> {
|
|
7
9
|
name?: string;
|
|
8
10
|
props?: CheckboxTagProps;
|
|
9
11
|
onInput?: (e: React.ChangeEvent<HTMLInputElement>) => void;
|
|
@@ -13,5 +15,5 @@ interface Props extends CheckboxProps {
|
|
|
13
15
|
readOnly?: boolean;
|
|
14
16
|
defaultChecked?: boolean;
|
|
15
17
|
}
|
|
16
|
-
declare const _default:
|
|
18
|
+
declare const _default: <TKey extends keyof ComponentsAndVariants = "checkbox">(props: Props<TKey> & RefAttributes<HTMLInputElement>) => React.ReactNode;
|
|
17
19
|
export default _default;
|
package/components/checkbox.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { forwardRef as
|
|
1
|
+
import { jsx as a } from "react/jsx-runtime";
|
|
2
|
+
import { forwardRef as c, useRef as i, useImperativeHandle as u, useEffect as m } from "react";
|
|
3
3
|
import f from "../box.mjs";
|
|
4
4
|
import { O as s } from "../core.mjs";
|
|
5
5
|
const d = ["name", "onInput", "onChange", "autoFocus", "readOnly", "value", "defaultChecked"];
|
|
@@ -7,9 +7,9 @@ function l(t, r) {
|
|
|
7
7
|
const o = s.buildProps(t, d, { type: "checkbox" }), n = Array.isArray(t.indeterminate) ? t.indeterminate[0] : t.indeterminate, e = i(null);
|
|
8
8
|
return u(r, () => e.current), m(() => {
|
|
9
9
|
e.current && (e.current.indeterminate = !!n);
|
|
10
|
-
}, [e, n]), /* @__PURE__ */
|
|
10
|
+
}, [e, n]), /* @__PURE__ */ a(f, { tag: "input", ref: e, component: "checkbox", ...o });
|
|
11
11
|
}
|
|
12
|
-
const k =
|
|
12
|
+
const k = c(l);
|
|
13
13
|
export {
|
|
14
14
|
k as default
|
|
15
15
|
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export type Key = string | number;
|
|
2
|
+
export type PinPosition = 'LEFT' | 'RIGHT';
|
|
3
|
+
export declare const NO_PIN = "NO_PIN";
|
|
4
|
+
export type SortColumnType<TRow> = {
|
|
5
|
+
key: keyof TRow;
|
|
6
|
+
dir: SortDirection;
|
|
7
|
+
};
|
|
8
|
+
export type KeysMatching<T, V> = {
|
|
9
|
+
[K in keyof T]-?: T[K] extends V ? K : never;
|
|
10
|
+
}[keyof T];
|
|
11
|
+
export interface PaginationState {
|
|
12
|
+
pageSize: number;
|
|
13
|
+
page: number;
|
|
14
|
+
totalItems: number;
|
|
15
|
+
totalPages: number;
|
|
16
|
+
}
|
|
17
|
+
export type Pagination = boolean | {
|
|
18
|
+
pageSize: number;
|
|
19
|
+
};
|
|
20
|
+
export interface ColumnType<TRow> {
|
|
21
|
+
key: Key;
|
|
22
|
+
header?: string;
|
|
23
|
+
pin?: PinPosition;
|
|
24
|
+
width?: number;
|
|
25
|
+
columns?: ColumnType<TRow>[];
|
|
26
|
+
align?: 'right' | 'center';
|
|
27
|
+
}
|
|
28
|
+
export interface GridDefinition<TRow> {
|
|
29
|
+
rowKey?: KeysMatching<TRow, Key> | ((rowData: TRow) => Key);
|
|
30
|
+
columns: ColumnType<TRow>[];
|
|
31
|
+
pagination?: Pagination;
|
|
32
|
+
}
|
|
33
|
+
export interface DataGridProps<TRow> {
|
|
34
|
+
data: TRow[];
|
|
35
|
+
def: GridDefinition<TRow>;
|
|
36
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { BoxProps } from '../../box';
|
|
2
|
+
import { default as ColumnModel } from './models/columnModel';
|
|
3
|
+
interface Props<TRow> extends BoxProps {
|
|
4
|
+
children?: React.ReactNode;
|
|
5
|
+
column: ColumnModel<TRow>;
|
|
6
|
+
}
|
|
7
|
+
export default function DataGridCell<TRow>(props: Props<TRow>): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { default as ColumnModel } from './columnModel';
|
|
2
|
+
import { default as GridModel } from './gridModel';
|
|
3
|
+
import { default as RowModel } from './rowModel';
|
|
4
|
+
export default class CellModel<TRow> {
|
|
5
|
+
readonly grid: GridModel<TRow>;
|
|
6
|
+
readonly row: RowModel<TRow>;
|
|
7
|
+
readonly column: ColumnModel<TRow>;
|
|
8
|
+
constructor(grid: GridModel<TRow>, row: RowModel<TRow>, column: ColumnModel<TRow>);
|
|
9
|
+
get value(): React.ReactNode;
|
|
10
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { ColumnType, PinPosition } from '../contracts/dataGridContract';
|
|
2
|
+
import { default as GridModel } from './gridModel';
|
|
3
|
+
export default class ColumnModel<TRow> {
|
|
4
|
+
private readonly def;
|
|
5
|
+
readonly grid: GridModel<TRow>;
|
|
6
|
+
private parent?;
|
|
7
|
+
constructor(def: ColumnType<TRow>, grid: GridModel<TRow>, parent?: ColumnModel<TRow> | undefined);
|
|
8
|
+
columns: ColumnModel<TRow>[];
|
|
9
|
+
get key(): import('../contracts/dataGridContract').Key;
|
|
10
|
+
get header(): string | undefined;
|
|
11
|
+
get align(): "center" | "right" | undefined;
|
|
12
|
+
get isLeaf(): boolean;
|
|
13
|
+
private _pin?;
|
|
14
|
+
get pin(): Maybe<PinPosition>;
|
|
15
|
+
get uniqueKey(): string;
|
|
16
|
+
getPinnedColumn(pin?: PinPosition): Maybe<ColumnModel<TRow>>;
|
|
17
|
+
private hasPin;
|
|
18
|
+
get death(): number;
|
|
19
|
+
get flatColumns(): ColumnModel<TRow>[];
|
|
20
|
+
private _inlineWidth?;
|
|
21
|
+
get inlineWidth(): Maybe<number>;
|
|
22
|
+
get left(): number;
|
|
23
|
+
get right(): number;
|
|
24
|
+
get isEdge(): boolean;
|
|
25
|
+
get leafs(): ColumnModel<TRow>[];
|
|
26
|
+
get groupColumnWidthVarName(): string;
|
|
27
|
+
get widthVarName(): string;
|
|
28
|
+
get leftVarName(): string;
|
|
29
|
+
get rightVarName(): string;
|
|
30
|
+
get gridRows(): number;
|
|
31
|
+
resizeColumn: (e: unknown) => void;
|
|
32
|
+
pinColumn: (pin?: PinPosition) => void;
|
|
33
|
+
toggleGrouping: () => void;
|
|
34
|
+
sortColumn: (sortDirection?: SortDirection) => void;
|
|
35
|
+
setWidth: (width: number) => void;
|
|
36
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { DataGridProps, Key, PinPosition } from '../contracts/dataGridContract';
|
|
2
|
+
import { default as ColumnModel } from './columnModel';
|
|
3
|
+
import { default as GroupRowModel } from './groupRowModel';
|
|
4
|
+
import { default as RowModel } from './rowModel';
|
|
5
|
+
export declare const EMPTY_CELL_KEY = "empty-cell";
|
|
6
|
+
export declare const ROW_NUMBER_CELL_KEY = "row-number-cell";
|
|
7
|
+
export declare const ROW_SELECTION_CELL_KEY = "row-selection-cell";
|
|
8
|
+
export declare const GROUPING_CELL_KEY = "grouping-cell";
|
|
9
|
+
export default class GridModel<TRow> {
|
|
10
|
+
readonly props: DataGridProps<TRow>;
|
|
11
|
+
readonly update: () => void;
|
|
12
|
+
constructor(props: DataGridProps<TRow>, update: () => void);
|
|
13
|
+
private _sourceColumns;
|
|
14
|
+
readonly columns: import('../../../utils/memo').Memo<{
|
|
15
|
+
left: ColumnModel<TRow>[];
|
|
16
|
+
middle: ColumnModel<TRow>[];
|
|
17
|
+
right: ColumnModel<TRow>[];
|
|
18
|
+
flat: ColumnModel<TRow>[];
|
|
19
|
+
leafs: ColumnModel<TRow>[];
|
|
20
|
+
}>;
|
|
21
|
+
readonly headerRows: import('../../../utils/memo').Memo<ColumnModel<TRow>[][]>;
|
|
22
|
+
readonly gridTemplateColumns: import('../../../utils/memo').Memo<string>;
|
|
23
|
+
readonly rows: import('../../../utils/memo').Memo<GroupRowModel<TRow>[] | RowModel<TRow>[]>;
|
|
24
|
+
readonly flatRows: import('../../../utils/memo').Memo<(GroupRowModel<TRow> | RowModel<TRow>)[]>;
|
|
25
|
+
readonly sizes: import('../../../utils/memo').Memo<Record<string, string>>;
|
|
26
|
+
readonly ROW_HEIGHT = 12;
|
|
27
|
+
readonly MIN_COLUMN_WIDTH_PX = 48;
|
|
28
|
+
readonly DEFAULT_COLUMN_WIDTH_PX = 200;
|
|
29
|
+
isResizeMode: boolean;
|
|
30
|
+
expandedGroupRow: Record<Key, boolean>;
|
|
31
|
+
get leftEdge(): number;
|
|
32
|
+
get rightEdge(): number;
|
|
33
|
+
readonly leftEdgeVarName = "--left-edge";
|
|
34
|
+
setSortColumn: (columnKey: Key, sortDirection?: SortDirection) => void;
|
|
35
|
+
pinColumn: (uniqueKey: string, pin?: PinPosition) => void;
|
|
36
|
+
toggleGrouping: (columnKey: Key) => void;
|
|
37
|
+
toggleGroupRow: (groupRowKey: Key) => void;
|
|
38
|
+
setWidth: (columnKey: Key, width: number) => void;
|
|
39
|
+
groupColumns: Key[];
|
|
40
|
+
private _sortColumn?;
|
|
41
|
+
get sortColumn(): Key | undefined;
|
|
42
|
+
private _sortDirection;
|
|
43
|
+
get sortDirection(): SortDirection;
|
|
44
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { default as ColumnModel } from './columnModel';
|
|
2
|
+
import { default as GridModel } from './gridModel';
|
|
3
|
+
import { default as GroupRowModel } from './groupRowModel';
|
|
4
|
+
export default class GroupRowCellModel<TRow> {
|
|
5
|
+
readonly grid: GridModel<TRow>;
|
|
6
|
+
readonly row: GroupRowModel<TRow>;
|
|
7
|
+
readonly column: ColumnModel<TRow>;
|
|
8
|
+
constructor(grid: GridModel<TRow>, row: GroupRowModel<TRow>, column: ColumnModel<TRow>);
|
|
9
|
+
get value(): React.ReactNode;
|
|
10
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Key } from '../contracts/dataGridContract';
|
|
2
|
+
import { default as ColumnModel } from './columnModel';
|
|
3
|
+
import { default as GridModel } from './gridModel';
|
|
4
|
+
import { default as GroupRowCellModel } from './groupRowCellModel';
|
|
5
|
+
import { default as RowModel } from './rowModel';
|
|
6
|
+
export default class GroupRowModel<TRow> {
|
|
7
|
+
readonly grid: GridModel<TRow>;
|
|
8
|
+
readonly groupColumn: ColumnModel<TRow>;
|
|
9
|
+
readonly rows: RowModel<TRow>[] | GroupRowModel<TRow>[];
|
|
10
|
+
readonly rowIndex: number;
|
|
11
|
+
readonly groupValue: Key;
|
|
12
|
+
constructor(grid: GridModel<TRow>, groupColumn: ColumnModel<TRow>, rows: RowModel<TRow>[] | GroupRowModel<TRow>[], rowIndex: number, groupValue: Key);
|
|
13
|
+
get rowKey(): Key;
|
|
14
|
+
parentRow?: GroupRowModel<TRow>;
|
|
15
|
+
get cells(): GroupRowCellModel<TRow>[];
|
|
16
|
+
get expanded(): boolean;
|
|
17
|
+
get depth(): number;
|
|
18
|
+
get count(): number;
|
|
19
|
+
get flatRows(): (RowModel<TRow> | GroupRowModel<TRow>)[];
|
|
20
|
+
get groupingColumn(): ColumnModel<TRow>;
|
|
21
|
+
get groupingColumnGridColumn(): number;
|
|
22
|
+
toggleRow(): void;
|
|
23
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Key } from '../contracts/dataGridContract';
|
|
2
|
+
import { default as CellModel } from './cellModel';
|
|
3
|
+
import { default as GridModel } from './gridModel';
|
|
4
|
+
import { default as GroupRowModel } from './groupRowModel';
|
|
5
|
+
export default class RowModel<TRow> {
|
|
6
|
+
readonly grid: GridModel<TRow>;
|
|
7
|
+
readonly row: TRow;
|
|
8
|
+
readonly rowIndex: number;
|
|
9
|
+
constructor(grid: GridModel<TRow>, row: TRow, rowIndex: number);
|
|
10
|
+
get rowKey(): Key;
|
|
11
|
+
parentRow?: GroupRowModel<TRow>;
|
|
12
|
+
get cells(): CellModel<TRow>[];
|
|
13
|
+
get count(): number;
|
|
14
|
+
get flatRows(): RowModel<TRow>[];
|
|
15
|
+
private getRowKey;
|
|
16
|
+
}
|
package/components/dataGrid.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const n=require("react/jsx-runtime");require("react");const o=require("../box.cjs"),c=require("./grid.cjs");function g(u){const{data:e,def:d}=u,{rowKey:r,columns:i}=d;return i.length===0?(console.error("Cannot render grid without column definitions"),null):n.jsx(o,{component:"dataGrid",children:n.jsxs(c,{b:1,borderRadius:1,children:[i.map((t,s)=>n.jsx(o,{style:{gridColumn:s+1},children:t.key.toString()},s)),((e==null?void 0:e.length)??0)===0&&n.jsx(o,{children:"Empty table"}),((e==null?void 0:e.length)??0)>0&&n.jsx(n.Fragment,{children:e==null?void 0:e.map((t,s)=>{const m=r?typeof r=="function"?r(t):t[r]:s;return n.jsx(c,{style:{gridTemplateRows:"subgrid"},children:i.map((h,l)=>n.jsxs(o,{style:{gridColumn:l+1},children:["tes ",l]},l))},m)})})]})})}module.exports=g;
|
|
1
|
+
"use strict";var Z=Object.defineProperty;var ee=(u,e,t)=>e in u?Z(u,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):u[e]=t;var l=(u,e,t)=>ee(u,typeof e!="symbol"?e+"":e,t);const n=require("react/jsx-runtime"),g=require("../box.cjs"),V=require("./grid.cjs"),m=require("react"),p=require("../core.cjs"),k=require("./button.cjs"),T=require("./flex.cjs"),te=require("./tooltip.cjs"),$=require("./checkbox.cjs"),se="NO_PIN";class L{constructor(e,t,s){l(this,"columns",[]);l(this,"_pin");l(this,"_inlineWidth");l(this,"resizeColumn",e=>{this.grid.isResizeMode=!0;const t=e.pageX,{MIN_COLUMN_WIDTH_PX:s,update:i}=this.grid,o=this.leafs.sumBy(h=>h.inlineWidth)-this.leafs.length*s,r=this.leafs.toRecord(h=>[h.key,h.inlineWidth]),d=p.FnUtils.throttle(h=>{const f=(h.pageX-t)*(this.pin==="RIGHT"?-1:1);this.leafs.forEach(w=>{const v=r[w.key],x=o>0?(v-s)/o*f:f/this.leafs.length,R=Math.round(v+x);w.setWidth(R<s?s:R)}),this.grid.headerRows.clear(),this.grid.sizes.clear(),i()},20),a=new AbortController,c=h=>{a.abort(),this.grid.isResizeMode=!1,i()};window.addEventListener("mousemove",d,a),window.addEventListener("mouseup",c,a)});l(this,"pinColumn",e=>{this.isLeaf?this._pin=e:this.columns.forEach(t=>t.pinColumn(e)),this.grid.pinColumn(this.uniqueKey,e)});l(this,"toggleGrouping",()=>{this.grid.toggleGrouping(this.key)});l(this,"sortColumn",(...e)=>{this.grid.setSortColumn(this.key,...e)});l(this,"setWidth",e=>{if(!this.isLeaf)throw new Error("Cannot set width for a parent column.");this._inlineWidth!==e&&(this._inlineWidth=e,this.grid.setWidth(this.key,e))});var i;this.def=e,this.grid=t,this.parent=s,this.columns=((i=e.columns)==null?void 0:i.map(o=>new L(e.pin?{...o,pin:e.pin}:o,t,this)))??[],this.isLeaf&&(this._inlineWidth=this.key==E?void 0:this.def.width??this.grid.DEFAULT_COLUMN_WIDTH_PX,this._pin=e.pin)}get key(){return this.def.key}get header(){return this.def.header}get align(){return this.def.align}get isLeaf(){return this.columns.length===0}get pin(){if(this.isLeaf)return this._pin;const e=[...new Set(this.columns.flatMap(t=>t.pin))];if(e.length===1)return e[0]}get uniqueKey(){return`${this.key}${this.pin??""}`}getPinnedColumn(e){if(this.hasPin(e)){if(this.isLeaf)return this;const t=new L({...this.def,pin:e},this.grid,this.parent);return t.columns=this.columns.filter(s=>s.hasPin(e)).map(s=>{const i=s.getPinnedColumn(e);return i.parent=t,i}).filter(s=>!!s),t}}hasPin(e){return this.isLeaf?this._pin===e:this.columns.some(t=>t.hasPin(e))}get death(){return this.parent?this.parent.death+1:0}get flatColumns(){const e=[this];return e.push(...this.columns.flatMap(t=>t.flatColumns)),e}get inlineWidth(){if(this.isLeaf)return this._inlineWidth;const e=this.columns.map(t=>t.inlineWidth).filter(t=>typeof t=="number");if(e.length!==0)return e.sumBy(t=>t)}get left(){let e=0;if(this.parent){const t=this.parent.columns.findIndex(s=>s===this);e+=this.parent.columns.sumBy((s,i)=>i<t?s.inlineWidth??0:0),e+=this.parent.left}else{const t=this.grid.columns.value.left.findIndex(s=>s===this);e+=this.grid.columns.value.left.sumBy((s,i)=>i<t?s.inlineWidth??0:0)}return e}get right(){let e=0;if(this.parent){const t=[...this.parent.columns].reverse(),s=t.findIndex(i=>i===this);e+=t.sumBy((i,o)=>o<s?i.inlineWidth??0:0),e+=this.parent.right}else{const t=[...this.grid.columns.value.right].reverse(),s=t.findIndex(i=>i===this);e+=t.sumBy((i,o)=>o<s?i.inlineWidth??0:0)}return e}get isEdge(){return this.pin?this.parent?(this.pin==="LEFT"?this.parent.columns.at(-1):this.parent.columns.at(0))===this&&this.parent.isEdge:(this.pin==="LEFT"?this.grid.columns.value.left.at(-1):this.grid.columns.value.right.at(0))===this:!1}get leafs(){return this.isLeaf?[this]:this.columns.flatMap(e=>e.leafs)}get groupColumnWidthVarName(){return`--${this.uniqueKey}-group-width`}get widthVarName(){return`--${this.uniqueKey}-width`}get leftVarName(){return`--${this.uniqueKey}-left`}get rightVarName(){return`--${this.uniqueKey}-right`}get gridRows(){return this.isLeaf?this.grid.headerRows.value.length-this.death:1}}class ie{constructor(e,t,s){this.grid=e,this.row=t,this.column=s}get value(){return this.column.key===j?this.row.rowIndex+1:this.column.key===y?`> ${this.row.groupValue} (${this.row.count})`:null}}class z{constructor(e,t,s,i,o){l(this,"parentRow");this.grid=e,this.groupColumn=t,this.rows=s,this.rowIndex=i,this.groupValue=o,s.forEach(r=>r.parentRow=this)}get rowKey(){var e;return`${((e=this.parentRow)==null?void 0:e.rowKey)??""}${this.groupColumn.key}${this.groupValue}`}get cells(){return this.grid.columns.value.leafs.map(e=>new ie(this.grid,this,e))}get expanded(){return this.grid.expandedGroupRow[this.rowKey]}get depth(){return this.parentRow?this.parentRow.depth+1:0}get count(){return this.rows.sumBy(e=>e.count,0)}get flatRows(){return this.expanded?[this,...this.rows.flatMap(e=>e.flatRows)]:[this]}get groupingColumn(){return this.grid.columns.value.leafs.findOrThrow(e=>e.key===y)}get groupingColumnGridColumn(){const{leafs:e}=this.grid.columns.value,{groupingColumn:t}=this;return e.sumBy(i=>i.pin===t.pin&&i.key!==E&&i.key!==b&&i.key!==j?1:0)}toggleRow(){this.grid.toggleGroupRow(this.rowKey)}}class ne{constructor(e,t,s){this.grid=e,this.row=t,this.column=s}get value(){return this.column.key===E?null:this.column.key===j?this.row.rowIndex+1:this.row.row[this.column.key]}}class A{constructor(e,t,s){l(this,"parentRow");this.grid=e,this.row=t,this.rowIndex=s,this.grid=e,this.row=t}get rowKey(){return this.getRowKey()}get cells(){return this.grid.columns.value.leafs.map(e=>new ne(this.grid,this,e))}get count(){return 1}get flatRows(){return[this]}getRowKey(){var s;const{rowKey:e}=this.grid.props.def,t=e?typeof e=="function"?e(this.row):this.row[e]:this.rowIndex;return`${((s=this.parentRow)==null?void 0:s.rowKey)??""}${t}`}}const E="empty-cell",j="row-number-cell",b="row-selection-cell",y="grouping-cell";class oe{constructor(e,t){l(this,"_sourceColumns",[]);l(this,"columns",p.memo(()=>{const e=this._sourceColumns.map(r=>r.getPinnedColumn("LEFT")).filter(r=>!!r),t=this._sourceColumns.map(r=>r.getPinnedColumn()).filter(r=>!!r),s=this._sourceColumns.map(r=>r.getPinnedColumn("RIGHT")).filter(r=>!!r),i=[...e,...t,...s].flatMap(r=>r.flatColumns),o=i.filter(r=>r.isLeaf);return{left:e,middle:t,right:s,flat:i,leafs:o}}));l(this,"headerRows",p.memo(()=>this.columns.value.flat.groupBy(t=>t.death).sortBy(t=>t.key).map(t=>{const s=t.values.groupBy(i=>i.pin??se).toRecord(i=>[i.key,i.values]);return[...s.LEFT??[],...s.NO_PIN??[],...s.RIGHT??[]]})));l(this,"gridTemplateColumns",p.memo(()=>{const e=this.columns.value.leafs.sumBy(o=>o.pin==="RIGHT"?1:0),t=this.columns.value.leafs.length-e-1,s=t>0?`repeat(${t}, max-content)`:"",i=e>0?`repeat(${e}, max-content)`:"";return`${s} auto ${i}`}));l(this,"rows",p.memo(()=>{let e=this.props.data;if(this._sortColumn&&(e=e.sortBy(t=>t[this._sortColumn],this._sortDirection)),this.groupColumns.length>0){const t=(s,i,o)=>{const r=i[0];i=i.removeBy(a=>a===r);const d=this.columns.value.leafs.findOrThrow(a=>a.key===r);return this._sortColumn===y&&(s=s.sortBy(a=>a[r],this._sortDirection)),s.groupBy(a=>a[r]).map(a=>{let c;i.length>0?c=t(a.values,i,o+1):c=a.values.map((f,w)=>new A(this,f,o+1+w));const h=new z(this,d,c,o,a.key);return o+=1,h.expanded&&(o+=c.length),h})};return t(e,this.groupColumns,0)}return e.map((t,s)=>new A(this,t,s))}));l(this,"flatRows",p.memo(()=>this.rows.value.flatMap(e=>e.flatRows)));l(this,"sizes",p.memo(()=>{console.log("sizes");const e=this.columns.value.flat.reduce((s,i)=>{const{inlineWidth:o}=i;return typeof o=="number"&&(s[i.widthVarName]=`${i.inlineWidth}px`),i.pin==="LEFT"&&(s[i.leftVarName]=`${i.left}px`),i.pin==="RIGHT"&&(s[i.rightVarName]=`${i.right}px`),s},{});e[this.leftEdgeVarName]=`${this.leftEdge}px`;const t=this.columns.value.leafs.find(s=>s.key===y);return t&&(e[t.groupColumnWidthVarName]=`${this.columns.value.leafs.sumBy(s=>s.pin===t.pin&&s.key!==j&&s.key!==b?s.inlineWidth??0:0)}px`),this.groupColumns.forEach(s=>{const i=this.columns.value.leafs.findOrThrow(o=>o.key===s);e[i.groupColumnWidthVarName]=`${this.columns.value.leafs.sumBy(o=>o.pin===i.pin?o.inlineWidth??0:0)}px`}),e}));l(this,"ROW_HEIGHT",12);l(this,"MIN_COLUMN_WIDTH_PX",48);l(this,"DEFAULT_COLUMN_WIDTH_PX",200);l(this,"isResizeMode",!1);l(this,"expandedGroupRow",{});l(this,"leftEdgeVarName","--left-edge");l(this,"setSortColumn",(e,...t)=>{if(t.length>0)[this._sortDirection]=t,this._sortColumn=this._sortDirection?e:void 0;else{const{_sortColumn:s,_sortDirection:i}=this;this._sortColumn=s===e&&i==="DESC"?void 0:e,this._sortDirection=s===e&&i==="ASC"?"DESC":"ASC"}this.headerRows.clear(),this.rows.clear(),this.flatRows.clear(),this.update()});l(this,"pinColumn",(e,t)=>{const s=this.columns.value.flat.findOrThrow(i=>i.uniqueKey===e);s.pin!==t&&s.pinColumn(t),this.columns.clear(),this.headerRows.clear(),this.gridTemplateColumns.clear(),this.rows.clear(),this.flatRows.clear(),this.sizes.clear(),this.update()});l(this,"toggleGrouping",e=>{this.groupColumns.includes(e)?this.groupColumns=this.groupColumns.removeBy(s=>s===e):this.groupColumns=this.groupColumns.add(e);const t=this._sourceColumns.find(s=>s.key===y);if(this.groupColumns.length>0&&!t){const s=this._sourceColumns.sumBy(i=>i.key===j||i.key===b?1:0);this._sourceColumns.splice(s,0,new L({key:y},this))}else this.groupColumns.length===0&&t&&(this._sourceColumns=this._sourceColumns.removeBy(s=>s.key===y));this.columns.clear(),this.headerRows.clear(),this.gridTemplateColumns.clear(),this.rows.clear(),this.flatRows.clear(),this.sizes.clear(),this.update()});l(this,"toggleGroupRow",e=>{e in this.expandedGroupRow?delete this.expandedGroupRow[e]:this.expandedGroupRow[e]=!0,this.rows.clear(),this.flatRows.clear(),this.update()});l(this,"setWidth",(e,t)=>{const s=this.columns.value.leafs.find(o=>o.key===e);if(!s)throw new Error("Leaf column not found.");s.setWidth(t),this._sourceColumns.flatMap(o=>o.flatColumns).findOrThrow(o=>o.key===e).setWidth(t)});l(this,"groupColumns",[]);l(this,"_sortColumn");l(this,"_sortDirection","ASC");this.props=e,this.update=t,this._sourceColumns=e.def.columns.map(s=>new L(s,this)),this._sourceColumns.push(new L({key:E},this)),this._sourceColumns.unshift(new L({key:b,width:50,align:"center"},this)),this._sourceColumns.unshift(new L({key:j,pin:"LEFT",width:70,align:"right"},this))}get leftEdge(){return this.columns.value.left.sumBy(e=>e.inlineWidth??0)}get rightEdge(){return this.columns.value.right.sumBy(e=>e.inlineWidth??0)}get sortColumn(){return this._sortColumn}get sortDirection(){return this._sortDirection}}function re(u){const e=m.useMemo(()=>new oe(u,()=>s(o=>o+1)),[u]),[t,s]=m.useState(0);return m.useMemo(()=>Object.create(Object.getPrototypeOf(e),Object.getOwnPropertyDescriptors(e)),[e,t])}function le(u){const{column:e}=u,{key:t,pin:s,left:i,right:o,isEdge:r,isLeaf:d,leafs:a,grid:c,header:h,gridRows:f,widthVarName:w,leftVarName:v,rightVarName:x,inlineWidth:R}=e,_=t===E,I=t===y,C=t===j,P=t===b,W=s==="LEFT",G=s==="RIGHT",D=W||s==="RIGHT",M=W&&i===0,S=W&&r,U=G&&r,K=G&&o===0,O=d&&!_&&!C&&!P,X=d?1:a.length,Y=!C&&!P,B=!C&&!P,J=m.useMemo(()=>{if(C)return null;if(P)return n.jsx($,{m:1});if(I){if(c.groupColumns.length===1){const H=c.columns.value.leafs.findOrThrow(Q=>Q.key===c.groupColumns[0]);return H.header??H.key}return"Group"}return h??t},[c.groupColumns]);return n.jsx(T,{component:"datagrid.header.cell",variant:{isRowNumber:C,isPinned:D,isFirstLeftPinned:M,isLastLeftPinned:S,isFirstRightPinned:U,isLastRightPinned:K,isSortable:O},gridRow:f,gridColumn:X,style:{width:`var(${w})`,left:W?`var(${v})`:void 0,right:G?`var(${x})`:void 0},children:!_&&n.jsxs(n.Fragment,{children:[n.jsx(T,{width:"fit",height:"fit",jc:e.align,props:{onClick:O?()=>e.sortColumn():void 0},children:n.jsxs(T,{overflow:"hidden",position:d?void 0:"sticky",ai:"center",transition:"none",pl:e.align?void 0:4,style:{left:s?void 0:`var(${c.leftEdgeVarName})`},children:[n.jsx(g,{overflow:"hidden",textOverflow:"ellipsis",textWrap:"nowrap",children:J}),t===c.sortColumn&&n.jsx(g,{pl:(R??0)<58?0:2,children:n.jsx(p.ArrowIcon,{width:"16px",rotate:c.sortDirection==="ASC"?0:180,fill:"violet-950"})}),B&&n.jsx(g,{minWidth:12})]})}),Y&&n.jsx(ue,{column:e}),B&&n.jsx(ae,{column:e})]})})}function ue(u){const{column:e}=u;return n.jsx(T,{height:"fit",ai:"center",position:"absolute",right:e.pin==="RIGHT"?void 0:0,left:e.pin!=="RIGHT"?void 0:0,py:3,children:n.jsx(g,{cursor:"col-resize",px:.75,className:"resizer",height:"fit",props:{onMouseDown:e.resizeColumn,onTouchStart:e.resizeColumn},children:n.jsx(g,{width:.5,height:"fit",bgColor:"gray-400",hoverGroup:{resizer:{bgColor:"gray-600"}}})})})}function ae(u){const{column:e}=u,[t,s,i]=p.useVisibility({hideOnScroll:!0,event:"mousedown"}),[o,r]=m.useState({top:0,left:0}),d=m.useMemo(()=>o.left>window.innerWidth/2,[o.left]),a=e.isLeaf&&(e.grid.sortColumn!==e.key||e.grid.sortDirection==="DESC"),c=e.isLeaf&&(e.grid.sortColumn!==e.key||e.grid.sortDirection==="ASC"),h=e.isLeaf&&e.grid.sortColumn===e.key,f=e.pin!=="LEFT",w=e.pin!=="RIGHT",v=!!e.pin,x=e.isLeaf&&e.key!==y,R=a||c||h,_=f||w||v;return n.jsx(T,{position:"absolute",right:e.pin==="RIGHT"?2.5:4,top:"1/2",translateY:-3,ai:"center",children:n.jsxs(k,{clean:!0,onClick:()=>s(!t),width:6,height:6,cursor:"pointer",userSelect:"none",borderRadius:1,borderColor:"gray-200",display:"flex",jc:"center",ai:"center",transition:"none",bgColor:"gray-200",hover:{bgColor:"gray-300"},children:[n.jsx(p.DotsIcon,{fill:"violet-950"}),t&&n.jsxs(te,{bgColor:"white",width:56,b:1,borderColor:"gray-300",borderRadius:1,display:"flex",d:"column",mt:4,py:2,overflow:"hidden",translateX:d?-55:-5,onPositionChange:r,ref:i,shadow:"medium-shadow",children:[a&&n.jsxs(k,{clean:!0,display:"flex",gap:2,p:3,cursor:"pointer",hover:{bgColor:"gray-200"},onClick:()=>e.sortColumn("ASC"),children:[n.jsx(p.ArrowIcon,{width:"1rem",fill:"violet-950"}),"Sort Ascending"]}),c&&n.jsxs(k,{clean:!0,display:"flex",gap:2,p:3,cursor:"pointer",hover:{bgColor:"gray-200"},onClick:()=>e.sortColumn("DESC"),children:[n.jsx(p.ArrowIcon,{width:"1rem",fill:"violet-950",rotate:180}),"Sort Descending"]}),h&&n.jsxs(k,{clean:!0,display:"flex",gap:2,p:3,cursor:"pointer",hover:{bgColor:"gray-200"},onClick:()=>e.sortColumn(void 0),children:[n.jsx(g,{width:4}),"Clear Sort"]}),R&&(_||x)&&n.jsx(g,{bb:1,my:2,borderColor:"gray-300"}),f&&n.jsxs(k,{clean:!0,display:"flex",gap:2,p:3,cursor:"pointer",hover:{bgColor:"gray-200"},onClick:()=>e.pinColumn("LEFT"),children:[n.jsx(p.PinIcon,{width:"1rem",fill:"violet-950"}),"Pin Left"]}),w&&n.jsxs(k,{clean:!0,display:"flex",gap:2,p:3,cursor:"pointer",hover:{bgColor:"gray-200"},onClick:()=>e.pinColumn("RIGHT"),children:[n.jsx(p.PinIcon,{width:"1rem",fill:"violet-950",rotate:-90}),"Pin Right"]}),v&&n.jsxs(k,{clean:!0,display:"flex",gap:2,p:3,cursor:"pointer",hover:{bgColor:"gray-200"},onClick:()=>e.pinColumn(),children:[n.jsx(g,{width:4}),"Unpin"]}),R&&_&&x&&n.jsx(g,{bb:1,my:2,borderColor:"gray-300"}),x&&n.jsxs(k,{clean:!0,display:"flex",gap:2,p:3,cursor:"pointer",hover:{bgColor:"gray-200"},onClick:e.toggleGrouping,children:[n.jsx(g,{children:n.jsx(p.GroupingIcon,{width:"1rem",fill:"violet-950"})}),n.jsxs(g,{textWrap:"nowrap",children:[" Group by ",e.header??e.key]})]})]})]})})}function N(u){const{children:e,column:t,style:s,...i}=u,{key:o,pin:r,left:d,right:a,isEdge:c,align:h,widthVarName:f,leftVarName:w,rightVarName:v}=t,x=o===E,R=o===j,_=o===b,I=r==="LEFT",C=r==="RIGHT",P=I||C,W=I&&d===0,G=I&&c,D=C&&c,M=C&&a===0,S=!_&&!x;return n.jsxs(T,{component:"datagrid.cell",props:{role:"cell"},variant:{isRowNumber:R,isRowSelection:_,isPinned:P,isFirstLeftPinned:W,isLastLeftPinned:G,isFirstRightPinned:D,isLastRightPinned:M},jc:h,style:{width:`var(${f})`,left:I?`var(${w})`:void 0,right:C?`var(${v})`:void 0,...s},...i,children:[S&&n.jsx(g,{px:4,textOverflow:"ellipsis",overflow:"hidden",textWrap:"nowrap",children:e}),_&&e]})}function he(u){const{row:e}=u;return n.jsx(T,{className:"grid-row",display:"contents",props:{role:"rowgroup"},children:e.cells.map(t=>{if(t.column.key===y)return n.jsx(N,{column:t.column,style:{width:`var(${t.column.groupColumnWidthVarName})`},br:e.groupingColumn.pin==="LEFT"?1:void 0,gridColumn:e.groupingColumnGridColumn,pl:4*e.depth,children:n.jsx(k,{display:"contents",clean:!0,onClick:()=>e.toggleRow(),cursor:"pointer",children:t.value})},t.column.key);if(t.column.key===b)return n.jsx(N,{column:t.column,children:n.jsx($,{m:1})},t.column.key);if(t.column.pin!==e.groupingColumn.pin||t.column.key===E||t.column.key===j)return n.jsx(N,{column:t.column,children:t.value},t.column.key)})})}function ce(u){const{row:e}=u;return n.jsx(T,{className:"grid-row",display:"contents",props:{role:"row"},children:e.cells.map(t=>n.jsx(N,{column:t.column,children:t.column.key===b?n.jsx($,{}):t.value},t.column.key))})}function de(u){const e=re(u),{isResizeMode:t}=e,s=m.useMemo(()=>(console.log("render - headers"),e.headerRows.value.map(r=>r.map(d=>n.jsx(le,{column:d},d.uniqueKey)))),[e.headerRows.value]),i=m.useRef(null),o=m.useCallback(p.FnUtils.throttle(r=>{var d;(d=i.current)==null||d.setScrollTop(r.target.scrollTop)},100),[i.current]);return console.log("render - data grid"),n.jsxs(g,{component:"datagrid",style:e.sizes.value,props:{role:"presentation"},children:[n.jsx(g,{p:3,bb:1,borderColor:"gray-400",children:e.groupColumns.length>0?e.groupColumns.join(" > "):"No grouping"}),n.jsxs(g,{overflowX:"scroll",props:{onScroll:o},children:[n.jsx(V,{component:"datagrid.header",variant:{isResizeMode:t},style:{gridTemplateColumns:e.gridTemplateColumns.value},children:s}),n.jsx(me,{ref:i,grid:e})]}),n.jsxs(g,{p:3,bgColor:"gray-200",children:["Rows: ",e.rows.value.length]})]})}const F=10,q=25,ge=F+q*2;function pe(u,e){const{grid:t}=u,s=p.DEFAULT_REM_DIVIDER*t.ROW_HEIGHT,[i,o]=m.useState(0),r=Math.max(0,Math.floor(i/s)-q),d=m.useMemo(()=>(console.log("render - rows"),t.flatRows.value.take(ge,r).map(h=>h instanceof z?n.jsx(he,{row:h},h.rowKey):n.jsx(ce,{row:h},h.rowKey))),[t.flatRows.value,r]);m.useImperativeHandle(e,()=>({setScrollTop:o}));const a=t.flatRows.value.length;return n.jsx(g,{height:t.ROW_HEIGHT*F,children:n.jsx(g,{style:{height:`${a*s}px`},children:n.jsx(V,{props:{role:"presentation"},width:"max-content",minWidth:"fit",transition:"none",style:{transform:`translateY(${r*s}px)`,gridTemplateColumns:t.gridTemplateColumns.value},children:d})})})}const me=m.forwardRef(pe);module.exports=de;
|
package/components/dataGrid.d.ts
CHANGED
|
@@ -1,7 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
data?: TRow[];
|
|
4
|
-
def: GridDef<TRow>;
|
|
5
|
-
}
|
|
6
|
-
export default function DataGrid<TRow extends {}>(props: Props<TRow>): import("react/jsx-runtime").JSX.Element | null;
|
|
7
|
-
export {};
|
|
1
|
+
import { DataGridProps } from './dataGrid/contracts/dataGridContract';
|
|
2
|
+
export default function DataGrid<TRow extends {}>(props: DataGridProps<TRow>): import("react/jsx-runtime").JSX.Element;
|