@payloadcms/ui 3.0.0-beta.34 → 3.0.0-beta.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/elements/EditUpload/index.d.ts +2 -4
- package/dist/elements/EditUpload/index.d.ts.map +1 -1
- package/dist/elements/EditUpload/index.js +19 -16
- package/dist/elements/EditUpload/index.js.map +1 -1
- package/dist/elements/Save/index.d.ts.map +1 -1
- package/dist/elements/Save/index.js +3 -1
- package/dist/elements/Save/index.js.map +1 -1
- package/dist/elements/SaveDraft/index.d.ts.map +1 -1
- package/dist/elements/SaveDraft/index.js +3 -1
- package/dist/elements/SaveDraft/index.js.map +1 -1
- package/dist/elements/Table/DefaultCell/fields/Relationship/index.d.ts.map +1 -1
- package/dist/elements/Table/DefaultCell/fields/Relationship/index.js +8 -0
- package/dist/elements/Table/DefaultCell/fields/Relationship/index.js.map +1 -1
- package/dist/elements/Tooltip/index.d.ts +4 -0
- package/dist/elements/Tooltip/index.d.ts.map +1 -1
- package/dist/elements/Tooltip/index.js +10 -5
- package/dist/elements/Tooltip/index.js.map +1 -1
- package/dist/elements/Tooltip/index.scss +5 -3
- package/dist/elements/Upload/index.d.ts.map +1 -1
- package/dist/elements/Upload/index.js +8 -7
- package/dist/elements/Upload/index.js.map +1 -1
- package/dist/fields/Array/index.d.ts.map +1 -1
- package/dist/fields/Array/index.js +2 -4
- package/dist/fields/Array/index.js.map +1 -1
- package/dist/fields/Array/index.scss +0 -4
- package/dist/fields/Blocks/index.d.ts.map +1 -1
- package/dist/fields/Blocks/index.js +2 -4
- package/dist/fields/Blocks/index.js.map +1 -1
- package/dist/fields/Blocks/index.scss +0 -4
- package/dist/fields/Checkbox/index.d.ts.map +1 -1
- package/dist/fields/Checkbox/index.js +1 -3
- package/dist/fields/Checkbox/index.js.map +1 -1
- package/dist/fields/Checkbox/index.scss +0 -4
- package/dist/fields/Code/index.js +8 -6
- package/dist/fields/Code/index.js.map +1 -1
- package/dist/fields/ConfirmPassword/index.d.ts.map +1 -1
- package/dist/fields/ConfirmPassword/index.js +6 -4
- package/dist/fields/ConfirmPassword/index.js.map +1 -1
- package/dist/fields/DateTime/index.d.ts.map +1 -1
- package/dist/fields/DateTime/index.js +7 -9
- package/dist/fields/DateTime/index.js.map +1 -1
- package/dist/fields/DateTime/index.scss +0 -6
- package/dist/fields/Email/index.js +8 -6
- package/dist/fields/Email/index.js.map +1 -1
- package/dist/fields/JSON/index.d.ts.map +1 -1
- package/dist/fields/JSON/index.js +12 -6
- package/dist/fields/JSON/index.js.map +1 -1
- package/dist/fields/Number/index.d.ts.map +1 -1
- package/dist/fields/Number/index.js +4 -2
- package/dist/fields/Number/index.js.map +1 -1
- package/dist/fields/Password/index.d.ts.map +1 -1
- package/dist/fields/Password/index.js +8 -6
- package/dist/fields/Password/index.js.map +1 -1
- package/dist/fields/RadioGroup/index.d.ts.map +1 -1
- package/dist/fields/RadioGroup/index.js +8 -8
- package/dist/fields/RadioGroup/index.js.map +1 -1
- package/dist/fields/RadioGroup/index.scss +0 -4
- package/dist/fields/Relationship/index.d.ts.map +1 -1
- package/dist/fields/Relationship/index.js +15 -14
- package/dist/fields/Relationship/index.js.map +1 -1
- package/dist/fields/Select/index.d.ts.map +1 -1
- package/dist/fields/Select/index.js +12 -6
- package/dist/fields/Select/index.js.map +1 -1
- package/dist/fields/Text/Input.d.ts.map +1 -1
- package/dist/fields/Text/Input.js +8 -6
- package/dist/fields/Text/Input.js.map +1 -1
- package/dist/fields/Textarea/Input.d.ts.map +1 -1
- package/dist/fields/Textarea/Input.js +8 -6
- package/dist/fields/Textarea/Input.js.map +1 -1
- package/dist/fields/Upload/Input.d.ts.map +1 -1
- package/dist/fields/Upload/Input.js +7 -5
- package/dist/fields/Upload/Input.js.map +1 -1
- package/dist/forms/FieldError/index.js +3 -2
- package/dist/forms/FieldError/index.js.map +1 -1
- package/dist/forms/FieldError/index.scss +1 -2
- package/dist/forms/RenderFields/index.scss +5 -0
- package/dist/hooks/useIntersect.js +1 -1
- package/dist/hooks/useIntersect.js.map +1 -1
- package/package.json +5 -5
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { Data } from 'payload/types';
|
|
2
1
|
import type CropType from 'react-image-crop';
|
|
3
2
|
import React from 'react';
|
|
4
3
|
import 'react-image-crop/dist/ReactCrop.css';
|
|
@@ -8,15 +7,14 @@ type FocalPosition = {
|
|
|
8
7
|
y: number;
|
|
9
8
|
};
|
|
10
9
|
export type EditUploadProps = {
|
|
11
|
-
doc?: Data;
|
|
12
10
|
fileName: string;
|
|
13
11
|
fileSrc: string;
|
|
14
12
|
imageCacheTag?: string;
|
|
15
13
|
initialCrop?: CropType;
|
|
16
14
|
initialFocalPoint?: FocalPosition;
|
|
17
|
-
onSave?: ({ crop,
|
|
15
|
+
onSave?: ({ crop, focalPosition }: {
|
|
18
16
|
crop: CropType;
|
|
19
|
-
|
|
17
|
+
focalPosition: FocalPosition;
|
|
20
18
|
}) => void;
|
|
21
19
|
showCrop?: boolean;
|
|
22
20
|
showFocalPoint?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/EditUpload/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/EditUpload/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,QAAQ,MAAM,kBAAkB,CAAA;AAG5C,OAAO,KAA2B,MAAM,OAAO,CAAA;AAE/C,OAAO,qCAAqC,CAAA;AAM5C,OAAO,cAAc,CAAA;AAerB,KAAK,aAAa,GAAG;IACnB,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACV,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,WAAW,CAAC,EAAE,QAAQ,CAAA;IACtB,iBAAiB,CAAC,EAAE,aAAa,CAAA;IACjC,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE;QAAE,IAAI,EAAE,QAAQ,CAAC;QAAC,aAAa,EAAE,aAAa,CAAA;KAAE,KAAK,IAAI,CAAA;IAC5F,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB,CAAA;AAUD,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CA6PhD,CAAA"}
|
|
@@ -22,10 +22,6 @@ const defaultCrop = {
|
|
|
22
22
|
x: 0,
|
|
23
23
|
y: 0
|
|
24
24
|
};
|
|
25
|
-
const defaultPointPosition = {
|
|
26
|
-
x: 50,
|
|
27
|
-
y: 50
|
|
28
|
-
};
|
|
29
25
|
export const EditUpload = ({ fileName, fileSrc, imageCacheTag, initialCrop, initialFocalPoint, onSave, showCrop, showFocalPoint })=>{
|
|
30
26
|
const { useModal } = facelessUIImport;
|
|
31
27
|
const { closeModal } = useModal();
|
|
@@ -34,8 +30,15 @@ export const EditUpload = ({ fileName, fileSrc, imageCacheTag, initialCrop, init
|
|
|
34
30
|
...defaultCrop,
|
|
35
31
|
...initialCrop
|
|
36
32
|
}));
|
|
37
|
-
const
|
|
38
|
-
|
|
33
|
+
const defaultFocalPosition = {
|
|
34
|
+
x: 50,
|
|
35
|
+
y: 50
|
|
36
|
+
};
|
|
37
|
+
console.log({
|
|
38
|
+
initialFocalPoint
|
|
39
|
+
});
|
|
40
|
+
const [focalPosition, setFocalPosition] = useState(()=>({
|
|
41
|
+
...defaultFocalPosition,
|
|
39
42
|
...initialFocalPoint
|
|
40
43
|
}));
|
|
41
44
|
const [checkBounds, setCheckBounds] = useState(false);
|
|
@@ -55,10 +58,10 @@ export const EditUpload = ({ fileName, fileSrc, imageCacheTag, initialCrop, init
|
|
|
55
58
|
[dimension]: percentage
|
|
56
59
|
});
|
|
57
60
|
};
|
|
58
|
-
const
|
|
61
|
+
const fineTuneFocalPosition = ({ coordinate, value })=>{
|
|
59
62
|
const intValue = parseInt(value);
|
|
60
63
|
if (intValue >= 0 && intValue <= 100) {
|
|
61
|
-
|
|
64
|
+
setFocalPosition((prevPosition)=>({
|
|
62
65
|
...prevPosition,
|
|
63
66
|
[coordinate]: intValue
|
|
64
67
|
}));
|
|
@@ -67,12 +70,12 @@ export const EditUpload = ({ fileName, fileSrc, imageCacheTag, initialCrop, init
|
|
|
67
70
|
const saveEdits = ()=>{
|
|
68
71
|
if (typeof onSave === 'function') onSave({
|
|
69
72
|
crop,
|
|
70
|
-
|
|
73
|
+
focalPosition
|
|
71
74
|
});
|
|
72
75
|
closeModal(editDrawerSlug);
|
|
73
76
|
};
|
|
74
77
|
const onDragEnd = React.useCallback(({ x, y })=>{
|
|
75
|
-
|
|
78
|
+
setFocalPosition({
|
|
76
79
|
x,
|
|
77
80
|
y
|
|
78
81
|
});
|
|
@@ -83,7 +86,7 @@ export const EditUpload = ({ fileName, fileSrc, imageCacheTag, initialCrop, init
|
|
|
83
86
|
const boundsRect = showCrop ? cropRef.current.getBoundingClientRect() : imageRef.current.getBoundingClientRect();
|
|
84
87
|
const xCenter = (boundsRect.left - containerRect.left + boundsRect.width / 2) / containerRect.width * 100;
|
|
85
88
|
const yCenter = (boundsRect.top - containerRect.top + boundsRect.height / 2) / containerRect.height * 100;
|
|
86
|
-
|
|
89
|
+
setFocalPosition({
|
|
87
90
|
x: xCenter,
|
|
88
91
|
y: yCenter
|
|
89
92
|
});
|
|
@@ -149,7 +152,7 @@ export const EditUpload = ({ fileName, fileSrc, imageCacheTag, initialCrop, init
|
|
|
149
152
|
checkBounds: showCrop ? checkBounds : false,
|
|
150
153
|
className: `${baseClass}__focalPoint`,
|
|
151
154
|
containerRef: focalWrapRef,
|
|
152
|
-
initialPosition:
|
|
155
|
+
initialPosition: focalPosition,
|
|
153
156
|
onDragEnd: onDragEnd,
|
|
154
157
|
setCheckBounds: showCrop ? setCheckBounds : false
|
|
155
158
|
}, /*#__PURE__*/ React.createElement(Plus, null)))), (showCrop || showFocalPoint) && /*#__PURE__*/ React.createElement("div", {
|
|
@@ -200,18 +203,18 @@ export const EditUpload = ({ fileName, fileSrc, imageCacheTag, initialCrop, init
|
|
|
200
203
|
className: `${baseClass}__inputsWrap`
|
|
201
204
|
}, /*#__PURE__*/ React.createElement(Input, {
|
|
202
205
|
name: "X %",
|
|
203
|
-
onChange: (value)=>
|
|
206
|
+
onChange: (value)=>fineTuneFocalPosition({
|
|
204
207
|
coordinate: 'x',
|
|
205
208
|
value
|
|
206
209
|
}),
|
|
207
|
-
value:
|
|
210
|
+
value: focalPosition.x.toFixed(0)
|
|
208
211
|
}), /*#__PURE__*/ React.createElement(Input, {
|
|
209
212
|
name: "Y %",
|
|
210
|
-
onChange: (value)=>
|
|
213
|
+
onChange: (value)=>fineTuneFocalPosition({
|
|
211
214
|
coordinate: 'y',
|
|
212
215
|
value
|
|
213
216
|
}),
|
|
214
|
-
value:
|
|
217
|
+
value: focalPosition.y.toFixed(0)
|
|
215
218
|
}))))));
|
|
216
219
|
};
|
|
217
220
|
const DraggableElement = ({ boundsRef, checkBounds, children, className, containerRef, initialPosition = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/elements/EditUpload/index.tsx"],"sourcesContent":["'use client'\nimport type { Data } from 'payload/types'\nimport type CropType from 'react-image-crop'\n\nimport * as facelessUIImport from '@faceless-ui/modal'\nimport React, { useRef, useState } from 'react'\nimport ReactCrop from 'react-image-crop'\nimport 'react-image-crop/dist/ReactCrop.css'\n\nimport { editDrawerSlug } from '../../elements/Upload/index.js'\nimport { Plus } from '../../icons/Plus/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { Button } from '../Button/index.js'\nimport './index.scss'\n\nconst baseClass = 'edit-upload'\n\nconst Input: React.FC<{ name: string; onChange: (value: string) => void; value: string }> = ({\n name,\n onChange,\n value,\n}) => (\n <div className={`${baseClass}__input`}>\n {name}\n <input name={name} onChange={(e) => onChange(e.target.value)} type=\"number\" value={value} />\n </div>\n)\n\ntype FocalPosition = {\n x: number\n y: number\n}\n\nexport type EditUploadProps = {\n doc?: Data\n fileName: string\n fileSrc: string\n imageCacheTag?: string\n initialCrop?: CropType\n initialFocalPoint?: FocalPosition\n onSave?: ({ crop, pointPosition }: { crop: CropType; pointPosition: FocalPosition }) => void\n showCrop?: boolean\n showFocalPoint?: boolean\n}\n\nconst defaultCrop: CropType = {\n height: 100,\n unit: '%',\n width: 100,\n x: 0,\n y: 0,\n}\n\nconst defaultPointPosition: FocalPosition = {\n x: 50,\n y: 50,\n}\n\nexport const EditUpload: React.FC<EditUploadProps> = ({\n fileName,\n fileSrc,\n imageCacheTag,\n initialCrop,\n initialFocalPoint,\n onSave,\n showCrop,\n showFocalPoint,\n}) => {\n const { useModal } = facelessUIImport\n\n const { closeModal } = useModal()\n const { t } = useTranslation()\n\n const [crop, setCrop] = useState<CropType>(() => ({\n ...defaultCrop,\n ...initialCrop,\n }))\n\n const [pointPosition, setPointPosition] = useState<FocalPosition>(() => ({\n ...defaultPointPosition,\n ...initialFocalPoint,\n }))\n const [checkBounds, setCheckBounds] = useState<boolean>(false)\n const [originalHeight, setOriginalHeight] = useState<number>(0)\n const [originalWidth, setOriginalWidth] = useState<number>(0)\n\n const focalWrapRef = useRef<HTMLDivElement | undefined>()\n const imageRef = useRef<HTMLImageElement | undefined>()\n const cropRef = useRef<HTMLDivElement | undefined>()\n\n const fineTuneCrop = ({ dimension, value }: { dimension: 'height' | 'width'; value: string }) => {\n const intValue = parseInt(value)\n if (dimension === 'width' && intValue >= originalWidth) return null\n if (dimension === 'height' && intValue >= originalHeight) return null\n\n const percentage = 100 * (intValue / (dimension === 'width' ? originalWidth : originalHeight))\n\n if (percentage === 100 || percentage === 0) return null\n\n setCrop({\n ...crop,\n [dimension]: percentage,\n })\n }\n\n const fineTuneFocalPoint = ({ coordinate, value }: { coordinate: 'x' | 'y'; value: string }) => {\n const intValue = parseInt(value)\n if (intValue >= 0 && intValue <= 100) {\n setPointPosition((prevPosition) => ({ ...prevPosition, [coordinate]: intValue }))\n }\n }\n\n const saveEdits = () => {\n if (typeof onSave === 'function')\n onSave({\n crop,\n pointPosition,\n })\n closeModal(editDrawerSlug)\n }\n\n const onDragEnd = React.useCallback(({ x, y }) => {\n setPointPosition({ x, y })\n setCheckBounds(false)\n }, [])\n\n const centerFocalPoint = () => {\n const containerRect = focalWrapRef.current.getBoundingClientRect()\n const boundsRect = showCrop\n ? cropRef.current.getBoundingClientRect()\n : imageRef.current.getBoundingClientRect()\n const xCenter =\n ((boundsRect.left - containerRect.left + boundsRect.width / 2) / containerRect.width) * 100\n const yCenter =\n ((boundsRect.top - containerRect.top + boundsRect.height / 2) / containerRect.height) * 100\n setPointPosition({ x: xCenter, y: yCenter })\n }\n\n const fileSrcToUse = imageCacheTag ? `${fileSrc}?${imageCacheTag}` : fileSrc\n\n return (\n <div className={baseClass}>\n <div className={`${baseClass}__header`}>\n <h2 title={`${t('general:editing')} ${fileName}`}>\n {t('general:editing')} {fileName}\n </h2>\n <div className={`${baseClass}__actions`}>\n <Button\n aria-label={t('general:cancel')}\n buttonStyle=\"secondary\"\n className={`${baseClass}__cancel`}\n onClick={() => closeModal(editDrawerSlug)}\n >\n {t('general:cancel')}\n </Button>\n <Button\n aria-label={t('general:applyChanges')}\n buttonStyle=\"primary\"\n className={`${baseClass}__save`}\n onClick={saveEdits}\n >\n {t('general:applyChanges')}\n </Button>\n </div>\n </div>\n <div className={`${baseClass}__toolWrap`}>\n <div className={`${baseClass}__crop`}>\n <div\n className={`${baseClass}__focal-wrapper`}\n ref={focalWrapRef}\n style={{\n aspectRatio: `${originalWidth / originalHeight}`,\n }}\n >\n {showCrop ? (\n <ReactCrop\n className={`${baseClass}__reactCrop`}\n crop={crop}\n onChange={(_, c) => setCrop(c)}\n onComplete={() => setCheckBounds(true)}\n renderSelectionAddon={() => {\n return <div className={`${baseClass}__crop-window`} ref={cropRef} />\n }}\n >\n <img\n alt={t('upload:setCropArea')}\n onLoad={(e) => {\n setOriginalHeight(e.currentTarget.naturalHeight)\n setOriginalWidth(e.currentTarget.naturalWidth)\n }}\n ref={imageRef}\n src={fileSrcToUse}\n />\n </ReactCrop>\n ) : (\n <img\n alt={t('upload:setFocalPoint')}\n onLoad={(e) => {\n setOriginalHeight(e.currentTarget.naturalHeight)\n setOriginalWidth(e.currentTarget.naturalWidth)\n }}\n ref={imageRef}\n src={fileSrcToUse}\n />\n )}\n {showFocalPoint && (\n <DraggableElement\n boundsRef={showCrop ? cropRef : imageRef}\n checkBounds={showCrop ? checkBounds : false}\n className={`${baseClass}__focalPoint`}\n containerRef={focalWrapRef}\n initialPosition={pointPosition}\n onDragEnd={onDragEnd}\n setCheckBounds={showCrop ? setCheckBounds : false}\n >\n <Plus />\n </DraggableElement>\n )}\n </div>\n </div>\n {(showCrop || showFocalPoint) && (\n <div className={`${baseClass}__sidebar`}>\n {showCrop && (\n <div className={`${baseClass}__groupWrap`}>\n <div>\n <div className={`${baseClass}__titleWrap`}>\n <h3>{t('upload:crop')}</h3>\n <Button\n buttonStyle=\"none\"\n className={`${baseClass}__reset`}\n onClick={() =>\n setCrop({\n height: 100,\n unit: '%',\n width: 100,\n x: 0,\n y: 0,\n })\n }\n >\n {t('general:reset')}\n </Button>\n </div>\n </div>\n <span className={`${baseClass}__description`}>\n {t('upload:cropToolDescription')}\n </span>\n <div className={`${baseClass}__inputsWrap`}>\n <Input\n name={`${t('upload:width')} (px)`}\n onChange={(value) => fineTuneCrop({ dimension: 'width', value })}\n value={((crop.width / 100) * originalWidth).toFixed(0)}\n />\n <Input\n name={`${t('upload:height')} (px)`}\n onChange={(value) => fineTuneCrop({ dimension: 'height', value })}\n value={((crop.height / 100) * originalHeight).toFixed(0)}\n />\n </div>\n </div>\n )}\n\n {showFocalPoint && (\n <div className={`${baseClass}__groupWrap`}>\n <div>\n <div className={`${baseClass}__titleWrap`}>\n <h3>{t('upload:focalPoint')}</h3>\n <Button\n buttonStyle=\"none\"\n className={`${baseClass}__reset`}\n onClick={centerFocalPoint}\n >\n {t('general:reset')}\n </Button>\n </div>\n </div>\n <span className={`${baseClass}__description`}>\n {t('upload:focalPointDescription')}\n </span>\n <div className={`${baseClass}__inputsWrap`}>\n <Input\n name=\"X %\"\n onChange={(value) => fineTuneFocalPoint({ coordinate: 'x', value })}\n value={pointPosition.x.toFixed(0)}\n />\n <Input\n name=\"Y %\"\n onChange={(value) => fineTuneFocalPoint({ coordinate: 'y', value })}\n value={pointPosition.y.toFixed(0)}\n />\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n )\n}\n\nconst DraggableElement = ({\n boundsRef,\n checkBounds,\n children,\n className,\n containerRef,\n initialPosition = { x: 50, y: 50 },\n onDragEnd,\n setCheckBounds,\n}) => {\n const [position, setPosition] = useState({ x: initialPosition.x, y: initialPosition.y })\n const [isDragging, setIsDragging] = useState(false)\n const dragRef = useRef<HTMLButtonElement | undefined>()\n\n const getCoordinates = React.useCallback(\n (mouseXArg?: number, mouseYArg?: number, recenter?: boolean) => {\n const containerRect = containerRef.current.getBoundingClientRect()\n const boundsRect = boundsRef.current.getBoundingClientRect()\n const mouseX = mouseXArg ?? boundsRect.left\n const mouseY = mouseYArg ?? boundsRect.top\n\n const xOutOfBounds = mouseX < boundsRect.left || mouseX > boundsRect.right\n const yOutOfBounds = mouseY < boundsRect.top || mouseY > boundsRect.bottom\n\n let x = ((mouseX - containerRect.left) / containerRect.width) * 100\n let y = ((mouseY - containerRect.top) / containerRect.height) * 100\n const xCenter =\n ((boundsRect.left - containerRect.left + boundsRect.width / 2) / containerRect.width) * 100\n const yCenter =\n ((boundsRect.top - containerRect.top + boundsRect.height / 2) / containerRect.height) * 100\n if (xOutOfBounds || yOutOfBounds) {\n setIsDragging(false)\n if (mouseX < boundsRect.left) {\n x = ((boundsRect.left - containerRect.left) / containerRect.width) * 100\n } else if (mouseX > boundsRect.right) {\n x =\n ((containerRect.width - (containerRect.right - boundsRect.right)) /\n containerRect.width) *\n 100\n }\n\n if (mouseY < boundsRect.top) {\n y = ((boundsRect.top - containerRect.top) / containerRect.height) * 100\n } else if (mouseY > boundsRect.bottom) {\n y =\n ((containerRect.height - (containerRect.bottom - boundsRect.bottom)) /\n containerRect.height) *\n 100\n }\n\n if (recenter) {\n x = xOutOfBounds ? xCenter : x\n y = yOutOfBounds ? yCenter : y\n }\n }\n\n return { x, y }\n },\n [boundsRef, containerRef],\n )\n\n const handleMouseDown = (event) => {\n event.preventDefault()\n setIsDragging(true)\n }\n\n const handleMouseMove = (event) => {\n if (!isDragging) return null\n const { x, y } = getCoordinates(event.clientX, event.clientY)\n\n setPosition({ x, y })\n }\n\n const onDrop = () => {\n setIsDragging(false)\n onDragEnd(position)\n }\n\n React.useEffect(() => {\n if (isDragging || !dragRef.current) return\n if (checkBounds) {\n const { height, left, top, width } = dragRef.current.getBoundingClientRect()\n const { x, y } = getCoordinates(left + width / 2, top + height / 2, true)\n onDragEnd({ x, y })\n setPosition({ x, y })\n setCheckBounds(false)\n return\n }\n }, [getCoordinates, isDragging, checkBounds, setCheckBounds, position.x, position.y, onDragEnd])\n\n React.useEffect(() => {\n setPosition({ x: initialPosition.x, y: initialPosition.y })\n }, [initialPosition.x, initialPosition.y])\n\n return (\n <div\n className={[\n `${baseClass}__draggable-container`,\n isDragging && `${baseClass}__draggable-container--dragging`,\n ]\n .filter(Boolean)\n .join(' ')}\n onMouseMove={handleMouseMove}\n >\n <button\n className={[`${baseClass}__draggable`, className].filter(Boolean).join(' ')}\n onMouseDown={handleMouseDown}\n onMouseUp={onDrop}\n ref={dragRef}\n style={{ left: `${position.x}%`, top: `${position.y}%` }}\n type=\"button\"\n >\n {children}\n </button>\n <div />\n </div>\n )\n}\n"],"names":["facelessUIImport","React","useRef","useState","ReactCrop","editDrawerSlug","Plus","useTranslation","Button","baseClass","Input","name","onChange","value","div","className","input","e","target","type","defaultCrop","height","unit","width","x","y","defaultPointPosition","EditUpload","fileName","fileSrc","imageCacheTag","initialCrop","initialFocalPoint","onSave","showCrop","showFocalPoint","useModal","closeModal","t","crop","setCrop","pointPosition","setPointPosition","checkBounds","setCheckBounds","originalHeight","setOriginalHeight","originalWidth","setOriginalWidth","focalWrapRef","imageRef","cropRef","fineTuneCrop","dimension","intValue","parseInt","percentage","fineTuneFocalPoint","coordinate","prevPosition","saveEdits","onDragEnd","useCallback","centerFocalPoint","containerRect","current","getBoundingClientRect","boundsRect","xCenter","left","yCenter","top","fileSrcToUse","h2","title","aria-label","buttonStyle","onClick","ref","style","aspectRatio","_","c","onComplete","renderSelectionAddon","img","alt","onLoad","currentTarget","naturalHeight","naturalWidth","src","DraggableElement","boundsRef","containerRef","initialPosition","h3","span","toFixed","children","position","setPosition","isDragging","setIsDragging","dragRef","getCoordinates","mouseXArg","mouseYArg","recenter","mouseX","mouseY","xOutOfBounds","right","yOutOfBounds","bottom","handleMouseDown","event","preventDefault","handleMouseMove","clientX","clientY","onDrop","useEffect","filter","Boolean","join","onMouseMove","button","onMouseDown","onMouseUp"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/elements/EditUpload/index.tsx"],"sourcesContent":["'use client'\nimport type { Data } from 'payload/types'\nimport type CropType from 'react-image-crop'\n\nimport * as facelessUIImport from '@faceless-ui/modal'\nimport React, { useRef, useState } from 'react'\nimport ReactCrop from 'react-image-crop'\nimport 'react-image-crop/dist/ReactCrop.css'\n\nimport { editDrawerSlug } from '../../elements/Upload/index.js'\nimport { Plus } from '../../icons/Plus/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nimport { Button } from '../Button/index.js'\nimport './index.scss'\n\nconst baseClass = 'edit-upload'\n\nconst Input: React.FC<{ name: string; onChange: (value: string) => void; value: string }> = ({\n name,\n onChange,\n value,\n}) => (\n <div className={`${baseClass}__input`}>\n {name}\n <input name={name} onChange={(e) => onChange(e.target.value)} type=\"number\" value={value} />\n </div>\n)\n\ntype FocalPosition = {\n x: number\n y: number\n}\n\nexport type EditUploadProps = {\n fileName: string\n fileSrc: string\n imageCacheTag?: string\n initialCrop?: CropType\n initialFocalPoint?: FocalPosition\n onSave?: ({ crop, focalPosition }: { crop: CropType; focalPosition: FocalPosition }) => void\n showCrop?: boolean\n showFocalPoint?: boolean\n}\n\nconst defaultCrop: CropType = {\n height: 100,\n unit: '%',\n width: 100,\n x: 0,\n y: 0,\n}\n\nexport const EditUpload: React.FC<EditUploadProps> = ({\n fileName,\n fileSrc,\n imageCacheTag,\n initialCrop,\n initialFocalPoint,\n onSave,\n showCrop,\n showFocalPoint,\n}) => {\n const { useModal } = facelessUIImport\n\n const { closeModal } = useModal()\n const { t } = useTranslation()\n\n const [crop, setCrop] = useState<CropType>(() => ({\n ...defaultCrop,\n ...initialCrop,\n }))\n\n const defaultFocalPosition: FocalPosition = {\n x: 50,\n y: 50,\n }\n\n console.log({ initialFocalPoint })\n\n const [focalPosition, setFocalPosition] = useState<FocalPosition>(() => ({\n ...defaultFocalPosition,\n ...initialFocalPoint,\n }))\n const [checkBounds, setCheckBounds] = useState<boolean>(false)\n const [originalHeight, setOriginalHeight] = useState<number>(0)\n const [originalWidth, setOriginalWidth] = useState<number>(0)\n\n const focalWrapRef = useRef<HTMLDivElement | undefined>()\n const imageRef = useRef<HTMLImageElement | undefined>()\n const cropRef = useRef<HTMLDivElement | undefined>()\n\n const fineTuneCrop = ({ dimension, value }: { dimension: 'height' | 'width'; value: string }) => {\n const intValue = parseInt(value)\n if (dimension === 'width' && intValue >= originalWidth) return null\n if (dimension === 'height' && intValue >= originalHeight) return null\n\n const percentage = 100 * (intValue / (dimension === 'width' ? originalWidth : originalHeight))\n\n if (percentage === 100 || percentage === 0) return null\n\n setCrop({\n ...crop,\n [dimension]: percentage,\n })\n }\n\n const fineTuneFocalPosition = ({\n coordinate,\n value,\n }: {\n coordinate: 'x' | 'y'\n value: string\n }) => {\n const intValue = parseInt(value)\n if (intValue >= 0 && intValue <= 100) {\n setFocalPosition((prevPosition) => ({ ...prevPosition, [coordinate]: intValue }))\n }\n }\n\n const saveEdits = () => {\n if (typeof onSave === 'function')\n onSave({\n crop,\n focalPosition,\n })\n closeModal(editDrawerSlug)\n }\n\n const onDragEnd = React.useCallback(({ x, y }) => {\n setFocalPosition({ x, y })\n setCheckBounds(false)\n }, [])\n\n const centerFocalPoint = () => {\n const containerRect = focalWrapRef.current.getBoundingClientRect()\n const boundsRect = showCrop\n ? cropRef.current.getBoundingClientRect()\n : imageRef.current.getBoundingClientRect()\n const xCenter =\n ((boundsRect.left - containerRect.left + boundsRect.width / 2) / containerRect.width) * 100\n const yCenter =\n ((boundsRect.top - containerRect.top + boundsRect.height / 2) / containerRect.height) * 100\n setFocalPosition({ x: xCenter, y: yCenter })\n }\n\n const fileSrcToUse = imageCacheTag ? `${fileSrc}?${imageCacheTag}` : fileSrc\n\n return (\n <div className={baseClass}>\n <div className={`${baseClass}__header`}>\n <h2 title={`${t('general:editing')} ${fileName}`}>\n {t('general:editing')} {fileName}\n </h2>\n <div className={`${baseClass}__actions`}>\n <Button\n aria-label={t('general:cancel')}\n buttonStyle=\"secondary\"\n className={`${baseClass}__cancel`}\n onClick={() => closeModal(editDrawerSlug)}\n >\n {t('general:cancel')}\n </Button>\n <Button\n aria-label={t('general:applyChanges')}\n buttonStyle=\"primary\"\n className={`${baseClass}__save`}\n onClick={saveEdits}\n >\n {t('general:applyChanges')}\n </Button>\n </div>\n </div>\n <div className={`${baseClass}__toolWrap`}>\n <div className={`${baseClass}__crop`}>\n <div\n className={`${baseClass}__focal-wrapper`}\n ref={focalWrapRef}\n style={{\n aspectRatio: `${originalWidth / originalHeight}`,\n }}\n >\n {showCrop ? (\n <ReactCrop\n className={`${baseClass}__reactCrop`}\n crop={crop}\n onChange={(_, c) => setCrop(c)}\n onComplete={() => setCheckBounds(true)}\n renderSelectionAddon={() => {\n return <div className={`${baseClass}__crop-window`} ref={cropRef} />\n }}\n >\n <img\n alt={t('upload:setCropArea')}\n onLoad={(e) => {\n setOriginalHeight(e.currentTarget.naturalHeight)\n setOriginalWidth(e.currentTarget.naturalWidth)\n }}\n ref={imageRef}\n src={fileSrcToUse}\n />\n </ReactCrop>\n ) : (\n <img\n alt={t('upload:setFocalPoint')}\n onLoad={(e) => {\n setOriginalHeight(e.currentTarget.naturalHeight)\n setOriginalWidth(e.currentTarget.naturalWidth)\n }}\n ref={imageRef}\n src={fileSrcToUse}\n />\n )}\n {showFocalPoint && (\n <DraggableElement\n boundsRef={showCrop ? cropRef : imageRef}\n checkBounds={showCrop ? checkBounds : false}\n className={`${baseClass}__focalPoint`}\n containerRef={focalWrapRef}\n initialPosition={focalPosition}\n onDragEnd={onDragEnd}\n setCheckBounds={showCrop ? setCheckBounds : false}\n >\n <Plus />\n </DraggableElement>\n )}\n </div>\n </div>\n {(showCrop || showFocalPoint) && (\n <div className={`${baseClass}__sidebar`}>\n {showCrop && (\n <div className={`${baseClass}__groupWrap`}>\n <div>\n <div className={`${baseClass}__titleWrap`}>\n <h3>{t('upload:crop')}</h3>\n <Button\n buttonStyle=\"none\"\n className={`${baseClass}__reset`}\n onClick={() =>\n setCrop({\n height: 100,\n unit: '%',\n width: 100,\n x: 0,\n y: 0,\n })\n }\n >\n {t('general:reset')}\n </Button>\n </div>\n </div>\n <span className={`${baseClass}__description`}>\n {t('upload:cropToolDescription')}\n </span>\n <div className={`${baseClass}__inputsWrap`}>\n <Input\n name={`${t('upload:width')} (px)`}\n onChange={(value) => fineTuneCrop({ dimension: 'width', value })}\n value={((crop.width / 100) * originalWidth).toFixed(0)}\n />\n <Input\n name={`${t('upload:height')} (px)`}\n onChange={(value) => fineTuneCrop({ dimension: 'height', value })}\n value={((crop.height / 100) * originalHeight).toFixed(0)}\n />\n </div>\n </div>\n )}\n\n {showFocalPoint && (\n <div className={`${baseClass}__groupWrap`}>\n <div>\n <div className={`${baseClass}__titleWrap`}>\n <h3>{t('upload:focalPoint')}</h3>\n <Button\n buttonStyle=\"none\"\n className={`${baseClass}__reset`}\n onClick={centerFocalPoint}\n >\n {t('general:reset')}\n </Button>\n </div>\n </div>\n <span className={`${baseClass}__description`}>\n {t('upload:focalPointDescription')}\n </span>\n <div className={`${baseClass}__inputsWrap`}>\n <Input\n name=\"X %\"\n onChange={(value) => fineTuneFocalPosition({ coordinate: 'x', value })}\n value={focalPosition.x.toFixed(0)}\n />\n <Input\n name=\"Y %\"\n onChange={(value) => fineTuneFocalPosition({ coordinate: 'y', value })}\n value={focalPosition.y.toFixed(0)}\n />\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n )\n}\n\nconst DraggableElement = ({\n boundsRef,\n checkBounds,\n children,\n className,\n containerRef,\n initialPosition = { x: 50, y: 50 },\n onDragEnd,\n setCheckBounds,\n}) => {\n const [position, setPosition] = useState({ x: initialPosition.x, y: initialPosition.y })\n const [isDragging, setIsDragging] = useState(false)\n const dragRef = useRef<HTMLButtonElement | undefined>()\n\n const getCoordinates = React.useCallback(\n (mouseXArg?: number, mouseYArg?: number, recenter?: boolean) => {\n const containerRect = containerRef.current.getBoundingClientRect()\n const boundsRect = boundsRef.current.getBoundingClientRect()\n const mouseX = mouseXArg ?? boundsRect.left\n const mouseY = mouseYArg ?? boundsRect.top\n\n const xOutOfBounds = mouseX < boundsRect.left || mouseX > boundsRect.right\n const yOutOfBounds = mouseY < boundsRect.top || mouseY > boundsRect.bottom\n\n let x = ((mouseX - containerRect.left) / containerRect.width) * 100\n let y = ((mouseY - containerRect.top) / containerRect.height) * 100\n const xCenter =\n ((boundsRect.left - containerRect.left + boundsRect.width / 2) / containerRect.width) * 100\n const yCenter =\n ((boundsRect.top - containerRect.top + boundsRect.height / 2) / containerRect.height) * 100\n if (xOutOfBounds || yOutOfBounds) {\n setIsDragging(false)\n if (mouseX < boundsRect.left) {\n x = ((boundsRect.left - containerRect.left) / containerRect.width) * 100\n } else if (mouseX > boundsRect.right) {\n x =\n ((containerRect.width - (containerRect.right - boundsRect.right)) /\n containerRect.width) *\n 100\n }\n\n if (mouseY < boundsRect.top) {\n y = ((boundsRect.top - containerRect.top) / containerRect.height) * 100\n } else if (mouseY > boundsRect.bottom) {\n y =\n ((containerRect.height - (containerRect.bottom - boundsRect.bottom)) /\n containerRect.height) *\n 100\n }\n\n if (recenter) {\n x = xOutOfBounds ? xCenter : x\n y = yOutOfBounds ? yCenter : y\n }\n }\n\n return { x, y }\n },\n [boundsRef, containerRef],\n )\n\n const handleMouseDown = (event) => {\n event.preventDefault()\n setIsDragging(true)\n }\n\n const handleMouseMove = (event) => {\n if (!isDragging) return null\n const { x, y } = getCoordinates(event.clientX, event.clientY)\n\n setPosition({ x, y })\n }\n\n const onDrop = () => {\n setIsDragging(false)\n onDragEnd(position)\n }\n\n React.useEffect(() => {\n if (isDragging || !dragRef.current) return\n if (checkBounds) {\n const { height, left, top, width } = dragRef.current.getBoundingClientRect()\n const { x, y } = getCoordinates(left + width / 2, top + height / 2, true)\n onDragEnd({ x, y })\n setPosition({ x, y })\n setCheckBounds(false)\n return\n }\n }, [getCoordinates, isDragging, checkBounds, setCheckBounds, position.x, position.y, onDragEnd])\n\n React.useEffect(() => {\n setPosition({ x: initialPosition.x, y: initialPosition.y })\n }, [initialPosition.x, initialPosition.y])\n\n return (\n <div\n className={[\n `${baseClass}__draggable-container`,\n isDragging && `${baseClass}__draggable-container--dragging`,\n ]\n .filter(Boolean)\n .join(' ')}\n onMouseMove={handleMouseMove}\n >\n <button\n className={[`${baseClass}__draggable`, className].filter(Boolean).join(' ')}\n onMouseDown={handleMouseDown}\n onMouseUp={onDrop}\n ref={dragRef}\n style={{ left: `${position.x}%`, top: `${position.y}%` }}\n type=\"button\"\n >\n {children}\n </button>\n <div />\n </div>\n )\n}\n"],"names":["facelessUIImport","React","useRef","useState","ReactCrop","editDrawerSlug","Plus","useTranslation","Button","baseClass","Input","name","onChange","value","div","className","input","e","target","type","defaultCrop","height","unit","width","x","y","EditUpload","fileName","fileSrc","imageCacheTag","initialCrop","initialFocalPoint","onSave","showCrop","showFocalPoint","useModal","closeModal","t","crop","setCrop","defaultFocalPosition","console","log","focalPosition","setFocalPosition","checkBounds","setCheckBounds","originalHeight","setOriginalHeight","originalWidth","setOriginalWidth","focalWrapRef","imageRef","cropRef","fineTuneCrop","dimension","intValue","parseInt","percentage","fineTuneFocalPosition","coordinate","prevPosition","saveEdits","onDragEnd","useCallback","centerFocalPoint","containerRect","current","getBoundingClientRect","boundsRect","xCenter","left","yCenter","top","fileSrcToUse","h2","title","aria-label","buttonStyle","onClick","ref","style","aspectRatio","_","c","onComplete","renderSelectionAddon","img","alt","onLoad","currentTarget","naturalHeight","naturalWidth","src","DraggableElement","boundsRef","containerRef","initialPosition","h3","span","toFixed","children","position","setPosition","isDragging","setIsDragging","dragRef","getCoordinates","mouseXArg","mouseYArg","recenter","mouseX","mouseY","xOutOfBounds","right","yOutOfBounds","bottom","handleMouseDown","event","preventDefault","handleMouseMove","clientX","clientY","onDrop","useEffect","filter","Boolean","join","onMouseMove","button","onMouseDown","onMouseUp"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/Save/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAiB,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/Save/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAiB,MAAM,OAAO,CAAA;AAQrC,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAmC1D,CAAA;AAED,KAAK,KAAK,GAAG;IACX,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAClC,CAAA;AAED,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAIhC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/elements/Save/index.tsx"],"sourcesContent":["'use client'\n\nimport React, { useRef } from 'react'\n\nimport { useForm, useFormModified } from '../../forms/Form/context.js'\nimport { FormSubmit } from '../../forms/Submit/index.js'\nimport { useHotkey } from '../../hooks/useHotkey.js'\nimport { useEditDepth } from '../../providers/EditDepth/index.js'\nimport { useOperation } from '../../providers/Operation/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\
|
|
1
|
+
{"version":3,"sources":["../../../src/elements/Save/index.tsx"],"sourcesContent":["'use client'\n\nimport React, { useRef } from 'react'\n\nimport { useForm, useFormModified } from '../../forms/Form/context.js'\nimport { FormSubmit } from '../../forms/Submit/index.js'\nimport { useHotkey } from '../../hooks/useHotkey.js'\nimport { useEditDepth } from '../../providers/EditDepth/index.js'\nimport { useOperation } from '../../providers/Operation/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\nexport const DefaultSaveButton: React.FC<{ label?: string }> = ({ label: labelProp }) => {\n const { t } = useTranslation()\n const { submit } = useForm()\n const modified = useFormModified()\n const label = labelProp || t('general:save')\n const ref = useRef<HTMLButtonElement>(null)\n const editDepth = useEditDepth()\n const operation = useOperation()\n\n const forceDisable = operation === 'update' && !modified\n\n useHotkey({ cmdCtrlKey: true, editDepth, keyCodes: ['s'] }, (e) => {\n if (forceDisable) {\n // absorb the event\n }\n\n e.preventDefault()\n e.stopPropagation()\n if (ref?.current) {\n ref.current.click()\n }\n })\n\n return (\n <FormSubmit\n buttonId=\"action-save\"\n disabled={forceDisable}\n onClick={() => submit()}\n ref={ref}\n size=\"small\"\n type=\"button\"\n >\n {label}\n </FormSubmit>\n )\n}\n\ntype Props = {\n CustomComponent?: React.ReactNode\n}\n\nexport const Save: React.FC<Props> = ({ CustomComponent }) => {\n if (CustomComponent) return CustomComponent\n\n return <DefaultSaveButton />\n}\n"],"names":["React","useRef","useForm","useFormModified","FormSubmit","useHotkey","useEditDepth","useOperation","useTranslation","DefaultSaveButton","label","labelProp","t","submit","modified","ref","editDepth","operation","forceDisable","cmdCtrlKey","keyCodes","e","preventDefault","stopPropagation","current","click","buttonId","disabled","onClick","size","type","Save","CustomComponent"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA;AAEA,OAAOA,SAASC,MAAM,QAAQ,QAAO;AAErC,SAASC,OAAO,EAAEC,eAAe,QAAQ,8BAA6B;AACtE,SAASC,UAAU,QAAQ,8BAA6B;AACxD,SAASC,SAAS,QAAQ,2BAA0B;AACpD,SAASC,YAAY,QAAQ,qCAAoC;AACjE,SAASC,YAAY,QAAQ,qCAAoC;AACjE,SAASC,cAAc,QAAQ,uCAAsC;AACrE,OAAO,MAAMC,oBAAkD,CAAC,EAAEC,OAAOC,SAAS,EAAE;IAClF,MAAM,EAAEC,CAAC,EAAE,GAAGJ;IACd,MAAM,EAAEK,MAAM,EAAE,GAAGX;IACnB,MAAMY,WAAWX;IACjB,MAAMO,QAAQC,aAAaC,EAAE;IAC7B,MAAMG,MAAMd,OAA0B;IACtC,MAAMe,YAAYV;IAClB,MAAMW,YAAYV;IAElB,MAAMW,eAAeD,cAAc,YAAY,CAACH;IAEhDT,UAAU;QAAEc,YAAY;QAAMH;QAAWI,UAAU;YAAC;SAAI;IAAC,GAAG,CAACC;QAC3D,IAAIH,cAAc;QAChB,mBAAmB;QACrB;QAEAG,EAAEC,cAAc;QAChBD,EAAEE,eAAe;QACjB,IAAIR,KAAKS,SAAS;YAChBT,IAAIS,OAAO,CAACC,KAAK;QACnB;IACF;IAEA,qBACE,oBAACrB;QACCsB,UAAS;QACTC,UAAUT;QACVU,SAAS,IAAMf;QACfE,KAAKA;QACLc,MAAK;QACLC,MAAK;OAEJpB;AAGP,EAAC;AAMD,OAAO,MAAMqB,OAAwB,CAAC,EAAEC,eAAe,EAAE;IACvD,IAAIA,iBAAiB,OAAOA;IAE5B,qBAAO,oBAACvB;AACV,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/SaveDraft/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8B,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/SaveDraft/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8B,MAAM,OAAO,CAAA;AAoFlD,KAAK,KAAK,GAAG;IACX,eAAe,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;CAClC,CAAA;AAED,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAIrC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/elements/SaveDraft/index.tsx"],"sourcesContent":["'use client'\n\nimport React, { useCallback, useRef } from 'react'\n\nimport { useForm, useFormModified } from '../../forms/Form/context.js'\nimport { FormSubmit } from '../../forms/Submit/index.js'\nimport { useHotkey } from '../../hooks/useHotkey.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useDocumentInfo } from '../../providers/DocumentInfo/index.js'\nimport { useEditDepth } from '../../providers/EditDepth/index.js'\nimport { useLocale } from '../../providers/Locale/index.js'\nimport { useOperation } from '../../providers/Operation/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\n\nconst baseClass = 'save-draft'\n\nconst DefaultSaveDraftButton: React.FC = () => {\n const {\n routes: { api },\n serverURL,\n } = useConfig()\n const { id, collectionSlug, globalSlug } = useDocumentInfo()\n const modified = useFormModified()\n const { code: locale } = useLocale()\n const ref = useRef<HTMLButtonElement>(null)\n const editDepth = useEditDepth()\n const { t } = useTranslation()\n const { submit } = useForm()\n const operation = useOperation()\n\n const forceDisable = operation === 'update' && !modified\n\n const saveDraft = useCallback(async () => {\n if (forceDisable) return\n\n const search = `?locale=${locale}&depth=0&fallback-locale=null&draft=true`\n let action\n let method = 'POST'\n\n if (collectionSlug) {\n action = `${serverURL}${api}/${collectionSlug}${id ? `/${id}` : ''}${search}`\n if (id) method = 'PATCH'\n }\n\n if (globalSlug) {\n action = `${serverURL}${api}/globals/${globalSlug}${search}`\n }\n\n await submit({\n action,\n method,\n overrides: {\n _status: 'draft',\n },\n skipValidation: true,\n })\n }, [submit, collectionSlug, globalSlug, serverURL, api, locale, id, forceDisable])\n\n useHotkey({ cmdCtrlKey: true, editDepth, keyCodes: ['s'] }, (e) => {\n if (forceDisable)
|
|
1
|
+
{"version":3,"sources":["../../../src/elements/SaveDraft/index.tsx"],"sourcesContent":["'use client'\n\nimport React, { useCallback, useRef } from 'react'\n\nimport { useForm, useFormModified } from '../../forms/Form/context.js'\nimport { FormSubmit } from '../../forms/Submit/index.js'\nimport { useHotkey } from '../../hooks/useHotkey.js'\nimport { useConfig } from '../../providers/Config/index.js'\nimport { useDocumentInfo } from '../../providers/DocumentInfo/index.js'\nimport { useEditDepth } from '../../providers/EditDepth/index.js'\nimport { useLocale } from '../../providers/Locale/index.js'\nimport { useOperation } from '../../providers/Operation/index.js'\nimport { useTranslation } from '../../providers/Translation/index.js'\n\nconst baseClass = 'save-draft'\n\nconst DefaultSaveDraftButton: React.FC = () => {\n const {\n routes: { api },\n serverURL,\n } = useConfig()\n const { id, collectionSlug, globalSlug } = useDocumentInfo()\n const modified = useFormModified()\n const { code: locale } = useLocale()\n const ref = useRef<HTMLButtonElement>(null)\n const editDepth = useEditDepth()\n const { t } = useTranslation()\n const { submit } = useForm()\n const operation = useOperation()\n\n const forceDisable = operation === 'update' && !modified\n\n const saveDraft = useCallback(async () => {\n if (forceDisable) return\n\n const search = `?locale=${locale}&depth=0&fallback-locale=null&draft=true`\n let action\n let method = 'POST'\n\n if (collectionSlug) {\n action = `${serverURL}${api}/${collectionSlug}${id ? `/${id}` : ''}${search}`\n if (id) method = 'PATCH'\n }\n\n if (globalSlug) {\n action = `${serverURL}${api}/globals/${globalSlug}${search}`\n }\n\n await submit({\n action,\n method,\n overrides: {\n _status: 'draft',\n },\n skipValidation: true,\n })\n }, [submit, collectionSlug, globalSlug, serverURL, api, locale, id, forceDisable])\n\n useHotkey({ cmdCtrlKey: true, editDepth, keyCodes: ['s'] }, (e) => {\n if (forceDisable) {\n // absorb the event\n }\n\n e.preventDefault()\n e.stopPropagation()\n if (ref?.current) {\n ref.current.click()\n }\n })\n\n return (\n <FormSubmit\n buttonId=\"action-save-draft\"\n buttonStyle=\"secondary\"\n className={baseClass}\n disabled={forceDisable}\n onClick={saveDraft}\n ref={ref}\n size=\"small\"\n type=\"button\"\n >\n {t('version:saveDraft')}\n </FormSubmit>\n )\n}\n\ntype Props = {\n CustomComponent?: React.ReactNode\n}\n\nexport const SaveDraft: React.FC<Props> = ({ CustomComponent }) => {\n if (CustomComponent) return CustomComponent\n\n return <DefaultSaveDraftButton />\n}\n"],"names":["React","useCallback","useRef","useForm","useFormModified","FormSubmit","useHotkey","useConfig","useDocumentInfo","useEditDepth","useLocale","useOperation","useTranslation","baseClass","DefaultSaveDraftButton","routes","api","serverURL","id","collectionSlug","globalSlug","modified","code","locale","ref","editDepth","t","submit","operation","forceDisable","saveDraft","search","action","method","overrides","_status","skipValidation","cmdCtrlKey","keyCodes","e","preventDefault","stopPropagation","current","click","buttonId","buttonStyle","className","disabled","onClick","size","type","SaveDraft","CustomComponent"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA;AAEA,OAAOA,SAASC,WAAW,EAAEC,MAAM,QAAQ,QAAO;AAElD,SAASC,OAAO,EAAEC,eAAe,QAAQ,8BAA6B;AACtE,SAASC,UAAU,QAAQ,8BAA6B;AACxD,SAASC,SAAS,QAAQ,2BAA0B;AACpD,SAASC,SAAS,QAAQ,kCAAiC;AAC3D,SAASC,eAAe,QAAQ,wCAAuC;AACvE,SAASC,YAAY,QAAQ,qCAAoC;AACjE,SAASC,SAAS,QAAQ,kCAAiC;AAC3D,SAASC,YAAY,QAAQ,qCAAoC;AACjE,SAASC,cAAc,QAAQ,uCAAsC;AAErE,MAAMC,YAAY;AAElB,MAAMC,yBAAmC;IACvC,MAAM,EACJC,QAAQ,EAAEC,GAAG,EAAE,EACfC,SAAS,EACV,GAAGV;IACJ,MAAM,EAAEW,EAAE,EAAEC,cAAc,EAAEC,UAAU,EAAE,GAAGZ;IAC3C,MAAMa,WAAWjB;IACjB,MAAM,EAAEkB,MAAMC,MAAM,EAAE,GAAGb;IACzB,MAAMc,MAAMtB,OAA0B;IACtC,MAAMuB,YAAYhB;IAClB,MAAM,EAAEiB,CAAC,EAAE,GAAGd;IACd,MAAM,EAAEe,MAAM,EAAE,GAAGxB;IACnB,MAAMyB,YAAYjB;IAElB,MAAMkB,eAAeD,cAAc,YAAY,CAACP;IAEhD,MAAMS,YAAY7B,YAAY;QAC5B,IAAI4B,cAAc;QAElB,MAAME,SAAS,CAAC,QAAQ,EAAER,OAAO,wCAAwC,CAAC;QAC1E,IAAIS;QACJ,IAAIC,SAAS;QAEb,IAAId,gBAAgB;YAClBa,SAAS,CAAC,EAAEf,UAAU,EAAED,IAAI,CAAC,EAAEG,eAAe,EAAED,KAAK,CAAC,CAAC,EAAEA,GAAG,CAAC,GAAG,GAAG,EAAEa,OAAO,CAAC;YAC7E,IAAIb,IAAIe,SAAS;QACnB;QAEA,IAAIb,YAAY;YACdY,SAAS,CAAC,EAAEf,UAAU,EAAED,IAAI,SAAS,EAAEI,WAAW,EAAEW,OAAO,CAAC;QAC9D;QAEA,MAAMJ,OAAO;YACXK;YACAC;YACAC,WAAW;gBACTC,SAAS;YACX;YACAC,gBAAgB;QAClB;IACF,GAAG;QAACT;QAAQR;QAAgBC;QAAYH;QAAWD;QAAKO;QAAQL;QAAIW;KAAa;IAEjFvB,UAAU;QAAE+B,YAAY;QAAMZ;QAAWa,UAAU;YAAC;SAAI;IAAC,GAAG,CAACC;QAC3D,IAAIV,cAAc;QAChB,mBAAmB;QACrB;QAEAU,EAAEC,cAAc;QAChBD,EAAEE,eAAe;QACjB,IAAIjB,KAAKkB,SAAS;YAChBlB,IAAIkB,OAAO,CAACC,KAAK;QACnB;IACF;IAEA,qBACE,oBAACtC;QACCuC,UAAS;QACTC,aAAY;QACZC,WAAWjC;QACXkC,UAAUlB;QACVmB,SAASlB;QACTN,KAAKA;QACLyB,MAAK;QACLC,MAAK;OAEJxB,EAAE;AAGT;AAMA,OAAO,MAAMyB,YAA6B,CAAC,EAAEC,eAAe,EAAE;IAC5D,IAAIA,iBAAiB,OAAOA;IAE5B,qBAAO,oBAACtC;AACV,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/elements/Table/DefaultCell/fields/Relationship/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAA;AAGlF,OAAO,KAA8B,MAAM,OAAO,CAAA;AAQlD,OAAO,cAAc,CAAA;AAMrB,MAAM,WAAW,qBAAsB,SAAQ,yBAAyB,CAAC,GAAG,CAAC;IAC3E,KAAK,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAA;IAClC,UAAU,EAAE,kBAAkB,CAAC,YAAY,CAAC,CAAA;CAC7C;AAED,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/elements/Table/DefaultCell/fields/Relationship/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAA;AAGlF,OAAO,KAA8B,MAAM,OAAO,CAAA;AAQlD,OAAO,cAAc,CAAA;AAMrB,MAAM,WAAW,qBAAsB,SAAQ,yBAAyB,CAAC,GAAG,CAAC;IAC3E,KAAK,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAA;IAClC,UAAU,EAAE,kBAAkB,CAAC,YAAY,CAAC,CAAA;CAC7C;AAED,eAAO,MAAM,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC,qBAAqB,CAqF5D,CAAA"}
|
|
@@ -48,6 +48,14 @@ export const RelationshipCell = ({ cellData, label, relationTo })=>{
|
|
|
48
48
|
hasRequested,
|
|
49
49
|
getRelationships
|
|
50
50
|
]);
|
|
51
|
+
useEffect(()=>{
|
|
52
|
+
if (hasRequested) {
|
|
53
|
+
setHasRequested(false);
|
|
54
|
+
}
|
|
55
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
56
|
+
}, [
|
|
57
|
+
cellData
|
|
58
|
+
]);
|
|
51
59
|
return /*#__PURE__*/ React.createElement("div", {
|
|
52
60
|
className: baseClass,
|
|
53
61
|
ref: intersectionRef
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../src/elements/Table/DefaultCell/fields/Relationship/index.tsx"],"sourcesContent":["'use client'\nimport type { CellComponentProps, DefaultCellComponentProps } from 'payload/types'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport React, { useEffect, useState } from 'react'\n\nimport { useIntersect } from '../../../../../hooks/useIntersect.js'\nimport { useConfig } from '../../../../../providers/Config/index.js'\nimport { useTranslation } from '../../../../../providers/Translation/index.js'\nimport { canUseDOM } from '../../../../../utilities/canUseDOM.js'\nimport { formatDocTitle } from '../../../../../utilities/formatDocTitle.js'\nimport { useListRelationships } from '../../../RelationshipProvider/index.js'\nimport './index.scss'\n\ntype Value = { relationTo: string; value: number | string }\nconst baseClass = 'relationship-cell'\nconst totalToShow = 3\n\nexport interface RelationshipCellProps extends DefaultCellComponentProps<any> {\n label: CellComponentProps['label']\n relationTo: CellComponentProps['relationTo']\n}\n\nexport const RelationshipCell: React.FC<RelationshipCellProps> = ({\n cellData,\n label,\n relationTo,\n}) => {\n const config = useConfig()\n const { collections, routes } = config\n const [intersectionRef, entry] = useIntersect()\n const [values, setValues] = useState<Value[]>([])\n const { documents, getRelationships } = useListRelationships()\n const [hasRequested, setHasRequested] = useState(false)\n const { i18n, t } = useTranslation()\n\n const isAboveViewport = canUseDOM ? entry?.boundingClientRect?.top < window.innerHeight : false\n\n useEffect(() => {\n if (cellData && isAboveViewport && !hasRequested) {\n const formattedValues: Value[] = []\n
|
|
1
|
+
{"version":3,"sources":["../../../../../../src/elements/Table/DefaultCell/fields/Relationship/index.tsx"],"sourcesContent":["'use client'\nimport type { CellComponentProps, DefaultCellComponentProps } from 'payload/types'\n\nimport { getTranslation } from '@payloadcms/translations'\nimport React, { useEffect, useState } from 'react'\n\nimport { useIntersect } from '../../../../../hooks/useIntersect.js'\nimport { useConfig } from '../../../../../providers/Config/index.js'\nimport { useTranslation } from '../../../../../providers/Translation/index.js'\nimport { canUseDOM } from '../../../../../utilities/canUseDOM.js'\nimport { formatDocTitle } from '../../../../../utilities/formatDocTitle.js'\nimport { useListRelationships } from '../../../RelationshipProvider/index.js'\nimport './index.scss'\n\ntype Value = { relationTo: string; value: number | string }\nconst baseClass = 'relationship-cell'\nconst totalToShow = 3\n\nexport interface RelationshipCellProps extends DefaultCellComponentProps<any> {\n label: CellComponentProps['label']\n relationTo: CellComponentProps['relationTo']\n}\n\nexport const RelationshipCell: React.FC<RelationshipCellProps> = ({\n cellData,\n label,\n relationTo,\n}) => {\n const config = useConfig()\n const { collections, routes } = config\n const [intersectionRef, entry] = useIntersect()\n const [values, setValues] = useState<Value[]>([])\n const { documents, getRelationships } = useListRelationships()\n const [hasRequested, setHasRequested] = useState(false)\n const { i18n, t } = useTranslation()\n\n const isAboveViewport = canUseDOM ? entry?.boundingClientRect?.top < window.innerHeight : false\n\n useEffect(() => {\n if (cellData && isAboveViewport && !hasRequested) {\n const formattedValues: Value[] = []\n const arrayCellData = Array.isArray(cellData) ? cellData : [cellData]\n arrayCellData\n .slice(0, arrayCellData.length < totalToShow ? arrayCellData.length : totalToShow)\n .forEach((cell) => {\n if (typeof cell === 'object' && 'relationTo' in cell && 'value' in cell) {\n formattedValues.push(cell)\n }\n if (\n (typeof cell === 'number' || typeof cell === 'string') &&\n typeof relationTo === 'string'\n ) {\n formattedValues.push({\n relationTo,\n value: cell,\n })\n }\n })\n getRelationships(formattedValues)\n setHasRequested(true)\n setValues(formattedValues)\n }\n }, [\n cellData,\n relationTo,\n collections,\n isAboveViewport,\n routes.api,\n hasRequested,\n getRelationships,\n ])\n\n useEffect(() => {\n if (hasRequested) {\n setHasRequested(false)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [cellData])\n\n return (\n <div className={baseClass} ref={intersectionRef}>\n {values.map(({ relationTo, value }, i) => {\n const document = documents[relationTo][value]\n const relatedCollection = collections.find(({ slug }) => slug === relationTo)\n\n const label = formatDocTitle({\n collectionConfig: relatedCollection,\n data: document || null,\n dateFormat: config.admin.dateFormat,\n fallback: `${t('general:untitled')} - ID: ${value}`,\n i18n,\n })\n\n return (\n <React.Fragment key={i}>\n {document === false && `${t('general:untitled')} - ID: ${value}`}\n {document === null && `${t('general:loading')}...`}\n {document ? label : null}\n {values.length > i + 1 && ', '}\n </React.Fragment>\n )\n })}\n {Array.isArray(cellData) &&\n cellData.length > totalToShow &&\n t('fields:itemsAndMore', { count: cellData.length - totalToShow, items: '' })}\n {values.length === 0 && t('general:noLabel', { label: getTranslation(label || '', i18n) })}\n </div>\n )\n}\n"],"names":["getTranslation","React","useEffect","useState","useIntersect","useConfig","useTranslation","canUseDOM","formatDocTitle","useListRelationships","baseClass","totalToShow","RelationshipCell","cellData","label","relationTo","config","collections","routes","intersectionRef","entry","values","setValues","documents","getRelationships","hasRequested","setHasRequested","i18n","t","isAboveViewport","boundingClientRect","top","window","innerHeight","formattedValues","arrayCellData","Array","isArray","slice","length","forEach","cell","push","value","api","div","className","ref","map","i","document","relatedCollection","find","slug","collectionConfig","data","dateFormat","admin","fallback","Fragment","key","count","items"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
|
|
@@ -7,6 +7,10 @@ export type Props = {
|
|
|
7
7
|
className?: string;
|
|
8
8
|
delay?: number;
|
|
9
9
|
show?: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* If the tooltip position should not change depending on if the toolbar is outside the boundingRef. @default false
|
|
12
|
+
*/
|
|
13
|
+
staticPositioning?: boolean;
|
|
10
14
|
};
|
|
11
15
|
export declare const Tooltip: React.FC<Props>;
|
|
12
16
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/Tooltip/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAoB,MAAM,OAAO,CAAA;AAGxC,OAAO,cAAc,CAAA;AAErB,MAAM,MAAM,KAAK,GAAG;IAClB,UAAU,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAA;IACxC,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;IAC1C,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/Tooltip/index.tsx"],"names":[],"mappings":"AACA,OAAO,KAAoB,MAAM,OAAO,CAAA;AAGxC,OAAO,cAAc,CAAA;AAErB,MAAM,MAAM,KAAK,GAAG;IAClB,UAAU,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAA;IACxC,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;IAC1C,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,OAAO,CAAA;IACd;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAC5B,CAAA;AAED,eAAO,MAAM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CA8EnC,CAAA"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import React, { useEffect } from 'react';
|
|
3
3
|
import { useIntersect } from '../../hooks/useIntersect.js';
|
|
4
4
|
export const Tooltip = (props)=>{
|
|
5
|
-
const { alignCaret = 'center', boundingRef, children, className, delay = 350, show: showFromProps = true } = props;
|
|
5
|
+
const { alignCaret = 'center', boundingRef, children, className, delay = 350, show: showFromProps = true, staticPositioning = false } = props;
|
|
6
6
|
const [show, setShow] = React.useState(showFromProps);
|
|
7
7
|
const [position, setPosition] = React.useState('top');
|
|
8
8
|
const getTitleAttribute = (content)=>typeof content === 'string' ? content : '';
|
|
@@ -10,7 +10,7 @@ export const Tooltip = (props)=>{
|
|
|
10
10
|
root: boundingRef?.current || null,
|
|
11
11
|
rootMargin: '-145px 0px 0px 100px',
|
|
12
12
|
threshold: 0
|
|
13
|
-
});
|
|
13
|
+
}, staticPositioning);
|
|
14
14
|
useEffect(()=>{
|
|
15
15
|
let timerId;
|
|
16
16
|
// do not use the delay on transition-out
|
|
@@ -29,11 +29,14 @@ export const Tooltip = (props)=>{
|
|
|
29
29
|
delay
|
|
30
30
|
]);
|
|
31
31
|
useEffect(()=>{
|
|
32
|
+
if (staticPositioning) return;
|
|
32
33
|
setPosition(intersectionEntry?.isIntersecting ? 'top' : 'bottom');
|
|
33
34
|
}, [
|
|
34
|
-
intersectionEntry
|
|
35
|
+
intersectionEntry,
|
|
36
|
+
staticPositioning
|
|
35
37
|
]);
|
|
36
|
-
|
|
38
|
+
// The first aside is always on top. The purpose of that is that it can reliably be used for the interaction observer (as it's not moving around), to calculate the position of the actual tooltip.
|
|
39
|
+
return /*#__PURE__*/ React.createElement(React.Fragment, null, !staticPositioning && /*#__PURE__*/ React.createElement("aside", {
|
|
37
40
|
"aria-hidden": "true",
|
|
38
41
|
className: [
|
|
39
42
|
'tooltip',
|
|
@@ -42,7 +45,9 @@ export const Tooltip = (props)=>{
|
|
|
42
45
|
'tooltip--position-top'
|
|
43
46
|
].filter(Boolean).join(' '),
|
|
44
47
|
ref: ref,
|
|
45
|
-
|
|
48
|
+
style: {
|
|
49
|
+
opacity: '0'
|
|
50
|
+
}
|
|
46
51
|
}, /*#__PURE__*/ React.createElement("div", {
|
|
47
52
|
className: "tooltip-content"
|
|
48
53
|
}, children)), /*#__PURE__*/ React.createElement("aside", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/elements/Tooltip/index.tsx"],"sourcesContent":["'use client'\nimport React, { useEffect } from 'react'\n\nimport { useIntersect } from '../../hooks/useIntersect.js'\nimport './index.scss'\n\nexport type Props = {\n alignCaret?: 'center' | 'left' | 'right'\n boundingRef?: React.RefObject<HTMLElement>\n children: React.ReactNode\n className?: string\n delay?: number\n show?: boolean\n}\n\nexport const Tooltip: React.FC<Props> = (props) => {\n const {\n alignCaret = 'center',\n boundingRef,\n children,\n className,\n delay = 350,\n show: showFromProps = true,\n } = props\n\n const [show, setShow] = React.useState(showFromProps)\n const [position, setPosition] = React.useState<'bottom' | 'top'>('top')\n\n const getTitleAttribute = (content) => (typeof content === 'string' ? content : '')\n\n const [ref, intersectionEntry] = useIntersect({\n
|
|
1
|
+
{"version":3,"sources":["../../../src/elements/Tooltip/index.tsx"],"sourcesContent":["'use client'\nimport React, { useEffect } from 'react'\n\nimport { useIntersect } from '../../hooks/useIntersect.js'\nimport './index.scss'\n\nexport type Props = {\n alignCaret?: 'center' | 'left' | 'right'\n boundingRef?: React.RefObject<HTMLElement>\n children: React.ReactNode\n className?: string\n delay?: number\n show?: boolean\n /**\n * If the tooltip position should not change depending on if the toolbar is outside the boundingRef. @default false\n */\n staticPositioning?: boolean\n}\n\nexport const Tooltip: React.FC<Props> = (props) => {\n const {\n alignCaret = 'center',\n boundingRef,\n children,\n className,\n delay = 350,\n show: showFromProps = true,\n staticPositioning = false,\n } = props\n\n const [show, setShow] = React.useState(showFromProps)\n const [position, setPosition] = React.useState<'bottom' | 'top'>('top')\n\n const getTitleAttribute = (content) => (typeof content === 'string' ? content : '')\n\n const [ref, intersectionEntry] = useIntersect(\n {\n root: boundingRef?.current || null,\n rootMargin: '-145px 0px 0px 100px',\n threshold: 0,\n },\n staticPositioning,\n )\n\n useEffect(() => {\n let timerId: NodeJS.Timeout\n\n // do not use the delay on transition-out\n if (delay && showFromProps) {\n timerId = setTimeout(() => {\n setShow(showFromProps)\n }, delay)\n } else {\n setShow(showFromProps)\n }\n\n return () => {\n if (timerId) clearTimeout(timerId)\n }\n }, [showFromProps, delay])\n\n useEffect(() => {\n if (staticPositioning) return\n setPosition(intersectionEntry?.isIntersecting ? 'top' : 'bottom')\n }, [intersectionEntry, staticPositioning])\n\n // The first aside is always on top. The purpose of that is that it can reliably be used for the interaction observer (as it's not moving around), to calculate the position of the actual tooltip.\n return (\n <React.Fragment>\n {!staticPositioning && (\n <aside\n aria-hidden=\"true\"\n className={['tooltip', className, `tooltip--caret-${alignCaret}`, 'tooltip--position-top']\n .filter(Boolean)\n .join(' ')}\n ref={ref}\n style={{ opacity: '0' }}\n >\n <div className=\"tooltip-content\">{children}</div>\n </aside>\n )}\n <aside\n className={[\n 'tooltip',\n className,\n show && 'tooltip--show',\n `tooltip--caret-${alignCaret}`,\n `tooltip--position-${position}`,\n ]\n .filter(Boolean)\n .join(' ')}\n title={getTitleAttribute(children)}\n >\n <div className=\"tooltip-content\">{children}</div>\n </aside>\n </React.Fragment>\n )\n}\n"],"names":["React","useEffect","useIntersect","Tooltip","props","alignCaret","boundingRef","children","className","delay","show","showFromProps","staticPositioning","setShow","useState","position","setPosition","getTitleAttribute","content","ref","intersectionEntry","root","current","rootMargin","threshold","timerId","setTimeout","clearTimeout","isIntersecting","Fragment","aside","aria-hidden","filter","Boolean","join","style","opacity","div","title"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA;AACA,OAAOA,SAASC,SAAS,QAAQ,QAAO;AAExC,SAASC,YAAY,QAAQ,8BAA6B;AAgB1D,OAAO,MAAMC,UAA2B,CAACC;IACvC,MAAM,EACJC,aAAa,QAAQ,EACrBC,WAAW,EACXC,QAAQ,EACRC,SAAS,EACTC,QAAQ,GAAG,EACXC,MAAMC,gBAAgB,IAAI,EAC1BC,oBAAoB,KAAK,EAC1B,GAAGR;IAEJ,MAAM,CAACM,MAAMG,QAAQ,GAAGb,MAAMc,QAAQ,CAACH;IACvC,MAAM,CAACI,UAAUC,YAAY,GAAGhB,MAAMc,QAAQ,CAAmB;IAEjE,MAAMG,oBAAoB,CAACC,UAAa,OAAOA,YAAY,WAAWA,UAAU;IAEhF,MAAM,CAACC,KAAKC,kBAAkB,GAAGlB,aAC/B;QACEmB,MAAMf,aAAagB,WAAW;QAC9BC,YAAY;QACZC,WAAW;IACb,GACAZ;IAGFX,UAAU;QACR,IAAIwB;QAEJ,yCAAyC;QACzC,IAAIhB,SAASE,eAAe;YAC1Bc,UAAUC,WAAW;gBACnBb,QAAQF;YACV,GAAGF;QACL,OAAO;YACLI,QAAQF;QACV;QAEA,OAAO;YACL,IAAIc,SAASE,aAAaF;QAC5B;IACF,GAAG;QAACd;QAAeF;KAAM;IAEzBR,UAAU;QACR,IAAIW,mBAAmB;QACvBI,YAAYI,mBAAmBQ,iBAAiB,QAAQ;IAC1D,GAAG;QAACR;QAAmBR;KAAkB;IAEzC,mMAAmM;IACnM,qBACE,oBAACZ,MAAM6B,QAAQ,QACZ,CAACjB,mCACA,oBAACkB;QACCC,eAAY;QACZvB,WAAW;YAAC;YAAWA;YAAW,CAAC,eAAe,EAAEH,WAAW,CAAC;YAAE;SAAwB,CACvF2B,MAAM,CAACC,SACPC,IAAI,CAAC;QACRf,KAAKA;QACLgB,OAAO;YAAEC,SAAS;QAAI;qBAEtB,oBAACC;QAAI7B,WAAU;OAAmBD,0BAGtC,oBAACuB;QACCtB,WAAW;YACT;YACAA;YACAE,QAAQ;YACR,CAAC,eAAe,EAAEL,WAAW,CAAC;YAC9B,CAAC,kBAAkB,EAAEU,SAAS,CAAC;SAChC,CACEiB,MAAM,CAACC,SACPC,IAAI,CAAC;QACRI,OAAOrB,kBAAkBV;qBAEzB,oBAAC8B;QAAI7B,WAAU;OAAmBD;AAI1C,EAAC"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
opacity: 0;
|
|
7
7
|
background-color: var(--theme-elevation-800);
|
|
8
8
|
position: absolute;
|
|
9
|
-
z-index:
|
|
9
|
+
z-index: 3;
|
|
10
10
|
left: 50%;
|
|
11
11
|
padding: base(0.2) base(0.4);
|
|
12
12
|
color: var(--theme-elevation-0);
|
|
@@ -52,8 +52,9 @@
|
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
+
|
|
55
56
|
&--position-top {
|
|
56
|
-
|
|
57
|
+
top: calc(var(--base) * -0.6 - 13px);
|
|
57
58
|
transform: translate3d(-50%, calc(var(--caret-size) * -1), 0);
|
|
58
59
|
|
|
59
60
|
&::after {
|
|
@@ -62,8 +63,9 @@
|
|
|
62
63
|
}
|
|
63
64
|
}
|
|
64
65
|
|
|
66
|
+
|
|
65
67
|
&--position-bottom {
|
|
66
|
-
|
|
68
|
+
bottom: calc(var(--base) * -0.6 - 13px);
|
|
67
69
|
transform: translate3d(-50%, var(--caret-size), 0);
|
|
68
70
|
|
|
69
71
|
&::after {
|
|
@@ -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,
|
|
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"}
|
|
@@ -82,7 +82,7 @@ export const Upload = (props)=>{
|
|
|
82
82
|
}, [
|
|
83
83
|
setValue
|
|
84
84
|
]);
|
|
85
|
-
const onEditsSave = React.useCallback(({ crop,
|
|
85
|
+
const onEditsSave = React.useCallback(({ crop, focalPosition })=>{
|
|
86
86
|
setCrop({
|
|
87
87
|
x: crop.x || 0,
|
|
88
88
|
y: crop.y || 0
|
|
@@ -95,9 +95,9 @@ export const Upload = (props)=>{
|
|
|
95
95
|
dispatchFormQueryParams({
|
|
96
96
|
type: 'SET',
|
|
97
97
|
params: {
|
|
98
|
-
uploadEdits: crop ||
|
|
98
|
+
uploadEdits: crop || focalPosition ? {
|
|
99
99
|
crop: crop || null,
|
|
100
|
-
focalPoint:
|
|
100
|
+
focalPoint: focalPosition ? focalPosition : null
|
|
101
101
|
} : null
|
|
102
102
|
}
|
|
103
103
|
});
|
|
@@ -133,8 +133,10 @@ export const Upload = (props)=>{
|
|
|
133
133
|
const canRemoveUpload = docPermissions?.update?.permission && 'delete' in docPermissions && docPermissions?.delete?.permission;
|
|
134
134
|
const hasImageSizes = uploadConfig?.imageSizes?.length > 0;
|
|
135
135
|
const hasResizeOptions = Boolean(uploadConfig?.resizeOptions);
|
|
136
|
+
// Explicity check if set to true, default is undefined
|
|
137
|
+
const focalPointEnabled = uploadConfig?.focalPoint === true;
|
|
136
138
|
const { crop: showCrop = true, focalPoint = true } = uploadConfig;
|
|
137
|
-
const showFocalPoint = focalPoint && (hasImageSizes || hasResizeOptions);
|
|
139
|
+
const showFocalPoint = focalPoint && (hasImageSizes || hasResizeOptions || focalPointEnabled);
|
|
138
140
|
const lastSubmittedTime = submitted ? new Date().toISOString() : null;
|
|
139
141
|
return /*#__PURE__*/ React.createElement("div", {
|
|
140
142
|
className: [
|
|
@@ -185,14 +187,13 @@ export const Upload = (props)=>{
|
|
|
185
187
|
Header: null,
|
|
186
188
|
slug: editDrawerSlug
|
|
187
189
|
}, /*#__PURE__*/ React.createElement(EditUpload, {
|
|
188
|
-
doc: doc || undefined,
|
|
189
190
|
fileName: value?.name || doc?.filename,
|
|
190
191
|
fileSrc: fileSrc || doc?.url,
|
|
191
192
|
imageCacheTag: lastSubmittedTime,
|
|
192
193
|
initialCrop: formQueryParams?.uploadEdits?.crop ?? {},
|
|
193
194
|
initialFocalPoint: {
|
|
194
|
-
x: formQueryParams?.uploadEdits?.focalPoint.x ||
|
|
195
|
-
y: formQueryParams?.uploadEdits?.focalPoint.y ||
|
|
195
|
+
x: formQueryParams?.uploadEdits?.focalPoint.x || doc.focalX || 50,
|
|
196
|
+
y: formQueryParams?.uploadEdits?.focalPoint.y || doc.focalY || 50
|
|
196
197
|
},
|
|
197
198
|
onSave: onEditsSave,
|
|
198
199
|
showCrop: showCrop,
|