payload-better-editor 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +57 -0
- package/dist/admin/ErrorBoundary.d.ts +17 -0
- package/dist/admin/ErrorBoundary.js +62 -0
- package/dist/admin/ErrorBoundary.js.map +1 -0
- package/dist/admin/LiveEditorOverlay.d.ts +12 -0
- package/dist/admin/LiveEditorOverlay.js +160 -0
- package/dist/admin/LiveEditorOverlay.js.map +1 -0
- package/dist/admin/LiveEditorToggle.d.ts +7 -0
- package/dist/admin/LiveEditorToggle.js +84 -0
- package/dist/admin/LiveEditorToggle.js.map +1 -0
- package/dist/admin/PreviewFrame.d.ts +22 -0
- package/dist/admin/PreviewFrame.js +137 -0
- package/dist/admin/PreviewFrame.js.map +1 -0
- package/dist/admin/PreviewToolbar.d.ts +16 -0
- package/dist/admin/PreviewToolbar.js +90 -0
- package/dist/admin/PreviewToolbar.js.map +1 -0
- package/dist/admin/SettingsBanner.d.ts +3 -0
- package/dist/admin/SettingsBanner.js +105 -0
- package/dist/admin/SettingsBanner.js.map +1 -0
- package/dist/admin/ViewportToggle.d.ts +7 -0
- package/dist/admin/ViewportToggle.js +79 -0
- package/dist/admin/ViewportToggle.js.map +1 -0
- package/dist/admin/blocks/AddBlockDrawer.d.ts +9 -0
- package/dist/admin/blocks/AddBlockDrawer.js +16 -0
- package/dist/admin/blocks/AddBlockDrawer.js.map +1 -0
- package/dist/admin/blocks/BlockActionsToolbar.d.ts +15 -0
- package/dist/admin/blocks/BlockActionsToolbar.js +102 -0
- package/dist/admin/blocks/BlockActionsToolbar.js.map +1 -0
- package/dist/admin/blocks/BlockEmptyState.d.ts +6 -0
- package/dist/admin/blocks/BlockEmptyState.js +26 -0
- package/dist/admin/blocks/BlockEmptyState.js.map +1 -0
- package/dist/admin/blocks/BlockHeader.d.ts +7 -0
- package/dist/admin/blocks/BlockHeader.js +32 -0
- package/dist/admin/blocks/BlockHeader.js.map +1 -0
- package/dist/admin/blocks/schema.d.ts +19 -0
- package/dist/admin/blocks/schema.js +80 -0
- package/dist/admin/blocks/schema.js.map +1 -0
- package/dist/admin/blocks/useBlockActions.d.ts +24 -0
- package/dist/admin/blocks/useBlockActions.js +100 -0
- package/dist/admin/blocks/useBlockActions.js.map +1 -0
- package/dist/admin/icons.d.ts +24 -0
- package/dist/admin/icons.js +36 -0
- package/dist/admin/icons.js.map +1 -0
- package/dist/admin/sidebar/BlockSettingsTab.d.ts +10 -0
- package/dist/admin/sidebar/BlockSettingsTab.js +153 -0
- package/dist/admin/sidebar/BlockSettingsTab.js.map +1 -0
- package/dist/admin/sidebar/DocumentFieldsTab.d.ts +8 -0
- package/dist/admin/sidebar/DocumentFieldsTab.js +38 -0
- package/dist/admin/sidebar/DocumentFieldsTab.js.map +1 -0
- package/dist/admin/sidebar/DocumentMetaTab.d.ts +2 -0
- package/dist/admin/sidebar/DocumentMetaTab.js +11 -0
- package/dist/admin/sidebar/DocumentMetaTab.js.map +1 -0
- package/dist/admin/sidebar/DocumentSettingsTab.d.ts +2 -0
- package/dist/admin/sidebar/DocumentSettingsTab.js +48 -0
- package/dist/admin/sidebar/DocumentSettingsTab.js.map +1 -0
- package/dist/admin/sidebar/Sidebar.d.ts +10 -0
- package/dist/admin/sidebar/Sidebar.js +92 -0
- package/dist/admin/sidebar/Sidebar.js.map +1 -0
- package/dist/client.d.ts +34 -0
- package/dist/client.js +30 -0
- package/dist/client.js.map +1 -0
- package/dist/global.d.ts +4 -0
- package/dist/global.js +200 -0
- package/dist/global.js.map +1 -0
- package/dist/hooks/useAddBlockDrawer.d.ts +14 -0
- package/dist/hooks/useAddBlockDrawer.js +26 -0
- package/dist/hooks/useAddBlockDrawer.js.map +1 -0
- package/dist/hooks/useBlockActionMessages.d.ts +8 -0
- package/dist/hooks/useBlockActionMessages.js +107 -0
- package/dist/hooks/useBlockActionMessages.js.map +1 -0
- package/dist/hooks/useDocConfig.d.ts +6 -0
- package/dist/hooks/useDocConfig.js +18 -0
- package/dist/hooks/useDocConfig.js.map +1 -0
- package/dist/hooks/useFocusTrap.d.ts +2 -0
- package/dist/hooks/useFocusTrap.js +84 -0
- package/dist/hooks/useFocusTrap.js.map +1 -0
- package/dist/hooks/useFullscreenOverlay.d.ts +2 -0
- package/dist/hooks/useFullscreenOverlay.js +30 -0
- package/dist/hooks/useFullscreenOverlay.js.map +1 -0
- package/dist/hooks/useIframeResizeObserver.d.ts +2 -0
- package/dist/hooks/useIframeResizeObserver.js +20 -0
- package/dist/hooks/useIframeResizeObserver.js.map +1 -0
- package/dist/hooks/useLatestRef.d.ts +6 -0
- package/dist/hooks/useLatestRef.js +12 -0
- package/dist/hooks/useLatestRef.js.map +1 -0
- package/dist/hooks/useMainWrapperPortal.d.ts +1 -0
- package/dist/hooks/useMainWrapperPortal.js +64 -0
- package/dist/hooks/useMainWrapperPortal.js.map +1 -0
- package/dist/hooks/useOverlayKeyboard.d.ts +6 -0
- package/dist/hooks/useOverlayKeyboard.js +43 -0
- package/dist/hooks/useOverlayKeyboard.js.map +1 -0
- package/dist/hooks/usePreviewBinding.d.ts +28 -0
- package/dist/hooks/usePreviewBinding.js +108 -0
- package/dist/hooks/usePreviewBinding.js.map +1 -0
- package/dist/hooks/usePreviewHandleDrag.d.ts +11 -0
- package/dist/hooks/usePreviewHandleDrag.js +53 -0
- package/dist/hooks/usePreviewHandleDrag.js.map +1 -0
- package/dist/hooks/usePreviewSelectionSync.d.ts +15 -0
- package/dist/hooks/usePreviewSelectionSync.js +80 -0
- package/dist/hooks/usePreviewSelectionSync.js.map +1 -0
- package/dist/hooks/usePreviewSettingsSync.d.ts +17 -0
- package/dist/hooks/usePreviewSettingsSync.js +55 -0
- package/dist/hooks/usePreviewSettingsSync.js.map +1 -0
- package/dist/hooks/useSidebarResize.d.ts +8 -0
- package/dist/hooks/useSidebarResize.js +101 -0
- package/dist/hooks/useSidebarResize.js.map +1 -0
- package/dist/hooks/useViewportState.d.ts +10 -0
- package/dist/hooks/useViewportState.js +44 -0
- package/dist/hooks/useViewportState.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.js +104 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/constants.d.ts +22 -0
- package/dist/internal/constants.js +38 -0
- package/dist/internal/constants.js.map +1 -0
- package/dist/internal/dom.d.ts +4 -0
- package/dist/internal/dom.js +6 -0
- package/dist/internal/dom.js.map +1 -0
- package/dist/internal/iframe.d.ts +5 -0
- package/dist/internal/iframe.js +12 -0
- package/dist/internal/iframe.js.map +1 -0
- package/dist/internal/limits.d.ts +9 -0
- package/dist/internal/limits.js +11 -0
- package/dist/internal/limits.js.map +1 -0
- package/dist/internal/path.d.ts +5 -0
- package/dist/internal/path.js +12 -0
- package/dist/internal/path.js.map +1 -0
- package/dist/internal/postmessage.d.ts +3 -0
- package/dist/internal/postmessage.js +21 -0
- package/dist/internal/postmessage.js.map +1 -0
- package/dist/internal/storage-keys.d.ts +8 -0
- package/dist/internal/storage-keys.js +9 -0
- package/dist/internal/storage-keys.js.map +1 -0
- package/dist/internal/storage.d.ts +2 -0
- package/dist/internal/storage.js +20 -0
- package/dist/internal/storage.js.map +1 -0
- package/dist/preview/HoverToolbar.d.ts +8 -0
- package/dist/preview/HoverToolbar.js +48 -0
- package/dist/preview/HoverToolbar.js.map +1 -0
- package/dist/preview/HoverToolbarController.d.ts +31 -0
- package/dist/preview/HoverToolbarController.js +160 -0
- package/dist/preview/HoverToolbarController.js.map +1 -0
- package/dist/preview/hover-css.d.ts +11 -0
- package/dist/preview/hover-css.js +94 -0
- package/dist/preview/hover-css.js.map +1 -0
- package/dist/preview/installClickToFocus.d.ts +6 -0
- package/dist/preview/installClickToFocus.js +21 -0
- package/dist/preview/installClickToFocus.js.map +1 -0
- package/dist/preview/installHoverStyles.d.ts +2 -0
- package/dist/preview/installHoverStyles.js +15 -0
- package/dist/preview/installHoverStyles.js.map +1 -0
- package/dist/preview/protocol.d.ts +11 -0
- package/dist/preview/protocol.js +19 -0
- package/dist/preview/protocol.js.map +1 -0
- package/dist/preview/toolbar-position.d.ts +20 -0
- package/dist/preview/toolbar-position.js +22 -0
- package/dist/preview/toolbar-position.js.map +1 -0
- package/dist/providers/BetterEditorConfigProvider.d.ts +14 -0
- package/dist/providers/BetterEditorConfigProvider.js +26 -0
- package/dist/providers/BetterEditorConfigProvider.js.map +1 -0
- package/dist/providers/OverlayProviders.d.ts +8 -0
- package/dist/providers/OverlayProviders.js +22 -0
- package/dist/providers/OverlayProviders.js.map +1 -0
- package/dist/state/useBetterEditorSettings.d.ts +18 -0
- package/dist/state/useBetterEditorSettings.js +65 -0
- package/dist/state/useBetterEditorSettings.js.map +1 -0
- package/dist/state/useEditorHistory.d.ts +16 -0
- package/dist/state/useEditorHistory.js +157 -0
- package/dist/state/useEditorHistory.js.map +1 -0
- package/dist/styles/blocks-tab.css +163 -0
- package/dist/styles/overlay.css +133 -0
- package/dist/styles/preview.css +211 -0
- package/dist/styles/settings-banner.css +73 -0
- package/dist/styles/sidebar.css +88 -0
- package/dist/types.d.ts +41 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +6 -0
- package/dist/version.js.map +1 -0
- package/package.json +117 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ClientBlock, ClientField, FormState } from 'payload';
|
|
2
|
+
export type Resolved = {
|
|
3
|
+
blockType: string;
|
|
4
|
+
blockFields: ClientField[];
|
|
5
|
+
schemaPath: string;
|
|
6
|
+
parentPath: string;
|
|
7
|
+
blocksFieldSchemaPath: string;
|
|
8
|
+
blocksFieldBlocks: ClientBlock[];
|
|
9
|
+
};
|
|
10
|
+
export type BlockSchemaContext = {
|
|
11
|
+
docFields: ClientField[];
|
|
12
|
+
docSlug: string;
|
|
13
|
+
formFields: FormState;
|
|
14
|
+
};
|
|
15
|
+
export declare const findNamedField: (fields: ClientField[], name: string, schemaPath: string) => {
|
|
16
|
+
field: ClientField;
|
|
17
|
+
schemaPath: string;
|
|
18
|
+
} | null;
|
|
19
|
+
export declare const resolveBlockSchema: (context: BlockSchemaContext, blockPath: string) => Resolved | null;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
const tabHasName = (tab)=>typeof tab.name === 'string';
|
|
2
|
+
export const findNamedField = (fields, name, schemaPath)=>{
|
|
3
|
+
for (const field of fields){
|
|
4
|
+
if (!field || typeof field !== 'object') continue;
|
|
5
|
+
if ('name' in field && typeof field.name === 'string' && field.name === name) {
|
|
6
|
+
return {
|
|
7
|
+
field,
|
|
8
|
+
schemaPath: `${schemaPath}.${name}`
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
if (field.type === 'tabs') {
|
|
12
|
+
for (const tab of field.tabs){
|
|
13
|
+
const tabSchemaPath = tabHasName(tab) ? `${schemaPath}.${tab.name}` : schemaPath;
|
|
14
|
+
const found = findNamedField(tab.fields, name, tabSchemaPath);
|
|
15
|
+
if (found) return found;
|
|
16
|
+
}
|
|
17
|
+
} else if (field.type === 'collapsible' || field.type === 'row') {
|
|
18
|
+
const found = findNamedField(field.fields, name, schemaPath);
|
|
19
|
+
if (found) return found;
|
|
20
|
+
}
|
|
21
|
+
// Groups are not transparent: their inner fields are reached via the
|
|
22
|
+
// group's own name as the next path segment.
|
|
23
|
+
}
|
|
24
|
+
return null;
|
|
25
|
+
};
|
|
26
|
+
export const resolveBlockSchema = (context, blockPath)=>{
|
|
27
|
+
const { docFields, docSlug, formFields } = context;
|
|
28
|
+
const segments = blockPath.split('.');
|
|
29
|
+
let currentFields = docFields;
|
|
30
|
+
let currentSchemaPath = docSlug;
|
|
31
|
+
let currentPath = '';
|
|
32
|
+
let blockType = null;
|
|
33
|
+
let blockConfig = null;
|
|
34
|
+
let blocksFieldSchemaPath = '';
|
|
35
|
+
let blocksFieldBlocks = [];
|
|
36
|
+
for(let i = 0; i < segments.length; i += 2){
|
|
37
|
+
const fieldName = segments[i];
|
|
38
|
+
const indexStr = segments[i + 1];
|
|
39
|
+
if (indexStr === undefined) break;
|
|
40
|
+
const index = Number(indexStr);
|
|
41
|
+
if (!Number.isInteger(index) || index < 0) return null;
|
|
42
|
+
const found = findNamedField(currentFields, fieldName, currentSchemaPath);
|
|
43
|
+
if (!found) return null;
|
|
44
|
+
const field = found.field;
|
|
45
|
+
currentSchemaPath = found.schemaPath;
|
|
46
|
+
currentPath = currentPath ? `${currentPath}.${fieldName}` : fieldName;
|
|
47
|
+
if (field.type === 'blocks') {
|
|
48
|
+
const rows = formFields[currentPath]?.rows;
|
|
49
|
+
if (!Array.isArray(rows) || index >= rows.length) return null;
|
|
50
|
+
const row = rows[index];
|
|
51
|
+
if (!row?.blockType) return null;
|
|
52
|
+
blockType = row.blockType;
|
|
53
|
+
const blocks = field.blocks;
|
|
54
|
+
blockConfig = blocks.find((b)=>b.slug === blockType) ?? null;
|
|
55
|
+
if (!blockConfig) return null;
|
|
56
|
+
// Capture parent before descending — used by "add sibling block".
|
|
57
|
+
blocksFieldSchemaPath = currentSchemaPath;
|
|
58
|
+
blocksFieldBlocks = blocks;
|
|
59
|
+
currentFields = blockConfig.fields;
|
|
60
|
+
currentSchemaPath = `${currentSchemaPath}.${blockType}`;
|
|
61
|
+
currentPath = `${currentPath}.${index}`;
|
|
62
|
+
} else if (field.type === 'array') {
|
|
63
|
+
currentFields = field.fields;
|
|
64
|
+
currentPath = `${currentPath}.${index}`;
|
|
65
|
+
} else {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (!blockType || !blockConfig) return null;
|
|
70
|
+
return {
|
|
71
|
+
blockType,
|
|
72
|
+
blockFields: currentFields,
|
|
73
|
+
schemaPath: currentSchemaPath,
|
|
74
|
+
parentPath: currentPath,
|
|
75
|
+
blocksFieldSchemaPath,
|
|
76
|
+
blocksFieldBlocks
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/admin/blocks/schema.ts"],"sourcesContent":["import type { ClientTab } from 'payload'\nimport type { ClientBlock, ClientField, FormState } from 'payload'\n\nexport type Resolved = {\n blockType: string\n blockFields: ClientField[]\n schemaPath: string\n parentPath: string\n blocksFieldSchemaPath: string\n blocksFieldBlocks: ClientBlock[]\n}\n\nexport type BlockSchemaContext = {\n docFields: ClientField[]\n docSlug: string\n formFields: FormState\n}\n\nconst tabHasName = (tab: ClientTab): tab is ClientTab & { name: string } =>\n typeof (tab as { name?: unknown }).name === 'string'\n\nexport const findNamedField = (\n fields: ClientField[],\n name: string,\n schemaPath: string,\n): { field: ClientField; schemaPath: string } | null => {\n for (const field of fields) {\n if (!field || typeof field !== 'object') continue\n\n if ('name' in field && typeof field.name === 'string' && field.name === name) {\n return { field, schemaPath: `${schemaPath}.${name}` }\n }\n\n if (field.type === 'tabs') {\n for (const tab of field.tabs) {\n const tabSchemaPath = tabHasName(tab) ? `${schemaPath}.${tab.name}` : schemaPath\n const found = findNamedField(tab.fields, name, tabSchemaPath)\n if (found) return found\n }\n } else if (field.type === 'collapsible' || field.type === 'row') {\n const found = findNamedField(field.fields, name, schemaPath)\n if (found) return found\n }\n // Groups are not transparent: their inner fields are reached via the\n // group's own name as the next path segment.\n }\n return null\n}\n\nexport const resolveBlockSchema = (\n context: BlockSchemaContext,\n blockPath: string,\n): Resolved | null => {\n const { docFields, docSlug, formFields } = context\n const segments = blockPath.split('.')\n let currentFields: ClientField[] = docFields\n let currentSchemaPath = docSlug\n let currentPath = ''\n let blockType: string | null = null\n let blockConfig: ClientBlock | null = null\n let blocksFieldSchemaPath = ''\n let blocksFieldBlocks: ClientBlock[] = []\n\n for (let i = 0; i < segments.length; i += 2) {\n const fieldName = segments[i]\n const indexStr = segments[i + 1]\n if (indexStr === undefined) break\n const index = Number(indexStr)\n if (!Number.isInteger(index) || index < 0) return null\n\n const found = findNamedField(currentFields, fieldName, currentSchemaPath)\n if (!found) return null\n const field = found.field\n currentSchemaPath = found.schemaPath\n currentPath = currentPath ? `${currentPath}.${fieldName}` : fieldName\n\n if (field.type === 'blocks') {\n const rows = formFields[currentPath]?.rows\n if (!Array.isArray(rows) || index >= rows.length) return null\n const row = rows[index] as { blockType?: string } | undefined\n if (!row?.blockType) return null\n blockType = row.blockType\n const blocks = field.blocks\n blockConfig = blocks.find((b) => b.slug === blockType) ?? null\n if (!blockConfig) return null\n // Capture parent before descending — used by \"add sibling block\".\n blocksFieldSchemaPath = currentSchemaPath\n blocksFieldBlocks = blocks\n currentFields = blockConfig.fields\n currentSchemaPath = `${currentSchemaPath}.${blockType}`\n currentPath = `${currentPath}.${index}`\n } else if (field.type === 'array') {\n currentFields = field.fields\n currentPath = `${currentPath}.${index}`\n } else {\n return null\n }\n }\n\n if (!blockType || !blockConfig) return null\n\n return {\n blockType,\n blockFields: currentFields,\n schemaPath: currentSchemaPath,\n parentPath: currentPath,\n blocksFieldSchemaPath,\n blocksFieldBlocks,\n }\n}\n"],"names":["tabHasName","tab","name","findNamedField","fields","schemaPath","field","type","tabs","tabSchemaPath","found","resolveBlockSchema","context","blockPath","docFields","docSlug","formFields","segments","split","currentFields","currentSchemaPath","currentPath","blockType","blockConfig","blocksFieldSchemaPath","blocksFieldBlocks","i","length","fieldName","indexStr","undefined","index","Number","isInteger","rows","Array","isArray","row","blocks","find","b","slug","blockFields","parentPath"],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
type Args = {
|
|
2
|
+
selectedBlockPath: string | null;
|
|
3
|
+
onSelectPath: (path: string | null) => void;
|
|
4
|
+
onClearSelection: () => void;
|
|
5
|
+
};
|
|
6
|
+
export declare const useBlockActions: ({ selectedBlockPath, onSelectPath, onClearSelection, }: Args) => {
|
|
7
|
+
moveUp: () => void;
|
|
8
|
+
moveDown: () => void;
|
|
9
|
+
duplicate: () => void;
|
|
10
|
+
remove: () => void;
|
|
11
|
+
addAfter: ({ blockType, schemaPath, containerPath, index, }: {
|
|
12
|
+
blockType?: string;
|
|
13
|
+
schemaPath: string;
|
|
14
|
+
containerPath: string;
|
|
15
|
+
index: number;
|
|
16
|
+
}) => void;
|
|
17
|
+
canMoveUp: boolean;
|
|
18
|
+
canMoveDown: boolean;
|
|
19
|
+
canMutate: boolean;
|
|
20
|
+
parentPath: string;
|
|
21
|
+
rowIndex: number;
|
|
22
|
+
rowCount: number;
|
|
23
|
+
};
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useAllFormFields, useForm } from '@payloadcms/ui';
|
|
3
|
+
import { useEditorHistory } from '../../state/useEditorHistory';
|
|
4
|
+
import { splitFieldPath } from '../../internal/path';
|
|
5
|
+
const rowCountAt = (fields, path)=>{
|
|
6
|
+
const rows = fields[path]?.rows;
|
|
7
|
+
return Array.isArray(rows) ? rows.length : 0;
|
|
8
|
+
};
|
|
9
|
+
export const useBlockActions = ({ selectedBlockPath, onSelectPath, onClearSelection })=>{
|
|
10
|
+
const [fields] = useAllFormFields();
|
|
11
|
+
const { addFieldRow, dispatchFields } = useForm();
|
|
12
|
+
const { commit } = useEditorHistory();
|
|
13
|
+
const split = selectedBlockPath ? splitFieldPath(selectedBlockPath) : null;
|
|
14
|
+
const parentPath = split?.parent ?? '';
|
|
15
|
+
const rowIndex = split ? split.index : NaN;
|
|
16
|
+
const rowCount = parentPath ? rowCountAt(fields, parentPath) : 0;
|
|
17
|
+
const canMutate = !Number.isNaN(rowIndex) && parentPath !== '' && rowIndex < rowCount;
|
|
18
|
+
const canMoveUp = canMutate && rowIndex > 0;
|
|
19
|
+
const canMoveDown = canMutate && rowIndex < rowCount - 1;
|
|
20
|
+
// Re-check bounds at call time: form state may have shifted between
|
|
21
|
+
// render and click (e.g. another action just removed the row).
|
|
22
|
+
const runRowAction = (kind)=>{
|
|
23
|
+
if (kind === 'move-up' && !canMoveUp) return;
|
|
24
|
+
if (kind === 'move-down' && !canMoveDown) return;
|
|
25
|
+
if ((kind === 'duplicate' || kind === 'remove') && !canMutate) return;
|
|
26
|
+
const liveCount = rowCountAt(fields, parentPath);
|
|
27
|
+
if (rowIndex >= liveCount) return;
|
|
28
|
+
if (kind === 'move-down' && rowIndex >= liveCount - 1) return;
|
|
29
|
+
commit(()=>{
|
|
30
|
+
switch(kind){
|
|
31
|
+
case 'move-up':
|
|
32
|
+
dispatchFields({
|
|
33
|
+
type: 'MOVE_ROW',
|
|
34
|
+
path: parentPath,
|
|
35
|
+
moveFromIndex: rowIndex,
|
|
36
|
+
moveToIndex: rowIndex - 1
|
|
37
|
+
});
|
|
38
|
+
break;
|
|
39
|
+
case 'move-down':
|
|
40
|
+
dispatchFields({
|
|
41
|
+
type: 'MOVE_ROW',
|
|
42
|
+
path: parentPath,
|
|
43
|
+
moveFromIndex: rowIndex,
|
|
44
|
+
moveToIndex: rowIndex + 1
|
|
45
|
+
});
|
|
46
|
+
break;
|
|
47
|
+
case 'duplicate':
|
|
48
|
+
dispatchFields({
|
|
49
|
+
type: 'DUPLICATE_ROW',
|
|
50
|
+
path: parentPath,
|
|
51
|
+
rowIndex
|
|
52
|
+
});
|
|
53
|
+
break;
|
|
54
|
+
case 'remove':
|
|
55
|
+
dispatchFields({
|
|
56
|
+
type: 'REMOVE_ROW',
|
|
57
|
+
path: parentPath,
|
|
58
|
+
rowIndex
|
|
59
|
+
});
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
if (kind === 'remove') {
|
|
64
|
+
onClearSelection();
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const nextIndex = kind === 'move-up' ? rowIndex - 1 : kind === 'move-down' ? rowIndex + 1 : rowIndex + 1;
|
|
68
|
+
onSelectPath(`${parentPath}.${nextIndex}`);
|
|
69
|
+
};
|
|
70
|
+
const moveUp = ()=>runRowAction('move-up');
|
|
71
|
+
const moveDown = ()=>runRowAction('move-down');
|
|
72
|
+
const duplicate = ()=>runRowAction('duplicate');
|
|
73
|
+
const remove = ()=>runRowAction('remove');
|
|
74
|
+
const addAfter = ({ blockType, schemaPath, containerPath, index })=>{
|
|
75
|
+
commit(()=>{
|
|
76
|
+
addFieldRow({
|
|
77
|
+
blockType,
|
|
78
|
+
path: containerPath,
|
|
79
|
+
rowIndex: index,
|
|
80
|
+
schemaPath
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
onSelectPath(`${containerPath}.${index}`);
|
|
84
|
+
};
|
|
85
|
+
return {
|
|
86
|
+
moveUp,
|
|
87
|
+
moveDown,
|
|
88
|
+
duplicate,
|
|
89
|
+
remove,
|
|
90
|
+
addAfter,
|
|
91
|
+
canMoveUp,
|
|
92
|
+
canMoveDown,
|
|
93
|
+
canMutate,
|
|
94
|
+
parentPath,
|
|
95
|
+
rowIndex,
|
|
96
|
+
rowCount
|
|
97
|
+
};
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
//# sourceMappingURL=useBlockActions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/admin/blocks/useBlockActions.ts"],"sourcesContent":["'use client'\n\nimport { useAllFormFields, useForm } from '@payloadcms/ui'\nimport { useEditorHistory } from '../../state/useEditorHistory'\nimport { splitFieldPath } from '../../internal/path'\n\ntype Args = {\n selectedBlockPath: string | null\n onSelectPath: (path: string | null) => void\n onClearSelection: () => void\n}\n\nconst rowCountAt = (\n fields: ReturnType<typeof useAllFormFields>[0],\n path: string,\n): number => {\n const rows = fields[path]?.rows\n return Array.isArray(rows) ? rows.length : 0\n}\n\nexport const useBlockActions = ({\n selectedBlockPath,\n onSelectPath,\n onClearSelection,\n}: Args) => {\n const [fields] = useAllFormFields()\n const { addFieldRow, dispatchFields } = useForm()\n const { commit } = useEditorHistory()\n\n const split = selectedBlockPath ? splitFieldPath(selectedBlockPath) : null\n const parentPath = split?.parent ?? ''\n const rowIndex = split ? split.index : NaN\n const rowCount = parentPath ? rowCountAt(fields, parentPath) : 0\n const canMutate = !Number.isNaN(rowIndex) && parentPath !== '' && rowIndex < rowCount\n const canMoveUp = canMutate && rowIndex > 0\n const canMoveDown = canMutate && rowIndex < rowCount - 1\n\n // Re-check bounds at call time: form state may have shifted between\n // render and click (e.g. another action just removed the row).\n const runRowAction = (\n kind: 'move-up' | 'move-down' | 'duplicate' | 'remove',\n ): void => {\n if (kind === 'move-up' && !canMoveUp) return\n if (kind === 'move-down' && !canMoveDown) return\n if ((kind === 'duplicate' || kind === 'remove') && !canMutate) return\n const liveCount = rowCountAt(fields, parentPath)\n if (rowIndex >= liveCount) return\n if (kind === 'move-down' && rowIndex >= liveCount - 1) return\n commit(() => {\n switch (kind) {\n case 'move-up':\n dispatchFields({\n type: 'MOVE_ROW',\n path: parentPath,\n moveFromIndex: rowIndex,\n moveToIndex: rowIndex - 1,\n })\n break\n case 'move-down':\n dispatchFields({\n type: 'MOVE_ROW',\n path: parentPath,\n moveFromIndex: rowIndex,\n moveToIndex: rowIndex + 1,\n })\n break\n case 'duplicate':\n dispatchFields({ type: 'DUPLICATE_ROW', path: parentPath, rowIndex })\n break\n case 'remove':\n dispatchFields({ type: 'REMOVE_ROW', path: parentPath, rowIndex })\n break\n }\n })\n if (kind === 'remove') {\n onClearSelection()\n return\n }\n const nextIndex =\n kind === 'move-up' ? rowIndex - 1 : kind === 'move-down' ? rowIndex + 1 : rowIndex + 1\n onSelectPath(`${parentPath}.${nextIndex}`)\n }\n\n const moveUp = () => runRowAction('move-up')\n const moveDown = () => runRowAction('move-down')\n const duplicate = () => runRowAction('duplicate')\n const remove = () => runRowAction('remove')\n\n const addAfter = ({\n blockType,\n schemaPath,\n containerPath,\n index,\n }: {\n blockType?: string\n schemaPath: string\n containerPath: string\n index: number\n }) => {\n commit(() => {\n addFieldRow({\n blockType,\n path: containerPath,\n rowIndex: index,\n schemaPath,\n })\n })\n onSelectPath(`${containerPath}.${index}`)\n }\n\n return {\n moveUp,\n moveDown,\n duplicate,\n remove,\n addAfter,\n canMoveUp,\n canMoveDown,\n canMutate,\n parentPath,\n rowIndex,\n rowCount,\n }\n}\n"],"names":["useAllFormFields","useForm","useEditorHistory","splitFieldPath","rowCountAt","fields","path","rows","Array","isArray","length","useBlockActions","selectedBlockPath","onSelectPath","onClearSelection","addFieldRow","dispatchFields","commit","split","parentPath","parent","rowIndex","index","NaN","rowCount","canMutate","Number","isNaN","canMoveUp","canMoveDown","runRowAction","kind","liveCount","type","moveFromIndex","moveToIndex","nextIndex","moveUp","moveDown","duplicate","remove","addAfter","blockType","schemaPath","containerPath"],"mappings":"AAAA;AAEA,SAASA,gBAAgB,EAAEC,OAAO,QAAQ,iBAAgB;AAC1D,SAASC,gBAAgB,QAAQ,+BAA8B;AAC/D,SAASC,cAAc,QAAQ,sBAAqB;AAQpD,MAAMC,aAAa,CACjBC,QACAC;IAEA,MAAMC,OAAOF,MAAM,CAACC,KAAK,EAAEC;IAC3B,OAAOC,MAAMC,OAAO,CAACF,QAAQA,KAAKG,MAAM,GAAG;AAC7C;AAEA,OAAO,MAAMC,kBAAkB,CAAC,EAC9BC,iBAAiB,EACjBC,YAAY,EACZC,gBAAgB,EACX;IACL,MAAM,CAACT,OAAO,GAAGL;IACjB,MAAM,EAAEe,WAAW,EAAEC,cAAc,EAAE,GAAGf;IACxC,MAAM,EAAEgB,MAAM,EAAE,GAAGf;IAEnB,MAAMgB,QAAQN,oBAAoBT,eAAeS,qBAAqB;IACtE,MAAMO,aAAaD,OAAOE,UAAU;IACpC,MAAMC,WAAWH,QAAQA,MAAMI,KAAK,GAAGC;IACvC,MAAMC,WAAWL,aAAaf,WAAWC,QAAQc,cAAc;IAC/D,MAAMM,YAAY,CAACC,OAAOC,KAAK,CAACN,aAAaF,eAAe,MAAME,WAAWG;IAC7E,MAAMI,YAAYH,aAAaJ,WAAW;IAC1C,MAAMQ,cAAcJ,aAAaJ,WAAWG,WAAW;IAEvD,oEAAoE;IACpE,+DAA+D;IAC/D,MAAMM,eAAe,CACnBC;QAEA,IAAIA,SAAS,aAAa,CAACH,WAAW;QACtC,IAAIG,SAAS,eAAe,CAACF,aAAa;QAC1C,IAAI,AAACE,CAAAA,SAAS,eAAeA,SAAS,QAAO,KAAM,CAACN,WAAW;QAC/D,MAAMO,YAAY5B,WAAWC,QAAQc;QACrC,IAAIE,YAAYW,WAAW;QAC3B,IAAID,SAAS,eAAeV,YAAYW,YAAY,GAAG;QACvDf,OAAO;YACL,OAAQc;gBACN,KAAK;oBACHf,eAAe;wBACbiB,MAAM;wBACN3B,MAAMa;wBACNe,eAAeb;wBACfc,aAAad,WAAW;oBAC1B;oBACA;gBACF,KAAK;oBACHL,eAAe;wBACbiB,MAAM;wBACN3B,MAAMa;wBACNe,eAAeb;wBACfc,aAAad,WAAW;oBAC1B;oBACA;gBACF,KAAK;oBACHL,eAAe;wBAAEiB,MAAM;wBAAiB3B,MAAMa;wBAAYE;oBAAS;oBACnE;gBACF,KAAK;oBACHL,eAAe;wBAAEiB,MAAM;wBAAc3B,MAAMa;wBAAYE;oBAAS;oBAChE;YACJ;QACF;QACA,IAAIU,SAAS,UAAU;YACrBjB;YACA;QACF;QACA,MAAMsB,YACJL,SAAS,YAAYV,WAAW,IAAIU,SAAS,cAAcV,WAAW,IAAIA,WAAW;QACvFR,aAAa,GAAGM,WAAW,CAAC,EAAEiB,WAAW;IAC3C;IAEA,MAAMC,SAAS,IAAMP,aAAa;IAClC,MAAMQ,WAAW,IAAMR,aAAa;IACpC,MAAMS,YAAY,IAAMT,aAAa;IACrC,MAAMU,SAAS,IAAMV,aAAa;IAElC,MAAMW,WAAW,CAAC,EAChBC,SAAS,EACTC,UAAU,EACVC,aAAa,EACbtB,KAAK,EAMN;QACCL,OAAO;YACLF,YAAY;gBACV2B;gBACApC,MAAMsC;gBACNvB,UAAUC;gBACVqB;YACF;QACF;QACA9B,aAAa,GAAG+B,cAAc,CAAC,EAAEtB,OAAO;IAC1C;IAEA,OAAO;QACLe;QACAC;QACAC;QACAC;QACAC;QACAb;QACAC;QACAJ;QACAN;QACAE;QACAG;IACF;AACF,EAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { type LucideProps } from 'lucide-react';
|
|
3
|
+
export type { LucideProps };
|
|
4
|
+
export declare const ChevronUp: React.FC<LucideProps>;
|
|
5
|
+
export declare const ChevronDown: React.FC<LucideProps>;
|
|
6
|
+
export declare const CopyIcon: React.FC<LucideProps>;
|
|
7
|
+
export declare const TrashIcon: React.FC<LucideProps>;
|
|
8
|
+
export declare const PlusIcon: React.FC<LucideProps>;
|
|
9
|
+
export declare const DesktopIcon: React.FC<LucideProps>;
|
|
10
|
+
export declare const TabletIcon: React.FC<LucideProps>;
|
|
11
|
+
export declare const MobileIcon: React.FC<LucideProps>;
|
|
12
|
+
export declare const ResponsiveIcon: React.FC<LucideProps>;
|
|
13
|
+
export declare const FullscreenIcon: React.FC<LucideProps>;
|
|
14
|
+
export declare const FullscreenExitIcon: React.FC<LucideProps>;
|
|
15
|
+
export declare const UndoIcon: React.FC<LucideProps>;
|
|
16
|
+
export declare const RedoIcon: React.FC<LucideProps>;
|
|
17
|
+
export declare const LayoutIcon: React.FC<LucideProps>;
|
|
18
|
+
export declare const SidebarHideIcon: React.FC<LucideProps>;
|
|
19
|
+
export declare const SidebarShowIcon: React.FC<LucideProps>;
|
|
20
|
+
export declare const InteractIcon: React.FC<LucideProps>;
|
|
21
|
+
export declare const InteractOffIcon: React.FC<LucideProps>;
|
|
22
|
+
export declare const StarIcon: React.FC<LucideProps>;
|
|
23
|
+
export declare const BugIcon: React.FC<LucideProps>;
|
|
24
|
+
export declare const GithubIcon: React.FC<LucideProps>;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { ChevronUp as L_ChevronUp, ChevronDown as L_ChevronDown, Copy as L_Copy, Trash2 as L_Trash2, Plus as L_Plus, Monitor as L_Monitor, Tablet as L_Tablet, Smartphone as L_Smartphone, MoveHorizontal as L_MoveHorizontal, Expand as L_Expand, Shrink as L_Shrink, Undo as L_Undo, Redo as L_Redo, PanelLeft as L_PanelLeft, PanelRightOpen as L_PanelRightOpen, PanelRightClose as L_PanelRightClose, MousePointer2 as L_MousePointer2, MousePointer2Off as L_MousePointer2Off, Star as L_Star, Bug as L_Bug, Github as L_Github } from 'lucide-react';
|
|
5
|
+
// Pin default size to 16px (lucide's own default is 24); caller props win.
|
|
6
|
+
const sized = (Icon)=>{
|
|
7
|
+
const Wrapped = (props)=>/*#__PURE__*/ _jsx(Icon, {
|
|
8
|
+
size: 16,
|
|
9
|
+
...props
|
|
10
|
+
});
|
|
11
|
+
Wrapped.displayName = `Sized(${Icon.displayName ?? Icon.name})`;
|
|
12
|
+
return Wrapped;
|
|
13
|
+
};
|
|
14
|
+
export const ChevronUp = sized(L_ChevronUp);
|
|
15
|
+
export const ChevronDown = sized(L_ChevronDown);
|
|
16
|
+
export const CopyIcon = sized(L_Copy);
|
|
17
|
+
export const TrashIcon = sized(L_Trash2);
|
|
18
|
+
export const PlusIcon = sized(L_Plus);
|
|
19
|
+
export const DesktopIcon = sized(L_Monitor);
|
|
20
|
+
export const TabletIcon = sized(L_Tablet);
|
|
21
|
+
export const MobileIcon = sized(L_Smartphone);
|
|
22
|
+
export const ResponsiveIcon = sized(L_MoveHorizontal);
|
|
23
|
+
export const FullscreenIcon = sized(L_Expand);
|
|
24
|
+
export const FullscreenExitIcon = sized(L_Shrink);
|
|
25
|
+
export const UndoIcon = sized(L_Undo);
|
|
26
|
+
export const RedoIcon = sized(L_Redo);
|
|
27
|
+
export const LayoutIcon = sized(L_PanelLeft);
|
|
28
|
+
export const SidebarHideIcon = sized(L_PanelRightClose);
|
|
29
|
+
export const SidebarShowIcon = sized(L_PanelRightOpen);
|
|
30
|
+
export const InteractIcon = sized(L_MousePointer2);
|
|
31
|
+
export const InteractOffIcon = sized(L_MousePointer2Off);
|
|
32
|
+
export const StarIcon = sized(L_Star);
|
|
33
|
+
export const BugIcon = sized(L_Bug);
|
|
34
|
+
export const GithubIcon = sized(L_Github);
|
|
35
|
+
|
|
36
|
+
//# sourceMappingURL=icons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/admin/icons.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\nimport {\n ChevronUp as L_ChevronUp,\n ChevronDown as L_ChevronDown,\n Copy as L_Copy,\n Trash2 as L_Trash2,\n Plus as L_Plus,\n Monitor as L_Monitor,\n Tablet as L_Tablet,\n Smartphone as L_Smartphone,\n MoveHorizontal as L_MoveHorizontal,\n Expand as L_Expand,\n Shrink as L_Shrink,\n Undo as L_Undo,\n Redo as L_Redo,\n PanelLeft as L_PanelLeft,\n PanelRightOpen as L_PanelRightOpen,\n PanelRightClose as L_PanelRightClose,\n MousePointer2 as L_MousePointer2,\n MousePointer2Off as L_MousePointer2Off,\n Star as L_Star,\n Bug as L_Bug,\n Github as L_Github,\n type LucideProps,\n} from 'lucide-react'\n\nexport type { LucideProps }\n\n// Pin default size to 16px (lucide's own default is 24); caller props win.\nconst sized = (Icon: React.ComponentType<LucideProps>): React.FC<LucideProps> => {\n const Wrapped: React.FC<LucideProps> = (props) => <Icon size={16} {...props} />\n Wrapped.displayName = `Sized(${Icon.displayName ?? Icon.name})`\n return Wrapped\n}\n\nexport const ChevronUp = sized(L_ChevronUp)\nexport const ChevronDown = sized(L_ChevronDown)\nexport const CopyIcon = sized(L_Copy)\nexport const TrashIcon = sized(L_Trash2)\nexport const PlusIcon = sized(L_Plus)\nexport const DesktopIcon = sized(L_Monitor)\nexport const TabletIcon = sized(L_Tablet)\nexport const MobileIcon = sized(L_Smartphone)\nexport const ResponsiveIcon = sized(L_MoveHorizontal)\nexport const FullscreenIcon = sized(L_Expand)\nexport const FullscreenExitIcon = sized(L_Shrink)\nexport const UndoIcon = sized(L_Undo)\nexport const RedoIcon = sized(L_Redo)\nexport const LayoutIcon = sized(L_PanelLeft)\nexport const SidebarHideIcon = sized(L_PanelRightClose)\nexport const SidebarShowIcon = sized(L_PanelRightOpen)\nexport const InteractIcon = sized(L_MousePointer2)\nexport const InteractOffIcon = sized(L_MousePointer2Off)\nexport const StarIcon = sized(L_Star)\nexport const BugIcon = sized(L_Bug)\nexport const GithubIcon = sized(L_Github)\n"],"names":["React","ChevronUp","L_ChevronUp","ChevronDown","L_ChevronDown","Copy","L_Copy","Trash2","L_Trash2","Plus","L_Plus","Monitor","L_Monitor","Tablet","L_Tablet","Smartphone","L_Smartphone","MoveHorizontal","L_MoveHorizontal","Expand","L_Expand","Shrink","L_Shrink","Undo","L_Undo","Redo","L_Redo","PanelLeft","L_PanelLeft","PanelRightOpen","L_PanelRightOpen","PanelRightClose","L_PanelRightClose","MousePointer2","L_MousePointer2","MousePointer2Off","L_MousePointer2Off","Star","L_Star","Bug","L_Bug","Github","L_Github","sized","Icon","Wrapped","props","size","displayName","name","CopyIcon","TrashIcon","PlusIcon","DesktopIcon","TabletIcon","MobileIcon","ResponsiveIcon","FullscreenIcon","FullscreenExitIcon","UndoIcon","RedoIcon","LayoutIcon","SidebarHideIcon","SidebarShowIcon","InteractIcon","InteractOffIcon","StarIcon","BugIcon","GithubIcon"],"mappings":"AAAA;;AAEA,OAAOA,WAAW,QAAO;AACzB,SACEC,aAAaC,WAAW,EACxBC,eAAeC,aAAa,EAC5BC,QAAQC,MAAM,EACdC,UAAUC,QAAQ,EAClBC,QAAQC,MAAM,EACdC,WAAWC,SAAS,EACpBC,UAAUC,QAAQ,EAClBC,cAAcC,YAAY,EAC1BC,kBAAkBC,gBAAgB,EAClCC,UAAUC,QAAQ,EAClBC,UAAUC,QAAQ,EAClBC,QAAQC,MAAM,EACdC,QAAQC,MAAM,EACdC,aAAaC,WAAW,EACxBC,kBAAkBC,gBAAgB,EAClCC,mBAAmBC,iBAAiB,EACpCC,iBAAiBC,eAAe,EAChCC,oBAAoBC,kBAAkB,EACtCC,QAAQC,MAAM,EACdC,OAAOC,KAAK,EACZC,UAAUC,QAAQ,QAEb,eAAc;AAIrB,2EAA2E;AAC3E,MAAMC,QAAQ,CAACC;IACb,MAAMC,UAAiC,CAACC,sBAAU,KAACF;YAAKG,MAAM;YAAK,GAAGD,KAAK;;IAC3ED,QAAQG,WAAW,GAAG,CAAC,MAAM,EAAEJ,KAAKI,WAAW,IAAIJ,KAAKK,IAAI,CAAC,CAAC,CAAC;IAC/D,OAAOJ;AACT;AAEA,OAAO,MAAM5C,YAAY0C,MAAMzC,aAAY;AAC3C,OAAO,MAAMC,cAAcwC,MAAMvC,eAAc;AAC/C,OAAO,MAAM8C,WAAWP,MAAMrC,QAAO;AACrC,OAAO,MAAM6C,YAAYR,MAAMnC,UAAS;AACxC,OAAO,MAAM4C,WAAWT,MAAMjC,QAAO;AACrC,OAAO,MAAM2C,cAAcV,MAAM/B,WAAU;AAC3C,OAAO,MAAM0C,aAAaX,MAAM7B,UAAS;AACzC,OAAO,MAAMyC,aAAaZ,MAAM3B,cAAa;AAC7C,OAAO,MAAMwC,iBAAiBb,MAAMzB,kBAAiB;AACrD,OAAO,MAAMuC,iBAAiBd,MAAMvB,UAAS;AAC7C,OAAO,MAAMsC,qBAAqBf,MAAMrB,UAAS;AACjD,OAAO,MAAMqC,WAAWhB,MAAMnB,QAAO;AACrC,OAAO,MAAMoC,WAAWjB,MAAMjB,QAAO;AACrC,OAAO,MAAMmC,aAAalB,MAAMf,aAAY;AAC5C,OAAO,MAAMkC,kBAAkBnB,MAAMX,mBAAkB;AACvD,OAAO,MAAM+B,kBAAkBpB,MAAMb,kBAAiB;AACtD,OAAO,MAAMkC,eAAerB,MAAMT,iBAAgB;AAClD,OAAO,MAAM+B,kBAAkBtB,MAAMP,oBAAmB;AACxD,OAAO,MAAM8B,WAAWvB,MAAML,QAAO;AACrC,OAAO,MAAM6B,UAAUxB,MAAMH,OAAM;AACnC,OAAO,MAAM4B,aAAazB,MAAMD,UAAS"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export type BlockSettingsTabProps = {
|
|
3
|
+
selectedBlockPath: string | null;
|
|
4
|
+
onClearSelection: () => void;
|
|
5
|
+
onSelectPath: (path: string | null) => void;
|
|
6
|
+
blocksField: string;
|
|
7
|
+
/** Bump to open the add-after drawer externally (iframe `+` button). */
|
|
8
|
+
addBelowRequestId?: number;
|
|
9
|
+
};
|
|
10
|
+
export declare const BlockSettingsTab: React.FC<BlockSettingsTabProps>;
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import React, { useMemo } from 'react';
|
|
4
|
+
import { RenderFields, useAllFormFields, useDrawerSlug, useField, useModal } from '@payloadcms/ui';
|
|
5
|
+
import { useDocConfig } from '../../hooks/useDocConfig';
|
|
6
|
+
import { useAddBlockDrawer } from '../../hooks/useAddBlockDrawer';
|
|
7
|
+
import { AddBlockDrawer } from '../blocks/AddBlockDrawer';
|
|
8
|
+
import { BlockActionsToolbar } from '../blocks/BlockActionsToolbar';
|
|
9
|
+
import { useBlockActions } from '../blocks/useBlockActions';
|
|
10
|
+
import { findNamedField, resolveBlockSchema } from '../blocks/schema';
|
|
11
|
+
import { BlockEmptyState } from '../blocks/BlockEmptyState';
|
|
12
|
+
import { BlockHeader } from '../blocks/BlockHeader';
|
|
13
|
+
export const BlockSettingsTab = ({ selectedBlockPath, onClearSelection, onSelectPath, blocksField, addBelowRequestId = 0 })=>{
|
|
14
|
+
const { fields: docFields, slug: docSlug } = useDocConfig();
|
|
15
|
+
const [fields] = useAllFormFields();
|
|
16
|
+
const { toggleModal } = useModal();
|
|
17
|
+
const addBlockDrawerSlug = useDrawerSlug('better-editor-add-block');
|
|
18
|
+
const addAfterDrawerSlug = useDrawerSlug('better-editor-add-after');
|
|
19
|
+
const actions = useBlockActions({
|
|
20
|
+
selectedBlockPath,
|
|
21
|
+
onSelectPath,
|
|
22
|
+
onClearSelection
|
|
23
|
+
});
|
|
24
|
+
useAddBlockDrawer({
|
|
25
|
+
drawerSlug: addAfterDrawerSlug,
|
|
26
|
+
requestId: addBelowRequestId,
|
|
27
|
+
selectedBlockPath
|
|
28
|
+
});
|
|
29
|
+
const blocksFieldInfo = useMemo(()=>{
|
|
30
|
+
if (!docFields) return null;
|
|
31
|
+
return findNamedField(docFields, blocksField, docSlug || '');
|
|
32
|
+
}, [
|
|
33
|
+
docFields,
|
|
34
|
+
blocksField,
|
|
35
|
+
docSlug
|
|
36
|
+
]);
|
|
37
|
+
const blocksFieldField = blocksFieldInfo?.field;
|
|
38
|
+
const availableBlocks = blocksFieldField && blocksFieldField.type === 'blocks' ? blocksFieldField.blocks : [];
|
|
39
|
+
const blocksSchemaPath = blocksFieldInfo?.schemaPath || '';
|
|
40
|
+
const topLevelRows = fields[blocksField]?.rows;
|
|
41
|
+
const addRowIndex = Array.isArray(topLevelRows) ? topLevelRows.length : 0;
|
|
42
|
+
if (!selectedBlockPath) {
|
|
43
|
+
return /*#__PURE__*/ _jsxs(_Fragment, {
|
|
44
|
+
children: [
|
|
45
|
+
/*#__PURE__*/ _jsx(BlockEmptyState, {
|
|
46
|
+
canAdd: availableBlocks.length > 0,
|
|
47
|
+
onAddClick: ()=>toggleModal(addBlockDrawerSlug)
|
|
48
|
+
}),
|
|
49
|
+
availableBlocks.length > 0 ? /*#__PURE__*/ _jsx(AddBlockDrawer, {
|
|
50
|
+
slug: addBlockDrawerSlug,
|
|
51
|
+
blocks: availableBlocks,
|
|
52
|
+
addRow: (index, blockType)=>actions.addAfter({
|
|
53
|
+
blockType,
|
|
54
|
+
schemaPath: blocksSchemaPath,
|
|
55
|
+
containerPath: blocksField,
|
|
56
|
+
index
|
|
57
|
+
}),
|
|
58
|
+
addRowIndex: addRowIndex
|
|
59
|
+
}) : null
|
|
60
|
+
]
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
const resolved = docFields ? resolveBlockSchema({
|
|
64
|
+
docFields,
|
|
65
|
+
docSlug: docSlug || '',
|
|
66
|
+
formFields: fields
|
|
67
|
+
}, selectedBlockPath) : null;
|
|
68
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
69
|
+
className: "better-editor-tab better-editor-tab--native",
|
|
70
|
+
children: [
|
|
71
|
+
/*#__PURE__*/ _jsx(BlockHeader, {
|
|
72
|
+
blockType: resolved?.blockType || 'unknown',
|
|
73
|
+
path: selectedBlockPath,
|
|
74
|
+
onClearSelection: onClearSelection
|
|
75
|
+
}),
|
|
76
|
+
/*#__PURE__*/ _jsx("hr", {
|
|
77
|
+
className: "better-editor-tab__divider",
|
|
78
|
+
"aria-hidden": "true"
|
|
79
|
+
}),
|
|
80
|
+
/*#__PURE__*/ _jsx(BlockActionsToolbar, {
|
|
81
|
+
canMoveUp: actions.canMoveUp,
|
|
82
|
+
canMoveDown: actions.canMoveDown,
|
|
83
|
+
canMutate: actions.canMutate,
|
|
84
|
+
canAddBelow: !!resolved,
|
|
85
|
+
onMoveUp: actions.moveUp,
|
|
86
|
+
onMoveDown: actions.moveDown,
|
|
87
|
+
onDuplicate: actions.duplicate,
|
|
88
|
+
onAddBelow: ()=>toggleModal(addAfterDrawerSlug),
|
|
89
|
+
onDelete: actions.remove
|
|
90
|
+
}),
|
|
91
|
+
actions.canMutate && resolved && resolved.blocksFieldBlocks.length > 0 ? /*#__PURE__*/ _jsx(AddBlockDrawer, {
|
|
92
|
+
slug: addAfterDrawerSlug,
|
|
93
|
+
blocks: resolved.blocksFieldBlocks,
|
|
94
|
+
addRow: (index, blockType)=>actions.addAfter({
|
|
95
|
+
blockType,
|
|
96
|
+
schemaPath: resolved.blocksFieldSchemaPath,
|
|
97
|
+
containerPath: actions.parentPath,
|
|
98
|
+
index
|
|
99
|
+
}),
|
|
100
|
+
addRowIndex: actions.rowIndex + 1
|
|
101
|
+
}) : null,
|
|
102
|
+
!resolved ? /*#__PURE__*/ _jsx("div", {
|
|
103
|
+
className: "better-editor-tab__empty",
|
|
104
|
+
children: "Could not resolve block schema for this path."
|
|
105
|
+
}) : /*#__PURE__*/ _jsxs(_Fragment, {
|
|
106
|
+
children: [
|
|
107
|
+
/*#__PURE__*/ _jsx(BlockNameInput, {
|
|
108
|
+
path: `${selectedBlockPath}.blockName`
|
|
109
|
+
}),
|
|
110
|
+
/*#__PURE__*/ _jsx("hr", {
|
|
111
|
+
className: "better-editor-tab__divider",
|
|
112
|
+
"aria-hidden": "true"
|
|
113
|
+
}),
|
|
114
|
+
/*#__PURE__*/ _jsx(RenderFields, {
|
|
115
|
+
fields: resolved.blockFields,
|
|
116
|
+
parentPath: resolved.parentPath,
|
|
117
|
+
parentIndexPath: "",
|
|
118
|
+
parentSchemaPath: resolved.schemaPath,
|
|
119
|
+
// RenderFields' client read-gate is bypassed; the server-side
|
|
120
|
+
// write check still runs on save.
|
|
121
|
+
permissions: true
|
|
122
|
+
})
|
|
123
|
+
]
|
|
124
|
+
})
|
|
125
|
+
]
|
|
126
|
+
});
|
|
127
|
+
};
|
|
128
|
+
const BlockNameInput = ({ path })=>{
|
|
129
|
+
const { value, setValue } = useField({
|
|
130
|
+
path
|
|
131
|
+
});
|
|
132
|
+
const inputId = `be-blockname-${path}`;
|
|
133
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
134
|
+
className: "better-editor-tab__block-name",
|
|
135
|
+
children: [
|
|
136
|
+
/*#__PURE__*/ _jsx("label", {
|
|
137
|
+
className: "better-editor-tab__block-name-label",
|
|
138
|
+
htmlFor: inputId,
|
|
139
|
+
children: "Block Name"
|
|
140
|
+
}),
|
|
141
|
+
/*#__PURE__*/ _jsx("input", {
|
|
142
|
+
id: inputId,
|
|
143
|
+
className: "better-editor-tab__block-name-input",
|
|
144
|
+
type: "text",
|
|
145
|
+
value: value || '',
|
|
146
|
+
onChange: (e)=>setValue(e.target.value),
|
|
147
|
+
placeholder: "Optional label for this block"
|
|
148
|
+
})
|
|
149
|
+
]
|
|
150
|
+
});
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
//# sourceMappingURL=BlockSettingsTab.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/admin/sidebar/BlockSettingsTab.tsx"],"sourcesContent":["'use client'\n\nimport React, { useMemo } from 'react'\nimport {\n RenderFields,\n useAllFormFields,\n useDrawerSlug,\n useField,\n useModal,\n} from '@payloadcms/ui'\nimport { useDocConfig } from '../../hooks/useDocConfig'\nimport { useAddBlockDrawer } from '../../hooks/useAddBlockDrawer'\nimport { AddBlockDrawer } from '../blocks/AddBlockDrawer'\nimport { BlockActionsToolbar } from '../blocks/BlockActionsToolbar'\nimport { useBlockActions } from '../blocks/useBlockActions'\nimport { findNamedField, resolveBlockSchema } from '../blocks/schema'\nimport type { ClientBlock } from 'payload'\nimport { BlockEmptyState } from '../blocks/BlockEmptyState'\nimport { BlockHeader } from '../blocks/BlockHeader'\n\nexport type BlockSettingsTabProps = {\n selectedBlockPath: string | null\n onClearSelection: () => void\n onSelectPath: (path: string | null) => void\n blocksField: string\n /** Bump to open the add-after drawer externally (iframe `+` button). */\n addBelowRequestId?: number\n}\n\nexport const BlockSettingsTab: React.FC<BlockSettingsTabProps> = ({\n selectedBlockPath,\n onClearSelection,\n onSelectPath,\n blocksField,\n addBelowRequestId = 0,\n}) => {\n const { fields: docFields, slug: docSlug } = useDocConfig()\n const [fields] = useAllFormFields()\n const { toggleModal } = useModal()\n const addBlockDrawerSlug = useDrawerSlug('better-editor-add-block')\n const addAfterDrawerSlug = useDrawerSlug('better-editor-add-after')\n\n const actions = useBlockActions({\n selectedBlockPath,\n onSelectPath,\n onClearSelection,\n })\n\n useAddBlockDrawer({\n drawerSlug: addAfterDrawerSlug,\n requestId: addBelowRequestId,\n selectedBlockPath,\n })\n\n const blocksFieldInfo = useMemo(() => {\n if (!docFields) return null\n return findNamedField(docFields, blocksField, docSlug || '')\n }, [docFields, blocksField, docSlug])\n\n const blocksFieldField = blocksFieldInfo?.field\n const availableBlocks: ClientBlock[] =\n blocksFieldField && blocksFieldField.type === 'blocks' ? blocksFieldField.blocks : []\n const blocksSchemaPath = blocksFieldInfo?.schemaPath || ''\n const topLevelRows = fields[blocksField]?.rows\n const addRowIndex = Array.isArray(topLevelRows) ? topLevelRows.length : 0\n\n if (!selectedBlockPath) {\n return (\n <>\n <BlockEmptyState\n canAdd={availableBlocks.length > 0}\n onAddClick={() => toggleModal(addBlockDrawerSlug)}\n />\n {availableBlocks.length > 0 ? (\n <AddBlockDrawer\n slug={addBlockDrawerSlug}\n blocks={availableBlocks}\n addRow={(index, blockType) =>\n actions.addAfter({\n blockType,\n schemaPath: blocksSchemaPath,\n containerPath: blocksField,\n index,\n })\n }\n addRowIndex={addRowIndex}\n />\n ) : null}\n </>\n )\n }\n\n const resolved = docFields\n ? resolveBlockSchema({ docFields, docSlug: docSlug || '', formFields: fields }, selectedBlockPath)\n : null\n\n return (\n <div className=\"better-editor-tab better-editor-tab--native\">\n <BlockHeader\n blockType={resolved?.blockType || 'unknown'}\n path={selectedBlockPath}\n onClearSelection={onClearSelection}\n />\n\n <hr className=\"better-editor-tab__divider\" aria-hidden=\"true\" />\n\n <BlockActionsToolbar\n canMoveUp={actions.canMoveUp}\n canMoveDown={actions.canMoveDown}\n canMutate={actions.canMutate}\n canAddBelow={!!resolved}\n onMoveUp={actions.moveUp}\n onMoveDown={actions.moveDown}\n onDuplicate={actions.duplicate}\n onAddBelow={() => toggleModal(addAfterDrawerSlug)}\n onDelete={actions.remove}\n />\n\n {actions.canMutate && resolved && resolved.blocksFieldBlocks.length > 0 ? (\n <AddBlockDrawer\n slug={addAfterDrawerSlug}\n blocks={resolved.blocksFieldBlocks}\n addRow={(index, blockType) =>\n actions.addAfter({\n blockType,\n schemaPath: resolved.blocksFieldSchemaPath,\n containerPath: actions.parentPath,\n index,\n })\n }\n addRowIndex={actions.rowIndex + 1}\n />\n ) : null}\n\n {!resolved ? (\n <div className=\"better-editor-tab__empty\">\n Could not resolve block schema for this path.\n </div>\n ) : (\n <>\n <BlockNameInput path={`${selectedBlockPath}.blockName`} />\n <hr className=\"better-editor-tab__divider\" aria-hidden=\"true\" />\n <RenderFields\n fields={resolved.blockFields}\n parentPath={resolved.parentPath}\n parentIndexPath=\"\"\n parentSchemaPath={resolved.schemaPath}\n // RenderFields' client read-gate is bypassed; the server-side\n // write check still runs on save.\n permissions={true}\n />\n </>\n )}\n </div>\n )\n}\n\nconst BlockNameInput: React.FC<{ path: string }> = ({ path }) => {\n const { value, setValue } = useField<string>({ path })\n const inputId = `be-blockname-${path}`\n return (\n <div className=\"better-editor-tab__block-name\">\n <label className=\"better-editor-tab__block-name-label\" htmlFor={inputId}>\n Block Name\n </label>\n <input\n id={inputId}\n className=\"better-editor-tab__block-name-input\"\n type=\"text\"\n value={value || ''}\n onChange={(e) => setValue(e.target.value)}\n placeholder=\"Optional label for this block\"\n />\n </div>\n )\n}\n"],"names":["React","useMemo","RenderFields","useAllFormFields","useDrawerSlug","useField","useModal","useDocConfig","useAddBlockDrawer","AddBlockDrawer","BlockActionsToolbar","useBlockActions","findNamedField","resolveBlockSchema","BlockEmptyState","BlockHeader","BlockSettingsTab","selectedBlockPath","onClearSelection","onSelectPath","blocksField","addBelowRequestId","fields","docFields","slug","docSlug","toggleModal","addBlockDrawerSlug","addAfterDrawerSlug","actions","drawerSlug","requestId","blocksFieldInfo","blocksFieldField","field","availableBlocks","type","blocks","blocksSchemaPath","schemaPath","topLevelRows","rows","addRowIndex","Array","isArray","length","canAdd","onAddClick","addRow","index","blockType","addAfter","containerPath","resolved","formFields","div","className","path","hr","aria-hidden","canMoveUp","canMoveDown","canMutate","canAddBelow","onMoveUp","moveUp","onMoveDown","moveDown","onDuplicate","duplicate","onAddBelow","onDelete","remove","blocksFieldBlocks","blocksFieldSchemaPath","parentPath","rowIndex","BlockNameInput","blockFields","parentIndexPath","parentSchemaPath","permissions","value","setValue","inputId","label","htmlFor","input","id","onChange","e","target","placeholder"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ClientField } from 'payload';
|
|
3
|
+
export type DocumentFieldsTabProps = {
|
|
4
|
+
filter: (field: ClientField) => boolean;
|
|
5
|
+
transform?: (fields: ClientField[]) => ClientField[];
|
|
6
|
+
emptyText: string;
|
|
7
|
+
};
|
|
8
|
+
export declare const DocumentFieldsTab: React.FC<DocumentFieldsTabProps>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import React, { useMemo } from 'react';
|
|
4
|
+
import { RenderFields } from '@payloadcms/ui';
|
|
5
|
+
import { useDocConfig } from '../../hooks/useDocConfig';
|
|
6
|
+
// Bypass RenderFields' client-side read gate; the server still enforces
|
|
7
|
+
// access on save.
|
|
8
|
+
const FULL_ACCESS = true;
|
|
9
|
+
export const DocumentFieldsTab = ({ filter, transform, emptyText })=>{
|
|
10
|
+
const { fields: allFields, slug } = useDocConfig();
|
|
11
|
+
const fields = useMemo(()=>{
|
|
12
|
+
if (!allFields) return [];
|
|
13
|
+
const filtered = allFields.filter(filter);
|
|
14
|
+
return transform ? transform(filtered) : filtered;
|
|
15
|
+
}, [
|
|
16
|
+
allFields,
|
|
17
|
+
filter,
|
|
18
|
+
transform
|
|
19
|
+
]);
|
|
20
|
+
if (fields.length === 0) {
|
|
21
|
+
return /*#__PURE__*/ _jsx("div", {
|
|
22
|
+
className: "better-editor-tab__empty",
|
|
23
|
+
children: emptyText
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
return /*#__PURE__*/ _jsx("div", {
|
|
27
|
+
className: "better-editor-tab better-editor-tab--native",
|
|
28
|
+
children: /*#__PURE__*/ _jsx(RenderFields, {
|
|
29
|
+
fields: fields,
|
|
30
|
+
parentPath: "",
|
|
31
|
+
parentIndexPath: "",
|
|
32
|
+
parentSchemaPath: slug,
|
|
33
|
+
permissions: FULL_ACCESS
|
|
34
|
+
})
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=DocumentFieldsTab.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/admin/sidebar/DocumentFieldsTab.tsx"],"sourcesContent":["'use client'\n\nimport React, { useMemo } from 'react'\nimport type { ClientField } from 'payload'\nimport { RenderFields } from '@payloadcms/ui'\nimport { useDocConfig } from '../../hooks/useDocConfig'\n\n// Bypass RenderFields' client-side read gate; the server still enforces\n// access on save.\nconst FULL_ACCESS = true as const\n\nexport type DocumentFieldsTabProps = {\n filter: (field: ClientField) => boolean\n transform?: (fields: ClientField[]) => ClientField[]\n emptyText: string\n}\n\nexport const DocumentFieldsTab: React.FC<DocumentFieldsTabProps> = ({\n filter,\n transform,\n emptyText,\n}) => {\n const { fields: allFields, slug } = useDocConfig()\n\n const fields = useMemo(() => {\n if (!allFields) return []\n const filtered = allFields.filter(filter)\n return transform ? transform(filtered) : filtered\n }, [allFields, filter, transform])\n\n if (fields.length === 0) {\n return <div className=\"better-editor-tab__empty\">{emptyText}</div>\n }\n\n return (\n <div className=\"better-editor-tab better-editor-tab--native\">\n <RenderFields\n fields={fields}\n parentPath=\"\"\n parentIndexPath=\"\"\n parentSchemaPath={slug}\n permissions={FULL_ACCESS}\n />\n </div>\n )\n}\n"],"names":["React","useMemo","RenderFields","useDocConfig","FULL_ACCESS","DocumentFieldsTab","filter","transform","emptyText","fields","allFields","slug","filtered","length","div","className","parentPath","parentIndexPath","parentSchemaPath","permissions"],"mappings":"AAAA;;AAEA,OAAOA,SAASC,OAAO,QAAQ,QAAO;AAEtC,SAASC,YAAY,QAAQ,iBAAgB;AAC7C,SAASC,YAAY,QAAQ,2BAA0B;AAEvD,wEAAwE;AACxE,kBAAkB;AAClB,MAAMC,cAAc;AAQpB,OAAO,MAAMC,oBAAsD,CAAC,EAClEC,MAAM,EACNC,SAAS,EACTC,SAAS,EACV;IACC,MAAM,EAAEC,QAAQC,SAAS,EAAEC,IAAI,EAAE,GAAGR;IAEpC,MAAMM,SAASR,QAAQ;QACrB,IAAI,CAACS,WAAW,OAAO,EAAE;QACzB,MAAME,WAAWF,UAAUJ,MAAM,CAACA;QAClC,OAAOC,YAAYA,UAAUK,YAAYA;IAC3C,GAAG;QAACF;QAAWJ;QAAQC;KAAU;IAEjC,IAAIE,OAAOI,MAAM,KAAK,GAAG;QACvB,qBAAO,KAACC;YAAIC,WAAU;sBAA4BP;;IACpD;IAEA,qBACE,KAACM;QAAIC,WAAU;kBACb,cAAA,KAACb;YACCO,QAAQA;YACRO,YAAW;YACXC,iBAAgB;YAChBC,kBAAkBP;YAClBQ,aAAaf;;;AAIrB,EAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { DocumentFieldsTab } from './DocumentFieldsTab';
|
|
5
|
+
const isSidebarField = (f)=>'admin' in f && f.admin?.position === 'sidebar';
|
|
6
|
+
export const DocumentMetaTab = ()=>/*#__PURE__*/ _jsx(DocumentFieldsTab, {
|
|
7
|
+
filter: isSidebarField,
|
|
8
|
+
emptyText: "No document settings."
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=DocumentMetaTab.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/admin/sidebar/DocumentMetaTab.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\nimport type { ClientField } from 'payload'\nimport { DocumentFieldsTab } from './DocumentFieldsTab'\n\nconst isSidebarField = (f: ClientField): boolean =>\n 'admin' in f && f.admin?.position === 'sidebar'\n\nexport const DocumentMetaTab: React.FC = () => (\n <DocumentFieldsTab\n filter={isSidebarField}\n emptyText=\"No document settings.\"\n />\n)\n"],"names":["React","DocumentFieldsTab","isSidebarField","f","admin","position","DocumentMetaTab","filter","emptyText"],"mappings":"AAAA;;AAEA,OAAOA,WAAW,QAAO;AAEzB,SAASC,iBAAiB,QAAQ,sBAAqB;AAEvD,MAAMC,iBAAiB,CAACC,IACtB,WAAWA,KAAKA,EAAEC,KAAK,EAAEC,aAAa;AAExC,OAAO,MAAMC,kBAA4B,kBACvC,KAACL;QACCM,QAAQL;QACRM,WAAU;OAEb"}
|