pne-ui 4.4.0 → 4.5.0-rc.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/README.md +61 -0
- package/cjs/component/table/column-settings/PneTableColumnSettingsAction.d.ts +25 -0
- package/cjs/component/table/column-settings/PneTableColumnSettingsAction.js +38 -0
- package/cjs/component/table/column-settings/PneTableColumnSettingsAction.js.map +1 -0
- package/cjs/component/table/column-settings/PneTableColumnSettingsDialog.d.ts +40 -0
- package/cjs/component/table/column-settings/PneTableColumnSettingsDialog.js +150 -0
- package/cjs/component/table/column-settings/PneTableColumnSettingsDialog.js.map +1 -0
- package/cjs/component/table/column-settings/resolveColumnSettings.d.ts +22 -0
- package/cjs/component/table/column-settings/resolveColumnSettings.js +84 -0
- package/cjs/component/table/column-settings/resolveColumnSettings.js.map +1 -0
- package/cjs/component/table/column-settings/types.d.ts +37 -0
- package/cjs/component/table/column-settings/types.js +3 -0
- package/cjs/component/table/column-settings/types.js.map +1 -0
- package/cjs/component/table/column-settings/usePneTableColumnSettings.d.ts +34 -0
- package/cjs/component/table/column-settings/usePneTableColumnSettings.js +37 -0
- package/cjs/component/table/column-settings/usePneTableColumnSettings.js.map +1 -0
- package/cjs/exports/table.d.ts +8 -0
- package/cjs/exports/table.js +11 -1
- package/cjs/exports/table.js.map +1 -1
- package/esm/component/table/column-settings/PneTableColumnSettingsAction.d.ts +25 -0
- package/esm/component/table/column-settings/PneTableColumnSettingsAction.js +34 -0
- package/esm/component/table/column-settings/PneTableColumnSettingsAction.js.map +1 -0
- package/esm/component/table/column-settings/PneTableColumnSettingsDialog.d.ts +40 -0
- package/esm/component/table/column-settings/PneTableColumnSettingsDialog.js +146 -0
- package/esm/component/table/column-settings/PneTableColumnSettingsDialog.js.map +1 -0
- package/esm/component/table/column-settings/resolveColumnSettings.d.ts +22 -0
- package/esm/component/table/column-settings/resolveColumnSettings.js +77 -0
- package/esm/component/table/column-settings/resolveColumnSettings.js.map +1 -0
- package/esm/component/table/column-settings/types.d.ts +37 -0
- package/esm/component/table/column-settings/types.js +2 -0
- package/esm/component/table/column-settings/types.js.map +1 -0
- package/esm/component/table/column-settings/usePneTableColumnSettings.d.ts +34 -0
- package/esm/component/table/column-settings/usePneTableColumnSettings.js +35 -0
- package/esm/component/table/column-settings/usePneTableColumnSettings.js.map +1 -0
- package/esm/exports/table.d.ts +8 -0
- package/esm/exports/table.js +4 -0
- package/esm/exports/table.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -690,6 +690,63 @@ remount. В controlled-режиме lifetime принадлежит consumer: е
|
|
|
690
690
|
экрана, consumer сам должен очистить его при navigation/remount. Строковое представление applied scope остаётся
|
|
691
691
|
в памяти библиотеки и не выводится в DOM/storage.
|
|
692
692
|
|
|
693
|
+
#### Настройка колонок
|
|
694
|
+
|
|
695
|
+
Пользовательский состав колонок для одного view таблицы. Библиотека не знает, где хранится настройка:
|
|
696
|
+
consumer передаёт загруженное значение и колбэк сохранения, а получает упорядоченный список видимых колонок.
|
|
697
|
+
|
|
698
|
+
- Каталог — массив `PneTableColumnOption` (`id`, текстовый `label`, `defaultVisible`) в порядке по умолчанию.
|
|
699
|
+
`id` стабилен и не зависит от языка и позиции; поля consumer-типа (например, `render`) сохраняются
|
|
700
|
+
в `visibleColumns`.
|
|
701
|
+
- Значение `PneTableColumnSettingsValue` — `visibleColumnIds` в порядке отображения и `hiddenColumnIds`.
|
|
702
|
+
Колонки каталога, отсутствующие в обоих списках, считаются новыми и показываются; неизвестные `id`
|
|
703
|
+
отбрасываются; значение без видимых колонок заменяется умолчанием.
|
|
704
|
+
- `usePneTableColumnSettings({columns, value, onSave})` сверяет значение с каталогом и владеет состоянием
|
|
705
|
+
окна. Для нескольких view создавайте по одному хуку на view.
|
|
706
|
+
- `PneTableColumnSettingsAction` — кнопка вызова (`variant='icon'` для слота `actions` селектора view,
|
|
707
|
+
`variant='button'` для широкой панели). `PneTableColumnSettingsDialog` — модальное окно: поиск, один
|
|
708
|
+
чеклист по каталогу, «Reset to default», «Cancel», «Save». Последняя видимая колонка не снимается.
|
|
709
|
+
- `onSave` получает нормализованное значение. Окно закрывается после resolve; при reject остаётся открытым
|
|
710
|
+
с черновиком, сообщение об ошибке показывает consumer.
|
|
711
|
+
- Служебные колонки (выбор строки, действия) в каталог не входят: рендерьте их рядом с `visibleColumns`.
|
|
712
|
+
|
|
713
|
+
```tsx
|
|
714
|
+
const columns = [
|
|
715
|
+
{id: 'id', label: 'ID'},
|
|
716
|
+
{id: 'name', label: 'Name'},
|
|
717
|
+
{id: 'email', label: 'Email', defaultVisible: false},
|
|
718
|
+
] as const satisfies readonly PneTableColumnOption[]
|
|
719
|
+
|
|
720
|
+
const settings = usePneTableColumnSettings({
|
|
721
|
+
columns,
|
|
722
|
+
value: storedValue, // PneTableColumnSettingsValue | undefined
|
|
723
|
+
onSave: value => api.save(value),
|
|
724
|
+
})
|
|
725
|
+
|
|
726
|
+
<PneTable<Row>
|
|
727
|
+
autoTestId="items"
|
|
728
|
+
data={rows}
|
|
729
|
+
toolbar={<PneTableToolbar
|
|
730
|
+
aria-label="Items table controls"
|
|
731
|
+
persistent={<PneTableColumnSettingsAction autoTestId="items" onClick={settings.openDialog}/>}
|
|
732
|
+
/>}
|
|
733
|
+
createTableHeader={() => <PneTableRow>
|
|
734
|
+
{settings.visibleColumns.map(column => (
|
|
735
|
+
<PneHeaderTableCell key={column.id}>{column.label}</PneHeaderTableCell>
|
|
736
|
+
))}
|
|
737
|
+
</PneTableRow>}
|
|
738
|
+
createRow={row => <PneTableRow key={row.id}>
|
|
739
|
+
{settings.visibleColumns.map(column => (
|
|
740
|
+
<PneTableCell key={column.id}>{row[column.id]}</PneTableCell>
|
|
741
|
+
))}
|
|
742
|
+
</PneTableRow>}
|
|
743
|
+
/>
|
|
744
|
+
<PneTableColumnSettingsDialog {...settings.dialogProps} autoTestId="items"/>
|
|
745
|
+
```
|
|
746
|
+
|
|
747
|
+
Ключи локализации задаются в библиотеке с английским `defaultValue`: `pneTable.columnSettings.action`,
|
|
748
|
+
`.title`, `.search`, `.reset`, `.cancel`, `.save`, `.noMatches`, `.lastVisible`.
|
|
749
|
+
|
|
693
750
|
### SearchUI и SearchUIFilters
|
|
694
751
|
|
|
695
752
|
Передавайте стабильный несекретный `autoTestId` как Selenium scope поискового интерфейса. Если prop не задан,
|
|
@@ -869,6 +926,10 @@ assertEquals("true", enabled.getAttribute("aria-pressed"));
|
|
|
869
926
|
| Пустой результат | `[data-autotest="empty-state"]` | Наличие существующей empty row |
|
|
870
927
|
| Загрузка | Semantic `table` | `aria-busy="true|false"` |
|
|
871
928
|
| Активная сортировка | `th[aria-sort="ascending"], th[aria-sort="descending"]` | Значение `aria-sort` |
|
|
929
|
+
| Кнопка настройки колонок | `[data-autotest="column-settings"][data-autotest-value="<scope>"]` | Native button `disabled`; `<scope>` задаёт consumer через `autoTestId` |
|
|
930
|
+
| Окно настройки колонок | `[data-autotest="column-settings-dialog"][data-autotest-value="<scope>"]` | Существование `role="dialog"`; внутри `column-settings-search`, `column-settings-reset`, `column-settings-cancel`, `column-settings-save` |
|
|
931
|
+
| Колонка в окне настройки | `input[data-autotest="column-settings-option"][data-autotest-value="<columnId>"]` | Native `checked`, `disabled`; порядок в DOM = порядок отображения, скрытые в конце |
|
|
932
|
+
| Пустой поиск по колонкам | `[data-autotest="column-settings-empty"]` | Наличие строки |
|
|
872
933
|
|
|
873
934
|
Внутри каждого `pagination/top|bottom` уже существуют:
|
|
874
935
|
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { SxProps, Theme } from '@mui/material';
|
|
3
|
+
export declare const COLUMN_SETTINGS_ACTION_AUTOTEST_ID = "column-settings";
|
|
4
|
+
export type PneTableColumnSettingsActionProps = {
|
|
5
|
+
/** Opens the column settings dialog. */
|
|
6
|
+
onClick: React.MouseEventHandler<HTMLButtonElement>;
|
|
7
|
+
/**
|
|
8
|
+
* `icon` renders a 40px icon button with a tooltip and fits the
|
|
9
|
+
* `PneTableViewSelector` actions slot. `button` renders an outlined text
|
|
10
|
+
* button with the icon for wide layouts. Defaults to `icon`.
|
|
11
|
+
*/
|
|
12
|
+
variant?: 'icon' | 'button';
|
|
13
|
+
/** Accessible name and visible text; defaults to the localized "Table settings". */
|
|
14
|
+
label?: string;
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
/** Stable, non-secret instance identifier used to scope Selenium locators. */
|
|
17
|
+
autoTestId?: string;
|
|
18
|
+
sx?: SxProps<Theme>;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Entry point to the column settings dialog. Place it in the table toolbar or
|
|
22
|
+
* in the view selector `actions` slot next to the view it configures.
|
|
23
|
+
*/
|
|
24
|
+
declare const PneTableColumnSettingsAction: React.ForwardRefExoticComponent<PneTableColumnSettingsActionProps & React.RefAttributes<HTMLButtonElement>>;
|
|
25
|
+
export default PneTableColumnSettingsAction;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.COLUMN_SETTINGS_ACTION_AUTOTEST_ID = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const react_1 = tslib_1.__importStar(require("react"));
|
|
6
|
+
const SettingsOutlined_1 = tslib_1.__importDefault(require("@mui/icons-material/SettingsOutlined"));
|
|
7
|
+
const material_1 = require("@mui/material");
|
|
8
|
+
const react_i18next_1 = require("react-i18next");
|
|
9
|
+
const PneButton_1 = tslib_1.__importDefault(require("../../PneButton"));
|
|
10
|
+
const AutoTestAttribute_1 = require("../../AutoTestAttribute");
|
|
11
|
+
exports.COLUMN_SETTINGS_ACTION_AUTOTEST_ID = 'column-settings';
|
|
12
|
+
const iconButtonSx = {
|
|
13
|
+
borderRadius: '4px',
|
|
14
|
+
height: '40px',
|
|
15
|
+
padding: '8px',
|
|
16
|
+
width: '40px',
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Entry point to the column settings dialog. Place it in the table toolbar or
|
|
20
|
+
* in the view selector `actions` slot next to the view it configures.
|
|
21
|
+
*/
|
|
22
|
+
const PneTableColumnSettingsAction = (0, react_1.forwardRef)(function PneTableColumnSettingsAction(props, ref) {
|
|
23
|
+
const { autoTestId, disabled = false, label, onClick, sx, variant = 'icon', } = props;
|
|
24
|
+
const { t } = (0, react_i18next_1.useTranslation)();
|
|
25
|
+
const resolvedLabel = label ?? t('pneTable.columnSettings.action', { defaultValue: 'Table settings' });
|
|
26
|
+
if (variant === 'button') {
|
|
27
|
+
return react_1.default.createElement(PneButton_1.default, { ...(0, AutoTestAttribute_1.createAutoTestAttributes)(exports.COLUMN_SETTINGS_ACTION_AUTOTEST_ID, autoTestId), disabled: disabled, onClick: onClick, pneStyle: 'outlined', ref: ref, startIcon: react_1.default.createElement(SettingsOutlined_1.default, null), sx: sx }, resolvedLabel);
|
|
28
|
+
}
|
|
29
|
+
return react_1.default.createElement(material_1.Tooltip, { enterDelay: 300, enterNextDelay: 300, title: resolvedLabel },
|
|
30
|
+
react_1.default.createElement("span", null,
|
|
31
|
+
react_1.default.createElement(material_1.IconButton, { ...(0, AutoTestAttribute_1.createAutoTestAttributes)(exports.COLUMN_SETTINGS_ACTION_AUTOTEST_ID, autoTestId), "aria-label": resolvedLabel, disabled: disabled, onClick: onClick, ref: ref, size: 'small', sx: [
|
|
32
|
+
iconButtonSx,
|
|
33
|
+
...(Array.isArray(sx) ? sx : [sx]),
|
|
34
|
+
] },
|
|
35
|
+
react_1.default.createElement(SettingsOutlined_1.default, { sx: { height: '16px', width: '16px' } }))));
|
|
36
|
+
});
|
|
37
|
+
exports.default = PneTableColumnSettingsAction;
|
|
38
|
+
//# sourceMappingURL=PneTableColumnSettingsAction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PneTableColumnSettingsAction.js","sourceRoot":"","sources":["../../../../src/component/table/column-settings/PneTableColumnSettingsAction.tsx"],"names":[],"mappings":";;;;AAAA,uDAAuC;AACvC,oGAAuE;AACvE,4CAAiE;AACjE,iDAA4C;AAC5C,wEAAuC;AACvC,+DAAgE;AAEnD,QAAA,kCAAkC,GAAG,iBAAiB,CAAA;AAmBnE,MAAM,YAAY,GAAmB;IACjC,YAAY,EAAE,KAAK;IACnB,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,KAAK;IACd,KAAK,EAAE,MAAM;CAChB,CAAA;AAED;;;GAGG;AACH,MAAM,4BAA4B,GAAG,IAAA,kBAAU,EAC3C,SAAS,4BAA4B,CAAC,KAAK,EAAE,GAAG;IAC5C,MAAM,EACF,UAAU,EACV,QAAQ,GAAG,KAAK,EAChB,KAAK,EACL,OAAO,EACP,EAAE,EACF,OAAO,GAAG,MAAM,GACnB,GAAG,KAAK,CAAA;IACT,MAAM,EAAC,CAAC,EAAC,GAAG,IAAA,8BAAc,GAAE,CAAA;IAC5B,MAAM,aAAa,GAAG,KAAK,IAAI,CAAC,CAAC,gCAAgC,EAAE,EAAC,YAAY,EAAE,gBAAgB,EAAC,CAAC,CAAA;IAEpG,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACvB,OAAO,8BAAC,mBAAS,OACT,IAAA,4CAAwB,EAAC,0CAAkC,EAAE,UAAU,CAAC,EAC5E,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAC,UAAU,EACnB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,8BAAC,0BAAoB,OAAE,EAClC,EAAE,EAAE,EAAE,IAEL,aAAa,CACN,CAAA;IAChB,CAAC;IAED,OAAO,8BAAC,kBAAO,IACX,UAAU,EAAE,GAAG,EACf,cAAc,EAAE,GAAG,EACnB,KAAK,EAAE,aAAa;QAEpB;YACI,8BAAC,qBAAU,OACH,IAAA,4CAAwB,EAAC,0CAAkC,EAAE,UAAU,CAAC,gBAChE,aAAa,EACzB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,GAAG,EACR,IAAI,EAAC,OAAO,EACZ,EAAE,EAAE;oBACA,YAAY;oBACZ,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;iBACrC;gBAED,8BAAC,0BAAoB,IAAC,EAAE,EAAE,EAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAC,GAAG,CACnD,CACV,CACD,CAAA;AACd,CAAC,CACJ,CAAA;AAED,kBAAe,4BAA4B,CAAA"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import React, { ReactNode } from 'react';
|
|
2
|
+
import { SxProps, Theme } from '@mui/material';
|
|
3
|
+
import type { PneTableColumnOption, PneTableColumnSettingsValue } from './types';
|
|
4
|
+
export declare const COLUMN_SETTINGS_DIALOG_AUTOTEST_ID = "column-settings-dialog";
|
|
5
|
+
export declare const COLUMN_SETTINGS_SEARCH_AUTOTEST_ID = "column-settings-search";
|
|
6
|
+
export declare const COLUMN_SETTINGS_OPTION_AUTOTEST_ID = "column-settings-option";
|
|
7
|
+
export declare const COLUMN_SETTINGS_EMPTY_AUTOTEST_ID = "column-settings-empty";
|
|
8
|
+
export declare const COLUMN_SETTINGS_RESET_AUTOTEST_ID = "column-settings-reset";
|
|
9
|
+
export declare const COLUMN_SETTINGS_CANCEL_AUTOTEST_ID = "column-settings-cancel";
|
|
10
|
+
export declare const COLUMN_SETTINGS_SAVE_AUTOTEST_ID = "column-settings-save";
|
|
11
|
+
export type PneTableColumnSettingsDialogProps<TColumn extends PneTableColumnOption = PneTableColumnOption> = {
|
|
12
|
+
open: boolean;
|
|
13
|
+
/** Called on Cancel, on the close button, on backdrop/Escape, and after a successful save. */
|
|
14
|
+
onClose: () => void;
|
|
15
|
+
/** Column catalog of the configured table view, in default display order. */
|
|
16
|
+
columns: readonly TColumn[];
|
|
17
|
+
/** Stored preference; `undefined` or `null` means the catalog defaults. */
|
|
18
|
+
value?: PneTableColumnSettingsValue | null;
|
|
19
|
+
/**
|
|
20
|
+
* Receives the normalized draft on Save. The dialog closes once the returned
|
|
21
|
+
* promise resolves. A rejected promise keeps the dialog open with the draft
|
|
22
|
+
* intact; reporting that failure to the user is the caller's job.
|
|
23
|
+
*/
|
|
24
|
+
onSave: (value: PneTableColumnSettingsValue) => void | Promise<void>;
|
|
25
|
+
/** Stable, non-secret instance identifier used to scope Selenium locators. */
|
|
26
|
+
autoTestId?: string;
|
|
27
|
+
/** Defaults to the localized "Table settings". */
|
|
28
|
+
title?: ReactNode;
|
|
29
|
+
/** Set to false to drop the search field for short catalogs. Defaults to true. */
|
|
30
|
+
searchable?: boolean;
|
|
31
|
+
containerSx?: SxProps<Theme>;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Modal editor for the visible column set of one table view: a searchable
|
|
35
|
+
* checklist over the catalog, "Reset to default", "Cancel" and "Save". The
|
|
36
|
+
* draft is created when the dialog opens and discarded when it closes, so a
|
|
37
|
+
* reopened dialog always starts from the current `value`.
|
|
38
|
+
*/
|
|
39
|
+
declare const PneTableColumnSettingsDialog: <TColumn extends PneTableColumnOption = PneTableColumnOption>(props: PneTableColumnSettingsDialogProps<TColumn>) => React.JSX.Element | null;
|
|
40
|
+
export default PneTableColumnSettingsDialog;
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.COLUMN_SETTINGS_SAVE_AUTOTEST_ID = exports.COLUMN_SETTINGS_CANCEL_AUTOTEST_ID = exports.COLUMN_SETTINGS_RESET_AUTOTEST_ID = exports.COLUMN_SETTINGS_EMPTY_AUTOTEST_ID = exports.COLUMN_SETTINGS_OPTION_AUTOTEST_ID = exports.COLUMN_SETTINGS_SEARCH_AUTOTEST_ID = exports.COLUMN_SETTINGS_DIALOG_AUTOTEST_ID = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const react_1 = tslib_1.__importStar(require("react"));
|
|
6
|
+
const material_1 = require("@mui/material");
|
|
7
|
+
const react_i18next_1 = require("react-i18next");
|
|
8
|
+
const PneModal_1 = tslib_1.__importDefault(require("../../PneModal"));
|
|
9
|
+
const PneModalActions_1 = tslib_1.__importDefault(require("../../PneModalActions"));
|
|
10
|
+
const PneButton_1 = tslib_1.__importDefault(require("../../PneButton"));
|
|
11
|
+
const PneCheckbox_1 = require("../../PneCheckbox");
|
|
12
|
+
const PneTextField_1 = tslib_1.__importDefault(require("../../PneTextField"));
|
|
13
|
+
const AutoTestAttribute_1 = require("../../AutoTestAttribute");
|
|
14
|
+
const resolveColumnSettings_1 = require("./resolveColumnSettings");
|
|
15
|
+
exports.COLUMN_SETTINGS_DIALOG_AUTOTEST_ID = 'column-settings-dialog';
|
|
16
|
+
exports.COLUMN_SETTINGS_SEARCH_AUTOTEST_ID = 'column-settings-search';
|
|
17
|
+
exports.COLUMN_SETTINGS_OPTION_AUTOTEST_ID = 'column-settings-option';
|
|
18
|
+
exports.COLUMN_SETTINGS_EMPTY_AUTOTEST_ID = 'column-settings-empty';
|
|
19
|
+
exports.COLUMN_SETTINGS_RESET_AUTOTEST_ID = 'column-settings-reset';
|
|
20
|
+
exports.COLUMN_SETTINGS_CANCEL_AUTOTEST_ID = 'column-settings-cancel';
|
|
21
|
+
exports.COLUMN_SETTINGS_SAVE_AUTOTEST_ID = 'column-settings-save';
|
|
22
|
+
const listSx = {
|
|
23
|
+
maxHeight: '320px',
|
|
24
|
+
overflowY: 'auto',
|
|
25
|
+
padding: 0,
|
|
26
|
+
};
|
|
27
|
+
const itemButtonSx = {
|
|
28
|
+
borderRadius: '4px',
|
|
29
|
+
minHeight: '40px',
|
|
30
|
+
paddingBottom: '2px',
|
|
31
|
+
paddingLeft: '4px',
|
|
32
|
+
paddingRight: '8px',
|
|
33
|
+
paddingTop: '2px',
|
|
34
|
+
};
|
|
35
|
+
const normalizeSearch = (value) => value.trim().toLocaleLowerCase();
|
|
36
|
+
const ColumnSettingsForm = (props) => {
|
|
37
|
+
const { autoTestId, columns, containerSx, onClose, onSave, searchable = true, title, value, } = props;
|
|
38
|
+
const { t } = (0, react_i18next_1.useTranslation)();
|
|
39
|
+
const initial = (0, react_1.useMemo)(() => (0, resolveColumnSettings_1.resolvePneTableColumnSettings)(columns, value), [columns, value]);
|
|
40
|
+
const [draft, setDraft] = (0, react_1.useState)(initial.value);
|
|
41
|
+
const [search, setSearch] = (0, react_1.useState)('');
|
|
42
|
+
const [saving, setSaving] = (0, react_1.useState)(false);
|
|
43
|
+
const mountedRef = (0, react_1.useRef)(true);
|
|
44
|
+
(0, react_1.useEffect)(() => () => {
|
|
45
|
+
mountedRef.current = false;
|
|
46
|
+
}, []);
|
|
47
|
+
const resolvedDraft = (0, react_1.useMemo)(() => (0, resolveColumnSettings_1.resolvePneTableColumnSettings)(columns, draft), [columns, draft]);
|
|
48
|
+
const items = (0, react_1.useMemo)(() => [
|
|
49
|
+
...resolvedDraft.visibleColumns.map(column => ({ column, visible: true })),
|
|
50
|
+
...resolvedDraft.hiddenColumns.map(column => ({ column, visible: false })),
|
|
51
|
+
], [resolvedDraft]);
|
|
52
|
+
const normalizedSearch = normalizeSearch(search);
|
|
53
|
+
const filteredItems = normalizedSearch === ''
|
|
54
|
+
? items
|
|
55
|
+
: items.filter(item => normalizeSearch(item.column.label).includes(normalizedSearch));
|
|
56
|
+
const lastVisibleId = resolvedDraft.visibleColumns.length === 1
|
|
57
|
+
? resolvedDraft.visibleColumns[0].id
|
|
58
|
+
: null;
|
|
59
|
+
const toggle = (id) => {
|
|
60
|
+
setDraft(current => {
|
|
61
|
+
const visible = current.visibleColumnIds.includes(id);
|
|
62
|
+
if (visible) {
|
|
63
|
+
if (current.visibleColumnIds.length <= 1) {
|
|
64
|
+
return current;
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
visibleColumnIds: current.visibleColumnIds.filter(columnId => columnId !== id),
|
|
68
|
+
hiddenColumnIds: [...current.hiddenColumnIds, id],
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
visibleColumnIds: [...current.visibleColumnIds, id],
|
|
73
|
+
hiddenColumnIds: current.hiddenColumnIds.filter(columnId => columnId !== id),
|
|
74
|
+
};
|
|
75
|
+
});
|
|
76
|
+
};
|
|
77
|
+
const handleReset = () => {
|
|
78
|
+
setDraft((0, resolveColumnSettings_1.createDefaultPneTableColumnSettings)(columns));
|
|
79
|
+
};
|
|
80
|
+
const handleSave = async () => {
|
|
81
|
+
if (saving) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
setSaving(true);
|
|
85
|
+
try {
|
|
86
|
+
await onSave(resolvedDraft.value);
|
|
87
|
+
if (mountedRef.current) {
|
|
88
|
+
setSaving(false);
|
|
89
|
+
}
|
|
90
|
+
onClose();
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// The consumer reports the failure; the draft stays editable.
|
|
94
|
+
if (mountedRef.current) {
|
|
95
|
+
setSaving(false);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
const actionLabel = t('pneTable.columnSettings.title', { defaultValue: 'Table settings' });
|
|
100
|
+
const searchLabel = t('pneTable.columnSettings.search', { defaultValue: 'Search columns' });
|
|
101
|
+
const lastVisibleHint = t('pneTable.columnSettings.lastVisible', {
|
|
102
|
+
defaultValue: 'At least one column stays visible',
|
|
103
|
+
});
|
|
104
|
+
return react_1.default.createElement(PneModal_1.default, { ...(0, AutoTestAttribute_1.createAutoTestAttributes)(exports.COLUMN_SETTINGS_DIALOG_AUTOTEST_ID, autoTestId), actions: react_1.default.createElement(PneModalActions_1.default, { leading: react_1.default.createElement(PneButton_1.default, { ...(0, AutoTestAttribute_1.createAutoTestAttributes)(exports.COLUMN_SETTINGS_RESET_AUTOTEST_ID), disabled: saving || resolvedDraft.isDefault, onClick: handleReset, pneStyle: 'outlined' }, t('pneTable.columnSettings.reset', { defaultValue: 'Reset to default' })), primary: react_1.default.createElement(PneButton_1.default, { ...(0, AutoTestAttribute_1.createAutoTestAttributes)(exports.COLUMN_SETTINGS_SAVE_AUTOTEST_ID), disabled: saving, onClick: () => {
|
|
105
|
+
void handleSave();
|
|
106
|
+
} }, t('pneTable.columnSettings.save', { defaultValue: 'Save' })), secondary: react_1.default.createElement(PneButton_1.default, { ...(0, AutoTestAttribute_1.createAutoTestAttributes)(exports.COLUMN_SETTINGS_CANCEL_AUTOTEST_ID), disabled: saving, onClick: onClose, pneStyle: 'outlined' }, t('pneTable.columnSettings.cancel', { defaultValue: 'Cancel' })) }), containerSx: [
|
|
107
|
+
{ maxWidth: '100%', width: '480px' },
|
|
108
|
+
...(Array.isArray(containerSx) ? containerSx : [containerSx]),
|
|
109
|
+
], onClose: () => {
|
|
110
|
+
if (!saving) {
|
|
111
|
+
onClose();
|
|
112
|
+
}
|
|
113
|
+
}, open: true, title: title ?? actionLabel },
|
|
114
|
+
react_1.default.createElement(material_1.Box, { sx: { display: 'flex', flexDirection: 'column', gap: '12px' } },
|
|
115
|
+
searchable ? react_1.default.createElement(PneTextField_1.default, { autoComplete: 'off', fullWidth: true, label: searchLabel, onChange: event => setSearch(event.target.value), slotProps: {
|
|
116
|
+
htmlInput: (0, AutoTestAttribute_1.createAutoTestAttributes)(exports.COLUMN_SETTINGS_SEARCH_AUTOTEST_ID),
|
|
117
|
+
}, type: 'search', value: search }) : null,
|
|
118
|
+
react_1.default.createElement(material_1.List, { "aria-label": actionLabel, dense: true, sx: listSx },
|
|
119
|
+
filteredItems.map(({ column, visible }) => {
|
|
120
|
+
const locked = visible && column.id === lastVisibleId;
|
|
121
|
+
const labelId = `pne-column-settings-${column.id}`;
|
|
122
|
+
return react_1.default.createElement(material_1.ListItem, { disablePadding: true, key: column.id },
|
|
123
|
+
react_1.default.createElement(material_1.ListItemButton, { dense: true, disabled: saving || locked, onClick: () => toggle(column.id), sx: itemButtonSx, title: locked ? lastVisibleHint : undefined },
|
|
124
|
+
react_1.default.createElement(material_1.ListItemIcon, { sx: { minWidth: '36px' } },
|
|
125
|
+
react_1.default.createElement(PneCheckbox_1.PneCheckbox, { checked: visible, disabled: saving || locked, disableRipple: true, edge: 'start', slotProps: {
|
|
126
|
+
input: {
|
|
127
|
+
...(0, AutoTestAttribute_1.createAutoTestAttributes)(exports.COLUMN_SETTINGS_OPTION_AUTOTEST_ID, column.id),
|
|
128
|
+
'aria-labelledby': labelId,
|
|
129
|
+
},
|
|
130
|
+
}, tabIndex: -1 })),
|
|
131
|
+
react_1.default.createElement(material_1.ListItemText, { id: labelId, primary: column.label, slotProps: { primary: { noWrap: true } } })));
|
|
132
|
+
}),
|
|
133
|
+
filteredItems.length === 0 ? react_1.default.createElement(material_1.ListItem, { ...(0, AutoTestAttribute_1.createAutoTestAttributes)(exports.COLUMN_SETTINGS_EMPTY_AUTOTEST_ID), sx: { justifyContent: 'center', minHeight: '40px' } },
|
|
134
|
+
react_1.default.createElement(material_1.Typography, { color: 'text.secondary', variant: 'body2' }, t('pneTable.columnSettings.noMatches', { defaultValue: 'No columns match' }))) : null)));
|
|
135
|
+
};
|
|
136
|
+
/**
|
|
137
|
+
* Modal editor for the visible column set of one table view: a searchable
|
|
138
|
+
* checklist over the catalog, "Reset to default", "Cancel" and "Save". The
|
|
139
|
+
* draft is created when the dialog opens and discarded when it closes, so a
|
|
140
|
+
* reopened dialog always starts from the current `value`.
|
|
141
|
+
*/
|
|
142
|
+
const PneTableColumnSettingsDialog = (props) => {
|
|
143
|
+
const { open, ...formProps } = props;
|
|
144
|
+
if (!open) {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
return react_1.default.createElement(ColumnSettingsForm, { ...formProps });
|
|
148
|
+
};
|
|
149
|
+
exports.default = PneTableColumnSettingsDialog;
|
|
150
|
+
//# sourceMappingURL=PneTableColumnSettingsDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PneTableColumnSettingsDialog.js","sourceRoot":"","sources":["../../../../src/component/table/column-settings/PneTableColumnSettingsDialog.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { PneTableColumnOption, PneTableColumnSettingsValue, PneTableResolvedColumnSettings } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Throws on a catalog that cannot be configured: empty or with duplicate IDs.
|
|
4
|
+
* Column identity belongs to the consumer, so silent de-duplication would hide a bug.
|
|
5
|
+
*/
|
|
6
|
+
export declare const assertPneTableColumnCatalog: (columns: readonly PneTableColumnOption[]) => void;
|
|
7
|
+
/** Default value for a catalog: `defaultVisible !== false` columns in catalog order, the rest hidden. */
|
|
8
|
+
export declare const createDefaultPneTableColumnSettings: (columns: readonly PneTableColumnOption[]) => PneTableColumnSettingsValue;
|
|
9
|
+
/**
|
|
10
|
+
* Applies a stored value to the current catalog:
|
|
11
|
+
*
|
|
12
|
+
* - IDs unknown to the catalog are dropped;
|
|
13
|
+
* - visible columns keep their stored order;
|
|
14
|
+
* - catalog columns absent from both stored lists are new since the save and
|
|
15
|
+
* are appended as visible, in catalog order;
|
|
16
|
+
* - a value that leaves nothing visible falls back to the catalog defaults.
|
|
17
|
+
*
|
|
18
|
+
* `undefined` means "never configured" and yields the defaults.
|
|
19
|
+
*/
|
|
20
|
+
export declare const resolvePneTableColumnSettings: <TColumn extends PneTableColumnOption>(columns: readonly TColumn[], value: PneTableColumnSettingsValue | null | undefined) => PneTableResolvedColumnSettings<TColumn>;
|
|
21
|
+
/** Structural equality of two normalized values; hidden order is irrelevant. */
|
|
22
|
+
export declare const isSamePneTableColumnSettings: (left: PneTableColumnSettingsValue, right: PneTableColumnSettingsValue) => boolean;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isSamePneTableColumnSettings = exports.resolvePneTableColumnSettings = exports.createDefaultPneTableColumnSettings = exports.assertPneTableColumnCatalog = void 0;
|
|
4
|
+
const uniqueIds = (ids) => {
|
|
5
|
+
const seen = new Set();
|
|
6
|
+
const result = [];
|
|
7
|
+
for (const id of ids) {
|
|
8
|
+
if (!seen.has(id)) {
|
|
9
|
+
seen.add(id);
|
|
10
|
+
result.push(id);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return result;
|
|
14
|
+
};
|
|
15
|
+
const sameIds = (left, right) => left.length === right.length && left.every((id, index) => id === right[index]);
|
|
16
|
+
/**
|
|
17
|
+
* Throws on a catalog that cannot be configured: empty or with duplicate IDs.
|
|
18
|
+
* Column identity belongs to the consumer, so silent de-duplication would hide a bug.
|
|
19
|
+
*/
|
|
20
|
+
const assertPneTableColumnCatalog = (columns) => {
|
|
21
|
+
if (columns.length === 0) {
|
|
22
|
+
throw new Error('PneTable column settings: the column catalog must not be empty');
|
|
23
|
+
}
|
|
24
|
+
const seen = new Set();
|
|
25
|
+
for (const column of columns) {
|
|
26
|
+
if (seen.has(column.id)) {
|
|
27
|
+
throw new Error(`PneTable column settings: duplicate column ID "${column.id}"`);
|
|
28
|
+
}
|
|
29
|
+
seen.add(column.id);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
exports.assertPneTableColumnCatalog = assertPneTableColumnCatalog;
|
|
33
|
+
/** Default value for a catalog: `defaultVisible !== false` columns in catalog order, the rest hidden. */
|
|
34
|
+
const createDefaultPneTableColumnSettings = (columns) => ({
|
|
35
|
+
visibleColumnIds: columns.filter(column => column.defaultVisible !== false).map(column => column.id),
|
|
36
|
+
hiddenColumnIds: columns.filter(column => column.defaultVisible === false).map(column => column.id),
|
|
37
|
+
});
|
|
38
|
+
exports.createDefaultPneTableColumnSettings = createDefaultPneTableColumnSettings;
|
|
39
|
+
/**
|
|
40
|
+
* Applies a stored value to the current catalog:
|
|
41
|
+
*
|
|
42
|
+
* - IDs unknown to the catalog are dropped;
|
|
43
|
+
* - visible columns keep their stored order;
|
|
44
|
+
* - catalog columns absent from both stored lists are new since the save and
|
|
45
|
+
* are appended as visible, in catalog order;
|
|
46
|
+
* - a value that leaves nothing visible falls back to the catalog defaults.
|
|
47
|
+
*
|
|
48
|
+
* `undefined` means "never configured" and yields the defaults.
|
|
49
|
+
*/
|
|
50
|
+
const resolvePneTableColumnSettings = (columns, value) => {
|
|
51
|
+
(0, exports.assertPneTableColumnCatalog)(columns);
|
|
52
|
+
const byId = new Map(columns.map(column => [column.id, column]));
|
|
53
|
+
const defaults = (0, exports.createDefaultPneTableColumnSettings)(columns);
|
|
54
|
+
const resolveIds = (source) => {
|
|
55
|
+
const visible = uniqueIds(source.visibleColumnIds).filter(id => byId.has(id));
|
|
56
|
+
const visibleSet = new Set(visible);
|
|
57
|
+
const hidden = uniqueIds(source.hiddenColumnIds)
|
|
58
|
+
.filter(id => byId.has(id) && !visibleSet.has(id));
|
|
59
|
+
const known = new Set([...visible, ...hidden]);
|
|
60
|
+
const added = columns.filter(column => !known.has(column.id)).map(column => column.id);
|
|
61
|
+
return {
|
|
62
|
+
visibleColumnIds: [...visible, ...added],
|
|
63
|
+
hiddenColumnIds: hidden,
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
let resolved = value ? resolveIds(value) : defaults;
|
|
67
|
+
if (resolved.visibleColumnIds.length === 0) {
|
|
68
|
+
resolved = defaults;
|
|
69
|
+
}
|
|
70
|
+
const hiddenSet = new Set(resolved.hiddenColumnIds);
|
|
71
|
+
return {
|
|
72
|
+
visibleColumns: resolved.visibleColumnIds.map(id => byId.get(id)),
|
|
73
|
+
hiddenColumns: columns.filter(column => hiddenSet.has(column.id)),
|
|
74
|
+
value: resolved,
|
|
75
|
+
isDefault: sameIds(resolved.visibleColumnIds, defaults.visibleColumnIds)
|
|
76
|
+
&& sameIds([...resolved.hiddenColumnIds].sort(), [...defaults.hiddenColumnIds].sort()),
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
exports.resolvePneTableColumnSettings = resolvePneTableColumnSettings;
|
|
80
|
+
/** Structural equality of two normalized values; hidden order is irrelevant. */
|
|
81
|
+
const isSamePneTableColumnSettings = (left, right) => sameIds(left.visibleColumnIds, right.visibleColumnIds)
|
|
82
|
+
&& sameIds([...left.hiddenColumnIds].sort(), [...right.hiddenColumnIds].sort());
|
|
83
|
+
exports.isSamePneTableColumnSettings = isSamePneTableColumnSettings;
|
|
84
|
+
//# sourceMappingURL=resolveColumnSettings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveColumnSettings.js","sourceRoot":"","sources":["../../../../src/component/table/column-settings/resolveColumnSettings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/** Stable, non-secret column identifier owned by the consumer; never an index or a translated label. */
|
|
2
|
+
export type PneTableColumnId = string;
|
|
3
|
+
/**
|
|
4
|
+
* One entry of a table column catalog. The catalog lists every column a
|
|
5
|
+
* consumer can render for a given table view, in the default display order.
|
|
6
|
+
*/
|
|
7
|
+
export type PneTableColumnOption = {
|
|
8
|
+
id: PneTableColumnId;
|
|
9
|
+
/** Plain-text label used by the settings dialog for display and search; keep it equal to the header text. */
|
|
10
|
+
label: string;
|
|
11
|
+
/** Whether the column is shown before the user configures anything. Defaults to `true`. */
|
|
12
|
+
defaultVisible?: boolean;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Persisted user preference for one table view. The consumer stores it as-is
|
|
16
|
+
* and passes it back; the library never inspects where it lives.
|
|
17
|
+
*/
|
|
18
|
+
export type PneTableColumnSettingsValue = {
|
|
19
|
+
/** Column IDs the user keeps visible, in display order. */
|
|
20
|
+
visibleColumnIds: readonly PneTableColumnId[];
|
|
21
|
+
/**
|
|
22
|
+
* Column IDs the user explicitly hid. Catalog columns absent from both lists
|
|
23
|
+
* are new since the value was saved and are shown by default.
|
|
24
|
+
*/
|
|
25
|
+
hiddenColumnIds: readonly PneTableColumnId[];
|
|
26
|
+
};
|
|
27
|
+
/** Catalog-aware result of applying a stored value to the current column catalog. */
|
|
28
|
+
export type PneTableResolvedColumnSettings<TColumn extends PneTableColumnOption> = {
|
|
29
|
+
/** Catalog columns to render, in display order. Never empty for a non-empty catalog. */
|
|
30
|
+
visibleColumns: readonly TColumn[];
|
|
31
|
+
/** Catalog columns currently hidden, in catalog order. */
|
|
32
|
+
hiddenColumns: readonly TColumn[];
|
|
33
|
+
/** Normalized value that references only existing catalog columns. */
|
|
34
|
+
value: PneTableColumnSettingsValue;
|
|
35
|
+
/** True when `value` equals the catalog defaults. */
|
|
36
|
+
isDefault: boolean;
|
|
37
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/component/table/column-settings/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { PneTableColumnId, PneTableColumnOption, PneTableColumnSettingsValue } from './types';
|
|
2
|
+
import type { PneTableColumnSettingsDialogProps } from './PneTableColumnSettingsDialog';
|
|
3
|
+
export type UsePneTableColumnSettingsParams<TColumn extends PneTableColumnOption> = {
|
|
4
|
+
/** Column catalog of the configured table view, in default display order. */
|
|
5
|
+
columns: readonly TColumn[];
|
|
6
|
+
/** Stored preference owned by the consumer; `undefined` or `null` means the catalog defaults. */
|
|
7
|
+
value?: PneTableColumnSettingsValue | null;
|
|
8
|
+
/** Persists the normalized value. Reject to keep the dialog open; report the failure yourself. */
|
|
9
|
+
onSave: (value: PneTableColumnSettingsValue) => void | Promise<void>;
|
|
10
|
+
};
|
|
11
|
+
export type UsePneTableColumnSettingsResult<TColumn extends PneTableColumnOption> = {
|
|
12
|
+
/** Catalog columns to render, in display order. */
|
|
13
|
+
visibleColumns: readonly TColumn[];
|
|
14
|
+
/** Catalog columns currently hidden, in catalog order. */
|
|
15
|
+
hiddenColumns: readonly TColumn[];
|
|
16
|
+
/** Normalized current value after catalog reconciliation. */
|
|
17
|
+
value: PneTableColumnSettingsValue;
|
|
18
|
+
/** True when the current value equals the catalog defaults. */
|
|
19
|
+
isDefault: boolean;
|
|
20
|
+
isVisible: (columnId: PneTableColumnId) => boolean;
|
|
21
|
+
/** Dialog visibility. */
|
|
22
|
+
open: boolean;
|
|
23
|
+
openDialog: () => void;
|
|
24
|
+
closeDialog: () => void;
|
|
25
|
+
/** Spread into `PneTableColumnSettingsDialog`. */
|
|
26
|
+
dialogProps: Pick<PneTableColumnSettingsDialogProps<TColumn>, 'columns' | 'onClose' | 'onSave' | 'open' | 'value'>;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Reconciles a stored column preference with the catalog and owns the dialog
|
|
30
|
+
* open state. Storage stays with the consumer: pass the loaded `value` and an
|
|
31
|
+
* `onSave` that writes it back.
|
|
32
|
+
*/
|
|
33
|
+
declare const usePneTableColumnSettings: <TColumn extends PneTableColumnOption>(params: UsePneTableColumnSettingsParams<TColumn>) => UsePneTableColumnSettingsResult<TColumn>;
|
|
34
|
+
export default usePneTableColumnSettings;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const react_1 = require("react");
|
|
4
|
+
const resolveColumnSettings_1 = require("./resolveColumnSettings");
|
|
5
|
+
/**
|
|
6
|
+
* Reconciles a stored column preference with the catalog and owns the dialog
|
|
7
|
+
* open state. Storage stays with the consumer: pass the loaded `value` and an
|
|
8
|
+
* `onSave` that writes it back.
|
|
9
|
+
*/
|
|
10
|
+
const usePneTableColumnSettings = (params) => {
|
|
11
|
+
const { columns, onSave, value } = params;
|
|
12
|
+
const [open, setOpen] = (0, react_1.useState)(false);
|
|
13
|
+
const resolved = (0, react_1.useMemo)(() => (0, resolveColumnSettings_1.resolvePneTableColumnSettings)(columns, value), [columns, value]);
|
|
14
|
+
const visibleIds = (0, react_1.useMemo)(() => new Set(resolved.value.visibleColumnIds), [resolved.value.visibleColumnIds]);
|
|
15
|
+
const openDialog = (0, react_1.useCallback)(() => setOpen(true), []);
|
|
16
|
+
const closeDialog = (0, react_1.useCallback)(() => setOpen(false), []);
|
|
17
|
+
const isVisible = (0, react_1.useCallback)((columnId) => visibleIds.has(columnId), [visibleIds]);
|
|
18
|
+
return {
|
|
19
|
+
visibleColumns: resolved.visibleColumns,
|
|
20
|
+
hiddenColumns: resolved.hiddenColumns,
|
|
21
|
+
value: resolved.value,
|
|
22
|
+
isDefault: resolved.isDefault,
|
|
23
|
+
isVisible,
|
|
24
|
+
open,
|
|
25
|
+
openDialog,
|
|
26
|
+
closeDialog,
|
|
27
|
+
dialogProps: {
|
|
28
|
+
columns,
|
|
29
|
+
onClose: closeDialog,
|
|
30
|
+
onSave,
|
|
31
|
+
open,
|
|
32
|
+
value,
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
exports.default = usePneTableColumnSettings;
|
|
37
|
+
//# sourceMappingURL=usePneTableColumnSettings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePneTableColumnSettings.js","sourceRoot":"","sources":["../../../../src/component/table/column-settings/usePneTableColumnSettings.ts"],"names":[],"mappings":";;AAAA,iCAAoD;AAEpD,mEAAqE;AAiCrE;;;;GAIG;AACH,MAAM,yBAAyB,GAAG,CAC9B,MAAgD,EACR,EAAE;IAC1C,MAAM,EAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAC,GAAG,MAAM,CAAA;IACvC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,CAAA;IACvC,MAAM,QAAQ,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE,CAAC,IAAA,qDAA6B,EAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;IAC/F,MAAM,UAAU,GAAG,IAAA,eAAO,EACtB,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAC9C,CAAC,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,CACpC,CAAA;IACD,MAAM,UAAU,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IACvD,MAAM,WAAW,GAAG,IAAA,mBAAW,EAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAA;IACzD,MAAM,SAAS,GAAG,IAAA,mBAAW,EAAC,CAAC,QAA0B,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAA;IAErG,OAAO;QACH,cAAc,EAAE,QAAQ,CAAC,cAAc;QACvC,aAAa,EAAE,QAAQ,CAAC,aAAa;QACrC,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,SAAS;QACT,IAAI;QACJ,UAAU;QACV,WAAW;QACX,WAAW,EAAE;YACT,OAAO;YACP,OAAO,EAAE,WAAW;YACpB,MAAM;YACN,IAAI;YACJ,KAAK;SACR;KACJ,CAAA;AACL,CAAC,CAAA;AAED,kBAAe,yBAAyB,CAAA"}
|
package/cjs/exports/table.d.ts
CHANGED
|
@@ -28,3 +28,11 @@ export type { PaginatorProps, TableCreateHeaderType, TableProps, TableSortOption
|
|
|
28
28
|
export { default as AbstractHeaderTableCell } from '../component/table/AbstractHeaderTableCell';
|
|
29
29
|
export { default as AbstractTableCell } from '../component/table/AbstractTableCell';
|
|
30
30
|
export { TableDisplayOptions } from '../component/table/type';
|
|
31
|
+
export { default as PneTableColumnSettingsDialog } from '../component/table/column-settings/PneTableColumnSettingsDialog';
|
|
32
|
+
export type { PneTableColumnSettingsDialogProps } from '../component/table/column-settings/PneTableColumnSettingsDialog';
|
|
33
|
+
export { default as PneTableColumnSettingsAction } from '../component/table/column-settings/PneTableColumnSettingsAction';
|
|
34
|
+
export type { PneTableColumnSettingsActionProps } from '../component/table/column-settings/PneTableColumnSettingsAction';
|
|
35
|
+
export { default as usePneTableColumnSettings } from '../component/table/column-settings/usePneTableColumnSettings';
|
|
36
|
+
export type { UsePneTableColumnSettingsParams, UsePneTableColumnSettingsResult, } from '../component/table/column-settings/usePneTableColumnSettings';
|
|
37
|
+
export { createDefaultPneTableColumnSettings, isSamePneTableColumnSettings, resolvePneTableColumnSettings, } from '../component/table/column-settings/resolveColumnSettings';
|
|
38
|
+
export type { PneTableColumnId, PneTableColumnOption, PneTableColumnSettingsValue, PneTableResolvedColumnSettings, } from '../component/table/column-settings/types';
|
package/cjs/exports/table.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.AbstractTableCell = exports.AbstractHeaderTableCell = exports.AbstractTable = exports.PneTableSortLabel = exports.PneTableControlCell = exports.PneTableCell = exports.PneHeaderTableCell = exports.PneTableRow = exports.useTable = exports.useTableSelection = exports.setTableRowSelected = exports.setTablePageSelected = exports.selectAllMatchingTableRows = exports.isTableRowSelected = exports.getTableSelectionPageState = exports.getTableSelectionCount = exports.createEmptyTableSelection = exports.clearTableSelection = exports.PneTableSelectionHeaderCell = exports.PneTableSwitchCell = exports.PneTableSelectionCell = exports.PneTableSelectionControls = exports.PneTableToolbar = exports.PneTableViewSelector = exports.PneTable = void 0;
|
|
3
|
+
exports.resolvePneTableColumnSettings = exports.isSamePneTableColumnSettings = exports.createDefaultPneTableColumnSettings = exports.usePneTableColumnSettings = exports.PneTableColumnSettingsAction = exports.PneTableColumnSettingsDialog = exports.AbstractTableCell = exports.AbstractHeaderTableCell = exports.AbstractTable = exports.PneTableSortLabel = exports.PneTableControlCell = exports.PneTableCell = exports.PneHeaderTableCell = exports.PneTableRow = exports.useTable = exports.useTableSelection = exports.setTableRowSelected = exports.setTablePageSelected = exports.selectAllMatchingTableRows = exports.isTableRowSelected = exports.getTableSelectionPageState = exports.getTableSelectionCount = exports.createEmptyTableSelection = exports.clearTableSelection = exports.PneTableSelectionHeaderCell = exports.PneTableSwitchCell = exports.PneTableSelectionCell = exports.PneTableSelectionControls = exports.PneTableToolbar = exports.PneTableViewSelector = exports.PneTable = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
var PneTable_1 = require("../component/table/PneTable");
|
|
6
6
|
Object.defineProperty(exports, "PneTable", { enumerable: true, get: function () { return tslib_1.__importDefault(PneTable_1).default; } });
|
|
@@ -45,4 +45,14 @@ var AbstractHeaderTableCell_1 = require("../component/table/AbstractHeaderTableC
|
|
|
45
45
|
Object.defineProperty(exports, "AbstractHeaderTableCell", { enumerable: true, get: function () { return tslib_1.__importDefault(AbstractHeaderTableCell_1).default; } });
|
|
46
46
|
var AbstractTableCell_1 = require("../component/table/AbstractTableCell");
|
|
47
47
|
Object.defineProperty(exports, "AbstractTableCell", { enumerable: true, get: function () { return tslib_1.__importDefault(AbstractTableCell_1).default; } });
|
|
48
|
+
var PneTableColumnSettingsDialog_1 = require("../component/table/column-settings/PneTableColumnSettingsDialog");
|
|
49
|
+
Object.defineProperty(exports, "PneTableColumnSettingsDialog", { enumerable: true, get: function () { return tslib_1.__importDefault(PneTableColumnSettingsDialog_1).default; } });
|
|
50
|
+
var PneTableColumnSettingsAction_1 = require("../component/table/column-settings/PneTableColumnSettingsAction");
|
|
51
|
+
Object.defineProperty(exports, "PneTableColumnSettingsAction", { enumerable: true, get: function () { return tslib_1.__importDefault(PneTableColumnSettingsAction_1).default; } });
|
|
52
|
+
var usePneTableColumnSettings_1 = require("../component/table/column-settings/usePneTableColumnSettings");
|
|
53
|
+
Object.defineProperty(exports, "usePneTableColumnSettings", { enumerable: true, get: function () { return tslib_1.__importDefault(usePneTableColumnSettings_1).default; } });
|
|
54
|
+
var resolveColumnSettings_1 = require("../component/table/column-settings/resolveColumnSettings");
|
|
55
|
+
Object.defineProperty(exports, "createDefaultPneTableColumnSettings", { enumerable: true, get: function () { return resolveColumnSettings_1.createDefaultPneTableColumnSettings; } });
|
|
56
|
+
Object.defineProperty(exports, "isSamePneTableColumnSettings", { enumerable: true, get: function () { return resolveColumnSettings_1.isSamePneTableColumnSettings; } });
|
|
57
|
+
Object.defineProperty(exports, "resolvePneTableColumnSettings", { enumerable: true, get: function () { return resolveColumnSettings_1.resolvePneTableColumnSettings; } });
|
|
48
58
|
//# sourceMappingURL=table.js.map
|
package/cjs/exports/table.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/exports/table.ts"],"names":[],"mappings":";;;;AAAA,wDAAiE;AAAxD,6HAAA,OAAO,OAAY;AAC5B,gFAIgD;AAH5C,4HAAA,oBAAoB,OAAA;AAIxB,sEAA+E;AAAtE,2IAAA,OAAO,OAAmB;AAEnC,0FAAmG;AAA1F,+JAAA,OAAO,OAA6B;AAE7C,kFAA2F;AAAlF,uJAAA,OAAO,OAAyB;AAKzC,4EAAqF;AAA5E,iJAAA,OAAO,OAAsB;AAMtC,8FAAuG;AAA9F,mKAAA,OAAO,OAA+B;AAE/C,oEAa0C;AAZtC,qHAAA,mBAAmB,OAAA;AACnB,2HAAA,yBAAyB,OAAA;AACzB,wHAAA,sBAAsB,OAAA;AACtB,4HAAA,0BAA0B,OAAA;AAC1B,oHAAA,kBAAkB,OAAA;AAClB,4HAAA,0BAA0B,OAAA;AAC1B,sHAAA,oBAAoB,OAAA;AACpB,qHAAA,mBAAmB,OAAA;AAMvB,0EAAmF;AAA1E,+IAAA,OAAO,OAAqB;AAQrC,wDAAiE;AAAxD,6HAAA,OAAO,OAAY;AAM5B,8DAAuE;AAA9D,mIAAA,OAAO,OAAe;AAC/B,4EAAqF;AAA5E,iJAAA,OAAO,OAAsB;AAEtC,gEAAyE;AAAhE,qIAAA,OAAO,OAAgB;AAEhC,8EAAuF;AAA9E,mJAAA,OAAO,OAAuB;AAEvC,0EAAmF;AAA1E,+IAAA,OAAO,OAAqB;AAErC,kEAA2E;AAAlE,uIAAA,OAAO,OAAiB;AAQjC,sFAA+F;AAAtF,2JAAA,OAAO,OAA2B;AAC3C,0EAAmF;AAA1E,+IAAA,OAAO,OAAqB"}
|
|
1
|
+
{"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/exports/table.ts"],"names":[],"mappings":";;;;AAAA,wDAAiE;AAAxD,6HAAA,OAAO,OAAY;AAC5B,gFAIgD;AAH5C,4HAAA,oBAAoB,OAAA;AAIxB,sEAA+E;AAAtE,2IAAA,OAAO,OAAmB;AAEnC,0FAAmG;AAA1F,+JAAA,OAAO,OAA6B;AAE7C,kFAA2F;AAAlF,uJAAA,OAAO,OAAyB;AAKzC,4EAAqF;AAA5E,iJAAA,OAAO,OAAsB;AAMtC,8FAAuG;AAA9F,mKAAA,OAAO,OAA+B;AAE/C,oEAa0C;AAZtC,qHAAA,mBAAmB,OAAA;AACnB,2HAAA,yBAAyB,OAAA;AACzB,wHAAA,sBAAsB,OAAA;AACtB,4HAAA,0BAA0B,OAAA;AAC1B,oHAAA,kBAAkB,OAAA;AAClB,4HAAA,0BAA0B,OAAA;AAC1B,sHAAA,oBAAoB,OAAA;AACpB,qHAAA,mBAAmB,OAAA;AAMvB,0EAAmF;AAA1E,+IAAA,OAAO,OAAqB;AAQrC,wDAAiE;AAAxD,6HAAA,OAAO,OAAY;AAM5B,8DAAuE;AAA9D,mIAAA,OAAO,OAAe;AAC/B,4EAAqF;AAA5E,iJAAA,OAAO,OAAsB;AAEtC,gEAAyE;AAAhE,qIAAA,OAAO,OAAgB;AAEhC,8EAAuF;AAA9E,mJAAA,OAAO,OAAuB;AAEvC,0EAAmF;AAA1E,+IAAA,OAAO,OAAqB;AAErC,kEAA2E;AAAlE,uIAAA,OAAO,OAAiB;AAQjC,sFAA+F;AAAtF,2JAAA,OAAO,OAA2B;AAC3C,0EAAmF;AAA1E,+IAAA,OAAO,OAAqB;AAErC,gHAAyH;AAAhH,qKAAA,OAAO,OAAgC;AAEhD,gHAAyH;AAAhH,qKAAA,OAAO,OAAgC;AAEhD,0GAAmH;AAA1G,+JAAA,OAAO,OAA6B;AAK7C,kGAIiE;AAH7D,4IAAA,mCAAmC,OAAA;AACnC,qIAAA,4BAA4B,OAAA;AAC5B,sIAAA,6BAA6B,OAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { SxProps, Theme } from '@mui/material';
|
|
3
|
+
export declare const COLUMN_SETTINGS_ACTION_AUTOTEST_ID = "column-settings";
|
|
4
|
+
export type PneTableColumnSettingsActionProps = {
|
|
5
|
+
/** Opens the column settings dialog. */
|
|
6
|
+
onClick: React.MouseEventHandler<HTMLButtonElement>;
|
|
7
|
+
/**
|
|
8
|
+
* `icon` renders a 40px icon button with a tooltip and fits the
|
|
9
|
+
* `PneTableViewSelector` actions slot. `button` renders an outlined text
|
|
10
|
+
* button with the icon for wide layouts. Defaults to `icon`.
|
|
11
|
+
*/
|
|
12
|
+
variant?: 'icon' | 'button';
|
|
13
|
+
/** Accessible name and visible text; defaults to the localized "Table settings". */
|
|
14
|
+
label?: string;
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
/** Stable, non-secret instance identifier used to scope Selenium locators. */
|
|
17
|
+
autoTestId?: string;
|
|
18
|
+
sx?: SxProps<Theme>;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Entry point to the column settings dialog. Place it in the table toolbar or
|
|
22
|
+
* in the view selector `actions` slot next to the view it configures.
|
|
23
|
+
*/
|
|
24
|
+
declare const PneTableColumnSettingsAction: React.ForwardRefExoticComponent<PneTableColumnSettingsActionProps & React.RefAttributes<HTMLButtonElement>>;
|
|
25
|
+
export default PneTableColumnSettingsAction;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import React, { forwardRef } from 'react';
|
|
2
|
+
import SettingsOutlinedIcon from '@mui/icons-material/SettingsOutlined';
|
|
3
|
+
import { IconButton, Tooltip } from '@mui/material';
|
|
4
|
+
import { useTranslation } from 'react-i18next';
|
|
5
|
+
import PneButton from '../../PneButton';
|
|
6
|
+
import { createAutoTestAttributes } from '../../AutoTestAttribute';
|
|
7
|
+
export const COLUMN_SETTINGS_ACTION_AUTOTEST_ID = 'column-settings';
|
|
8
|
+
const iconButtonSx = {
|
|
9
|
+
borderRadius: '4px',
|
|
10
|
+
height: '40px',
|
|
11
|
+
padding: '8px',
|
|
12
|
+
width: '40px',
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Entry point to the column settings dialog. Place it in the table toolbar or
|
|
16
|
+
* in the view selector `actions` slot next to the view it configures.
|
|
17
|
+
*/
|
|
18
|
+
const PneTableColumnSettingsAction = forwardRef(function PneTableColumnSettingsAction(props, ref) {
|
|
19
|
+
const { autoTestId, disabled = false, label, onClick, sx, variant = 'icon', } = props;
|
|
20
|
+
const { t } = useTranslation();
|
|
21
|
+
const resolvedLabel = label ?? t('pneTable.columnSettings.action', { defaultValue: 'Table settings' });
|
|
22
|
+
if (variant === 'button') {
|
|
23
|
+
return React.createElement(PneButton, { ...createAutoTestAttributes(COLUMN_SETTINGS_ACTION_AUTOTEST_ID, autoTestId), disabled: disabled, onClick: onClick, pneStyle: 'outlined', ref: ref, startIcon: React.createElement(SettingsOutlinedIcon, null), sx: sx }, resolvedLabel);
|
|
24
|
+
}
|
|
25
|
+
return React.createElement(Tooltip, { enterDelay: 300, enterNextDelay: 300, title: resolvedLabel },
|
|
26
|
+
React.createElement("span", null,
|
|
27
|
+
React.createElement(IconButton, { ...createAutoTestAttributes(COLUMN_SETTINGS_ACTION_AUTOTEST_ID, autoTestId), "aria-label": resolvedLabel, disabled: disabled, onClick: onClick, ref: ref, size: 'small', sx: [
|
|
28
|
+
iconButtonSx,
|
|
29
|
+
...(Array.isArray(sx) ? sx : [sx]),
|
|
30
|
+
] },
|
|
31
|
+
React.createElement(SettingsOutlinedIcon, { sx: { height: '16px', width: '16px' } }))));
|
|
32
|
+
});
|
|
33
|
+
export default PneTableColumnSettingsAction;
|
|
34
|
+
//# sourceMappingURL=PneTableColumnSettingsAction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PneTableColumnSettingsAction.js","sourceRoot":"","sources":["../../../../src/component/table/column-settings/PneTableColumnSettingsAction.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAC,UAAU,EAAC,MAAM,OAAO,CAAA;AACvC,OAAO,oBAAoB,MAAM,sCAAsC,CAAA;AACvE,OAAO,EAAC,UAAU,EAAkB,OAAO,EAAC,MAAM,eAAe,CAAA;AACjE,OAAO,EAAC,cAAc,EAAC,MAAM,eAAe,CAAA;AAC5C,OAAO,SAAS,MAAM,iBAAiB,CAAA;AACvC,OAAO,EAAC,wBAAwB,EAAC,MAAM,yBAAyB,CAAA;AAEhE,MAAM,CAAC,MAAM,kCAAkC,GAAG,iBAAiB,CAAA;AAmBnE,MAAM,YAAY,GAAmB;IACjC,YAAY,EAAE,KAAK;IACnB,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,KAAK;IACd,KAAK,EAAE,MAAM;CAChB,CAAA;AAED;;;GAGG;AACH,MAAM,4BAA4B,GAAG,UAAU,CAC3C,SAAS,4BAA4B,CAAC,KAAK,EAAE,GAAG;IAC5C,MAAM,EACF,UAAU,EACV,QAAQ,GAAG,KAAK,EAChB,KAAK,EACL,OAAO,EACP,EAAE,EACF,OAAO,GAAG,MAAM,GACnB,GAAG,KAAK,CAAA;IACT,MAAM,EAAC,CAAC,EAAC,GAAG,cAAc,EAAE,CAAA;IAC5B,MAAM,aAAa,GAAG,KAAK,IAAI,CAAC,CAAC,gCAAgC,EAAE,EAAC,YAAY,EAAE,gBAAgB,EAAC,CAAC,CAAA;IAEpG,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACvB,OAAO,oBAAC,SAAS,OACT,wBAAwB,CAAC,kCAAkC,EAAE,UAAU,CAAC,EAC5E,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAC,UAAU,EACnB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,oBAAC,oBAAoB,OAAE,EAClC,EAAE,EAAE,EAAE,IAEL,aAAa,CACN,CAAA;IAChB,CAAC;IAED,OAAO,oBAAC,OAAO,IACX,UAAU,EAAE,GAAG,EACf,cAAc,EAAE,GAAG,EACnB,KAAK,EAAE,aAAa;QAEpB;YACI,oBAAC,UAAU,OACH,wBAAwB,CAAC,kCAAkC,EAAE,UAAU,CAAC,gBAChE,aAAa,EACzB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,GAAG,EACR,IAAI,EAAC,OAAO,EACZ,EAAE,EAAE;oBACA,YAAY;oBACZ,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;iBACrC;gBAED,oBAAC,oBAAoB,IAAC,EAAE,EAAE,EAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAC,GAAG,CACnD,CACV,CACD,CAAA;AACd,CAAC,CACJ,CAAA;AAED,eAAe,4BAA4B,CAAA"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import React, { ReactNode } from 'react';
|
|
2
|
+
import { SxProps, Theme } from '@mui/material';
|
|
3
|
+
import type { PneTableColumnOption, PneTableColumnSettingsValue } from './types';
|
|
4
|
+
export declare const COLUMN_SETTINGS_DIALOG_AUTOTEST_ID = "column-settings-dialog";
|
|
5
|
+
export declare const COLUMN_SETTINGS_SEARCH_AUTOTEST_ID = "column-settings-search";
|
|
6
|
+
export declare const COLUMN_SETTINGS_OPTION_AUTOTEST_ID = "column-settings-option";
|
|
7
|
+
export declare const COLUMN_SETTINGS_EMPTY_AUTOTEST_ID = "column-settings-empty";
|
|
8
|
+
export declare const COLUMN_SETTINGS_RESET_AUTOTEST_ID = "column-settings-reset";
|
|
9
|
+
export declare const COLUMN_SETTINGS_CANCEL_AUTOTEST_ID = "column-settings-cancel";
|
|
10
|
+
export declare const COLUMN_SETTINGS_SAVE_AUTOTEST_ID = "column-settings-save";
|
|
11
|
+
export type PneTableColumnSettingsDialogProps<TColumn extends PneTableColumnOption = PneTableColumnOption> = {
|
|
12
|
+
open: boolean;
|
|
13
|
+
/** Called on Cancel, on the close button, on backdrop/Escape, and after a successful save. */
|
|
14
|
+
onClose: () => void;
|
|
15
|
+
/** Column catalog of the configured table view, in default display order. */
|
|
16
|
+
columns: readonly TColumn[];
|
|
17
|
+
/** Stored preference; `undefined` or `null` means the catalog defaults. */
|
|
18
|
+
value?: PneTableColumnSettingsValue | null;
|
|
19
|
+
/**
|
|
20
|
+
* Receives the normalized draft on Save. The dialog closes once the returned
|
|
21
|
+
* promise resolves. A rejected promise keeps the dialog open with the draft
|
|
22
|
+
* intact; reporting that failure to the user is the caller's job.
|
|
23
|
+
*/
|
|
24
|
+
onSave: (value: PneTableColumnSettingsValue) => void | Promise<void>;
|
|
25
|
+
/** Stable, non-secret instance identifier used to scope Selenium locators. */
|
|
26
|
+
autoTestId?: string;
|
|
27
|
+
/** Defaults to the localized "Table settings". */
|
|
28
|
+
title?: ReactNode;
|
|
29
|
+
/** Set to false to drop the search field for short catalogs. Defaults to true. */
|
|
30
|
+
searchable?: boolean;
|
|
31
|
+
containerSx?: SxProps<Theme>;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Modal editor for the visible column set of one table view: a searchable
|
|
35
|
+
* checklist over the catalog, "Reset to default", "Cancel" and "Save". The
|
|
36
|
+
* draft is created when the dialog opens and discarded when it closes, so a
|
|
37
|
+
* reopened dialog always starts from the current `value`.
|
|
38
|
+
*/
|
|
39
|
+
declare const PneTableColumnSettingsDialog: <TColumn extends PneTableColumnOption = PneTableColumnOption>(props: PneTableColumnSettingsDialogProps<TColumn>) => React.JSX.Element | null;
|
|
40
|
+
export default PneTableColumnSettingsDialog;
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import React, { useEffect, useMemo, useRef, useState } from 'react';
|
|
2
|
+
import { Box, List, ListItem, ListItemButton, ListItemIcon, ListItemText, Typography, } from '@mui/material';
|
|
3
|
+
import { useTranslation } from 'react-i18next';
|
|
4
|
+
import PneModal from '../../PneModal';
|
|
5
|
+
import PneModalActions from '../../PneModalActions';
|
|
6
|
+
import PneButton from '../../PneButton';
|
|
7
|
+
import { PneCheckbox } from '../../PneCheckbox';
|
|
8
|
+
import PneTextField from '../../PneTextField';
|
|
9
|
+
import { createAutoTestAttributes } from '../../AutoTestAttribute';
|
|
10
|
+
import { createDefaultPneTableColumnSettings, resolvePneTableColumnSettings, } from './resolveColumnSettings';
|
|
11
|
+
export const COLUMN_SETTINGS_DIALOG_AUTOTEST_ID = 'column-settings-dialog';
|
|
12
|
+
export const COLUMN_SETTINGS_SEARCH_AUTOTEST_ID = 'column-settings-search';
|
|
13
|
+
export const COLUMN_SETTINGS_OPTION_AUTOTEST_ID = 'column-settings-option';
|
|
14
|
+
export const COLUMN_SETTINGS_EMPTY_AUTOTEST_ID = 'column-settings-empty';
|
|
15
|
+
export const COLUMN_SETTINGS_RESET_AUTOTEST_ID = 'column-settings-reset';
|
|
16
|
+
export const COLUMN_SETTINGS_CANCEL_AUTOTEST_ID = 'column-settings-cancel';
|
|
17
|
+
export const COLUMN_SETTINGS_SAVE_AUTOTEST_ID = 'column-settings-save';
|
|
18
|
+
const listSx = {
|
|
19
|
+
maxHeight: '320px',
|
|
20
|
+
overflowY: 'auto',
|
|
21
|
+
padding: 0,
|
|
22
|
+
};
|
|
23
|
+
const itemButtonSx = {
|
|
24
|
+
borderRadius: '4px',
|
|
25
|
+
minHeight: '40px',
|
|
26
|
+
paddingBottom: '2px',
|
|
27
|
+
paddingLeft: '4px',
|
|
28
|
+
paddingRight: '8px',
|
|
29
|
+
paddingTop: '2px',
|
|
30
|
+
};
|
|
31
|
+
const normalizeSearch = (value) => value.trim().toLocaleLowerCase();
|
|
32
|
+
const ColumnSettingsForm = (props) => {
|
|
33
|
+
const { autoTestId, columns, containerSx, onClose, onSave, searchable = true, title, value, } = props;
|
|
34
|
+
const { t } = useTranslation();
|
|
35
|
+
const initial = useMemo(() => resolvePneTableColumnSettings(columns, value), [columns, value]);
|
|
36
|
+
const [draft, setDraft] = useState(initial.value);
|
|
37
|
+
const [search, setSearch] = useState('');
|
|
38
|
+
const [saving, setSaving] = useState(false);
|
|
39
|
+
const mountedRef = useRef(true);
|
|
40
|
+
useEffect(() => () => {
|
|
41
|
+
mountedRef.current = false;
|
|
42
|
+
}, []);
|
|
43
|
+
const resolvedDraft = useMemo(() => resolvePneTableColumnSettings(columns, draft), [columns, draft]);
|
|
44
|
+
const items = useMemo(() => [
|
|
45
|
+
...resolvedDraft.visibleColumns.map(column => ({ column, visible: true })),
|
|
46
|
+
...resolvedDraft.hiddenColumns.map(column => ({ column, visible: false })),
|
|
47
|
+
], [resolvedDraft]);
|
|
48
|
+
const normalizedSearch = normalizeSearch(search);
|
|
49
|
+
const filteredItems = normalizedSearch === ''
|
|
50
|
+
? items
|
|
51
|
+
: items.filter(item => normalizeSearch(item.column.label).includes(normalizedSearch));
|
|
52
|
+
const lastVisibleId = resolvedDraft.visibleColumns.length === 1
|
|
53
|
+
? resolvedDraft.visibleColumns[0].id
|
|
54
|
+
: null;
|
|
55
|
+
const toggle = (id) => {
|
|
56
|
+
setDraft(current => {
|
|
57
|
+
const visible = current.visibleColumnIds.includes(id);
|
|
58
|
+
if (visible) {
|
|
59
|
+
if (current.visibleColumnIds.length <= 1) {
|
|
60
|
+
return current;
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
visibleColumnIds: current.visibleColumnIds.filter(columnId => columnId !== id),
|
|
64
|
+
hiddenColumnIds: [...current.hiddenColumnIds, id],
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
visibleColumnIds: [...current.visibleColumnIds, id],
|
|
69
|
+
hiddenColumnIds: current.hiddenColumnIds.filter(columnId => columnId !== id),
|
|
70
|
+
};
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
const handleReset = () => {
|
|
74
|
+
setDraft(createDefaultPneTableColumnSettings(columns));
|
|
75
|
+
};
|
|
76
|
+
const handleSave = async () => {
|
|
77
|
+
if (saving) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
setSaving(true);
|
|
81
|
+
try {
|
|
82
|
+
await onSave(resolvedDraft.value);
|
|
83
|
+
if (mountedRef.current) {
|
|
84
|
+
setSaving(false);
|
|
85
|
+
}
|
|
86
|
+
onClose();
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// The consumer reports the failure; the draft stays editable.
|
|
90
|
+
if (mountedRef.current) {
|
|
91
|
+
setSaving(false);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
const actionLabel = t('pneTable.columnSettings.title', { defaultValue: 'Table settings' });
|
|
96
|
+
const searchLabel = t('pneTable.columnSettings.search', { defaultValue: 'Search columns' });
|
|
97
|
+
const lastVisibleHint = t('pneTable.columnSettings.lastVisible', {
|
|
98
|
+
defaultValue: 'At least one column stays visible',
|
|
99
|
+
});
|
|
100
|
+
return React.createElement(PneModal, { ...createAutoTestAttributes(COLUMN_SETTINGS_DIALOG_AUTOTEST_ID, autoTestId), actions: React.createElement(PneModalActions, { leading: React.createElement(PneButton, { ...createAutoTestAttributes(COLUMN_SETTINGS_RESET_AUTOTEST_ID), disabled: saving || resolvedDraft.isDefault, onClick: handleReset, pneStyle: 'outlined' }, t('pneTable.columnSettings.reset', { defaultValue: 'Reset to default' })), primary: React.createElement(PneButton, { ...createAutoTestAttributes(COLUMN_SETTINGS_SAVE_AUTOTEST_ID), disabled: saving, onClick: () => {
|
|
101
|
+
void handleSave();
|
|
102
|
+
} }, t('pneTable.columnSettings.save', { defaultValue: 'Save' })), secondary: React.createElement(PneButton, { ...createAutoTestAttributes(COLUMN_SETTINGS_CANCEL_AUTOTEST_ID), disabled: saving, onClick: onClose, pneStyle: 'outlined' }, t('pneTable.columnSettings.cancel', { defaultValue: 'Cancel' })) }), containerSx: [
|
|
103
|
+
{ maxWidth: '100%', width: '480px' },
|
|
104
|
+
...(Array.isArray(containerSx) ? containerSx : [containerSx]),
|
|
105
|
+
], onClose: () => {
|
|
106
|
+
if (!saving) {
|
|
107
|
+
onClose();
|
|
108
|
+
}
|
|
109
|
+
}, open: true, title: title ?? actionLabel },
|
|
110
|
+
React.createElement(Box, { sx: { display: 'flex', flexDirection: 'column', gap: '12px' } },
|
|
111
|
+
searchable ? React.createElement(PneTextField, { autoComplete: 'off', fullWidth: true, label: searchLabel, onChange: event => setSearch(event.target.value), slotProps: {
|
|
112
|
+
htmlInput: createAutoTestAttributes(COLUMN_SETTINGS_SEARCH_AUTOTEST_ID),
|
|
113
|
+
}, type: 'search', value: search }) : null,
|
|
114
|
+
React.createElement(List, { "aria-label": actionLabel, dense: true, sx: listSx },
|
|
115
|
+
filteredItems.map(({ column, visible }) => {
|
|
116
|
+
const locked = visible && column.id === lastVisibleId;
|
|
117
|
+
const labelId = `pne-column-settings-${column.id}`;
|
|
118
|
+
return React.createElement(ListItem, { disablePadding: true, key: column.id },
|
|
119
|
+
React.createElement(ListItemButton, { dense: true, disabled: saving || locked, onClick: () => toggle(column.id), sx: itemButtonSx, title: locked ? lastVisibleHint : undefined },
|
|
120
|
+
React.createElement(ListItemIcon, { sx: { minWidth: '36px' } },
|
|
121
|
+
React.createElement(PneCheckbox, { checked: visible, disabled: saving || locked, disableRipple: true, edge: 'start', slotProps: {
|
|
122
|
+
input: {
|
|
123
|
+
...createAutoTestAttributes(COLUMN_SETTINGS_OPTION_AUTOTEST_ID, column.id),
|
|
124
|
+
'aria-labelledby': labelId,
|
|
125
|
+
},
|
|
126
|
+
}, tabIndex: -1 })),
|
|
127
|
+
React.createElement(ListItemText, { id: labelId, primary: column.label, slotProps: { primary: { noWrap: true } } })));
|
|
128
|
+
}),
|
|
129
|
+
filteredItems.length === 0 ? React.createElement(ListItem, { ...createAutoTestAttributes(COLUMN_SETTINGS_EMPTY_AUTOTEST_ID), sx: { justifyContent: 'center', minHeight: '40px' } },
|
|
130
|
+
React.createElement(Typography, { color: 'text.secondary', variant: 'body2' }, t('pneTable.columnSettings.noMatches', { defaultValue: 'No columns match' }))) : null)));
|
|
131
|
+
};
|
|
132
|
+
/**
|
|
133
|
+
* Modal editor for the visible column set of one table view: a searchable
|
|
134
|
+
* checklist over the catalog, "Reset to default", "Cancel" and "Save". The
|
|
135
|
+
* draft is created when the dialog opens and discarded when it closes, so a
|
|
136
|
+
* reopened dialog always starts from the current `value`.
|
|
137
|
+
*/
|
|
138
|
+
const PneTableColumnSettingsDialog = (props) => {
|
|
139
|
+
const { open, ...formProps } = props;
|
|
140
|
+
if (!open) {
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
return React.createElement(ColumnSettingsForm, { ...formProps });
|
|
144
|
+
};
|
|
145
|
+
export default PneTableColumnSettingsDialog;
|
|
146
|
+
//# sourceMappingURL=PneTableColumnSettingsDialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PneTableColumnSettingsDialog.js","sourceRoot":"","sources":["../../../../src/component/table/column-settings/PneTableColumnSettingsDialog.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { PneTableColumnOption, PneTableColumnSettingsValue, PneTableResolvedColumnSettings } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Throws on a catalog that cannot be configured: empty or with duplicate IDs.
|
|
4
|
+
* Column identity belongs to the consumer, so silent de-duplication would hide a bug.
|
|
5
|
+
*/
|
|
6
|
+
export declare const assertPneTableColumnCatalog: (columns: readonly PneTableColumnOption[]) => void;
|
|
7
|
+
/** Default value for a catalog: `defaultVisible !== false` columns in catalog order, the rest hidden. */
|
|
8
|
+
export declare const createDefaultPneTableColumnSettings: (columns: readonly PneTableColumnOption[]) => PneTableColumnSettingsValue;
|
|
9
|
+
/**
|
|
10
|
+
* Applies a stored value to the current catalog:
|
|
11
|
+
*
|
|
12
|
+
* - IDs unknown to the catalog are dropped;
|
|
13
|
+
* - visible columns keep their stored order;
|
|
14
|
+
* - catalog columns absent from both stored lists are new since the save and
|
|
15
|
+
* are appended as visible, in catalog order;
|
|
16
|
+
* - a value that leaves nothing visible falls back to the catalog defaults.
|
|
17
|
+
*
|
|
18
|
+
* `undefined` means "never configured" and yields the defaults.
|
|
19
|
+
*/
|
|
20
|
+
export declare const resolvePneTableColumnSettings: <TColumn extends PneTableColumnOption>(columns: readonly TColumn[], value: PneTableColumnSettingsValue | null | undefined) => PneTableResolvedColumnSettings<TColumn>;
|
|
21
|
+
/** Structural equality of two normalized values; hidden order is irrelevant. */
|
|
22
|
+
export declare const isSamePneTableColumnSettings: (left: PneTableColumnSettingsValue, right: PneTableColumnSettingsValue) => boolean;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
const uniqueIds = (ids) => {
|
|
2
|
+
const seen = new Set();
|
|
3
|
+
const result = [];
|
|
4
|
+
for (const id of ids) {
|
|
5
|
+
if (!seen.has(id)) {
|
|
6
|
+
seen.add(id);
|
|
7
|
+
result.push(id);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
return result;
|
|
11
|
+
};
|
|
12
|
+
const sameIds = (left, right) => left.length === right.length && left.every((id, index) => id === right[index]);
|
|
13
|
+
/**
|
|
14
|
+
* Throws on a catalog that cannot be configured: empty or with duplicate IDs.
|
|
15
|
+
* Column identity belongs to the consumer, so silent de-duplication would hide a bug.
|
|
16
|
+
*/
|
|
17
|
+
export const assertPneTableColumnCatalog = (columns) => {
|
|
18
|
+
if (columns.length === 0) {
|
|
19
|
+
throw new Error('PneTable column settings: the column catalog must not be empty');
|
|
20
|
+
}
|
|
21
|
+
const seen = new Set();
|
|
22
|
+
for (const column of columns) {
|
|
23
|
+
if (seen.has(column.id)) {
|
|
24
|
+
throw new Error(`PneTable column settings: duplicate column ID "${column.id}"`);
|
|
25
|
+
}
|
|
26
|
+
seen.add(column.id);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
/** Default value for a catalog: `defaultVisible !== false` columns in catalog order, the rest hidden. */
|
|
30
|
+
export const createDefaultPneTableColumnSettings = (columns) => ({
|
|
31
|
+
visibleColumnIds: columns.filter(column => column.defaultVisible !== false).map(column => column.id),
|
|
32
|
+
hiddenColumnIds: columns.filter(column => column.defaultVisible === false).map(column => column.id),
|
|
33
|
+
});
|
|
34
|
+
/**
|
|
35
|
+
* Applies a stored value to the current catalog:
|
|
36
|
+
*
|
|
37
|
+
* - IDs unknown to the catalog are dropped;
|
|
38
|
+
* - visible columns keep their stored order;
|
|
39
|
+
* - catalog columns absent from both stored lists are new since the save and
|
|
40
|
+
* are appended as visible, in catalog order;
|
|
41
|
+
* - a value that leaves nothing visible falls back to the catalog defaults.
|
|
42
|
+
*
|
|
43
|
+
* `undefined` means "never configured" and yields the defaults.
|
|
44
|
+
*/
|
|
45
|
+
export const resolvePneTableColumnSettings = (columns, value) => {
|
|
46
|
+
assertPneTableColumnCatalog(columns);
|
|
47
|
+
const byId = new Map(columns.map(column => [column.id, column]));
|
|
48
|
+
const defaults = createDefaultPneTableColumnSettings(columns);
|
|
49
|
+
const resolveIds = (source) => {
|
|
50
|
+
const visible = uniqueIds(source.visibleColumnIds).filter(id => byId.has(id));
|
|
51
|
+
const visibleSet = new Set(visible);
|
|
52
|
+
const hidden = uniqueIds(source.hiddenColumnIds)
|
|
53
|
+
.filter(id => byId.has(id) && !visibleSet.has(id));
|
|
54
|
+
const known = new Set([...visible, ...hidden]);
|
|
55
|
+
const added = columns.filter(column => !known.has(column.id)).map(column => column.id);
|
|
56
|
+
return {
|
|
57
|
+
visibleColumnIds: [...visible, ...added],
|
|
58
|
+
hiddenColumnIds: hidden,
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
let resolved = value ? resolveIds(value) : defaults;
|
|
62
|
+
if (resolved.visibleColumnIds.length === 0) {
|
|
63
|
+
resolved = defaults;
|
|
64
|
+
}
|
|
65
|
+
const hiddenSet = new Set(resolved.hiddenColumnIds);
|
|
66
|
+
return {
|
|
67
|
+
visibleColumns: resolved.visibleColumnIds.map(id => byId.get(id)),
|
|
68
|
+
hiddenColumns: columns.filter(column => hiddenSet.has(column.id)),
|
|
69
|
+
value: resolved,
|
|
70
|
+
isDefault: sameIds(resolved.visibleColumnIds, defaults.visibleColumnIds)
|
|
71
|
+
&& sameIds([...resolved.hiddenColumnIds].sort(), [...defaults.hiddenColumnIds].sort()),
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
/** Structural equality of two normalized values; hidden order is irrelevant. */
|
|
75
|
+
export const isSamePneTableColumnSettings = (left, right) => sameIds(left.visibleColumnIds, right.visibleColumnIds)
|
|
76
|
+
&& sameIds([...left.hiddenColumnIds].sort(), [...right.hiddenColumnIds].sort());
|
|
77
|
+
//# sourceMappingURL=resolveColumnSettings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveColumnSettings.js","sourceRoot":"","sources":["../../../../src/component/table/column-settings/resolveColumnSettings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/** Stable, non-secret column identifier owned by the consumer; never an index or a translated label. */
|
|
2
|
+
export type PneTableColumnId = string;
|
|
3
|
+
/**
|
|
4
|
+
* One entry of a table column catalog. The catalog lists every column a
|
|
5
|
+
* consumer can render for a given table view, in the default display order.
|
|
6
|
+
*/
|
|
7
|
+
export type PneTableColumnOption = {
|
|
8
|
+
id: PneTableColumnId;
|
|
9
|
+
/** Plain-text label used by the settings dialog for display and search; keep it equal to the header text. */
|
|
10
|
+
label: string;
|
|
11
|
+
/** Whether the column is shown before the user configures anything. Defaults to `true`. */
|
|
12
|
+
defaultVisible?: boolean;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Persisted user preference for one table view. The consumer stores it as-is
|
|
16
|
+
* and passes it back; the library never inspects where it lives.
|
|
17
|
+
*/
|
|
18
|
+
export type PneTableColumnSettingsValue = {
|
|
19
|
+
/** Column IDs the user keeps visible, in display order. */
|
|
20
|
+
visibleColumnIds: readonly PneTableColumnId[];
|
|
21
|
+
/**
|
|
22
|
+
* Column IDs the user explicitly hid. Catalog columns absent from both lists
|
|
23
|
+
* are new since the value was saved and are shown by default.
|
|
24
|
+
*/
|
|
25
|
+
hiddenColumnIds: readonly PneTableColumnId[];
|
|
26
|
+
};
|
|
27
|
+
/** Catalog-aware result of applying a stored value to the current column catalog. */
|
|
28
|
+
export type PneTableResolvedColumnSettings<TColumn extends PneTableColumnOption> = {
|
|
29
|
+
/** Catalog columns to render, in display order. Never empty for a non-empty catalog. */
|
|
30
|
+
visibleColumns: readonly TColumn[];
|
|
31
|
+
/** Catalog columns currently hidden, in catalog order. */
|
|
32
|
+
hiddenColumns: readonly TColumn[];
|
|
33
|
+
/** Normalized value that references only existing catalog columns. */
|
|
34
|
+
value: PneTableColumnSettingsValue;
|
|
35
|
+
/** True when `value` equals the catalog defaults. */
|
|
36
|
+
isDefault: boolean;
|
|
37
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/component/table/column-settings/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { PneTableColumnId, PneTableColumnOption, PneTableColumnSettingsValue } from './types';
|
|
2
|
+
import type { PneTableColumnSettingsDialogProps } from './PneTableColumnSettingsDialog';
|
|
3
|
+
export type UsePneTableColumnSettingsParams<TColumn extends PneTableColumnOption> = {
|
|
4
|
+
/** Column catalog of the configured table view, in default display order. */
|
|
5
|
+
columns: readonly TColumn[];
|
|
6
|
+
/** Stored preference owned by the consumer; `undefined` or `null` means the catalog defaults. */
|
|
7
|
+
value?: PneTableColumnSettingsValue | null;
|
|
8
|
+
/** Persists the normalized value. Reject to keep the dialog open; report the failure yourself. */
|
|
9
|
+
onSave: (value: PneTableColumnSettingsValue) => void | Promise<void>;
|
|
10
|
+
};
|
|
11
|
+
export type UsePneTableColumnSettingsResult<TColumn extends PneTableColumnOption> = {
|
|
12
|
+
/** Catalog columns to render, in display order. */
|
|
13
|
+
visibleColumns: readonly TColumn[];
|
|
14
|
+
/** Catalog columns currently hidden, in catalog order. */
|
|
15
|
+
hiddenColumns: readonly TColumn[];
|
|
16
|
+
/** Normalized current value after catalog reconciliation. */
|
|
17
|
+
value: PneTableColumnSettingsValue;
|
|
18
|
+
/** True when the current value equals the catalog defaults. */
|
|
19
|
+
isDefault: boolean;
|
|
20
|
+
isVisible: (columnId: PneTableColumnId) => boolean;
|
|
21
|
+
/** Dialog visibility. */
|
|
22
|
+
open: boolean;
|
|
23
|
+
openDialog: () => void;
|
|
24
|
+
closeDialog: () => void;
|
|
25
|
+
/** Spread into `PneTableColumnSettingsDialog`. */
|
|
26
|
+
dialogProps: Pick<PneTableColumnSettingsDialogProps<TColumn>, 'columns' | 'onClose' | 'onSave' | 'open' | 'value'>;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Reconciles a stored column preference with the catalog and owns the dialog
|
|
30
|
+
* open state. Storage stays with the consumer: pass the loaded `value` and an
|
|
31
|
+
* `onSave` that writes it back.
|
|
32
|
+
*/
|
|
33
|
+
declare const usePneTableColumnSettings: <TColumn extends PneTableColumnOption>(params: UsePneTableColumnSettingsParams<TColumn>) => UsePneTableColumnSettingsResult<TColumn>;
|
|
34
|
+
export default usePneTableColumnSettings;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { useCallback, useMemo, useState } from 'react';
|
|
2
|
+
import { resolvePneTableColumnSettings } from './resolveColumnSettings';
|
|
3
|
+
/**
|
|
4
|
+
* Reconciles a stored column preference with the catalog and owns the dialog
|
|
5
|
+
* open state. Storage stays with the consumer: pass the loaded `value` and an
|
|
6
|
+
* `onSave` that writes it back.
|
|
7
|
+
*/
|
|
8
|
+
const usePneTableColumnSettings = (params) => {
|
|
9
|
+
const { columns, onSave, value } = params;
|
|
10
|
+
const [open, setOpen] = useState(false);
|
|
11
|
+
const resolved = useMemo(() => resolvePneTableColumnSettings(columns, value), [columns, value]);
|
|
12
|
+
const visibleIds = useMemo(() => new Set(resolved.value.visibleColumnIds), [resolved.value.visibleColumnIds]);
|
|
13
|
+
const openDialog = useCallback(() => setOpen(true), []);
|
|
14
|
+
const closeDialog = useCallback(() => setOpen(false), []);
|
|
15
|
+
const isVisible = useCallback((columnId) => visibleIds.has(columnId), [visibleIds]);
|
|
16
|
+
return {
|
|
17
|
+
visibleColumns: resolved.visibleColumns,
|
|
18
|
+
hiddenColumns: resolved.hiddenColumns,
|
|
19
|
+
value: resolved.value,
|
|
20
|
+
isDefault: resolved.isDefault,
|
|
21
|
+
isVisible,
|
|
22
|
+
open,
|
|
23
|
+
openDialog,
|
|
24
|
+
closeDialog,
|
|
25
|
+
dialogProps: {
|
|
26
|
+
columns,
|
|
27
|
+
onClose: closeDialog,
|
|
28
|
+
onSave,
|
|
29
|
+
open,
|
|
30
|
+
value,
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
export default usePneTableColumnSettings;
|
|
35
|
+
//# sourceMappingURL=usePneTableColumnSettings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePneTableColumnSettings.js","sourceRoot":"","sources":["../../../../src/component/table/column-settings/usePneTableColumnSettings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAC,MAAM,OAAO,CAAA;AAEpD,OAAO,EAAC,6BAA6B,EAAC,MAAM,yBAAyB,CAAA;AAiCrE;;;;GAIG;AACH,MAAM,yBAAyB,GAAG,CAC9B,MAAgD,EACR,EAAE;IAC1C,MAAM,EAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAC,GAAG,MAAM,CAAA;IACvC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,6BAA6B,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;IAC/F,MAAM,UAAU,GAAG,OAAO,CACtB,GAAG,EAAE,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAC9C,CAAC,QAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,CACpC,CAAA;IACD,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IACvD,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAA;IACzD,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,QAA0B,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAA;IAErG,OAAO;QACH,cAAc,EAAE,QAAQ,CAAC,cAAc;QACvC,aAAa,EAAE,QAAQ,CAAC,aAAa;QACrC,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,SAAS;QACT,IAAI;QACJ,UAAU;QACV,WAAW;QACX,WAAW,EAAE;YACT,OAAO;YACP,OAAO,EAAE,WAAW;YACpB,MAAM;YACN,IAAI;YACJ,KAAK;SACR;KACJ,CAAA;AACL,CAAC,CAAA;AAED,eAAe,yBAAyB,CAAA"}
|
package/esm/exports/table.d.ts
CHANGED
|
@@ -28,3 +28,11 @@ export type { PaginatorProps, TableCreateHeaderType, TableProps, TableSortOption
|
|
|
28
28
|
export { default as AbstractHeaderTableCell } from '../component/table/AbstractHeaderTableCell';
|
|
29
29
|
export { default as AbstractTableCell } from '../component/table/AbstractTableCell';
|
|
30
30
|
export { TableDisplayOptions } from '../component/table/type';
|
|
31
|
+
export { default as PneTableColumnSettingsDialog } from '../component/table/column-settings/PneTableColumnSettingsDialog';
|
|
32
|
+
export type { PneTableColumnSettingsDialogProps } from '../component/table/column-settings/PneTableColumnSettingsDialog';
|
|
33
|
+
export { default as PneTableColumnSettingsAction } from '../component/table/column-settings/PneTableColumnSettingsAction';
|
|
34
|
+
export type { PneTableColumnSettingsActionProps } from '../component/table/column-settings/PneTableColumnSettingsAction';
|
|
35
|
+
export { default as usePneTableColumnSettings } from '../component/table/column-settings/usePneTableColumnSettings';
|
|
36
|
+
export type { UsePneTableColumnSettingsParams, UsePneTableColumnSettingsResult, } from '../component/table/column-settings/usePneTableColumnSettings';
|
|
37
|
+
export { createDefaultPneTableColumnSettings, isSamePneTableColumnSettings, resolvePneTableColumnSettings, } from '../component/table/column-settings/resolveColumnSettings';
|
|
38
|
+
export type { PneTableColumnId, PneTableColumnOption, PneTableColumnSettingsValue, PneTableResolvedColumnSettings, } from '../component/table/column-settings/types';
|
package/esm/exports/table.js
CHANGED
|
@@ -16,4 +16,8 @@ export { default as PneTableSortLabel } from '../component/table/PneTableSortLab
|
|
|
16
16
|
export { default as AbstractTable } from '../component/table/AbstractTable';
|
|
17
17
|
export { default as AbstractHeaderTableCell } from '../component/table/AbstractHeaderTableCell';
|
|
18
18
|
export { default as AbstractTableCell } from '../component/table/AbstractTableCell';
|
|
19
|
+
export { default as PneTableColumnSettingsDialog } from '../component/table/column-settings/PneTableColumnSettingsDialog';
|
|
20
|
+
export { default as PneTableColumnSettingsAction } from '../component/table/column-settings/PneTableColumnSettingsAction';
|
|
21
|
+
export { default as usePneTableColumnSettings } from '../component/table/column-settings/usePneTableColumnSettings';
|
|
22
|
+
export { createDefaultPneTableColumnSettings, isSamePneTableColumnSettings, resolvePneTableColumnSettings, } from '../component/table/column-settings/resolveColumnSettings';
|
|
19
23
|
//# sourceMappingURL=table.js.map
|
package/esm/exports/table.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/exports/table.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,EACH,oBAAoB,GAGvB,MAAM,yCAAyC,CAAA;AAChD,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,oCAAoC,CAAA;AAE/E,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,8CAA8C,CAAA;AAEnG,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,0CAA0C,CAAA;AAK3F,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,uCAAuC,CAAA;AAMrF,OAAO,EAAE,OAAO,IAAI,2BAA2B,EAAE,MAAM,gDAAgD,CAAA;AAEvG,OAAO,EACH,mBAAmB,EACnB,yBAAyB,EACzB,sBAAsB,EACtB,0BAA0B,EAC1B,kBAAkB,EAClB,0BAA0B,EAC1B,oBAAoB,EACpB,mBAAmB,GAKtB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,sCAAsC,CAAA;AAQnF,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAMjE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,gCAAgC,CAAA;AACvE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,uCAAuC,CAAA;AAErF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAEzE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,wCAAwC,CAAA;AAEvF,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,sCAAsC,CAAA;AAEnF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,kCAAkC,CAAA;AAQ3E,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,4CAA4C,CAAA;AAC/F,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,sCAAsC,CAAA"}
|
|
1
|
+
{"version":3,"file":"table.js","sourceRoot":"","sources":["../../src/exports/table.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,EACH,oBAAoB,GAGvB,MAAM,yCAAyC,CAAA;AAChD,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,oCAAoC,CAAA;AAE/E,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,8CAA8C,CAAA;AAEnG,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,0CAA0C,CAAA;AAK3F,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,uCAAuC,CAAA;AAMrF,OAAO,EAAE,OAAO,IAAI,2BAA2B,EAAE,MAAM,gDAAgD,CAAA;AAEvG,OAAO,EACH,mBAAmB,EACnB,yBAAyB,EACzB,sBAAsB,EACtB,0BAA0B,EAC1B,kBAAkB,EAClB,0BAA0B,EAC1B,oBAAoB,EACpB,mBAAmB,GAKtB,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,sCAAsC,CAAA;AAQnF,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAMjE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,gCAAgC,CAAA;AACvE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,uCAAuC,CAAA;AAErF,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAEzE,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,wCAAwC,CAAA;AAEvF,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,sCAAsC,CAAA;AAEnF,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,kCAAkC,CAAA;AAQ3E,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,4CAA4C,CAAA;AAC/F,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,sCAAsC,CAAA;AAEnF,OAAO,EAAE,OAAO,IAAI,4BAA4B,EAAE,MAAM,iEAAiE,CAAA;AAEzH,OAAO,EAAE,OAAO,IAAI,4BAA4B,EAAE,MAAM,iEAAiE,CAAA;AAEzH,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,8DAA8D,CAAA;AAKnH,OAAO,EACH,mCAAmC,EACnC,4BAA4B,EAC5B,6BAA6B,GAChC,MAAM,0DAA0D,CAAA"}
|