@smvtech/x-flux 1.1.12 → 1.1.13
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/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +20 -20
- package/dist/index.mjs +20 -20
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -5499,16 +5499,16 @@ declare function getSignedUrlFromAsset(docId: string): Promise<string | null>;
|
|
|
5499
5499
|
declare function getDisplayableQuestions(questions: TEDCApplicant["questions"], questionAnswerSources: ANSWER_SOURCE[]): TEDCApplicant["questions"];
|
|
5500
5500
|
declare function getDisplayableDocuments(questions: TEDCApplicant["questions"], documentAnswerSources: ANSWER_SOURCE[]): TEDCApplicant["questions"];
|
|
5501
5501
|
declare function getValidationErrors(validations?: TAnswer["validations"] | null): ValidationResult;
|
|
5502
|
-
declare function getValidationResult(question: TEDCApplicant["questions"][0]): ValidationResult;
|
|
5503
|
-
declare function validateApplicantQuestions(applicant: TEDCApplicant, questionAnswerSources: ANSWER_SOURCE[]): Array<{
|
|
5502
|
+
declare function getValidationResult(question: TEDCApplicant["questions"][0], applicants?: Record<string, TEDCApplicant>): ValidationResult;
|
|
5503
|
+
declare function validateApplicantQuestions(applicant: TEDCApplicant, questionAnswerSources: ANSWER_SOURCE[], applicants?: Record<string, TEDCApplicant>): Array<{
|
|
5504
5504
|
name: string;
|
|
5505
5505
|
validationResult: ValidationResult;
|
|
5506
5506
|
}>;
|
|
5507
|
-
declare function validateApplicantDocuments(applicant: TEDCApplicant, documentAnswerSources: ANSWER_SOURCE[]): Array<{
|
|
5507
|
+
declare function validateApplicantDocuments(applicant: TEDCApplicant, documentAnswerSources: ANSWER_SOURCE[], applicants?: Record<string, TEDCApplicant>): Array<{
|
|
5508
5508
|
name: string;
|
|
5509
5509
|
validationResult: ValidationResult;
|
|
5510
5510
|
}>;
|
|
5511
|
-
declare function validateApplicant(applicant: TEDCApplicant, questionAnswerSources: ANSWER_SOURCE[], documentAnswerSources: ANSWER_SOURCE[]): {
|
|
5511
|
+
declare function validateApplicant(applicant: TEDCApplicant, questionAnswerSources: ANSWER_SOURCE[], documentAnswerSources: ANSWER_SOURCE[], applicants?: Record<string, TEDCApplicant>): {
|
|
5512
5512
|
isComplete: boolean;
|
|
5513
5513
|
questionValidations: Array<{
|
|
5514
5514
|
name: string;
|
package/dist/index.d.ts
CHANGED
|
@@ -5499,16 +5499,16 @@ declare function getSignedUrlFromAsset(docId: string): Promise<string | null>;
|
|
|
5499
5499
|
declare function getDisplayableQuestions(questions: TEDCApplicant["questions"], questionAnswerSources: ANSWER_SOURCE[]): TEDCApplicant["questions"];
|
|
5500
5500
|
declare function getDisplayableDocuments(questions: TEDCApplicant["questions"], documentAnswerSources: ANSWER_SOURCE[]): TEDCApplicant["questions"];
|
|
5501
5501
|
declare function getValidationErrors(validations?: TAnswer["validations"] | null): ValidationResult;
|
|
5502
|
-
declare function getValidationResult(question: TEDCApplicant["questions"][0]): ValidationResult;
|
|
5503
|
-
declare function validateApplicantQuestions(applicant: TEDCApplicant, questionAnswerSources: ANSWER_SOURCE[]): Array<{
|
|
5502
|
+
declare function getValidationResult(question: TEDCApplicant["questions"][0], applicants?: Record<string, TEDCApplicant>): ValidationResult;
|
|
5503
|
+
declare function validateApplicantQuestions(applicant: TEDCApplicant, questionAnswerSources: ANSWER_SOURCE[], applicants?: Record<string, TEDCApplicant>): Array<{
|
|
5504
5504
|
name: string;
|
|
5505
5505
|
validationResult: ValidationResult;
|
|
5506
5506
|
}>;
|
|
5507
|
-
declare function validateApplicantDocuments(applicant: TEDCApplicant, documentAnswerSources: ANSWER_SOURCE[]): Array<{
|
|
5507
|
+
declare function validateApplicantDocuments(applicant: TEDCApplicant, documentAnswerSources: ANSWER_SOURCE[], applicants?: Record<string, TEDCApplicant>): Array<{
|
|
5508
5508
|
name: string;
|
|
5509
5509
|
validationResult: ValidationResult;
|
|
5510
5510
|
}>;
|
|
5511
|
-
declare function validateApplicant(applicant: TEDCApplicant, questionAnswerSources: ANSWER_SOURCE[], documentAnswerSources: ANSWER_SOURCE[]): {
|
|
5511
|
+
declare function validateApplicant(applicant: TEDCApplicant, questionAnswerSources: ANSWER_SOURCE[], documentAnswerSources: ANSWER_SOURCE[], applicants?: Record<string, TEDCApplicant>): {
|
|
5512
5512
|
isComplete: boolean;
|
|
5513
5513
|
questionValidations: Array<{
|
|
5514
5514
|
name: string;
|
package/dist/index.js
CHANGED
|
@@ -558,6 +558,11 @@ var extractDefaultAnswer = (value) => {
|
|
|
558
558
|
const match = value.match(/^\{\{.*\}\}$/);
|
|
559
559
|
return match ? match[0] : null;
|
|
560
560
|
};
|
|
561
|
+
var isDynamicApplicantAnswerEmpty = (answer, applicants) => {
|
|
562
|
+
const match = answer.match(/^app_id_(.+)$/);
|
|
563
|
+
if (!match) return false;
|
|
564
|
+
return !(match[1] in applicants);
|
|
565
|
+
};
|
|
561
566
|
function getDisplayableQuestions(questions, questionAnswerSources) {
|
|
562
567
|
return questions.filter((q) => {
|
|
563
568
|
if (q.question.type === "DOCUMENT" /* DOCUMENT */) return false;
|
|
@@ -621,7 +626,7 @@ function getValidationErrors(validations) {
|
|
|
621
626
|
totalTimeSaved
|
|
622
627
|
};
|
|
623
628
|
}
|
|
624
|
-
function getValidationResult(question) {
|
|
629
|
+
function getValidationResult(question, applicants = {}) {
|
|
625
630
|
const backendResult = getValidationErrors(question.answer_data?.validations);
|
|
626
631
|
if (backendResult && backendResult.status !== "PERFECT" /* PERFECT */) {
|
|
627
632
|
return backendResult;
|
|
@@ -630,7 +635,7 @@ function getValidationResult(question) {
|
|
|
630
635
|
const isDocument = question.question.type === "DOCUMENT" /* DOCUMENT */;
|
|
631
636
|
const hasApproved = question.answer_data?.assets_id?.find((asset) => asset.status === "APPROVED");
|
|
632
637
|
const answer = question.answer_data?.answer?.[0];
|
|
633
|
-
const isAnswerEmpty = !answer || answer === "" || extractDefaultAnswer(answer) !== null;
|
|
638
|
+
const isAnswerEmpty = !answer || answer === "" || extractDefaultAnswer(answer) !== null || isDynamicApplicantAnswerEmpty(answer, applicants);
|
|
634
639
|
if (isDocument && !hasApproved || !isDocument && isAnswerEmpty) {
|
|
635
640
|
const answerRequiredItem = {
|
|
636
641
|
error_text: isDocument ? "Please upload the required document" : "Answer cannot be empty",
|
|
@@ -655,11 +660,11 @@ function getValidationResult(question) {
|
|
|
655
660
|
totalTimeSaved: 0
|
|
656
661
|
};
|
|
657
662
|
}
|
|
658
|
-
function validateApplicantQuestions(applicant, questionAnswerSources) {
|
|
663
|
+
function validateApplicantQuestions(applicant, questionAnswerSources, applicants = {}) {
|
|
659
664
|
const displayableQuestions = getDisplayableQuestions(applicant.questions, questionAnswerSources);
|
|
660
665
|
const questionValidations = [];
|
|
661
666
|
displayableQuestions.forEach((question) => {
|
|
662
|
-
const validationResult = getValidationResult(question);
|
|
667
|
+
const validationResult = getValidationResult(question, applicants);
|
|
663
668
|
if (validationResult && (validationResult.status === "MISSING" /* MISSING */ || validationResult.status === "UNFIXABLE" /* UNFIXABLE */)) {
|
|
664
669
|
questionValidations.push({
|
|
665
670
|
name: question.question.question,
|
|
@@ -669,11 +674,11 @@ function validateApplicantQuestions(applicant, questionAnswerSources) {
|
|
|
669
674
|
});
|
|
670
675
|
return questionValidations;
|
|
671
676
|
}
|
|
672
|
-
function validateApplicantDocuments(applicant, documentAnswerSources) {
|
|
677
|
+
function validateApplicantDocuments(applicant, documentAnswerSources, applicants = {}) {
|
|
673
678
|
const displayableDocuments = getDisplayableDocuments(applicant.questions, documentAnswerSources);
|
|
674
679
|
const documentValidations = [];
|
|
675
680
|
displayableDocuments.forEach((document) => {
|
|
676
|
-
const validationResult = getValidationResult(document);
|
|
681
|
+
const validationResult = getValidationResult(document, applicants);
|
|
677
682
|
if (validationResult && (validationResult.status === "MISSING" /* MISSING */ || validationResult.status === "UNFIXABLE" /* UNFIXABLE */)) {
|
|
678
683
|
documentValidations.push({
|
|
679
684
|
name: document.question.question,
|
|
@@ -683,9 +688,9 @@ function validateApplicantDocuments(applicant, documentAnswerSources) {
|
|
|
683
688
|
});
|
|
684
689
|
return documentValidations;
|
|
685
690
|
}
|
|
686
|
-
function validateApplicant(applicant, questionAnswerSources, documentAnswerSources) {
|
|
687
|
-
const questionValidations = validateApplicantQuestions(applicant, questionAnswerSources);
|
|
688
|
-
const documentValidations = validateApplicantDocuments(applicant, documentAnswerSources);
|
|
691
|
+
function validateApplicant(applicant, questionAnswerSources, documentAnswerSources, applicants = {}) {
|
|
692
|
+
const questionValidations = validateApplicantQuestions(applicant, questionAnswerSources, applicants);
|
|
693
|
+
const documentValidations = validateApplicantDocuments(applicant, documentAnswerSources, applicants);
|
|
689
694
|
const applicantValidations = getValidationErrors(applicant.application?.validations);
|
|
690
695
|
const hasBlockingIssues = questionValidations.some((q) => q.validationResult?.status === "MISSING" /* MISSING */ || q.validationResult?.status === "UNFIXABLE" /* UNFIXABLE */) || documentValidations.some((d) => d.validationResult?.status === "MISSING" /* MISSING */ || d.validationResult?.status === "UNFIXABLE" /* UNFIXABLE */) || applicantValidations?.status === "UNFIXABLE" /* UNFIXABLE */;
|
|
691
696
|
return {
|
|
@@ -697,9 +702,10 @@ function validateApplicant(applicant, questionAnswerSources, documentAnswerSourc
|
|
|
697
702
|
}
|
|
698
703
|
function validateAllApplicants(applicants, questionAnswerSources, documentAnswerSources) {
|
|
699
704
|
const applicantsArray = Array.isArray(applicants) ? applicants : Object.values(applicants);
|
|
705
|
+
const applicantsRecord = Array.isArray(applicants) ? Object.fromEntries(applicants.map((a) => [a.application_id, a])) : applicants;
|
|
700
706
|
const applicantValidations = [];
|
|
701
707
|
applicantsArray.forEach((applicant) => {
|
|
702
|
-
const validation = validateApplicant(applicant, questionAnswerSources, documentAnswerSources);
|
|
708
|
+
const validation = validateApplicant(applicant, questionAnswerSources, documentAnswerSources, applicantsRecord);
|
|
703
709
|
if (!validation.isComplete) {
|
|
704
710
|
const applicantName = getFullName(
|
|
705
711
|
applicant.traveller.first_name,
|
|
@@ -1011,10 +1017,10 @@ var EDCFlowProvider = ({ children, orderId }) => {
|
|
|
1011
1017
|
[updatedAnswerData.docId]: updatedAnswerData.signedUrl
|
|
1012
1018
|
}));
|
|
1013
1019
|
}
|
|
1014
|
-
|
|
1020
|
+
const shouldRefresh = question_type === "DOCUMENT" /* DOCUMENT */ || question.toLowerCase().includes("birth");
|
|
1021
|
+
if (shouldRefresh) {
|
|
1015
1022
|
await refreshApplicant(application_id);
|
|
1016
1023
|
} else {
|
|
1017
|
-
const shouldRecalculateSideEffects = question.toLowerCase().includes("birth");
|
|
1018
1024
|
setApplicants((prev) => {
|
|
1019
1025
|
const currentApplicant = prev[application_id];
|
|
1020
1026
|
if (!currentApplicant) return prev;
|
|
@@ -1024,13 +1030,7 @@ var EDCFlowProvider = ({ children, orderId }) => {
|
|
|
1024
1030
|
updatedAnswerData.answers,
|
|
1025
1031
|
questionnaire
|
|
1026
1032
|
);
|
|
1027
|
-
|
|
1028
|
-
if (shouldRecalculateSideEffects) {
|
|
1029
|
-
const { updatedQuestionnaire, updatedApplicants: applicantsWithSideEffects } = runApplicantSideEffects(updatedApplicants, questionnaire, dynamicQuestionMap);
|
|
1030
|
-
setQuestionnaire(updatedQuestionnaire);
|
|
1031
|
-
return applicantsWithSideEffects;
|
|
1032
|
-
}
|
|
1033
|
-
return updatedApplicants;
|
|
1033
|
+
return { ...prev, [application_id]: applicantWithUpdatedAnswer };
|
|
1034
1034
|
});
|
|
1035
1035
|
}
|
|
1036
1036
|
} catch (err) {
|
|
@@ -1038,7 +1038,7 @@ var EDCFlowProvider = ({ children, orderId }) => {
|
|
|
1038
1038
|
setError("Failed to update answer");
|
|
1039
1039
|
}
|
|
1040
1040
|
},
|
|
1041
|
-
[questionnaire, refreshApplicant, order
|
|
1041
|
+
[questionnaire, refreshApplicant, order]
|
|
1042
1042
|
);
|
|
1043
1043
|
const applyAutoFix = react.useCallback(
|
|
1044
1044
|
async (applicationId, answerId) => {
|
package/dist/index.mjs
CHANGED
|
@@ -532,6 +532,11 @@ var extractDefaultAnswer = (value) => {
|
|
|
532
532
|
const match = value.match(/^\{\{.*\}\}$/);
|
|
533
533
|
return match ? match[0] : null;
|
|
534
534
|
};
|
|
535
|
+
var isDynamicApplicantAnswerEmpty = (answer, applicants) => {
|
|
536
|
+
const match = answer.match(/^app_id_(.+)$/);
|
|
537
|
+
if (!match) return false;
|
|
538
|
+
return !(match[1] in applicants);
|
|
539
|
+
};
|
|
535
540
|
function getDisplayableQuestions(questions, questionAnswerSources) {
|
|
536
541
|
return questions.filter((q) => {
|
|
537
542
|
if (q.question.type === "DOCUMENT" /* DOCUMENT */) return false;
|
|
@@ -595,7 +600,7 @@ function getValidationErrors(validations) {
|
|
|
595
600
|
totalTimeSaved
|
|
596
601
|
};
|
|
597
602
|
}
|
|
598
|
-
function getValidationResult(question) {
|
|
603
|
+
function getValidationResult(question, applicants = {}) {
|
|
599
604
|
const backendResult = getValidationErrors(question.answer_data?.validations);
|
|
600
605
|
if (backendResult && backendResult.status !== "PERFECT" /* PERFECT */) {
|
|
601
606
|
return backendResult;
|
|
@@ -604,7 +609,7 @@ function getValidationResult(question) {
|
|
|
604
609
|
const isDocument = question.question.type === "DOCUMENT" /* DOCUMENT */;
|
|
605
610
|
const hasApproved = question.answer_data?.assets_id?.find((asset) => asset.status === "APPROVED");
|
|
606
611
|
const answer = question.answer_data?.answer?.[0];
|
|
607
|
-
const isAnswerEmpty = !answer || answer === "" || extractDefaultAnswer(answer) !== null;
|
|
612
|
+
const isAnswerEmpty = !answer || answer === "" || extractDefaultAnswer(answer) !== null || isDynamicApplicantAnswerEmpty(answer, applicants);
|
|
608
613
|
if (isDocument && !hasApproved || !isDocument && isAnswerEmpty) {
|
|
609
614
|
const answerRequiredItem = {
|
|
610
615
|
error_text: isDocument ? "Please upload the required document" : "Answer cannot be empty",
|
|
@@ -629,11 +634,11 @@ function getValidationResult(question) {
|
|
|
629
634
|
totalTimeSaved: 0
|
|
630
635
|
};
|
|
631
636
|
}
|
|
632
|
-
function validateApplicantQuestions(applicant, questionAnswerSources) {
|
|
637
|
+
function validateApplicantQuestions(applicant, questionAnswerSources, applicants = {}) {
|
|
633
638
|
const displayableQuestions = getDisplayableQuestions(applicant.questions, questionAnswerSources);
|
|
634
639
|
const questionValidations = [];
|
|
635
640
|
displayableQuestions.forEach((question) => {
|
|
636
|
-
const validationResult = getValidationResult(question);
|
|
641
|
+
const validationResult = getValidationResult(question, applicants);
|
|
637
642
|
if (validationResult && (validationResult.status === "MISSING" /* MISSING */ || validationResult.status === "UNFIXABLE" /* UNFIXABLE */)) {
|
|
638
643
|
questionValidations.push({
|
|
639
644
|
name: question.question.question,
|
|
@@ -643,11 +648,11 @@ function validateApplicantQuestions(applicant, questionAnswerSources) {
|
|
|
643
648
|
});
|
|
644
649
|
return questionValidations;
|
|
645
650
|
}
|
|
646
|
-
function validateApplicantDocuments(applicant, documentAnswerSources) {
|
|
651
|
+
function validateApplicantDocuments(applicant, documentAnswerSources, applicants = {}) {
|
|
647
652
|
const displayableDocuments = getDisplayableDocuments(applicant.questions, documentAnswerSources);
|
|
648
653
|
const documentValidations = [];
|
|
649
654
|
displayableDocuments.forEach((document) => {
|
|
650
|
-
const validationResult = getValidationResult(document);
|
|
655
|
+
const validationResult = getValidationResult(document, applicants);
|
|
651
656
|
if (validationResult && (validationResult.status === "MISSING" /* MISSING */ || validationResult.status === "UNFIXABLE" /* UNFIXABLE */)) {
|
|
652
657
|
documentValidations.push({
|
|
653
658
|
name: document.question.question,
|
|
@@ -657,9 +662,9 @@ function validateApplicantDocuments(applicant, documentAnswerSources) {
|
|
|
657
662
|
});
|
|
658
663
|
return documentValidations;
|
|
659
664
|
}
|
|
660
|
-
function validateApplicant(applicant, questionAnswerSources, documentAnswerSources) {
|
|
661
|
-
const questionValidations = validateApplicantQuestions(applicant, questionAnswerSources);
|
|
662
|
-
const documentValidations = validateApplicantDocuments(applicant, documentAnswerSources);
|
|
665
|
+
function validateApplicant(applicant, questionAnswerSources, documentAnswerSources, applicants = {}) {
|
|
666
|
+
const questionValidations = validateApplicantQuestions(applicant, questionAnswerSources, applicants);
|
|
667
|
+
const documentValidations = validateApplicantDocuments(applicant, documentAnswerSources, applicants);
|
|
663
668
|
const applicantValidations = getValidationErrors(applicant.application?.validations);
|
|
664
669
|
const hasBlockingIssues = questionValidations.some((q) => q.validationResult?.status === "MISSING" /* MISSING */ || q.validationResult?.status === "UNFIXABLE" /* UNFIXABLE */) || documentValidations.some((d) => d.validationResult?.status === "MISSING" /* MISSING */ || d.validationResult?.status === "UNFIXABLE" /* UNFIXABLE */) || applicantValidations?.status === "UNFIXABLE" /* UNFIXABLE */;
|
|
665
670
|
return {
|
|
@@ -671,9 +676,10 @@ function validateApplicant(applicant, questionAnswerSources, documentAnswerSourc
|
|
|
671
676
|
}
|
|
672
677
|
function validateAllApplicants(applicants, questionAnswerSources, documentAnswerSources) {
|
|
673
678
|
const applicantsArray = Array.isArray(applicants) ? applicants : Object.values(applicants);
|
|
679
|
+
const applicantsRecord = Array.isArray(applicants) ? Object.fromEntries(applicants.map((a) => [a.application_id, a])) : applicants;
|
|
674
680
|
const applicantValidations = [];
|
|
675
681
|
applicantsArray.forEach((applicant) => {
|
|
676
|
-
const validation = validateApplicant(applicant, questionAnswerSources, documentAnswerSources);
|
|
682
|
+
const validation = validateApplicant(applicant, questionAnswerSources, documentAnswerSources, applicantsRecord);
|
|
677
683
|
if (!validation.isComplete) {
|
|
678
684
|
const applicantName = getFullName(
|
|
679
685
|
applicant.traveller.first_name,
|
|
@@ -985,10 +991,10 @@ var EDCFlowProvider = ({ children, orderId }) => {
|
|
|
985
991
|
[updatedAnswerData.docId]: updatedAnswerData.signedUrl
|
|
986
992
|
}));
|
|
987
993
|
}
|
|
988
|
-
|
|
994
|
+
const shouldRefresh = question_type === "DOCUMENT" /* DOCUMENT */ || question.toLowerCase().includes("birth");
|
|
995
|
+
if (shouldRefresh) {
|
|
989
996
|
await refreshApplicant(application_id);
|
|
990
997
|
} else {
|
|
991
|
-
const shouldRecalculateSideEffects = question.toLowerCase().includes("birth");
|
|
992
998
|
setApplicants((prev) => {
|
|
993
999
|
const currentApplicant = prev[application_id];
|
|
994
1000
|
if (!currentApplicant) return prev;
|
|
@@ -998,13 +1004,7 @@ var EDCFlowProvider = ({ children, orderId }) => {
|
|
|
998
1004
|
updatedAnswerData.answers,
|
|
999
1005
|
questionnaire
|
|
1000
1006
|
);
|
|
1001
|
-
|
|
1002
|
-
if (shouldRecalculateSideEffects) {
|
|
1003
|
-
const { updatedQuestionnaire, updatedApplicants: applicantsWithSideEffects } = runApplicantSideEffects(updatedApplicants, questionnaire, dynamicQuestionMap);
|
|
1004
|
-
setQuestionnaire(updatedQuestionnaire);
|
|
1005
|
-
return applicantsWithSideEffects;
|
|
1006
|
-
}
|
|
1007
|
-
return updatedApplicants;
|
|
1007
|
+
return { ...prev, [application_id]: applicantWithUpdatedAnswer };
|
|
1008
1008
|
});
|
|
1009
1009
|
}
|
|
1010
1010
|
} catch (err) {
|
|
@@ -1012,7 +1012,7 @@ var EDCFlowProvider = ({ children, orderId }) => {
|
|
|
1012
1012
|
setError("Failed to update answer");
|
|
1013
1013
|
}
|
|
1014
1014
|
},
|
|
1015
|
-
[questionnaire, refreshApplicant, order
|
|
1015
|
+
[questionnaire, refreshApplicant, order]
|
|
1016
1016
|
);
|
|
1017
1017
|
const applyAutoFix = useCallback(
|
|
1018
1018
|
async (applicationId, answerId) => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@smvtech/x-flux",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.13",
|
|
4
4
|
"description": "x-flux - A powerful React package for managing effective document collection flows, visa questionnaires, travellers, and applications",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|