@starasia/admin 8.2.8 → 8.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/dist/components/FilterBar/components/MobileFilterBar.d.ts +52 -0
  2. package/dist/components/FilterBar/components/MobileFilterDrawer.d.ts +25 -0
  3. package/dist/components/FilterBar/components/MobileMoreMenu.d.ts +16 -0
  4. package/dist/components/FilterBar/hooks/useColumnPrefs.d.ts +3 -1
  5. package/dist/components/FilterBar/hooks/useFilterBarApiParams.d.ts +52 -0
  6. package/dist/components/FilterBar/hooks/useFilterBarControls.d.ts +39 -0
  7. package/dist/components/FilterBar/hooks/useLastFilterState.d.ts +11 -8
  8. package/dist/components/FilterBar/hooks/usePerPagePref.d.ts +23 -0
  9. package/dist/components/FilterBar/hooks/useUrlHydration.d.ts +23 -0
  10. package/dist/components/FilterBar/index.d.ts +3 -0
  11. package/dist/components/FilterBar/types.d.ts +25 -4
  12. package/dist/components/FilterBar/utils/expand-date-compact.d.ts +33 -0
  13. package/dist/components/FilterBar/utils/relative-date.d.ts +17 -0
  14. package/dist/components/FilterBar/utils/storage-adapter.d.ts +2 -0
  15. package/dist/components/TableLayout/ColumnMenu.d.ts +15 -0
  16. package/dist/components/TableLayout/TableLayout.d.ts +4 -0
  17. package/dist/components/TableLayout/hooks/useTableSortApiParams.d.ts +64 -0
  18. package/dist/components/TableLayout/index.d.ts +4 -0
  19. package/dist/components/TableLayout/types.d.ts +182 -0
  20. package/dist/components/index.d.ts +1 -1
  21. package/dist/index.cjs.js +43 -1
  22. package/dist/index.es.js +4098 -2675
  23. package/dist/index.umd.js +43 -1
  24. package/dist/style.css +1 -1
  25. package/package.json +3 -3
  26. package/dist/components/DataGrid/DataGrid.d.ts +0 -4
  27. package/dist/components/DataGrid/index.d.ts +0 -2
  28. package/dist/components/DataGrid/types.d.ts +0 -66
@@ -0,0 +1,182 @@
1
+ import { ReactNode } from 'react';
2
+ import { IconName } from '@starasia/icon';
3
+
4
+ export interface TableLayoutRowAction<T> {
5
+ key: string;
6
+ /** icon dari @starasia/icon (opsional) */
7
+ icon?: IconName;
8
+ /** teks tombol (mobile + kebab) + aria-label */
9
+ label: string;
10
+ /** Tooltip saat hover tombol. Default tidak ada tooltip — harus diset eksplisit. */
11
+ tooltip?: string;
12
+ /** Tampilkan teks label di sebelah icon (default false = icon only) */
13
+ showLabel?: boolean;
14
+ onClick: (row: T, index: number) => void;
15
+ /** return true → action tidak tampil untuk row ini */
16
+ hidden?: (row: T) => boolean;
17
+ /** return true → tombol dinonaktifkan */
18
+ disabled?: (row: T) => boolean;
19
+ /**
20
+ * Variant Button dari @starasia/button (default 'tertiary').
21
+ * Gunakan 'tertiary' untuk aksi normal, sesuaikan untuk aksi utama/destruktif.
22
+ */
23
+ variant?: 'primary' | 'secondary' | 'tertiary' | 'outline' | 'link';
24
+ /**
25
+ * Tone/warna Button dari @starasia/button.
26
+ * Contoh: 'error' untuk hapus, 'success' untuk approve.
27
+ */
28
+ tone?: 'brand' | 'error' | 'success' | 'info' | 'neutral' | 'warning';
29
+ }
30
+ export type TableLayoutAlign = 'left' | 'center' | 'right';
31
+ export type TableLayoutSortDirection = 'asc' | 'desc';
32
+ export interface TableLayoutSort {
33
+ /** key kolom yang di-sort */
34
+ key: string;
35
+ direction: TableLayoutSortDirection;
36
+ }
37
+ /**
38
+ * Atribut span/skip untuk satu cell body (kasus merge / rowspan-colspan).
39
+ * Consumer yang menghitung merge-nya; TableLayout hanya menerapkan.
40
+ */
41
+ export interface TableLayoutCellProps {
42
+ colSpan?: number;
43
+ rowSpan?: number;
44
+ /** kalau true, `<td>` tidak dirender (tertutup span dari sel lain) */
45
+ hidden?: boolean;
46
+ }
47
+ export interface TableLayoutColumn<T> {
48
+ /**
49
+ * Identitas stabil kolom — dipakai untuk hide/show & reorder.
50
+ * Kalau kosong, fallback ke `accessor` (string), lalu ke index.
51
+ */
52
+ key?: string;
53
+ /** key pada row untuk ambil nilai otomatis; abaikan kalau pakai `render` */
54
+ accessor?: keyof T | (string & {});
55
+ /** judul kolom di header */
56
+ title: ReactNode;
57
+ /** icon di sebelah kiri judul header (otomatis 16×16) */
58
+ icon?: IconName;
59
+ /** custom render isi cell; menang atas `accessor` */
60
+ render?: (row: T, rowIndex: number, data: T[]) => ReactNode;
61
+ /** perataan header + cell (default 'left') */
62
+ align?: TableLayoutAlign;
63
+ /** lebar awal kolom, mis. '200px' | 160 */
64
+ width?: string | number;
65
+ /** lebar minimum saat di-resize (px) */
66
+ minWidth?: number;
67
+ /** override resize per kolom; default ikut prop `resizable` di TableLayout */
68
+ resizable?: boolean;
69
+ /** boleh di-sort lewat menu kolom (default true bila ada accessor/sortKey) */
70
+ sortable?: boolean;
71
+ /** sumber nilai untuk sort kalau beda dari `accessor` (mis. kolom `render`) */
72
+ sortKey?: keyof T;
73
+ /** sembunyikan menu kolom (Ascending/Descending/Freeze/Hide) di kolom ini */
74
+ disableMenu?: boolean;
75
+ /** kolom terkunci — tidak bisa di-hide (item "Hide column" disembunyikan) */
76
+ locked?: boolean;
77
+ /**
78
+ * Jadi headline di layout mobile (judul kartu / teks utama baris collapsed).
79
+ * Kalau tidak ada kolom yang ditandai, fallback ke kolom pertama.
80
+ */
81
+ primary?: boolean;
82
+ /** sembunyikan kolom ini sepenuhnya saat layout mobile */
83
+ hideOnMobile?: boolean;
84
+ /**
85
+ * Grouped header: kalau diisi, kolom ini jadi GRUP (accessor/render diabaikan)
86
+ * dan `children` adalah leaf-column yang menyetir body. Mendukung 1 tingkat grup.
87
+ * Catatan: saat ada grup, resize & persist-width otomatis non-aktif.
88
+ */
89
+ children?: TableLayoutColumn<T>[];
90
+ /**
91
+ * Merge sel body (rowspan/colspan). Dipanggil per baris; kembalikan
92
+ * `{ colSpan, rowSpan, hidden }`. Tandai `hidden: true` pada sel yang
93
+ * tertutup oleh span sel lain. Diabaikan di layout mobile.
94
+ */
95
+ cellProps?: (row: T, rowIndex: number, data: T[]) => TableLayoutCellProps;
96
+ }
97
+ /**
98
+ * State visibility + urutan kolom. Bentuknya kompatibel dengan `ColumnPrefState`
99
+ * yang di-emit `FilterBar.onColumnsChange`, jadi bisa langsung disambungkan.
100
+ */
101
+ export interface TableLayoutColumnState {
102
+ /** urutan key kolom (boleh subset / lengkap) */
103
+ order?: string[];
104
+ /** key kolom yang disembunyikan */
105
+ hidden?: string[];
106
+ /**
107
+ * Freeze "sampai kolom ini": semua leaf dari kiri s/d key ini dipin (sticky kiri).
108
+ * Kosong = tidak ada yang dibekukan.
109
+ */
110
+ frozenKey?: string;
111
+ }
112
+ export interface TableLayoutProps<T> {
113
+ /** definisi kolom (wajib) */
114
+ columns: TableLayoutColumn<T>[];
115
+ /** baris data (wajib) */
116
+ data: T[];
117
+ /**
118
+ * Action buttons per baris — muncul sebagai overlay di atas row saat hover
119
+ * (Desktop/pointer: tersembunyi, fade-in saat hover · Touch: selalu terlihat).
120
+ * ≤ 5 visible action → icon buttons inline.
121
+ * > 5 visible action → kebab menu ⋮.
122
+ */
123
+ rowActions?: TableLayoutRowAction<T>[];
124
+ /** key unik per row; default pakai index */
125
+ getRowKey?: (row: T, index: number) => string | number;
126
+ /** padding scale, diteruskan ke primitif Table (default 'md') */
127
+ size?: 'sm' | 'md' | 'lg' | 'xl';
128
+ /** aktifkan drag-resize lebar kolom (default false) */
129
+ resizable?: boolean;
130
+ /**
131
+ * Kalau diisi, lebar hasil resize dipersist ke localStorage dengan key ini
132
+ * (lewat `useColumnWidths`) dan dipulihkan saat reload.
133
+ */
134
+ widthStorageKey?: string;
135
+ /**
136
+ * Visibility, urutan, & freeze kolom. Controlled bila diisi (sambungkan dari
137
+ * `FilterBar.onColumnsChange` + `onColumnStateChange`); kalau tidak, TableLayout
138
+ * kelola sendiri (uncontrolled).
139
+ */
140
+ columnState?: TableLayoutColumnState;
141
+ /** dipanggil saat hide/freeze dari menu kolom mengubah state */
142
+ onColumnStateChange?: (state: TableLayoutColumnState) => void;
143
+ /**
144
+ * Tampilkan menu kolom di header (Ascending, Descending, Freeze, Hide column).
145
+ * Muncul saat hover / saat salah satu item aktif.
146
+ */
147
+ columnMenu?: boolean;
148
+ /**
149
+ * Sort aktif (controlled). Kalau `onSortChange` diisi → mode server (TableLayout
150
+ * tidak mengurutkan data sendiri, hanya emit). Tanpa `onSortChange` → client-side.
151
+ */
152
+ sort?: TableLayoutSort | null;
153
+ /** sort awal (uncontrolled) */
154
+ defaultSort?: TableLayoutSort | null;
155
+ /** dipanggil saat sort berubah; keberadaannya mengaktifkan mode server */
156
+ onSortChange?: (sort: TableLayoutSort | null) => void;
157
+ /**
158
+ * Tinggi area tabel. Default: mengisi sampai bawah layar
159
+ * (`calc(100vh - posisiAtas)`, ikut menyesuaikan saat window di-resize).
160
+ * Override bebas oleh consumer, mis. '60vh' | 480 | '100%'.
161
+ * Area selalu scrollable (vertikal & horizontal) dan header sticky.
162
+ */
163
+ height?: string | number;
164
+ /**
165
+ * Layout saat layar < `mobileBreakpoint`:
166
+ * - 'cards' : tiap row jadi kartu (label : value bertumpuk) — default
167
+ * - 'expand' : list ringkas (kolom `primary`) + tap untuk memuai detail
168
+ * - 'scroll' : tetap tabel dengan horizontal scroll
169
+ */
170
+ mobileLayout?: 'cards' | 'expand' | 'scroll';
171
+ /** titik switch ke layout mobile (default 'md' = < 768px) */
172
+ mobileBreakpoint?: 'sm' | 'md';
173
+ /**
174
+ * Baris pemisah full-width sebelum `row` (mis. grup separator "— Jakarta —").
175
+ * Kembalikan `null` kalau tidak ada separator untuk baris itu.
176
+ */
177
+ groupSeparator?: (row: T, index: number, prevRow: T | undefined) => ReactNode | null;
178
+ /** baris summary/total full-width di paling bawah body */
179
+ summary?: ReactNode;
180
+ /** ditampilkan saat `data` kosong */
181
+ emptyState?: ReactNode;
182
+ }
@@ -13,7 +13,7 @@ export * from './Section';
13
13
  export * from './AdvanceFilterBar';
14
14
  export * from './FilterBar';
15
15
  export * from './TableSection';
16
- export * from './DataGrid';
16
+ export * from './TableLayout';
17
17
  export * from './EachUtils';
18
18
  export * from './DecisionWrapper';
19
19
  export * from './Form';