@gravitee/graphene-core 3.26.2-fix-found-336-save-button-reset.c77dcf4 → 3.26.2-fix-found-336-save-button-reset.dd1cd09
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/USAGE_GUIDE.md +148 -34
- package/dist/__stories__/fixtures/apis.fixture.d.ts +8 -5
- package/dist/__stories__/fixtures/apis.fixture.d.ts.map +1 -1
- package/dist/composed/DataTable/DataTable.d.ts +14 -1
- package/dist/composed/DataTable/DataTable.d.ts.map +1 -1
- package/dist/composed/SearchField/SearchField.d.ts +55 -0
- package/dist/composed/SearchField/SearchField.d.ts.map +1 -0
- package/dist/composed/SearchField/SearchField.harness.d.ts +17 -0
- package/dist/composed/SearchField/SearchField.harness.d.ts.map +1 -0
- package/dist/composed/SearchField/index.d.ts +3 -0
- package/dist/composed/SearchField/index.d.ts.map +1 -0
- package/dist/hooks/use-debounced-value.d.ts +17 -0
- package/dist/hooks/use-debounced-value.d.ts.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7346 -7276
- package/dist/styles/globals.css +1 -1
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +27 -1
- package/package.json +4 -2
- package/snippets/list-page/DeleteEntityDialog.tsx +71 -0
- package/snippets/list-page/EntitiesPage.tsx +221 -0
- package/snippets/list-page/EntityActionsMenu.tsx +69 -0
- package/snippets/list-page/entities.service.ts +108 -0
- package/snippets/list-page/entityColumns.tsx +79 -0
- package/snippets/list-page/snippet.json +6 -0
- package/snippets/list-page/useEntityList.ts +142 -0
- package/snippets/data-table-list-page.tsx +0 -322
package/USAGE_GUIDE.md
CHANGED
|
@@ -482,7 +482,7 @@ Follow these steps to apply the layout width system to an existing consumer modu
|
|
|
482
482
|
4. **Remove ad-hoc width constraints** — delete any `max-w-*` classes on page-level wrapper divs. The design system owns content width.
|
|
483
483
|
5. **Verify** — resize the browser to confirm content stays centered without clipping on narrow viewports.
|
|
484
484
|
|
|
485
|
-
See `node_modules/@gravitee/graphene-core/snippets/
|
|
485
|
+
See the folder `node_modules/@gravitee/graphene-core/snippets/list-page/` and `creation-wizard-page.tsx` for complete examples.
|
|
486
486
|
|
|
487
487
|
### Page header
|
|
488
488
|
|
|
@@ -534,11 +534,79 @@ The page owns the rhythm: `PageHeader` has no padding and no outer margin, and t
|
|
|
534
534
|
- Put breadcrumbs inside the header: they belong to `ContentHeader`.
|
|
535
535
|
- Push business logic into the header (`canCreate`, `onCreate`): decide permissions, dialogs and which buttons show in the page, then pass the buttons as `actions`.
|
|
536
536
|
|
|
537
|
+
### Search field
|
|
538
|
+
|
|
539
|
+
Use `SearchField` for the search of a list: one per list, in the table toolbar next to the filters. It shows every keystroke at once and tells the page the query once typing settles, 300 ms after the last keystroke, or at once when the field is cleared and on Enter. The field owns the keystrokes, the page owns the query: pass it back as `value` so that a Reset empties the field.
|
|
540
|
+
|
|
541
|
+
| Prop | Type | Required | Notes |
|
|
542
|
+
| --- | --- | --- | --- |
|
|
543
|
+
| `aria-label` | `string` | Yes | Says what is searched ("Search APIs"). Two fields on one page get two names |
|
|
544
|
+
| `onValueChange` | `(value: string) => void` | Yes | Called with the settled query, and at once on clear, Escape and Enter. Never on mount, never with the query the page already has |
|
|
545
|
+
| `value` | `string` | No | The page's query, `''` by default. A change from the page replaces the text without calling `onValueChange`. Pass the query back as reported and normalize it where it is used: a trimmed `value` would rewrite what the user types |
|
|
546
|
+
| `debounceMs` | `number` | No | Delay after the last keystroke, 300 by default. `0` reports every keystroke |
|
|
547
|
+
| `className` | `string` | No | Merged on the root. The field fills its container: set the width here |
|
|
548
|
+
| `placeholder`, `disabled`, `name`, `id`, ... | | No | Native input props, passed to the `<input type="search">`. Spellcheck, autocorrect and autocapitalize are off by default: queries are identifiers, not prose |
|
|
549
|
+
|
|
550
|
+
One `query` state drives the request, the Reset and the field:
|
|
551
|
+
|
|
552
|
+
```tsx
|
|
553
|
+
import { Button, DataTable, SearchField } from '@gravitee/graphene-core';
|
|
554
|
+
|
|
555
|
+
export function ApisPage() {
|
|
556
|
+
const [query, setQuery] = useState('');
|
|
557
|
+
const [page, setPage] = useState(1);
|
|
558
|
+
// Your module's list query, keyed on the settled query: one request per pause, not per keystroke.
|
|
559
|
+
const { data, totalCount, loading } = useApis({ query, page });
|
|
560
|
+
|
|
561
|
+
const reset = () => {
|
|
562
|
+
setQuery('');
|
|
563
|
+
setPage(1);
|
|
564
|
+
};
|
|
565
|
+
|
|
566
|
+
return (
|
|
567
|
+
<DataTable
|
|
568
|
+
columns={columns}
|
|
569
|
+
data={data}
|
|
570
|
+
loading={loading}
|
|
571
|
+
serverSide
|
|
572
|
+
pagination={{ page, pageSize: 10, totalCount, onPageChange: setPage }}
|
|
573
|
+
toolbar={
|
|
574
|
+
<>
|
|
575
|
+
<SearchField
|
|
576
|
+
aria-label="Search APIs"
|
|
577
|
+
placeholder="Search APIs..."
|
|
578
|
+
value={query}
|
|
579
|
+
onValueChange={(value) => {
|
|
580
|
+
setQuery(value);
|
|
581
|
+
setPage(1);
|
|
582
|
+
}}
|
|
583
|
+
className="w-64"
|
|
584
|
+
/>
|
|
585
|
+
{query !== '' && (
|
|
586
|
+
<Button variant="ghost" size="sm" onClick={reset}>
|
|
587
|
+
Reset
|
|
588
|
+
</Button>
|
|
589
|
+
)}
|
|
590
|
+
</>
|
|
591
|
+
}
|
|
592
|
+
/>
|
|
593
|
+
);
|
|
594
|
+
}
|
|
595
|
+
```
|
|
596
|
+
|
|
597
|
+
**Testing:** the report lands 300 ms after the last keystroke. Where the test renders the field itself, pass `debounceMs={0}` so every keystroke reports at once. Otherwise wait for it: `findBy*` or `waitFor` with real timers, or `await act(() => vi.advanceTimersByTime(300))` with fake timers. Under Vitest fake timers, `user-event` (and so `searchFieldHarness`) never returns unless React Testing Library finds a global `jest` to advance them: stub one for the test with `vi.stubGlobal('jest', { advanceTimersByTime: vi.advanceTimersByTime })` and remove it with `vi.unstubAllGlobals()`.
|
|
598
|
+
|
|
599
|
+
**Do not:**
|
|
600
|
+
|
|
601
|
+
- Wrap the field in `useDebouncedValue`, or debounce `onValueChange` again: the query already arrives settled, a second debounce only delays the list.
|
|
602
|
+
- Leave the placeholder as the only name: it disappears as soon as the user types. `aria-label` says what is searched.
|
|
603
|
+
- Give the field a fixed width in a shared wrapper: the page sets it with `className` where the field lives, `w-64` in a toolbar, nothing in a full-width column.
|
|
604
|
+
|
|
537
605
|
### Data table (entity list pages)
|
|
538
606
|
|
|
539
607
|
Use `DataTable` for any entity list — whether the data is fetched page-by-page from an API or loaded in full on the client. The component provides sorting, filtering, pagination, column visibility, row selection, and bulk actions through a composable slot API.
|
|
540
608
|
|
|
541
|
-
**To implement:** copy the
|
|
609
|
+
**To implement:** copy the folder `node_modules/@gravitee/graphene-core/snippets/list-page/` into your module, rename `Entity` and `entities` after your resource, and point `useEntityList.ts` at your API client instead of the sample `entities.service.ts`. Its `snippet.json` lists the packages it needs beyond Graphene's peers (`@tanstack/react-query`, `react-router-dom`). See Storybook **Patterns/List Page** for the page in its five states.
|
|
542
610
|
|
|
543
611
|
#### When to use DataTable vs raw Table
|
|
544
612
|
|
|
@@ -588,11 +656,12 @@ Use `DataTable` for any entity list — whether the data is fetched page-by-page
|
|
|
588
656
|
|
|
589
657
|
#### Search and filters
|
|
590
658
|
|
|
591
|
-
- Search and filters live in the DataTable `toolbar` slot.
|
|
592
|
-
- Search
|
|
593
|
-
- **Do NOT add a search field to a server-paginated table unless the backend endpoint supports a text search parameter** (`query`, `q`, or equivalent). Client-side search on a single page of server-paginated data is misleading
|
|
594
|
-
-
|
|
595
|
-
-
|
|
659
|
+
- Search and filters live in the DataTable `toolbar` slot, inside `<div className="flex min-w-0 flex-wrap items-center gap-2">`: DataTable's own toolbar row does not wrap, this container does. Group the filters and Reset in a nested `flex flex-wrap items-center gap-2` so that they wrap together.
|
|
660
|
+
- Search: `SearchField` first, with an `aria-label` that says what is searched, a placeholder, and `className="w-64"`. It debounces 300 ms and reports the settled query: reset the page to 1 in `onValueChange`.
|
|
661
|
+
- **Do NOT add a search field to a server-paginated table unless the backend endpoint supports a text search parameter** (`query`, `q`, or equivalent). Client-side search on a single page of server-paginated data is misleading: users will miss matches on other pages. If the backend does not support search, either request the backend change or omit the search field entirely.
|
|
662
|
+
- Single-choice filter: a `Select` whose default option is "All ..." ("All statuses"), named by a `Label` in `sr-only`, with a minimum width (`min-w-32`) so that it does not jump as its value changes.
|
|
663
|
+
- Multiple-choice filter: a `FacetedFilter`.
|
|
664
|
+
- Reset: a `Button variant="ghost" size="sm"`, rendered only while a criterion is active. It clears every criterion and the page, then moves the focus to the search field (pass a `ref` to `SearchField`).
|
|
596
665
|
|
|
597
666
|
#### Row navigation
|
|
598
667
|
|
|
@@ -607,6 +676,9 @@ Use **name-column-as-link**: the primary identifier column (always leftmost) is
|
|
|
607
676
|
- **Quick-action escape hatch:** one high-discoverability action (e.g. "Deploy") may appear as an inline icon *alongside* the dropdown, but the dropdown must still exist.
|
|
608
677
|
- Use `MoreVerticalIcon` (⋮) for table rows. Do not use `MoreHorizontalIcon` — the horizontal variant is for toolbars and card headers.
|
|
609
678
|
- Destructive actions go last in the menu, after a `DropdownMenuSeparator`.
|
|
679
|
+
- Name the ⋮ button after its row: ``aria-label={`Actions for ${entity.name}`}``.
|
|
680
|
+
- A destructive action asks for confirmation in a `Dialog` before it runs, then reports the outcome in a toast (`toast` from `@gravitee/graphene-core`, shown by the app's `Toaster`). When the dialog closes, give the focus back to the ⋮ if the user cancelled. Once the entity is deleted, its row and ⋮ go: move the focus to the search field, as Reset does. See `EntityActionsMenu.tsx` and `DeleteEntityDialog.tsx` in the list page snippet.
|
|
681
|
+
- Key the rows by entity (`tableOptions={{ getRowId: (entity) => entity.id }}`), so that a removed row never hands its focused ⋮ to the next entity. Not with `selectionMode="multi"` for now: `onSelectionChange` still maps the selection by row index.
|
|
610
682
|
|
|
611
683
|
#### Column ordering
|
|
612
684
|
|
|
@@ -620,7 +692,9 @@ Use **name-column-as-link**: the primary identifier column (always leftmost) is
|
|
|
620
692
|
|
|
621
693
|
**Minimum 3 data columns** (excluding actions). If an entity has fewer than 3 meaningful attributes, use a simpler component (Item list, card grid) instead of DataTable.
|
|
622
694
|
|
|
623
|
-
Target **4-7 visible columns**.
|
|
695
|
+
Target **4-7 visible columns**. List pages show the View menu (`enableColumnVisibility`), with the name and the actions always visible (`enableHiding: false`); more than 7 → hide the low-priority columns by default. Do NOT show raw entity IDs as visible columns.
|
|
696
|
+
|
|
697
|
+
`enableColumnVisibility` adds the View menu, which names each column by its `meta.label`, else by its header when that is text: give a column whose header is a component, such as a sortable `DataTableColumnHeader`, a `meta: { label: 'Created' }`, or the menu shows its id.
|
|
624
698
|
|
|
625
699
|
#### Cell renderers
|
|
626
700
|
|
|
@@ -636,56 +710,59 @@ Import from `@gravitee/graphene-core`:
|
|
|
636
710
|
|
|
637
711
|
#### Empty states
|
|
638
712
|
|
|
639
|
-
Use `DataTableEmptyState`
|
|
713
|
+
Use `DataTableEmptyState` for both cases, and decide only once the query has settled: never conclude "empty" from the previous page kept while the next one loads (`isPlaceholderData`).
|
|
640
714
|
|
|
641
|
-
**`variant="first-use"
|
|
642
|
-
- Render **instead of** `DataTable
|
|
643
|
-
-
|
|
644
|
-
-
|
|
645
|
-
- Decision: `totalCount === 0 && !
|
|
715
|
+
**`variant="first-use"`**: the collection is empty and no criterion is active.
|
|
716
|
+
- Render it **instead of** `DataTable`, wrapped in `<div className="rounded-lg border">`.
|
|
717
|
+
- In a list page: an icon, a title, one sentence, and **no button**. The header's Add button is the one creation CTA (see below).
|
|
718
|
+
- `primaryAction`, `secondaryAction` and `children` exist for other surfaces, such as an educational first-use landing.
|
|
719
|
+
- Decision: `totalCount === 0 && !hasCriteria`.
|
|
646
720
|
|
|
647
|
-
**`variant="no-results"
|
|
648
|
-
- Render **inside** `DataTable` as
|
|
649
|
-
-
|
|
650
|
-
-
|
|
721
|
+
**`variant="no-results"`**: a search or a filter matched nothing.
|
|
722
|
+
- Render it **inside** `DataTable` as `emptyMessage`, so the toolbar stays.
|
|
723
|
+
- `icon={<SearchIcon />}`, a title ("No APIs found"), one sentence inviting to adjust the search or the filters, and **no button**: the search field's clear button and the toolbar's Reset clear the criteria.
|
|
724
|
+
- Its `action` slot exists for the rare table without a Reset in its toolbar.
|
|
725
|
+
- Decision: `totalCount === 0 && hasCriteria`.
|
|
651
726
|
|
|
652
727
|
```tsx
|
|
653
|
-
// Page-level decision
|
|
728
|
+
// Page-level decision, once the query has settled
|
|
654
729
|
{isFirstUse ? (
|
|
655
730
|
<div className="rounded-lg border">
|
|
656
|
-
<DataTableEmptyState variant="first-use" icon={<GlobeIcon />} title="No APIs yet" ... />
|
|
731
|
+
<DataTableEmptyState variant="first-use" icon={<GlobeIcon />} title="No APIs yet" description="..." />
|
|
657
732
|
</div>
|
|
658
733
|
) : (
|
|
659
734
|
<DataTable
|
|
660
|
-
emptyMessage={<DataTableEmptyState variant="no-results" icon={<SearchIcon />} ... />}
|
|
735
|
+
emptyMessage={<DataTableEmptyState variant="no-results" icon={<SearchIcon />} title="No APIs found" description="..." />}
|
|
661
736
|
...
|
|
662
737
|
/>
|
|
663
738
|
)}
|
|
664
739
|
```
|
|
665
740
|
|
|
666
|
-
See Storybook **
|
|
741
|
+
See Storybook **Patterns/List Page** (states `empty` and `no-results`) for the full interactive example.
|
|
667
742
|
|
|
668
743
|
#### Header button coordination
|
|
669
744
|
|
|
670
|
-
|
|
745
|
+
The Add button stays in the header in every state: one creation CTA on screen.
|
|
671
746
|
|
|
672
|
-
| State | Header
|
|
747
|
+
| State | Header | Content area |
|
|
673
748
|
|---|---|---|
|
|
674
|
-
| **First
|
|
675
|
-
| **
|
|
676
|
-
| **No results** (
|
|
749
|
+
| **First use** (`totalCount === 0`, no criterion) | Add | `DataTableEmptyState variant="first-use"` instead of the table, without a button |
|
|
750
|
+
| **Data** (`totalCount > 0`) | Add | `DataTable` |
|
|
751
|
+
| **No results** (a criterion active, zero matches) | Add | `DataTable` with `DataTableEmptyState variant="no-results"` inside, without a button |
|
|
677
752
|
|
|
678
|
-
|
|
753
|
+
Gate the button on the permission, never on the list's state:
|
|
679
754
|
|
|
680
755
|
```tsx
|
|
681
756
|
<PageHeader
|
|
682
|
-
title="
|
|
683
|
-
description="
|
|
757
|
+
title="APIs"
|
|
758
|
+
description="Design, deploy and secure the APIs your gateways expose to consumers."
|
|
684
759
|
actions={
|
|
685
|
-
|
|
686
|
-
<Button
|
|
687
|
-
<
|
|
688
|
-
|
|
760
|
+
canCreate && (
|
|
761
|
+
<Button asChild>
|
|
762
|
+
<Link to="new">
|
|
763
|
+
<PlusIcon />
|
|
764
|
+
Add API
|
|
765
|
+
</Link>
|
|
689
766
|
</Button>
|
|
690
767
|
)
|
|
691
768
|
}
|
|
@@ -694,9 +771,26 @@ Both the header button and the empty state CTA trigger the same creation flow. N
|
|
|
694
771
|
|
|
695
772
|
#### Loading state
|
|
696
773
|
|
|
774
|
+
- Fetch with TanStack Query and `placeholderData: keepPreviousData`, and pass `loading={isFetching}`: the first load shows skeleton rows, and later fetches keep the rows under DataTable's overlay. There is no code to write for either.
|
|
697
775
|
- Pass `skeletonCount={pageSize}` to prevent layout shift.
|
|
698
776
|
- `loadingDelay={200}` (default) prevents flash on fast responses.
|
|
699
777
|
|
|
778
|
+
#### Error state
|
|
779
|
+
|
|
780
|
+
- A destructive `Alert` above the table: a short title ("Could not load APIs") and a Retry button that calls `refetch()`, disabled while it runs.
|
|
781
|
+
- Keep the last loaded page on screen under the alert, with the toolbar and the pagination, and say that it may be out of date. `keepPreviousData` holds the previous page only while the next one loads, so keep the last successful response in your list hook: the search field must never disappear while the user types.
|
|
782
|
+
- When nothing has loaded yet, the alert alone, with the error message.
|
|
783
|
+
|
|
784
|
+
#### List state in the URL
|
|
785
|
+
|
|
786
|
+
Keep the list state in the URL with `useSearchParams` (react-router-dom), so that a reload, a shared link and the Back button restore it:
|
|
787
|
+
|
|
788
|
+
- Keys: `q` for the search, one key per filter (`status`), repeated for a multiple choice (`type=internal&type=partner`), `page`, `size`, and `sort` as `field:asc` or `field:desc`.
|
|
789
|
+
- Defaults are not written, and every value is read with a fallback: an unknown status, size or sort gives the default.
|
|
790
|
+
- A new criterion (search, filter, sort) deletes `page` and replaces the history entry; changing the page or its size adds one.
|
|
791
|
+
- Give the search back to `SearchField` exactly as it reported it, and trim it where it is used (the request).
|
|
792
|
+
- A page past the last one (its last row deleted, an old link) goes to the last page.
|
|
793
|
+
|
|
700
794
|
#### `serverSide` prop
|
|
701
795
|
|
|
702
796
|
Set `serverSide` when data is fetched page-by-page from an API. It disables TanStack's built-in sort/filter/pagination models so you control everything via your fetch logic.
|
|
@@ -751,6 +845,25 @@ Common variant values:
|
|
|
751
845
|
- **Button**: `variant`: default, outline, secondary, ghost, destructive, link. `size`: default, xs, sm, lg, icon, icon-xs, icon-sm, icon-lg.
|
|
752
846
|
- **Badge**: `variant`: default, secondary, outline, destructive.
|
|
753
847
|
|
|
848
|
+
## Hooks
|
|
849
|
+
|
|
850
|
+
### `useDebouncedValue`
|
|
851
|
+
|
|
852
|
+
`useDebouncedValue<T>(value: T, delayMs = 300): T` returns `value` once it has stopped changing for `delayMs` milliseconds. The first render returns `value` as is; every change restarts the wait, so only the last value lands.
|
|
853
|
+
|
|
854
|
+
Use it for any value that triggers a request or an expensive computation: a validation that calls the backend (host, slug or name availability), the search of a combobox, a live preview.
|
|
855
|
+
|
|
856
|
+
```tsx
|
|
857
|
+
import { useDebouncedValue } from '@gravitee/graphene-core';
|
|
858
|
+
|
|
859
|
+
// `host` changes on every keystroke; the availability check runs once typing settles.
|
|
860
|
+
const debouncedHost = useDebouncedValue(host);
|
|
861
|
+
const { data: hostError } = useHostAvailability(debouncedHost); // your module's query hook
|
|
862
|
+
```
|
|
863
|
+
|
|
864
|
+
- Do not wrap `SearchField` in it: the field already debounces and reports the settled query through `onValueChange`, so a second debounce only delays the list.
|
|
865
|
+
- Modules that keep their own copy of this hook delete it at their next Graphene bump and import this one.
|
|
866
|
+
|
|
754
867
|
## Accessibility
|
|
755
868
|
|
|
756
869
|
- Always pair inputs with a `<Label>` using `htmlFor`:
|
|
@@ -896,6 +1009,7 @@ A few cases worth remembering:
|
|
|
896
1009
|
- **`DataTable` is composed but exported via `/testing`** — most harnesses are for base primitives, but `dataTableHarness` is exposed because it adds sorting, selection, empty/loading state on top of the inner `<Table>`. Its rows extend `TableRowHarness` with `isSelected`, `select`, `unselect`.
|
|
897
1010
|
- **`PasswordInput` is composed but exported via `/testing`** — `passwordInputHarness` wraps the inner `<input>` and its reveal toggle so you don't have to know the internal `data-slot`. Adds `toggle()`, `isMasked()`, `isRevealed()`, `hasToggle()`, `getToggleLabel()`, `isToggleDisabled()` on top of the usual `type`/`getValue`/`isDisabled`.
|
|
898
1011
|
- **`PageHeader` is composed and static, but exported via `/testing`**: `pageHeaderHarness` finds the header through its page `<h1>` (`name` matches the title) and exposes `getTitle`, `getDescription`, `hasActions`, `getActions` (a scope for `buttonHarness`) and `getContent`, so you don't have to know its internal `data-slot`s.
|
|
1012
|
+
- **`SearchField` is composed but exported via `/testing`**: `searchFieldHarness` finds the field by its `searchbox` role (`name` matches its `aria-label`) and adds `clear()`, which clicks the "Clear search" button, and `hasClearButton()` to `type`, `focus`, `getValue`, `getPlaceholder`, `isDisabled` and `getElement`. Its actions do not pause between keystrokes, so they also run under fake timers (see **Search field** for the Vitest caveat).
|
|
899
1013
|
- **Static primitives have no harness** — `Badge`, `Card`, `Skeleton`, `Avatar`, `Spinner`, `Separator`, `Label`, `Kbd`, `Alert`, etc. carry no behavior to drive. Query them directly with RTL's `getByRole` / `getByText`.
|
|
900
1014
|
|
|
901
1015
|
### Async data — wait before attaching
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { BadgeCellProps } from '../../composed/DataTable';
|
|
1
2
|
import { LucideIcon } from '../../icons';
|
|
2
3
|
import { PaginatedResponse } from './pagination.fixture';
|
|
3
|
-
export type
|
|
4
|
+
export type ApiState = 'STARTED' | 'STOPPED';
|
|
5
|
+
export type ApiDeploymentState = 'DEPLOYED' | 'NEED_REDEPLOY';
|
|
4
6
|
export type ApiType = 'HTTP Proxy' | 'Message' | 'TCP Proxy' | 'Federated';
|
|
5
7
|
export type PortalStatus = 'PUBLISHED' | 'UNPUBLISHED';
|
|
6
8
|
export type PortalVisibility = 'PUBLIC' | 'PRIVATE';
|
|
@@ -10,7 +12,8 @@ export interface Api {
|
|
|
10
12
|
description: string;
|
|
11
13
|
icon: LucideIcon;
|
|
12
14
|
iconColor: string;
|
|
13
|
-
|
|
15
|
+
state: ApiState;
|
|
16
|
+
deploymentState: ApiDeploymentState;
|
|
14
17
|
apiType: ApiType;
|
|
15
18
|
contextPath: string;
|
|
16
19
|
version: string;
|
|
@@ -21,14 +24,14 @@ export interface Api {
|
|
|
21
24
|
createdAt: string;
|
|
22
25
|
}
|
|
23
26
|
export declare const apis: readonly Api[];
|
|
24
|
-
export declare const
|
|
25
|
-
export declare const
|
|
27
|
+
export declare const API_STATE_BADGE: Record<ApiState, BadgeCellProps>;
|
|
28
|
+
export declare const API_DEPLOYMENT_STATE_BADGE: Record<ApiDeploymentState, BadgeCellProps>;
|
|
26
29
|
export interface FetchApisParams {
|
|
27
30
|
page: number;
|
|
28
31
|
perPage: number;
|
|
29
32
|
sortBy?: keyof Api;
|
|
30
33
|
sortOrder?: 'asc' | 'desc';
|
|
31
|
-
|
|
34
|
+
state?: ApiState[];
|
|
32
35
|
apiType?: ApiType[];
|
|
33
36
|
search?: string;
|
|
34
37
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apis.fixture.d.ts","sourceRoot":"","sources":["../../../src/__stories__/fixtures/apis.fixture.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"apis.fixture.d.ts","sourceRoot":"","sources":["../../../src/__stories__/fixtures/apis.fixture.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAiBhE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAK9D,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAC7C,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,eAAe,CAAC;AAC9D,MAAM,MAAM,OAAO,GAAG,YAAY,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,CAAC;AAC3E,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,aAAa,CAAC;AACvD,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEpD,MAAM,WAAW,GAAG;IAClB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,QAAQ,CAAC;IAChB,eAAe,EAAE,kBAAkB,CAAC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,YAAY,CAAC;IAC3B,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;CACnB;AA8QD,eAAO,MAAM,IAAI,EAAE,SAAS,GAAG,EAAU,CAAC;AAK1C,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,QAAQ,EAAE,cAAc,CAG5D,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,MAAM,CAAC,kBAAkB,EAAE,cAAc,CAOjF,CAAC;AAMF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC;IACnB,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CA2ClF"}
|
|
@@ -1,5 +1,14 @@
|
|
|
1
|
-
import { ColumnDef, OnChangeFn, SortingState, TableOptions } from '@tanstack/react-table';
|
|
1
|
+
import { ColumnDef, OnChangeFn, RowData, SortingState, TableOptions } from '@tanstack/react-table';
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
|
+
declare module '@tanstack/react-table' {
|
|
4
|
+
interface ColumnMeta<TData extends RowData, TValue> {
|
|
5
|
+
/**
|
|
6
|
+
* The column's name in the View menu (`enableColumnVisibility`), for a header that is not text,
|
|
7
|
+
* such as a sortable `DataTableColumnHeader`. Without it, the menu shows the column id.
|
|
8
|
+
*/
|
|
9
|
+
label?: string;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
3
12
|
interface DataTablePaginationConfig {
|
|
4
13
|
readonly page: number;
|
|
5
14
|
readonly pageSize: number;
|
|
@@ -21,6 +30,10 @@ interface DataTableProps<TData> {
|
|
|
21
30
|
/** Called when the user clicks a sortable column header. Use to trigger a server re-fetch with the new sort params. */
|
|
22
31
|
readonly onSortingChange?: OnChangeFn<SortingState>;
|
|
23
32
|
readonly emptyMessage?: ReactNode;
|
|
33
|
+
/**
|
|
34
|
+
* Adds the View menu, which shows and hides the columns whose `enableHiding` is not false. It names a
|
|
35
|
+
* column by its `meta.label`, else by its header when that is text, else by its id.
|
|
36
|
+
*/
|
|
24
37
|
readonly enableColumnVisibility?: boolean;
|
|
25
38
|
readonly enableColumnResizing?: boolean;
|
|
26
39
|
/** Makes the table header sticky. Consumer should set a max-height via className. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../src/composed/DataTable/DataTable.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EAMd,KAAK,UAAU,
|
|
1
|
+
{"version":3,"file":"DataTable.d.ts","sourceRoot":"","sources":["../../../src/composed/DataTable/DataTable.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
interface SearchFieldProps extends Omit<React.ComponentProps<'input'>, 'value' | 'onChange' | 'type' | 'defaultValue'> {
|
|
3
|
+
/**
|
|
4
|
+
* Says what is searched: "Search APIs", "Search topics". Required because a placeholder is not a
|
|
5
|
+
* label, and two fields on one page must not share a name.
|
|
6
|
+
*/
|
|
7
|
+
readonly 'aria-label': string;
|
|
8
|
+
/**
|
|
9
|
+
* The query as the page knows it, `''` by default. When the page changes it (a Reset), the field
|
|
10
|
+
* shows the new value without calling `onValueChange`. Pass the query back as reported and
|
|
11
|
+
* normalize it where it is used: a trimmed or lowercased `value` would replace the user's text.
|
|
12
|
+
*/
|
|
13
|
+
readonly value?: string;
|
|
14
|
+
/**
|
|
15
|
+
* Called with the query once typing settles (`debounceMs`), and at once when the field is cleared
|
|
16
|
+
* (clear button, Escape, or the text deleted) and on Enter. Never called on mount, nor with the
|
|
17
|
+
* query the page already has.
|
|
18
|
+
*/
|
|
19
|
+
readonly onValueChange: (value: string) => void;
|
|
20
|
+
/** Milliseconds between the last keystroke and `onValueChange`, 300 by default. `0` reports every keystroke. */
|
|
21
|
+
readonly debounceMs?: number;
|
|
22
|
+
/** Merged on the root `InputGroup`. The field fills its container: set the width here (`w-64` in a table toolbar). */
|
|
23
|
+
readonly className?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The search field of a list: a 32px input with a leading search icon, a clear button while it has
|
|
27
|
+
* text, and a debounce. The field owns the keystrokes, the page owns the query: every keystroke
|
|
28
|
+
* shows at once, and the page hears the query only once typing settles, so a server search does
|
|
29
|
+
* not send a request per keystroke. Clearing and Enter report at once.
|
|
30
|
+
*
|
|
31
|
+
* Render one per list, in the table toolbar next to the filters. The page sets the width.
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```tsx
|
|
35
|
+
* const [query, setQuery] = useState('');
|
|
36
|
+
*
|
|
37
|
+
* <SearchField
|
|
38
|
+
* aria-label="Search APIs"
|
|
39
|
+
* placeholder="Search APIs..."
|
|
40
|
+
* value={query}
|
|
41
|
+
* onValueChange={(value) => {
|
|
42
|
+
* setQuery(value);
|
|
43
|
+
* setPage(1);
|
|
44
|
+
* }}
|
|
45
|
+
* className="w-64"
|
|
46
|
+
* />
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
declare function SearchField({ ref, value, onValueChange, debounceMs, className, disabled, onKeyDown, ...props }: SearchFieldProps): React.JSX.Element;
|
|
50
|
+
declare namespace SearchField {
|
|
51
|
+
var displayName: string;
|
|
52
|
+
}
|
|
53
|
+
export { SearchField };
|
|
54
|
+
export type { SearchFieldProps };
|
|
55
|
+
//# sourceMappingURL=SearchField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchField.d.ts","sourceRoot":"","sources":["../../../src/composed/SearchField/SearchField.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAU/B,UAAU,gBAAiB,SAAQ,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,MAAM,GAAG,cAAc,CAAC;IACpH;;;OAGG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,gHAAgH;IAChH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,sHAAsH;IACtH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,iBAAS,WAAW,CAAC,EACnB,GAAG,EACH,KAAU,EACV,aAAa,EACb,UAAgB,EAChB,SAAS,EACT,QAAQ,EACR,SAAS,EACT,GAAG,KAAK,EACT,EAAE,gBAAgB,qBAiGlB;kBA1GQ,WAAW;;;AA8GpB,OAAO,EAAE,WAAW,EAAE,CAAC;AACvB,YAAY,EAAE,gBAAgB,EAAE,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { HarnessQuery } from '../../testing/harnessQuery';
|
|
2
|
+
interface SearchFieldHarness {
|
|
3
|
+
readonly type: (value: string) => Promise<void>;
|
|
4
|
+
/** Clicks the "Clear search" button. No-op while the field is empty, since the button is not rendered. */
|
|
5
|
+
readonly clear: () => Promise<void>;
|
|
6
|
+
/** Whether the "Clear search" button is shown: it is, while the field has text. */
|
|
7
|
+
readonly hasClearButton: () => boolean;
|
|
8
|
+
readonly focus: () => void;
|
|
9
|
+
readonly getElement: () => HTMLInputElement;
|
|
10
|
+
readonly getValue: () => string;
|
|
11
|
+
readonly getPlaceholder: () => string | null;
|
|
12
|
+
readonly isDisabled: () => boolean;
|
|
13
|
+
}
|
|
14
|
+
declare function searchFieldHarness(query?: HarnessQuery): SearchFieldHarness;
|
|
15
|
+
export { searchFieldHarness };
|
|
16
|
+
export type { SearchFieldHarness };
|
|
17
|
+
//# sourceMappingURL=SearchField.harness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchField.harness.d.ts","sourceRoot":"","sources":["../../../src/composed/SearchField/SearchField.harness.tsx"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,8CAA8C,CAAC;AAEtD,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,0GAA0G;IAC1G,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,mFAAmF;IACnF,QAAQ,CAAC,cAAc,EAAE,MAAM,OAAO,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,gBAAgB,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAC7C,QAAQ,CAAC,UAAU,EAAE,MAAM,OAAO,CAAC;CACpC;AAED,iBAAS,kBAAkB,CAAC,KAAK,GAAE,YAAiB,GAAG,kBAAkB,CA2CxE;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAC9B,YAAY,EAAE,kBAAkB,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/composed/SearchField/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns `value` once it has stopped changing for `delayMs` milliseconds (300 by default).
|
|
3
|
+
*
|
|
4
|
+
* Use it for any value that triggers a request or an expensive computation: a name
|
|
5
|
+
* availability check, a combobox search, a live preview. The first render returns `value`
|
|
6
|
+
* as is; every change restarts the wait, so only the last value lands.
|
|
7
|
+
*
|
|
8
|
+
* Do not wrap `SearchField` in it: the field already debounces and reports the settled query
|
|
9
|
+
* through `onValueChange`.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* // `host` changes on every keystroke; the availability check runs once typing settles.
|
|
13
|
+
* const debouncedHost = useDebouncedValue(host);
|
|
14
|
+
* const { data: hostError } = useHostAvailability(debouncedHost);
|
|
15
|
+
*/
|
|
16
|
+
export declare function useDebouncedValue<T>(value: T, delayMs?: number): T;
|
|
17
|
+
//# sourceMappingURL=use-debounced-value.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-debounced-value.d.ts","sourceRoot":"","sources":["../../src/hooks/use-debounced-value.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,SAAM,GAAG,CAAC,CAS/D"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { cn } from './lib/utils';
|
|
2
2
|
export { PortalContainerProvider, usePortalContainer } from './lib/PortalContainerContext';
|
|
3
|
+
export { useDebouncedValue } from './hooks/use-debounced-value';
|
|
3
4
|
export * from './base/Accordion';
|
|
4
5
|
export * from './base/Alert';
|
|
5
6
|
export * from './base/Avatar';
|
|
@@ -67,6 +68,7 @@ export * from './composed/LayoutSlots';
|
|
|
67
68
|
export * from './composed/PageFocused';
|
|
68
69
|
export * from './composed/PageHeader';
|
|
69
70
|
export * from './composed/PasswordInput';
|
|
71
|
+
export * from './composed/SearchField';
|
|
70
72
|
export * from './composed/SelectorDropdown';
|
|
71
73
|
export * from './composed/SidebarMode';
|
|
72
74
|
export * from './composed/ThemeProvider';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,uBAAuB,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAC3F,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAGhE,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,qBAAqB,CAAC;AACpC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAG/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AAMvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,yBAAyB,CAAC;AACxC,OAAO,EACL,sBAAsB,EACtB,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,GAC7B,MAAM,0CAA0C,CAAC;AAClD,cAAc,sBAAsB,CAAC;AACrC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uBAAuB,CAAC;AACtC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,0BAA0B,CAAC;AACzC,cAAc,wBAAwB,CAAC;AACvC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC"}
|