@maas/payload-plugin-media-cloud 0.0.36 → 0.0.37
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.
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import React from "react";
|
|
4
4
|
import { useRouter } from "next/navigation";
|
|
5
|
-
import { useConfig, useRouteTransition, useSelection } from "@payloadcms/ui";
|
|
5
|
+
import { useConfig, useListDrawerContext, useRouteTransition, useSelection } from "@payloadcms/ui";
|
|
6
6
|
import { formatAdminURL } from "payload/shared";
|
|
7
7
|
import { useDrawerDepth } from "@payloadcms/ui/elements/Drawer";
|
|
8
8
|
import { jsx } from "react/jsx-runtime";
|
|
@@ -17,12 +17,13 @@ const Context = /* @__PURE__ */ React.createContext({
|
|
|
17
17
|
focusedItemIndex: -1
|
|
18
18
|
});
|
|
19
19
|
function GridProvider(props) {
|
|
20
|
-
const { allowMultiSelection
|
|
20
|
+
const { allowMultiSelection, children, docs } = props;
|
|
21
21
|
const { config } = useConfig();
|
|
22
22
|
const drawerDepth = useDrawerDepth();
|
|
23
23
|
const router = useRouter();
|
|
24
24
|
const { startRouteTransition } = useRouteTransition();
|
|
25
25
|
const { setSelection, selectedIDs } = useSelection();
|
|
26
|
+
const { onSelect, isInDrawer } = useListDrawerContext();
|
|
26
27
|
const currentlySelectedIndexes = React.useRef(/* @__PURE__ */ new Set());
|
|
27
28
|
const [focusedItemIndex, setFocusedItemIndex] = React.useState(-1);
|
|
28
29
|
const lastClickTime = React.useRef(null);
|
|
@@ -117,6 +118,14 @@ function GridProvider(props) {
|
|
|
117
118
|
}
|
|
118
119
|
case "Enter":
|
|
119
120
|
if (selectedIDs.length === 1) {
|
|
121
|
+
if (isInDrawer && typeof onSelect === "function") {
|
|
122
|
+
onSelect({
|
|
123
|
+
collectionSlug: currentItem.relationTo,
|
|
124
|
+
doc: currentItem,
|
|
125
|
+
docID: currentItem.id
|
|
126
|
+
});
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
120
129
|
navigateAfterSelection({
|
|
121
130
|
collectionSlug: currentItem.relationTo,
|
|
122
131
|
docID: currentItem.id
|
|
@@ -190,6 +199,13 @@ function GridProvider(props) {
|
|
|
190
199
|
case allowMultiSelection && isShiftPressed_0:
|
|
191
200
|
if (currentItemIndex_0 !== -1) updateSelections({ indexes: handleShiftSelection(currentItemIndex_0) });
|
|
192
201
|
break;
|
|
202
|
+
case isInDrawer && typeof onSelect === "function" && selectedIDs.length === 0:
|
|
203
|
+
onSelect({
|
|
204
|
+
collectionSlug: clickedItem.relationTo,
|
|
205
|
+
doc: clickedItem,
|
|
206
|
+
docID: clickedItem.id
|
|
207
|
+
});
|
|
208
|
+
break;
|
|
193
209
|
default: {
|
|
194
210
|
const now = Date.now();
|
|
195
211
|
doubleClicked = now - (lastClickTime.current ?? 0) < 400 && lastClickedItem?.id === clickedItem.id;
|
|
@@ -199,7 +215,7 @@ function GridProvider(props) {
|
|
|
199
215
|
}
|
|
200
216
|
}
|
|
201
217
|
setLastClickedItem(clickedItem);
|
|
202
|
-
if (doubleClicked) navigateAfterSelection({
|
|
218
|
+
if (doubleClicked && !isInDrawer) navigateAfterSelection({
|
|
203
219
|
collectionSlug: clickedItem.relationTo,
|
|
204
220
|
docID: clickedItem.id
|
|
205
221
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gridContext.mjs","names":["React","useRouter","formatAdminURL","useDrawerDepth","useConfig","useRouteTransition","useSelection","jsx","_jsx","Context","createContext","docs","clearSelections","onItemClick","undefined","onItemKeyPress","setFocusedItemIndex","focusedItemIndex","GridProvider","props","allowMultiSelection","children","config","drawerDepth","router","startRouteTransition","setSelection","selectedIDs","currentlySelectedIndexes","useRef","Set","useState","lastClickTime","totalCount","length","useCallback","current","getItem","id","find","doc","navigateAfterSelection","collectionSlug","docID","push","adminRoute","routes","admin","path","handleShiftSelection","targetIndex","existingIndexes","reduce","acc","item","idx","includes","firstSelectedIndex","Math","min","lastSelectedIndex","max","isWithinBounds","anchorIndex","distanceToFirst","abs","distanceToLast","startIndex","endIndex","newRangeIndexes","Array","from","_","i","mappedSet","updateSelections","indexes","newSelectedIDs","index","add","forEach","event","currentItem","code","ctrlKey","metaKey","shiftKey","isShiftPressed","isCtrlPressed","isCurrentlySelected","currentItemIndex","findIndex","preventDefault","isBackward","newItemIndex","selectedIndexes","relationTo","prevIndex","nextIndex","lastClickedItem","setLastClickedItem","clickedItem","doubleClicked","now","Date","value","useGrid","context","use","Error"],"sources":["../../../src/components/gridContext/gridContext.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\nimport { useRouter } from 'next/navigation'\nimport { formatAdminURL } from 'payload/shared'\n\nimport { useDrawerDepth } from '@payloadcms/ui/elements/Drawer'\nimport { useConfig, useRouteTransition, useSelection } from '@payloadcms/ui'\n\nimport type { FolderSortKeys } from 'payload'\nimport type { MappedDocument } from '../gridView/gridView'\ninterface OnItemClickArgs {\n event: React.MouseEvent\n index: number\n item: MappedDocument\n}\n\ninterface OnItemKeyPressArgs {\n event: React.KeyboardEvent\n index: number\n item: MappedDocument\n}\n\nexport type GridContextValue = {\n docs?: MappedDocument[]\n clearSelections: () => void\n onItemClick: (args: OnItemClickArgs) => void\n onItemKeyPress: (args: OnItemKeyPressArgs) => void\n setFocusedItemIndex: React.Dispatch<React.SetStateAction<number>>\n focusedItemIndex: number\n}\n\nconst Context = React.createContext<GridContextValue>({\n docs: [],\n clearSelections: () => {},\n onItemClick: () => undefined,\n onItemKeyPress: () => undefined,\n setFocusedItemIndex: () => -1,\n focusedItemIndex: -1,\n})\n\nexport type GridProviderProps = {\n readonly allowMultiSelection?: boolean\n /**\n * Children to render inside the provider\n */\n readonly children: React.ReactNode\n /**\n * All documents in the current folder\n */\n readonly docs: MappedDocument[]\n /**\n * The intial search query\n */\n readonly search?: string\n /**\n * The sort order of the documents\n *\n * @example\n * `name` for descending\n * `-name` for ascending\n */\n readonly sort?: FolderSortKeys\n}\nexport function GridProvider(props: GridProviderProps) {\n const { allowMultiSelection = true, children, docs } = props\n\n const { config } = useConfig()\n const drawerDepth = useDrawerDepth()\n const router = useRouter()\n const { startRouteTransition } = useRouteTransition()\n\n const { setSelection, selectedIDs } = useSelection()\n const currentlySelectedIndexes = React.useRef(new Set<number>())\n\n const [focusedItemIndex, setFocusedItemIndex] = React.useState(-1)\n const lastClickTime = React.useRef<null | number>(null)\n const totalCount = docs.length\n\n const clearSelections = React.useCallback(() => {\n setFocusedItemIndex(-1)\n\n currentlySelectedIndexes.current = new Set()\n }, [])\n\n const getItem = React.useCallback(\n (id: string | number) => {\n return docs.find((doc) => doc.id === id)\n },\n [docs]\n )\n\n const navigateAfterSelection = React.useCallback(\n ({\n collectionSlug,\n docID,\n }: {\n collectionSlug: string\n docID?: number | string\n }) => {\n if (drawerDepth === 1) {\n // not in a drawer (default is 1)\n if (collectionSlug) {\n // clicked on document, take the user to the documet view\n startRouteTransition(() => {\n router.push(\n formatAdminURL({\n adminRoute: config.routes.admin,\n path: `/collections/${collectionSlug}/${docID}`,\n })\n )\n clearSelections()\n })\n }\n } else {\n clearSelections()\n }\n },\n [\n clearSelections,\n config.routes.admin,\n drawerDepth,\n getItem,\n router,\n startRouteTransition,\n ]\n )\n\n const handleShiftSelection = React.useCallback(\n (targetIndex: number) => {\n // Find existing selection boundaries\n const existingIndexes = docs.reduce((acc, item, idx) => {\n if (selectedIDs.includes(item.id)) {\n acc.push(idx)\n }\n return acc\n }, [] as number[])\n\n if (existingIndexes.length === 0) {\n // No existing selection, just select target\n return [targetIndex]\n }\n\n const firstSelectedIndex = Math.min(...existingIndexes)\n const lastSelectedIndex = Math.max(...existingIndexes)\n const isWithinBounds =\n targetIndex >= firstSelectedIndex && targetIndex <= lastSelectedIndex\n\n // Choose anchor based on whether we're contracting or extending\n let anchorIndex = targetIndex\n if (isWithinBounds) {\n // Contracting: if target is at a boundary, use target as anchor\n // Otherwise, use furthest boundary to maintain opposite edge\n if (\n targetIndex === firstSelectedIndex ||\n targetIndex === lastSelectedIndex\n ) {\n anchorIndex = targetIndex\n } else {\n const distanceToFirst = Math.abs(targetIndex - firstSelectedIndex)\n const distanceToLast = Math.abs(targetIndex - lastSelectedIndex)\n anchorIndex =\n distanceToFirst >= distanceToLast\n ? firstSelectedIndex\n : lastSelectedIndex\n }\n } else {\n // Extending: use closest boundary\n const distanceToFirst = Math.abs(targetIndex - firstSelectedIndex)\n const distanceToLast = Math.abs(targetIndex - lastSelectedIndex)\n anchorIndex =\n distanceToFirst <= distanceToLast\n ? firstSelectedIndex\n : lastSelectedIndex\n }\n\n // Create range from anchor to target\n const startIndex = Math.min(anchorIndex, targetIndex)\n const endIndex = Math.max(anchorIndex, targetIndex)\n const newRangeIndexes = Array.from(\n { length: endIndex - startIndex + 1 },\n (_, i) => startIndex + i\n )\n\n if (isWithinBounds) {\n // Contracting: replace with new range\n return newRangeIndexes\n } else {\n // Extending: union with existing\n const mappedSet = new Set([...existingIndexes, ...newRangeIndexes])\n return Array.from(mappedSet)\n }\n },\n [docs, selectedIDs]\n )\n\n const updateSelections = React.useCallback(\n ({ indexes }: { indexes: number[] }) => {\n const { newSelectedIDs } = docs.reduce(\n (acc, item, index) => {\n if (indexes.includes(index)) {\n acc.newSelectedIDs.add(item.id)\n }\n return acc\n },\n {\n newSelectedIDs: new Set<string | number>(),\n }\n )\n\n // Clear previous selection in global selection context\n selectedIDs.forEach((id) => {\n setSelection(id)\n })\n\n // Update selection in global selection context\n newSelectedIDs.forEach((id) => {\n const item = getItem(id)\n if (item) {\n setSelection(item.id)\n }\n })\n },\n [docs, getItem, setSelection]\n )\n\n const onItemKeyPress: GridContextValue['onItemKeyPress'] = React.useCallback(\n ({ event, item: currentItem }) => {\n const { code, ctrlKey, metaKey, shiftKey } = event\n\n const isShiftPressed = shiftKey\n const isCtrlPressed = ctrlKey || metaKey\n const isCurrentlySelected = selectedIDs.includes(currentItem.id)\n const currentItemIndex = docs.findIndex(\n (item) => item.id === currentItem.id\n )\n\n switch (code) {\n case 'ArrowDown':\n case 'ArrowLeft':\n case 'ArrowRight':\n case 'ArrowUp': {\n event.preventDefault()\n\n if (currentItemIndex === -1) {\n break\n }\n\n const isBackward = code === 'ArrowLeft' || code === 'ArrowUp'\n const newItemIndex = isBackward\n ? currentItemIndex - 1\n : currentItemIndex + 1\n\n if (newItemIndex < 0 || newItemIndex > totalCount - 1) {\n // out of bounds, keep current selection\n return\n }\n\n setFocusedItemIndex(newItemIndex)\n\n if (isCtrlPressed) {\n break\n }\n\n if (isShiftPressed && allowMultiSelection) {\n const selectedIndexes = handleShiftSelection(newItemIndex)\n updateSelections({ indexes: selectedIndexes })\n return\n }\n\n // Single selection without shift\n if (!isShiftPressed) {\n // const newItem = allItems[newItemIndex]\n updateSelections({ indexes: [newItemIndex] })\n }\n\n break\n }\n case 'Enter': {\n if (selectedIDs.length === 1) {\n // setFocusedItemIndex(undefined)\n navigateAfterSelection({\n collectionSlug: currentItem.relationTo,\n docID: currentItem.id,\n })\n return\n }\n break\n }\n case 'Escape': {\n clearSelections()\n break\n }\n case 'KeyA': {\n if (allowMultiSelection && isCtrlPressed) {\n event.preventDefault()\n setFocusedItemIndex(totalCount - 1)\n updateSelections({\n indexes: Array.from({ length: totalCount }, (_, i) => i),\n })\n }\n break\n }\n case 'Space': {\n if (allowMultiSelection && isShiftPressed) {\n event.preventDefault()\n updateSelections({\n indexes: docs.reduce((acc, item, idx) => {\n if (item.id === currentItem.id) {\n if (isCurrentlySelected) {\n return acc\n } else {\n acc.push(idx)\n }\n } else if (selectedIDs.includes(item.id)) {\n acc.push(idx)\n }\n return acc\n }, [] as number[]),\n })\n } else {\n event.preventDefault()\n updateSelections({\n indexes: isCurrentlySelected ? [] : [currentItemIndex],\n })\n }\n break\n }\n case 'Tab': {\n if (allowMultiSelection && isShiftPressed) {\n const prevIndex = currentItemIndex - 1\n if (prevIndex < 0 && selectedIDs.length > 0) {\n setFocusedItemIndex(prevIndex)\n }\n } else {\n const nextIndex = currentItemIndex + 1\n if (nextIndex === totalCount && selectedIDs.length > 0) {\n setFocusedItemIndex(totalCount - 1)\n }\n }\n break\n }\n }\n },\n [\n selectedIDs,\n docs,\n allowMultiSelection,\n handleShiftSelection,\n updateSelections,\n navigateAfterSelection,\n clearSelections,\n totalCount,\n ]\n )\n\n // Track last clicked item for double-click detection\n const [lastClickedItem, setLastClickedItem] = React.useState<\n MappedDocument | undefined\n >()\n\n const onItemClick: GridContextValue['onItemClick'] = React.useCallback(\n ({ event, item: clickedItem }) => {\n let doubleClicked: boolean = false\n const isCtrlPressed = event.ctrlKey || event.metaKey\n const isShiftPressed = event.shiftKey\n const isCurrentlySelected = selectedIDs.includes(clickedItem.id)\n const currentItemIndex = docs.findIndex(\n (item) => item.id === clickedItem.id\n )\n\n switch (true) {\n case allowMultiSelection && isCtrlPressed: {\n event.preventDefault()\n const indexes = docs.reduce((acc, item, idx) => {\n if (item.id === clickedItem.id) {\n if (!isCurrentlySelected) {\n acc.push(idx)\n }\n } else if (selectedIDs.includes(item.id)) {\n acc.push(idx)\n }\n return acc\n }, [] as number[])\n\n updateSelections({ indexes })\n break\n }\n case allowMultiSelection && isShiftPressed: {\n if (currentItemIndex !== -1) {\n const selectedIndexes = handleShiftSelection(currentItemIndex)\n updateSelections({ indexes: selectedIndexes })\n }\n break\n }\n default: {\n const now = Date.now()\n doubleClicked =\n now - (lastClickTime.current ?? 0) < 400 &&\n lastClickedItem?.id === clickedItem.id\n lastClickTime.current = now\n\n if (!doubleClicked) {\n updateSelections({\n indexes:\n isCurrentlySelected && selectedIDs.length === 1\n ? []\n : [currentItemIndex],\n })\n }\n break\n }\n }\n\n // Update last clicked item to determine double clicks\n setLastClickedItem(clickedItem)\n\n if (doubleClicked) {\n navigateAfterSelection({\n collectionSlug: clickedItem.relationTo,\n docID: clickedItem.id,\n })\n }\n },\n [\n docs,\n allowMultiSelection,\n getItem,\n updateSelections,\n navigateAfterSelection,\n handleShiftSelection,\n ]\n )\n\n return (\n <Context\n value={{\n clearSelections,\n docs,\n focusedItemIndex,\n onItemClick,\n onItemKeyPress,\n setFocusedItemIndex,\n }}\n >\n {children}\n </Context>\n )\n}\n\nexport function useGrid(): GridContextValue {\n const context = React.use(Context)\n\n if (context === undefined) {\n throw new Error('useGrid must be used within a GridProvider')\n }\n\n return context\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"gridContext.mjs","names":["React","useRouter","formatAdminURL","useDrawerDepth","useConfig","useListDrawerContext","useRouteTransition","useSelection","jsx","_jsx","Context","createContext","docs","clearSelections","onItemClick","undefined","onItemKeyPress","setFocusedItemIndex","focusedItemIndex","GridProvider","props","allowMultiSelection","children","config","drawerDepth","router","startRouteTransition","setSelection","selectedIDs","onSelect","isInDrawer","currentlySelectedIndexes","useRef","Set","useState","lastClickTime","totalCount","length","useCallback","current","getItem","id","find","doc","navigateAfterSelection","collectionSlug","docID","push","adminRoute","routes","admin","path","handleShiftSelection","targetIndex","existingIndexes","reduce","acc","item","idx","includes","firstSelectedIndex","Math","min","lastSelectedIndex","max","isWithinBounds","anchorIndex","distanceToFirst","abs","distanceToLast","startIndex","endIndex","newRangeIndexes","Array","from","_","i","mappedSet","updateSelections","indexes","newSelectedIDs","index","add","forEach","event","currentItem","code","ctrlKey","metaKey","shiftKey","isShiftPressed","isCtrlPressed","isCurrentlySelected","currentItemIndex","findIndex","preventDefault","isBackward","newItemIndex","selectedIndexes","relationTo","prevIndex","nextIndex","lastClickedItem","setLastClickedItem","clickedItem","doubleClicked","now","Date","value","useGrid","context","use","Error"],"sources":["../../../src/components/gridContext/gridContext.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\nimport { useRouter } from 'next/navigation'\nimport { formatAdminURL } from 'payload/shared'\n\nimport { useDrawerDepth } from '@payloadcms/ui/elements/Drawer'\nimport {\n useConfig,\n useListDrawerContext,\n useRouteTransition,\n useSelection,\n} from '@payloadcms/ui'\n\nimport type { FolderSortKeys } from 'payload'\nimport type { MappedDocument } from '../gridView/gridView'\ninterface OnItemClickArgs {\n event: React.MouseEvent\n index: number\n item: MappedDocument\n}\n\ninterface OnItemKeyPressArgs {\n event: React.KeyboardEvent\n index: number\n item: MappedDocument\n}\n\nexport type GridContextValue = {\n docs?: MappedDocument[]\n clearSelections: () => void\n onItemClick: (args: OnItemClickArgs) => void\n onItemKeyPress: (args: OnItemKeyPressArgs) => void\n setFocusedItemIndex: React.Dispatch<React.SetStateAction<number>>\n focusedItemIndex: number\n}\n\nconst Context = React.createContext<GridContextValue>({\n docs: [],\n clearSelections: () => {},\n onItemClick: () => undefined,\n onItemKeyPress: () => undefined,\n setFocusedItemIndex: () => -1,\n focusedItemIndex: -1,\n})\n\nexport type GridProviderProps = {\n readonly allowMultiSelection?: boolean\n /**\n * Children to render inside the provider\n */\n readonly children: React.ReactNode\n /**\n * All documents in the current folder\n */\n readonly docs: MappedDocument[]\n /**\n * The intial search query\n */\n readonly search?: string\n /**\n * The sort order of the documents\n *\n * @example\n * `name` for descending\n * `-name` for ascending\n */\n readonly sort?: FolderSortKeys\n}\nexport function GridProvider(props: GridProviderProps) {\n const { allowMultiSelection, children, docs } = props\n\n const { config } = useConfig()\n const drawerDepth = useDrawerDepth()\n const router = useRouter()\n const { startRouteTransition } = useRouteTransition()\n\n const { setSelection, selectedIDs } = useSelection()\n const { onSelect, isInDrawer } = useListDrawerContext()\n\n const currentlySelectedIndexes = React.useRef(new Set<number>())\n\n const [focusedItemIndex, setFocusedItemIndex] = React.useState(-1)\n const lastClickTime = React.useRef<null | number>(null)\n const totalCount = docs.length\n\n const clearSelections = React.useCallback(() => {\n setFocusedItemIndex(-1)\n\n currentlySelectedIndexes.current = new Set()\n }, [])\n\n const getItem = React.useCallback(\n (id: string | number) => {\n return docs.find((doc) => doc.id === id)\n },\n [docs]\n )\n\n const navigateAfterSelection = React.useCallback(\n ({\n collectionSlug,\n docID,\n }: {\n collectionSlug: string\n docID?: number | string\n }) => {\n if (drawerDepth === 1) {\n // not in a drawer (default is 1)\n if (collectionSlug) {\n // clicked on document, take the user to the documet view\n startRouteTransition(() => {\n router.push(\n formatAdminURL({\n adminRoute: config.routes.admin,\n path: `/collections/${collectionSlug}/${docID}`,\n })\n )\n clearSelections()\n })\n }\n } else {\n clearSelections()\n }\n },\n [\n clearSelections,\n config.routes.admin,\n drawerDepth,\n getItem,\n router,\n startRouteTransition,\n ]\n )\n\n const handleShiftSelection = React.useCallback(\n (targetIndex: number) => {\n // Find existing selection boundaries\n const existingIndexes = docs.reduce((acc, item, idx) => {\n if (selectedIDs.includes(item.id)) {\n acc.push(idx)\n }\n return acc\n }, [] as number[])\n\n if (existingIndexes.length === 0) {\n // No existing selection, just select target\n return [targetIndex]\n }\n\n const firstSelectedIndex = Math.min(...existingIndexes)\n const lastSelectedIndex = Math.max(...existingIndexes)\n const isWithinBounds =\n targetIndex >= firstSelectedIndex && targetIndex <= lastSelectedIndex\n\n // Choose anchor based on whether we're contracting or extending\n let anchorIndex = targetIndex\n if (isWithinBounds) {\n // Contracting: if target is at a boundary, use target as anchor\n // Otherwise, use furthest boundary to maintain opposite edge\n if (\n targetIndex === firstSelectedIndex ||\n targetIndex === lastSelectedIndex\n ) {\n anchorIndex = targetIndex\n } else {\n const distanceToFirst = Math.abs(targetIndex - firstSelectedIndex)\n const distanceToLast = Math.abs(targetIndex - lastSelectedIndex)\n anchorIndex =\n distanceToFirst >= distanceToLast\n ? firstSelectedIndex\n : lastSelectedIndex\n }\n } else {\n // Extending: use closest boundary\n const distanceToFirst = Math.abs(targetIndex - firstSelectedIndex)\n const distanceToLast = Math.abs(targetIndex - lastSelectedIndex)\n anchorIndex =\n distanceToFirst <= distanceToLast\n ? firstSelectedIndex\n : lastSelectedIndex\n }\n\n // Create range from anchor to target\n const startIndex = Math.min(anchorIndex, targetIndex)\n const endIndex = Math.max(anchorIndex, targetIndex)\n const newRangeIndexes = Array.from(\n { length: endIndex - startIndex + 1 },\n (_, i) => startIndex + i\n )\n\n if (isWithinBounds) {\n // Contracting: replace with new range\n return newRangeIndexes\n } else {\n // Extending: union with existing\n const mappedSet = new Set([...existingIndexes, ...newRangeIndexes])\n return Array.from(mappedSet)\n }\n },\n [docs, selectedIDs]\n )\n\n const updateSelections = React.useCallback(\n ({ indexes }: { indexes: number[] }) => {\n const { newSelectedIDs } = docs.reduce(\n (acc, item, index) => {\n if (indexes.includes(index)) {\n acc.newSelectedIDs.add(item.id)\n }\n return acc\n },\n {\n newSelectedIDs: new Set<string | number>(),\n }\n )\n\n // Clear previous selection in global selection context\n selectedIDs.forEach((id) => {\n setSelection(id)\n })\n\n // Update selection in global selection context\n newSelectedIDs.forEach((id) => {\n const item = getItem(id)\n if (item) {\n setSelection(item.id)\n }\n })\n },\n [docs, getItem, setSelection]\n )\n\n const onItemKeyPress: GridContextValue['onItemKeyPress'] = React.useCallback(\n ({ event, item: currentItem }) => {\n const { code, ctrlKey, metaKey, shiftKey } = event\n\n const isShiftPressed = shiftKey\n const isCtrlPressed = ctrlKey || metaKey\n const isCurrentlySelected = selectedIDs.includes(currentItem.id)\n const currentItemIndex = docs.findIndex(\n (item) => item.id === currentItem.id\n )\n\n switch (code) {\n case 'ArrowDown':\n case 'ArrowLeft':\n case 'ArrowRight':\n case 'ArrowUp': {\n event.preventDefault()\n\n if (currentItemIndex === -1) {\n break\n }\n\n const isBackward = code === 'ArrowLeft' || code === 'ArrowUp'\n const newItemIndex = isBackward\n ? currentItemIndex - 1\n : currentItemIndex + 1\n\n if (newItemIndex < 0 || newItemIndex > totalCount - 1) {\n // out of bounds, keep current selection\n return\n }\n\n setFocusedItemIndex(newItemIndex)\n\n if (isCtrlPressed) {\n break\n }\n\n if (isShiftPressed && allowMultiSelection) {\n const selectedIndexes = handleShiftSelection(newItemIndex)\n updateSelections({ indexes: selectedIndexes })\n return\n }\n\n // Single selection without shift\n if (!isShiftPressed) {\n updateSelections({ indexes: [newItemIndex] })\n }\n\n break\n }\n case 'Enter': {\n if (selectedIDs.length === 1) {\n if (isInDrawer && typeof onSelect === 'function') {\n onSelect({\n collectionSlug: currentItem.relationTo,\n doc: currentItem,\n docID: currentItem.id as string,\n })\n return\n }\n\n navigateAfterSelection({\n collectionSlug: currentItem.relationTo,\n docID: currentItem.id,\n })\n return\n }\n break\n }\n case 'Escape': {\n clearSelections()\n break\n }\n case 'KeyA': {\n if (allowMultiSelection && isCtrlPressed) {\n event.preventDefault()\n setFocusedItemIndex(totalCount - 1)\n updateSelections({\n indexes: Array.from({ length: totalCount }, (_, i) => i),\n })\n }\n break\n }\n case 'Space': {\n if (allowMultiSelection && isShiftPressed) {\n event.preventDefault()\n updateSelections({\n indexes: docs.reduce((acc, item, idx) => {\n if (item.id === currentItem.id) {\n if (isCurrentlySelected) {\n return acc\n } else {\n acc.push(idx)\n }\n } else if (selectedIDs.includes(item.id)) {\n acc.push(idx)\n }\n return acc\n }, [] as number[]),\n })\n } else {\n event.preventDefault()\n updateSelections({\n indexes: isCurrentlySelected ? [] : [currentItemIndex],\n })\n }\n break\n }\n case 'Tab': {\n if (allowMultiSelection && isShiftPressed) {\n const prevIndex = currentItemIndex - 1\n if (prevIndex < 0 && selectedIDs.length > 0) {\n setFocusedItemIndex(prevIndex)\n }\n } else {\n const nextIndex = currentItemIndex + 1\n if (nextIndex === totalCount && selectedIDs.length > 0) {\n setFocusedItemIndex(totalCount - 1)\n }\n }\n break\n }\n }\n },\n [\n selectedIDs,\n docs,\n allowMultiSelection,\n handleShiftSelection,\n updateSelections,\n navigateAfterSelection,\n clearSelections,\n totalCount,\n ]\n )\n\n // Track last clicked item for double-click detection\n const [lastClickedItem, setLastClickedItem] = React.useState<\n MappedDocument | undefined\n >()\n\n const onItemClick: GridContextValue['onItemClick'] = React.useCallback(\n ({ event, item: clickedItem }) => {\n let doubleClicked: boolean = false\n const isCtrlPressed = event.ctrlKey || event.metaKey\n const isShiftPressed = event.shiftKey\n const isCurrentlySelected = selectedIDs.includes(clickedItem.id)\n const currentItemIndex = docs.findIndex(\n (item) => item.id === clickedItem.id\n )\n\n switch (true) {\n case allowMultiSelection && isCtrlPressed: {\n event.preventDefault()\n const indexes = docs.reduce((acc, item, idx) => {\n if (item.id === clickedItem.id) {\n if (!isCurrentlySelected) {\n acc.push(idx)\n }\n } else if (selectedIDs.includes(item.id)) {\n acc.push(idx)\n }\n return acc\n }, [] as number[])\n\n updateSelections({ indexes })\n break\n }\n\n case allowMultiSelection && isShiftPressed: {\n if (currentItemIndex !== -1) {\n const selectedIndexes = handleShiftSelection(currentItemIndex)\n updateSelections({ indexes: selectedIndexes })\n }\n break\n }\n\n // In drawer, select single item if clicked and no other items are selected\n case isInDrawer &&\n typeof onSelect === 'function' &&\n selectedIDs.length === 0: {\n onSelect({\n collectionSlug: clickedItem.relationTo,\n doc: clickedItem,\n docID: clickedItem.id as string,\n })\n break\n }\n\n default: {\n const now = Date.now()\n doubleClicked =\n now - (lastClickTime.current ?? 0) < 400 &&\n lastClickedItem?.id === clickedItem.id\n lastClickTime.current = now\n\n if (!doubleClicked) {\n updateSelections({\n indexes:\n isCurrentlySelected && selectedIDs.length === 1\n ? []\n : [currentItemIndex],\n })\n }\n break\n }\n }\n\n // Update last clicked item to determine double clicks\n setLastClickedItem(clickedItem)\n\n if (doubleClicked && !isInDrawer) {\n navigateAfterSelection({\n collectionSlug: clickedItem.relationTo,\n docID: clickedItem.id,\n })\n }\n },\n [\n docs,\n allowMultiSelection,\n getItem,\n updateSelections,\n navigateAfterSelection,\n handleShiftSelection,\n ]\n )\n\n return (\n <Context\n value={{\n clearSelections,\n docs,\n focusedItemIndex,\n onItemClick,\n onItemKeyPress,\n setFocusedItemIndex,\n }}\n >\n {children}\n </Context>\n )\n}\n\nexport function useGrid(): GridContextValue {\n const context = React.use(Context)\n\n if (context === undefined) {\n throw new Error('useGrid must be used within a GridProvider')\n }\n\n return context\n}\n"],"mappings":"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"}
|
|
@@ -14,8 +14,8 @@ import "./gridView.css";
|
|
|
14
14
|
|
|
15
15
|
//#region src/components/gridView/gridView.tsx
|
|
16
16
|
function GridView(props) {
|
|
17
|
-
const $ = c(
|
|
18
|
-
const { collectionSlug, AfterList, AfterListTable, BeforeList, BeforeListTable, Description, newDocumentURL, hasCreatePermission, hasDeletePermission, disableBulkDelete, disableBulkEdit, beforeActions, viewType } = props;
|
|
17
|
+
const $ = c(118);
|
|
18
|
+
const { collectionSlug, AfterList, AfterListTable, BeforeList, BeforeListTable, Description, newDocumentURL, hasCreatePermission, hasDeletePermission, disableBulkDelete, disableBulkEdit, enableRowSelections, beforeActions, viewType } = props;
|
|
19
19
|
const { config, getEntityConfig } = useConfig();
|
|
20
20
|
const { routes: t0 } = config;
|
|
21
21
|
const { admin: adminRoute } = t0;
|
|
@@ -52,7 +52,7 @@ function GridView(props) {
|
|
|
52
52
|
const { labels, upload } = collectionConfig;
|
|
53
53
|
const isBulkUploadEnabled = (Boolean(upload) && collectionConfig.upload?.bulkUpload) ?? true;
|
|
54
54
|
const isTrashEnabled = Boolean(collectionConfig.trash);
|
|
55
|
-
const { onBulkSelect } = useListDrawerContext();
|
|
55
|
+
const { onBulkSelect, isInDrawer } = useListDrawerContext();
|
|
56
56
|
const getThumbnailURL = _temp;
|
|
57
57
|
let t6;
|
|
58
58
|
if ($[7] !== collectionSlug || $[8] !== docs) {
|
|
@@ -219,19 +219,29 @@ function GridView(props) {
|
|
|
219
219
|
$[66] = t16;
|
|
220
220
|
} else t16 = $[66];
|
|
221
221
|
let t17;
|
|
222
|
-
if ($[67] !==
|
|
223
|
-
t17 = /* @__PURE__ */ jsx(
|
|
222
|
+
if ($[67] !== beforeActions || $[68] !== isInDrawer || $[69] !== onBulkSelect) {
|
|
223
|
+
t17 = isInDrawer && typeof onBulkSelect === "function" ? [...beforeActions ?? [], /* @__PURE__ */ jsx(SelectMany, { onClick: onBulkSelect }, "select-many")] : beforeActions;
|
|
224
|
+
$[67] = beforeActions;
|
|
225
|
+
$[68] = isInDrawer;
|
|
226
|
+
$[69] = onBulkSelect;
|
|
227
|
+
$[70] = t17;
|
|
228
|
+
} else t17 = $[70];
|
|
229
|
+
let t18;
|
|
230
|
+
if ($[71] !== collectionConfig || $[72] !== collectionSlug || $[73] !== t17) {
|
|
231
|
+
t18 = /* @__PURE__ */ jsx(ListControls, {
|
|
232
|
+
beforeActions: t17,
|
|
224
233
|
collectionConfig,
|
|
225
234
|
collectionSlug,
|
|
226
235
|
enableColumns: false
|
|
227
236
|
});
|
|
228
|
-
$[
|
|
229
|
-
$[
|
|
230
|
-
$[
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
237
|
+
$[71] = collectionConfig;
|
|
238
|
+
$[72] = collectionSlug;
|
|
239
|
+
$[73] = t17;
|
|
240
|
+
$[74] = t18;
|
|
241
|
+
} else t18 = $[74];
|
|
242
|
+
let t19;
|
|
243
|
+
if ($[75] !== adminRoute || $[76] !== collectionSlug || $[77] !== docs.length || $[78] !== hasCreatePermission || $[79] !== i18n || $[80] !== labels?.plural || $[81] !== labels?.singular || $[82] !== mappedDocs || $[83] !== newDocumentURL || $[84] !== router || $[85] !== viewType) {
|
|
244
|
+
t19 = docs.length === 0 ? /* @__PURE__ */ jsxs("div", {
|
|
235
245
|
className: "grid-view__no-results",
|
|
236
246
|
children: [/* @__PURE__ */ jsx("p", { children: i18n.t(viewType === "trash" ? "general:noTrashResults" : "general:noResults", { label: getTranslation(labels?.plural, i18n) }) }), hasCreatePermission && newDocumentURL && /* @__PURE__ */ jsx("div", {
|
|
237
247
|
className: "grid-view__no-results__actions",
|
|
@@ -247,22 +257,22 @@ function GridView(props) {
|
|
|
247
257
|
adminRoute,
|
|
248
258
|
collectionSlug
|
|
249
259
|
});
|
|
250
|
-
$[
|
|
251
|
-
$[
|
|
252
|
-
$[
|
|
253
|
-
$[
|
|
254
|
-
$[
|
|
255
|
-
$[
|
|
256
|
-
$[
|
|
257
|
-
$[
|
|
258
|
-
$[
|
|
259
|
-
$[
|
|
260
|
-
$[
|
|
261
|
-
$[
|
|
262
|
-
} else
|
|
263
|
-
let
|
|
264
|
-
if ($[
|
|
265
|
-
|
|
260
|
+
$[75] = adminRoute;
|
|
261
|
+
$[76] = collectionSlug;
|
|
262
|
+
$[77] = docs.length;
|
|
263
|
+
$[78] = hasCreatePermission;
|
|
264
|
+
$[79] = i18n;
|
|
265
|
+
$[80] = labels?.plural;
|
|
266
|
+
$[81] = labels?.singular;
|
|
267
|
+
$[82] = mappedDocs;
|
|
268
|
+
$[83] = newDocumentURL;
|
|
269
|
+
$[84] = router;
|
|
270
|
+
$[85] = viewType;
|
|
271
|
+
$[86] = t19;
|
|
272
|
+
} else t19 = $[86];
|
|
273
|
+
let t20;
|
|
274
|
+
if ($[87] !== beforeActions || $[88] !== collectionConfig || $[89] !== disableBulkDelete || $[90] !== disableBulkEdit || $[91] !== docs.length || $[92] !== i18n || $[93] !== onBulkSelect || $[94] !== smallBreak) {
|
|
275
|
+
t20 = docs?.length > 0 && /* @__PURE__ */ jsx(PageControls, {
|
|
266
276
|
AfterPageControls: smallBreak ? /* @__PURE__ */ jsxs("div", {
|
|
267
277
|
className: "grid-view__list-selection",
|
|
268
278
|
children: [/* @__PURE__ */ jsx(ListSelection, {
|
|
@@ -277,83 +287,84 @@ function GridView(props) {
|
|
|
277
287
|
}) : null,
|
|
278
288
|
collectionConfig
|
|
279
289
|
});
|
|
280
|
-
$[
|
|
281
|
-
$[
|
|
282
|
-
$[
|
|
283
|
-
$[
|
|
284
|
-
$[
|
|
285
|
-
$[
|
|
286
|
-
$[
|
|
287
|
-
$[
|
|
288
|
-
$[
|
|
289
|
-
} else
|
|
290
|
-
let
|
|
291
|
-
if ($[
|
|
292
|
-
|
|
290
|
+
$[87] = beforeActions;
|
|
291
|
+
$[88] = collectionConfig;
|
|
292
|
+
$[89] = disableBulkDelete;
|
|
293
|
+
$[90] = disableBulkEdit;
|
|
294
|
+
$[91] = docs.length;
|
|
295
|
+
$[92] = i18n;
|
|
296
|
+
$[93] = onBulkSelect;
|
|
297
|
+
$[94] = smallBreak;
|
|
298
|
+
$[95] = t20;
|
|
299
|
+
} else t20 = $[95];
|
|
300
|
+
let t21;
|
|
301
|
+
if ($[96] !== AfterListTable || $[97] !== BeforeListTable || $[98] !== t16 || $[99] !== t18 || $[100] !== t19 || $[101] !== t20) {
|
|
302
|
+
t21 = /* @__PURE__ */ jsxs(Gutter, {
|
|
293
303
|
className: "grid-view__wrapper collection-list__wrap",
|
|
294
304
|
children: [
|
|
295
305
|
t16,
|
|
296
|
-
t17,
|
|
297
|
-
BeforeListTable,
|
|
298
306
|
t18,
|
|
307
|
+
BeforeListTable,
|
|
299
308
|
t19,
|
|
309
|
+
t20,
|
|
300
310
|
AfterListTable
|
|
301
311
|
]
|
|
302
312
|
});
|
|
303
|
-
$[
|
|
304
|
-
$[
|
|
305
|
-
$[
|
|
306
|
-
$[
|
|
307
|
-
$[
|
|
308
|
-
$[
|
|
309
|
-
$[
|
|
310
|
-
} else
|
|
311
|
-
let
|
|
312
|
-
if ($[
|
|
313
|
-
|
|
313
|
+
$[96] = AfterListTable;
|
|
314
|
+
$[97] = BeforeListTable;
|
|
315
|
+
$[98] = t16;
|
|
316
|
+
$[99] = t18;
|
|
317
|
+
$[100] = t19;
|
|
318
|
+
$[101] = t20;
|
|
319
|
+
$[102] = t21;
|
|
320
|
+
} else t21 = $[102];
|
|
321
|
+
let t22;
|
|
322
|
+
if ($[103] !== AfterList || $[104] !== BeforeList || $[105] !== t21) {
|
|
323
|
+
t22 = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
314
324
|
BeforeList,
|
|
315
|
-
|
|
325
|
+
t21,
|
|
316
326
|
AfterList
|
|
317
327
|
] });
|
|
318
|
-
$[
|
|
319
|
-
$[
|
|
320
|
-
$[
|
|
321
|
-
$[
|
|
322
|
-
} else
|
|
323
|
-
let t22;
|
|
324
|
-
if ($[102] !== t11 || $[103] !== t21) {
|
|
325
|
-
t22 = /* @__PURE__ */ jsx("div", {
|
|
326
|
-
className: t11,
|
|
327
|
-
children: t21
|
|
328
|
-
});
|
|
329
|
-
$[102] = t11;
|
|
330
|
-
$[103] = t21;
|
|
331
|
-
$[104] = t22;
|
|
332
|
-
} else t22 = $[104];
|
|
328
|
+
$[103] = AfterList;
|
|
329
|
+
$[104] = BeforeList;
|
|
330
|
+
$[105] = t21;
|
|
331
|
+
$[106] = t22;
|
|
332
|
+
} else t22 = $[106];
|
|
333
333
|
let t23;
|
|
334
|
-
if ($[
|
|
335
|
-
t23 = /* @__PURE__ */ jsx(
|
|
336
|
-
|
|
337
|
-
docs: mappedDocs,
|
|
334
|
+
if ($[107] !== t11 || $[108] !== t22) {
|
|
335
|
+
t23 = /* @__PURE__ */ jsx("div", {
|
|
336
|
+
className: t11,
|
|
338
337
|
children: t22
|
|
339
338
|
});
|
|
340
|
-
$[
|
|
341
|
-
$[
|
|
342
|
-
$[
|
|
343
|
-
} else t23 = $[
|
|
339
|
+
$[107] = t11;
|
|
340
|
+
$[108] = t22;
|
|
341
|
+
$[109] = t23;
|
|
342
|
+
} else t23 = $[109];
|
|
344
343
|
let t24;
|
|
345
|
-
if ($[
|
|
346
|
-
t24 = /* @__PURE__ */ jsx(
|
|
344
|
+
if ($[110] !== enableRowSelections || $[111] !== mappedDocs || $[112] !== t23) {
|
|
345
|
+
t24 = /* @__PURE__ */ jsx(GridProvider, {
|
|
346
|
+
allowMultiSelection: enableRowSelections,
|
|
347
|
+
docs: mappedDocs,
|
|
348
|
+
children: t23
|
|
349
|
+
});
|
|
350
|
+
$[110] = enableRowSelections;
|
|
351
|
+
$[111] = mappedDocs;
|
|
352
|
+
$[112] = t23;
|
|
353
|
+
$[113] = t24;
|
|
354
|
+
} else t24 = $[113];
|
|
355
|
+
let t25;
|
|
356
|
+
if ($[114] !== docs || $[115] !== t10 || $[116] !== t24) {
|
|
357
|
+
t25 = /* @__PURE__ */ jsx(SelectionProvider, {
|
|
347
358
|
docs,
|
|
348
359
|
totalDocs: t10,
|
|
349
|
-
children:
|
|
360
|
+
children: t24
|
|
350
361
|
});
|
|
351
|
-
$[
|
|
352
|
-
$[
|
|
353
|
-
$[
|
|
354
|
-
$[
|
|
355
|
-
} else
|
|
356
|
-
return
|
|
362
|
+
$[114] = docs;
|
|
363
|
+
$[115] = t10;
|
|
364
|
+
$[116] = t24;
|
|
365
|
+
$[117] = t25;
|
|
366
|
+
} else t25 = $[117];
|
|
367
|
+
return t25;
|
|
357
368
|
}
|
|
358
369
|
function _temp(doc) {
|
|
359
370
|
if (doc?.thumbnailURL) return doc.thumbnailURL;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gridView.mjs","names":["c","_c","React","Fragment","useMemo","useEffect","useRouter","getTranslation","Gutter","useListQuery","useConfig","SelectionProvider","useTranslation","useWindowInfo","useBulkUpload","useModal","useStepNav","ListHeader","ListSelection","ListControls","PageControls","SelectMany","useListDrawerContext","DefaultListViewTabs","formatAdminURL","ItemCardGrid","GridProvider","jsx","_jsx","jsxs","_jsxs","GridView","props","$","collectionSlug","AfterList","AfterListTable","BeforeList","BeforeListTable","Description","newDocumentURL","hasCreatePermission","hasDeletePermission","disableBulkDelete","disableBulkEdit","beforeActions","viewType","config","getEntityConfig","routes","t0","admin","adminRoute","router","data","t1","docs","t2","t3","undefined","i18n","setStepNav","openModal","drawerSlug","bulkUploadDrawerSlug","setCollectionSlug","setBulkUploadCollectionSlug","setOnSuccess","breakpoints","t4","s","smallBreak","t5","collectionConfig","labels","upload","isUploadCollection","Boolean","isBulkUploadEnabled","bulkUpload","isTrashEnabled","trash","onBulkSelect","getThumbnailURL","_temp","t6","t7","doc_0","title","doc","filename","alt","String","id","storage","thumbnailURL","relationTo","map","mappedDocs","refresh","openBulkUpload","t8","plural","baseLabel","label","url","path","trashLabel","t","navItems","t9","t10","totalDocs","t11","t12","t13","t14","filter","t15","t16","Actions","onBulkUploadSuccess","t17","enableColumns","t18","length","singular","className","children","type","onClick","push","t19","AfterPageControls","t20","t21","t22","t23","allowMultiSelection","t24","mux","playbackId"],"sources":["../../../src/components/gridView/gridView.tsx"],"sourcesContent":["'use client'\n\nimport React, { Fragment, useMemo, useEffect } from 'react'\nimport { useRouter } from 'next/navigation'\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n Gutter,\n useListQuery,\n useConfig,\n SelectionProvider,\n useTranslation,\n useWindowInfo,\n useBulkUpload,\n useModal,\n useStepNav,\n ListHeader,\n ListSelection,\n ListControls,\n PageControls,\n SelectMany,\n useListDrawerContext,\n} from '@payloadcms/ui'\nimport { DefaultListViewTabs } from '@payloadcms/ui/elements/DefaultListViewTabs'\nimport { formatAdminURL } from 'payload/shared'\nimport { ItemCardGrid } from '../itemCardGrid/itemCardGrid'\nimport { GridProvider } from '../gridContext/gridContext'\n\nimport type { ListViewClientProps } from 'payload'\n\nimport './gridView.css'\n\n// Type for media document with common properties\ninterface MediaDocument {\n id: string | number\n storage: 'mux' | 's3'\n filename?: string\n alt?: string\n mimeType?: string\n url?: string\n thumbnailURL?: string\n mux?: {\n playbackId?: string\n }\n}\n\nexport interface MappedDocument {\n id: string | number\n storage: 'mux' | 's3'\n title: string\n thumbnailURL?: string\n relationTo: string\n}\n\nexport function GridView(props: ListViewClientProps): React.JSX.Element {\n const baseClass = 'grid-view'\n\n const {\n collectionSlug,\n AfterList,\n AfterListTable,\n BeforeList,\n BeforeListTable,\n Description,\n newDocumentURL,\n hasCreatePermission,\n hasDeletePermission,\n disableBulkDelete,\n disableBulkEdit,\n beforeActions,\n viewType,\n } = props\n\n const { config, getEntityConfig } = useConfig()\n\n const {\n routes: { admin: adminRoute },\n } = config\n\n const router = useRouter()\n\n const { data } = useListQuery() ?? {}\n const { docs = [] } = data ?? {}\n\n const { i18n } = useTranslation()\n const { setStepNav } = useStepNav()\n const { openModal } = useModal()\n\n const {\n drawerSlug: bulkUploadDrawerSlug,\n setCollectionSlug: setBulkUploadCollectionSlug,\n setOnSuccess,\n } = useBulkUpload()\n\n const {\n breakpoints: { s: smallBreak },\n } = useWindowInfo()\n\n const collectionConfig = getEntityConfig({ collectionSlug })\n const { labels, upload } = collectionConfig\n\n const isUploadCollection = Boolean(upload)\n\n const isBulkUploadEnabled =\n (isUploadCollection && collectionConfig.upload?.bulkUpload) ?? true\n\n const isTrashEnabled = Boolean(collectionConfig.trash)\n\n const { onBulkSelect } = useListDrawerContext()\n\n const getThumbnailURL = (doc: MediaDocument): string | undefined => {\n if (doc?.thumbnailURL) {\n return doc.thumbnailURL\n }\n\n if (doc?.storage === 'mux' && doc?.mux?.playbackId) {\n return `https://image.mux.com/${doc.mux.playbackId}/thumbnail.jpg?width=400&height=400&fit_mode=pad`\n }\n\n return undefined\n }\n\n const mappedDocs: MappedDocument[] = useMemo(() => {\n return docs.map((doc: MediaDocument) => {\n const title = doc.filename ?? doc.alt ?? String(doc.id)\n return {\n id: doc.id,\n storage: doc.storage,\n title: title,\n thumbnailURL: getThumbnailURL(doc),\n relationTo: collectionSlug,\n }\n })\n }, [docs, collectionSlug])\n\n const openBulkUpload = React.useCallback(() => {\n setBulkUploadCollectionSlug(collectionSlug)\n openModal(bulkUploadDrawerSlug)\n setOnSuccess(() => router.refresh())\n }, [\n router,\n collectionSlug,\n bulkUploadDrawerSlug,\n openModal,\n setBulkUploadCollectionSlug,\n setOnSuccess,\n ])\n\n // Set breadcrumb navigation\n useEffect(() => {\n const baseLabel = {\n label: getTranslation(labels?.plural, i18n),\n url:\n isTrashEnabled && viewType === 'trash'\n ? formatAdminURL({\n adminRoute,\n path: `/collections/${collectionSlug}`,\n })\n : undefined,\n }\n const trashLabel = {\n label: i18n.t('general:trash'),\n }\n const navItems =\n isTrashEnabled && viewType === 'trash'\n ? [baseLabel, trashLabel]\n : [baseLabel]\n setStepNav(navItems)\n }, [\n adminRoute,\n setStepNav,\n labels,\n isTrashEnabled,\n viewType,\n i18n,\n collectionSlug,\n ])\n\n return (\n <SelectionProvider docs={docs} totalDocs={data?.totalDocs ?? 0}>\n <GridProvider allowMultiSelection={true} docs={mappedDocs}>\n <div className={`grid-view grid-view--${collectionSlug}`}>\n <Fragment>\n {BeforeList}\n <Gutter className={`${baseClass}__wrapper collection-list__wrap`}>\n <ListHeader\n Actions={[\n beforeActions,\n !smallBreak && (\n <ListSelection\n disableBulkDelete={disableBulkDelete}\n disableBulkEdit={\n collectionConfig.disableBulkEdit ?? disableBulkEdit\n }\n key=\"list-selection\"\n label={getTranslation(labels?.plural, i18n)}\n />\n ),\n <DefaultListViewTabs\n collectionConfig={collectionConfig}\n config={config}\n key=\"default-list-actions\"\n viewType=\"list\"\n />,\n ].filter(Boolean)}\n collectionConfig={collectionConfig}\n Description={Description}\n disableBulkDelete={disableBulkDelete}\n disableBulkEdit={disableBulkEdit}\n hasCreatePermission={hasCreatePermission}\n hasDeletePermission={hasDeletePermission}\n i18n={i18n}\n isBulkUploadEnabled={isBulkUploadEnabled}\n isTrashEnabled={isTrashEnabled}\n newDocumentURL={newDocumentURL}\n onBulkUploadSuccess={() => router.refresh()}\n openBulkUpload={openBulkUpload}\n smallBreak={smallBreak}\n viewType={viewType}\n />\n <ListControls\n collectionConfig={collectionConfig}\n collectionSlug={collectionSlug}\n enableColumns={false}\n />\n\n {BeforeListTable}\n\n {docs.length === 0 ? (\n <div className={`${baseClass}__no-results`}>\n <p>\n {i18n.t(\n viewType === 'trash'\n ? 'general:noTrashResults'\n : 'general:noResults',\n {\n label: getTranslation(labels?.plural, i18n),\n }\n )}\n </p>\n {hasCreatePermission && newDocumentURL && (\n <div className={`${baseClass}__no-results__actions`}>\n <button\n type=\"button\"\n onClick={() => router.push(newDocumentURL)}\n className={`${baseClass}__create-link btn btn--icon-style-without-border btn--size-small btn--withoutPopup btn--style-pill btn--withoutPopup`}\n >\n {i18n.t('general:createNewLabel', {\n label: getTranslation(labels?.singular, i18n),\n })}\n </button>\n </div>\n )}\n </div>\n ) : (\n <ItemCardGrid\n items={mappedDocs}\n adminRoute={adminRoute}\n collectionSlug={collectionSlug}\n />\n )}\n\n {docs?.length > 0 && (\n <PageControls\n AfterPageControls={\n smallBreak ? (\n <div className={`${baseClass}__list-selection`}>\n <ListSelection\n collectionConfig={collectionConfig}\n disableBulkDelete={disableBulkDelete}\n disableBulkEdit={disableBulkEdit}\n label={getTranslation(\n collectionConfig.labels.plural,\n i18n\n )}\n />\n <div className={`${baseClass}__list-selection-actions`}>\n {typeof onBulkSelect === 'function'\n ? beforeActions\n ? [\n ...beforeActions,\n <SelectMany\n key=\"select-many\"\n onClick={onBulkSelect}\n />,\n ]\n : [\n <SelectMany\n key=\"select-many\"\n onClick={onBulkSelect}\n />,\n ]\n : beforeActions}\n </div>\n </div>\n ) : null\n }\n collectionConfig={collectionConfig}\n />\n )}\n\n {AfterListTable}\n </Gutter>\n {AfterList}\n </Fragment>\n </div>\n </GridProvider>\n </SelectionProvider>\n )\n}\n\nexport default GridView\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"gridView.mjs","names":["c","_c","React","Fragment","useMemo","useEffect","useRouter","getTranslation","Gutter","useListQuery","useConfig","SelectionProvider","useTranslation","useWindowInfo","useBulkUpload","useModal","useStepNav","ListHeader","ListSelection","ListControls","PageControls","SelectMany","useListDrawerContext","DefaultListViewTabs","formatAdminURL","ItemCardGrid","GridProvider","jsx","_jsx","jsxs","_jsxs","GridView","props","$","collectionSlug","AfterList","AfterListTable","BeforeList","BeforeListTable","Description","newDocumentURL","hasCreatePermission","hasDeletePermission","disableBulkDelete","disableBulkEdit","enableRowSelections","beforeActions","viewType","config","getEntityConfig","routes","t0","admin","adminRoute","router","data","t1","docs","t2","t3","undefined","i18n","setStepNav","openModal","drawerSlug","bulkUploadDrawerSlug","setCollectionSlug","setBulkUploadCollectionSlug","setOnSuccess","breakpoints","t4","s","smallBreak","t5","collectionConfig","labels","upload","isUploadCollection","Boolean","isBulkUploadEnabled","bulkUpload","isTrashEnabled","trash","onBulkSelect","isInDrawer","getThumbnailURL","_temp","t6","t7","doc_0","title","doc","filename","alt","String","id","storage","thumbnailURL","relationTo","map","mappedDocs","refresh","openBulkUpload","t8","plural","baseLabel","label","url","path","trashLabel","t","navItems","t9","t10","totalDocs","t11","t12","t13","t14","filter","t15","t16","Actions","onBulkUploadSuccess","t17","t18","enableColumns","t19","length","singular","className","children","type","onClick","push","t20","AfterPageControls","t21","t22","t23","t24","t25","mux","playbackId"],"sources":["../../../src/components/gridView/gridView.tsx"],"sourcesContent":["'use client'\n\nimport React, { Fragment, useMemo, useEffect } from 'react'\nimport { useRouter } from 'next/navigation'\nimport { getTranslation } from '@payloadcms/translations'\nimport {\n Gutter,\n useListQuery,\n useConfig,\n SelectionProvider,\n useTranslation,\n useWindowInfo,\n useBulkUpload,\n useModal,\n useStepNav,\n ListHeader,\n ListSelection,\n ListControls,\n PageControls,\n SelectMany,\n useListDrawerContext,\n} from '@payloadcms/ui'\nimport { DefaultListViewTabs } from '@payloadcms/ui/elements/DefaultListViewTabs'\nimport { formatAdminURL } from 'payload/shared'\nimport { ItemCardGrid } from '../itemCardGrid/itemCardGrid'\nimport { GridProvider } from '../gridContext/gridContext'\n\nimport type { ListViewClientProps } from 'payload'\n\nimport './gridView.css'\n\n// Type for media document with common properties\ninterface MediaDocument {\n id: string | number\n storage: 'mux' | 's3'\n filename?: string\n alt?: string\n mimeType?: string\n url?: string\n thumbnailURL?: string\n mux?: {\n playbackId?: string\n }\n}\n\nexport interface MappedDocument {\n id: string | number\n storage: 'mux' | 's3'\n title: string\n thumbnailURL?: string\n relationTo: string\n}\n\nexport function GridView(props: ListViewClientProps): React.JSX.Element {\n const baseClass = 'grid-view'\n\n const {\n collectionSlug,\n AfterList,\n AfterListTable,\n BeforeList,\n BeforeListTable,\n Description,\n newDocumentURL,\n hasCreatePermission,\n hasDeletePermission,\n disableBulkDelete,\n disableBulkEdit,\n enableRowSelections,\n beforeActions,\n viewType,\n } = props\n\n const { config, getEntityConfig } = useConfig()\n\n const {\n routes: { admin: adminRoute },\n } = config\n\n const router = useRouter()\n\n const { data } = useListQuery() ?? {}\n const { docs = [] } = data ?? {}\n\n const { i18n } = useTranslation()\n const { setStepNav } = useStepNav()\n const { openModal } = useModal()\n\n const {\n drawerSlug: bulkUploadDrawerSlug,\n setCollectionSlug: setBulkUploadCollectionSlug,\n setOnSuccess,\n } = useBulkUpload()\n\n const {\n breakpoints: { s: smallBreak },\n } = useWindowInfo()\n\n const collectionConfig = getEntityConfig({ collectionSlug })\n const { labels, upload } = collectionConfig\n\n const isUploadCollection = Boolean(upload)\n\n const isBulkUploadEnabled =\n (isUploadCollection && collectionConfig.upload?.bulkUpload) ?? true\n\n const isTrashEnabled = Boolean(collectionConfig.trash)\n\n const { onBulkSelect, isInDrawer } = useListDrawerContext()\n\n const getThumbnailURL = (doc: MediaDocument): string | undefined => {\n if (doc?.thumbnailURL) {\n return doc.thumbnailURL\n }\n\n if (doc?.storage === 'mux' && doc?.mux?.playbackId) {\n return `https://image.mux.com/${doc.mux.playbackId}/thumbnail.jpg?width=400&height=400&fit_mode=pad`\n }\n\n return undefined\n }\n\n const mappedDocs: MappedDocument[] = useMemo(() => {\n return docs.map((doc: MediaDocument) => {\n const title = doc.filename ?? doc.alt ?? String(doc.id)\n return {\n id: doc.id,\n storage: doc.storage,\n title: title,\n thumbnailURL: getThumbnailURL(doc),\n relationTo: collectionSlug,\n }\n })\n }, [docs, collectionSlug])\n\n const openBulkUpload = React.useCallback(() => {\n setBulkUploadCollectionSlug(collectionSlug)\n openModal(bulkUploadDrawerSlug)\n setOnSuccess(() => router.refresh())\n }, [\n router,\n collectionSlug,\n bulkUploadDrawerSlug,\n openModal,\n setBulkUploadCollectionSlug,\n setOnSuccess,\n ])\n\n // Set breadcrumb navigation\n useEffect(() => {\n const baseLabel = {\n label: getTranslation(labels?.plural, i18n),\n url:\n isTrashEnabled && viewType === 'trash'\n ? formatAdminURL({\n adminRoute,\n path: `/collections/${collectionSlug}`,\n })\n : undefined,\n }\n const trashLabel = {\n label: i18n.t('general:trash'),\n }\n const navItems =\n isTrashEnabled && viewType === 'trash'\n ? [baseLabel, trashLabel]\n : [baseLabel]\n setStepNav(navItems)\n }, [\n adminRoute,\n setStepNav,\n labels,\n isTrashEnabled,\n viewType,\n i18n,\n collectionSlug,\n ])\n\n return (\n <SelectionProvider docs={docs} totalDocs={data?.totalDocs ?? 0}>\n <GridProvider allowMultiSelection={enableRowSelections} docs={mappedDocs}>\n <div className={`grid-view grid-view--${collectionSlug}`}>\n <Fragment>\n {BeforeList}\n <Gutter className={`${baseClass}__wrapper collection-list__wrap`}>\n <ListHeader\n Actions={[\n beforeActions,\n !smallBreak && (\n <ListSelection\n disableBulkDelete={disableBulkDelete}\n disableBulkEdit={\n collectionConfig.disableBulkEdit ?? disableBulkEdit\n }\n key=\"list-selection\"\n label={getTranslation(labels?.plural, i18n)}\n />\n ),\n <DefaultListViewTabs\n collectionConfig={collectionConfig}\n config={config}\n key=\"default-list-actions\"\n viewType=\"list\"\n />,\n ].filter(Boolean)}\n collectionConfig={collectionConfig}\n Description={Description}\n disableBulkDelete={disableBulkDelete}\n disableBulkEdit={disableBulkEdit}\n hasCreatePermission={hasCreatePermission}\n hasDeletePermission={hasDeletePermission}\n i18n={i18n}\n isBulkUploadEnabled={isBulkUploadEnabled}\n isTrashEnabled={isTrashEnabled}\n newDocumentURL={newDocumentURL}\n onBulkUploadSuccess={() => router.refresh()}\n openBulkUpload={openBulkUpload}\n smallBreak={smallBreak}\n viewType={viewType}\n />\n <ListControls\n beforeActions={\n isInDrawer && typeof onBulkSelect === 'function'\n ? [\n ...(beforeActions ?? []),\n <SelectMany key=\"select-many\" onClick={onBulkSelect} />,\n ]\n : beforeActions\n }\n collectionConfig={collectionConfig}\n collectionSlug={collectionSlug}\n enableColumns={false}\n />\n\n {BeforeListTable}\n\n {docs.length === 0 ? (\n <div className={`${baseClass}__no-results`}>\n <p>\n {i18n.t(\n viewType === 'trash'\n ? 'general:noTrashResults'\n : 'general:noResults',\n {\n label: getTranslation(labels?.plural, i18n),\n }\n )}\n </p>\n {hasCreatePermission && newDocumentURL && (\n <div className={`${baseClass}__no-results__actions`}>\n <button\n type=\"button\"\n onClick={() => router.push(newDocumentURL)}\n className={`${baseClass}__create-link btn btn--icon-style-without-border btn--size-small btn--withoutPopup btn--style-pill btn--withoutPopup`}\n >\n {i18n.t('general:createNewLabel', {\n label: getTranslation(labels?.singular, i18n),\n })}\n </button>\n </div>\n )}\n </div>\n ) : (\n <ItemCardGrid\n items={mappedDocs}\n adminRoute={adminRoute}\n collectionSlug={collectionSlug}\n />\n )}\n\n {docs?.length > 0 && (\n <PageControls\n AfterPageControls={\n smallBreak ? (\n <div className={`${baseClass}__list-selection`}>\n <ListSelection\n collectionConfig={collectionConfig}\n disableBulkDelete={disableBulkDelete}\n disableBulkEdit={disableBulkEdit}\n label={getTranslation(\n collectionConfig.labels.plural,\n i18n\n )}\n />\n <div className={`${baseClass}__list-selection-actions`}>\n {typeof onBulkSelect === 'function'\n ? beforeActions\n ? [\n ...beforeActions,\n <SelectMany\n key=\"select-many\"\n onClick={onBulkSelect}\n />,\n ]\n : [\n <SelectMany\n key=\"select-many\"\n onClick={onBulkSelect}\n />,\n ]\n : beforeActions}\n </div>\n </div>\n ) : null\n }\n collectionConfig={collectionConfig}\n />\n )}\n\n {AfterListTable}\n </Gutter>\n {AfterList}\n </Fragment>\n </div>\n </GridProvider>\n </SelectionProvider>\n )\n}\n\nexport default GridView\n"],"mappings":"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"}
|