@haneinfo/frontend-admin 0.0.0-stage → 0.2.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/LICENSE ADDED
@@ -0,0 +1,14 @@
1
+ Copyright (c) 2026 Haneinfo. All Rights Reserved.
2
+
3
+ This software and associated documentation files (the "Software") are the proprietary and
4
+ confidential property of Haneinfo. No part of the Software may be copied, modified, merged,
5
+ published, distributed, sublicensed, or sold without the prior written permission of Haneinfo.
6
+
7
+ The Software is provided for internal use by Haneinfo and its authorized personnel only, and is
8
+ NOT licensed for external distribution or open-source use.
9
+
10
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
11
+ NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
12
+ NONINFRINGEMENT. IN NO EVENT SHALL HANEINFO BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
13
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH
14
+ THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,8 @@
1
- # Temporary Holding Version
1
+ # @haneinfo/frontend-admin
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Shared server-side composition for the users, roles, API keys, and plugins dashboard pages.
4
+ Import `@haneinfo/frontend-admin/server` and pass App-specific translation functions, API fetch,
5
+ Next Link, and server actions. Next `app/` route files remain thin entry points in each App.
6
+
7
+ This package sits above `frontend-shell` and the feature packages because those packages already
8
+ depend on `frontend-shell`. Keeping the page layer separate avoids a dependency cycle.
@@ -0,0 +1,18 @@
1
+ import { type CreateUserDialogProps, type ImportUsersDialogProps, type UsersTableKey, type UsersTableProps } from '@haneinfo/identity-core/frontend';
2
+ import { type ApiKeysTableKey, type ApiKeysTableProps, type CreateApiKeyDialogProps } from '@haneinfo/m2m-api-key/frontend';
3
+ import { type CreateRoleDialogProps, type RolesTableKey, type RolesTableProps } from '@haneinfo/rbac/frontend';
4
+ type ClientTableProps<T, K extends string> = Omit<T, 'LinkComponent' | 'buildSortHref' | 't'> & {
5
+ search: string;
6
+ labels: Record<K, string>;
7
+ };
8
+ export declare function UsersTableClient({ search, labels, ...props }: ClientTableProps<UsersTableProps, UsersTableKey>): import("react").JSX.Element;
9
+ export declare function RolesTableClient({ search, labels, enumLabels, ...props }: ClientTableProps<Omit<RolesTableProps, 'renderEnumLabel'>, RolesTableKey> & {
10
+ enumLabels: Record<'PermissionPolicy' | 'Permission', Record<string, string>>;
11
+ }): import("react").JSX.Element;
12
+ export declare function ApiKeysTableClient({ search, labels, ...props }: ClientTableProps<ApiKeysTableProps, ApiKeysTableKey>): import("react").JSX.Element;
13
+ export declare function CreateRoleDialogClient(props: CreateRoleDialogProps): import("react").JSX.Element;
14
+ export declare function CreateApiKeyDialogClient(props: CreateApiKeyDialogProps): import("react").JSX.Element;
15
+ export declare function CreateUserDialogClient(props: CreateUserDialogProps): import("react").JSX.Element;
16
+ export declare function ImportUsersDialogClient(props: ImportUsersDialogProps): import("react").JSX.Element;
17
+ export {};
18
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.tsx"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,qBAAqB,EAE1B,KAAK,sBAAsB,EAE3B,KAAK,aAAa,EAClB,KAAK,eAAe,EACrB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAEL,KAAK,eAAe,EACpB,KAAK,iBAAiB,EAEtB,KAAK,uBAAuB,EAC7B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAEL,KAAK,qBAAqB,EAE1B,KAAK,aAAa,EAClB,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAC;AAGjC,KAAK,gBAAgB,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,IAAI,IAAI,CAAC,CAAC,EAAE,eAAe,GAAG,eAAe,GAAG,GAAG,CAAC,GAAG;IAC9F,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;CAC3B,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,MAAM,EACN,GAAG,KAAK,EACT,EAAE,gBAAgB,CAAC,eAAe,EAAE,aAAa,CAAC,+BASlD;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,MAAM,EACN,UAAU,EACV,GAAG,KAAK,EACT,EAAE,gBAAgB,CAAC,IAAI,CAAC,eAAe,EAAE,iBAAiB,CAAC,EAAE,aAAa,CAAC,GAAG;IAC7E,UAAU,EAAE,MAAM,CAAC,kBAAkB,GAAG,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC/E,+BAUA;AAED,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,MAAM,EACN,GAAG,KAAK,EACT,EAAE,gBAAgB,CAAC,iBAAiB,EAAE,eAAe,CAAC,+BAStD;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,qBAAqB,+BAElE;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,uBAAuB,+BAEtE;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,qBAAqB,+BAElE;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,sBAAsB,+BAEpE"}
package/dist/client.js ADDED
@@ -0,0 +1,29 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { buildSortHref } from '@haneinfo/frontend-shell';
4
+ import { CreateUserDialog, ImportUsersDialog, UsersTable, } from '@haneinfo/identity-core/frontend';
5
+ import { ApiKeysTable, CreateApiKeyDialog, } from '@haneinfo/m2m-api-key/frontend';
6
+ import { CreateRoleDialog, RolesTable, } from '@haneinfo/rbac/frontend';
7
+ import Link from 'next/link';
8
+ export function UsersTableClient({ search, labels, ...props }) {
9
+ return (_jsx(UsersTable, { ...props, LinkComponent: Link, buildSortHref: (field, order) => buildSortHref({ search }, field, order), t: (key) => labels[key] }));
10
+ }
11
+ export function RolesTableClient({ search, labels, enumLabels, ...props }) {
12
+ return (_jsx(RolesTable, { ...props, LinkComponent: Link, buildSortHref: (field, order) => buildSortHref({ search }, field, order), t: (key) => labels[key], renderEnumLabel: (kind, value) => enumLabels[kind][value] ?? value }));
13
+ }
14
+ export function ApiKeysTableClient({ search, labels, ...props }) {
15
+ return (_jsx(ApiKeysTable, { ...props, LinkComponent: Link, buildSortHref: (field, order) => buildSortHref({ search }, field, order), t: (key) => labels[key] }));
16
+ }
17
+ export function CreateRoleDialogClient(props) {
18
+ return _jsx(CreateRoleDialog, { ...props });
19
+ }
20
+ export function CreateApiKeyDialogClient(props) {
21
+ return _jsx(CreateApiKeyDialog, { ...props });
22
+ }
23
+ export function CreateUserDialogClient(props) {
24
+ return _jsx(CreateUserDialog, { ...props });
25
+ }
26
+ export function ImportUsersDialogClient(props) {
27
+ return _jsx(ImportUsersDialog, { ...props });
28
+ }
29
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EACL,gBAAgB,EAEhB,iBAAiB,EAEjB,UAAU,GAGX,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,YAAY,EAGZ,kBAAkB,GAEnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,gBAAgB,EAEhB,UAAU,GAGX,MAAM,yBAAyB,CAAC;AACjC,OAAO,IAAI,MAAM,WAAW,CAAC;AAO7B,MAAM,UAAU,gBAAgB,CAAC,EAC/B,MAAM,EACN,MAAM,EACN,GAAG,KAAK,EACyC;IACjD,OAAO,CACL,KAAC,UAAU,OACL,KAAK,EACT,aAAa,EAAE,IAAI,EACnB,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,EACxE,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GACvB,CACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,EAC/B,MAAM,EACN,MAAM,EACN,UAAU,EACV,GAAG,KAAK,EAGT;IACC,OAAO,CACL,KAAC,UAAU,OACL,KAAK,EACT,aAAa,EAAE,IAAI,EACnB,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,EACxE,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EACvB,eAAe,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,GAClE,CACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,EACjC,MAAM,EACN,MAAM,EACN,GAAG,KAAK,EAC6C;IACrD,OAAO,CACL,KAAC,YAAY,OACP,KAAK,EACT,aAAa,EAAE,IAAI,EACnB,aAAa,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,EACxE,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GACvB,CACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAA4B;IACjE,OAAO,KAAC,gBAAgB,OAAK,KAAK,GAAI,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAA8B;IACrE,OAAO,KAAC,kBAAkB,OAAK,KAAK,GAAI,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAA4B;IACjE,OAAO,KAAC,gBAAgB,OAAK,KAAK,GAAI,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAA6B;IACnE,OAAO,KAAC,iBAAiB,OAAK,KAAK,GAAI,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,47 @@
1
+ import 'server-only';
2
+ import { type SortableLinkComponent } from '@haneinfo/frontend-shell';
3
+ import { type CreateUserDialogProps, type ImportUsersDialogProps, type UsersTableProps } from '@haneinfo/identity-core/frontend';
4
+ import { type ApiKeysTableProps, type CreateApiKeyDialogProps } from '@haneinfo/m2m-api-key/frontend';
5
+ import { type CreateRoleDialogProps, type RolesTableProps } from '@haneinfo/rbac/frontend';
6
+ type ApiFetch = <T>(path: string) => Promise<T>;
7
+ type CommonKey = 'search' | 'previous' | 'next';
8
+ type CommonTranslation = (key: CommonKey) => string;
9
+ export interface AdminPageSearchParams {
10
+ page?: string;
11
+ search?: string;
12
+ sortField?: string;
13
+ sortOrder?: string;
14
+ }
15
+ export interface AdminPageBase {
16
+ searchParams: Promise<AdminPageSearchParams>;
17
+ apiFetch: ApiFetch;
18
+ LinkComponent: SortableLinkComponent;
19
+ tCommon: CommonTranslation;
20
+ }
21
+ export interface UsersAdminPageOptions extends AdminPageBase {
22
+ getCurrentUser: () => Promise<{
23
+ sub?: string;
24
+ } | null>;
25
+ tUsers: UsersTableProps['t'] & ((key: 'title' | 'searchPlaceholder' | 'pageInfo') => string);
26
+ actions: Pick<UsersTableProps, 'setUserActiveAction' | 'setUserServiceAccountAction' | 'updateUserRolesAction' | 'deleteUserAction'> &
27
+ /**
28
+ * Optional so an App that has not wired them yet keeps rendering exactly what it did before;
29
+ * each button appears only when its action is provided.
30
+ */
31
+ Partial<Pick<CreateUserDialogProps, 'createUserAction'> & Pick<ImportUsersDialogProps, 'importUsersAction'>>;
32
+ }
33
+ export declare function renderUsersAdminPage(options: UsersAdminPageOptions): Promise<import("react").JSX.Element>;
34
+ export interface RolesAdminPageOptions extends AdminPageBase {
35
+ tRoles: RolesTableProps['t'] & ((key: 'title' | 'searchPlaceholder' | 'pageInfo') => string);
36
+ enumLabel: (kind: 'PermissionPolicy' | 'Permission', value: string) => string;
37
+ actions: Pick<RolesTableProps, 'updateRoleAction' | 'deleteRoleAction'> & Pick<CreateRoleDialogProps, 'createRoleAction'>;
38
+ }
39
+ export declare function renderRolesAdminPage(options: RolesAdminPageOptions): Promise<import("react").JSX.Element>;
40
+ export interface ApiKeysAdminPageOptions extends AdminPageBase {
41
+ tApiKeys: ApiKeysTableProps['t'] & ((key: 'title' | 'searchPlaceholder' | 'pageInfo' | 'fullAccess') => string);
42
+ actions: Pick<ApiKeysTableProps, 'setApiKeyActiveAction' | 'deleteApiKeyAction' | 'updateApiKeyActingUserAction'> & Pick<CreateApiKeyDialogProps, 'createApiKeyAction'>;
43
+ }
44
+ export declare function renderApiKeysAdminPage(options: ApiKeysAdminPageOptions): Promise<import("react").JSX.Element>;
45
+ export declare function renderPluginsAdminPage(apiFetch: ApiFetch): Promise<import("react").JSX.Element>;
46
+ export {};
47
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.tsx"],"names":[],"mappings":"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"}
package/dist/server.js ADDED
@@ -0,0 +1,158 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import 'server-only';
3
+ import { buildListHref, formatPageInfo, ListPagination, ListSearchForm, PluginCatalogTable, parseSortOrder, } from '@haneinfo/frontend-shell';
4
+ import { ApiKeysTableClient, CreateApiKeyDialogClient, CreateRoleDialogClient, CreateUserDialogClient, ImportUsersDialogClient, RolesTableClient, UsersTableClient, } from './client.js';
5
+ async function listContext(searchParams) {
6
+ const { page: pageParam, search = '', sortField, sortOrder: sortOrderParam } = await searchParams;
7
+ const page = Number(pageParam) || 1;
8
+ const sortOrder = parseSortOrder(sortOrderParam);
9
+ const query = new URLSearchParams({ page: String(page), limit: '20' });
10
+ if (search)
11
+ query.set('search', search);
12
+ if (sortField)
13
+ query.set('sortField', sortField);
14
+ if (sortOrder)
15
+ query.set('sortOrder', sortOrder);
16
+ return { page, search, sortField, sortOrder, query };
17
+ }
18
+ function pageChrome(props) {
19
+ const totalPages = Math.max(1, Math.ceil(props.total / 20));
20
+ return (_jsxs("div", { className: "flex flex-col gap-4", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("h1", { className: "font-bold text-2xl tracking-tight", children: props.labels.title }), props.headingAction] }), _jsx(ListSearchForm, { defaultValue: props.search, placeholder: props.labels.searchPlaceholder, searchButtonText: props.tCommon('search') }, props.search), props.children, _jsx(ListPagination, { page: props.page, totalPages: totalPages, total: props.total, LinkComponent: props.LinkComponent, buildPageHref: (page) => buildListHref({ search: props.search, sortField: props.sortField, sortOrder: props.sortOrder }, page), previousText: props.tCommon('previous'), nextText: props.tCommon('next'), infoText: formatPageInfo(props.labels.pageInfo, {
21
+ page: props.page,
22
+ totalPages,
23
+ total: props.total,
24
+ }) })] }));
25
+ }
26
+ export async function renderUsersAdminPage(options) {
27
+ const { page, search, sortField, sortOrder, query } = await listContext(options.searchParams);
28
+ const [{ data: users, total }, roles, currentUser] = await Promise.all([
29
+ options.apiFetch(`/users?${query}`),
30
+ options.apiFetch('/roles/options'),
31
+ options.getCurrentUser(),
32
+ ]);
33
+ return pageChrome({
34
+ labels: {
35
+ title: options.tUsers('title'),
36
+ searchPlaceholder: options.tUsers('searchPlaceholder'),
37
+ pageInfo: options.tUsers('pageInfo'),
38
+ },
39
+ tCommon: options.tCommon,
40
+ LinkComponent: options.LinkComponent,
41
+ page,
42
+ total,
43
+ search,
44
+ sortField,
45
+ sortOrder,
46
+ headingAction: (options.actions.createUserAction || options.actions.importUsersAction) && (_jsxs("div", { className: "flex items-center gap-2", children: [options.actions.importUsersAction && (_jsx(ImportUsersDialogClient, { importUsersAction: options.actions.importUsersAction })), options.actions.createUserAction && (_jsx(CreateUserDialogClient, { roles: roles, createUserAction: options.actions.createUserAction }))] })),
47
+ children: (_jsx(UsersTableClient, { users: users, roles: roles, currentUserId: currentUser?.sub, sortField: sortField, sortOrder: sortOrder, search: search, labels: {
48
+ active: options.tUsers('active'),
49
+ email: options.tUsers('email'),
50
+ inactive: options.tUsers('inactive'),
51
+ name: options.tUsers('name'),
52
+ noUsers: options.tUsers('noUsers'),
53
+ roles: options.tUsers('roles'),
54
+ serviceAccount: options.tUsers('serviceAccount'),
55
+ status: options.tUsers('status'),
56
+ }, setUserActiveAction: options.actions.setUserActiveAction, setUserServiceAccountAction: options.actions.setUserServiceAccountAction, updateUserRolesAction: options.actions.updateUserRolesAction, deleteUserAction: options.actions.deleteUserAction })),
57
+ });
58
+ }
59
+ export async function renderRolesAdminPage(options) {
60
+ const { page, search, sortField, sortOrder, query } = await listContext(options.searchParams);
61
+ const { data: roles, total } = await options.apiFetch(`/roles?${query}`);
62
+ const meta = await options.apiFetch('/metadata/schema');
63
+ const permissionPolicyOptions = meta.enums
64
+ .find((item) => item.name === 'PermissionPolicy')
65
+ ?.values.map((value) => value.name);
66
+ const permissionOptions = meta.enums
67
+ .find((item) => item.name === 'Permission')
68
+ ?.values.map((value) => value.name);
69
+ if (!permissionPolicyOptions || !permissionOptions)
70
+ throw new Error('Missing PermissionPolicy or Permission enum metadata from /metadata/schema');
71
+ const policyOptionsWithLabels = permissionPolicyOptions.map((value) => ({
72
+ value,
73
+ label: options.enumLabel('PermissionPolicy', value),
74
+ }));
75
+ const permissionOptionsWithLabels = permissionOptions.map((value) => ({
76
+ value,
77
+ label: options.enumLabel('Permission', value),
78
+ }));
79
+ const enumLabels = {
80
+ PermissionPolicy: Object.fromEntries(policyOptionsWithLabels.map(({ value, label }) => [value, label])),
81
+ Permission: Object.fromEntries(permissionOptionsWithLabels.map(({ value, label }) => [value, label])),
82
+ };
83
+ return pageChrome({
84
+ labels: {
85
+ title: options.tRoles('title'),
86
+ searchPlaceholder: options.tRoles('searchPlaceholder'),
87
+ pageInfo: options.tRoles('pageInfo'),
88
+ },
89
+ tCommon: options.tCommon,
90
+ LinkComponent: options.LinkComponent,
91
+ page,
92
+ total,
93
+ search,
94
+ sortField,
95
+ sortOrder,
96
+ headingAction: (_jsx(CreateRoleDialogClient, { policyOptions: policyOptionsWithLabels, permissionOptions: permissionOptionsWithLabels, createRoleAction: options.actions.createRoleAction })),
97
+ children: (_jsx(RolesTableClient, { roles: roles, policyOptions: permissionPolicyOptions, permissionOptions: permissionOptions, sortField: sortField, sortOrder: sortOrder, search: search, labels: {
98
+ apiKeys: options.tRoles('apiKeys'),
99
+ name: options.tRoles('name'),
100
+ noRoles: options.tRoles('noRoles'),
101
+ permissions: options.tRoles('permissions'),
102
+ policy: options.tRoles('policy'),
103
+ systemBadge: options.tRoles('systemBadge'),
104
+ systemRoleDeleteWarning: options.tRoles('systemRoleDeleteWarning'),
105
+ users: options.tRoles('users'),
106
+ }, enumLabels: enumLabels, updateRoleAction: options.actions.updateRoleAction, deleteRoleAction: options.actions.deleteRoleAction })),
107
+ });
108
+ }
109
+ export async function renderApiKeysAdminPage(options) {
110
+ const { page, search, sortField, sortOrder, query } = await listContext(options.searchParams);
111
+ const [{ data: apiKeys, total }, roles, { data: users }, meta] = await Promise.all([
112
+ options.apiFetch(`/api-keys?${query}`),
113
+ options.apiFetch('/roles/options'),
114
+ options.apiFetch('/users?limit=100'),
115
+ options.apiFetch('/metadata/schema'),
116
+ ]);
117
+ const serviceAccounts = users
118
+ .filter((user) => user.isServiceAccount)
119
+ .map(({ id, email, name }) => ({ id, email, name }));
120
+ const scopeOptions = [
121
+ { value: '*', label: options.tApiKeys('fullAccess') },
122
+ ...meta.availableScopes.map((scope) => ({ value: scope, label: scope })),
123
+ ];
124
+ return pageChrome({
125
+ labels: {
126
+ title: options.tApiKeys('title'),
127
+ searchPlaceholder: options.tApiKeys('searchPlaceholder'),
128
+ pageInfo: options.tApiKeys('pageInfo'),
129
+ },
130
+ tCommon: options.tCommon,
131
+ LinkComponent: options.LinkComponent,
132
+ page,
133
+ total,
134
+ search,
135
+ sortField,
136
+ sortOrder,
137
+ headingAction: (_jsx(CreateApiKeyDialogClient, { roles: roles, serviceAccounts: serviceAccounts, scopeOptions: scopeOptions, createApiKeyAction: options.actions.createApiKeyAction })),
138
+ children: (_jsx(ApiKeysTableClient, { apiKeys: apiKeys, serviceAccounts: serviceAccounts, sortField: sortField, sortOrder: sortOrder, search: search, labels: {
139
+ actingUser: options.tApiKeys('actingUser'),
140
+ actingUserNone: options.tApiKeys('actingUserNone'),
141
+ active: options.tApiKeys('active'),
142
+ inactive: options.tApiKeys('inactive'),
143
+ key: options.tApiKeys('key'),
144
+ lastUsed: options.tApiKeys('lastUsed'),
145
+ name: options.tApiKeys('name'),
146
+ never: options.tApiKeys('never'),
147
+ noApiKeys: options.tApiKeys('noApiKeys'),
148
+ role: options.tApiKeys('role'),
149
+ scopes: options.tApiKeys('scopes'),
150
+ status: options.tApiKeys('status'),
151
+ }, setApiKeyActiveAction: options.actions.setApiKeyActiveAction, deleteApiKeyAction: options.actions.deleteApiKeyAction, updateApiKeyActingUserAction: options.actions.updateApiKeyActingUserAction })),
152
+ });
153
+ }
154
+ export async function renderPluginsAdminPage(apiFetch) {
155
+ const catalog = await apiFetch('/admin/plugins');
156
+ return (_jsx("div", { className: "flex flex-col gap-4", children: _jsx(PluginCatalogTable, { catalog: catalog }) }));
157
+ }
158
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,52 @@
1
1
  {
2
2
  "name": "@haneinfo/frontend-admin",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.2.0",
4
+ "private": false,
5
+ "type": "module",
6
+ "description": "Shared Haneinfo admin page composition",
7
+ "files": [
8
+ "dist",
9
+ "README.md"
10
+ ],
11
+ "exports": {
12
+ "./server": {
13
+ "types": "./dist/server.d.ts",
14
+ "default": "./dist/server.js"
15
+ }
16
+ },
17
+ "dependencies": {
18
+ "server-only": "^0.0.1",
19
+ "@haneinfo/frontend-shell": "1.2.0",
20
+ "@haneinfo/identity-core": "4.2.0",
21
+ "@haneinfo/rbac": "7.0.4",
22
+ "@haneinfo/m2m-api-key": "8.0.4"
23
+ },
24
+ "peerDependencies": {
25
+ "next": "^16.0.0",
26
+ "react": "^19.0.0",
27
+ "react-dom": "^19.0.0"
28
+ },
29
+ "devDependencies": {
30
+ "@types/node": "^24.13.0",
31
+ "@types/react": "^19.2.17",
32
+ "@types/react-dom": "^19.2.3",
33
+ "next": "^16.3.1",
34
+ "react": "^19.2.7",
35
+ "react-dom": "^19.2.7",
36
+ "typescript": "^5.9.3",
37
+ "vitest": "^4.1.11"
38
+ },
39
+ "engines": {
40
+ "node": ">=22.0.0"
41
+ },
42
+ "license": "UNLICENSED",
43
+ "publishConfig": {
44
+ "registry": "https://registry.npmjs.org/",
45
+ "access": "public"
46
+ },
47
+ "scripts": {
48
+ "build": "tsc -p tsconfig.build.json",
49
+ "typecheck": "tsc --noEmit",
50
+ "test": "vitest run"
51
+ }
6
52
  }