Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
There was a problem hiding this comment.
Pull request overview
This PR updates both the OpenSign server and web app with new widget metadata support (hint), improved S3 presigning via AWS SDK v3, bulk-send UX improvements, and a new in-app email template builder.
Changes:
- Add
hintsupport across widget option generation + UI configuration. - Replace legacy
aws-sdkusage with AWS SDK v3 presigning / S3 configuration updates. - Introduce a new Email Builder feature (UI, editor state, block system) and related UI/UX refinements (bulk send, date formats, typos, favicon, image compression).
Reviewed changes
Copilot reviewed 155 out of 158 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| apps/OpenSignServer/utils/WidgetUtils.js | Add hint to widget options |
| apps/OpenSignServer/package.json | Bump version + deps |
| apps/OpenSignServer/index.js | Update S3 adapter endpoint config |
| apps/OpenSignServer/cloud/parsefunction/triggerEvent.js | AuditTrail “viewed” updates + IP capture |
| apps/OpenSignServer/cloud/parsefunction/sendMailv3.js | Append spam-report footer + update mail count |
| apps/OpenSignServer/cloud/parsefunction/reportsJson.js | Include Company/Phone in report include |
| apps/OpenSignServer/cloud/parsefunction/pdf/PDF.js | Email template variable + footer changes |
| apps/OpenSignServer/cloud/parsefunction/getSignedUrl.js | Migrate presigning to AWS SDK v3 |
| apps/OpenSignServer/cloud/parsefunction/declinedocument.js | Remove spam/complaint footer text |
| apps/OpenSignServer/cloud/parsefunction/UserAfterFInd.js | Refactor URL presigning logic |
| apps/OpenSignServer/cloud/parsefunction/TenantAfterFind.js | Presign Logo/Favicon URLs |
| apps/OpenSignServer/cloud/parsefunction/TemplateAfterFind.js | Refactor URL resolution |
| apps/OpenSignServer/cloud/parsefunction/SignatureAfterFind.js | Refactor URL resolution |
| apps/OpenSignServer/cloud/parsefunction/GetLogoByDomain.js | Return favicon alongside logo |
| apps/OpenSignServer/cloud/parsefunction/ForwardDoc.js | Remove spam/complaint footer text |
| apps/OpenSignServer/cloud/parsefunction/DocumentAfterFind.js | Refactor URL resolution |
| apps/OpenSignServer/cloud/customRoute/deleteAccount/deleteUser.js | Add delete-user logging |
| apps/OpenSignServer/Utils.js | Simplify updateMailCount, add date format |
| apps/OpenSign/src/utils/widgetUtils.js | Add helpers (compat checks, regex, mail modal head) |
| apps/OpenSign/src/utils/prefillUtils.js | De-duplicate required prefill validation |
| apps/OpenSign/src/utils/fileUtils.js | Add image compression helper |
| apps/OpenSign/src/reports/contact/Contactbook.jsx | Alert on save + typo fixes |
| apps/OpenSign/src/redux/reducers/widgetSlice.js | Add invalidRow state + formatting |
| apps/OpenSign/src/redux/reducers/infoReducer.js | Store favicon in localStorage |
| apps/OpenSign/src/primitives/Tour.jsx | Replace body-scroll-lock with touch scroll lock |
| apps/OpenSign/src/primitives/ModalUi.jsx | Add optional help tooltip in modal title |
| apps/OpenSign/src/primitives/DotLottieReact.jsx | Fix i18n key typo |
| apps/OpenSign/src/pages/UserProfile.jsx | Compress profile image before upload |
| apps/OpenSign/src/pages/UserList.jsx | Fix i18n key typo |
| apps/OpenSign/src/pages/TemplatePlaceholder.jsx | Bulk mail modal title helper + template fields + sizing tweaks |
| apps/OpenSign/src/pages/SignyourselfPdf.jsx | PDF sizing tweaks + widget sizing logic updates |
| apps/OpenSign/src/pages/PdfRequestFiles.jsx | PDF sizing tweaks |
| apps/OpenSign/src/pages/Form.jsx | Reminder validation improvements |
| apps/OpenSign/src/pages/EmailBuilder.tsx | Add EmailBuilder route page |
| apps/OpenSign/src/pages/AddAdmin.jsx | Fix i18n key typo |
| apps/OpenSign/src/json/ReportJson.js | Add “extend expiry” action |
| apps/OpenSign/src/json/BulkSendSteps.jsx | Add bulk-send step tooltips config |
| apps/OpenSign/src/components/shared/fields/SuggestionInput.jsx | Improve debounce + props sync behavior |
| apps/OpenSign/src/components/shared/fields/FolderModal.jsx | Fix i18n key typo |
| apps/OpenSign/src/components/shared/fields/CellsInput.jsx | Input filtering behavior change + formatting |
| apps/OpenSign/src/components/preferences/tabs/Widgets.jsx | Layout tweak around date picker |
| apps/OpenSign/src/components/preferences/DateFormatSelector.jsx | Add DD-MMM-YYYY format |
| apps/OpenSign/src/components/pdf/WidgetNameModal.jsx | Centralize regex mapping helper |
| apps/OpenSign/src/components/pdf/WidgetComponent.jsx | Formatting + block color handling |
| apps/OpenSign/src/components/pdf/RecipientList.jsx | Optional chaining for setBlockColor |
| apps/OpenSign/src/components/pdf/PrefillWidgetsModal.jsx | Safer sync for duplicate widget names |
| apps/OpenSign/src/components/pdf/PlaceholderType.jsx | Date display refactor + trimming fixes |
| apps/OpenSign/src/components/pdf/Placeholder.jsx | Add hint editing for date widget modal |
| apps/OpenSign/src/components/pdf/EmailComponent.jsx | Fix i18n key typo |
| apps/OpenSign/src/components/pdf/EmailBody.jsx | Replace Quill with EmailBodyEditor integration |
| apps/OpenSign/src/components/pdf/EditorToolbar.jsx | Remove HTML edit plugin wiring |
| apps/OpenSign/src/components/pdf/EditTemplate.jsx | Add reminder invalid handler |
| apps/OpenSign/src/components/pdf/CustomizeMail.jsx | Reset handling + mail status mapping + ref sharing |
| apps/OpenSign/src/components/emailbuilder/getConfiguration/sample/empty-email-message.ts | Add empty email template sample |
| apps/OpenSign/src/components/emailbuilder/getConfiguration/index.tsx | Add configuration loader logic |
| apps/OpenSign/src/components/emailbuilder/documents/editor/core.tsx | Add block registry + schema |
| apps/OpenSign/src/components/emailbuilder/documents/editor/EditorContext.tsx | Add editor state store (zustand) |
| apps/OpenSign/src/components/emailbuilder/documents/editor/EditorBlock.tsx | Block loader by id |
| apps/OpenSign/src/components/emailbuilder/documents/blocks/helpers/zod.ts | Shared zod helper validators |
| apps/OpenSign/src/components/emailbuilder/documents/blocks/helpers/fontFamily.ts | Define font families |
| apps/OpenSign/src/components/emailbuilder/documents/blocks/helpers/cloneDocumentBlock.ts | Clone blocks utility |
| apps/OpenSign/src/components/emailbuilder/documents/blocks/helpers/block-wrappers/ReaderBlockWrapper.tsx | Reader wrapper styling |
| apps/OpenSign/src/components/emailbuilder/documents/blocks/helpers/block-wrappers/EditorBlockWrapper.tsx | Editor wrapper selection UI |
| apps/OpenSign/src/components/emailbuilder/documents/blocks/helpers/TStyle.ts | Shared style type |
| apps/OpenSign/src/components/emailbuilder/documents/blocks/helpers/EditorChildrenIds/index.tsx | Editable children list UI |
| apps/OpenSign/src/components/emailbuilder/documents/blocks/helpers/EditorChildrenIds/AddBlockMenu/index.tsx | Add-block menu scaffolding |
| apps/OpenSign/src/components/emailbuilder/documents/blocks/helpers/EditorChildrenIds/AddBlockMenu/buttons.tsx | Block palette definitions |
| apps/OpenSign/src/components/emailbuilder/documents/blocks/helpers/EditorChildrenIds/AddBlockMenu/PlaceholderButton.tsx | Placeholder add button |
| apps/OpenSign/src/components/emailbuilder/documents/blocks/helpers/EditorChildrenIds/AddBlockMenu/DividerButton.tsx | Inline add button |
| apps/OpenSign/src/components/emailbuilder/documents/blocks/helpers/EditorChildrenIds/AddBlockMenu/BlocksMenu.tsx | Block menu UI |
| apps/OpenSign/src/components/emailbuilder/documents/blocks/helpers/EditorChildrenIds/AddBlockMenu/BlockButton.tsx | Block menu button UI |
| apps/OpenSign/src/components/emailbuilder/documents/blocks/EmailLayout/EmailLayoutPropsSchema.tsx | EmailLayout schema |
| apps/OpenSign/src/components/emailbuilder/documents/blocks/EmailLayout/EmailLayoutEditor.tsx | EmailLayout editor |
| apps/OpenSign/src/components/emailbuilder/documents/blocks/Container/ContainerPropsSchema.tsx | Container schema |
| apps/OpenSign/src/components/emailbuilder/documents/blocks/Container/ContainerEditor.tsx | Container editor |
| apps/OpenSign/src/components/emailbuilder/documents/blocks/ColumnsContainer/ColumnsContainerPropsSchema.ts | Columns schema |
| apps/OpenSign/src/components/emailbuilder/documents/blocks/ColumnsContainer/ColumnsContainerEditor.tsx | Columns editor |
| apps/OpenSign/src/components/emailbuilder/EmailBuilder.tsx | EmailBuilder wrapper component |
| apps/OpenSign/src/components/emailbuilder/App/index.tsx | Email builder app shell |
| apps/OpenSign/src/components/emailbuilder/App/TemplatePanel/index.tsx | Main editor/preview/html panels |
| apps/OpenSign/src/components/emailbuilder/App/TemplatePanel/helper/renderEmailHtml.ts | Render + canvas width override |
| apps/OpenSign/src/components/emailbuilder/App/TemplatePanel/helper/highlighters.tsx | Prettier + hljs formatting |
| apps/OpenSign/src/components/emailbuilder/App/TemplatePanel/helper/HighlightedCodePanel.tsx | Highlighted code viewer |
| apps/OpenSign/src/components/emailbuilder/App/TemplatePanel/ShareButton.tsx | Copy generated HTML |
| apps/OpenSign/src/components/emailbuilder/App/TemplatePanel/MainTabsGroup.tsx | Tab switcher |
| apps/OpenSign/src/components/emailbuilder/App/TemplatePanel/JsonPanel.tsx | JSON view panel |
| apps/OpenSign/src/components/emailbuilder/App/TemplatePanel/HtmlPanel.tsx | HTML view panel |
| apps/OpenSign/src/components/emailbuilder/App/TemplatePanel/DownloadJson/index.tsx | Download template HTML |
| apps/OpenSign/src/components/emailbuilder/App/SamplesDrawer/index.tsx | Sample templates drawer |
| apps/OpenSign/src/components/emailbuilder/App/SamplesDrawer/ToggleSamplesPanelButton.tsx | Toggle samples drawer |
| apps/OpenSign/src/components/emailbuilder/App/SamplesDrawer/SidebarButton.tsx | Sample navigation button |
| apps/OpenSign/src/components/emailbuilder/App/InspectorDrawer/index.tsx | Inspector drawer |
| apps/OpenSign/src/components/emailbuilder/App/InspectorDrawer/ToggleInspectorPanelButton.tsx | Toggle inspector drawer |
| apps/OpenSign/src/components/emailbuilder/App/InspectorDrawer/StylesPanel.tsx | Global styles editing |
| apps/OpenSign/src/components/emailbuilder/App/InspectorDrawer/ConfigurationPanel/index.tsx | Per-block configuration panels |
| apps/OpenSign/src/components/bulksend/components/WizardHeader.jsx | Bulk send wizard header UI |
| apps/OpenSign/src/components/bulksend/components/Table.jsx | Bulk send recipients/widgets table |
| apps/OpenSign/src/components/bulksend/components/ResponseTab.jsx | Bulk send summary tab |
| apps/OpenSign/src/components/bulksend/components/PrefillWidgets.jsx | Prefill step widgets UI |
| apps/OpenSign/src/components/EmailBodyEditor.jsx | HTML email editor + sanitizer/preview |
| apps/OpenSign/src/components/DatePicker.jsx | DatePicker UX enhancements |
| apps/OpenSign/src/components/AddUser.jsx | Fix i18n key typo |
| apps/OpenSign/src/App.jsx | Add /emailbuilder route |
| apps/OpenSign/public/version.txt | Add version file |
Comments suppressed due to low confidence (4)
apps/OpenSign/src/components/emailbuilder/App/TemplatePanel/DownloadJson/index.tsx:23
URL.createObjectURL(blob)is created and retained in state, but never revoked. As the document changes (or the component mounts/unmounts), this can leak object URLs. Revoke the old URL in an effect cleanup or generate the URL only on click and revoke immediately after download.
apps/OpenSign/src/components/pdf/Placeholder.jsx:1204- The hint input uses
value={formdata?.hint}, buthintis initialized fromprops?.pos?.options?.hintwithout a default. If that value isundefined, React will treat the input as uncontrolled and then controlled once the user types, producing warnings. Initializehintto an empty string and keepvalueas a string. Also, the placeholder text is hard-coded (not localized) despite the rest of the UI usingt(...).
apps/OpenSignServer/utils/WidgetUtils.js:33 getWidgetOptionsreturns only{ hint }fortype === 'signature', unlikestamp/initialswhich includerequiredandname. If signature widgets rely on these fields (e.g., required enforcement or label/name display), this will break downstream behavior. Consider returning the same core fields (required,name) for signatures as well (plushint).
apps/OpenSignServer/cloud/parsefunction/triggerEvent.js:61- This change updates an existing
Viewedaudit-trail entry for a contact and overwritesViewedOneach time the event fires. Previously the logic avoided writing a second viewed record onceViewedOnexisted, preserving the first-view timestamp. If the intended behavior is “first viewed”, keep the originalViewedOnwhen already set (or append a new event instead of overwriting).
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| const docRes = await docQuery.get(docId, { useMasterKey: true }); | ||
| const _docRes = docRes && docRes?.toJSON(); | ||
| const isEnableOTP = docRes?.get('IsEnableOTP') || false; | ||
| const ipAddress = request.headers['x-real-ip'] || ''; |
There was a problem hiding this comment.
request.headers is treated as optional earlier (request.headers?.sessiontoken), but ipAddress reads request.headers['x-real-ip'] without optional chaining. If headers is missing, this will throw at runtime. Use request.headers?.['x-real-ip'] (and/or fall back to x-forwarded-for).
| return getCompletionEmail( | ||
| ); | ||
| default: | ||
| return "requestemail"; | ||
| } |
There was a problem hiding this comment.
getConfiguration returns the string literal "requestemail" in the #sample/ default case. That makes the function’s return type inconsistent (string vs configuration object) and will break callers expecting a TEditorConfiguration. Return a valid configuration instead (e.g., getRequestEmail() or EMPTY_EMAIL_MESSAGE).
| const editorStateStore = create<TValue>(() => ({ | ||
| document: getConfiguration(window.location.hash), | ||
| selectedBlockId: null, | ||
| selectedSidebarTab: "styles", |
There was a problem hiding this comment.
EditorContext initializes Zustand state using window.location.hash at module load time. This will throw in non-browser environments (tests, SSR, static pre-render) where window is undefined. Guard with typeof window !== 'undefined' and provide a safe default hash/value.
No description provided.