@douglasneuroinformatics/libui 2.2.4 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/ActionDropdown/ActionDropdown.d.ts +20 -0
- package/dist/components/ActionDropdown/ActionDropdown.d.ts.map +1 -0
- package/dist/components/ActionDropdown/ActionDropdown.js +15 -0
- package/dist/components/ClientTable/ClientTable.d.ts +33 -0
- package/dist/components/ClientTable/ClientTable.d.ts.map +1 -0
- package/dist/components/ClientTable/ClientTable.js +69 -0
- package/dist/components/ClientTable/ClientTablePagination.d.ts +11 -0
- package/dist/components/ClientTable/ClientTablePagination.d.ts.map +1 -0
- package/dist/components/ClientTable/ClientTablePagination.js +20 -0
- package/dist/components/ListboxDropdown/ListboxDropdown.d.ts +18 -0
- package/dist/components/ListboxDropdown/ListboxDropdown.d.ts.map +1 -0
- package/dist/components/ListboxDropdown/ListboxDropdown.js +23 -0
- package/dist/components/Sheet/Sheet.d.ts +1 -1
- package/dist/components/Sheet/SheetContent.d.ts +2 -2
- package/dist/components.d.ts +3 -4
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +3 -4
- package/package.json +1 -1
- package/src/components/ActionDropdown/ActionDropdown.tsx +60 -0
- package/src/components/ClientTable/ClientTable.tsx +165 -0
- package/src/components/ClientTable/ClientTablePagination.tsx +60 -0
- package/src/components/ListboxDropdown/ListboxDropdown.tsx +61 -0
- package/src/components.ts +3 -4
- package/dist/components/LegacyDropdown/LegacyDropdown.d.ts +0 -21
- package/dist/components/LegacyDropdown/LegacyDropdown.d.ts.map +0 -1
- package/dist/components/LegacyDropdown/LegacyDropdown.js +0 -17
- package/dist/components/LegacySelectDropdown/LegacySelectDropdown.d.ts +0 -21
- package/dist/components/LegacySelectDropdown/LegacySelectDropdown.d.ts.map +0 -1
- package/dist/components/LegacySelectDropdown/LegacySelectDropdown.js +0 -18
- package/dist/components/LegacyTable/LegacyClientTable.d.ts +0 -5
- package/dist/components/LegacyTable/LegacyClientTable.d.ts.map +0 -1
- package/dist/components/LegacyTable/LegacyClientTable.js +0 -29
- package/dist/components/LegacyTable/LegacyTable.d.ts +0 -29
- package/dist/components/LegacyTable/LegacyTable.d.ts.map +0 -1
- package/dist/components/LegacyTable/LegacyTable.js +0 -54
- package/dist/components/LegacyTable/LegacyTableColumnHeader.d.ts +0 -16
- package/dist/components/LegacyTable/LegacyTableColumnHeader.d.ts.map +0 -1
- package/dist/components/LegacyTable/LegacyTableColumnHeader.js +0 -20
- package/src/components/LegacyDropdown/LegacyDropdown.tsx +0 -79
- package/src/components/LegacySelectDropdown/LegacySelectDropdown.tsx +0 -87
- package/src/components/LegacyTable/LegacyClientTable.tsx +0 -55
- package/src/components/LegacyTable/LegacyTable.tsx +0 -118
- package/src/components/LegacyTable/LegacyTableColumnHeader.tsx +0 -71
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
|
|
3
|
-
import { range, toBasicISOString } from '@douglasneuroinformatics/libjs';
|
|
4
|
-
import { clsx } from 'clsx';
|
|
5
|
-
import { twMerge } from 'tailwind-merge';
|
|
6
|
-
|
|
7
|
-
import { type LegacyColumnDropdownOptions, LegacyTableColumnHeader } from './LegacyTableColumnHeader.js';
|
|
8
|
-
|
|
9
|
-
/** Coerces the value in a cell to a string for consistant display purposes */
|
|
10
|
-
function defaultFormatter(value: unknown): string {
|
|
11
|
-
if (typeof value === 'string') {
|
|
12
|
-
return value;
|
|
13
|
-
} else if (typeof value === 'number') {
|
|
14
|
-
return value.toFixed(2).toString();
|
|
15
|
-
} else if (typeof value === 'undefined') {
|
|
16
|
-
return 'NA';
|
|
17
|
-
}
|
|
18
|
-
if (value instanceof Date) {
|
|
19
|
-
return toBasicISOString(value);
|
|
20
|
-
}
|
|
21
|
-
return JSON.stringify(value);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/** @deprecated */
|
|
25
|
-
export type LegacyTableEntry = { [key: string]: unknown };
|
|
26
|
-
|
|
27
|
-
/** @deprecated */
|
|
28
|
-
export type LegacyFieldFactory<T extends LegacyTableEntry = LegacyTableEntry> = (entry: T) => string;
|
|
29
|
-
|
|
30
|
-
/** @deprecated */
|
|
31
|
-
export type LegacyTableColumn<T extends LegacyTableEntry> = {
|
|
32
|
-
/** How to determine the values for column */
|
|
33
|
-
field: LegacyFieldFactory<T> | keyof T;
|
|
34
|
-
|
|
35
|
-
/** Override the default formatter for this field */
|
|
36
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
37
|
-
formatter?: (value: any) => string;
|
|
38
|
-
|
|
39
|
-
/** The label to be displayed on the header */
|
|
40
|
-
label: string;
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
/** @deprecated */
|
|
44
|
-
export type LegacyTableProps<T extends LegacyTableEntry> = {
|
|
45
|
-
className?: string;
|
|
46
|
-
columnDropdownOptions?: LegacyColumnDropdownOptions<T>;
|
|
47
|
-
columns: LegacyTableColumn<T>[];
|
|
48
|
-
data: T[];
|
|
49
|
-
minRows?: number;
|
|
50
|
-
onEntryClick?: (entry: T) => void;
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
/** @deprecated */
|
|
54
|
-
export const LegacyTable = <T extends LegacyTableEntry>({
|
|
55
|
-
className,
|
|
56
|
-
columnDropdownOptions,
|
|
57
|
-
columns,
|
|
58
|
-
data,
|
|
59
|
-
minRows,
|
|
60
|
-
onEntryClick
|
|
61
|
-
}: LegacyTableProps<T>) => {
|
|
62
|
-
const nRows = Math.max(data.length, minRows ?? -1);
|
|
63
|
-
return (
|
|
64
|
-
<div className={twMerge('min-w-full overflow-hidden rounded-md bg-slate-50 shadow dark:bg-slate-800', className)}>
|
|
65
|
-
<div className="w-full overflow-x-scroll">
|
|
66
|
-
<table className="w-full table-auto">
|
|
67
|
-
<thead className="border-b border-slate-300 bg-slate-50 dark:border-0 dark:bg-slate-700">
|
|
68
|
-
<tr>
|
|
69
|
-
{columns.map((column, i) => (
|
|
70
|
-
<th
|
|
71
|
-
className="whitespace-nowrap text-left text-sm font-semibold text-slate-800 dark:text-slate-200"
|
|
72
|
-
key={i}
|
|
73
|
-
>
|
|
74
|
-
<LegacyTableColumnHeader column={column} dropdownOptions={columnDropdownOptions} />
|
|
75
|
-
</th>
|
|
76
|
-
))}
|
|
77
|
-
</tr>
|
|
78
|
-
</thead>
|
|
79
|
-
<tbody className="divide-y dark:divide-slate-600">
|
|
80
|
-
{nRows > 0 &&
|
|
81
|
-
range(nRows).map((i) => {
|
|
82
|
-
const entry = data[i];
|
|
83
|
-
return (
|
|
84
|
-
<tr
|
|
85
|
-
className={clsx('whitespace-nowrap p-4 text-sm text-muted-foreground', {
|
|
86
|
-
'cursor-pointer hover:backdrop-brightness-95': entry && typeof onEntryClick === 'function'
|
|
87
|
-
})}
|
|
88
|
-
data-cy="table-row"
|
|
89
|
-
key={i}
|
|
90
|
-
onClick={() => {
|
|
91
|
-
entry && onEntryClick && onEntryClick(entry);
|
|
92
|
-
}}
|
|
93
|
-
>
|
|
94
|
-
{columns.map(({ field, formatter }, j) => {
|
|
95
|
-
let value: unknown;
|
|
96
|
-
if (!entry) {
|
|
97
|
-
value = '';
|
|
98
|
-
} else if (typeof field === 'function') {
|
|
99
|
-
value = field(entry);
|
|
100
|
-
} else {
|
|
101
|
-
value = entry[field];
|
|
102
|
-
}
|
|
103
|
-
const formattedValue = entry && formatter ? formatter(value) : defaultFormatter(value);
|
|
104
|
-
return (
|
|
105
|
-
<td className="whitespace-nowrap px-6" data-cy="table-data-item" key={j} style={{ height: 42 }}>
|
|
106
|
-
<span className="block text-ellipsis leading-none">{formattedValue}</span>
|
|
107
|
-
</td>
|
|
108
|
-
);
|
|
109
|
-
})}
|
|
110
|
-
</tr>
|
|
111
|
-
);
|
|
112
|
-
})}
|
|
113
|
-
</tbody>
|
|
114
|
-
</table>
|
|
115
|
-
</div>
|
|
116
|
-
</div>
|
|
117
|
-
);
|
|
118
|
-
};
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
|
|
3
|
-
import { Menu, Transition } from '@headlessui/react';
|
|
4
|
-
import { ChevronDownIcon } from '@heroicons/react/24/solid';
|
|
5
|
-
import { clsx } from 'clsx';
|
|
6
|
-
|
|
7
|
-
import type { LegacyTableColumn, LegacyTableEntry } from './LegacyTable.js';
|
|
8
|
-
|
|
9
|
-
/** @deprecated */
|
|
10
|
-
export type LegacyColumnDropdownOptions<T extends LegacyTableEntry> = {
|
|
11
|
-
icon?: React.ComponentType<Omit<React.SVGProps<SVGSVGElement>, 'ref'>>;
|
|
12
|
-
label: string;
|
|
13
|
-
onSelection: (column: LegacyTableColumn<T>) => void;
|
|
14
|
-
}[];
|
|
15
|
-
|
|
16
|
-
/** @deprecated */
|
|
17
|
-
export type LegacyTableColumnProps<T extends LegacyTableEntry> = {
|
|
18
|
-
column: LegacyTableColumn<T>;
|
|
19
|
-
dropdownOptions?: LegacyColumnDropdownOptions<T>;
|
|
20
|
-
};
|
|
21
|
-
|
|
22
|
-
/** @deprecated */
|
|
23
|
-
export const LegacyTableColumnHeader = <T extends LegacyTableEntry>({
|
|
24
|
-
column,
|
|
25
|
-
dropdownOptions
|
|
26
|
-
}: LegacyTableColumnProps<T>) => {
|
|
27
|
-
return (
|
|
28
|
-
<Menu as="div" className="relative">
|
|
29
|
-
<Menu.Button
|
|
30
|
-
className={clsx(
|
|
31
|
-
'flex min-w-[10rem] flex-shrink-0 items-center justify-between px-6 py-3 text-sm font-semibold text-slate-800 dark:text-slate-200',
|
|
32
|
-
{ 'cursor-default': !dropdownOptions }
|
|
33
|
-
)}
|
|
34
|
-
>
|
|
35
|
-
{column.label}
|
|
36
|
-
{dropdownOptions && <ChevronDownIcon className="ml-3" height={16} width={16} />}
|
|
37
|
-
</Menu.Button>
|
|
38
|
-
{dropdownOptions && (
|
|
39
|
-
<Transition
|
|
40
|
-
as={React.Fragment}
|
|
41
|
-
enter="transition ease-out duration-100"
|
|
42
|
-
enterFrom="transform opacity-0 scale-95"
|
|
43
|
-
enterTo="transform opacity-100 scale-100"
|
|
44
|
-
leave="transition ease-in duration-75"
|
|
45
|
-
leaveFrom="transform opacity-100 scale-100"
|
|
46
|
-
leaveTo="transform opacity-0 scale-95"
|
|
47
|
-
>
|
|
48
|
-
<Menu.Items className="absolute right-4 z-50 mt-2 w-32 origin-top-right overflow-hidden rounded-md bg-slate-50 shadow-sm ring-1 ring-black ring-opacity-5 focus:outline-none dark:bg-slate-700">
|
|
49
|
-
{dropdownOptions.map((option) => {
|
|
50
|
-
const Icon = option.icon;
|
|
51
|
-
return (
|
|
52
|
-
<Menu.Item
|
|
53
|
-
as="button"
|
|
54
|
-
className="flex w-full items-center text-ellipsis whitespace-nowrap px-3 py-2 hover:backdrop-brightness-95 dark:hover:backdrop-brightness-150"
|
|
55
|
-
key={option.label}
|
|
56
|
-
type="button"
|
|
57
|
-
onClick={() => {
|
|
58
|
-
option.onSelection(column);
|
|
59
|
-
}}
|
|
60
|
-
>
|
|
61
|
-
{Icon && <Icon className="mr-2" height={16} width={16} />}
|
|
62
|
-
{option.label}
|
|
63
|
-
</Menu.Item>
|
|
64
|
-
);
|
|
65
|
-
})}
|
|
66
|
-
</Menu.Items>
|
|
67
|
-
</Transition>
|
|
68
|
-
)}
|
|
69
|
-
</Menu>
|
|
70
|
-
);
|
|
71
|
-
};
|