@hubsync/esign-web-sdk 6.5.6 → 6.5.8

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 (78) hide show
  1. package/dist/cjs/loader.cjs.js +1 -1
  2. package/dist/cjs/verdocs-adopt-signature-dialog.verdocs-delegate-dialog.verdocs-disclosure-dialog.verdocs-kba-dialog.verdocs-otp-dialog.verdocs-passcode-dialog.verdocs-signing-progress.verdocs-view.entry.cjs.js.map +1 -1
  3. package/dist/cjs/verdocs-adopt-signature-dialog_8.cjs.entry.js +1 -8
  4. package/dist/cjs/verdocs-field-attachment_11.cjs.entry.js +1 -1
  5. package/dist/cjs/verdocs-sign.cjs.entry.js +129 -31
  6. package/dist/cjs/verdocs-sign.entry.cjs.js.map +1 -1
  7. package/dist/cjs/verdocs-web-sdk.cjs.js +1 -1
  8. package/dist/collection/components/dialogs/verdocs-signing-progress/verdocs-signing-progress.js +1 -8
  9. package/dist/collection/components/dialogs/verdocs-signing-progress/verdocs-signing-progress.js.map +1 -1
  10. package/dist/collection/components/embeds/verdocs-sign/verdocs-sign.js +133 -32
  11. package/dist/collection/components/embeds/verdocs-sign/verdocs-sign.js.map +1 -1
  12. package/dist/collection/components/fields/verdocs-field-radio/verdocs-field-radio.css +4 -5
  13. package/dist/components/{p-GnE8WZrr.js → p-1MIt5Mm9.js} +4 -4
  14. package/dist/components/{p-GnE8WZrr.js.map → p-1MIt5Mm9.js.map} +1 -1
  15. package/dist/components/{p-LfDLlp5r.js → p-BvPd1sPA.js} +3 -3
  16. package/dist/components/p-BvPd1sPA.js.map +1 -0
  17. package/dist/components/{p-COiuyfp1.js → p-CY3peFvA.js} +3 -10
  18. package/dist/components/p-CY3peFvA.js.map +1 -0
  19. package/dist/components/{p-4KJMQrRB.js → p-D3-Ing_B.js} +4 -4
  20. package/dist/components/{p-4KJMQrRB.js.map → p-D3-Ing_B.js.map} +1 -1
  21. package/dist/components/{p-Bv2DuncC.js → p-Dz20noaY.js} +3 -3
  22. package/dist/components/{p-Bv2DuncC.js.map → p-Dz20noaY.js.map} +1 -1
  23. package/dist/components/verdocs-build.js +4 -4
  24. package/dist/components/verdocs-field-radio.js +1 -1
  25. package/dist/components/verdocs-preview.js +1 -1
  26. package/dist/components/verdocs-sign.js +133 -32
  27. package/dist/components/verdocs-sign.js.map +1 -1
  28. package/dist/components/verdocs-signing-progress.js +1 -1
  29. package/dist/components/verdocs-template-document-page.js +1 -1
  30. package/dist/components/verdocs-template-fields.js +1 -1
  31. package/dist/esm/loader.js +1 -1
  32. package/dist/esm/verdocs-adopt-signature-dialog.verdocs-delegate-dialog.verdocs-disclosure-dialog.verdocs-kba-dialog.verdocs-otp-dialog.verdocs-passcode-dialog.verdocs-signing-progress.verdocs-view.entry.js.map +1 -1
  33. package/dist/esm/verdocs-adopt-signature-dialog_8.entry.js +1 -8
  34. package/dist/esm/verdocs-field-attachment_11.entry.js +1 -1
  35. package/dist/esm/verdocs-sign.entry.js +129 -31
  36. package/dist/esm/verdocs-sign.entry.js.map +1 -1
  37. package/dist/esm/verdocs-web-sdk.js +1 -1
  38. package/dist/esm-es5/loader.js +1 -1
  39. package/dist/esm-es5/verdocs-adopt-signature-dialog.verdocs-delegate-dialog.verdocs-disclosure-dialog.verdocs-kba-dialog.verdocs-otp-dialog.verdocs-passcode-dialog.verdocs-signing-progress.verdocs-view.entry.js.map +1 -1
  40. package/dist/esm-es5/verdocs-adopt-signature-dialog_8.entry.js +1 -1
  41. package/dist/esm-es5/verdocs-adopt-signature-dialog_8.entry.js.map +1 -1
  42. package/dist/esm-es5/verdocs-field-attachment_11.entry.js +1 -1
  43. package/dist/esm-es5/verdocs-field-attachment_11.entry.js.map +1 -1
  44. package/dist/esm-es5/verdocs-sign.entry.js +1 -1
  45. package/dist/esm-es5/verdocs-sign.entry.js.map +1 -1
  46. package/dist/esm-es5/verdocs-web-sdk.js +1 -1
  47. package/dist/types/components/embeds/verdocs-sign/verdocs-sign.d.ts +8 -1
  48. package/dist/types/components.d.ts +2 -2
  49. package/dist/verdocs-web-sdk/p-2b277797.system.entry.js +2 -0
  50. package/dist/verdocs-web-sdk/p-2b277797.system.entry.js.map +1 -0
  51. package/dist/verdocs-web-sdk/{p-6719e636.entry.js → p-3e12a9d6.entry.js} +2 -2
  52. package/dist/verdocs-web-sdk/p-3e12a9d6.entry.js.map +1 -0
  53. package/dist/verdocs-web-sdk/{p-2db89a87.system.entry.js → p-7389986e.system.entry.js} +2 -2
  54. package/dist/verdocs-web-sdk/{p-2db89a87.system.entry.js.map → p-7389986e.system.entry.js.map} +1 -1
  55. package/dist/verdocs-web-sdk/{p-e0253fa3.entry.js → p-7a2be757.entry.js} +2 -2
  56. package/dist/verdocs-web-sdk/{p-e0253fa3.entry.js.map → p-7a2be757.entry.js.map} +1 -1
  57. package/dist/verdocs-web-sdk/{p-8a8460c0.system.entry.js → p-8777a11b.system.entry.js} +2 -2
  58. package/dist/verdocs-web-sdk/p-8777a11b.system.entry.js.map +1 -0
  59. package/dist/verdocs-web-sdk/p-B8zpaHu-.system.js +1 -1
  60. package/dist/verdocs-web-sdk/p-Bcp-PA2y.system.js.map +1 -0
  61. package/dist/verdocs-web-sdk/p-e1de2584.entry.js +2 -0
  62. package/dist/verdocs-web-sdk/p-e1de2584.entry.js.map +1 -0
  63. package/dist/verdocs-web-sdk/p-ojX3wTEW.system.js.map +1 -0
  64. package/dist/verdocs-web-sdk/{p-BjIdBebp.system.js.map → p-qKdY3jhy.system.js.map} +1 -1
  65. package/dist/verdocs-web-sdk/verdocs-adopt-signature-dialog.verdocs-delegate-dialog.verdocs-disclosure-dialog.verdocs-kba-dialog.verdocs-otp-dialog.verdocs-passcode-dialog.verdocs-signing-progress.verdocs-view.entry.esm.js.map +1 -1
  66. package/dist/verdocs-web-sdk/verdocs-sign.entry.esm.js.map +1 -1
  67. package/dist/verdocs-web-sdk/verdocs-web-sdk.esm.js +1 -1
  68. package/package.json +2 -2
  69. package/dist/components/p-COiuyfp1.js.map +0 -1
  70. package/dist/components/p-LfDLlp5r.js.map +0 -1
  71. package/dist/verdocs-web-sdk/p-6719e636.entry.js.map +0 -1
  72. package/dist/verdocs-web-sdk/p-8a8460c0.system.entry.js.map +0 -1
  73. package/dist/verdocs-web-sdk/p-CJ9IvZJ5.system.js.map +0 -1
  74. package/dist/verdocs-web-sdk/p-D85w8lT9.system.js.map +0 -1
  75. package/dist/verdocs-web-sdk/p-a29fa382.system.entry.js +0 -2
  76. package/dist/verdocs-web-sdk/p-a29fa382.system.entry.js.map +0 -1
  77. package/dist/verdocs-web-sdk/p-cf08e7c2.entry.js +0 -2
  78. package/dist/verdocs-web-sdk/p-cf08e7c2.entry.js.map +0 -1
@@ -4467,20 +4467,13 @@ const VerdocsSigningProgress = class {
4467
4467
  if (this.mode === 'start') {
4468
4468
  return h("div", { class: "field-label" }, this.fieldLabel);
4469
4469
  }
4470
- const allRequiredFieldsCompleted = this.progress && this.progress.required.filled >= this.progress.required.total;
4471
- if (this.fieldCompleted && allRequiredFieldsCompleted) {
4472
- return (h("div", { class: "field-completed" }, h("div", { class: "icon" }, this.renderSuccessIcon()), h("span", { class: "text" }, "Ready to submit.")));
4473
- }
4474
4470
  return h("div", { class: "field-label" }, this.fieldLabel);
4475
4471
  }
4476
4472
  renderFooter() {
4477
4473
  if (this.mode === 'start') {
4478
4474
  return (h("button", { class: "btn start", onClick: () => this.started.emit() }, "Start Signing"));
4479
4475
  }
4480
- return (h("div", { class: "nav-buttons" }, this.progress && this.progress.required.filled >= this.progress.required.total ? (h("button", { class: "btn submit", onClick: () => this.exit.emit() }, "Submit")) : ([
4481
- h("button", { class: "btn previous", disabled: this.current <= 1, onClick: () => this.previous.emit() }, "Previous"),
4482
- h("button", { class: "btn next", disabled: this.current >= this.total, onClick: () => this.next.emit() }, "Next"),
4483
- ])));
4476
+ return (h("div", { class: "nav-buttons" }, h("button", { class: "btn previous", disabled: this.current <= 1, onClick: () => this.previous.emit() }, "Previous"), h("button", { class: "btn next", disabled: this.current >= this.total, onClick: () => this.next.emit() }, "Next")));
4484
4477
  }
4485
4478
  renderCompleted() {
4486
4479
  return (h("div", { class: "card completed" }, h("div", { class: "header-completed" }, h("div", { class: "icon" }, this.renderSuccessIcon()), "Ready to Submit"), h("div", { class: "description" }, "You have entered all requested signatures. Select Submit to complete the signing process."), h("div", { class: "separator" }), h("button", { class: "btn submit", onClick: () => this.exit.emit() }, "Submit")));
@@ -677,7 +677,7 @@ const VerdocsFieldInitial = class {
677
677
  };
678
678
  VerdocsFieldInitial.style = verdocsFieldInitialCss;
679
679
 
680
- const verdocsFieldRadioCss = "@-webkit-keyframes verdocs-field-pulse{0%{background-color:rgba(0, 0, 0, 0.35)}50%{background-color:rgba(0, 0, 0, 0)}100%{background-color:rgba(0, 0, 0, 0.35)}}@keyframes verdocs-field-pulse{0%{background-color:rgba(0, 0, 0, 0.35)}50%{background-color:rgba(0, 0, 0, 0)}100%{background-color:rgba(0, 0, 0, 0.35)}}verdocs-field-radio{font-family:var(--verdocs-primary-font, \"Inter\", \"Barlow\", sans-serif);width:14px;height:14px;display:block;font-size:11px;position:relative;scroll-margin:20px 0;background-color:transparent;-webkit-transform-origin:bottom left;transform-origin:bottom left;border-radius:100%}verdocs-field-radio.focused{-webkit-animation:verdocs-field-pulse 0.4s 1;animation:verdocs-field-pulse 0.4s 1}verdocs-field-radio svg{margin-top:4px}verdocs-field-radio.disabled.done{opacity:1}verdocs-field-radio div.label{top:-14px;left:-1px;height:14px;color:white;padding:0 4px;font-size:9px;line-height:13px;position:absolute;background:#4a4a99;border-top-left-radius:2px;border-top-right-radius:2px}verdocs-field-radio div.group{top:14px;left:-1px;height:14px;color:white;padding:0 4px;font-size:9px;line-height:13px;position:absolute;background:#bb0589;border-bottom-left-radius:2px;border-bottom-right-radius:2px}verdocs-field-radio input{cursor:inherit}verdocs-field-radio.disabled input{opacity:0.5}verdocs-field-radio.done input[type=radio]{margin:0;padding:0;width:10px;height:10px}verdocs-field-radio:not(.done) input[type=radio]{position:absolute;opacity:0}verdocs-field-radio:not(.done) input[type=radio]+label:before{content:\"\";border-radius:100%;border:1px solid rgba(0, 0, 0, 0.6);display:inline-block;width:12px;height:12px;position:absolute;left:1px;top:1px;cursor:pointer;text-align:center;-webkit-transition:all 250ms ease;transition:all 250ms ease}verdocs-field-radio:not(.done) input[type=radio]:checked+label:before{background-color:#55bc81;-webkit-box-shadow:inset 0 0 0 2px #f5f5fa;box-shadow:inset 0 0 0 2px #f5f5fa}verdocs-field-radio:not(.done) input[type=radio]:focus+label:before{outline:none;border-color:#55bc81}verdocs-field-radio:not(.done) input[type=radio]:disabled+label:before{-webkit-box-shadow:inset 0 0 0 4px #f5f5fa;box-shadow:inset 0 0 0 4px #f5f5fa;border-color:#f3f3fc;background:#f3f3fc}verdocs-field-radio:not(.done) input[type=radio]+label:empty:before{margin-right:0}verdocs-field-radio.required{border:1px solid var(--verdocs-required-field-border)}verdocs-field-radio.hide{display:none}verdocs-field-radio.focused{-webkit-animation:verdocs-field-pulse 0.4s 1;animation:verdocs-field-pulse 0.4s 1}verdocs-field-radio verdocs-button-panel{margin-left:-20px;margin-top:-7px;-webkit-transform:scale(0.7);transform:scale(0.7)}verdocs-field-radio .settings-icon{position:absolute;top:-6px;left:-20px;display:inline-block;cursor:pointer;opacity:0.3}verdocs-field-radio .settings-icon svg{fill:#707ae5}verdocs-field-radio .settings-icon:hover{opacity:1}@keyframes verdocs-field-pulse{0%{background-color:rgba(0, 0, 0, 0.35)}50%{background-color:rgba(0, 0, 0, 0)}100%{background-color:rgba(0, 0, 0, 0.35)}}";
680
+ const verdocsFieldRadioCss = "@-webkit-keyframes verdocs-field-pulse{0%{background-color:rgba(0, 0, 0, 0.35)}50%{background-color:rgba(0, 0, 0, 0)}100%{background-color:rgba(0, 0, 0, 0.35)}}@keyframes verdocs-field-pulse{0%{background-color:rgba(0, 0, 0, 0.35)}50%{background-color:rgba(0, 0, 0, 0)}100%{background-color:rgba(0, 0, 0, 0.35)}}verdocs-field-radio{font-family:var(--verdocs-primary-font, \"Inter\", \"Barlow\", sans-serif);width:14px;height:14px;display:block;font-size:11px;position:relative;scroll-margin:20px 0;background-color:transparent;-webkit-transform-origin:bottom left;transform-origin:bottom left}verdocs-field-radio.focused{-webkit-animation:verdocs-field-pulse 0.4s 1;animation:verdocs-field-pulse 0.4s 1}verdocs-field-radio svg{margin-top:4px}verdocs-field-radio.disabled.done{opacity:1}verdocs-field-radio div.label{top:0;left:16px;height:14px;color:white;padding:0 4px;font-size:9px;line-height:13px;position:absolute;background:#4a4a99;border-radius:2px;white-space:nowrap}verdocs-field-radio div.group{top:14px;left:-1px;height:14px;color:white;padding:0 4px;font-size:9px;line-height:13px;position:absolute;background:#bb0589;border-bottom-left-radius:2px;border-bottom-right-radius:2px}verdocs-field-radio input{cursor:inherit}verdocs-field-radio.disabled input{opacity:0.5}verdocs-field-radio.done input[type=radio]{margin:0;padding:0;width:10px;height:10px}verdocs-field-radio:not(.done) input[type=radio]{position:absolute;opacity:0}verdocs-field-radio:not(.done) input[type=radio]+label:before{content:\"\";border-radius:100%;border:1px solid rgba(0, 0, 0, 0.6);display:inline-block;width:12px;height:12px;position:absolute;left:1px;top:1px;cursor:pointer;text-align:center;-webkit-transition:all 250ms ease;transition:all 250ms ease}verdocs-field-radio:not(.done) input[type=radio]:checked+label:before{background-color:#55bc81;-webkit-box-shadow:inset 0 0 0 2px #f5f5fa;box-shadow:inset 0 0 0 2px #f5f5fa}verdocs-field-radio:not(.done) input[type=radio]:focus+label:before{outline:none;border-color:#55bc81}verdocs-field-radio:not(.done) input[type=radio]:disabled+label:before{-webkit-box-shadow:inset 0 0 0 4px #f5f5fa;box-shadow:inset 0 0 0 4px #f5f5fa;border-color:#f3f3fc;background:#f3f3fc}verdocs-field-radio:not(.done) input[type=radio]+label:empty:before{margin-right:0}verdocs-field-radio.required{border:1px solid var(--verdocs-required-field-border)}verdocs-field-radio.hide{display:none}verdocs-field-radio.focused{-webkit-animation:verdocs-field-pulse 0.4s 1;animation:verdocs-field-pulse 0.4s 1}verdocs-field-radio verdocs-button-panel{margin-left:-20px;margin-top:-7px;-webkit-transform:scale(0.7);transform:scale(0.7)}verdocs-field-radio .settings-icon{position:absolute;top:-6px;left:-20px;display:inline-block;cursor:pointer;opacity:0.3}verdocs-field-radio .settings-icon svg{fill:#707ae5}verdocs-field-radio .settings-icon:hover{opacity:1}@keyframes verdocs-field-pulse{0%{background-color:rgba(0, 0, 0, 0.35)}50%{background-color:rgba(0, 0, 0, 0)}100%{background-color:rgba(0, 0, 0, 0.35)}}";
681
681
 
682
682
  const RadioIconUnselected = `<svg focusable="false" aria-hidden="true" viewBox="0 0 24 24"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"></path></svg>`;
683
683
  const RadioIconSelected = `<svg focusable="false" aria-hidden="true" viewBox="0 0 24 24"><path d="M12 7c-2.76 0-5 2.24-5 5s2.24 5 5 5 5-2.24 5-5-2.24-5-5-5zm0-5C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"></path></svg>`;
@@ -46,7 +46,7 @@ const VerdocsSign = class {
46
46
  /**
47
47
  * The endpoint to use to communicate with Verdocs. If not set, the default endpoint will be used.
48
48
  */
49
- this.endpoint = new VerdocsEndpoint({ sessionType: 'signing' });
49
+ this.endpoint = new VerdocsEndpoint({ sessionType: 'signing', baseURL: 'https://esign-dev.hubsync.com/api' });
50
50
  /**
51
51
  * The ID of the envelope to sign.
52
52
  */
@@ -105,6 +105,9 @@ const VerdocsSign = class {
105
105
  this.delegated = false;
106
106
  this.kbaChoices = [];
107
107
  this.showDownloadDialog = false;
108
+ this.signingStarted = false;
109
+ this.skippedOptionalFields = [];
110
+ this.visitedFieldNames = [];
108
111
  this.loading = true;
109
112
  this.envelope = null;
110
113
  this.zoomLevel = 'normal';
@@ -217,6 +220,9 @@ const VerdocsSign = class {
217
220
  this.agreed = recipient.agreed;
218
221
  this.signatureId = ((_e = (_d = response.signatures) === null || _d === void 0 ? void 0 : _d[0]) === null || _e === void 0 ? void 0 : _e.id) || null;
219
222
  this.initialId = ((_g = (_f = response.initials) === null || _f === void 0 ? void 0 : _f[0]) === null || _g === void 0 ? void 0 : _g.id) || null;
223
+ this.signingStarted = false;
224
+ this.skippedOptionalFields = [];
225
+ this.visitedFieldNames = [];
220
226
  this.submitted = recipient.status === 'submitted';
221
227
  this.loading = false;
222
228
  this.isDone = this.submitted;
@@ -324,6 +330,9 @@ const VerdocsSign = class {
324
330
  }
325
331
  updateRecipientFieldValue(fieldName, updateResult) {
326
332
  console.log('[SIGN] updateRecipientFieldValue', fieldName, updateResult);
333
+ if (this.skippedOptionalFields.includes(fieldName)) {
334
+ this.skippedOptionalFields = this.skippedOptionalFields.filter(name => name !== fieldName);
335
+ }
327
336
  this.getRecipientFields().forEach(oldField => {
328
337
  if (oldField.name === fieldName) {
329
338
  oldField.value = updateResult.value;
@@ -361,6 +370,8 @@ const VerdocsSign = class {
361
370
  });
362
371
  }
363
372
  async handleFieldChange(field, e) {
373
+ this.signingStarted = true;
374
+ this.markFieldVisited(field.name);
364
375
  const { value, checked } = e.target;
365
376
  switch (field.type) {
366
377
  // TODO: Remove legacy type when no longer needed
@@ -482,8 +493,46 @@ const VerdocsSign = class {
482
493
  sortFields(recipientFields);
483
494
  return recipientFields;
484
495
  }
496
+ markFieldVisited(fieldName) {
497
+ if (!fieldName || this.visitedFieldNames.includes(fieldName)) {
498
+ return;
499
+ }
500
+ this.visitedFieldNames = [...this.visitedFieldNames, fieldName];
501
+ }
502
+ focusField(field, scrollInline = 'center') {
503
+ var _a;
504
+ if (!field)
505
+ return;
506
+ const id = getFieldId(field);
507
+ const el = document.getElementById(id);
508
+ el === null || el === void 0 ? void 0 : el.scrollIntoView({ behavior: 'smooth', block: 'center', inline: scrollInline });
509
+ (_a = el === null || el === void 0 ? void 0 : el.focusField) === null || _a === void 0 ? void 0 : _a.call(el);
510
+ this.focusedField = field.name;
511
+ this.markFieldVisited(field.name);
512
+ this.checkRecipientFields();
513
+ }
514
+ handleSkipField(fieldToSkip) {
515
+ if (fieldToSkip.required) {
516
+ return;
517
+ }
518
+ this.signingStarted = true;
519
+ this.markFieldVisited(fieldToSkip.name);
520
+ if (!this.skippedOptionalFields.includes(fieldToSkip.name)) {
521
+ this.skippedOptionalFields = [...this.skippedOptionalFields, fieldToSkip.name];
522
+ }
523
+ const fields = this.getSortedFillableFields();
524
+ const currentIndex = fields.findIndex(field => field.name === fieldToSkip.name);
525
+ const nextField = currentIndex >= 0 && currentIndex < fields.length - 1 ? fields[currentIndex + 1] : null;
526
+ if (nextField) {
527
+ this.focusField(nextField);
528
+ return;
529
+ }
530
+ // If this was the last field, still re-evaluate completion/submit state.
531
+ this.checkRecipientFields([fieldToSkip.name]);
532
+ }
485
533
  handleNext() {
486
534
  var _a;
535
+ this.signingStarted = true;
487
536
  if (this.nextSubmits) {
488
537
  try {
489
538
  // Patches the date picker to be forcibly removed if still showing during submission
@@ -501,23 +550,34 @@ const VerdocsSign = class {
501
550
  }
502
551
  return;
503
552
  }
504
- const nextField = this.getNextFieldInOrder();
505
- if (nextField) {
506
- const id = getFieldId(nextField);
507
- const el = document.getElementById(id);
508
- el === null || el === void 0 ? void 0 : el.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' });
509
- el === null || el === void 0 ? void 0 : el.focusField();
510
- this.focusedField = nextField.name;
553
+ const fields = this.getSortedFillableFields();
554
+ if (fields.length < 1) {
555
+ return;
511
556
  }
557
+ if (!this.focusedField) {
558
+ this.focusField(fields[0]);
559
+ return;
560
+ }
561
+ const nextField = this.getNextFieldFromList(fields);
562
+ this.focusField(nextField);
512
563
  }
513
564
  getRecipientFields() {
514
565
  var _a;
515
566
  return ((_a = this.envelope) === null || _a === void 0 ? void 0 : _a.fields.filter(field => field.role_name === this.recipient.role_name)) || [];
516
567
  }
517
568
  // See if everything that "needs to be" filled in is, and all "fillable fields" are valid
518
- checkRecipientFields() {
519
- const invalidFields = this.getRecipientFields().filter(field => !isFieldValid(field, this.getRecipientFields()));
520
- if (invalidFields.length < 1) {
569
+ checkRecipientFields(extraVisitedFieldNames = []) {
570
+ const recipientFields = this.getRecipientFields();
571
+ const fillableFields = this.getSortedFillableFields();
572
+ const requiredFields = fillableFields.filter(field => !!field.required);
573
+ const allRequiredFieldsSubmitted = requiredFields.every(field => this.isFieldValidForRecipient(field, recipientFields));
574
+ const visitedFieldNames = new Set([...this.visitedFieldNames, ...extraVisitedFieldNames]);
575
+ // A field is considered "handled" if it's visited OR if it's an optional field that was skipped OR if it's already filled
576
+ const allFieldsHandled = fillableFields.every(field => visitedFieldNames.has(field.name) ||
577
+ this.skippedOptionalFields.includes(field.name) ||
578
+ this.isFieldFilledForNav(field, recipientFields));
579
+ const canSubmit = allRequiredFieldsSubmitted && allFieldsHandled;
580
+ if (canSubmit) {
521
581
  this.nextButtonLabel = 'Finish';
522
582
  if (!this.nextSubmits) {
523
583
  this.nextSubmits = true;
@@ -529,6 +589,12 @@ const VerdocsSign = class {
529
589
  }
530
590
  this.updateAllFlags();
531
591
  }
592
+ isFieldValidForRecipient(field, recipientFields) {
593
+ if (field.type === 'signature' || field.type === 'initial') {
594
+ return !field.required || this.isFieldFilledForNav(field, recipientFields);
595
+ }
596
+ return isFieldValid(field, recipientFields);
597
+ }
532
598
  getNextFieldInOrder() {
533
599
  // Find the next incomplete field in overall order (required + optional).
534
600
  const fields = this.getSortedFillableFields();
@@ -547,13 +613,38 @@ const VerdocsSign = class {
547
613
  return null;
548
614
  }
549
615
  isFieldFilledForNav(field, recipientFields) {
616
+ if (!field.required && this.skippedOptionalFields.includes(field.name)) {
617
+ return true;
618
+ }
550
619
  if (field.type === 'signature' || field.type === 'initial') {
620
+ const settings = (field.settings || {});
621
+ const idKey = field.type === 'signature' ? 'signature_id' : 'initial_id';
622
+ const hasSignatureId = Object.prototype.hasOwnProperty.call(settings, 'signature_id');
623
+ const hasInitialId = Object.prototype.hasOwnProperty.call(settings, 'initial_id');
624
+ // For signature/initial fields, settings.* id is the authoritative state.
625
+ // This avoids stale top-level field.value (e.g. "signed") after clearing.
626
+ if (Object.prototype.hasOwnProperty.call(settings, idKey) || hasSignatureId || hasInitialId) {
627
+ const idValue = Object.prototype.hasOwnProperty.call(settings, idKey)
628
+ ? settings[idKey]
629
+ : hasSignatureId
630
+ ? settings.signature_id
631
+ : settings.initial_id;
632
+ return typeof idValue === 'string' ? idValue.trim().length > 0 : !!idValue;
633
+ }
634
+ if (Object.prototype.hasOwnProperty.call(settings, 'value')) {
635
+ const settingsValue = typeof settings.value === 'string' ? settings.value.trim() : settings.value;
636
+ return !!settingsValue;
637
+ }
638
+ if (Object.prototype.hasOwnProperty.call(settings, 'result')) {
639
+ const settingsResult = typeof settings.result === 'string' ? settings.result.trim() : settings.result;
640
+ return !!settingsResult;
641
+ }
642
+ if (Object.prototype.hasOwnProperty.call(settings, 'base64')) {
643
+ const settingsBase64 = typeof settings.base64 === 'string' ? settings.base64.trim() : settings.base64;
644
+ return !!settingsBase64;
645
+ }
551
646
  const value = typeof field.value === 'string' ? field.value.trim() : field.value;
552
- if (!value)
553
- return false;
554
- if (value === 'signed' || value === 'initialed')
555
- return false;
556
- return true;
647
+ return !!value;
557
648
  }
558
649
  if (field.type === 'dropdown') {
559
650
  return isFieldFilled(field, recipientFields) && !!field.value;
@@ -570,16 +661,11 @@ const VerdocsSign = class {
570
661
  return fields[nextFocusedIndex];
571
662
  }
572
663
  handlePrev() {
573
- var _a;
664
+ this.signingStarted = true;
574
665
  const allFields = this.getSortedFillableFields();
575
666
  const focusedIndex = allFields.findIndex(f => f.name === this.focusedField);
576
667
  if (focusedIndex > 0) {
577
- const prevField = allFields[focusedIndex - 1];
578
- const id = getFieldId(prevField);
579
- const el = document.getElementById(id);
580
- el === null || el === void 0 ? void 0 : el.scrollIntoView({ behavior: 'smooth', block: 'center' });
581
- (_a = el === null || el === void 0 ? void 0 : el.focusField) === null || _a === void 0 ? void 0 : _a.call(el);
582
- this.focusedField = prevField.name;
668
+ this.focusField(allFields[focusedIndex - 1]);
583
669
  }
584
670
  }
585
671
  updateAllFlags() {
@@ -616,8 +702,12 @@ const VerdocsSign = class {
616
702
  variant,
617
703
  label,
618
704
  showSkip,
705
+ onClick: () => {
706
+ this.signingStarted = true;
707
+ this.focusField(nextField);
708
+ },
619
709
  onSkip: () => {
620
- this.handleNext();
710
+ this.handleSkipField(nextField);
621
711
  },
622
712
  });
623
713
  }
@@ -690,8 +780,15 @@ const VerdocsSign = class {
690
780
  el.addEventListener('fieldChange', e => {
691
781
  this.handleFieldChange(field, e).finally(() => this.checkRecipientFields());
692
782
  });
783
+ el.addEventListener('click', () => {
784
+ this.focusedField = field.name;
785
+ this.markFieldVisited(field.name);
786
+ this.checkRecipientFields();
787
+ });
693
788
  el.addEventListener('adopt', () => {
694
789
  this.focusedField = field.name;
790
+ this.markFieldVisited(field.name);
791
+ this.checkRecipientFields();
695
792
  this.adoptingSignature = true;
696
793
  });
697
794
  el.setAttribute('templateid', this.envelope.template_id);
@@ -881,7 +978,8 @@ const VerdocsSign = class {
881
978
  inProgressMenuOptions.unshift({ id: 'delegate', label: 'Delegate' });
882
979
  }
883
980
  console.log('this.getRecipientFields()', this.getRecipientFields());
884
- const invalidFields = this.getRecipientFields().filter(field => !isFieldValid(field, this.getRecipientFields()));
981
+ const recipientFields = this.getRecipientFields();
982
+ const invalidFields = recipientFields.filter(field => !this.isFieldValidForRecipient(field, recipientFields));
885
983
  invalidFields.length > 0
886
984
  ? console.log('[SIGN] Invalid fields remaining', invalidFields.map(field => field.name))
887
985
  : console.log('[SIGN] All field valid');
@@ -894,7 +992,7 @@ const VerdocsSign = class {
894
992
  // Calculate detailed progress
895
993
  const allFields = this.getSortedFillableFields();
896
994
  const recipientFields = this.getRecipientFields();
897
- const isFilled = (f) => isFieldFilled(f, recipientFields) && (f.type !== 'dropdown' || !!f.value);
995
+ const isFilled = (f) => this.isFieldFilledForNav(f, recipientFields);
898
996
  const requiredFields = allFields.filter(f => f.required);
899
997
  const requiredRemaining = requiredFields.filter(f => !isFilled(f)).length;
900
998
  const requiredFilled = requiredFields.length - requiredRemaining;
@@ -926,18 +1024,18 @@ const VerdocsSign = class {
926
1024
  filledFields: recipientFields.filter(f => isFilled(f)).map(f => ({ name: f.name, type: f.type, val: f.value })),
927
1025
  });
928
1026
  let mode = 'start';
929
- // We only consider the user to have started "signing" if they have filled out at least one *fillable* field.
930
- // Readonly fields do not count.
931
- const anyFieldFilled = requiredRemaining < requiredFields.length || optionalRemaining < optionalFields.length;
932
1027
  if (this.nextSubmits) {
933
1028
  mode = 'completed';
934
1029
  }
935
- else if (anyFieldFilled) {
1030
+ else if (this.signingStarted) {
936
1031
  mode = 'signing';
937
1032
  }
938
1033
  return (h("verdocs-signing-progress", { mode: mode, current: Math.max(1, currentIndex), total: totalFields, remainingFields: remainingFields, progress: progress, fieldLabel: getFieldLabel(focusedFieldObj), fieldCompleted: focusedFieldObj ? !!isFilled(focusedFieldObj) : false, onStarted: () => {
1034
+ this.signingStarted = true;
939
1035
  this.adoptingSignature = true;
940
- this.handleNext();
1036
+ const fields = this.getSortedFillableFields();
1037
+ const startField = fields.find(f => f.name === this.focusedField) || fields[0];
1038
+ this.focusField(startField || null);
941
1039
  }, onNext: () => this.handleNext(), onPrevious: () => this.handlePrev(), onExit: () => this.handleNext() }));
942
1040
  })(), h("div", { class: `document signed-document-container zoom-${this.zoomLevel}` }, (this.envelope.documents || []).map(envelopeDocument => {
943
1041
  const pageNumbers = integerSequence(1, envelopeDocument.pages);