@mj-biz-apps/forms-ng 0.0.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/builder/builder-models.d.ts +27 -0
- package/dist/lib/builder/builder-models.d.ts.map +1 -0
- package/dist/lib/builder/builder-models.js +15 -0
- package/dist/lib/builder/builder-models.js.map +1 -0
- package/dist/lib/builder/builder-state.service.d.ts +48 -0
- package/dist/lib/builder/builder-state.service.d.ts.map +1 -0
- package/dist/lib/builder/builder-state.service.js +231 -0
- package/dist/lib/builder/builder-state.service.js.map +1 -0
- package/dist/lib/builder/builder-styles.d.ts +12 -0
- package/dist/lib/builder/builder-styles.d.ts.map +1 -0
- package/dist/lib/builder/builder-styles.js +74 -0
- package/dist/lib/builder/builder-styles.js.map +1 -0
- package/dist/lib/builder/conditional-rule-editor.component.d.ts +53 -0
- package/dist/lib/builder/conditional-rule-editor.component.d.ts.map +1 -0
- package/dist/lib/builder/conditional-rule-editor.component.js +282 -0
- package/dist/lib/builder/conditional-rule-editor.component.js.map +1 -0
- package/dist/lib/builder/design-panel.component.d.ts +71 -0
- package/dist/lib/builder/design-panel.component.d.ts.map +1 -0
- package/dist/lib/builder/design-panel.component.js +530 -0
- package/dist/lib/builder/design-panel.component.js.map +1 -0
- package/dist/lib/builder/design-panel.styles.d.ts +10 -0
- package/dist/lib/builder/design-panel.styles.d.ts.map +1 -0
- package/dist/lib/builder/design-panel.styles.js +78 -0
- package/dist/lib/builder/design-panel.styles.js.map +1 -0
- package/dist/lib/builder/design-state.service.d.ts +51 -0
- package/dist/lib/builder/design-state.service.d.ts.map +1 -0
- package/dist/lib/builder/design-state.service.js +108 -0
- package/dist/lib/builder/design-state.service.js.map +1 -0
- package/dist/lib/builder/distribution-links.d.ts +29 -0
- package/dist/lib/builder/distribution-links.d.ts.map +1 -0
- package/dist/lib/builder/distribution-links.js +53 -0
- package/dist/lib/builder/distribution-links.js.map +1 -0
- package/dist/lib/builder/distribution-manager.component.d.ts +53 -0
- package/dist/lib/builder/distribution-manager.component.d.ts.map +1 -0
- package/dist/lib/builder/distribution-manager.component.js +330 -0
- package/dist/lib/builder/distribution-manager.component.js.map +1 -0
- package/dist/lib/builder/distribution.service.d.ts +62 -0
- package/dist/lib/builder/distribution.service.d.ts.map +1 -0
- package/dist/lib/builder/distribution.service.js +140 -0
- package/dist/lib/builder/distribution.service.js.map +1 -0
- package/dist/lib/builder/entity-names.d.ts +20 -0
- package/dist/lib/builder/entity-names.d.ts.map +1 -0
- package/dist/lib/builder/entity-names.js +20 -0
- package/dist/lib/builder/entity-names.js.map +1 -0
- package/dist/lib/builder/form-builder.component.d.ts +92 -0
- package/dist/lib/builder/form-builder.component.d.ts.map +1 -0
- package/dist/lib/builder/form-builder.component.js +627 -0
- package/dist/lib/builder/form-builder.component.js.map +1 -0
- package/dist/lib/builder/form-builder.styles.d.ts +3 -0
- package/dist/lib/builder/form-builder.styles.d.ts.map +1 -0
- package/dist/lib/builder/form-builder.styles.js +94 -0
- package/dist/lib/builder/form-builder.styles.js.map +1 -0
- package/dist/lib/builder/form-preview-modal.component.d.ts +25 -0
- package/dist/lib/builder/form-preview-modal.component.d.ts.map +1 -0
- package/dist/lib/builder/form-preview-modal.component.js +90 -0
- package/dist/lib/builder/form-preview-modal.component.js.map +1 -0
- package/dist/lib/builder/index.d.ts +31 -0
- package/dist/lib/builder/index.d.ts.map +1 -0
- package/dist/lib/builder/index.js +32 -0
- package/dist/lib/builder/index.js.map +1 -0
- package/dist/lib/builder/json-fields.d.ts +14 -0
- package/dist/lib/builder/json-fields.d.ts.map +1 -0
- package/dist/lib/builder/json-fields.js +100 -0
- package/dist/lib/builder/json-fields.js.map +1 -0
- package/dist/lib/builder/publish.service.d.ts +34 -0
- package/dist/lib/builder/publish.service.d.ts.map +1 -0
- package/dist/lib/builder/publish.service.js +110 -0
- package/dist/lib/builder/publish.service.js.map +1 -0
- package/dist/lib/builder/qr-code.d.ts +26 -0
- package/dist/lib/builder/qr-code.d.ts.map +1 -0
- package/dist/lib/builder/qr-code.js +361 -0
- package/dist/lib/builder/qr-code.js.map +1 -0
- package/dist/lib/builder/question-editor.component.d.ts +41 -0
- package/dist/lib/builder/question-editor.component.d.ts.map +1 -0
- package/dist/lib/builder/question-editor.component.js +228 -0
- package/dist/lib/builder/question-editor.component.js.map +1 -0
- package/dist/lib/builder/question-type-catalog.d.ts +29 -0
- package/dist/lib/builder/question-type-catalog.d.ts.map +1 -0
- package/dist/lib/builder/question-type-catalog.js +43 -0
- package/dist/lib/builder/question-type-catalog.js.map +1 -0
- package/dist/lib/builder/reorder.d.ts +10 -0
- package/dist/lib/builder/reorder.d.ts.map +1 -0
- package/dist/lib/builder/reorder.js +18 -0
- package/dist/lib/builder/reorder.js.map +1 -0
- package/dist/lib/builder/snapshot-builder.d.ts +16 -0
- package/dist/lib/builder/snapshot-builder.d.ts.map +1 -0
- package/dist/lib/builder/snapshot-builder.js +93 -0
- package/dist/lib/builder/snapshot-builder.js.map +1 -0
- package/dist/lib/builder/style-tokens.d.ts +54 -0
- package/dist/lib/builder/style-tokens.d.ts.map +1 -0
- package/dist/lib/builder/style-tokens.js +71 -0
- package/dist/lib/builder/style-tokens.js.map +1 -0
- package/dist/lib/builder/validation-rule-editor.component.d.ts +27 -0
- package/dist/lib/builder/validation-rule-editor.component.d.ts.map +1 -0
- package/dist/lib/builder/validation-rule-editor.component.js +179 -0
- package/dist/lib/builder/validation-rule-editor.component.js.map +1 -0
- package/dist/lib/dashboard/components/distribution-chart.component.d.ts +14 -0
- package/dist/lib/dashboard/components/distribution-chart.component.d.ts.map +1 -0
- package/dist/lib/dashboard/components/distribution-chart.component.js +85 -0
- package/dist/lib/dashboard/components/distribution-chart.component.js.map +1 -0
- package/dist/lib/dashboard/components/funnel-chart.component.d.ts +14 -0
- package/dist/lib/dashboard/components/funnel-chart.component.d.ts.map +1 -0
- package/dist/lib/dashboard/components/funnel-chart.component.js +101 -0
- package/dist/lib/dashboard/components/funnel-chart.component.js.map +1 -0
- package/dist/lib/dashboard/components/question-breakdown.component.d.ts +16 -0
- package/dist/lib/dashboard/components/question-breakdown.component.d.ts.map +1 -0
- package/dist/lib/dashboard/components/question-breakdown.component.js +213 -0
- package/dist/lib/dashboard/components/question-breakdown.component.js.map +1 -0
- package/dist/lib/dashboard/components/response-detail.component.d.ts +11 -0
- package/dist/lib/dashboard/components/response-detail.component.d.ts.map +1 -0
- package/dist/lib/dashboard/components/response-detail.component.js +113 -0
- package/dist/lib/dashboard/components/response-detail.component.js.map +1 -0
- package/dist/lib/dashboard/components/response-list.component.d.ts +27 -0
- package/dist/lib/dashboard/components/response-list.component.d.ts.map +1 -0
- package/dist/lib/dashboard/components/response-list.component.js +196 -0
- package/dist/lib/dashboard/components/response-list.component.js.map +1 -0
- package/dist/lib/dashboard/components/summary-stats.component.d.ts +12 -0
- package/dist/lib/dashboard/components/summary-stats.component.d.ts.map +1 -0
- package/dist/lib/dashboard/components/summary-stats.component.js +112 -0
- package/dist/lib/dashboard/components/summary-stats.component.js.map +1 -0
- package/dist/lib/dashboard/forms-reporting-dashboard.component.d.ts +64 -0
- package/dist/lib/dashboard/forms-reporting-dashboard.component.d.ts.map +1 -0
- package/dist/lib/dashboard/forms-reporting-dashboard.component.js +397 -0
- package/dist/lib/dashboard/forms-reporting-dashboard.component.js.map +1 -0
- package/dist/lib/dashboard/index.d.ts +19 -0
- package/dist/lib/dashboard/index.d.ts.map +1 -0
- package/dist/lib/dashboard/index.js +19 -0
- package/dist/lib/dashboard/index.js.map +1 -0
- package/dist/lib/dashboard/models/reporting.model.d.ts +125 -0
- package/dist/lib/dashboard/models/reporting.model.d.ts.map +1 -0
- package/dist/lib/dashboard/models/reporting.model.js +2 -0
- package/dist/lib/dashboard/models/reporting.model.js.map +1 -0
- package/dist/lib/dashboard/services/forms-reporting-export.service.d.ts +21 -0
- package/dist/lib/dashboard/services/forms-reporting-export.service.d.ts.map +1 -0
- package/dist/lib/dashboard/services/forms-reporting-export.service.js +83 -0
- package/dist/lib/dashboard/services/forms-reporting-export.service.js.map +1 -0
- package/dist/lib/dashboard/services/forms-reporting-mock.d.ts +18 -0
- package/dist/lib/dashboard/services/forms-reporting-mock.d.ts.map +1 -0
- package/dist/lib/dashboard/services/forms-reporting-mock.js +147 -0
- package/dist/lib/dashboard/services/forms-reporting-mock.js.map +1 -0
- package/dist/lib/dashboard/services/forms-reporting.service.d.ts +45 -0
- package/dist/lib/dashboard/services/forms-reporting.service.d.ts.map +1 -0
- package/dist/lib/dashboard/services/forms-reporting.service.js +230 -0
- package/dist/lib/dashboard/services/forms-reporting.service.js.map +1 -0
- package/dist/lib/dashboard/services/reporting-aggregations.d.ts +40 -0
- package/dist/lib/dashboard/services/reporting-aggregations.d.ts.map +1 -0
- package/dist/lib/dashboard/services/reporting-aggregations.js +379 -0
- package/dist/lib/dashboard/services/reporting-aggregations.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonAddress/mjbizappscommonaddress.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonAddress/mjbizappscommonaddress.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonAddress/mjbizappscommonaddress.form.component.js +104 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonAddress/mjbizappscommonaddress.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonAddressLink/mjbizappscommonaddresslink.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonAddressLink/mjbizappscommonaddresslink.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonAddressLink/mjbizappscommonaddresslink.form.component.js +83 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonAddressLink/mjbizappscommonaddresslink.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonAddressType/mjbizappscommonaddresstype.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonAddressType/mjbizappscommonaddresstype.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonAddressType/mjbizappscommonaddresstype.form.component.js +96 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonAddressType/mjbizappscommonaddresstype.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonContactMethod/mjbizappscommoncontactmethod.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonContactMethod/mjbizappscommoncontactmethod.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonContactMethod/mjbizappscommoncontactmethod.form.component.js +83 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonContactMethod/mjbizappscommoncontactmethod.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonContactType/mjbizappscommoncontacttype.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonContactType/mjbizappscommoncontacttype.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonContactType/mjbizappscommoncontacttype.form.component.js +96 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonContactType/mjbizappscommoncontacttype.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonOrganization/mjbizappscommonorganization.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonOrganization/mjbizappscommonorganization.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonOrganization/mjbizappscommonorganization.form.component.js +172 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonOrganization/mjbizappscommonorganization.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonOrganizationType/mjbizappscommonorganizationtype.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonOrganizationType/mjbizappscommonorganizationtype.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonOrganizationType/mjbizappscommonorganizationtype.form.component.js +90 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonOrganizationType/mjbizappscommonorganizationtype.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonPerson/mjbizappscommonperson.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonPerson/mjbizappscommonperson.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonPerson/mjbizappscommonperson.form.component.js +274 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonPerson/mjbizappscommonperson.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonRelationship/mjbizappscommonrelationship.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonRelationship/mjbizappscommonrelationship.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonRelationship/mjbizappscommonrelationship.form.component.js +91 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonRelationship/mjbizappscommonrelationship.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonRelationshipType/mjbizappscommonrelationshiptype.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonRelationshipType/mjbizappscommonrelationshiptype.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonRelationshipType/mjbizappscommonrelationshiptype.form.component.js +100 -0
- package/dist/lib/generated/Entities/mjBizAppsCommonRelationshipType/mjbizappscommonrelationshiptype.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsForm/mjbizappsformsform.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsForm/mjbizappsformsform.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsForm/mjbizappsformsform.form.component.js +174 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsForm/mjbizappsformsform.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormCategory/mjbizappsformsformcategory.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormCategory/mjbizappsformsformcategory.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormCategory/mjbizappsformsformcategory.form.component.js +118 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormCategory/mjbizappsformsformcategory.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormDistribution/mjbizappsformsformdistribution.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormDistribution/mjbizappsformsformdistribution.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormDistribution/mjbizappsformsformdistribution.form.component.js +93 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormDistribution/mjbizappsformsformdistribution.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormPage/mjbizappsformsformpage.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormPage/mjbizappsformsformpage.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormPage/mjbizappsformsformpage.form.component.js +96 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormPage/mjbizappsformsformpage.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormQuestion/mjbizappsformsformquestion.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormQuestion/mjbizappsformsformquestion.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormQuestion/mjbizappsformsformquestion.form.component.js +132 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormQuestion/mjbizappsformsformquestion.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormQuestionOption/mjbizappsformsformquestionoption.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormQuestionOption/mjbizappsformsformquestionoption.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormQuestionOption/mjbizappsformsformquestionoption.form.component.js +77 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormQuestionOption/mjbizappsformsformquestionoption.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormResponse/mjbizappsformsformresponse.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormResponse/mjbizappsformsformresponse.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormResponse/mjbizappsformsformresponse.form.component.js +108 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormResponse/mjbizappsformsformresponse.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormResponseAnswer/mjbizappsformsformresponseanswer.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormResponseAnswer/mjbizappsformsformresponseanswer.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormResponseAnswer/mjbizappsformsformresponseanswer.form.component.js +99 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormResponseAnswer/mjbizappsformsformresponseanswer.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormStyle/mjbizappsformsformstyle.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormStyle/mjbizappsformsformstyle.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormStyle/mjbizappsformsformstyle.form.component.js +100 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormStyle/mjbizappsformsformstyle.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormVersion/mjbizappsformsformversion.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormVersion/mjbizappsformsformversion.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormVersion/mjbizappsformsformversion.form.component.js +96 -0
- package/dist/lib/generated/Entities/mjBizAppsFormsFormVersion/mjbizappsformsformversion.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTask/mjbizappstaskstask.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTask/mjbizappstaskstask.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTask/mjbizappstaskstask.form.component.js +274 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTask/mjbizappstaskstask.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskActivity/mjbizappstaskstaskactivity.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskActivity/mjbizappstaskstaskactivity.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskActivity/mjbizappstaskstaskactivity.form.component.js +67 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskActivity/mjbizappstaskstaskactivity.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskAssignment/mjbizappstaskstaskassignment.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskAssignment/mjbizappstaskstaskassignment.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskAssignment/mjbizappstaskstaskassignment.form.component.js +90 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskAssignment/mjbizappstaskstaskassignment.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskCategory/mjbizappstaskstaskcategory.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskCategory/mjbizappstaskstaskcategory.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskCategory/mjbizappstaskstaskcategory.form.component.js +124 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskCategory/mjbizappstaskstaskcategory.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskComment/mjbizappstaskstaskcomment.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskComment/mjbizappstaskstaskcomment.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskComment/mjbizappstaskstaskcomment.form.component.js +86 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskComment/mjbizappstaskstaskcomment.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskDecision/mjbizappstaskstaskdecision.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskDecision/mjbizappstaskstaskdecision.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskDecision/mjbizappstaskstaskdecision.form.component.js +67 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskDecision/mjbizappstaskstaskdecision.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskDecisionOutcome/mjbizappstaskstaskdecisionoutcome.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskDecisionOutcome/mjbizappstaskstaskdecisionoutcome.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskDecisionOutcome/mjbizappstaskstaskdecisionoutcome.form.component.js +86 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskDecisionOutcome/mjbizappstaskstaskdecisionoutcome.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskDependency/mjbizappstaskstaskdependency.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskDependency/mjbizappstaskstaskdependency.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskDependency/mjbizappstaskstaskdependency.form.component.js +61 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskDependency/mjbizappstaskstaskdependency.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskLink/mjbizappstaskstasklink.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskLink/mjbizappstaskstasklink.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskLink/mjbizappstaskstasklink.form.component.js +63 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskLink/mjbizappstaskstasklink.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskNotificationConfig/mjbizappstaskstasknotificationconfig.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskNotificationConfig/mjbizappstaskstasknotificationconfig.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskNotificationConfig/mjbizappstaskstasknotificationconfig.form.component.js +69 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskNotificationConfig/mjbizappstaskstasknotificationconfig.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskNotificationLog/mjbizappstaskstasknotificationlog.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskNotificationLog/mjbizappstaskstasknotificationlog.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskNotificationLog/mjbizappstaskstasknotificationlog.form.component.js +63 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskNotificationLog/mjbizappstaskstasknotificationlog.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskRole/mjbizappstaskstaskrole.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskRole/mjbizappstaskstaskrole.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskRole/mjbizappstaskstaskrole.form.component.js +98 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskRole/mjbizappstaskstaskrole.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskTag/mjbizappstaskstasktag.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskTag/mjbizappstaskstasktag.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskTag/mjbizappstaskstasktag.form.component.js +80 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskTag/mjbizappstaskstasktag.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskTagLink/mjbizappstaskstasktaglink.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskTagLink/mjbizappstaskstasktaglink.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskTagLink/mjbizappstaskstasktaglink.form.component.js +59 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskTagLink/mjbizappstaskstasktaglink.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplate/mjbizappstaskstasktemplate.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplate/mjbizappstaskstasktemplate.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplate/mjbizappstaskstasktemplate.form.component.js +84 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplate/mjbizappstaskstasktemplate.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplateItem/mjbizappstaskstasktemplateitem.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplateItem/mjbizappstaskstasktemplateitem.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplateItem/mjbizappstaskstasktemplateitem.form.component.js +146 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplateItem/mjbizappstaskstasktemplateitem.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplateItemDependency/mjbizappstaskstasktemplateitemdependency.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplateItemDependency/mjbizappstaskstasktemplateitemdependency.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplateItemDependency/mjbizappstaskstasktemplateitemdependency.form.component.js +61 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplateItemDependency/mjbizappstaskstasktemplateitemdependency.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplateItemRole/mjbizappstaskstasktemplateitemrole.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplateItemRole/mjbizappstaskstasktemplateitemrole.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplateItemRole/mjbizappstaskstasktemplateitemrole.form.component.js +59 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskTemplateItemRole/mjbizappstaskstasktemplateitemrole.form.component.js.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskType/mjbizappstaskstasktype.form.component.d.ts +10 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskType/mjbizappstaskstasktype.form.component.d.ts.map +1 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskType/mjbizappstaskstasktype.form.component.js +132 -0
- package/dist/lib/generated/Entities/mjBizAppsTasksTaskType/mjbizappstaskstasktype.form.component.js.map +1 -0
- package/dist/lib/generated/class-registrations-manifest.d.ts +6 -0
- package/dist/lib/generated/class-registrations-manifest.d.ts.map +1 -0
- package/dist/lib/generated/class-registrations-manifest.js +6 -0
- package/dist/lib/generated/class-registrations-manifest.js.map +1 -0
- package/dist/lib/generated/generated-forms.module.d.ts +61 -0
- package/dist/lib/generated/generated-forms.module.d.ts.map +1 -0
- package/dist/lib/generated/generated-forms.module.js +207 -0
- package/dist/lib/generated/generated-forms.module.js.map +1 -0
- package/dist/lib/home/forms-home-dashboard.component.d.ts +61 -0
- package/dist/lib/home/forms-home-dashboard.component.d.ts.map +1 -0
- package/dist/lib/home/forms-home-dashboard.component.js +379 -0
- package/dist/lib/home/forms-home-dashboard.component.js.map +1 -0
- package/dist/lib/home/forms-home.service.d.ts +24 -0
- package/dist/lib/home/forms-home.service.d.ts.map +1 -0
- package/dist/lib/home/forms-home.service.js +92 -0
- package/dist/lib/home/forms-home.service.js.map +1 -0
- package/dist/lib/home/home-aggregations.d.ts +23 -0
- package/dist/lib/home/home-aggregations.d.ts.map +1 -0
- package/dist/lib/home/home-aggregations.js +64 -0
- package/dist/lib/home/home-aggregations.js.map +1 -0
- package/dist/lib/home/home-models.d.ts +60 -0
- package/dist/lib/home/home-models.d.ts.map +1 -0
- package/dist/lib/home/home-models.js +34 -0
- package/dist/lib/home/home-models.js.map +1 -0
- package/dist/lib/home/index.d.ts +13 -0
- package/dist/lib/home/index.d.ts.map +1 -0
- package/dist/lib/home/index.js +13 -0
- package/dist/lib/home/index.js.map +1 -0
- package/dist/lib/widget/api/form-upload.service.d.ts +41 -0
- package/dist/lib/widget/api/form-upload.service.d.ts.map +1 -0
- package/dist/lib/widget/api/form-upload.service.js +124 -0
- package/dist/lib/widget/api/form-upload.service.js.map +1 -0
- package/dist/lib/widget/api/forms-api.config.d.ts +55 -0
- package/dist/lib/widget/api/forms-api.config.d.ts.map +1 -0
- package/dist/lib/widget/api/forms-api.config.js +40 -0
- package/dist/lib/widget/api/forms-api.config.js.map +1 -0
- package/dist/lib/widget/api/forms-api.graphql.service.d.ts +20 -0
- package/dist/lib/widget/api/forms-api.graphql.service.d.ts.map +1 -0
- package/dist/lib/widget/api/forms-api.graphql.service.js +96 -0
- package/dist/lib/widget/api/forms-api.graphql.service.js.map +1 -0
- package/dist/lib/widget/api/forms-api.interface.d.ts +45 -0
- package/dist/lib/widget/api/forms-api.interface.d.ts.map +1 -0
- package/dist/lib/widget/api/forms-api.interface.js +8 -0
- package/dist/lib/widget/api/forms-api.interface.js.map +1 -0
- package/dist/lib/widget/api/forms-api.mock.service.d.ts +12 -0
- package/dist/lib/widget/api/forms-api.mock.service.d.ts.map +1 -0
- package/dist/lib/widget/api/forms-api.mock.service.js +41 -0
- package/dist/lib/widget/api/forms-api.mock.service.js.map +1 -0
- package/dist/lib/widget/api/mock-form.data.d.ts +8 -0
- package/dist/lib/widget/api/mock-form.data.d.ts.map +1 -0
- package/dist/lib/widget/api/mock-form.data.js +192 -0
- package/dist/lib/widget/api/mock-form.data.js.map +1 -0
- package/dist/lib/widget/api/submission-mapping.d.ts +60 -0
- package/dist/lib/widget/api/submission-mapping.d.ts.map +1 -0
- package/dist/lib/widget/api/submission-mapping.js +47 -0
- package/dist/lib/widget/api/submission-mapping.js.map +1 -0
- package/dist/lib/widget/components/form-one-question.component.d.ts +43 -0
- package/dist/lib/widget/components/form-one-question.component.d.ts.map +1 -0
- package/dist/lib/widget/components/form-one-question.component.js +194 -0
- package/dist/lib/widget/components/form-one-question.component.js.map +1 -0
- package/dist/lib/widget/components/form-progress.component.d.ts +9 -0
- package/dist/lib/widget/components/form-progress.component.d.ts.map +1 -0
- package/dist/lib/widget/components/form-progress.component.js +47 -0
- package/dist/lib/widget/components/form-progress.component.js.map +1 -0
- package/dist/lib/widget/components/form-scroll.component.d.ts +23 -0
- package/dist/lib/widget/components/form-scroll.component.d.ts.map +1 -0
- package/dist/lib/widget/components/form-scroll.component.js +132 -0
- package/dist/lib/widget/components/form-scroll.component.js.map +1 -0
- package/dist/lib/widget/components/questions/form-question.component.d.ts +68 -0
- package/dist/lib/widget/components/questions/form-question.component.d.ts.map +1 -0
- package/dist/lib/widget/components/questions/form-question.component.js +541 -0
- package/dist/lib/widget/components/questions/form-question.component.js.map +1 -0
- package/dist/lib/widget/components/questions/input-mode.d.ts +13 -0
- package/dist/lib/widget/components/questions/input-mode.d.ts.map +1 -0
- package/dist/lib/widget/components/questions/input-mode.js +42 -0
- package/dist/lib/widget/components/questions/input-mode.js.map +1 -0
- package/dist/lib/widget/components/turnstile-challenge.component.d.ts +52 -0
- package/dist/lib/widget/components/turnstile-challenge.component.d.ts.map +1 -0
- package/dist/lib/widget/components/turnstile-challenge.component.js +123 -0
- package/dist/lib/widget/components/turnstile-challenge.component.js.map +1 -0
- package/dist/lib/widget/core/answer-value.d.ts +17 -0
- package/dist/lib/widget/core/answer-value.d.ts.map +1 -0
- package/dist/lib/widget/core/answer-value.js +41 -0
- package/dist/lib/widget/core/answer-value.js.map +1 -0
- package/dist/lib/widget/core/autosave-controller.d.ts +65 -0
- package/dist/lib/widget/core/autosave-controller.d.ts.map +1 -0
- package/dist/lib/widget/core/autosave-controller.js +134 -0
- package/dist/lib/widget/core/autosave-controller.js.map +1 -0
- package/dist/lib/widget/core/client-id.d.ts +17 -0
- package/dist/lib/widget/core/client-id.d.ts.map +1 -0
- package/dist/lib/widget/core/client-id.js +52 -0
- package/dist/lib/widget/core/client-id.js.map +1 -0
- package/dist/lib/widget/core/form-runtime.d.ts +34 -0
- package/dist/lib/widget/core/form-runtime.d.ts.map +1 -0
- package/dist/lib/widget/core/form-runtime.js +123 -0
- package/dist/lib/widget/core/form-runtime.js.map +1 -0
- package/dist/lib/widget/core/one-question-stepper.d.ts +20 -0
- package/dist/lib/widget/core/one-question-stepper.d.ts.map +1 -0
- package/dist/lib/widget/core/one-question-stepper.js +23 -0
- package/dist/lib/widget/core/one-question-stepper.js.map +1 -0
- package/dist/lib/widget/core/submit-phase.d.ts +31 -0
- package/dist/lib/widget/core/submit-phase.d.ts.map +1 -0
- package/dist/lib/widget/core/submit-phase.js +21 -0
- package/dist/lib/widget/core/submit-phase.js.map +1 -0
- package/dist/lib/widget/core/theming.d.ts +17 -0
- package/dist/lib/widget/core/theming.d.ts.map +1 -0
- package/dist/lib/widget/core/theming.js +36 -0
- package/dist/lib/widget/core/theming.js.map +1 -0
- package/dist/lib/widget/core/turnstile-gate.d.ts +42 -0
- package/dist/lib/widget/core/turnstile-gate.d.ts.map +1 -0
- package/dist/lib/widget/core/turnstile-gate.js +61 -0
- package/dist/lib/widget/core/turnstile-gate.js.map +1 -0
- package/dist/lib/widget/core/turnstile-loader.d.ts +34 -0
- package/dist/lib/widget/core/turnstile-loader.d.ts.map +1 -0
- package/dist/lib/widget/core/turnstile-loader.js +68 -0
- package/dist/lib/widget/core/turnstile-loader.js.map +1 -0
- package/dist/lib/widget/core/validation.d.ts +19 -0
- package/dist/lib/widget/core/validation.d.ts.map +1 -0
- package/dist/lib/widget/core/validation.js +105 -0
- package/dist/lib/widget/core/validation.js.map +1 -0
- package/dist/lib/widget/index.d.ts +27 -0
- package/dist/lib/widget/index.d.ts.map +1 -0
- package/dist/lib/widget/index.js +30 -0
- package/dist/lib/widget/index.js.map +1 -0
- package/dist/lib/widget/mj-form.component.d.ts +114 -0
- package/dist/lib/widget/mj-form.component.d.ts.map +1 -0
- package/dist/lib/widget/mj-form.component.js +428 -0
- package/dist/lib/widget/mj-form.component.js.map +1 -0
- package/dist/lib/widget/register-element.d.ts +8 -0
- package/dist/lib/widget/register-element.d.ts.map +1 -0
- package/dist/lib/widget/register-element.js +98 -0
- package/dist/lib/widget/register-element.js.map +1 -0
- package/dist/public-api.d.ts +23 -0
- package/dist/public-api.d.ts.map +1 -0
- package/dist/public-api.js +33 -0
- package/dist/public-api.js.map +1 -0
- package/dist/widget-entry.d.ts +2 -0
- package/dist/widget-entry.d.ts.map +1 -0
- package/dist/widget-entry.js +20 -0
- package/dist/widget-entry.js.map +1 -0
- package/package.json +53 -5
- package/README.md +0 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-mode.d.ts","sourceRoot":"","sources":["../../../../../src/lib/widget/components/questions/input-mode.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAW3D;AAED,uDAAuD;AACvD,wBAAgB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAe3D;AAED,+DAA+D;AAC/D,wBAAgB,eAAe,CAAC,IAAI,EAAE,gBAAgB,GAAG,MAAM,CAS9D"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** HTML `inputmode` for the soft keyboard a text-style question should summon. */
|
|
2
|
+
export function inputModeFor(type) {
|
|
3
|
+
switch (type) {
|
|
4
|
+
case 'Email':
|
|
5
|
+
return 'email';
|
|
6
|
+
case 'Phone':
|
|
7
|
+
return 'tel';
|
|
8
|
+
case 'Number':
|
|
9
|
+
return 'decimal';
|
|
10
|
+
default:
|
|
11
|
+
return 'text';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/** Native `<input type>` for a text-style question. */
|
|
15
|
+
export function inputTypeFor(type) {
|
|
16
|
+
switch (type) {
|
|
17
|
+
case 'Email':
|
|
18
|
+
return 'email';
|
|
19
|
+
case 'Phone':
|
|
20
|
+
return 'tel';
|
|
21
|
+
case 'Number':
|
|
22
|
+
return 'number';
|
|
23
|
+
case 'Date':
|
|
24
|
+
return 'date';
|
|
25
|
+
case 'Time':
|
|
26
|
+
return 'time';
|
|
27
|
+
default:
|
|
28
|
+
return 'text';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** `autocomplete` token to speed up known fields on mobile. */
|
|
32
|
+
export function autocompleteFor(type) {
|
|
33
|
+
switch (type) {
|
|
34
|
+
case 'Email':
|
|
35
|
+
return 'email';
|
|
36
|
+
case 'Phone':
|
|
37
|
+
return 'tel';
|
|
38
|
+
default:
|
|
39
|
+
return 'on';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=input-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-mode.js","sourceRoot":"","sources":["../../../../../src/lib/widget/components/questions/input-mode.ts"],"names":[],"mappings":"AAOA,kFAAkF;AAClF,MAAM,UAAU,YAAY,CAAC,IAAsB;IACjD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,KAAK,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,SAAS,CAAC;QACnB;YACE,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,YAAY,CAAC,IAAsB;IACjD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,KAAK,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;QAChB,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;QAChB;YACE,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,eAAe,CAAC,IAAsB;IACpD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;QACjB,KAAK,OAAO;YACV,OAAO,KAAK,CAAC;QACf;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renders a Cloudflare Turnstile challenge (DG-4) inside the respondent widget and
|
|
3
|
+
* emits its lifecycle: `(solved)` with the single-use token, `(expired)` when a solved
|
|
4
|
+
* token times out (~300s), and `(errored)` when the widget itself fails to load/render.
|
|
5
|
+
*
|
|
6
|
+
* The parent (`MjFormComponent`) only mounts this component when the form requires
|
|
7
|
+
* captcha AND a site key is configured — so this component assumes a valid site key.
|
|
8
|
+
* It loads the Cloudflare script once per document (shared across widget instances),
|
|
9
|
+
* renders in explicit mode against the injected site key, and exposes `reset()` so the
|
|
10
|
+
* parent can re-arm the challenge after an expiry or a failed submit (tokens are
|
|
11
|
+
* single-use).
|
|
12
|
+
*
|
|
13
|
+
* Framework-free by design: no Explorer shell, no MJ globals. The external script load
|
|
14
|
+
* is intentional — the widget is a real embeddable app, not a sandboxed artifact.
|
|
15
|
+
*/
|
|
16
|
+
import { AfterViewInit, OnDestroy } from '@angular/core';
|
|
17
|
+
import * as i0 from "@angular/core";
|
|
18
|
+
export declare class TurnstileChallengeComponent implements AfterViewInit, OnDestroy {
|
|
19
|
+
/** Public Cloudflare site key (global, not per-form). Required for a real render. */
|
|
20
|
+
readonly siteKey: import("@angular/core").InputSignal<string>;
|
|
21
|
+
/** Emits the single-use token when the challenge is solved. */
|
|
22
|
+
readonly solved: import("@angular/core").OutputEmitterRef<string>;
|
|
23
|
+
/** Emits when a previously-solved token expires and must be re-solved. */
|
|
24
|
+
readonly expired: import("@angular/core").OutputEmitterRef<void>;
|
|
25
|
+
/** Emits when the challenge fails to load or render (script blocked, bad key, etc.). */
|
|
26
|
+
readonly errored: import("@angular/core").OutputEmitterRef<void>;
|
|
27
|
+
private readonly hostEl;
|
|
28
|
+
private readonly config;
|
|
29
|
+
private readonly zone;
|
|
30
|
+
/** Handle returned by `turnstile.render`, used to reset/remove the widget. */
|
|
31
|
+
private widgetId;
|
|
32
|
+
private disposed;
|
|
33
|
+
/** Guards against a second mount while the script load is still in flight. */
|
|
34
|
+
private mounting;
|
|
35
|
+
ngAfterViewInit(): void;
|
|
36
|
+
ngOnDestroy(): void;
|
|
37
|
+
/** Load the script (once) then render the challenge into the host element. */
|
|
38
|
+
private mount;
|
|
39
|
+
/** Render the Turnstile widget in explicit mode and wire its callbacks. */
|
|
40
|
+
private render;
|
|
41
|
+
/**
|
|
42
|
+
* Re-arm the challenge for a fresh token — called by the parent after a token expires
|
|
43
|
+
* or a submit fails on the server's Turnstile check (tokens are single-use).
|
|
44
|
+
*/
|
|
45
|
+
reset(): void;
|
|
46
|
+
/** Remove the rendered widget (on destroy) to free the Cloudflare instance. */
|
|
47
|
+
private remove;
|
|
48
|
+
private emitErrored;
|
|
49
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TurnstileChallengeComponent, never>;
|
|
50
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<TurnstileChallengeComponent, "mjf-turnstile-challenge", never, { "siteKey": { "alias": "siteKey"; "required": true; "isSignal": true; }; }, { "solved": "solved"; "expired": "expired"; "errored": "errored"; }, never, never, true, never>;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=turnstile-challenge.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turnstile-challenge.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/widget/components/turnstile-challenge.component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EACL,aAAa,EAKb,SAAS,EAKV,MAAM,eAAe,CAAC;;AASvB,qBAOa,2BAA4B,YAAW,aAAa,EAAE,SAAS;IAC1E,qFAAqF;IACrF,SAAgB,OAAO,8CAA4B;IAEnD,+DAA+D;IAC/D,SAAgB,MAAM,mDAAoB;IAC1C,0EAA0E;IAC1E,SAAgB,OAAO,iDAAkB;IACzC,wFAAwF;IACxF,SAAgB,OAAO,iDAAkB;IAEzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuD;IAC9E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4B;IACnD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkB;IAEvC,8EAA8E;IAC9E,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,QAAQ,CAAS;IACzB,8EAA8E;IAC9E,OAAO,CAAC,QAAQ,CAAS;IAElB,eAAe,IAAI,IAAI;IAIvB,WAAW,IAAI,IAAI;IAK1B,8EAA8E;YAChE,KAAK;IAmBnB,2EAA2E;IAC3E,OAAO,CAAC,MAAM;IAoBd;;;OAGG;IACI,KAAK,IAAI,IAAI;IAOpB,+EAA+E;IAC/E,OAAO,CAAC,MAAM;IAQd,OAAO,CAAC,WAAW;yCA3FR,2BAA2B;2CAA3B,2BAA2B;CAgGvC"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renders a Cloudflare Turnstile challenge (DG-4) inside the respondent widget and
|
|
3
|
+
* emits its lifecycle: `(solved)` with the single-use token, `(expired)` when a solved
|
|
4
|
+
* token times out (~300s), and `(errored)` when the widget itself fails to load/render.
|
|
5
|
+
*
|
|
6
|
+
* The parent (`MjFormComponent`) only mounts this component when the form requires
|
|
7
|
+
* captcha AND a site key is configured — so this component assumes a valid site key.
|
|
8
|
+
* It loads the Cloudflare script once per document (shared across widget instances),
|
|
9
|
+
* renders in explicit mode against the injected site key, and exposes `reset()` so the
|
|
10
|
+
* parent can re-arm the challenge after an expiry or a failed submit (tokens are
|
|
11
|
+
* single-use).
|
|
12
|
+
*
|
|
13
|
+
* Framework-free by design: no Explorer shell, no MJ globals. The external script load
|
|
14
|
+
* is intentional — the widget is a real embeddable app, not a sandboxed artifact.
|
|
15
|
+
*/
|
|
16
|
+
import { ChangeDetectionStrategy, Component, NgZone, inject, input, output, viewChild, } from '@angular/core';
|
|
17
|
+
import { FORMS_API_CONFIG } from '../api/forms-api.config';
|
|
18
|
+
import { ensureTurnstileScript, getTurnstile, } from '../core/turnstile-loader';
|
|
19
|
+
import * as i0 from "@angular/core";
|
|
20
|
+
const _c0 = ["host"];
|
|
21
|
+
export class TurnstileChallengeComponent {
|
|
22
|
+
/** Public Cloudflare site key (global, not per-form). Required for a real render. */
|
|
23
|
+
siteKey = input.required(...(ngDevMode ? [{ debugName: "siteKey" }] : []));
|
|
24
|
+
/** Emits the single-use token when the challenge is solved. */
|
|
25
|
+
solved = output();
|
|
26
|
+
/** Emits when a previously-solved token expires and must be re-solved. */
|
|
27
|
+
expired = output();
|
|
28
|
+
/** Emits when the challenge fails to load or render (script blocked, bad key, etc.). */
|
|
29
|
+
errored = output();
|
|
30
|
+
hostEl = viewChild.required('host');
|
|
31
|
+
config = inject(FORMS_API_CONFIG);
|
|
32
|
+
zone = inject(NgZone);
|
|
33
|
+
/** Handle returned by `turnstile.render`, used to reset/remove the widget. */
|
|
34
|
+
widgetId;
|
|
35
|
+
disposed = false;
|
|
36
|
+
/** Guards against a second mount while the script load is still in flight. */
|
|
37
|
+
mounting = false;
|
|
38
|
+
ngAfterViewInit() {
|
|
39
|
+
void this.mount();
|
|
40
|
+
}
|
|
41
|
+
ngOnDestroy() {
|
|
42
|
+
this.disposed = true;
|
|
43
|
+
this.remove();
|
|
44
|
+
}
|
|
45
|
+
/** Load the script (once) then render the challenge into the host element. */
|
|
46
|
+
async mount() {
|
|
47
|
+
if (this.mounting || this.widgetId !== undefined) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
this.mounting = true;
|
|
51
|
+
try {
|
|
52
|
+
await ensureTurnstileScript(this.config.turnstileScriptUrl);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
this.mounting = false;
|
|
56
|
+
this.emitErrored();
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
this.mounting = false;
|
|
60
|
+
if (this.disposed || this.widgetId !== undefined) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
this.render();
|
|
64
|
+
}
|
|
65
|
+
/** Render the Turnstile widget in explicit mode and wire its callbacks. */
|
|
66
|
+
render() {
|
|
67
|
+
const turnstile = getTurnstile();
|
|
68
|
+
const host = this.hostEl().nativeElement;
|
|
69
|
+
if (!turnstile || !host) {
|
|
70
|
+
this.emitErrored();
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
const options = {
|
|
74
|
+
sitekey: this.siteKey(),
|
|
75
|
+
callback: (token) => this.zone.run(() => this.solved.emit(token)),
|
|
76
|
+
'expired-callback': () => this.zone.run(() => this.expired.emit()),
|
|
77
|
+
'error-callback': () => this.zone.run(() => this.emitErrored()),
|
|
78
|
+
};
|
|
79
|
+
try {
|
|
80
|
+
this.widgetId = turnstile.render(host, options);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
this.emitErrored();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Re-arm the challenge for a fresh token — called by the parent after a token expires
|
|
88
|
+
* or a submit fails on the server's Turnstile check (tokens are single-use).
|
|
89
|
+
*/
|
|
90
|
+
reset() {
|
|
91
|
+
const turnstile = getTurnstile();
|
|
92
|
+
if (turnstile && this.widgetId !== undefined) {
|
|
93
|
+
turnstile.reset(this.widgetId);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/** Remove the rendered widget (on destroy) to free the Cloudflare instance. */
|
|
97
|
+
remove() {
|
|
98
|
+
const turnstile = getTurnstile();
|
|
99
|
+
if (turnstile && this.widgetId !== undefined) {
|
|
100
|
+
turnstile.remove(this.widgetId);
|
|
101
|
+
}
|
|
102
|
+
this.widgetId = undefined;
|
|
103
|
+
}
|
|
104
|
+
emitErrored() {
|
|
105
|
+
if (!this.disposed) {
|
|
106
|
+
this.errored.emit();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
static ɵfac = function TurnstileChallengeComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TurnstileChallengeComponent)(); };
|
|
110
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TurnstileChallengeComponent, selectors: [["mjf-turnstile-challenge"]], viewQuery: function TurnstileChallengeComponent_Query(rf, ctx) { if (rf & 1) {
|
|
111
|
+
i0.ɵɵviewQuerySignal(ctx.hostEl, _c0, 5);
|
|
112
|
+
} if (rf & 2) {
|
|
113
|
+
i0.ɵɵqueryAdvance();
|
|
114
|
+
} }, inputs: { siteKey: [1, "siteKey"] }, outputs: { solved: "solved", expired: "expired", errored: "errored" }, decls: 2, vars: 0, consts: [["host", ""], ["aria-label", "Security challenge", 1, "mjf-turnstile"]], template: function TurnstileChallengeComponent_Template(rf, ctx) { if (rf & 1) {
|
|
115
|
+
i0.ɵɵdomElement(0, "div", 1, 0);
|
|
116
|
+
} }, styles: ["\n\n\n\n[_nghost-%COMP%] {\n display: block;\n}\n\n.mjf-turnstile[_ngcontent-%COMP%] {\n display: flex;\n justify-content: center;\n margin: 1rem 0;\n min-height: 65px; \n\n}"], changeDetection: 0 });
|
|
117
|
+
}
|
|
118
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TurnstileChallengeComponent, [{
|
|
119
|
+
type: Component,
|
|
120
|
+
args: [{ selector: 'mjf-turnstile-challenge', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: `<div #host class="mjf-turnstile" aria-label="Security challenge"></div>`, styles: ["/* The Turnstile challenge slot. Cloudflare renders its own iframe inside .mjf-turnstile;\n we only reserve space and center it so it sits comfortably above the submit action on\n mobile and desktop alike. No hardcoded colors \u2014 the iframe styles itself. */\n:host {\n display: block;\n}\n\n.mjf-turnstile {\n display: flex;\n justify-content: center;\n margin: 1rem 0;\n min-height: 65px; /* Turnstile's default widget height; avoids layout shift on load. */\n}\n"] }]
|
|
121
|
+
}], null, { siteKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "siteKey", required: true }] }], solved: [{ type: i0.Output, args: ["solved"] }], expired: [{ type: i0.Output, args: ["expired"] }], errored: [{ type: i0.Output, args: ["errored"] }], hostEl: [{ type: i0.ViewChild, args: ['host', { isSignal: true }] }] }); })();
|
|
122
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TurnstileChallengeComponent, { className: "TurnstileChallengeComponent", filePath: "lib/widget/components/turnstile-challenge.component.ts", lineNumber: 43 }); })();
|
|
123
|
+
//# sourceMappingURL=turnstile-challenge.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"turnstile-challenge.component.js","sourceRoot":"","sources":["../../../../src/lib/widget/components/turnstile-challenge.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The widget's in-memory answer representation and the bridge to the S1 wire format.
|
|
3
|
+
*
|
|
4
|
+
* Internally each question's answer is held as an {@link AnswerValue} (the same union
|
|
5
|
+
* the conditional-rule evaluator consumes), keyed by questionId. At submit time we
|
|
6
|
+
* convert to the contract's {@link FormAnswerInput} typed-column shape.
|
|
7
|
+
*/
|
|
8
|
+
import type { AnswerValue, FormAnswerInput, PublishedFormQuestion } from '@mj-biz-apps/forms-entities';
|
|
9
|
+
/** The live answer map: questionId -> current value. */
|
|
10
|
+
export type AnswerMap = Map<string, AnswerValue>;
|
|
11
|
+
/**
|
|
12
|
+
* Convert the answer map into the wire `FormAnswerInput[]`, routing each value into
|
|
13
|
+
* the correct typed column based on the question type. Unanswered questions and
|
|
14
|
+
* display-only `Statement` questions are skipped.
|
|
15
|
+
*/
|
|
16
|
+
export declare function toAnswerInputs(questions: PublishedFormQuestion[], answers: AnswerMap): FormAnswerInput[];
|
|
17
|
+
//# sourceMappingURL=answer-value.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"answer-value.d.ts","sourceRoot":"","sources":["../../../../src/lib/widget/core/answer-value.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEvG,wDAAwD;AACxD,MAAM,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAEjD;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,qBAAqB,EAAE,EAClC,OAAO,EAAE,SAAS,GACjB,eAAe,EAAE,CAanB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Convert the answer map into the wire `FormAnswerInput[]`, routing each value into
|
|
3
|
+
* the correct typed column based on the question type. Unanswered questions and
|
|
4
|
+
* display-only `Statement` questions are skipped.
|
|
5
|
+
*/
|
|
6
|
+
export function toAnswerInputs(questions, answers) {
|
|
7
|
+
const inputs = [];
|
|
8
|
+
for (const q of questions) {
|
|
9
|
+
if (q.type === 'Statement') {
|
|
10
|
+
continue;
|
|
11
|
+
}
|
|
12
|
+
const value = answers.get(q.id);
|
|
13
|
+
if (value === null || value === undefined || value === '') {
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
inputs.push(toAnswerInput(q, value));
|
|
17
|
+
}
|
|
18
|
+
return inputs;
|
|
19
|
+
}
|
|
20
|
+
/** Map one question's value into the right typed column of a {@link FormAnswerInput}. */
|
|
21
|
+
function toAnswerInput(question, value) {
|
|
22
|
+
const base = { questionId: question.id };
|
|
23
|
+
switch (question.type) {
|
|
24
|
+
case 'Number':
|
|
25
|
+
case 'Rating':
|
|
26
|
+
case 'NPS':
|
|
27
|
+
return { ...base, numericValue: typeof value === 'number' ? value : Number(value) };
|
|
28
|
+
case 'YesNo':
|
|
29
|
+
return { ...base, booleanValue: Boolean(value) };
|
|
30
|
+
case 'Date':
|
|
31
|
+
case 'Time':
|
|
32
|
+
return { ...base, dateValue: String(value) };
|
|
33
|
+
case 'MultiChoice':
|
|
34
|
+
return { ...base, jsonValue: Array.isArray(value) ? value : [String(value)] };
|
|
35
|
+
case 'FileUpload':
|
|
36
|
+
return { ...base, fileId: String(value) };
|
|
37
|
+
default:
|
|
38
|
+
return { ...base, textValue: String(value) };
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=answer-value.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"answer-value.js","sourceRoot":"","sources":["../../../../src/lib/widget/core/answer-value.ts"],"names":[],"mappings":"AAYA;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAC5B,SAAkC,EAClC,OAAkB;IAElB,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC3B,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YAC1D,SAAS;QACX,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,yFAAyF;AACzF,SAAS,aAAa,CAAC,QAA+B,EAAE,KAAkB;IACxE,MAAM,IAAI,GAAoB,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC;IAC1D,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtB,KAAK,QAAQ,CAAC;QACd,KAAK,QAAQ,CAAC;QACd,KAAK,KAAK;YACR,OAAO,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QACtF,KAAK,OAAO;YACV,OAAO,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACnD,KAAK,MAAM,CAAC;QACZ,KAAK,MAAM;YACT,OAAO,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/C,KAAK,aAAa;YAChB,OAAO,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QAChF,KAAK,YAAY;YACf,OAAO,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC5C;YACE,OAAO,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IACjD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Headless autosave scheduler for the respondent widget.
|
|
3
|
+
*
|
|
4
|
+
* Debounces "progress" pings (page advance / answer edits) and, when they settle,
|
|
5
|
+
* fires a single partial save through a caller-supplied `save` function. It:
|
|
6
|
+
* - coalesces bursts of pings into one save (not chatty),
|
|
7
|
+
* - never overlaps saves — a ping during an in-flight save re-arms afterwards,
|
|
8
|
+
* - threads the server-returned `responseId` back into the caller so every save
|
|
9
|
+
* UPSERTS the same partial response (cross-session resume is Phase 2 and NOT
|
|
10
|
+
* handled here — the id lives only for this widget instance),
|
|
11
|
+
* - is fail-soft: a rejected save is swallowed (surfaced only via `status`), so the
|
|
12
|
+
* respondent is never blocked or interrupted.
|
|
13
|
+
*
|
|
14
|
+
* Framework-free (takes injected `setTimeout`/`clearTimeout`) so it is unit-testable
|
|
15
|
+
* with fake timers and no Angular. The component wires it to signals + the API.
|
|
16
|
+
*/
|
|
17
|
+
/** What the controller asks the host to do: persist the current partial, return its id. */
|
|
18
|
+
export type AutosaveFn = () => Promise<string | undefined>;
|
|
19
|
+
/** Observable status for a subtle "saving…/saved" indicator. */
|
|
20
|
+
export type AutosaveStatus = 'idle' | 'pending' | 'saving' | 'saved' | 'error';
|
|
21
|
+
/** Callback invoked whenever {@link AutosaveController.status} changes. */
|
|
22
|
+
export type AutosaveStatusListener = (status: AutosaveStatus) => void;
|
|
23
|
+
/** Injectable timer seam so tests can drive time deterministically. */
|
|
24
|
+
export interface TimerApi {
|
|
25
|
+
setTimeout: (fn: () => void, ms: number) => number;
|
|
26
|
+
clearTimeout: (handle: number) => void;
|
|
27
|
+
}
|
|
28
|
+
export declare class AutosaveController {
|
|
29
|
+
private readonly save;
|
|
30
|
+
private readonly onStatus;
|
|
31
|
+
private readonly debounceMs;
|
|
32
|
+
private readonly timers;
|
|
33
|
+
private timer;
|
|
34
|
+
private inFlight;
|
|
35
|
+
/** The promise for the currently-running save, so callers can await it settling. */
|
|
36
|
+
private inFlightSave;
|
|
37
|
+
/** A ping arrived while a save was in flight — save again once it settles. */
|
|
38
|
+
private rearm;
|
|
39
|
+
private disposed;
|
|
40
|
+
private currentStatus;
|
|
41
|
+
constructor(save: AutosaveFn, onStatus?: AutosaveStatusListener, debounceMs?: number, timers?: TimerApi);
|
|
42
|
+
get status(): AutosaveStatus;
|
|
43
|
+
/** Register progress worth saving. Restarts the debounce window. */
|
|
44
|
+
ping(): void;
|
|
45
|
+
/** Cancel any pending timer (e.g. on final submit, which persists everything). */
|
|
46
|
+
cancel(): void;
|
|
47
|
+
/**
|
|
48
|
+
* Cancel the pending debounce AND await any save that is already in flight, so a caller
|
|
49
|
+
* (the final submit) can guarantee no autosave write is still on the wire carrying the
|
|
50
|
+
* same `clientResponseId`. This is what prevents the widget from firing two overlapping
|
|
51
|
+
* writes with the same idempotency key (the source of the cosmetic PK-collision noise).
|
|
52
|
+
* Never re-arms and never throws — a failed in-flight save is swallowed (fail-soft).
|
|
53
|
+
*/
|
|
54
|
+
settle(): Promise<void>;
|
|
55
|
+
/** Stop all activity; a controller is dead after this. */
|
|
56
|
+
dispose(): void;
|
|
57
|
+
private arm;
|
|
58
|
+
/** Perform one save now; re-arm if a ping arrived meanwhile. */
|
|
59
|
+
private flush;
|
|
60
|
+
/** The awaited body of one save; always resolves (fail-soft), then re-arms if needed. */
|
|
61
|
+
private runSave;
|
|
62
|
+
private clearTimer;
|
|
63
|
+
private setStatus;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=autosave-controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autosave-controller.d.ts","sourceRoot":"","sources":["../../../../src/lib/widget/core/autosave-controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,2FAA2F;AAC3F,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;AAE3D,gEAAgE;AAChE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC;AAE/E,2EAA2E;AAC3E,MAAM,MAAM,sBAAsB,GAAG,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;AAEtE,uEAAuE;AACvE,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC;IACnD,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAID,qBAAa,kBAAkB;IAW3B,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAbzB,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,QAAQ,CAAS;IACzB,oFAAoF;IACpF,OAAO,CAAC,YAAY,CAA8B;IAClD,8EAA8E;IAC9E,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,aAAa,CAA0B;gBAG5B,IAAI,EAAE,UAAU,EAChB,QAAQ,GAAE,sBAAiC,EAC3C,UAAU,GAAE,MAA4B,EACxC,MAAM,GAAE,QAAyB;IAGpD,IAAW,MAAM,IAAI,cAAc,CAElC;IAED,oEAAoE;IAC7D,IAAI,IAAI,IAAI;IAanB,kFAAkF;IAC3E,MAAM,IAAI,IAAI;IAKrB;;;;;;OAMG;IACU,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAQpC,0DAA0D;IACnD,OAAO,IAAI,IAAI;IAKtB,OAAO,CAAC,GAAG;IAQX,gEAAgE;IAChE,OAAO,CAAC,KAAK;IAYb,yFAAyF;YAC3E,OAAO;IAkBrB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,SAAS;CAIlB"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Headless autosave scheduler for the respondent widget.
|
|
3
|
+
*
|
|
4
|
+
* Debounces "progress" pings (page advance / answer edits) and, when they settle,
|
|
5
|
+
* fires a single partial save through a caller-supplied `save` function. It:
|
|
6
|
+
* - coalesces bursts of pings into one save (not chatty),
|
|
7
|
+
* - never overlaps saves — a ping during an in-flight save re-arms afterwards,
|
|
8
|
+
* - threads the server-returned `responseId` back into the caller so every save
|
|
9
|
+
* UPSERTS the same partial response (cross-session resume is Phase 2 and NOT
|
|
10
|
+
* handled here — the id lives only for this widget instance),
|
|
11
|
+
* - is fail-soft: a rejected save is swallowed (surfaced only via `status`), so the
|
|
12
|
+
* respondent is never blocked or interrupted.
|
|
13
|
+
*
|
|
14
|
+
* Framework-free (takes injected `setTimeout`/`clearTimeout`) so it is unit-testable
|
|
15
|
+
* with fake timers and no Angular. The component wires it to signals + the API.
|
|
16
|
+
*/
|
|
17
|
+
const DEFAULT_DEBOUNCE_MS = 1500;
|
|
18
|
+
export class AutosaveController {
|
|
19
|
+
save;
|
|
20
|
+
onStatus;
|
|
21
|
+
debounceMs;
|
|
22
|
+
timers;
|
|
23
|
+
timer = null;
|
|
24
|
+
inFlight = false;
|
|
25
|
+
/** The promise for the currently-running save, so callers can await it settling. */
|
|
26
|
+
inFlightSave = null;
|
|
27
|
+
/** A ping arrived while a save was in flight — save again once it settles. */
|
|
28
|
+
rearm = false;
|
|
29
|
+
disposed = false;
|
|
30
|
+
currentStatus = 'idle';
|
|
31
|
+
constructor(save, onStatus = () => { }, debounceMs = DEFAULT_DEBOUNCE_MS, timers = globalTimers()) {
|
|
32
|
+
this.save = save;
|
|
33
|
+
this.onStatus = onStatus;
|
|
34
|
+
this.debounceMs = debounceMs;
|
|
35
|
+
this.timers = timers;
|
|
36
|
+
}
|
|
37
|
+
get status() {
|
|
38
|
+
return this.currentStatus;
|
|
39
|
+
}
|
|
40
|
+
/** Register progress worth saving. Restarts the debounce window. */
|
|
41
|
+
ping() {
|
|
42
|
+
if (this.disposed) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (this.inFlight) {
|
|
46
|
+
// Don't overlap; remember to save again when the current save resolves.
|
|
47
|
+
this.rearm = true;
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
this.setStatus('pending');
|
|
51
|
+
this.arm();
|
|
52
|
+
}
|
|
53
|
+
/** Cancel any pending timer (e.g. on final submit, which persists everything). */
|
|
54
|
+
cancel() {
|
|
55
|
+
this.clearTimer();
|
|
56
|
+
this.rearm = false;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Cancel the pending debounce AND await any save that is already in flight, so a caller
|
|
60
|
+
* (the final submit) can guarantee no autosave write is still on the wire carrying the
|
|
61
|
+
* same `clientResponseId`. This is what prevents the widget from firing two overlapping
|
|
62
|
+
* writes with the same idempotency key (the source of the cosmetic PK-collision noise).
|
|
63
|
+
* Never re-arms and never throws — a failed in-flight save is swallowed (fail-soft).
|
|
64
|
+
*/
|
|
65
|
+
async settle() {
|
|
66
|
+
this.clearTimer();
|
|
67
|
+
this.rearm = false;
|
|
68
|
+
if (this.inFlightSave) {
|
|
69
|
+
await this.inFlightSave;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** Stop all activity; a controller is dead after this. */
|
|
73
|
+
dispose() {
|
|
74
|
+
this.disposed = true;
|
|
75
|
+
this.cancel();
|
|
76
|
+
}
|
|
77
|
+
arm() {
|
|
78
|
+
this.clearTimer();
|
|
79
|
+
this.timer = this.timers.setTimeout(() => {
|
|
80
|
+
this.timer = null;
|
|
81
|
+
this.flush();
|
|
82
|
+
}, this.debounceMs);
|
|
83
|
+
}
|
|
84
|
+
/** Perform one save now; re-arm if a ping arrived meanwhile. */
|
|
85
|
+
flush() {
|
|
86
|
+
if (this.disposed || this.inFlight) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
this.inFlight = true;
|
|
90
|
+
this.setStatus('saving');
|
|
91
|
+
// Track the running save so settle() can await it (a submit must not overlap an
|
|
92
|
+
// in-flight autosave sharing the same clientResponseId).
|
|
93
|
+
this.inFlightSave = this.runSave();
|
|
94
|
+
void this.inFlightSave;
|
|
95
|
+
}
|
|
96
|
+
/** The awaited body of one save; always resolves (fail-soft), then re-arms if needed. */
|
|
97
|
+
async runSave() {
|
|
98
|
+
try {
|
|
99
|
+
await this.save();
|
|
100
|
+
this.setStatus('saved');
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Fail-soft: never surface a blocking error for a background autosave.
|
|
104
|
+
this.setStatus('error');
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
this.inFlight = false;
|
|
108
|
+
this.inFlightSave = null;
|
|
109
|
+
if (this.rearm && !this.disposed) {
|
|
110
|
+
this.rearm = false;
|
|
111
|
+
this.setStatus('pending');
|
|
112
|
+
this.arm();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
clearTimer() {
|
|
117
|
+
if (this.timer !== null) {
|
|
118
|
+
this.timers.clearTimeout(this.timer);
|
|
119
|
+
this.timer = null;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
setStatus(status) {
|
|
123
|
+
this.currentStatus = status;
|
|
124
|
+
this.onStatus(status);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/** Bind the ambient timers, guarding against non-browser/SSR contexts. */
|
|
128
|
+
function globalTimers() {
|
|
129
|
+
return {
|
|
130
|
+
setTimeout: (fn, ms) => setTimeout(fn, ms),
|
|
131
|
+
clearTimeout: (h) => clearTimeout(h),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=autosave-controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autosave-controller.js","sourceRoot":"","sources":["../../../../src/lib/widget/core/autosave-controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAiBH,MAAM,mBAAmB,GAAG,IAAI,CAAC;AAEjC,MAAM,OAAO,kBAAkB;IAWV;IACA;IACA;IACA;IAbX,KAAK,GAAkB,IAAI,CAAC;IAC5B,QAAQ,GAAG,KAAK,CAAC;IACzB,oFAAoF;IAC5E,YAAY,GAAyB,IAAI,CAAC;IAClD,8EAA8E;IACtE,KAAK,GAAG,KAAK,CAAC;IACd,QAAQ,GAAG,KAAK,CAAC;IACjB,aAAa,GAAmB,MAAM,CAAC;IAE/C,YACmB,IAAgB,EAChB,WAAmC,GAAG,EAAE,GAAE,CAAC,EAC3C,aAAqB,mBAAmB,EACxC,SAAmB,YAAY,EAAE;QAHjC,SAAI,GAAJ,IAAI,CAAY;QAChB,aAAQ,GAAR,QAAQ,CAAmC;QAC3C,eAAU,GAAV,UAAU,CAA8B;QACxC,WAAM,GAAN,MAAM,CAA2B;IACjD,CAAC;IAEJ,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,oEAAoE;IAC7D,IAAI;QACT,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,wEAAwE;YACxE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC1B,IAAI,CAAC,GAAG,EAAE,CAAC;IACb,CAAC;IAED,kFAAkF;IAC3E,MAAM;QACX,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,MAAM;QACjB,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,IAAI,CAAC,YAAY,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,0DAA0D;IACnD,OAAO;QACZ,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAEO,GAAG;QACT,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;YACvC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACtB,CAAC;IAED,gEAAgE;IACxD,KAAK;QACX,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACzB,gFAAgF;QAChF,yDAAyD;QACzD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QACnC,KAAK,IAAI,CAAC,YAAY,CAAC;IACzB,CAAC;IAED,yFAAyF;IACjF,KAAK,CAAC,OAAO;QACnB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC;QAAC,MAAM,CAAC;YACP,uEAAuE;YACvE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;YACtB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;YACzB,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACjC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;gBACnB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;gBAC1B,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,CAAC;QACH,CAAC;IACH,CAAC;IAEO,UAAU;QAChB,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAEO,SAAS,CAAC,MAAsB;QACtC,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAC5B,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;CACF;AAED,0EAA0E;AAC1E,SAAS,YAAY;IACnB,OAAO;QACL,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAsB;QAC/D,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;KACrC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate a stable, unguessable client response id — the widget's primary idempotency
|
|
3
|
+
* key for partial autosaves + the final submit (see FORMS_BUILD_PLAN §4 / the submit
|
|
4
|
+
* lifecycle hardening).
|
|
5
|
+
*
|
|
6
|
+
* One id is minted ONCE per form load and sent on EVERY save so all of them target one
|
|
7
|
+
* FormResponse row regardless of debounce/network timing or a blank server session id.
|
|
8
|
+
* The id is a v4-shaped UUID: `crypto.randomUUID()` when available (all modern browsers
|
|
9
|
+
* over HTTPS, Node 19+), else a `crypto.getRandomValues`-seeded fallback, else a
|
|
10
|
+
* last-resort `Math.random` fallback for environments with no Web Crypto at all.
|
|
11
|
+
*
|
|
12
|
+
* The value is used verbatim as the FormResponse primary key server-side, so it MUST be a
|
|
13
|
+
* syntactically valid uniqueidentifier — every branch below returns canonical UUID text.
|
|
14
|
+
*/
|
|
15
|
+
/** Return a fresh v4-shaped UUID string, degrading gracefully when Web Crypto is absent. */
|
|
16
|
+
export declare function generateClientResponseId(): string;
|
|
17
|
+
//# sourceMappingURL=client-id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-id.d.ts","sourceRoot":"","sources":["../../../../src/lib/widget/core/client-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,4FAA4F;AAC5F,wBAAgB,wBAAwB,IAAI,MAAM,CASjD"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate a stable, unguessable client response id — the widget's primary idempotency
|
|
3
|
+
* key for partial autosaves + the final submit (see FORMS_BUILD_PLAN §4 / the submit
|
|
4
|
+
* lifecycle hardening).
|
|
5
|
+
*
|
|
6
|
+
* One id is minted ONCE per form load and sent on EVERY save so all of them target one
|
|
7
|
+
* FormResponse row regardless of debounce/network timing or a blank server session id.
|
|
8
|
+
* The id is a v4-shaped UUID: `crypto.randomUUID()` when available (all modern browsers
|
|
9
|
+
* over HTTPS, Node 19+), else a `crypto.getRandomValues`-seeded fallback, else a
|
|
10
|
+
* last-resort `Math.random` fallback for environments with no Web Crypto at all.
|
|
11
|
+
*
|
|
12
|
+
* The value is used verbatim as the FormResponse primary key server-side, so it MUST be a
|
|
13
|
+
* syntactically valid uniqueidentifier — every branch below returns canonical UUID text.
|
|
14
|
+
*/
|
|
15
|
+
/** Return a fresh v4-shaped UUID string, degrading gracefully when Web Crypto is absent. */
|
|
16
|
+
export function generateClientResponseId() {
|
|
17
|
+
const c = typeof crypto !== 'undefined' ? crypto : undefined;
|
|
18
|
+
if (c && typeof c.randomUUID === 'function') {
|
|
19
|
+
return c.randomUUID();
|
|
20
|
+
}
|
|
21
|
+
if (c && typeof c.getRandomValues === 'function') {
|
|
22
|
+
return uuidFromBytes(c.getRandomValues(new Uint8Array(16)));
|
|
23
|
+
}
|
|
24
|
+
return uuidFromBytes(mathRandomBytes());
|
|
25
|
+
}
|
|
26
|
+
/** Format 16 bytes as a canonical v4 UUID (sets the version + variant bits). */
|
|
27
|
+
function uuidFromBytes(bytes) {
|
|
28
|
+
bytes[6] = (bytes[6] & 0x0f) | 0x40; // version 4
|
|
29
|
+
bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant 10xx
|
|
30
|
+
const hex = [];
|
|
31
|
+
for (let i = 0; i < 16; i++) {
|
|
32
|
+
hex.push(bytes[i].toString(16).padStart(2, '0'));
|
|
33
|
+
}
|
|
34
|
+
return (hex.slice(0, 4).join('') +
|
|
35
|
+
'-' +
|
|
36
|
+
hex.slice(4, 6).join('') +
|
|
37
|
+
'-' +
|
|
38
|
+
hex.slice(6, 8).join('') +
|
|
39
|
+
'-' +
|
|
40
|
+
hex.slice(8, 10).join('') +
|
|
41
|
+
'-' +
|
|
42
|
+
hex.slice(10, 16).join(''));
|
|
43
|
+
}
|
|
44
|
+
/** Non-cryptographic 16-byte fallback for the (rare) no-Web-Crypto environment. */
|
|
45
|
+
function mathRandomBytes() {
|
|
46
|
+
const bytes = new Uint8Array(16);
|
|
47
|
+
for (let i = 0; i < 16; i++) {
|
|
48
|
+
bytes[i] = Math.floor(Math.random() * 256);
|
|
49
|
+
}
|
|
50
|
+
return bytes;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=client-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-id.js","sourceRoot":"","sources":["../../../../src/lib/widget/core/client-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,4FAA4F;AAC5F,MAAM,UAAU,wBAAwB;IACtC,MAAM,CAAC,GAAuB,OAAO,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IACjF,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QAC5C,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC;IACxB,CAAC;IACD,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,eAAe,KAAK,UAAU,EAAE,CAAC;QACjD,OAAO,aAAa,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,aAAa,CAAC,eAAe,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,gFAAgF;AAChF,SAAS,aAAa,CAAC,KAAiB;IACtC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,YAAY;IACjD,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,eAAe;IACpD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,CACL,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,GAAG;QACH,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,GAAG;QACH,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,GAAG;QACH,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,GAAG;QACH,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAC3B,CAAC;AACJ,CAAC;AAED,mFAAmF;AACnF,SAAS,eAAe;IACtB,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type AnswerValue, type FormAnswerInput, type PublishedFormDefinition, type PublishedFormPage, type PublishedFormQuestion } from '@mj-biz-apps/forms-entities';
|
|
2
|
+
export declare class FormRuntime {
|
|
3
|
+
private readonly definition;
|
|
4
|
+
private readonly answers;
|
|
5
|
+
private readonly touched;
|
|
6
|
+
constructor(definition: PublishedFormDefinition);
|
|
7
|
+
readonly answerMap: import("@angular/core").Signal<Map<string, AnswerValue>>;
|
|
8
|
+
valueFor(questionId: string): AnswerValue;
|
|
9
|
+
setValue(questionId: string, value: AnswerValue): void;
|
|
10
|
+
markTouched(questionId: string): void;
|
|
11
|
+
isTouched(questionId: string): boolean;
|
|
12
|
+
/** Pages whose page-level rule passes given current answers. */
|
|
13
|
+
readonly visiblePages: import("@angular/core").Signal<PublishedFormPage[]>;
|
|
14
|
+
/** Visible questions on a given page (page must itself be visible to matter). */
|
|
15
|
+
visibleQuestions(page: PublishedFormPage): PublishedFormQuestion[];
|
|
16
|
+
/** Every visible, non-statement question across the form, in document order. */
|
|
17
|
+
readonly visibleAnswerableQuestions: import("@angular/core").Signal<PublishedFormQuestion[]>;
|
|
18
|
+
/** Validation message for a question, or `null` when valid. */
|
|
19
|
+
errorFor(question: PublishedFormQuestion): string | null;
|
|
20
|
+
/** Error shown in the UI only after the field has been touched. */
|
|
21
|
+
visibleErrorFor(question: PublishedFormQuestion): string | null;
|
|
22
|
+
/** True when every supplied list of questions currently validates. */
|
|
23
|
+
areValid(questions: PublishedFormQuestion[]): boolean;
|
|
24
|
+
/** Mark a set of questions touched (e.g. on a failed next/submit) to surface errors. */
|
|
25
|
+
touchAll(questions: PublishedFormQuestion[]): void;
|
|
26
|
+
/** Whole-form validity over all currently-visible answerable questions. */
|
|
27
|
+
readonly isFormValid: import("@angular/core").Signal<boolean>;
|
|
28
|
+
/** Fraction 0–1 of visible answerable questions that have a value. */
|
|
29
|
+
readonly progress: import("@angular/core").Signal<number>;
|
|
30
|
+
/** Build the wire answers for all currently-visible answerable questions. */
|
|
31
|
+
buildAnswerInputs(): FormAnswerInput[];
|
|
32
|
+
private orderedPages;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=form-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-runtime.d.ts","sourceRoot":"","sources":["../../../../src/lib/widget/core/form-runtime.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC3B,MAAM,6BAA6B,CAAC;AAKrC,qBAAa,WAAW;IAIV,OAAO,CAAC,QAAQ,CAAC,UAAU;IAHvC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+C;IACvE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;gBAE7B,UAAU,EAAE,uBAAuB;IAIhE,SAAgB,SAAS,2DAA6B;IAE/C,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,WAAW;IAIzC,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI;IAUtD,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IASrC,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAM7C,gEAAgE;IAChE,SAAgB,YAAY,sDAKzB;IAEH,iFAAiF;IAC1E,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,qBAAqB,EAAE;IAOzE,gFAAgF;IAChF,SAAgB,0BAA0B,0DAUvC;IAIH,+DAA+D;IACxD,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,GAAG,MAAM,GAAG,IAAI;IAI/D,mEAAmE;IAC5D,eAAe,CAAC,QAAQ,EAAE,qBAAqB,GAAG,MAAM,GAAG,IAAI;IAItE,sEAAsE;IAC/D,QAAQ,CAAC,SAAS,EAAE,qBAAqB,EAAE,GAAG,OAAO;IAI5D,wFAAwF;IACjF,QAAQ,CAAC,SAAS,EAAE,qBAAqB,EAAE,GAAG,IAAI;IAQzD,2EAA2E;IAC3E,SAAgB,WAAW,0CAIzB;IAIF,sEAAsE;IACtE,SAAgB,QAAQ,yCAOrB;IAIH,6EAA6E;IACtE,iBAAiB,IAAI,eAAe,EAAE;IAI7C,OAAO,CAAC,YAAY;CAGrB"}
|