@sudobility/entity_pages 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +30 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/pages/EntityListPage.cjs +58 -0
- package/dist/pages/EntityListPage.d.ts +19 -0
- package/dist/pages/EntityListPage.d.ts.map +1 -0
- package/dist/pages/EntityListPage.js +55 -0
- package/dist/pages/EntityListPage.js.map +1 -0
- package/dist/pages/InvitationsPage.cjs +42 -0
- package/dist/pages/InvitationsPage.d.ts +16 -0
- package/dist/pages/InvitationsPage.d.ts.map +1 -0
- package/dist/pages/InvitationsPage.js +39 -0
- package/dist/pages/InvitationsPage.js.map +1 -0
- package/dist/pages/MembersManagementPage.cjs +76 -0
- package/dist/pages/MembersManagementPage.d.ts +19 -0
- package/dist/pages/MembersManagementPage.d.ts.map +1 -0
- package/dist/pages/MembersManagementPage.js +73 -0
- package/dist/pages/MembersManagementPage.js.map +1 -0
- package/dist/pages/index.cjs +13 -0
- package/dist/pages/index.d.ts +7 -0
- package/dist/pages/index.d.ts.map +1 -0
- package/dist/pages/index.js +7 -0
- package/dist/pages/index.js.map +1 -0
- package/dist/pages/index.test.cjs +38 -0
- package/dist/pages/index.test.d.ts +5 -0
- package/dist/pages/index.test.d.ts.map +1 -0
- package/dist/pages/index.test.js +36 -0
- package/dist/pages/index.test.js.map +1 -0
- package/package.json +57 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Entity Pages Library
|
|
4
|
+
* @description Page containers for entity/organization management
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```tsx
|
|
8
|
+
* import {
|
|
9
|
+
* EntityListPage,
|
|
10
|
+
* MembersManagementPage,
|
|
11
|
+
* InvitationsPage,
|
|
12
|
+
* } from '@sudobility/entity_pages';
|
|
13
|
+
*
|
|
14
|
+
* function WorkspacesRoute() {
|
|
15
|
+
* return (
|
|
16
|
+
* <EntityListPage
|
|
17
|
+
* client={entityClient}
|
|
18
|
+
* onSelectEntity={handleSelectEntity}
|
|
19
|
+
* />
|
|
20
|
+
* );
|
|
21
|
+
* }
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.InvitationsPage = exports.MembersManagementPage = exports.EntityListPage = void 0;
|
|
26
|
+
var pages_1 = require("./pages");
|
|
27
|
+
Object.defineProperty(exports, "EntityListPage", { enumerable: true, get: function () { return pages_1.EntityListPage; } });
|
|
28
|
+
Object.defineProperty(exports, "MembersManagementPage", { enumerable: true, get: function () { return pages_1.MembersManagementPage; } });
|
|
29
|
+
Object.defineProperty(exports, "InvitationsPage", { enumerable: true, get: function () { return pages_1.InvitationsPage; } });
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Entity Pages Library
|
|
3
|
+
* @description Page containers for entity/organization management
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```tsx
|
|
7
|
+
* import {
|
|
8
|
+
* EntityListPage,
|
|
9
|
+
* MembersManagementPage,
|
|
10
|
+
* InvitationsPage,
|
|
11
|
+
* } from '@sudobility/entity_pages';
|
|
12
|
+
*
|
|
13
|
+
* function WorkspacesRoute() {
|
|
14
|
+
* return (
|
|
15
|
+
* <EntityListPage
|
|
16
|
+
* client={entityClient}
|
|
17
|
+
* onSelectEntity={handleSelectEntity}
|
|
18
|
+
* />
|
|
19
|
+
* );
|
|
20
|
+
* }
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export { EntityListPage, type EntityListPageProps, MembersManagementPage, type MembersManagementPageProps, InvitationsPage, type InvitationsPageProps, } from './pages';
|
|
24
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EACL,cAAc,EACd,KAAK,mBAAmB,EACxB,qBAAqB,EACrB,KAAK,0BAA0B,EAC/B,eAAe,EACf,KAAK,oBAAoB,GAC1B,MAAM,SAAS,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Entity Pages Library
|
|
3
|
+
* @description Page containers for entity/organization management
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* ```tsx
|
|
7
|
+
* import {
|
|
8
|
+
* EntityListPage,
|
|
9
|
+
* MembersManagementPage,
|
|
10
|
+
* InvitationsPage,
|
|
11
|
+
* } from '@sudobility/entity_pages';
|
|
12
|
+
*
|
|
13
|
+
* function WorkspacesRoute() {
|
|
14
|
+
* return (
|
|
15
|
+
* <EntityListPage
|
|
16
|
+
* client={entityClient}
|
|
17
|
+
* onSelectEntity={handleSelectEntity}
|
|
18
|
+
* />
|
|
19
|
+
* );
|
|
20
|
+
* }
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export { EntityListPage, MembersManagementPage, InvitationsPage, } from './pages';
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EACL,cAAc,EAEd,qBAAqB,EAErB,eAAe,GAEhB,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EntityListPage = EntityListPage;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
/**
|
|
6
|
+
* @fileoverview Entity List Page
|
|
7
|
+
* @description Page container for listing all user's entities
|
|
8
|
+
*/
|
|
9
|
+
const react_1 = require("react");
|
|
10
|
+
const lucide_react_1 = require("lucide-react");
|
|
11
|
+
const entity_components_1 = require("@sudobility/entity-components");
|
|
12
|
+
const entity_client_1 = require("@sudobility/entity_client");
|
|
13
|
+
/**
|
|
14
|
+
* Page for listing all user's entities with create functionality.
|
|
15
|
+
*/
|
|
16
|
+
function EntityListPage({ client, onSelectEntity, }) {
|
|
17
|
+
const [showCreateForm, setShowCreateForm] = (0, react_1.useState)(false);
|
|
18
|
+
const [createFormData, setCreateFormData] = (0, react_1.useState)({
|
|
19
|
+
displayName: '',
|
|
20
|
+
description: '',
|
|
21
|
+
});
|
|
22
|
+
const [createError, setCreateError] = (0, react_1.useState)(null);
|
|
23
|
+
const { data: entities = [], isLoading } = (0, entity_client_1.useEntities)(client);
|
|
24
|
+
const createEntity = (0, entity_client_1.useCreateEntity)(client);
|
|
25
|
+
const personalEntities = entities.filter(e => e.entityType === 'personal');
|
|
26
|
+
const organizationEntities = entities.filter(e => e.entityType === 'organization');
|
|
27
|
+
const handleCreateSubmit = async (e) => {
|
|
28
|
+
e.preventDefault();
|
|
29
|
+
setCreateError(null);
|
|
30
|
+
if (!createFormData.displayName.trim()) {
|
|
31
|
+
setCreateError('Display name is required');
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
await createEntity.mutateAsync({
|
|
36
|
+
displayName: createFormData.displayName.trim(),
|
|
37
|
+
description: createFormData.description.trim() || undefined,
|
|
38
|
+
});
|
|
39
|
+
setShowCreateForm(false);
|
|
40
|
+
setCreateFormData({ displayName: '', description: '' });
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
setCreateError(err.message || 'Failed to create organization');
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "space-y-8", children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("h1", { className: "text-2xl font-bold text-foreground", children: "Workspaces" }), (0, jsx_runtime_1.jsx)("p", { className: "text-muted-foreground", children: "Manage your personal and organization workspaces" })] }), (0, jsx_runtime_1.jsxs)("button", { type: "button", onClick: () => setShowCreateForm(true), className: "flex items-center gap-2 px-4 py-2 rounded-lg bg-primary text-primary-foreground font-medium hover:bg-primary/90 transition-colors", children: [(0, jsx_runtime_1.jsx)(lucide_react_1.Plus, { className: "h-4 w-4" }), (0, jsx_runtime_1.jsx)("span", { children: "New Organization" })] })] }), showCreateForm && ((0, jsx_runtime_1.jsx)("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-black/50", children: (0, jsx_runtime_1.jsxs)("div", { className: "w-full max-w-md rounded-lg bg-background p-6 shadow-lg", children: [(0, jsx_runtime_1.jsx)("h2", { className: "text-lg font-semibold mb-4", children: "Create Organization" }), (0, jsx_runtime_1.jsxs)("form", { onSubmit: handleCreateSubmit, className: "space-y-4", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { className: "block text-sm font-medium mb-1", children: "Display Name" }), (0, jsx_runtime_1.jsx)("input", { type: "text", value: createFormData.displayName, onChange: e => setCreateFormData(prev => ({
|
|
47
|
+
...prev,
|
|
48
|
+
displayName: e.target.value,
|
|
49
|
+
})), placeholder: "My Organization", className: "w-full px-3 py-2 rounded-lg border bg-background focus:outline-none focus:ring-2 focus:ring-primary" })] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { className: "block text-sm font-medium mb-1", children: "Description (optional)" }), (0, jsx_runtime_1.jsx)("textarea", { value: createFormData.description, onChange: e => setCreateFormData(prev => ({
|
|
50
|
+
...prev,
|
|
51
|
+
description: e.target.value,
|
|
52
|
+
})), placeholder: "What is this organization for?", rows: 3, className: "w-full px-3 py-2 rounded-lg border bg-background focus:outline-none focus:ring-2 focus:ring-primary resize-none" })] }), createError && ((0, jsx_runtime_1.jsx)("p", { className: "text-sm text-destructive", children: createError })), (0, jsx_runtime_1.jsxs)("div", { className: "flex justify-end gap-2", children: [(0, jsx_runtime_1.jsx)("button", { type: "button", onClick: () => {
|
|
53
|
+
setShowCreateForm(false);
|
|
54
|
+
setCreateFormData({ displayName: '', description: '' });
|
|
55
|
+
setCreateError(null);
|
|
56
|
+
}, className: "px-4 py-2 rounded-lg border hover:bg-muted transition-colors", children: "Cancel" }), (0, jsx_runtime_1.jsx)("button", { type: "submit", disabled: createEntity.isPending, className: "px-4 py-2 rounded-lg bg-primary text-primary-foreground font-medium hover:bg-primary/90 transition-colors disabled:opacity-50", children: createEntity.isPending ? 'Creating...' : 'Create' })] })] })] }) })), personalEntities.length > 0 && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("h2", { className: "text-lg font-semibold mb-3", children: "Personal Workspace" }), (0, jsx_runtime_1.jsx)(entity_components_1.EntityList, { entities: personalEntities, onSelect: onSelectEntity, isLoading: isLoading })] })), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("h2", { className: "text-lg font-semibold mb-3", children: "Organizations" }), organizationEntities.length === 0 && !isLoading ? ((0, jsx_runtime_1.jsxs)("div", { className: "text-center py-8 text-muted-foreground border border-dashed rounded-lg", children: [(0, jsx_runtime_1.jsx)("p", { children: "No organizations yet" }), (0, jsx_runtime_1.jsx)("button", { type: "button", onClick: () => setShowCreateForm(true), className: "mt-2 text-primary hover:underline", children: "Create your first organization" })] })) : ((0, jsx_runtime_1.jsx)(entity_components_1.EntityList, { entities: organizationEntities, onSelect: onSelectEntity, isLoading: isLoading }))] })] }));
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=EntityListPage.js.map
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Entity List Page
|
|
3
|
+
* @description Page container for listing all user's entities
|
|
4
|
+
*/
|
|
5
|
+
import { EntityClient } from '@sudobility/entity_client';
|
|
6
|
+
import type { EntityWithRole } from '@sudobility/types';
|
|
7
|
+
export interface EntityListPageProps {
|
|
8
|
+
/** Entity API client */
|
|
9
|
+
client: EntityClient;
|
|
10
|
+
/** Handler for selecting an entity */
|
|
11
|
+
onSelectEntity?: (entity: EntityWithRole) => void;
|
|
12
|
+
/** Handler for navigating to entity settings */
|
|
13
|
+
onNavigateToSettings?: (entitySlug: string) => void;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Page for listing all user's entities with create functionality.
|
|
17
|
+
*/
|
|
18
|
+
export declare function EntityListPage({ client, onSelectEntity, }: EntityListPageProps): import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
//# sourceMappingURL=EntityListPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntityListPage.d.ts","sourceRoot":"","sources":["../../src/pages/EntityListPage.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAGL,YAAY,EACb,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAExD,MAAM,WAAW,mBAAmB;IAClC,wBAAwB;IACxB,MAAM,EAAE,YAAY,CAAC;IACrB,sCAAsC;IACtC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;IAClD,gDAAgD;IAChD,oBAAoB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CACrD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,cAAc,GACf,EAAE,mBAAmB,2CAiKrB"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Entity List Page
|
|
4
|
+
* @description Page container for listing all user's entities
|
|
5
|
+
*/
|
|
6
|
+
import { useState } from 'react';
|
|
7
|
+
import { Plus } from 'lucide-react';
|
|
8
|
+
import { EntityList } from '@sudobility/entity-components';
|
|
9
|
+
import { useEntities, useCreateEntity, } from '@sudobility/entity_client';
|
|
10
|
+
/**
|
|
11
|
+
* Page for listing all user's entities with create functionality.
|
|
12
|
+
*/
|
|
13
|
+
export function EntityListPage({ client, onSelectEntity, }) {
|
|
14
|
+
const [showCreateForm, setShowCreateForm] = useState(false);
|
|
15
|
+
const [createFormData, setCreateFormData] = useState({
|
|
16
|
+
displayName: '',
|
|
17
|
+
description: '',
|
|
18
|
+
});
|
|
19
|
+
const [createError, setCreateError] = useState(null);
|
|
20
|
+
const { data: entities = [], isLoading } = useEntities(client);
|
|
21
|
+
const createEntity = useCreateEntity(client);
|
|
22
|
+
const personalEntities = entities.filter(e => e.entityType === 'personal');
|
|
23
|
+
const organizationEntities = entities.filter(e => e.entityType === 'organization');
|
|
24
|
+
const handleCreateSubmit = async (e) => {
|
|
25
|
+
e.preventDefault();
|
|
26
|
+
setCreateError(null);
|
|
27
|
+
if (!createFormData.displayName.trim()) {
|
|
28
|
+
setCreateError('Display name is required');
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
await createEntity.mutateAsync({
|
|
33
|
+
displayName: createFormData.displayName.trim(),
|
|
34
|
+
description: createFormData.description.trim() || undefined,
|
|
35
|
+
});
|
|
36
|
+
setShowCreateForm(false);
|
|
37
|
+
setCreateFormData({ displayName: '', description: '' });
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
setCreateError(err.message || 'Failed to create organization');
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
return (_jsxs("div", { className: "space-y-8", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-2xl font-bold text-foreground", children: "Workspaces" }), _jsx("p", { className: "text-muted-foreground", children: "Manage your personal and organization workspaces" })] }), _jsxs("button", { type: "button", onClick: () => setShowCreateForm(true), className: "flex items-center gap-2 px-4 py-2 rounded-lg bg-primary text-primary-foreground font-medium hover:bg-primary/90 transition-colors", children: [_jsx(Plus, { className: "h-4 w-4" }), _jsx("span", { children: "New Organization" })] })] }), showCreateForm && (_jsx("div", { className: "fixed inset-0 z-50 flex items-center justify-center bg-black/50", children: _jsxs("div", { className: "w-full max-w-md rounded-lg bg-background p-6 shadow-lg", children: [_jsx("h2", { className: "text-lg font-semibold mb-4", children: "Create Organization" }), _jsxs("form", { onSubmit: handleCreateSubmit, className: "space-y-4", children: [_jsxs("div", { children: [_jsx("label", { className: "block text-sm font-medium mb-1", children: "Display Name" }), _jsx("input", { type: "text", value: createFormData.displayName, onChange: e => setCreateFormData(prev => ({
|
|
44
|
+
...prev,
|
|
45
|
+
displayName: e.target.value,
|
|
46
|
+
})), placeholder: "My Organization", className: "w-full px-3 py-2 rounded-lg border bg-background focus:outline-none focus:ring-2 focus:ring-primary" })] }), _jsxs("div", { children: [_jsx("label", { className: "block text-sm font-medium mb-1", children: "Description (optional)" }), _jsx("textarea", { value: createFormData.description, onChange: e => setCreateFormData(prev => ({
|
|
47
|
+
...prev,
|
|
48
|
+
description: e.target.value,
|
|
49
|
+
})), placeholder: "What is this organization for?", rows: 3, className: "w-full px-3 py-2 rounded-lg border bg-background focus:outline-none focus:ring-2 focus:ring-primary resize-none" })] }), createError && (_jsx("p", { className: "text-sm text-destructive", children: createError })), _jsxs("div", { className: "flex justify-end gap-2", children: [_jsx("button", { type: "button", onClick: () => {
|
|
50
|
+
setShowCreateForm(false);
|
|
51
|
+
setCreateFormData({ displayName: '', description: '' });
|
|
52
|
+
setCreateError(null);
|
|
53
|
+
}, className: "px-4 py-2 rounded-lg border hover:bg-muted transition-colors", children: "Cancel" }), _jsx("button", { type: "submit", disabled: createEntity.isPending, className: "px-4 py-2 rounded-lg bg-primary text-primary-foreground font-medium hover:bg-primary/90 transition-colors disabled:opacity-50", children: createEntity.isPending ? 'Creating...' : 'Create' })] })] })] }) })), personalEntities.length > 0 && (_jsxs("div", { children: [_jsx("h2", { className: "text-lg font-semibold mb-3", children: "Personal Workspace" }), _jsx(EntityList, { entities: personalEntities, onSelect: onSelectEntity, isLoading: isLoading })] })), _jsxs("div", { children: [_jsx("h2", { className: "text-lg font-semibold mb-3", children: "Organizations" }), organizationEntities.length === 0 && !isLoading ? (_jsxs("div", { className: "text-center py-8 text-muted-foreground border border-dashed rounded-lg", children: [_jsx("p", { children: "No organizations yet" }), _jsx("button", { type: "button", onClick: () => setShowCreateForm(true), className: "mt-2 text-primary hover:underline", children: "Create your first organization" })] })) : (_jsx(EntityList, { entities: organizationEntities, onSelect: onSelectEntity, isLoading: isLoading }))] })] }));
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=EntityListPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EntityListPage.js","sourceRoot":"","sources":["../../src/pages/EntityListPage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InvitationsPage = InvitationsPage;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
/**
|
|
6
|
+
* @fileoverview Invitations Page
|
|
7
|
+
* @description Page for viewing and responding to pending invitations
|
|
8
|
+
*/
|
|
9
|
+
const entity_components_1 = require("@sudobility/entity-components");
|
|
10
|
+
const entity_client_1 = require("@sudobility/entity_client");
|
|
11
|
+
/**
|
|
12
|
+
* Page for viewing and responding to pending invitations.
|
|
13
|
+
*/
|
|
14
|
+
function InvitationsPage({ client, onInvitationAccepted, }) {
|
|
15
|
+
const { data: invitations = [], isLoading } = (0, entity_client_1.useMyInvitations)(client);
|
|
16
|
+
const acceptInvitation = (0, entity_client_1.useAcceptInvitation)(client);
|
|
17
|
+
const declineInvitation = (0, entity_client_1.useDeclineInvitation)(client);
|
|
18
|
+
const handleAccept = async (token) => {
|
|
19
|
+
try {
|
|
20
|
+
await acceptInvitation.mutateAsync(token);
|
|
21
|
+
onInvitationAccepted?.();
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
console.error('Failed to accept invitation:', err);
|
|
25
|
+
// TODO: Show toast notification
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
const handleDecline = async (token) => {
|
|
29
|
+
try {
|
|
30
|
+
await declineInvitation.mutateAsync(token);
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
console.error('Failed to decline invitation:', err);
|
|
34
|
+
// TODO: Show toast notification
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
const pendingCount = invitations.filter(inv => inv.status === 'pending').length;
|
|
38
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "space-y-6", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("h1", { className: "text-2xl font-bold text-foreground", children: "Invitations" }), (0, jsx_runtime_1.jsx)("p", { className: "text-muted-foreground", children: pendingCount > 0
|
|
39
|
+
? `You have ${pendingCount} pending invitation${pendingCount > 1 ? 's' : ''}`
|
|
40
|
+
: 'No pending invitations' })] }), (0, jsx_runtime_1.jsx)(entity_components_1.InvitationList, { invitations: invitations, mode: "user", onAccept: handleAccept, onDecline: handleDecline, isLoading: isLoading, emptyMessage: "You don't have any pending invitations" })] }));
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=InvitationsPage.js.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Invitations Page
|
|
3
|
+
* @description Page for viewing and responding to pending invitations
|
|
4
|
+
*/
|
|
5
|
+
import { EntityClient } from '@sudobility/entity_client';
|
|
6
|
+
export interface InvitationsPageProps {
|
|
7
|
+
/** Entity API client */
|
|
8
|
+
client: EntityClient;
|
|
9
|
+
/** Callback when an invitation is accepted */
|
|
10
|
+
onInvitationAccepted?: () => void;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Page for viewing and responding to pending invitations.
|
|
14
|
+
*/
|
|
15
|
+
export declare function InvitationsPage({ client, onInvitationAccepted, }: InvitationsPageProps): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
//# sourceMappingURL=InvitationsPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InvitationsPage.d.ts","sourceRoot":"","sources":["../../src/pages/InvitationsPage.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAIL,YAAY,EACb,MAAM,2BAA2B,CAAC;AAEnC,MAAM,WAAW,oBAAoB;IACnC,wBAAwB;IACxB,MAAM,EAAE,YAAY,CAAC;IACrB,8CAA8C;IAC9C,oBAAoB,CAAC,EAAE,MAAM,IAAI,CAAC;CACnC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,oBAAoB,GACrB,EAAE,oBAAoB,2CAiDtB"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Invitations Page
|
|
4
|
+
* @description Page for viewing and responding to pending invitations
|
|
5
|
+
*/
|
|
6
|
+
import { InvitationList } from '@sudobility/entity-components';
|
|
7
|
+
import { useMyInvitations, useAcceptInvitation, useDeclineInvitation, } from '@sudobility/entity_client';
|
|
8
|
+
/**
|
|
9
|
+
* Page for viewing and responding to pending invitations.
|
|
10
|
+
*/
|
|
11
|
+
export function InvitationsPage({ client, onInvitationAccepted, }) {
|
|
12
|
+
const { data: invitations = [], isLoading } = useMyInvitations(client);
|
|
13
|
+
const acceptInvitation = useAcceptInvitation(client);
|
|
14
|
+
const declineInvitation = useDeclineInvitation(client);
|
|
15
|
+
const handleAccept = async (token) => {
|
|
16
|
+
try {
|
|
17
|
+
await acceptInvitation.mutateAsync(token);
|
|
18
|
+
onInvitationAccepted?.();
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
console.error('Failed to accept invitation:', err);
|
|
22
|
+
// TODO: Show toast notification
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
const handleDecline = async (token) => {
|
|
26
|
+
try {
|
|
27
|
+
await declineInvitation.mutateAsync(token);
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
console.error('Failed to decline invitation:', err);
|
|
31
|
+
// TODO: Show toast notification
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
const pendingCount = invitations.filter(inv => inv.status === 'pending').length;
|
|
35
|
+
return (_jsxs("div", { className: "space-y-6", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-2xl font-bold text-foreground", children: "Invitations" }), _jsx("p", { className: "text-muted-foreground", children: pendingCount > 0
|
|
36
|
+
? `You have ${pendingCount} pending invitation${pendingCount > 1 ? 's' : ''}`
|
|
37
|
+
: 'No pending invitations' })] }), _jsx(InvitationList, { invitations: invitations, mode: "user", onAccept: handleAccept, onDecline: handleDecline, isLoading: isLoading, emptyMessage: "You don't have any pending invitations" })] }));
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=InvitationsPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InvitationsPage.js","sourceRoot":"","sources":["../../src/pages/InvitationsPage.tsx"],"names":[],"mappings":";AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,GAErB,MAAM,2BAA2B,CAAC;AASnC;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,EAC9B,MAAM,EACN,oBAAoB,GACC;IACrB,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,EAAE,EAAE,SAAS,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACvE,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAEvD,MAAM,YAAY,GAAG,KAAK,EAAE,KAAa,EAAE,EAAE;QAC3C,IAAI,CAAC;YACH,MAAM,gBAAgB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAC1C,oBAAoB,EAAE,EAAE,CAAC;QAC3B,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;YACnD,gCAAgC;QAClC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,KAAK,EAAE,KAAa,EAAE,EAAE;QAC5C,IAAI,CAAC;YACH,MAAM,iBAAiB,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;YACpD,gCAAgC;QAClC,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IAEhF,OAAO,CACL,eAAK,SAAS,EAAC,WAAW,aAExB,0BACE,aAAI,SAAS,EAAC,oCAAoC,4BAAiB,EACnE,YAAG,SAAS,EAAC,uBAAuB,YACjC,YAAY,GAAG,CAAC;4BACf,CAAC,CAAC,YAAY,YAAY,sBAAsB,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;4BAC7E,CAAC,CAAC,wBAAwB,GAC1B,IACA,EAGN,KAAC,cAAc,IACb,WAAW,EAAE,WAAW,EACxB,IAAI,EAAC,MAAM,EACX,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAE,aAAa,EACxB,SAAS,EAAE,SAAS,EACpB,YAAY,EAAC,wCAAwC,GACrD,IACE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MembersManagementPage = MembersManagementPage;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
/**
|
|
6
|
+
* @fileoverview Members Management Page
|
|
7
|
+
* @description Page container for managing entity members and invitations
|
|
8
|
+
*/
|
|
9
|
+
const entity_components_1 = require("@sudobility/entity-components");
|
|
10
|
+
const entity_client_1 = require("@sudobility/entity_client");
|
|
11
|
+
/**
|
|
12
|
+
* Page for managing entity members and invitations.
|
|
13
|
+
*/
|
|
14
|
+
function MembersManagementPage({ client, entity, currentUserId, }) {
|
|
15
|
+
const canManage = entity.userRole === 'admin';
|
|
16
|
+
// Members
|
|
17
|
+
const { data: members = [], isLoading: membersLoading } = (0, entity_client_1.useEntityMembers)(client, entity.entitySlug);
|
|
18
|
+
const updateRole = (0, entity_client_1.useUpdateMemberRole)(client);
|
|
19
|
+
const removeMember = (0, entity_client_1.useRemoveMember)(client);
|
|
20
|
+
// Invitations
|
|
21
|
+
const { data: invitations = [], isLoading: invitationsLoading } = (0, entity_client_1.useEntityInvitations)(client, canManage ? entity.entitySlug : null);
|
|
22
|
+
const createInvitation = (0, entity_client_1.useCreateInvitation)(client);
|
|
23
|
+
const cancelInvitation = (0, entity_client_1.useCancelInvitation)(client);
|
|
24
|
+
const handleRoleChange = async (memberId, role) => {
|
|
25
|
+
try {
|
|
26
|
+
await updateRole.mutateAsync({
|
|
27
|
+
entitySlug: entity.entitySlug,
|
|
28
|
+
memberId,
|
|
29
|
+
role,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
console.error('Failed to update role:', err);
|
|
34
|
+
// TODO: Show toast notification
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
const handleRemoveMember = async (memberId) => {
|
|
38
|
+
if (!confirm('Are you sure you want to remove this member?')) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
await removeMember.mutateAsync({
|
|
43
|
+
entitySlug: entity.entitySlug,
|
|
44
|
+
memberId,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
console.error('Failed to remove member:', err);
|
|
49
|
+
// TODO: Show toast notification
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
const handleInvite = async (request) => {
|
|
53
|
+
await createInvitation.mutateAsync({
|
|
54
|
+
entitySlug: entity.entitySlug,
|
|
55
|
+
request,
|
|
56
|
+
});
|
|
57
|
+
};
|
|
58
|
+
const handleCancelInvitation = async (invitationId) => {
|
|
59
|
+
try {
|
|
60
|
+
await cancelInvitation.mutateAsync({
|
|
61
|
+
entitySlug: entity.entitySlug,
|
|
62
|
+
invitationId,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
console.error('Failed to cancel invitation:', err);
|
|
67
|
+
// TODO: Show toast notification
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
// Personal entities don't have members to manage
|
|
71
|
+
if (entity.entityType === 'personal') {
|
|
72
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "text-center py-12 text-muted-foreground", children: [(0, jsx_runtime_1.jsx)("p", { children: "Personal workspaces cannot have additional members." }), (0, jsx_runtime_1.jsx)("p", { className: "mt-2", children: "Create an organization to collaborate with others." })] }));
|
|
73
|
+
}
|
|
74
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: "space-y-8", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("h1", { className: "text-2xl font-bold text-foreground", children: "Members" }), (0, jsx_runtime_1.jsxs)("p", { className: "text-muted-foreground", children: ["Manage members and invitations for ", entity.displayName] })] }), canManage && ((0, jsx_runtime_1.jsxs)("div", { className: "rounded-lg border p-4", children: [(0, jsx_runtime_1.jsx)("h2", { className: "text-lg font-semibold mb-4", children: "Invite Members" }), (0, jsx_runtime_1.jsx)(entity_components_1.InvitationForm, { onSubmit: handleInvite, isSubmitting: createInvitation.isPending })] })), canManage && ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("h2", { className: "text-lg font-semibold mb-3", children: "Pending Invitations" }), (0, jsx_runtime_1.jsx)(entity_components_1.InvitationList, { invitations: invitations, mode: "admin", onCancel: handleCancelInvitation, isLoading: invitationsLoading, emptyMessage: "No pending invitations" })] })), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("h2", { className: "text-lg font-semibold mb-3", children: ["Current Members (", members.length, ")"] }), (0, jsx_runtime_1.jsx)(entity_components_1.MemberList, { members: members, currentUserId: currentUserId, canManage: canManage, onRoleChange: handleRoleChange, onRemove: handleRemoveMember, isLoading: membersLoading })] })] }));
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=MembersManagementPage.js.map
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Members Management Page
|
|
3
|
+
* @description Page container for managing entity members and invitations
|
|
4
|
+
*/
|
|
5
|
+
import { EntityClient } from '@sudobility/entity_client';
|
|
6
|
+
import type { EntityWithRole } from '@sudobility/types';
|
|
7
|
+
export interface MembersManagementPageProps {
|
|
8
|
+
/** Entity API client */
|
|
9
|
+
client: EntityClient;
|
|
10
|
+
/** Entity to manage */
|
|
11
|
+
entity: EntityWithRole;
|
|
12
|
+
/** Current user's ID */
|
|
13
|
+
currentUserId: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Page for managing entity members and invitations.
|
|
17
|
+
*/
|
|
18
|
+
export declare function MembersManagementPage({ client, entity, currentUserId, }: MembersManagementPageProps): import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
//# sourceMappingURL=MembersManagementPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MembersManagementPage.d.ts","sourceRoot":"","sources":["../../src/pages/MembersManagementPage.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAOL,YAAY,EACb,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,cAAc,EAAmC,MAAM,mBAAmB,CAAC;AAEzF,MAAM,WAAW,0BAA0B;IACzC,wBAAwB;IACxB,MAAM,EAAE,YAAY,CAAC;IACrB,uBAAuB;IACvB,MAAM,EAAE,cAAc,CAAC;IACvB,wBAAwB;IACxB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,EACpC,MAAM,EACN,MAAM,EACN,aAAa,GACd,EAAE,0BAA0B,2CAgI5B"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Members Management Page
|
|
4
|
+
* @description Page container for managing entity members and invitations
|
|
5
|
+
*/
|
|
6
|
+
import { MemberList, InvitationForm, InvitationList, } from '@sudobility/entity-components';
|
|
7
|
+
import { useEntityMembers, useUpdateMemberRole, useRemoveMember, useEntityInvitations, useCreateInvitation, useCancelInvitation, } from '@sudobility/entity_client';
|
|
8
|
+
/**
|
|
9
|
+
* Page for managing entity members and invitations.
|
|
10
|
+
*/
|
|
11
|
+
export function MembersManagementPage({ client, entity, currentUserId, }) {
|
|
12
|
+
const canManage = entity.userRole === 'admin';
|
|
13
|
+
// Members
|
|
14
|
+
const { data: members = [], isLoading: membersLoading } = useEntityMembers(client, entity.entitySlug);
|
|
15
|
+
const updateRole = useUpdateMemberRole(client);
|
|
16
|
+
const removeMember = useRemoveMember(client);
|
|
17
|
+
// Invitations
|
|
18
|
+
const { data: invitations = [], isLoading: invitationsLoading } = useEntityInvitations(client, canManage ? entity.entitySlug : null);
|
|
19
|
+
const createInvitation = useCreateInvitation(client);
|
|
20
|
+
const cancelInvitation = useCancelInvitation(client);
|
|
21
|
+
const handleRoleChange = async (memberId, role) => {
|
|
22
|
+
try {
|
|
23
|
+
await updateRole.mutateAsync({
|
|
24
|
+
entitySlug: entity.entitySlug,
|
|
25
|
+
memberId,
|
|
26
|
+
role,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
catch (err) {
|
|
30
|
+
console.error('Failed to update role:', err);
|
|
31
|
+
// TODO: Show toast notification
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
const handleRemoveMember = async (memberId) => {
|
|
35
|
+
if (!confirm('Are you sure you want to remove this member?')) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
await removeMember.mutateAsync({
|
|
40
|
+
entitySlug: entity.entitySlug,
|
|
41
|
+
memberId,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
console.error('Failed to remove member:', err);
|
|
46
|
+
// TODO: Show toast notification
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const handleInvite = async (request) => {
|
|
50
|
+
await createInvitation.mutateAsync({
|
|
51
|
+
entitySlug: entity.entitySlug,
|
|
52
|
+
request,
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
const handleCancelInvitation = async (invitationId) => {
|
|
56
|
+
try {
|
|
57
|
+
await cancelInvitation.mutateAsync({
|
|
58
|
+
entitySlug: entity.entitySlug,
|
|
59
|
+
invitationId,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
console.error('Failed to cancel invitation:', err);
|
|
64
|
+
// TODO: Show toast notification
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
// Personal entities don't have members to manage
|
|
68
|
+
if (entity.entityType === 'personal') {
|
|
69
|
+
return (_jsxs("div", { className: "text-center py-12 text-muted-foreground", children: [_jsx("p", { children: "Personal workspaces cannot have additional members." }), _jsx("p", { className: "mt-2", children: "Create an organization to collaborate with others." })] }));
|
|
70
|
+
}
|
|
71
|
+
return (_jsxs("div", { className: "space-y-8", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-2xl font-bold text-foreground", children: "Members" }), _jsxs("p", { className: "text-muted-foreground", children: ["Manage members and invitations for ", entity.displayName] })] }), canManage && (_jsxs("div", { className: "rounded-lg border p-4", children: [_jsx("h2", { className: "text-lg font-semibold mb-4", children: "Invite Members" }), _jsx(InvitationForm, { onSubmit: handleInvite, isSubmitting: createInvitation.isPending })] })), canManage && (_jsxs("div", { children: [_jsx("h2", { className: "text-lg font-semibold mb-3", children: "Pending Invitations" }), _jsx(InvitationList, { invitations: invitations, mode: "admin", onCancel: handleCancelInvitation, isLoading: invitationsLoading, emptyMessage: "No pending invitations" })] })), _jsxs("div", { children: [_jsxs("h2", { className: "text-lg font-semibold mb-3", children: ["Current Members (", members.length, ")"] }), _jsx(MemberList, { members: members, currentUserId: currentUserId, canManage: canManage, onRoleChange: handleRoleChange, onRemove: handleRemoveMember, isLoading: membersLoading })] })] }));
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=MembersManagementPage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MembersManagementPage.js","sourceRoot":"","sources":["../../src/pages/MembersManagementPage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Page Exports
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.InvitationsPage = exports.MembersManagementPage = exports.EntityListPage = void 0;
|
|
7
|
+
var EntityListPage_1 = require("./EntityListPage");
|
|
8
|
+
Object.defineProperty(exports, "EntityListPage", { enumerable: true, get: function () { return EntityListPage_1.EntityListPage; } });
|
|
9
|
+
var MembersManagementPage_1 = require("./MembersManagementPage");
|
|
10
|
+
Object.defineProperty(exports, "MembersManagementPage", { enumerable: true, get: function () { return MembersManagementPage_1.MembersManagementPage; } });
|
|
11
|
+
var InvitationsPage_1 = require("./InvitationsPage");
|
|
12
|
+
Object.defineProperty(exports, "InvitationsPage", { enumerable: true, get: function () { return InvitationsPage_1.InvitationsPage; } });
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Page Exports
|
|
3
|
+
*/
|
|
4
|
+
export { EntityListPage, type EntityListPageProps } from './EntityListPage';
|
|
5
|
+
export { MembersManagementPage, type MembersManagementPageProps, } from './MembersManagementPage';
|
|
6
|
+
export { InvitationsPage, type InvitationsPageProps } from './InvitationsPage';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pages/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EACL,qBAAqB,EACrB,KAAK,0BAA0B,GAChC,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pages/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAA4B,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EACL,qBAAqB,GAEtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,eAAe,EAA6B,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Tests for Entity Pages module exports
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const bun_test_1 = require("bun:test");
|
|
7
|
+
const index_1 = require("./index");
|
|
8
|
+
(0, bun_test_1.describe)('entity_pages exports', () => {
|
|
9
|
+
(0, bun_test_1.test)('exports EntityListPage component', () => {
|
|
10
|
+
(0, bun_test_1.expect)(index_1.EntityListPage).toBeDefined();
|
|
11
|
+
(0, bun_test_1.expect)(typeof index_1.EntityListPage).toBe('function');
|
|
12
|
+
});
|
|
13
|
+
(0, bun_test_1.test)('exports MembersManagementPage component', () => {
|
|
14
|
+
(0, bun_test_1.expect)(index_1.MembersManagementPage).toBeDefined();
|
|
15
|
+
(0, bun_test_1.expect)(typeof index_1.MembersManagementPage).toBe('function');
|
|
16
|
+
});
|
|
17
|
+
(0, bun_test_1.test)('exports InvitationsPage component', () => {
|
|
18
|
+
(0, bun_test_1.expect)(index_1.InvitationsPage).toBeDefined();
|
|
19
|
+
(0, bun_test_1.expect)(typeof index_1.InvitationsPage).toBe('function');
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
(0, bun_test_1.describe)('EntityListPage', () => {
|
|
23
|
+
(0, bun_test_1.test)('is a valid React function component', () => {
|
|
24
|
+
// React function components have a name property
|
|
25
|
+
(0, bun_test_1.expect)(index_1.EntityListPage.name).toBe('EntityListPage');
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
(0, bun_test_1.describe)('MembersManagementPage', () => {
|
|
29
|
+
(0, bun_test_1.test)('is a valid React function component', () => {
|
|
30
|
+
(0, bun_test_1.expect)(index_1.MembersManagementPage.name).toBe('MembersManagementPage');
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
(0, bun_test_1.describe)('InvitationsPage', () => {
|
|
34
|
+
(0, bun_test_1.test)('is a valid React function component', () => {
|
|
35
|
+
(0, bun_test_1.expect)(index_1.InvitationsPage.name).toBe('InvitationsPage');
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
//# sourceMappingURL=index.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/pages/index.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tests for Entity Pages module exports
|
|
3
|
+
*/
|
|
4
|
+
import { describe, test, expect } from 'bun:test';
|
|
5
|
+
import { EntityListPage, MembersManagementPage, InvitationsPage, } from './index';
|
|
6
|
+
describe('entity_pages exports', () => {
|
|
7
|
+
test('exports EntityListPage component', () => {
|
|
8
|
+
expect(EntityListPage).toBeDefined();
|
|
9
|
+
expect(typeof EntityListPage).toBe('function');
|
|
10
|
+
});
|
|
11
|
+
test('exports MembersManagementPage component', () => {
|
|
12
|
+
expect(MembersManagementPage).toBeDefined();
|
|
13
|
+
expect(typeof MembersManagementPage).toBe('function');
|
|
14
|
+
});
|
|
15
|
+
test('exports InvitationsPage component', () => {
|
|
16
|
+
expect(InvitationsPage).toBeDefined();
|
|
17
|
+
expect(typeof InvitationsPage).toBe('function');
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
describe('EntityListPage', () => {
|
|
21
|
+
test('is a valid React function component', () => {
|
|
22
|
+
// React function components have a name property
|
|
23
|
+
expect(EntityListPage.name).toBe('EntityListPage');
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
describe('MembersManagementPage', () => {
|
|
27
|
+
test('is a valid React function component', () => {
|
|
28
|
+
expect(MembersManagementPage.name).toBe('MembersManagementPage');
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
describe('InvitationsPage', () => {
|
|
32
|
+
test('is a valid React function component', () => {
|
|
33
|
+
expect(InvitationsPage.name).toBe('InvitationsPage');
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=index.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/pages/index.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,eAAe,GAChB,MAAM,SAAS,CAAC;AAEjB,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,IAAI,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,CAAC,OAAO,cAAc,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,qBAAqB,CAAC,CAAC,WAAW,EAAE,CAAC;QAC5C,MAAM,CAAC,OAAO,qBAAqB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,eAAe,CAAC,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC/C,iDAAiD;QACjD,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@sudobility/entity_pages",
|
|
3
|
+
"version": "0.0.2",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Page containers for entity/organization management",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"require": "./dist/index.cjs",
|
|
13
|
+
"types": "./dist/index.d.ts"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "bun run build:esm && bun run build:cjs",
|
|
18
|
+
"build:esm": "bunx tsc -p tsconfig.esm.json",
|
|
19
|
+
"build:cjs": "bunx tsc -p tsconfig.cjs.json && bun run build:cjs-copy",
|
|
20
|
+
"build:cjs-copy": "find dist-cjs -name '*.js' | while read f; do cp \"$f\" \"dist/$(echo \"$f\" | sed 's|dist-cjs/||' | sed 's/.js$/.cjs/')\"; done && rm -rf dist-cjs",
|
|
21
|
+
"clean": "rm -rf dist dist-cjs",
|
|
22
|
+
"typecheck": "bunx tsc --noEmit",
|
|
23
|
+
"lint": "bunx eslint src --ext .ts,.tsx",
|
|
24
|
+
"test": "bun test"
|
|
25
|
+
},
|
|
26
|
+
"peerDependencies": {
|
|
27
|
+
"react": "^18.0.0 || ^19.0.0",
|
|
28
|
+
"@tanstack/react-query": "^5.0.0",
|
|
29
|
+
"@sudobility/types": "^1.9.40",
|
|
30
|
+
"@sudobility/entity_client": "^0.0.2",
|
|
31
|
+
"@sudobility/entity-components": "^1.0.0"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@types/bun": "^1.2.8",
|
|
35
|
+
"@types/node": "^24.0.0",
|
|
36
|
+
"@types/react": "^19.0.0",
|
|
37
|
+
"@tanstack/react-query": "^5.0.0",
|
|
38
|
+
"react": "^19.0.0",
|
|
39
|
+
"typescript": "^5.9.3",
|
|
40
|
+
"eslint": "^9.0.0",
|
|
41
|
+
"@typescript-eslint/eslint-plugin": "^8.0.0",
|
|
42
|
+
"@typescript-eslint/parser": "^8.0.0",
|
|
43
|
+
"lucide-react": "^0.511.0"
|
|
44
|
+
},
|
|
45
|
+
"files": [
|
|
46
|
+
"dist/**/*"
|
|
47
|
+
],
|
|
48
|
+
"keywords": [
|
|
49
|
+
"entity",
|
|
50
|
+
"organization",
|
|
51
|
+
"react",
|
|
52
|
+
"pages",
|
|
53
|
+
"containers"
|
|
54
|
+
],
|
|
55
|
+
"author": "Sudobility",
|
|
56
|
+
"license": "MIT"
|
|
57
|
+
}
|