pat-shared-components 1.3.1-beta.34 → 1.3.1-beta.36
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/pat-shared-components.js +1 -1
- package/dist/pat-shared-components.mjs +42 -40
- package/dist/pat-shared-components.mjs.map +1 -1
- package/dist/src/components/TestResult/Desktop/TestResultDetailDesktop.vue.js +1 -1
- package/dist/src/components/TestResult/Desktop/TestResultDetailDesktop.vue.js.map +1 -1
- package/dist/src/components/TestResult/Desktop/TestResultDetailDesktop.vue.mjs +89 -81
- package/dist/src/components/TestResult/Desktop/TestResultDetailDesktop.vue.mjs.map +1 -1
- package/dist/src/components/TestResult/Mobile/ResultTab/TestResultDetail.vue.js +1 -1
- package/dist/src/components/TestResult/Mobile/ResultTab/TestResultDetail.vue.js.map +1 -1
- package/dist/src/components/TestResult/Mobile/ResultTab/TestResultDetail.vue.mjs +86 -78
- package/dist/src/components/TestResult/Mobile/ResultTab/TestResultDetail.vue.mjs.map +1 -1
- package/dist/src/components/TestResult/Shared/BookAppointment.vue.js +1 -1
- package/dist/src/components/TestResult/Shared/BookAppointment.vue.js.map +1 -1
- package/dist/src/components/TestResult/Shared/BookAppointment.vue.mjs +48 -23
- package/dist/src/components/TestResult/Shared/BookAppointment.vue.mjs.map +1 -1
- package/dist/src/components/TestResult/Shared/ResultInsightCards.vue.js +2 -0
- package/dist/src/components/TestResult/Shared/ResultInsightCards.vue.js.map +1 -0
- package/dist/src/components/TestResult/Shared/ResultInsightCards.vue.mjs +30 -0
- package/dist/src/components/TestResult/Shared/ResultInsightCards.vue.mjs.map +1 -0
- package/dist/src/components/TestResult/Shared/ResultInsightCards.vue2.js +2 -0
- package/dist/src/components/TestResult/Shared/ResultInsightCards.vue2.js.map +1 -0
- package/dist/src/components/TestResult/Shared/ResultInsightCards.vue2.mjs +5 -0
- package/dist/src/components/TestResult/Shared/ResultInsightCards.vue2.mjs.map +1 -0
- package/dist/src/components/TestResult/Shared/ResultReadyV2.vue.js +1 -1
- package/dist/src/components/TestResult/Shared/ResultReadyV2.vue.mjs +2 -2
- package/dist/src/components/TestResult/Shared/ResultReadyV2.vue2.js +1 -1
- package/dist/src/components/TestResult/Shared/ResultReadyV2.vue2.js.map +1 -1
- package/dist/src/components/TestResult/Shared/ResultReadyV2.vue2.mjs +184 -108
- package/dist/src/components/TestResult/Shared/ResultReadyV2.vue2.mjs.map +1 -1
- package/dist/src/components/TestResult/Shared/ResultReport.vue.js +2 -0
- package/dist/src/components/TestResult/Shared/ResultReport.vue.js.map +1 -0
- package/dist/src/components/TestResult/Shared/ResultReport.vue.mjs +53 -0
- package/dist/src/components/TestResult/Shared/ResultReport.vue.mjs.map +1 -0
- package/dist/src/components/TestResult/Shared/ResultReport.vue2.js +2 -0
- package/dist/src/components/TestResult/Shared/ResultReport.vue2.js.map +1 -0
- package/dist/src/components/TestResult/Shared/ResultReport.vue2.mjs +5 -0
- package/dist/src/components/TestResult/Shared/ResultReport.vue2.mjs.map +1 -0
- package/dist/src/components/TestResult/Shared/TakeSurvey.vue.js.map +1 -1
- package/dist/src/components/TestResult/Shared/TakeSurvey.vue.mjs +3 -1
- package/dist/src/components/TestResult/Shared/TakeSurvey.vue.mjs.map +1 -1
- package/dist/src/helpers/DateHelper.js +1 -1
- package/dist/src/helpers/DateHelper.js.map +1 -1
- package/dist/src/helpers/DateHelper.mjs +42 -17
- package/dist/src/helpers/DateHelper.mjs.map +1 -1
- package/dist/src/locales/en.json.js +1 -1
- package/dist/src/locales/en.json.mjs +7 -0
- package/dist/src/locales/en.json.mjs.map +1 -1
- package/dist/src/locales/vi.json.js +1 -1
- package/dist/src/locales/vi.json.mjs +8 -1
- package/dist/src/locales/vi.json.mjs.map +1 -1
- package/dist/style.css +1 -1
- package/dist/types/components/TestResult/Desktop/TestResultDetailDesktop.vue.d.ts +6 -1
- package/dist/types/components/TestResult/Mobile/ResultTab/TestResultDetail.vue.d.ts +6 -1
- package/dist/types/components/TestResult/Shared/BookAppointment.vue.d.ts +28 -2
- package/dist/types/components/TestResult/Shared/ResultInsightCards.vue.d.ts +31 -0
- package/dist/types/components/TestResult/Shared/ResultReport.vue.d.ts +30 -0
- package/dist/types/components/TestResult/index.d.ts +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TakeSurvey.vue.js","sources":["../../../../../src/components/TestResult/Shared/TakeSurvey.vue?vue&type=script&setup=true&lang.ts"],"sourcesContent":["import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, toDisplayString as _toDisplayString, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, resolveDynamicComponent as _resolveDynamicComponent, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createVNode as _createVNode, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, Fragment as _Fragment } from \"vue\"\n\nconst _hoisted_1 = [\"aria-label\"]\nconst _hoisted_2 = { class: \"psc-survey-modal psc-survey-modal__content\" }\nconst _hoisted_3 = /*#__PURE__*/_createElementVNode(\"i\", { class: \"dgic-close-round psc-text-2xl psc-text-black/40\" }, null, -1)\nconst _hoisted_4 = [\n _hoisted_3\n]\nconst _hoisted_5 = {\n key: 0,\n class: \"psc-survey-modal__loading\"\n}\nconst _hoisted_6 = { class: \"psc-animate-spin\" }\nconst _hoisted_7 = {\n key: 1,\n class: \"psc-survey-modal__loading\"\n}\nconst _hoisted_8 = { class: \"psc-px-6 psc-text-center psc-text-sm psc-text-black/60\" }\nconst _hoisted_9 = [\"src\", \"title\"]\n\nimport { computed, onBeforeUnmount, onMounted, ref } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport { BIcon, BModal } from 'pat-design-system';\nimport { SURVEY_BASE_URL } from '@/constants/Common';\nimport { mintSurveyEmbedKey, surveyAppOrigin } from '@/helpers/SurveyHelper';\n\n/**\n * Attribution context minted into an opaque `?key=` (never put PII in the iframe URL).\n * Common keys: patient_number, order_id, appointment_code, source, template_type, result_status.\n */\nexport type SurveyContext = Record<string, string>;\n\n/**\n * Props\n */\nexport interface Props {\n surveySlug: string;\n baseUrl?: string;\n /** Custom button label; falls back to `psc.test_result_take_survey_button`. */\n text?: string;\n /** `pill` = compact inline; `bar` = full-width section button. */\n variant?: 'pill' | 'bar';\n /** @deprecated Use `context.patient_number` instead. */\n userId?: string;\n context?: SurveyContext;\n}\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'TakeSurvey',\n props: {\n surveySlug: null,\n baseUrl: { default: SURVEY_BASE_URL },\n text: null,\n variant: { default: 'pill' },\n userId: null,\n context: null\n },\n setup(__props: any) {\n\nconst props = __props as { surveySlug: string, baseUrl: string, text?: string, variant: 'pill' | 'bar', userId?: string, context?: SurveyContext };\n\n\n\nconst { t } = useI18n();\n\nconst buttonText = computed(\n () => props.text ?? t('psc.test_result_take_survey_button')\n);\n\n/**\n * Data\n */\nconst open = ref(false);\nconst iframeKey = ref(0);\nconst iframeLoading = ref(true);\nconst mintedKey = ref<string | null>(null);\nconst mintFailed = ref(false);\n\nconst surveyContext = computed<SurveyContext>(() => {\n const merged: SurveyContext = { ...(props.context ?? {}) };\n if (props.userId && !merged.patient_number) {\n merged.patient_number = props.userId;\n }\n return merged;\n});\n\nconst surveyUrl = computed(() => {\n if (!mintedKey.value) return '';\n const base = props.baseUrl.replace(/\\/$/, '');\n return `${base}/${encodeURIComponent(props.surveySlug)}?key=${encodeURIComponent(mintedKey.value)}`;\n});\n\n/**\n * Methods\n */\nconst openSurvey = async () => {\n open.value = true;\n iframeLoading.value = true;\n mintFailed.value = false;\n mintedKey.value = null;\n try {\n mintedKey.value = await mintSurveyEmbedKey(\n props.baseUrl,\n props.surveySlug,\n surveyContext.value\n );\n iframeKey.value += 1;\n } catch {\n mintFailed.value = true;\n iframeLoading.value = false;\n }\n};\nconst closeSurvey = () => {\n open.value = false;\n mintedKey.value = null;\n mintFailed.value = false;\n};\nconst trustedSurveyOrigin = computed(() => surveyAppOrigin(props.baseUrl));\nconst onSurveyMessage = (event: MessageEvent) => {\n if (!open.value) return;\n if (event.origin !== trustedSurveyOrigin.value) return;\n const data = event.data;\n if (\n typeof data !== 'object' ||\n data === null ||\n (data as { type?: string }).type !== 'survey:close'\n ) {\n return;\n }\n closeSurvey();\n};\nconst onIframeLoad = () => {\n iframeLoading.value = false;\n};\n\nonMounted(() => {\n window.addEventListener('message', onSurveyMessage);\n});\nonBeforeUnmount(() => {\n window.removeEventListener('message', onSurveyMessage);\n});\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n (_openBlock(), _createBlock(_resolveDynamicComponent(__props.variant === 'bar' ? 'div' : 'span'), {\n class: _normalizeClass(__props.variant === 'bar' ? 'psc-w-full' : 'psc-inline-flex psc-shrink-0')\n }, {\n default: _withCtx(() => [\n _createElementVNode(\"button\", {\n type: \"button\",\n class: _normalizeClass([\n 'psc-survey-trigger',\n { 'psc-survey-trigger--bar': __props.variant === 'bar' },\n ]),\n \"aria-label\": _unref(buttonText),\n onClick: openSurvey\n }, _toDisplayString(_unref(buttonText)), 11, _hoisted_1)\n ]),\n _: 1\n }, 8, [\"class\"])),\n _createVNode(_unref(BModal), {\n modelValue: open.value,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((open).value = $event)),\n class: \"psc-survey-modal\",\n fullscreen: \"\"\n }, {\n default: _withCtx(() => [\n _createElementVNode(\"div\", _hoisted_2, [\n _createElementVNode(\"button\", {\n type: \"button\",\n class: \"psc-survey-modal__close\",\n onClick: closeSurvey\n }, _hoisted_4),\n (iframeLoading.value)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_5, [\n _createElementVNode(\"div\", _hoisted_6, [\n _createVNode(_unref(BIcon), {\n icon: \"dgic-spinner-8\",\n class: \"psc-text-4xl\"\n })\n ])\n ]))\n : (mintFailed.value)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [\n _createElementVNode(\"p\", _hoisted_8, _toDisplayString(_ctx.$t('psc.test_result_take_survey_error')), 1)\n ]))\n : _createCommentVNode(\"\", true),\n (open.value && mintedKey.value)\n ? (_openBlock(), _createElementBlock(\"iframe\", {\n key: iframeKey.value,\n src: _unref(surveyUrl),\n class: \"psc-survey-modal__iframe\",\n title: _ctx.$t('psc.test_result_take_survey_button'),\n onLoad: onIframeLoad\n }, null, 40, _hoisted_9))\n : _createCommentVNode(\"\", true)\n ])\n ]),\n _: 1\n }, 8, [\"modelValue\"])\n ], 64))\n}\n}\n\n})"],"names":["_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_sfc_main","_defineComponent","SURVEY_BASE_URL","__props","props","t","useI18n","buttonText","computed","_a","open","ref","iframeKey","iframeLoading","mintedKey","mintFailed","surveyContext","merged","__spreadValues","surveyUrl","openSurvey","mintSurveyEmbedKey","e","closeSurvey","trustedSurveyOrigin","surveyAppOrigin","onSurveyMessage","event","data","onIframeLoad","onMounted","onBeforeUnmount","_ctx","_cache","_openBlock","_createElementBlock","_Fragment","_createBlock","_resolveDynamicComponent","_normalizeClass","_withCtx","_createElementVNode","_unref","_toDisplayString","_createVNode","BModal","$event","BIcon","_createCommentVNode"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TakeSurvey.vue.js","sources":["../../../../../src/components/TestResult/Shared/TakeSurvey.vue?vue&type=script&setup=true&lang.ts"],"sourcesContent":["import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, toDisplayString as _toDisplayString, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, resolveDynamicComponent as _resolveDynamicComponent, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createVNode as _createVNode, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, Fragment as _Fragment } from \"vue\"\n\nconst _hoisted_1 = [\"aria-label\"]\nconst _hoisted_2 = { class: \"psc-survey-modal psc-survey-modal__content\" }\nconst _hoisted_3 = /*#__PURE__*/_createElementVNode(\"i\", { class: \"dgic-close-round psc-text-2xl psc-text-black/40\" }, null, -1)\nconst _hoisted_4 = [\n _hoisted_3\n]\nconst _hoisted_5 = {\n key: 0,\n class: \"psc-survey-modal__loading\"\n}\nconst _hoisted_6 = { class: \"psc-animate-spin\" }\nconst _hoisted_7 = {\n key: 1,\n class: \"psc-survey-modal__loading\"\n}\nconst _hoisted_8 = { class: \"psc-px-6 psc-text-center psc-text-sm psc-text-black/60\" }\nconst _hoisted_9 = [\"src\", \"title\"]\n\nimport { computed, onBeforeUnmount, onMounted, ref } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport { BIcon, BModal } from 'pat-design-system';\nimport { SURVEY_BASE_URL } from '@/constants/Common';\nimport { mintSurveyEmbedKey, surveyAppOrigin } from '@/helpers/SurveyHelper';\n\n/**\n * Attribution context minted into an opaque `?key=` (never put PII in the iframe URL).\n * Common keys: patient_number, order_id, appointment_code, source, template_type, result_status.\n */\nexport type SurveyContext = Record<string, string>;\n\n/**\n * Props\n */\nexport interface Props {\n surveySlug: string;\n baseUrl?: string;\n /** Custom button label; falls back to `psc.test_result_take_survey_button`. */\n text?: string;\n /** `pill` = compact inline; `bar` = full-width section button. */\n variant?: 'pill' | 'bar';\n /** @deprecated Use `context.patient_number` instead. */\n userId?: string;\n context?: SurveyContext;\n}\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'TakeSurvey',\n props: {\n surveySlug: null,\n baseUrl: { default: SURVEY_BASE_URL },\n text: null,\n variant: { default: 'pill' },\n userId: null,\n context: null\n },\n setup(__props: any) {\n\nconst props = __props as { surveySlug: string, baseUrl: string, text?: string, variant: 'pill' | 'bar', userId?: string, context?: SurveyContext };\n\n\n\nconst { t } = useI18n();\n\nconst buttonText = computed(\n () => props.text ?? t('psc.test_result_take_survey_button')\n);\n\n/**\n * Data\n */\nconst open = ref(false);\nconst iframeKey = ref(0);\nconst iframeLoading = ref(true);\nconst mintedKey = ref<string | null>(null);\nconst mintFailed = ref(false);\n\nconst surveyContext = computed<SurveyContext>(() => {\n const merged: SurveyContext = { ...(props.context ?? {}) };\n if (props.userId && !merged.patient_number) {\n merged.patient_number = props.userId;\n }\n return merged;\n});\n\nconst surveyUrl = computed(() => {\n if (!mintedKey.value) return '';\n const base = props.baseUrl.replace(/\\/$/, '');\n return `${base}/${encodeURIComponent(\n props.surveySlug\n )}?key=${encodeURIComponent(mintedKey.value)}`;\n});\n\n/**\n * Methods\n */\nconst openSurvey = async () => {\n open.value = true;\n iframeLoading.value = true;\n mintFailed.value = false;\n mintedKey.value = null;\n try {\n mintedKey.value = await mintSurveyEmbedKey(\n props.baseUrl,\n props.surveySlug,\n surveyContext.value\n );\n iframeKey.value += 1;\n } catch {\n mintFailed.value = true;\n iframeLoading.value = false;\n }\n};\nconst closeSurvey = () => {\n open.value = false;\n mintedKey.value = null;\n mintFailed.value = false;\n};\nconst trustedSurveyOrigin = computed(() => surveyAppOrigin(props.baseUrl));\nconst onSurveyMessage = (event: MessageEvent) => {\n if (!open.value) return;\n if (event.origin !== trustedSurveyOrigin.value) return;\n const data = event.data;\n if (\n typeof data !== 'object' ||\n data === null ||\n (data as { type?: string }).type !== 'survey:close'\n ) {\n return;\n }\n closeSurvey();\n};\nconst onIframeLoad = () => {\n iframeLoading.value = false;\n};\n\nonMounted(() => {\n window.addEventListener('message', onSurveyMessage);\n});\nonBeforeUnmount(() => {\n window.removeEventListener('message', onSurveyMessage);\n});\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n (_openBlock(), _createBlock(_resolveDynamicComponent(__props.variant === 'bar' ? 'div' : 'span'), {\n class: _normalizeClass(__props.variant === 'bar' ? 'psc-w-full' : 'psc-inline-flex psc-shrink-0')\n }, {\n default: _withCtx(() => [\n _createElementVNode(\"button\", {\n type: \"button\",\n class: _normalizeClass([\n 'psc-survey-trigger',\n { 'psc-survey-trigger--bar': __props.variant === 'bar' },\n ]),\n \"aria-label\": _unref(buttonText),\n onClick: openSurvey\n }, _toDisplayString(_unref(buttonText)), 11, _hoisted_1)\n ]),\n _: 1\n }, 8, [\"class\"])),\n _createVNode(_unref(BModal), {\n modelValue: open.value,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((open).value = $event)),\n class: \"psc-survey-modal\",\n fullscreen: \"\"\n }, {\n default: _withCtx(() => [\n _createElementVNode(\"div\", _hoisted_2, [\n _createElementVNode(\"button\", {\n type: \"button\",\n class: \"psc-survey-modal__close\",\n onClick: closeSurvey\n }, _hoisted_4),\n (iframeLoading.value)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_5, [\n _createElementVNode(\"div\", _hoisted_6, [\n _createVNode(_unref(BIcon), {\n icon: \"dgic-spinner-8\",\n class: \"psc-text-4xl\"\n })\n ])\n ]))\n : (mintFailed.value)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [\n _createElementVNode(\"p\", _hoisted_8, _toDisplayString(_ctx.$t('psc.test_result_take_survey_error')), 1)\n ]))\n : _createCommentVNode(\"\", true),\n (open.value && mintedKey.value)\n ? (_openBlock(), _createElementBlock(\"iframe\", {\n key: iframeKey.value,\n src: _unref(surveyUrl),\n class: \"psc-survey-modal__iframe\",\n title: _ctx.$t('psc.test_result_take_survey_button'),\n onLoad: onIframeLoad\n }, null, 40, _hoisted_9))\n : _createCommentVNode(\"\", true)\n ])\n ]),\n _: 1\n }, 8, [\"modelValue\"])\n ], 64))\n}\n}\n\n})"],"names":["_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_sfc_main","_defineComponent","SURVEY_BASE_URL","__props","props","t","useI18n","buttonText","computed","_a","open","ref","iframeKey","iframeLoading","mintedKey","mintFailed","surveyContext","merged","__spreadValues","surveyUrl","openSurvey","mintSurveyEmbedKey","e","closeSurvey","trustedSurveyOrigin","surveyAppOrigin","onSurveyMessage","event","data","onIframeLoad","onMounted","onBeforeUnmount","_ctx","_cache","_openBlock","_createElementBlock","_Fragment","_createBlock","_resolveDynamicComponent","_normalizeClass","_withCtx","_createElementVNode","_unref","_toDisplayString","_createVNode","BModal","$event","BIcon","_createCommentVNode"],"mappings":"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"}
|
|
@@ -42,7 +42,9 @@ const J = ["aria-label"], P = { class: "psc-survey-modal psc-survey-modal__conte
|
|
|
42
42
|
var a;
|
|
43
43
|
const t = k({}, (a = e.context) != null ? a : {});
|
|
44
44
|
return e.userId && !t.patient_number && (t.patient_number = e.userId), t;
|
|
45
|
-
}), B = p(() => o.value ? `${e.baseUrl.replace(/\/$/, "")}/${encodeURIComponent(
|
|
45
|
+
}), B = p(() => o.value ? `${e.baseUrl.replace(/\/$/, "")}/${encodeURIComponent(
|
|
46
|
+
e.surveySlug
|
|
47
|
+
)}?key=${encodeURIComponent(o.value)}` : ""), E = async () => {
|
|
46
48
|
n.value = !0, d.value = !0, v.value = !1, o.value = null;
|
|
47
49
|
try {
|
|
48
50
|
o.value = await H(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TakeSurvey.vue.mjs","sources":["../../../../../src/components/TestResult/Shared/TakeSurvey.vue?vue&type=script&setup=true&lang.ts"],"sourcesContent":["import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, toDisplayString as _toDisplayString, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, resolveDynamicComponent as _resolveDynamicComponent, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createVNode as _createVNode, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, Fragment as _Fragment } from \"vue\"\n\nconst _hoisted_1 = [\"aria-label\"]\nconst _hoisted_2 = { class: \"psc-survey-modal psc-survey-modal__content\" }\nconst _hoisted_3 = /*#__PURE__*/_createElementVNode(\"i\", { class: \"dgic-close-round psc-text-2xl psc-text-black/40\" }, null, -1)\nconst _hoisted_4 = [\n _hoisted_3\n]\nconst _hoisted_5 = {\n key: 0,\n class: \"psc-survey-modal__loading\"\n}\nconst _hoisted_6 = { class: \"psc-animate-spin\" }\nconst _hoisted_7 = {\n key: 1,\n class: \"psc-survey-modal__loading\"\n}\nconst _hoisted_8 = { class: \"psc-px-6 psc-text-center psc-text-sm psc-text-black/60\" }\nconst _hoisted_9 = [\"src\", \"title\"]\n\nimport { computed, onBeforeUnmount, onMounted, ref } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport { BIcon, BModal } from 'pat-design-system';\nimport { SURVEY_BASE_URL } from '@/constants/Common';\nimport { mintSurveyEmbedKey, surveyAppOrigin } from '@/helpers/SurveyHelper';\n\n/**\n * Attribution context minted into an opaque `?key=` (never put PII in the iframe URL).\n * Common keys: patient_number, order_id, appointment_code, source, template_type, result_status.\n */\nexport type SurveyContext = Record<string, string>;\n\n/**\n * Props\n */\nexport interface Props {\n surveySlug: string;\n baseUrl?: string;\n /** Custom button label; falls back to `psc.test_result_take_survey_button`. */\n text?: string;\n /** `pill` = compact inline; `bar` = full-width section button. */\n variant?: 'pill' | 'bar';\n /** @deprecated Use `context.patient_number` instead. */\n userId?: string;\n context?: SurveyContext;\n}\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'TakeSurvey',\n props: {\n surveySlug: null,\n baseUrl: { default: SURVEY_BASE_URL },\n text: null,\n variant: { default: 'pill' },\n userId: null,\n context: null\n },\n setup(__props: any) {\n\nconst props = __props as { surveySlug: string, baseUrl: string, text?: string, variant: 'pill' | 'bar', userId?: string, context?: SurveyContext };\n\n\n\nconst { t } = useI18n();\n\nconst buttonText = computed(\n () => props.text ?? t('psc.test_result_take_survey_button')\n);\n\n/**\n * Data\n */\nconst open = ref(false);\nconst iframeKey = ref(0);\nconst iframeLoading = ref(true);\nconst mintedKey = ref<string | null>(null);\nconst mintFailed = ref(false);\n\nconst surveyContext = computed<SurveyContext>(() => {\n const merged: SurveyContext = { ...(props.context ?? {}) };\n if (props.userId && !merged.patient_number) {\n merged.patient_number = props.userId;\n }\n return merged;\n});\n\nconst surveyUrl = computed(() => {\n if (!mintedKey.value) return '';\n const base = props.baseUrl.replace(/\\/$/, '');\n return `${base}/${encodeURIComponent(props.surveySlug)}?key=${encodeURIComponent(mintedKey.value)}`;\n});\n\n/**\n * Methods\n */\nconst openSurvey = async () => {\n open.value = true;\n iframeLoading.value = true;\n mintFailed.value = false;\n mintedKey.value = null;\n try {\n mintedKey.value = await mintSurveyEmbedKey(\n props.baseUrl,\n props.surveySlug,\n surveyContext.value\n );\n iframeKey.value += 1;\n } catch {\n mintFailed.value = true;\n iframeLoading.value = false;\n }\n};\nconst closeSurvey = () => {\n open.value = false;\n mintedKey.value = null;\n mintFailed.value = false;\n};\nconst trustedSurveyOrigin = computed(() => surveyAppOrigin(props.baseUrl));\nconst onSurveyMessage = (event: MessageEvent) => {\n if (!open.value) return;\n if (event.origin !== trustedSurveyOrigin.value) return;\n const data = event.data;\n if (\n typeof data !== 'object' ||\n data === null ||\n (data as { type?: string }).type !== 'survey:close'\n ) {\n return;\n }\n closeSurvey();\n};\nconst onIframeLoad = () => {\n iframeLoading.value = false;\n};\n\nonMounted(() => {\n window.addEventListener('message', onSurveyMessage);\n});\nonBeforeUnmount(() => {\n window.removeEventListener('message', onSurveyMessage);\n});\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n (_openBlock(), _createBlock(_resolveDynamicComponent(__props.variant === 'bar' ? 'div' : 'span'), {\n class: _normalizeClass(__props.variant === 'bar' ? 'psc-w-full' : 'psc-inline-flex psc-shrink-0')\n }, {\n default: _withCtx(() => [\n _createElementVNode(\"button\", {\n type: \"button\",\n class: _normalizeClass([\n 'psc-survey-trigger',\n { 'psc-survey-trigger--bar': __props.variant === 'bar' },\n ]),\n \"aria-label\": _unref(buttonText),\n onClick: openSurvey\n }, _toDisplayString(_unref(buttonText)), 11, _hoisted_1)\n ]),\n _: 1\n }, 8, [\"class\"])),\n _createVNode(_unref(BModal), {\n modelValue: open.value,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((open).value = $event)),\n class: \"psc-survey-modal\",\n fullscreen: \"\"\n }, {\n default: _withCtx(() => [\n _createElementVNode(\"div\", _hoisted_2, [\n _createElementVNode(\"button\", {\n type: \"button\",\n class: \"psc-survey-modal__close\",\n onClick: closeSurvey\n }, _hoisted_4),\n (iframeLoading.value)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_5, [\n _createElementVNode(\"div\", _hoisted_6, [\n _createVNode(_unref(BIcon), {\n icon: \"dgic-spinner-8\",\n class: \"psc-text-4xl\"\n })\n ])\n ]))\n : (mintFailed.value)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [\n _createElementVNode(\"p\", _hoisted_8, _toDisplayString(_ctx.$t('psc.test_result_take_survey_error')), 1)\n ]))\n : _createCommentVNode(\"\", true),\n (open.value && mintedKey.value)\n ? (_openBlock(), _createElementBlock(\"iframe\", {\n key: iframeKey.value,\n src: _unref(surveyUrl),\n class: \"psc-survey-modal__iframe\",\n title: _ctx.$t('psc.test_result_take_survey_button'),\n onLoad: onIframeLoad\n }, null, 40, _hoisted_9))\n : _createCommentVNode(\"\", true)\n ])\n ]),\n _: 1\n }, 8, [\"modelValue\"])\n ], 64))\n}\n}\n\n})"],"names":["_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_sfc_main","_defineComponent","SURVEY_BASE_URL","__props","props","t","useI18n","buttonText","computed","_a","open","ref","iframeKey","iframeLoading","mintedKey","mintFailed","surveyContext","merged","__spreadValues","surveyUrl","openSurvey","mintSurveyEmbedKey","e","closeSurvey","trustedSurveyOrigin","surveyAppOrigin","onSurveyMessage","event","data","onIframeLoad","onMounted","onBeforeUnmount","_ctx","_cache","_openBlock","_createElementBlock","_Fragment","_createBlock","_resolveDynamicComponent","_normalizeClass","_withCtx","_createElementVNode","_unref","_toDisplayString","_createVNode","BModal","$event","BIcon","_createCommentVNode"],"mappings":";;;;;;;;;;;;;;;;AAGA,MAAMA,IAAa,CAAC,YAAY,GAC1BC,IAAa,EAAE,OAAO,gDACtBC,sBAA8C,KAAK,EAAE,OAAO,qDAAqD,MAAM,EAAE,GACzHC,IAAa;AAAA,EACjBD;AACF,GACME,IAAa;AAAA,EACjB,KAAK;AAAA,EACL,OAAO;AACT,GACMC,IAAa,EAAE,OAAO,sBACtBC,KAAa;AAAA,EACjB,KAAK;AAAA,EACL,OAAO;AACT,GACMC,KAAa,EAAE,OAAO,4DACtBC,KAAa,CAAC,OAAO,OAAO,GA6BNC,KAAiBC,gBAAAA,EAAA;AAAA,EAC3C,QAAQ;AAAA,EACR,OAAO;AAAA,IACL,YAAY;AAAA,IACZ,SAAS,EAAE,SAASC,EAAgB;AAAA,IACpC,MAAM;AAAA,IACN,SAAS,EAAE,SAAS,OAAO;AAAA,IAC3B,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,MAAMC,GAAc;AAEtB,UAAMC,IAAQD,GAIR,EAAE,GAAAE,MAAMC,KAERC,IAAaC;AAAA,MACjB,MAAA;;AAAM,gBAAAC,IAAAL,EAAM,SAAN,OAAAK,IAAcJ,EAAE,oCAAoC;AAAA;AAAA,IAAA,GAMtDK,IAAOC,EAAI,EAAK,GAChBC,IAAYD,EAAI,CAAC,GACjBE,IAAgBF,EAAI,EAAI,GACxBG,IAAYH,EAAmB,IAAI,GACnCI,IAAaJ,EAAI,EAAK,GAEtBK,IAAgBR,EAAwB,MAAM;;AAClD,YAAMS,IAAwBC,EAAA,KAAMT,IAAAL,EAAM,YAAN,OAAAK,IAAiB,CAAI;AACzD,aAAIL,EAAM,UAAU,CAACa,EAAO,mBAC1BA,EAAO,iBAAiBb,EAAM,SAEzBa;AAAA,IAAA,CACR,GAEKE,IAAYX,EAAS,MACpBM,EAAU,QAER,GADMV,EAAM,QAAQ,QAAQ,OAAO,EAAE,KAC1B,mBAAmBA,EAAM,UAAU,SAAS,mBAAmBU,EAAU,KAAK,MAFnE,EAG9B,GAKKM,IAAa,YAAY;AAC7B,MAAAV,EAAK,QAAQ,IACbG,EAAc,QAAQ,IACtBE,EAAW,QAAQ,IACnBD,EAAU,QAAQ;AACd,UAAA;AACF,QAAAA,EAAU,QAAQ,MAAMO;AAAA,UACtBjB,EAAM;AAAA,UACNA,EAAM;AAAA,UACNY,EAAc;AAAA,QAAA,GAEhBJ,EAAU,SAAS;AAAA,MAAA,SACnBU,GAAA;AACA,QAAAP,EAAW,QAAQ,IACnBF,EAAc,QAAQ;AAAA,MACxB;AAAA,IAAA,GAEIU,IAAc,MAAM;AACxB,MAAAb,EAAK,QAAQ,IACbI,EAAU,QAAQ,MAClBC,EAAW,QAAQ;AAAA,IAAA,GAEfS,IAAsBhB,EAAS,MAAMiB,EAAgBrB,EAAM,OAAO,CAAC,GACnEsB,IAAkB,CAACC,MAAwB;AAE3C,UADA,CAACjB,EAAK,SACNiB,EAAM,WAAWH,EAAoB;AAAO;AAChD,YAAMI,IAAOD,EAAM;AACnB,MACE,OAAOC,KAAS,YAChBA,MAAS,QACRA,EAA2B,SAAS,kBAI3BL;IAAA,GAERM,IAAe,MAAM;AACzB,MAAAhB,EAAc,QAAQ;AAAA,IAAA;AAGxB,WAAAiB,EAAU,MAAM;AACP,aAAA,iBAAiB,WAAWJ,CAAe;AAAA,IAAA,CACnD,GACDK,EAAgB,MAAM;AACb,aAAA,oBAAoB,WAAWL,CAAe;AAAA,IAAA,CACtD,GAEM,CAACM,GAAUC,OACRC,EAAW,GAAGC,EAAoBC,GAAW,MAAM;AAAA,OACxDF,KAAcG,EAAaC,EAAyBnC,EAAQ,YAAY,QAAQ,QAAQ,MAAM,GAAG;AAAA,QAChG,OAAOoC,EAAgBpC,EAAQ,YAAY,QAAQ,eAAe,8BAA8B;AAAA,MAAA,GAC/F;AAAA,QACD,SAASqC,EAAS,MAAM;AAAA,UACtBC,EAAoB,UAAU;AAAA,YAC5B,MAAM;AAAA,YACN,OAAOF,EAAgB;AAAA,cACzB;AAAA,cACA,EAAE,2BAA2BpC,EAAQ,YAAY,MAAM;AAAA,YAAA,CACxD;AAAA,YACG,cAAcuC,EAAOnC,CAAU;AAAA,YAC/B,SAASa;AAAA,UAAA,GACRuB,EAAiBD,EAAOnC,CAAU,CAAC,GAAG,IAAIhB,CAAU;AAAA,QAAA,CACxD;AAAA,QACD,GAAG;AAAA,MAAA,GACF,GAAG,CAAC,OAAO,CAAC;AAAA,MACfqD,EAAaF,EAAOG,CAAM,GAAG;AAAA,QAC3B,YAAYnC,EAAK;AAAA,QACjB,uBAAuBuB,EAAO,CAAC,MAAMA,EAAO,CAAC,IAAI,CAACa,MAAkBpC,EAAM,QAAQoC;AAAA,QAClF,OAAO;AAAA,QACP,YAAY;AAAA,MAAA,GACX;AAAA,QACD,SAASN,EAAS,MAAM;AAAA,UACtBC,EAAoB,OAAOjD,GAAY;AAAA,YACrCiD,EAAoB,UAAU;AAAA,cAC5B,MAAM;AAAA,cACN,OAAO;AAAA,cACP,SAASlB;AAAA,eACR7B,CAAU;AAAA,YACZmB,EAAc,SACVqB,EAAA,GAAcC,EAAoB,OAAOxC,GAAY;AAAA,cACpD8C,EAAoB,OAAO7C,GAAY;AAAA,gBACrCgD,EAAaF,EAAOK,CAAK,GAAG;AAAA,kBAC1B,MAAM;AAAA,kBACN,OAAO;AAAA,gBAAA,CACR;AAAA,cAAA,CACF;AAAA,YAAA,CACF,KACAhC,EAAW,SACTmB,EAAc,GAAAC,EAAoB,OAAOtC,IAAY;AAAA,cACpD4C,EAAoB,KAAK3C,IAAY6C,EAAiBX,EAAK,GAAG,mCAAmC,CAAC,GAAG,CAAC;AAAA,YAAA,CACvG,KACDgB,EAAoB,IAAI,EAAI;AAAA,YACjCtC,EAAK,SAASI,EAAU,SACpBoB,EAAW,GAAGC,EAAoB,UAAU;AAAA,cAC3C,KAAKvB,EAAU;AAAA,cACf,KAAK8B,EAAOvB,CAAS;AAAA,cACrB,OAAO;AAAA,cACP,OAAOa,EAAK,GAAG,oCAAoC;AAAA,cACnD,QAAQH;AAAA,YAAA,GACP,MAAM,IAAI9B,EAAU,KACvBiD,EAAoB,IAAI,EAAI;AAAA,UAAA,CACjC;AAAA,QAAA,CACF;AAAA,QACD,GAAG;AAAA,MAAA,GACF,GAAG,CAAC,YAAY,CAAC;AAAA,OACnB,EAAE;AAAA,EAEP;AAEA,CAAC;"}
|
|
1
|
+
{"version":3,"file":"TakeSurvey.vue.mjs","sources":["../../../../../src/components/TestResult/Shared/TakeSurvey.vue?vue&type=script&setup=true&lang.ts"],"sourcesContent":["import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, toDisplayString as _toDisplayString, normalizeClass as _normalizeClass, createElementVNode as _createElementVNode, resolveDynamicComponent as _resolveDynamicComponent, withCtx as _withCtx, openBlock as _openBlock, createBlock as _createBlock, createVNode as _createVNode, createElementBlock as _createElementBlock, createCommentVNode as _createCommentVNode, Fragment as _Fragment } from \"vue\"\n\nconst _hoisted_1 = [\"aria-label\"]\nconst _hoisted_2 = { class: \"psc-survey-modal psc-survey-modal__content\" }\nconst _hoisted_3 = /*#__PURE__*/_createElementVNode(\"i\", { class: \"dgic-close-round psc-text-2xl psc-text-black/40\" }, null, -1)\nconst _hoisted_4 = [\n _hoisted_3\n]\nconst _hoisted_5 = {\n key: 0,\n class: \"psc-survey-modal__loading\"\n}\nconst _hoisted_6 = { class: \"psc-animate-spin\" }\nconst _hoisted_7 = {\n key: 1,\n class: \"psc-survey-modal__loading\"\n}\nconst _hoisted_8 = { class: \"psc-px-6 psc-text-center psc-text-sm psc-text-black/60\" }\nconst _hoisted_9 = [\"src\", \"title\"]\n\nimport { computed, onBeforeUnmount, onMounted, ref } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport { BIcon, BModal } from 'pat-design-system';\nimport { SURVEY_BASE_URL } from '@/constants/Common';\nimport { mintSurveyEmbedKey, surveyAppOrigin } from '@/helpers/SurveyHelper';\n\n/**\n * Attribution context minted into an opaque `?key=` (never put PII in the iframe URL).\n * Common keys: patient_number, order_id, appointment_code, source, template_type, result_status.\n */\nexport type SurveyContext = Record<string, string>;\n\n/**\n * Props\n */\nexport interface Props {\n surveySlug: string;\n baseUrl?: string;\n /** Custom button label; falls back to `psc.test_result_take_survey_button`. */\n text?: string;\n /** `pill` = compact inline; `bar` = full-width section button. */\n variant?: 'pill' | 'bar';\n /** @deprecated Use `context.patient_number` instead. */\n userId?: string;\n context?: SurveyContext;\n}\n\nexport default /*#__PURE__*/_defineComponent({\n __name: 'TakeSurvey',\n props: {\n surveySlug: null,\n baseUrl: { default: SURVEY_BASE_URL },\n text: null,\n variant: { default: 'pill' },\n userId: null,\n context: null\n },\n setup(__props: any) {\n\nconst props = __props as { surveySlug: string, baseUrl: string, text?: string, variant: 'pill' | 'bar', userId?: string, context?: SurveyContext };\n\n\n\nconst { t } = useI18n();\n\nconst buttonText = computed(\n () => props.text ?? t('psc.test_result_take_survey_button')\n);\n\n/**\n * Data\n */\nconst open = ref(false);\nconst iframeKey = ref(0);\nconst iframeLoading = ref(true);\nconst mintedKey = ref<string | null>(null);\nconst mintFailed = ref(false);\n\nconst surveyContext = computed<SurveyContext>(() => {\n const merged: SurveyContext = { ...(props.context ?? {}) };\n if (props.userId && !merged.patient_number) {\n merged.patient_number = props.userId;\n }\n return merged;\n});\n\nconst surveyUrl = computed(() => {\n if (!mintedKey.value) return '';\n const base = props.baseUrl.replace(/\\/$/, '');\n return `${base}/${encodeURIComponent(\n props.surveySlug\n )}?key=${encodeURIComponent(mintedKey.value)}`;\n});\n\n/**\n * Methods\n */\nconst openSurvey = async () => {\n open.value = true;\n iframeLoading.value = true;\n mintFailed.value = false;\n mintedKey.value = null;\n try {\n mintedKey.value = await mintSurveyEmbedKey(\n props.baseUrl,\n props.surveySlug,\n surveyContext.value\n );\n iframeKey.value += 1;\n } catch {\n mintFailed.value = true;\n iframeLoading.value = false;\n }\n};\nconst closeSurvey = () => {\n open.value = false;\n mintedKey.value = null;\n mintFailed.value = false;\n};\nconst trustedSurveyOrigin = computed(() => surveyAppOrigin(props.baseUrl));\nconst onSurveyMessage = (event: MessageEvent) => {\n if (!open.value) return;\n if (event.origin !== trustedSurveyOrigin.value) return;\n const data = event.data;\n if (\n typeof data !== 'object' ||\n data === null ||\n (data as { type?: string }).type !== 'survey:close'\n ) {\n return;\n }\n closeSurvey();\n};\nconst onIframeLoad = () => {\n iframeLoading.value = false;\n};\n\nonMounted(() => {\n window.addEventListener('message', onSurveyMessage);\n});\nonBeforeUnmount(() => {\n window.removeEventListener('message', onSurveyMessage);\n});\n\nreturn (_ctx: any,_cache: any) => {\n return (_openBlock(), _createElementBlock(_Fragment, null, [\n (_openBlock(), _createBlock(_resolveDynamicComponent(__props.variant === 'bar' ? 'div' : 'span'), {\n class: _normalizeClass(__props.variant === 'bar' ? 'psc-w-full' : 'psc-inline-flex psc-shrink-0')\n }, {\n default: _withCtx(() => [\n _createElementVNode(\"button\", {\n type: \"button\",\n class: _normalizeClass([\n 'psc-survey-trigger',\n { 'psc-survey-trigger--bar': __props.variant === 'bar' },\n ]),\n \"aria-label\": _unref(buttonText),\n onClick: openSurvey\n }, _toDisplayString(_unref(buttonText)), 11, _hoisted_1)\n ]),\n _: 1\n }, 8, [\"class\"])),\n _createVNode(_unref(BModal), {\n modelValue: open.value,\n \"onUpdate:modelValue\": _cache[0] || (_cache[0] = ($event: any) => ((open).value = $event)),\n class: \"psc-survey-modal\",\n fullscreen: \"\"\n }, {\n default: _withCtx(() => [\n _createElementVNode(\"div\", _hoisted_2, [\n _createElementVNode(\"button\", {\n type: \"button\",\n class: \"psc-survey-modal__close\",\n onClick: closeSurvey\n }, _hoisted_4),\n (iframeLoading.value)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_5, [\n _createElementVNode(\"div\", _hoisted_6, [\n _createVNode(_unref(BIcon), {\n icon: \"dgic-spinner-8\",\n class: \"psc-text-4xl\"\n })\n ])\n ]))\n : (mintFailed.value)\n ? (_openBlock(), _createElementBlock(\"div\", _hoisted_7, [\n _createElementVNode(\"p\", _hoisted_8, _toDisplayString(_ctx.$t('psc.test_result_take_survey_error')), 1)\n ]))\n : _createCommentVNode(\"\", true),\n (open.value && mintedKey.value)\n ? (_openBlock(), _createElementBlock(\"iframe\", {\n key: iframeKey.value,\n src: _unref(surveyUrl),\n class: \"psc-survey-modal__iframe\",\n title: _ctx.$t('psc.test_result_take_survey_button'),\n onLoad: onIframeLoad\n }, null, 40, _hoisted_9))\n : _createCommentVNode(\"\", true)\n ])\n ]),\n _: 1\n }, 8, [\"modelValue\"])\n ], 64))\n}\n}\n\n})"],"names":["_hoisted_1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_sfc_main","_defineComponent","SURVEY_BASE_URL","__props","props","t","useI18n","buttonText","computed","_a","open","ref","iframeKey","iframeLoading","mintedKey","mintFailed","surveyContext","merged","__spreadValues","surveyUrl","openSurvey","mintSurveyEmbedKey","e","closeSurvey","trustedSurveyOrigin","surveyAppOrigin","onSurveyMessage","event","data","onIframeLoad","onMounted","onBeforeUnmount","_ctx","_cache","_openBlock","_createElementBlock","_Fragment","_createBlock","_resolveDynamicComponent","_normalizeClass","_withCtx","_createElementVNode","_unref","_toDisplayString","_createVNode","BModal","$event","BIcon","_createCommentVNode"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function g(t){if(!t)return"";if(/^\d{2}\/\d{2}\/\d{4}$/.test(t))return t;const e=t.match(/^(\d{4})-(\d{2})-(\d{2})/);if(e){const[,r,n,o]=e;return`${o}/${n}/${r}`}return t}const l=t=>{if(!t)return t;let e;if(t instanceof Date)e=t;else{const n=t.match(/^(\d{4})-(\d{2})-(\d{2})(?:[T ](\d{2}):(\d{2})(?::(\d{2})(?:[.,](\d+))?)?(Z|[+-]\d{2}(?::?\d{2})?)?)?$/);if(!n)return t;const[,o,i,s,m,a,c,f,u]=n,$=Number((f||"").padEnd(3,"0").slice(0,3));if(u){const d=/^[+-]\d{2}$/.test(u)?`${u}:00`:u.replace(/^([+-]\d{2})(\d{2})$/,"$1:$2");e=new Date(`${o}-${i}-${s}T${m}:${a}:${c||"00"}.${String($).padStart(3,"0")}${d}`)}else if(e=new Date(Number(o),Number(i)-1,Number(s),Number(m||0),Number(a||0),Number(c||0),$),e.getFullYear()!==Number(o)||e.getMonth()!==Number(i)-1||e.getDate()!==Number(s)||e.getHours()!==Number(m||0)||e.getMinutes()!==Number(a||0)||e.getSeconds()!==Number(c||0))return t}if(Number.isNaN(e.getTime()))return t;const r=n=>String(n).padStart(2,"0");return`${r(e.getDate())}/${r(e.getMonth()+1)}/${String(e.getFullYear()).slice(-2)} ${r(e.getHours())}:${r(e.getMinutes())}`};exports.formatDateTimeShort=l;exports.formatDateToDDMMYYYY=g;
|
|
2
2
|
//# sourceMappingURL=DateHelper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateHelper.js","sources":["../../../src/helpers/DateHelper.ts"],"sourcesContent":["/**\n * Normalise a date string from the API to dd/mm/yyyy.\n *\n * Handles:\n * - ISO 8601 with timezone → \"2026-03-22T00:00:00.000000Z\"\n * - Plain date → \"2026-03-22\"\n * - Already formatted → \"22/03/2026\"\n * - Anything else / empty → returns the original value (or '-')\n */\nexport function formatDateToDDMMYYYY(\n dateStr: string | null | undefined\n): string {\n if (!dateStr) return '';\n\n // Already dd/mm/yyyy — return as-is\n if (/^\\d{2}\\/\\d{2}\\/\\d{4}$/.test(dateStr)) return dateStr;\n\n // ISO 8601 (e.g. \"2026-03-22T00:00:00.000000Z\") or plain \"YYYY-MM-DD\"\n const isoMatch = dateStr.match(/^(\\d{4})-(\\d{2})-(\\d{2})/);\n if (isoMatch) {\n const [, year, month, day] = isoMatch;\n return `${day}/${month}/${year}`;\n }\n\n // Unknown format — return as-is so nothing is lost\n return dateStr;\n}\n\nexport const formatDateTimeShort = (date?: string | Date) => {\n if (!date) return date;\n\n
|
|
1
|
+
{"version":3,"file":"DateHelper.js","sources":["../../../src/helpers/DateHelper.ts"],"sourcesContent":["/**\n * Normalise a date string from the API to dd/mm/yyyy.\n *\n * Handles:\n * - ISO 8601 with timezone → \"2026-03-22T00:00:00.000000Z\"\n * - Plain date → \"2026-03-22\"\n * - Already formatted → \"22/03/2026\"\n * - Anything else / empty → returns the original value (or '-')\n */\nexport function formatDateToDDMMYYYY(\n dateStr: string | null | undefined\n): string {\n if (!dateStr) return '';\n\n // Already dd/mm/yyyy — return as-is\n if (/^\\d{2}\\/\\d{2}\\/\\d{4}$/.test(dateStr)) return dateStr;\n\n // ISO 8601 (e.g. \"2026-03-22T00:00:00.000000Z\") or plain \"YYYY-MM-DD\"\n const isoMatch = dateStr.match(/^(\\d{4})-(\\d{2})-(\\d{2})/);\n if (isoMatch) {\n const [, year, month, day] = isoMatch;\n return `${day}/${month}/${year}`;\n }\n\n // Unknown format — return as-is so nothing is lost\n return dateStr;\n}\n\nexport const formatDateTimeShort = (date?: string | Date) => {\n if (!date) return date;\n\n let value: Date;\n\n if (date instanceof Date) {\n value = date;\n } else {\n // Keep the ISO inputs accepted by the previous Moment implementation,\n // including the API's space separator and hour-only UTC offset.\n const isoMatch = date.match(\n /^(\\d{4})-(\\d{2})-(\\d{2})(?:[T ](\\d{2}):(\\d{2})(?::(\\d{2})(?:[.,](\\d+))?)?(Z|[+-]\\d{2}(?::?\\d{2})?)?)?$/\n );\n if (!isoMatch) return date;\n\n const [, year, month, day, hour, minute, second, fraction, offset] =\n isoMatch;\n const milliseconds = Number((fraction || '').padEnd(3, '0').slice(0, 3));\n\n if (offset) {\n const normalizedOffset = /^[+-]\\d{2}$/.test(offset)\n ? `${offset}:00`\n : offset.replace(/^([+-]\\d{2})(\\d{2})$/, '$1:$2');\n value = new Date(\n `${year}-${month}-${day}T${hour}:${minute}:${second || '00'}.${String(\n milliseconds\n ).padStart(3, '0')}${normalizedOffset}`\n );\n } else {\n value = new Date(\n Number(year),\n Number(month) - 1,\n Number(day),\n Number(hour || 0),\n Number(minute || 0),\n Number(second || 0),\n milliseconds\n );\n\n // The Date constructor normalises invalid values (for example Feb 30),\n // while Moment's strict ISO check rejected them.\n if (\n value.getFullYear() !== Number(year) ||\n value.getMonth() !== Number(month) - 1 ||\n value.getDate() !== Number(day) ||\n value.getHours() !== Number(hour || 0) ||\n value.getMinutes() !== Number(minute || 0) ||\n value.getSeconds() !== Number(second || 0)\n ) {\n return date;\n }\n }\n }\n\n if (Number.isNaN(value.getTime())) return date;\n\n const pad = (part: number) => String(part).padStart(2, '0');\n return `${pad(value.getDate())}/${pad(value.getMonth() + 1)}/${String(\n value.getFullYear()\n ).slice(-2)} ${pad(value.getHours())}:${pad(value.getMinutes())}`;\n};\n"],"names":["formatDateToDDMMYYYY","dateStr","isoMatch","year","month","day","formatDateTimeShort","date","value","hour","minute","second","fraction","offset","milliseconds","normalizedOffset","pad","part"],"mappings":"gFASO,SAASA,EACdC,EACQ,CACR,GAAI,CAACA,EAAgB,MAAA,GAGjB,GAAA,wBAAwB,KAAKA,CAAO,EAAU,OAAAA,EAG5C,MAAAC,EAAWD,EAAQ,MAAM,0BAA0B,EACzD,GAAIC,EAAU,CACZ,KAAM,CAAG,CAAAC,EAAMC,EAAOC,CAAG,EAAIH,EACtB,MAAA,GAAGG,KAAOD,KAASD,IAIrB,OAAAF,CACT,CAEa,MAAAK,EAAuBC,GAAyB,CAC3D,GAAI,CAACA,EAAa,OAAAA,EAEd,IAAAC,EAEJ,GAAID,aAAgB,KACVC,EAAAD,MACH,CAGL,MAAML,EAAWK,EAAK,MACpB,wGAAA,EAEF,GAAI,CAACL,EAAiB,OAAAK,EAEhB,KAAA,EAAGJ,EAAMC,EAAOC,EAAKI,EAAMC,EAAQC,EAAQC,EAAUC,CAAM,EAC/DX,EACIY,EAAe,QAAQF,GAAY,IAAI,OAAO,EAAG,GAAG,EAAE,MAAM,EAAG,CAAC,CAAC,EAEvE,GAAIC,EAAQ,CACJ,MAAAE,EAAmB,cAAc,KAAKF,CAAM,EAC9C,GAAGA,OACHA,EAAO,QAAQ,uBAAwB,OAAO,EAClDL,EAAY,IAAA,KACV,GAAGL,KAAQC,KAASC,KAAOI,KAAQC,KAAUC,GAAU,QAAQ,OAC7DG,CACA,EAAA,SAAS,EAAG,GAAG,IAAIC,GAAA,UAGvBP,EAAQ,IAAI,KACV,OAAOL,CAAI,EACX,OAAOC,CAAK,EAAI,EAChB,OAAOC,CAAG,EACV,OAAOI,GAAQ,CAAC,EAChB,OAAOC,GAAU,CAAC,EAClB,OAAOC,GAAU,CAAC,EAClBG,CAAA,EAMAN,EAAM,gBAAkB,OAAOL,CAAI,GACnCK,EAAM,SAAe,IAAA,OAAOJ,CAAK,EAAI,GACrCI,EAAM,QAAQ,IAAM,OAAOH,CAAG,GAC9BG,EAAM,aAAe,OAAOC,GAAQ,CAAC,GACrCD,EAAM,eAAiB,OAAOE,GAAU,CAAC,GACzCF,EAAM,WAAA,IAAiB,OAAOG,GAAU,CAAC,EAElC,OAAAJ,EAKb,GAAI,OAAO,MAAMC,EAAM,QAAA,CAAS,EAAU,OAAAD,EAEpC,MAAAS,EAAOC,GAAiB,OAAOA,CAAI,EAAE,SAAS,EAAG,GAAG,EACnD,MAAA,GAAGD,EAAIR,EAAM,QAAS,CAAA,KAAKQ,EAAIR,EAAM,SAAA,EAAa,CAAC,KAAK,OAC7DA,EAAM,YAAY,CAAA,EAClB,MAAM,EAAE,KAAKQ,EAAIR,EAAM,SAAU,CAAA,KAAKQ,EAAIR,EAAM,WAAY,CAAA,GAChE"}
|
|
@@ -1,30 +1,55 @@
|
|
|
1
|
-
function
|
|
1
|
+
function N(t) {
|
|
2
2
|
if (!t)
|
|
3
3
|
return "";
|
|
4
4
|
if (/^\d{2}\/\d{2}\/\d{4}$/.test(t))
|
|
5
5
|
return t;
|
|
6
|
-
const
|
|
7
|
-
if (
|
|
8
|
-
const [,
|
|
9
|
-
return `${
|
|
6
|
+
const e = t.match(/^(\d{4})-(\d{2})-(\d{2})/);
|
|
7
|
+
if (e) {
|
|
8
|
+
const [, r, n, u] = e;
|
|
9
|
+
return `${u}/${n}/${r}`;
|
|
10
10
|
}
|
|
11
11
|
return t;
|
|
12
12
|
}
|
|
13
|
-
const
|
|
14
|
-
if (!t
|
|
15
|
-
t
|
|
16
|
-
)))
|
|
13
|
+
const g = (t) => {
|
|
14
|
+
if (!t)
|
|
17
15
|
return t;
|
|
18
|
-
|
|
19
|
-
if (
|
|
16
|
+
let e;
|
|
17
|
+
if (t instanceof Date)
|
|
18
|
+
e = t;
|
|
19
|
+
else {
|
|
20
|
+
const n = t.match(
|
|
21
|
+
/^(\d{4})-(\d{2})-(\d{2})(?:[T ](\d{2}):(\d{2})(?::(\d{2})(?:[.,](\d+))?)?(Z|[+-]\d{2}(?::?\d{2})?)?)?$/
|
|
22
|
+
);
|
|
23
|
+
if (!n)
|
|
24
|
+
return t;
|
|
25
|
+
const [, u, i, s, m, $, c, d, o] = n, a = Number((d || "").padEnd(3, "0").slice(0, 3));
|
|
26
|
+
if (o) {
|
|
27
|
+
const f = /^[+-]\d{2}$/.test(o) ? `${o}:00` : o.replace(/^([+-]\d{2})(\d{2})$/, "$1:$2");
|
|
28
|
+
e = /* @__PURE__ */ new Date(
|
|
29
|
+
`${u}-${i}-${s}T${m}:${$}:${c || "00"}.${String(
|
|
30
|
+
a
|
|
31
|
+
).padStart(3, "0")}${f}`
|
|
32
|
+
);
|
|
33
|
+
} else if (e = new Date(
|
|
34
|
+
Number(u),
|
|
35
|
+
Number(i) - 1,
|
|
36
|
+
Number(s),
|
|
37
|
+
Number(m || 0),
|
|
38
|
+
Number($ || 0),
|
|
39
|
+
Number(c || 0),
|
|
40
|
+
a
|
|
41
|
+
), e.getFullYear() !== Number(u) || e.getMonth() !== Number(i) - 1 || e.getDate() !== Number(s) || e.getHours() !== Number(m || 0) || e.getMinutes() !== Number($ || 0) || e.getSeconds() !== Number(c || 0))
|
|
42
|
+
return t;
|
|
43
|
+
}
|
|
44
|
+
if (Number.isNaN(e.getTime()))
|
|
20
45
|
return t;
|
|
21
|
-
const
|
|
22
|
-
return `${e
|
|
23
|
-
|
|
24
|
-
).slice(-2)} ${e
|
|
46
|
+
const r = (n) => String(n).padStart(2, "0");
|
|
47
|
+
return `${r(e.getDate())}/${r(e.getMonth() + 1)}/${String(
|
|
48
|
+
e.getFullYear()
|
|
49
|
+
).slice(-2)} ${r(e.getHours())}:${r(e.getMinutes())}`;
|
|
25
50
|
};
|
|
26
51
|
export {
|
|
27
|
-
|
|
28
|
-
|
|
52
|
+
g as formatDateTimeShort,
|
|
53
|
+
N as formatDateToDDMMYYYY
|
|
29
54
|
};
|
|
30
55
|
//# sourceMappingURL=DateHelper.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DateHelper.mjs","sources":["../../../src/helpers/DateHelper.ts"],"sourcesContent":["/**\n * Normalise a date string from the API to dd/mm/yyyy.\n *\n * Handles:\n * - ISO 8601 with timezone → \"2026-03-22T00:00:00.000000Z\"\n * - Plain date → \"2026-03-22\"\n * - Already formatted → \"22/03/2026\"\n * - Anything else / empty → returns the original value (or '-')\n */\nexport function formatDateToDDMMYYYY(\n dateStr: string | null | undefined\n): string {\n if (!dateStr) return '';\n\n // Already dd/mm/yyyy — return as-is\n if (/^\\d{2}\\/\\d{2}\\/\\d{4}$/.test(dateStr)) return dateStr;\n\n // ISO 8601 (e.g. \"2026-03-22T00:00:00.000000Z\") or plain \"YYYY-MM-DD\"\n const isoMatch = dateStr.match(/^(\\d{4})-(\\d{2})-(\\d{2})/);\n if (isoMatch) {\n const [, year, month, day] = isoMatch;\n return `${day}/${month}/${year}`;\n }\n\n // Unknown format — return as-is so nothing is lost\n return dateStr;\n}\n\nexport const formatDateTimeShort = (date?: string | Date) => {\n if (!date) return date;\n\n
|
|
1
|
+
{"version":3,"file":"DateHelper.mjs","sources":["../../../src/helpers/DateHelper.ts"],"sourcesContent":["/**\n * Normalise a date string from the API to dd/mm/yyyy.\n *\n * Handles:\n * - ISO 8601 with timezone → \"2026-03-22T00:00:00.000000Z\"\n * - Plain date → \"2026-03-22\"\n * - Already formatted → \"22/03/2026\"\n * - Anything else / empty → returns the original value (or '-')\n */\nexport function formatDateToDDMMYYYY(\n dateStr: string | null | undefined\n): string {\n if (!dateStr) return '';\n\n // Already dd/mm/yyyy — return as-is\n if (/^\\d{2}\\/\\d{2}\\/\\d{4}$/.test(dateStr)) return dateStr;\n\n // ISO 8601 (e.g. \"2026-03-22T00:00:00.000000Z\") or plain \"YYYY-MM-DD\"\n const isoMatch = dateStr.match(/^(\\d{4})-(\\d{2})-(\\d{2})/);\n if (isoMatch) {\n const [, year, month, day] = isoMatch;\n return `${day}/${month}/${year}`;\n }\n\n // Unknown format — return as-is so nothing is lost\n return dateStr;\n}\n\nexport const formatDateTimeShort = (date?: string | Date) => {\n if (!date) return date;\n\n let value: Date;\n\n if (date instanceof Date) {\n value = date;\n } else {\n // Keep the ISO inputs accepted by the previous Moment implementation,\n // including the API's space separator and hour-only UTC offset.\n const isoMatch = date.match(\n /^(\\d{4})-(\\d{2})-(\\d{2})(?:[T ](\\d{2}):(\\d{2})(?::(\\d{2})(?:[.,](\\d+))?)?(Z|[+-]\\d{2}(?::?\\d{2})?)?)?$/\n );\n if (!isoMatch) return date;\n\n const [, year, month, day, hour, minute, second, fraction, offset] =\n isoMatch;\n const milliseconds = Number((fraction || '').padEnd(3, '0').slice(0, 3));\n\n if (offset) {\n const normalizedOffset = /^[+-]\\d{2}$/.test(offset)\n ? `${offset}:00`\n : offset.replace(/^([+-]\\d{2})(\\d{2})$/, '$1:$2');\n value = new Date(\n `${year}-${month}-${day}T${hour}:${minute}:${second || '00'}.${String(\n milliseconds\n ).padStart(3, '0')}${normalizedOffset}`\n );\n } else {\n value = new Date(\n Number(year),\n Number(month) - 1,\n Number(day),\n Number(hour || 0),\n Number(minute || 0),\n Number(second || 0),\n milliseconds\n );\n\n // The Date constructor normalises invalid values (for example Feb 30),\n // while Moment's strict ISO check rejected them.\n if (\n value.getFullYear() !== Number(year) ||\n value.getMonth() !== Number(month) - 1 ||\n value.getDate() !== Number(day) ||\n value.getHours() !== Number(hour || 0) ||\n value.getMinutes() !== Number(minute || 0) ||\n value.getSeconds() !== Number(second || 0)\n ) {\n return date;\n }\n }\n }\n\n if (Number.isNaN(value.getTime())) return date;\n\n const pad = (part: number) => String(part).padStart(2, '0');\n return `${pad(value.getDate())}/${pad(value.getMonth() + 1)}/${String(\n value.getFullYear()\n ).slice(-2)} ${pad(value.getHours())}:${pad(value.getMinutes())}`;\n};\n"],"names":["formatDateToDDMMYYYY","dateStr","isoMatch","year","month","day","formatDateTimeShort","date","value","hour","minute","second","fraction","offset","milliseconds","normalizedOffset","pad","part"],"mappings":"AASO,SAASA,EACdC,GACQ;AACR,MAAI,CAACA;AAAgB,WAAA;AAGjB,MAAA,wBAAwB,KAAKA,CAAO;AAAU,WAAAA;AAG5C,QAAAC,IAAWD,EAAQ,MAAM,0BAA0B;AACzD,MAAIC,GAAU;AACZ,UAAM,CAAG,EAAAC,GAAMC,GAAOC,CAAG,IAAIH;AACtB,WAAA,GAAGG,KAAOD,KAASD;AAAA;AAIrB,SAAAF;AACT;AAEa,MAAAK,IAAsB,CAACC,MAAyB;AAC3D,MAAI,CAACA;AAAa,WAAAA;AAEd,MAAAC;AAEJ,MAAID,aAAgB;AACV,IAAAC,IAAAD;AAAA,OACH;AAGL,UAAML,IAAWK,EAAK;AAAA,MACpB;AAAA,IAAA;AAEF,QAAI,CAACL;AAAiB,aAAAK;AAEhB,UAAA,GAAGJ,GAAMC,GAAOC,GAAKI,GAAMC,GAAQC,GAAQC,GAAUC,CAAM,IAC/DX,GACIY,IAAe,QAAQF,KAAY,IAAI,OAAO,GAAG,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC;AAEvE,QAAIC,GAAQ;AACJ,YAAAE,IAAmB,cAAc,KAAKF,CAAM,IAC9C,GAAGA,SACHA,EAAO,QAAQ,wBAAwB,OAAO;AAClD,MAAAL,IAAY,oBAAA;AAAA,QACV,GAAGL,KAAQC,KAASC,KAAOI,KAAQC,KAAUC,KAAU,QAAQ;AAAA,UAC7DG;AAAA,QACA,EAAA,SAAS,GAAG,GAAG,IAAIC;AAAA,MAAA;AAAA,eAGvBP,IAAQ,IAAI;AAAA,MACV,OAAOL,CAAI;AAAA,MACX,OAAOC,CAAK,IAAI;AAAA,MAChB,OAAOC,CAAG;AAAA,MACV,OAAOI,KAAQ,CAAC;AAAA,MAChB,OAAOC,KAAU,CAAC;AAAA,MAClB,OAAOC,KAAU,CAAC;AAAA,MAClBG;AAAA,IAAA,GAMAN,EAAM,kBAAkB,OAAOL,CAAI,KACnCK,EAAM,SAAe,MAAA,OAAOJ,CAAK,IAAI,KACrCI,EAAM,QAAQ,MAAM,OAAOH,CAAG,KAC9BG,EAAM,eAAe,OAAOC,KAAQ,CAAC,KACrCD,EAAM,iBAAiB,OAAOE,KAAU,CAAC,KACzCF,EAAM,WAAA,MAAiB,OAAOG,KAAU,CAAC;AAElC,aAAAJ;AAAA;AAKb,MAAI,OAAO,MAAMC,EAAM,QAAA,CAAS;AAAU,WAAAD;AAEpC,QAAAS,IAAM,CAACC,MAAiB,OAAOA,CAAI,EAAE,SAAS,GAAG,GAAG;AACnD,SAAA,GAAGD,EAAIR,EAAM,QAAS,CAAA,KAAKQ,EAAIR,EAAM,SAAA,IAAa,CAAC,KAAK;AAAA,IAC7DA,EAAM,YAAY;AAAA,EAAA,EAClB,MAAM,EAAE,KAAKQ,EAAIR,EAAM,SAAU,CAAA,KAAKQ,EAAIR,EAAM,WAAY,CAAA;AAChE;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t={and:"and",gender:"Gender",male:"Male",female:"Female",confirm:"Confirm",test_result_my_profile:"Hồ sơ của tôi",test_result_if_you_wish_to_edit_your_profile:'If you wish to edit your profile, please <a href="tel:1900 1717" class="contact-support">contact support</a>',test_result_test_more_for_better_health:"Test more for better health",test_result_book_general_screening_panel_now:"Book General Screening Panel now",test_result_status_not_ready:"Not ready yet",test_result_status_couldnt_process:"Couldn't process",test_result_status_ready:"Ready",test_result_status_partially_ready:"Partially ready",test_result_order:"Order",test_result_all_results:"All results",test_result_load_older_results:"Load older results",test_result_all_results_loaded:"All results are loaded",test_result_hi:"Hi,",test_result_your_result_ready:"Your results are ready",test_result_result_partial_completed:"Your results are partially ready",test_result_your_result_not_ready:"Your results are not ready yet",test_result_sample_collected:"Collected:",test_result_result_ready:"Ready:",test_result_sample_collected_on:"Your sample was collected on",test_result_result_released_on:"and your results were released on ",test_result_check_other_results:"Check other results",call_us:"Call for support",test_result_time_support:"From 06:00 - 21:00",test_result_sample_could_not_processed:"Results could not be processed",test_result_contact_support:"Please contact our customer service for further support.",test_result_being_prepared:"Your results are being prepared.",test_result_note:"Doctor's comments",doctor_note_detail_show_more:"Show more",doctor_note_detail_show_less:"Show less",doctor_note_detail_title:"You have notes from our doctor",doctor_note_detail_conclusion:"Conclusion of test report (conditions)",doctor_note_detail_diet:"Diet",doctor_note_detail_lifestyle:"Lifestyle",doctor_note_detail_physical_activity:"Physical activity",doctor_note_detail_follow_up_plans:"Follow-up plans",doctor_note_detail_next_appointment_date:"Next appointment date",doctor_note_detail_vaccination_treatment:"Vaccination & treatment",doctor_note_detail_appointment_bookings:"Bookings & Follow-up appointment",doctor_note_detail_booking_now:"Book now",doctor_note_detail_booking_overdue:"Overdue",test_result_measured_in:"measured in",test_result_critical:"Critical",test_result_high:"High",test_result_low:"Low",test_result_normal:"Normal",test_result_about:"About",test_result_all_bookings:"All bookings",test_result_more_bookings:"More Bookings",test_result_no_booking_found:"No booking found",test_result_message_no_booking_yet:"You haven't created any booking yet",test_result_support:"Support",test_result_find_nearest_diag_branch:"Find the nearest branch",test_result_no_results_found:"No results found",test_result_book_to_show_result:"Book a test to show results",test_result_doctor_appointment:"Lab tests explanation",test_result_free:"Free",test_result_step_ordered:"Order Created",test_result_step_sample_collected:"Sample Collected",test_result_step_in_progress:"Lab Processing",test_result_step_partially_approved:"Partially Completed",test_result_step_approved:"Completed",test_result_more_about_your_results:"Find out more about your resutls",test_result_choose_time:"Book your appointment",test_result_book_appointment:"Book a call",test_result_call_support:"Call support",test_result_take_survey_description:"Answer a few questions so we can support you better",test_result_take_survey_button:"Rate your experience",test_result_take_survey_error:"Could not open the survey. Please try again later.",test_result_take_teledoc_survey_button:"Rate your consultation",test_result_successfully_booked:"Successfully booked",test_result_have_an_appointment_with_doctor:"You have an appointment with our doctor on {date}.",test_result_book_appointment_error_title:"Something went wrong...",test_result_book_appointment_error_description:"Please try to book the appointment again or contact Diag via hotline 19001717 if the error still happens",test_result_upcoming_appointment:"Upcoming appoinment",test_result_get_started:"Get started",test_result_book_first_test:"Book your first test now",test_result_booking_account_code:"Account code:",test_result_booking_document_type_id_number:"ID number:",test_result_booking_document_type_passport_no:"Passport no:",test_result_booking_patient:"Patient",test_result_booking_doctor:"Doctor",test_result_booking_booking_number:"Your booking number",test_result_booking_results_will_be_there:"Your results will be here...",test_result_booking_booking_canceled:"Your booking was cancelled",test_result_booking_next_step:"Next steps",test_result_booking_diag_contact_you_and_check:"Diag will contact you and check for your preferred time slot.",test_result_booking_find_location_center:"Find location center",test_result_booking_view_results:"View my results",test_result_booking_test_results:"Test results",test_result_booking_need_collect_sample:"Nurse needs to collect your sample.",test_result_booking_processing_sample:"We are processing your sample.",test_result_booking_fully_ready:"Your results are fully ready now.",test_result_booking_booking_details:"Booking details",test_result_booking_payment_status_pay_later:"Pay later",test_result_booking_payment_status_paid_online:"Paid",test_result_booking_payment_status_paid:"Paid",test_result_booking_payment_status_refund_in_progress:"Refunding",test_result_booking_payment_status_refunded:"Refunded",test_result_booking_payment_status_canceled:"Canceled",test_result_booking_booking_status_created:"Created",test_result_booking_booking_status_in_progress:"In progress",test_result_booking_booking_status_completed:"Completed",test_result_booking_booking_status_canceled:"Canceled",test_result_booking_total_payment:"Total Payment",test_result_booking_note:"Note",test_result_booking_support_zalo:"Zalo:",test_result_booking_support_hotline:"Hotline:",test_result_booking_support_email:"Email:",test_result_booking_sample_collection:"Sample collection",test_result_booking_testing_location:"Testing location",test_result_booking_address:"Address",test_result_booking_expected_date:"Expected date",test_result_booking_tests:"Tests",test_result_booking_packages:"Packages",test_result_booking_imaging_services:"Imaging services",test_result_booking_attachment:"Attachments",date_time:{day_parts:{morning:"Morning",afternoon:"Afternoon",evening:"Evening"}},test_result_health_summary:"Health summary",test_result_have_questions:"Book a consult call",test_result_appointment_date:"{date} in the {time}",test_result_come_to_diag_to_get_tested:"Come to Diag to get tested",test_result_locate_this_center:"Locate this center",test_result_show_all_locations:"Show all locations",test_result_booking_number:"Booking number",test_result_total_price:"Total price",test_result_add_remove_test_message:"If you want to add or remove a test, please indicate this to our receptionist.",test_result_additional_tests:"Additional tests",test_result_recommended_tests:"Recommended tests",test_result_count_day:"{count} day",test_result_count_month:"{count} month",test_result_count_days:"{count} days",test_result_count_months:"{count} months",test_result_remind_message_title:"Time to get tested again!",test_result_remind_message_content:"It's been almost {count} since your last health check-up.",test_result_recommend_message_title:"You should take additional tests",test_result_recommend_message_content:"Based on your recent results, you are recommended to take additional tests.",test_result_followup_title:"Your Health Follow-up Reminder",test_result_followup_subtitle:"You have a health follow-up appointment with Diag on {date}. Your booking code is {code}.",test_result_recommend_title:"Further Tests Suggested",test_result_recommend_subtitle:"Diag recommends follow-up tests based on your test results. Your booking code is {code}.",test_result_recommend_subtitle_no_code:"Diag recommends follow-up tests based on your test results.",test_result_followup_context_remind:`Thank you for choosing Diag! Your health is always our top priority.
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t={and:"and",gender:"Gender",male:"Male",female:"Female",confirm:"Confirm",test_result_my_profile:"Hồ sơ của tôi",test_result_if_you_wish_to_edit_your_profile:'If you wish to edit your profile, please <a href="tel:1900 1717" class="contact-support">contact support</a>',test_result_test_more_for_better_health:"Test more for better health",test_result_book_general_screening_panel_now:"Book General Screening Panel now",test_result_status_not_ready:"Not ready yet",test_result_status_couldnt_process:"Couldn't process",test_result_status_ready:"Ready",test_result_status_partially_ready:"Partially ready",test_result_order:"Order",test_result_all_results:"All results",test_result_load_older_results:"Load older results",test_result_all_results_loaded:"All results are loaded",test_result_hi:"Hi,",test_result_your_result_ready:"Your results are ready",test_result_result_partial_completed:"Your results are partially ready",test_result_your_result_not_ready:"Your results are not ready yet",test_result_sample_collected:"Collected:",test_result_result_ready:"Ready:",test_result_sample_collected_on:"Your sample was collected on",test_result_result_released_on:"and your results were released on ",test_result_check_other_results:"Check other results",call_us:"Call for support",test_result_time_support:"From 06:00 - 21:00",test_result_sample_could_not_processed:"Results could not be processed",test_result_contact_support:"Please contact our customer service for further support.",test_result_being_prepared:"Your results are being prepared.",test_result_note:"Doctor's comments",doctor_note_detail_show_more:"Show more",doctor_note_detail_show_less:"Show less",doctor_note_detail_title:"You have notes from our doctor",doctor_note_detail_conclusion:"Conclusion of test report (conditions)",doctor_note_detail_diet:"Diet",doctor_note_detail_lifestyle:"Lifestyle",doctor_note_detail_physical_activity:"Physical activity",doctor_note_detail_follow_up_plans:"Follow-up plans",doctor_note_detail_next_appointment_date:"Next appointment date",doctor_note_detail_vaccination_treatment:"Vaccination & treatment",doctor_note_detail_appointment_bookings:"Bookings & Follow-up appointment",doctor_note_detail_booking_now:"Book now",doctor_note_detail_booking_overdue:"Overdue",test_result_measured_in:"measured in",test_result_critical:"Critical",test_result_high:"High",test_result_low:"Low",test_result_normal:"Normal",test_result_about:"About",test_result_all_bookings:"All bookings",test_result_more_bookings:"More Bookings",test_result_no_booking_found:"No booking found",test_result_message_no_booking_yet:"You haven't created any booking yet",test_result_support:"Support",test_result_find_nearest_diag_branch:"Find the nearest branch",test_result_no_results_found:"No results found",test_result_book_to_show_result:"Book a test to show results",test_result_doctor_appointment:"Lab tests explanation",test_result_contact_for_explanation:"Contact DIAG to better understand your test results",test_result_report:"Result report",test_result_new:"Beta",test_result_report_description:"Easy-to-understand, personalized summary of your test results",test_result_free:"Free",test_result_step_ordered:"Order Created",test_result_step_sample_collected:"Sample Collected",test_result_step_in_progress:"Lab Processing",test_result_step_partially_approved:"Partially Completed",test_result_step_approved:"Completed",test_result_current_status:"Current status",test_result_view_detail:"View details",test_result_collapse:"Collapse",test_result_more_about_your_results:"Find out more about your resutls",test_result_choose_time:"Book your appointment",test_result_book_appointment:"Book a call",test_result_call_support:"Call support",test_result_take_survey_description:"Answer a few questions so we can support you better",test_result_take_survey_button:"Rate your experience",test_result_take_survey_error:"Could not open the survey. Please try again later.",test_result_take_teledoc_survey_button:"Rate your consultation",test_result_successfully_booked:"Successfully booked",test_result_have_an_appointment_with_doctor:"You have an appointment with our doctor on {date}.",test_result_book_appointment_error_title:"Something went wrong...",test_result_book_appointment_error_description:"Please try to book the appointment again or contact Diag via hotline 19001717 if the error still happens",test_result_upcoming_appointment:"Upcoming appoinment",test_result_get_started:"Get started",test_result_book_first_test:"Book your first test now",test_result_booking_account_code:"Account code:",test_result_booking_document_type_id_number:"ID number:",test_result_booking_document_type_passport_no:"Passport no:",test_result_booking_patient:"Patient",test_result_booking_doctor:"Doctor",test_result_booking_booking_number:"Your booking number",test_result_booking_results_will_be_there:"Your results will be here...",test_result_booking_booking_canceled:"Your booking was cancelled",test_result_booking_next_step:"Next steps",test_result_booking_diag_contact_you_and_check:"Diag will contact you and check for your preferred time slot.",test_result_booking_find_location_center:"Find location center",test_result_booking_view_results:"View my results",test_result_booking_test_results:"Test results",test_result_booking_need_collect_sample:"Nurse needs to collect your sample.",test_result_booking_processing_sample:"We are processing your sample.",test_result_booking_fully_ready:"Your results are fully ready now.",test_result_booking_booking_details:"Booking details",test_result_booking_payment_status_pay_later:"Pay later",test_result_booking_payment_status_paid_online:"Paid",test_result_booking_payment_status_paid:"Paid",test_result_booking_payment_status_refund_in_progress:"Refunding",test_result_booking_payment_status_refunded:"Refunded",test_result_booking_payment_status_canceled:"Canceled",test_result_booking_booking_status_created:"Created",test_result_booking_booking_status_in_progress:"In progress",test_result_booking_booking_status_completed:"Completed",test_result_booking_booking_status_canceled:"Canceled",test_result_booking_total_payment:"Total Payment",test_result_booking_note:"Note",test_result_booking_support_zalo:"Zalo:",test_result_booking_support_hotline:"Hotline:",test_result_booking_support_email:"Email:",test_result_booking_sample_collection:"Sample collection",test_result_booking_testing_location:"Testing location",test_result_booking_address:"Address",test_result_booking_expected_date:"Expected date",test_result_booking_tests:"Tests",test_result_booking_packages:"Packages",test_result_booking_imaging_services:"Imaging services",test_result_booking_attachment:"Attachments",date_time:{day_parts:{morning:"Morning",afternoon:"Afternoon",evening:"Evening"}},test_result_health_summary:"Health summary",test_result_have_questions:"Book a consult call",test_result_appointment_date:"{date} in the {time}",test_result_come_to_diag_to_get_tested:"Come to Diag to get tested",test_result_locate_this_center:"Locate this center",test_result_show_all_locations:"Show all locations",test_result_booking_number:"Booking number",test_result_total_price:"Total price",test_result_add_remove_test_message:"If you want to add or remove a test, please indicate this to our receptionist.",test_result_additional_tests:"Additional tests",test_result_recommended_tests:"Recommended tests",test_result_count_day:"{count} day",test_result_count_month:"{count} month",test_result_count_days:"{count} days",test_result_count_months:"{count} months",test_result_remind_message_title:"Time to get tested again!",test_result_remind_message_content:"It's been almost {count} since your last health check-up.",test_result_recommend_message_title:"You should take additional tests",test_result_recommend_message_content:"Based on your recent results, you are recommended to take additional tests.",test_result_followup_title:"Your Health Follow-up Reminder",test_result_followup_subtitle:"You have a health follow-up appointment with Diag on {date}. Your booking code is {code}.",test_result_recommend_title:"Further Tests Suggested",test_result_recommend_subtitle:"Diag recommends follow-up tests based on your test results. Your booking code is {code}.",test_result_recommend_subtitle_no_code:"Diag recommends follow-up tests based on your test results.",test_result_followup_context_remind:`Thank you for choosing Diag! Your health is always our top priority.
|
|
2
2
|
|
|
3
3
|
Based on your test results from {last_visit_date} (Record ID: {customer_code}), our doctor recommends that you undergo the follow-up tests below to ensure more effective health monitoring and management.`,test_result_followup_context_recommend:`Thank you for choosing Diag! Your health is always our top priority.
|
|
4
4
|
|
|
@@ -59,12 +59,19 @@ const t = {
|
|
|
59
59
|
test_result_no_results_found: "No results found",
|
|
60
60
|
test_result_book_to_show_result: "Book a test to show results",
|
|
61
61
|
test_result_doctor_appointment: "Lab tests explanation",
|
|
62
|
+
test_result_contact_for_explanation: "Contact DIAG to better understand your test results",
|
|
63
|
+
test_result_report: "Result report",
|
|
64
|
+
test_result_new: "Beta",
|
|
65
|
+
test_result_report_description: "Easy-to-understand, personalized summary of your test results",
|
|
62
66
|
test_result_free: "Free",
|
|
63
67
|
test_result_step_ordered: "Order Created",
|
|
64
68
|
test_result_step_sample_collected: "Sample Collected",
|
|
65
69
|
test_result_step_in_progress: "Lab Processing",
|
|
66
70
|
test_result_step_partially_approved: "Partially Completed",
|
|
67
71
|
test_result_step_approved: "Completed",
|
|
72
|
+
test_result_current_status: "Current status",
|
|
73
|
+
test_result_view_detail: "View details",
|
|
74
|
+
test_result_collapse: "Collapse",
|
|
68
75
|
test_result_more_about_your_results: "Find out more about your resutls",
|
|
69
76
|
test_result_choose_time: "Book your appointment",
|
|
70
77
|
test_result_book_appointment: "Book a call",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"en.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"en.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t={and:"và",gender:"Giới tính",male:"Nam",female:"Nữ",confirm:"Xác nhận",test_result_my_profile:"Hồ sơ của tôi",test_result_if_you_wish_to_edit_your_profile:'Nếu cần thay đổi thông tin cá nhân, bạn vui lòng <a href="tel:1900 1717" class="contact-support">liên hệ hỗ trợ</a>',test_result_test_more_for_better_health:"Để thấu hiểu và duy trì sức khoẻ",test_result_book_general_screening_panel_now:"Đặt hẹn Gói Xét Nghiệm Tổng Quát ngay",test_result_status_not_ready:"Chưa có kết quả",test_result_status_couldnt_process:"Mẫu không thể xử lý",test_result_status_ready:"Sẵn sàng",test_result_status_partially_ready:"Sẵn sàng một phần",test_result_order:"Chỉ định",test_result_all_results:"Tất cả kết quả",test_result_load_older_results:"Xem các kết quả cũ hơn",test_result_all_results_loaded:"Đã hiển thị tất cả kết quả",test_result_hi:"Xin chào,",test_result_your_result_ready:"Bạn đã có kết quả xét nghiệm",test_result_result_partial_completed:"Xét nghiệm của bạn đã hoàn thành một phần",test_result_your_result_not_ready:"Kết quả của bạn chưa hoàn tất",test_result_sample_collected:"Lấy mẫu:",test_result_result_ready:"Có kết quả:",test_result_sample_collected_on:"Mẫu đã được lấy vào ngày",test_result_result_released_on:"và có kết quả xét nghiệm vào ngày",test_result_check_other_results:"Xem các kết quả khác",call_us:"Liên hệ Diag",test_result_time_support:"Từ 06:00 - 21:00",test_result_sample_could_not_processed:"Không thể xử lý mẫu bạn đã gửi.",test_result_contact_support:"Xin liên hệ bộ phận CSKH của chúng tôi để được hỗ trợ thêm",test_result_being_prepared:"Mẫu của bạn đang được xét nghiệm.",test_result_note:"Tư vấn từ bác sĩ",doctor_note_detail_show_more:"Xem thêm",doctor_note_detail_show_less:"Thu gọn",doctor_note_detail_title:"Bạn có ghi chú từ bác sĩ đối tác",doctor_note_detail_conclusion:"Kết luận từ kết quả xét nghiệm (tình trạng phát hiện)",doctor_note_detail_diet:"Chế độ ăn",doctor_note_detail_lifestyle:"Chế độ sinh hoạt",doctor_note_detail_physical_activity:"Vận động thể chất",doctor_note_detail_follow_up_plans:"Kế hoạch theo dõi",doctor_note_detail_next_appointment_date:"Ngày hẹn tái khám tiếp theo",doctor_note_detail_vaccination_treatment:"Tiêm chủng & điều trị",doctor_note_detail_appointment_bookings:"Mã đặt chỗ & Hẹn tái khám",doctor_note_detail_booking_now:"Làm ngay",doctor_note_detail_booking_overdue:"Quá hạn",test_result_measured_in:"đơn vị tính là",test_result_critical:"Nguy hiểm",test_result_high:"Cao",test_result_low:"Thấp",test_result_normal:"Bình thường",test_result_about:"Ý nghĩa của",test_result_all_bookings:"Tất cả lịch hẹn",test_result_more_bookings:"Lịch hẹn khác",test_result_no_booking_found:"Không có lịch hẹn nào",test_result_message_no_booking_yet:"Bạn chưa tạo lịch hẹn xét nghiệm nào",test_result_support:"Hỗ trợ",test_result_find_nearest_diag_branch:"Tìm chi nhánh gần nhất",test_result_no_results_found:"Chưa có kết quả nào",test_result_book_to_show_result:"Đặt hẹn xét nghiệm ngay để xem kết quả",test_result_doctor_appointment:"
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const t={and:"và",gender:"Giới tính",male:"Nam",female:"Nữ",confirm:"Xác nhận",test_result_my_profile:"Hồ sơ của tôi",test_result_if_you_wish_to_edit_your_profile:'Nếu cần thay đổi thông tin cá nhân, bạn vui lòng <a href="tel:1900 1717" class="contact-support">liên hệ hỗ trợ</a>',test_result_test_more_for_better_health:"Để thấu hiểu và duy trì sức khoẻ",test_result_book_general_screening_panel_now:"Đặt hẹn Gói Xét Nghiệm Tổng Quát ngay",test_result_status_not_ready:"Chưa có kết quả",test_result_status_couldnt_process:"Mẫu không thể xử lý",test_result_status_ready:"Sẵn sàng",test_result_status_partially_ready:"Sẵn sàng một phần",test_result_order:"Chỉ định",test_result_all_results:"Tất cả kết quả",test_result_load_older_results:"Xem các kết quả cũ hơn",test_result_all_results_loaded:"Đã hiển thị tất cả kết quả",test_result_hi:"Xin chào,",test_result_your_result_ready:"Bạn đã có kết quả xét nghiệm",test_result_result_partial_completed:"Xét nghiệm của bạn đã hoàn thành một phần",test_result_your_result_not_ready:"Kết quả của bạn chưa hoàn tất",test_result_sample_collected:"Lấy mẫu:",test_result_result_ready:"Có kết quả:",test_result_sample_collected_on:"Mẫu đã được lấy vào ngày",test_result_result_released_on:"và có kết quả xét nghiệm vào ngày",test_result_check_other_results:"Xem các kết quả khác",call_us:"Liên hệ Diag",test_result_time_support:"Từ 06:00 - 21:00",test_result_sample_could_not_processed:"Không thể xử lý mẫu bạn đã gửi.",test_result_contact_support:"Xin liên hệ bộ phận CSKH của chúng tôi để được hỗ trợ thêm",test_result_being_prepared:"Mẫu của bạn đang được xét nghiệm.",test_result_note:"Tư vấn từ bác sĩ",doctor_note_detail_show_more:"Xem thêm",doctor_note_detail_show_less:"Thu gọn",doctor_note_detail_title:"Bạn có ghi chú từ bác sĩ đối tác",doctor_note_detail_conclusion:"Kết luận từ kết quả xét nghiệm (tình trạng phát hiện)",doctor_note_detail_diet:"Chế độ ăn",doctor_note_detail_lifestyle:"Chế độ sinh hoạt",doctor_note_detail_physical_activity:"Vận động thể chất",doctor_note_detail_follow_up_plans:"Kế hoạch theo dõi",doctor_note_detail_next_appointment_date:"Ngày hẹn tái khám tiếp theo",doctor_note_detail_vaccination_treatment:"Tiêm chủng & điều trị",doctor_note_detail_appointment_bookings:"Mã đặt chỗ & Hẹn tái khám",doctor_note_detail_booking_now:"Làm ngay",doctor_note_detail_booking_overdue:"Quá hạn",test_result_measured_in:"đơn vị tính là",test_result_critical:"Nguy hiểm",test_result_high:"Cao",test_result_low:"Thấp",test_result_normal:"Bình thường",test_result_about:"Ý nghĩa của",test_result_all_bookings:"Tất cả lịch hẹn",test_result_more_bookings:"Lịch hẹn khác",test_result_no_booking_found:"Không có lịch hẹn nào",test_result_message_no_booking_yet:"Bạn chưa tạo lịch hẹn xét nghiệm nào",test_result_support:"Hỗ trợ",test_result_find_nearest_diag_branch:"Tìm chi nhánh gần nhất",test_result_no_results_found:"Chưa có kết quả nào",test_result_book_to_show_result:"Đặt hẹn xét nghiệm ngay để xem kết quả",test_result_doctor_appointment:"Liên hệ Diag",test_result_contact_for_explanation:"Liên hệ DIAG nếu cần hiểu rõ hơn kết quả xét nghiệm của bạn",test_result_report:"Báo cáo kết quả",test_result_new:"Beta",test_result_report_description:"Tóm tắt kết quả xét nghiệm dễ hiểu, cá nhân hoá",test_result_free:"Miễn phí",test_result_step_ordered:"Đã tạo hồ sơ",test_result_step_sample_collected:"Đã lấy mẫu",test_result_step_in_progress:"Phòng xét nghiệm đang xử lý",test_result_step_partially_approved:"Đã hoàn thành một phần",test_result_step_approved:"Đã hoàn thành",test_result_current_status:"Trạng thái hiện tại",test_result_view_detail:"Xem chi tiết",test_result_collapse:"Thu gọn",test_result_more_about_your_results:"Hiểu rõ hơn về kết quả của bạn",test_result_choose_time:"Đặt cuộc hẹn",test_result_book_appointment:"Đặt hẹn nhận cuộc gọi",test_result_call_support:"Liên hệ hỗ trợ",test_result_take_survey_description:"Trả lời vài câu hỏi để chúng tôi hỗ trợ bạn tốt hơn",test_result_take_survey_button:"Đánh giá trải nghiệm",test_result_take_survey_error:"Không mở được khảo sát. Vui lòng thử lại sau.",test_result_take_teledoc_survey_button:"Đánh giá tư vấn",test_result_successfully_booked:"Đặt hẹn thành công",test_result_have_an_appointment_with_doctor:"Bạn có lịch hẹn với bác sĩ của Diag vào ngày {date}.",test_result_book_appointment_error_title:"Đã có lỗi xảy ra...",test_result_book_appointment_error_description:"Bạn vui lòng thử lại hoặc liên hệ Diag qua hotline 19001717 nếu vẫn không thể đặt hẹn thành công.",test_result_upcoming_appointment:"Lịch hẹn sắp tới",test_result_get_started:"Bắt đầu",test_result_book_first_test:"Đặt hẹn xét nghiệm ngay",test_result_booking_account_code:"Mã tài khoản:",test_result_booking_document_type_id_number:"CMND/CCCD:",test_result_booking_document_type_passport_no:"Hộ chiếu:",test_result_booking_patient:"Bệnh nhân",test_result_booking_doctor:"Bác sĩ",test_result_booking_booking_number:"Mã đặt chỗ của bạn",test_result_booking_results_will_be_there:"Xem kết quả tại đây khi hoàn tất...",test_result_booking_booking_canceled:"Lịch hẹn của bạn đã huỷ",test_result_booking_next_step:"Bước tiếp theo",test_result_booking_diag_contact_you_and_check:"Diag sẽ liên hệ để sắp xếp lịch hẹn phù hợp với thời gian của bạn.",test_result_booking_find_location_center:"Tìm chi nhánh Diag",test_result_booking_view_results:"Xem kết quả của tôi",test_result_booking_test_results:"Kết quả xét nghiệm",test_result_booking_need_collect_sample:"Y tá cần lấy mẫu của bạn.",test_result_booking_processing_sample:"Chúng tôi đang xử lý mẫu của bạn.",test_result_booking_fully_ready:"Kết quả xét nghiệm của bạn đã hoàn tất.",test_result_booking_booking_details:"Chi tiết lịch hẹn",test_result_booking_payment_status_pay_later:"Thanh toán sau",test_result_booking_payment_status_paid_online:"Đã thanh toán",test_result_booking_payment_status_paid:"Đã thanh toán",test_result_booking_payment_status_refund_in_progress:"Đang hoàn tiền",test_result_booking_payment_status_refunded:"Đã hoàn tiền",test_result_booking_payment_status_canceled:"Đã huỷ",test_result_booking_booking_status_created:"Đã tạo",test_result_booking_booking_status_in_progress:"Đang xử lý mẫu",test_result_booking_booking_status_completed:"Hoàn tất",test_result_booking_booking_status_canceled:"Đã huỷ",test_result_booking_total_payment:"Tổng thanh toán",test_result_booking_note:"Ghi chú",test_result_booking_support_zalo:"Zalo:",test_result_booking_support_hotline:"Hotline:",test_result_booking_support_email:"Email:",test_result_booking_sample_collection:"Lấy mẫu",test_result_booking_testing_location:"Địa điểm xét nghiệm",test_result_booking_address:"Địa chỉ",test_result_booking_expected_date:"Ngày dự kiến",test_result_booking_tests:"Xét nghiệm",test_result_booking_packages:"Gói xét nghiệm",test_result_booking_imaging_services:"Chẩn đoán hình ảnh",test_result_booking_attachment:"Tệp đính kèm",date_time:{day_parts:{morning:"Sáng",afternoon:"Chiều",evening:"Tối"}},test_result_health_summary:"Tóm tắt sức khoẻ sơ bộ",test_result_have_questions:"Đặt cuộc gọi tư vấn",test_result_appointment_date:"{time} ngày {date}",test_result_come_to_diag_to_get_tested:"Hãy đến Diag để xét nghiệm",test_result_locate_this_center:"Tìm địa điểm này",test_result_show_all_locations:"Xem tất cả các địa điểm",test_result_booking_number:"Mã đặt chỗ của bạn",test_result_total_price:"Tổng thanh toán",test_result_add_remove_test_message:"Nếu bạn muốn thêm hoặc bớt xét nghiệm, vui lòng liên hệ với lễ tân của chúng tôi.",test_result_additional_tests:"Các xét nghiệm bổ sung",test_result_recommended_tests:"Các xét nghiệm khuyến nghị",test_result_count_day:"{count} ngày",test_result_count_month:"{count} tháng",test_result_count_days:"{count} ngày",test_result_count_months:"{count} tháng",test_result_remind_message_title:"Đã đến lúc xét nghiệm lại!",test_result_remind_message_content:"Đã {count} kể từ lúc bạn kiểm tra lần cuối",test_result_recommend_message_title:"Bạn nên xét nghiệm thêm những xét nghiệm này",test_result_recommend_message_content:"Dựa và những lần kiểm tra gần đây, bạn được khuyến nghị kiểm tra thêm những xét nghiệm này.",test_result_followup_title:"Lịch theo dõi sức khỏe của bạn",test_result_followup_subtitle:"Bạn có lịch hẹn theo dõi sức khỏe ngày {date} với Diag. Mã đặt chỗ của bạn là {code}.",test_result_recommend_title:"Theo dõi thêm từ kết quả của bạn",test_result_recommend_subtitle:"Diag khuyến nghị xét nghiệm theo dõi dựa trên kết quả xét nghiệm của bạn. Mã đặt chỗ của bạn là {code}.",test_result_recommend_subtitle_no_code:"Diag khuyến nghị xét nghiệm theo dõi dựa trên kết quả xét nghiệm của bạn.",test_result_followup_context_remind:`Cảm ơn bạn đã lựa chọn Diag! Sức khỏe của bạn luôn là ưu tiên hàng đầu của chúng tôi.
|
|
2
2
|
|
|
3
3
|
Từ kết quả xét nghiệm ngày {last_visit_date} (mã hồ sơ: {customer_code}), bác sĩ khuyến nghị bạn thực hiện các xét nghiệm theo dõi dưới đây để đảm bảo việc theo dõi và quản lý sức khỏe hiệu quả hơn.`,test_result_followup_context_recommend:`Cảm ơn bạn đã lựa chọn Diag! Sức khỏe của bạn luôn là ưu tiên hàng đầu của chúng tôi.
|
|
4
4
|
|
|
@@ -58,13 +58,20 @@ const t = {
|
|
|
58
58
|
test_result_find_nearest_diag_branch: "Tìm chi nhánh gần nhất",
|
|
59
59
|
test_result_no_results_found: "Chưa có kết quả nào",
|
|
60
60
|
test_result_book_to_show_result: "Đặt hẹn xét nghiệm ngay để xem kết quả",
|
|
61
|
-
test_result_doctor_appointment: "
|
|
61
|
+
test_result_doctor_appointment: "Liên hệ Diag",
|
|
62
|
+
test_result_contact_for_explanation: "Liên hệ DIAG nếu cần hiểu rõ hơn kết quả xét nghiệm của bạn",
|
|
63
|
+
test_result_report: "Báo cáo kết quả",
|
|
64
|
+
test_result_new: "Beta",
|
|
65
|
+
test_result_report_description: "Tóm tắt kết quả xét nghiệm dễ hiểu, cá nhân hoá",
|
|
62
66
|
test_result_free: "Miễn phí",
|
|
63
67
|
test_result_step_ordered: "Đã tạo hồ sơ",
|
|
64
68
|
test_result_step_sample_collected: "Đã lấy mẫu",
|
|
65
69
|
test_result_step_in_progress: "Phòng xét nghiệm đang xử lý",
|
|
66
70
|
test_result_step_partially_approved: "Đã hoàn thành một phần",
|
|
67
71
|
test_result_step_approved: "Đã hoàn thành",
|
|
72
|
+
test_result_current_status: "Trạng thái hiện tại",
|
|
73
|
+
test_result_view_detail: "Xem chi tiết",
|
|
74
|
+
test_result_collapse: "Thu gọn",
|
|
68
75
|
test_result_more_about_your_results: "Hiểu rõ hơn về kết quả của bạn",
|
|
69
76
|
test_result_choose_time: "Đặt cuộc hẹn",
|
|
70
77
|
test_result_book_appointment: "Đặt hẹn nhận cuộc gọi",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vi.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"vi.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|