@servicetitan/dte-unlayer 0.153.0 → 0.155.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.
Files changed (85) hide show
  1. package/dist/display-conditions/ConditionRow.d.ts.map +1 -1
  2. package/dist/display-conditions/ConditionRow.js +111 -95
  3. package/dist/display-conditions/ConditionRow.js.map +1 -1
  4. package/dist/display-conditions/DisplayConditionModal.d.ts +3 -3
  5. package/dist/display-conditions/DisplayConditionModal.d.ts.map +1 -1
  6. package/dist/display-conditions/DisplayConditionModal.js +8 -95
  7. package/dist/display-conditions/DisplayConditionModal.js.map +1 -1
  8. package/dist/display-conditions/useConditionForms.d.ts +22 -0
  9. package/dist/display-conditions/useConditionForms.d.ts.map +1 -0
  10. package/dist/display-conditions/useConditionForms.js +110 -0
  11. package/dist/display-conditions/useConditionForms.js.map +1 -0
  12. package/dist/e-sign-offset/ESignDateSignedOffsetModal.d.ts +11 -0
  13. package/dist/e-sign-offset/ESignDateSignedOffsetModal.d.ts.map +1 -0
  14. package/dist/e-sign-offset/ESignDateSignedOffsetModal.js +192 -0
  15. package/dist/e-sign-offset/ESignDateSignedOffsetModal.js.map +1 -0
  16. package/dist/e-sign-offset/ESignOffsetRuleRow.d.ts +20 -0
  17. package/dist/e-sign-offset/ESignOffsetRuleRow.d.ts.map +1 -0
  18. package/dist/e-sign-offset/ESignOffsetRuleRow.js +87 -0
  19. package/dist/e-sign-offset/ESignOffsetRuleRow.js.map +1 -0
  20. package/dist/e-sign-offset/eSignOffsetController.d.ts +10 -0
  21. package/dist/e-sign-offset/eSignOffsetController.d.ts.map +1 -0
  22. package/dist/e-sign-offset/eSignOffsetController.js +27 -0
  23. package/dist/e-sign-offset/eSignOffsetController.js.map +1 -0
  24. package/dist/editor-core-source.d.ts +2 -2
  25. package/dist/editor-core-source.d.ts.map +1 -1
  26. package/dist/editor-core-source.js +2 -2
  27. package/dist/editor-core-source.js.map +1 -1
  28. package/dist/editor.d.ts.map +1 -1
  29. package/dist/editor.js +8 -0
  30. package/dist/editor.js.map +1 -1
  31. package/dist/index.d.ts +2 -2
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +1 -1
  34. package/dist/index.js.map +1 -1
  35. package/dist/merge-tags.d.ts +6 -10
  36. package/dist/merge-tags.d.ts.map +1 -1
  37. package/dist/merge-tags.js +35 -44
  38. package/dist/merge-tags.js.map +1 -1
  39. package/dist/shared/const.d.ts +30 -0
  40. package/dist/shared/const.d.ts.map +1 -1
  41. package/dist/shared/const.js +5 -0
  42. package/dist/shared/const.js.map +1 -1
  43. package/dist/shared/e-sign-offset.d.ts +21 -0
  44. package/dist/shared/e-sign-offset.d.ts.map +1 -0
  45. package/dist/shared/e-sign-offset.js +130 -0
  46. package/dist/shared/e-sign-offset.js.map +1 -0
  47. package/dist/shared/instance-id.d.ts +13 -0
  48. package/dist/shared/instance-id.d.ts.map +1 -0
  49. package/dist/shared/instance-id.js +22 -0
  50. package/dist/shared/instance-id.js.map +1 -0
  51. package/dist/store.d.ts +15 -1
  52. package/dist/store.d.ts.map +1 -1
  53. package/dist/store.js +80 -5
  54. package/dist/store.js.map +1 -1
  55. package/dist/tools.d.ts +18 -0
  56. package/dist/tools.d.ts.map +1 -1
  57. package/dist/tools.js +68 -1
  58. package/dist/tools.js.map +1 -1
  59. package/dist/unlayer-interface.d.ts +11 -1
  60. package/dist/unlayer-interface.d.ts.map +1 -1
  61. package/dist/unlayer-interface.js.map +1 -1
  62. package/dist/unlayer.d.ts.map +1 -1
  63. package/dist/unlayer.js +5 -3
  64. package/dist/unlayer.js.map +1 -1
  65. package/package.json +1 -1
  66. package/src/__tests__/e-sign-offset.test.ts +281 -0
  67. package/src/__tests__/merge-tags.test.ts +98 -76
  68. package/src/__tests__/store.merge-tags.test.ts +186 -0
  69. package/src/display-conditions/ConditionRow.tsx +86 -81
  70. package/src/display-conditions/DisplayConditionModal.tsx +12 -116
  71. package/src/display-conditions/useConditionForms.ts +146 -0
  72. package/src/e-sign-offset/ESignDateSignedOffsetModal.tsx +197 -0
  73. package/src/e-sign-offset/ESignOffsetRuleRow.tsx +101 -0
  74. package/src/e-sign-offset/eSignOffsetController.ts +39 -0
  75. package/src/editor-core-source.ts +2 -2
  76. package/src/editor.tsx +9 -0
  77. package/src/index.ts +1 -2
  78. package/src/merge-tags.ts +41 -60
  79. package/src/shared/const.ts +37 -0
  80. package/src/shared/e-sign-offset.ts +173 -0
  81. package/src/shared/instance-id.ts +23 -0
  82. package/src/store.ts +106 -5
  83. package/src/tools.ts +87 -1
  84. package/src/unlayer-interface.tsx +11 -1
  85. package/src/unlayer.tsx +5 -3
package/dist/tools.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tools.ts"],"sourcesContent":["import { constGenericsEditor, UnlayerToolMetaData } from './shared/const';\nimport { editIconSvg } from './shared/edit-icon';\nimport { unlayerToolsParseUnitKey } from './shared/tools';\nimport { versions } from './unlayer';\n\nimport type {\n UnlayerDesignCustomTool,\n UnlayerDesignFormat,\n UnlayerDesignTool,\n UnlayerEditorCustomTool,\n} from './unlayer-interface';\n\n/* eslint-disable @typescript-eslint/naming-convention */\nexport const unlayerGetDefaultDesign = (): UnlayerDesignFormat => ({\n counters: {\n u_column: 1,\n u_row: 1,\n u_content_custom_generic_list_of_fields: 1,\n },\n body: {\n rows: [\n {\n cells: [1],\n columns: [\n {\n contents: [],\n values: {\n backgroundColor: '',\n padding: '0px',\n border: {},\n _meta: {\n htmlID: 'u_column_1',\n htmlClassNames: 'u_column',\n },\n },\n },\n ],\n values: {\n displayCondition: null,\n columns: false,\n backgroundColor: '',\n columnsBackgroundColor: '',\n backgroundImage: {\n url: '',\n fullWidth: true,\n repeat: false,\n center: true,\n cover: false,\n },\n padding: '0px',\n hideDesktop: false,\n hideMobile: false,\n noStackMobile: false,\n _meta: {\n htmlID: 'u_row_1',\n htmlClassNames: 'u_row',\n },\n selectable: true,\n draggable: true,\n duplicatable: true,\n deletable: true,\n },\n },\n ],\n values: {\n backgroundColor: 'rgba(0,0,0,0)',\n backgroundImage: {\n url: '',\n fullWidth: true,\n repeat: false,\n center: true,\n cover: false,\n },\n contentWidth: '100%',\n contentAlign: 'center',\n fontFamily: {\n label: 'Arial',\n value: 'arial,helvetica,sans-serif',\n },\n preheaderText: '',\n linkStyle: {\n body: true,\n linkColor: '#0000ee',\n linkHoverColor: '#0000ee',\n linkUnderline: true,\n linkHoverUnderline: true,\n },\n _meta: {\n htmlID: 'u_body',\n htmlClassNames: 'u_body',\n },\n },\n },\n schemaVersion: versions.schema,\n});\n/* eslint-enable @typescript-eslint/naming-convention */\n\nexport const unlayerToolsIterate = (\n design: UnlayerDesignFormat,\n cb: (tool: UnlayerDesignTool) => boolean | undefined | void\n) => {\n for (const row of design?.body?.rows ?? []) {\n for (const column of row.columns) {\n for (const content of column.contents) {\n if (cb(content) === false) {\n return;\n }\n }\n }\n }\n};\n\nexport const unlayerToolsIterateCustom = (\n design: UnlayerDesignFormat,\n cb: (tool: UnlayerDesignCustomTool) => boolean | undefined | void\n) => {\n unlayerToolsIterate(design, tool => {\n if (tool.type === 'custom' && tool.slug) {\n return cb(tool as any);\n }\n });\n};\n\nexport const unlayerToolsListCustomKeys = (design: UnlayerDesignFormat): string[] => {\n return Array.from(new Set(unlayerToolsListCustom(design).map(tool => tool.slug)));\n};\n\nexport const unlayerToolsFind = (\n design: UnlayerDesignFormat,\n cb: (tool: UnlayerDesignTool) => boolean | void\n): UnlayerDesignTool | undefined => {\n let out: UnlayerDesignTool | undefined;\n\n unlayerToolsIterate(design, tool => {\n if (cb(tool)) {\n out = tool;\n return false;\n }\n });\n\n return out;\n};\n\nexport interface UnlayerCustomToolsStat {\n counters: Record<string, number>;\n missing: string[];\n notSupported: string[];\n}\n\nexport const unlayerToolsCustomStat = (\n design: UnlayerDesignFormat,\n tools?: { key: string; isRequired?: boolean }[],\n units?: { id: string; generic: string; isRequired?: boolean }[]\n): UnlayerCustomToolsStat => {\n const counters: Record<string, number> = {};\n const notSupported = new Set<string>();\n const unitIDs = new Set<string>();\n\n unlayerToolsIterateCustom(design, tool => {\n if (!counters[tool.slug]) {\n counters[tool.slug] = 0;\n }\n\n counters[tool.slug]++;\n\n const isUnit = unlayerToolsParseUnitKey(tool.slug);\n\n if (isUnit) {\n unitIDs.add(isUnit.id);\n }\n\n if (\n (isUnit && !units?.some(unit => unit.id === isUnit.id)) ??\n (!isUnit && !tools?.some(t => t.key === tool.slug))\n ) {\n notSupported.add(tool.slug);\n }\n });\n\n return {\n counters,\n notSupported: Array.from(notSupported),\n\n missing: [\n ...(tools\n ?.filter(tool => tool.isRequired && !counters[tool.key])\n .map(tool => tool.key) ?? []),\n ...(units\n ?.filter(unit => unit.isRequired && !unitIDs.has(unit.id))\n .map(unit => unit.id) ?? []),\n ],\n };\n};\n\nexport const unlayerToolsListCustom = (design: UnlayerDesignFormat): UnlayerDesignCustomTool[] => {\n const tools: UnlayerDesignCustomTool[] = [];\n\n unlayerToolsIterateCustom(design, tool => {\n tools.push(tool);\n });\n\n return tools;\n};\n\nexport const unlayerToolsBuildDesign = (tools: UnlayerDesignTool[]): UnlayerDesignFormat => {\n const design = unlayerGetDefaultDesign();\n\n design.body.rows[0].columns[0].contents = tools;\n return design;\n};\n\nexport const unlayerUnitsGetIdFromValues = (values?: any): string | undefined =>\n values?.[constGenericsEditor.adminConfigProperty]?.crossId;\nexport const unlayerUnitsGetTitleFromValues = (values?: any): string | undefined =>\n values?.[constGenericsEditor.adminConfigProperty]?.title;\n\nexport const unlayerUnitsGetId = (tool: UnlayerDesignTool): string | undefined =>\n unlayerUnitsGetIdFromValues(tool.values);\nexport const unlayerUnitsGetTitle = (tool: UnlayerDesignTool): string | undefined =>\n unlayerUnitsGetTitleFromValues(tool.values);\n\nexport const unlayerCustomToolsGetRegisterUrls = (tools: UnlayerEditorCustomTool[]): string[] =>\n Array.from(\n new Set(tools.map(tool => (tool.groupUrl ? `${tool.groupUrl}/index.js` : tool.url)))\n );\n\nexport const unlayerCustomToolMetaData = (tools: UnlayerEditorCustomTool[]): string => {\n const toolMetaData = tools.reduce((acc: Record<string, UnlayerToolMetaData>, tool) => {\n acc[tool.title] = {\n key: tool.key,\n description: tool.description,\n };\n return acc;\n }, {});\n\n return `\n window.dteStore.setToolMetaData(${JSON.stringify(toolMetaData)});\n `;\n};\n\nexport const unlayerCustomEmptyToolState = (): string => {\n const divElement = document.createElement('div');\n const editIconContainer = document.createElement('div');\n const textContainer = document.createElement('div');\n\n divElement.classList.add('unlayer-custom-empty-tool-state');\n editIconContainer.classList.add('unlayer-custom-empty-tool-state-icon');\n textContainer.classList.add('unlayer-custom-empty-tool-state-text');\n\n editIconContainer.innerHTML = editIconSvg;\n textContainer.innerText = 'Please choose \\n\\r your component';\n divElement.appendChild(editIconContainer);\n divElement.appendChild(textContainer);\n return `\n document.querySelector('.tab-content .tab-pane').innerHTML = \\`${divElement.outerHTML}\\`;\n `;\n};\n"],"names":["constGenericsEditor","editIconSvg","unlayerToolsParseUnitKey","versions","unlayerGetDefaultDesign","counters","u_column","u_row","u_content_custom_generic_list_of_fields","body","rows","cells","columns","contents","values","backgroundColor","padding","border","_meta","htmlID","htmlClassNames","displayCondition","columnsBackgroundColor","backgroundImage","url","fullWidth","repeat","center","cover","hideDesktop","hideMobile","noStackMobile","selectable","draggable","duplicatable","deletable","contentWidth","contentAlign","fontFamily","label","value","preheaderText","linkStyle","linkColor","linkHoverColor","linkUnderline","linkHoverUnderline","schemaVersion","schema","unlayerToolsIterate","design","cb","row","column","content","unlayerToolsIterateCustom","tool","type","slug","unlayerToolsListCustomKeys","Array","from","Set","unlayerToolsListCustom","map","unlayerToolsFind","out","unlayerToolsCustomStat","tools","units","notSupported","unitIDs","isUnit","add","id","some","unit","t","key","missing","filter","isRequired","has","push","unlayerToolsBuildDesign","unlayerUnitsGetIdFromValues","adminConfigProperty","crossId","unlayerUnitsGetTitleFromValues","title","unlayerUnitsGetId","unlayerUnitsGetTitle","unlayerCustomToolsGetRegisterUrls","groupUrl","unlayerCustomToolMetaData","toolMetaData","reduce","acc","description","JSON","stringify","unlayerCustomEmptyToolState","divElement","document","createElement","editIconContainer","textContainer","classList","innerHTML","innerText","appendChild","outerHTML"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/tools.ts"],"sourcesContent":["import {\n constGenericsEditor,\n E_SIGN_DATE_SIGNED_OFFSET_TYPE,\n E_SIGN_DATE_SIGNED_OFFSET_VALUES_KEY,\n E_SIGN_TOOL_SLUG,\n UnlayerToolMetaData,\n} from './shared/const';\nimport { isESignOffsetSettings, normalizeESignOffsetSettings } from './shared/e-sign-offset';\nimport { editIconSvg } from './shared/edit-icon';\nimport { generateInstanceId, INSTANCE_ID_TOOL_SLUGS } from './shared/instance-id';\nimport { unlayerToolsParseUnitKey } from './shared/tools';\nimport { versions } from './unlayer';\n\nimport type {\n UnlayerDesignCustomTool,\n UnlayerDesignFormat,\n UnlayerDesignTool,\n UnlayerEditorCustomTool,\n} from './unlayer-interface';\n\n/* eslint-disable @typescript-eslint/naming-convention */\nexport const unlayerGetDefaultDesign = (): UnlayerDesignFormat => ({\n counters: {\n u_column: 1,\n u_row: 1,\n u_content_custom_generic_list_of_fields: 1,\n },\n body: {\n rows: [\n {\n cells: [1],\n columns: [\n {\n contents: [],\n values: {\n backgroundColor: '',\n padding: '0px',\n border: {},\n _meta: {\n htmlID: 'u_column_1',\n htmlClassNames: 'u_column',\n },\n },\n },\n ],\n values: {\n displayCondition: null,\n columns: false,\n backgroundColor: '',\n columnsBackgroundColor: '',\n backgroundImage: {\n url: '',\n fullWidth: true,\n repeat: false,\n center: true,\n cover: false,\n },\n padding: '0px',\n hideDesktop: false,\n hideMobile: false,\n noStackMobile: false,\n _meta: {\n htmlID: 'u_row_1',\n htmlClassNames: 'u_row',\n },\n selectable: true,\n draggable: true,\n duplicatable: true,\n deletable: true,\n },\n },\n ],\n values: {\n backgroundColor: 'rgba(0,0,0,0)',\n backgroundImage: {\n url: '',\n fullWidth: true,\n repeat: false,\n center: true,\n cover: false,\n },\n contentWidth: '100%',\n contentAlign: 'center',\n fontFamily: {\n label: 'Arial',\n value: 'arial,helvetica,sans-serif',\n },\n preheaderText: '',\n linkStyle: {\n body: true,\n linkColor: '#0000ee',\n linkHoverColor: '#0000ee',\n linkUnderline: true,\n linkHoverUnderline: true,\n },\n _meta: {\n htmlID: 'u_body',\n htmlClassNames: 'u_body',\n },\n },\n },\n schemaVersion: versions.schema,\n});\n/* eslint-enable @typescript-eslint/naming-convention */\n\nexport const unlayerToolsIterate = (\n design: UnlayerDesignFormat,\n cb: (tool: UnlayerDesignTool) => boolean | undefined | void\n) => {\n for (const row of design?.body?.rows ?? []) {\n for (const column of row.columns) {\n for (const content of column.contents) {\n if (cb(content) === false) {\n return;\n }\n }\n }\n }\n};\n\nexport const unlayerToolsIterateCustom = (\n design: UnlayerDesignFormat,\n cb: (tool: UnlayerDesignCustomTool) => boolean | undefined | void\n) => {\n unlayerToolsIterate(design, tool => {\n if (tool.type === 'custom' && tool.slug) {\n return cb(tool as any);\n }\n });\n};\n\nexport const unlayerToolsListCustomKeys = (design: UnlayerDesignFormat): string[] => {\n return Array.from(new Set(unlayerToolsListCustom(design).map(tool => tool.slug)));\n};\n\nexport const unlayerToolsFind = (\n design: UnlayerDesignFormat,\n cb: (tool: UnlayerDesignTool) => boolean | void\n): UnlayerDesignTool | undefined => {\n let out: UnlayerDesignTool | undefined;\n\n unlayerToolsIterate(design, tool => {\n if (cb(tool)) {\n out = tool;\n return false;\n }\n });\n\n return out;\n};\n\nexport interface UnlayerCustomToolsStat {\n counters: Record<string, number>;\n missing: string[];\n notSupported: string[];\n}\n\nexport const unlayerToolsCustomStat = (\n design: UnlayerDesignFormat,\n tools?: { key: string; isRequired?: boolean }[],\n units?: { id: string; generic: string; isRequired?: boolean }[]\n): UnlayerCustomToolsStat => {\n const counters: Record<string, number> = {};\n const notSupported = new Set<string>();\n const unitIDs = new Set<string>();\n\n unlayerToolsIterateCustom(design, tool => {\n if (!counters[tool.slug]) {\n counters[tool.slug] = 0;\n }\n\n counters[tool.slug]++;\n\n const isUnit = unlayerToolsParseUnitKey(tool.slug);\n\n if (isUnit) {\n unitIDs.add(isUnit.id);\n }\n\n if (\n (isUnit && !units?.some(unit => unit.id === isUnit.id)) ??\n (!isUnit && !tools?.some(t => t.key === tool.slug))\n ) {\n notSupported.add(tool.slug);\n }\n });\n\n return {\n counters,\n notSupported: Array.from(notSupported),\n\n missing: [\n ...(tools\n ?.filter(tool => tool.isRequired && !counters[tool.key])\n .map(tool => tool.key) ?? []),\n ...(units\n ?.filter(unit => unit.isRequired && !unitIDs.has(unit.id))\n .map(unit => unit.id) ?? []),\n ],\n };\n};\n\nexport const unlayerToolsListCustom = (design: UnlayerDesignFormat): UnlayerDesignCustomTool[] => {\n const tools: UnlayerDesignCustomTool[] = [];\n\n unlayerToolsIterateCustom(design, tool => {\n tools.push(tool);\n });\n\n return tools;\n};\n\n/**\n * Makes `values.id` unique across all instance-id tools (see `INSTANCE_ID_TOOL_SLUGS`)\n * in the design. Duplicating content/rows in Unlayer copies the values verbatim, so\n * every copy ends up with the original's GUID; this gives each copy a fresh one.\n *\n * Of the contents sharing an id, the one that keeps it is the first in document\n * order that is not the just-added content (`addedHtmlID`), so the original always\n * wins over its duplicate regardless of where the copy was inserted.\n *\n * @returns `true` when at least one id was regenerated.\n */\nexport const unlayerToolsDedupeInstanceIds = (\n design: UnlayerDesignFormat,\n addedHtmlID?: string\n): boolean => {\n const byId = new Map<string, UnlayerDesignCustomTool[]>();\n\n unlayerToolsIterateCustom(design, tool => {\n const id = tool.values?.id;\n\n if (INSTANCE_ID_TOOL_SLUGS.includes(tool.slug) && typeof id === 'string' && id) {\n const key = `${tool.slug}|${id}`;\n byId.set(key, [...(byId.get(key) ?? []), tool]);\n }\n });\n\n let hasChanges = false;\n\n byId.forEach(tools => {\n if (tools.length < 2) {\n return;\n }\n\n const keeper = tools.find(tool => tool.values?._meta?.htmlID !== addedHtmlID) ?? tools[0];\n\n for (const tool of tools) {\n if (tool !== keeper) {\n /*\n * If no id can be generated the copy is left without one, which is still\n * better than two instances bound to the same image.\n */\n tool.values.id = generateInstanceId();\n hasChanges = true;\n }\n }\n });\n\n return hasChanges;\n};\n\n/**\n * Gives every \"Date Signed Offset\" e-sign placement valid settings. Unlayer never applies an\n * option's default to placements saved before the option existed, and the backend rejects a\n * design whose dateSignedOffset recipient has no settings.\n */\nexport const unlayerToolsNormalizeESignOffsets = (design: UnlayerDesignFormat): boolean => {\n let hasChanges = false;\n\n unlayerToolsIterateCustom(design, tool => {\n if (\n tool.slug !== E_SIGN_TOOL_SLUG ||\n tool.values?.eSignFieldType !== E_SIGN_DATE_SIGNED_OFFSET_TYPE\n ) {\n return;\n }\n\n const settings = tool.values[E_SIGN_DATE_SIGNED_OFFSET_VALUES_KEY];\n\n if (!isESignOffsetSettings(settings)) {\n tool.values[E_SIGN_DATE_SIGNED_OFFSET_VALUES_KEY] =\n normalizeESignOffsetSettings(settings);\n hasChanges = true;\n }\n });\n\n return hasChanges;\n};\n\nexport const unlayerToolsBuildDesign = (tools: UnlayerDesignTool[]): UnlayerDesignFormat => {\n const design = unlayerGetDefaultDesign();\n\n design.body.rows[0].columns[0].contents = tools;\n return design;\n};\n\nexport const unlayerUnitsGetIdFromValues = (values?: any): string | undefined =>\n values?.[constGenericsEditor.adminConfigProperty]?.crossId;\nexport const unlayerUnitsGetTitleFromValues = (values?: any): string | undefined =>\n values?.[constGenericsEditor.adminConfigProperty]?.title;\n\nexport const unlayerUnitsGetId = (tool: UnlayerDesignTool): string | undefined =>\n unlayerUnitsGetIdFromValues(tool.values);\nexport const unlayerUnitsGetTitle = (tool: UnlayerDesignTool): string | undefined =>\n unlayerUnitsGetTitleFromValues(tool.values);\n\nexport const unlayerCustomToolsGetRegisterUrls = (tools: UnlayerEditorCustomTool[]): string[] =>\n Array.from(\n new Set(tools.map(tool => (tool.groupUrl ? `${tool.groupUrl}/index.js` : tool.url)))\n );\n\nexport const unlayerCustomToolMetaData = (tools: UnlayerEditorCustomTool[]): string => {\n const toolMetaData = tools.reduce((acc: Record<string, UnlayerToolMetaData>, tool) => {\n acc[tool.title] = {\n key: tool.key,\n description: tool.description,\n };\n return acc;\n }, {});\n\n return `\n window.dteStore.setToolMetaData(${JSON.stringify(toolMetaData)});\n `;\n};\n\nexport const unlayerCustomEmptyToolState = (): string => {\n const divElement = document.createElement('div');\n const editIconContainer = document.createElement('div');\n const textContainer = document.createElement('div');\n\n divElement.classList.add('unlayer-custom-empty-tool-state');\n editIconContainer.classList.add('unlayer-custom-empty-tool-state-icon');\n textContainer.classList.add('unlayer-custom-empty-tool-state-text');\n\n editIconContainer.innerHTML = editIconSvg;\n textContainer.innerText = 'Please choose \\n\\r your component';\n divElement.appendChild(editIconContainer);\n divElement.appendChild(textContainer);\n return `\n document.querySelector('.tab-content .tab-pane').innerHTML = \\`${divElement.outerHTML}\\`;\n `;\n};\n"],"names":["constGenericsEditor","E_SIGN_DATE_SIGNED_OFFSET_TYPE","E_SIGN_DATE_SIGNED_OFFSET_VALUES_KEY","E_SIGN_TOOL_SLUG","isESignOffsetSettings","normalizeESignOffsetSettings","editIconSvg","generateInstanceId","INSTANCE_ID_TOOL_SLUGS","unlayerToolsParseUnitKey","versions","unlayerGetDefaultDesign","counters","u_column","u_row","u_content_custom_generic_list_of_fields","body","rows","cells","columns","contents","values","backgroundColor","padding","border","_meta","htmlID","htmlClassNames","displayCondition","columnsBackgroundColor","backgroundImage","url","fullWidth","repeat","center","cover","hideDesktop","hideMobile","noStackMobile","selectable","draggable","duplicatable","deletable","contentWidth","contentAlign","fontFamily","label","value","preheaderText","linkStyle","linkColor","linkHoverColor","linkUnderline","linkHoverUnderline","schemaVersion","schema","unlayerToolsIterate","design","cb","row","column","content","unlayerToolsIterateCustom","tool","type","slug","unlayerToolsListCustomKeys","Array","from","Set","unlayerToolsListCustom","map","unlayerToolsFind","out","unlayerToolsCustomStat","tools","units","notSupported","unitIDs","isUnit","add","id","some","unit","t","key","missing","filter","isRequired","has","push","unlayerToolsDedupeInstanceIds","addedHtmlID","byId","Map","includes","set","get","hasChanges","forEach","length","keeper","find","unlayerToolsNormalizeESignOffsets","eSignFieldType","settings","unlayerToolsBuildDesign","unlayerUnitsGetIdFromValues","adminConfigProperty","crossId","unlayerUnitsGetTitleFromValues","title","unlayerUnitsGetId","unlayerUnitsGetTitle","unlayerCustomToolsGetRegisterUrls","groupUrl","unlayerCustomToolMetaData","toolMetaData","reduce","acc","description","JSON","stringify","unlayerCustomEmptyToolState","divElement","document","createElement","editIconContainer","textContainer","classList","innerHTML","innerText","appendChild","outerHTML"],"mappings":"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"}
@@ -37,12 +37,22 @@ export interface UnlayerRef {
37
37
  sendFormList(forms: FormInfo[]): void;
38
38
  sendFormFields(formId: number, fields: FormFieldInfo[]): void;
39
39
  sendCalcFieldLabels(labels: Record<string, string>): void;
40
+ /**
41
+ * Replaces the editor's merge tag menu with `tags` (grouped). Safe to call before the editor is
42
+ * ready — the tags are applied once it is. Lets hosts add tags that finish loading after init
43
+ * (e.g. form fields) without remounting the editor.
44
+ */
45
+ setMergeTags(tags: UnlayerEditorMergeTagInfo[] | undefined): void;
40
46
  }
41
47
  export interface UnlayerEditorMergeTagInfo {
42
48
  id: string;
43
49
  name: string;
44
50
  propertyPath: string;
45
- group?: string;
51
+ /**
52
+ * Submenu the tag is listed under. A string is a single submenu (`'Custom Fields'`);
53
+ * an array nests submenus in order (`['Forms', 'Customer Intake']` → Forms ▸ Customer Intake ▸ tag).
54
+ */
55
+ group?: string | string[];
46
56
  }
47
57
  export interface UnlayerEditorCustomTool {
48
58
  key: string;
@@ -1 +1 @@
1
- {"version":3,"file":"unlayer-interface.d.ts","sourceRoot":"","sources":["../src/unlayer-interface.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"unlayer-interface.d.ts","sourceRoot":"","sources":["../src/unlayer-interface.tsx"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/unlayer-interface.tsx"],"sourcesContent":["import {\n UnlayerEditorESignRecipientInfo,\n UnlayerEditorTwin,\n UnlayerEditorUnit,\n} from './shared/const';\nimport { FormFieldInfo, FormInfo } from './shared/forms';\nimport { SchemaObject } from './shared/schema';\n\nexport interface UnlayerDesignTool {\n type: string;\n slug?: string;\n values: any;\n}\nexport interface UnlayerDesignCustomTool extends UnlayerDesignTool {\n slug: string;\n}\n\nexport interface UnlayerDesignFormat {\n body: {\n rows: {\n cells: number[];\n columns: {\n contents: UnlayerDesignTool[];\n values?: any;\n }[];\n values?: any;\n }[];\n values?: any;\n };\n counters: Record<string, number>;\n schemaVersion: number;\n}\n\nexport interface UnlayerExport {\n html: string;\n chunks: any;\n design: UnlayerDesignFormat;\n demoData?: Record<string, unknown>;\n}\n\nexport interface UnlayerRef {\n loadDesign(design: any): void;\n saveDesign(cb: (design: any) => void): void;\n exportHtml(cb: (data: UnlayerExport) => void): void;\n sendFormList(forms: FormInfo[]): void;\n sendFormFields(formId: number, fields: FormFieldInfo[]): void;\n sendCalcFieldLabels(labels: Record<string, string>): void;\n}\n\nexport interface UnlayerEditorMergeTagInfo {\n id: string;\n name: string;\n propertyPath: string;\n group?: string;\n}\n\nexport interface UnlayerEditorCustomTool {\n key: string;\n title: string;\n description?: string;\n url: string;\n groupUrl?: string;\n}\n\nexport interface CreateUnlayerEditorProps {\n tools: UnlayerEditorCustomTool[];\n newSnapshot?: UnlayerEditorTwin;\n toolTwins?: UnlayerEditorTwin[];\n isSnapshotMode?: boolean;\n dummyData?: any;\n schema?: SchemaObject;\n customCSS?: string | string[] | undefined;\n customJS?: string | string[] | undefined;\n mergeTags?: UnlayerEditorMergeTagInfo[] | undefined;\n eSignRecipients?: UnlayerEditorESignRecipientInfo[] | undefined;\n eSignFieldTypes?: string[] | undefined;\n genericConfigMode?: boolean;\n generics?: true | string[];\n units?: UnlayerEditorUnit[];\n noCoreTools?: boolean;\n latest?: boolean;\n blocks?: boolean;\n hideAllTools?: boolean;\n hideContentControls?: boolean;\n hideBodyMenuItem?: boolean;\n displayConditions?: boolean;\n /**\n * Optional portal target for the display-conditions dialog. Prefer unset so the dialog\n * stays under the host `AnvilProvider` (`.anvil2` CSS scope). When set, content is wrapped\n * in `ThemeProvider` so Anvil2 styles still apply after portaling.\n */\n displayConditionModalPortalContainer?: Element | DocumentFragment | null;\n enableHTMLEditing?: boolean;\n enableHTMLEditingReadonly?: boolean;\n imageValidation?: {\n maxWidth?: number;\n maxHeight?: number;\n maxFileSize?: number;\n };\n holidays?: string[];\n onFormSelect?: (formId: number) => void;\n onCalcFieldOpen?: (usedFormIds: number[]) => void;\n onCalcFieldSelect?: (fieldKeys: string[]) => void;\n onConditionalsOpen?: (\n usedFormIds: number[],\n sendFormList: (forms: FormInfo[]) => void,\n sendFormFields: (formId: number, fields: FormFieldInfo[]) => void,\n ) => void;\n onConditionFormSelect?: (\n formId: number,\n sendFormFields: (formId: number, fields: FormFieldInfo[]) => void,\n ) => void;\n}\n"],"names":[],"mappings":"AAgEA,WAgDC"}
1
+ {"version":3,"sources":["../src/unlayer-interface.tsx"],"sourcesContent":["import {\n UnlayerEditorESignRecipientInfo,\n UnlayerEditorTwin,\n UnlayerEditorUnit,\n} from './shared/const';\nimport { FormFieldInfo, FormInfo } from './shared/forms';\nimport { SchemaObject } from './shared/schema';\n\nexport interface UnlayerDesignTool {\n type: string;\n slug?: string;\n values: any;\n}\nexport interface UnlayerDesignCustomTool extends UnlayerDesignTool {\n slug: string;\n}\n\nexport interface UnlayerDesignFormat {\n body: {\n rows: {\n cells: number[];\n columns: {\n contents: UnlayerDesignTool[];\n values?: any;\n }[];\n values?: any;\n }[];\n values?: any;\n };\n counters: Record<string, number>;\n schemaVersion: number;\n}\n\nexport interface UnlayerExport {\n html: string;\n chunks: any;\n design: UnlayerDesignFormat;\n demoData?: Record<string, unknown>;\n}\n\nexport interface UnlayerRef {\n loadDesign(design: any): void;\n saveDesign(cb: (design: any) => void): void;\n exportHtml(cb: (data: UnlayerExport) => void): void;\n sendFormList(forms: FormInfo[]): void;\n sendFormFields(formId: number, fields: FormFieldInfo[]): void;\n sendCalcFieldLabels(labels: Record<string, string>): void;\n /**\n * Replaces the editor's merge tag menu with `tags` (grouped). Safe to call before the editor is\n * ready — the tags are applied once it is. Lets hosts add tags that finish loading after init\n * (e.g. form fields) without remounting the editor.\n */\n setMergeTags(tags: UnlayerEditorMergeTagInfo[] | undefined): void;\n}\n\nexport interface UnlayerEditorMergeTagInfo {\n id: string;\n name: string;\n propertyPath: string;\n /**\n * Submenu the tag is listed under. A string is a single submenu (`'Custom Fields'`);\n * an array nests submenus in order (`['Forms', 'Customer Intake']` → Forms ▸ Customer Intake ▸ tag).\n */\n group?: string | string[];\n}\n\nexport interface UnlayerEditorCustomTool {\n key: string;\n title: string;\n description?: string;\n url: string;\n groupUrl?: string;\n}\n\nexport interface CreateUnlayerEditorProps {\n tools: UnlayerEditorCustomTool[];\n newSnapshot?: UnlayerEditorTwin;\n toolTwins?: UnlayerEditorTwin[];\n isSnapshotMode?: boolean;\n dummyData?: any;\n schema?: SchemaObject;\n customCSS?: string | string[] | undefined;\n customJS?: string | string[] | undefined;\n mergeTags?: UnlayerEditorMergeTagInfo[] | undefined;\n eSignRecipients?: UnlayerEditorESignRecipientInfo[] | undefined;\n eSignFieldTypes?: string[] | undefined;\n genericConfigMode?: boolean;\n generics?: true | string[];\n units?: UnlayerEditorUnit[];\n noCoreTools?: boolean;\n latest?: boolean;\n blocks?: boolean;\n hideAllTools?: boolean;\n hideContentControls?: boolean;\n hideBodyMenuItem?: boolean;\n displayConditions?: boolean;\n /**\n * Optional portal target for the display-conditions dialog. Prefer unset so the dialog\n * stays under the host `AnvilProvider` (`.anvil2` CSS scope). When set, content is wrapped\n * in `ThemeProvider` so Anvil2 styles still apply after portaling.\n */\n displayConditionModalPortalContainer?: Element | DocumentFragment | null;\n enableHTMLEditing?: boolean;\n enableHTMLEditingReadonly?: boolean;\n imageValidation?: {\n maxWidth?: number;\n maxHeight?: number;\n maxFileSize?: number;\n };\n holidays?: string[];\n onFormSelect?: (formId: number) => void;\n onCalcFieldOpen?: (usedFormIds: number[]) => void;\n onCalcFieldSelect?: (fieldKeys: string[]) => void;\n onConditionalsOpen?: (\n usedFormIds: number[],\n sendFormList: (forms: FormInfo[]) => void,\n sendFormFields: (formId: number, fields: FormFieldInfo[]) => void,\n ) => void;\n onConditionFormSelect?: (\n formId: number,\n sendFormFields: (formId: number, fields: FormFieldInfo[]) => void,\n ) => void;\n}\n"],"names":[],"mappings":"AA0EA,WAgDC"}
@@ -1 +1 @@
1
- {"version":3,"file":"unlayer.d.ts","sourceRoot":"","sources":["../src/unlayer.tsx"],"names":[],"mappings":"AAWA,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,GAAG,CAAC;IACZ,MAAM,EAAE,GAAG,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,OAAO;IACpB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI,CAAC;IAC9D,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI,CAAC;IACjE,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IACnE,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IACrE,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IACnE,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IACrE,UAAU,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC;IAC9B,UAAU,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI,CAAC;IAClD,UAAU,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1D,YAAY,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC;IAC9B,YAAY,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,MAAM,CAAA;KAAE,GAAG,GAAG,CAAC;IAC7D,YAAY,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC;IAC9B,aAAa,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC;CACpC;AAED,oBAAY,sBAAsB;IAC9B,YAAY,kBAAkB;IAC9B,YAAY,kBAAkB;IAC9B,cAAc,oBAAoB;IAClC,eAAe,qBAAqB;IACpC,QAAQ,cAAc;IACtB,QAAQ,cAAc;IACtB,UAAU,gBAAgB;IAC1B,WAAW,iBAAiB;IAC5B,WAAW,iBAAiB;IAC5B,aAAa,mBAAmB;IAChC,cAAc,oBAAoB;IAClC,YAAY,kBAAkB;CACjC;AAED,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,sBAAsB,CAAC;IAC7B,IAAI,EAAE;QACF,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,GAAG,CAAC;KACf,CAAC;CACL;AAED;;;;;GAKG;AACH,eAAO,MAAM,QAAQ;;;CAGpB,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,mBAAmB,MAAM,WAO5D,CAAC;AAEF,eAAO,MAAM,2BAA2B,cAUvC,CAAC;AAEF,eAAO,MAAM,uBAAuB,cAMnC,CAAC;AAyBF,eAAO,MAAM,uBAAuB,cAQnC,CAAC;AACF,eAAO,MAAM,gBAAgB,cAiC5B,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC5B,WAAW,cAAc,EACzB,gOAgBG,wBAAwB,KAC5B,OA8LF,CAAC"}
1
+ {"version":3,"file":"unlayer.d.ts","sourceRoot":"","sources":["../src/unlayer.tsx"],"names":[],"mappings":"AAWA,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAE/D,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,GAAG,CAAC;IACZ,MAAM,EAAE,GAAG,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,OAAO;IACpB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI,CAAC;IAC9D,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI,CAAC;IACjE,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IACnE,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IACrE,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IACnE,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IACrE,UAAU,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC;IAC9B,UAAU,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI,CAAC;IAClD,UAAU,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,IAAI,GAAG,IAAI,CAAC;IAC1D,YAAY,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC;IAC9B,YAAY,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,MAAM,CAAA;KAAE,GAAG,GAAG,CAAC;IAC7D,YAAY,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC;IAC9B,aAAa,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,CAAC;CACpC;AAED,oBAAY,sBAAsB;IAC9B,YAAY,kBAAkB;IAC9B,YAAY,kBAAkB;IAC9B,cAAc,oBAAoB;IAClC,eAAe,qBAAqB;IACpC,QAAQ,cAAc;IACtB,QAAQ,cAAc;IACtB,UAAU,gBAAgB;IAC1B,WAAW,iBAAiB;IAC5B,WAAW,iBAAiB;IAC5B,aAAa,mBAAmB;IAChC,cAAc,oBAAoB;IAClC,YAAY,kBAAkB;CACjC;AAED,MAAM,WAAW,kBAAkB;IAC/B,IAAI,EAAE,sBAAsB,CAAC;IAC7B,IAAI,EAAE;QACF,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,GAAG,CAAC;KACf,CAAC;CACL;AAED;;;;;GAKG;AACH,eAAO,MAAM,QAAQ;;;CAGpB,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,mBAAmB,MAAM,WAO5D,CAAC;AAEF,eAAO,MAAM,2BAA2B,cAUvC,CAAC;AAEF,eAAO,MAAM,uBAAuB,cAMnC,CAAC;AAyBF,eAAO,MAAM,uBAAuB,cAQnC,CAAC;AACF,eAAO,MAAM,gBAAgB,cAiC5B,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAC5B,WAAW,cAAc,EACzB,gOAgBG,wBAAwB,KAC5B,OAgMF,CAAC"}
package/dist/unlayer.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { emitDisplayCondition } from './display-conditions/displayConditionController';
2
2
  import { editorCoreScript, editorCoreStyles, editorCoreTools } from './editor-core';
3
3
  import { logUnlayerError } from './log';
4
- import { scheduleUnlayerMergeTags, toUnlayerMergeTags } from './merge-tags';
4
+ import { toUnlayerMergeTags } from './merge-tags';
5
5
  import { constGenericsEditor } from './shared/const';
6
6
  import { unlayerSupportedFonts } from './shared/fonts';
7
7
  import { unlayerCustomEmptyToolState, unlayerCustomToolMetaData, unlayerCustomToolsGetRegisterUrls } from './tools';
@@ -226,7 +226,10 @@ export const createUnlayerEditor = (container, { customCSS, customJS, displayCon
226
226
  tables: true
227
227
  }
228
228
  },
229
- mergeTags: toUnlayerMergeTags(mergeTags, {
229
+ /*
230
+ * Flat only: nested groups here break custom tool registration. UnlayerStore applies
231
+ * the grouped config via setMergeTags once the editor is ready.
232
+ */ mergeTags: toUnlayerMergeTags(mergeTags, {
230
233
  groups: false
231
234
  }),
232
235
  projectId: 5713,
@@ -308,7 +311,6 @@ export const createUnlayerEditor = (container, { customCSS, customJS, displayCon
308
311
  } finally{
309
312
  document.getElementById = currentFind;
310
313
  }
311
- scheduleUnlayerMergeTags(result, mergeTags);
312
314
  if (displayConditions) {
313
315
  result.registerCallback('displayCondition', function(data, done) {
314
316
  emitDisplayCondition({
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/unlayer.tsx"],"sourcesContent":["import { emitDisplayCondition } from './display-conditions/displayConditionController';\nimport { editorCoreScript, editorCoreStyles, editorCoreTools } from './editor-core';\nimport { logUnlayerError } from './log';\nimport { scheduleUnlayerMergeTags, toUnlayerMergeTags } from './merge-tags';\nimport { constGenericsEditor } from './shared/const';\nimport { unlayerSupportedFonts } from './shared/fonts';\nimport {\n unlayerCustomEmptyToolState,\n unlayerCustomToolMetaData,\n unlayerCustomToolsGetRegisterUrls,\n} from './tools';\nimport { CreateUnlayerEditorProps } from './unlayer-interface';\n\nexport interface UnlayerExport {\n html: string;\n chunks: any;\n design: any;\n demoData?: Record<string, unknown>;\n}\n\nexport interface Unlayer {\n addEventListener(event: string, cb: (arg: any) => void): void;\n removeEventListener(event: string, cb: (arg: any) => void): void;\n registerCallback(type: string, cb: (...args: any[]) => void): void;\n unregisterCallback(type: string, cb: (...args: any[]) => void): void;\n registerProvider(type: string, cb: (...args: any[]) => void): void;\n unregisterProvider(type: string, cb: (...args: any[]) => void): void;\n loadDesign(design: any): void;\n saveDesign(callback: (design: any) => void): void;\n exportHtml(callback: (data: UnlayerExport) => void): void;\n setMergeTags(tags: any): void;\n createViewer(opts: { render: (values: any) => string }): any;\n registerTool(tool: any): void;\n setBodyValues(values: any): void;\n}\n\nexport enum DesignUpdatedEventType {\n ContentAdded = 'content:added',\n ContentMoved = 'content:moved',\n ContentRemoved = 'content:removed',\n ContentModified = 'content:modified',\n RowAdded = 'row:added',\n RowMoved = 'row:moved',\n RowRemoved = 'row:removed',\n RowModified = 'row:modified',\n ColumnAdded = 'column:added',\n ColumnRemoved = 'column:removed',\n ColumnModified = 'column:modified',\n BodyModified = 'body:modified',\n}\n\nexport interface EventDesignUpdated {\n type: DesignUpdatedEventType;\n item: {\n type: string;\n slug?: string;\n values: any;\n };\n}\n\n/**\n * !!! IMPORTANT !!!\n * do not forget to update schema version when updating unlayer version\n * it is important for templates export and should be in sync\n * to know correct schema version, open unlayer editor and check output design ('schema' property)\n */\nexport const versions = {\n unlayer: '1.421.0',\n schema: 24,\n};\n\nexport const handlePreselectTool = (preselectToolSlug: string) => {\n return `\n const element = document.querySelector('.u_content_custom_${preselectToolSlug}');\n if (element) {\n element.click();\n }\n `;\n};\n\nexport const hideUnlayerContentsControls = () => {\n return `\n .blockbuilder-layer-controls-contents, .blockbuilder-layer-controls-rows {\n display: none !important;\n }\n\n .blockbuilder-options-header .text-right .icon-delete, .blockbuilder-options-header .text-right .icon-duplicate {\n display: none !important;\n }\n `;\n};\n\nexport const hideUnlayerBodyMenuItem = () => {\n return `\n .nav-item.tab-body {\n display: none !important;\n }\n `;\n};\n\nconst injectEditorCoreStyles = () => {\n const cssText = editorCoreStyles?.trim();\n\n if (!cssText) {\n return '';\n }\n\n return `\n (function () {\n var css = ${JSON.stringify(cssText)};\n var id = 'dte-unlayer-core-styles';\n if (document.getElementById(id)) {\n return;\n }\n var style = document.createElement('style');\n style.id = id;\n style.type = 'text/css';\n style.appendChild(document.createTextNode(css));\n document.head.appendChild(style);\n })();\n `;\n};\n\nexport const hideMobileTabletPreview = () => `\n [data-key=\"preview-tablet\"],\n [data-key=\"resolution\"],\n [data-key=\"dark-mode\"],\n [data-key=\"preview-desktop\"],\n [data-key=\"preview-mobile\"] {\n display: none !important;\n }\n`;\nexport const hideUnlayerTools = () => {\n return `\n .blockbuilder-content-tools {\n display: none !important;\n }\n \n .unlayer-custom-empty-tool-state {\n display: flex;\n margin-top: 150px;\n flex-direction: column;\n justify-content: center;\n }\n \n .unlayer-custom-empty-tool-state-icon {\n text-align: center;\n margin-bottom: 12px;\n }\n \n .unlayer-custom-empty-tool-state-icon svg{\n color: #606162;\n }\n \n .unlayer-custom-empty-tool-state-text {\n text-align: center;\n font-family: 'Open Sans', 'Helvetica Neue', Arial, sans-serif;\n font-size: 16px;\n font-style: normal;\n font-weight: 500;\n line-height: normal;\n color: #606162;\n line-height: 13px;\n }\n `;\n};\n\nexport const createUnlayerEditor = (\n container: HTMLDivElement,\n {\n customCSS,\n customJS,\n displayConditions,\n eSignFieldTypes,\n eSignRecipients,\n enableHTMLEditing,\n enableHTMLEditingReadonly,\n hideAllTools,\n hideBodyMenuItem,\n hideContentControls,\n latest,\n mergeTags,\n noCoreTools,\n tools,\n units,\n }: CreateUnlayerEditorProps,\n): Unlayer => {\n const customScripts = [\n editorCoreScript,\n editorCoreTools,\n injectEditorCoreStyles(),\n 'window.dteStore.sendData(\"--core-loaded\")',\n ...unlayerCustomToolsGetRegisterUrls(tools),\n unlayerCustomToolMetaData(tools),\n ...(customJS ? (Array.isArray(customJS) ? customJS : [customJS]) : []),\n hideAllTools ? unlayerCustomEmptyToolState() : '',\n 'window.dteStore.sendData(\"--data-loaded\")',\n ].filter(js => !!js?.trim());\n const customStyles = [\n editorCoreStyles,\n ...(customCSS ? (Array.isArray(customCSS) ? customCSS : [customCSS]) : []),\n /*\n * @TODO this is workaround for hiding all tools from unlayer sidebar.\n * Will be better to use unlayer functionality for this but it is not implemented yet\n */\n hideMobileTabletPreview(),\n hideAllTools ? hideUnlayerTools() : '',\n hideContentControls ? hideUnlayerContentsControls() : '',\n hideBodyMenuItem ? hideUnlayerBodyMenuItem() : '',\n ].filter(css => !!css?.trim());\n\n /**\n * Unlayer supports only passing id of container, but when we use shadowDOM (MFE),\n * getElementById can't find element in it\n * so making this dirty hack to let unlayer find container in DOM\n */\n const id = container.id;\n const currentFind = document.getElementById;\n document.getElementById = function (elementId: string) {\n if (id === elementId) {\n return container;\n }\n\n return currentFind.call(document, id);\n };\n\n const acv = constGenericsEditor.adminConfigProperty;\n\n const eSignTypeMapping = (eSignFieldTypes ?? []).map(key => ({\n label: key,\n value: key.charAt(0).toLowerCase() + key.replace(/ /g, '').slice(1),\n }));\n\n const unitsConfig = (units ?? []).reduce(\n (out, unit) => {\n out[`custom#${unit.generic}:unit:${unit.id}`] = {\n data: {\n [acv]: unit.values[acv],\n },\n properties: {\n [constGenericsEditor.userConfigProperty]: {\n editor: {\n data: { [acv]: unit.values[acv] },\n },\n },\n [constGenericsEditor.infoDataProperty]: {\n editor: {\n data: { title: unit.title },\n },\n },\n },\n };\n return out;\n },\n {} as Record<string, any>,\n );\n\n const eSignComponentRecipients = {\n properties: {\n eSignRecipient: {\n editor: {\n data: {\n options: eSignRecipients?.map(item => ({\n label: item.displayName,\n value: item.name,\n })),\n },\n },\n },\n eSignFieldType: {\n editor: {\n data: {\n options: eSignTypeMapping,\n },\n },\n },\n },\n };\n\n let result: Unlayer;\n\n try {\n const unlayerApi = (window as any).unlayer;\n\n if (!unlayerApi?.createEditor) {\n throw new Error(\n 'Unlayer embed is not available. window.unlayer.createEditor is missing.',\n );\n }\n\n result = unlayerApi.createEditor({\n displayMode: 'web',\n devices: ['desktop'],\n features: {\n preview: true,\n userUploads: false,\n stockImages: false,\n textEditor: {\n tables: true,\n },\n },\n mergeTags: toUnlayerMergeTags(mergeTags, { groups: false }),\n projectId: 5713,\n version: latest ? undefined : versions.unlayer,\n appearance: {\n theme: 'classic_light',\n },\n tools: {\n 'carousel': { enabled: false },\n 'button': { enabled: false },\n 'html': {\n enabled: enableHTMLEditing,\n properties: {\n html: {\n editor: {\n widgetParams: {\n codeMirrorOptions: {\n readOnly: enableHTMLEditingReadonly,\n },\n },\n },\n },\n },\n },\n 'table': {\n enabled: true,\n },\n 'menu': { enabled: false },\n 'form': { enabled: false },\n ...(noCoreTools\n ? {\n columns: { enabled: false },\n text: { enabled: false },\n heading: { enabled: false },\n divider: { enabled: false },\n image: { enabled: false },\n }\n : {}),\n ...unitsConfig,\n 'custom#e-sign': eSignComponentRecipients,\n },\n editor: {\n autoSelectOnDrop: true,\n },\n customJS: customScripts,\n customCSS: customStyles,\n id,\n fonts: {\n showDefaultFonts: false,\n customFonts: unlayerSupportedFonts,\n },\n tabs: {\n content: {},\n body: {},\n blocks: { enabled: false },\n },\n });\n } catch (error: unknown) {\n logUnlayerError('unlayer.createEditor failed', error);\n throw error;\n } finally {\n document.getElementById = currentFind;\n }\n\n scheduleUnlayerMergeTags(result, mergeTags);\n\n if (displayConditions) {\n result.registerCallback(\n 'displayCondition',\n function (data: any, done: (condition: any) => void) {\n emitDisplayCondition({ data, done });\n },\n );\n }\n\n return result;\n};\n"],"names":["emitDisplayCondition","editorCoreScript","editorCoreStyles","editorCoreTools","logUnlayerError","scheduleUnlayerMergeTags","toUnlayerMergeTags","constGenericsEditor","unlayerSupportedFonts","unlayerCustomEmptyToolState","unlayerCustomToolMetaData","unlayerCustomToolsGetRegisterUrls","DesignUpdatedEventType","versions","unlayer","schema","handlePreselectTool","preselectToolSlug","hideUnlayerContentsControls","hideUnlayerBodyMenuItem","injectEditorCoreStyles","cssText","trim","JSON","stringify","hideMobileTabletPreview","hideUnlayerTools","createUnlayerEditor","container","customCSS","customJS","displayConditions","eSignFieldTypes","eSignRecipients","enableHTMLEditing","enableHTMLEditingReadonly","hideAllTools","hideBodyMenuItem","hideContentControls","latest","mergeTags","noCoreTools","tools","units","customScripts","Array","isArray","filter","js","customStyles","css","id","currentFind","document","getElementById","elementId","call","acv","adminConfigProperty","eSignTypeMapping","map","key","label","value","charAt","toLowerCase","replace","slice","unitsConfig","reduce","out","unit","generic","data","values","properties","userConfigProperty","editor","infoDataProperty","title","eSignComponentRecipients","eSignRecipient","options","item","displayName","name","eSignFieldType","result","unlayerApi","window","createEditor","Error","displayMode","devices","features","preview","userUploads","stockImages","textEditor","tables","groups","projectId","version","undefined","appearance","theme","enabled","html","widgetParams","codeMirrorOptions","readOnly","columns","text","heading","divider","image","autoSelectOnDrop","fonts","showDefaultFonts","customFonts","tabs","content","body","blocks","error","registerCallback","done"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/unlayer.tsx"],"sourcesContent":["import { emitDisplayCondition } from './display-conditions/displayConditionController';\nimport { editorCoreScript, editorCoreStyles, editorCoreTools } from './editor-core';\nimport { logUnlayerError } from './log';\nimport { toUnlayerMergeTags } from './merge-tags';\nimport { constGenericsEditor } from './shared/const';\nimport { unlayerSupportedFonts } from './shared/fonts';\nimport {\n unlayerCustomEmptyToolState,\n unlayerCustomToolMetaData,\n unlayerCustomToolsGetRegisterUrls,\n} from './tools';\nimport { CreateUnlayerEditorProps } from './unlayer-interface';\n\nexport interface UnlayerExport {\n html: string;\n chunks: any;\n design: any;\n demoData?: Record<string, unknown>;\n}\n\nexport interface Unlayer {\n addEventListener(event: string, cb: (arg: any) => void): void;\n removeEventListener(event: string, cb: (arg: any) => void): void;\n registerCallback(type: string, cb: (...args: any[]) => void): void;\n unregisterCallback(type: string, cb: (...args: any[]) => void): void;\n registerProvider(type: string, cb: (...args: any[]) => void): void;\n unregisterProvider(type: string, cb: (...args: any[]) => void): void;\n loadDesign(design: any): void;\n saveDesign(callback: (design: any) => void): void;\n exportHtml(callback: (data: UnlayerExport) => void): void;\n setMergeTags(tags: any): void;\n createViewer(opts: { render: (values: any) => string }): any;\n registerTool(tool: any): void;\n setBodyValues(values: any): void;\n}\n\nexport enum DesignUpdatedEventType {\n ContentAdded = 'content:added',\n ContentMoved = 'content:moved',\n ContentRemoved = 'content:removed',\n ContentModified = 'content:modified',\n RowAdded = 'row:added',\n RowMoved = 'row:moved',\n RowRemoved = 'row:removed',\n RowModified = 'row:modified',\n ColumnAdded = 'column:added',\n ColumnRemoved = 'column:removed',\n ColumnModified = 'column:modified',\n BodyModified = 'body:modified',\n}\n\nexport interface EventDesignUpdated {\n type: DesignUpdatedEventType;\n item: {\n type: string;\n slug?: string;\n values: any;\n };\n}\n\n/**\n * !!! IMPORTANT !!!\n * do not forget to update schema version when updating unlayer version\n * it is important for templates export and should be in sync\n * to know correct schema version, open unlayer editor and check output design ('schema' property)\n */\nexport const versions = {\n unlayer: '1.421.0',\n schema: 24,\n};\n\nexport const handlePreselectTool = (preselectToolSlug: string) => {\n return `\n const element = document.querySelector('.u_content_custom_${preselectToolSlug}');\n if (element) {\n element.click();\n }\n `;\n};\n\nexport const hideUnlayerContentsControls = () => {\n return `\n .blockbuilder-layer-controls-contents, .blockbuilder-layer-controls-rows {\n display: none !important;\n }\n\n .blockbuilder-options-header .text-right .icon-delete, .blockbuilder-options-header .text-right .icon-duplicate {\n display: none !important;\n }\n `;\n};\n\nexport const hideUnlayerBodyMenuItem = () => {\n return `\n .nav-item.tab-body {\n display: none !important;\n }\n `;\n};\n\nconst injectEditorCoreStyles = () => {\n const cssText = editorCoreStyles?.trim();\n\n if (!cssText) {\n return '';\n }\n\n return `\n (function () {\n var css = ${JSON.stringify(cssText)};\n var id = 'dte-unlayer-core-styles';\n if (document.getElementById(id)) {\n return;\n }\n var style = document.createElement('style');\n style.id = id;\n style.type = 'text/css';\n style.appendChild(document.createTextNode(css));\n document.head.appendChild(style);\n })();\n `;\n};\n\nexport const hideMobileTabletPreview = () => `\n [data-key=\"preview-tablet\"],\n [data-key=\"resolution\"],\n [data-key=\"dark-mode\"],\n [data-key=\"preview-desktop\"],\n [data-key=\"preview-mobile\"] {\n display: none !important;\n }\n`;\nexport const hideUnlayerTools = () => {\n return `\n .blockbuilder-content-tools {\n display: none !important;\n }\n \n .unlayer-custom-empty-tool-state {\n display: flex;\n margin-top: 150px;\n flex-direction: column;\n justify-content: center;\n }\n \n .unlayer-custom-empty-tool-state-icon {\n text-align: center;\n margin-bottom: 12px;\n }\n \n .unlayer-custom-empty-tool-state-icon svg{\n color: #606162;\n }\n \n .unlayer-custom-empty-tool-state-text {\n text-align: center;\n font-family: 'Open Sans', 'Helvetica Neue', Arial, sans-serif;\n font-size: 16px;\n font-style: normal;\n font-weight: 500;\n line-height: normal;\n color: #606162;\n line-height: 13px;\n }\n `;\n};\n\nexport const createUnlayerEditor = (\n container: HTMLDivElement,\n {\n customCSS,\n customJS,\n displayConditions,\n eSignFieldTypes,\n eSignRecipients,\n enableHTMLEditing,\n enableHTMLEditingReadonly,\n hideAllTools,\n hideBodyMenuItem,\n hideContentControls,\n latest,\n mergeTags,\n noCoreTools,\n tools,\n units,\n }: CreateUnlayerEditorProps,\n): Unlayer => {\n const customScripts = [\n editorCoreScript,\n editorCoreTools,\n injectEditorCoreStyles(),\n 'window.dteStore.sendData(\"--core-loaded\")',\n ...unlayerCustomToolsGetRegisterUrls(tools),\n unlayerCustomToolMetaData(tools),\n ...(customJS ? (Array.isArray(customJS) ? customJS : [customJS]) : []),\n hideAllTools ? unlayerCustomEmptyToolState() : '',\n 'window.dteStore.sendData(\"--data-loaded\")',\n ].filter(js => !!js?.trim());\n const customStyles = [\n editorCoreStyles,\n ...(customCSS ? (Array.isArray(customCSS) ? customCSS : [customCSS]) : []),\n /*\n * @TODO this is workaround for hiding all tools from unlayer sidebar.\n * Will be better to use unlayer functionality for this but it is not implemented yet\n */\n hideMobileTabletPreview(),\n hideAllTools ? hideUnlayerTools() : '',\n hideContentControls ? hideUnlayerContentsControls() : '',\n hideBodyMenuItem ? hideUnlayerBodyMenuItem() : '',\n ].filter(css => !!css?.trim());\n\n /**\n * Unlayer supports only passing id of container, but when we use shadowDOM (MFE),\n * getElementById can't find element in it\n * so making this dirty hack to let unlayer find container in DOM\n */\n const id = container.id;\n const currentFind = document.getElementById;\n document.getElementById = function (elementId: string) {\n if (id === elementId) {\n return container;\n }\n\n return currentFind.call(document, id);\n };\n\n const acv = constGenericsEditor.adminConfigProperty;\n\n const eSignTypeMapping = (eSignFieldTypes ?? []).map(key => ({\n label: key,\n value: key.charAt(0).toLowerCase() + key.replace(/ /g, '').slice(1),\n }));\n\n const unitsConfig = (units ?? []).reduce(\n (out, unit) => {\n out[`custom#${unit.generic}:unit:${unit.id}`] = {\n data: {\n [acv]: unit.values[acv],\n },\n properties: {\n [constGenericsEditor.userConfigProperty]: {\n editor: {\n data: { [acv]: unit.values[acv] },\n },\n },\n [constGenericsEditor.infoDataProperty]: {\n editor: {\n data: { title: unit.title },\n },\n },\n },\n };\n return out;\n },\n {} as Record<string, any>,\n );\n\n const eSignComponentRecipients = {\n properties: {\n eSignRecipient: {\n editor: {\n data: {\n options: eSignRecipients?.map(item => ({\n label: item.displayName,\n value: item.name,\n })),\n },\n },\n },\n eSignFieldType: {\n editor: {\n data: {\n options: eSignTypeMapping,\n },\n },\n },\n },\n };\n\n let result: Unlayer;\n\n try {\n const unlayerApi = (window as any).unlayer;\n\n if (!unlayerApi?.createEditor) {\n throw new Error(\n 'Unlayer embed is not available. window.unlayer.createEditor is missing.',\n );\n }\n\n result = unlayerApi.createEditor({\n displayMode: 'web',\n devices: ['desktop'],\n features: {\n preview: true,\n userUploads: false,\n stockImages: false,\n textEditor: {\n tables: true,\n },\n },\n /*\n * Flat only: nested groups here break custom tool registration. UnlayerStore applies\n * the grouped config via setMergeTags once the editor is ready.\n */\n mergeTags: toUnlayerMergeTags(mergeTags, { groups: false }),\n projectId: 5713,\n version: latest ? undefined : versions.unlayer,\n appearance: {\n theme: 'classic_light',\n },\n tools: {\n 'carousel': { enabled: false },\n 'button': { enabled: false },\n 'html': {\n enabled: enableHTMLEditing,\n properties: {\n html: {\n editor: {\n widgetParams: {\n codeMirrorOptions: {\n readOnly: enableHTMLEditingReadonly,\n },\n },\n },\n },\n },\n },\n 'table': {\n enabled: true,\n },\n 'menu': { enabled: false },\n 'form': { enabled: false },\n ...(noCoreTools\n ? {\n columns: { enabled: false },\n text: { enabled: false },\n heading: { enabled: false },\n divider: { enabled: false },\n image: { enabled: false },\n }\n : {}),\n ...unitsConfig,\n 'custom#e-sign': eSignComponentRecipients,\n },\n editor: {\n autoSelectOnDrop: true,\n },\n customJS: customScripts,\n customCSS: customStyles,\n id,\n fonts: {\n showDefaultFonts: false,\n customFonts: unlayerSupportedFonts,\n },\n tabs: {\n content: {},\n body: {},\n blocks: { enabled: false },\n },\n });\n } catch (error: unknown) {\n logUnlayerError('unlayer.createEditor failed', error);\n throw error;\n } finally {\n document.getElementById = currentFind;\n }\n\n if (displayConditions) {\n result.registerCallback(\n 'displayCondition',\n function (data: any, done: (condition: any) => void) {\n emitDisplayCondition({ data, done });\n },\n );\n }\n\n return result;\n};\n"],"names":["emitDisplayCondition","editorCoreScript","editorCoreStyles","editorCoreTools","logUnlayerError","toUnlayerMergeTags","constGenericsEditor","unlayerSupportedFonts","unlayerCustomEmptyToolState","unlayerCustomToolMetaData","unlayerCustomToolsGetRegisterUrls","DesignUpdatedEventType","versions","unlayer","schema","handlePreselectTool","preselectToolSlug","hideUnlayerContentsControls","hideUnlayerBodyMenuItem","injectEditorCoreStyles","cssText","trim","JSON","stringify","hideMobileTabletPreview","hideUnlayerTools","createUnlayerEditor","container","customCSS","customJS","displayConditions","eSignFieldTypes","eSignRecipients","enableHTMLEditing","enableHTMLEditingReadonly","hideAllTools","hideBodyMenuItem","hideContentControls","latest","mergeTags","noCoreTools","tools","units","customScripts","Array","isArray","filter","js","customStyles","css","id","currentFind","document","getElementById","elementId","call","acv","adminConfigProperty","eSignTypeMapping","map","key","label","value","charAt","toLowerCase","replace","slice","unitsConfig","reduce","out","unit","generic","data","values","properties","userConfigProperty","editor","infoDataProperty","title","eSignComponentRecipients","eSignRecipient","options","item","displayName","name","eSignFieldType","result","unlayerApi","window","createEditor","Error","displayMode","devices","features","preview","userUploads","stockImages","textEditor","tables","groups","projectId","version","undefined","appearance","theme","enabled","html","widgetParams","codeMirrorOptions","readOnly","columns","text","heading","divider","image","autoSelectOnDrop","fonts","showDefaultFonts","customFonts","tabs","content","body","blocks","error","registerCallback","done"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@servicetitan/dte-unlayer",
3
- "version": "0.153.0",
3
+ "version": "0.155.0",
4
4
  "description": "",
5
5
  "main": "./dist/index.js",
6
6
  "typings": "./dist/index.d.ts",
@@ -0,0 +1,281 @@
1
+ import {
2
+ emitESignOffsetRequest,
3
+ onESignOffsetRequest,
4
+ } from '../e-sign-offset/eSignOffsetController';
5
+ import type { SingleCondition } from '../display-conditions/types';
6
+ import {
7
+ type ESignDateSignedOffsetRule,
8
+ type ESignDateSignedOffsetSettings,
9
+ MAX_E_SIGN_OFFSET_RULES,
10
+ } from '../shared/const';
11
+ import {
12
+ addESignOffsetRule,
13
+ buildESignOffsetSettings,
14
+ canAddESignOffsetRule,
15
+ clampESignOffsetDays,
16
+ createESignOffsetRule,
17
+ createESignOffsetSettings,
18
+ getESignOffsetConditionText,
19
+ getESignOffsetRuleCondition,
20
+ isCompleteESignOffsetCondition,
21
+ isESignOffsetSettings,
22
+ normalizeESignOffsetSettings,
23
+ removeESignOffsetRule,
24
+ splitESignOffsetSettings,
25
+ updateESignOffsetRule,
26
+ } from '../shared/e-sign-offset';
27
+ import { unlayerToolsBuildDesign, unlayerToolsNormalizeESignOffsets } from '../tools';
28
+ import type { UnlayerDesignCustomTool } from '../unlayer-interface';
29
+
30
+ const createCondition = (overrides: Partial<SingleCondition> = {}): SingleCondition => ({
31
+ dataPointKey: 'job.status',
32
+ id: 'c1',
33
+ operator: 'is_equal_to',
34
+ value: 'Completed',
35
+ ...overrides,
36
+ });
37
+
38
+ const createRule = (days: number, condition = createCondition()): ESignDateSignedOffsetRule => ({
39
+ condition: { behavior: 'show', groups: [{ conditions: [condition], id: `g-${days}` }] },
40
+ days,
41
+ });
42
+
43
+ describe('clampESignOffsetDays', () => {
44
+ test.each([
45
+ [14, 14],
46
+ [0, 0],
47
+ [-5, 0],
48
+ [400, 365],
49
+ [3.7, 3],
50
+ [Number.NaN, 0],
51
+ [null, 0],
52
+ ['7', 0],
53
+ ])('clamps %p to %p', (input, expected) => {
54
+ expect(clampESignOffsetDays(input)).toBe(expected);
55
+ });
56
+ });
57
+
58
+ describe('createESignOffsetSettings', () => {
59
+ test('defaults to a single unconditional zero-day rule', () => {
60
+ expect(createESignOffsetSettings()).toEqual({ rules: [{ days: 0 }] });
61
+ });
62
+
63
+ test('clamps the provided days', () => {
64
+ expect(createESignOffsetSettings(500)).toEqual({ rules: [{ days: 365 }] });
65
+ });
66
+ });
67
+
68
+ describe('createESignOffsetRule', () => {
69
+ test('creates a show rule with a single blank condition', () => {
70
+ const rule = createESignOffsetRule();
71
+
72
+ expect(rule.days).toBe(0);
73
+ expect(rule.condition.behavior).toBe('show');
74
+ expect(rule.condition.groups).toHaveLength(1);
75
+ expect(rule.condition.groups[0].logicalOperator).toBeUndefined();
76
+ expect(rule.condition.groups[0].conditions).toHaveLength(1);
77
+ expect(rule.condition.groups[0].conditions[0].logicalOperator).toBeUndefined();
78
+ });
79
+ });
80
+
81
+ describe('buildESignOffsetSettings / splitESignOffsetSettings', () => {
82
+ test('appends the unconditional final rule after the conditioned rules', () => {
83
+ const settings = buildESignOffsetSettings([createRule(3), createRule(7)], 14);
84
+
85
+ expect(settings.rules).toHaveLength(3);
86
+ expect(settings.rules[2]).toEqual({ days: 14 });
87
+ expect(splitESignOffsetSettings(settings)).toEqual({
88
+ conditionedRules: [createRule(3), createRule(7)],
89
+ finalDays: 14,
90
+ });
91
+ });
92
+
93
+ test('clamps days of every rule', () => {
94
+ const settings = buildESignOffsetSettings([createRule(900)], -2);
95
+
96
+ expect(settings.rules.map(rule => rule.days)).toEqual([365, 0]);
97
+ });
98
+ });
99
+
100
+ describe('isESignOffsetSettings', () => {
101
+ test('accepts a lone final rule and a conditioned chain', () => {
102
+ expect(isESignOffsetSettings({ rules: [{ days: 5 }] })).toBe(true);
103
+ expect(isESignOffsetSettings({ rules: [createRule(3), { days: 5 }] })).toBe(true);
104
+ });
105
+
106
+ test.each([
107
+ ['missing value', undefined],
108
+ ['missing rules', {}],
109
+ ['empty rules', { rules: [] }],
110
+ ['condition on the last rule', { rules: [createRule(3)] }],
111
+ ['unconditioned rule before the last', { rules: [{ days: 1 }, { days: 5 }] }],
112
+ ['days out of range', { rules: [{ days: 366 }] }],
113
+ ['negative days', { rules: [{ days: -1 }] }],
114
+ [
115
+ 'too many rules',
116
+ {
117
+ rules: [
118
+ ...Array.from({ length: MAX_E_SIGN_OFFSET_RULES }, (_, i) => createRule(i)),
119
+ { days: 0 },
120
+ ],
121
+ },
122
+ ],
123
+ ])('rejects %s', (_, value) => {
124
+ expect(isESignOffsetSettings(value)).toBe(false);
125
+ });
126
+ });
127
+
128
+ describe('normalizeESignOffsetSettings', () => {
129
+ test('returns valid settings unchanged', () => {
130
+ const settings: ESignDateSignedOffsetSettings = { rules: [createRule(3), { days: 5 }] };
131
+
132
+ expect(normalizeESignOffsetSettings(settings)).toBe(settings);
133
+ });
134
+
135
+ test.each([undefined, null, 'x', {}, { rules: 'x' }])('defaults %p', value => {
136
+ expect(normalizeESignOffsetSettings(value)).toEqual({ rules: [{ days: 0 }] });
137
+ });
138
+
139
+ test('repairs malformed chains', () => {
140
+ const normalized = normalizeESignOffsetSettings({
141
+ rules: [createRule(500), { days: 2 }, createRule(20)],
142
+ });
143
+
144
+ expect(normalized).toEqual({ rules: [{ ...createRule(500), days: 365 }, { days: 20 }] });
145
+ expect(isESignOffsetSettings(normalized)).toBe(true);
146
+ });
147
+
148
+ test('drops conditioned rules beyond the maximum', () => {
149
+ const normalized = normalizeESignOffsetSettings({
150
+ rules: [
151
+ ...Array.from({ length: MAX_E_SIGN_OFFSET_RULES + 2 }, (_, i) => createRule(i)),
152
+ { days: 9 },
153
+ ],
154
+ });
155
+
156
+ expect(normalized.rules).toHaveLength(MAX_E_SIGN_OFFSET_RULES);
157
+ expect(normalized.rules[normalized.rules.length - 1]).toEqual({ days: 9 });
158
+ });
159
+ });
160
+
161
+ describe('rule list operations', () => {
162
+ test('adds rules up to the maximum, counting the final rule', () => {
163
+ let rules: ESignDateSignedOffsetRule[] = [];
164
+
165
+ for (let i = 0; i < MAX_E_SIGN_OFFSET_RULES + 2; i++) {
166
+ rules = addESignOffsetRule(rules);
167
+ }
168
+
169
+ expect(rules).toHaveLength(MAX_E_SIGN_OFFSET_RULES - 1);
170
+ expect(canAddESignOffsetRule(rules)).toBe(false);
171
+ });
172
+
173
+ test('updates and removes by index without mutating the input', () => {
174
+ const rules = [createRule(1), createRule(2)];
175
+ const updated = updateESignOffsetRule(rules, 1, createRule(9));
176
+ const removed = removeESignOffsetRule(rules, 0);
177
+
178
+ expect(updated.map(rule => rule.days)).toEqual([1, 9]);
179
+ expect(removed.map(rule => rule.days)).toEqual([2]);
180
+ expect(rules.map(rule => rule.days)).toEqual([1, 2]);
181
+ });
182
+
183
+ test('reads the single condition of a rule', () => {
184
+ expect(getESignOffsetRuleCondition(createRule(1))).toEqual(createCondition());
185
+ });
186
+ });
187
+
188
+ describe('isCompleteESignOffsetCondition', () => {
189
+ test.each([
190
+ ['complete string condition', createCondition(), 'string', true],
191
+ ['missing condition', undefined, 'string', false],
192
+ ['missing data point', createCondition({ dataPointKey: '' }), 'string', false],
193
+ ['blank value', createCondition({ value: ' ' }), 'string', false],
194
+ [
195
+ 'value-less operator',
196
+ createCondition({ operator: 'is_empty', value: '' }),
197
+ 'string',
198
+ true,
199
+ ],
200
+ ['numeric value', createCondition({ operator: 'num_gt', value: '64' }), 'number', true],
201
+ [
202
+ 'non-numeric value',
203
+ createCondition({ operator: 'num_gt', value: 'abc' }),
204
+ 'number',
205
+ false,
206
+ ],
207
+ ] as const)('%s', (_, condition, fieldType, expected) => {
208
+ expect(isCompleteESignOffsetCondition(condition, fieldType)).toBe(expected);
209
+ });
210
+ });
211
+
212
+ describe('getESignOffsetConditionText', () => {
213
+ test('formats string, number and value-less operators', () => {
214
+ expect(getESignOffsetConditionText(createCondition(), 'Job Status')).toBe(
215
+ 'Job Status is equal to Completed',
216
+ );
217
+ expect(
218
+ getESignOffsetConditionText(
219
+ createCondition({ operator: 'num_eq', value: '3' }),
220
+ 'Visits',
221
+ ),
222
+ ).toBe('Visits = 3');
223
+ expect(
224
+ getESignOffsetConditionText(createCondition({ operator: 'is_empty' }), 'Notes'),
225
+ ).toBe('Notes is empty');
226
+ });
227
+ });
228
+
229
+ describe('unlayerToolsNormalizeESignOffsets', () => {
230
+ const createESignTool = (values: Record<string, unknown>): UnlayerDesignCustomTool => ({
231
+ type: 'custom',
232
+ slug: 'e-sign',
233
+ values: { eSignRecipient: 'customer', ...values },
234
+ });
235
+
236
+ test('fills settings on offset placements saved without them and leaves the rest alone', () => {
237
+ const valid = { rules: [createRule(3), { days: 5 }] };
238
+ const legacyOffset = createESignTool({ eSignFieldType: 'dateSignedOffset' });
239
+ const configuredOffset = createESignTool({
240
+ eSignDateSignedOffset: valid,
241
+ eSignFieldType: 'dateSignedOffset',
242
+ });
243
+ const signature = createESignTool({ eSignFieldType: 'signature' });
244
+ const design = unlayerToolsBuildDesign([legacyOffset, configuredOffset, signature]);
245
+
246
+ expect(unlayerToolsNormalizeESignOffsets(design)).toBe(true);
247
+ expect(legacyOffset.values.eSignDateSignedOffset).toEqual({ rules: [{ days: 0 }] });
248
+ expect(configuredOffset.values.eSignDateSignedOffset).toBe(valid);
249
+ expect(signature.values).not.toHaveProperty('eSignDateSignedOffset');
250
+ expect(unlayerToolsNormalizeESignOffsets(design)).toBe(false);
251
+ });
252
+
253
+ test('tolerates a missing design', () => {
254
+ expect(unlayerToolsNormalizeESignOffsets(undefined as never)).toBe(false);
255
+ });
256
+ });
257
+
258
+ describe('eSignOffsetController', () => {
259
+ test('resolves with the original value when no modal is listening', () => {
260
+ const value = createESignOffsetSettings(4);
261
+ const done = jest.fn();
262
+
263
+ emitESignOffsetRequest({ done, value });
264
+
265
+ expect(done).toHaveBeenCalledWith(value);
266
+ });
267
+
268
+ test('delivers requests to the listener until it unsubscribes', () => {
269
+ const listener = jest.fn();
270
+ const unsubscribe = onESignOffsetRequest(listener);
271
+ const request = { done: jest.fn(), value: createESignOffsetSettings(4) };
272
+
273
+ emitESignOffsetRequest(request);
274
+ unsubscribe();
275
+ emitESignOffsetRequest(request);
276
+
277
+ expect(listener).toHaveBeenCalledTimes(1);
278
+ expect(listener).toHaveBeenCalledWith(request);
279
+ expect(request.done).toHaveBeenCalledTimes(1);
280
+ });
281
+ });