From 180ddd85302675671426e096a89dc654c0f9fd09 Mon Sep 17 00:00:00 2001 From: DonnyLe <98658081+DonnyLe@users.noreply.github.com> Date: Sat, 25 Jan 2025 20:02:02 -0500 Subject: [PATCH 1/6] Added checkbox input Made a button that adds a square box to represent the checkboxes. --- .../DraggableSignature.tsx | 2 +- .../DraggableText.tsx | 14 ++- .../createFormTemplateEditor/FormEditor.tsx | 89 ++++++++++++++++--- apps/web/src/static/icons.tsx | 18 ++++ 4 files changed, 105 insertions(+), 18 deletions(-) diff --git a/apps/web/src/components/createFormTemplate/createFormTemplateEditor/DraggableSignature.tsx b/apps/web/src/components/createFormTemplate/createFormTemplateEditor/DraggableSignature.tsx index 404f33c5..14652713 100644 --- a/apps/web/src/components/createFormTemplate/createFormTemplateEditor/DraggableSignature.tsx +++ b/apps/web/src/components/createFormTemplate/createFormTemplateEditor/DraggableSignature.tsx @@ -27,7 +27,7 @@ export default function DraggableSignature({ display: 'inline-block', cursor: 'pointer', padding: 4, - }, + }, }; return ( diff --git a/apps/web/src/components/createFormTemplate/createFormTemplateEditor/DraggableText.tsx b/apps/web/src/components/createFormTemplate/createFormTemplateEditor/DraggableText.tsx index d387db81..b257213b 100644 --- a/apps/web/src/components/createFormTemplate/createFormTemplateEditor/DraggableText.tsx +++ b/apps/web/src/components/createFormTemplate/createFormTemplateEditor/DraggableText.tsx @@ -1,6 +1,6 @@ import { Rnd, RndResizeCallback } from 'react-rnd'; import { DraggableEventHandler } from 'react-draggable'; -import { TextFieldPosition } from './FormEditor'; +import { FieldType, TextFieldPosition } from './FormEditor'; import { FaTimes } from 'react-icons/fa'; export default function DraggableText({ @@ -10,6 +10,7 @@ export default function DraggableText({ onRemove, currentPosition, disableEdit, + type, }: { onStop: DraggableEventHandler; onResizeStop: RndResizeCallback; @@ -18,14 +19,21 @@ export default function DraggableText({ onRemove: () => void; currentPosition: TextFieldPosition; disableEdit: boolean; + type: FieldType; }) { return ( ; // index = page num (zero indexing) export type FormFields = Record< number, - Map + Map< + fieldId, + { position: TextFieldPosition; groupId: string; type: FieldType } + > >; export const FormEditor = ({ @@ -60,13 +69,9 @@ export const FormEditor = ({ ['#A16308', '#FFFDDB'], ]; - const handleAddField = () => { + const handleAddTextField = () => { if (fieldGroups.size > 0 && documentRef.current && !disableEdit) { - const container = documentRef.current; - const { scrollLeft, scrollTop, clientWidth, clientHeight } = container; - - const centerX = scrollLeft + clientWidth / 2; - const centerY = scrollTop + clientHeight / 2; + const { centerX, centerY } = convertCoordinates(documentRef.current); setFormFields({ ...formFields, @@ -82,6 +87,33 @@ export const FormEditor = ({ height: 30, }, groupId: currentGroup, + type: FieldType.Text, + }, + ], + ]), + }); + } + }; + + const handleAddCheckbox = () => { + if (fieldGroups.size > 0 && documentRef.current && !disableEdit) { + const { centerX, centerY } = convertCoordinates(documentRef.current); + + setFormFields({ + ...formFields, + [pageNum]: new Map([ + ...formFields[pageNum], + [ + uuidv4(), + { + position: { + x: centerX - 40, + y: centerY - 15, + width: 10, + height: 10, + }, + groupId: currentGroup, + type: FieldType.Checkbox, }, ], ]), @@ -108,11 +140,15 @@ export const FormEditor = ({ pos: TextFieldPosition, ) => { if (disableEdit) return; - + console.log(pos.x, pos.y); setFormFields({ ...formFields, [pageNum]: new Map([ - ...formFields[pageNum].set(fieldId, { position: pos, groupId }), + ...formFields[pageNum].set(fieldId, { + position: pos, + groupId: groupId, + type: formFields[pageNum].get(fieldId)?.type ?? FieldType.Text, + }), ]), }); }; @@ -133,6 +169,13 @@ export const FormEditor = ({ } }; + const convertCoordinates = (container: HTMLDivElement) => { + const { scrollLeft, scrollTop, clientWidth, clientHeight } = container; + const centerX = scrollLeft + clientWidth / 2; + const centerY = scrollTop + clientHeight / 2; + return { centerX, centerY }; + }; + return (
{TextIcon}
+
( { handleRemoveField(fieldId); @@ -299,9 +360,9 @@ export const FormEditor = ({ width: Number.isNaN(newWidth) ? position.width : newWidth, - height: Number.isNaN(newHeight) - ? position.height - : newHeight, + height: Number.isNaN(newWidth) + ? position.width + : newWidth, x: pos.x, y: pos.y, }); diff --git a/apps/web/src/static/icons.tsx b/apps/web/src/static/icons.tsx index 42fa56e8..bdfa3878 100644 --- a/apps/web/src/static/icons.tsx +++ b/apps/web/src/static/icons.tsx @@ -390,6 +390,24 @@ export const CalendarClockIcon = ( ); +export const Checkbox = ( + + + + + + +); export const UploadIcon = createIcon({ displayName: 'UploadIcon', From ac1747f265bc9084bbba184901ec0fa21fc26237 Mon Sep 17 00:00:00 2001 From: DonnyLe <98658081+DonnyLe@users.noreply.github.com> Date: Sat, 25 Jan 2025 20:08:17 -0500 Subject: [PATCH 2/6] Added delete toggle --- .../createFormTemplateEditor/DraggableText.tsx | 4 +++- .../createFormTemplateEditor/FormEditor.tsx | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/apps/web/src/components/createFormTemplate/createFormTemplateEditor/DraggableText.tsx b/apps/web/src/components/createFormTemplate/createFormTemplateEditor/DraggableText.tsx index b257213b..1d4a415a 100644 --- a/apps/web/src/components/createFormTemplate/createFormTemplateEditor/DraggableText.tsx +++ b/apps/web/src/components/createFormTemplate/createFormTemplateEditor/DraggableText.tsx @@ -11,6 +11,7 @@ export default function DraggableText({ currentPosition, disableEdit, type, + disableDelete, }: { onStop: DraggableEventHandler; onResizeStop: RndResizeCallback; @@ -20,6 +21,7 @@ export default function DraggableText({ currentPosition: TextFieldPosition; disableEdit: boolean; type: FieldType; + disableDelete: boolean; }) { return ( - {!disableEdit && ( + {!disableEdit && disableDelete && (
(null); const [groupNum, setGroupNum] = useState(fieldGroups.size); + const [deleteFields, setDeleteFields] = useState(false); //colors for group buttons: colors[0] = border/text color, colors[1] = background color const groupColors = [ @@ -290,6 +291,20 @@ export const FormEditor = ({ >
{Checkbox}
+ ( Date: Sat, 25 Jan 2025 20:16:03 -0500 Subject: [PATCH 3/6] Update DraggableText.tsx --- .../createFormTemplateEditor/DraggableText.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/web/src/components/createFormTemplate/createFormTemplateEditor/DraggableText.tsx b/apps/web/src/components/createFormTemplate/createFormTemplateEditor/DraggableText.tsx index 1d4a415a..4bf42da1 100644 --- a/apps/web/src/components/createFormTemplate/createFormTemplateEditor/DraggableText.tsx +++ b/apps/web/src/components/createFormTemplate/createFormTemplateEditor/DraggableText.tsx @@ -29,13 +29,13 @@ export default function DraggableText({ bounds="parent" position={{ x: currentPosition.x, y: currentPosition.y }} size={{ height: currentPosition.height, width: currentPosition.width }} - minWidth={type == FieldType.Checkbox ? '30px' : '50px'} + minWidth={type == FieldType.Checkbox ? '10px' : '50px'} enableResizing={ type == FieldType.Checkbox ? { left: false, right: false, top: false, bottom: false } : {} } - minHeight={type == FieldType.Checkbox ? '30px' : '40px'} + minHeight={type == FieldType.Checkbox ? '10px' : '40px'} style={{ position: 'absolute', zIndex: 100000, From b40db01b6d210d23705da8cefa2136c3ca289ee7 Mon Sep 17 00:00:00 2001 From: DonnyLe <98658081+DonnyLe@users.noreply.github.com> Date: Sat, 25 Jan 2025 22:09:13 -0500 Subject: [PATCH 4/6] Update DraggableSignature.tsx --- .../createFormTemplateEditor/DraggableSignature.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/src/components/createFormTemplate/createFormTemplateEditor/DraggableSignature.tsx b/apps/web/src/components/createFormTemplate/createFormTemplateEditor/DraggableSignature.tsx index 14652713..404f33c5 100644 --- a/apps/web/src/components/createFormTemplate/createFormTemplateEditor/DraggableSignature.tsx +++ b/apps/web/src/components/createFormTemplate/createFormTemplateEditor/DraggableSignature.tsx @@ -27,7 +27,7 @@ export default function DraggableSignature({ display: 'inline-block', cursor: 'pointer', padding: 4, - }, + }, }; return ( From af25a1532fa920bff972175129fd974292221c63 Mon Sep 17 00:00:00 2001 From: DonnyLe <98658081+DonnyLe@users.noreply.github.com> Date: Sun, 2 Feb 2025 15:36:27 -0500 Subject: [PATCH 5/6] adjusted for comments and refactored some stuff --- .../createFormTemplate/ReviewBox.tsx | 3 +- .../{DraggableText.tsx => CheckBox.tsx} | 28 ++++---- .../DraggableSignature.tsx | 46 ------------- .../DraggableTextFactory.tsx | 49 ++++++++++++++ .../createFormTemplateEditor/FormEditor.tsx | 53 ++++++--------- .../createFormTemplateEditor/TextField.tsx | 64 +++++++++++++++++++ .../components/createFormTemplate/types.ts | 31 +++++++++ .../src/context/CreateFormTemplateContext.tsx | 2 +- apps/web/src/context/types.ts | 2 +- 9 files changed, 183 insertions(+), 95 deletions(-) rename apps/web/src/components/createFormTemplate/createFormTemplateEditor/{DraggableText.tsx => CheckBox.tsx} (73%) delete mode 100644 apps/web/src/components/createFormTemplate/createFormTemplateEditor/DraggableSignature.tsx create mode 100644 apps/web/src/components/createFormTemplate/createFormTemplateEditor/DraggableTextFactory.tsx create mode 100644 apps/web/src/components/createFormTemplate/createFormTemplateEditor/TextField.tsx diff --git a/apps/web/src/components/createFormTemplate/ReviewBox.tsx b/apps/web/src/components/createFormTemplate/ReviewBox.tsx index 6c04505f..6d34705b 100644 --- a/apps/web/src/components/createFormTemplate/ReviewBox.tsx +++ b/apps/web/src/components/createFormTemplate/ReviewBox.tsx @@ -1,5 +1,6 @@ import { Box, Text, Flex } from '@chakra-ui/react'; -import { FormEditor, FieldGroups } from './createFormTemplateEditor/FormEditor'; +import { FormEditor } from './createFormTemplateEditor/FormEditor'; +import { FieldGroups } from './types'; import { useCreateFormTemplate } from '../../context/CreateFormTemplateContext'; /** diff --git a/apps/web/src/components/createFormTemplate/createFormTemplateEditor/DraggableText.tsx b/apps/web/src/components/createFormTemplate/createFormTemplateEditor/CheckBox.tsx similarity index 73% rename from apps/web/src/components/createFormTemplate/createFormTemplateEditor/DraggableText.tsx rename to apps/web/src/components/createFormTemplate/createFormTemplateEditor/CheckBox.tsx index 4bf42da1..c59ac5aa 100644 --- a/apps/web/src/components/createFormTemplate/createFormTemplateEditor/DraggableText.tsx +++ b/apps/web/src/components/createFormTemplate/createFormTemplateEditor/CheckBox.tsx @@ -1,41 +1,43 @@ import { Rnd, RndResizeCallback } from 'react-rnd'; import { DraggableEventHandler } from 'react-draggable'; -import { FieldType, TextFieldPosition } from './FormEditor'; +import { FieldType, TextFieldPosition } from '../types'; import { FaTimes } from 'react-icons/fa'; -export default function DraggableText({ +export default function Checkbox({ onStop, onResizeStop, color, onRemove, currentPosition, disableEdit, - type, disableDelete, }: { onStop: DraggableEventHandler; onResizeStop: RndResizeCallback; - initialText: string | null; color: string; onRemove: () => void; currentPosition: TextFieldPosition; disableEdit: boolean; - type: FieldType; disableDelete: boolean; }) { return ( void; - onCancel: () => void; - url: string; -}) { - const styles = { - container: { - Position: 'absolute', - zIndex: 100000, - border: `2px solid gray`, - }, - controls: { - Position: 'absolute', - right: 0, - display: 'inline-block', - backgroundColor: 'white', - }, - smallButton: { - display: 'inline-block', - cursor: 'pointer', - padding: 4, - }, - }; - return ( - -
-
-
- Set{' '} -
-
- Cancel -
-
-
-
- ); -} diff --git a/apps/web/src/components/createFormTemplate/createFormTemplateEditor/DraggableTextFactory.tsx b/apps/web/src/components/createFormTemplate/createFormTemplateEditor/DraggableTextFactory.tsx new file mode 100644 index 00000000..b6ddf380 --- /dev/null +++ b/apps/web/src/components/createFormTemplate/createFormTemplateEditor/DraggableTextFactory.tsx @@ -0,0 +1,49 @@ +import { Rnd, RndResizeCallback } from 'react-rnd'; +import { DraggableEventHandler } from 'react-draggable'; +import { FieldType, TextFieldPosition } from '../types'; +import { FaTimes } from 'react-icons/fa'; +import Checkbox from './CheckBox'; +import TextField from './TextField'; + +export default function DraggableTextFactory({ + onStop, + onResizeStop, + color, + onRemove, + currentPosition, + disableEdit, + type, + disableDelete, +}: { + onStop: DraggableEventHandler; + onResizeStop: RndResizeCallback; + initialText: string | null; + color: string; + onRemove: () => void; + currentPosition: TextFieldPosition; + disableEdit: boolean; + type: FieldType; + disableDelete: boolean; +}) { + return type === FieldType.Checkbox ? ( + + ) : ( + + ); +} diff --git a/apps/web/src/components/createFormTemplate/createFormTemplateEditor/FormEditor.tsx b/apps/web/src/components/createFormTemplate/createFormTemplateEditor/FormEditor.tsx index c2aefbe1..88d8e9ed 100644 --- a/apps/web/src/components/createFormTemplate/createFormTemplateEditor/FormEditor.tsx +++ b/apps/web/src/components/createFormTemplate/createFormTemplateEditor/FormEditor.tsx @@ -5,42 +5,12 @@ import { TextIcon, PlusSign, Checkbox } from 'apps/web/src/static/icons'; import { DraggableData, DraggableEvent } from 'react-draggable'; import PagingControl from './PagingControl'; import { v4 as uuidv4 } from 'uuid'; -import DraggableText from './DraggableText'; +import DraggableTextFactory from './DraggableTextFactory'; import { useCreateFormTemplate } from 'apps/web/src/context/CreateFormTemplateContext'; +import { FieldType, TextFieldPosition, FormFields } from '../types'; pdfjs.GlobalWorkerOptions.workerSrc = `https://cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.min.js`; -export type TextFieldPosition = { - x: number; - y: number; - width: number; - height: number; -}; - -export enum FieldType { - Text, - Checkbox, - Signature, -} - -type FieldGroupColor = { - border: string; - background: string; -}; - -type groupId = string; -type fieldId = string; -export type FieldGroups = Map; - -// index = page num (zero indexing) -export type FormFields = Record< - number, - Map< - fieldId, - { position: TextFieldPosition; groupId: string; type: FieldType } - > ->; - export const FormEditor = ({ formTemplateName, pdfUrl, @@ -170,6 +140,7 @@ export const FormEditor = ({ } }; + // converts HTML web coordinates to PDF coordinates const convertCoordinates = (container: HTMLDivElement) => { const { scrollLeft, scrollTop, clientWidth, clientHeight } = container; const centerX = scrollLeft + clientWidth / 2; @@ -291,6 +262,22 @@ export const FormEditor = ({ >
{Checkbox}
+
+