@embedpdf/plugin-form 2.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/index.cjs +2 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1789 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/actions.d.ts +33 -0
- package/dist/lib/form-plugin.d.ts +59 -0
- package/dist/lib/handlers/checkbox.handler.d.ts +3 -0
- package/dist/lib/handlers/combobox.handler.d.ts +3 -0
- package/dist/lib/handlers/index.d.ts +5 -0
- package/dist/lib/handlers/listbox.handler.d.ts +3 -0
- package/dist/lib/handlers/radio-button.handler.d.ts +3 -0
- package/dist/lib/handlers/text-field.handler.d.ts +3 -0
- package/dist/lib/index.d.ts +10 -0
- package/dist/lib/manifest.d.ts +4 -0
- package/dist/lib/reducer.d.ts +6 -0
- package/dist/lib/tools.d.ts +457 -0
- package/dist/lib/types.d.ts +98 -0
- package/dist/preact/adapter.d.ts +13 -0
- package/dist/preact/annotation.d.ts +1 -0
- package/dist/preact/core.d.ts +1 -0
- package/dist/preact/index.cjs +2 -0
- package/dist/preact/index.cjs.map +1 -0
- package/dist/preact/index.d.ts +1 -0
- package/dist/preact/index.js +1359 -0
- package/dist/preact/index.js.map +1 -0
- package/dist/react/adapter.d.ts +6 -0
- package/dist/react/annotation.d.ts +1 -0
- package/dist/react/core.d.ts +1 -0
- package/dist/react/index.cjs +2 -0
- package/dist/react/index.cjs.map +1 -0
- package/dist/react/index.d.ts +1 -0
- package/dist/react/index.js +1358 -0
- package/dist/react/index.js.map +1 -0
- package/dist/shared/components/annotations/form-checkbox.d.ts +12 -0
- package/dist/shared/components/annotations/form-combobox.d.ts +12 -0
- package/dist/shared/components/annotations/form-listbox.d.ts +12 -0
- package/dist/shared/components/annotations/form-radio-button.d.ts +12 -0
- package/dist/shared/components/annotations/form-text-field.d.ts +12 -0
- package/dist/shared/components/fields/checkbox.d.ts +2 -0
- package/dist/shared/components/fields/combobox.d.ts +2 -0
- package/dist/shared/components/fields/listbox.d.ts +2 -0
- package/dist/shared/components/fields/push-button.d.ts +2 -0
- package/dist/shared/components/fields/radio-button.d.ts +2 -0
- package/dist/shared/components/fields/style.d.ts +6 -0
- package/dist/shared/components/fields/text.d.ts +2 -0
- package/dist/shared/components/fill-mode/combobox-fill-mode.d.ts +3 -0
- package/dist/shared/components/fill-mode/listbox-fill-mode.d.ts +3 -0
- package/dist/shared/components/fill-mode/push-button-fill-mode.d.ts +3 -0
- package/dist/shared/components/fill-mode/radio-button-fill-mode.d.ts +3 -0
- package/dist/shared/components/fill-mode/text-fill-mode.d.ts +3 -0
- package/dist/shared/components/fill-mode/toggle-fill-mode.d.ts +3 -0
- package/dist/shared/components/form-renderer-registration.d.ts +5 -0
- package/dist/shared/components/form-renderers.d.ts +9 -0
- package/dist/shared/components/index.d.ts +2 -0
- package/dist/shared/components/render-widget.d.ts +12 -0
- package/dist/shared/components/types.d.ts +42 -0
- package/dist/shared/hooks/index.d.ts +1 -0
- package/dist/shared/hooks/use-form-widget-state.d.ts +12 -0
- package/dist/shared/hooks/use-form.d.ts +16 -0
- package/dist/shared/index.d.ts +4 -0
- package/dist/shared-preact/components/annotations/form-checkbox.d.ts +12 -0
- package/dist/shared-preact/components/annotations/form-combobox.d.ts +12 -0
- package/dist/shared-preact/components/annotations/form-listbox.d.ts +12 -0
- package/dist/shared-preact/components/annotations/form-radio-button.d.ts +12 -0
- package/dist/shared-preact/components/annotations/form-text-field.d.ts +12 -0
- package/dist/shared-preact/components/fields/checkbox.d.ts +2 -0
- package/dist/shared-preact/components/fields/combobox.d.ts +2 -0
- package/dist/shared-preact/components/fields/listbox.d.ts +2 -0
- package/dist/shared-preact/components/fields/push-button.d.ts +2 -0
- package/dist/shared-preact/components/fields/radio-button.d.ts +2 -0
- package/dist/shared-preact/components/fields/style.d.ts +6 -0
- package/dist/shared-preact/components/fields/text.d.ts +2 -0
- package/dist/shared-preact/components/fill-mode/combobox-fill-mode.d.ts +3 -0
- package/dist/shared-preact/components/fill-mode/listbox-fill-mode.d.ts +3 -0
- package/dist/shared-preact/components/fill-mode/push-button-fill-mode.d.ts +3 -0
- package/dist/shared-preact/components/fill-mode/radio-button-fill-mode.d.ts +3 -0
- package/dist/shared-preact/components/fill-mode/text-fill-mode.d.ts +3 -0
- package/dist/shared-preact/components/fill-mode/toggle-fill-mode.d.ts +3 -0
- package/dist/shared-preact/components/form-renderer-registration.d.ts +5 -0
- package/dist/shared-preact/components/form-renderers.d.ts +9 -0
- package/dist/shared-preact/components/index.d.ts +2 -0
- package/dist/shared-preact/components/render-widget.d.ts +12 -0
- package/dist/shared-preact/components/types.d.ts +42 -0
- package/dist/shared-preact/hooks/index.d.ts +1 -0
- package/dist/shared-preact/hooks/use-form-widget-state.d.ts +12 -0
- package/dist/shared-preact/hooks/use-form.d.ts +16 -0
- package/dist/shared-preact/index.d.ts +4 -0
- package/dist/shared-react/components/annotations/form-checkbox.d.ts +12 -0
- package/dist/shared-react/components/annotations/form-combobox.d.ts +12 -0
- package/dist/shared-react/components/annotations/form-listbox.d.ts +12 -0
- package/dist/shared-react/components/annotations/form-radio-button.d.ts +12 -0
- package/dist/shared-react/components/annotations/form-text-field.d.ts +12 -0
- package/dist/shared-react/components/fields/checkbox.d.ts +2 -0
- package/dist/shared-react/components/fields/combobox.d.ts +2 -0
- package/dist/shared-react/components/fields/listbox.d.ts +2 -0
- package/dist/shared-react/components/fields/push-button.d.ts +2 -0
- package/dist/shared-react/components/fields/radio-button.d.ts +2 -0
- package/dist/shared-react/components/fields/style.d.ts +6 -0
- package/dist/shared-react/components/fields/text.d.ts +2 -0
- package/dist/shared-react/components/fill-mode/combobox-fill-mode.d.ts +3 -0
- package/dist/shared-react/components/fill-mode/listbox-fill-mode.d.ts +3 -0
- package/dist/shared-react/components/fill-mode/push-button-fill-mode.d.ts +3 -0
- package/dist/shared-react/components/fill-mode/radio-button-fill-mode.d.ts +3 -0
- package/dist/shared-react/components/fill-mode/text-fill-mode.d.ts +3 -0
- package/dist/shared-react/components/fill-mode/toggle-fill-mode.d.ts +3 -0
- package/dist/shared-react/components/form-renderer-registration.d.ts +5 -0
- package/dist/shared-react/components/form-renderers.d.ts +9 -0
- package/dist/shared-react/components/index.d.ts +2 -0
- package/dist/shared-react/components/render-widget.d.ts +12 -0
- package/dist/shared-react/components/types.d.ts +42 -0
- package/dist/shared-react/hooks/index.d.ts +1 -0
- package/dist/shared-react/hooks/use-form-widget-state.d.ts +12 -0
- package/dist/shared-react/hooks/use-form.d.ts +16 -0
- package/dist/shared-react/index.d.ts +4 -0
- package/dist/svelte/components/FormRendererRegistration.svelte.d.ts +18 -0
- package/dist/svelte/components/RenderWidget.svelte.d.ts +11 -0
- package/dist/svelte/components/annotations/FormCheckbox.svelte.d.ts +5 -0
- package/dist/svelte/components/annotations/FormCombobox.svelte.d.ts +5 -0
- package/dist/svelte/components/annotations/FormListbox.svelte.d.ts +5 -0
- package/dist/svelte/components/annotations/FormRadioButton.svelte.d.ts +5 -0
- package/dist/svelte/components/annotations/FormTextField.svelte.d.ts +5 -0
- package/dist/svelte/components/fields/ComboboxField.svelte.d.ts +4 -0
- package/dist/svelte/components/fields/ListboxField.svelte.d.ts +4 -0
- package/dist/svelte/components/fields/TextField.svelte.d.ts +4 -0
- package/dist/svelte/components/fill-mode/ComboboxFillMode.svelte.d.ts +5 -0
- package/dist/svelte/components/fill-mode/ListboxFillMode.svelte.d.ts +5 -0
- package/dist/svelte/components/fill-mode/RadioButtonFillMode.svelte.d.ts +5 -0
- package/dist/svelte/components/fill-mode/TextFillMode.svelte.d.ts +5 -0
- package/dist/svelte/components/fill-mode/ToggleFillMode.svelte.d.ts +5 -0
- package/dist/svelte/components/form-renderers.d.ts +9 -0
- package/dist/svelte/components/previews/CheckboxPreview.svelte.d.ts +9 -0
- package/dist/svelte/components/previews/ListboxPreview.svelte.d.ts +9 -0
- package/dist/svelte/components/previews/RadioButtonPreview.svelte.d.ts +9 -0
- package/dist/svelte/components/previews/TextFieldPreview.svelte.d.ts +9 -0
- package/dist/svelte/hooks/index.d.ts +2 -0
- package/dist/svelte/hooks/use-form-widget-state.svelte.d.ts +12 -0
- package/dist/svelte/hooks/use-form.svelte.d.ts +14 -0
- package/dist/svelte/index.cjs +2 -0
- package/dist/svelte/index.cjs.map +1 -0
- package/dist/svelte/index.d.ts +3 -0
- package/dist/svelte/index.js +1567 -0
- package/dist/svelte/index.js.map +1 -0
- package/dist/vue/components/annotations/form-checkbox.vue.d.ts +6 -0
- package/dist/vue/components/annotations/form-combobox.vue.d.ts +6 -0
- package/dist/vue/components/annotations/form-listbox.vue.d.ts +6 -0
- package/dist/vue/components/annotations/form-radio-button.vue.d.ts +6 -0
- package/dist/vue/components/annotations/form-text-field.vue.d.ts +6 -0
- package/dist/vue/components/fields/combobox-field.vue.d.ts +4 -0
- package/dist/vue/components/fields/listbox-field.vue.d.ts +4 -0
- package/dist/vue/components/fields/style.d.ts +6 -0
- package/dist/vue/components/fields/text-field.vue.d.ts +4 -0
- package/dist/vue/components/fill-mode/combobox-fill-mode.vue.d.ts +6 -0
- package/dist/vue/components/fill-mode/listbox-fill-mode.vue.d.ts +6 -0
- package/dist/vue/components/fill-mode/radio-button-fill-mode.vue.d.ts +6 -0
- package/dist/vue/components/fill-mode/text-fill-mode.vue.d.ts +6 -0
- package/dist/vue/components/fill-mode/toggle-fill-mode.vue.d.ts +6 -0
- package/dist/vue/components/form-renderer-registration.vue.d.ts +13 -0
- package/dist/vue/components/form-renderers.d.ts +3 -0
- package/dist/vue/components/previews/checkbox-preview.vue.d.ts +10 -0
- package/dist/vue/components/previews/listbox-preview.vue.d.ts +10 -0
- package/dist/vue/components/previews/radio-button-preview.vue.d.ts +10 -0
- package/dist/vue/components/previews/text-field-preview.vue.d.ts +10 -0
- package/dist/vue/components/render-widget.vue.d.ts +15 -0
- package/dist/vue/hooks/index.d.ts +2 -0
- package/dist/vue/hooks/use-form-widget-state.d.ts +12 -0
- package/dist/vue/hooks/use-form.d.ts +12 -0
- package/dist/vue/index.cjs +2 -0
- package/dist/vue/index.cjs.map +1 -0
- package/dist/vue/index.d.ts +3 -0
- package/dist/vue/index.js +1643 -0
- package/dist/vue/index.js.map +1 -0
- package/package.json +84 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 CloudPDF
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("@embedpdf/core"),t=require("@embedpdf/models"),o=require("@embedpdf/plugin-history"),n=require("@embedpdf/plugin-annotation"),i="form",a={id:i,name:"Form Plugin",version:"1.0.0",provides:["form"],requires:["interaction-manager"],optional:["history","annotation"],defaultConfig:{enabled:!0}},r="FORM/INIT_STATE",l="FORM/CLEANUP_STATE",s="FORM/SELECT_FIELD",d="FORM/DESELECT_FIELD";function c(e,t){return{type:s,payload:{documentId:e,annotationId:t}}}const u={selectedFieldId:null},f={documents:{}},h={annotationType:t.PdfAnnotationSubtype.WIDGET,create(o){const{pageIndex:i,onCommit:a,onPreview:r,getTool:l,pageSize:s}=o,[d,c]=n.useState(null),u=t=>({x:e.clamp(t.x,0,s.width),y:e.clamp(t.y,0,s.height)}),f=()=>{const e=l();return e?{...e.defaults,fontFamily:e.defaults.fontFamily??t.PdfStandardFont.Helvetica,fontSize:e.defaults.fontSize??12,fontColor:e.defaults.fontColor??"#000000",strokeColor:e.defaults.strokeColor??"#000000",color:e.defaults.color??"#FFFFFF",strokeWidth:e.defaults.strokeWidth??1,field:e.defaults.field}:null},h=(e,t)=>({origin:{x:Math.min(e.x,t.x),y:Math.min(e.y,t.y)},size:{width:Math.abs(e.x-t.x),height:Math.abs(e.y-t.y)}}),g=e=>{var o;const n=f(),a=`TextField_${t.uuidV4().slice(0,8)}`;return{...n,type:t.PdfAnnotationSubtype.WIDGET,id:t.uuidV4(),pageIndex:i,rect:e,created:new Date,fontFamily:n.fontFamily,fontSize:n.fontSize,fontColor:n.fontColor,strokeColor:n.strokeColor,color:n.color,strokeWidth:n.strokeWidth,field:{type:t.PDF_FORM_FIELD_TYPE.TEXTFIELD,flag:(null==(o=n.field)?void 0:o.flag)??t.PDF_FORM_FIELD_FLAG.NONE,name:a,alternateName:a,value:""}}},p=n.useClickDetector({getTool:l,onClickDetected:t=>{if(!f())return;const o=l(),n=null==o?void 0:o.clickBehavior;if(!(null==n?void 0:n.enabled))return;const{width:i,height:r}=n.defaultSize,d=e.clamp(t.x-i/2,0,s.width-i),c=e.clamp(t.y-r/2,0,s.height-r);a(g({origin:{x:d,y:c},size:{width:i,height:r}}))}}),F=e=>{const o=d();if(!o)return null;const n=f();if(!n)return null;const i=h(o,e);return{type:t.PdfAnnotationSubtype.WIDGET,bounds:i,data:{rect:i,...n}}};return{onPointerDown:(e,t)=>{var o;const n=u(e);c(n),p.onStart(n),r(F(n)),null==(o=t.setPointerCapture)||o.call(t)},onPointerMove:e=>{const t=u(e);p.onMove(t),d()&&p.hasMoved()&&r(F(t))},onPointerUp:(e,t)=>{var o;const n=d();if(!n)return;const i=u(e);if(p.hasMoved()){const e=h(n,i);e.size.width>5&&e.size.height>5&&a(g(e))}else p.onEnd(i);c(null),r(null),p.reset(),null==(o=t.releasePointerCapture)||o.call(t)},onPointerLeave:(e,t)=>{var o;c(null),r(null),p.reset(),null==(o=t.releasePointerCapture)||o.call(t)},onPointerCancel:(e,t)=>{var o;c(null),r(null),p.reset(),null==(o=t.releasePointerCapture)||o.call(t)}}}},g={annotationType:t.PdfAnnotationSubtype.WIDGET,create(o){const{pageIndex:i,onCommit:a,onPreview:r,getTool:l,pageSize:s}=o,[d,c]=n.useState(null),u=t=>({x:e.clamp(t.x,0,s.width),y:e.clamp(t.y,0,s.height)}),f=()=>{const e=l();return e?{...e.defaults,strokeColor:e.defaults.strokeColor??"#000000",color:e.defaults.color??"#FFFFFF",strokeWidth:e.defaults.strokeWidth??1,field:e.defaults.field}:null},h=(e,t)=>({origin:{x:Math.min(e.x,t.x),y:Math.min(e.y,t.y)},size:{width:Math.abs(e.x-t.x),height:Math.abs(e.y-t.y)}}),g=e=>{var o;const n=f(),a=`Checkbox_${t.uuidV4().slice(0,8)}`;return{...n,type:t.PdfAnnotationSubtype.WIDGET,id:t.uuidV4(),pageIndex:i,rect:e,created:new Date,strokeColor:n.strokeColor,color:n.color,strokeWidth:n.strokeWidth,exportValue:"Yes",field:{type:t.PDF_FORM_FIELD_TYPE.CHECKBOX,flag:(null==(o=n.field)?void 0:o.flag)??t.PDF_FORM_FIELD_FLAG.NONE,name:a,alternateName:a,value:"Off"}}},p=n.useClickDetector({getTool:l,onClickDetected:t=>{if(!f())return;const o=l(),n=null==o?void 0:o.clickBehavior;if(!(null==n?void 0:n.enabled))return;const{width:i,height:r}=n.defaultSize,d=e.clamp(t.x-i/2,0,s.width-i),c=e.clamp(t.y-r/2,0,s.height-r);a(g({origin:{x:d,y:c},size:{width:i,height:r}}))}}),F=e=>{const o=d();if(!o)return null;const n=f();if(!n)return null;const i=h(o,e);return{type:t.PdfAnnotationSubtype.WIDGET,bounds:i,data:{rect:i,...n}}};return{onPointerDown:(e,t)=>{var o;const n=u(e);c(n),p.onStart(n),r(F(n)),null==(o=t.setPointerCapture)||o.call(t)},onPointerMove:e=>{const t=u(e);p.onMove(t),d()&&p.hasMoved()&&r(F(t))},onPointerUp:(e,t)=>{var o;const n=d();if(!n)return;const i=u(e);if(p.hasMoved()){const e=h(n,i);e.size.width>5&&e.size.height>5&&a(g(e))}else p.onEnd(i);c(null),r(null),p.reset(),null==(o=t.releasePointerCapture)||o.call(t)},onPointerLeave:(e,t)=>{var o;c(null),r(null),p.reset(),null==(o=t.releasePointerCapture)||o.call(t)},onPointerCancel:(e,t)=>{var o;c(null),r(null),p.reset(),null==(o=t.releasePointerCapture)||o.call(t)}}}},p={annotationType:t.PdfAnnotationSubtype.WIDGET,create(o){const{pageIndex:i,onCommit:a,onPreview:r,getTool:l,pageSize:s}=o,[d,c]=n.useState(null),u=t=>({x:e.clamp(t.x,0,s.width),y:e.clamp(t.y,0,s.height)}),f=()=>{const e=l();return e?{...e.defaults,strokeColor:e.defaults.strokeColor??"#000000",color:e.defaults.color??"#FFFFFF",strokeWidth:e.defaults.strokeWidth??1,field:e.defaults.field}:null},h=(e,t)=>{const o=t.x-e.x,n=t.y-e.y,i=Math.max(Math.abs(o),Math.abs(n)),a=o<0?-i:i,r=n<0?-i:i;return{origin:{x:Math.min(e.x,e.x+a),y:Math.min(e.y,e.y+r)},size:{width:i,height:i}}},g=e=>{var o;const n=f(),a=`RadioButton_${t.uuidV4().slice(0,8)}`,r=t.uuidV4();return{...n,type:t.PdfAnnotationSubtype.WIDGET,id:r,pageIndex:i,rect:e,created:new Date,strokeColor:n.strokeColor,color:n.color,strokeWidth:n.strokeWidth,exportValue:r,field:{type:t.PDF_FORM_FIELD_TYPE.RADIOBUTTON,flag:(null==(o=n.field)?void 0:o.flag)??t.PDF_FORM_FIELD_FLAG.BUTTON_RADIO|t.PDF_FORM_FIELD_FLAG.BUTTON_NOTOGGLETOOFF,name:a,alternateName:a,value:"Off",options:[]}}},p=n.useClickDetector({getTool:l,onClickDetected:t=>{if(!f())return;const o=l(),n=null==o?void 0:o.clickBehavior;if(!(null==n?void 0:n.enabled))return;const{width:i,height:r}=n.defaultSize,d=e.clamp(t.x-i/2,0,s.width-i),c=e.clamp(t.y-r/2,0,s.height-r);a(g({origin:{x:d,y:c},size:{width:i,height:r}}))}}),F=e=>{const o=d();if(!o)return null;const n=f();if(!n)return null;const i=h(o,e);return{type:t.PdfAnnotationSubtype.WIDGET,bounds:i,data:{rect:i,...n}}};return{onPointerDown:(e,t)=>{var o;const n=u(e);c(n),p.onStart(n),r(F(n)),null==(o=t.setPointerCapture)||o.call(t)},onPointerMove:e=>{const t=u(e);p.onMove(t),d()&&p.hasMoved()&&r(F(t))},onPointerUp:(e,t)=>{var o;const n=d();if(!n)return;const i=u(e);if(p.hasMoved()){const e=h(n,i);e.size.width>5&&e.size.height>5&&a(g(e))}else p.onEnd(i);c(null),r(null),p.reset(),null==(o=t.releasePointerCapture)||o.call(t)},onPointerLeave:(e,t)=>{var o;c(null),r(null),p.reset(),null==(o=t.releasePointerCapture)||o.call(t)},onPointerCancel:(e,t)=>{var o;c(null),r(null),p.reset(),null==(o=t.releasePointerCapture)||o.call(t)}}}},F={annotationType:t.PdfAnnotationSubtype.WIDGET,create(o){const{pageIndex:i,onCommit:a,onPreview:r,getTool:l,pageSize:s}=o,[d,c]=n.useState(null),u=t=>({x:e.clamp(t.x,0,s.width),y:e.clamp(t.y,0,s.height)}),f=()=>{const e=l();return e?{...e.defaults,fontFamily:e.defaults.fontFamily??t.PdfStandardFont.Helvetica,fontSize:e.defaults.fontSize??12,fontColor:e.defaults.fontColor??"#000000",strokeColor:e.defaults.strokeColor??"#000000",color:e.defaults.color??"#FFFFFF",strokeWidth:e.defaults.strokeWidth??1,field:e.defaults.field}:null},h=(e,t)=>({origin:{x:Math.min(e.x,t.x),y:Math.min(e.y,t.y)},size:{width:Math.abs(e.x-t.x),height:Math.abs(e.y-t.y)}}),g=e=>{var o;const n=f(),a=`Combobox_${t.uuidV4().slice(0,8)}`;return{...n,type:t.PdfAnnotationSubtype.WIDGET,id:t.uuidV4(),pageIndex:i,rect:e,created:new Date,fontFamily:n.fontFamily,fontSize:n.fontSize,fontColor:n.fontColor,strokeColor:n.strokeColor,color:n.color,strokeWidth:n.strokeWidth,field:{type:t.PDF_FORM_FIELD_TYPE.COMBOBOX,flag:(null==(o=n.field)?void 0:o.flag)??t.PDF_FORM_FIELD_FLAG.NONE,name:a,alternateName:a,value:"",options:[{label:"Option 1",isSelected:!0},{label:"Option 2",isSelected:!1},{label:"Option 3",isSelected:!1}]}}},p=n.useClickDetector({getTool:l,onClickDetected:t=>{if(!f())return;const o=l(),n=null==o?void 0:o.clickBehavior;if(!(null==n?void 0:n.enabled))return;const{width:i,height:r}=n.defaultSize,d=e.clamp(t.x-i/2,0,s.width-i),c=e.clamp(t.y-r/2,0,s.height-r);a(g({origin:{x:d,y:c},size:{width:i,height:r}}))}}),F=e=>{const o=d();if(!o)return null;const n=f();if(!n)return null;const i=h(o,e);return{type:t.PdfAnnotationSubtype.WIDGET,bounds:i,data:{rect:i,...n}}};return{onPointerDown:(e,t)=>{var o;const n=u(e);c(n),p.onStart(n),r(F(n)),null==(o=t.setPointerCapture)||o.call(t)},onPointerMove:e=>{const t=u(e);p.onMove(t),d()&&p.hasMoved()&&r(F(t))},onPointerUp:(e,t)=>{var o;const n=d();if(!n)return;const i=u(e);if(p.hasMoved()){const e=h(n,i);e.size.width>5&&e.size.height>5&&a(g(e))}else p.onEnd(i);c(null),r(null),p.reset(),null==(o=t.releasePointerCapture)||o.call(t)},onPointerLeave:(e,t)=>{var o;c(null),r(null),p.reset(),null==(o=t.releasePointerCapture)||o.call(t)},onPointerCancel:(e,t)=>{var o;c(null),r(null),p.reset(),null==(o=t.releasePointerCapture)||o.call(t)}}}},m={annotationType:t.PdfAnnotationSubtype.WIDGET,create(o){const{pageIndex:i,onCommit:a,onPreview:r,getTool:l,pageSize:s}=o,[d,c]=n.useState(null),u=t=>({x:e.clamp(t.x,0,s.width),y:e.clamp(t.y,0,s.height)}),f=()=>{const e=l();return e?{...e.defaults,fontFamily:e.defaults.fontFamily??t.PdfStandardFont.Helvetica,fontSize:e.defaults.fontSize??12,fontColor:e.defaults.fontColor??"#000000",strokeColor:e.defaults.strokeColor??"#000000",color:e.defaults.color??"#FFFFFF",strokeWidth:e.defaults.strokeWidth??1,field:e.defaults.field}:null},h=(e,t)=>({origin:{x:Math.min(e.x,t.x),y:Math.min(e.y,t.y)},size:{width:Math.abs(e.x-t.x),height:Math.abs(e.y-t.y)}}),g=e=>{var o;const n=f(),a=`Listbox_${t.uuidV4().slice(0,8)}`;return{...n,type:t.PdfAnnotationSubtype.WIDGET,id:t.uuidV4(),pageIndex:i,rect:e,created:new Date,fontFamily:n.fontFamily,fontSize:n.fontSize,fontColor:n.fontColor,strokeColor:n.strokeColor,color:n.color,strokeWidth:n.strokeWidth,field:{type:t.PDF_FORM_FIELD_TYPE.LISTBOX,flag:(null==(o=n.field)?void 0:o.flag)??t.PDF_FORM_FIELD_FLAG.NONE,name:a,alternateName:a,value:"",options:[{label:"Option 1",isSelected:!0},{label:"Option 2",isSelected:!1},{label:"Option 3",isSelected:!1}]}}},p=n.useClickDetector({getTool:l,onClickDetected:t=>{if(!f())return;const o=l(),n=null==o?void 0:o.clickBehavior;if(!(null==n?void 0:n.enabled))return;const{width:i,height:r}=n.defaultSize,d=e.clamp(t.x-i/2,0,s.width-i),c=e.clamp(t.y-r/2,0,s.height-r);a(g({origin:{x:d,y:c},size:{width:i,height:r}}))}}),F=e=>{const o=d();if(!o)return null;const n=f();if(!n)return null;const i=h(o,e);return{type:t.PdfAnnotationSubtype.WIDGET,bounds:i,data:{rect:i,...n}}};return{onPointerDown:(e,t)=>{var o;const n=u(e);c(n),p.onStart(n),r(F(n)),null==(o=t.setPointerCapture)||o.call(t)},onPointerMove:e=>{const t=u(e);p.onMove(t),d()&&p.hasMoved()&&r(F(t))},onPointerUp:(e,t)=>{var o;const n=d();if(!n)return;const i=u(e);if(p.hasMoved()){const e=h(n,i);e.size.width>5&&e.size.height>5&&a(g(e))}else p.onEnd(i);c(null),r(null),p.reset(),null==(o=t.releasePointerCapture)||o.call(t)},onPointerLeave:(e,t)=>{var o;c(null),r(null),p.reset(),null==(o=t.releasePointerCapture)||o.call(t)},onPointerCancel:(e,t)=>{var o;c(null),r(null),p.reset(),null==(o=t.releasePointerCapture)||o.call(t)}}}},y=n.defineAnnotationTool({id:"formTextField",name:"Text Field",labelKey:"form.textfield",categories:["annotation","form"],matchScore:e=>{var o;if(e.type!==t.PdfAnnotationSubtype.WIDGET)return 0;return(null==(o=e.field)?void 0:o.type)===t.PDF_FORM_FIELD_TYPE.TEXTFIELD?10:0},interaction:{exclusive:!1,cursor:"crosshair",isDraggable:!0,isResizable:!0,isRotatable:!1,isGroupDraggable:!0,isGroupResizable:!1,isGroupRotatable:!1},defaults:{type:t.PdfAnnotationSubtype.WIDGET,fontFamily:t.PdfStandardFont.Helvetica,fontSize:12,fontColor:"#000000",strokeColor:"#000000",color:"#FFFFFF",strokeWidth:1,field:{flag:t.PDF_FORM_FIELD_FLAG.NONE,name:"TextField",alternateName:"TextField",value:"",type:t.PDF_FORM_FIELD_TYPE.TEXTFIELD}},behavior:{useAppearanceStream:!1},clickBehavior:{enabled:!0,defaultSize:{width:150,height:24}},pointerHandler:h}),I=n.defineAnnotationTool({id:"formCheckbox",name:"Checkbox",labelKey:"form.checkbox",categories:["annotation","form"],matchScore:e=>{var o;if(e.type!==t.PdfAnnotationSubtype.WIDGET)return 0;return(null==(o=e.field)?void 0:o.type)===t.PDF_FORM_FIELD_TYPE.CHECKBOX?10:0},interaction:{exclusive:!1,cursor:"crosshair",isDraggable:!0,isResizable:!0,isRotatable:!1,isGroupDraggable:!0,isGroupResizable:!1,isGroupRotatable:!1},defaults:{type:t.PdfAnnotationSubtype.WIDGET,strokeColor:"#000000",color:"#FFFFFF",strokeWidth:1,field:{flag:t.PDF_FORM_FIELD_FLAG.NONE,name:"Checkbox",alternateName:"Checkbox",value:"Off",type:t.PDF_FORM_FIELD_TYPE.CHECKBOX}},behavior:{useAppearanceStream:!1},clickBehavior:{enabled:!0,defaultSize:{width:20,height:20}},pointerHandler:g}),P=n.defineAnnotationTool({id:"formRadioButton",name:"Radio Button",labelKey:"form.radiobutton",categories:["annotation","form"],matchScore:e=>{var o;if(e.type!==t.PdfAnnotationSubtype.WIDGET)return 0;return(null==(o=e.field)?void 0:o.type)===t.PDF_FORM_FIELD_TYPE.RADIOBUTTON?10:0},interaction:{exclusive:!1,cursor:"crosshair",isDraggable:!0,isResizable:!0,isRotatable:!1,lockAspectRatio:!0,isGroupDraggable:!0,isGroupResizable:!1,isGroupRotatable:!1},defaults:{type:t.PdfAnnotationSubtype.WIDGET,strokeColor:"#000000",color:"#FFFFFF",strokeWidth:1,field:{flag:t.PDF_FORM_FIELD_FLAG.BUTTON_RADIO|t.PDF_FORM_FIELD_FLAG.BUTTON_NOTOGGLETOOFF,name:"RadioButton",alternateName:"RadioButton",value:"Off",type:t.PDF_FORM_FIELD_TYPE.RADIOBUTTON,options:[]}},behavior:{useAppearanceStream:!1},clickBehavior:{enabled:!0,defaultSize:{width:20,height:20}},pointerHandler:p}),D=n.defineAnnotationTool({id:"formCombobox",name:"Combo Box",labelKey:"form.combobox",categories:["annotation","form"],matchScore:e=>{var o;if(e.type!==t.PdfAnnotationSubtype.WIDGET)return 0;return(null==(o=e.field)?void 0:o.type)===t.PDF_FORM_FIELD_TYPE.COMBOBOX?10:0},interaction:{exclusive:!1,cursor:"crosshair",isDraggable:!0,isResizable:!0,isRotatable:!1,isGroupDraggable:!0,isGroupResizable:!1,isGroupRotatable:!1},defaults:{type:t.PdfAnnotationSubtype.WIDGET,fontFamily:t.PdfStandardFont.Helvetica,fontSize:12,fontColor:"#000000",strokeColor:"#000000",color:"#FFFFFF",strokeWidth:1,field:{flag:t.PDF_FORM_FIELD_FLAG.NONE,name:"ComboBox",alternateName:"ComboBox",value:"",type:t.PDF_FORM_FIELD_TYPE.COMBOBOX,options:[{label:"Option 1",isSelected:!0},{label:"Option 2",isSelected:!1},{label:"Option 3",isSelected:!1}]}},behavior:{useAppearanceStream:!1},clickBehavior:{enabled:!0,defaultSize:{width:200,height:40}},pointerHandler:F}),b=n.defineAnnotationTool({id:"formListbox",name:"List Box",labelKey:"form.listbox",categories:["annotation","form"],matchScore:e=>{var o;if(e.type!==t.PdfAnnotationSubtype.WIDGET)return 0;return(null==(o=e.field)?void 0:o.type)===t.PDF_FORM_FIELD_TYPE.LISTBOX?10:0},interaction:{exclusive:!1,cursor:"crosshair",isDraggable:!0,isResizable:!0,isRotatable:!1,isGroupDraggable:!0,isGroupResizable:!1,isGroupRotatable:!1},defaults:{type:t.PdfAnnotationSubtype.WIDGET,fontFamily:t.PdfStandardFont.Helvetica,fontSize:12,fontColor:"#000000",strokeColor:"#000000",color:"#FFFFFF",strokeWidth:1,field:{flag:t.PDF_FORM_FIELD_FLAG.NONE,name:"ListBox",alternateName:"ListBox",value:"",type:t.PDF_FORM_FIELD_TYPE.LISTBOX,options:[{label:"Option 1",isSelected:!0},{label:"Option 2",isSelected:!1},{label:"Option 3",isSelected:!1}]}},behavior:{useAppearanceStream:!1},clickBehavior:{enabled:!0,defaultSize:{width:150,height:150}},pointerHandler:m}),v=[y,I,P,D,b],x=class extends e.BasePlugin{constructor(t,n,i){var a,r;if(super(t,n),this.FORM_HISTORY_TOPIC="form-fields",this.annotation=null,this.history=null,this.state$=e.createScopedEmitter((e,t)=>({documentId:e,state:t})),this.fieldValueChange$=e.createScopedEmitter((e,t)=>t,{cache:!1}),this.formReady$=e.createScopedEmitter((e,t)=>({documentId:e,fields:t}),{cache:!1}),this.fieldGroupIndex=new Map,this.fieldNameIndex=new Map,this.orderedFieldIndex=new Map,this.propagationInProgress=new Set,this.annotation=(null==(a=n.getPlugin("annotation"))?void 0:a.provides())??null,this.history=(null==(r=n.getPlugin(o.HistoryPlugin.id))?void 0:r.provides())??null,this.annotation){for(const e of v)this.annotation.addTool(e);this.annotation.onAnnotationEvent(e=>this.handleAnnotationEvent(e))}}async initialize(){}onDocumentLoadingStarted(e){this.dispatch(function(e,t){return{type:r,payload:{documentId:e,state:t}}}(e,{...u}))}onDocumentClosed(e){this.dispatch(function(e){return{type:l,payload:e}}(e)),this.fieldGroupIndex.delete(e),this.fieldNameIndex.delete(e),this.orderedFieldIndex.delete(e),this.state$.clearScope(e),this.fieldValueChange$.clearScope(e),this.formReady$.clearScope(e)}onStoreUpdated(e,t){for(const o in t.documents){const n=e.documents[o],i=t.documents[o];n!==i&&this.state$.emit(o,i)}}buildCapability(){return{getPageFormAnnoWidgets:(e,t)=>this.getPageFormAnnoWidgets(e,t),setFormFieldValues:(e,t,o,n)=>this.setFormFieldValues(e,t,o,n),renameField:(e,t,o)=>this.renameFieldMethod(e,t,o),shareField:(e,t,o)=>this.shareFieldMethod(e,t,o),renderWidget:(e,t)=>this.renderWidget(e,t),selectField:(e,t)=>this.selectFieldMethod(e,t),deselectField:e=>this.deselectFieldMethod(e),getSelectedFieldId:e=>this.getSelectedFieldId(e),selectNextField:e=>this.selectNextFieldMethod(e),selectPreviousField:e=>this.selectPreviousFieldMethod(e),activateField:e=>this.activateFieldMethod(e),getState:e=>this.getDocumentState(e),getFieldGroup:(e,t)=>this.getFieldGroup(e,t),getFieldSiblings:(e,t)=>this.getFieldSiblings(e,t),getFormValues:e=>this.getFormValuesMethod(e),getFormFields:e=>this.getFormFieldsMethod(e),setFormValues:(e,t)=>this.setFormValuesMethod(e,t),forDocument:e=>this.createFormScope(e),onStateChange:this.state$.onGlobal,onFieldValueChange:this.fieldValueChange$.onGlobal,onFormReady:this.formReady$.onGlobal}}createFormScope(e){return{getPageFormAnnoWidgets:t=>this.getPageFormAnnoWidgets(t,e),setFormFieldValues:(t,o,n)=>this.setFormFieldValues(t,o,n,e),renameField:(t,o)=>this.renameFieldMethod(t,o,e),shareField:(t,o)=>this.shareFieldMethod(t,o,e),renderWidget:t=>this.renderWidget(t,e),selectField:t=>this.selectFieldMethod(t,e),deselectField:()=>this.deselectFieldMethod(e),getSelectedFieldId:()=>this.getSelectedFieldId(e),selectNextField:()=>this.selectNextFieldMethod(e),selectPreviousField:()=>this.selectPreviousFieldMethod(e),activateField:()=>this.activateFieldMethod(e),getState:()=>this.getDocumentState(e),getFieldGroup:t=>this.getFieldGroup(t,e),getFieldSiblings:t=>this.getFieldSiblings(t,e),getFormValues:()=>this.getFormValuesMethod(e),getFormFields:()=>this.getFormFieldsMethod(e),setFormValues:t=>this.setFormValuesMethod(t,e),onStateChange:this.state$.forScope(e),onFieldValueChange:this.fieldValueChange$.forScope(e),onFormReady:this.formReady$.forScope(e)}}handleAnnotationEvent(e){switch(e.type){case"loaded":this.buildFieldGroupIndex(e.documentId),this.formReady$.emit(e.documentId,this.getFormFieldsMethod(e.documentId));break;case"create":case"delete":if(e.annotation.type!==t.PdfAnnotationSubtype.WIDGET)break;this.buildFieldGroupIndex(e.documentId);break;case"update":{if(!e.committed)break;const o=e.annotation;if(o.type!==t.PdfAnnotationSubtype.WIDGET)break;if(this.propagationInProgress.has(o.id)){this.propagationInProgress.delete(o.id);break}const n=e.patch;this.buildFieldGroupIndex(e.documentId),this.propagateFieldLevelChanges(e.documentId,o,n);break}}}propagateFieldLevelChanges(e,t,o){if(!this.annotation||!o.field)return;const n=o.field,i=this.getFieldSiblings(t.id,e);if(0===i.length)return;const a=[];for(const r of i)this.propagationInProgress.add(r.annotationId),a.push({pageIndex:r.pageIndex,id:r.annotationId,patch:{field:{...n}}});this.annotation.forDocument(e).updateAnnotations(a)}buildFieldGroupIndex(e){if(!this.annotation)return;const o=this.annotation.forDocument(e).getState();if(!o)return;const n=new Map,i=[];for(const[l,s]of Object.entries(o.pages)){const e=Number(l);for(const a of s){const r=o.byUid[a];if(!r||r.object.type!==t.PdfAnnotationSubtype.WIDGET)continue;const l=r.object,s={annotationId:a,pageIndex:e};i.push({entry:s,widget:l});const d=this.getFieldKey(l.field);if(!d)continue;const c=n.get(d)??[];c.push(s),n.set(d,c)}}this.fieldGroupIndex.set(e,n);const a=new Map;for(const{entry:t,widget:l}of i){const e=l.field.name.trim();if(!e)continue;const o=a.get(e)??[];o.push(t),a.set(e,o)}this.fieldNameIndex.set(e,a);const r=i.filter(({widget:e})=>!(e.field.flag&t.PDF_FORM_FIELD_FLAG.READONLY));this.orderedFieldIndex.set(e,r.map(({entry:e})=>e))}getDocumentState(e){const t=e??this.getActiveDocumentId();return this.state.documents[t]??{...u}}getDocIndex(e){let t=this.fieldGroupIndex.get(e);return t||(t=new Map,this.fieldGroupIndex.set(e,t)),t}getFieldKey(e){if("number"==typeof e.fieldObjectId&&e.fieldObjectId>0)return`field:${e.fieldObjectId}`;const t=e.name.trim();return t?`legacy:${e.type}:${t}`:null}resolveWidgetAnnotation(e,o){if(!this.annotation)return null;const n=this.annotation.forDocument(o).getState(),i=null==n?void 0:n.byUid[e];return i&&i.object.type===t.PdfAnnotationSubtype.WIDGET?i.object:null}getFieldGroup(e,t){const o=t??this.getActiveDocumentId(),n=this.resolveWidgetAnnotation(e,o);if(!n)return[];const i=this.getFieldKey(n.field);return i?this.getDocIndex(o).get(i)??[{annotationId:n.id,pageIndex:n.pageIndex}]:[{annotationId:n.id,pageIndex:n.pageIndex}]}getFieldSiblings(e,t){return this.getFieldGroup(e,t).filter(t=>t.annotationId!==e)}getFormValuesMethod(e){const t=e??this.getActiveDocumentId(),o=this.fieldNameIndex.get(t);if(!o)return{};const n={};for(const[i,a]of o){const e=this.resolveWidgetAnnotation(a[0].annotationId,t);e&&(n[i]=e.field.value)}return n}getFormFieldsMethod(e){const o=e??this.getActiveDocumentId(),n=this.fieldNameIndex.get(o);if(!n)return[];const i=[];for(const[a,r]of n){const e=this.resolveWidgetAnnotation(r[0].annotationId,o);e&&i.push({name:a,type:e.field.type,value:e.field.value,readOnly:!!(e.field.flag&t.PDF_FORM_FIELD_FLAG.READONLY),..."options"in e.field&&e.field.options?{options:e.field.options}:{}})}return i}setFormValuesMethod(e,o){const n=o??this.getActiveDocumentId(),i=this.fieldNameIndex.get(n);if(!i)return t.PdfTaskHelper.reject({code:t.PdfErrorCode.NotFound,message:"no form fields indexed for this document"});const a=Object.entries(e);if(0===a.length)return t.PdfTaskHelper.resolve(!0);const r=new t.Task;let l=a.length,s=!1;const d=()=>{l--,0!==l||s||r.resolve(!0)};for(const[c,u]of a){const e=i.get(c);if(!e||0===e.length){d();continue}let o=e[0],a=this.resolveWidgetAnnotation(o.annotationId,n);if(a){if(a.field.type===t.PDF_FORM_FIELD_TYPE.RADIOBUTTON||a.field.type===t.PDF_FORM_FIELD_TYPE.CHECKBOX)for(const t of e){const e=this.resolveWidgetAnnotation(t.annotationId,n);if(e&&e.exportValue===u){a=e,o=t;break}}this.setFormFieldValues(o.pageIndex,a,this.buildImportField(a,u),n).wait(()=>d(),e=>{return t=e.reason,void(s||(s=!0,r.reject(t)));var t})}else d()}return r}buildImportField(e,o){const n=e.field;if((n.type===t.PDF_FORM_FIELD_TYPE.COMBOBOX||n.type===t.PDF_FORM_FIELD_TYPE.LISTBOX)&&"options"in n)return{...n,value:o,options:n.options.map(e=>({...e,isSelected:e.label===o}))};if(n.type===t.PDF_FORM_FIELD_TYPE.CHECKBOX){const t="Off"===o?"Off":e.exportValue??"Yes";return{...n,value:t}}return{...n,value:o}}isToggleField(e){return e.type===t.PDF_FORM_FIELD_TYPE.CHECKBOX||e.type===t.PDF_FORM_FIELD_TYPE.RADIOBUTTON}shouldRegenerateWidgetAppearances(e){return!this.isToggleField(e)}getFieldBatchTarget(e){const o=[...e.values()];return o.find(e=>this.isToggleField(e.widget.field)&&t.isWidgetChecked(e.widget))??o[0]}async readFieldWidgets(e,t,o,n){const i=new Set(t.map(e=>e.pageIndex)),a=new Set(t.map(e=>e.annotationId)),r=new Map;for(const l of i){const i=e.pages.find(e=>e.index===l);if(!i)continue;const s=t.filter(e=>e.pageIndex===l).map(e=>e.annotationId);n&&await o.run(()=>this.engine.regenerateWidgetAppearances(e,i,s));const d=await o.run(()=>this.engine.getPageAnnoWidgets(e,i));for(const e of d)a.has(e.id)&&r.set(e.id,{widget:e,pageIndex:l})}return r}syncFieldBatch(e,t,o={}){if(this.annotation){for(const[n,{widget:i,pageIndex:a}]of t)this.annotation.syncAnnotationObject(n,i,e),this.annotation.invalidatePageAppearances(a,e),o.emitFieldValueChanges&&this.fieldValueChange$.emit(e,{documentId:e,pageIndex:a,annotationId:n,widget:i});this.buildFieldGroupIndex(e)}}resolveWidgetPage(e,t,o){const n=this.resolveWidgetAnnotation(e,t);if(!n)return null;const i=o.pages.find(e=>e.index===n.pageIndex);return i?{widget:n,page:i}:null}getPageFormAnnoWidgets(e,o){const n=this.getCoreDocumentOrThrow(o).document;if(!n)return t.PdfTaskHelper.reject({code:t.PdfErrorCode.DocNotOpen,message:"document is not open"});const i=n.pages.find(t=>t.index===e);return i?this.engine.getPageAnnoWidgets(n,i):t.PdfTaskHelper.reject({code:t.PdfErrorCode.NotFound,message:"page does not exist"})}setFormFieldValues(e,o,n,i){const a=i??this.getActiveDocumentId(),r=this.getCoreDocumentOrThrow(a).document;if(!r)return t.PdfTaskHelper.reject({code:t.PdfErrorCode.DocNotOpen,message:"document is not open"});const l=r.pages.find(t=>t.index===e);if(!l)return t.PdfTaskHelper.reject({code:t.PdfErrorCode.NotFound,message:"page does not exist"});const s=new t.Task,d=new t.TaskSequence(s);return d.execute(async()=>{const e=this.getFieldGroup(o.id,a),t=await this.readFieldWidgets(r,e,d,!1);await d.run(()=>this.engine.setFormFieldState(r,l,o,n));const i=await this.readFieldWidgets(r,e,d,this.shouldRegenerateWidgetAppearances(n));let c=!0;const u=async e=>{const t=this.getFieldBatchTarget(e);if(!t)return;const o=r.pages.find(e=>e.index===t.pageIndex);if(o&&(await new Promise(e=>{this.engine.setFormFieldState(r,o,t.widget,t.widget.field).wait(()=>e(),()=>e())}),this.shouldRegenerateWidgetAppearances(t.widget.field)))for(const n of new Set([...e.values()].map(e=>e.pageIndex))){const t=r.pages.find(e=>e.index===n);if(!t)continue;const o=[...e.entries()].filter(([,e])=>e.pageIndex===n).map(([e])=>e);await new Promise(e=>{this.engine.regenerateWidgetAppearances(r,t,o).wait(()=>e(),()=>e())})}},f={execute:()=>{const e=c;c=!1,e?this.syncFieldBatch(a,i,{emitFieldValueChanges:!0}):u(i).then(()=>this.syncFieldBatch(a,i,{emitFieldValueChanges:!0}))},undo:()=>{u(t).then(()=>this.syncFieldBatch(a,t,{emitFieldValueChanges:!0}))}};this.history?this.history.forDocument(a).register(f,this.FORM_HISTORY_TOPIC):f.execute(),s.resolve(!0)},e=>({code:t.PdfErrorCode.Unknown,message:String(e)})),s}findConflictingFieldGroups(e,o,n){const i=new Map;if(!this.annotation)return i;const a=this.annotation.forDocument(n).getState();if(!a)return i;const r=(()=>{const e=this.resolveWidgetAnnotation(o,n);return e?this.getFieldKey(e.field):null})();for(const[l,s]of Object.entries(a.pages)){const o=Number(l);for(const n of s){const l=a.byUid[n];if(!l||l.object.type!==t.PdfAnnotationSubtype.WIDGET)continue;const s=l.object;if(s.field.name.trim()!==e)continue;const d=this.getFieldKey(s.field);d&&d!==r&&(i.has(d)||i.set(d,{entries:[],widget:s}),i.get(d).entries.push({annotationId:n,pageIndex:o}))}}return i}renameFieldMethod(e,o,n){const i=n??this.getActiveDocumentId(),a=o.trim();if(!a)return t.PdfTaskHelper.reject({code:t.PdfErrorCode.Unknown,message:"Field name must not be empty."});const r=this.getCoreDocumentOrThrow(i).document;if(!r)return t.PdfTaskHelper.reject({code:t.PdfErrorCode.DocNotOpen,message:"document is not open"});const l=this.resolveWidgetPage(e,i,r);if(!l)return t.PdfTaskHelper.reject({code:t.PdfErrorCode.NotFound,message:"widget annotation not found"});if(l.widget.field.name.trim()===a)return t.PdfTaskHelper.resolve({outcome:"no-op"});const s=this.findConflictingFieldGroups(a,e,i);if(s.size>0){if(s.size>1)return t.PdfTaskHelper.reject({code:t.PdfErrorCode.Unknown,message:"That field name is used by multiple fields. Choose a unique name."});const[,e]=[...s.entries()][0];return e.widget.field.type!==l.widget.field.type?t.PdfTaskHelper.reject({code:t.PdfErrorCode.Unknown,message:"That field name is already used by a different widget type."}):t.PdfTaskHelper.resolve({outcome:"conflict",targetAnnotationId:e.entries[0].annotationId,fieldName:a})}const d=new t.Task,c=new t.TaskSequence(d);return c.execute(async()=>{const t=this.getFieldGroup(e,i);await c.run(()=>this.engine.renameWidgetField(r,l.page,l.widget,a));const o=await this.readFieldWidgets(r,t,c,!1);this.syncFieldBatch(i,o),d.resolve({outcome:"renamed"})},e=>({code:t.PdfErrorCode.Unknown,message:String(e)})),d}shareFieldMethod(e,o,n){const i=n??this.getActiveDocumentId();if(e===o)return t.PdfTaskHelper.resolve(!0);const a=this.getCoreDocumentOrThrow(i).document;if(!a)return t.PdfTaskHelper.reject({code:t.PdfErrorCode.DocNotOpen,message:"document is not open"});const r=this.resolveWidgetPage(e,i,a),l=this.resolveWidgetPage(o,i,a);if(!r||!l)return t.PdfTaskHelper.reject({code:t.PdfErrorCode.NotFound,message:"widget annotation not found"});if(r.widget.field.type!==l.widget.field.type)return t.PdfTaskHelper.reject({code:t.PdfErrorCode.Unknown,message:"cannot share fields with different widget types"});if(r.widget.field.fieldObjectId&&l.widget.field.fieldObjectId&&r.widget.field.fieldObjectId===l.widget.field.fieldObjectId)return t.PdfTaskHelper.resolve(!0);const s=new Map;for(const t of this.getFieldGroup(e,i))s.set(t.annotationId,t);for(const t of this.getFieldGroup(o,i))s.set(t.annotationId,t);const d=[...s.values()],c=new t.Task,u=new t.TaskSequence(c);return u.execute(async()=>{await u.run(()=>this.engine.shareWidgetField(a,r.page,r.widget,l.page,l.widget));const e=await this.readFieldWidgets(a,d,u,this.shouldRegenerateWidgetAppearances(l.widget.field));this.syncFieldBatch(i,e),c.resolve(!0)},e=>({code:t.PdfErrorCode.Unknown,message:String(e)})),c}selectFieldMethod(e,t){const o=t??this.getActiveDocumentId();this.dispatch(c(o,e))}deselectFieldMethod(e){const t=e??this.getActiveDocumentId();this.dispatch(function(e){return{type:d,payload:e}}(t))}getSelectedFieldId(e){return this.getDocumentState(e).selectedFieldId}selectNextFieldMethod(e){const t=e??this.getActiveDocumentId(),o=this.orderedFieldIndex.get(t);if(!o||0===o.length)return;const n=this.getSelectedFieldId(t);let i=0;if(n){const e=o.findIndex(e=>e.annotationId===n);i=e>=0?(e+1)%o.length:0}const a=o[i];this.dispatch(c(t,a.annotationId))}selectPreviousFieldMethod(e){const t=e??this.getActiveDocumentId(),o=this.orderedFieldIndex.get(t);if(!o||0===o.length)return;const n=this.getSelectedFieldId(t);let i=o.length-1;if(n){const e=o.findIndex(e=>e.annotationId===n);i=e>=0?(e-1+o.length)%o.length:o.length-1}const a=o[i];this.dispatch(c(t,a.annotationId))}activateFieldMethod(e){const o=e??this.getActiveDocumentId(),n=this.getSelectedFieldId(o);if(!n)return;const i=this.resolveWidgetAnnotation(n,o);if(!i)return;const a=i.field;if(a.type===t.PDF_FORM_FIELD_TYPE.CHECKBOX){const e=t.isWidgetChecked(i)?"Off":i.exportValue??"Yes";this.setFormFieldValues(i.pageIndex,i,{...a,value:e},o)}else a.type===t.PDF_FORM_FIELD_TYPE.RADIOBUTTON&&!t.isWidgetChecked(i)&&i.exportValue&&this.setFormFieldValues(i.pageIndex,i,{...a,value:i.exportValue},o)}renderWidget(e,o){if(!this.annotation)return t.PdfTaskHelper.reject({code:t.PdfErrorCode.NotFound,message:"annotation plugin not found"});const n=o??this.getActiveDocumentId();return this.annotation.forDocument(n).renderAnnotation(e)}async destroy(){this.state$.clear(),this.fieldValueChange$.clear(),this.formReady$.clear(),super.destroy()}};x.id="form";let T=x;const S={manifest:a,create:(e,t)=>new T(i,e,t),reducer:(e=f,t)=>{switch(t.type){case r:return{...e,documents:{...e.documents,[t.payload.documentId]:t.payload.state}};case l:{const o=t.payload,{[o]:n,...i}=e.documents;return{...e,documents:i}}case s:{const{documentId:o,annotationId:n}=t.payload,i=e.documents[o];return i?{...e,documents:{...e.documents,[o]:{...i,selectedFieldId:n}}}:e}case d:{const o=t.payload,n=e.documents[o];return n?{...e,documents:{...e.documents,[o]:{...n,selectedFieldId:null}}}:e}default:return e}},initialState:f};exports.FORM_PLUGIN_ID=i,exports.FormPlugin=T,exports.FormPluginPackage=S,exports.formCheckboxTool=I,exports.formComboboxTool=D,exports.formListboxTool=b,exports.formRadioButtonTool=P,exports.formTextFieldTool=y,exports.formTools=v,exports.initialDocumentState=u,exports.initialState=f,exports.manifest=a;
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/lib/manifest.ts","../src/lib/actions.ts","../src/lib/reducer.ts","../src/lib/handlers/text-field.handler.ts","../src/lib/handlers/checkbox.handler.ts","../src/lib/handlers/radio-button.handler.ts","../src/lib/handlers/combobox.handler.ts","../src/lib/handlers/listbox.handler.ts","../src/lib/tools.ts","../src/lib/form-plugin.ts","../src/lib/index.ts"],"sourcesContent":["import { PluginManifest } from '@embedpdf/core';\nimport { FormPluginConfig } from './types';\n\nexport const FORM_PLUGIN_ID = 'form';\n\nexport const manifest: PluginManifest<FormPluginConfig> = {\n id: FORM_PLUGIN_ID,\n name: 'Form Plugin',\n version: '1.0.0',\n provides: ['form'],\n requires: ['interaction-manager'],\n optional: ['history', 'annotation'],\n defaultConfig: {\n enabled: true,\n },\n};\n","import { Action } from '@embedpdf/core';\nimport { FormDocumentState } from './types';\n\nexport const INIT_FORM_STATE = 'FORM/INIT_STATE';\nexport const CLEANUP_FORM_STATE = 'FORM/CLEANUP_STATE';\nexport const SELECT_FIELD = 'FORM/SELECT_FIELD';\nexport const DESELECT_FIELD = 'FORM/DESELECT_FIELD';\n\nexport interface InitFormStateAction extends Action {\n type: typeof INIT_FORM_STATE;\n payload: { documentId: string; state: FormDocumentState };\n}\n\nexport interface CleanupFormStateAction extends Action {\n type: typeof CLEANUP_FORM_STATE;\n payload: string;\n}\n\nexport interface SelectFieldAction extends Action {\n type: typeof SELECT_FIELD;\n payload: { documentId: string; annotationId: string };\n}\n\nexport interface DeselectFieldAction extends Action {\n type: typeof DESELECT_FIELD;\n payload: string;\n}\n\nexport type FormAction =\n | InitFormStateAction\n | CleanupFormStateAction\n | SelectFieldAction\n | DeselectFieldAction;\n\nexport function initFormState(documentId: string, state: FormDocumentState): InitFormStateAction {\n return { type: INIT_FORM_STATE, payload: { documentId, state } };\n}\n\nexport function cleanupFormState(documentId: string): CleanupFormStateAction {\n return { type: CLEANUP_FORM_STATE, payload: documentId };\n}\n\nexport function selectField(documentId: string, annotationId: string): SelectFieldAction {\n return { type: SELECT_FIELD, payload: { documentId, annotationId } };\n}\n\nexport function deselectField(documentId: string): DeselectFieldAction {\n return { type: DESELECT_FIELD, payload: documentId };\n}\n","import { Reducer } from '@embedpdf/core';\nimport { FormDocumentState, FormState } from './types';\nimport {\n FormAction,\n INIT_FORM_STATE,\n CLEANUP_FORM_STATE,\n SELECT_FIELD,\n DESELECT_FIELD,\n} from './actions';\n\nexport const initialDocumentState: FormDocumentState = {\n selectedFieldId: null,\n};\n\nexport const initialState: FormState = {\n documents: {},\n};\n\nexport const reducer: Reducer<FormState, FormAction> = (state = initialState, action) => {\n switch (action.type) {\n case INIT_FORM_STATE:\n return {\n ...state,\n documents: {\n ...state.documents,\n [action.payload.documentId]: action.payload.state,\n },\n };\n\n case CLEANUP_FORM_STATE: {\n const documentId = action.payload;\n const { [documentId]: _, ...remaining } = state.documents;\n return {\n ...state,\n documents: remaining,\n };\n }\n\n case SELECT_FIELD: {\n const { documentId, annotationId } = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...docState,\n selectedFieldId: annotationId,\n },\n },\n };\n }\n\n case DESELECT_FIELD: {\n const documentId = action.payload;\n const docState = state.documents[documentId];\n if (!docState) return state;\n return {\n ...state,\n documents: {\n ...state.documents,\n [documentId]: {\n ...docState,\n selectedFieldId: null,\n },\n },\n };\n }\n\n default:\n return state;\n }\n};\n","import {\n PdfAnnotationSubtype,\n PdfWidgetAnnoObject,\n PDF_FORM_FIELD_TYPE,\n PDF_FORM_FIELD_FLAG,\n PdfStandardFont,\n Rect,\n uuidV4,\n} from '@embedpdf/models';\nimport {\n HandlerFactory,\n PreviewState,\n useState,\n useClickDetector,\n} from '@embedpdf/plugin-annotation';\nimport { clamp } from '@embedpdf/core';\n\nexport const textFieldHandlerFactory: HandlerFactory<PdfWidgetAnnoObject> = {\n annotationType: PdfAnnotationSubtype.WIDGET,\n\n create(context) {\n const { pageIndex, onCommit, onPreview, getTool, pageSize } = context;\n const [getStart, setStart] = useState<{ x: number; y: number } | null>(null);\n\n const clampToPage = (pos: { x: number; y: number }) => ({\n x: clamp(pos.x, 0, pageSize.width),\n y: clamp(pos.y, 0, pageSize.height),\n });\n\n const getDefaults = () => {\n const tool = getTool();\n if (!tool) return null;\n return {\n ...tool.defaults,\n fontFamily: tool.defaults.fontFamily ?? PdfStandardFont.Helvetica,\n fontSize: tool.defaults.fontSize ?? 12,\n fontColor: tool.defaults.fontColor ?? '#000000',\n strokeColor: tool.defaults.strokeColor ?? '#000000',\n color: tool.defaults.color ?? '#FFFFFF',\n strokeWidth: tool.defaults.strokeWidth ?? 1,\n field: tool.defaults.field,\n };\n };\n\n const buildRect = (start: { x: number; y: number }, end: { x: number; y: number }): Rect => {\n const minX = Math.min(start.x, end.x);\n const minY = Math.min(start.y, end.y);\n const width = Math.abs(start.x - end.x);\n const height = Math.abs(start.y - end.y);\n return {\n origin: { x: minX, y: minY },\n size: { width, height },\n };\n };\n\n const buildAnnotation = (rect: Rect): PdfWidgetAnnoObject => {\n const defaults = getDefaults()!;\n const fieldName = `TextField_${uuidV4().slice(0, 8)}`;\n return {\n ...defaults,\n type: PdfAnnotationSubtype.WIDGET,\n id: uuidV4(),\n pageIndex,\n rect,\n created: new Date(),\n fontFamily: defaults.fontFamily,\n fontSize: defaults.fontSize,\n fontColor: defaults.fontColor,\n strokeColor: defaults.strokeColor,\n color: defaults.color,\n strokeWidth: defaults.strokeWidth,\n field: {\n type: PDF_FORM_FIELD_TYPE.TEXTFIELD,\n flag: defaults.field?.flag ?? PDF_FORM_FIELD_FLAG.NONE,\n name: fieldName,\n alternateName: fieldName,\n value: '',\n },\n } as PdfWidgetAnnoObject;\n };\n\n const clickDetector = useClickDetector<PdfWidgetAnnoObject>({\n getTool,\n onClickDetected: (pos) => {\n const defaults = getDefaults();\n if (!defaults) return;\n\n const tool = getTool();\n const clickConfig = tool?.clickBehavior;\n if (!clickConfig?.enabled) return;\n\n const { width, height } = clickConfig.defaultSize;\n const x = clamp(pos.x - width / 2, 0, pageSize.width - width);\n const y = clamp(pos.y - height / 2, 0, pageSize.height - height);\n const rect: Rect = {\n origin: { x, y },\n size: { width, height },\n };\n onCommit(buildAnnotation(rect));\n },\n });\n\n const getPreview = (current: {\n x: number;\n y: number;\n }): PreviewState<PdfAnnotationSubtype.WIDGET> | null => {\n const start = getStart();\n if (!start) return null;\n\n const defaults = getDefaults();\n if (!defaults) return null;\n\n const rect = buildRect(start, current);\n return {\n type: PdfAnnotationSubtype.WIDGET,\n bounds: rect,\n data: { rect, ...defaults },\n };\n };\n\n return {\n onPointerDown: (pos, evt) => {\n const clampedPos = clampToPage(pos);\n setStart(clampedPos);\n clickDetector.onStart(clampedPos);\n onPreview(getPreview(clampedPos));\n evt.setPointerCapture?.();\n },\n\n onPointerMove: (pos) => {\n const clampedPos = clampToPage(pos);\n clickDetector.onMove(clampedPos);\n\n if (getStart() && clickDetector.hasMoved()) {\n onPreview(getPreview(clampedPos));\n }\n },\n\n onPointerUp: (pos, evt) => {\n const start = getStart();\n if (!start) return;\n\n const clampedPos = clampToPage(pos);\n\n if (!clickDetector.hasMoved()) {\n clickDetector.onEnd(clampedPos);\n } else {\n const rect = buildRect(start, clampedPos);\n if (rect.size.width > 5 && rect.size.height > 5) {\n onCommit(buildAnnotation(rect));\n }\n }\n\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n\n onPointerLeave: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n\n onPointerCancel: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n };\n },\n};\n","import {\n PdfAnnotationSubtype,\n PdfWidgetAnnoObject,\n PDF_FORM_FIELD_TYPE,\n PDF_FORM_FIELD_FLAG,\n Rect,\n uuidV4,\n} from '@embedpdf/models';\nimport {\n HandlerFactory,\n PreviewState,\n useState,\n useClickDetector,\n} from '@embedpdf/plugin-annotation';\nimport { clamp } from '@embedpdf/core';\n\nexport const checkboxHandlerFactory: HandlerFactory<PdfWidgetAnnoObject> = {\n annotationType: PdfAnnotationSubtype.WIDGET,\n\n create(context) {\n const { pageIndex, onCommit, onPreview, getTool, pageSize } = context;\n const [getStart, setStart] = useState<{ x: number; y: number } | null>(null);\n\n const clampToPage = (pos: { x: number; y: number }) => ({\n x: clamp(pos.x, 0, pageSize.width),\n y: clamp(pos.y, 0, pageSize.height),\n });\n\n const getDefaults = () => {\n const tool = getTool();\n if (!tool) return null;\n return {\n ...tool.defaults,\n strokeColor: tool.defaults.strokeColor ?? '#000000',\n color: tool.defaults.color ?? '#FFFFFF',\n strokeWidth: tool.defaults.strokeWidth ?? 1,\n field: tool.defaults.field,\n };\n };\n\n const buildRect = (start: { x: number; y: number }, end: { x: number; y: number }): Rect => {\n const minX = Math.min(start.x, end.x);\n const minY = Math.min(start.y, end.y);\n const width = Math.abs(start.x - end.x);\n const height = Math.abs(start.y - end.y);\n return {\n origin: { x: minX, y: minY },\n size: { width, height },\n };\n };\n\n const buildAnnotation = (rect: Rect): PdfWidgetAnnoObject => {\n const defaults = getDefaults()!;\n const fieldName = `Checkbox_${uuidV4().slice(0, 8)}`;\n return {\n ...defaults,\n type: PdfAnnotationSubtype.WIDGET,\n id: uuidV4(),\n pageIndex,\n rect,\n created: new Date(),\n strokeColor: defaults.strokeColor,\n color: defaults.color,\n strokeWidth: defaults.strokeWidth,\n exportValue: 'Yes',\n field: {\n type: PDF_FORM_FIELD_TYPE.CHECKBOX,\n flag: defaults.field?.flag ?? PDF_FORM_FIELD_FLAG.NONE,\n name: fieldName,\n alternateName: fieldName,\n value: 'Off',\n },\n } as PdfWidgetAnnoObject;\n };\n\n const clickDetector = useClickDetector<PdfWidgetAnnoObject>({\n getTool,\n onClickDetected: (pos) => {\n const defaults = getDefaults();\n if (!defaults) return;\n\n const tool = getTool();\n const clickConfig = tool?.clickBehavior;\n if (!clickConfig?.enabled) return;\n\n const { width, height } = clickConfig.defaultSize;\n const x = clamp(pos.x - width / 2, 0, pageSize.width - width);\n const y = clamp(pos.y - height / 2, 0, pageSize.height - height);\n const rect: Rect = {\n origin: { x, y },\n size: { width, height },\n };\n onCommit(buildAnnotation(rect));\n },\n });\n\n const getPreview = (current: {\n x: number;\n y: number;\n }): PreviewState<PdfAnnotationSubtype.WIDGET> | null => {\n const start = getStart();\n if (!start) return null;\n\n const defaults = getDefaults();\n if (!defaults) return null;\n\n const rect = buildRect(start, current);\n return {\n type: PdfAnnotationSubtype.WIDGET,\n bounds: rect,\n data: { rect, ...defaults },\n };\n };\n\n return {\n onPointerDown: (pos, evt) => {\n const clampedPos = clampToPage(pos);\n setStart(clampedPos);\n clickDetector.onStart(clampedPos);\n onPreview(getPreview(clampedPos));\n evt.setPointerCapture?.();\n },\n\n onPointerMove: (pos) => {\n const clampedPos = clampToPage(pos);\n clickDetector.onMove(clampedPos);\n\n if (getStart() && clickDetector.hasMoved()) {\n onPreview(getPreview(clampedPos));\n }\n },\n\n onPointerUp: (pos, evt) => {\n const start = getStart();\n if (!start) return;\n\n const clampedPos = clampToPage(pos);\n\n if (!clickDetector.hasMoved()) {\n clickDetector.onEnd(clampedPos);\n } else {\n const rect = buildRect(start, clampedPos);\n if (rect.size.width > 5 && rect.size.height > 5) {\n onCommit(buildAnnotation(rect));\n }\n }\n\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n\n onPointerLeave: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n\n onPointerCancel: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n };\n },\n};\n","import {\n PdfAnnotationSubtype,\n PdfWidgetAnnoObject,\n PDF_FORM_FIELD_TYPE,\n PDF_FORM_FIELD_FLAG,\n Rect,\n uuidV4,\n} from '@embedpdf/models';\nimport {\n HandlerFactory,\n PreviewState,\n useState,\n useClickDetector,\n} from '@embedpdf/plugin-annotation';\nimport { clamp } from '@embedpdf/core';\n\nexport const radioButtonHandlerFactory: HandlerFactory<PdfWidgetAnnoObject> = {\n annotationType: PdfAnnotationSubtype.WIDGET,\n\n create(context) {\n const { pageIndex, onCommit, onPreview, getTool, pageSize } = context;\n const [getStart, setStart] = useState<{ x: number; y: number } | null>(null);\n\n const clampToPage = (pos: { x: number; y: number }) => ({\n x: clamp(pos.x, 0, pageSize.width),\n y: clamp(pos.y, 0, pageSize.height),\n });\n\n const getDefaults = () => {\n const tool = getTool();\n if (!tool) return null;\n return {\n ...tool.defaults,\n strokeColor: tool.defaults.strokeColor ?? '#000000',\n color: tool.defaults.color ?? '#FFFFFF',\n strokeWidth: tool.defaults.strokeWidth ?? 1,\n field: tool.defaults.field,\n };\n };\n\n const buildRect = (start: { x: number; y: number }, end: { x: number; y: number }): Rect => {\n const dx = end.x - start.x;\n const dy = end.y - start.y;\n const side = Math.max(Math.abs(dx), Math.abs(dy));\n const sx = dx < 0 ? -side : side;\n const sy = dy < 0 ? -side : side;\n const minX = Math.min(start.x, start.x + sx);\n const minY = Math.min(start.y, start.y + sy);\n return {\n origin: { x: minX, y: minY },\n size: { width: side, height: side },\n };\n };\n\n const buildAnnotation = (rect: Rect): PdfWidgetAnnoObject => {\n const defaults = getDefaults()!;\n const fieldName = `RadioButton_${uuidV4().slice(0, 8)}`;\n const id = uuidV4();\n return {\n ...defaults,\n type: PdfAnnotationSubtype.WIDGET,\n id,\n pageIndex,\n rect,\n created: new Date(),\n strokeColor: defaults.strokeColor,\n color: defaults.color,\n strokeWidth: defaults.strokeWidth,\n exportValue: id,\n field: {\n type: PDF_FORM_FIELD_TYPE.RADIOBUTTON,\n flag:\n defaults.field?.flag ??\n PDF_FORM_FIELD_FLAG.BUTTON_RADIO | PDF_FORM_FIELD_FLAG.BUTTON_NOTOGGLETOOFF,\n name: fieldName,\n alternateName: fieldName,\n value: 'Off',\n options: [],\n },\n } as PdfWidgetAnnoObject;\n };\n\n const clickDetector = useClickDetector<PdfWidgetAnnoObject>({\n getTool,\n onClickDetected: (pos) => {\n const defaults = getDefaults();\n if (!defaults) return;\n\n const tool = getTool();\n const clickConfig = tool?.clickBehavior;\n if (!clickConfig?.enabled) return;\n\n const { width, height } = clickConfig.defaultSize;\n const x = clamp(pos.x - width / 2, 0, pageSize.width - width);\n const y = clamp(pos.y - height / 2, 0, pageSize.height - height);\n const rect: Rect = {\n origin: { x, y },\n size: { width, height },\n };\n onCommit(buildAnnotation(rect));\n },\n });\n\n const getPreview = (current: {\n x: number;\n y: number;\n }): PreviewState<PdfAnnotationSubtype.WIDGET> | null => {\n const start = getStart();\n if (!start) return null;\n\n const defaults = getDefaults();\n if (!defaults) return null;\n\n const rect = buildRect(start, current);\n return {\n type: PdfAnnotationSubtype.WIDGET,\n bounds: rect,\n data: { rect, ...defaults },\n };\n };\n\n return {\n onPointerDown: (pos, evt) => {\n const clampedPos = clampToPage(pos);\n setStart(clampedPos);\n clickDetector.onStart(clampedPos);\n onPreview(getPreview(clampedPos));\n evt.setPointerCapture?.();\n },\n\n onPointerMove: (pos) => {\n const clampedPos = clampToPage(pos);\n clickDetector.onMove(clampedPos);\n\n if (getStart() && clickDetector.hasMoved()) {\n onPreview(getPreview(clampedPos));\n }\n },\n\n onPointerUp: (pos, evt) => {\n const start = getStart();\n if (!start) return;\n\n const clampedPos = clampToPage(pos);\n\n if (!clickDetector.hasMoved()) {\n clickDetector.onEnd(clampedPos);\n } else {\n const rect = buildRect(start, clampedPos);\n if (rect.size.width > 5 && rect.size.height > 5) {\n onCommit(buildAnnotation(rect));\n }\n }\n\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n\n onPointerLeave: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n\n onPointerCancel: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n };\n },\n};\n","import {\n PdfAnnotationSubtype,\n PdfWidgetAnnoObject,\n PDF_FORM_FIELD_TYPE,\n PDF_FORM_FIELD_FLAG,\n PdfStandardFont,\n Rect,\n uuidV4,\n} from '@embedpdf/models';\nimport {\n HandlerFactory,\n PreviewState,\n useState,\n useClickDetector,\n} from '@embedpdf/plugin-annotation';\nimport { clamp } from '@embedpdf/core';\n\nexport const comboboxHandlerFactory: HandlerFactory<PdfWidgetAnnoObject> = {\n annotationType: PdfAnnotationSubtype.WIDGET,\n\n create(context) {\n const { pageIndex, onCommit, onPreview, getTool, pageSize } = context;\n const [getStart, setStart] = useState<{ x: number; y: number } | null>(null);\n\n const clampToPage = (pos: { x: number; y: number }) => ({\n x: clamp(pos.x, 0, pageSize.width),\n y: clamp(pos.y, 0, pageSize.height),\n });\n\n const getDefaults = () => {\n const tool = getTool();\n if (!tool) return null;\n return {\n ...tool.defaults,\n fontFamily: tool.defaults.fontFamily ?? PdfStandardFont.Helvetica,\n fontSize: tool.defaults.fontSize ?? 12,\n fontColor: tool.defaults.fontColor ?? '#000000',\n strokeColor: tool.defaults.strokeColor ?? '#000000',\n color: tool.defaults.color ?? '#FFFFFF',\n strokeWidth: tool.defaults.strokeWidth ?? 1,\n field: tool.defaults.field,\n };\n };\n\n const buildRect = (start: { x: number; y: number }, end: { x: number; y: number }): Rect => {\n const minX = Math.min(start.x, end.x);\n const minY = Math.min(start.y, end.y);\n const width = Math.abs(start.x - end.x);\n const height = Math.abs(start.y - end.y);\n return {\n origin: { x: minX, y: minY },\n size: { width, height },\n };\n };\n\n const buildAnnotation = (rect: Rect): PdfWidgetAnnoObject => {\n const defaults = getDefaults()!;\n const fieldName = `Combobox_${uuidV4().slice(0, 8)}`;\n return {\n ...defaults,\n type: PdfAnnotationSubtype.WIDGET,\n id: uuidV4(),\n pageIndex,\n rect,\n created: new Date(),\n fontFamily: defaults.fontFamily,\n fontSize: defaults.fontSize,\n fontColor: defaults.fontColor,\n strokeColor: defaults.strokeColor,\n color: defaults.color,\n strokeWidth: defaults.strokeWidth,\n field: {\n type: PDF_FORM_FIELD_TYPE.COMBOBOX,\n flag: defaults.field?.flag ?? PDF_FORM_FIELD_FLAG.NONE,\n name: fieldName,\n alternateName: fieldName,\n value: '',\n options: [\n { label: 'Option 1', isSelected: true },\n { label: 'Option 2', isSelected: false },\n { label: 'Option 3', isSelected: false },\n ],\n },\n } as PdfWidgetAnnoObject;\n };\n\n const clickDetector = useClickDetector<PdfWidgetAnnoObject>({\n getTool,\n onClickDetected: (pos) => {\n const defaults = getDefaults();\n if (!defaults) return;\n\n const tool = getTool();\n const clickConfig = tool?.clickBehavior;\n if (!clickConfig?.enabled) return;\n\n const { width, height } = clickConfig.defaultSize;\n const x = clamp(pos.x - width / 2, 0, pageSize.width - width);\n const y = clamp(pos.y - height / 2, 0, pageSize.height - height);\n const rect: Rect = {\n origin: { x, y },\n size: { width, height },\n };\n onCommit(buildAnnotation(rect));\n },\n });\n\n const getPreview = (current: {\n x: number;\n y: number;\n }): PreviewState<PdfAnnotationSubtype.WIDGET> | null => {\n const start = getStart();\n if (!start) return null;\n\n const defaults = getDefaults();\n if (!defaults) return null;\n\n const rect = buildRect(start, current);\n return {\n type: PdfAnnotationSubtype.WIDGET,\n bounds: rect,\n data: { rect, ...defaults },\n };\n };\n\n return {\n onPointerDown: (pos, evt) => {\n const clampedPos = clampToPage(pos);\n setStart(clampedPos);\n clickDetector.onStart(clampedPos);\n onPreview(getPreview(clampedPos));\n evt.setPointerCapture?.();\n },\n\n onPointerMove: (pos) => {\n const clampedPos = clampToPage(pos);\n clickDetector.onMove(clampedPos);\n\n if (getStart() && clickDetector.hasMoved()) {\n onPreview(getPreview(clampedPos));\n }\n },\n\n onPointerUp: (pos, evt) => {\n const start = getStart();\n if (!start) return;\n\n const clampedPos = clampToPage(pos);\n\n if (!clickDetector.hasMoved()) {\n clickDetector.onEnd(clampedPos);\n } else {\n const rect = buildRect(start, clampedPos);\n if (rect.size.width > 5 && rect.size.height > 5) {\n onCommit(buildAnnotation(rect));\n }\n }\n\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n\n onPointerLeave: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n\n onPointerCancel: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n };\n },\n};\n","import {\n PdfAnnotationSubtype,\n PdfWidgetAnnoObject,\n PDF_FORM_FIELD_TYPE,\n PDF_FORM_FIELD_FLAG,\n PdfStandardFont,\n Rect,\n uuidV4,\n} from '@embedpdf/models';\nimport {\n HandlerFactory,\n PreviewState,\n useState,\n useClickDetector,\n} from '@embedpdf/plugin-annotation';\nimport { clamp } from '@embedpdf/core';\n\nexport const listboxHandlerFactory: HandlerFactory<PdfWidgetAnnoObject> = {\n annotationType: PdfAnnotationSubtype.WIDGET,\n\n create(context) {\n const { pageIndex, onCommit, onPreview, getTool, pageSize } = context;\n const [getStart, setStart] = useState<{ x: number; y: number } | null>(null);\n\n const clampToPage = (pos: { x: number; y: number }) => ({\n x: clamp(pos.x, 0, pageSize.width),\n y: clamp(pos.y, 0, pageSize.height),\n });\n\n const getDefaults = () => {\n const tool = getTool();\n if (!tool) return null;\n return {\n ...tool.defaults,\n fontFamily: tool.defaults.fontFamily ?? PdfStandardFont.Helvetica,\n fontSize: tool.defaults.fontSize ?? 12,\n fontColor: tool.defaults.fontColor ?? '#000000',\n strokeColor: tool.defaults.strokeColor ?? '#000000',\n color: tool.defaults.color ?? '#FFFFFF',\n strokeWidth: tool.defaults.strokeWidth ?? 1,\n field: tool.defaults.field,\n };\n };\n\n const buildRect = (start: { x: number; y: number }, end: { x: number; y: number }): Rect => {\n const minX = Math.min(start.x, end.x);\n const minY = Math.min(start.y, end.y);\n const width = Math.abs(start.x - end.x);\n const height = Math.abs(start.y - end.y);\n return {\n origin: { x: minX, y: minY },\n size: { width, height },\n };\n };\n\n const buildAnnotation = (rect: Rect): PdfWidgetAnnoObject => {\n const defaults = getDefaults()!;\n const fieldName = `Listbox_${uuidV4().slice(0, 8)}`;\n return {\n ...defaults,\n type: PdfAnnotationSubtype.WIDGET,\n id: uuidV4(),\n pageIndex,\n rect,\n created: new Date(),\n fontFamily: defaults.fontFamily,\n fontSize: defaults.fontSize,\n fontColor: defaults.fontColor,\n strokeColor: defaults.strokeColor,\n color: defaults.color,\n strokeWidth: defaults.strokeWidth,\n field: {\n type: PDF_FORM_FIELD_TYPE.LISTBOX,\n flag: defaults.field?.flag ?? PDF_FORM_FIELD_FLAG.NONE,\n name: fieldName,\n alternateName: fieldName,\n value: '',\n options: [\n { label: 'Option 1', isSelected: true },\n { label: 'Option 2', isSelected: false },\n { label: 'Option 3', isSelected: false },\n ],\n },\n } as PdfWidgetAnnoObject;\n };\n\n const clickDetector = useClickDetector<PdfWidgetAnnoObject>({\n getTool,\n onClickDetected: (pos) => {\n const defaults = getDefaults();\n if (!defaults) return;\n\n const tool = getTool();\n const clickConfig = tool?.clickBehavior;\n if (!clickConfig?.enabled) return;\n\n const { width, height } = clickConfig.defaultSize;\n const x = clamp(pos.x - width / 2, 0, pageSize.width - width);\n const y = clamp(pos.y - height / 2, 0, pageSize.height - height);\n const rect: Rect = {\n origin: { x, y },\n size: { width, height },\n };\n onCommit(buildAnnotation(rect));\n },\n });\n\n const getPreview = (current: {\n x: number;\n y: number;\n }): PreviewState<PdfAnnotationSubtype.WIDGET> | null => {\n const start = getStart();\n if (!start) return null;\n\n const defaults = getDefaults();\n if (!defaults) return null;\n\n const rect = buildRect(start, current);\n return {\n type: PdfAnnotationSubtype.WIDGET,\n bounds: rect,\n data: { rect, ...defaults },\n };\n };\n\n return {\n onPointerDown: (pos, evt) => {\n const clampedPos = clampToPage(pos);\n setStart(clampedPos);\n clickDetector.onStart(clampedPos);\n onPreview(getPreview(clampedPos));\n evt.setPointerCapture?.();\n },\n\n onPointerMove: (pos) => {\n const clampedPos = clampToPage(pos);\n clickDetector.onMove(clampedPos);\n\n if (getStart() && clickDetector.hasMoved()) {\n onPreview(getPreview(clampedPos));\n }\n },\n\n onPointerUp: (pos, evt) => {\n const start = getStart();\n if (!start) return;\n\n const clampedPos = clampToPage(pos);\n\n if (!clickDetector.hasMoved()) {\n clickDetector.onEnd(clampedPos);\n } else {\n const rect = buildRect(start, clampedPos);\n if (rect.size.width > 5 && rect.size.height > 5) {\n onCommit(buildAnnotation(rect));\n }\n }\n\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n\n onPointerLeave: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n\n onPointerCancel: (_, evt) => {\n setStart(null);\n onPreview(null);\n clickDetector.reset();\n evt.releasePointerCapture?.();\n },\n };\n },\n};\n","import {\n PdfAnnotationObject,\n PdfAnnotationSubtype,\n PDF_FORM_FIELD_TYPE,\n PDF_FORM_FIELD_FLAG,\n PdfWidgetAnnoObject,\n PdfStandardFont,\n} from '@embedpdf/models';\nimport { AnnotationTool, defineAnnotationTool } from '@embedpdf/plugin-annotation';\nimport {\n textFieldHandlerFactory,\n checkboxHandlerFactory,\n radioButtonHandlerFactory,\n comboboxHandlerFactory,\n listboxHandlerFactory,\n} from './handlers';\n\nexport const formTextFieldTool = defineAnnotationTool({\n id: 'formTextField' as const,\n name: 'Text Field',\n labelKey: 'form.textfield',\n categories: ['annotation', 'form'],\n matchScore: (a: PdfAnnotationObject) => {\n if (a.type !== PdfAnnotationSubtype.WIDGET) return 0;\n const widget = a;\n return widget.field?.type === PDF_FORM_FIELD_TYPE.TEXTFIELD ? 10 : 0;\n },\n interaction: {\n exclusive: false,\n cursor: 'crosshair',\n isDraggable: true,\n isResizable: true,\n isRotatable: false,\n isGroupDraggable: true,\n isGroupResizable: false,\n isGroupRotatable: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.WIDGET,\n fontFamily: PdfStandardFont.Helvetica,\n fontSize: 12,\n fontColor: '#000000',\n strokeColor: '#000000',\n color: '#FFFFFF',\n strokeWidth: 1,\n field: {\n flag: PDF_FORM_FIELD_FLAG.NONE,\n name: 'TextField',\n alternateName: 'TextField',\n value: '',\n type: PDF_FORM_FIELD_TYPE.TEXTFIELD,\n },\n },\n behavior: {\n useAppearanceStream: false,\n },\n clickBehavior: {\n enabled: true,\n defaultSize: { width: 150, height: 24 },\n },\n pointerHandler: textFieldHandlerFactory,\n} satisfies AnnotationTool<PdfWidgetAnnoObject, 'formTextField'>);\n\nexport const formCheckboxTool = defineAnnotationTool({\n id: 'formCheckbox' as const,\n name: 'Checkbox',\n labelKey: 'form.checkbox',\n categories: ['annotation', 'form'],\n matchScore: (a: PdfAnnotationObject) => {\n if (a.type !== PdfAnnotationSubtype.WIDGET) return 0;\n const widget = a;\n return widget.field?.type === PDF_FORM_FIELD_TYPE.CHECKBOX ? 10 : 0;\n },\n interaction: {\n exclusive: false,\n cursor: 'crosshair',\n isDraggable: true,\n isResizable: true,\n isRotatable: false,\n isGroupDraggable: true,\n isGroupResizable: false,\n isGroupRotatable: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.WIDGET,\n strokeColor: '#000000',\n color: '#FFFFFF',\n strokeWidth: 1,\n field: {\n flag: PDF_FORM_FIELD_FLAG.NONE,\n name: 'Checkbox',\n alternateName: 'Checkbox',\n value: 'Off',\n type: PDF_FORM_FIELD_TYPE.CHECKBOX,\n },\n },\n behavior: {\n useAppearanceStream: false,\n },\n clickBehavior: {\n enabled: true,\n defaultSize: { width: 20, height: 20 },\n },\n pointerHandler: checkboxHandlerFactory,\n} satisfies AnnotationTool<PdfWidgetAnnoObject, 'formCheckbox'>);\n\nexport const formRadioButtonTool = defineAnnotationTool({\n id: 'formRadioButton' as const,\n name: 'Radio Button',\n labelKey: 'form.radiobutton',\n categories: ['annotation', 'form'],\n matchScore: (a: PdfAnnotationObject) => {\n if (a.type !== PdfAnnotationSubtype.WIDGET) return 0;\n const widget = a;\n return widget.field?.type === PDF_FORM_FIELD_TYPE.RADIOBUTTON ? 10 : 0;\n },\n interaction: {\n exclusive: false,\n cursor: 'crosshair',\n isDraggable: true,\n isResizable: true,\n isRotatable: false,\n lockAspectRatio: true,\n isGroupDraggable: true,\n isGroupResizable: false,\n isGroupRotatable: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.WIDGET,\n strokeColor: '#000000',\n color: '#FFFFFF',\n strokeWidth: 1,\n field: {\n flag: PDF_FORM_FIELD_FLAG.BUTTON_RADIO | PDF_FORM_FIELD_FLAG.BUTTON_NOTOGGLETOOFF,\n name: 'RadioButton',\n alternateName: 'RadioButton',\n value: 'Off',\n type: PDF_FORM_FIELD_TYPE.RADIOBUTTON,\n options: [],\n },\n },\n behavior: {\n useAppearanceStream: false,\n },\n clickBehavior: {\n enabled: true,\n defaultSize: { width: 20, height: 20 },\n },\n pointerHandler: radioButtonHandlerFactory,\n} satisfies AnnotationTool<PdfWidgetAnnoObject, 'formRadioButton'>);\n\nexport const formComboboxTool = defineAnnotationTool({\n id: 'formCombobox' as const,\n name: 'Combo Box',\n labelKey: 'form.combobox',\n categories: ['annotation', 'form'],\n matchScore: (a: PdfAnnotationObject) => {\n if (a.type !== PdfAnnotationSubtype.WIDGET) return 0;\n const widget = a;\n return widget.field?.type === PDF_FORM_FIELD_TYPE.COMBOBOX ? 10 : 0;\n },\n interaction: {\n exclusive: false,\n cursor: 'crosshair',\n isDraggable: true,\n isResizable: true,\n isRotatable: false,\n isGroupDraggable: true,\n isGroupResizable: false,\n isGroupRotatable: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.WIDGET,\n fontFamily: PdfStandardFont.Helvetica,\n fontSize: 12,\n fontColor: '#000000',\n strokeColor: '#000000',\n color: '#FFFFFF',\n strokeWidth: 1,\n field: {\n flag: PDF_FORM_FIELD_FLAG.NONE,\n name: 'ComboBox',\n alternateName: 'ComboBox',\n value: '',\n type: PDF_FORM_FIELD_TYPE.COMBOBOX,\n options: [\n { label: 'Option 1', isSelected: true },\n { label: 'Option 2', isSelected: false },\n { label: 'Option 3', isSelected: false },\n ],\n },\n },\n behavior: {\n useAppearanceStream: false,\n },\n clickBehavior: {\n enabled: true,\n defaultSize: { width: 200, height: 40 },\n },\n pointerHandler: comboboxHandlerFactory,\n} satisfies AnnotationTool<PdfWidgetAnnoObject, 'formCombobox'>);\n\nexport const formListboxTool = defineAnnotationTool({\n id: 'formListbox' as const,\n name: 'List Box',\n labelKey: 'form.listbox',\n categories: ['annotation', 'form'],\n matchScore: (a: PdfAnnotationObject) => {\n if (a.type !== PdfAnnotationSubtype.WIDGET) return 0;\n const widget = a;\n return widget.field?.type === PDF_FORM_FIELD_TYPE.LISTBOX ? 10 : 0;\n },\n interaction: {\n exclusive: false,\n cursor: 'crosshair',\n isDraggable: true,\n isResizable: true,\n isRotatable: false,\n isGroupDraggable: true,\n isGroupResizable: false,\n isGroupRotatable: false,\n },\n defaults: {\n type: PdfAnnotationSubtype.WIDGET,\n fontFamily: PdfStandardFont.Helvetica,\n fontSize: 12,\n fontColor: '#000000',\n strokeColor: '#000000',\n color: '#FFFFFF',\n strokeWidth: 1,\n field: {\n flag: PDF_FORM_FIELD_FLAG.NONE,\n name: 'ListBox',\n alternateName: 'ListBox',\n value: '',\n type: PDF_FORM_FIELD_TYPE.LISTBOX,\n options: [\n { label: 'Option 1', isSelected: true },\n { label: 'Option 2', isSelected: false },\n { label: 'Option 3', isSelected: false },\n ],\n },\n },\n behavior: {\n useAppearanceStream: false,\n },\n clickBehavior: {\n enabled: true,\n defaultSize: { width: 150, height: 150 },\n },\n pointerHandler: listboxHandlerFactory,\n} satisfies AnnotationTool<PdfWidgetAnnoObject, 'formListbox'>);\n\nexport const formTools = [\n formTextFieldTool,\n formCheckboxTool,\n formRadioButtonTool,\n formComboboxTool,\n formListboxTool,\n];\n","import { BasePlugin, createScopedEmitter, PluginRegistry } from '@embedpdf/core';\nimport {\n FieldGroupEntry,\n FieldValueChangeEvent,\n FormCapability,\n FormDocumentState,\n FormFieldInfo,\n FormPluginConfig,\n FormReadyEvent,\n FormScope,\n FormState,\n FormStateChangeEvent,\n RenameFieldResult,\n RenderWidgetOptions,\n} from './types';\nimport {\n FormAction,\n initFormState,\n cleanupFormState,\n selectField as selectFieldAction,\n deselectField as deselectFieldAction,\n} from './actions';\nimport {\n PdfAnnotationObject,\n PdfAnnotationSubtype,\n PdfCheckboxWidgetAnnoField,\n PdfDocumentObject,\n PdfErrorCode,\n PdfErrorReason,\n PDF_FORM_FIELD_FLAG,\n PDF_FORM_FIELD_TYPE,\n PdfRadioButtonWidgetAnnoField,\n PdfTask,\n PdfTaskHelper,\n PdfWidgetAnnoField,\n PdfWidgetAnnoObject,\n Task,\n TaskSequence,\n isWidgetChecked,\n} from '@embedpdf/models';\nimport {\n AnnotationCapability,\n AnnotationEvent,\n AnnotationPlugin,\n} from '@embedpdf/plugin-annotation';\nimport { Command, HistoryCapability, HistoryPlugin } from '@embedpdf/plugin-history';\nimport { initialDocumentState } from './reducer';\nimport { formTools } from './tools';\n\nexport class FormPlugin extends BasePlugin<\n FormPluginConfig,\n FormCapability,\n FormState,\n FormAction\n> {\n static readonly id = 'form' as const;\n\n private readonly FORM_HISTORY_TOPIC = 'form-fields';\n\n private annotation: AnnotationCapability | null = null;\n private history: HistoryCapability | null = null;\n\n private readonly state$ = createScopedEmitter<FormDocumentState, FormStateChangeEvent, string>(\n (documentId, state) => ({ documentId, state }),\n );\n private readonly fieldValueChange$ = createScopedEmitter<\n FieldValueChangeEvent,\n FieldValueChangeEvent,\n string\n >((_, event) => event, { cache: false });\n private readonly formReady$ = createScopedEmitter<FormFieldInfo[], FormReadyEvent, string>(\n (documentId, fields) => ({ documentId, fields }),\n { cache: false },\n );\n\n /** Per-document logical field index: documentId → (fieldKey → FieldGroupEntry[]) */\n private readonly fieldGroupIndex = new Map<string, Map<string, FieldGroupEntry[]>>();\n\n /** Per-document name-based index: documentId → (fieldName → FieldGroupEntry[]) */\n private readonly fieldNameIndex = new Map<string, Map<string, FieldGroupEntry[]>>();\n\n /** Per-document tab-order sorted widget list: documentId → FieldGroupEntry[] */\n private readonly orderedFieldIndex = new Map<string, FieldGroupEntry[]>();\n\n /** IDs currently being propagated to siblings; prevents recursive loops */\n private readonly propagationInProgress = new Set<string>();\n\n constructor(id: string, registry: PluginRegistry, _config: FormPluginConfig) {\n super(id, registry);\n\n this.annotation = registry.getPlugin<AnnotationPlugin>('annotation')?.provides() ?? null;\n this.history = registry.getPlugin<HistoryPlugin>(HistoryPlugin.id)?.provides() ?? null;\n\n if (this.annotation) {\n for (const tool of formTools) {\n this.annotation.addTool(tool);\n }\n this.annotation.onAnnotationEvent((event) => this.handleAnnotationEvent(event));\n }\n }\n\n async initialize(): Promise<void> {}\n\n protected override onDocumentLoadingStarted(documentId: string): void {\n this.dispatch(initFormState(documentId, { ...initialDocumentState }));\n }\n\n protected override onDocumentClosed(documentId: string): void {\n this.dispatch(cleanupFormState(documentId));\n this.fieldGroupIndex.delete(documentId);\n this.fieldNameIndex.delete(documentId);\n this.orderedFieldIndex.delete(documentId);\n\n // Cleanup scoped emitter caches and listeners\n this.state$.clearScope(documentId);\n this.fieldValueChange$.clearScope(documentId);\n this.formReady$.clearScope(documentId);\n }\n\n override onStoreUpdated(prev: FormState, next: FormState): void {\n for (const documentId in next.documents) {\n const prevDoc = prev.documents[documentId];\n const nextDoc = next.documents[documentId];\n if (prevDoc !== nextDoc) {\n this.state$.emit(documentId, nextDoc);\n }\n }\n }\n\n protected buildCapability(): FormCapability {\n return {\n getPageFormAnnoWidgets: (pageIndex, documentId?) =>\n this.getPageFormAnnoWidgets(pageIndex, documentId),\n setFormFieldValues: (pageIndex, annotation, newField, documentId?) =>\n this.setFormFieldValues(pageIndex, annotation, newField, documentId),\n renameField: (annotationId, name, documentId?) =>\n this.renameFieldMethod(annotationId, name, documentId),\n shareField: (annotationId, targetAnnotationId, documentId?) =>\n this.shareFieldMethod(annotationId, targetAnnotationId, documentId),\n renderWidget: (options, documentId?) => this.renderWidget(options, documentId),\n selectField: (annotationId, documentId?) => this.selectFieldMethod(annotationId, documentId),\n deselectField: (documentId?) => this.deselectFieldMethod(documentId),\n getSelectedFieldId: (documentId?) => this.getSelectedFieldId(documentId),\n selectNextField: (documentId?) => this.selectNextFieldMethod(documentId),\n selectPreviousField: (documentId?) => this.selectPreviousFieldMethod(documentId),\n activateField: (documentId?) => this.activateFieldMethod(documentId),\n getState: (documentId?) => this.getDocumentState(documentId),\n getFieldGroup: (annotationId, documentId?) => this.getFieldGroup(annotationId, documentId),\n getFieldSiblings: (annotationId, documentId?) =>\n this.getFieldSiblings(annotationId, documentId),\n getFormValues: (documentId?) => this.getFormValuesMethod(documentId),\n getFormFields: (documentId?) => this.getFormFieldsMethod(documentId),\n setFormValues: (values, documentId?) => this.setFormValuesMethod(values, documentId),\n forDocument: (documentId) => this.createFormScope(documentId),\n onStateChange: this.state$.onGlobal,\n onFieldValueChange: this.fieldValueChange$.onGlobal,\n onFormReady: this.formReady$.onGlobal,\n };\n }\n\n private createFormScope(documentId: string): FormScope {\n return {\n getPageFormAnnoWidgets: (pageIndex) => this.getPageFormAnnoWidgets(pageIndex, documentId),\n setFormFieldValues: (pageIndex, annotation, newField) =>\n this.setFormFieldValues(pageIndex, annotation, newField, documentId),\n renameField: (annotationId, name) => this.renameFieldMethod(annotationId, name, documentId),\n shareField: (annotationId, targetAnnotationId) =>\n this.shareFieldMethod(annotationId, targetAnnotationId, documentId),\n renderWidget: (options) => this.renderWidget(options, documentId),\n selectField: (annotationId) => this.selectFieldMethod(annotationId, documentId),\n deselectField: () => this.deselectFieldMethod(documentId),\n getSelectedFieldId: () => this.getSelectedFieldId(documentId),\n selectNextField: () => this.selectNextFieldMethod(documentId),\n selectPreviousField: () => this.selectPreviousFieldMethod(documentId),\n activateField: () => this.activateFieldMethod(documentId),\n getState: () => this.getDocumentState(documentId),\n getFieldGroup: (annotationId) => this.getFieldGroup(annotationId, documentId),\n getFieldSiblings: (annotationId) => this.getFieldSiblings(annotationId, documentId),\n getFormValues: () => this.getFormValuesMethod(documentId),\n getFormFields: () => this.getFormFieldsMethod(documentId),\n setFormValues: (values) => this.setFormValuesMethod(values, documentId),\n onStateChange: this.state$.forScope(documentId),\n onFieldValueChange: this.fieldValueChange$.forScope(documentId),\n onFormReady: this.formReady$.forScope(documentId),\n };\n }\n\n private handleAnnotationEvent(event: AnnotationEvent): void {\n switch (event.type) {\n case 'loaded':\n this.buildFieldGroupIndex(event.documentId);\n this.formReady$.emit(event.documentId, this.getFormFieldsMethod(event.documentId));\n break;\n\n case 'create':\n case 'delete': {\n if (event.annotation.type !== PdfAnnotationSubtype.WIDGET) break;\n this.buildFieldGroupIndex(event.documentId);\n break;\n }\n\n case 'update': {\n if (!event.committed) break;\n const anno = event.annotation;\n if (anno.type !== PdfAnnotationSubtype.WIDGET) break;\n\n if (this.propagationInProgress.has(anno.id)) {\n this.propagationInProgress.delete(anno.id);\n break;\n }\n\n const patch = event.patch as Partial<PdfWidgetAnnoObject>;\n\n this.buildFieldGroupIndex(event.documentId);\n this.propagateFieldLevelChanges(event.documentId, anno, patch);\n break;\n }\n }\n }\n\n private propagateFieldLevelChanges(\n documentId: string,\n annotation: PdfAnnotationObject,\n patch: Partial<PdfWidgetAnnoObject>,\n ): void {\n if (!this.annotation || !patch.field) return;\n\n const fieldPatch = patch.field;\n\n const siblings = this.getFieldSiblings(annotation.id, documentId);\n if (siblings.length === 0) return;\n\n const siblingPatches: Array<{\n pageIndex: number;\n id: string;\n patch: Partial<PdfAnnotationObject>;\n }> = [];\n\n for (const sibling of siblings) {\n this.propagationInProgress.add(sibling.annotationId);\n siblingPatches.push({\n pageIndex: sibling.pageIndex,\n id: sibling.annotationId,\n patch: { field: { ...fieldPatch } } as Partial<PdfAnnotationObject>,\n });\n }\n\n this.annotation.forDocument(documentId).updateAnnotations(siblingPatches);\n }\n\n private buildFieldGroupIndex(documentId: string): void {\n if (!this.annotation) return;\n const annoState = this.annotation.forDocument(documentId).getState();\n if (!annoState) return;\n\n const idx = new Map<string, FieldGroupEntry[]>();\n const allWidgets: { entry: FieldGroupEntry; widget: PdfWidgetAnnoObject }[] = [];\n\n for (const [pageStr, uids] of Object.entries(annoState.pages)) {\n const pageIndex = Number(pageStr);\n for (const uid of uids) {\n const tracked = annoState.byUid[uid];\n if (!tracked || tracked.object.type !== PdfAnnotationSubtype.WIDGET) continue;\n const widget = tracked.object as PdfWidgetAnnoObject;\n\n const entry: FieldGroupEntry = { annotationId: uid, pageIndex };\n allWidgets.push({ entry, widget });\n\n const fieldKey = this.getFieldKey(widget.field);\n if (!fieldKey) continue;\n\n const group = idx.get(fieldKey) ?? [];\n group.push(entry);\n idx.set(fieldKey, group);\n }\n }\n\n this.fieldGroupIndex.set(documentId, idx);\n\n const nameIdx = new Map<string, FieldGroupEntry[]>();\n for (const { entry, widget } of allWidgets) {\n const name = widget.field.name.trim();\n if (!name) continue;\n const group = nameIdx.get(name) ?? [];\n group.push(entry);\n nameIdx.set(name, group);\n }\n this.fieldNameIndex.set(documentId, nameIdx);\n\n const navigable = allWidgets.filter(\n ({ widget }) => !(widget.field.flag & PDF_FORM_FIELD_FLAG.READONLY),\n );\n this.orderedFieldIndex.set(\n documentId,\n navigable.map(({ entry }) => entry),\n );\n }\n\n private getDocumentState(documentId?: string): FormDocumentState {\n const id = documentId ?? this.getActiveDocumentId();\n return this.state.documents[id] ?? { ...initialDocumentState };\n }\n\n // ─────────────────────────────────────────────────────────\n // Field Group Index\n // ─────────────────────────────────────────────────────────\n\n private getDocIndex(documentId: string): Map<string, FieldGroupEntry[]> {\n let idx = this.fieldGroupIndex.get(documentId);\n if (!idx) {\n idx = new Map();\n this.fieldGroupIndex.set(documentId, idx);\n }\n return idx;\n }\n\n private getFieldKey(field: PdfWidgetAnnoField): string | null {\n if (typeof field.fieldObjectId === 'number' && field.fieldObjectId > 0) {\n return `field:${field.fieldObjectId}`;\n }\n\n const normalizedName = field.name.trim();\n if (!normalizedName) return null;\n\n return `legacy:${field.type}:${normalizedName}`;\n }\n\n private resolveWidgetAnnotation(\n annotationId: string,\n documentId: string,\n ): PdfWidgetAnnoObject | null {\n if (!this.annotation) return null;\n\n const annoState = this.annotation.forDocument(documentId).getState();\n const tracked = annoState?.byUid[annotationId];\n if (!tracked || tracked.object.type !== PdfAnnotationSubtype.WIDGET) {\n return null;\n }\n\n return tracked.object as PdfWidgetAnnoObject;\n }\n\n public getFieldGroup(annotationId: string, documentId?: string): FieldGroupEntry[] {\n const docId = documentId ?? this.getActiveDocumentId();\n const widget = this.resolveWidgetAnnotation(annotationId, docId);\n if (!widget) return [];\n\n const fieldKey = this.getFieldKey(widget.field);\n if (!fieldKey) {\n return [{ annotationId: widget.id, pageIndex: widget.pageIndex }];\n }\n\n return (\n this.getDocIndex(docId).get(fieldKey) ?? [\n { annotationId: widget.id, pageIndex: widget.pageIndex },\n ]\n );\n }\n\n public getFieldSiblings(annotationId: string, documentId?: string): FieldGroupEntry[] {\n return this.getFieldGroup(annotationId, documentId).filter(\n (e) => e.annotationId !== annotationId,\n );\n }\n\n // ─────────────────────────────────────────────────────────\n // Form Values API\n // ─────────────────────────────────────────────────────────\n\n private getFormValuesMethod(documentId?: string): Record<string, string> {\n const docId = documentId ?? this.getActiveDocumentId();\n const nameIdx = this.fieldNameIndex.get(docId);\n if (!nameIdx) return {};\n\n const values: Record<string, string> = {};\n for (const [name, entries] of nameIdx) {\n const widget = this.resolveWidgetAnnotation(entries[0].annotationId, docId);\n if (widget) {\n values[name] = widget.field.value;\n }\n }\n return values;\n }\n\n private getFormFieldsMethod(documentId?: string): FormFieldInfo[] {\n const docId = documentId ?? this.getActiveDocumentId();\n const nameIdx = this.fieldNameIndex.get(docId);\n if (!nameIdx) return [];\n\n const fields: FormFieldInfo[] = [];\n for (const [name, entries] of nameIdx) {\n const widget = this.resolveWidgetAnnotation(entries[0].annotationId, docId);\n if (!widget) continue;\n\n fields.push({\n name,\n type: widget.field.type,\n value: widget.field.value,\n readOnly: !!(widget.field.flag & PDF_FORM_FIELD_FLAG.READONLY),\n ...('options' in widget.field && widget.field.options\n ? { options: widget.field.options }\n : {}),\n });\n }\n return fields;\n }\n\n private setFormValuesMethod(\n values: Record<string, string>,\n documentId?: string,\n ): PdfTask<boolean> {\n const docId = documentId ?? this.getActiveDocumentId();\n const nameIdx = this.fieldNameIndex.get(docId);\n if (!nameIdx) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.NotFound,\n message: 'no form fields indexed for this document',\n });\n }\n\n const entries = Object.entries(values);\n if (entries.length === 0) {\n return PdfTaskHelper.resolve(true);\n }\n\n const resultTask = new Task<boolean, PdfErrorReason>();\n let pending = entries.length;\n let failed = false;\n\n const onComplete = () => {\n pending--;\n if (pending === 0 && !failed) {\n resultTask.resolve(true);\n }\n };\n\n const onError = (err: { code: PdfErrorCode; message: string }) => {\n if (!failed) {\n failed = true;\n resultTask.reject(err);\n }\n };\n\n for (const [name, value] of entries) {\n const fieldEntries = nameIdx.get(name);\n if (!fieldEntries || fieldEntries.length === 0) {\n onComplete();\n continue;\n }\n\n let targetEntry = fieldEntries[0];\n let widget = this.resolveWidgetAnnotation(targetEntry.annotationId, docId);\n if (!widget) {\n onComplete();\n continue;\n }\n\n if (\n widget.field.type === PDF_FORM_FIELD_TYPE.RADIOBUTTON ||\n widget.field.type === PDF_FORM_FIELD_TYPE.CHECKBOX\n ) {\n for (const entry of fieldEntries) {\n const w = this.resolveWidgetAnnotation(entry.annotationId, docId);\n if (w && w.exportValue === value) {\n widget = w;\n targetEntry = entry;\n break;\n }\n }\n }\n\n this.setFormFieldValues(\n targetEntry.pageIndex,\n widget,\n this.buildImportField(widget, value),\n docId,\n ).wait(\n () => onComplete(),\n (error) => onError(error.reason),\n );\n }\n\n return resultTask;\n }\n\n private buildImportField(widget: PdfWidgetAnnoObject, value: string): PdfWidgetAnnoField {\n const field = widget.field;\n\n if (\n (field.type === PDF_FORM_FIELD_TYPE.COMBOBOX || field.type === PDF_FORM_FIELD_TYPE.LISTBOX) &&\n 'options' in field\n ) {\n return {\n ...field,\n value,\n options: field.options.map((opt) => ({\n ...opt,\n isSelected: opt.label === value,\n })),\n };\n }\n\n if (field.type === PDF_FORM_FIELD_TYPE.CHECKBOX) {\n const normalizedValue = value === 'Off' ? 'Off' : (widget.exportValue ?? 'Yes');\n return { ...field, value: normalizedValue };\n }\n\n return { ...field, value };\n }\n\n private isToggleField(\n field: PdfWidgetAnnoField,\n ): field is PdfCheckboxWidgetAnnoField | PdfRadioButtonWidgetAnnoField {\n return (\n field.type === PDF_FORM_FIELD_TYPE.CHECKBOX || field.type === PDF_FORM_FIELD_TYPE.RADIOBUTTON\n );\n }\n\n private shouldRegenerateWidgetAppearances(field: PdfWidgetAnnoField): boolean {\n return !this.isToggleField(field);\n }\n\n private getFieldBatchTarget(\n batch: Map<string, { widget: PdfWidgetAnnoObject; pageIndex: number }>,\n ): { widget: PdfWidgetAnnoObject; pageIndex: number } | undefined {\n const entries = [...batch.values()];\n const checkedToggleEntry = entries.find(\n (entry) => this.isToggleField(entry.widget.field) && isWidgetChecked(entry.widget),\n );\n return checkedToggleEntry ?? entries[0];\n }\n\n private async readFieldWidgets(\n doc: PdfDocumentObject,\n groupEntries: FieldGroupEntry[],\n seq: TaskSequence<PdfErrorReason, unknown>,\n regenerateAppearances: boolean,\n ): Promise<Map<string, { widget: PdfWidgetAnnoObject; pageIndex: number }>> {\n const pageSet = new Set(groupEntries.map((entry) => entry.pageIndex));\n const memberIds = new Set(groupEntries.map((entry) => entry.annotationId));\n const batch = new Map<string, { widget: PdfWidgetAnnoObject; pageIndex: number }>();\n\n for (const pageIndex of pageSet) {\n const page = doc.pages.find((entry) => entry.index === pageIndex);\n if (!page) continue;\n\n const pageMemberIds = groupEntries\n .filter((entry) => entry.pageIndex === pageIndex)\n .map((entry) => entry.annotationId);\n\n if (regenerateAppearances) {\n await seq.run(() => this.engine.regenerateWidgetAppearances(doc, page, pageMemberIds));\n }\n\n const widgets = await seq.run(() => this.engine.getPageAnnoWidgets(doc, page));\n for (const widget of widgets) {\n if (memberIds.has(widget.id)) {\n batch.set(widget.id, { widget, pageIndex });\n }\n }\n }\n\n return batch;\n }\n\n private syncFieldBatch(\n documentId: string,\n batch: Map<string, { widget: PdfWidgetAnnoObject; pageIndex: number }>,\n options: { emitFieldValueChanges?: boolean } = {},\n ): void {\n if (!this.annotation) return;\n\n for (const [id, { widget, pageIndex }] of batch) {\n this.annotation.syncAnnotationObject(id, widget, documentId);\n this.annotation.invalidatePageAppearances(pageIndex, documentId);\n\n if (options.emitFieldValueChanges) {\n this.fieldValueChange$.emit(documentId, {\n documentId,\n pageIndex,\n annotationId: id,\n widget,\n });\n }\n }\n\n this.buildFieldGroupIndex(documentId);\n }\n\n private resolveWidgetPage(\n annotationId: string,\n documentId: string,\n doc: PdfDocumentObject,\n ): { widget: PdfWidgetAnnoObject; page: PdfDocumentObject['pages'][number] } | null {\n const widget = this.resolveWidgetAnnotation(annotationId, documentId);\n if (!widget) return null;\n\n const page = doc.pages.find((entry) => entry.index === widget.pageIndex);\n if (!page) return null;\n\n return { widget, page };\n }\n\n private getPageFormAnnoWidgets(\n pageIndex: number,\n documentId?: string,\n ): PdfTask<PdfWidgetAnnoObject[]> {\n const docState = this.getCoreDocumentOrThrow(documentId);\n const doc = docState.document;\n\n if (!doc) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document is not open',\n });\n }\n\n const page = doc.pages.find((p) => p.index === pageIndex);\n if (!page) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.NotFound,\n message: 'page does not exist',\n });\n }\n\n return this.engine.getPageAnnoWidgets(doc, page);\n }\n\n private setFormFieldValues(\n pageIndex: number,\n annotation: PdfWidgetAnnoObject,\n newField: PdfWidgetAnnoField,\n documentId?: string,\n ): PdfTask<boolean> {\n const docId = documentId ?? this.getActiveDocumentId();\n const coreDoc = this.getCoreDocumentOrThrow(docId);\n const doc = coreDoc.document;\n\n if (!doc) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document is not open',\n });\n }\n\n const page = doc.pages.find((p) => p.index === pageIndex);\n if (!page) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.NotFound,\n message: 'page does not exist',\n });\n }\n\n const resultTask = new Task<boolean, PdfErrorReason>();\n const seq = new TaskSequence(resultTask);\n\n seq.execute(\n async () => {\n // 1. Snapshot \"before\" state for the entire field group\n const groupEntries = this.getFieldGroup(annotation.id, docId);\n const beforeEntries = await this.readFieldWidgets(doc, groupEntries, seq, false);\n\n // 2. Apply field state change to the engine (PDFium propagates to all controls)\n await seq.run(() => this.engine.setFormFieldState(doc, page, annotation, newField));\n\n // 3. Re-read fresh state for all group members, regenerating AP only when needed\n const afterEntries = await this.readFieldWidgets(\n doc,\n groupEntries,\n seq,\n this.shouldRegenerateWidgetAppearances(newField),\n );\n\n // 5. Build and register history command\n let isFirstExecution = true;\n\n const applyToEngine = async (\n batch: Map<string, { widget: PdfWidgetAnnoObject; pageIndex: number }>,\n ) => {\n const target = this.getFieldBatchTarget(batch);\n if (!target) return;\n const pg = doc.pages.find((p) => p.index === target.pageIndex);\n if (!pg) return;\n await new Promise<void>((resolve) => {\n this.engine.setFormFieldState(doc, pg, target.widget, target.widget.field).wait(\n () => resolve(),\n () => resolve(),\n );\n });\n\n if (this.shouldRegenerateWidgetAppearances(target.widget.field)) {\n for (const pi of new Set([...batch.values()].map((entry) => entry.pageIndex))) {\n const p = doc.pages.find((pp) => pp.index === pi);\n if (!p) continue;\n const ids = [...batch.entries()]\n .filter(([, entry]) => entry.pageIndex === pi)\n .map(([id]) => id);\n await new Promise<void>((resolve) => {\n this.engine.regenerateWidgetAppearances(doc, p, ids).wait(\n () => resolve(),\n () => resolve(),\n );\n });\n }\n }\n };\n\n const command: Command = {\n execute: () => {\n const skipEngine = isFirstExecution;\n isFirstExecution = false;\n\n if (skipEngine) {\n this.syncFieldBatch(docId, afterEntries, { emitFieldValueChanges: true });\n } else {\n applyToEngine(afterEntries).then(() =>\n this.syncFieldBatch(docId, afterEntries, { emitFieldValueChanges: true }),\n );\n }\n },\n\n undo: () => {\n applyToEngine(beforeEntries).then(() =>\n this.syncFieldBatch(docId, beforeEntries, { emitFieldValueChanges: true }),\n );\n },\n };\n\n if (this.history) {\n this.history.forDocument(docId).register(command, this.FORM_HISTORY_TOPIC);\n } else {\n command.execute();\n }\n\n resultTask.resolve(true);\n },\n (err) => ({ code: PdfErrorCode.Unknown, message: String(err) }),\n );\n\n return resultTask;\n }\n\n private findConflictingFieldGroups(\n normalizedName: string,\n sourceAnnotationId: string,\n documentId: string,\n ): Map<string, { entries: FieldGroupEntry[]; widget: PdfWidgetAnnoObject }> {\n const result = new Map<string, { entries: FieldGroupEntry[]; widget: PdfWidgetAnnoObject }>();\n if (!this.annotation) return result;\n\n const annoState = this.annotation.forDocument(documentId).getState();\n if (!annoState) return result;\n\n const sourceFieldKey = (() => {\n const w = this.resolveWidgetAnnotation(sourceAnnotationId, documentId);\n return w ? this.getFieldKey(w.field) : null;\n })();\n\n for (const [pageStr, uids] of Object.entries(annoState.pages)) {\n const pageIndex = Number(pageStr);\n for (const uid of uids) {\n const tracked = annoState.byUid[uid];\n if (!tracked || tracked.object.type !== PdfAnnotationSubtype.WIDGET) continue;\n const widget = tracked.object as PdfWidgetAnnoObject;\n if (widget.field.name.trim() !== normalizedName) continue;\n\n const fieldKey = this.getFieldKey(widget.field);\n if (!fieldKey || fieldKey === sourceFieldKey) continue;\n\n if (!result.has(fieldKey)) {\n result.set(fieldKey, { entries: [], widget });\n }\n result.get(fieldKey)!.entries.push({ annotationId: uid, pageIndex });\n }\n }\n\n return result;\n }\n\n private renameFieldMethod(\n annotationId: string,\n name: string,\n documentId?: string,\n ): PdfTask<RenameFieldResult> {\n const docId = documentId ?? this.getActiveDocumentId();\n const normalizedName = name.trim();\n if (!normalizedName) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.Unknown,\n message: 'Field name must not be empty.',\n });\n }\n\n const coreDoc = this.getCoreDocumentOrThrow(docId);\n const doc = coreDoc.document;\n if (!doc) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document is not open',\n });\n }\n\n const source = this.resolveWidgetPage(annotationId, docId, doc);\n if (!source) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.NotFound,\n message: 'widget annotation not found',\n });\n }\n\n if (source.widget.field.name.trim() === normalizedName) {\n return PdfTaskHelper.resolve<RenameFieldResult>({ outcome: 'no-op' });\n }\n\n const conflicts = this.findConflictingFieldGroups(normalizedName, annotationId, docId);\n\n if (conflicts.size > 0) {\n if (conflicts.size > 1) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.Unknown,\n message: 'That field name is used by multiple fields. Choose a unique name.',\n });\n }\n\n const [, match] = [...conflicts.entries()][0];\n\n if (match.widget.field.type !== source.widget.field.type) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.Unknown,\n message: 'That field name is already used by a different widget type.',\n });\n }\n\n return PdfTaskHelper.resolve<RenameFieldResult>({\n outcome: 'conflict',\n targetAnnotationId: match.entries[0].annotationId,\n fieldName: normalizedName,\n });\n }\n\n const resultTask = new Task<RenameFieldResult, PdfErrorReason>();\n const seq = new TaskSequence(resultTask);\n\n seq.execute(\n async () => {\n const groupEntries = this.getFieldGroup(annotationId, docId);\n await seq.run(() =>\n this.engine.renameWidgetField(doc, source.page, source.widget, normalizedName),\n );\n\n const syncedEntries = await this.readFieldWidgets(doc, groupEntries, seq, false);\n this.syncFieldBatch(docId, syncedEntries);\n resultTask.resolve({ outcome: 'renamed' });\n },\n (err) => ({ code: PdfErrorCode.Unknown, message: String(err) }),\n );\n\n return resultTask;\n }\n\n private shareFieldMethod(\n annotationId: string,\n targetAnnotationId: string,\n documentId?: string,\n ): PdfTask<boolean> {\n const docId = documentId ?? this.getActiveDocumentId();\n if (annotationId === targetAnnotationId) {\n return PdfTaskHelper.resolve(true);\n }\n\n const coreDoc = this.getCoreDocumentOrThrow(docId);\n const doc = coreDoc.document;\n if (!doc) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.DocNotOpen,\n message: 'document is not open',\n });\n }\n\n const source = this.resolveWidgetPage(annotationId, docId, doc);\n const target = this.resolveWidgetPage(targetAnnotationId, docId, doc);\n if (!source || !target) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.NotFound,\n message: 'widget annotation not found',\n });\n }\n\n if (source.widget.field.type !== target.widget.field.type) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.Unknown,\n message: 'cannot share fields with different widget types',\n });\n }\n\n if (\n source.widget.field.fieldObjectId &&\n target.widget.field.fieldObjectId &&\n source.widget.field.fieldObjectId === target.widget.field.fieldObjectId\n ) {\n return PdfTaskHelper.resolve(true);\n }\n\n const affectedEntryMap = new Map<string, FieldGroupEntry>();\n for (const entry of this.getFieldGroup(annotationId, docId)) {\n affectedEntryMap.set(entry.annotationId, entry);\n }\n for (const entry of this.getFieldGroup(targetAnnotationId, docId)) {\n affectedEntryMap.set(entry.annotationId, entry);\n }\n\n const affectedEntries = [...affectedEntryMap.values()];\n const resultTask = new Task<boolean, PdfErrorReason>();\n const seq = new TaskSequence(resultTask);\n\n seq.execute(\n async () => {\n await seq.run(() =>\n this.engine.shareWidgetField(doc, source.page, source.widget, target.page, target.widget),\n );\n\n const syncedEntries = await this.readFieldWidgets(\n doc,\n affectedEntries,\n seq,\n this.shouldRegenerateWidgetAppearances(target.widget.field),\n );\n this.syncFieldBatch(docId, syncedEntries);\n resultTask.resolve(true);\n },\n (err) => ({ code: PdfErrorCode.Unknown, message: String(err) }),\n );\n\n return resultTask;\n }\n\n private selectFieldMethod(annotationId: string, documentId?: string): void {\n const docId = documentId ?? this.getActiveDocumentId();\n this.dispatch(selectFieldAction(docId, annotationId));\n }\n\n private deselectFieldMethod(documentId?: string): void {\n const docId = documentId ?? this.getActiveDocumentId();\n this.dispatch(deselectFieldAction(docId));\n }\n\n private getSelectedFieldId(documentId?: string): string | null {\n return this.getDocumentState(documentId).selectedFieldId;\n }\n\n private selectNextFieldMethod(documentId?: string): void {\n const docId = documentId ?? this.getActiveDocumentId();\n const ordered = this.orderedFieldIndex.get(docId);\n if (!ordered || ordered.length === 0) return;\n\n const currentId = this.getSelectedFieldId(docId);\n let nextIndex = 0;\n if (currentId) {\n const currentIndex = ordered.findIndex((e) => e.annotationId === currentId);\n nextIndex = currentIndex >= 0 ? (currentIndex + 1) % ordered.length : 0;\n }\n\n const next = ordered[nextIndex];\n this.dispatch(selectFieldAction(docId, next.annotationId));\n }\n\n private selectPreviousFieldMethod(documentId?: string): void {\n const docId = documentId ?? this.getActiveDocumentId();\n const ordered = this.orderedFieldIndex.get(docId);\n if (!ordered || ordered.length === 0) return;\n\n const currentId = this.getSelectedFieldId(docId);\n let prevIndex = ordered.length - 1;\n if (currentId) {\n const currentIndex = ordered.findIndex((e) => e.annotationId === currentId);\n prevIndex =\n currentIndex >= 0\n ? (currentIndex - 1 + ordered.length) % ordered.length\n : ordered.length - 1;\n }\n\n const prev = ordered[prevIndex];\n this.dispatch(selectFieldAction(docId, prev.annotationId));\n }\n\n private activateFieldMethod(documentId?: string): void {\n const docId = documentId ?? this.getActiveDocumentId();\n const selectedId = this.getSelectedFieldId(docId);\n if (!selectedId) return;\n\n const widget = this.resolveWidgetAnnotation(selectedId, docId);\n if (!widget) return;\n\n const field = widget.field;\n if (field.type === PDF_FORM_FIELD_TYPE.CHECKBOX) {\n const checked = isWidgetChecked(widget);\n const newValue = checked ? 'Off' : (widget.exportValue ?? 'Yes');\n this.setFormFieldValues(widget.pageIndex, widget, { ...field, value: newValue }, docId);\n } else if (field.type === PDF_FORM_FIELD_TYPE.RADIOBUTTON) {\n if (!isWidgetChecked(widget) && widget.exportValue) {\n this.setFormFieldValues(\n widget.pageIndex,\n widget,\n { ...field, value: widget.exportValue },\n docId,\n );\n }\n }\n }\n\n private renderWidget(\n options: RenderWidgetOptions,\n documentId?: string,\n ): Task<Blob, PdfErrorReason> {\n if (!this.annotation) {\n return PdfTaskHelper.reject({\n code: PdfErrorCode.NotFound,\n message: 'annotation plugin not found',\n });\n }\n\n const id = documentId ?? this.getActiveDocumentId();\n return this.annotation.forDocument(id).renderAnnotation(options);\n }\n\n async destroy(): Promise<void> {\n this.state$.clear();\n this.fieldValueChange$.clear();\n this.formReady$.clear();\n super.destroy();\n }\n}\n","import { PluginPackage } from '@embedpdf/core';\nimport { manifest, FORM_PLUGIN_ID } from './manifest';\nimport { FormPluginConfig, FormState } from './types';\nimport { FormPlugin } from './form-plugin';\nimport { initialState, reducer } from './reducer';\nimport { FormAction } from './actions';\n\nexport const FormPluginPackage: PluginPackage<FormPlugin, FormPluginConfig, FormState, FormAction> =\n {\n manifest,\n create: (registry, config) => new FormPlugin(FORM_PLUGIN_ID, registry, config),\n reducer,\n initialState,\n };\n\nexport * from './form-plugin';\nexport * from './types';\nexport * from './manifest';\nexport * from './tools';\nexport { initialState, initialDocumentState } from './reducer';\n"],"names":["FORM_PLUGIN_ID","manifest","id","name","version","provides","requires","optional","defaultConfig","enabled","INIT_FORM_STATE","CLEANUP_FORM_STATE","SELECT_FIELD","DESELECT_FIELD","selectField","documentId","annotationId","type","payload","initialDocumentState","selectedFieldId","initialState","documents","textFieldHandlerFactory","annotationType","PdfAnnotationSubtype","WIDGET","create","context","pageIndex","onCommit","onPreview","getTool","pageSize","getStart","setStart","useState","clampToPage","pos","x","clamp","width","y","height","getDefaults","tool","defaults","fontFamily","PdfStandardFont","Helvetica","fontSize","fontColor","strokeColor","color","strokeWidth","field","buildRect","start","end","origin","Math","min","size","abs","buildAnnotation","rect","fieldName","uuidV4","slice","created","Date","PDF_FORM_FIELD_TYPE","TEXTFIELD","flag","_a","PDF_FORM_FIELD_FLAG","NONE","alternateName","value","clickDetector","useClickDetector","onClickDetected","clickConfig","clickBehavior","defaultSize","getPreview","current","bounds","data","onPointerDown","evt","clampedPos","onStart","setPointerCapture","call","onPointerMove","onMove","hasMoved","onPointerUp","onEnd","reset","releasePointerCapture","onPointerLeave","_","onPointerCancel","checkboxHandlerFactory","exportValue","CHECKBOX","radioButtonHandlerFactory","dx","dy","side","max","sx","sy","RADIOBUTTON","BUTTON_RADIO","BUTTON_NOTOGGLETOOFF","options","comboboxHandlerFactory","COMBOBOX","label","isSelected","listboxHandlerFactory","LISTBOX","formTextFieldTool","defineAnnotationTool","labelKey","categories","matchScore","a","interaction","exclusive","cursor","isDraggable","isResizable","isRotatable","isGroupDraggable","isGroupResizable","isGroupRotatable","behavior","useAppearanceStream","pointerHandler","formCheckboxTool","formRadioButtonTool","lockAspectRatio","formComboboxTool","formListboxTool","formTools","_FormPlugin","BasePlugin","constructor","registry","_config","super","this","FORM_HISTORY_TOPIC","annotation","history","state$","createScopedEmitter","state","fieldValueChange$","event","cache","formReady$","fields","fieldGroupIndex","Map","fieldNameIndex","orderedFieldIndex","propagationInProgress","Set","getPlugin","_b","HistoryPlugin","addTool","onAnnotationEvent","handleAnnotationEvent","initialize","onDocumentLoadingStarted","dispatch","initFormState","onDocumentClosed","cleanupFormState","delete","clearScope","onStoreUpdated","prev","next","prevDoc","nextDoc","emit","buildCapability","getPageFormAnnoWidgets","setFormFieldValues","newField","renameField","renameFieldMethod","shareField","targetAnnotationId","shareFieldMethod","renderWidget","selectFieldMethod","deselectField","deselectFieldMethod","getSelectedFieldId","selectNextField","selectNextFieldMethod","selectPreviousField","selectPreviousFieldMethod","activateField","activateFieldMethod","getState","getDocumentState","getFieldGroup","getFieldSiblings","getFormValues","getFormValuesMethod","getFormFields","getFormFieldsMethod","setFormValues","values","setFormValuesMethod","forDocument","createFormScope","onStateChange","onGlobal","onFieldValueChange","onFormReady","forScope","buildFieldGroupIndex","committed","anno","has","patch","propagateFieldLevelChanges","fieldPatch","siblings","length","siblingPatches","sibling","add","push","updateAnnotations","annoState","idx","allWidgets","pageStr","uids","Object","entries","pages","Number","uid","tracked","byUid","object","widget","entry","fieldKey","getFieldKey","group","get","set","nameIdx","trim","navigable","filter","READONLY","map","getActiveDocumentId","getDocIndex","fieldObjectId","normalizedName","resolveWidgetAnnotation","docId","e","readOnly","PdfTaskHelper","reject","code","PdfErrorCode","NotFound","message","resolve","resultTask","Task","pending","failed","onComplete","fieldEntries","targetEntry","w","buildImportField","wait","error","onError","err","reason","opt","normalizedValue","isToggleField","shouldRegenerateWidgetAppearances","getFieldBatchTarget","batch","find","isWidgetChecked","readFieldWidgets","doc","groupEntries","seq","regenerateAppearances","pageSet","memberIds","page","index","pageMemberIds","run","engine","regenerateWidgetAppearances","widgets","getPageAnnoWidgets","syncFieldBatch","syncAnnotationObject","invalidatePageAppearances","emitFieldValueChanges","resolveWidgetPage","getCoreDocumentOrThrow","document","DocNotOpen","p","TaskSequence","execute","async","beforeEntries","setFormFieldState","afterEntries","isFirstExecution","applyToEngine","target","pg","Promise","pi","pp","ids","command","skipEngine","then","undo","register","Unknown","String","findConflictingFieldGroups","sourceAnnotationId","result","sourceFieldKey","source","outcome","conflicts","match","renameWidgetField","syncedEntries","affectedEntryMap","affectedEntries","shareWidgetField","selectFieldAction","deselectFieldAction","ordered","currentId","nextIndex","currentIndex","findIndex","prevIndex","selectedId","newValue","renderAnnotation","destroy","clear","FormPlugin","FormPluginPackage","config","reducer","action","remaining","docState"],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './lib';
|