@payloadcms/ui 3.0.0-beta.46 → 3.0.0-beta.48

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.
Files changed (116) hide show
  1. package/dist/elements/DocumentControls/index.d.ts.map +1 -1
  2. package/dist/elements/DocumentControls/index.js +28 -21
  3. package/dist/elements/DocumentControls/index.js.map +1 -1
  4. package/dist/elements/DocumentDrawer/DrawerContent.js +1 -1
  5. package/dist/elements/DocumentDrawer/DrawerContent.js.map +1 -1
  6. package/dist/elements/DuplicateDocument/index.d.ts.map +1 -1
  7. package/dist/elements/DuplicateDocument/index.js +2 -2
  8. package/dist/elements/DuplicateDocument/index.js.map +1 -1
  9. package/dist/elements/ListDrawer/DrawerContent.d.ts.map +1 -1
  10. package/dist/elements/ListDrawer/DrawerContent.js +1 -1
  11. package/dist/elements/ListDrawer/DrawerContent.js.map +1 -1
  12. package/dist/elements/ReactSelect/index.d.ts +1 -1
  13. package/dist/elements/ReactSelect/index.d.ts.map +1 -1
  14. package/dist/elements/ReactSelect/index.js.map +1 -1
  15. package/dist/elements/ReactSelect/types.d.ts +4 -4
  16. package/dist/elements/ReactSelect/types.d.ts.map +1 -1
  17. package/dist/elements/ReactSelect/types.js.map +1 -1
  18. package/dist/elements/SortComplex/index.d.ts.map +1 -1
  19. package/dist/elements/SortComplex/index.js.map +1 -1
  20. package/dist/elements/TableColumns/index.d.ts +0 -2
  21. package/dist/elements/TableColumns/index.d.ts.map +1 -1
  22. package/dist/elements/TableColumns/index.js +83 -85
  23. package/dist/elements/TableColumns/index.js.map +1 -1
  24. package/dist/elements/Thumbnail/index.d.ts.map +1 -1
  25. package/dist/elements/Thumbnail/index.js +2 -2
  26. package/dist/elements/Thumbnail/index.js.map +1 -1
  27. package/dist/elements/Upload/index.d.ts.map +1 -1
  28. package/dist/elements/Upload/index.js +4 -9
  29. package/dist/elements/Upload/index.js.map +1 -1
  30. package/dist/elements/Upload/index.scss +0 -11
  31. package/dist/elements/WhereBuilder/Condition/Relationship/index.js +3 -3
  32. package/dist/elements/WhereBuilder/Condition/Relationship/index.js.map +1 -1
  33. package/dist/elements/WhereBuilder/Condition/index.d.ts +2 -1
  34. package/dist/elements/WhereBuilder/Condition/index.d.ts.map +1 -1
  35. package/dist/elements/WhereBuilder/Condition/index.js.map +1 -1
  36. package/dist/elements/WhereBuilder/index.d.ts.map +1 -1
  37. package/dist/elements/WhereBuilder/index.js.map +1 -1
  38. package/dist/fields/Array/index.js +2 -2
  39. package/dist/fields/Array/index.js.map +1 -1
  40. package/dist/fields/Blocks/index.js +1 -1
  41. package/dist/fields/Blocks/index.js.map +1 -1
  42. package/dist/fields/Checkbox/index.js +1 -1
  43. package/dist/fields/Checkbox/index.js.map +1 -1
  44. package/dist/fields/Code/index.js +1 -1
  45. package/dist/fields/Code/index.js.map +1 -1
  46. package/dist/fields/Collapsible/index.js +1 -1
  47. package/dist/fields/Collapsible/index.js.map +1 -1
  48. package/dist/fields/DateTime/index.d.ts +1 -1
  49. package/dist/fields/DateTime/index.d.ts.map +1 -1
  50. package/dist/fields/DateTime/index.js +1 -1
  51. package/dist/fields/DateTime/index.js.map +1 -1
  52. package/dist/fields/Email/index.d.ts.map +1 -1
  53. package/dist/fields/Email/index.js +1 -1
  54. package/dist/fields/Email/index.js.map +1 -1
  55. package/dist/fields/JSON/index.d.ts +1 -1
  56. package/dist/fields/JSON/index.d.ts.map +1 -1
  57. package/dist/fields/JSON/index.js +1 -1
  58. package/dist/fields/JSON/index.js.map +1 -1
  59. package/dist/fields/Number/index.js +1 -1
  60. package/dist/fields/Number/index.js.map +1 -1
  61. package/dist/fields/Point/index.js +1 -1
  62. package/dist/fields/Point/index.js.map +1 -1
  63. package/dist/fields/RadioGroup/index.js +1 -1
  64. package/dist/fields/RadioGroup/index.js.map +1 -1
  65. package/dist/fields/Relationship/index.d.ts.map +1 -1
  66. package/dist/fields/Relationship/index.js +18 -10
  67. package/dist/fields/Relationship/index.js.map +1 -1
  68. package/dist/fields/Relationship/types.d.ts +1 -2
  69. package/dist/fields/Relationship/types.d.ts.map +1 -1
  70. package/dist/fields/Relationship/types.js.map +1 -1
  71. package/dist/fields/Select/Input.d.ts +3 -1
  72. package/dist/fields/Select/Input.d.ts.map +1 -1
  73. package/dist/fields/Select/Input.js.map +1 -1
  74. package/dist/fields/Select/index.d.ts +1 -1
  75. package/dist/fields/Select/index.d.ts.map +1 -1
  76. package/dist/fields/Select/index.js +4 -6
  77. package/dist/fields/Select/index.js.map +1 -1
  78. package/dist/fields/Tabs/index.js +1 -1
  79. package/dist/fields/Tabs/index.js.map +1 -1
  80. package/dist/fields/Text/Input.d.ts.map +1 -1
  81. package/dist/fields/Text/Input.js.map +1 -1
  82. package/dist/fields/Text/index.js +1 -1
  83. package/dist/fields/Text/index.js.map +1 -1
  84. package/dist/fields/Text/types.d.ts +9 -4
  85. package/dist/fields/Text/types.d.ts.map +1 -1
  86. package/dist/fields/Text/types.js.map +1 -1
  87. package/dist/fields/Textarea/index.js +1 -1
  88. package/dist/fields/Textarea/index.js.map +1 -1
  89. package/dist/fields/Upload/index.js +1 -1
  90. package/dist/fields/Upload/index.js.map +1 -1
  91. package/dist/forms/FieldError/index.js +1 -1
  92. package/dist/forms/FieldError/index.js.map +1 -1
  93. package/dist/forms/FieldPropsProvider/index.js +4 -4
  94. package/dist/forms/FieldPropsProvider/index.js.map +1 -1
  95. package/dist/forms/Form/index.js +1 -1
  96. package/dist/forms/Form/index.js.map +1 -1
  97. package/dist/forms/Form/types.d.ts +2 -3
  98. package/dist/forms/Form/types.d.ts.map +1 -1
  99. package/dist/forms/Form/types.js.map +1 -1
  100. package/dist/forms/withCondition/index.js +1 -1
  101. package/dist/forms/withCondition/index.js.map +1 -1
  102. package/dist/graphics/Account/index.d.ts +0 -1
  103. package/dist/graphics/Account/index.d.ts.map +1 -1
  104. package/dist/graphics/Account/index.js +5 -1
  105. package/dist/graphics/Account/index.js.map +1 -1
  106. package/dist/providers/ComponentMap/buildComponentMap/fields.d.ts.map +1 -1
  107. package/dist/providers/ComponentMap/buildComponentMap/fields.js +2 -1
  108. package/dist/providers/ComponentMap/buildComponentMap/fields.js.map +1 -1
  109. package/dist/providers/FormQueryParams/index.d.ts.map +1 -1
  110. package/dist/providers/FormQueryParams/index.js +8 -6
  111. package/dist/providers/FormQueryParams/index.js.map +1 -1
  112. package/package.json +4 -4
  113. package/dist/elements/TableColumns/columnReducer.d.ts +0 -24
  114. package/dist/elements/TableColumns/columnReducer.d.ts.map +0 -1
  115. package/dist/elements/TableColumns/columnReducer.js +0 -59
  116. package/dist/elements/TableColumns/columnReducer.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/elements/SortComplex/index.tsx"],"sourcesContent":["'use client'\nimport type { OptionObject } from 'payload/types'\nimport type { SanitizedCollectionConfig } from 'payload/types'\n\nimport { getTranslation } from '@payloadcms/translations'\n// TODO: abstract the `next/navigation` dependency out from this component\nimport { usePathname, useRouter } from 'next/navigation.js'\nimport { sortableFieldTypes } from 'payload/fields/index'\nimport { fieldAffectsData } from 'payload/types'\nimport queryString from 'qs'\nimport React, { useEffect, useState } from 'react'\n\nexport type SortComplexProps = {\n collection: SanitizedCollectionConfig\n handleChange?: (sort: string) => void\n modifySearchQuery?: boolean\n sort?: string\n}\n\nimport { useSearchParams } from '../../providers/SearchParams/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { ReactSelect } from '../ReactSelect/index.js'\nimport './index.scss'\n\nconst baseClass = 'sort-complex'\n\nexport const SortComplex: React.FC<SortComplexProps> = (props) => {\n const { collection, handleChange, modifySearchQuery = true } = props\n\n const router = useRouter()\n const pathname = usePathname()\n const { searchParams } = useSearchParams()\n const { i18n, t } = useTranslation()\n const [sortOptions, setSortOptions] = useState<OptionObject[]>()\n\n const [sortFields] = useState(() =>\n collection.fields.reduce((fields, field) => {\n if (fieldAffectsData(field) && sortableFieldTypes.indexOf(field.type) > -1) {\n return [\n ...fields,\n { label: getTranslation(field.label || field.name, i18n), value: field.name },\n ]\n }\n return fields\n }, []),\n )\n\n const [sortField, setSortField] = useState(sortFields[0])\n const [initialSort] = useState(() => ({ label: t('general:descending'), value: '-' }))\n const [sortOrder, setSortOrder] = useState(initialSort)\n\n useEffect(() => {\n if (sortField?.value) {\n const newSortValue = `${sortOrder.value}${sortField.value}`\n\n if (handleChange) handleChange(newSortValue)\n\n if (searchParams.sort !== newSortValue && modifySearchQuery) {\n const search = queryString.stringify(\n {\n ...searchParams,\n sort: newSortValue,\n },\n { addQueryPrefix: true },\n )\n\n router.replace(`${pathname}${search}`)\n }\n }\n }, [pathname, router, searchParams, sortField, sortOrder, modifySearchQuery, handleChange])\n\n useEffect(() => {\n setSortOptions([\n { label: t('general:ascending'), value: '' },\n { label: t('general:descending'), value: '-' },\n ])\n }, [i18n, t])\n\n return (\n <div className={baseClass}>\n <React.Fragment>\n <div className={`${baseClass}__wrap`}>\n <div className={`${baseClass}__select`}>\n <div className={`${baseClass}__label`}>{t('general:columnToSort')}</div>\n <ReactSelect onChange={setSortField} options={sortFields} value={sortField} />\n </div>\n <div className={`${baseClass}__select`}>\n <div className={`${baseClass}__label`}>{t('general:order')}</div>\n <ReactSelect\n onChange={(incomingSort) => {\n setSortOrder(incomingSort || initialSort)\n }}\n options={sortOptions}\n value={sortOrder}\n />\n </div>\n </div>\n </React.Fragment>\n </div>\n )\n}\n"],"names":["getTranslation","usePathname","useRouter","sortableFieldTypes","fieldAffectsData","queryString","React","useEffect","useState","useSearchParams","useTranslation","ReactSelect","baseClass","SortComplex","props","collection","handleChange","modifySearchQuery","router","pathname","searchParams","i18n","t","sortOptions","setSortOptions","sortFields","fields","reduce","field","indexOf","type","label","name","value","sortField","setSortField","initialSort","sortOrder","setSortOrder","newSortValue","sort","search","stringify","addQueryPrefix","replace","div","className","Fragment","onChange","options","incomingSort"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../../src/elements/SortComplex/index.tsx"],"sourcesContent":["'use client'\nimport type { OptionObject, SanitizedCollectionConfig } from 'payload/types'\n\nimport { getTranslation } from '@payloadcms/translations'\n// TODO: abstract the `next/navigation` dependency out from this component\nimport { usePathname, useRouter } from 'next/navigation.js'\nimport { sortableFieldTypes } from 'payload/fields/index'\nimport { fieldAffectsData } from 'payload/types'\nimport queryString from 'qs'\nimport React, { useEffect, useState } from 'react'\n\nexport type SortComplexProps = {\n collection: SanitizedCollectionConfig\n handleChange?: (sort: string) => void\n modifySearchQuery?: boolean\n sort?: string\n}\n\nimport type { Option } from '../ReactSelect/index.js'\n\nimport { useSearchParams } from '../../providers/SearchParams/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { ReactSelect } from '../ReactSelect/index.js'\nimport './index.scss'\n\nconst baseClass = 'sort-complex'\n\nexport const SortComplex: React.FC<SortComplexProps> = (props) => {\n const { collection, handleChange, modifySearchQuery = true } = props\n\n const router = useRouter()\n const pathname = usePathname()\n const { searchParams } = useSearchParams()\n const { i18n, t } = useTranslation()\n const [sortOptions, setSortOptions] = useState<OptionObject[]>()\n\n const [sortFields] = useState(() =>\n collection.fields.reduce((fields, field) => {\n if (fieldAffectsData(field) && sortableFieldTypes.indexOf(field.type) > -1) {\n return [\n ...fields,\n { label: getTranslation(field.label || field.name, i18n), value: field.name },\n ]\n }\n return fields\n }, []),\n )\n\n const [sortField, setSortField] = useState(sortFields[0])\n const [initialSort] = useState<Option>(() => ({ label: t('general:descending'), value: '-' }))\n const [sortOrder, setSortOrder] = useState(initialSort)\n\n useEffect(() => {\n if (sortField?.value) {\n const newSortValue = `${sortOrder.value}${sortField.value}`\n\n if (handleChange) handleChange(newSortValue)\n\n if (searchParams.sort !== newSortValue && modifySearchQuery) {\n const search = queryString.stringify(\n {\n ...searchParams,\n sort: newSortValue,\n },\n { addQueryPrefix: true },\n )\n\n router.replace(`${pathname}${search}`)\n }\n }\n }, [pathname, router, searchParams, sortField, sortOrder, modifySearchQuery, handleChange])\n\n useEffect(() => {\n setSortOptions([\n { label: t('general:ascending'), value: '' },\n { label: t('general:descending'), value: '-' },\n ])\n }, [i18n, t])\n\n return (\n <div className={baseClass}>\n <React.Fragment>\n <div className={`${baseClass}__wrap`}>\n <div className={`${baseClass}__select`}>\n <div className={`${baseClass}__label`}>{t('general:columnToSort')}</div>\n <ReactSelect onChange={setSortField} options={sortFields} value={sortField} />\n </div>\n <div className={`${baseClass}__select`}>\n <div className={`${baseClass}__label`}>{t('general:order')}</div>\n <ReactSelect\n onChange={(incomingSort: Option) => {\n setSortOrder(incomingSort || initialSort)\n }}\n options={sortOptions}\n value={sortOrder}\n />\n </div>\n </div>\n </React.Fragment>\n </div>\n )\n}\n"],"names":["getTranslation","usePathname","useRouter","sortableFieldTypes","fieldAffectsData","queryString","React","useEffect","useState","useSearchParams","useTranslation","ReactSelect","baseClass","SortComplex","props","collection","handleChange","modifySearchQuery","router","pathname","searchParams","i18n","t","sortOptions","setSortOptions","sortFields","fields","reduce","field","indexOf","type","label","name","value","sortField","setSortField","initialSort","sortOrder","setSortOrder","newSortValue","sort","search","stringify","addQueryPrefix","replace","div","className","Fragment","onChange","options","incomingSort"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -2,10 +2,8 @@ import type { CellComponentProps } from 'payload/types';
2
2
  import React from 'react';
3
3
  import type { ColumnPreferences } from '../../providers/ListInfo/index.js';
4
4
  import type { Column } from '../Table/index.js';
5
- import type { Action } from './columnReducer.js';
6
5
  export interface ITableColumns {
7
6
  columns: Column[];
8
- dispatchTableColumns: React.Dispatch<Action>;
9
7
  moveColumn: (args: {
10
8
  fromIndex: number;
11
9
  toIndex: number;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/TableColumns/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAEvD,OAAO,KAQN,MAAM,OAAO,CAAA;AAEd,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAA;AAC1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAUhD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,oBAAoB,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;IAC5C,UAAU,EAAE,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;IAClE,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IAC7C,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;CACvC;AAED,eAAO,MAAM,kBAAkB,8BAAoD,CAAA;AAEnF,eAAO,MAAM,eAAe,QAAO,aAA+C,CAAA;AAElF,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,iBAAiB,CAAA;CAC3B,CAAA;AAED,KAAK,KAAK,GAAG;IACX,SAAS,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAA;IACzC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,cAAc,EAAE,MAAM,CAAA;IACtB,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC,aAAa,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAmKhD,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/TableColumns/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAA6B,MAAM,eAAe,CAAA;AAElF,OAAO,KAA2D,MAAM,OAAO,CAAA;AAE/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAA;AAC1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAS/C,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,UAAU,EAAE,CAAC,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;IAClE,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IAC7C,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;CACvC;AAED,eAAO,MAAM,kBAAkB,8BAAoD,CAAA;AAEnF,eAAO,MAAM,eAAe,QAAO,aAA+C,CAAA;AAElF,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,iBAAiB,CAAA;CAC3B,CAAA;AAED,KAAK,KAAK,GAAG;IACX,SAAS,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,EAAE,CAAA;IACzC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,cAAc,EAAE,MAAM,CAAA;IACtB,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC,aAAa,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CA0KhD,CAAA"}
@@ -1,11 +1,10 @@
1
1
  'use client';
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
- import React, { createContext, useCallback, useContext, useEffect, useReducer, useRef, useState } from 'react';
3
+ import React, { createContext, useCallback, useContext, useState } from 'react';
4
4
  import { useComponentMap } from '../../providers/ComponentMap/index.js';
5
5
  import { useConfig } from '../../providers/Config/index.js';
6
6
  import { usePreferences } from '../../providers/Preferences/index.js';
7
7
  import { buildColumnState } from './buildColumnState.js';
8
- import { columnReducer } from './columnReducer.js';
9
8
  import { filterFields } from './filterFields.js';
10
9
  import { getInitialColumns } from './getInitialColumns.js';
11
10
  export const TableColumnContext = /*#__PURE__*/ createContext({});
@@ -16,43 +15,103 @@ export const TableColumnsProvider = ({ cellProps, children, collectionSlug, enab
16
15
  const { fieldMap } = componentMap.collections[collectionSlug];
17
16
  const collectionConfig = config.collections.find((collectionConfig)=>collectionConfig.slug === collectionSlug);
18
17
  const { admin: { defaultColumns, useAsTitle } } = collectionConfig;
19
- const prevCollection = useRef(collectionSlug);
20
- const hasInitialized = useRef(false);
18
+ const prevCollection = React.useRef(collectionSlug);
21
19
  const { getPreference, setPreference } = usePreferences();
22
20
  const [initialColumns] = useState(()=>getInitialColumns(filterFields(fieldMap), useAsTitle, defaultColumns));
23
- const [tableColumns, dispatchTableColumns] = useReducer(columnReducer, {}, ()=>{
24
- return buildColumnState({
21
+ const [tableColumns, setTableColumns] = React.useState(()=>buildColumnState({
25
22
  cellProps,
26
23
  columnPreferences: listPreferences?.columns,
27
24
  columns: initialColumns,
28
25
  enableRowSelections,
29
26
  fieldMap,
30
27
  useAsTitle
28
+ }));
29
+ const updateColumnPreferences = React.useCallback((newColumns)=>{
30
+ const columns = newColumns.map((c)=>({
31
+ accessor: c?.accessor,
32
+ active: c?.active
33
+ }));
34
+ void setPreference(preferenceKey, {
35
+ columns
36
+ }, true);
37
+ }, [
38
+ preferenceKey,
39
+ setPreference
40
+ ]);
41
+ const reassignLinkColumn = (columns)=>{
42
+ let foundFirstActive = false;
43
+ const newColumns = columns.map((col)=>{
44
+ const linkColumn = col.active && !foundFirstActive && col.accessor !== '_select';
45
+ if (linkColumn) foundFirstActive = true;
46
+ return {
47
+ ...col,
48
+ cellProps: {
49
+ ...col.cellProps,
50
+ link: linkColumn
51
+ }
52
+ };
31
53
  });
32
- });
33
- // /////////////////////////////////////
34
- // Get preferences on collection change
35
- // /////////////////////////////////////
36
- useEffect(()=>{
54
+ return newColumns;
55
+ };
56
+ const moveColumn = useCallback((args)=>{
57
+ const { fromIndex, toIndex } = args;
58
+ const withMovedColumn = [
59
+ ...tableColumns
60
+ ];
61
+ const [columnToMove] = withMovedColumn.splice(fromIndex, 1);
62
+ withMovedColumn.splice(toIndex, 0, columnToMove);
63
+ const newColumns = reassignLinkColumn(withMovedColumn);
64
+ setTableColumns(newColumns);
65
+ updateColumnPreferences(newColumns);
66
+ }, [
67
+ tableColumns,
68
+ updateColumnPreferences
69
+ ]);
70
+ const toggleColumn = useCallback((column)=>{
71
+ const toggledColumns = tableColumns.map((col)=>{
72
+ return {
73
+ ...col,
74
+ active: col?.name === column ? !col.active : col.active
75
+ };
76
+ });
77
+ const newColumns = reassignLinkColumn(toggledColumns);
78
+ setTableColumns(newColumns);
79
+ updateColumnPreferences(newColumns);
80
+ }, [
81
+ tableColumns,
82
+ updateColumnPreferences
83
+ ]);
84
+ const setActiveColumns = React.useCallback((activeColumnAccessors)=>{
85
+ const activeColumns = tableColumns.map((col)=>{
86
+ return {
87
+ ...col,
88
+ active: activeColumnAccessors.includes(col.accessor)
89
+ };
90
+ });
91
+ const newColumns = reassignLinkColumn(activeColumns);
92
+ updateColumnPreferences(newColumns);
93
+ }, [
94
+ tableColumns,
95
+ updateColumnPreferences
96
+ ]);
97
+ // //////////////////////////////////////////////
98
+ // Get preferences on collection change (drawers)
99
+ // //////////////////////////////////////////////
100
+ React.useEffect(()=>{
37
101
  const sync = async ()=>{
38
102
  const collectionHasChanged = prevCollection.current !== collectionSlug;
39
103
  if (collectionHasChanged || !listPreferences) {
40
104
  const currentPreferences = await getPreference(preferenceKey);
41
105
  prevCollection.current = collectionSlug;
42
106
  if (currentPreferences?.columns) {
43
- dispatchTableColumns({
44
- type: 'set',
45
- payload: {
46
- columns: buildColumnState({
47
- cellProps,
48
- columnPreferences: currentPreferences?.columns,
49
- columns: initialColumns,
50
- enableRowSelections: true,
51
- fieldMap,
52
- useAsTitle
53
- })
54
- }
55
- });
107
+ setTableColumns(buildColumnState({
108
+ cellProps,
109
+ columnPreferences: currentPreferences?.columns,
110
+ columns: initialColumns,
111
+ enableRowSelections: true,
112
+ fieldMap,
113
+ useAsTitle
114
+ }));
56
115
  }
57
116
  }
58
117
  };
@@ -68,70 +127,9 @@ export const TableColumnsProvider = ({ cellProps, children, collectionSlug, enab
68
127
  listPreferences,
69
128
  initialColumns
70
129
  ]);
71
- // /////////////////////////////////////
72
- // Set preferences on column change
73
- // /////////////////////////////////////
74
- useEffect(()=>{
75
- if (!hasInitialized.current) {
76
- hasInitialized.current = true;
77
- return;
78
- }
79
- const columns = tableColumns.map((c)=>({
80
- accessor: c?.accessor,
81
- active: c?.active
82
- }));
83
- void setPreference(preferenceKey, {
84
- columns
85
- }, true);
86
- }, [
87
- tableColumns,
88
- preferenceKey,
89
- setPreference
90
- ]);
91
- const setActiveColumns = useCallback((columns)=>{
92
- // dispatchTableColumns({
93
- // type: 'set',
94
- // payload: {
95
- // // onSelect,
96
- // cellProps,
97
- // collection: { ...collectionConfig, fields: formatFields(collectionConfig) },
98
- // columns: columns.map((column) => ({
99
- // accessor: column,
100
- // active: true,
101
- // })),
102
- // i18n,
103
- // },
104
- // })
105
- }, [
106
- collectionConfig,
107
- cellProps
108
- ]);
109
- const moveColumn = useCallback((args)=>{
110
- const { fromIndex, toIndex } = args;
111
- dispatchTableColumns({
112
- type: 'move',
113
- payload: {
114
- fromIndex,
115
- toIndex
116
- }
117
- });
118
- }, [
119
- dispatchTableColumns
120
- ]);
121
- const toggleColumn = useCallback((column)=>{
122
- dispatchTableColumns({
123
- type: 'toggle',
124
- payload: {
125
- column
126
- }
127
- });
128
- }, [
129
- dispatchTableColumns
130
- ]);
131
130
  return /*#__PURE__*/ _jsx(TableColumnContext.Provider, {
132
131
  value: {
133
132
  columns: tableColumns,
134
- dispatchTableColumns,
135
133
  moveColumn,
136
134
  setActiveColumns,
137
135
  toggleColumn
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/elements/TableColumns/index.tsx"],"sourcesContent":["'use client'\nimport type { SanitizedCollectionConfig } from 'payload/types'\nimport type { CellComponentProps } from 'payload/types'\n\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useReducer,\n useRef,\n useState,\n} from 'react'\n\nimport type { ColumnPreferences } from '../../providers/ListInfo/index.js'\nimport type { Column } from '../Table/index.js'\nimport type { Action } from './columnReducer.js'\n\nimport { useComponentMap } from '../../providers/ComponentMap/index.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { usePreferences } from '../../providers/Preferences/index.js'\nimport { buildColumnState } from './buildColumnState.js'\nimport { columnReducer } from './columnReducer.js'\nimport { filterFields } from './filterFields.js'\nimport { getInitialColumns } from './getInitialColumns.js'\n\nexport interface ITableColumns {\n columns: Column[]\n dispatchTableColumns: React.Dispatch<Action>\n moveColumn: (args: { fromIndex: number; toIndex: number }) => void\n setActiveColumns: (columns: string[]) => void\n toggleColumn: (column: string) => void\n}\n\nexport const TableColumnContext = createContext<ITableColumns>({} as ITableColumns)\n\nexport const useTableColumns = (): ITableColumns => useContext(TableColumnContext)\n\nexport type ListPreferences = {\n columns: ColumnPreferences\n}\n\ntype Props = {\n cellProps?: Partial<CellComponentProps>[]\n children: React.ReactNode\n collectionSlug: string\n enableRowSelections?: boolean\n listPreferences?: ListPreferences\n preferenceKey: string\n}\n\nexport const TableColumnsProvider: React.FC<Props> = ({\n cellProps,\n children,\n collectionSlug,\n enableRowSelections = false,\n listPreferences,\n preferenceKey,\n}) => {\n const config = useConfig()\n\n const { componentMap } = useComponentMap()\n\n const { fieldMap } = componentMap.collections[collectionSlug]\n\n const collectionConfig = config.collections.find(\n (collectionConfig) => collectionConfig.slug === collectionSlug,\n )\n\n const {\n admin: { defaultColumns, useAsTitle },\n } = collectionConfig\n\n const prevCollection = useRef<SanitizedCollectionConfig['slug']>(collectionSlug)\n const hasInitialized = useRef(false)\n const { getPreference, setPreference } = usePreferences()\n\n const [initialColumns] = useState<ColumnPreferences>(() =>\n getInitialColumns(filterFields(fieldMap), useAsTitle, defaultColumns),\n )\n\n const [tableColumns, dispatchTableColumns] = useReducer(columnReducer, {}, () => {\n return buildColumnState({\n cellProps,\n columnPreferences: listPreferences?.columns,\n columns: initialColumns,\n enableRowSelections,\n fieldMap,\n useAsTitle,\n })\n })\n\n // /////////////////////////////////////\n // Get preferences on collection change\n // /////////////////////////////////////\n\n useEffect(() => {\n const sync = async () => {\n const collectionHasChanged = prevCollection.current !== collectionSlug\n\n if (collectionHasChanged || !listPreferences) {\n const currentPreferences = await getPreference<{\n columns: ColumnPreferences\n }>(preferenceKey)\n prevCollection.current = collectionSlug\n\n if (currentPreferences?.columns) {\n dispatchTableColumns({\n type: 'set',\n payload: {\n columns: buildColumnState({\n cellProps,\n columnPreferences: currentPreferences?.columns,\n columns: initialColumns,\n enableRowSelections: true,\n fieldMap,\n useAsTitle,\n }),\n },\n })\n }\n }\n }\n\n void sync()\n }, [\n preferenceKey,\n getPreference,\n collectionSlug,\n fieldMap,\n cellProps,\n defaultColumns,\n useAsTitle,\n listPreferences,\n initialColumns,\n ])\n\n // /////////////////////////////////////\n // Set preferences on column change\n // /////////////////////////////////////\n\n useEffect(() => {\n if (!hasInitialized.current) {\n hasInitialized.current = true\n return\n }\n\n const columns = tableColumns.map((c) => ({\n accessor: c?.accessor,\n active: c?.active,\n }))\n\n void setPreference(preferenceKey, { columns }, true)\n }, [tableColumns, preferenceKey, setPreference])\n\n const setActiveColumns = useCallback(\n (columns: string[]) => {\n // dispatchTableColumns({\n // type: 'set',\n // payload: {\n // // onSelect,\n // cellProps,\n // collection: { ...collectionConfig, fields: formatFields(collectionConfig) },\n // columns: columns.map((column) => ({\n // accessor: column,\n // active: true,\n // })),\n // i18n,\n // },\n // })\n },\n [collectionConfig, cellProps],\n )\n\n const moveColumn = useCallback(\n (args: { fromIndex: number; toIndex: number }) => {\n const { fromIndex, toIndex } = args\n\n dispatchTableColumns({\n type: 'move',\n payload: {\n fromIndex,\n toIndex,\n },\n })\n },\n [dispatchTableColumns],\n )\n\n const toggleColumn = useCallback(\n (column: string) => {\n dispatchTableColumns({\n type: 'toggle',\n payload: {\n column,\n },\n })\n },\n [dispatchTableColumns],\n )\n\n return (\n <TableColumnContext.Provider\n value={{\n columns: tableColumns,\n dispatchTableColumns,\n moveColumn,\n setActiveColumns,\n toggleColumn,\n }}\n >\n {children}\n </TableColumnContext.Provider>\n )\n}\n"],"names":["React","createContext","useCallback","useContext","useEffect","useReducer","useRef","useState","useComponentMap","useConfig","usePreferences","buildColumnState","columnReducer","filterFields","getInitialColumns","TableColumnContext","useTableColumns","TableColumnsProvider","cellProps","children","collectionSlug","enableRowSelections","listPreferences","preferenceKey","config","componentMap","fieldMap","collections","collectionConfig","find","slug","admin","defaultColumns","useAsTitle","prevCollection","hasInitialized","getPreference","setPreference","initialColumns","tableColumns","dispatchTableColumns","columnPreferences","columns","sync","collectionHasChanged","current","currentPreferences","type","payload","map","c","accessor","active","setActiveColumns","moveColumn","args","fromIndex","toIndex","toggleColumn","column","Provider","value"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../../src/elements/TableColumns/index.tsx"],"sourcesContent":["'use client'\nimport type { CellComponentProps, SanitizedCollectionConfig } from 'payload/types'\n\nimport React, { createContext, useCallback, useContext, useState } from 'react'\n\nimport type { ColumnPreferences } from '../../providers/ListInfo/index.js'\nimport type { Column } from '../Table/index.js'\n\nimport { useComponentMap } from '../../providers/ComponentMap/index.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { usePreferences } from '../../providers/Preferences/index.js'\nimport { buildColumnState } from './buildColumnState.js'\nimport { filterFields } from './filterFields.js'\nimport { getInitialColumns } from './getInitialColumns.js'\n\nexport interface ITableColumns {\n columns: Column[]\n moveColumn: (args: { fromIndex: number; toIndex: number }) => void\n setActiveColumns: (columns: string[]) => void\n toggleColumn: (column: string) => void\n}\n\nexport const TableColumnContext = createContext<ITableColumns>({} as ITableColumns)\n\nexport const useTableColumns = (): ITableColumns => useContext(TableColumnContext)\n\nexport type ListPreferences = {\n columns: ColumnPreferences\n}\n\ntype Props = {\n cellProps?: Partial<CellComponentProps>[]\n children: React.ReactNode\n collectionSlug: string\n enableRowSelections?: boolean\n listPreferences?: ListPreferences\n preferenceKey: string\n}\n\nexport const TableColumnsProvider: React.FC<Props> = ({\n cellProps,\n children,\n collectionSlug,\n enableRowSelections = false,\n listPreferences,\n preferenceKey,\n}) => {\n const config = useConfig()\n\n const { componentMap } = useComponentMap()\n\n const { fieldMap } = componentMap.collections[collectionSlug]\n\n const collectionConfig = config.collections.find(\n (collectionConfig) => collectionConfig.slug === collectionSlug,\n )\n\n const {\n admin: { defaultColumns, useAsTitle },\n } = collectionConfig\n\n const prevCollection = React.useRef<SanitizedCollectionConfig['slug']>(collectionSlug)\n const { getPreference, setPreference } = usePreferences()\n\n const [initialColumns] = useState<ColumnPreferences>(() =>\n getInitialColumns(filterFields(fieldMap), useAsTitle, defaultColumns),\n )\n\n const [tableColumns, setTableColumns] = React.useState(() =>\n buildColumnState({\n cellProps,\n columnPreferences: listPreferences?.columns,\n columns: initialColumns,\n enableRowSelections,\n fieldMap,\n useAsTitle,\n }),\n )\n\n const updateColumnPreferences = React.useCallback(\n (newColumns: Column[]) => {\n const columns = newColumns.map((c) => ({\n accessor: c?.accessor,\n active: c?.active,\n }))\n\n void setPreference(preferenceKey, { columns }, true)\n },\n [preferenceKey, setPreference],\n )\n\n const reassignLinkColumn = (columns: Column[]): Column[] => {\n let foundFirstActive = false\n const newColumns = columns.map((col) => {\n const linkColumn = col.active && !foundFirstActive && col.accessor !== '_select'\n if (linkColumn) foundFirstActive = true\n\n return {\n ...col,\n cellProps: {\n ...col.cellProps,\n link: linkColumn,\n },\n }\n })\n\n return newColumns\n }\n\n const moveColumn = useCallback(\n (args: { fromIndex: number; toIndex: number }) => {\n const { fromIndex, toIndex } = args\n\n const withMovedColumn = [...tableColumns]\n const [columnToMove] = withMovedColumn.splice(fromIndex, 1)\n withMovedColumn.splice(toIndex, 0, columnToMove)\n\n const newColumns = reassignLinkColumn(withMovedColumn)\n setTableColumns(newColumns)\n updateColumnPreferences(newColumns)\n },\n [tableColumns, updateColumnPreferences],\n )\n\n const toggleColumn = useCallback(\n (column: string) => {\n const toggledColumns = tableColumns.map((col) => {\n return {\n ...col,\n active: col?.name === column ? !col.active : col.active,\n }\n })\n\n const newColumns = reassignLinkColumn(toggledColumns)\n setTableColumns(newColumns)\n updateColumnPreferences(newColumns)\n },\n [tableColumns, updateColumnPreferences],\n )\n\n const setActiveColumns = React.useCallback(\n (activeColumnAccessors) => {\n const activeColumns = tableColumns.map((col) => {\n return {\n ...col,\n active: activeColumnAccessors.includes(col.accessor),\n }\n })\n\n const newColumns = reassignLinkColumn(activeColumns)\n updateColumnPreferences(newColumns)\n },\n [tableColumns, updateColumnPreferences],\n )\n\n // //////////////////////////////////////////////\n // Get preferences on collection change (drawers)\n // //////////////////////////////////////////////\n\n React.useEffect(() => {\n const sync = async () => {\n const collectionHasChanged = prevCollection.current !== collectionSlug\n\n if (collectionHasChanged || !listPreferences) {\n const currentPreferences = await getPreference<{\n columns: ColumnPreferences\n }>(preferenceKey)\n prevCollection.current = collectionSlug\n\n if (currentPreferences?.columns) {\n setTableColumns(\n buildColumnState({\n cellProps,\n columnPreferences: currentPreferences?.columns,\n columns: initialColumns,\n enableRowSelections: true,\n fieldMap,\n useAsTitle,\n }),\n )\n }\n }\n }\n\n void sync()\n }, [\n preferenceKey,\n getPreference,\n collectionSlug,\n fieldMap,\n cellProps,\n defaultColumns,\n useAsTitle,\n listPreferences,\n initialColumns,\n ])\n\n return (\n <TableColumnContext.Provider\n value={{\n columns: tableColumns,\n moveColumn,\n setActiveColumns,\n toggleColumn,\n }}\n >\n {children}\n </TableColumnContext.Provider>\n )\n}\n"],"names":["React","createContext","useCallback","useContext","useState","useComponentMap","useConfig","usePreferences","buildColumnState","filterFields","getInitialColumns","TableColumnContext","useTableColumns","TableColumnsProvider","cellProps","children","collectionSlug","enableRowSelections","listPreferences","preferenceKey","config","componentMap","fieldMap","collections","collectionConfig","find","slug","admin","defaultColumns","useAsTitle","prevCollection","useRef","getPreference","setPreference","initialColumns","tableColumns","setTableColumns","columnPreferences","columns","updateColumnPreferences","newColumns","map","c","accessor","active","reassignLinkColumn","foundFirstActive","col","linkColumn","link","moveColumn","args","fromIndex","toIndex","withMovedColumn","columnToMove","splice","toggleColumn","column","toggledColumns","name","setActiveColumns","activeColumnAccessors","activeColumns","includes","useEffect","sync","collectionHasChanged","current","currentPreferences","Provider","value"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/Thumbnail/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,cAAc,CAAA;AAIrB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAA;AAK9D,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAA;IAC9C,YAAY,CAAC,EAAE,yBAAyB,CAAC,QAAQ,CAAC,CAAA;CACnD,CAAA;AASD,eAAO,MAAM,mBAAmB;;;;;CAA2C,CAAA;AAE3E,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CA6B9C,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/Thumbnail/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,cAAc,CAAA;AAIrB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAA;AAK9D,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAA;IAC9C,YAAY,CAAC,EAAE,yBAAyB,CAAC,QAAQ,CAAC,CAAA;CACnD,CAAA;AASD,eAAO,MAAM,mBAAmB;;;;;CAA2C,CAAA;AAE3E,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAkC9C,CAAA"}
@@ -12,7 +12,7 @@ const ThumbnailContext = /*#__PURE__*/ React.createContext({
12
12
  });
13
13
  export const useThumbnailContext = ()=>React.useContext(ThumbnailContext);
14
14
  export const Thumbnail = (props)=>{
15
- const { className = '', doc: { filename } = {}, fileSrc, size } = props;
15
+ const { className = '', doc: { filename } = {}, fileSrc, imageCacheTag, size } = props;
16
16
  const [fileExists, setFileExists] = React.useState(undefined);
17
17
  const classNames = [
18
18
  baseClass,
@@ -43,7 +43,7 @@ export const Thumbnail = (props)=>{
43
43
  }),
44
44
  fileExists && /*#__PURE__*/ _jsx("img", {
45
45
  alt: filename,
46
- src: fileSrc
46
+ src: `${fileSrc}${imageCacheTag ? `?${imageCacheTag}` : ''}`
47
47
  }),
48
48
  fileExists === false && /*#__PURE__*/ _jsx(File, {})
49
49
  ]
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/elements/Thumbnail/index.tsx"],"sourcesContent":["'use client'\nimport React from 'react'\n\nimport './index.scss'\n\nconst baseClass = 'thumbnail'\n\nimport type { SanitizedCollectionConfig } from 'payload/types'\n\nimport { File } from '../../graphics/File/index.js'\nimport { ShimmerEffect } from '../ShimmerEffect/index.js'\n\nexport type ThumbnailProps = {\n className?: string\n collectionSlug?: string\n doc?: Record<string, unknown>\n fileSrc?: string\n imageCacheTag?: string\n size?: 'expand' | 'large' | 'medium' | 'small'\n uploadConfig?: SanitizedCollectionConfig['upload']\n}\n\nconst ThumbnailContext = React.createContext({\n className: '',\n filename: '',\n size: 'medium',\n src: '',\n})\n\nexport const useThumbnailContext = () => React.useContext(ThumbnailContext)\n\nexport const Thumbnail: React.FC<ThumbnailProps> = (props) => {\n const { className = '', doc: { filename } = {}, fileSrc, size } = props\n const [fileExists, setFileExists] = React.useState(undefined)\n\n const classNames = [baseClass, `${baseClass}--size-${size || 'medium'}`, className].join(' ')\n\n React.useEffect(() => {\n if (!fileSrc) {\n setFileExists(false)\n return\n }\n\n const img = new Image()\n img.src = fileSrc\n img.onload = () => {\n setFileExists(true)\n }\n img.onerror = () => {\n setFileExists(false)\n }\n }, [fileSrc])\n\n return (\n <div className={classNames}>\n {fileExists === undefined && <ShimmerEffect height=\"100%\" />}\n {fileExists && <img alt={filename as string} src={fileSrc} />}\n {fileExists === false && <File />}\n </div>\n )\n}\n"],"names":["React","baseClass","File","ShimmerEffect","ThumbnailContext","createContext","className","filename","size","src","useThumbnailContext","useContext","Thumbnail","props","doc","fileSrc","fileExists","setFileExists","useState","undefined","classNames","join","useEffect","img","Image","onload","onerror","div","height","alt"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA;;AACA,OAAOA,WAAW,QAAO;AAIzB,MAAMC,YAAY;AAIlB,SAASC,IAAI,QAAQ,+BAA8B;AACnD,SAASC,aAAa,QAAQ,4BAA2B;AAYzD,MAAMC,iCAAmBJ,MAAMK,aAAa,CAAC;IAC3CC,WAAW;IACXC,UAAU;IACVC,MAAM;IACNC,KAAK;AACP;AAEA,OAAO,MAAMC,sBAAsB,IAAMV,MAAMW,UAAU,CAACP,kBAAiB;AAE3E,OAAO,MAAMQ,YAAsC,CAACC;IAClD,MAAM,EAAEP,YAAY,EAAE,EAAEQ,KAAK,EAAEP,QAAQ,EAAE,GAAG,CAAC,CAAC,EAAEQ,OAAO,EAAEP,IAAI,EAAE,GAAGK;IAClE,MAAM,CAACG,YAAYC,cAAc,GAAGjB,MAAMkB,QAAQ,CAACC;IAEnD,MAAMC,aAAa;QAACnB;QAAW,CAAC,EAAEA,UAAU,OAAO,EAAEO,QAAQ,SAAS,CAAC;QAAEF;KAAU,CAACe,IAAI,CAAC;IAEzFrB,MAAMsB,SAAS,CAAC;QACd,IAAI,CAACP,SAAS;YACZE,cAAc;YACd;QACF;QAEA,MAAMM,MAAM,IAAIC;QAChBD,IAAId,GAAG,GAAGM;QACVQ,IAAIE,MAAM,GAAG;YACXR,cAAc;QAChB;QACAM,IAAIG,OAAO,GAAG;YACZT,cAAc;QAChB;IACF,GAAG;QAACF;KAAQ;IAEZ,qBACE,MAACY;QAAIrB,WAAWc;;YACbJ,eAAeG,2BAAa,KAAChB;gBAAcyB,QAAO;;YAClDZ,4BAAc,KAACO;gBAAIM,KAAKtB;gBAAoBE,KAAKM;;YACjDC,eAAe,uBAAS,KAACd;;;AAGhC,EAAC"}
1
+ {"version":3,"sources":["../../../src/elements/Thumbnail/index.tsx"],"sourcesContent":["'use client'\nimport React from 'react'\n\nimport './index.scss'\n\nconst baseClass = 'thumbnail'\n\nimport type { SanitizedCollectionConfig } from 'payload/types'\n\nimport { File } from '../../graphics/File/index.js'\nimport { ShimmerEffect } from '../ShimmerEffect/index.js'\n\nexport type ThumbnailProps = {\n className?: string\n collectionSlug?: string\n doc?: Record<string, unknown>\n fileSrc?: string\n imageCacheTag?: string\n size?: 'expand' | 'large' | 'medium' | 'small'\n uploadConfig?: SanitizedCollectionConfig['upload']\n}\n\nconst ThumbnailContext = React.createContext({\n className: '',\n filename: '',\n size: 'medium',\n src: '',\n})\n\nexport const useThumbnailContext = () => React.useContext(ThumbnailContext)\n\nexport const Thumbnail: React.FC<ThumbnailProps> = (props) => {\n const { className = '', doc: { filename } = {}, fileSrc, imageCacheTag, size } = props\n const [fileExists, setFileExists] = React.useState(undefined)\n\n const classNames = [baseClass, `${baseClass}--size-${size || 'medium'}`, className].join(' ')\n\n React.useEffect(() => {\n if (!fileSrc) {\n setFileExists(false)\n return\n }\n\n const img = new Image()\n img.src = fileSrc\n img.onload = () => {\n setFileExists(true)\n }\n img.onerror = () => {\n setFileExists(false)\n }\n }, [fileSrc])\n\n return (\n <div className={classNames}>\n {fileExists === undefined && <ShimmerEffect height=\"100%\" />}\n {fileExists && (\n <img\n alt={filename as string}\n src={`${fileSrc}${imageCacheTag ? `?${imageCacheTag}` : ''}`}\n />\n )}\n {fileExists === false && <File />}\n </div>\n )\n}\n"],"names":["React","baseClass","File","ShimmerEffect","ThumbnailContext","createContext","className","filename","size","src","useThumbnailContext","useContext","Thumbnail","props","doc","fileSrc","imageCacheTag","fileExists","setFileExists","useState","undefined","classNames","join","useEffect","img","Image","onload","onerror","div","height","alt"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA;;AACA,OAAOA,WAAW,QAAO;AAIzB,MAAMC,YAAY;AAIlB,SAASC,IAAI,QAAQ,+BAA8B;AACnD,SAASC,aAAa,QAAQ,4BAA2B;AAYzD,MAAMC,iCAAmBJ,MAAMK,aAAa,CAAC;IAC3CC,WAAW;IACXC,UAAU;IACVC,MAAM;IACNC,KAAK;AACP;AAEA,OAAO,MAAMC,sBAAsB,IAAMV,MAAMW,UAAU,CAACP,kBAAiB;AAE3E,OAAO,MAAMQ,YAAsC,CAACC;IAClD,MAAM,EAAEP,YAAY,EAAE,EAAEQ,KAAK,EAAEP,QAAQ,EAAE,GAAG,CAAC,CAAC,EAAEQ,OAAO,EAAEC,aAAa,EAAER,IAAI,EAAE,GAAGK;IACjF,MAAM,CAACI,YAAYC,cAAc,GAAGlB,MAAMmB,QAAQ,CAACC;IAEnD,MAAMC,aAAa;QAACpB;QAAW,CAAC,EAAEA,UAAU,OAAO,EAAEO,QAAQ,SAAS,CAAC;QAAEF;KAAU,CAACgB,IAAI,CAAC;IAEzFtB,MAAMuB,SAAS,CAAC;QACd,IAAI,CAACR,SAAS;YACZG,cAAc;YACd;QACF;QAEA,MAAMM,MAAM,IAAIC;QAChBD,IAAIf,GAAG,GAAGM;QACVS,IAAIE,MAAM,GAAG;YACXR,cAAc;QAChB;QACAM,IAAIG,OAAO,GAAG;YACZT,cAAc;QAChB;IACF,GAAG;QAACH;KAAQ;IAEZ,qBACE,MAACa;QAAItB,WAAWe;;YACbJ,eAAeG,2BAAa,KAACjB;gBAAc0B,QAAO;;YAClDZ,4BACC,KAACO;gBACCM,KAAKvB;gBACLE,KAAK,CAAC,EAAEM,QAAQ,EAAEC,gBAAgB,CAAC,CAAC,EAAEA,cAAc,CAAC,GAAG,GAAG,CAAC;;YAG/DC,eAAe,uBAAS,KAACf;;;AAGhC,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/Upload/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAA;AAGzE,OAAO,KAA2C,MAAM,OAAO,CAAA;AAiB/D,OAAO,cAAc,CAAA;AAGrB,eAAO,MAAM,cAAc,gBAAgB,CAAA;AAC3C,eAAO,MAAM,eAAe,kBAAkB,CAAA;AAU9C,eAAO,MAAM,aAAa;;;uBAgBzB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,CAAC,EAAE,SAAS,CAAA;IACxB,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,KAAK,IAAI,CAAA;IAChC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,yBAAyB,CAAC,QAAQ,CAAC,CAAA;CAClD,CAAA;AAED,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CA2MxC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/Upload/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAA;AAGzE,OAAO,KAA2C,MAAM,OAAO,CAAA;AAiB/D,OAAO,cAAc,CAAA;AAGrB,eAAO,MAAM,cAAc,gBAAgB,CAAA;AAC3C,eAAO,MAAM,eAAe,kBAAkB,CAAA;AAU9C,eAAO,MAAM,aAAa;;;uBAgBzB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,CAAC,EAAE,SAAS,CAAA;IACxB,QAAQ,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,KAAK,IAAI,CAAA;IAChC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,yBAAyB,CAAC,QAAQ,CAAC,CAAA;CAClD,CAAA;AAED,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CA8LxC,CAAA"}
@@ -4,7 +4,7 @@ import { isImage } from 'payload/utilities';
4
4
  import React, { useCallback, useEffect, useState } from 'react';
5
5
  import { fieldBaseClass } from '../../fields/shared/index.js';
6
6
  import { FieldError } from '../../forms/FieldError/index.js';
7
- import { useForm, useFormSubmitted } from '../../forms/Form/context.js';
7
+ import { useForm } from '../../forms/Form/context.js';
8
8
  import { useField } from '../../forms/useField/index.js';
9
9
  import { useDocumentInfo } from '../../providers/DocumentInfo/index.js';
10
10
  import { useFormQueryParams } from '../../providers/FormQueryParams/index.js';
@@ -46,7 +46,6 @@ export const UploadActions = ({ canEdit, showSizePreviews })=>{
46
46
  };
47
47
  export const Upload = (props)=>{
48
48
  const { collectionSlug, initialState, onChange, updatedAt, uploadConfig } = props;
49
- const submitted = useFormSubmitted();
50
49
  const [replacingFile, setReplacingFile] = useState(false);
51
50
  const [fileSrc, setFileSrc] = useState(null);
52
51
  const { t } = useTranslation();
@@ -94,10 +93,6 @@ export const Upload = (props)=>{
94
93
  x: crop.x || 0,
95
94
  y: crop.y || 0
96
95
  });
97
- const zoomScale = 100 / Math.min(crop.width, crop.height);
98
- document.documentElement.style.setProperty('--file-details-thumbnail--zoom', `${zoomScale}`);
99
- document.documentElement.style.setProperty('--file-details-thumbnail--top-offset', `${zoomScale * (50 - crop.height / 2 - crop.y)}%`);
100
- document.documentElement.style.setProperty('--file-details-thumbnail--left-offset', `${zoomScale * (50 - crop.width / 2 - crop.x)}%`);
101
96
  setModified(true);
102
97
  dispatchFormQueryParams({
103
98
  type: 'SET',
@@ -144,7 +139,6 @@ export const Upload = (props)=>{
144
139
  const focalPointEnabled = uploadConfig?.focalPoint === true;
145
140
  const { crop: showCrop = true, focalPoint = true } = uploadConfig;
146
141
  const showFocalPoint = focalPoint && (hasImageSizes || hasResizeOptions || focalPointEnabled);
147
- const lastSubmittedTime = submitted ? new Date().toISOString() : null;
148
142
  return /*#__PURE__*/ _jsxs("div", {
149
143
  className: [
150
144
  fieldBaseClass,
@@ -161,7 +155,7 @@ export const Upload = (props)=>{
161
155
  doc: doc,
162
156
  handleRemove: canRemoveUpload ? handleFileRemoval : undefined,
163
157
  hasImageSizes: hasImageSizes,
164
- imageCacheTag: lastSubmittedTime,
158
+ imageCacheTag: doc.updatedAt,
165
159
  uploadConfig: uploadConfig
166
160
  }),
167
161
  (!doc.filename || replacingFile) && /*#__PURE__*/ _jsxs("div", {
@@ -215,7 +209,7 @@ export const Upload = (props)=>{
215
209
  children: /*#__PURE__*/ _jsx(EditUpload, {
216
210
  fileName: value?.name || doc?.filename,
217
211
  fileSrc: fileSrc || doc?.url,
218
- imageCacheTag: lastSubmittedTime,
212
+ imageCacheTag: doc.updatedAt,
219
213
  initialCrop: formQueryParams?.uploadEdits?.crop ?? {},
220
214
  initialFocalPoint: {
221
215
  x: formQueryParams?.uploadEdits?.focalPoint.x || doc.focalX || 50,
@@ -235,6 +229,7 @@ export const Upload = (props)=>{
235
229
  }),
236
230
  children: /*#__PURE__*/ _jsx(PreviewSizes, {
237
231
  doc: doc,
232
+ imageCacheTag: doc.updatedAt,
238
233
  uploadConfig: uploadConfig
239
234
  })
240
235
  })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/elements/Upload/index.tsx"],"sourcesContent":["'use client'\nimport type { FormState, SanitizedCollectionConfig } from 'payload/types'\n\nimport { isImage } from 'payload/utilities'\nimport React, { useCallback, useEffect, useState } from 'react'\n\nimport { fieldBaseClass } from '../../fields/shared/index.js'\nimport { FieldError } from '../../forms/FieldError/index.js'\nimport { useForm, useFormSubmitted } from '../../forms/Form/context.js'\nimport { useField } from '../../forms/useField/index.js'\nimport { useDocumentInfo } from '../../providers/DocumentInfo/index.js'\nimport { useFormQueryParams } from '../../providers/FormQueryParams/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { reduceFieldsToValues } from '../../utilities/reduceFieldsToValues.js'\nimport { Button } from '../Button/index.js'\nimport { Drawer, DrawerToggler } from '../Drawer/index.js'\nimport { Dropzone } from '../Dropzone/index.js'\nimport { EditUpload } from '../EditUpload/index.js'\nimport { FileDetails } from '../FileDetails/index.js'\nimport { PreviewSizes } from '../PreviewSizes/index.js'\nimport { Thumbnail } from '../Thumbnail/index.js'\nimport './index.scss'\n\nconst baseClass = 'file-field'\nexport const editDrawerSlug = 'edit-upload'\nexport const sizePreviewSlug = 'preview-sizes'\n\nconst validate = (value) => {\n if (!value && value !== undefined) {\n return 'A file is required.'\n }\n\n return true\n}\n\nexport const UploadActions = ({ canEdit, showSizePreviews }) => {\n const { t } = useTranslation()\n return (\n <div className={`${baseClass}__file-mutation`}>\n {showSizePreviews && (\n <DrawerToggler className={`${baseClass}__previewSizes`} slug={sizePreviewSlug}>\n {t('upload:previewSizes')}\n </DrawerToggler>\n )}\n {canEdit && (\n <DrawerToggler className={`${baseClass}__edit`} slug={editDrawerSlug}>\n {t('upload:editImage')}\n </DrawerToggler>\n )}\n </div>\n )\n}\n\nexport type UploadProps = {\n collectionSlug: string\n initialState?: FormState\n onChange?: (file?: File) => void\n updatedAt?: string\n uploadConfig: SanitizedCollectionConfig['upload']\n}\n\nexport const Upload: React.FC<UploadProps> = (props) => {\n const { collectionSlug, initialState, onChange, updatedAt, uploadConfig } = props\n\n const submitted = useFormSubmitted()\n const [replacingFile, setReplacingFile] = useState(false)\n const [fileSrc, setFileSrc] = useState<null | string>(null)\n const { t } = useTranslation()\n const { setModified } = useForm()\n const { dispatchFormQueryParams, formQueryParams } = useFormQueryParams()\n const [doc, setDoc] = useState(reduceFieldsToValues(initialState || {}, true))\n const { docPermissions } = useDocumentInfo()\n const { errorMessage, setValue, showError, value } = useField<File>({\n path: 'file',\n validate,\n })\n const [crop, setCrop] = useState({ x: 0, y: 0 })\n\n const handleFileNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const updatedFileName = e.target.value\n if (value) {\n const fileValue = value\n // Creating a new File object with updated properties\n const newFile = new File([fileValue], updatedFileName, { type: fileValue.type })\n setValue(newFile) // Updating the state with the new File object\n }\n }\n\n const handleFileSelection = React.useCallback(\n (files: FileList) => {\n const fileToUpload = files?.[0]\n setValue(fileToUpload)\n },\n [setValue],\n )\n\n const handleFileRemoval = useCallback(() => {\n setReplacingFile(true)\n setValue(null)\n setFileSrc('')\n }, [setValue])\n\n const onEditsSave = React.useCallback(\n ({ crop, focalPosition }) => {\n setCrop({\n x: crop.x || 0,\n y: crop.y || 0,\n })\n const zoomScale = 100 / Math.min(crop.width, crop.height)\n\n document.documentElement.style.setProperty('--file-details-thumbnail--zoom', `${zoomScale}`)\n document.documentElement.style.setProperty(\n '--file-details-thumbnail--top-offset',\n `${zoomScale * (50 - crop.height / 2 - crop.y)}%`,\n )\n document.documentElement.style.setProperty(\n '--file-details-thumbnail--left-offset',\n `${zoomScale * (50 - crop.width / 2 - crop.x)}%`,\n )\n setModified(true)\n dispatchFormQueryParams({\n type: 'SET',\n params: {\n uploadEdits:\n crop || focalPosition\n ? {\n crop: crop || null,\n focalPoint: focalPosition ? focalPosition : null,\n }\n : null,\n },\n })\n },\n [dispatchFormQueryParams, setModified],\n )\n\n useEffect(() => {\n setDoc(reduceFieldsToValues(initialState || {}, true))\n setReplacingFile(false)\n }, [initialState])\n\n useEffect(() => {\n if (value instanceof File) {\n const fileReader = new FileReader()\n fileReader.onload = (e) => {\n const imgSrc = e.target?.result\n\n if (typeof imgSrc === 'string') {\n setFileSrc(imgSrc)\n }\n }\n fileReader.readAsDataURL(value)\n }\n\n if (typeof onChange === 'function') {\n onChange(value)\n }\n }, [value, onChange, updatedAt])\n\n const canRemoveUpload =\n docPermissions?.update?.permission &&\n 'delete' in docPermissions &&\n docPermissions?.delete?.permission\n\n const hasImageSizes = uploadConfig?.imageSizes?.length > 0\n const hasResizeOptions = Boolean(uploadConfig?.resizeOptions)\n // Explicity check if set to true, default is undefined\n const focalPointEnabled = uploadConfig?.focalPoint === true\n\n const { crop: showCrop = true, focalPoint = true } = uploadConfig\n\n const showFocalPoint = focalPoint && (hasImageSizes || hasResizeOptions || focalPointEnabled)\n\n const lastSubmittedTime = submitted ? new Date().toISOString() : null\n\n return (\n <div className={[fieldBaseClass, baseClass].filter(Boolean).join(' ')}>\n <FieldError message={errorMessage} showError={showError} />\n {doc.filename && !replacingFile && (\n <FileDetails\n canEdit={showCrop || showFocalPoint}\n collectionSlug={collectionSlug}\n doc={doc}\n handleRemove={canRemoveUpload ? handleFileRemoval : undefined}\n hasImageSizes={hasImageSizes}\n imageCacheTag={lastSubmittedTime}\n uploadConfig={uploadConfig}\n />\n )}\n {(!doc.filename || replacingFile) && (\n <div className={`${baseClass}__upload`}>\n {!value && (\n <Dropzone\n className={`${baseClass}__dropzone`}\n mimeTypes={uploadConfig?.mimeTypes}\n onChange={handleFileSelection}\n />\n )}\n\n {value && (\n <React.Fragment>\n <div className={`${baseClass}__thumbnail-wrap`}>\n <Thumbnail\n collectionSlug={collectionSlug}\n fileSrc={isImage(value.type) ? fileSrc : null}\n />\n </div>\n <div className={`${baseClass}__file-adjustments`}>\n <input\n className={`${baseClass}__filename`}\n onChange={handleFileNameChange}\n type=\"text\"\n value={value.name}\n />\n\n {isImage(value.type) && value.type !== 'image/svg+xml' && (\n <UploadActions\n canEdit={showCrop || showFocalPoint}\n showSizePreviews={hasImageSizes && doc.filename && !replacingFile}\n />\n )}\n </div>\n <Button\n buttonStyle=\"icon-label\"\n className={`${baseClass}__remove`}\n icon=\"x\"\n iconStyle=\"with-border\"\n onClick={handleFileRemoval}\n round\n tooltip={t('general:cancel')}\n />\n </React.Fragment>\n )}\n </div>\n )}\n {(value || doc.filename) && (\n <Drawer Header={null} slug={editDrawerSlug}>\n <EditUpload\n fileName={value?.name || doc?.filename}\n fileSrc={fileSrc || doc?.url}\n imageCacheTag={lastSubmittedTime}\n initialCrop={formQueryParams?.uploadEdits?.crop ?? {}}\n initialFocalPoint={{\n x: formQueryParams?.uploadEdits?.focalPoint.x || doc.focalX || 50,\n y: formQueryParams?.uploadEdits?.focalPoint.y || doc.focalY || 50,\n }}\n onSave={onEditsSave}\n showCrop={showCrop}\n showFocalPoint={showFocalPoint}\n />\n </Drawer>\n )}\n {doc && hasImageSizes && (\n <Drawer\n className={`${baseClass}__previewDrawer`}\n hoverTitle\n slug={sizePreviewSlug}\n title={t('upload:sizesFor', { label: doc?.filename })}\n >\n <PreviewSizes doc={doc} uploadConfig={uploadConfig} />\n </Drawer>\n )}\n </div>\n )\n}\n"],"names":["isImage","React","useCallback","useEffect","useState","fieldBaseClass","FieldError","useForm","useFormSubmitted","useField","useDocumentInfo","useFormQueryParams","useTranslation","reduceFieldsToValues","Button","Drawer","DrawerToggler","Dropzone","EditUpload","FileDetails","PreviewSizes","Thumbnail","baseClass","editDrawerSlug","sizePreviewSlug","validate","value","undefined","UploadActions","canEdit","showSizePreviews","t","div","className","slug","Upload","props","collectionSlug","initialState","onChange","updatedAt","uploadConfig","submitted","replacingFile","setReplacingFile","fileSrc","setFileSrc","setModified","dispatchFormQueryParams","formQueryParams","doc","setDoc","docPermissions","errorMessage","setValue","showError","path","crop","setCrop","x","y","handleFileNameChange","e","updatedFileName","target","fileValue","newFile","File","type","handleFileSelection","files","fileToUpload","handleFileRemoval","onEditsSave","focalPosition","zoomScale","Math","min","width","height","document","documentElement","style","setProperty","params","uploadEdits","focalPoint","fileReader","FileReader","onload","imgSrc","result","readAsDataURL","canRemoveUpload","update","permission","delete","hasImageSizes","imageSizes","length","hasResizeOptions","Boolean","resizeOptions","focalPointEnabled","showCrop","showFocalPoint","lastSubmittedTime","Date","toISOString","filter","join","message","filename","handleRemove","imageCacheTag","mimeTypes","Fragment","input","name","buttonStyle","icon","iconStyle","onClick","round","tooltip","Header","fileName","url","initialCrop","initialFocalPoint","focalX","focalY","onSave","hoverTitle","title","label"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
1
+ {"version":3,"sources":["../../../src/elements/Upload/index.tsx"],"sourcesContent":["'use client'\nimport type { FormState, SanitizedCollectionConfig } from 'payload/types'\n\nimport { isImage } from 'payload/utilities'\nimport React, { useCallback, useEffect, useState } from 'react'\n\nimport { fieldBaseClass } from '../../fields/shared/index.js'\nimport { FieldError } from '../../forms/FieldError/index.js'\nimport { useForm } from '../../forms/Form/context.js'\nimport { useField } from '../../forms/useField/index.js'\nimport { useDocumentInfo } from '../../providers/DocumentInfo/index.js'\nimport { useFormQueryParams } from '../../providers/FormQueryParams/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { reduceFieldsToValues } from '../../utilities/reduceFieldsToValues.js'\nimport { Button } from '../Button/index.js'\nimport { Drawer, DrawerToggler } from '../Drawer/index.js'\nimport { Dropzone } from '../Dropzone/index.js'\nimport { EditUpload } from '../EditUpload/index.js'\nimport { FileDetails } from '../FileDetails/index.js'\nimport { PreviewSizes } from '../PreviewSizes/index.js'\nimport { Thumbnail } from '../Thumbnail/index.js'\nimport './index.scss'\n\nconst baseClass = 'file-field'\nexport const editDrawerSlug = 'edit-upload'\nexport const sizePreviewSlug = 'preview-sizes'\n\nconst validate = (value) => {\n if (!value && value !== undefined) {\n return 'A file is required.'\n }\n\n return true\n}\n\nexport const UploadActions = ({ canEdit, showSizePreviews }) => {\n const { t } = useTranslation()\n return (\n <div className={`${baseClass}__file-mutation`}>\n {showSizePreviews && (\n <DrawerToggler className={`${baseClass}__previewSizes`} slug={sizePreviewSlug}>\n {t('upload:previewSizes')}\n </DrawerToggler>\n )}\n {canEdit && (\n <DrawerToggler className={`${baseClass}__edit`} slug={editDrawerSlug}>\n {t('upload:editImage')}\n </DrawerToggler>\n )}\n </div>\n )\n}\n\nexport type UploadProps = {\n collectionSlug: string\n initialState?: FormState\n onChange?: (file?: File) => void\n updatedAt?: string\n uploadConfig: SanitizedCollectionConfig['upload']\n}\n\nexport const Upload: React.FC<UploadProps> = (props) => {\n const { collectionSlug, initialState, onChange, updatedAt, uploadConfig } = props\n\n const [replacingFile, setReplacingFile] = useState(false)\n const [fileSrc, setFileSrc] = useState<null | string>(null)\n const { t } = useTranslation()\n const { setModified } = useForm()\n const { dispatchFormQueryParams, formQueryParams } = useFormQueryParams()\n const [doc, setDoc] = useState(reduceFieldsToValues(initialState || {}, true))\n const { docPermissions } = useDocumentInfo()\n const { errorMessage, setValue, showError, value } = useField<File>({\n path: 'file',\n validate,\n })\n const [crop, setCrop] = useState({ x: 0, y: 0 })\n\n const handleFileNameChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const updatedFileName = e.target.value\n if (value) {\n const fileValue = value\n // Creating a new File object with updated properties\n const newFile = new File([fileValue], updatedFileName, { type: fileValue.type })\n setValue(newFile) // Updating the state with the new File object\n }\n }\n\n const handleFileSelection = React.useCallback(\n (files: FileList) => {\n const fileToUpload = files?.[0]\n setValue(fileToUpload)\n },\n [setValue],\n )\n\n const handleFileRemoval = useCallback(() => {\n setReplacingFile(true)\n setValue(null)\n setFileSrc('')\n }, [setValue])\n\n const onEditsSave = React.useCallback(\n ({ crop, focalPosition }) => {\n setCrop({\n x: crop.x || 0,\n y: crop.y || 0,\n })\n\n setModified(true)\n dispatchFormQueryParams({\n type: 'SET',\n params: {\n uploadEdits:\n crop || focalPosition\n ? {\n crop: crop || null,\n focalPoint: focalPosition ? focalPosition : null,\n }\n : null,\n },\n })\n },\n [dispatchFormQueryParams, setModified],\n )\n\n useEffect(() => {\n setDoc(reduceFieldsToValues(initialState || {}, true))\n setReplacingFile(false)\n }, [initialState])\n\n useEffect(() => {\n if (value instanceof File) {\n const fileReader = new FileReader()\n fileReader.onload = (e) => {\n const imgSrc = e.target?.result\n\n if (typeof imgSrc === 'string') {\n setFileSrc(imgSrc)\n }\n }\n fileReader.readAsDataURL(value)\n }\n\n if (typeof onChange === 'function') {\n onChange(value)\n }\n }, [value, onChange, updatedAt])\n\n const canRemoveUpload =\n docPermissions?.update?.permission &&\n 'delete' in docPermissions &&\n docPermissions?.delete?.permission\n\n const hasImageSizes = uploadConfig?.imageSizes?.length > 0\n const hasResizeOptions = Boolean(uploadConfig?.resizeOptions)\n // Explicity check if set to true, default is undefined\n const focalPointEnabled = uploadConfig?.focalPoint === true\n\n const { crop: showCrop = true, focalPoint = true } = uploadConfig\n\n const showFocalPoint = focalPoint && (hasImageSizes || hasResizeOptions || focalPointEnabled)\n\n return (\n <div className={[fieldBaseClass, baseClass].filter(Boolean).join(' ')}>\n <FieldError message={errorMessage} showError={showError} />\n {doc.filename && !replacingFile && (\n <FileDetails\n canEdit={showCrop || showFocalPoint}\n collectionSlug={collectionSlug}\n doc={doc}\n handleRemove={canRemoveUpload ? handleFileRemoval : undefined}\n hasImageSizes={hasImageSizes}\n imageCacheTag={doc.updatedAt}\n uploadConfig={uploadConfig}\n />\n )}\n {(!doc.filename || replacingFile) && (\n <div className={`${baseClass}__upload`}>\n {!value && (\n <Dropzone\n className={`${baseClass}__dropzone`}\n mimeTypes={uploadConfig?.mimeTypes}\n onChange={handleFileSelection}\n />\n )}\n\n {value && (\n <React.Fragment>\n <div className={`${baseClass}__thumbnail-wrap`}>\n <Thumbnail\n collectionSlug={collectionSlug}\n fileSrc={isImage(value.type) ? fileSrc : null}\n />\n </div>\n <div className={`${baseClass}__file-adjustments`}>\n <input\n className={`${baseClass}__filename`}\n onChange={handleFileNameChange}\n type=\"text\"\n value={value.name}\n />\n\n {isImage(value.type) && value.type !== 'image/svg+xml' && (\n <UploadActions\n canEdit={showCrop || showFocalPoint}\n showSizePreviews={hasImageSizes && doc.filename && !replacingFile}\n />\n )}\n </div>\n <Button\n buttonStyle=\"icon-label\"\n className={`${baseClass}__remove`}\n icon=\"x\"\n iconStyle=\"with-border\"\n onClick={handleFileRemoval}\n round\n tooltip={t('general:cancel')}\n />\n </React.Fragment>\n )}\n </div>\n )}\n {(value || doc.filename) && (\n <Drawer Header={null} slug={editDrawerSlug}>\n <EditUpload\n fileName={value?.name || doc?.filename}\n fileSrc={fileSrc || doc?.url}\n imageCacheTag={doc.updatedAt}\n initialCrop={formQueryParams?.uploadEdits?.crop ?? {}}\n initialFocalPoint={{\n x: formQueryParams?.uploadEdits?.focalPoint.x || doc.focalX || 50,\n y: formQueryParams?.uploadEdits?.focalPoint.y || doc.focalY || 50,\n }}\n onSave={onEditsSave}\n showCrop={showCrop}\n showFocalPoint={showFocalPoint}\n />\n </Drawer>\n )}\n {doc && hasImageSizes && (\n <Drawer\n className={`${baseClass}__previewDrawer`}\n hoverTitle\n slug={sizePreviewSlug}\n title={t('upload:sizesFor', { label: doc?.filename })}\n >\n <PreviewSizes doc={doc} imageCacheTag={doc.updatedAt} uploadConfig={uploadConfig} />\n </Drawer>\n )}\n </div>\n )\n}\n"],"names":["isImage","React","useCallback","useEffect","useState","fieldBaseClass","FieldError","useForm","useField","useDocumentInfo","useFormQueryParams","useTranslation","reduceFieldsToValues","Button","Drawer","DrawerToggler","Dropzone","EditUpload","FileDetails","PreviewSizes","Thumbnail","baseClass","editDrawerSlug","sizePreviewSlug","validate","value","undefined","UploadActions","canEdit","showSizePreviews","t","div","className","slug","Upload","props","collectionSlug","initialState","onChange","updatedAt","uploadConfig","replacingFile","setReplacingFile","fileSrc","setFileSrc","setModified","dispatchFormQueryParams","formQueryParams","doc","setDoc","docPermissions","errorMessage","setValue","showError","path","crop","setCrop","x","y","handleFileNameChange","e","updatedFileName","target","fileValue","newFile","File","type","handleFileSelection","files","fileToUpload","handleFileRemoval","onEditsSave","focalPosition","params","uploadEdits","focalPoint","fileReader","FileReader","onload","imgSrc","result","readAsDataURL","canRemoveUpload","update","permission","delete","hasImageSizes","imageSizes","length","hasResizeOptions","Boolean","resizeOptions","focalPointEnabled","showCrop","showFocalPoint","filter","join","message","filename","handleRemove","imageCacheTag","mimeTypes","Fragment","input","name","buttonStyle","icon","iconStyle","onClick","round","tooltip","Header","fileName","url","initialCrop","initialFocalPoint","focalX","focalY","onSave","hoverTitle","title","label"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -30,17 +30,6 @@
30
30
  }
31
31
  }
32
32
 
33
- .file-details {
34
- img {
35
- position: relative;
36
- min-width: 100%;
37
- height: 100%;
38
- transform: scale(var(--file-details-thumbnail--zoom));
39
- top: var(--file-details-thumbnail--top-offset);
40
- left: var(--file-details-thumbnail--left-offset);
41
- }
42
- }
43
-
44
33
  &__remove {
45
34
  margin: calc($baseline * 1.5) $baseline $baseline 0;
46
35
  place-self: flex-start;
@@ -287,7 +287,7 @@ export const RelationshipField = (props)=>{
287
287
  onChange(null);
288
288
  return;
289
289
  }
290
- if (hasMany) {
290
+ if (hasMany && Array.isArray(selected)) {
291
291
  onChange(selected ? selected.map((option)=>{
292
292
  if (hasMultipleRelations) {
293
293
  return {
@@ -297,12 +297,12 @@ export const RelationshipField = (props)=>{
297
297
  }
298
298
  return option?.value;
299
299
  }) : null);
300
- } else if (hasMultipleRelations) {
300
+ } else if (hasMultipleRelations && !Array.isArray(selected)) {
301
301
  onChange({
302
302
  relationTo: selected?.relationTo,
303
303
  value: selected?.value
304
304
  });
305
- } else {
305
+ } else if (!Array.isArray(selected)) {
306
306
  onChange(selected?.value);
307
307
  }
308
308
  },