@actuate-media/cms-admin 0.1.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/dist/AdminRoot.d.ts +21 -0
- package/dist/AdminRoot.d.ts.map +1 -0
- package/dist/AdminRoot.js +136 -0
- package/dist/AdminRoot.js.map +1 -0
- package/dist/components/Breadcrumbs.d.ts +6 -0
- package/dist/components/Breadcrumbs.d.ts.map +1 -0
- package/dist/components/Breadcrumbs.js +52 -0
- package/dist/components/Breadcrumbs.js.map +1 -0
- package/dist/components/CommandPalette.d.ts +7 -0
- package/dist/components/CommandPalette.d.ts.map +1 -0
- package/dist/components/CommandPalette.js +152 -0
- package/dist/components/CommandPalette.js.map +1 -0
- package/dist/components/ErrorBoundary.d.ts +17 -0
- package/dist/components/ErrorBoundary.d.ts.map +1 -0
- package/dist/components/ErrorBoundary.js +24 -0
- package/dist/components/ErrorBoundary.js.map +1 -0
- package/dist/components/FocalPointPicker.d.ts +9 -0
- package/dist/components/FocalPointPicker.d.ts.map +1 -0
- package/dist/components/FocalPointPicker.js +19 -0
- package/dist/components/FocalPointPicker.js.map +1 -0
- package/dist/components/FolderTree.d.ts +28 -0
- package/dist/components/FolderTree.d.ts.map +1 -0
- package/dist/components/FolderTree.js +198 -0
- package/dist/components/FolderTree.js.map +1 -0
- package/dist/components/LivePreview.d.ts +10 -0
- package/dist/components/LivePreview.d.ts.map +1 -0
- package/dist/components/LivePreview.js +62 -0
- package/dist/components/LivePreview.js.map +1 -0
- package/dist/components/LocaleProvider.d.ts +28 -0
- package/dist/components/LocaleProvider.d.ts.map +1 -0
- package/dist/components/LocaleProvider.js +29 -0
- package/dist/components/LocaleProvider.js.map +1 -0
- package/dist/components/LocaleSwitcher.d.ts +2 -0
- package/dist/components/LocaleSwitcher.d.ts.map +1 -0
- package/dist/components/LocaleSwitcher.js +13 -0
- package/dist/components/LocaleSwitcher.js.map +1 -0
- package/dist/components/MediaPickerModal.d.ts +8 -0
- package/dist/components/MediaPickerModal.d.ts.map +1 -0
- package/dist/components/MediaPickerModal.js +53 -0
- package/dist/components/MediaPickerModal.js.map +1 -0
- package/dist/components/PresenceIndicator.d.ts +7 -0
- package/dist/components/PresenceIndicator.d.ts.map +1 -0
- package/dist/components/PresenceIndicator.js +37 -0
- package/dist/components/PresenceIndicator.js.map +1 -0
- package/dist/components/SEOPanel.d.ts +26 -0
- package/dist/components/SEOPanel.d.ts.map +1 -0
- package/dist/components/SEOPanel.js +249 -0
- package/dist/components/SEOPanel.js.map +1 -0
- package/dist/components/ThemeProvider.d.ts +13 -0
- package/dist/components/ThemeProvider.d.ts.map +1 -0
- package/dist/components/ThemeProvider.js +62 -0
- package/dist/components/ThemeProvider.js.map +1 -0
- package/dist/components/TipTapEditor.d.ts +9 -0
- package/dist/components/TipTapEditor.d.ts.map +1 -0
- package/dist/components/TipTapEditor.js +167 -0
- package/dist/components/TipTapEditor.js.map +1 -0
- package/dist/components/VersionHistory.d.ts +9 -0
- package/dist/components/VersionHistory.d.ts.map +1 -0
- package/dist/components/VersionHistory.js +70 -0
- package/dist/components/VersionHistory.js.map +1 -0
- package/dist/components/ui/Avatar.d.ts +9 -0
- package/dist/components/ui/Avatar.d.ts.map +1 -0
- package/dist/components/ui/Avatar.js +21 -0
- package/dist/components/ui/Avatar.js.map +1 -0
- package/dist/components/ui/Badge.d.ts +5 -0
- package/dist/components/ui/Badge.d.ts.map +1 -0
- package/dist/components/ui/Badge.js +17 -0
- package/dist/components/ui/Badge.js.map +1 -0
- package/dist/components/ui/Button.d.ts +12 -0
- package/dist/components/ui/Button.d.ts.map +1 -0
- package/dist/components/ui/Button.js +17 -0
- package/dist/components/ui/Button.js.map +1 -0
- package/dist/components/ui/CommandPalette.d.ts +14 -0
- package/dist/components/ui/CommandPalette.d.ts.map +1 -0
- package/dist/components/ui/CommandPalette.js +52 -0
- package/dist/components/ui/CommandPalette.js.map +1 -0
- package/dist/components/ui/ConfirmDialog.d.ts +12 -0
- package/dist/components/ui/ConfirmDialog.d.ts.map +1 -0
- package/dist/components/ui/ConfirmDialog.js +11 -0
- package/dist/components/ui/ConfirmDialog.js.map +1 -0
- package/dist/components/ui/DataTable.d.ts +30 -0
- package/dist/components/ui/DataTable.d.ts.map +1 -0
- package/dist/components/ui/DataTable.js +40 -0
- package/dist/components/ui/DataTable.js.map +1 -0
- package/dist/components/ui/EmptyState.d.ts +10 -0
- package/dist/components/ui/EmptyState.d.ts.map +1 -0
- package/dist/components/ui/EmptyState.js +6 -0
- package/dist/components/ui/EmptyState.js.map +1 -0
- package/dist/components/ui/Modal.d.ts +10 -0
- package/dist/components/ui/Modal.d.ts.map +1 -0
- package/dist/components/ui/Modal.js +19 -0
- package/dist/components/ui/Modal.js.map +1 -0
- package/dist/components/ui/Pagination.d.ts +9 -0
- package/dist/components/ui/Pagination.d.ts.map +1 -0
- package/dist/components/ui/Pagination.js +21 -0
- package/dist/components/ui/Pagination.js.map +1 -0
- package/dist/components/ui/SearchInput.d.ts +7 -0
- package/dist/components/ui/SearchInput.d.ts.map +1 -0
- package/dist/components/ui/SearchInput.js +6 -0
- package/dist/components/ui/SearchInput.js.map +1 -0
- package/dist/components/ui/Skeleton.d.ts +9 -0
- package/dist/components/ui/Skeleton.d.ts.map +1 -0
- package/dist/components/ui/Skeleton.js +11 -0
- package/dist/components/ui/Skeleton.js.map +1 -0
- package/dist/components/ui/Toast.d.ts +18 -0
- package/dist/components/ui/Toast.d.ts.map +1 -0
- package/dist/components/ui/Toast.js +29 -0
- package/dist/components/ui/Toast.js.map +1 -0
- package/dist/components/ui/index.d.ts +25 -0
- package/dist/components/ui/index.d.ts.map +1 -0
- package/dist/components/ui/index.js +13 -0
- package/dist/components/ui/index.js.map +1 -0
- package/dist/fields/ArrayField.d.ts +9 -0
- package/dist/fields/ArrayField.d.ts.map +1 -0
- package/dist/fields/ArrayField.js +21 -0
- package/dist/fields/ArrayField.js.map +1 -0
- package/dist/fields/BlockBuilderField.d.ts +16 -0
- package/dist/fields/BlockBuilderField.d.ts.map +1 -0
- package/dist/fields/BlockBuilderField.js +110 -0
- package/dist/fields/BlockBuilderField.js.map +1 -0
- package/dist/fields/DateField.d.ts +9 -0
- package/dist/fields/DateField.d.ts.map +1 -0
- package/dist/fields/DateField.js +6 -0
- package/dist/fields/DateField.js.map +1 -0
- package/dist/fields/FieldRenderer.d.ts +22 -0
- package/dist/fields/FieldRenderer.d.ts.map +1 -0
- package/dist/fields/FieldRenderer.js +38 -0
- package/dist/fields/FieldRenderer.js.map +1 -0
- package/dist/fields/GroupField.d.ts +8 -0
- package/dist/fields/GroupField.d.ts.map +1 -0
- package/dist/fields/GroupField.js +8 -0
- package/dist/fields/GroupField.js.map +1 -0
- package/dist/fields/MediaField.d.ts +13 -0
- package/dist/fields/MediaField.d.ts.map +1 -0
- package/dist/fields/MediaField.js +6 -0
- package/dist/fields/MediaField.js.map +1 -0
- package/dist/fields/NavBuilderField.d.ts +15 -0
- package/dist/fields/NavBuilderField.d.ts.map +1 -0
- package/dist/fields/NavBuilderField.js +19 -0
- package/dist/fields/NavBuilderField.js.map +1 -0
- package/dist/fields/NumberField.d.ts +12 -0
- package/dist/fields/NumberField.d.ts.map +1 -0
- package/dist/fields/NumberField.js +6 -0
- package/dist/fields/NumberField.js.map +1 -0
- package/dist/fields/RelationshipField.d.ts +13 -0
- package/dist/fields/RelationshipField.d.ts.map +1 -0
- package/dist/fields/RelationshipField.js +119 -0
- package/dist/fields/RelationshipField.js.map +1 -0
- package/dist/fields/RichTextField.d.ts +9 -0
- package/dist/fields/RichTextField.d.ts.map +1 -0
- package/dist/fields/RichTextField.js +7 -0
- package/dist/fields/RichTextField.js.map +1 -0
- package/dist/fields/SelectField.d.ts +11 -0
- package/dist/fields/SelectField.d.ts.map +1 -0
- package/dist/fields/SelectField.js +31 -0
- package/dist/fields/SelectField.js.map +1 -0
- package/dist/fields/SlugField.d.ts +10 -0
- package/dist/fields/SlugField.d.ts.map +1 -0
- package/dist/fields/SlugField.js +15 -0
- package/dist/fields/SlugField.js.map +1 -0
- package/dist/fields/TextField.d.ts +11 -0
- package/dist/fields/TextField.d.ts.map +1 -0
- package/dist/fields/TextField.js +8 -0
- package/dist/fields/TextField.js.map +1 -0
- package/dist/fields/ToggleField.d.ts +8 -0
- package/dist/fields/ToggleField.d.ts.map +1 -0
- package/dist/fields/ToggleField.js +6 -0
- package/dist/fields/ToggleField.js.map +1 -0
- package/dist/fields/block-types.d.ts +18 -0
- package/dist/fields/block-types.d.ts.map +1 -0
- package/dist/fields/block-types.js +88 -0
- package/dist/fields/block-types.js.map +1 -0
- package/dist/fields/index.d.ts +18 -0
- package/dist/fields/index.d.ts.map +1 -0
- package/dist/fields/index.js +16 -0
- package/dist/fields/index.js.map +1 -0
- package/dist/hooks/useContentLock.d.ts +12 -0
- package/dist/hooks/useContentLock.d.ts.map +1 -0
- package/dist/hooks/useContentLock.js +38 -0
- package/dist/hooks/useContentLock.js.map +1 -0
- package/dist/hooks/useDebounce.d.ts +2 -0
- package/dist/hooks/useDebounce.d.ts.map +1 -0
- package/dist/hooks/useDebounce.js +11 -0
- package/dist/hooks/useDebounce.js.map +1 -0
- package/dist/hooks/useKeyboardShortcuts.d.ts +6 -0
- package/dist/hooks/useKeyboardShortcuts.d.ts.map +1 -0
- package/dist/hooks/useKeyboardShortcuts.js +26 -0
- package/dist/hooks/useKeyboardShortcuts.js.map +1 -0
- package/dist/index.d.ts +52 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/layout/Header.d.ts +7 -0
- package/dist/layout/Header.d.ts.map +1 -0
- package/dist/layout/Header.js +18 -0
- package/dist/layout/Header.js.map +1 -0
- package/dist/layout/Layout.d.ts +10 -0
- package/dist/layout/Layout.d.ts.map +1 -0
- package/dist/layout/Layout.js +25 -0
- package/dist/layout/Layout.js.map +1 -0
- package/dist/layout/Sidebar.d.ts +9 -0
- package/dist/layout/Sidebar.d.ts.map +1 -0
- package/dist/layout/Sidebar.js +63 -0
- package/dist/layout/Sidebar.js.map +1 -0
- package/dist/lib/api.d.ts +8 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +59 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/search.d.ts +11 -0
- package/dist/lib/search.d.ts.map +1 -0
- package/dist/lib/search.js +46 -0
- package/dist/lib/search.js.map +1 -0
- package/dist/lib/useApiData.d.ts +8 -0
- package/dist/lib/useApiData.d.ts.map +1 -0
- package/dist/lib/useApiData.js +36 -0
- package/dist/lib/useApiData.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +6 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/router/index.d.ts +10 -0
- package/dist/router/index.d.ts.map +1 -0
- package/dist/router/index.js +61 -0
- package/dist/router/index.js.map +1 -0
- package/dist/views/CollectionList.d.ts +7 -0
- package/dist/views/CollectionList.d.ts.map +1 -0
- package/dist/views/CollectionList.js +107 -0
- package/dist/views/CollectionList.js.map +1 -0
- package/dist/views/Dashboard.d.ts +5 -0
- package/dist/views/Dashboard.d.ts.map +1 -0
- package/dist/views/Dashboard.js +17 -0
- package/dist/views/Dashboard.js.map +1 -0
- package/dist/views/DocumentEdit.d.ts +8 -0
- package/dist/views/DocumentEdit.d.ts.map +1 -0
- package/dist/views/DocumentEdit.js +210 -0
- package/dist/views/DocumentEdit.js.map +1 -0
- package/dist/views/FormEditor.d.ts +6 -0
- package/dist/views/FormEditor.d.ts.map +1 -0
- package/dist/views/FormEditor.js +126 -0
- package/dist/views/FormEditor.js.map +1 -0
- package/dist/views/FormSubmissions.d.ts +6 -0
- package/dist/views/FormSubmissions.d.ts.map +1 -0
- package/dist/views/FormSubmissions.js +88 -0
- package/dist/views/FormSubmissions.js.map +1 -0
- package/dist/views/Forms.d.ts +5 -0
- package/dist/views/Forms.d.ts.map +1 -0
- package/dist/views/Forms.js +24 -0
- package/dist/views/Forms.js.map +1 -0
- package/dist/views/Login.d.ts +10 -0
- package/dist/views/Login.d.ts.map +1 -0
- package/dist/views/Login.js +83 -0
- package/dist/views/Login.js.map +1 -0
- package/dist/views/MediaBrowser.d.ts +5 -0
- package/dist/views/MediaBrowser.d.ts.map +1 -0
- package/dist/views/MediaBrowser.js +245 -0
- package/dist/views/MediaBrowser.js.map +1 -0
- package/dist/views/PageEditor.d.ts +6 -0
- package/dist/views/PageEditor.d.ts.map +1 -0
- package/dist/views/PageEditor.js +74 -0
- package/dist/views/PageEditor.js.map +1 -0
- package/dist/views/Pages.d.ts +5 -0
- package/dist/views/Pages.d.ts.map +1 -0
- package/dist/views/Pages.js +127 -0
- package/dist/views/Pages.js.map +1 -0
- package/dist/views/PostEditor.d.ts +6 -0
- package/dist/views/PostEditor.d.ts.map +1 -0
- package/dist/views/PostEditor.js +79 -0
- package/dist/views/PostEditor.js.map +1 -0
- package/dist/views/Posts.d.ts +5 -0
- package/dist/views/Posts.d.ts.map +1 -0
- package/dist/views/Posts.js +67 -0
- package/dist/views/Posts.js.map +1 -0
- package/dist/views/Redirects.d.ts +5 -0
- package/dist/views/Redirects.d.ts.map +1 -0
- package/dist/views/Redirects.js +79 -0
- package/dist/views/Redirects.js.map +1 -0
- package/dist/views/SEO.d.ts +6 -0
- package/dist/views/SEO.d.ts.map +1 -0
- package/dist/views/SEO.js +120 -0
- package/dist/views/SEO.js.map +1 -0
- package/dist/views/Settings.d.ts +5 -0
- package/dist/views/Settings.d.ts.map +1 -0
- package/dist/views/Settings.js +95 -0
- package/dist/views/Settings.js.map +1 -0
- package/dist/views/SetupWizard.d.ts +13 -0
- package/dist/views/SetupWizard.d.ts.map +1 -0
- package/dist/views/SetupWizard.js +68 -0
- package/dist/views/SetupWizard.js.map +1 -0
- package/dist/views/Users.d.ts +5 -0
- package/dist/views/Users.d.ts.map +1 -0
- package/dist/views/Users.js +69 -0
- package/dist/views/Users.js.map +1 -0
- package/package.json +71 -0
- package/src/styles/tailwind.css +2 -0
- package/src/styles/theme.css +175 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface RelationshipFieldProps {
|
|
2
|
+
label: string;
|
|
3
|
+
value?: string | string[];
|
|
4
|
+
onChange: (value: string | string[]) => void;
|
|
5
|
+
multi?: boolean;
|
|
6
|
+
required?: boolean;
|
|
7
|
+
helpText?: string;
|
|
8
|
+
relationTo?: string;
|
|
9
|
+
useAsTitle?: string;
|
|
10
|
+
onNavigate?: (path: string) => void;
|
|
11
|
+
}
|
|
12
|
+
export declare function RelationshipField({ label, value, onChange, multi, required, helpText, relationTo, useAsTitle, onNavigate, }: RelationshipFieldProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
//# sourceMappingURL=RelationshipField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RelationshipField.d.ts","sourceRoot":"","sources":["../../src/fields/RelationshipField.tsx"],"names":[],"mappings":"AAMA,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,IAAI,CAAC;IAC7C,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAkCD,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,KAAK,EACL,QAAQ,EACR,KAAa,EACb,QAAQ,EACR,QAAQ,EACR,UAAoB,EACpB,UAAoB,EACpB,UAAU,GACX,EAAE,sBAAsB,2CAwLxB"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState, useEffect, useRef, useCallback } from 'react';
|
|
4
|
+
import { Search, X, Loader2, Plus } from 'lucide-react';
|
|
5
|
+
import { cmsApi } from '../lib/api';
|
|
6
|
+
const STATUS_STYLES = {
|
|
7
|
+
PUBLISHED: 'bg-green-100 text-green-800',
|
|
8
|
+
DRAFT: 'bg-yellow-100 text-yellow-800',
|
|
9
|
+
ARCHIVED: 'bg-gray-100 text-gray-600',
|
|
10
|
+
SCHEDULED: 'bg-blue-100 text-blue-800',
|
|
11
|
+
};
|
|
12
|
+
function relativeTime(dateStr) {
|
|
13
|
+
if (!dateStr)
|
|
14
|
+
return '';
|
|
15
|
+
const diff = Date.now() - new Date(dateStr).getTime();
|
|
16
|
+
const seconds = Math.floor(diff / 1000);
|
|
17
|
+
if (seconds < 60)
|
|
18
|
+
return 'just now';
|
|
19
|
+
const minutes = Math.floor(seconds / 60);
|
|
20
|
+
if (minutes < 60)
|
|
21
|
+
return `${minutes}m ago`;
|
|
22
|
+
const hours = Math.floor(minutes / 60);
|
|
23
|
+
if (hours < 24)
|
|
24
|
+
return `${hours}h ago`;
|
|
25
|
+
const days = Math.floor(hours / 24);
|
|
26
|
+
if (days < 30)
|
|
27
|
+
return `${days}d ago`;
|
|
28
|
+
const months = Math.floor(days / 30);
|
|
29
|
+
if (months < 12)
|
|
30
|
+
return `${months}mo ago`;
|
|
31
|
+
return `${Math.floor(months / 12)}y ago`;
|
|
32
|
+
}
|
|
33
|
+
export function RelationshipField({ label, value, onChange, multi = false, required, helpText, relationTo = 'pages', useAsTitle = 'title', onNavigate, }) {
|
|
34
|
+
const [searchTerm, setSearchTerm] = useState('');
|
|
35
|
+
const [open, setOpen] = useState(false);
|
|
36
|
+
const [options, setOptions] = useState([]);
|
|
37
|
+
const [loading, setLoading] = useState(false);
|
|
38
|
+
const dropdownRef = useRef(null);
|
|
39
|
+
const debounceRef = useRef(null);
|
|
40
|
+
const selectedIds = multi
|
|
41
|
+
? (Array.isArray(value) ? value : [])
|
|
42
|
+
: (typeof value === 'string' && value ? [value] : []);
|
|
43
|
+
const fetchOptions = useCallback(async (query) => {
|
|
44
|
+
setLoading(true);
|
|
45
|
+
const searchParam = query ? `&search=${encodeURIComponent(query)}` : '';
|
|
46
|
+
const res = await cmsApi(`/collections/${relationTo}?pageSize=50${searchParam}`);
|
|
47
|
+
if (res.data) {
|
|
48
|
+
const docs = res.data.docs ?? [];
|
|
49
|
+
setOptions(docs);
|
|
50
|
+
}
|
|
51
|
+
setLoading(false);
|
|
52
|
+
}, [relationTo]);
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
if (open)
|
|
55
|
+
fetchOptions(searchTerm);
|
|
56
|
+
}, [open]);
|
|
57
|
+
const handleSearch = useCallback((query) => {
|
|
58
|
+
setSearchTerm(query);
|
|
59
|
+
if (debounceRef.current)
|
|
60
|
+
clearTimeout(debounceRef.current);
|
|
61
|
+
debounceRef.current = setTimeout(() => fetchOptions(query), 300);
|
|
62
|
+
}, [fetchOptions]);
|
|
63
|
+
useEffect(() => {
|
|
64
|
+
function handleClickOutside(e) {
|
|
65
|
+
if (dropdownRef.current && !dropdownRef.current.contains(e.target)) {
|
|
66
|
+
setOpen(false);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
document.addEventListener('mousedown', handleClickOutside);
|
|
70
|
+
return () => document.removeEventListener('mousedown', handleClickOutside);
|
|
71
|
+
}, []);
|
|
72
|
+
function getDocTitle(doc) {
|
|
73
|
+
if (doc.title)
|
|
74
|
+
return doc.title;
|
|
75
|
+
const d = doc.data;
|
|
76
|
+
if (d && typeof d === 'object') {
|
|
77
|
+
if (typeof d[useAsTitle] === 'string')
|
|
78
|
+
return d[useAsTitle];
|
|
79
|
+
if (typeof d.title === 'string')
|
|
80
|
+
return d.title;
|
|
81
|
+
if (typeof d.name === 'string')
|
|
82
|
+
return d.name;
|
|
83
|
+
}
|
|
84
|
+
return doc.id;
|
|
85
|
+
}
|
|
86
|
+
function handleToggle(id) {
|
|
87
|
+
if (multi) {
|
|
88
|
+
const next = selectedIds.includes(id)
|
|
89
|
+
? selectedIds.filter((v) => v !== id)
|
|
90
|
+
: [...selectedIds, id];
|
|
91
|
+
onChange(next);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
onChange(id);
|
|
95
|
+
setOpen(false);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function handleRemove(id) {
|
|
99
|
+
if (multi) {
|
|
100
|
+
onChange(selectedIds.filter((v) => v !== id));
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
onChange('');
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const selectedItems = options.filter((opt) => selectedIds.includes(opt.id));
|
|
107
|
+
const unselectedItems = options.filter((opt) => !selectedIds.includes(opt.id));
|
|
108
|
+
function renderOption(opt, isSelected) {
|
|
109
|
+
const status = opt.status ?? opt.data?.status;
|
|
110
|
+
const collection = opt.collection ?? relationTo;
|
|
111
|
+
const statusClass = STATUS_STYLES[status] ?? 'bg-gray-100 text-gray-600';
|
|
112
|
+
return (_jsxs("button", { type: "button", onClick: () => handleToggle(opt.id), className: `flex w-full items-center gap-2 px-3 py-2 text-sm hover:bg-[var(--accent)] ${isSelected ? 'font-medium' : ''}`, children: [_jsxs("div", { className: "flex-1 min-w-0 text-left", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "truncate", children: getDocTitle(opt) }), isSelected && _jsx("span", { className: "shrink-0 text-[var(--primary)]", children: "\u2713" })] }), _jsxs("div", { className: "flex items-center gap-2 mt-0.5", children: [_jsx("span", { className: "text-[10px] text-[var(--muted-foreground)]", children: collection }), opt.updatedAt && (_jsx("span", { className: "text-[10px] text-[var(--muted-foreground)]", children: relativeTime(opt.updatedAt) }))] })] }), status && (_jsx("span", { className: `shrink-0 rounded px-1.5 py-0.5 text-[10px] font-medium ${statusClass}`, children: status }))] }));
|
|
113
|
+
}
|
|
114
|
+
return (_jsxs("div", { className: "relative", ref: dropdownRef, children: [_jsxs("label", { className: "mb-1 block text-sm font-medium", children: [label, required && _jsx("span", { className: "ml-0.5 text-[var(--destructive)]", children: "*" })] }), selectedItems.length > 0 && (_jsx("div", { className: "mb-2 flex flex-wrap gap-1", children: selectedItems.map((item) => (_jsxs("span", { className: "inline-flex items-center gap-1 rounded-md bg-[var(--accent)] px-2 py-1 text-xs", children: [getDocTitle(item), _jsx("button", { type: "button", onClick: () => handleRemove(item.id), className: "hover:text-[var(--destructive)]", children: _jsx(X, { className: "w-3 h-3" }) })] }, item.id))) })), _jsxs("div", { className: "relative", children: [_jsx(Search, { className: "absolute left-2.5 top-1/2 -translate-y-1/2 w-4 h-4 text-[var(--muted-foreground)] pointer-events-none" }), _jsx("input", { type: "text", value: searchTerm, onChange: (e) => handleSearch(e.target.value), onFocus: () => setOpen(true), placeholder: `Search ${relationTo}...`, className: "w-full rounded-md border border-[var(--border)] bg-[var(--input-background)] pl-8 pr-3 py-2 text-sm outline-none focus:ring-2 focus:ring-[var(--ring)]" }), loading && (_jsx(Loader2, { className: "absolute right-2.5 top-1/2 -translate-y-1/2 w-4 h-4 animate-spin text-[var(--muted-foreground)]" })), open && (_jsxs("ul", { className: "absolute z-50 mt-1 w-full max-h-60 overflow-y-auto rounded-md border border-[var(--border)] bg-[var(--popover)] py-1 shadow-lg", children: [unselectedItems.map((opt) => (_jsx("li", { children: renderOption(opt, false) }, opt.id))), selectedItems.length > 0 && unselectedItems.length > 0 && (_jsx("li", { className: "border-t border-[var(--border)] my-1" })), selectedItems.map((opt) => (_jsx("li", { children: renderOption(opt, true) }, opt.id))), options.length === 0 && !loading && (_jsx("li", { className: "px-3 py-2 text-sm text-[var(--muted-foreground)]", children: "No results" })), _jsx("li", { className: "border-t border-[var(--border)] mt-1", children: _jsxs("button", { type: "button", onClick: () => {
|
|
115
|
+
setOpen(false);
|
|
116
|
+
onNavigate?.(`/${relationTo}/new`);
|
|
117
|
+
}, className: "flex w-full items-center gap-2 px-3 py-2 text-sm text-[var(--primary)] hover:bg-[var(--accent)]", children: [_jsx(Plus, { className: "w-3.5 h-3.5" }), "Create New"] }) })] }))] }), helpText && (_jsx("p", { className: "mt-1 text-xs text-[var(--muted-foreground)]", children: helpText }))] }));
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=RelationshipField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RelationshipField.js","sourceRoot":"","sources":["../../src/fields/RelationshipField.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface RichTextFieldProps {
|
|
2
|
+
label: string;
|
|
3
|
+
value?: string;
|
|
4
|
+
onChange: (value: string) => void;
|
|
5
|
+
required?: boolean;
|
|
6
|
+
helpText?: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function RichTextField({ label, value, onChange, required, helpText }: RichTextFieldProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=RichTextField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RichTextField.d.ts","sourceRoot":"","sources":["../../src/fields/RichTextField.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,KAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,kBAAkB,2CAapG"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { TipTapEditor } from '../components/TipTapEditor';
|
|
4
|
+
export function RichTextField({ label, value = '', onChange, required, helpText }) {
|
|
5
|
+
return (_jsxs("div", { children: [_jsxs("label", { className: "mb-1 block text-sm font-medium", children: [label, required && _jsx("span", { className: "ml-0.5 text-[var(--destructive)]", children: "*" })] }), _jsx(TipTapEditor, { content: value, onChange: onChange }), helpText && (_jsx("p", { className: "mt-1 text-xs text-[var(--muted-foreground)]", children: helpText }))] }));
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=RichTextField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RichTextField.js","sourceRoot":"","sources":["../../src/fields/RichTextField.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAU1D,MAAM,UAAU,aAAa,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAsB;IACnG,OAAO,CACL,0BACE,iBAAO,SAAS,EAAC,gCAAgC,aAC9C,KAAK,EACL,QAAQ,IAAI,eAAM,SAAS,EAAC,kCAAkC,kBAAS,IAClE,EACR,KAAC,YAAY,IAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,GAAI,EACnD,QAAQ,IAAI,CACX,YAAG,SAAS,EAAC,6CAA6C,YAAE,QAAQ,GAAK,CAC1E,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface SelectFieldProps {
|
|
2
|
+
label: string;
|
|
3
|
+
value?: string | string[];
|
|
4
|
+
onChange: (value: string | string[]) => void;
|
|
5
|
+
options?: string[];
|
|
6
|
+
multi?: boolean;
|
|
7
|
+
required?: boolean;
|
|
8
|
+
helpText?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function SelectField({ label, value, onChange, options, multi, required, helpText, }: SelectFieldProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
//# sourceMappingURL=SelectField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectField.d.ts","sourceRoot":"","sources":["../../src/fields/SelectField.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,IAAI,CAAC;IAC7C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,KAAK,EACL,QAAQ,EACR,OAAY,EACZ,KAAa,EACb,QAAQ,EACR,QAAQ,GACT,EAAE,gBAAgB,2CA8FlB"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
export function SelectField({ label, value, onChange, options = [], multi = false, required, helpText, }) {
|
|
5
|
+
const [searchTerm, setSearchTerm] = useState('');
|
|
6
|
+
const [open, setOpen] = useState(false);
|
|
7
|
+
const selectedValues = multi
|
|
8
|
+
? (Array.isArray(value) ? value : [])
|
|
9
|
+
: [];
|
|
10
|
+
const singleValue = multi ? '' : (typeof value === 'string' ? value : '');
|
|
11
|
+
const filtered = options.filter((opt) => opt.toLowerCase().includes(searchTerm.toLowerCase()));
|
|
12
|
+
function handleSelect(opt) {
|
|
13
|
+
if (multi) {
|
|
14
|
+
const next = selectedValues.includes(opt)
|
|
15
|
+
? selectedValues.filter((v) => v !== opt)
|
|
16
|
+
: [...selectedValues, opt];
|
|
17
|
+
onChange(next);
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
onChange(opt);
|
|
21
|
+
setOpen(false);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return (_jsxs("div", { className: "relative", children: [_jsxs("label", { className: "mb-1 block text-sm font-medium", children: [label, required && _jsx("span", { className: "ml-0.5 text-[var(--destructive)]", children: "*" })] }), _jsxs("button", { type: "button", onClick: () => setOpen((o) => !o), className: "flex w-full items-center justify-between rounded-md border border-[var(--border)] bg-[var(--input-background)] px-3 py-2 text-sm", children: [_jsx("span", { className: singleValue || selectedValues.length ? '' : 'text-[var(--muted-foreground)]', children: multi
|
|
25
|
+
? selectedValues.length ? `${selectedValues.length} selected` : 'Select...'
|
|
26
|
+
: singleValue || 'Select...' }), _jsx("svg", { className: "h-4 w-4 text-[var(--muted-foreground)]", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: _jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" }) })] }), open && (_jsxs("div", { className: "absolute z-50 mt-1 w-full rounded-md border border-[var(--border)] bg-[var(--popover)] shadow-lg", children: [_jsx("div", { className: "border-b border-[var(--border)] p-2", children: _jsx("input", { type: "text", value: searchTerm, onChange: (e) => setSearchTerm(e.target.value), placeholder: "Search...", className: "w-full rounded bg-[var(--input-background)] px-2 py-1 text-sm outline-none" }) }), _jsxs("ul", { className: "max-h-48 overflow-y-auto py-1", children: [filtered.map((opt) => {
|
|
27
|
+
const isSelected = multi ? selectedValues.includes(opt) : singleValue === opt;
|
|
28
|
+
return (_jsx("li", { children: _jsxs("button", { type: "button", onClick: () => handleSelect(opt), className: `flex w-full items-center gap-2 px-3 py-1.5 text-sm hover:bg-[var(--accent)] ${isSelected ? 'font-medium' : ''}`, children: [multi && (_jsx("span", { className: `flex h-4 w-4 items-center justify-center rounded border ${isSelected ? 'border-[var(--primary)] bg-[var(--primary)] text-[var(--primary-foreground)]' : 'border-[var(--border)]'}`, children: isSelected && '✓' })), opt] }) }, opt));
|
|
29
|
+
}), filtered.length === 0 && (_jsx("li", { className: "px-3 py-2 text-sm text-[var(--muted-foreground)]", children: "No options found" }))] })] })), helpText && (_jsx("p", { className: "mt-1 text-xs text-[var(--muted-foreground)]", children: helpText }))] }));
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=SelectField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectField.js","sourceRoot":"","sources":["../../src/fields/SelectField.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface SlugFieldProps {
|
|
2
|
+
label: string;
|
|
3
|
+
value?: string;
|
|
4
|
+
onChange: (value: string) => void;
|
|
5
|
+
from?: string;
|
|
6
|
+
required?: boolean;
|
|
7
|
+
helpText?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function SlugField({ label, value, onChange, required, helpText }: SlugFieldProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=SlugField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SlugField.d.ts","sourceRoot":"","sources":["../../src/fields/SlugField.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAUD,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,KAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,cAAc,2CA2C5F"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
function toSlug(text) {
|
|
5
|
+
return text
|
|
6
|
+
.toLowerCase()
|
|
7
|
+
.replace(/[^\w\s-]/g, '')
|
|
8
|
+
.replace(/[\s_]+/g, '-')
|
|
9
|
+
.replace(/^-+|-+$/g, '');
|
|
10
|
+
}
|
|
11
|
+
export function SlugField({ label, value = '', onChange, required, helpText }) {
|
|
12
|
+
const [locked, setLocked] = useState(true);
|
|
13
|
+
return (_jsxs("div", { children: [_jsxs("label", { className: "mb-1 block text-sm font-medium", children: [label, required && _jsx("span", { className: "ml-0.5 text-[var(--destructive)]", children: "*" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsxs("div", { className: "flex flex-1 items-center rounded-md border border-[var(--border)] bg-[var(--input-background)]", children: [_jsx("span", { className: "pl-3 text-sm text-[var(--muted-foreground)]", children: "/" }), _jsx("input", { type: "text", value: value, onChange: (e) => onChange(toSlug(e.target.value)), readOnly: locked, className: "flex-1 bg-transparent px-1 py-2 text-sm outline-none" })] }), _jsx("button", { type: "button", onClick: () => setLocked((l) => !l), className: "rounded-md border border-[var(--border)] p-2 text-sm hover:bg-[var(--accent)]", "aria-label": locked ? 'Unlock slug' : 'Lock slug', children: _jsx("svg", { className: "h-4 w-4", fill: "none", viewBox: "0 0 24 24", stroke: "currentColor", strokeWidth: 2, children: locked ? (_jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z" })) : (_jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M8 11V7a4 4 0 118 0m-4 8v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2z" })) }) })] }), value && (_jsxs("p", { className: "mt-1 text-xs text-[var(--muted-foreground)]", children: ["URL preview: /", value] })), helpText && (_jsx("p", { className: "mt-1 text-xs text-[var(--muted-foreground)]", children: helpText }))] }));
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=SlugField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SlugField.js","sourceRoot":"","sources":["../../src/fields/SlugField.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,QAAQ,EAAa,MAAM,OAAO,CAAC;AAW5C,SAAS,MAAM,CAAC,IAAY;IAC1B,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;SACxB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAkB;IAC3F,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE3C,OAAO,CACL,0BACE,iBAAO,SAAS,EAAC,gCAAgC,aAC9C,KAAK,EACL,QAAQ,IAAI,eAAM,SAAS,EAAC,kCAAkC,kBAAS,IAClE,EACR,eAAK,SAAS,EAAC,yBAAyB,aACtC,eAAK,SAAS,EAAC,gGAAgG,aAC7G,eAAM,SAAS,EAAC,6CAA6C,kBAAS,EACtE,gBACE,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EACjD,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAC,sDAAsD,GAChE,IACE,EACN,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EACnC,SAAS,EAAC,+EAA+E,gBAC7E,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,YAEhD,cAAK,SAAS,EAAC,SAAS,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,EAAC,WAAW,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAE,CAAC,YAC1F,MAAM,CAAC,CAAC,CAAC,CACR,eAAM,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,CAAC,EAAC,sGAAsG,GAAG,CAC/J,CAAC,CAAC,CAAC,CACF,eAAM,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,EAAC,CAAC,EAAC,8FAA8F,GAAG,CACvJ,GACG,GACC,IACL,EACL,KAAK,IAAI,CACR,aAAG,SAAS,EAAC,6CAA6C,+BAAgB,KAAK,IAAK,CACrF,EACA,QAAQ,IAAI,CACX,YAAG,SAAS,EAAC,6CAA6C,YAAE,QAAQ,GAAK,CAC1E,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface TextFieldProps {
|
|
2
|
+
label: string;
|
|
3
|
+
value?: string;
|
|
4
|
+
onChange: (value: string) => void;
|
|
5
|
+
required?: boolean;
|
|
6
|
+
maxLength?: number;
|
|
7
|
+
helpText?: string;
|
|
8
|
+
error?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function TextField({ label, value, onChange, required, maxLength, helpText, error }: TextFieldProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
//# sourceMappingURL=TextField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextField.d.ts","sourceRoot":"","sources":["../../src/fields/TextField.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,KAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,cAAc,2CAmC9G"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
export function TextField({ label, value = '', onChange, required, maxLength, helpText, error }) {
|
|
4
|
+
const charCount = value.length;
|
|
5
|
+
const hasError = !!error || (maxLength !== undefined && charCount > maxLength);
|
|
6
|
+
return (_jsxs("div", { children: [_jsxs("label", { className: "mb-1 flex items-baseline justify-between text-sm font-medium", children: [_jsxs("span", { children: [label, required && _jsx("span", { className: "ml-0.5 text-[var(--destructive)]", children: "*" })] }), maxLength !== undefined && (_jsxs("span", { className: `text-xs ${hasError ? 'text-[var(--destructive)]' : 'text-[var(--muted-foreground)]'}`, children: [charCount, "/", maxLength] }))] }), _jsx("input", { type: "text", value: value, onChange: (e) => onChange(e.target.value), required: required, maxLength: maxLength, className: `w-full rounded-md border bg-[var(--input-background)] px-3 py-2 text-sm outline-none transition-colors focus:ring-2 focus:ring-[var(--ring)] ${hasError ? 'border-[var(--destructive)]' : 'border-[var(--border)]'}` }), helpText && !error && (_jsx("p", { className: "mt-1 text-xs text-[var(--muted-foreground)]", children: helpText })), error && (_jsx("p", { className: "mt-1 text-xs text-[var(--destructive)]", children: error }))] }));
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=TextField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextField.js","sourceRoot":"","sources":["../../src/fields/TextField.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAYb,MAAM,UAAU,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAkB;IAC7G,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC;IAC/B,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,SAAS,GAAG,SAAS,CAAC,CAAC;IAE/E,OAAO,CACL,0BACE,iBAAO,SAAS,EAAC,8DAA8D,aAC7E,2BACG,KAAK,EACL,QAAQ,IAAI,eAAM,SAAS,EAAC,kCAAkC,kBAAS,IACnE,EACN,SAAS,KAAK,SAAS,IAAI,CAC1B,gBAAM,SAAS,EAAE,WAAW,QAAQ,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,gCAAgC,EAAE,aACpG,SAAS,OAAG,SAAS,IACjB,CACR,IACK,EACR,gBACE,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzC,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,gJACT,QAAQ,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,wBAC7C,EAAE,GACF,EACD,QAAQ,IAAI,CAAC,KAAK,IAAI,CACrB,YAAG,SAAS,EAAC,6CAA6C,YAAE,QAAQ,GAAK,CAC1E,EACA,KAAK,IAAI,CACR,YAAG,SAAS,EAAC,wCAAwC,YAAE,KAAK,GAAK,CAClE,IACG,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface ToggleFieldProps {
|
|
2
|
+
label: string;
|
|
3
|
+
value?: boolean;
|
|
4
|
+
onChange: (value: boolean) => void;
|
|
5
|
+
helpText?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function ToggleField({ label, value, onChange, helpText }: ToggleFieldProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=ToggleField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToggleField.d.ts","sourceRoot":"","sources":["../../src/fields/ToggleField.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,KAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,gBAAgB,2CA0BzF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
export function ToggleField({ label, value = false, onChange, helpText }) {
|
|
4
|
+
return (_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("div", { children: [_jsx("span", { className: "text-sm font-medium", children: label }), helpText && (_jsx("p", { className: "text-xs text-[var(--muted-foreground)]", children: helpText }))] }), _jsx("button", { type: "button", role: "switch", "aria-checked": value, onClick: () => onChange(!value), className: `relative inline-flex h-6 w-11 shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors ${value ? 'bg-[var(--primary)]' : 'bg-[var(--muted)]'}`, children: _jsx("span", { className: `pointer-events-none inline-block h-5 w-5 rounded-full bg-white shadow-sm ring-0 transition-transform ${value ? 'translate-x-5' : 'translate-x-0'}` }) })] }));
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=ToggleField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ToggleField.js","sourceRoot":"","sources":["../../src/fields/ToggleField.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AASb,MAAM,UAAU,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAoB;IACxF,OAAO,CACL,eAAK,SAAS,EAAC,mCAAmC,aAChD,0BACE,eAAM,SAAS,EAAC,qBAAqB,YAAE,KAAK,GAAQ,EACnD,QAAQ,IAAI,CACX,YAAG,SAAS,EAAC,wCAAwC,YAAE,QAAQ,GAAK,CACrE,IACG,EACN,iBACE,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,QAAQ,kBACC,KAAK,EACnB,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,EAC/B,SAAS,EAAE,oHACT,KAAK,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,mBAClC,EAAE,YAEF,eACE,SAAS,EAAE,wGACT,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAC5B,EAAE,GACF,GACK,IACL,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface BlockTypeDefinition {
|
|
2
|
+
type: string;
|
|
3
|
+
label: string;
|
|
4
|
+
icon: string;
|
|
5
|
+
description: string;
|
|
6
|
+
fields: {
|
|
7
|
+
name: string;
|
|
8
|
+
type: string;
|
|
9
|
+
label: string;
|
|
10
|
+
required?: boolean;
|
|
11
|
+
options?: {
|
|
12
|
+
value: string;
|
|
13
|
+
label: string;
|
|
14
|
+
}[];
|
|
15
|
+
}[];
|
|
16
|
+
}
|
|
17
|
+
export declare const PRESET_BLOCKS: BlockTypeDefinition[];
|
|
18
|
+
//# sourceMappingURL=block-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block-types.d.ts","sourceRoot":"","sources":["../../src/fields/block-types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KAAE,EAAE,CAAC;CAC3H;AAED,eAAO,MAAM,aAAa,EAAE,mBAAmB,EAsF9C,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
export const PRESET_BLOCKS = [
|
|
2
|
+
{
|
|
3
|
+
type: 'hero',
|
|
4
|
+
label: 'Hero',
|
|
5
|
+
icon: 'layout',
|
|
6
|
+
description: 'Full-width hero section with heading and CTA',
|
|
7
|
+
fields: [
|
|
8
|
+
{ name: 'heading', type: 'text', label: 'Heading', required: true },
|
|
9
|
+
{ name: 'subheading', type: 'text', label: 'Subheading' },
|
|
10
|
+
{ name: 'buttonText', type: 'text', label: 'Button Text' },
|
|
11
|
+
{ name: 'buttonUrl', type: 'text', label: 'Button URL' },
|
|
12
|
+
{ name: 'backgroundImage', type: 'media', label: 'Background Image' },
|
|
13
|
+
{ name: 'alignment', type: 'select', label: 'Alignment', options: [
|
|
14
|
+
{ value: 'left', label: 'Left' },
|
|
15
|
+
{ value: 'center', label: 'Center' },
|
|
16
|
+
{ value: 'right', label: 'Right' },
|
|
17
|
+
] },
|
|
18
|
+
],
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
type: 'cta',
|
|
22
|
+
label: 'Call to Action',
|
|
23
|
+
icon: 'megaphone',
|
|
24
|
+
description: 'Attention-grabbing CTA section',
|
|
25
|
+
fields: [
|
|
26
|
+
{ name: 'heading', type: 'text', label: 'Heading', required: true },
|
|
27
|
+
{ name: 'description', type: 'text', label: 'Description' },
|
|
28
|
+
{ name: 'buttonText', type: 'text', label: 'Button Text', required: true },
|
|
29
|
+
{ name: 'buttonUrl', type: 'text', label: 'Button URL', required: true },
|
|
30
|
+
{ name: 'style', type: 'select', label: 'Style', options: [
|
|
31
|
+
{ value: 'primary', label: 'Primary' },
|
|
32
|
+
{ value: 'secondary', label: 'Secondary' },
|
|
33
|
+
{ value: 'outline', label: 'Outline' },
|
|
34
|
+
] },
|
|
35
|
+
],
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
type: 'columns',
|
|
39
|
+
label: 'Columns',
|
|
40
|
+
icon: 'columns',
|
|
41
|
+
description: '2 or 3 column layout with rich text',
|
|
42
|
+
fields: [
|
|
43
|
+
{ name: 'columnCount', type: 'select', label: 'Columns', options: [
|
|
44
|
+
{ value: '2', label: '2 Columns' },
|
|
45
|
+
{ value: '3', label: '3 Columns' },
|
|
46
|
+
] },
|
|
47
|
+
{ name: 'column1', type: 'richText', label: 'Column 1' },
|
|
48
|
+
{ name: 'column2', type: 'richText', label: 'Column 2' },
|
|
49
|
+
{ name: 'column3', type: 'richText', label: 'Column 3' },
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
type: 'imageText',
|
|
54
|
+
label: 'Image + Text',
|
|
55
|
+
icon: 'image',
|
|
56
|
+
description: 'Image alongside text content',
|
|
57
|
+
fields: [
|
|
58
|
+
{ name: 'image', type: 'media', label: 'Image', required: true },
|
|
59
|
+
{ name: 'content', type: 'richText', label: 'Content', required: true },
|
|
60
|
+
{ name: 'imagePosition', type: 'select', label: 'Image Position', options: [
|
|
61
|
+
{ value: 'left', label: 'Left' },
|
|
62
|
+
{ value: 'right', label: 'Right' },
|
|
63
|
+
] },
|
|
64
|
+
],
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
type: 'quote',
|
|
68
|
+
label: 'Quote',
|
|
69
|
+
icon: 'quote',
|
|
70
|
+
description: 'Blockquote with attribution',
|
|
71
|
+
fields: [
|
|
72
|
+
{ name: 'text', type: 'text', label: 'Quote Text', required: true },
|
|
73
|
+
{ name: 'author', type: 'text', label: 'Author' },
|
|
74
|
+
{ name: 'role', type: 'text', label: 'Author Role' },
|
|
75
|
+
],
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
type: 'video',
|
|
79
|
+
label: 'Video Embed',
|
|
80
|
+
icon: 'play',
|
|
81
|
+
description: 'Embedded video from YouTube or Vimeo',
|
|
82
|
+
fields: [
|
|
83
|
+
{ name: 'url', type: 'text', label: 'Video URL', required: true },
|
|
84
|
+
{ name: 'caption', type: 'text', label: 'Caption' },
|
|
85
|
+
],
|
|
86
|
+
},
|
|
87
|
+
];
|
|
88
|
+
//# sourceMappingURL=block-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"block-types.js","sourceRoot":"","sources":["../../src/fields/block-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export { FieldRenderer } from './FieldRenderer';
|
|
2
|
+
export type { FieldRendererProps, FieldDefinition } from './FieldRenderer';
|
|
3
|
+
export { TextField } from './TextField';
|
|
4
|
+
export { RichTextField } from './RichTextField';
|
|
5
|
+
export { SlugField } from './SlugField';
|
|
6
|
+
export { SelectField } from './SelectField';
|
|
7
|
+
export { MediaField } from './MediaField';
|
|
8
|
+
export { RelationshipField } from './RelationshipField';
|
|
9
|
+
export { DateField } from './DateField';
|
|
10
|
+
export { ToggleField } from './ToggleField';
|
|
11
|
+
export { ArrayField } from './ArrayField';
|
|
12
|
+
export { BlockBuilderField } from './BlockBuilderField';
|
|
13
|
+
export { PRESET_BLOCKS } from './block-types';
|
|
14
|
+
export type { BlockTypeDefinition } from './block-types';
|
|
15
|
+
export { GroupField } from './GroupField';
|
|
16
|
+
export { NavBuilderField } from './NavBuilderField';
|
|
17
|
+
export { NumberField } from './NumberField';
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/fields/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export { FieldRenderer } from './FieldRenderer';
|
|
2
|
+
export { TextField } from './TextField';
|
|
3
|
+
export { RichTextField } from './RichTextField';
|
|
4
|
+
export { SlugField } from './SlugField';
|
|
5
|
+
export { SelectField } from './SelectField';
|
|
6
|
+
export { MediaField } from './MediaField';
|
|
7
|
+
export { RelationshipField } from './RelationshipField';
|
|
8
|
+
export { DateField } from './DateField';
|
|
9
|
+
export { ToggleField } from './ToggleField';
|
|
10
|
+
export { ArrayField } from './ArrayField';
|
|
11
|
+
export { BlockBuilderField } from './BlockBuilderField';
|
|
12
|
+
export { PRESET_BLOCKS } from './block-types';
|
|
13
|
+
export { GroupField } from './GroupField';
|
|
14
|
+
export { NavBuilderField } from './NavBuilderField';
|
|
15
|
+
export { NumberField } from './NumberField';
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fields/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
interface ContentLock {
|
|
2
|
+
lockedBy: string | null;
|
|
3
|
+
lockedAt: Date | null;
|
|
4
|
+
isLocked: boolean;
|
|
5
|
+
isLockedByMe: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function useContentLock(documentId: string | undefined, userId: string): ContentLock & {
|
|
8
|
+
acquireLock: () => Promise<boolean>;
|
|
9
|
+
releaseLock: () => Promise<void>;
|
|
10
|
+
};
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=useContentLock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useContentLock.d.ts","sourceRoot":"","sources":["../../src/hooks/useContentLock.ts"],"names":[],"mappings":"AAIA,UAAU,WAAW;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG;IAC5F,WAAW,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACpC,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAClC,CAqCA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useState, useEffect, useCallback } from 'react';
|
|
3
|
+
export function useContentLock(documentId, userId) {
|
|
4
|
+
const [lock, setLock] = useState({
|
|
5
|
+
lockedBy: null,
|
|
6
|
+
lockedAt: null,
|
|
7
|
+
isLocked: false,
|
|
8
|
+
isLockedByMe: false,
|
|
9
|
+
});
|
|
10
|
+
const acquireLock = useCallback(async () => {
|
|
11
|
+
if (!documentId)
|
|
12
|
+
return false;
|
|
13
|
+
setLock({
|
|
14
|
+
lockedBy: userId,
|
|
15
|
+
lockedAt: new Date(),
|
|
16
|
+
isLocked: true,
|
|
17
|
+
isLockedByMe: true,
|
|
18
|
+
});
|
|
19
|
+
return true;
|
|
20
|
+
}, [documentId, userId]);
|
|
21
|
+
const releaseLock = useCallback(async () => {
|
|
22
|
+
setLock({
|
|
23
|
+
lockedBy: null,
|
|
24
|
+
lockedAt: null,
|
|
25
|
+
isLocked: false,
|
|
26
|
+
isLockedByMe: false,
|
|
27
|
+
});
|
|
28
|
+
}, []);
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
return () => {
|
|
31
|
+
if (lock.isLockedByMe) {
|
|
32
|
+
releaseLock();
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
}, [lock.isLockedByMe, releaseLock]);
|
|
36
|
+
return { ...lock, acquireLock, releaseLock };
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=useContentLock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useContentLock.js","sourceRoot":"","sources":["../../src/hooks/useContentLock.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AASzD,MAAM,UAAU,cAAc,CAAC,UAA8B,EAAE,MAAc;IAI3E,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAc;QAC5C,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,KAAK;QACf,YAAY,EAAE,KAAK;KACpB,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACzC,IAAI,CAAC,UAAU;YAAE,OAAO,KAAK,CAAC;QAC9B,OAAO,CAAC;YACN,QAAQ,EAAE,MAAM;YAChB,QAAQ,EAAE,IAAI,IAAI,EAAE;YACpB,QAAQ,EAAE,IAAI;YACd,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IAEzB,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACzC,OAAO,CAAC;YACN,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,KAAK;YACf,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,GAAG,EAAE;YACV,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtB,WAAW,EAAE,CAAC;YAChB,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC,CAAC;IAErC,OAAO,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDebounce.d.ts","sourceRoot":"","sources":["../../src/hooks/useDebounce.ts"],"names":[],"mappings":"AAIA,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,CAS3D"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
export function useDebounce(value, delayMs) {
|
|
4
|
+
const [debouncedValue, setDebouncedValue] = useState(value);
|
|
5
|
+
useEffect(() => {
|
|
6
|
+
const timer = setTimeout(() => setDebouncedValue(value), delayMs);
|
|
7
|
+
return () => clearTimeout(timer);
|
|
8
|
+
}, [value, delayMs]);
|
|
9
|
+
return debouncedValue;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=useDebounce.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useDebounce.js","sourceRoot":"","sources":["../../src/hooks/useDebounce.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE5C,MAAM,UAAU,WAAW,CAAI,KAAQ,EAAE,OAAe;IACtD,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE5D,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QAClE,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAErB,OAAO,cAAc,CAAC;AACxB,CAAC"}
|