hl-core 0.0.9-beta.50 → 0.0.9-beta.52

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.
@@ -23,12 +23,32 @@
23
23
  </div>
24
24
  <v-btn class="ml-2" icon="mdi-plus !text-[24px]" @click="memberStore.addMember(whichForm)" size="small" color="#A0B3D8" variant="tonal" />
25
25
  </div>
26
+ <base-form-section
27
+ v-if="$dataStore.hasFamilyTiesSection(whichForm)"
28
+ :title="$dataStore.t('pension.familyTies')"
29
+ :class="[memberSetting && memberSetting.has === true && memberSetting.isMultiple === true ? 'rounded-t-0 !mt-[-5px]' : 'mt-[14px]']"
30
+ >
31
+ <base-form-toggle v-model="isRelative" :disabled="isDisabled" :title="$dataStore.t('pension.ifHasRelationBeneficiary')" :has-border="false" :show-value="false" />
32
+ <base-fade-transition>
33
+ <div class="flex flex-col gap-[1px]" v-if="isRelative">
34
+ <base-panel-input
35
+ v-model="formStore.applicationData.insuredApp.iin"
36
+ :maska="$maska.iin"
37
+ :readonly="isDisabled"
38
+ :clearable="false"
39
+ :label="$dataStore.t('pension.insuredIIN')"
40
+ append-inner-icon="mdi mdi-chevron-right"
41
+ @append="searchMember"
42
+ />
43
+ </div>
44
+ </base-fade-transition>
45
+ </base-form-section>
26
46
  <base-form-section
27
47
  :title="$dataStore.t('form.personalData')"
28
48
  :class="[memberSetting && memberSetting.has === true && memberSetting.isMultiple === true ? 'rounded-t-0 !mt-[-5px]' : 'mt-[14px]']"
29
49
  >
30
50
  <base-panel-input
31
- v-if="$dataStore.isLifetrip"
51
+ v-if="$dataStore.isLifetrip || $dataStore.isPension"
32
52
  v-model="member.signOfResidency"
33
53
  :value="member.signOfResidency?.nameRu"
34
54
  :label="$dataStore.t('form.signOfResidency')"
@@ -50,7 +70,7 @@
50
70
  :maska="$maska.phone"
51
71
  :readonly="!!isDisabled || !!isIinPhoneDisabled"
52
72
  :clearable="!isDisabled"
53
- :append-inner-icon="otpCondition ? 'mdi mdi-phone-message' : ''"
73
+ :append-inner-icon="otpCondition ? `${$dataStore.isPension ? 'mdi-message-text' : 'mdi mdi-phone-message'}` : ''"
54
74
  @append="openCustomPanel('otp')"
55
75
  @keyup.enter.prevent="otpCondition ? openCustomPanel('otp') : null"
56
76
  :rules="phoneRule"
@@ -115,7 +135,29 @@
115
135
  :maska="$maska.date"
116
136
  append-inner-icon="mdi mdi-calendar-blank-outline"
117
137
  />
118
- <base-form-input v-model="member.age" :label="$dataStore.t('form.age')" :readonly="true" :clearable="!isDisabled" :rules="ageRule" />
138
+ <div v-if="$dataStore.isPension">
139
+ <base-panel-input
140
+ v-model="member.countryOfCitizenship"
141
+ :value="member.countryOfCitizenship?.nameRu"
142
+ :label="$dataStore.t('form.countryOfCitizenship')"
143
+ :readonly="isDisabled"
144
+ :clearable="!isDisabled"
145
+ :rules="$rules.objectRequired"
146
+ append-inner-icon="mdi mdi-chevron-right"
147
+ @append="openPanel($dataStore.t('form.countryOfCitizenship'), [], 'countryOfCitizenship', $dataStore.getCitizenshipCountries)"
148
+ />
149
+ <base-panel-input
150
+ v-model="member.birthPlace"
151
+ :value="member.birthPlace?.nameRu"
152
+ :label="$dataStore.t('form.birthData')"
153
+ :readonly="isDisabled"
154
+ :clearable="!isDisabled"
155
+ :rules="$rules.objectRequired"
156
+ append-inner-icon="mdi mdi-chevron-right"
157
+ @append="openPanel($dataStore.t('form.Country'), [], 'birthPlace', $dataStore.getCountries)"
158
+ />
159
+ </div>
160
+ <base-form-input v-if="!$dataStore.isPension" v-model="member.age" :label="$dataStore.t('form.age')" :readonly="true" :clearable="!isDisabled" :rules="ageRule" />
119
161
  <base-panel-input
120
162
  v-model="member.gender"
121
163
  :value="member.gender?.nameRu"
@@ -157,6 +199,25 @@
157
199
  :rules="$rules.required.concat($rules.numbers)"
158
200
  />
159
201
  </base-form-section>
202
+ <base-form-section
203
+ v-if="$dataStore.isPension && (whichForm === formStore.insuredFormKey || whichForm === formStore.beneficiaryFormKey)"
204
+ :title="$dataStore.t('pension.disabilityInfo')"
205
+ >
206
+ <base-form-toggle v-model="member.isDisability" :title="$dataStore.t('pension.ifHasDisability')" :disabled="isDisabled" :has-border="false" />
207
+ <base-animation>
208
+ <base-panel-input
209
+ v-if="member.isDisability"
210
+ v-model="member.disabilityGroup"
211
+ :value="member.disabilityGroup?.nameRu"
212
+ :readonly="isDisabled"
213
+ :clearable="!isDisabled"
214
+ :label="$dataStore.t('pension.disabilityGroup')"
215
+ :rules="$rules.objectRequired"
216
+ append-inner-icon="mdi mdi-chevron-right"
217
+ @append="openPanel($dataStore.t('pension.disabilityGroup'), $dataStore.disabilityGroups, 'disabilityGroup', $dataStore.getDisabilityGroups)"
218
+ />
219
+ </base-animation>
220
+ </base-form-section>
160
221
  <base-form-section :title="$dataStore.t('policyholdersRepresentative.PowerOfAttorney')" v-if="whichForm === formStore.policyholdersRepresentativeFormKey">
161
222
  <base-form-input
162
223
  v-model.trim="member.fullNameRod"
@@ -333,7 +394,7 @@
333
394
  <base-form-input v-model.trim="member.registrationMicroDistrict" :readonly="isDisabled" :clearable="!isDisabled" :label="$dataStore.t('form.MicroDistrict')" />
334
395
  <base-form-input
335
396
  v-model.trim="member.registrationStreet"
336
- :rules="member.isInsuredUnderage ? [] : $rules.required"
397
+ :rules="member.isInsuredUnderage || $dataStore.isAULETTI || $dataStore.isAulettiParent ? [] : $rules.required"
337
398
  :readonly="isDisabled"
338
399
  :clearable="!isDisabled"
339
400
  :label="$dataStore.t('form.Street')"
@@ -427,7 +488,7 @@
427
488
  />
428
489
  </base-fade-transition>
429
490
  <base-panel-input
430
- v-if="!$dataStore.isLifetrip"
491
+ v-if="!$dataStore.isLifetrip && !$dataStore.isPension"
431
492
  v-model="member.signOfResidency"
432
493
  :value="member.signOfResidency?.nameRu"
433
494
  :label="$dataStore.t('form.signOfResidency')"
@@ -464,7 +525,7 @@
464
525
  v-if="hasSignOfIPDL"
465
526
  v-model="member.signOfIPDL"
466
527
  :value="member.signOfIPDL?.nameRu"
467
- :label="$dataStore.t('form.signOfIPDL')"
528
+ :label="$dataStore.isPension ? $dataStore.t('form.signOfPDL') : $dataStore.t('form.signOfIPDL')"
468
529
  :readonly="isDisabled"
469
530
  :clearable="!isDisabled"
470
531
  :rules="$rules.objectRequired"
@@ -472,6 +533,7 @@
472
533
  @append="openPanel($dataStore.t('form.signOfIPDL'), $dataStore.ipdl, 'signOfIPDL')"
473
534
  />
474
535
  <base-panel-input
536
+ v-if="!$dataStore.isPension"
475
537
  v-model="member.countryOfCitizenship"
476
538
  :value="member.countryOfCitizenship?.nameRu"
477
539
  :label="$dataStore.t('form.countryOfCitizenship')"
@@ -503,6 +565,61 @@
503
565
  @append="openPanel($dataStore.t('form.insurancePay'), $dataStore.insurancePay, 'insurancePay', $dataStore.getInsurancePay)"
504
566
  />
505
567
  </base-form-section>
568
+ <base-form-section v-if="$dataStore.hasBankSection(whichForm)" :title="$dataStore.t('bankDetailsForm.title')">
569
+ <base-form-input
570
+ v-model="member.bankInfo.iik"
571
+ :label="$dataStore.t('clients.form.iik')"
572
+ :maska="$maska.iik"
573
+ :readonly="isDisabled"
574
+ :clearable="!isDisabled"
575
+ :rules="$rules.required.concat($rules.iik)"
576
+ />
577
+ <base-panel-input
578
+ v-model="member.bankInfo.bankName"
579
+ :value="member.bankInfo.bankName.nameRu"
580
+ :label="$dataStore.t('clients.form.nameBank')"
581
+ :readonly="isDisabled"
582
+ :clearable="!isDisabled"
583
+ :rules="$rules.objectRequired"
584
+ append-inner-icon="mdi mdi-chevron-right"
585
+ @append="openPanel($dataStore.t('clients.form.nameBank'), [], 'bankInfo', $dataStore.getBanks, '', 'bankName')"
586
+ />
587
+ <base-form-input
588
+ v-model.trim="member.bankInfo.bin"
589
+ :label="$dataStore.t('form.bin')"
590
+ :maska="$maska.iin"
591
+ :readonly="isDisabled"
592
+ :clearable="!isDisabled"
593
+ :rules="$rules.required.concat($rules.iinRight)"
594
+ />
595
+ <base-form-input v-model="member.bankInfo.bik" :label="$dataStore.t('clients.form.bik')" :readonly="isDisabled" :clearable="!isDisabled" :rules="$rules.required" />
596
+ </base-form-section>
597
+ <base-form-section v-if="$dataStore.hasAdditionalDocumentsSection(whichForm)" :title="$dataStore.t('form.phDocuments')">
598
+ <base-file-input
599
+ :label="$dataStore.t('form.identyDocument')"
600
+ :disabled="isDisabled"
601
+ :clearable="!isDisabled"
602
+ icon="mdi-paperclip"
603
+ @input="attachFile($event, '1')"
604
+ :rules="$rules.required"
605
+ />
606
+ <base-file-input
607
+ :label="$dataStore.t('form.bankStatement')"
608
+ :disabled="isDisabled"
609
+ :clearable="!isDisabled"
610
+ icon="mdi-paperclip"
611
+ @input="attachFile($event, '10')"
612
+ :rules="$rules.required"
613
+ />
614
+ <base-file-input
615
+ :label="$dataStore.t('pension.ENPFnote')"
616
+ :disabled="isDisabled"
617
+ :clearable="!isDisabled"
618
+ icon="mdi-paperclip"
619
+ @input="attachFile($event, '8')"
620
+ :rules="$rules.required"
621
+ />
622
+ </base-form-section>
506
623
  <base-form-section :title="$dataStore.t('form.contactsData')" v-if="$dataStore.hasContactSection(whichForm)">
507
624
  <base-form-input
508
625
  v-model="member.homePhone"
@@ -635,6 +752,10 @@ export default {
635
752
  const searchQuery = ref<string>('');
636
753
  const fileData = ref<{ file: any }>();
637
754
  const imageDataList = ref<string[]>([]);
755
+ const isRelative = ref<boolean>(false);
756
+
757
+ const currentPanelDeep = ref<string>();
758
+ const currentPanelSubDeep = ref<string>();
638
759
 
639
760
  const memberSetting = computed(() => dataStore.members[memberStore.getMemberApplicationCode(whichForm.value)!]);
640
761
  const hasOtp = computed(() => member.value.otpCode && member.value.otpCode.length === useMask().otp.length);
@@ -649,6 +770,10 @@ export default {
649
770
  case formStore.policyholderFormKey:
650
771
  return true;
651
772
  case formStore.insuredFormKey:
773
+ if (dataStore.isPension) {
774
+ return true;
775
+ }
776
+ return route.params.taskId !== '0';
652
777
  case formStore.beneficiaryFormKey:
653
778
  case formStore.beneficialOwnerFormKey:
654
779
  case formStore.policyholdersRepresentativeFormKey:
@@ -709,7 +834,7 @@ export default {
709
834
  return false;
710
835
  }
711
836
  };
712
- return dataStore.controls.hasGKB && !!dataStore.isTask() && perMemberCondition();
837
+ return dataStore.isAULETTI || dataStore.isAulettiParent ? false : dataStore.controls.hasGKB && !!dataStore.isTask() && perMemberCondition();
713
838
  });
714
839
  const hasDocumentReader = computed(() => {
715
840
  return !!member.value.hasAgreement && !!isTask.value && (dataStore.isAULETTI || dataStore.isAulettiParent);
@@ -722,7 +847,7 @@ export default {
722
847
  return true;
723
848
  });
724
849
  const hasRelationDegree = computed(() => {
725
- if (dataStore.isLifetrip) {
850
+ if (dataStore.isLifetrip || dataStore.isPension) {
726
851
  return false;
727
852
  }
728
853
  if ((whichForm.value === formStore.beneficiaryFormKey || whichForm.value === formStore.insuredFormKey) && member.value.iin !== formStore.policyholderForm.iin) {
@@ -731,7 +856,7 @@ export default {
731
856
  return false;
732
857
  });
733
858
  const hasFamilyStatus = computed(() => {
734
- if (dataStore.isLifetrip) {
859
+ if (dataStore.isLifetrip || dataStore.isPension) {
735
860
  return false;
736
861
  }
737
862
  if (whichForm.value === formStore.beneficiaryFormKey) {
@@ -833,8 +958,10 @@ export default {
833
958
  switch (whichForm.value) {
834
959
  case formStore.policyholderFormKey:
835
960
  return route.params.taskId === '0';
836
- case formStore.policyholdersRepresentativeFormKey:
837
961
  case formStore.insuredFormKey:
962
+ if (dataStore.isPension) return route.params.taskId === '0';
963
+ return route.query.id === '0';
964
+ case formStore.policyholdersRepresentativeFormKey:
838
965
  case formStore.beneficiaryFormKey:
839
966
  case formStore.beneficialOwnerFormKey:
840
967
  return route.query.id === '0';
@@ -886,7 +1013,7 @@ export default {
886
1013
  dataStore.rightPanel.open = true;
887
1014
  };
888
1015
 
889
- const openPanel = async (title: string, list: Value[], key: string, asyncFunction?: Function, filterKey?: string) => {
1016
+ const openPanel = async (title: string, list: Value[], key: string, asyncFunction?: Function, filterKey?: string, deepKey?: string, subDeepKey?: string) => {
890
1017
  if (!isDisabled.value) {
891
1018
  isSearchOpen.value = false;
892
1019
  isDocumentOpen.value = false;
@@ -907,10 +1034,35 @@ export default {
907
1034
  let newList = list;
908
1035
  if (asyncFunction) {
909
1036
  isPanelLoading.value = true;
910
- newList = await asyncFunction(filterKey, member.value);
1037
+ const filterKeys: any = {};
1038
+ if (!!subDeepKey) {
1039
+ filterKeys.key = key;
1040
+ filterKeys.deepKey = deepKey;
1041
+ filterKeys.subDeepKey = filterKey;
1042
+ } else {
1043
+ if (!!deepKey) {
1044
+ filterKeys.key = key;
1045
+ filterKeys.deepKey = filterKey;
1046
+ } else {
1047
+ filterKeys.key = filterKey;
1048
+ }
1049
+ }
1050
+ newList = await asyncFunction(filterKey, member.value, filterKeys);
911
1051
  }
912
1052
  panelList.value = filterList(newList, key);
913
- panelValue.value = member.value[currentPanel.value];
1053
+ panelValue.value = !!deepKey
1054
+ ? !!subDeepKey
1055
+ ? //@ts-ignore
1056
+ member.value[currentPanel.value][deepKey as any][subDeepKey as any]
1057
+ : //@ts-ignore
1058
+ member.value[currentPanel.value][deepKey as any]
1059
+ : member.value[currentPanel.value];
1060
+ if (!!deepKey) {
1061
+ currentPanelDeep.value = deepKey;
1062
+ if (!!subDeepKey) {
1063
+ currentPanelSubDeep.value = subDeepKey;
1064
+ }
1065
+ }
914
1066
  isPanelLoading.value = false;
915
1067
  } else {
916
1068
  dataStore.showToaster('error', dataStore.t('toaster.viewErrorText'));
@@ -934,11 +1086,24 @@ export default {
934
1086
  };
935
1087
 
936
1088
  const pickPanelValue = (item: Value) => {
1089
+ if (!currentPanel.value) return;
937
1090
  if (formStore.isDisabled[whichForm.value as keyof typeof formStore.isDisabled] === false) {
938
1091
  dataStore.rightPanel.open = false;
939
1092
  isPanelOpen.value = false;
940
- // @ts-ignore
941
- member.value[currentPanel.value] = item.nameRu === null ? new Value() : item;
1093
+ if (!!currentPanelDeep.value) {
1094
+ if (!!currentPanelSubDeep.value) {
1095
+ //@ts-ignore
1096
+ member.value[currentPanel.value][currentPanelDeep.value][currentPanelSubDeep.value] = item.nameRu === null ? new Value() : item;
1097
+ } else {
1098
+ //@ts-ignore
1099
+ member.value[currentPanel.value][currentPanelDeep.value] = item.nameRu === null ? new Value() : item;
1100
+ }
1101
+ } else {
1102
+ // @ts-ignore
1103
+ member.value[currentPanel.value] = item.nameRu === null ? new Value() : item;
1104
+ }
1105
+ currentPanelDeep.value = '';
1106
+ currentPanelSubDeep.value = '';
942
1107
  } else {
943
1108
  dataStore.showToaster('error', dataStore.t('toaster.viewErrorText'));
944
1109
  }
@@ -967,12 +1132,12 @@ export default {
967
1132
  }
968
1133
  };
969
1134
 
970
- const attachFile = (event: InputEvent) => {
1135
+ const attachFile = (event: InputEvent, code?: string) => {
971
1136
  if (event.target) {
972
- fileData.value = { file: (event.target as HTMLInputElement).files };
1137
+ fileData.value = code ? { file: (event.target as HTMLInputElement).files } : { file: (event.target as HTMLInputElement).files };
973
1138
  } else {
974
1139
  if (event.dataTransfer) {
975
- fileData.value = { file: (event.dataTransfer as DataTransfer).files };
1140
+ fileData.value = code ? { file: (event.dataTransfer as DataTransfer).files } : { file: (event.dataTransfer as DataTransfer).files };
976
1141
  }
977
1142
  }
978
1143
  };
@@ -1191,10 +1356,10 @@ export default {
1191
1356
  }
1192
1357
  const isInsured = formStore.isPolicyholderInsured;
1193
1358
  const remoteIsInsured = ref<boolean | null>(null);
1194
- if (whichForm.value == formStore.policyholderFormKey) {
1359
+ if (whichForm.value == formStore.policyholderFormKey || (dataStore.isPension && whichForm.value == formStore.insuredFormKey)) {
1195
1360
  if (route.params.taskId === '0') {
1196
1361
  try {
1197
- const taskId = await dataStore.startApplication(member.value);
1362
+ const taskId = await dataStore.startApplication(member.value, dataStore.isPension ? (String(route.query.type) === 'joint' ? 4 : 1) : undefined);
1198
1363
  if (typeof taskId === 'string') {
1199
1364
  await dataStore.getApplicationData(taskId, false, false, false, false);
1200
1365
  remoteIsInsured.value = formStore.applicationData.clientApp.isInsured;
@@ -1243,6 +1408,25 @@ export default {
1243
1408
  }
1244
1409
  if (whichForm.value === formStore.insuredFormKey) {
1245
1410
  wasInsuredAction.value = true;
1411
+ if (dataStore.isPension) {
1412
+ formStore.applicationData.pensionApp = {
1413
+ ...formStore.applicationData.pensionApp,
1414
+ account: member.value.bankInfo.iik,
1415
+ bankBik: member.value.bankInfo.bik,
1416
+ bankBin: member.value.bankInfo.bankName.ids,
1417
+ bankId: member.value.bankInfo.bankName.id,
1418
+ bankName: member.value.bankInfo.bankName.nameRu,
1419
+ guaranteedPeriod: 0,
1420
+ amount: 0,
1421
+ compulsoryContractAmount: 0,
1422
+ voluntaryContractAmount: 0,
1423
+ ownFundsRaisAmount: 0,
1424
+ compulsoryProfContractAmount: 0,
1425
+ };
1426
+ const isApplicationSaved = await dataStore.setApplication(formStore.applicationData.pensionApp);
1427
+ if (isApplicationSaved === false) return;
1428
+ dataStore.showToaster('info', dataStore.t('toaster.needToRecalculate'), 5000);
1429
+ }
1246
1430
  }
1247
1431
  await router.replace({
1248
1432
  name: route.name!,
@@ -1266,6 +1450,9 @@ export default {
1266
1450
  };
1267
1451
 
1268
1452
  const validateAgreement = () => {
1453
+ if (dataStore.isPension && whichForm.value === formStore.policyholdersRepresentativeFormKey) {
1454
+ return true;
1455
+ }
1269
1456
  if (whichForm.value === formStore.beneficiaryFormKey) {
1270
1457
  if (member.value.age !== null && Number(member.value.age) < 18) {
1271
1458
  return true;
@@ -1309,6 +1496,22 @@ export default {
1309
1496
  if (typeof ESBDResponse === 'object' && ESBDResponse.errorCode === 0) {
1310
1497
  member.value.verifyType = 'ESBD';
1311
1498
  member.value.verifyDate = ESBDResponse.verifiedDate;
1499
+
1500
+ if (member.value.bankInfo.iik.length === useMask().iik.length) {
1501
+ const isValidIik = await dataStore.checkAccountNumber(member.value.bankInfo.iik);
1502
+ if (isValidIik === false) {
1503
+ dataStore.showToaster('error', dataStore.t('error.notValidIik'));
1504
+ member.value.bankInfo.iik = '';
1505
+ isSubmittingForm.value = false;
1506
+ return;
1507
+ }
1508
+ if (formStore.applicationData.pensionApp) {
1509
+ formStore.applicationData.pensionApp.account = member.value.bankInfo.iik;
1510
+ formStore.applicationData.pensionApp.bankBik = member.value.bankInfo.bik;
1511
+ formStore.applicationData.pensionApp.bankBin = member.value.bankInfo.bin;
1512
+ formStore.applicationData.pensionApp.bankId = member.value.bankInfo.bankName.id;
1513
+ }
1514
+ }
1312
1515
  const hasMemberSaved = await saveMember();
1313
1516
  } else {
1314
1517
  dataStore.isLoading = false;
@@ -1473,8 +1676,8 @@ export default {
1473
1676
  // if (filteredDocuments && filteredDocuments.length) memberDocument.value = filteredDocuments[0];
1474
1677
  }
1475
1678
  await setDefaultValues();
1679
+ if (Number(formStore.applicationData.processCode) === 4) dataStore.members.insuredApp.isMultiple = true;
1476
1680
  };
1477
-
1478
1681
  onMounted(async () => {
1479
1682
  await onInit();
1480
1683
  });
@@ -1545,6 +1748,8 @@ export default {
1545
1748
  isSearchOpen.value = false;
1546
1749
  isOtpPanelOpen.value = false;
1547
1750
  dataStore.panelAction = null;
1751
+ currentPanelDeep.value = '';
1752
+ currentPanelSubDeep.value = '';
1548
1753
  }
1549
1754
  },
1550
1755
  { immediate: true },
@@ -1579,6 +1784,26 @@ export default {
1579
1784
  },
1580
1785
  );
1581
1786
  }
1787
+ if (dataStore.isPension) {
1788
+ watch(
1789
+ () => member.value.bankInfo.bankName,
1790
+ val => {
1791
+ if (val) {
1792
+ member.value.bankInfo.bik = val.code as string;
1793
+ member.value.bankInfo.bin = reformatIin(val.ids as string);
1794
+ }
1795
+ },
1796
+ );
1797
+ watch(
1798
+ () => member.value.isDisability,
1799
+ val => {
1800
+ if (!val) member.value.disabilityGroup = new Value();
1801
+ },
1802
+ {
1803
+ immediate: true,
1804
+ },
1805
+ );
1806
+ }
1582
1807
 
1583
1808
  return {
1584
1809
  // State
@@ -1605,8 +1830,8 @@ export default {
1605
1830
  selectedIndex,
1606
1831
  selectedFamilyMember,
1607
1832
  sameAddress,
1833
+ isRelative,
1608
1834
  imageDataList,
1609
-
1610
1835
  // Computed
1611
1836
  whichForm,
1612
1837
  whichIndex,